@garygentry/feature-forge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/adapters/GENERATION-REPORT.md +128 -0
- package/adapters/claude/agents/forge-researcher.md +137 -0
- package/adapters/claude/agents/forge-spec-writer.md +115 -0
- package/adapters/claude/agents/forge-verifier.md +121 -0
- package/adapters/claude/references/epic-manifest-schema.json +120 -0
- package/adapters/claude/references/forge-config-schema.json +166 -0
- package/adapters/claude/references/pipeline-state-schema.json +110 -0
- package/adapters/claude/references/portable-root.md +56 -0
- package/adapters/claude/references/process-overview.md +123 -0
- package/adapters/claude/references/ralph-loop-contract.md +221 -0
- package/adapters/claude/references/shared-conventions.md +144 -0
- package/adapters/claude/references/skill-frontmatter.schema.json +17 -0
- package/adapters/claude/references/stack-resolution.md +51 -0
- package/adapters/claude/references/stacks/_generic.md +90 -0
- package/adapters/claude/references/stacks/go.md +138 -0
- package/adapters/claude/references/stacks/python.md +163 -0
- package/adapters/claude/references/stacks/rust.md +151 -0
- package/adapters/claude/references/stacks/typescript.md +111 -0
- package/adapters/claude/references/vendor-construct-inventory.md +49 -0
- package/adapters/claude/scripts/forge-root.sh +50 -0
- package/adapters/claude/skills/forge/SKILL.md +165 -0
- package/adapters/claude/skills/forge-0-epic/SKILL.md +303 -0
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/claude/skills/forge-1-prd/SKILL.md +121 -0
- package/adapters/claude/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/claude/skills/forge-2-tech/SKILL.md +198 -0
- package/adapters/claude/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/claude/skills/forge-3-specs/SKILL.md +154 -0
- package/adapters/claude/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/claude/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +146 -0
- package/adapters/claude/skills/forge-5-loop/SKILL.md +303 -0
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/claude/skills/forge-6-docs/SKILL.md +179 -0
- package/adapters/claude/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +65 -0
- package/adapters/claude/skills/forge-init/SKILL.md +29 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +219 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/codex/agents/forge-researcher.md +133 -0
- package/adapters/codex/agents/forge-spec-writer.md +112 -0
- package/adapters/codex/agents/forge-verifier.md +115 -0
- package/adapters/codex/agents/openai.yaml +10 -0
- package/adapters/codex/references/epic-manifest-schema.json +120 -0
- package/adapters/codex/references/forge-config-schema.json +166 -0
- package/adapters/codex/references/pipeline-state-schema.json +110 -0
- package/adapters/codex/references/portable-root.md +56 -0
- package/adapters/codex/references/process-overview.md +123 -0
- package/adapters/codex/references/ralph-loop-contract.md +221 -0
- package/adapters/codex/references/shared-conventions.md +144 -0
- package/adapters/codex/references/skill-frontmatter.schema.json +17 -0
- package/adapters/codex/references/stack-resolution.md +51 -0
- package/adapters/codex/references/stacks/_generic.md +90 -0
- package/adapters/codex/references/stacks/go.md +138 -0
- package/adapters/codex/references/stacks/python.md +163 -0
- package/adapters/codex/references/stacks/rust.md +151 -0
- package/adapters/codex/references/stacks/typescript.md +111 -0
- package/adapters/codex/references/vendor-construct-inventory.md +49 -0
- package/adapters/codex/scripts/forge-root.sh +50 -0
- package/adapters/codex/skills/forge/forge.md +164 -0
- package/adapters/codex/skills/forge-0-epic/forge-0-epic.md +302 -0
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/codex/skills/forge-1-prd/forge-1-prd.md +120 -0
- package/adapters/codex/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/codex/skills/forge-2-tech/forge-2-tech.md +197 -0
- package/adapters/codex/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/codex/skills/forge-3-specs/forge-3-specs.md +153 -0
- package/adapters/codex/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/codex/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/codex/skills/forge-4-backlog/forge-4-backlog.md +145 -0
- package/adapters/codex/skills/forge-5-loop/forge-5-loop.md +302 -0
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/codex/skills/forge-6-docs/forge-6-docs.md +178 -0
- package/adapters/codex/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/codex/skills/forge-fix/forge-fix.md +64 -0
- package/adapters/codex/skills/forge-init/forge-init.md +29 -0
- package/adapters/codex/skills/forge-verify/forge-verify.md +218 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/copilot/agents/forge-researcher.md +133 -0
- package/adapters/copilot/agents/forge-spec-writer.md +112 -0
- package/adapters/copilot/agents/forge-verifier.md +115 -0
- package/adapters/copilot/references/epic-manifest-schema.json +120 -0
- package/adapters/copilot/references/forge-config-schema.json +166 -0
- package/adapters/copilot/references/pipeline-state-schema.json +110 -0
- package/adapters/copilot/references/portable-root.md +56 -0
- package/adapters/copilot/references/process-overview.md +123 -0
- package/adapters/copilot/references/ralph-loop-contract.md +221 -0
- package/adapters/copilot/references/shared-conventions.md +144 -0
- package/adapters/copilot/references/skill-frontmatter.schema.json +17 -0
- package/adapters/copilot/references/stack-resolution.md +51 -0
- package/adapters/copilot/references/stacks/_generic.md +90 -0
- package/adapters/copilot/references/stacks/go.md +138 -0
- package/adapters/copilot/references/stacks/python.md +163 -0
- package/adapters/copilot/references/stacks/rust.md +151 -0
- package/adapters/copilot/references/stacks/typescript.md +111 -0
- package/adapters/copilot/references/vendor-construct-inventory.md +49 -0
- package/adapters/copilot/scripts/forge-root.sh +50 -0
- package/adapters/copilot/skills/forge/forge.md +164 -0
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +302 -0
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +120 -0
- package/adapters/copilot/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +197 -0
- package/adapters/copilot/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +153 -0
- package/adapters/copilot/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/copilot/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +145 -0
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +302 -0
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +178 -0
- package/adapters/copilot/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/copilot/skills/forge-fix/forge-fix.md +64 -0
- package/adapters/copilot/skills/forge-init/forge-init.md +29 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +218 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/cursor/agents/forge-researcher.mdc +134 -0
- package/adapters/cursor/agents/forge-spec-writer.mdc +113 -0
- package/adapters/cursor/agents/forge-verifier.mdc +116 -0
- package/adapters/cursor/references/epic-manifest-schema.json +120 -0
- package/adapters/cursor/references/forge-config-schema.json +166 -0
- package/adapters/cursor/references/pipeline-state-schema.json +110 -0
- package/adapters/cursor/references/portable-root.md +56 -0
- package/adapters/cursor/references/process-overview.md +123 -0
- package/adapters/cursor/references/ralph-loop-contract.md +221 -0
- package/adapters/cursor/references/shared-conventions.md +144 -0
- package/adapters/cursor/references/skill-frontmatter.schema.json +17 -0
- package/adapters/cursor/references/stack-resolution.md +51 -0
- package/adapters/cursor/references/stacks/_generic.md +90 -0
- package/adapters/cursor/references/stacks/go.md +138 -0
- package/adapters/cursor/references/stacks/python.md +163 -0
- package/adapters/cursor/references/stacks/rust.md +151 -0
- package/adapters/cursor/references/stacks/typescript.md +111 -0
- package/adapters/cursor/references/vendor-construct-inventory.md +49 -0
- package/adapters/cursor/scripts/forge-root.sh +50 -0
- package/adapters/cursor/skills/forge/forge.mdc +165 -0
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +303 -0
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +121 -0
- package/adapters/cursor/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +198 -0
- package/adapters/cursor/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +154 -0
- package/adapters/cursor/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/cursor/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +146 -0
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +303 -0
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +179 -0
- package/adapters/cursor/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +65 -0
- package/adapters/cursor/skills/forge-init/forge-init.mdc +30 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +219 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/gemini/agents/forge-researcher.md +133 -0
- package/adapters/gemini/agents/forge-spec-writer.md +112 -0
- package/adapters/gemini/agents/forge-verifier.md +115 -0
- package/adapters/gemini/gemini-extension.json +54 -0
- package/adapters/gemini/references/epic-manifest-schema.json +120 -0
- package/adapters/gemini/references/forge-config-schema.json +166 -0
- package/adapters/gemini/references/pipeline-state-schema.json +110 -0
- package/adapters/gemini/references/portable-root.md +56 -0
- package/adapters/gemini/references/process-overview.md +123 -0
- package/adapters/gemini/references/ralph-loop-contract.md +221 -0
- package/adapters/gemini/references/shared-conventions.md +144 -0
- package/adapters/gemini/references/skill-frontmatter.schema.json +17 -0
- package/adapters/gemini/references/stack-resolution.md +51 -0
- package/adapters/gemini/references/stacks/_generic.md +90 -0
- package/adapters/gemini/references/stacks/go.md +138 -0
- package/adapters/gemini/references/stacks/python.md +163 -0
- package/adapters/gemini/references/stacks/rust.md +151 -0
- package/adapters/gemini/references/stacks/typescript.md +111 -0
- package/adapters/gemini/references/vendor-construct-inventory.md +49 -0
- package/adapters/gemini/scripts/forge-root.sh +50 -0
- package/adapters/gemini/skills/forge/forge.md +164 -0
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +302 -0
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +120 -0
- package/adapters/gemini/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +197 -0
- package/adapters/gemini/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +153 -0
- package/adapters/gemini/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/gemini/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +145 -0
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +302 -0
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +178 -0
- package/adapters/gemini/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/gemini/skills/forge-fix/forge-fix.md +64 -0
- package/adapters/gemini/skills/forge-init/forge-init.md +29 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +218 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +379 -0
- package/dist/agent-targets.d.ts +70 -0
- package/dist/agent-targets.js +111 -0
- package/dist/apply.d.ts +49 -0
- package/dist/apply.js +246 -0
- package/dist/cli.d.ts +94 -0
- package/dist/cli.js +508 -0
- package/dist/detect.d.ts +45 -0
- package/dist/detect.js +72 -0
- package/dist/fsutil.d.ts +56 -0
- package/dist/fsutil.js +175 -0
- package/dist/hash.d.ts +50 -0
- package/dist/hash.js +107 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/manifest.d.ts +72 -0
- package/dist/manifest.js +222 -0
- package/dist/plan.d.ts +66 -0
- package/dist/plan.js +166 -0
- package/dist/rauf.d.ts +83 -0
- package/dist/rauf.js +118 -0
- package/dist/report.d.ts +35 -0
- package/dist/report.js +110 -0
- package/dist/source.d.ts +69 -0
- package/dist/source.js +164 -0
- package/dist/types.d.ts +264 -0
- package/dist/types.js +57 -0
- package/package.json +42 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Feature Forge Configuration",
|
|
4
|
+
"description": "Project-level configuration for the feature-forge plugin. Place as forge.config.json in your project root.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"specsDir": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "./specs",
|
|
10
|
+
"description": "Root directory for feature spec documents. Each feature gets a subdirectory."
|
|
11
|
+
},
|
|
12
|
+
"docsDir": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"default": "./docs/architecture",
|
|
15
|
+
"description": "Root directory for generated architecture documentation."
|
|
16
|
+
},
|
|
17
|
+
"backlogDir": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "Optional override for backlog location. If set, backlog.json is written here instead of with the feature specs. Default behavior: backlog.json is written to {specsDir}/{feature}/backlog.json."
|
|
20
|
+
},
|
|
21
|
+
"gitCommitAfterStage": {
|
|
22
|
+
"type": "boolean",
|
|
23
|
+
"default": true,
|
|
24
|
+
"description": "Automatically commit after each pipeline stage completes."
|
|
25
|
+
},
|
|
26
|
+
"commitPrefix": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"default": "forge",
|
|
29
|
+
"description": "Prefix for conventional commit messages, e.g., forge(auth): complete PRD"
|
|
30
|
+
},
|
|
31
|
+
"stack": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "Detected or configured project stack identifier. Selects guidance from references/stacks/{stack}.md. Set during forge-2-tech or manually. Examples: 'typescript', 'python', 'go', 'rust'."
|
|
34
|
+
},
|
|
35
|
+
"typeCheckCommand": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"description": "Command to verify type correctness or lint. Examples: 'bun run typecheck', 'mypy .', 'go vet ./...'. Used in acceptance criteria and verification."
|
|
38
|
+
},
|
|
39
|
+
"testCommand": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "Command to run tests. Examples: 'bun test', 'pytest', 'go test ./...'. Used in acceptance criteria and verification."
|
|
42
|
+
},
|
|
43
|
+
"loopIterationMultiplier": {
|
|
44
|
+
"type": "number",
|
|
45
|
+
"default": 1.5,
|
|
46
|
+
"minimum": 1,
|
|
47
|
+
"description": "Multiplier applied to pending backlog item count to calculate loop iterations. Higher values allow more retries. Default: 1.5 (e.g., 10 items = 15 iterations)."
|
|
48
|
+
},
|
|
49
|
+
"loopRunner": {
|
|
50
|
+
"type": "object",
|
|
51
|
+
"description": "The autonomous loop runner feature-forge drives. Defaults to rauf when absent (forge-5 states 'defaulting to rauf loop runner'). Every command is a template — {bin}, {backlogDir}, {specsDir}, {iterations} are substituted at call time — so an alternative ralph-style runner conforming to rauf's SPEC-BACKLOG-TOOL-CONTRACT.md can be swapped in without editing any skill. See references/ralph-loop-contract.md.",
|
|
52
|
+
"properties": {
|
|
53
|
+
"name": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"default": "rauf",
|
|
56
|
+
"description": "Display name of the loop runner."
|
|
57
|
+
},
|
|
58
|
+
"bin": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"default": "rauf",
|
|
61
|
+
"description": "The runner executable. Assumed on PATH; may be an absolute path. Substituted as {bin} in every command."
|
|
62
|
+
},
|
|
63
|
+
"runCommand": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"default": "{bin} loop run . --backlog {backlogDir} --iterations {iterations}",
|
|
66
|
+
"description": "Run the loop. Launched in the background by forge-5. Human-formatted output; used as the fallback launch command when eventStreamCommand is absent."
|
|
67
|
+
},
|
|
68
|
+
"eventStreamCommand": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"default": "{bin} loop run . --backlog {backlogDir} --iterations {iterations} --ndjson",
|
|
71
|
+
"description": "PREFERRED launch command for forge-5. Same as runCommand but emits one machine-readable JSON event per stdout line (NDJSON): item_completed / item_blocked / needs_human / signal_parsed / loop_completed / loop_error / loop_cancelled / llm_stuck_warning, each with {type, timestamp, projectPath} plus payload (a circuit-breaker halt surfaces as loop_error). forge-5 redirects this stdout to {backlogDir}/{stateDir}/events.ndjson and arms a Monitor on it for live, structured supervision. If a runner cannot emit NDJSON, omit this field — forge-5 falls back to runCommand + tailing the human log."
|
|
72
|
+
},
|
|
73
|
+
"validateCommand": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"default": "{bin} backlog validate . --backlog {backlogDir} --specs-dir {specsDir} --json",
|
|
76
|
+
"description": "Validate a backlog. MUST exit 0=valid, 1=findings, 2=usage/IO, and emit { valid, findings[] } with --json. `specReferences` are project-root-relative (resolved against the project root); `--specs-dir` only gates the existence check, so passing the specs root ({specsDir}) is sufficient."
|
|
77
|
+
},
|
|
78
|
+
"statusCommand": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"default": "{bin} status . --backlog {backlogDir}",
|
|
81
|
+
"description": "One-shot loop status, human-formatted. Shown to the user as a monitoring hint."
|
|
82
|
+
},
|
|
83
|
+
"statusJsonCommand": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"default": "{bin} status . --backlog {backlogDir} --json",
|
|
86
|
+
"description": "Machine-readable derived status used by forge-5 for milestone tallies and the final summary. Emits { loopState, iteration, maxIterations, currentItem, lastSignal, backlogSummary{pending,inProgress,blocked,needsHuman,deferred,done,total}, lock{...} }. Distinguishes the three non-done outcomes (genuine blocked vs needsHuman vs runner-deferred 'false blocks')."
|
|
87
|
+
},
|
|
88
|
+
"listCommand": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"default": "{bin} backlog list . --backlog {backlogDir} --json",
|
|
91
|
+
"description": "List backlog items as JSON."
|
|
92
|
+
},
|
|
93
|
+
"followCommand": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"default": "{bin} follow . --backlog {backlogDir}",
|
|
96
|
+
"description": "Stream live loop events, HUMAN-formatted (pretty-printed / log tail) — for a person watching in another terminal, NOT a machine-readable surface. forge-5 supervises via eventStreamCommand (NDJSON) instead."
|
|
97
|
+
},
|
|
98
|
+
"logCommand": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"default": "{bin} log . --backlog {backlogDir} --follow",
|
|
101
|
+
"description": "Tail the runner log, human-formatted. Monitoring hint for the user."
|
|
102
|
+
},
|
|
103
|
+
"watchCommand": {
|
|
104
|
+
"type": "string",
|
|
105
|
+
"default": "{bin} status . --backlog {backlogDir} --json",
|
|
106
|
+
"description": "Machine-readable status used by forge-5 for stall detection. rauf's `loop watch` verb was removed in v0.5.0, so this now points at `status --json`; forge-5 keys off the iteration-status `stuckWarning` flag (read from `status --json` / `iteration-status.json`) rather than guessing liveness from state.json timestamps."
|
|
107
|
+
},
|
|
108
|
+
"versionCommand": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"default": "{bin} version --json",
|
|
111
|
+
"description": "Report runner version as { version: <semver> }. Used to enforce minRunnerVersion before running."
|
|
112
|
+
},
|
|
113
|
+
"agentArgument": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"default": "--agent {agent}",
|
|
116
|
+
"description": "Tokenized argument appended to the launch command (eventStreamCommand/runCommand) when forge resolves a non-default coding agent for the run. {agent} is substituted ONLY with a validated, advertised agent id (a member of the set agentsProbeCommand reports). PRESENCE of this field advertises the runner's agent surface: when present and non-empty, forge-5 offers the per-run agent selector, honors defaultAgent, and may run agentsProbeCommand; OMIT it for a runner with no agent dimension and forge skips agent selection entirely — no selector, no probe, no {agent} substitution, no agent argument sent (byte-identical to today). Distinct from the version gate (minRunnerVersion)."
|
|
117
|
+
},
|
|
118
|
+
"agentsProbeCommand": {
|
|
119
|
+
"type": "string",
|
|
120
|
+
"default": "{bin} agents --json",
|
|
121
|
+
"description": "Coding-agent availability probe. MUST emit { agents: [{ id, displayName, available, ... }] } and exit 0 (it always exits 0: an unknown id simply never appears; a known-unavailable one appears with available:false). forge-5 runs it ONCE (no retries) before launching a non-default agent to (a) validate the resolved id against the advertised id set and (b) report availability in the pre-launch confirmation. Ignored on the default path and when agentArgument is absent."
|
|
122
|
+
},
|
|
123
|
+
"defaultAgent": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"default": "",
|
|
126
|
+
"description": "Project-default coding agent id, so a project can fix its agent once without specifying it every run. Empty string ⇒ no project default (the runner's own default — claude-cli for rauf — applies, behaving exactly as today). Overridden by the per-run agent selector (run > project precedence, resolved inside forge before the single --agent is emitted). Ignored when agentArgument is absent."
|
|
127
|
+
},
|
|
128
|
+
"preconditionFile": {
|
|
129
|
+
"type": "string",
|
|
130
|
+
"default": ".rauf.json",
|
|
131
|
+
"description": "Project-root marker file that must exist (runner installed into the target project)."
|
|
132
|
+
},
|
|
133
|
+
"stateDir": {
|
|
134
|
+
"type": "string",
|
|
135
|
+
"default": ".rauf",
|
|
136
|
+
"description": "Per-backlog state directory name created under the backlog dir."
|
|
137
|
+
},
|
|
138
|
+
"logFile": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"default": "rauf.log",
|
|
141
|
+
"description": "Human-readable event log filename written under {stateDir}. Substituted as {loopRunner.logFile} in the log-tail fallback Monitor command when eventStreamCommand (events.ndjson) is unavailable. The structured NDJSON path uses the contract-standard name events.ndjson and is not configurable here."
|
|
142
|
+
},
|
|
143
|
+
"setupHint": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"default": "Run `rauf install .` to install rauf's per-project artifacts (.rauf/, RAUF.md, schema), then re-run forge-5.",
|
|
146
|
+
"description": "Shown when preconditionFile is missing — how to set up the runner IN THIS PROJECT (per-project artifacts)."
|
|
147
|
+
},
|
|
148
|
+
"installHint": {
|
|
149
|
+
"type": "string",
|
|
150
|
+
"default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned rauf@0.6.0 default). Or install/upgrade just the rauf CLI: `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
|
|
151
|
+
"description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins rauf@0.6.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
|
|
152
|
+
},
|
|
153
|
+
"schemaVersion": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"default": "1",
|
|
156
|
+
"description": "Backlog schemaVersion this runner config targets."
|
|
157
|
+
},
|
|
158
|
+
"minRunnerVersion": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"default": "0.6.0",
|
|
161
|
+
"description": "Minimum runner version (semver). 0.6.0 is the AGENT-SURFACE FLOOR: the rauf version that ships the coding-agent selection surface (the --agent flag, the `agents` availability probe, and the preset agent registry) that this config's agentArgument/agentsProbeCommand consume. Flooring here guarantees a successful gate implies those surfaces exist. (0.5.0 was the prior grammar/contract-flip floor — unified exit codes, `loop run --detached`, explicit `review` signal, versioned events.ndjson — which predates the agent surface and so could not guarantee it.) forge-5 enforces this via versionCommand before any loop side-effects."
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Feature Forge Pipeline State",
|
|
4
|
+
"description": "Tracks pipeline progress for a single feature across sessions. Lives at {specsDir}/{feature}/.pipeline-state.json",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["feature", "createdAt", "updatedAt", "currentStage", "stages", "pipelineStatus"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"pipelineStatus": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"enum": ["active", "paused", "abandoned"],
|
|
11
|
+
"default": "active"
|
|
12
|
+
},
|
|
13
|
+
"feature": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Feature name (matches directory name under specsDir)"
|
|
16
|
+
},
|
|
17
|
+
"epic": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "Back-pointer to the owning epic's name. Absent for standalone features. The epic-manifest.json is canonical on conflict (REQ-STATE-01)."
|
|
20
|
+
},
|
|
21
|
+
"createdAt": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"format": "date-time"
|
|
24
|
+
},
|
|
25
|
+
"updatedAt": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"format": "date-time"
|
|
28
|
+
},
|
|
29
|
+
"currentStage": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog", "forge-5-loop", "forge-6-docs", "complete", "forge-verify-prd", "forge-verify-tech", "forge-verify-specs", "forge-verify-backlog", "forge-verify-impl", "forge-0-epic", "forge-verify-epic"],
|
|
32
|
+
"description": "The stage currently in progress or next to start"
|
|
33
|
+
},
|
|
34
|
+
"notes": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "Free-form notes persisted between sessions (user can add context before stepping away)"
|
|
37
|
+
},
|
|
38
|
+
"stages": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"properties": {
|
|
41
|
+
"forge-0-epic": { "$ref": "#/definitions/stageEntry" },
|
|
42
|
+
"forge-verify-epic": { "$ref": "#/definitions/verifyEntry" },
|
|
43
|
+
"forge-1-prd": { "$ref": "#/definitions/stageEntry" },
|
|
44
|
+
"forge-2-tech": { "$ref": "#/definitions/stageEntry" },
|
|
45
|
+
"forge-3-specs": { "$ref": "#/definitions/stageEntry" },
|
|
46
|
+
"forge-verify-specs": { "$ref": "#/definitions/verifyEntry" },
|
|
47
|
+
"forge-4-backlog": { "$ref": "#/definitions/stageEntry" },
|
|
48
|
+
"forge-verify-backlog": { "$ref": "#/definitions/verifyEntry" },
|
|
49
|
+
"forge-5-loop": { "$ref": "#/definitions/stageEntry" },
|
|
50
|
+
"forge-6-docs": { "$ref": "#/definitions/stageEntry" },
|
|
51
|
+
"forge-verify-impl": { "$ref": "#/definitions/verifyEntry" },
|
|
52
|
+
"forge-verify-prd": { "$ref": "#/definitions/verifyEntry" },
|
|
53
|
+
"forge-verify-tech": { "$ref": "#/definitions/verifyEntry" }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"definitions": {
|
|
58
|
+
"stageEntry": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"required": ["status"],
|
|
61
|
+
"properties": {
|
|
62
|
+
"status": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"enum": ["pending", "in-progress", "complete", "stale"]
|
|
65
|
+
},
|
|
66
|
+
"version": {
|
|
67
|
+
"type": "integer",
|
|
68
|
+
"description": "Incremented each time this stage's artifacts are revised"
|
|
69
|
+
},
|
|
70
|
+
"artifacts": {
|
|
71
|
+
"type": "array",
|
|
72
|
+
"items": { "type": "string" },
|
|
73
|
+
"description": "Relative paths to artifacts produced by this stage"
|
|
74
|
+
},
|
|
75
|
+
"startedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
76
|
+
"completedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
77
|
+
"commitHash": {
|
|
78
|
+
"type": ["string", "null"],
|
|
79
|
+
"description": "Git commit SHA after this stage completed"
|
|
80
|
+
},
|
|
81
|
+
"basedOnVersions": {
|
|
82
|
+
"type": "object",
|
|
83
|
+
"description": "Upstream stage versions this artifact was built against",
|
|
84
|
+
"additionalProperties": { "type": "integer" }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"verifyEntry": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"required": ["status"],
|
|
91
|
+
"properties": {
|
|
92
|
+
"status": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"enum": ["pending", "passed", "findings-reported", "findings-applied", "skipped"]
|
|
95
|
+
},
|
|
96
|
+
"findingsFile": {
|
|
97
|
+
"type": ["string", "null"],
|
|
98
|
+
"description": "Path to the verification findings document"
|
|
99
|
+
},
|
|
100
|
+
"findingsCount": {
|
|
101
|
+
"type": ["integer", "null"],
|
|
102
|
+
"description": "Number of findings reported"
|
|
103
|
+
},
|
|
104
|
+
"verifiedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
105
|
+
"fixedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
106
|
+
"commitHash": { "type": ["string", "null"] }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Portable Script-Root Resolution
|
|
2
|
+
|
|
3
|
+
This file is the **single canonical home** of the feature-forge bootstrap prelude and the
|
|
4
|
+
portable invocation convention. Each fenced shell block an agent runs is a separate process
|
|
5
|
+
with no persisted state, so the plugin root must be re-resolved within the same block as every
|
|
6
|
+
bundled-script call. The prelude below is the fixed, byte-identical snippet that does this by
|
|
7
|
+
discovering and delegating to `scripts/forge-root.sh`. Downstream consumers
|
|
8
|
+
(`forge-agent-adapters-build`, `cross-agent-installer`) and the spec-purity checker treat this
|
|
9
|
+
file as authoritative: the checker's rule 5 compares every prelude occurrence across the canon
|
|
10
|
+
against the fenced block here, byte-for-byte.
|
|
11
|
+
|
|
12
|
+
## Canonical bootstrap prelude
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
16
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
Prepend the prelude to a fenced shell block once, then invoke bundled scripts via `$R`:
|
|
22
|
+
`python3 "$R/scripts/<x>"` or `bash "$R/scripts/<x>"`. One prelude per fenced block — if a block
|
|
23
|
+
makes several calls, add the prelude once and reuse `$R` for each. A fresh block gets its own
|
|
24
|
+
prelude (per-block re-resolution). Worked example:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
28
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
29
|
+
python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Invariants (do NOT "fix" these)
|
|
33
|
+
|
|
34
|
+
1. **Probes paths, not the env var.** The prelude's `for d in …` enumerates directory paths to
|
|
35
|
+
locate an executable `forge-root.sh`; it contains no plugin-root environment variable. That is what lets
|
|
36
|
+
a prelude occurrence satisfy the "zero residual var in canonical surfaces" rule while staying
|
|
37
|
+
portable.
|
|
38
|
+
2. **First-discoverable-resolver-wins.** The `exec` inside the `$(…)` command substitution means
|
|
39
|
+
the loop stops at the first directory holding an executable `forge-root.sh` and delegates ALL
|
|
40
|
+
final root resolution to that script. The `for` list is a discovery order for `forge-root.sh`
|
|
41
|
+
itself, not a fallback chain for the plugin root. Removing the `exec` to "keep looping" is a
|
|
42
|
+
regression — once `exec`'d, the loop is replaced by the resolver process and never advances.
|
|
43
|
+
3. **Prelude candidate set is a minimal `$HOME` bootstrap subset.** The prelude's `for d` list
|
|
44
|
+
exists only to bootstrap-discover `forge-root.sh`; the authoritative multi-root probe lives in
|
|
45
|
+
`forge-root.sh` step 2. When adding an install root, update `forge-root.sh` first; extend the
|
|
46
|
+
prelude only if the new root is needed to bootstrap-discover `forge-root.sh` itself.
|
|
47
|
+
|
|
48
|
+
## The resolver
|
|
49
|
+
|
|
50
|
+
The prelude delegates to [`scripts/forge-root.sh`](../scripts/forge-root.sh) — the portable
|
|
51
|
+
skill/plugin-root resolver. It takes no arguments, prints the absolute plugin root to stdout and
|
|
52
|
+
exits `0`, or writes an actionable message to stderr and exits `1`. It resolves the root by
|
|
53
|
+
self-location → candidate-root probe → plugin-root environment-variable fallback → actionable failure,
|
|
54
|
+
and never sources or executes a discovered path — it only ever prints a directory string. The
|
|
55
|
+
spec-purity checker (rule 5) enforces that every prelude occurrence across the canon is
|
|
56
|
+
byte-identical to the fenced block in this file.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Feature Forge Pipeline Overview
|
|
2
|
+
|
|
3
|
+
This document describes the end-to-end feature development pipeline managed by the feature-forge plugin. All forge skills reference this document to understand the overall flow and their position within it.
|
|
4
|
+
|
|
5
|
+
## Pipeline Stages
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
forge-1-prd → forge-2-tech → forge-3-specs → forge-verify → forge-4-backlog → forge-verify → forge-5-loop → forge-verify → forge-6-docs
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Stage 1: PRD (`/feature-forge:forge-1-prd <feature>`)
|
|
12
|
+
**Input:** User's feature idea and domain knowledge
|
|
13
|
+
**Output:** `{specsDir}/{feature}/PRD.md`
|
|
14
|
+
**Method:** Structured interview focused exclusively on requirements. No technology decisions.
|
|
15
|
+
|
|
16
|
+
### Stage 2: Tech Spec (`/feature-forge:forge-2-tech <feature>`)
|
|
17
|
+
**Input:** PRD.md
|
|
18
|
+
**Output:** `{specsDir}/{feature}/tech-spec.md`
|
|
19
|
+
**Method:** Structured interview for technology decisions, grounded in PRD requirements.
|
|
20
|
+
|
|
21
|
+
### Stage 3: Implementation Specs (`/feature-forge:forge-3-specs <feature>`)
|
|
22
|
+
**Input:** PRD.md + tech-spec.md
|
|
23
|
+
**Output:** `{specsDir}/{feature}/##-<name>.md` (suite of numbered documents)
|
|
24
|
+
**Method:** Generate detailed implementation documents from spec archetypes.
|
|
25
|
+
|
|
26
|
+
### Verification Gate (`/feature-forge:forge-verify <feature>`)
|
|
27
|
+
**Input:** All artifacts from current and prior stages
|
|
28
|
+
**Output:** `{specsDir}/{feature}/.verification/VERIFY-<stage>-<timestamp>.md` (includes both findings and a Fix Execution Plan)
|
|
29
|
+
**Method:** Clean-context analysis producing actionable findings with an ordered fix plan.
|
|
30
|
+
|
|
31
|
+
After verification, fixes can be applied via:
|
|
32
|
+
- `/feature-forge:forge-fix <feature>` — reads the Fix Execution Plan from the findings document and applies changes (works in any session)
|
|
33
|
+
- Plan mode workflow — enter plan mode, run verify, review plan, exit and execute
|
|
34
|
+
- Manual — read findings and apply fixes by hand
|
|
35
|
+
|
|
36
|
+
### Stage 4: Backlog (`/feature-forge:forge-4-backlog <feature>`)
|
|
37
|
+
**Input:** Full spec suite
|
|
38
|
+
**Output:** `{specsDir}/{feature}/backlog.json` (or `{backlogDir}/backlog.json` if backlogDir is configured)
|
|
39
|
+
**Method:** Generate structured backlog items with spec references, acceptance criteria, and dependencies. Backlog is collocated with feature specs by default.
|
|
40
|
+
|
|
41
|
+
### Stage 5: Rauf Loop (`/feature-forge:forge-5-loop <feature>`)
|
|
42
|
+
**Input:** `backlog.json` from Stage 4
|
|
43
|
+
**Output:** Implemented source code (committed per-item by rauf)
|
|
44
|
+
**Method:** Execute the rauf autonomous coding loop against the feature's backlog. Spawns a fresh Claude Code session per backlog item with full spec context.
|
|
45
|
+
|
|
46
|
+
### Stage 6: Documentation (`/feature-forge:forge-6-docs <feature>`)
|
|
47
|
+
**Input:** Specs + implementation
|
|
48
|
+
**Output:** `{docsDir}/{feature}/` documentation suite
|
|
49
|
+
**Method:** Generate developer-focused architecture documentation.
|
|
50
|
+
|
|
51
|
+
## Pipeline State
|
|
52
|
+
|
|
53
|
+
State is tracked in `{specsDir}/{feature}/.pipeline-state.json` and persists across session clears. The `/feature-forge:forge <feature>` navigator reads this file to show current progress.
|
|
54
|
+
|
|
55
|
+
## Git Discipline
|
|
56
|
+
|
|
57
|
+
Every stage completion should be followed by a git commit:
|
|
58
|
+
- Commit message format: `{commitPrefix}({feature}): <action>`
|
|
59
|
+
- Examples: `forge(auth): complete PRD v1`, `forge(auth): apply spec verification fixes`
|
|
60
|
+
- Before applying verification fixes, commit current state first (so pre-fix state is recoverable)
|
|
61
|
+
- After applying fixes, commit again
|
|
62
|
+
|
|
63
|
+
## Configuration
|
|
64
|
+
|
|
65
|
+
Read `forge.config.json` from project root for path overrides. See `references/forge-config-schema.json` for the full schema. If no config file exists, use defaults:
|
|
66
|
+
- specsDir: `./specs`
|
|
67
|
+
- docsDir: `./docs/architecture`
|
|
68
|
+
- backlogDir: (null — backlog defaults to {specsDir}/{feature}/backlog.json)
|
|
69
|
+
- gitCommitAfterStage: `true`
|
|
70
|
+
- commitPrefix: `forge`
|
|
71
|
+
|
|
72
|
+
## Git Workflow
|
|
73
|
+
|
|
74
|
+
Recommended: create a `forge/{feature}` branch before starting the pipeline. All forge commits go to this branch. After implementation, merge to your development branch.
|
|
75
|
+
|
|
76
|
+
If you prefer manual commit control, set `gitCommitAfterStage: false` in `forge.config.json`.
|
|
77
|
+
|
|
78
|
+
## Cross-Cutting Concerns
|
|
79
|
+
|
|
80
|
+
### Feature Name is Required
|
|
81
|
+
Every forge skill requires a feature name as the first argument. If not provided, STOP and ask. Never guess.
|
|
82
|
+
|
|
83
|
+
### Reference Existing Code
|
|
84
|
+
When creating specs, always examine the existing codebase for patterns, conventions, and integration points. Check:
|
|
85
|
+
- Other feature specs in `{specsDir}/`
|
|
86
|
+
- Existing documentation in `{docsDir}/`
|
|
87
|
+
- Module/package structure and exports in the project
|
|
88
|
+
- Shared types, utilities, and conventions
|
|
89
|
+
|
|
90
|
+
### Stack Context
|
|
91
|
+
The project's stack is detected during forge-2-tech and persisted in `forge.config.json` (the `stack`, `typeCheckCommand`, and `testCommand` fields). See `references/stack-resolution.md` for the full resolution protocol. The project may also have a `stack-decisions.md` in `.claude/references/` with established technology decisions — if present, it takes highest precedence.
|
|
92
|
+
|
|
93
|
+
## Subagents
|
|
94
|
+
|
|
95
|
+
The plugin includes three specialized subagents in `agents/` that enhance specific
|
|
96
|
+
pipeline steps. They use **model aliases** (`opus`/`sonnet`) rather than pinned IDs, so
|
|
97
|
+
they track the current model tier automatically.
|
|
98
|
+
|
|
99
|
+
### forge-verifier
|
|
100
|
+
- **Purpose:** Read-only verification of pipeline artifacts
|
|
101
|
+
- **Used by:** `forge-verify` skill (delegation via Agent tool)
|
|
102
|
+
- **Tools:** Read, Glob, Grep, Bash (read-only operations only)
|
|
103
|
+
- **Model:** Opus (judgement-heavy gap/inconsistency analysis)
|
|
104
|
+
- **Memory:** Project-scoped persistent memory — accumulates knowledge about recurring issues and project-specific patterns across sessions
|
|
105
|
+
- **Parallel:** For large modes (specs/backlog/impl), `forge-verify` dispatches several instances in parallel, one per **dimension group** (e.g. types/contracts, traceability, testing), and the parent merges their findings. An opt-in adversarial "deep verify" pass re-checks high-severity findings with a skeptic instance to cut false positives. A purely mechanical dimension (e.g. traceability validation) could run on a cheaper tier (Haiku) if cost matters.
|
|
106
|
+
- **Why a subagent:** Verification reads the entire spec suite, backlog, and potentially source code. Running this in a separate context window prevents context pressure on the main conversation. The read-only tool restriction also makes it impossible to accidentally modify specs during verification.
|
|
107
|
+
|
|
108
|
+
### forge-researcher
|
|
109
|
+
- **Purpose:** Codebase exploration and integration mapping
|
|
110
|
+
- **Used by:** `forge-2-tech` skill (spawned before the tech-spec interview)
|
|
111
|
+
- **Tools:** Read, Glob, Grep, Bash (read-only)
|
|
112
|
+
- **Model:** Sonnet (cost-efficient for exploration tasks)
|
|
113
|
+
- **Parallel:** For a large codebase or uncertain scope, `forge-2-tech` may dispatch several researchers in parallel, each with a disjoint focus (structure/conventions, per-subsystem integration surfaces), and merge the reports.
|
|
114
|
+
- **Why a subagent:** Tech-spec planning requires reading many files across the project to understand integration points. Running this in a separate context returns a concise report without consuming the main session's context, keeping the interview focused.
|
|
115
|
+
|
|
116
|
+
### forge-spec-writer
|
|
117
|
+
- **Purpose:** Author exactly one numbered implementation spec document to the forge-3-specs quality bar
|
|
118
|
+
- **Used by:** `forge-3-specs` skill (parallel fan-out after the shared foundation docs are written)
|
|
119
|
+
- **Tools:** Read, Glob, Grep, Bash, **Write** (the only authoring agent — constrained to write its single assigned file)
|
|
120
|
+
- **Model:** Opus (spec authoring is detail- and judgement-heavy)
|
|
121
|
+
- **Why a subagent:** Authoring the whole suite in the main session serializes the work and pressures context. Writing the foundation (00/01) first, then fanning out one writer per remaining doc, parallelizes authoring while the parent keeps the cross-reference + traceability finish in view.
|
|
122
|
+
|
|
123
|
+
All three subagents are optional. If the agents are not installed or the environment doesn't support subagents, the corresponding skills fall back to running inline (or, for spec authoring, batched in the main session).
|