@garygentry/feature-forge 0.2.12 → 0.2.14
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/adapters/GENERATION-REPORT.md +1 -0
- package/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/references/epic-manifest-schema.json +5 -0
- package/adapters/claude/references/forge-config-schema.json +5 -0
- package/adapters/claude/references/shared-conventions.md +12 -0
- package/adapters/claude/references/stacks/_generic.md +21 -0
- package/adapters/claude/references/stacks/go.md +19 -0
- package/adapters/claude/references/stacks/python.md +21 -0
- package/adapters/claude/references/stacks/rust.md +19 -0
- package/adapters/claude/references/stacks/typescript.md +23 -0
- package/adapters/claude/scripts/epic-manifest.py +284 -5
- package/adapters/claude/scripts/forge-bootstrap.py +1 -0
- package/adapters/claude/scripts/forge-init.sh +2 -0
- package/adapters/claude/scripts/forge-root.sh +55 -11
- package/adapters/claude/scripts/forge-session.py +38 -1
- package/adapters/claude/skills/forge/SKILL.md +9 -1
- package/adapters/claude/skills/forge/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge/references/process-overview.md +143 -0
- package/adapters/claude/skills/forge/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +11 -0
- package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge-0-epic/references/portable-root.md +71 -0
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-1-prd/SKILL.md +2 -0
- package/adapters/claude/skills/forge-1-prd/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-2-tech/SKILL.md +3 -1
- package/adapters/claude/skills/forge-2-tech/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-2-tech/references/stack-resolution.md +54 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/_generic.md +111 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/go.md +157 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/python.md +184 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/rust.md +170 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/typescript.md +134 -0
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-3-specs/SKILL.md +2 -0
- package/adapters/claude/skills/forge-3-specs/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/_generic.md +111 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/go.md +157 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/python.md +184 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/rust.md +170 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/typescript.md +134 -0
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +5 -0
- package/adapters/claude/skills/forge-4-backlog/references/forge-config-schema.json +236 -0
- package/adapters/claude/skills/forge-4-backlog/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-5-loop/SKILL.md +7 -9
- package/adapters/claude/skills/forge-5-loop/references/forge-config-schema.json +236 -0
- package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +221 -0
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-6-docs/SKILL.md +4 -1
- package/adapters/claude/skills/forge-6-docs/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +258 -0
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +236 -0
- package/adapters/claude/skills/forge-guide/references/process-overview.md +143 -0
- package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +221 -0
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-guide/references/stack-resolution.md +54 -0
- package/adapters/claude/skills/forge-guide/references/stacks/_generic.md +111 -0
- package/adapters/claude/skills/forge-guide/references/stacks/go.md +157 -0
- package/adapters/claude/skills/forge-guide/references/stacks/python.md +184 -0
- package/adapters/claude/skills/forge-guide/references/stacks/rust.md +170 -0
- package/adapters/claude/skills/forge-guide/references/stacks/typescript.md +134 -0
- package/adapters/claude/skills/forge-init/SKILL.md +1 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +5 -4
- package/adapters/claude/skills/forge-verify/references/pipeline-state-schema.json +191 -0
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +295 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists.md +88 -2
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/references/epic-manifest-schema.json +5 -0
- package/adapters/codex/references/forge-config-schema.json +5 -0
- package/adapters/codex/references/shared-conventions.md +12 -0
- package/adapters/codex/references/stacks/_generic.md +21 -0
- package/adapters/codex/references/stacks/go.md +19 -0
- package/adapters/codex/references/stacks/python.md +21 -0
- package/adapters/codex/references/stacks/rust.md +19 -0
- package/adapters/codex/references/stacks/typescript.md +23 -0
- package/adapters/codex/scripts/epic-manifest.py +284 -5
- package/adapters/codex/scripts/forge-bootstrap.py +1 -0
- package/adapters/codex/scripts/forge-init.sh +2 -0
- package/adapters/codex/scripts/forge-root.sh +55 -11
- package/adapters/codex/scripts/forge-session.py +38 -1
- package/adapters/codex/skills/forge/SKILL.md +9 -1
- package/adapters/codex/skills/forge/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge/references/process-overview.md +143 -0
- package/adapters/codex/skills/forge/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +11 -0
- package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge-0-epic/references/portable-root.md +71 -0
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-1-prd/SKILL.md +2 -0
- package/adapters/codex/skills/forge-1-prd/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-2-tech/SKILL.md +3 -1
- package/adapters/codex/skills/forge-2-tech/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-2-tech/references/stack-resolution.md +54 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/_generic.md +111 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/go.md +157 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/python.md +184 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/rust.md +170 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/typescript.md +134 -0
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-3-specs/SKILL.md +2 -0
- package/adapters/codex/skills/forge-3-specs/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/_generic.md +111 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/go.md +157 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/python.md +184 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/rust.md +170 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/typescript.md +134 -0
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +5 -0
- package/adapters/codex/skills/forge-4-backlog/references/forge-config-schema.json +236 -0
- package/adapters/codex/skills/forge-4-backlog/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-5-loop/SKILL.md +7 -9
- package/adapters/codex/skills/forge-5-loop/references/forge-config-schema.json +236 -0
- package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +221 -0
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-6-docs/SKILL.md +4 -1
- package/adapters/codex/skills/forge-6-docs/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +258 -0
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +236 -0
- package/adapters/codex/skills/forge-guide/references/process-overview.md +143 -0
- package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +221 -0
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-guide/references/stack-resolution.md +54 -0
- package/adapters/codex/skills/forge-guide/references/stacks/_generic.md +111 -0
- package/adapters/codex/skills/forge-guide/references/stacks/go.md +157 -0
- package/adapters/codex/skills/forge-guide/references/stacks/python.md +184 -0
- package/adapters/codex/skills/forge-guide/references/stacks/rust.md +170 -0
- package/adapters/codex/skills/forge-guide/references/stacks/typescript.md +134 -0
- package/adapters/codex/skills/forge-init/SKILL.md +1 -0
- package/adapters/codex/skills/forge-verify/SKILL.md +5 -4
- package/adapters/codex/skills/forge-verify/references/pipeline-state-schema.json +191 -0
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +295 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists.md +88 -2
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/references/epic-manifest-schema.json +5 -0
- package/adapters/copilot/references/forge-config-schema.json +5 -0
- package/adapters/copilot/references/shared-conventions.md +12 -0
- package/adapters/copilot/references/stacks/_generic.md +21 -0
- package/adapters/copilot/references/stacks/go.md +19 -0
- package/adapters/copilot/references/stacks/python.md +21 -0
- package/adapters/copilot/references/stacks/rust.md +19 -0
- package/adapters/copilot/references/stacks/typescript.md +23 -0
- package/adapters/copilot/scripts/epic-manifest.py +284 -5
- package/adapters/copilot/scripts/forge-bootstrap.py +1 -0
- package/adapters/copilot/scripts/forge-init.sh +2 -0
- package/adapters/copilot/scripts/forge-root.sh +55 -11
- package/adapters/copilot/scripts/forge-session.py +38 -1
- package/adapters/copilot/skills/forge/forge.md +9 -1
- package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge/references/process-overview.md +143 -0
- package/adapters/copilot/skills/forge/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +11 -0
- package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge-0-epic/references/portable-root.md +71 -0
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +2 -0
- package/adapters/copilot/skills/forge-1-prd/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +3 -1
- package/adapters/copilot/skills/forge-2-tech/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-2-tech/references/stack-resolution.md +54 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/_generic.md +111 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/go.md +157 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/python.md +184 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/rust.md +170 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/typescript.md +134 -0
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +2 -0
- package/adapters/copilot/skills/forge-3-specs/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/_generic.md +111 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/go.md +157 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/python.md +184 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/rust.md +170 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/typescript.md +134 -0
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +5 -0
- package/adapters/copilot/skills/forge-4-backlog/references/forge-config-schema.json +236 -0
- package/adapters/copilot/skills/forge-4-backlog/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +7 -9
- package/adapters/copilot/skills/forge-5-loop/references/forge-config-schema.json +236 -0
- package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +221 -0
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +4 -1
- package/adapters/copilot/skills/forge-6-docs/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +258 -0
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +236 -0
- package/adapters/copilot/skills/forge-guide/references/process-overview.md +143 -0
- package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +221 -0
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-guide/references/stack-resolution.md +54 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/_generic.md +111 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/go.md +157 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/python.md +184 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/rust.md +170 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/typescript.md +134 -0
- package/adapters/copilot/skills/forge-init/forge-init.md +1 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +5 -4
- package/adapters/copilot/skills/forge-verify/references/pipeline-state-schema.json +191 -0
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +295 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +88 -2
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/references/epic-manifest-schema.json +5 -0
- package/adapters/cursor/references/forge-config-schema.json +5 -0
- package/adapters/cursor/references/shared-conventions.md +12 -0
- package/adapters/cursor/references/stacks/_generic.md +21 -0
- package/adapters/cursor/references/stacks/go.md +19 -0
- package/adapters/cursor/references/stacks/python.md +21 -0
- package/adapters/cursor/references/stacks/rust.md +19 -0
- package/adapters/cursor/references/stacks/typescript.md +23 -0
- package/adapters/cursor/scripts/epic-manifest.py +284 -5
- package/adapters/cursor/scripts/forge-bootstrap.py +1 -0
- package/adapters/cursor/scripts/forge-init.sh +2 -0
- package/adapters/cursor/scripts/forge-root.sh +55 -11
- package/adapters/cursor/scripts/forge-session.py +38 -1
- package/adapters/cursor/skills/forge/forge.mdc +9 -1
- package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge/references/process-overview.md +143 -0
- package/adapters/cursor/skills/forge/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +11 -0
- package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge-0-epic/references/portable-root.md +71 -0
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +2 -0
- package/adapters/cursor/skills/forge-1-prd/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +3 -1
- package/adapters/cursor/skills/forge-2-tech/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-2-tech/references/stack-resolution.md +54 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/_generic.md +111 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/go.md +157 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/python.md +184 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/rust.md +170 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/typescript.md +134 -0
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +2 -0
- package/adapters/cursor/skills/forge-3-specs/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/_generic.md +111 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/go.md +157 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/python.md +184 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/rust.md +170 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/typescript.md +134 -0
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +5 -0
- package/adapters/cursor/skills/forge-4-backlog/references/forge-config-schema.json +236 -0
- package/adapters/cursor/skills/forge-4-backlog/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +7 -9
- package/adapters/cursor/skills/forge-5-loop/references/forge-config-schema.json +236 -0
- package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +221 -0
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +4 -1
- package/adapters/cursor/skills/forge-6-docs/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +258 -0
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +236 -0
- package/adapters/cursor/skills/forge-guide/references/process-overview.md +143 -0
- package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +221 -0
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-guide/references/stack-resolution.md +54 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/_generic.md +111 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/go.md +157 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/python.md +184 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/rust.md +170 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/typescript.md +134 -0
- package/adapters/cursor/skills/forge-init/forge-init.mdc +1 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +5 -4
- package/adapters/cursor/skills/forge-verify/references/pipeline-state-schema.json +191 -0
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +295 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +88 -2
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/gemini-extension.json +1 -1
- package/adapters/gemini/references/epic-manifest-schema.json +5 -0
- package/adapters/gemini/references/forge-config-schema.json +5 -0
- package/adapters/gemini/references/shared-conventions.md +12 -0
- package/adapters/gemini/references/stacks/_generic.md +21 -0
- package/adapters/gemini/references/stacks/go.md +19 -0
- package/adapters/gemini/references/stacks/python.md +21 -0
- package/adapters/gemini/references/stacks/rust.md +19 -0
- package/adapters/gemini/references/stacks/typescript.md +23 -0
- package/adapters/gemini/scripts/epic-manifest.py +284 -5
- package/adapters/gemini/scripts/forge-bootstrap.py +1 -0
- package/adapters/gemini/scripts/forge-init.sh +2 -0
- package/adapters/gemini/scripts/forge-root.sh +55 -11
- package/adapters/gemini/scripts/forge-session.py +38 -1
- package/adapters/gemini/skills/forge/forge.md +9 -1
- package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge/references/process-overview.md +143 -0
- package/adapters/gemini/skills/forge/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +11 -0
- package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge-0-epic/references/portable-root.md +71 -0
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +2 -0
- package/adapters/gemini/skills/forge-1-prd/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +3 -1
- package/adapters/gemini/skills/forge-2-tech/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-2-tech/references/stack-resolution.md +54 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/_generic.md +111 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/go.md +157 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/python.md +184 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/rust.md +170 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/typescript.md +134 -0
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +2 -0
- package/adapters/gemini/skills/forge-3-specs/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/_generic.md +111 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/go.md +157 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/python.md +184 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/rust.md +170 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/typescript.md +134 -0
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +5 -0
- package/adapters/gemini/skills/forge-4-backlog/references/forge-config-schema.json +236 -0
- package/adapters/gemini/skills/forge-4-backlog/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +7 -9
- package/adapters/gemini/skills/forge-5-loop/references/forge-config-schema.json +236 -0
- package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +221 -0
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +4 -1
- package/adapters/gemini/skills/forge-6-docs/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +258 -0
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +236 -0
- package/adapters/gemini/skills/forge-guide/references/process-overview.md +143 -0
- package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +221 -0
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-guide/references/stack-resolution.md +54 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/_generic.md +111 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/go.md +157 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/python.md +184 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/rust.md +170 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/typescript.md +134 -0
- package/adapters/gemini/skills/forge-init/forge-init.md +1 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +5 -4
- package/adapters/gemini/skills/forge-verify/references/pipeline-state-schema.json +191 -0
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +295 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +88 -2
- package/package.json +1 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# Stage Exit Protocol
|
|
2
|
+
|
|
3
|
+
The single source of truth for how every forge **authoring** stage closes. It
|
|
4
|
+
replaces the old ad-hoc "Next steps:" bullet lists with one fixed, correctly-ordered
|
|
5
|
+
sequence: **verify (if missing or stale) → `/clear` → run the next command.**
|
|
6
|
+
|
|
7
|
+
Two principles this protocol encodes (do not relitigate — they are locked product
|
|
8
|
+
decisions):
|
|
9
|
+
|
|
10
|
+
1. **Clearing is recommended on its own merits at every stage boundary** — a clean
|
|
11
|
+
start for the next stage — *not* as a proxy for a full context window. Window
|
|
12
|
+
fullness only changes *how emphatically* the clear is recommended, never *whether*
|
|
13
|
+
it is.
|
|
14
|
+
2. **Verify happens before the clear, never after** — in the authoring session, whether
|
|
15
|
+
manual **or** auto. Verify's clean-room subagent is dispatched from the *current*
|
|
16
|
+
session, so the findings digest and any fix decision land where the context to act on
|
|
17
|
+
them still exists. This holds for auto-verify too: the stage skill dispatches the
|
|
18
|
+
clean-room verify (and any autoFix) at stage end, in-session, before the exit — it is
|
|
19
|
+
**not** deferred to the navigator, which runs *after* the `/clear` with none of the
|
|
20
|
+
authoring context. Clearing first throws that context away.
|
|
21
|
+
|
|
22
|
+
## How this file is used
|
|
23
|
+
|
|
24
|
+
The five authoring stages (`forge-0-epic` … `forge-4-backlog`) close with the
|
|
25
|
+
**Scripted Stage Exit**: a short stamped block (below) that runs
|
|
26
|
+
`forge-session.py stage-exit`, obeys the DIRECTIVES it prints per the **directive
|
|
27
|
+
contract** in this file, and prints the script-emitted NEXT-STEPS block verbatim as the
|
|
28
|
+
absolute last output. All the conditional logic the old prose blocks asked the model to
|
|
29
|
+
compute (effective auto-verify, freshness collapse, gate selection, host wording) now
|
|
30
|
+
lives in the script, deterministically; only genuinely interactive work (clean-room
|
|
31
|
+
subagent dispatch, `AskUserQuestion` gates) remains prose — specified once here, not
|
|
32
|
+
per stage.
|
|
33
|
+
|
|
34
|
+
The loop (`forge-5-loop`) keeps its bespoke exits: it stamps the **standard block**
|
|
35
|
+
(step-6 epic-member handoff) and the **warm variant** (all-done closing) below,
|
|
36
|
+
verbatim. `forge-6-docs` is **terminal** — it stamps no exit block.
|
|
37
|
+
|
|
38
|
+
A drift-guard test (`tests/test_stage_exit_protocol.py`) asserts each stamp site still
|
|
39
|
+
contains its block, so an edit here must be mirrored into every stamp site (and
|
|
40
|
+
vice-versa).
|
|
41
|
+
|
|
42
|
+
## Stamp sites
|
|
43
|
+
|
|
44
|
+
| Stamp site | Block |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `forge-0-epic` … `forge-4-backlog` | scripted-stage-exit stamp |
|
|
47
|
+
| `forge-5-loop` (step-6 epic-member handoff) | standard |
|
|
48
|
+
| `forge-5-loop` (all-done closing → docs) | warm |
|
|
49
|
+
|
|
50
|
+
The scripted stamp fills one build-time slot, `{stage-exit-args}` — the per-stage
|
|
51
|
+
argument list (e.g. `--feature "{feature}" --stage forge-2-tech`; the epic stage passes
|
|
52
|
+
`--feature "{epic}" --stage forge-0-epic --next-feature "{first-actionable-feature}"`).
|
|
53
|
+
`{feature}` / `{epic}` / `{specsDir}` / `{first-actionable-feature}` remain runtime
|
|
54
|
+
placeholders the skill resolves before running the command, exactly as elsewhere.
|
|
55
|
+
|
|
56
|
+
<!-- BEGIN: scripted-stage-exit-stamp -->
|
|
57
|
+
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
R="$(bash -c 'for d in "${CLAUDE_PLUGIN_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
61
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
62
|
+
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host claude
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Obey the DIRECTIVES it prints, in order, per the directive contract: `runInStageVerify: true` → dispatch the in-stage clean-room verify now (honoring `autoFixEligible`); `verifyGate: "standard"` → present the Standard Verify Gate; `verifyGate: "manual-print"` → print the `verifyCommand` for the user; non-empty `invalidAutoVerifyKeys` → print a one-line warning. Then **print the NEXT-STEPS block verbatim as your absolute last output — nothing after its sentinel line.**
|
|
66
|
+
<!-- END: scripted-stage-exit-stamp -->
|
|
67
|
+
|
|
68
|
+
## Directive contract
|
|
69
|
+
|
|
70
|
+
`stage-exit` emits a DIRECTIVES object and a NEXT-STEPS block. The skill executes the
|
|
71
|
+
directives **in this order**; the script has already computed every conditional, so a
|
|
72
|
+
directive is an instruction, not a question to re-derive.
|
|
73
|
+
|
|
74
|
+
### `invalidAutoVerifyKeys` (non-empty)
|
|
75
|
+
|
|
76
|
+
Print a one-line warning first (e.g. "⚠️ forge.config.json `autoVerifyStages` has
|
|
77
|
+
unknown keys: … — they are ignored; fix the typo").
|
|
78
|
+
|
|
79
|
+
### `runInStageVerify: true` — in-stage auto-verify {stageNoun}
|
|
80
|
+
|
|
81
|
+
Auto-verify is effective for this stage and verification is outstanding — verify **now,
|
|
82
|
+
in this session** (principle #2 applied to auto-verify: the digest and any fix decision
|
|
83
|
+
land here, where the authoring context still exists — not deferred to a post-`/clear`
|
|
84
|
+
navigator):
|
|
85
|
+
|
|
86
|
+
1. **Clean-room verify (require-clean).** Dispatch the clean-room `forge-verifier`
|
|
87
|
+
subagent from this session in require-clean mode — the same path the navigator uses
|
|
88
|
+
(`skills/forge-verify/SKILL.md`). Dispatch it **synchronously and await its digest
|
|
89
|
+
inline** — do **not** run it in the background or announce it as "still running";
|
|
90
|
+
the digest and any fix decision must land in this session. It inherits none of this
|
|
91
|
+
session's context, so no `/clear` is needed and only a compact digest returns.
|
|
92
|
+
**Clean-room unavailable** (no `Agent` tool, `forge-verifier` not dispatchable) **or
|
|
93
|
+
a non-answer returned** (the verifier returned a placeholder / "still running" /
|
|
94
|
+
delegation message instead of a findings block): do **not** run inline and do **not**
|
|
95
|
+
silently accept the non-answer as a pass — leave verify **pending** so the navigator
|
|
96
|
+
catch-up fires on a later Claude-host `/feature-forge:forge`, print the
|
|
97
|
+
`verifyCommand` for the user to run, and continue to the NEXT-STEPS block.
|
|
98
|
+
2. **Verify passed / no findings** → the fresh verify state is recorded by the
|
|
99
|
+
clean-room run; continue to the NEXT-STEPS block.
|
|
100
|
+
3. **Verify found findings** →
|
|
101
|
+
- **`autoFixEligible: true` AND the findings document has zero unresolved decision
|
|
102
|
+
points** → chain `feature-forge:forge-fix` in-session (it owns its own commit +
|
|
103
|
+
step tracking), then run a **mandatory re-verify** in require-clean mode. Continue
|
|
104
|
+
to the NEXT-STEPS block only if the re-verify passes. On any precondition miss, a
|
|
105
|
+
forge-fix early stop, or a red re-verify, fall through to the digest gate below —
|
|
106
|
+
never a silent partial mutation. (`autoFixEligible` already folds in the config
|
|
107
|
+
`autoFix` flag and the clean-tree precondition; a dirty tree or
|
|
108
|
+
`gitCommitAfterStage: false` arrives here as `false`.)
|
|
109
|
+
- **`autoFixEligible: false`, or unresolved decision points** → surface a **compact
|
|
110
|
+
findings digest** as text, then present the gate via `AskUserQuestion`: **Run
|
|
111
|
+
`forge-fix` now** *(recommended — you are in-context and the digest is right
|
|
112
|
+
here)* / **Clear + advance anyway** (leave the findings for later) / **Stop
|
|
113
|
+
here**. Do **not** hard-stop and do **not** silently walk past. Act on the choice,
|
|
114
|
+
then continue to the NEXT-STEPS block.
|
|
115
|
+
|
|
116
|
+
### `verifyGate: "standard"` — the Standard Verify Gate
|
|
117
|
+
|
|
118
|
+
Auto-verify is off for this stage and verification is outstanding (`verifyState` is
|
|
119
|
+
`never`, `stale`, or `failing`). Verify **now, before clearing**, using
|
|
120
|
+
`AskUserQuestion` with exactly these three options — but only when the host has a
|
|
121
|
+
question mechanism **and** the clean-room path is available (the `Agent` tool plus a
|
|
122
|
+
dispatchable `forge-verifier` subagent); otherwise degrade exactly as `manual-print`
|
|
123
|
+
below:
|
|
124
|
+
|
|
125
|
+
- **Verify {stageNoun} now** *(recommended)* — dispatch the clean-room `forge-verifier`
|
|
126
|
+
subagent from this session in require-clean mode; the digest returns here so any fix
|
|
127
|
+
decision keeps its context. One-time — it does **not** change config.
|
|
128
|
+
- **Verify now + enable auto-verify going forward** — verify now **and** patch
|
|
129
|
+
`"autoVerify": true` into `forge.config.json` in place (preserve formatting and every
|
|
130
|
+
other key) so future stages verify automatically, no prompt. This complements the
|
|
131
|
+
`forge-init` opt-in. **Do not auto-commit this config change** — treat it like
|
|
132
|
+
`notes`: a user-facing edit the user commits on their own cadence, never folded into
|
|
133
|
+
a stage's artifact commit.
|
|
134
|
+
- **Skip for now** — go straight to the NEXT-STEPS block without verifying. Record this
|
|
135
|
+
stage's verify status as `"skipped"` in pipeline state (mirroring the existing skip
|
|
136
|
+
handling) **only** on an explicit skip — a skip does not go stale.
|
|
137
|
+
|
|
138
|
+
If verify runs and finds findings, handle them exactly as in the in-stage flow above
|
|
139
|
+
(digest + `AskUserQuestion` gate; `autoFixEligible` applies unchanged).
|
|
140
|
+
|
|
141
|
+
### `verifyGate: "manual-print"`
|
|
142
|
+
|
|
143
|
+
Verification is outstanding but the host cannot present the gate or dispatch
|
|
144
|
+
clean-room. Do **not** run verify inline — print the `verifyCommand` for the user to
|
|
145
|
+
run (mirroring `autoInvokeNextStage`), offer the auto-verify enable as plain text only
|
|
146
|
+
if a config write is possible, and continue to the NEXT-STEPS block. Verify state stays
|
|
147
|
+
outstanding, so the navigator catch-up can fire later.
|
|
148
|
+
|
|
149
|
+
### `verifyGate: "none"`
|
|
150
|
+
|
|
151
|
+
Verification is already resolved (fresh or explicitly skipped) or the in-stage run
|
|
152
|
+
above covers it. Say so in one line and continue to the NEXT-STEPS block.
|
|
153
|
+
|
|
154
|
+
### `epicReconcile` (epic backflow — present only when there are open requests)
|
|
155
|
+
|
|
156
|
+
Emitted only when the exiting member carries `open` `epicChangeRequests` (recorded by
|
|
157
|
+
`forge-1-prd`/`forge-2-tech` when the epic *decomposition* itself must change — see
|
|
158
|
+
`references/pipeline-state-schema.json`). Absent on the common path and for standalone
|
|
159
|
+
features. The script has already folded the routing into the NEXT-STEPS block, so this
|
|
160
|
+
directive is informational — you do **not** re-derive the wording:
|
|
161
|
+
|
|
162
|
+
- `required: true` (at least one `blocksCurrent: true` request) — the NEXT-STEPS block's
|
|
163
|
+
fenced **primary** command is the epic reconcile command
|
|
164
|
+
(`/feature-forge:forge-0-epic {epic}`), and the normal next stage is demoted to a
|
|
165
|
+
follow-up line ("After reconciling, continue with …"). This is *reconcile-before-specs*:
|
|
166
|
+
proceeding would author artifacts against a decomposition that is about to change. It is
|
|
167
|
+
strongest when exiting `forge-2-tech` (next is `forge-3-specs`, the point of no cheap
|
|
168
|
+
return).
|
|
169
|
+
- `reminder: true` (only `blocksCurrent: false` requests) — normal next-stage routing is
|
|
170
|
+
unchanged; the block appends a non-blocking reminder line ("You also flagged N epic
|
|
171
|
+
change(s) to reconcile when convenient …"). This is *finish-then-edit*.
|
|
172
|
+
|
|
173
|
+
Either way the added lines are host-neutral (no literal `/clear`) and sit **above** the
|
|
174
|
+
sentinel; just print the NEXT-STEPS block verbatim as always.
|
|
175
|
+
|
|
176
|
+
### Deferred decisions — do not solicit next-stage decisions at this exit
|
|
177
|
+
|
|
178
|
+
Each stage owns its own decisions. At a stage exit, do **not** pull a *later* stage's
|
|
179
|
+
decision forward — do not ask the user (or decide unilaterally) something that properly
|
|
180
|
+
belongs to the next stage's interview (e.g. at `forge-1-prd` exit, don't settle the
|
|
181
|
+
concrete cache backend that `forge-2-tech` will design). Soliciting it here guesses ahead
|
|
182
|
+
of the stage that owns the context, and the answer has nowhere durable to live.
|
|
183
|
+
|
|
184
|
+
Instead, when you notice a decision that belongs downstream, **record it structurally** as
|
|
185
|
+
a `deferredDecisions[]` entry on this feature's `.pipeline-state.json` (schema in
|
|
186
|
+
`references/pipeline-state-schema.json`; same direct-edit path as `notes` /
|
|
187
|
+
`epicChangeRequests[]`): `question` (phrased for the target stage), optional `rationale`
|
|
188
|
+
and `targetStage`, `raisedBy` (this stage), `raisedAt` (ISO-8601 UTC), `status: "open"`.
|
|
189
|
+
This keeps the exit focused on *this* stage's next-step routing while carrying the open
|
|
190
|
+
question forward for the owning stage to resolve (it flips `status` to `addressed` when it
|
|
191
|
+
does). Prefer a `deferredDecisions[]` entry over stuffing the same thing into the free-text
|
|
192
|
+
`notes` string. This is a recording affordance, not a gate: never block the exit on it.
|
|
193
|
+
|
|
194
|
+
### The NEXT-STEPS block (always last)
|
|
195
|
+
|
|
196
|
+
Print the script's NEXT-STEPS block **verbatim as your absolute last output**. Nothing
|
|
197
|
+
follows its final sentinel line (`─ forge: end of stage ─`) — no caveats, no summary,
|
|
198
|
+
no sign-off. The block already carries the `/clear` recommendation (host-aware wording
|
|
199
|
+
via `--host`) and the exact next command, so trailing prose can only push the user's
|
|
200
|
+
next action out of view.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Standard block
|
|
205
|
+
|
|
206
|
+
Stamped at the loop's step-6 epic-member handoff (finishing feature A → starting
|
|
207
|
+
feature B's PRD). It self-adapts: step 1's verify gate only fires when verification is
|
|
208
|
+
actually outstanding, so at a boundary where verify already ran (or was explicitly
|
|
209
|
+
skipped, or auto-verify is on) it silently collapses to just the `/clear` →
|
|
210
|
+
next-command steps.
|
|
211
|
+
|
|
212
|
+
Slots: `{stage}` (a lowercase noun phrase), `{verify-command}`, `{next-command}`.
|
|
213
|
+
|
|
214
|
+
<!-- BEGIN: standard-exit-block -->
|
|
215
|
+
**This stage is done — walk the user through the Stage Exit Protocol** before moving on. The order is fixed, and step 2 is something only the user can do:
|
|
216
|
+
|
|
217
|
+
1. **Verify {stage} first — if it isn't already verified.** If verify already ran in this session — via the in-stage auto-verify on the authoring stages, or the interactive impl-verify offered above on the loop — or is already fresh on record, or the stage was explicitly skipped, say so and go straight to step 2. Only when `autoVerify` is off for this stage **and** verify is **missing or stale** do you present the **Standard Verify Gate**: verify **now, before clearing**, using `AskUserQuestion` with exactly these three options — but only when the host has a question mechanism **and** the clean-room path is available (the `Agent` tool plus a dispatchable `forge-verifier` subagent):
|
|
218
|
+
- **Verify {stage} now** *(recommended)* — dispatch the clean-room `forge-verifier` subagent from this session in require-clean mode; the digest returns here so any fix decision keeps its context. One-time — it does **not** change config.
|
|
219
|
+
- **Verify now + enable auto-verify going forward** — verify now **and** patch `"autoVerify": true` into `forge.config.json` in place (preserve formatting and every other key) so future stages verify automatically, no prompt. This complements the `forge-init` opt-in. **Do not auto-commit this config change** — treat it like `notes`: a user-facing edit the user commits on their own cadence, never folded into a stage's artifact commit.
|
|
220
|
+
- **Skip for now** — go straight to `/clear` and the next command without verifying. Record this stage's verify status as `"skipped"` in pipeline state (mirroring the existing skip handling) **only** on an explicit skip — a skip does not go stale.
|
|
221
|
+
|
|
222
|
+
**Host / clean-room fallback (not a user-selectable option):** if the question mechanism, the `Agent` tool, or the `forge-verifier` subagent is unavailable, do **not** run clean-room — degrade to printing `{verify-command}` for the user to run inline/manually (mirroring `autoInvokeNextStage`), and offer the auto-verify enable as plain text only if a config write is possible.
|
|
223
|
+
2. **Then `/clear`.** Recommended **unconditionally** at this boundary for a clean start — independent of how full the context window is. Every artifact is on disk, so the work survives the clear. **I can't `/clear` for you — you have to run it yourself.**
|
|
224
|
+
3. **Then run the next command** in the fresh session — or re-run `/feature-forge:forge` to let the navigator resume from disk:
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
{next-command}
|
|
228
|
+
```
|
|
229
|
+
<!-- END: standard-exit-block -->
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Warm-acceptable variant
|
|
234
|
+
|
|
235
|
+
Stamp this only at the `forge-5-loop → forge-6-docs` boundary (the all-done result
|
|
236
|
+
report). Here clearing is **optional**: the docs stage benefits from the still-warm
|
|
237
|
+
context of what the loop actually did, and impl-verify is already offered interactively
|
|
238
|
+
by the loop itself, so this block defers rather than re-presenting a gate.
|
|
239
|
+
|
|
240
|
+
> **Note — no literal `/clear` here.** The warm block lives in `result-reporting.md`, a
|
|
241
|
+
> skill-*own* reference that the adapter build copies **verbatim** (unlike skill bodies,
|
|
242
|
+
> it is not host-term translated), so a literal `/clear` would reach non-Claude adapters
|
|
243
|
+
> undegraded. The warm variant says "clearing is optional" anyway, so it is phrased
|
|
244
|
+
> host-neutrally without the token on purpose — do not reintroduce `/clear` here. (The
|
|
245
|
+
> standard block *does* use `/clear`; that is fine because every standard stamp site is a
|
|
246
|
+
> skill **body**, where `scripts/build-adapters.py` degrades it.)
|
|
247
|
+
|
|
248
|
+
<!-- BEGIN: warm-exit-block -->
|
|
249
|
+
**The loop is complete — this is the one boundary where clearing before the next stage is optional.**
|
|
250
|
+
|
|
251
|
+
1. **Verify is already offered above.** Impl-verify is offered interactively right after this report (Step 5b for a standalone feature, Step 6.1 for an epic member) — run it there rather than as a second gate. It runs clean-room, so it needs no fresh session.
|
|
252
|
+
2. **Clearing is optional here — warm is fine.** `forge-6-docs` benefits from the still-warm context of what the loop actually did, so continuing in this same session is the easy default. A cold start also works — every artifact is on disk — but there is no need to force it.
|
|
253
|
+
3. **Then run the next command** — in this warm session, or a fresh one if you prefer:
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+
{next-command}
|
|
257
|
+
```
|
|
258
|
+
<!-- END: warm-exit-block -->
|
|
@@ -94,6 +94,9 @@ After presenting the plan as text, use the host's question mechanism following t
|
|
|
94
94
|
|
|
95
95
|
**Forge-specific item requirements** layered on top of `author-backlog`'s output:
|
|
96
96
|
- `specReferences` must be paths **relative to the project root** (e.g. `specs/auth/00-core-definitions.md`), NOT relative to the backlog file. The validator resolves them from the project root (not from `--specs-dir`, which only gates the check).
|
|
97
|
+
- **Epic members — cross-member shared-state coupling (#144).** When authoring the backlog for an epic member, check whether this feature writes or migrates a file that a *sibling* member's already-shipped tests pin (its `mutatesShared[]` hint in `epic-manifest.json`, or a shared data corpus / generated fixture its specs say it mutates). If so, schedule a **reconciliation item up front** — before the first mutating item — that regenerates or re-pins the sibling's fixture (or updates the sibling test to the new shape), so the sibling suite stays green instead of red-gating every commit mid-loop. This is the authoring counterpart to forge-verify's CHECK-E10.
|
|
98
|
+
- **Generated-artifact freshness vs. `testCommand` `--check` gates (#145).** If the project's `testCommand` gates on staleness of generated artifacts (`<generator> --check`-style sub-commands that fail when a checked-in generated file is out of date), then any item that regenerates **one** such artifact must regenerate **and commit all** the sibling artifacts those `--check` gates depend on — enumerate the whole gated set, not just the artifact the item is "about", or the item passes locally yet red-gates on the stale-generated check. Pass this to `author-backlog` alongside `testCommand` so the full regeneration sequence lands in each affected item; forge-verify's CHECK-B26 flags a partial set or an ungated regenerator after the fact.
|
|
99
|
+
- **Lifecycle-gated artifacts — no test item forcing a forbidden transition (#150).** A test/e2e item whose acceptance asserts a *published / released / approved / human-reviewed* artifact state must either (a) `dependsOn` an explicit, human-gated publish/review item that legitimately produces that state, or (b) assert the state via a **dev-build / fixture path**. A test item must **never** be the only thing forcing a lifecycle transition another item pins the other way (e.g. one item keeps artifact `X` *draft* while a test demands it *published*, with nothing between to publish it) — the loop, unable to publish or obtain a human sign-off, will **fabricate** the provenance. `author-backlog` owns the general rule; forge-verify's CHECK-B27 flags a contradictory pair with no publisher in the dependency closure after the fact.
|
|
97
100
|
|
|
98
101
|
> **Backlog schema & rauf contract are unchanged (REQ-COMPAT-03).** Epic membership adds **no** fields to backlog items — dependency edges live in the epic manifest, never in any backlog item. The JSON written here is byte-for-byte the same shape as a pre-epic standalone feature's backlog, and rauf is still launched against a single per-feature backlog path. Only the *path composition* changes (the `{feature}` segment in the backlog-directory rule above), not the schema or rauf's CLI surface.
|
|
99
102
|
|
|
@@ -131,6 +134,8 @@ State that the backlog is ready and invite adjustments before committing — a s
|
|
|
131
134
|
|
|
132
135
|
## Step 7: Update Pipeline State and Commit
|
|
133
136
|
|
|
137
|
+
Before writing state or running the stage exit, invoke the **Stage-Completion Re-check** block in `references/shared-conventions.md` with `{stage}` = `forge-4-backlog` — a resumed mid-stage continuation must not overwrite a committed `backlog.json` or re-fire a finished exit.
|
|
138
|
+
|
|
134
139
|
Write pipeline state conforming to `references/pipeline-state-schema.json`. Follow the Git Commit Protocol in `references/shared-conventions.md`.
|
|
135
140
|
|
|
136
141
|
1. Update `{resolvedFeatureDir}/.pipeline-state.json`:
|
|
@@ -0,0 +1,236 @@
|
|
|
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", "null"],
|
|
19
|
+
"default": null,
|
|
20
|
+
"description": "Optional override for the backlog root. If set, the backlog is written to {backlogDir}/{feature}/backlog.json — the {feature} subdirectory is always composed in so multi-feature epics never collide. Default behavior (null): backlog.json is written to {specsDir}/{feature}/backlog.json with the feature specs."
|
|
21
|
+
},
|
|
22
|
+
"gitCommitAfterStage": {
|
|
23
|
+
"type": "boolean",
|
|
24
|
+
"default": true,
|
|
25
|
+
"description": "Automatically commit after each pipeline stage completes."
|
|
26
|
+
},
|
|
27
|
+
"commitPrefix": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"default": "forge",
|
|
30
|
+
"description": "Prefix for conventional commit messages, e.g., forge(auth): complete PRD"
|
|
31
|
+
},
|
|
32
|
+
"branchPerFeature": {
|
|
33
|
+
"type": "boolean",
|
|
34
|
+
"default": true,
|
|
35
|
+
"description": "Offer to create an isolated git branch when a feature/epic starts on the default branch (main/master). Gated only on the project using git — independent of gitCommitAfterStage. When false, forge never prompts for a branch and works on whatever branch is checked out. See the Branch Setup block in references/shared-conventions.md."
|
|
36
|
+
},
|
|
37
|
+
"branchPrefix": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"default": "forge/",
|
|
40
|
+
"description": "Prefix for the branch name suggested by Branch Setup, e.g. 'forge/' yields 'forge/{feature}' or 'forge/{epic}'. Ignored when branchPerFeature is false."
|
|
41
|
+
},
|
|
42
|
+
"stack": {
|
|
43
|
+
"type": ["string", "null"],
|
|
44
|
+
"description": "Detected or configured project stack identifier. Selects guidance from references/stacks/{stack}.md. Set during forge-2-tech or manually (null until then). Examples: 'typescript', 'python', 'go', 'rust'."
|
|
45
|
+
},
|
|
46
|
+
"typeCheckCommand": {
|
|
47
|
+
"type": ["string", "null"],
|
|
48
|
+
"description": "Command to verify type correctness or lint. Null until set. Examples: 'bun run typecheck', 'mypy .', 'go vet ./...'. Used in acceptance criteria and verification."
|
|
49
|
+
},
|
|
50
|
+
"testCommand": {
|
|
51
|
+
"type": ["string", "null"],
|
|
52
|
+
"description": "Command to run tests. Null until set. Examples: 'bun test', 'pytest', 'go test ./...'. Used in acceptance criteria and verification."
|
|
53
|
+
},
|
|
54
|
+
"smokeCommand": {
|
|
55
|
+
"type": ["string", "null"],
|
|
56
|
+
"default": null,
|
|
57
|
+
"description": "Optional end-to-end smoke command that boots the wired application entrypoint and drives one happy-path request, exiting 0 on success. DISTINCT from testCommand (unit tests, which may self-bootstrap) and loopRunner.runCommand (the loop launcher). Consumed by impl-verify's runnability check (CHECK-I21): when set it is executed (pass iff exit 0); when null the check degrades to an advisory not-applicable finding, never a hard fail (mirrors how a null typeCheckCommand is treated). Examples: 'npm run smoke', './scripts/smoke.sh', 'curl -fsS localhost:3000/health'."
|
|
58
|
+
},
|
|
59
|
+
"loopIterationMultiplier": {
|
|
60
|
+
"type": "number",
|
|
61
|
+
"default": 1.5,
|
|
62
|
+
"minimum": 1,
|
|
63
|
+
"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)."
|
|
64
|
+
},
|
|
65
|
+
"autoInvokeNextStage": {
|
|
66
|
+
"type": "boolean",
|
|
67
|
+
"default": true,
|
|
68
|
+
"description": "When true (default), the /feature-forge:forge navigator auto-invokes the next pipeline stage via the Skill tool after the user confirms it, instead of only printing the command to copy. Set false to keep the old copy-paste behavior (the navigator suggests the command but never launches it). Ignored on non-Claude hosts, which always fall back to printing the command."
|
|
69
|
+
},
|
|
70
|
+
"autoVerify": {
|
|
71
|
+
"type": "boolean",
|
|
72
|
+
"default": false,
|
|
73
|
+
"description": "When true, the /feature-forge:forge navigator automatically runs forge-verify after a stage completes, with no prompt. forge-verify runs in a fresh forge-verifier subagent (clean-room), so it never needs a context clear and costs the current session only a compact findings digest. Default false preserves today's manual-gate behavior. Ignored on non-Claude hosts, which always fall back to printing the verify command. Per-stage overrides in autoVerifyStages take precedence."
|
|
74
|
+
},
|
|
75
|
+
"autoVerifyStages": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"default": {},
|
|
78
|
+
"description": "Per-stage overrides for autoVerify. Maps a production stage id to a boolean; the effective value for a stage is autoVerifyStages[stage] if present, else autoVerify. Keys are constrained to the five verify-capable stages so a typo (e.g. 'forge-1-prod') is a schema error, not a silent no-op. forge-6-docs has no verify step and is not a valid key.",
|
|
79
|
+
"propertyNames": {
|
|
80
|
+
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog", "forge-5-loop"]
|
|
81
|
+
},
|
|
82
|
+
"additionalProperties": {
|
|
83
|
+
"type": "boolean"
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"autoFix": {
|
|
87
|
+
"type": "boolean",
|
|
88
|
+
"default": false,
|
|
89
|
+
"description": "When true, the navigator chains forge-fix automatically after an auto-verify that finds issues. Honored ONLY when auto-verify is effectively on for the stage, and ONLY when preconditions hold (findings doc has zero unresolved decision points, working tree is clean, and a mandatory re-verify passes) — otherwise it falls back to surfacing the findings digest and prompting. Default false keeps fixing human-gated."
|
|
90
|
+
},
|
|
91
|
+
"contextWindowTokens": {
|
|
92
|
+
"type": ["integer", "null"],
|
|
93
|
+
"default": null,
|
|
94
|
+
"description": "Context window size (tokens) used by the navigator's context-usage check to compute how full the current session is. Null (default) lets the helper infer from the session model and fall back to 200000 — and if observed usage already exceeds 200000 it auto-bumps the assumed window to 1000000 (proof a 1M-beta window is active). Set this explicitly to your model's window (e.g. 1000000 for a 1M-context model) for accurate percentages below 200000 too, since 1M cannot be detected from the transcript until usage crosses 200000."
|
|
95
|
+
},
|
|
96
|
+
"contextWarnThreshold": {
|
|
97
|
+
"type": "number",
|
|
98
|
+
"default": 0.7,
|
|
99
|
+
"minimum": 0,
|
|
100
|
+
"maximum": 1,
|
|
101
|
+
"description": "Fraction of the context window (0-1) past which the navigator recommends starting the next stage in a clean session rather than continuing. Default: 0.7."
|
|
102
|
+
},
|
|
103
|
+
"workspaces": {
|
|
104
|
+
"type": "array",
|
|
105
|
+
"description": "Monorepo members. Absent for single-package projects.",
|
|
106
|
+
"items": {
|
|
107
|
+
"type": "object",
|
|
108
|
+
"required": ["name", "path", "stack"],
|
|
109
|
+
"additionalProperties": false,
|
|
110
|
+
"properties": {
|
|
111
|
+
"name": {"type": "string"},
|
|
112
|
+
"path": {"type": "string", "description": "Repo-relative member dir"},
|
|
113
|
+
"stack": {"type": "string"},
|
|
114
|
+
"typeCheckCommand": {"type": ["string", "null"]},
|
|
115
|
+
"testCommand": {"type": ["string", "null"]}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"loopRunner": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"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.",
|
|
122
|
+
"properties": {
|
|
123
|
+
"name": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"default": "rauf",
|
|
126
|
+
"description": "Display name of the loop runner."
|
|
127
|
+
},
|
|
128
|
+
"bin": {
|
|
129
|
+
"type": "string",
|
|
130
|
+
"default": "rauf",
|
|
131
|
+
"description": "The runner executable. Assumed on PATH; may be an absolute path. Substituted as {bin} in every command."
|
|
132
|
+
},
|
|
133
|
+
"runCommand": {
|
|
134
|
+
"type": "string",
|
|
135
|
+
"default": "{bin} loop run . --backlog {backlogDir} --iterations {iterations}",
|
|
136
|
+
"description": "Run the loop. Launched in the background by forge-5. Human-formatted output; used as the fallback launch command when eventStreamCommand is absent."
|
|
137
|
+
},
|
|
138
|
+
"eventStreamCommand": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"default": "{bin} loop run . --backlog {backlogDir} --iterations {iterations} --ndjson",
|
|
141
|
+
"description": "Stdout NDJSON launch command for a runner that does NOT persist its own event file — same as runCommand but emits one machine-readable JSON event per stdout line: 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). NOTE: rauf (the default runner) ALREADY persists {stateDir}/events.ndjson natively and rotates it per run, so forge-5 launches the plain runCommand and monitors that native file — it does NOT use this field, and must NOT redirect --ndjson into {stateDir} (redundant, and it collides with the runner's own writer / archive rotation). This field is only for a stdout-only runner with no native event file; forge-5 then redirects its stdout to a file OUTSIDE {stateDir} and monitors that. Omit it entirely for a runner that self-persists or cannot emit NDJSON."
|
|
142
|
+
},
|
|
143
|
+
"validateCommand": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"default": "{bin} backlog validate . --backlog {backlogDir} --specs-dir {specsDir} --json",
|
|
146
|
+
"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."
|
|
147
|
+
},
|
|
148
|
+
"statusCommand": {
|
|
149
|
+
"type": "string",
|
|
150
|
+
"default": "{bin} status . --backlog {backlogDir}",
|
|
151
|
+
"description": "One-shot loop status, human-formatted. Shown to the user as a monitoring hint."
|
|
152
|
+
},
|
|
153
|
+
"statusJsonCommand": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"default": "{bin} status . --backlog {backlogDir} --json",
|
|
156
|
+
"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')."
|
|
157
|
+
},
|
|
158
|
+
"listCommand": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"default": "{bin} backlog list . --backlog {backlogDir} --json",
|
|
161
|
+
"description": "List backlog items as JSON."
|
|
162
|
+
},
|
|
163
|
+
"followCommand": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"default": "{bin} follow . --backlog {backlogDir}",
|
|
166
|
+
"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."
|
|
167
|
+
},
|
|
168
|
+
"logCommand": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"default": "{bin} log . --backlog {backlogDir} --follow",
|
|
171
|
+
"description": "Tail the runner log, human-formatted. Monitoring hint for the user."
|
|
172
|
+
},
|
|
173
|
+
"watchCommand": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"default": "{bin} status . --backlog {backlogDir} --json",
|
|
176
|
+
"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."
|
|
177
|
+
},
|
|
178
|
+
"versionCommand": {
|
|
179
|
+
"type": "string",
|
|
180
|
+
"default": "{bin} version --json",
|
|
181
|
+
"description": "Report runner version as { version: <semver> }. Used to enforce minRunnerVersion before running."
|
|
182
|
+
},
|
|
183
|
+
"agentArgument": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"default": "--agent {agent}",
|
|
186
|
+
"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)."
|
|
187
|
+
},
|
|
188
|
+
"agentsProbeCommand": {
|
|
189
|
+
"type": "string",
|
|
190
|
+
"default": "{bin} agents --json",
|
|
191
|
+
"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."
|
|
192
|
+
},
|
|
193
|
+
"defaultAgent": {
|
|
194
|
+
"type": "string",
|
|
195
|
+
"default": "",
|
|
196
|
+
"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."
|
|
197
|
+
},
|
|
198
|
+
"preconditionFile": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"default": ".rauf.json",
|
|
201
|
+
"description": "Project-root marker file that must exist (runner installed into the target project)."
|
|
202
|
+
},
|
|
203
|
+
"stateDir": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"default": ".rauf",
|
|
206
|
+
"description": "Per-backlog state directory name created under the backlog dir."
|
|
207
|
+
},
|
|
208
|
+
"logFile": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"default": "rauf.log",
|
|
211
|
+
"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."
|
|
212
|
+
},
|
|
213
|
+
"setupHint": {
|
|
214
|
+
"type": "string",
|
|
215
|
+
"default": "Run `rauf install .` to install rauf's per-project artifacts (.rauf/, RAUF.md, schema), then re-run forge-5.",
|
|
216
|
+
"description": "Shown when preconditionFile is missing — how to set up the runner IN THIS PROJECT (per-project artifacts)."
|
|
217
|
+
},
|
|
218
|
+
"installHint": {
|
|
219
|
+
"type": "string",
|
|
220
|
+
"default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.12.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.12.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
|
|
221
|
+
"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 @garygentry/rauf@0.12.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."
|
|
222
|
+
},
|
|
223
|
+
"schemaVersion": {
|
|
224
|
+
"type": "string",
|
|
225
|
+
"default": "1",
|
|
226
|
+
"description": "Backlog schemaVersion this runner config targets."
|
|
227
|
+
},
|
|
228
|
+
"minRunnerVersion": {
|
|
229
|
+
"type": "string",
|
|
230
|
+
"default": "0.6.0",
|
|
231
|
+
"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."
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|