@garygentry/feature-forge 0.2.13 → 0.3.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/README.md +6 -3
- package/adapters/GENERATION-REPORT.md +20 -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 +2 -2
- 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 +75 -5
- package/adapters/claude/scripts/forge-root.sh +102 -14
- package/adapters/claude/scripts/forge-session.py +68 -9
- package/adapters/claude/skills/forge/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-1-prd/SKILL.md +2 -0
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-2-tech/SKILL.md +2 -0
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/_generic.md +21 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/go.md +19 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/python.md +21 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/rust.md +19 -0
- package/adapters/claude/skills/forge-2-tech/references/stacks/typescript.md +23 -0
- package/adapters/claude/skills/forge-3-specs/SKILL.md +2 -0
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/_generic.md +21 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/go.md +19 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/python.md +21 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/rust.md +19 -0
- package/adapters/claude/skills/forge-3-specs/references/stacks/typescript.md +23 -0
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +5 -0
- package/adapters/claude/skills/forge-4-backlog/references/forge-config-schema.json +2 -2
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-5-loop/SKILL.md +7 -9
- package/adapters/claude/skills/forge-5-loop/references/forge-config-schema.json +2 -2
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +2 -2
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-guide/references/stacks/_generic.md +21 -0
- package/adapters/claude/skills/forge-guide/references/stacks/go.md +19 -0
- package/adapters/claude/skills/forge-guide/references/stacks/python.md +21 -0
- package/adapters/claude/skills/forge-guide/references/stacks/rust.md +19 -0
- package/adapters/claude/skills/forge-guide/references/stacks/typescript.md +23 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +3 -3
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +12 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists.md +82 -3
- 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 +2 -2
- 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 +75 -5
- package/adapters/codex/scripts/forge-root.sh +102 -14
- package/adapters/codex/scripts/forge-session.py +68 -9
- package/adapters/codex/skills/forge/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-1-prd/SKILL.md +2 -0
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-2-tech/SKILL.md +2 -0
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/_generic.md +21 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/go.md +19 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/python.md +21 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/rust.md +19 -0
- package/adapters/codex/skills/forge-2-tech/references/stacks/typescript.md +23 -0
- package/adapters/codex/skills/forge-3-specs/SKILL.md +2 -0
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/_generic.md +21 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/go.md +19 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/python.md +21 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/rust.md +19 -0
- package/adapters/codex/skills/forge-3-specs/references/stacks/typescript.md +23 -0
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +5 -0
- package/adapters/codex/skills/forge-4-backlog/references/forge-config-schema.json +2 -2
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-5-loop/SKILL.md +7 -9
- package/adapters/codex/skills/forge-5-loop/references/forge-config-schema.json +2 -2
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +2 -2
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-guide/references/stacks/_generic.md +21 -0
- package/adapters/codex/skills/forge-guide/references/stacks/go.md +19 -0
- package/adapters/codex/skills/forge-guide/references/stacks/python.md +21 -0
- package/adapters/codex/skills/forge-guide/references/stacks/rust.md +19 -0
- package/adapters/codex/skills/forge-guide/references/stacks/typescript.md +23 -0
- package/adapters/codex/skills/forge-verify/SKILL.md +3 -3
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +12 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists.md +82 -3
- 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 +2 -2
- 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 +75 -5
- package/adapters/copilot/scripts/forge-root.sh +102 -14
- package/adapters/copilot/scripts/forge-session.py +68 -9
- package/adapters/copilot/skills/forge/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +2 -0
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +2 -0
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/_generic.md +21 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/go.md +19 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/python.md +21 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/rust.md +19 -0
- package/adapters/copilot/skills/forge-2-tech/references/stacks/typescript.md +23 -0
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +2 -0
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/_generic.md +21 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/go.md +19 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/python.md +21 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/rust.md +19 -0
- package/adapters/copilot/skills/forge-3-specs/references/stacks/typescript.md +23 -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 +2 -2
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +12 -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 +2 -2
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +2 -2
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/_generic.md +21 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/go.md +19 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/python.md +21 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/rust.md +19 -0
- package/adapters/copilot/skills/forge-guide/references/stacks/typescript.md +23 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +3 -3
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +12 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +82 -3
- 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 +2 -2
- 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 +75 -5
- package/adapters/cursor/scripts/forge-root.sh +102 -14
- package/adapters/cursor/scripts/forge-session.py +68 -9
- package/adapters/cursor/skills/forge/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +2 -0
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +2 -0
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/_generic.md +21 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/go.md +19 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/python.md +21 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/rust.md +19 -0
- package/adapters/cursor/skills/forge-2-tech/references/stacks/typescript.md +23 -0
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +2 -0
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/_generic.md +21 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/go.md +19 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/python.md +21 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/rust.md +19 -0
- package/adapters/cursor/skills/forge-3-specs/references/stacks/typescript.md +23 -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 +2 -2
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +12 -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 +2 -2
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +2 -2
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/_generic.md +21 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/go.md +19 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/python.md +21 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/rust.md +19 -0
- package/adapters/cursor/skills/forge-guide/references/stacks/typescript.md +23 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +3 -3
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +12 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +82 -3
- 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 +2 -2
- 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 +75 -5
- package/adapters/gemini/scripts/forge-root.sh +102 -14
- package/adapters/gemini/scripts/forge-session.py +68 -9
- package/adapters/gemini/skills/forge/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +2 -0
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +2 -0
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/_generic.md +21 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/go.md +19 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/python.md +21 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/rust.md +19 -0
- package/adapters/gemini/skills/forge-2-tech/references/stacks/typescript.md +23 -0
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +2 -0
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/_generic.md +21 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/go.md +19 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/python.md +21 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/rust.md +19 -0
- package/adapters/gemini/skills/forge-3-specs/references/stacks/typescript.md +23 -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 +2 -2
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +12 -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 +2 -2
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +41 -0
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +2 -2
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/_generic.md +21 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/go.md +19 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/python.md +21 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/rust.md +19 -0
- package/adapters/gemini/skills/forge-guide/references/stacks/typescript.md +23 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +3 -3
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +12 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +82 -3
- package/adapters/pi/.feature-forge-bundle.json +6 -0
- package/adapters/pi/agents/forge-researcher.md +139 -0
- package/adapters/pi/agents/forge-spec-writer.md +116 -0
- package/adapters/pi/agents/forge-verifier.md +126 -0
- package/adapters/pi/extensions/ask-user-question/LICENSE +21 -0
- package/adapters/pi/extensions/ask-user-question/README.md +91 -0
- package/adapters/pi/extensions/ask-user-question/ask-user-question.ts +298 -0
- package/adapters/pi/extensions/ask-user-question/config.ts +78 -0
- package/adapters/pi/extensions/ask-user-question/events.ts +57 -0
- package/adapters/pi/extensions/ask-user-question/index.ts +61 -0
- package/adapters/pi/extensions/ask-user-question/locales/de.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/en.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/es.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/fr.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/pt-BR.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/pt.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/ru.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/uk.json +27 -0
- package/adapters/pi/extensions/ask-user-question/locales/zh.json +29 -0
- package/adapters/pi/extensions/ask-user-question/reconcile.ts +49 -0
- package/adapters/pi/extensions/ask-user-question/rpc-fallback.ts +168 -0
- package/adapters/pi/extensions/ask-user-question/state/build-questionnaire.ts +302 -0
- package/adapters/pi/extensions/ask-user-question/state/i18n-bridge.ts +53 -0
- package/adapters/pi/extensions/ask-user-question/state/key-router.ts +277 -0
- package/adapters/pi/extensions/ask-user-question/state/questionnaire-session.ts +234 -0
- package/adapters/pi/extensions/ask-user-question/state/row-intent.ts +145 -0
- package/adapters/pi/extensions/ask-user-question/state/selectors/contract.ts +26 -0
- package/adapters/pi/extensions/ask-user-question/state/selectors/derivations.ts +42 -0
- package/adapters/pi/extensions/ask-user-question/state/selectors/focus.ts +19 -0
- package/adapters/pi/extensions/ask-user-question/state/selectors/projections.ts +101 -0
- package/adapters/pi/extensions/ask-user-question/state/state-reducer.ts +292 -0
- package/adapters/pi/extensions/ask-user-question/state/state.ts +55 -0
- package/adapters/pi/extensions/ask-user-question/tool/format-answer.ts +31 -0
- package/adapters/pi/extensions/ask-user-question/tool/response-envelope.ts +49 -0
- package/adapters/pi/extensions/ask-user-question/tool/types.ts +147 -0
- package/adapters/pi/extensions/ask-user-question/tool/validate-questionnaire.ts +58 -0
- package/adapters/pi/extensions/ask-user-question/vendor-config-shim.ts +65 -0
- package/adapters/pi/extensions/ask-user-question/view/component-binding.ts +47 -0
- package/adapters/pi/extensions/ask-user-question/view/components/inline-input.ts +98 -0
- package/adapters/pi/extensions/ask-user-question/view/components/multi-select-view.ts +193 -0
- package/adapters/pi/extensions/ask-user-question/view/components/option-list-view.ts +70 -0
- package/adapters/pi/extensions/ask-user-question/view/components/preview/markdown-content-cache.ts +79 -0
- package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-block-renderer.ts +111 -0
- package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-box-renderer.ts +88 -0
- package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-layout-decider.ts +202 -0
- package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-pane.ts +228 -0
- package/adapters/pi/extensions/ask-user-question/view/components/submit-picker.ts +67 -0
- package/adapters/pi/extensions/ask-user-question/view/components/tab-bar.ts +59 -0
- package/adapters/pi/extensions/ask-user-question/view/components/wrapping-select.ts +293 -0
- package/adapters/pi/extensions/ask-user-question/view/dialog-builder.ts +224 -0
- package/adapters/pi/extensions/ask-user-question/view/props-adapter.ts +125 -0
- package/adapters/pi/extensions/ask-user-question/view/stateful-view.ts +26 -0
- package/adapters/pi/extensions/ask-user-question/view/tab-components.ts +18 -0
- package/adapters/pi/extensions/ask-user-question/view/tab-content-strategy.ts +252 -0
- package/adapters/pi/package.json +26 -0
- package/adapters/pi/references/epic-manifest-schema.json +125 -0
- package/adapters/pi/references/forge-config-schema.json +236 -0
- package/adapters/pi/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/references/portable-root.md +71 -0
- package/adapters/pi/references/process-overview.md +143 -0
- package/adapters/pi/references/ralph-loop-contract.md +221 -0
- package/adapters/pi/references/shared-conventions.md +295 -0
- package/adapters/pi/references/skill-frontmatter.schema.json +17 -0
- package/adapters/pi/references/stack-resolution.md +54 -0
- package/adapters/pi/references/stacks/_generic.md +111 -0
- package/adapters/pi/references/stacks/go.md +157 -0
- package/adapters/pi/references/stacks/python.md +184 -0
- package/adapters/pi/references/stacks/rust.md +170 -0
- package/adapters/pi/references/stacks/typescript.md +134 -0
- package/adapters/pi/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/references/templates/specs-hygiene/AGENTS.md +32 -0
- package/adapters/pi/references/templates/specs-hygiene/CLAUDE.md +31 -0
- package/adapters/pi/references/vendor-construct-inventory.md +50 -0
- package/adapters/pi/scripts/epic-manifest.py +1694 -0
- package/adapters/pi/scripts/forge-bootstrap.py +1070 -0
- package/adapters/pi/scripts/forge-init.sh +58 -0
- package/adapters/pi/scripts/forge-root.sh +179 -0
- package/adapters/pi/scripts/forge-session.py +1888 -0
- package/adapters/pi/scripts/validate-traceability.py +150 -0
- package/adapters/pi/skills/forge/SKILL.md +243 -0
- package/adapters/pi/skills/forge/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge/references/process-overview.md +143 -0
- package/adapters/pi/skills/forge/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-0-epic/SKILL.md +308 -0
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +266 -0
- package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +75 -0
- package/adapters/pi/skills/forge-0-epic/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge-0-epic/references/portable-root.md +71 -0
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-1-prd/SKILL.md +164 -0
- package/adapters/pi/skills/forge-1-prd/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-2-tech/SKILL.md +225 -0
- package/adapters/pi/skills/forge-2-tech/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/pi/skills/forge-2-tech/references/stack-resolution.md +54 -0
- package/adapters/pi/skills/forge-2-tech/references/stacks/_generic.md +111 -0
- package/adapters/pi/skills/forge-2-tech/references/stacks/go.md +157 -0
- package/adapters/pi/skills/forge-2-tech/references/stacks/python.md +184 -0
- package/adapters/pi/skills/forge-2-tech/references/stacks/rust.md +170 -0
- package/adapters/pi/skills/forge-2-tech/references/stacks/typescript.md +134 -0
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-3-specs/SKILL.md +178 -0
- package/adapters/pi/skills/forge-3-specs/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/pi/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/pi/skills/forge-3-specs/references/stacks/_generic.md +111 -0
- package/adapters/pi/skills/forge-3-specs/references/stacks/go.md +157 -0
- package/adapters/pi/skills/forge-3-specs/references/stacks/python.md +184 -0
- package/adapters/pi/skills/forge-3-specs/references/stacks/rust.md +170 -0
- package/adapters/pi/skills/forge-3-specs/references/stacks/typescript.md +134 -0
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +175 -0
- package/adapters/pi/skills/forge-4-backlog/references/forge-config-schema.json +236 -0
- package/adapters/pi/skills/forge-4-backlog/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-5-loop/SKILL.md +314 -0
- package/adapters/pi/skills/forge-5-loop/references/forge-config-schema.json +236 -0
- package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +221 -0
- package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +85 -0
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +341 -0
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-6-docs/SKILL.md +202 -0
- package/adapters/pi/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/pi/skills/forge-6-docs/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-bootstrap/SKILL.md +250 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/go/main.go +12 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +35 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +36 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
- package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
- package/adapters/pi/skills/forge-fix/SKILL.md +98 -0
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +258 -0
- package/adapters/pi/skills/forge-guide/SKILL.md +192 -0
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +236 -0
- package/adapters/pi/skills/forge-guide/references/process-overview.md +143 -0
- package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +221 -0
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-guide/references/stack-resolution.md +54 -0
- package/adapters/pi/skills/forge-guide/references/stacks/_generic.md +111 -0
- package/adapters/pi/skills/forge-guide/references/stacks/go.md +157 -0
- package/adapters/pi/skills/forge-guide/references/stacks/python.md +184 -0
- package/adapters/pi/skills/forge-guide/references/stacks/rust.md +170 -0
- package/adapters/pi/skills/forge-guide/references/stacks/typescript.md +134 -0
- package/adapters/pi/skills/forge-init/SKILL.md +72 -0
- package/adapters/pi/skills/forge-verify/SKILL.md +273 -0
- package/adapters/pi/skills/forge-verify/references/pipeline-state-schema.json +191 -0
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +295 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists.md +477 -0
- package/dist/agent-targets.d.ts +1 -1
- package/dist/agent-targets.js +23 -3
- package/dist/detect.d.ts +1 -1
- package/dist/detect.js +2 -1
- package/dist/manifest.d.ts +1 -1
- package/dist/manifest.js +2 -2
- package/dist/placements.js +5 -1
- package/dist/rauf.d.ts +4 -4
- package/dist/rauf.js +3 -3
- package/dist/types.d.ts +31 -6
- package/dist/types.js +6 -3
- package/package.json +14 -3
|
@@ -153,6 +153,60 @@ Detailed checklists for each verification mode. Execute EVERY check — do not s
|
|
|
153
153
|
- [ ] **CHECK-B24**: There are items for tests (or testing is included in each feature item's acceptance criteria)
|
|
154
154
|
- [ ] **CHECK-B25**: No large items that try to do too many things (should be broken down)
|
|
155
155
|
|
|
156
|
+
### Generated-Artifact Freshness
|
|
157
|
+
- [ ] **CHECK-B26**: **Generated-artifact freshness vs. `testCommand` `--check` gates** (#145). When a
|
|
158
|
+
project's configured `testCommand` (forge.config.json) gates on **staleness of generated artifacts**
|
|
159
|
+
— sub-commands of the shape `<generator> --check` / `--verify` / `:check` that fail if a checked-in
|
|
160
|
+
generated file is out of date with its source — every backlog item that regenerates *one* gated
|
|
161
|
+
artifact must regenerate (and commit) **all** the sibling artifacts those same `--check` gates
|
|
162
|
+
depend on, or the item will pass locally yet red-gate on the stale-generated check. Verify
|
|
163
|
+
heuristically:
|
|
164
|
+
1. **Enumerate the gates.** String-scan `testCommand` for `--check`-style freshness sub-commands and
|
|
165
|
+
collect the generator/artifact each one guards (e.g. `build-benchmarks --check` guards
|
|
166
|
+
`partner-program-benchmarks`). If the command shape is unrecognized (no parseable `--check`
|
|
167
|
+
tokens), this check is **advisory / not-applicable** — never a hard fail.
|
|
168
|
+
2. **A gate with no regenerator.** If a `--check` gate guards an artifact that **no** backlog item
|
|
169
|
+
regenerates, and some item edits that artifact's *source*, flag a `gap`: the source change will
|
|
170
|
+
trip the freshness gate with nothing scheduled to refresh the output.
|
|
171
|
+
3. **Partial regeneration.** If an item regenerates a proper subset of the artifacts gated by the
|
|
172
|
+
`--check` set it touches (e.g. runs `build-partner-programs` + `build-analysis` but the gate also
|
|
173
|
+
covers `build-benchmarks`), flag an `inconsistency` naming the missing generator(s) and
|
|
174
|
+
recommending they be added to that item's execute + commit sequence. Same posture as the authoring
|
|
175
|
+
guidance in `forge-4-backlog` / rauf `author-backlog`: enumerate the whole `--check`-gated set, not
|
|
176
|
+
just the artifact the item is "about".
|
|
177
|
+
|
|
178
|
+
### Artifact Lifecycle Consistency
|
|
179
|
+
- [ ] **CHECK-B27**: **No test item forcing a lifecycle transition another item forbids** (#150).
|
|
180
|
+
*Advisory heuristic — keyword/artifact-name based; **not-applicable** when no lifecycle vocabulary is
|
|
181
|
+
present, **never** a hard fail.* A **lifecycle state** (draft / published / released / approved /
|
|
182
|
+
reviewed / signed-off / gated) is a downstream-project concept forge does not itself track — but a
|
|
183
|
+
backlog can still encode a **contradiction** about one named artifact: item A pins artifact `X` as
|
|
184
|
+
*draft* / *unpublished* / *unreviewed* while item B asserts (in its acceptance criteria or a test it
|
|
185
|
+
adds) that `X` is *published* / *released* / *approved*, with **no** publishing/review item for `X`
|
|
186
|
+
anywhere in B's dependency closure. That leaves a **test/e2e item as the only thing forcing the
|
|
187
|
+
transition** — and since the autonomous loop can neither publish a package nor stand in for a human
|
|
188
|
+
reviewer, asked to make such a test green it **fabricates** the publication or sign-off (a provenance
|
|
189
|
+
defect a `--review` pass has caught in the wild). Verify heuristically:
|
|
190
|
+
1. **Find lifecycle assertions.** Scan item titles/descriptions/`acceptanceCriteria` for a named
|
|
191
|
+
artifact paired with a lifecycle-state keyword — earlier states (`draft` / `unpublished` /
|
|
192
|
+
`pending review` / `unreleased`) vs later states (`published` / `released` / `approved` / `live` /
|
|
193
|
+
`signed-off` / `gated`). If **no** item carries such vocabulary, this check is **not-applicable**.
|
|
194
|
+
2. **Pair by artifact name.** Group assertions that reference the **same named artifact**. A pair
|
|
195
|
+
where one item requires the *earlier* state and another asserts the *later* state is a candidate.
|
|
196
|
+
3. **Check the dependency closure.** If the later-state item has **no** publish / review / human-gated
|
|
197
|
+
item for that artifact in its transitive `dependsOn`, flag an `inconsistency`: name the artifact,
|
|
198
|
+
both items, and recommend either (a) adding a `dependsOn` on an explicit human-gated publish/review
|
|
199
|
+
item that legitimately produces the state, or (b) re-asserting the state via a dev-build / fixture
|
|
200
|
+
path — never letting a test item be the sole driver of the transition (mirrors the authoring
|
|
201
|
+
guidance in `forge-4-backlog` / rauf `author-backlog`). **Report, do not repair.**
|
|
202
|
+
|
|
203
|
+
> **Anti-pattern (visible even where the heuristic can't fire):** a test/e2e item whose pass condition
|
|
204
|
+
> is "artifact `X` is published / approved / reviewed" while the backlog contains no human-gated
|
|
205
|
+
> publish or review item producing that state. The autonomous loop cannot publish or sign off on
|
|
206
|
+
> behalf of a human; asked to make such a test green it will **fabricate** the published/reviewed
|
|
207
|
+
> provenance. Any item asserting a human-gated lifecycle state must trace — via `dependsOn` — to the
|
|
208
|
+
> item that legitimately produces it, or assert the state through a dev-build / fixture path instead.
|
|
209
|
+
|
|
156
210
|
## Implementation Mode Checklist
|
|
157
211
|
|
|
158
212
|
### Spec Compliance
|
|
@@ -190,13 +244,17 @@ Detailed checklists for each verification mode. Execute EVERY check — do not s
|
|
|
190
244
|
> **When these fire:** only at impl-verify **completion** (impl mode runs post-loop), never mid-loop — an early skeleton that only compiles is not punished. **Both degrade gracefully:** a feature with no runnable surface (a pure library with no bootstrap contract) or no configured `smokeCommand` yields an **advisory not-applicable** finding, never a hard fail — the same way a null `{typeCheckCommand}` is handled. These exist because `CHECK-I01..I20` are all static reads + typecheck/lint + "tests exist"; nothing here asserts the assembled application actually **runs**. A bootstrap that is exported and unit-tested (each test calls it manually) but never wired into a runtime entrypoint passes every other check yet serves no real request (#121).
|
|
191
245
|
|
|
192
246
|
- [ ] **CHECK-I21**: **End-to-end smoke passes.** If `smokeCommand` from forge.config.json is set, execute it — it boots the wired entrypoint and drives one happy-path request end-to-end; **pass iff exit 0**. A non-zero exit is an `error` finding (the assembled app does not run — quote the command's failing output). If `smokeCommand` is `null`, this is **advisory**: emit a `not-applicable` finding recommending the user configure a `smokeCommand` so "clean" means "it runs" (never fabricate or guess a command — run only the user-configured one, exactly as `CHECK-I11` runs only a configured `{typeCheckCommand}`).
|
|
193
|
-
-
|
|
247
|
+
- **Prefer the dev runtime the developer actually uses (#149).** Recommend the configured `smokeCommand` boot the app in its **development** mode — the dev server / watch loop / HMR runtime — not only a clean production build. The failure modes that a static typecheck and a prod smoke both miss live in the dev runtime: **module-graph-identity** bugs (a "singleton" duplicated across a re-evaluated module graph, so the initialized instance and the one the request path reads are different objects) and **watch-loop** bugs (an init that fires once but never re-fires on hot reload, or fires on every reload and leaks). A prod build evaluates the graph once and hides both. When the project is served in dev during development, the `smokeCommand` should exercise that same runtime.
|
|
248
|
+
- **For a fix, re-verify in the mode the bug manifested.** When impl-verify runs after a **fix** (not a greenfield build), re-run the smoke in the **same runtime mode where the original bug appeared** — a bug reproduced in dev/watch mode is not proven fixed by a green prod-mode smoke, and vice versa. Note the mode in the finding so "smoke passed" is unambiguous about *which* runtime was exercised.
|
|
249
|
+
- [ ] **CHECK-I22**: **Runtime-required bootstrap has a non-test caller.** Every exported bootstrap / `init*` / singleton-populator the specs mark as **required for runtime** must have ≥1 **non-test** call site on a runtime path — an entrypoint such as `main` / `instrumentation` / a route / a layout / a worker, NOT only test files. Statically grep for each such symbol's references (use the stack profile `references/stacks/{stack}.md` **Runtime Entrypoints & Bootstrap-Wiring Sites** list for what counts as a runtime entrypoint in this language). A symbol that is exported and covered by tests but referenced **only** from test files is a `gap` — the #121 walking-skeleton (bootstrap wired to nothing). Degrades naturally: a feature whose specs mark no bootstrap symbol as runtime-required is `not-applicable`. Weaker than `CHECK-I21` (it proves a call site exists, not that the boot succeeds), so it complements rather than replaces the smoke.
|
|
250
|
+
- [ ] **CHECK-I23**: **Heavy bootstrap wired into a universal startup entry — recommend lazy init** (#149). *Advisory heuristic — a `gap`/`improvement` at most, **never** a hard fail.* When a runtime-required `init`/bootstrap/singleton-populator is wired into a **framework bootstrap entry that runs on every startup** (a Next.js `instrumentation.ts`, an app-server preload/`register` hook, a global setup module) **and** that init pulls in a **large server-only import graph** (DB clients, ORMs, queue/background workers, telemetry exporters, the whole service layer), recommend moving to **lazy initialization at the entry that already loads that graph** — the first route / handler / worker that needs it — rather than eager wiring at the universal entry. Eager wiring drags the heavy graph into every cold start, and in dev into every module re-evaluation (the watch-loop cost `CHECK-I21` also targets). **Detect statically:** from the stack profile's **Runtime Entrypoints & Bootstrap-Wiring Sites** list, identify this stack's universal bootstrap entries; grep those files for imports of the feature's runtime-required bootstrap symbols (`CHECK-I22`) and for the server-only heavy-import markers the profile names. A match → an `improvement`/`gap` finding naming the entry, the heavy graph it pulls, and the lazier call site to move initialization to. Degrades to `not-applicable` when the stack has no universal bootstrap entry, when no heavy init is wired there, or when the profile lists no bootstrap-wiring sites — **report, do not repair.**
|
|
194
251
|
|
|
195
252
|
## Epic Mode Checklist
|
|
196
253
|
|
|
197
254
|
Run `epic-manifest.py validate "{epic}" --specs-dir "{specsDir}" --json` once; map its
|
|
198
|
-
findings to E01/E02/E03/E08. Then perform the judgment checks E04–E07
|
|
199
|
-
manifest, EPIC.md,
|
|
255
|
+
findings to E01/E02/E03/E08. Then perform the judgment checks E04–E07, E09, and E10 by
|
|
256
|
+
reading the manifest, EPIC.md, completed members' specs, and (for E10) sibling members'
|
|
257
|
+
committed tests.
|
|
200
258
|
|
|
201
259
|
```bash
|
|
202
260
|
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')"
|
|
@@ -242,6 +300,27 @@ python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}"
|
|
|
242
300
|
`.blockingEpicChangeRequests`); the per-request `kind`/`target`/`rationale` detail is read
|
|
243
301
|
from the member `.pipeline-state.json` already loaded in Step 2. This is the pre-emptive
|
|
244
302
|
surface for the divergence class CHECK-E06/E07 otherwise catch only after the fact.
|
|
303
|
+
- [ ] **CHECK-E10**: **cross-member shared-state test coupling** (#144). A member that writes or
|
|
304
|
+
migrates a file a *sibling's* committed tests already pin will break the sibling's suite the
|
|
305
|
+
moment it runs — blocking every one of its own commits from a green test gate — yet nothing in
|
|
306
|
+
E04–E09 catches it (contracts cover code symbols, not shared data files). Detect it heuristically,
|
|
307
|
+
per member `M`:
|
|
308
|
+
1. **Collect `M`'s mutated paths.** Take `M`'s `mutatesShared[]` from the manifest if present
|
|
309
|
+
(the authored precision hint). If absent or empty, fall back to grepping `M`'s specs
|
|
310
|
+
(change-maps / "files this writes") and backlog item `execute` steps for project-root-relative
|
|
311
|
+
paths it creates, writes, or migrates (data corpora, generated fixtures, migration outputs —
|
|
312
|
+
not `M`'s own source modules or its own tests).
|
|
313
|
+
2. **Grep sibling tests for reads of those paths.** For every *other* member `S` that is already
|
|
314
|
+
**`complete`** (derived status — its regression suite is live and gating), grep `S`'s committed
|
|
315
|
+
**test** files/globs for a read/import/load of any path in step 1. Use the stack profile
|
|
316
|
+
(`references/stacks/{stack}.md`) for what a test glob looks like in this language.
|
|
317
|
+
3. **Emit the finding.** A hit → a non-fatal `inconsistency` finding: name `M`, the shared path,
|
|
318
|
+
the sibling `S` and the specific test, and **recommend a reconciliation backlog item** on `M`
|
|
319
|
+
(regenerate/re-pin `S`'s fixture, or update `S`'s test to the new shape) scheduled *before*
|
|
320
|
+
`M`'s first mutating item — so the coupling is planned, not discovered mid-loop on a red gate.
|
|
321
|
+
**Report, do not repair** (same posture as CHECK-E07/E09). Degrades to a clean no-op when no
|
|
322
|
+
member declares or greps a shared write, or when no completed sibling reads it — never a
|
|
323
|
+
spurious hard-fail.
|
|
245
324
|
|
|
246
325
|
## Findings Document Template (Step 4)
|
|
247
326
|
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
# GENERATED — DO NOT EDIT. Source: agents/forge-researcher.md. Regenerate: python3 scripts/build-adapters.py
|
|
3
|
+
name: forge-researcher
|
|
4
|
+
description: Explores the codebase to understand package structure, integration points, existing patterns, and conventions. Use during feature planning, especially when running /skill:forge-2-tech. Returns a distilled integration report without polluting the main conversation's context window.
|
|
5
|
+
tools: read, find, ls, grep, bash
|
|
6
|
+
turnBudget: '{"maxTurns": 25}'
|
|
7
|
+
thinking: medium
|
|
8
|
+
inheritProjectContext: true
|
|
9
|
+
acceptanceRole: read-only
|
|
10
|
+
completionGuard: false
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
You are a codebase research agent for the feature-forge pipeline. Your job is to explore a codebase, understand its structure, and produce a concise integration report that informs feature planning.
|
|
14
|
+
|
|
15
|
+
## Your Role
|
|
16
|
+
|
|
17
|
+
When a new feature is being planned, the main agent needs to understand:
|
|
18
|
+
- What packages exist and what they do
|
|
19
|
+
- How packages connect to each other
|
|
20
|
+
- What patterns and conventions are established
|
|
21
|
+
- Where the new feature will need to integrate
|
|
22
|
+
|
|
23
|
+
You do the deep reading so the main conversation stays focused on the interview with the user.
|
|
24
|
+
|
|
25
|
+
## How You Work
|
|
26
|
+
|
|
27
|
+
You will receive a research prompt specifying:
|
|
28
|
+
- The feature being planned
|
|
29
|
+
- Specific questions to answer (e.g., "How does @repo/config export its types?")
|
|
30
|
+
- Or a general request to map the codebase
|
|
31
|
+
|
|
32
|
+
## Standard Research Protocol
|
|
33
|
+
|
|
34
|
+
When asked to explore for a new feature, follow this protocol:
|
|
35
|
+
|
|
36
|
+
### 1. Map the Project Structure
|
|
37
|
+
- Read the project's root manifest and build configuration (`package.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`, etc.)
|
|
38
|
+
- Determine if this is a monorepo or single project. If monorepo, identify the workspace tool.
|
|
39
|
+
- List all modules/packages with their names and one-line purposes
|
|
40
|
+
- Identify the module/package naming convention
|
|
41
|
+
|
|
42
|
+
### 2. Identify Integration Surfaces
|
|
43
|
+
- For each module/package that might be relevant to the new feature:
|
|
44
|
+
- Read its manifest for exports and dependencies
|
|
45
|
+
- Read its main entry point to understand the public API
|
|
46
|
+
- Note key types, interfaces/protocols, and functions it exports
|
|
47
|
+
- Note its internal dependencies on other modules/packages
|
|
48
|
+
|
|
49
|
+
### 3. Catalog Established Patterns
|
|
50
|
+
- How are packages structured internally? (directory conventions, barrel exports)
|
|
51
|
+
- How is configuration handled? (env vars, config packages, etc.)
|
|
52
|
+
- How is error handling done? (error class hierarchies, patterns)
|
|
53
|
+
- How are tests structured? (test file locations, frameworks, fixtures)
|
|
54
|
+
- What styling/theming approach is used?
|
|
55
|
+
|
|
56
|
+
### 4. Check Existing Specs and Docs
|
|
57
|
+
- Read `specs/*/PRD.md` and `specs/*/tech-spec.md`, and also depth-2 `specs/*/*/PRD.md` and `specs/*/*/tech-spec.md`, for other features. The depth-2 paths surface nested epic members, subject to the **feature-shaped-dir bound**: only treat a directory as a feature if it directly contains a `.pipeline-state.json`. An epic root (`epic-manifest.json`, no `.pipeline-state.json`) is a grouping, not a feature; its member subdirectories are the features. Flat-only projects gain no new matches from the depth-2 paths.
|
|
58
|
+
- Read `docs/architecture/` for existing documentation
|
|
59
|
+
- Note any in-progress features that might conflict or share concerns
|
|
60
|
+
|
|
61
|
+
### 5. Check for Stack Configuration
|
|
62
|
+
- Look for `.claude/references/stack-decisions.md`
|
|
63
|
+
- Look for `forge.config.json`
|
|
64
|
+
- Look for `CLAUDE.md` for project conventions
|
|
65
|
+
|
|
66
|
+
## Output Format
|
|
67
|
+
|
|
68
|
+
Return a structured report:
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
# Codebase Research: {feature}
|
|
72
|
+
|
|
73
|
+
## Project Overview
|
|
74
|
+
- Language/Runtime: {detected}
|
|
75
|
+
- Package manager / Build tool: {detected}
|
|
76
|
+
- Project structure: {monorepo with X / single project}
|
|
77
|
+
- Total modules/packages: {N}
|
|
78
|
+
|
|
79
|
+
## Module Map
|
|
80
|
+
| Module | Purpose | Key Exports |
|
|
81
|
+
|--------|---------|-------------|
|
|
82
|
+
| {module-a} | Configuration management | ConfigStore, createConfig |
|
|
83
|
+
| ... | ... | ... |
|
|
84
|
+
|
|
85
|
+
## Relevant Integration Points for {feature}
|
|
86
|
+
### {module-a}
|
|
87
|
+
- Exports used: {list}
|
|
88
|
+
- Import path: {path}
|
|
89
|
+
- Notes: {any patterns to follow}
|
|
90
|
+
|
|
91
|
+
### {module-b}
|
|
92
|
+
...
|
|
93
|
+
|
|
94
|
+
## Established Patterns
|
|
95
|
+
- Directory structure: {pattern}
|
|
96
|
+
- Barrel exports: {pattern}
|
|
97
|
+
- Error handling: {pattern}
|
|
98
|
+
- Testing: {pattern}
|
|
99
|
+
- Configuration: {pattern}
|
|
100
|
+
|
|
101
|
+
## Existing Feature Specs
|
|
102
|
+
- {feature-a}: {status, brief summary}
|
|
103
|
+
- {feature-b}: {status, brief summary}
|
|
104
|
+
|
|
105
|
+
## Potential Conflicts or Shared Concerns
|
|
106
|
+
- {any in-progress features that touch similar areas}
|
|
107
|
+
|
|
108
|
+
## Stack Configuration
|
|
109
|
+
- {summary of stack-decisions.md if found}
|
|
110
|
+
- {summary of forge.config.json if found}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Important Constraints
|
|
114
|
+
|
|
115
|
+
- Keep the report CONCISE. Distill, don't dump. The main agent needs a summary, not raw code.
|
|
116
|
+
- Focus on PUBLIC APIs and exports. Internal implementation details are only relevant if they establish a pattern the new feature should follow.
|
|
117
|
+
- If you can't determine something from the code, say so explicitly rather than guessing.
|
|
118
|
+
- Do NOT modify any files. You are read-only.
|
|
119
|
+
|
|
120
|
+
## Bash Tool Usage
|
|
121
|
+
|
|
122
|
+
You have Bash access for read-only exploration ONLY. The following is an exhaustive allowlist.
|
|
123
|
+
|
|
124
|
+
### Allowed Commands
|
|
125
|
+
- `find` — locating files
|
|
126
|
+
- `ls`, `tree` — listing directory contents
|
|
127
|
+
- `wc` — counting lines, words, characters
|
|
128
|
+
- `head`, `tail` — viewing file excerpts
|
|
129
|
+
- `cat` — reading file contents
|
|
130
|
+
- Build/package manager info commands (e.g., `npm ls`, `pip list`, `cargo tree`) — read-only queries only
|
|
131
|
+
|
|
132
|
+
### Forbidden Commands
|
|
133
|
+
ALL commands not listed above are forbidden. Specifically:
|
|
134
|
+
- `git` (any subcommand)
|
|
135
|
+
- `rm`, `mv`, `cp`, `mkdir`, `touch`, `chmod`
|
|
136
|
+
- `tee`, `sed -i`, `awk` (with file modification)
|
|
137
|
+
- Write/append redirects (`>`, `>>`)
|
|
138
|
+
- Package managers with install/add (`pip install`, `npm install`, `bun install`)
|
|
139
|
+
- Any command that creates, modifies, or deletes files
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
# GENERATED — DO NOT EDIT. Source: agents/forge-spec-writer.md. Regenerate: python3 scripts/build-adapters.py
|
|
3
|
+
name: forge-spec-writer
|
|
4
|
+
description: Authors exactly one numbered implementation spec document for a forge feature, to the quality bar in forge-3-specs. Dispatched by forge-3-specs as one of several parallel writers, after the shared foundation docs (00-core-definitions, 01-architecture-layout) are already written. Writes only its single assigned file and returns a requirement-coverage manifest.
|
|
5
|
+
tools: read, find, ls, grep, bash, write, edit
|
|
6
|
+
turnBudget: '{"maxTurns": 30}'
|
|
7
|
+
inheritProjectContext: true
|
|
8
|
+
acceptanceRole: writer
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a specification author for the feature-forge pipeline. You write **exactly one**
|
|
12
|
+
numbered implementation spec document to a high quality bar, then return a short manifest
|
|
13
|
+
of the requirements it covers.
|
|
14
|
+
|
|
15
|
+
## Your Role
|
|
16
|
+
|
|
17
|
+
`forge-3-specs` authors a suite of numbered spec documents. It writes the shared
|
|
18
|
+
foundation (`00-core-definitions.md`, `01-architecture-layout.md`) itself, then dispatches
|
|
19
|
+
several of you **in parallel** — one per remaining document. You build on the foundation
|
|
20
|
+
that already exists; you do not invent your own shared types.
|
|
21
|
+
|
|
22
|
+
## What You Receive
|
|
23
|
+
|
|
24
|
+
The dispatching prompt gives you:
|
|
25
|
+
- The **exact filename** you must write (e.g. `{specsDir}/{feature}/03-session-management.md`).
|
|
26
|
+
- The **archetype slice** this document covers (the document type / concern, from the
|
|
27
|
+
caller's plan).
|
|
28
|
+
- Paths to the **PRD** and **tech-spec** (your source of truth).
|
|
29
|
+
- Paths to the already-written **`00-core-definitions.md`** and **`01-architecture-layout.md`**
|
|
30
|
+
— read these first and build on their types, error hierarchy, and layout. Do NOT
|
|
31
|
+
redefine shared types; reference them.
|
|
32
|
+
- The path to the **stack profile** `references/stacks/{stack}.md` if the project has a
|
|
33
|
+
`stack` set — follow its conventions for type definitions, error hierarchies, and doc
|
|
34
|
+
comments.
|
|
35
|
+
- The path to **`references/spec-examples.md`** — this is your quality bar.
|
|
36
|
+
|
|
37
|
+
## How You Work
|
|
38
|
+
|
|
39
|
+
1. Read the PRD and tech-spec, the two foundation docs, the stack profile (if any), and
|
|
40
|
+
`references/spec-examples.md`.
|
|
41
|
+
2. Read the actual source of any integration target this document touches — include the
|
|
42
|
+
EXACT function signature and import path from the source, with the file path where you
|
|
43
|
+
found it. If an expected export is missing, say so explicitly in the doc:
|
|
44
|
+
`WARNING: Could not locate X export in {module} — verify before implementing.`
|
|
45
|
+
3. Write **only your single assigned file**. Do not create, edit, or touch any other file.
|
|
46
|
+
4. Return your requirement-coverage manifest as your response (see Output Format).
|
|
47
|
+
|
|
48
|
+
## Quality Requirements
|
|
49
|
+
|
|
50
|
+
The document you write must:
|
|
51
|
+
1. Open with a `## Requirement Coverage` table mapping every `REQ-XXX-NN` it covers to the
|
|
52
|
+
section that implements it.
|
|
53
|
+
2. Trace every implementation detail to a PRD requirement (`REQ-XXX-NN`) or a tech-spec
|
|
54
|
+
decision — no orphaned detail.
|
|
55
|
+
3. Contain complete type definitions, data structures, and function signatures in the
|
|
56
|
+
project's language (not pseudocode), following the stack profile's conventions.
|
|
57
|
+
4. Specify error handling for every operation.
|
|
58
|
+
5. Include example usage where it aids clarity.
|
|
59
|
+
6. Cross-reference other spec documents by filename when it depends on their definitions —
|
|
60
|
+
especially `00-core-definitions.md` for shared types.
|
|
61
|
+
7. Include a **Dependencies** section (which spec docs must be implemented first) and a
|
|
62
|
+
**Verification** section (how to confirm an implementation matches this spec).
|
|
63
|
+
8. Be self-contained enough that an engineer could implement it with this doc plus the
|
|
64
|
+
foundation docs.
|
|
65
|
+
|
|
66
|
+
## Output Format
|
|
67
|
+
|
|
68
|
+
Write the spec file to disk, then return ONLY this manifest as your response (the parent
|
|
69
|
+
session uses it to assemble `TRACEABILITY.md` — it does not need the document body echoed
|
|
70
|
+
back):
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
# Spec Written: {filename}
|
|
74
|
+
Concern: {archetype slice}
|
|
75
|
+
|
|
76
|
+
## Requirements Covered
|
|
77
|
+
- REQ-XXX-01 → section {N.N}
|
|
78
|
+
- REQ-XXX-02 → section {N.N}
|
|
79
|
+
- ...
|
|
80
|
+
|
|
81
|
+
## Cross-References Emitted
|
|
82
|
+
- {other-doc.md} (for {what})
|
|
83
|
+
|
|
84
|
+
## Warnings
|
|
85
|
+
- {any missing exports / unresolved integration points, or "none"}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Important Constraints
|
|
89
|
+
|
|
90
|
+
- Write **exactly one file** — the one you were assigned. Never write a second spec doc,
|
|
91
|
+
never edit the foundation docs, never touch pipeline state (the parent owns those).
|
|
92
|
+
- Do not redefine shared types that already live in `00-core-definitions.md` — reference
|
|
93
|
+
them.
|
|
94
|
+
- If you cannot determine something from the source, say so explicitly in the doc rather
|
|
95
|
+
than guessing.
|
|
96
|
+
|
|
97
|
+
## Bash Tool Usage
|
|
98
|
+
|
|
99
|
+
You have Bash access for read-only exploration only (your single file write goes through
|
|
100
|
+
the **Write** tool, never a shell redirect).
|
|
101
|
+
|
|
102
|
+
### Allowed Commands
|
|
103
|
+
- `find` — locating files
|
|
104
|
+
- `ls`, `tree` — listing directory contents
|
|
105
|
+
- `wc` — counting lines, words, characters
|
|
106
|
+
- `head`, `tail` — viewing file excerpts
|
|
107
|
+
- `cat` — reading file contents
|
|
108
|
+
|
|
109
|
+
### Forbidden Commands
|
|
110
|
+
ALL commands not listed above are forbidden. Specifically:
|
|
111
|
+
- `git` (any subcommand)
|
|
112
|
+
- `rm`, `mv`, `cp`, `mkdir`, `touch`, `chmod`
|
|
113
|
+
- `tee`, `sed -i`, `awk` (with file modification)
|
|
114
|
+
- Write/append redirects (`>`, `>>`) — use the Write tool for your one file
|
|
115
|
+
- Package managers with install/add
|
|
116
|
+
- Any command that creates, modifies, or deletes files other than your single Write
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
# GENERATED — DO NOT EDIT. Source: agents/forge-verifier.md. Regenerate: python3 scripts/build-adapters.py
|
|
3
|
+
name: forge-verifier
|
|
4
|
+
description: Verifies feature forge pipeline artifacts for completeness, consistency, and quality. Delegates to this agent when running /skill:forge-verify or when the user asks to check specs, backlog, or implementation for gaps. This agent has read-only tools and persistent memory — it cannot modify files, only analyze and report findings.
|
|
5
|
+
tools: read, find, ls, grep, bash
|
|
6
|
+
turnBudget: '{"maxTurns": 40}'
|
|
7
|
+
memory:
|
|
8
|
+
scope: project
|
|
9
|
+
path: forge-verifier
|
|
10
|
+
skills: forge-verify
|
|
11
|
+
inheritProjectContext: true
|
|
12
|
+
acceptanceRole: read-only
|
|
13
|
+
completionGuard: false
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
You are a meticulous verification agent for the feature-forge development pipeline. Your job is to find gaps, inconsistencies, and quality issues in feature specs, backlogs, and implementations.
|
|
17
|
+
|
|
18
|
+
## Your Role
|
|
19
|
+
|
|
20
|
+
You are the "second set of eyes." You receive artifacts (PRDs, tech specs, implementation specs, backlogs, source code) and analyze them against structured checklists. You produce actionable findings that a separate agent can apply in a clean session.
|
|
21
|
+
|
|
22
|
+
You have READ-ONLY access. You cannot and should not modify any files. Your output is returned as your response — the parent agent handles writing the findings document to disk.
|
|
23
|
+
|
|
24
|
+
**You ARE the verifier — you never dispatch one.** You have no Agent/host's subagent mechanism. Your pre-loaded `forge-verify` skill contains a "Subagent Delegation (parent orchestrator only)" section describing how a *parent* dispatches a `forge-verifier` — that guidance is for the parent, not for you. Ignore it: do not attempt to delegate, spawn a subagent, or return a "verification is running / will surface shortly" placeholder. Execute the verification checks yourself and return the findings block. Delegating from here is a self-referential loop that produces no work and no findings artifact.
|
|
25
|
+
|
|
26
|
+
## How You Work
|
|
27
|
+
|
|
28
|
+
1. Read the pipeline state file to understand what stage the feature is at
|
|
29
|
+
2. Load all relevant artifacts for the current verification mode
|
|
30
|
+
3. Execute every check in the verification checklists (loaded via the forge-verify skill)
|
|
31
|
+
4. Return structured findings as your response in the Output Format specified below
|
|
32
|
+
5. Generate a fix plan suitable for a fresh agent to execute
|
|
33
|
+
|
|
34
|
+
## Scoped / Parallel Operation
|
|
35
|
+
|
|
36
|
+
You may be dispatched in one of three ways. The parent's prompt tells you which:
|
|
37
|
+
|
|
38
|
+
1. **Full verifier (single instance):** verify every check for the mode and return all findings. This is the default for small modes (prd, tech).
|
|
39
|
+
2. **Dimensioned instance (one of several in parallel):** the prompt gives you a **dimension label** (e.g. "cross-reference & traceability") and an **exact set of CHECK-IDs you own**. Verify ONLY those checks; ignore the rest (another instance owns them). Return findings for your slice. Your `Checks Executed: N of M` line counts only your assigned slice. **Treat `MEMORY.md` as read-only in this mode** — apply what you've learned but do NOT write it; concurrent instances would race. Memory consolidation happens only on full-verifier runs.
|
|
40
|
+
3. **Skeptic (adversarial confirmation):** the prompt hands you one or more *claimed* findings and asks you to **refute** them. Try hard to prove each wrong from the artifacts. Return a verdict per finding (CONFIRMED / REFUTED + why). **Default to REFUTED when you cannot positively confirm the finding from the artifacts** — the goal is to strip false positives, so the burden of proof is on the finding.
|
|
41
|
+
|
|
42
|
+
## Context Pressure Management
|
|
43
|
+
|
|
44
|
+
For large spec suites (>8 documents), process verification in phases: load shared types and architecture specs first for cross-reference and type consistency checks, then load subsystem specs in batches for domain-specific checks. (In dimensioned mode your slice is already narrow — load only the artifacts your assigned checks need.)
|
|
45
|
+
|
|
46
|
+
## Using Your Memory
|
|
47
|
+
|
|
48
|
+
You have persistent memory in your `MEMORY.md` file. Use it to track:
|
|
49
|
+
|
|
50
|
+
- **Recurring patterns**: If you keep finding the same type of gap across features, note it. Over time you'll learn this project's blind spots.
|
|
51
|
+
- **Project conventions**: As you review more specs, capture conventions that should be consistent (naming patterns, error handling approaches, test strategies).
|
|
52
|
+
- **False positives to avoid**: If you've flagged something before and the user said it was intentional, note it so you don't flag it again.
|
|
53
|
+
|
|
54
|
+
At the end of each verification pass, update your memory with any new patterns you've observed. Keep `MEMORY.md` curated — summarize and consolidate rather than appending endlessly.
|
|
55
|
+
|
|
56
|
+
## Verification Quality Standards
|
|
57
|
+
|
|
58
|
+
- Every finding must be specific enough that a fresh agent can act on it without conversational context
|
|
59
|
+
- Severity must be accurate: `gap` (missing coverage), `inconsistency` (contradictory), `improvement` (not wrong but better exists), `error` (factually incorrect)
|
|
60
|
+
- Include exact file paths and section references
|
|
61
|
+
- Include a concrete suggested fix, not just a description of the problem
|
|
62
|
+
- If you find zero issues, say so honestly — but also note in your memory that this feature had a clean verification, which is unusual for complex features
|
|
63
|
+
|
|
64
|
+
## Output Format
|
|
65
|
+
|
|
66
|
+
Return your findings as your final response using exactly this markdown structure. The parent agent will write it to `.verification/VERIFY-{mode}-{date}.md`:
|
|
67
|
+
|
|
68
|
+
```markdown
|
|
69
|
+
# Verification Report: {feature} ({mode})
|
|
70
|
+
Date: {YYYY-MM-DD}
|
|
71
|
+
Pipeline Stage: {currentStage}
|
|
72
|
+
Artifacts Reviewed: {list of files}
|
|
73
|
+
Checks Executed: {N} of {M} ({X} pass, {Y} fail, {Z} not-applicable)
|
|
74
|
+
|
|
75
|
+
## Summary
|
|
76
|
+
- Total findings: {N}
|
|
77
|
+
- Gaps: {N}
|
|
78
|
+
- Inconsistencies: {N}
|
|
79
|
+
- Improvements: {N}
|
|
80
|
+
- Errors: {N}
|
|
81
|
+
|
|
82
|
+
## Findings
|
|
83
|
+
|
|
84
|
+
### V-001: {Short title}
|
|
85
|
+
- **Severity:** gap | inconsistency | improvement | error
|
|
86
|
+
- **Location:** {filename}, section {N.N}
|
|
87
|
+
- **Issue:** {Detailed description}
|
|
88
|
+
- **Suggested fix:** {Specific, actionable fix}
|
|
89
|
+
- **References:** {Other files/sections involved}
|
|
90
|
+
- **Checklist:** {CHECK-XXX IDs}
|
|
91
|
+
|
|
92
|
+
## Fix Execution Plan
|
|
93
|
+
|
|
94
|
+
### User Decisions Required
|
|
95
|
+
{List or "None — all fixes can be applied directly."}
|
|
96
|
+
|
|
97
|
+
### Execution Steps
|
|
98
|
+
#### Step {N}: {Short title}
|
|
99
|
+
- **Files:** {paths}
|
|
100
|
+
- **Addresses:** {V-NNN IDs}
|
|
101
|
+
- **Action:** {Exact change description}
|
|
102
|
+
- **Depends on:** {Step N or "none"}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Bash Tool Usage
|
|
106
|
+
|
|
107
|
+
You have Bash access for read-only operations ONLY. The following is an exhaustive allowlist.
|
|
108
|
+
|
|
109
|
+
### Allowed Commands
|
|
110
|
+
- `python`, `python3` — for running validation scripts under the plugin root resolved by the portable resolver (`scripts/forge-root.sh`; see `references/portable-root.md`)
|
|
111
|
+
- `wc` — counting lines, words, characters
|
|
112
|
+
- `find` — locating files (read-only)
|
|
113
|
+
- `ls`, `tree` — listing directory contents
|
|
114
|
+
- `head`, `tail` — viewing file excerpts
|
|
115
|
+
- `cat` — reading file contents
|
|
116
|
+
- Type-check commands from forge.config.json (e.g., `bun run typecheck`, `mypy`, `go vet`)
|
|
117
|
+
- Test commands from forge.config.json (e.g., `bun test`, `pytest`, `cargo test`)
|
|
118
|
+
|
|
119
|
+
### Forbidden Commands
|
|
120
|
+
ALL commands not listed above are forbidden. Specifically:
|
|
121
|
+
- `git` (any subcommand)
|
|
122
|
+
- `rm`, `mv`, `cp`, `mkdir`, `touch`, `chmod`
|
|
123
|
+
- `tee`, `sed -i`, `awk` (with file modification)
|
|
124
|
+
- Write/append redirects (`>`, `>>`)
|
|
125
|
+
- Package managers (`pip install`, `npm install`, `bun install`, `cargo install`)
|
|
126
|
+
- Any command that creates, modifies, or deletes files
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 juicesharp
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# @juicesharp/rpiv-ask-user-question
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@juicesharp/rpiv-ask-user-question)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
<div align="center">
|
|
7
|
+
<a href="https://github.com/juicesharp/rpiv-mono/tree/main/packages/rpiv-ask-user-question">
|
|
8
|
+
<img src="https://raw.githubusercontent.com/juicesharp/rpiv-mono/main/packages/rpiv-ask-user-question/docs/cover.png" alt="rpiv-ask-user-question cover: a tabbed terminal questionnaire asking Which real development task are we planning right now?, with numbered options — Bug fix, New feature, Refactor — each under a one-line description, and a footer of key hints" width="50%">
|
|
9
|
+
</a>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
Let the model ask you instead of guessing. This extension gives [Pi Agent](https://github.com/badlogic/pi-mono) one tool — `ask_user_question` — that opens a terminal dialog of up to four questions with written-out options, and hands your choices back as structured data. Install it if you would rather spend fifteen seconds picking than an hour undoing a wrong assumption.
|
|
13
|
+
|
|
14
|
+
## Install
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
pi install npm:@juicesharp/rpiv-ask-user-question
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Restart your Pi session.
|
|
21
|
+
|
|
22
|
+
## Quick start
|
|
23
|
+
|
|
24
|
+
Nothing to set up — the tool is live as soon as Pi restarts. Hand the model a task with a real decision buried in it:
|
|
25
|
+
|
|
26
|
+
> Add caching to the API client.
|
|
27
|
+
|
|
28
|
+
Rather than picking a strategy on your behalf, the model calls `ask_user_question` and a dialog takes over the bottom of your terminal. Move with `↑`/`↓`, choose with `Enter`, press `n` to attach a note, or land on the `Type something.` row to answer in your own words. `Esc` abandons the questionnaire entirely.
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
When the model asks several things at once, `Tab` moves between them and a Submit tab reviews everything before it goes back:
|
|
33
|
+
|
|
34
|
+

|
|
35
|
+
|
|
36
|
+
## What you get
|
|
37
|
+
|
|
38
|
+
- **Typed options instead of a wall of prose** — each question carries 2-4 authored choices, and every choice comes with a description of what it means or what it costs you.
|
|
39
|
+
- **You can always answer in your own words** — a `Type something.` row is appended to every question, single- or multi-select, and widens to the full pane while you type.
|
|
40
|
+
- **Compare real artifacts, not just labels** — an option can carry a markdown `preview` (ASCII mockup, code, diagram, config) that renders in a bordered box beside the option list.
|
|
41
|
+
- **One interruption, not five** — up to four questions arrive in a single tabbed dialog, and the Submit tab lists your answers and names anything still blank before you commit.
|
|
42
|
+
- **Notes on any answer** — `n` opens a note editor on any question tab; the note travels back to the model alongside the choice without marking the question answered.
|
|
43
|
+
- **Read the transcript behind the dialog** — `Ctrl+]` collapses the overlay so you can scroll the conversation, then brings it back with your answers intact.
|
|
44
|
+
- **Works outside the terminal too** — in RPC and ACP hosts such as the VS Code pendant or Zed the questionnaire walks through the host's native dialogs, and in non-interactive runs the tool is removed from the model's tool list instead of failing every call.
|
|
45
|
+
|
|
46
|
+
## Configuration
|
|
47
|
+
|
|
48
|
+
Optional. Settings live in `~/.config/rpiv-ask-user-question/config.json`; the file is read, never written.
|
|
49
|
+
|
|
50
|
+
| Setting | What it does | Default |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| `collapseKey` | Key that collapses and expands the dialog. Accepts Pi keybinding ids such as `alt+o`; `"off"` disables the shortcut. | `"ctrl+]"` |
|
|
53
|
+
| `guidance.promptSnippet` | One-line description of the tool in the system prompt — tune how eagerly the model asks. | built-in snippet |
|
|
54
|
+
| `guidance.promptGuidelines` | Usage guidelines given to the model, as a list of strings. | 4 built-in guidelines |
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{ "collapseKey": "alt+o" }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Malformed JSON falls back to the defaults with a warning; an individual unusable value is silently dropped back to its default. Never an error.
|
|
61
|
+
|
|
62
|
+
## Reference
|
|
63
|
+
|
|
64
|
+
- [Tool schema](https://github.com/juicesharp/rpiv-mono/blob/main/packages/rpiv-ask-user-question/docs/tool-schema.md) — parameters, limits, reserved labels, validation errors, the result envelope, and the `rpiv:ask-user:prompt` event.
|
|
65
|
+
- [Keyboard and layout](https://github.com/juicesharp/rpiv-mono/blob/main/packages/rpiv-ask-user-question/docs/keyboard.md) — every key, the rows the dialog appends, notes, collapse mode, and how previews and overflow adapt to terminal size.
|
|
66
|
+
- [Configuration](https://github.com/juicesharp/rpiv-mono/blob/main/packages/rpiv-ask-user-question/docs/configuration.md) — file lookup and `XDG_CONFIG_HOME`, the `collapseKey` grammar, the `guidance.*` prompt overrides, and how invalid values are handled.
|
|
67
|
+
- [Hosts and runtime behavior](https://github.com/juicesharp/rpiv-mono/blob/main/packages/rpiv-ask-user-question/docs/hosts.md) — terminal vs RPC vs non-interactive, what degrades in each, and the load-failure envelopes.
|
|
68
|
+
- [Localization](https://github.com/juicesharp/rpiv-mono/blob/main/packages/rpiv-ask-user-question/docs/localization.md) — the nine shipped languages, how the locale is chosen, and how to add one.
|
|
69
|
+
|
|
70
|
+
## Requirements
|
|
71
|
+
|
|
72
|
+
- Node.js 22 or newer.
|
|
73
|
+
- Pi Agent, with an interactive terminal or an RPC/ACP host. Non-interactive runs never see the tool.
|
|
74
|
+
- A terminal at least 100 columns wide for side-by-side previews; narrower terminals stack the preview under the options.
|
|
75
|
+
|
|
76
|
+
No native dependencies, no compiler, no API keys — the extension makes no model calls of its own.
|
|
77
|
+
|
|
78
|
+
## Troubleshooting
|
|
79
|
+
|
|
80
|
+
**The model says the questionnaire UI failed to load and asks its questions as chat text.** The dialog's modules were replaced on disk while Pi was running, usually by a package-manager install touching the store. Repair the install if it is broken, then restart Pi; the failure is not recoverable inside the running process.
|
|
81
|
+
|
|
82
|
+
**`Ctrl+]` does nothing.** On keyboard layouts where `]` sits on the shifted layer (Latin American among them) the default is unreachable. Set `collapseKey` to something you can type, for example `"alt+o"`.
|
|
83
|
+
|
|
84
|
+
## Related
|
|
85
|
+
|
|
86
|
+
- [`@juicesharp/rpiv-i18n`](https://www.npmjs.com/package/@juicesharp/rpiv-i18n) — optional; installing it renders the dialog chrome in your language and adds `/languages`.
|
|
87
|
+
- [`@juicesharp/rpiv-pi`](https://www.npmjs.com/package/@juicesharp/rpiv-pi) — the umbrella package whose workflow skills use `ask_user_question` as their developer checkpoint. `/rpiv-setup` offers to install this extension.
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
MIT — see [LICENSE](https://github.com/juicesharp/rpiv-mono/blob/main/packages/rpiv-ask-user-question/LICENSE).
|