Documentation
¶
Overview ¶
Package scaffold renders the embedded templates into a directory on disk. Separating this from the cli package keeps the rendering logic testable without spawning a cobra command.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrNameInvalid = errors.New("name must be kebab-case: lowercase letters, digits, and single hyphens")
ErrNameInvalid is returned when Name does not match kebabPattern.
var ErrSampleSkillInvalid = errors.New("sample skill name must be kebab-case: lowercase letters, digits, and single hyphens")
ErrSampleSkillInvalid is returned when Options.SampleSkill is set to a non-kebab-case value. Prevents YAML-frontmatter-injection through the sample skill's `name:` field if a future CLI flag ever exposes SampleSkill to user input.
var ErrTargetExists = errors.New("target directory already exists (use --force to overwrite)")
ErrTargetExists is returned when the scaffold target directory already exists and Force is false.
Functions ¶
This section is empty.
Types ¶
type Author ¶
Author captures the author fields every template references. Both fields may be empty strings; the scaffold never rejects the run for missing author data (marketplaces do, and hanko flags it, but that's not scaffold's job).
The json tags let Author ride directly through encoding/json.Marshal when we build plugin.json, which sidesteps the injection class that text/template has when a user name contains quotes or backslashes.
Email has `omitempty` because the Claude Code plugin schema treats email as optional-but-must-be-a-valid-format-if-present. A missing email is fine; an empty-string email fails the `format: email` check. Name does not use `omitempty`: it is the required field, and scaffoldPlugin already skips emitting the whole Author object when Name is empty.
type Options ¶
type Options struct {
// Kind is plugin or skill.
Kind Kind
// Name is the kebab-case identifier (plugin name, skill name).
Name string
// TargetDir is where files land. Defaults to current working dir.
// Scaffold creates a subdirectory named Name under TargetDir for
// the plugin kind, and skills/Name/ for the skill kind.
TargetDir string
// Description populates the top-level description in plugin.json
// and the frontmatter of skills.
Description string
// Author is written into plugin.json and the LICENSE year + holder.
Author Author
// Version is the initial version in plugin.json. Default "0.1.0".
Version string
// License is the SPDX identifier written into plugin.json. Default "MIT".
License string
// Year is the LICENSE copyright year. Defaults to the current year.
Year int
// SampleSkill is the sub-skill created inside a plugin. Default "hello".
// Plugin kind only.
SampleSkill string
// Attribution, when true (default), includes a "scaffolded with
// tsuba" footer in generated README files.
Attribution bool
// Force, when true, overwrites existing files. Default false; the
// scaffold errors out if the target directory already exists.
Force bool
}
Options customises a single scaffold run. All fields except Name have working defaults; see Defaults for the canonical values.
type Result ¶
type Result struct {
// Root is the absolute path of the directory the scaffold created.
Root string
// Files lists the paths of every file that was written, relative
// to Root. Order is deterministic (lexical).
Files []string
}
Result summarises what Scaffold wrote. Callers (tests, the CLI) use it to report back to the user without re-walking the filesystem.