@entelligentsia/forgecli 1.0.10 → 1.0.20
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/CHANGELOG.md +191 -0
- package/dist/CHANGELOG-forge-plugin.md +211 -0
- package/dist/bin/forge.js +0 -0
- package/dist/extensions/forgecli/config-layer.js.map +1 -1
- package/dist/extensions/forgecli/context-governor-compaction.d.ts +83 -0
- package/dist/extensions/forgecli/context-governor-compaction.js +302 -0
- package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -0
- package/dist/extensions/forgecli/context-governor.d.ts +173 -0
- package/dist/extensions/forgecli/context-governor.js +618 -0
- package/dist/extensions/forgecli/context-governor.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/component.d.ts +105 -0
- package/dist/extensions/forgecli/dashboard/component.js +861 -0
- package/dist/extensions/forgecli/dashboard/component.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/register.d.ts +2 -0
- package/dist/extensions/forgecli/dashboard/register.js +31 -0
- package/dist/extensions/forgecli/dashboard/register.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/theme.d.ts +27 -0
- package/dist/extensions/forgecli/dashboard/theme.js +91 -0
- package/dist/extensions/forgecli/dashboard/theme.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/view-model.d.ts +35 -0
- package/dist/extensions/forgecli/dashboard/view-model.js +54 -0
- package/dist/extensions/forgecli/dashboard/view-model.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.js +126 -7
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js +2 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
- package/dist/extensions/forgecli/forge-commands.js +1 -0
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js +53 -0
- package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +20 -1
- package/dist/extensions/forgecli/forge-subagent.js +23 -7
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-tools.js +3 -1
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +3 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +37 -3
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/index.js +38 -1
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +59 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js +113 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
- package/dist/extensions/forgecli/migration-engine.js +25 -12
- package/dist/extensions/forgecli/migration-engine.js.map +1 -1
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +26 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js +213 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
- package/dist/extensions/forgecli/orchestrator-tree.d.ts +96 -0
- package/dist/extensions/forgecli/orchestrator-tree.js +390 -0
- package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -0
- package/dist/extensions/forgecli/project-orientation.js +12 -8
- package/dist/extensions/forgecli/project-orientation.js.map +1 -1
- package/dist/extensions/forgecli/regenerate.d.ts +16 -0
- package/dist/extensions/forgecli/regenerate.js +110 -0
- package/dist/extensions/forgecli/regenerate.js.map +1 -1
- package/dist/extensions/forgecli/run-sprint.d.ts +3 -1
- package/dist/extensions/forgecli/run-sprint.js +34 -3
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +66 -1
- package/dist/extensions/forgecli/run-task.js +323 -12
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +4 -1
- package/dist/extensions/forgecli/thread-switcher.js +118 -762
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/viewport-events.js +32 -0
- package/dist/extensions/forgecli/viewport-events.js.map +1 -1
- package/dist/forge-payload/.base-pack/commands/fix-bug.md +1 -1
- package/dist/forge-payload/.base-pack/commands/run-sprint.md +1 -1
- package/dist/forge-payload/.base-pack/commands/run-task.md +1 -1
- package/dist/forge-payload/.base-pack/personas/architect.md +1 -1
- package/dist/forge-payload/.base-pack/personas/bug-fixer.md +1 -1
- package/dist/forge-payload/.base-pack/personas/collator.md +3 -3
- package/dist/forge-payload/.base-pack/personas/engineer.md +1 -1
- package/dist/forge-payload/.base-pack/personas/librarian.md +1 -1
- package/dist/forge-payload/.base-pack/personas/orchestrator.md +1 -1
- package/dist/forge-payload/.base-pack/personas/product-manager.md +1 -1
- package/dist/forge-payload/.base-pack/personas/qa-engineer.md +1 -1
- package/dist/forge-payload/.base-pack/personas/supervisor.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/friction-emit.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/iron-laws.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/progress-reporting.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/_fragments/store-cli-verbs.md +11 -2
- package/dist/forge-payload/.base-pack/workflows/architect_approve.md +6 -7
- package/dist/forge-payload/.base-pack/workflows/architect_review_sprint_completion.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/architect_sprint_intake.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/architect_sprint_plan.md +5 -5
- package/dist/forge-payload/.base-pack/workflows/collator_agent.md +4 -6
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +5 -6
- package/dist/forge-payload/.base-pack/workflows/enhance.md +5 -5
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +15 -7
- package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +12 -13
- package/dist/forge-payload/.base-pack/workflows/plan_task.md +12 -6
- package/dist/forge-payload/.base-pack/workflows/review_code.md +12 -11
- package/dist/forge-payload/.base-pack/workflows/review_plan.md +12 -11
- package/dist/forge-payload/.base-pack/workflows/sprint_retrospective.md +3 -3
- package/dist/forge-payload/.base-pack/workflows/triage.md +12 -9
- package/dist/forge-payload/.base-pack/workflows/update_implementation.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/update_plan.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/validate_task.md +9 -9
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +490 -0
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-sprint.js +416 -0
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +608 -0
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/config.schema.json +2 -3
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/event.schema.json +16 -0
- package/dist/forge-payload/.schemas/migrations.json +359 -18
- package/dist/forge-payload/commands/health.md +29 -0
- package/dist/forge-payload/commands/rebuild.md +143 -15
- package/dist/forge-payload/commands/update.md +28 -27
- package/dist/forge-payload/hooks/preflight-session.cjs +99 -0
- package/dist/forge-payload/init/phases/phase-3-materialize.md +18 -5
- package/dist/forge-payload/integrity.json +7 -6
- package/dist/forge-payload/meta/fragments/tool-discipline.md +1 -1
- package/dist/forge-payload/meta/personas/meta-architect.md +1 -1
- package/dist/forge-payload/meta/personas/meta-bug-fixer.md +1 -1
- package/dist/forge-payload/meta/personas/meta-collator.md +7 -7
- package/dist/forge-payload/meta/personas/meta-engineer.md +1 -1
- package/dist/forge-payload/meta/personas/meta-orchestrator.md +1 -1
- package/dist/forge-payload/meta/personas/meta-supervisor.md +1 -1
- package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/iron-laws.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +2 -2
- package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +11 -2
- package/dist/forge-payload/meta/workflows/meta-approve.md +6 -7
- package/dist/forge-payload/meta/workflows/meta-bug-triage.md +12 -9
- package/dist/forge-payload/meta/workflows/meta-collate.md +5 -7
- package/dist/forge-payload/meta/workflows/meta-commit.md +5 -6
- package/dist/forge-payload/meta/workflows/meta-enhance.md +5 -5
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +35 -11
- package/dist/forge-payload/meta/workflows/meta-implement.md +15 -7
- package/dist/forge-payload/meta/workflows/meta-migrate.md +13 -14
- package/dist/forge-payload/meta/workflows/meta-new-sprint.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +138 -39
- package/dist/forge-payload/meta/workflows/meta-plan-sprint.md +6 -6
- package/dist/forge-payload/meta/workflows/meta-plan-task.md +12 -6
- package/dist/forge-payload/meta/workflows/meta-retro.md +4 -4
- package/dist/forge-payload/meta/workflows/meta-retrospective.md +4 -4
- package/dist/forge-payload/meta/workflows/meta-review-implementation.md +12 -11
- package/dist/forge-payload/meta/workflows/meta-review-plan.md +12 -11
- package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +6 -6
- package/dist/forge-payload/meta/workflows/meta-update-implementation.md +2 -2
- package/dist/forge-payload/meta/workflows/meta-update-plan.md +2 -2
- package/dist/forge-payload/meta/workflows/meta-validate.md +9 -9
- package/dist/forge-payload/schemas/config.schema.json +2 -3
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/event.schema.json +16 -0
- package/dist/forge-payload/schemas/structure-manifest.json +75 -73
- package/dist/forge-payload/skills/refresh-kb-links/SKILL.md +14 -7
- package/dist/forge-payload/tools/banners.cjs +29 -10
- package/dist/forge-payload/tools/check-structure.cjs +88 -7
- package/dist/forge-payload/tools/collate.cjs +48 -2
- package/dist/forge-payload/tools/manage-config.cjs +5 -7
- package/dist/forge-payload/tools/parse-gates.cjs +73 -1
- package/dist/forge-payload/tools/postflight-gate.cjs +298 -0
- package/dist/forge-payload/tools/preflight-gate.cjs +47 -0
- package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -4
- package/dist/forge-payload/tools/verify-phase.cjs +17 -0
- package/package.json +2 -2
- package/dist/bin/forgecli.d.ts +0 -2
- package/dist/bin/forgecli.js +0 -6
- package/dist/bin/forgecli.js.map +0 -1
- package/dist/extensions/forgecli/config-tui/index.d.ts +0 -5
- package/dist/extensions/forgecli/config-tui/index.js +0 -5
- package/dist/extensions/forgecli/config-tui/index.js.map +0 -1
- package/dist/extensions/forgecli/loaders/persona-skill-loader.d.ts +0 -45
- package/dist/extensions/forgecli/loaders/persona-skill-loader.js +0 -227
- package/dist/extensions/forgecli/loaders/persona-skill-loader.js.map +0 -1
- package/dist/extensions/forgecli/loaders/template-render.d.ts +0 -20
- package/dist/extensions/forgecli/loaders/template-render.js +0 -85
- package/dist/extensions/forgecli/loaders/template-render.js.map +0 -1
- package/dist/extensions/forgecli/loaders/workflow-loader.d.ts +0 -41
- package/dist/extensions/forgecli/loaders/workflow-loader.js +0 -164
- package/dist/extensions/forgecli/loaders/workflow-loader.js.map +0 -1
- package/dist/forge-payload/.base-pack/workflows/fix_bug.md +0 -446
- package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +0 -928
- package/dist/forge-payload/.base-pack/workflows/run_sprint.md +0 -225
|
@@ -84,6 +84,12 @@ with a colon delimiter (both forms are equivalent).
|
|
|
84
84
|
/forge:rebuild workflows plan_task # single workflow file only
|
|
85
85
|
/forge:rebuild workflows:plan_task # same — colon form (from migration entries)
|
|
86
86
|
/forge:rebuild workflows sprint_plan # single workflow file only
|
|
87
|
+
/forge:rebuild workflows-js # .claude/workflows/ JS orchestration workflows (verbatim copy)
|
|
88
|
+
/forge:rebuild workflows-js wfl-run-task # single JS workflow file only
|
|
89
|
+
/forge:rebuild workflows-js:wfl-run-task # same — colon form (from migration entries)
|
|
90
|
+
/forge:rebuild tools # .forge/tools/ verbatim re-copy from $FORGE_ROOT/tools/
|
|
91
|
+
/forge:rebuild tools store-cli # single tool file only (name with or without .cjs)
|
|
92
|
+
/forge:rebuild tools:store-cli # same — colon form (from migration entries)
|
|
87
93
|
/forge:rebuild commands # .claude/commands/ slash command wrappers
|
|
88
94
|
/forge:rebuild templates # document templates only
|
|
89
95
|
/forge:rebuild templates PLAN_TEMPLATE # single template file only
|
|
@@ -311,14 +317,14 @@ write, record hash.
|
|
|
311
317
|
--kb "$(node "$FORGE_ROOT/tools/manage-config.cjs" get paths.engineering 2>/dev/null || echo engineering)" \
|
|
312
318
|
--out .forge/init-context.md --json-out .forge/init-context.json
|
|
313
319
|
```
|
|
314
|
-
2. Read `$FORGE_ROOT/init/workflow-gen-plan.json` (
|
|
320
|
+
2. Read `$FORGE_ROOT/init/workflow-gen-plan.json` (15-entry fan-out table).
|
|
315
321
|
Let `M_total` = the entry count.
|
|
316
322
|
|
|
317
323
|
3. Render the workflows badge, then emit the count:
|
|
318
324
|
```sh
|
|
319
325
|
node "$FORGE_ROOT/tools/banners.cjs" --badge ember
|
|
320
326
|
```
|
|
321
|
-
Then emit: `Generating workflows (<N> atomic
|
|
327
|
+
Then emit: `Generating workflows (<N> atomic, parallel)...`
|
|
322
328
|
4. Check each file for manual modifications before any clearing:
|
|
323
329
|
```sh
|
|
324
330
|
node "$FORGE_ROOT/tools/generation-manifest.cjs" check .forge/workflows/{filename}.md
|
|
@@ -334,27 +340,143 @@ write, record hash.
|
|
|
334
340
|
`$FORGE_ROOT/init/generation/generate-workflows.md` as the per-subagent rulebook
|
|
335
341
|
(same fan-out pattern as `/forge:init` Phase 7d). Spawn one per entry.
|
|
336
342
|
7. Collect results. Retry failures once in a single Agent call.
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
343
|
+
|
|
344
|
+
> **LLM orchestration retired.** `orchestrate_task` / `run_sprint` / `fix_bug`
|
|
345
|
+
> are no longer generated. The deterministic JS drivers in
|
|
346
|
+
> `.claude/workflows/wfl-*.js` (category `workflows-js`) are the only
|
|
347
|
+
> orchestration truth; `/forge:run-task`, `/forge:run-sprint`, and
|
|
348
|
+
> `/forge:fix-bug` dispatch to them via `workflow(wfl:*)`. The prose specs
|
|
349
|
+
> `meta-orchestrate.md` / `meta-fix-bug.md` remain in `meta/` as reference
|
|
350
|
+
> docs only — neither built into the base-pack nor regenerated here.
|
|
351
|
+
|
|
352
|
+
8. **Replay user enhancements** (forge#107 / Approach A):
|
|
345
353
|
```sh
|
|
346
354
|
node "$FORGE_ROOT/tools/manage-versions.cjs" replay --target workflows
|
|
347
355
|
```
|
|
348
356
|
Walks snapshots; restores enhanced `workflows/<name>.md` files. Later
|
|
349
357
|
snapshots win on collision.
|
|
350
|
-
|
|
358
|
+
9. For each written file: record hash `node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/workflows/{filename}.md`
|
|
351
359
|
(this runs AFTER replay so the recorded hash reflects the restored content).
|
|
352
|
-
|
|
360
|
+
10. Emit ` 〇 workflows — <N> files written`.
|
|
353
361
|
|
|
354
362
|
**Do NOT touch:** `.claude/commands/`, `.forge/config.json`, or any knowledge base file.
|
|
355
363
|
|
|
356
364
|
---
|
|
357
365
|
|
|
366
|
+
## Category: `workflows-js` — verbatim copy (full or single file)
|
|
367
|
+
|
|
368
|
+
Re-materialise the JS orchestration workflows in `.claude/workflows/` from the
|
|
369
|
+
plugin base-pack. Unlike the `workflows` category (LLM-generated `.forge/`
|
|
370
|
+
markdown with placeholder substitution and KB enrichment), the
|
|
371
|
+
`workflows-js` files are **deterministic verbatim copies** from
|
|
372
|
+
`$FORGE_ROOT/init/base-pack/workflows-js/` — no LLM, no placeholder
|
|
373
|
+
substitution, no enrichment. The output is byte-identical to the base-pack
|
|
374
|
+
source (enforced by `workflows-js-drift.test.cjs`), so this category mirrors
|
|
375
|
+
the `workflows:_fragments` copy pattern, not the generation pattern.
|
|
376
|
+
|
|
377
|
+
Render a badge, then proceed:
|
|
378
|
+
|
|
379
|
+
```sh
|
|
380
|
+
node "$FORGE_ROOT/tools/banners.cjs" --badge ember
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
**If a sub-target is provided** (e.g. `/forge:rebuild workflows-js wfl-run-task`
|
|
384
|
+
or the colon form `workflows-js:wfl-run-task`), copy only the single file. The
|
|
385
|
+
sub-target may be given with or without the `.js` extension; normalise to
|
|
386
|
+
`<sub-target>.js`.
|
|
387
|
+
|
|
388
|
+
1. Verify `$FORGE_ROOT/init/base-pack/workflows-js/<sub-target>.js` exists. If
|
|
389
|
+
not, list the available files and exit cleanly.
|
|
390
|
+
2. Ensure `.claude/workflows/` exists (create if absent).
|
|
391
|
+
3. Copy verbatim (no substitution) to `.claude/workflows/<sub-target>.js`.
|
|
392
|
+
4. Record a manifest hash:
|
|
393
|
+
```sh
|
|
394
|
+
node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/<sub-target>.js
|
|
395
|
+
```
|
|
396
|
+
5. Emit ` 〇 workflows-js:<sub-target> — copied`.
|
|
397
|
+
|
|
398
|
+
**If no sub-target** — full copy, directory fan-out:
|
|
399
|
+
|
|
400
|
+
1. Enumerate all `.js` files in `$FORGE_ROOT/init/base-pack/workflows-js/`.
|
|
401
|
+
Let `N` = the count.
|
|
402
|
+
2. Emit: `Copying workflows-js (<N> files)...`
|
|
403
|
+
3. Ensure `.claude/workflows/` exists (create if absent).
|
|
404
|
+
4. For each file, copy verbatim to `.claude/workflows/<filename>`, then record
|
|
405
|
+
a manifest hash:
|
|
406
|
+
```sh
|
|
407
|
+
node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/<filename>
|
|
408
|
+
```
|
|
409
|
+
5. Emit ` 〇 workflows-js — <N> files copied`.
|
|
410
|
+
|
|
411
|
+
> **Note:** Only the base-pack-sourced JS workflows (`wfl-*.js`) are written.
|
|
412
|
+
> Custom or project-specific files in `.claude/workflows/` are never
|
|
413
|
+
> overwritten or deleted. Verify with `ls .claude/workflows/`.
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## Category: `tools` — verbatim copy (full or single file)
|
|
418
|
+
|
|
419
|
+
Re-materialise the vendored plugin tools in `.forge/tools/` from the installed
|
|
420
|
+
plugin. Unlike workflow and persona categories (LLM-generated with placeholder
|
|
421
|
+
substitution), tools files are **deterministic verbatim copies** from
|
|
422
|
+
`$FORGE_ROOT/tools/` — no LLM, no substitution, no enrichment. The output is
|
|
423
|
+
byte-identical to the plugin source.
|
|
424
|
+
|
|
425
|
+
**If a sub-target is provided** (e.g. `/forge:rebuild tools store-cli`
|
|
426
|
+
or the colon form `tools:store-cli`), copy only the single file. The sub-target
|
|
427
|
+
may be given with or without the `.cjs` extension; normalise to `<sub-target>.cjs`.
|
|
428
|
+
Sub-targets in the `lib/` namespace may be specified with the `lib/` prefix
|
|
429
|
+
(e.g. `tools:lib/schema-loader` or `tools:lib/schema-loader.cjs`).
|
|
430
|
+
|
|
431
|
+
**Single-file steps:**
|
|
432
|
+
|
|
433
|
+
1. Resolve the source path: if the sub-target starts with `lib/`, look in
|
|
434
|
+
`$FORGE_ROOT/tools/lib/<name>.cjs`; otherwise look in `$FORGE_ROOT/tools/<name>.cjs`.
|
|
435
|
+
If the source does not exist, list the available files and exit cleanly.
|
|
436
|
+
2. Ensure the target directory exists (`.forge/tools/` or `.forge/tools/lib/`).
|
|
437
|
+
3. Copy verbatim to the resolved `.forge/tools/` path.
|
|
438
|
+
4. Record a manifest hash:
|
|
439
|
+
```sh
|
|
440
|
+
node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/tools/<sub-target>.cjs
|
|
441
|
+
```
|
|
442
|
+
5. Emit ` 〇 tools:<sub-target> — copied`.
|
|
443
|
+
|
|
444
|
+
**If no sub-target** — full re-copy, directory fan-out:
|
|
445
|
+
|
|
446
|
+
1. Enumerate all `*.cjs` **and `*.js`** files in `$FORGE_ROOT/tools/` (top-level
|
|
447
|
+
only, exclude `*.test.cjs`/`*.test.js`). Let `N_top` = the count.
|
|
448
|
+
Enumerate all `*.cjs` **and `*.js`** files in `$FORGE_ROOT/tools/lib/` (exclude
|
|
449
|
+
`*.test.cjs`/`*.test.js`). Let `N_lib` = the count.
|
|
450
|
+
Both extensions are required: e.g. `store-cli.cjs` loads `lib/validate.js` and
|
|
451
|
+
`collate.cjs` loads `lib/result.js`; a `.cjs`-only copy breaks them.
|
|
452
|
+
2. Emit: `Copying tools (<N_top> tool files + <N_lib> lib files)...`
|
|
453
|
+
3. Ensure `.forge/tools/` and `.forge/tools/lib/` exist (create if absent).
|
|
454
|
+
4. For each top-level file, copy verbatim to `.forge/tools/<filename>`, then
|
|
455
|
+
record a manifest hash:
|
|
456
|
+
```sh
|
|
457
|
+
node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/tools/<filename>
|
|
458
|
+
```
|
|
459
|
+
5. For each lib file, copy verbatim to `.forge/tools/lib/<filename>`, then
|
|
460
|
+
record a manifest hash:
|
|
461
|
+
```sh
|
|
462
|
+
node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/tools/lib/<filename>
|
|
463
|
+
```
|
|
464
|
+
6. Write (or overwrite) the version marker so `/forge:health` can detect staleness:
|
|
465
|
+
```sh
|
|
466
|
+
ACTIVE_VERSION=$(node -e "console.log(require('$FORGE_ROOT/.claude-plugin/plugin.json').version)")
|
|
467
|
+
node -e "
|
|
468
|
+
const fs = require('fs');
|
|
469
|
+
fs.writeFileSync('.forge/tools/.forge-tools-version', JSON.stringify({ version: '${ACTIVE_VERSION}' }) + '\n');
|
|
470
|
+
"
|
|
471
|
+
```
|
|
472
|
+
7. Emit ` 〇 tools — <N_top + N_lib> files copied`.
|
|
473
|
+
|
|
474
|
+
> **Note:** This is a full re-copy of the plugin tools at the installed
|
|
475
|
+
> `$FORGE_ROOT` version. Use `/forge:rebuild tools` after `/forge:update` to
|
|
476
|
+
> refresh `.forge/tools/` to the new plugin version.
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
358
480
|
## Category: `commands` — full rebuild
|
|
359
481
|
|
|
360
482
|
Re-generate `.claude/commands/` slash command wrappers from the current
|
|
@@ -549,7 +671,7 @@ are not yet represented in review checklist items.
|
|
|
549
671
|
|
|
550
672
|
## Default (no argument)
|
|
551
673
|
|
|
552
|
-
Run all
|
|
674
|
+
Run all categories respecting dependencies — with maximum parallelism:
|
|
553
675
|
|
|
554
676
|
1. **Build brief** (once, synchronous):
|
|
555
677
|
```sh
|
|
@@ -572,8 +694,14 @@ Run all five categories respecting dependencies — with maximum parallelism:
|
|
|
572
694
|
Spawn orchestration and commands subagents in a **SINGLE Agent tool message**.
|
|
573
695
|
Wait for both.
|
|
574
696
|
|
|
575
|
-
|
|
576
|
-
|
|
697
|
+
5. **workflows-js** (deterministic verbatim copy — no LLM, independent):
|
|
698
|
+
Run the `workflows-js` category (full copy) as described above: copy every
|
|
699
|
+
`.js` file from `$FORGE_ROOT/init/base-pack/workflows-js/` into
|
|
700
|
+
`.claude/workflows/` and record manifest hashes. This step has no
|
|
701
|
+
dependencies and can run alongside step 4.
|
|
702
|
+
|
|
703
|
+
This runs in a handful of serial steps instead of sequential per-category
|
|
704
|
+
passes, with all fan-outs parallelised within each step.
|
|
577
705
|
|
|
578
706
|
## Flag: `--enrich`
|
|
579
707
|
|
|
@@ -242,7 +242,7 @@ Now evaluate — **stop at the first matching row and follow only that row's act
|
|
|
242
242
|
|
|
243
243
|
| # | Condition | Action |
|
|
244
244
|
|---|-----------|--------|
|
|
245
|
-
| 1 | `REMOTE_VERSION` == `LOCAL_VERSION` and `LOCAL_VERSION` == baseline | Print "Forge {LOCAL_VERSION} — up to date. No pending migrations." Then execute **Step 4 config refresh** (paths.
|
|
245
|
+
| 1 | `REMOTE_VERSION` == `LOCAL_VERSION` and `LOCAL_VERSION` == baseline | Print "Forge {LOCAL_VERSION} — up to date. No pending migrations." Then execute **Step 4 config refresh** (paths.forgeRef, backfill) and proceed to **Step 5**. |
|
|
246
246
|
| 2 | `REMOTE_VERSION` == `LOCAL_VERSION` and `LOCAL_VERSION` != baseline | Jump to **Step 2B** (project migration — no install needed). |
|
|
247
247
|
| 3 | `IS_CANARY` is true | Jump to **Step 2B** (canary — no install needed). |
|
|
248
248
|
| 4 | `LOCAL_VERSION` > `REMOTE_VERSION` | Print "Local version ({LOCAL_VERSION}) is ahead of the release channel ({REMOTE_VERSION}). No install needed — applying any pending project migrations." then jump to **Step 2B**. |
|
|
@@ -459,27 +459,17 @@ path) — skip the re-derivation and keep the original value.
|
|
|
459
459
|
node "$FORGE_ROOT/tools/banners.cjs" --phase 4 7 "Apply migrations" forge
|
|
460
460
|
```
|
|
461
461
|
|
|
462
|
-
> **
|
|
463
|
-
>
|
|
464
|
-
> subsequent tool invocations in Step 4 (including `build-init-context.cjs` called
|
|
465
|
-
> by regeneration sub-steps) use the current, correct plugin path.
|
|
466
|
-
>
|
|
467
|
-
> **Config refresh always runs.** The Step 4 header section (forgeRoot, forgeRef,
|
|
468
|
-
> backfill) executes regardless of whether migrations are pending — even Row 1
|
|
462
|
+
> **Config refresh always runs.** The Step 4 header section (forgeRef, backfill)
|
|
463
|
+
> executes regardless of whether migrations are pending — even Row 1
|
|
469
464
|
> ("up to date") proceeds through this section before skipping to Step 5. The
|
|
470
465
|
> "skip to Step 5" directive skips only the migration chain walk and regeneration.
|
|
471
466
|
> Missing config fields can accumulate across version boundaries; backfill ensures
|
|
472
467
|
> the config stays structurally complete after every `/forge:update` invocation.
|
|
473
468
|
|
|
474
|
-
**
|
|
475
|
-
|
|
476
|
-
```sh
|
|
477
|
-
node "$FORGE_ROOT/tools/manage-config.cjs" set paths.forgeRoot "$FORGE_ROOT"
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
**Write `paths.forgeRef` (FR-010):** Also write the installed plugin version
|
|
469
|
+
**Write `paths.forgeRef` (FR-010):** Write the installed plugin version
|
|
481
470
|
as `paths.forgeRef` to config. This makes the config portable across machines —
|
|
482
|
-
`forgeRef` is a version string rather than an absolute path
|
|
471
|
+
`forgeRef` is a version string rather than an absolute path, and is used by
|
|
472
|
+
`forge-preflight.cjs` to resolve the plugin root via cache lookup:
|
|
483
473
|
|
|
484
474
|
```sh
|
|
485
475
|
LOCAL_VERSION=$(node -e "console.log(require('$FORGE_ROOT/.claude-plugin/plugin.json').version)")
|
|
@@ -491,7 +481,7 @@ required or recommended fields may have been added since the project was last
|
|
|
491
481
|
initialized. `manage-config backfill` reads the config schema, compares it
|
|
492
482
|
against the current `.forge/config.json`, and writes defaults for any missing
|
|
493
483
|
fields with schema-defined defaults. It also stamps the top-level `version`
|
|
494
|
-
field from the bundled plugin version. Run after setting
|
|
484
|
+
field from the bundled plugin version. Run after setting forgeRef:
|
|
495
485
|
|
|
496
486
|
```sh
|
|
497
487
|
node "$FORGE_ROOT/tools/manage-config.cjs" backfill --forge-root "$FORGE_ROOT"
|
|
@@ -576,12 +566,14 @@ Execute regeneration targets in this order:
|
|
|
576
566
|
| 5 | `commands` | Must run after `workflows` | — |
|
|
577
567
|
| 6 | `knowledge-base` sub-targets | — (independent) | — |
|
|
578
568
|
| 7 | `schemas` | — (independent) | **Run schema refresh inline** (see Schema Refresh below). Emit: `〇 Refreshing schemas…` |
|
|
569
|
+
| 8 | `workflows-js` | — (independent) | Deterministic verbatim copy of `.claude/workflows/*.js` from base-pack via `/forge:rebuild workflows-js` (no LLM, no placeholder substitution). |
|
|
579
570
|
|
|
580
571
|
> **Known special targets — note for migration authors:** `hooks` and `schemas` are
|
|
581
572
|
> special-cased here. Future `migrations.json` entries should only use recognised
|
|
582
573
|
> target names; using unknown bare-category targets will produce a warning and be
|
|
583
574
|
> skipped. The recognised targets are: `hooks`, `tools`, `workflows`, `templates`,
|
|
584
|
-
> `personas`, `commands`, `knowledge-base`, `skills`, `schemas`.
|
|
575
|
+
> `personas`, `commands`, `knowledge-base`, `skills`, `schemas`, `workflows-js`.
|
|
576
|
+
> `workflows-js` accepts granular sub-targets (e.g. `workflows-js:wfl-run-task`).
|
|
585
577
|
|
|
586
578
|
`commands` depends on `workflows` because command wrappers reference workflow
|
|
587
579
|
filenames. All other targets are independent and could run in parallel, but
|
|
@@ -666,16 +658,16 @@ reading and following `$FORGE_ROOT/commands/regenerate.md`:
|
|
|
666
658
|
**Category-to-command mapping:** most categories are handled by
|
|
667
659
|
`/forge:rebuild`, but the `tools` and `schemas` categories are special.
|
|
668
660
|
|
|
669
|
-
When `tools` appears in the aggregated result,
|
|
670
|
-
|
|
671
|
-
|
|
661
|
+
When `tools` appears in the aggregated result, invoke `/forge:rebuild tools`
|
|
662
|
+
to re-copy the current plugin's tools closure into `.forge/tools/`. This is
|
|
663
|
+
the actual re-vendor step — do NOT run schema refresh inline instead.
|
|
672
664
|
|
|
673
665
|
When `schemas` appears in the aggregated result, run the schema refresh inline
|
|
674
|
-
(
|
|
666
|
+
(see **Schema Refresh** section below). Do NOT delegate to the removed `/forge:update-tools` command.
|
|
675
667
|
|
|
676
668
|
### Schema Refresh
|
|
677
669
|
|
|
678
|
-
When the migration chain includes a `schemas`
|
|
670
|
+
When the migration chain includes a `schemas` target, refresh schemas inline:
|
|
679
671
|
|
|
680
672
|
```sh
|
|
681
673
|
mkdir -p .forge/schemas
|
|
@@ -1004,8 +996,18 @@ engineer_update_implementation.md → renamed to update_implementation.md
|
|
|
1004
996
|
engineer_fix_bug.md → renamed to fix_bug.md
|
|
1005
997
|
supervisor_review_plan.md → renamed to review_plan.md
|
|
1006
998
|
supervisor_review_implementation.md → renamed to review_code.md
|
|
999
|
+
orchestrate_task.md → retired (v1.2.0); orchestration runs through .claude/workflows/wfl-run-task.js
|
|
1000
|
+
run_sprint.md → retired (v1.2.0); orchestration runs through .claude/workflows/wfl-run-sprint.js
|
|
1001
|
+
fix_bug.md → retired (v1.2.0); orchestration runs through .claude/workflows/wfl-fix-bug.js
|
|
1007
1002
|
```
|
|
1008
1003
|
|
|
1004
|
+
> **Note:** `orchestrate_task.md` / `run_sprint.md` / `fix_bug.md` are LLM
|
|
1005
|
+
> orchestration prose retired in v1.2.0 — they are no longer generated, and the
|
|
1006
|
+
> deterministic JS drivers in `.claude/workflows/wfl-*.js` are the only
|
|
1007
|
+
> orchestration truth. They are listed here so `/forge:update` removes the
|
|
1008
|
+
> orphaned files from `.forge/workflows/` (the `/forge:rebuild` regeneration
|
|
1009
|
+
> only clears manifest entries, it does not delete files on disk).
|
|
1010
|
+
|
|
1009
1011
|
For each found workflow file, check manifest status:
|
|
1010
1012
|
```sh
|
|
1011
1013
|
node "$FORGE_ROOT/tools/generation-manifest.cjs" check .forge/workflows/{old-name}.md
|
|
@@ -1314,12 +1316,12 @@ Proceed to **Step 6**.
|
|
|
1314
1316
|
node "$FORGE_ROOT/tools/banners.cjs" --phase 6 7 "Record state" drift
|
|
1315
1317
|
```
|
|
1316
1318
|
|
|
1317
|
-
> **Note:** `paths.
|
|
1318
|
-
> of Step 4. Step 6 does not repeat
|
|
1319
|
+
> **Note:** `paths.forgeRef` was already written at the start
|
|
1320
|
+
> of Step 4. Step 6 does not repeat that write — it records migration state only.
|
|
1319
1321
|
|
|
1320
1322
|
**Write `.forge/update-check-cache.json`** to record the completed migration.
|
|
1321
1323
|
Read the existing file if present, update `migratedFrom`, `localVersion`,
|
|
1322
|
-
`distribution`, `
|
|
1324
|
+
`distribution`, `forgeRef`, `updateStatus`, `pendingReason`, and
|
|
1323
1325
|
`pendingMigrations`, then write it back. Use the Write or Edit tool — do not run
|
|
1324
1326
|
a shell command for this step. The `.forge/` directory always exists at this
|
|
1325
1327
|
point (it was checked earlier), so no `mkdir -p` is needed.
|
|
@@ -1330,7 +1332,6 @@ If the file does not exist, create it with:
|
|
|
1330
1332
|
"migratedFrom": "<LOCAL_VERSION>",
|
|
1331
1333
|
"localVersion": "<LOCAL_VERSION>",
|
|
1332
1334
|
"distribution": "<DISTRIBUTION>",
|
|
1333
|
-
"forgeRoot": "<FORGE_ROOT>",
|
|
1334
1335
|
"forgeRef": "<LOCAL_VERSION>",
|
|
1335
1336
|
"updateStatus": "complete",
|
|
1336
1337
|
"pendingReason": null,
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// Forge hook: preflight-session (FORGE-S27-T01 / item A1).
|
|
5
|
+
//
|
|
6
|
+
// SessionStart hook that primes the orchestrator preflight cache blob
|
|
7
|
+
// (.forge/cache/preflight-status.json) by running forge-preflight.cjs once.
|
|
8
|
+
//
|
|
9
|
+
// SCOPING NOTE: SessionStart fires BEFORE any command is invoked and its
|
|
10
|
+
// envelope carries no per-command signal, so this hook is deliberately
|
|
11
|
+
// command-name-INDEPENDENT. Authoritative scoping to run-task / fix-bug /
|
|
12
|
+
// run-sprint lives in the orchestration command-preamble path (which reads the
|
|
13
|
+
// blob). This hook only ever:
|
|
14
|
+
// - is a STRICT NO-OP when .forge/ is absent (never changes behavior for
|
|
15
|
+
// non-Forge projects or unrelated commands);
|
|
16
|
+
// - primes the blob when .forge/ is present;
|
|
17
|
+
// - is FRESHNESS-GUARDED (idempotent): if an existing blob already matches
|
|
18
|
+
// the current config mtime + MASTER_INDEX hash, it is left untouched;
|
|
19
|
+
// - FAILS OPEN: any error -> stderr warning + exit 0. A hook failure must
|
|
20
|
+
// never block session start.
|
|
21
|
+
|
|
22
|
+
process.on('uncaughtException', (err) => {
|
|
23
|
+
try { process.stderr.write(`forge preflight-session: internal error (fail-open): ${err.message}\n`); } catch (_) {}
|
|
24
|
+
process.exit(0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const fs = require('fs');
|
|
28
|
+
const path = require('path');
|
|
29
|
+
const { spawnSync } = require('child_process');
|
|
30
|
+
|
|
31
|
+
// Read + discard the envelope on fd 0 (fail-open on any parse error).
|
|
32
|
+
try { fs.readFileSync(0, 'utf8'); } catch (_) { /* envelope optional */ }
|
|
33
|
+
|
|
34
|
+
// Strict no-op when .forge/ is absent.
|
|
35
|
+
const forgeDir = path.join(process.cwd(), '.forge');
|
|
36
|
+
const configPath = path.join(forgeDir, 'config.json');
|
|
37
|
+
if (!fs.existsSync(forgeDir) || !fs.existsSync(configPath)) {
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const cacheDir = path.join(forgeDir, 'cache');
|
|
42
|
+
const blobPath = path.join(cacheDir, 'preflight-status.json');
|
|
43
|
+
|
|
44
|
+
// Freshness guard (idempotency): if the existing blob was computed from the
|
|
45
|
+
// current config mtime, leave it untouched. forge-preflight records configMtime
|
|
46
|
+
// in the blob; MASTER_INDEX changes flow through masterIndexHash, which the
|
|
47
|
+
// blob also records, but the config mtime is the cheap primary key here.
|
|
48
|
+
function configMtimeMs() {
|
|
49
|
+
try { return fs.statSync(configPath).mtimeMs; } catch (_) { return null; }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
if (fs.existsSync(blobPath)) {
|
|
54
|
+
const existing = JSON.parse(fs.readFileSync(blobPath, 'utf8'));
|
|
55
|
+
const curMtime = configMtimeMs();
|
|
56
|
+
if (existing && typeof existing.configMtime === 'number' &&
|
|
57
|
+
curMtime !== null && existing.configMtime === curMtime) {
|
|
58
|
+
// Blob is current — no rewrite, no duplicated side effect.
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} catch (_) { /* corrupt blob -> fall through and recompute */ }
|
|
63
|
+
|
|
64
|
+
// Resolve forge-preflight.cjs. Prefer CLAUDE_PLUGIN_ROOT (set by the runtime),
|
|
65
|
+
// fall back to config.paths.forgeRoot.
|
|
66
|
+
let forgeRoot = process.env.CLAUDE_PLUGIN_ROOT || null;
|
|
67
|
+
if (!forgeRoot) {
|
|
68
|
+
try {
|
|
69
|
+
const cfg = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
70
|
+
forgeRoot = cfg && cfg.paths && cfg.paths.forgeRoot;
|
|
71
|
+
} catch (_) { /* leave null */ }
|
|
72
|
+
}
|
|
73
|
+
if (!forgeRoot) process.exit(0); // cannot locate the tool — fail open
|
|
74
|
+
|
|
75
|
+
const tool = path.join(forgeRoot, 'tools', 'forge-preflight.cjs');
|
|
76
|
+
if (!fs.existsSync(tool)) process.exit(0);
|
|
77
|
+
|
|
78
|
+
// Run preflight and capture its single JSON blob.
|
|
79
|
+
const res = spawnSync('node', [tool, '--path', process.cwd()], {
|
|
80
|
+
cwd: process.cwd(),
|
|
81
|
+
encoding: 'utf8',
|
|
82
|
+
timeout: 8000,
|
|
83
|
+
});
|
|
84
|
+
if (res.status !== 0 || !res.stdout) process.exit(0); // fail open
|
|
85
|
+
|
|
86
|
+
// Validate it parses before writing — never half-write a corrupt blob.
|
|
87
|
+
let blob;
|
|
88
|
+
try { blob = JSON.parse(res.stdout); } catch (_) { process.exit(0); }
|
|
89
|
+
if (!blob || typeof blob !== 'object') process.exit(0);
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
93
|
+
// Atomic-ish write: tmp + rename so a crash never leaves a partial blob.
|
|
94
|
+
const tmpPath = blobPath + '.tmp';
|
|
95
|
+
fs.writeFileSync(tmpPath, JSON.stringify(blob, null, 2), 'utf8');
|
|
96
|
+
fs.renameSync(tmpPath, blobPath);
|
|
97
|
+
} catch (_) { /* fail open */ }
|
|
98
|
+
|
|
99
|
+
process.exit(0);
|
|
@@ -63,11 +63,24 @@ node "$FORGE_ROOT/tools/substitute-placeholders.cjs" \
|
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
Output directories (managed by the tool's `SUBDIR_OUTPUT_MAP`):
|
|
66
|
-
- `base-pack/commands/`
|
|
67
|
-
- `base-pack/personas/`
|
|
68
|
-
- `base-pack/skills/`
|
|
69
|
-
- `base-pack/workflows/`
|
|
70
|
-
- `base-pack/templates/`
|
|
66
|
+
- `base-pack/commands/` → `.claude/commands/<prefix-lowercased>/`
|
|
67
|
+
- `base-pack/personas/` → `.forge/personas/`
|
|
68
|
+
- `base-pack/skills/` → `.forge/skills/`
|
|
69
|
+
- `base-pack/workflows/` → `.forge/workflows/`
|
|
70
|
+
- `base-pack/templates/` → `.forge/templates/`
|
|
71
|
+
- `base-pack/workflows-js/` → `.claude/workflows/` (JS orchestration workflows — FORGE-S28-T01)
|
|
72
|
+
|
|
73
|
+
### Step 3a — Record generated JS workflows in the generation manifest
|
|
74
|
+
|
|
75
|
+
After `substitute-placeholders.cjs` writes the JS workflows, record them in the generation
|
|
76
|
+
manifest so `/forge:rebuild` and `/forge:health` can detect stale or missing copies:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/wfl-run-task.js
|
|
80
|
+
node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/wfl-run-sprint.js
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
If either `record` call exits non-zero, the file was not written — re-run Step 3 and retry.
|
|
71
84
|
|
|
72
85
|
If `project-context.json` is absent or missing required keys, halt Phase 3:
|
|
73
86
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
3
|
-
"generated": "2026-
|
|
2
|
+
"version": "1.2.14",
|
|
3
|
+
"generated": "2026-06-03",
|
|
4
4
|
"note": "Tamper-evident only. Authoritative source: /forge:update from remote.",
|
|
5
5
|
"files": {
|
|
6
6
|
"commands/add-pipeline.md": "529a2fc01be49815efa2cf1147528827ff1bfc12ce2ac8663b5a3a9781f8682e",
|
|
@@ -9,27 +9,28 @@
|
|
|
9
9
|
"commands/check-agent.md": "f92121cb150d4cf601654e25c28d0c13389039518d05433f1040d727054b127e",
|
|
10
10
|
"commands/config.md": "e67185f98cf0b045890398083991b9d48f32bf0d53bafda1eaca3ce0337ce49c",
|
|
11
11
|
"commands/enhance.md": "d28f6414119e84973809d32900bb7245b51f565aed86112bc7a994bc6941b547",
|
|
12
|
-
"commands/health.md": "
|
|
12
|
+
"commands/health.md": "8f8160d67c09eed9be12445674fc2ab76cf31d548c6268c71f9777dca30c4e47",
|
|
13
13
|
"commands/init.md": "cf7a70d55f718304820c310465071d3eea9d14a43131623f46b686499f630d4d",
|
|
14
|
-
"commands/rebuild.md": "
|
|
14
|
+
"commands/rebuild.md": "9de3a3c1e41169e18758c8598e297c2f395f9daefdd9772783b9b676982cf1c2",
|
|
15
15
|
"commands/remove.md": "0ca5ec94d52959afaadd74910bd2c81c9872b71c9cc1ce8b89e5af69c06b304f",
|
|
16
16
|
"commands/repair.md": "22e21614eee31ee630ead3f587b0b948b8c537e54ecef3b65e7d819c55c0ebd4",
|
|
17
17
|
"commands/report-bug.md": "af8a54bf8887b35e5c880898dd45783f6c2e80d3dc031d6479a6be613ac43053",
|
|
18
18
|
"commands/search.md": "befc4ba9f3146e7599308b35b95ec315e16895c0c18c9c2bab7549619d79bf1c",
|
|
19
19
|
"commands/status.md": "2fa82a0b11d493918781aec6d95c39411f84fa923662ff3152b6de0cc830d755",
|
|
20
|
-
"commands/update.md": "
|
|
20
|
+
"commands/update.md": "c8b69b43567fa5fc328bb3dde31f386d0f577bbcc65dafd525400ae2fb16b132",
|
|
21
21
|
"agents/store-query-validator.md": "f4c3573edcf6e28809515705362df611806a805c5269404fb17e31433cf3a81c",
|
|
22
22
|
"agents/tomoshibi.md": "0c1032df80dfc25a4f482b1276965b5318754d95ccde9f24820846d564e49a27",
|
|
23
23
|
"hooks/check-update.cjs": "9607cc0c51bedcbc123f5ea1d7a492916f29ee1f838846eec64776d5df70bbea",
|
|
24
24
|
"hooks/forge-permissions.cjs": "8de18fe7e6c9ee1751926275a37f4bb68a5a53090d366d2aa44157c106e7857e",
|
|
25
25
|
"hooks/post-init.cjs": "b05d65e7192d126733995989998a0b480604e0cc152887e6d7d0807fba3cf70d",
|
|
26
26
|
"hooks/post-sprint.cjs": "28ddbd2c49d8b746c35d23a90b02362bc684d188159536a971b2d650bb85f3a9",
|
|
27
|
+
"hooks/preflight-session.cjs": "7b1ad8f12f2a1bb94650e2b632da0ed21862071bf63f4e6452c88007be630fae",
|
|
27
28
|
"hooks/triage-error.cjs": "e47fcb81fd0f99b8ecc449b38765cdc6929bde2461b5f1727d26bc31f76bfcfa",
|
|
28
29
|
"hooks/validate-write.cjs": "3ec7bbbb2cc19f22c78da5a9e7b5031066f4b669c76a10c9f8a92a1a48fcea0a",
|
|
29
30
|
"schemas/transitions/bug.json": "27b17da42d1cebffbd4f61ab3dcd432a0017aa71997d548ed80d22c2fc3fad6a",
|
|
30
31
|
"schemas/transitions/sprint.json": "2e0a629396e687b0ca88e1814ac3e35d84533a5d55b25237ab67feddce3c9deb",
|
|
31
32
|
"schemas/transitions/task.json": "4c71849747baa0d585756e57c56325ff6219c078178374e60815dff91e25e3e7",
|
|
32
|
-
"schemas/enum-catalog.json": "
|
|
33
|
+
"schemas/enum-catalog.json": "14fa6c470292fb433a4e33503669f567bd53e3851b25000c05ddca0fdfdd6e58",
|
|
33
34
|
"tools/verify-integrity.cjs": "3ec3c970dd3d7c3001f8f373bcc40556803eadd2fc2afafb14f1c232cba4cc3f"
|
|
34
35
|
}
|
|
35
36
|
}
|
|
@@ -35,7 +35,7 @@ project config outside `.forge/store/` are fine to `read`/`grep` directly.
|
|
|
35
35
|
Never construct artifact paths manually — the tool resolves them from entity IDs.
|
|
36
36
|
- Use `forge_verify_apply` after applying edits to confirm changes landed on disk.
|
|
37
37
|
If `unchanged` is non-empty, re-apply those edits.
|
|
38
|
-
- Never `bash node
|
|
38
|
+
- Never `bash node .forge/tools/store-cli.cjs ...` — use the named MCP tool instead.
|
|
39
39
|
The tool is schema-validated and shorter.
|
|
40
40
|
- Workflow text saying `forge_store write sprint '<json>'` means: call the MCP tool
|
|
41
41
|
`forge_store` with that 2-positional shape. Not a shell command.
|
|
@@ -64,7 +64,7 @@ When generating a project-specific Architect persona, incorporate:
|
|
|
64
64
|
|
|
65
65
|
**Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
|
|
66
66
|
```bash
|
|
67
|
-
|
|
67
|
+
node .forge/tools/banners.cjs north
|
|
68
68
|
```
|
|
69
69
|
Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
|
|
70
70
|
`🗻 **{Project} Architect** — I hold the shape of the whole. I give final sign-off.`
|
|
@@ -67,7 +67,7 @@ When generating a project-specific Bug Fixer, incorporate:
|
|
|
67
67
|
|
|
68
68
|
**Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
|
|
69
69
|
```bash
|
|
70
|
-
|
|
70
|
+
node .forge/tools/banners.cjs rift
|
|
71
71
|
```
|
|
72
72
|
Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
|
|
73
73
|
`🍂 **{Project} Bug Fixer** — I find what has decayed and restore it.`
|
|
@@ -42,9 +42,9 @@ invokes the generated tool or falls back to manual collation.
|
|
|
42
42
|
|
|
43
43
|
## Preferred Method
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
Run the vendored collate tool:
|
|
46
46
|
```bash
|
|
47
|
-
node
|
|
47
|
+
node .forge/tools/collate.cjs
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
## Fallback Method
|
|
@@ -56,17 +56,17 @@ the same outputs following the collation algorithm in
|
|
|
56
56
|
## Generation Instructions
|
|
57
57
|
|
|
58
58
|
When generating a project-specific Collator, incorporate:
|
|
59
|
-
- Emit the
|
|
60
|
-
`
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
- Emit the vendored project-relative invocation exactly as shown above —
|
|
60
|
+
`node .forge/tools/collate.cjs`. The tools closure is vendored into
|
|
61
|
+
`.forge/tools/` by `/forge:rebuild`, so the path resolves at runtime
|
|
62
|
+
without any plugin-root lookup.
|
|
63
63
|
- The project's language for invoking the tool
|
|
64
64
|
- The store path (.forge/store/)
|
|
65
65
|
- The project prefix for ID formatting
|
|
66
66
|
|
|
67
67
|
**Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
|
|
68
68
|
```bash
|
|
69
|
-
|
|
69
|
+
node .forge/tools/banners.cjs drift
|
|
70
70
|
```
|
|
71
71
|
Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
|
|
72
72
|
`🍃 **{Project} Collator** — I gather what exists and arrange it into views.`
|
|
@@ -64,7 +64,7 @@ When generating a project-specific Engineer persona, incorporate:
|
|
|
64
64
|
|
|
65
65
|
**Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
|
|
66
66
|
```bash
|
|
67
|
-
|
|
67
|
+
node .forge/tools/banners.cjs forge
|
|
68
68
|
```
|
|
69
69
|
Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
|
|
70
70
|
`🌱 **{Project} Engineer** — I plan and build. I do not move forward until the code is clean.`
|
|
@@ -65,7 +65,7 @@ When generating a project-specific Orchestrator, incorporate:
|
|
|
65
65
|
|
|
66
66
|
**Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
|
|
67
67
|
```bash
|
|
68
|
-
|
|
68
|
+
node .forge/tools/banners.cjs tide
|
|
69
69
|
```
|
|
70
70
|
Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
|
|
71
71
|
`🌊 **{Project} Orchestrator** — I move tasks through their lifecycle. I do not do the work; I watch that it flows.`
|
|
@@ -86,7 +86,7 @@ When generating a project-specific Supervisor persona, incorporate:
|
|
|
86
86
|
|
|
87
87
|
**Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
|
|
88
88
|
```bash
|
|
89
|
-
|
|
89
|
+
node .forge/tools/banners.cjs oracle
|
|
90
90
|
```
|
|
91
91
|
Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
|
|
92
92
|
`🌿 **{Project} Supervisor** — I review before things move forward. I read the actual code, not the report.`
|
|
@@ -10,7 +10,7 @@ needed.
|
|
|
10
10
|
|
|
11
11
|
## Inputs
|
|
12
12
|
|
|
13
|
-
- `.forge/config.json` —
|
|
13
|
+
- `.forge/config.json` — project paths and prefix
|
|
14
14
|
- `.forge/schemas/*.schema.json` — canonical JSON Schema files (primary source)
|
|
15
15
|
- `forge/schemas/*.schema.json` — in-tree source schemas (fallback for dogfooding)
|
|
16
16
|
- CLI arguments — command, entity type, JSON payload, flags
|
|
@@ -59,7 +59,7 @@ After the subagent returns, the orchestrator constructs the event from:
|
|
|
59
59
|
The orchestrator then emits via:
|
|
60
60
|
|
|
61
61
|
```
|
|
62
|
-
node
|
|
62
|
+
node .forge/tools/store-cli.cjs emit {sprintId} '{complete-event-json}'
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
## Why no example record here
|