@garygentry/feature-forge 0.2.6 → 0.2.7

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.
Files changed (102) hide show
  1. package/adapters/claude/.feature-forge-bundle.json +1 -1
  2. package/adapters/claude/references/portable-root.md +18 -9
  3. package/adapters/claude/references/shared-conventions.md +21 -4
  4. package/adapters/claude/references/stage-exit-protocol.md +1 -1
  5. package/adapters/claude/references/vendor-construct-inventory.md +1 -0
  6. package/adapters/claude/scripts/forge-session.py +248 -5
  7. package/adapters/claude/skills/forge/SKILL.md +9 -9
  8. package/adapters/claude/skills/forge-0-epic/SKILL.md +5 -5
  9. package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +2 -2
  10. package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  11. package/adapters/claude/skills/forge-1-prd/SKILL.md +1 -1
  12. package/adapters/claude/skills/forge-2-tech/SKILL.md +1 -1
  13. package/adapters/claude/skills/forge-3-specs/SKILL.md +1 -1
  14. package/adapters/claude/skills/forge-4-backlog/SKILL.md +1 -1
  15. package/adapters/claude/skills/forge-5-loop/SKILL.md +2 -2
  16. package/adapters/claude/skills/forge-6-docs/SKILL.md +1 -1
  17. package/adapters/claude/skills/forge-bootstrap/SKILL.md +4 -4
  18. package/adapters/claude/skills/forge-init/SKILL.md +1 -1
  19. package/adapters/claude/skills/forge-verify/SKILL.md +1 -1
  20. package/adapters/claude/skills/forge-verify/references/verification-checklists.md +1 -1
  21. package/adapters/codex/.feature-forge-bundle.json +1 -1
  22. package/adapters/codex/references/portable-root.md +18 -9
  23. package/adapters/codex/references/shared-conventions.md +21 -4
  24. package/adapters/codex/references/stage-exit-protocol.md +1 -1
  25. package/adapters/codex/references/vendor-construct-inventory.md +1 -0
  26. package/adapters/codex/scripts/forge-session.py +248 -5
  27. package/adapters/codex/skills/forge/SKILL.md +9 -9
  28. package/adapters/codex/skills/forge-0-epic/SKILL.md +5 -5
  29. package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +2 -2
  30. package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  31. package/adapters/codex/skills/forge-1-prd/SKILL.md +1 -1
  32. package/adapters/codex/skills/forge-2-tech/SKILL.md +1 -1
  33. package/adapters/codex/skills/forge-3-specs/SKILL.md +1 -1
  34. package/adapters/codex/skills/forge-4-backlog/SKILL.md +1 -1
  35. package/adapters/codex/skills/forge-5-loop/SKILL.md +2 -2
  36. package/adapters/codex/skills/forge-6-docs/SKILL.md +1 -1
  37. package/adapters/codex/skills/forge-bootstrap/SKILL.md +4 -4
  38. package/adapters/codex/skills/forge-init/SKILL.md +1 -1
  39. package/adapters/codex/skills/forge-verify/SKILL.md +1 -1
  40. package/adapters/codex/skills/forge-verify/references/verification-checklists.md +1 -1
  41. package/adapters/copilot/.feature-forge-bundle.json +1 -1
  42. package/adapters/copilot/references/portable-root.md +18 -9
  43. package/adapters/copilot/references/shared-conventions.md +21 -4
  44. package/adapters/copilot/references/stage-exit-protocol.md +1 -1
  45. package/adapters/copilot/references/vendor-construct-inventory.md +1 -0
  46. package/adapters/copilot/scripts/forge-session.py +248 -5
  47. package/adapters/copilot/skills/forge/forge.md +9 -9
  48. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +5 -5
  49. package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +2 -2
  50. package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  51. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +1 -1
  52. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +1 -1
  53. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +1 -1
  54. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +1 -1
  55. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +2 -2
  56. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +1 -1
  57. package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +4 -4
  58. package/adapters/copilot/skills/forge-init/forge-init.md +1 -1
  59. package/adapters/copilot/skills/forge-verify/forge-verify.md +1 -1
  60. package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +1 -1
  61. package/adapters/cursor/.feature-forge-bundle.json +1 -1
  62. package/adapters/cursor/references/portable-root.md +18 -9
  63. package/adapters/cursor/references/shared-conventions.md +21 -4
  64. package/adapters/cursor/references/stage-exit-protocol.md +1 -1
  65. package/adapters/cursor/references/vendor-construct-inventory.md +1 -0
  66. package/adapters/cursor/scripts/forge-session.py +248 -5
  67. package/adapters/cursor/skills/forge/forge.mdc +9 -9
  68. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +5 -5
  69. package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +2 -2
  70. package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  71. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +1 -1
  72. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +1 -1
  73. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +1 -1
  74. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +1 -1
  75. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +2 -2
  76. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +1 -1
  77. package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +4 -4
  78. package/adapters/cursor/skills/forge-init/forge-init.mdc +1 -1
  79. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +1 -1
  80. package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +1 -1
  81. package/adapters/gemini/.feature-forge-bundle.json +1 -1
  82. package/adapters/gemini/gemini-extension.json +1 -1
  83. package/adapters/gemini/references/portable-root.md +18 -9
  84. package/adapters/gemini/references/shared-conventions.md +21 -4
  85. package/adapters/gemini/references/stage-exit-protocol.md +1 -1
  86. package/adapters/gemini/references/vendor-construct-inventory.md +1 -0
  87. package/adapters/gemini/scripts/forge-session.py +248 -5
  88. package/adapters/gemini/skills/forge/forge.md +9 -9
  89. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +5 -5
  90. package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +2 -2
  91. package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  92. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +1 -1
  93. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +1 -1
  94. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +1 -1
  95. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +1 -1
  96. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +2 -2
  97. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +1 -1
  98. package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +4 -4
  99. package/adapters/gemini/skills/forge-init/forge-init.md +1 -1
  100. package/adapters/gemini/skills/forge-verify/forge-verify.md +1 -1
  101. package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +1 -1
  102. package/package.json +1 -1
@@ -38,7 +38,7 @@ checks but still load any on-disk artifacts.
38
38
  plugin path and the configured specs dir:
39
39
 
40
40
  ```bash
41
- R="$(bash -c 'for d in "$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')"
41
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
42
42
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
43
43
  python3 "$R/scripts/epic-manifest.py" <subcommand> ... --specs-dir "{specsDir}"
44
44
  ```
@@ -72,7 +72,7 @@ Resolve the epic subtree path `{specsDir}/{epic}/` and decide which branch to ru
72
72
  epic, confirm the epic name itself does not collide with any existing feature or epic:
73
73
 
74
74
  ```bash
75
- R="$(bash -c 'for d in "$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')"
75
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
76
76
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
77
77
  python3 "$R/scripts/epic-manifest.py" check-name "{epic}" --specs-dir "{specsDir}"
78
78
  ```
@@ -116,7 +116,7 @@ For **each** proposed feature name, before accepting it into the set, enforce gl
116
116
  and name safety via the helper:
117
117
 
118
118
  ```bash
119
- R="$(bash -c 'for d in "$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')"
119
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
120
120
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
121
121
  python3 "$R/scripts/epic-manifest.py" check-name "{feature}" --specs-dir "{specsDir}"
122
122
  ```
@@ -176,7 +176,7 @@ For the *initial* creation write the skill writes the file directly — atomic g
176
176
  required for in-place mutation, which is the helper mutators' job. Creating the epic dir first creates `{specsDir}/`, so after writing the manifest invoke the **Specs Directory Hygiene** block in `references/shared-conventions.md` (idempotent; stage anything it writes with this stage's commit). Then validate:
177
177
 
178
178
  ```bash
179
- R="$(bash -c 'for d in "$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')"
179
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
180
180
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
181
181
  python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
182
182
  ```
@@ -248,7 +248,7 @@ now self-contained: manifest + EPIC.md + one subdirectory per member.
248
248
  **Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
249
249
 
250
250
  ```bash
251
- R="$(bash -c 'for d in "$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')"
251
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
252
252
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
253
253
  python3 "$R/scripts/forge-session.py" stage-exit --feature "{epic}" --stage forge-0-epic --next-feature "{first-actionable-feature}" --specs-dir "{specsDir}" --host generic
254
254
  ```
@@ -16,7 +16,7 @@ question goes through `AskUserQuestion`.
16
16
  Before offering any edit, validate the existing manifest:
17
17
 
18
18
  ```bash
19
- R="$(bash -c 'for d in "$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')"
19
+ 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')"
20
20
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
21
21
  python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
22
22
  ```
@@ -77,7 +77,7 @@ status is **not** `not-started`, warn the user. Read the **live** status (never
77
77
  completion in prose):
78
78
 
79
79
  ```bash
80
- R="$(bash -c 'for d in "$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')"
80
+ 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')"
81
81
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
82
82
  python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
83
83
  ```
@@ -12,7 +12,7 @@ the write if it would introduce a cycle, dangling ref, duplicate, or schema viol
12
12
  flag surface (owned by 02 §7):
13
13
 
14
14
  ```bash
15
- R="$(bash -c 'for d in "$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')"
15
+ 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')"
16
16
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
17
17
  # Add a feature — seeds EMPTY exposes/consumes; contracts are populated below.
18
18
  python3 "$R/scripts/epic-manifest.py" add-feature "{epic}" "{feature}" \
@@ -116,7 +116,7 @@ Write pipeline state conforming to `references/pipeline-state-schema.json`.
116
116
  **Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
117
117
 
118
118
  ```bash
119
- R="$(bash -c 'for d in "$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')"
119
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
120
120
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
121
121
  python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-1-prd --specs-dir "{specsDir}" --host generic
122
122
  ```
@@ -193,7 +193,7 @@ Write pipeline state conforming to `references/pipeline-state-schema.json`.
193
193
  **Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
194
194
 
195
195
  ```bash
196
- R="$(bash -c 'for d in "$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')"
196
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
197
197
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
198
198
  python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-2-tech --specs-dir "{specsDir}" --host generic
199
199
  ```
@@ -147,7 +147,7 @@ Write pipeline state conforming to `references/pipeline-state-schema.json`.
147
147
  **Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
148
148
 
149
149
  ```bash
150
- R="$(bash -c 'for d in "$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')"
150
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
151
151
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
152
152
  python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-3-specs --specs-dir "{specsDir}" --host generic
153
153
  ```
@@ -141,7 +141,7 @@ Write pipeline state conforming to `references/pipeline-state-schema.json`. Foll
141
141
  **Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
142
142
 
143
143
  ```bash
144
- R="$(bash -c 'for d in "$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')"
144
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
145
145
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
146
146
  python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-4-backlog --specs-dir "{specsDir}" --host generic
147
147
  ```
@@ -60,7 +60,7 @@ Read the resolved feature's `.pipeline-state.json`. **If it has no `epic` key, s
60
60
  1. Run `render-status "{epic}" --specs-dir "{specsDir}" --json` via the helper:
61
61
 
62
62
  ```bash
63
- R="$(bash -c 'for d in "$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')"
63
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
64
64
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
65
65
  python3 "$R/scripts/epic-manifest.py" \
66
66
  render-status "{epic}" --specs-dir "{specsDir}" --json
@@ -113,7 +113,7 @@ Verify the file exists on disk. If not, STOP and tell the user: "No backlog.json
113
113
 
114
114
  ### 1f. Branch Pre-flight (if using git)
115
115
 
116
- The runner commits each completed item straight onto the current branch, so guard against committing onto the default branch. Skip if not a git repo or `branchPerFeature` is false. Read the current branch (`git rev-parse --abbrev-ref HEAD`) and default branch (`git symbolic-ref --quiet refs/remotes/origin/HEAD`, else `main`/`master`). If `.pipeline-state.json` records a `branch` that differs from the current one, warn via the host's question mechanism (offer **switch back** or **proceed here**). Otherwise, if the current branch **is** the default, strongly recommend via the host's question mechanism creating/switching to `{branchPrefix}{feature}` (`git switch -c`, then record it to the state `branch` field) before the loop commits — still allowing **proceed on `{defaultBranch}`**. Never hard-stop.
116
+ The runner commits each item onto the current branch. Skip if not a git repo or `branchPerFeature` is false. Otherwise run the **Branch Reconciliation** block in `references/shared-conventions.md` (it runs `reconcile-branch` and, on `warn-drift` — you are on the default branch — strongly recommends creating `{branchPrefix}{feature}` via the host's question mechanism before the loop commits; on `adopt-current` it updates the recorded branch to the current one, never pushing you back to a stale/imposed branch). Never hard-stop.
117
117
 
118
118
  ## Step 2: Construct the Loop Command
119
119
 
@@ -43,7 +43,7 @@ Check `.pipeline-state.json` for `stages.forge-verify-impl`. If it is **absent**
43
43
  If the resolved feature has an `epic` back-pointer in its `.pipeline-state.json`, run:
44
44
 
45
45
  ```bash
46
- R="$(bash -c 'for d in "$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')"
46
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
47
47
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
48
48
  python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
49
49
  ```
@@ -58,7 +58,7 @@ Every bash invocation begins with the byte-identical portable-root prelude, then
58
58
  helper. Pass `--specs-dir ./specs` (the default) so the gate allow-lists the specs directory.
59
59
 
60
60
  ```bash
61
- R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
61
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
62
62
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
63
63
  python3 "$R/scripts/forge-bootstrap.py" check "<target-dir>" --json --specs-dir ./specs
64
64
  ```
@@ -135,7 +135,7 @@ when running under a Claude host (e.g. the host's question mechanism is availabl
135
135
  `CLAUDE.md` only when `host == "claude"`.
136
136
 
137
137
  ```bash
138
- R="$(bash -c 'for d in "$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')"
138
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
139
139
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
140
140
  python3 "$R/scripts/forge-bootstrap.py" scaffold "<target-dir>" --json --answers '<Answers JSON>'
141
141
  ```
@@ -143,7 +143,7 @@ python3 "$R/scripts/forge-bootstrap.py" scaffold "<target-dir>" --json --answers
143
143
  ### Step 5 — verify
144
144
 
145
145
  ```bash
146
- R="$(bash -c 'for d in "$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')"
146
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
147
147
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
148
148
  python3 "$R/scripts/forge-bootstrap.py" verify "<target-dir>" --json --answers '<Answers JSON>'
149
149
  ```
@@ -169,7 +169,7 @@ and removes the sentinel before staging so it never enters history. Read
169
169
  leave the sentinel in-progress (resumable) — do **not** declare success.
170
170
 
171
171
  ```bash
172
- R="$(bash -c 'for d in "$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')"
172
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
173
173
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
174
174
  python3 "$R/scripts/forge-bootstrap.py" commit "<target-dir>" --json --answers '<Answers JSON>' [--stage-only]
175
175
  ```
@@ -9,7 +9,7 @@ description: Initialize feature-forge configuration in the current project. Use
9
9
  Run the initialization script to create `forge.config.json` with default settings:
10
10
 
11
11
  ```bash
12
- R="$(bash -c 'for d in "$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')"
12
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
13
13
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
14
14
  bash "$R/scripts/forge-init.sh"
15
15
  ```
@@ -255,7 +255,7 @@ Do NOT mark as `findings-applied` — that happens after the fix pass.
255
255
  - For specs verification, also run the deterministic traceability validator to supplement agent-driven traceability checks. Include any uncovered requirements or orphaned references as findings:
256
256
 
257
257
  ```bash
258
- R="$(bash -c 'for d in "$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')"
258
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
259
259
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
260
260
  python3 "$R/scripts/validate-traceability.py" {resolvedFeatureDir}/PRD.md {resolvedFeatureDir}/ --json
261
261
  ```
@@ -192,7 +192,7 @@ findings to E01/E02/E03/E08. Then perform the judgment checks E04–E07 by readi
192
192
  manifest, EPIC.md, and completed members' specs.
193
193
 
194
194
  ```bash
195
- R="$(bash -c 'for d in "$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')"
195
+ 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')"
196
196
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
197
197
  python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
198
198
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@garygentry/feature-forge",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "Cross-agent installer for the feature-forge skill suite — installs the canonical forge pipeline into Claude, Codex, Copilot, Cursor, or Gemini.",
5
5
  "license": "MIT",
6
6
  "type": "module",