@garygentry/feature-forge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/adapters/GENERATION-REPORT.md +128 -0
- package/adapters/claude/agents/forge-researcher.md +137 -0
- package/adapters/claude/agents/forge-spec-writer.md +115 -0
- package/adapters/claude/agents/forge-verifier.md +121 -0
- package/adapters/claude/references/epic-manifest-schema.json +120 -0
- package/adapters/claude/references/forge-config-schema.json +166 -0
- package/adapters/claude/references/pipeline-state-schema.json +110 -0
- package/adapters/claude/references/portable-root.md +56 -0
- package/adapters/claude/references/process-overview.md +123 -0
- package/adapters/claude/references/ralph-loop-contract.md +221 -0
- package/adapters/claude/references/shared-conventions.md +144 -0
- package/adapters/claude/references/skill-frontmatter.schema.json +17 -0
- package/adapters/claude/references/stack-resolution.md +51 -0
- package/adapters/claude/references/stacks/_generic.md +90 -0
- package/adapters/claude/references/stacks/go.md +138 -0
- package/adapters/claude/references/stacks/python.md +163 -0
- package/adapters/claude/references/stacks/rust.md +151 -0
- package/adapters/claude/references/stacks/typescript.md +111 -0
- package/adapters/claude/references/vendor-construct-inventory.md +49 -0
- package/adapters/claude/scripts/forge-root.sh +50 -0
- package/adapters/claude/skills/forge/SKILL.md +165 -0
- package/adapters/claude/skills/forge-0-epic/SKILL.md +303 -0
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/claude/skills/forge-1-prd/SKILL.md +121 -0
- package/adapters/claude/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/claude/skills/forge-2-tech/SKILL.md +198 -0
- package/adapters/claude/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/claude/skills/forge-3-specs/SKILL.md +154 -0
- package/adapters/claude/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/claude/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +146 -0
- package/adapters/claude/skills/forge-5-loop/SKILL.md +303 -0
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/claude/skills/forge-6-docs/SKILL.md +179 -0
- package/adapters/claude/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +65 -0
- package/adapters/claude/skills/forge-init/SKILL.md +29 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +219 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/codex/agents/forge-researcher.md +133 -0
- package/adapters/codex/agents/forge-spec-writer.md +112 -0
- package/adapters/codex/agents/forge-verifier.md +115 -0
- package/adapters/codex/agents/openai.yaml +10 -0
- package/adapters/codex/references/epic-manifest-schema.json +120 -0
- package/adapters/codex/references/forge-config-schema.json +166 -0
- package/adapters/codex/references/pipeline-state-schema.json +110 -0
- package/adapters/codex/references/portable-root.md +56 -0
- package/adapters/codex/references/process-overview.md +123 -0
- package/adapters/codex/references/ralph-loop-contract.md +221 -0
- package/adapters/codex/references/shared-conventions.md +144 -0
- package/adapters/codex/references/skill-frontmatter.schema.json +17 -0
- package/adapters/codex/references/stack-resolution.md +51 -0
- package/adapters/codex/references/stacks/_generic.md +90 -0
- package/adapters/codex/references/stacks/go.md +138 -0
- package/adapters/codex/references/stacks/python.md +163 -0
- package/adapters/codex/references/stacks/rust.md +151 -0
- package/adapters/codex/references/stacks/typescript.md +111 -0
- package/adapters/codex/references/vendor-construct-inventory.md +49 -0
- package/adapters/codex/scripts/forge-root.sh +50 -0
- package/adapters/codex/skills/forge/forge.md +164 -0
- package/adapters/codex/skills/forge-0-epic/forge-0-epic.md +302 -0
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/codex/skills/forge-1-prd/forge-1-prd.md +120 -0
- package/adapters/codex/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/codex/skills/forge-2-tech/forge-2-tech.md +197 -0
- package/adapters/codex/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/codex/skills/forge-3-specs/forge-3-specs.md +153 -0
- package/adapters/codex/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/codex/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/codex/skills/forge-4-backlog/forge-4-backlog.md +145 -0
- package/adapters/codex/skills/forge-5-loop/forge-5-loop.md +302 -0
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/codex/skills/forge-6-docs/forge-6-docs.md +178 -0
- package/adapters/codex/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/codex/skills/forge-fix/forge-fix.md +64 -0
- package/adapters/codex/skills/forge-init/forge-init.md +29 -0
- package/adapters/codex/skills/forge-verify/forge-verify.md +218 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/copilot/agents/forge-researcher.md +133 -0
- package/adapters/copilot/agents/forge-spec-writer.md +112 -0
- package/adapters/copilot/agents/forge-verifier.md +115 -0
- package/adapters/copilot/references/epic-manifest-schema.json +120 -0
- package/adapters/copilot/references/forge-config-schema.json +166 -0
- package/adapters/copilot/references/pipeline-state-schema.json +110 -0
- package/adapters/copilot/references/portable-root.md +56 -0
- package/adapters/copilot/references/process-overview.md +123 -0
- package/adapters/copilot/references/ralph-loop-contract.md +221 -0
- package/adapters/copilot/references/shared-conventions.md +144 -0
- package/adapters/copilot/references/skill-frontmatter.schema.json +17 -0
- package/adapters/copilot/references/stack-resolution.md +51 -0
- package/adapters/copilot/references/stacks/_generic.md +90 -0
- package/adapters/copilot/references/stacks/go.md +138 -0
- package/adapters/copilot/references/stacks/python.md +163 -0
- package/adapters/copilot/references/stacks/rust.md +151 -0
- package/adapters/copilot/references/stacks/typescript.md +111 -0
- package/adapters/copilot/references/vendor-construct-inventory.md +49 -0
- package/adapters/copilot/scripts/forge-root.sh +50 -0
- package/adapters/copilot/skills/forge/forge.md +164 -0
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +302 -0
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +120 -0
- package/adapters/copilot/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +197 -0
- package/adapters/copilot/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +153 -0
- package/adapters/copilot/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/copilot/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +145 -0
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +302 -0
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +178 -0
- package/adapters/copilot/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/copilot/skills/forge-fix/forge-fix.md +64 -0
- package/adapters/copilot/skills/forge-init/forge-init.md +29 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +218 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/cursor/agents/forge-researcher.mdc +134 -0
- package/adapters/cursor/agents/forge-spec-writer.mdc +113 -0
- package/adapters/cursor/agents/forge-verifier.mdc +116 -0
- package/adapters/cursor/references/epic-manifest-schema.json +120 -0
- package/adapters/cursor/references/forge-config-schema.json +166 -0
- package/adapters/cursor/references/pipeline-state-schema.json +110 -0
- package/adapters/cursor/references/portable-root.md +56 -0
- package/adapters/cursor/references/process-overview.md +123 -0
- package/adapters/cursor/references/ralph-loop-contract.md +221 -0
- package/adapters/cursor/references/shared-conventions.md +144 -0
- package/adapters/cursor/references/skill-frontmatter.schema.json +17 -0
- package/adapters/cursor/references/stack-resolution.md +51 -0
- package/adapters/cursor/references/stacks/_generic.md +90 -0
- package/adapters/cursor/references/stacks/go.md +138 -0
- package/adapters/cursor/references/stacks/python.md +163 -0
- package/adapters/cursor/references/stacks/rust.md +151 -0
- package/adapters/cursor/references/stacks/typescript.md +111 -0
- package/adapters/cursor/references/vendor-construct-inventory.md +49 -0
- package/adapters/cursor/scripts/forge-root.sh +50 -0
- package/adapters/cursor/skills/forge/forge.mdc +165 -0
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +303 -0
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +121 -0
- package/adapters/cursor/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +198 -0
- package/adapters/cursor/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +154 -0
- package/adapters/cursor/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/cursor/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +146 -0
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +303 -0
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +179 -0
- package/adapters/cursor/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +65 -0
- package/adapters/cursor/skills/forge-init/forge-init.mdc +30 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +219 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +379 -0
- package/adapters/gemini/agents/forge-researcher.md +133 -0
- package/adapters/gemini/agents/forge-spec-writer.md +112 -0
- package/adapters/gemini/agents/forge-verifier.md +115 -0
- package/adapters/gemini/gemini-extension.json +54 -0
- package/adapters/gemini/references/epic-manifest-schema.json +120 -0
- package/adapters/gemini/references/forge-config-schema.json +166 -0
- package/adapters/gemini/references/pipeline-state-schema.json +110 -0
- package/adapters/gemini/references/portable-root.md +56 -0
- package/adapters/gemini/references/process-overview.md +123 -0
- package/adapters/gemini/references/ralph-loop-contract.md +221 -0
- package/adapters/gemini/references/shared-conventions.md +144 -0
- package/adapters/gemini/references/skill-frontmatter.schema.json +17 -0
- package/adapters/gemini/references/stack-resolution.md +51 -0
- package/adapters/gemini/references/stacks/_generic.md +90 -0
- package/adapters/gemini/references/stacks/go.md +138 -0
- package/adapters/gemini/references/stacks/python.md +163 -0
- package/adapters/gemini/references/stacks/rust.md +151 -0
- package/adapters/gemini/references/stacks/typescript.md +111 -0
- package/adapters/gemini/references/vendor-construct-inventory.md +49 -0
- package/adapters/gemini/scripts/forge-root.sh +50 -0
- package/adapters/gemini/skills/forge/forge.md +164 -0
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +302 -0
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +222 -0
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +120 -0
- package/adapters/gemini/skills/forge-1-prd/references/prd-template.md +106 -0
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +197 -0
- package/adapters/gemini/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +153 -0
- package/adapters/gemini/skills/forge-3-specs/references/spec-archetypes.md +106 -0
- package/adapters/gemini/skills/forge-3-specs/references/spec-examples.md +71 -0
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +145 -0
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +302 -0
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +63 -0
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +214 -0
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +178 -0
- package/adapters/gemini/skills/forge-6-docs/references/doc-conventions.md +126 -0
- package/adapters/gemini/skills/forge-fix/forge-fix.md +64 -0
- package/adapters/gemini/skills/forge-init/forge-init.md +29 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +218 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +379 -0
- package/dist/agent-targets.d.ts +70 -0
- package/dist/agent-targets.js +111 -0
- package/dist/apply.d.ts +49 -0
- package/dist/apply.js +246 -0
- package/dist/cli.d.ts +94 -0
- package/dist/cli.js +508 -0
- package/dist/detect.d.ts +45 -0
- package/dist/detect.js +72 -0
- package/dist/fsutil.d.ts +56 -0
- package/dist/fsutil.js +175 -0
- package/dist/hash.d.ts +50 -0
- package/dist/hash.js +107 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/manifest.d.ts +72 -0
- package/dist/manifest.js +222 -0
- package/dist/plan.d.ts +66 -0
- package/dist/plan.js +166 -0
- package/dist/rauf.d.ts +83 -0
- package/dist/rauf.js +118 -0
- package/dist/report.d.ts +35 -0
- package/dist/report.js +110 -0
- package/dist/source.d.ts +69 -0
- package/dist/source.js +164 -0
- package/dist/types.d.ts +264 -0
- package/dist/types.js +57 -0
- package/package.json +42 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# forge-0-epic — Edit Mode (E1–E6) + Observability / Pipeline State & Commit
|
|
2
|
+
|
|
3
|
+
Lookup detail relocated out of the `forge-0-epic` SKILL.md body. The skill body keeps the
|
|
4
|
+
entry condition (the **EXISTS** branch from Step 0) and the high-level "every mutation is
|
|
5
|
+
committed individually" rule, and points here for the full mechanics. The exact mutator flag
|
|
6
|
+
surface and per-subcommand exit-code handling live in `references/epic-manifest-subcommands.md`.
|
|
7
|
+
|
|
8
|
+
Entered from Step 0 when `{specsDir}/{epic}/epic-manifest.json` already exists (the **EXISTS**
|
|
9
|
+
branch). The edit branch mutates the manifest **only** through helper mutators — the skill never
|
|
10
|
+
hand-rolls an in-place write. Every mutator is atomic (temp file + `os.replace`) and re-validates
|
|
11
|
+
the edited graph internally, so a refused write leaves the manifest **byte-identical**. Every
|
|
12
|
+
question goes through `AskUserQuestion`.
|
|
13
|
+
|
|
14
|
+
## Step E1 — Load + Validate, Refuse if Invalid
|
|
15
|
+
|
|
16
|
+
Before offering any edit, validate the existing manifest:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
20
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
21
|
+
python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- Exit `0` → the manifest is well-formed; proceed to E2.
|
|
25
|
+
- Exit `1` or `2` → the manifest is corrupt or invalid (hand-edited, `corrupt-json`, `cycle`,
|
|
26
|
+
`dangling-ref`, `duplicate-name`, `cached-status`, `unsafe-name`, …). Surface **every**
|
|
27
|
+
`findings[]` entry **verbatim**, then **refuse ALL mutation** until the user repairs the
|
|
28
|
+
manifest by hand. **Never auto-repair**, never offer an edit operation, and never proceed past
|
|
29
|
+
this gate. Tell the user what is wrong and STOP.
|
|
30
|
+
|
|
31
|
+
## Step E2 — Choose Operation
|
|
32
|
+
|
|
33
|
+
Use `AskUserQuestion` to offer the edit operations, each mapping to one helper mutator:
|
|
34
|
+
|
|
35
|
+
| Operation | Helper subcommand |
|
|
36
|
+
|-----------|-------------------|
|
|
37
|
+
| Add a feature | `add-feature` |
|
|
38
|
+
| Remove a feature | `remove-feature` |
|
|
39
|
+
| Reorder features | `reorder` |
|
|
40
|
+
| Change a dependency edge | `set-dep` |
|
|
41
|
+
| Change epic lifecycle status | `set-status` |
|
|
42
|
+
|
|
43
|
+
For **add-feature**, first run `check-name "{feature}"` (exactly as C2) so no new duplicate is
|
|
44
|
+
introduced — surface a `duplicate-name`/`unsafe-name` finding verbatim and re-prompt — then
|
|
45
|
+
elicit the new feature's **charter** + **`exposes`/`consumes`** + **`dependsOn`** exactly as in
|
|
46
|
+
C3/C4.
|
|
47
|
+
|
|
48
|
+
## Step E3 — Apply via Helper Mutator (re-validated)
|
|
49
|
+
|
|
50
|
+
Issue the chosen mutator. Each writes atomically and re-runs full validation internally, refusing
|
|
51
|
+
the write if it would introduce a cycle, dangling ref, duplicate, or schema violation. For the
|
|
52
|
+
exact `epic-manifest.py` mutator flag surface and per-subcommand exit-code handling, read
|
|
53
|
+
`references/epic-manifest-subcommands.md`.
|
|
54
|
+
|
|
55
|
+
**Contracts have no mutator.** `add-feature` seeds empty `exposes`/`consumes`. To populate the
|
|
56
|
+
new feature's contracts, edit its `exposes`/`consumes` arrays **directly in the composed manifest
|
|
57
|
+
entry** (exactly as creation C5 does), then re-run `validate "{epic}" --json` to confirm — there
|
|
58
|
+
is intentionally no `--exposes-json`/`--consumes-json` flag.
|
|
59
|
+
|
|
60
|
+
**remove-feature leaves the member directory in place (§7.5).** The mutator drops only the
|
|
61
|
+
manifest entry. The skill does **not** delete or relocate `{specsDir}/{epic}/{feature}/`. WARN the
|
|
62
|
+
user verbatim:
|
|
63
|
+
|
|
64
|
+
> Removed `{feature}` from the manifest. Its directory `{specsDir}/{epic}/{feature}/` is left in
|
|
65
|
+
> place; move it to `{specsDir}/{feature}/` by hand if you want it as a standalone feature.
|
|
66
|
+
> Relocation is manual — there is no migration tooling.
|
|
67
|
+
|
|
68
|
+
The orphaned subdir still holds a `.pipeline-state.json` with an `epic` back-pointer the manifest
|
|
69
|
+
no longer lists; per the conflict rule the **manifest wins**, and `forge-verify` epic mode
|
|
70
|
+
CHECK-E07 reports the inconsistency non-fatally. The skill does **not** silently edit the orphaned
|
|
71
|
+
state file.
|
|
72
|
+
|
|
73
|
+
## Step E4 — Impact Warning (in-flight / completed features)
|
|
74
|
+
|
|
75
|
+
Before applying — or immediately after eliciting — a mutation that affects a feature whose derived
|
|
76
|
+
status is **not** `not-started`, warn the user. Read the **live** status (never re-derive
|
|
77
|
+
completion in prose):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
81
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
82
|
+
python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
If the operation removes, reorders-around, or re-deps a feature whose derived status is
|
|
86
|
+
`in-progress` or `complete`, use `AskUserQuestion` with an explicit warning naming the affected
|
|
87
|
+
in-flight/completed feature(s) and **require confirmation** before applying. Example: "`token-service`
|
|
88
|
+
is already in-progress (forge-3-specs). Removing `config-store`, which it consumes `JWT_SECRET`
|
|
89
|
+
from, may invalidate its in-flight specs. Proceed?" If `render-status` exits `≥ 1`, surface the
|
|
90
|
+
findings and STOP (do not mutate over an invalid graph).
|
|
91
|
+
|
|
92
|
+
## Step E5 — Patch EPIC.md
|
|
93
|
+
|
|
94
|
+
Patch **only** the affected feature/Contracts section(s) — the section(s) for the added, removed,
|
|
95
|
+
or changed feature and any feature whose `dependsOn`/`consumes` changed — applying the §C6 mirror
|
|
96
|
+
rule (one bullet per `exposes`/`consumes` entry). **Full regeneration happens only on explicit
|
|
97
|
+
user request**: offer it via `AskUserQuestion` but default to the targeted patch. The skill keeps
|
|
98
|
+
EPIC.md in sync but does not itself diff it against the manifest — drift detection is `forge-verify`
|
|
99
|
+
epic mode CHECK-E06.
|
|
100
|
+
|
|
101
|
+
## Step E6 — Pipeline State & Commit
|
|
102
|
+
|
|
103
|
+
Proceed to the **Observability, Pipeline State & Commit** section below. Each edit-mode mutation is
|
|
104
|
+
committed individually so git history is the audit trail.
|
|
105
|
+
|
|
106
|
+
## Observability, Pipeline State & Commit
|
|
107
|
+
|
|
108
|
+
### Manifest `updatedAt`
|
|
109
|
+
|
|
110
|
+
Every helper mutator bumps the manifest's top-level `updatedAt` to the current ISO-8601 UTC
|
|
111
|
+
timestamp as part of the same atomic write. The skill does **not** bump it manually in edit mode.
|
|
112
|
+
For the initial creation write (C5) the skill sets `createdAt == updatedAt`.
|
|
113
|
+
|
|
114
|
+
### Pipeline state
|
|
115
|
+
|
|
116
|
+
- **Epic-level:** the epic subtree has **no `.pipeline-state.json` of its own** (that is what
|
|
117
|
+
distinguishes an epic root from a feature). The epic's lifecycle lives in the manifest `status`
|
|
118
|
+
field. The `forge-0-epic` run is recorded in **member** states, not in an epic-level state file.
|
|
119
|
+
- **Member-level (creation):** each member's `.pipeline-state.json` records
|
|
120
|
+
`stages["forge-0-epic"].status = "complete"` and `currentStage = "forge-1-prd"` (see C7).
|
|
121
|
+
- **Edit mode:** edits mutate the **manifest**, not member pipeline states — except the
|
|
122
|
+
newly-created subdir for `add-feature`, which follows C7 (create the member subdir + back-pointer
|
|
123
|
+
state). The skill does **not** rewrite existing members' `stages` on an edit.
|
|
124
|
+
- **`.epic-state.json` (lazily created, written by skills — NOT the helper):** epic-*scoped* stage
|
|
125
|
+
entries that belong to no single member — currently only `forge-verify-epic` — are persisted in a
|
|
126
|
+
dedicated `{specsDir}/{epic}/.epic-state.json`. It holds **only** epic-scoped stage entries,
|
|
127
|
+
never derived per-feature status (so it does not violate REQ-STATE-02). `forge-0-epic` does
|
|
128
|
+
**not** create this file — no epic-scoped stage runs during creation or edit; it appears only once
|
|
129
|
+
`forge-verify` epic mode runs. When a skill does write it (e.g. forge-verify epic mode), it writes
|
|
130
|
+
**directly** using an atomic temp-file + `os.replace` pattern — the helper exposes no subcommand
|
|
131
|
+
for it. On I/O failure the skill reports and leaves any prior file intact (never a partial write).
|
|
132
|
+
Minimal schema:
|
|
133
|
+
|
|
134
|
+
```jsonc
|
|
135
|
+
{
|
|
136
|
+
"epic": "auth-overhaul", // matches manifest `epic`
|
|
137
|
+
"stages": {
|
|
138
|
+
"forge-verify-epic": {
|
|
139
|
+
"status": "findings-reported", // "findings-reported" | "passed" | "findings-applied"
|
|
140
|
+
"findingsFile": ".verification/VERIFY-epic-2026-06-12.md",
|
|
141
|
+
"findingsCount": 3,
|
|
142
|
+
"verifiedAt": "2026-06-12T00:00:00Z"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The git-commit step below stages the whole epic subtree, so `.epic-state.json` is captured
|
|
149
|
+
automatically when present.
|
|
150
|
+
|
|
151
|
+
### Git Commit Protocol
|
|
152
|
+
|
|
153
|
+
After creation (C8) **and after each edit-mode mutation (E6)**, if `gitCommitAfterStage` is true,
|
|
154
|
+
follow the Git Commit Protocol in shared-conventions:
|
|
155
|
+
|
|
156
|
+
1. Stage the whole epic subtree only: `git add {specsDir}/{epic}/` — **never** `git add -A`. This
|
|
157
|
+
captures `epic-manifest.json`, `EPIC.md`, member `.pipeline-state.json` files, and any
|
|
158
|
+
`.epic-state.json` together atomically.
|
|
159
|
+
2. Commit with message `"{commitPrefix}({epic}): <action>"`, e.g.
|
|
160
|
+
`"forge({epic}): create epic with 4 features"`, `"forge({epic}): add feature api-gateway"`,
|
|
161
|
+
`"forge({epic}): remove feature legacy-session"`, `"forge({epic}): reorder features"`,
|
|
162
|
+
`"forge({epic}): set dependency on token-service"`, or `"forge({epic}): set status paused"`.
|
|
163
|
+
3. On success, capture the commit hash. On failure (pre-commit hook, conflict), report and do
|
|
164
|
+
**not** mark complete; never use `--no-verify`/`--force`.
|
|
165
|
+
|
|
166
|
+
Because every mutation is committed, the git history of `epic-manifest.json` is the audit trail; no
|
|
167
|
+
separate in-manifest audit log is kept.
|
|
168
|
+
|
|
169
|
+
### Closing message
|
|
170
|
+
|
|
171
|
+
After a successful **creation**, present the next-steps message (already specified in C8). After a
|
|
172
|
+
successful **edit-mode mutation**, confirm the change and re-surface the dashboard pointer:
|
|
173
|
+
|
|
174
|
+
> Epic `{epic}` updated (`<action>`). Run `/feature-forge:forge {epic}` to see the refreshed
|
|
175
|
+
> dashboard, or re-run `/feature-forge:forge-0-epic {epic}` to make another change.
|
|
176
|
+
|
|
177
|
+
## EPIC.md Mirror Template (creation C6 / edit E5)
|
|
178
|
+
|
|
179
|
+
`forge-0-epic` Step C6 generates `{specsDir}/{epic}/EPIC.md` from the **validated** manifest; the
|
|
180
|
+
edit-mode E5 patch applies the **same mirror rule** to the affected sections. The full skeleton:
|
|
181
|
+
|
|
182
|
+
```markdown
|
|
183
|
+
# {epic} — Epic
|
|
184
|
+
|
|
185
|
+
## Overall Goal
|
|
186
|
+
{the epic goal from C1, expanded into narrative prose}
|
|
187
|
+
|
|
188
|
+
## Decomposition Rationale
|
|
189
|
+
{why the change was split this way; right-sizing notes; ordering rationale}
|
|
190
|
+
|
|
191
|
+
## Features
|
|
192
|
+
{for each feature, in manifest order:}
|
|
193
|
+
|
|
194
|
+
### {feature.name}
|
|
195
|
+
{feature.charter, as prose}
|
|
196
|
+
|
|
197
|
+
**Depends on:** {comma-separated dependsOn, or "nothing"}
|
|
198
|
+
|
|
199
|
+
#### Contracts
|
|
200
|
+
**Exposes:**
|
|
201
|
+
- `{exposes[i].name}` ({exposes[i].kind}) — {exposes[i].summary}
|
|
202
|
+
{… or "Nothing exposed." if the exposes array is empty}
|
|
203
|
+
|
|
204
|
+
**Consumes:**
|
|
205
|
+
- `{consumes[i].name}` from `{consumes[i].from}` — {consumes[i].summary}
|
|
206
|
+
{… or "Nothing consumed." if the consumes array is empty}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Member State Example (creation C7)
|
|
210
|
+
|
|
211
|
+
Each member's `.pipeline-state.json` (created in Step C7) conforms to
|
|
212
|
+
`references/pipeline-state-schema.json`. Example member state:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"epic": "{epic}",
|
|
217
|
+
"currentStage": "forge-1-prd",
|
|
218
|
+
"stages": {
|
|
219
|
+
"forge-0-epic": { "status": "complete", "version": 1, "completedAt": "<iso-8601-utc>" }
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# forge-0-epic — `epic-manifest.py` Subcommand Reference
|
|
2
|
+
|
|
3
|
+
Lookup detail relocated out of the `forge-0-epic` SKILL.md body (Step E3 command
|
|
4
|
+
catalog + exit-code disposition, and the Error Handling table). The skill body keeps
|
|
5
|
+
the decision logic and step ordering; this file is the flag-surface catalog and the
|
|
6
|
+
per-subcommand exit-code reference.
|
|
7
|
+
|
|
8
|
+
## Edit-Mode Mutator Flag Surface (Step E3)
|
|
9
|
+
|
|
10
|
+
Issue the chosen mutator. Each writes atomically and re-runs full validation internally, refusing
|
|
11
|
+
the write if it would introduce a cycle, dangling ref, duplicate, or schema violation. The exact
|
|
12
|
+
flag surface (owned by 02 §7):
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
16
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
17
|
+
# Add a feature — seeds EMPTY exposes/consumes; contracts are populated below.
|
|
18
|
+
python3 "$R/scripts/epic-manifest.py" add-feature "{epic}" "{feature}" \
|
|
19
|
+
--charter "…" --specs-dir "{specsDir}" [--depends-on a,b]
|
|
20
|
+
|
|
21
|
+
# Remove a feature (drops its manifest entry; directory is left in place — see E3 note).
|
|
22
|
+
python3 "$R/scripts/epic-manifest.py" remove-feature "{epic}" "{feature}" \
|
|
23
|
+
--specs-dir "{specsDir}"
|
|
24
|
+
|
|
25
|
+
# Reorder the features[] sequence (must be an exact permutation of current member names).
|
|
26
|
+
python3 "$R/scripts/epic-manifest.py" reorder "{epic}" \
|
|
27
|
+
--order "feat-a,feat-c,feat-b" --specs-dir "{specsDir}"
|
|
28
|
+
|
|
29
|
+
# Change a dependency edge (--depends-on "" clears it).
|
|
30
|
+
python3 "$R/scripts/epic-manifest.py" set-dep "{epic}" "{feature}" \
|
|
31
|
+
--depends-on "config-store,token-service" --specs-dir "{specsDir}"
|
|
32
|
+
|
|
33
|
+
# Change epic lifecycle status (active|paused|abandoned|complete).
|
|
34
|
+
python3 "$R/scripts/epic-manifest.py" set-status "{epic}" \
|
|
35
|
+
--status paused --specs-dir "{specsDir}"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Per-Subcommand Exit-Code Disposition (Step E3)
|
|
39
|
+
|
|
40
|
+
- Exit `0` → the mutator wrote the manifest and bumped `updatedAt`. Proceed to E4/E5.
|
|
41
|
+
- Exit `1` → surface the `findings[]` **verbatim** and **abort the edit**. The manifest is
|
|
42
|
+
unchanged (the write was refused atomically — byte-identical). Loop back to E2 or re-elicit.
|
|
43
|
+
- Exit `2` → unsafe name / missing|corrupt manifest / bad `--status` value / write failure.
|
|
44
|
+
Surface and STOP.
|
|
45
|
+
|
|
46
|
+
## Error Handling
|
|
47
|
+
|
|
48
|
+
The skill **never** repairs a corrupt manifest automatically and **never** proceeds past a gating
|
|
49
|
+
helper exit `≥ 1`. All findings are surfaced **verbatim**.
|
|
50
|
+
|
|
51
|
+
| Condition | Helper signal | Skill behavior |
|
|
52
|
+
|-----------|---------------|----------------|
|
|
53
|
+
| Epic name duplicates an existing name | `check-name` exit 1 (`duplicate-name`) | STOP creation; surface finding; ask for a new name via `AskUserQuestion` |
|
|
54
|
+
| Member feature name duplicates | `check-name` exit 1 (`duplicate-name`) | Reject that name in C2 / add-feature; surface verbatim; re-prompt |
|
|
55
|
+
| Unsafe name (`/`, `..`, absolute) | `check-name`/mutator exit 2 (`unsafe-name`) | Reject; surface; re-prompt |
|
|
56
|
+
| Composed manifest has a cycle | `validate` exit 1 (`cycle`) | Surface verbatim; re-open the dependency interview (C4); never finalize |
|
|
57
|
+
| Dangling `dependsOn`/`consumes.from` | `validate` exit 1 (`dangling-ref`) | Surface verbatim; re-open C4 (bad `dependsOn`) or C3 (bad `consumes.from`) |
|
|
58
|
+
| Corrupt/unparseable manifest (edit) | `validate` exit 1 (`corrupt-json`) | Surface ALL findings verbatim; **refuse all mutation** until repaired; never auto-repair |
|
|
59
|
+
| Existing manifest otherwise invalid (edit) | `validate` exit 1/2 | Surface ALL findings verbatim; **refuse all mutation** (E1) |
|
|
60
|
+
| Mutator would introduce cycle/dangling ref/duplicate | mutator exit 1 | Abort the edit; manifest byte-identical (atomic refusal); surface finding |
|
|
61
|
+
| Bad `--status` value | `set-status` exit 2 (argparse) | Surface; re-prompt via `AskUserQuestion` with the valid choices |
|
|
62
|
+
| Edit affects in-flight/completed feature | `render-status` derived status (`in-progress`/`complete`) | Warn naming the affected feature(s); require confirmation before applying (E4) |
|
|
63
|
+
| `render-status` over an invalid graph | `render-status` exit ≥ 1 | Surface findings; STOP (do not mutate over an invalid graph) |
|
|
64
|
+
| Git commit fails | — | Report; leave state `in-progress`; never bypass hooks (`--no-verify`/`--force`) |
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
# GENERATED — DO NOT EDIT. Source: skills/forge-1-prd/SKILL.md. Regenerate: python3 scripts/build-adapters.py
|
|
3
|
+
name: forge-1-prd
|
|
4
|
+
description: Create a requirements PRD for a feature through structured interview. Use when user runs /feature-forge:forge-1-prd or explicitly asks to start the forge pipeline for a new feature. Do NOT trigger for general requirements discussions, project scoping outside forge, or PRD questions unrelated to the forge pipeline.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# forge-1-prd — Requirements Interviewer
|
|
8
|
+
|
|
9
|
+
Create a thorough, requirements-only PRD through relentless structured interviewing. The PRD captures WHAT the feature must do, not HOW it will be built.
|
|
10
|
+
|
|
11
|
+
## Prerequisites
|
|
12
|
+
|
|
13
|
+
Read and follow `references/shared-conventions.md` for feature name validation, configuration reading, and force mode handling before proceeding.
|
|
14
|
+
|
|
15
|
+
## Step 1: Read Configuration and Check State
|
|
16
|
+
|
|
17
|
+
### Branch Setup (if using git)
|
|
18
|
+
If `gitCommitAfterStage` is true and the project uses git, use `AskUserQuestion` to offer: "Want me to create a `forge/{feature}` branch for this pipeline? (Recommended — keeps forge work isolated.)" If yes, create and checkout the branch before proceeding.
|
|
19
|
+
|
|
20
|
+
Set the working directory by invoking the **Feature Directory Resolution** block in `references/shared-conventions.md`, which yields `{resolvedFeatureDir}`. Note one PRD-specific caveat: at PRD time a brand-new standalone feature may have NO directory yet, so resolution is expected to fail `not-found` for a never-started standalone feature — in that case forge-1 creates `{specsDir}/{feature}/` as today. For an epic member the directory already exists (created empty by forge-0-epic with an `epic` back-pointer), so resolution succeeds and yields the nested path.
|
|
21
|
+
|
|
22
|
+
If `.pipeline-state.json` exists for this feature and `forge-1-prd` is already marked complete, use `AskUserQuestion` to warn: "A PRD already exists for '{feature}'. Continuing will create a new version. Proceed?"
|
|
23
|
+
|
|
24
|
+
## Step 2: Examine Existing Context
|
|
25
|
+
|
|
26
|
+
Before starting the interview, invoke the **Epic Context Injection** block in `references/shared-conventions.md`. This block self-gates: it skips entirely if the feature has no `epic` back-pointer, so standalone behavior is unchanged. If this feature is an epic member, the injected charter's `exposes`/`consumes` are requirement inputs — every contract obligation must appear as a REQ in the PRD.
|
|
27
|
+
|
|
28
|
+
1. **Check the project structure**: Read the project's build configuration and dependency manifests to understand what modules/packages exist. Look for `package.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`, `pom.xml`, workspace configs, or equivalent.
|
|
29
|
+
2. **Check existing specs**: Look at `{specsDir}/` for other features' PRDs to understand conventions and the overall system
|
|
30
|
+
3. **Check existing docs**: Look at the docs directory for architecture documentation
|
|
31
|
+
4. **Note integration surfaces**: Identify which existing packages might be relevant to this feature
|
|
32
|
+
|
|
33
|
+
This context helps you ask informed questions and spot gaps the user might not think of.
|
|
34
|
+
|
|
35
|
+
## Step 3: Conduct the Interview
|
|
36
|
+
|
|
37
|
+
Interview the user relentlessly. Your goal is to extract complete, unambiguous requirements.
|
|
38
|
+
|
|
39
|
+
Read `references/prd-template.md` for the interview structure and question categories. Cover every category. Don't rush — missing a requirement now costs 10x to fix later.
|
|
40
|
+
|
|
41
|
+
### CRITICAL GUARDRAIL: No Technology Decisions
|
|
42
|
+
|
|
43
|
+
The PRD is EXCLUSIVELY about requirements. You MUST enforce this boundary:
|
|
44
|
+
|
|
45
|
+
**When the user says something like:**
|
|
46
|
+
- "I want to use Zod for validation" → Capture as: "Runtime schema validation with type inference is required." Note their Zod preference as a constraint but not a requirement.
|
|
47
|
+
- "We'll store it in Drizzle/PostgreSQL" → Capture as: "Persistent storage required for X data with Y query patterns."
|
|
48
|
+
- "I want a React component that..." → Capture as: "A user interface is required that allows users to..."
|
|
49
|
+
- "We should use WebSockets for..." → Capture as: "Real-time updates are required when X changes, with latency under Y."
|
|
50
|
+
- "I want a REST API" → Capture as: "An HTTP-accessible interface is required for X operations"
|
|
51
|
+
- "We need a microservice for X" → Capture as: "X must be independently deployable and scalable"
|
|
52
|
+
- "Use a queue for Y" → Capture as: "Y must be processed asynchronously with guaranteed delivery"
|
|
53
|
+
|
|
54
|
+
**When YOU start drifting into technology:**
|
|
55
|
+
If you catch yourself writing about specific libraries, API designs, database schemas, or implementation patterns — STOP. Ask yourself: "Is this a requirement or an implementation choice?" Rewrite it as the underlying requirement.
|
|
56
|
+
|
|
57
|
+
**The one exception:** When a technology choice IS the requirement (e.g., "must integrate with the existing @repo/auth package" or "must work with our Hono backend"). These are constraints, and they belong in the Constraints section of the PRD, clearly labeled as such.
|
|
58
|
+
|
|
59
|
+
A technology constraint is valid when it stems from organizational mandate, existing infrastructure, or team expertise — not from preference. Ask "Why must it be X specifically?" If the answer is "because we already run X in production," that's a legitimate constraint. If the answer is "because it's fast," capture the performance requirement instead.
|
|
60
|
+
|
|
61
|
+
### Interview Approach
|
|
62
|
+
|
|
63
|
+
**Turn structure:** Output your analysis or context as regular text, then use `AskUserQuestion` for the actual questions. NEVER put questions in your text output — they MUST go through `AskUserQuestion`.
|
|
64
|
+
|
|
65
|
+
**Pacing:** Cover one topic area at a time, asking 2-3 related questions per `AskUserQuestion` call. After receiving answers, probe deeper on anything incomplete before moving to the next topic. Signal progress in your text before the next question batch.
|
|
66
|
+
|
|
67
|
+
**Question strategies** (use these as content for `AskUserQuestion`, not as inline prose):
|
|
68
|
+
- Probe deeper after each answer: failure modes, stakeholders, minimum viable version
|
|
69
|
+
- Challenge assumptions: which users specifically, what does "fast" mean quantitatively
|
|
70
|
+
- Identify edge cases: empty input, concurrent access, scale
|
|
71
|
+
- Capture non-functional requirements: performance, security, accessibility, observability
|
|
72
|
+
- Ask about what's OUT of scope — as important as what's in scope
|
|
73
|
+
|
|
74
|
+
**Completion criteria:** The interview is complete when:
|
|
75
|
+
1. Every category in `references/prd-template.md` has been covered with at least one question
|
|
76
|
+
2. The user has confirmed there's nothing else to add
|
|
77
|
+
3. You can draft every PRD section without leaving TBD placeholders
|
|
78
|
+
|
|
79
|
+
Before moving to Step 4, summarize your coverage as text, then use `AskUserQuestion` to ask: "Anything I'm missing?"
|
|
80
|
+
|
|
81
|
+
**Parking lot:** If the user raises a concern that belongs to a different pipeline stage, acknowledge it and note it in the pipeline state's `notes` field: "Good point — I've noted that for the [tech spec/implementation specs]. Let's continue with [current stage]."
|
|
82
|
+
|
|
83
|
+
## Step 4: Write the PRD
|
|
84
|
+
|
|
85
|
+
Once the interview is thorough, write `{resolvedFeatureDir}/PRD.md` following the structure in `references/prd-template.md`.
|
|
86
|
+
|
|
87
|
+
Every requirement MUST have a unique ID (e.g., REQ-AUTH-01, REQ-PERF-01). These IDs are referenced by all downstream documents.
|
|
88
|
+
|
|
89
|
+
## Step 5: Review with User
|
|
90
|
+
|
|
91
|
+
Present the complete PRD to the user. Ask:
|
|
92
|
+
- "Does this capture everything? Any requirements missing?"
|
|
93
|
+
- "Are the priorities correct?"
|
|
94
|
+
- "Anything in here that should be out of scope?"
|
|
95
|
+
|
|
96
|
+
Use `AskUserQuestion` to collect this feedback.
|
|
97
|
+
|
|
98
|
+
Iterate until the user confirms the PRD is complete.
|
|
99
|
+
|
|
100
|
+
## Step 6: Update Pipeline State and Commit
|
|
101
|
+
|
|
102
|
+
Write pipeline state conforming to `references/pipeline-state-schema.json`.
|
|
103
|
+
|
|
104
|
+
1. Create or update `{resolvedFeatureDir}/.pipeline-state.json`:
|
|
105
|
+
- Set `currentStage` to `forge-2-tech`
|
|
106
|
+
- Set `stages.forge-1-prd.version` to 1 (or increment if revising)
|
|
107
|
+
- Record `artifacts`, `completedAt`
|
|
108
|
+
- Set `stages.forge-1-prd.basedOnVersions` to `{}` (no upstream dependencies)
|
|
109
|
+
- Check downstream stages (`forge-2-tech`, `forge-3-specs`, `forge-4-backlog`, `forge-5-loop`, `forge-6-docs`). If any have `basedOnVersions` referencing an older version of `forge-1-prd`, set their status to `stale`.
|
|
110
|
+
2. Use `AskUserQuestion` to ask: "Anything you want to note before we wrap? (preserved across sessions)"
|
|
111
|
+
- If yes, store in the `notes` field
|
|
112
|
+
3. If `gitCommitAfterStage` is true, follow the Git Commit Protocol in `references/shared-conventions.md`: stage files, attempt commit with message `"{commitPrefix}({feature}): complete PRD v{n}"`, then set `stages.forge-1-prd.status` to `complete` with commit hash only on success. If commit fails, leave status as `in-progress`.
|
|
113
|
+
5. Tell the user: "PRD complete. Next steps:\n - `/feature-forge:forge-verify {feature}` to verify the PRD\n - `/feature-forge:forge-2-tech {feature}` to start the tech spec\n - `/feature-forge:forge {feature}` to see full pipeline status"
|
|
114
|
+
|
|
115
|
+
## Gotchas
|
|
116
|
+
|
|
117
|
+
- Users often front-load their feature description with tech decisions because that's how engineers think. Gently but firmly redirect to requirements. Don't be preachy about it — just reframe what they said.
|
|
118
|
+
- If the user provides a very detailed initial description, don't skip the interview. Use their description as a starting point but probe for what's missing. Long descriptions often have big gaps in edge cases and non-functional requirements.
|
|
119
|
+
- Don't number requirements sequentially across categories (REQ-01, REQ-02...). Use category prefixes (REQ-AUTH-01, REQ-PERF-01) so inserting new requirements doesn't require renumbering.
|
|
120
|
+
- The PRD should be readable by a non-technical stakeholder. If a section requires deep technical knowledge to understand, it probably belongs in the tech spec, not the PRD.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# PRD Template and Interview Guide
|
|
2
|
+
|
|
3
|
+
This reference defines the standard PRD structure and the interview questions to cover for each section.
|
|
4
|
+
|
|
5
|
+
## PRD Document Structure
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
# {Feature Name} — Product Requirements Document
|
|
9
|
+
|
|
10
|
+
## 1. Problem Statement
|
|
11
|
+
What problem does this feature solve? Who has this problem? Why does it matter now?
|
|
12
|
+
|
|
13
|
+
## 2. User Stories
|
|
14
|
+
As a [role], I want [capability], so that [benefit].
|
|
15
|
+
- Include primary actors and secondary actors
|
|
16
|
+
- Include admin/operator stories, not just end-user stories
|
|
17
|
+
|
|
18
|
+
## 3. Functional Requirements
|
|
19
|
+
|
|
20
|
+
### 3.1 {Capability Area}
|
|
21
|
+
- REQ-{CAT}-01: {Requirement description}
|
|
22
|
+
- Priority: P0 (must have) | P1 (should have) | P2 (nice to have)
|
|
23
|
+
- Notes: {Any clarification}
|
|
24
|
+
|
|
25
|
+
### 3.2 {Another Capability Area}
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
## 4. Non-Functional Requirements
|
|
29
|
+
|
|
30
|
+
### 4.1 Performance
|
|
31
|
+
- REQ-PERF-01: ...
|
|
32
|
+
|
|
33
|
+
### 4.2 Security
|
|
34
|
+
- REQ-SEC-01: ...
|
|
35
|
+
|
|
36
|
+
### 4.3 Observability
|
|
37
|
+
- REQ-OBS-01: ...
|
|
38
|
+
|
|
39
|
+
### 4.4 Accessibility
|
|
40
|
+
- REQ-A11Y-01: ...
|
|
41
|
+
|
|
42
|
+
### 4.5 Scalability
|
|
43
|
+
- REQ-SCALE-01: ...
|
|
44
|
+
|
|
45
|
+
## 5. Constraints
|
|
46
|
+
Technical, organizational, or external constraints that must be respected.
|
|
47
|
+
(This is where technology mandates go — e.g., "must integrate with existing @repo/auth package")
|
|
48
|
+
|
|
49
|
+
## 6. Out of Scope
|
|
50
|
+
Explicitly list what this feature will NOT do in this version.
|
|
51
|
+
|
|
52
|
+
## 7. Open Questions
|
|
53
|
+
Unresolved items that need answers before or during implementation.
|
|
54
|
+
|
|
55
|
+
## 8. Success Criteria
|
|
56
|
+
How do we know this feature is done and working correctly?
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Interview Question Categories
|
|
60
|
+
|
|
61
|
+
Cover ALL of these areas during the interview. Don't move on until each is addressed.
|
|
62
|
+
|
|
63
|
+
### Core Understanding
|
|
64
|
+
- What is the feature in one sentence?
|
|
65
|
+
- Who are the primary users? Secondary users? Admins/operators?
|
|
66
|
+
- What workflow or process does this support?
|
|
67
|
+
- What exists today that this replaces or augments?
|
|
68
|
+
|
|
69
|
+
### Functional Depth
|
|
70
|
+
- Walk me through the happy path end to end
|
|
71
|
+
- What are the key data entities involved?
|
|
72
|
+
- What inputs does the system accept? What are valid/invalid inputs?
|
|
73
|
+
- What outputs does the system produce?
|
|
74
|
+
- What states can things be in? What transitions are allowed?
|
|
75
|
+
- What happens when the user makes a mistake?
|
|
76
|
+
|
|
77
|
+
### Error and Edge Cases
|
|
78
|
+
- What happens when X is unavailable?
|
|
79
|
+
- What if two users do Y at the same time?
|
|
80
|
+
- What happens with empty inputs? Huge inputs? Malformed inputs?
|
|
81
|
+
- What does partial failure look like?
|
|
82
|
+
- How should the system recover from crashes mid-operation?
|
|
83
|
+
|
|
84
|
+
### Integration
|
|
85
|
+
- What existing parts of the system does this interact with?
|
|
86
|
+
- What data does it need from other features?
|
|
87
|
+
- What data does it provide to other features?
|
|
88
|
+
- Are there external systems or APIs involved?
|
|
89
|
+
|
|
90
|
+
### Non-Functional
|
|
91
|
+
- What's the expected load? (requests/sec, concurrent users, data volume)
|
|
92
|
+
- What are the latency requirements?
|
|
93
|
+
- What security considerations exist? (authn, authz, data sensitivity)
|
|
94
|
+
- What needs to be logged, monitored, or alerted on?
|
|
95
|
+
- Are there accessibility requirements?
|
|
96
|
+
|
|
97
|
+
### Scope and Priority
|
|
98
|
+
- What's the minimum viable version of this?
|
|
99
|
+
- What would you cut if you had to ship in half the time?
|
|
100
|
+
- What's explicitly NOT part of this feature?
|
|
101
|
+
- Are there follow-up features that depend on decisions made here?
|
|
102
|
+
|
|
103
|
+
### Success
|
|
104
|
+
- How do you know this feature is working correctly?
|
|
105
|
+
- What would a user complain about if we got it wrong?
|
|
106
|
+
- Are there quantitative targets? (latency < Xms, uptime > Y%)
|