@entelligentsia/forgecli 0.1.0 → 0.2.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.
Files changed (128) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +50 -38
  3. package/dist/extensions/forgecli/forge-commands.d.ts +21 -0
  4. package/dist/extensions/forgecli/forge-commands.js +141 -0
  5. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  6. package/dist/extensions/forgecli/forge-init.d.ts +26 -0
  7. package/dist/extensions/forgecli/forge-init.js +916 -0
  8. package/dist/extensions/forgecli/forge-init.js.map +1 -0
  9. package/dist/extensions/forgecli/health-check.d.ts +18 -0
  10. package/dist/extensions/forgecli/health-check.js +154 -0
  11. package/dist/extensions/forgecli/health-check.js.map +1 -0
  12. package/dist/extensions/forgecli/index.js +22 -9
  13. package/dist/extensions/forgecli/index.js.map +1 -1
  14. package/dist/extensions/forgecli/init-context.d.ts +99 -0
  15. package/dist/extensions/forgecli/init-context.js +163 -0
  16. package/dist/extensions/forgecli/init-context.js.map +1 -0
  17. package/dist/extensions/forgecli/init-progress.d.ts +39 -0
  18. package/dist/extensions/forgecli/init-progress.js +117 -0
  19. package/dist/extensions/forgecli/init-progress.js.map +1 -0
  20. package/dist/extensions/forgecli/refresh-kb-links.d.ts +18 -0
  21. package/dist/extensions/forgecli/refresh-kb-links.js +228 -0
  22. package/dist/extensions/forgecli/refresh-kb-links.js.map +1 -0
  23. package/dist/forge-payload/.base-pack/commands/approve.md +22 -0
  24. package/dist/forge-payload/.base-pack/commands/collate.md +22 -0
  25. package/dist/forge-payload/.base-pack/commands/commit.md +22 -0
  26. package/dist/forge-payload/.base-pack/commands/enhance.md +37 -0
  27. package/dist/forge-payload/.base-pack/commands/fix-bug.md +22 -0
  28. package/dist/forge-payload/.base-pack/commands/implement.md +22 -0
  29. package/dist/forge-payload/.base-pack/commands/plan.md +22 -0
  30. package/dist/forge-payload/.base-pack/commands/quiz-agent.md +22 -0
  31. package/dist/forge-payload/.base-pack/commands/retrospective.md +22 -0
  32. package/dist/forge-payload/.base-pack/commands/review-code.md +22 -0
  33. package/dist/forge-payload/.base-pack/commands/review-plan.md +22 -0
  34. package/dist/forge-payload/.base-pack/commands/run-sprint.md +22 -0
  35. package/dist/forge-payload/.base-pack/commands/run-task.md +22 -0
  36. package/dist/forge-payload/.base-pack/commands/sprint-intake.md +22 -0
  37. package/dist/forge-payload/.base-pack/commands/sprint-plan.md +22 -0
  38. package/dist/forge-payload/.base-pack/commands/validate.md +22 -0
  39. package/dist/forge-payload/.claude-plugin/plugin.json +15 -0
  40. package/dist/forge-payload/.init/discovery/discover-database.md +32 -0
  41. package/dist/forge-payload/.init/discovery/discover-processes.md +31 -0
  42. package/dist/forge-payload/.init/discovery/discover-routing.md +31 -0
  43. package/dist/forge-payload/.init/discovery/discover-stack.md +33 -0
  44. package/dist/forge-payload/.init/discovery/discover-testing.md +34 -0
  45. package/dist/forge-payload/.init/generation/generate-kb-doc.md +60 -0
  46. package/dist/forge-payload/.schemas/bug.schema.json +53 -0
  47. package/dist/forge-payload/.schemas/collation-state.schema.json +16 -0
  48. package/dist/forge-payload/.schemas/event-sidecar.schema.json +22 -0
  49. package/dist/forge-payload/.schemas/event.schema.json +32 -0
  50. package/dist/forge-payload/.schemas/feature.schema.json +22 -0
  51. package/dist/forge-payload/.schemas/progress-entry.schema.json +16 -0
  52. package/dist/forge-payload/.schemas/project-context.schema.json +167 -0
  53. package/dist/forge-payload/.schemas/project-overlay.schema.json +25 -0
  54. package/dist/forge-payload/.schemas/sprint.schema.json +27 -0
  55. package/dist/forge-payload/.schemas/structure-versions.schema.json +57 -0
  56. package/dist/forge-payload/.schemas/task.schema.json +58 -0
  57. package/dist/forge-payload/.tools/banners.cjs +435 -0
  58. package/dist/forge-payload/.tools/build-context-pack.cjs +290 -0
  59. package/dist/forge-payload/.tools/build-init-context.cjs +322 -0
  60. package/dist/forge-payload/.tools/build-overlay.cjs +326 -0
  61. package/dist/forge-payload/.tools/build-persona-pack.cjs +226 -0
  62. package/dist/forge-payload/.tools/collate.cjs +1041 -0
  63. package/dist/forge-payload/.tools/generation-manifest.cjs +311 -0
  64. package/dist/forge-payload/.tools/lib/forge-root.cjs +59 -0
  65. package/dist/forge-payload/.tools/lib/paths.cjs +29 -0
  66. package/dist/forge-payload/.tools/lib/pricing.cjs +165 -0
  67. package/dist/forge-payload/.tools/lib/project-root.cjs +32 -0
  68. package/dist/forge-payload/.tools/lib/result.js +40 -0
  69. package/dist/forge-payload/.tools/lib/validate.js +131 -0
  70. package/dist/forge-payload/.tools/manage-config.cjs +340 -0
  71. package/dist/forge-payload/.tools/manage-versions.cjs +365 -0
  72. package/dist/forge-payload/.tools/seed-store.cjs +237 -0
  73. package/dist/forge-payload/.tools/store-cli.cjs +1123 -0
  74. package/dist/forge-payload/.tools/store.cjs +315 -0
  75. package/dist/forge-payload/.tools/substitute-placeholders.cjs +625 -0
  76. package/dist/forge-payload/.tools/validate-store.cjs +522 -0
  77. package/package.json +1 -1
  78. /package/dist/forge-payload/{personas → .base-pack/personas}/architect.md +0 -0
  79. /package/dist/forge-payload/{personas → .base-pack/personas}/bug-fixer.md +0 -0
  80. /package/dist/forge-payload/{personas → .base-pack/personas}/collator.md +0 -0
  81. /package/dist/forge-payload/{personas → .base-pack/personas}/engineer.md +0 -0
  82. /package/dist/forge-payload/{personas → .base-pack/personas}/librarian.md +0 -0
  83. /package/dist/forge-payload/{personas → .base-pack/personas}/orchestrator.md +0 -0
  84. /package/dist/forge-payload/{personas → .base-pack/personas}/product-manager.md +0 -0
  85. /package/dist/forge-payload/{personas → .base-pack/personas}/qa-engineer.md +0 -0
  86. /package/dist/forge-payload/{personas → .base-pack/personas}/supervisor.md +0 -0
  87. /package/dist/forge-payload/{skills → .base-pack/skills}/architect-skills.md +0 -0
  88. /package/dist/forge-payload/{skills → .base-pack/skills}/bug-fixer-skills.md +0 -0
  89. /package/dist/forge-payload/{skills → .base-pack/skills}/collator-skills.md +0 -0
  90. /package/dist/forge-payload/{skills → .base-pack/skills}/engineer-skills.md +0 -0
  91. /package/dist/forge-payload/{skills → .base-pack/skills}/generic-skills.md +0 -0
  92. /package/dist/forge-payload/{skills → .base-pack/skills}/librarian-skills.md +0 -0
  93. /package/dist/forge-payload/{skills → .base-pack/skills}/qa-engineer-skills.md +0 -0
  94. /package/dist/forge-payload/{skills → .base-pack/skills}/store-custodian-skills.md +0 -0
  95. /package/dist/forge-payload/{skills → .base-pack/skills}/supervisor-skills.md +0 -0
  96. /package/dist/forge-payload/{templates → .base-pack/templates}/CODE_REVIEW_TEMPLATE.md +0 -0
  97. /package/dist/forge-payload/{templates → .base-pack/templates}/COST_REPORT_TEMPLATE.md +0 -0
  98. /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_REVIEW_TEMPLATE.md +0 -0
  99. /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_SUMMARY_TEMPLATE.json +0 -0
  100. /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_TEMPLATE.md +0 -0
  101. /package/dist/forge-payload/{templates → .base-pack/templates}/PROGRESS_TEMPLATE.md +0 -0
  102. /package/dist/forge-payload/{templates → .base-pack/templates}/RETROSPECTIVE_TEMPLATE.md +0 -0
  103. /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_MANIFEST_TEMPLATE.md +0 -0
  104. /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_REQUIREMENTS_TEMPLATE.md +0 -0
  105. /package/dist/forge-payload/{templates → .base-pack/templates}/TASK_PROMPT_TEMPLATE.md +0 -0
  106. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/context-injection.md +0 -0
  107. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/event-emission-schema.md +0 -0
  108. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/finalize.md +0 -0
  109. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/progress-reporting.md +0 -0
  110. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_approve.md +0 -0
  111. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_review_sprint_completion.md +0 -0
  112. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_intake.md +0 -0
  113. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_plan.md +0 -0
  114. /package/dist/forge-payload/{workflows → .base-pack/workflows}/collator_agent.md +0 -0
  115. /package/dist/forge-payload/{workflows → .base-pack/workflows}/commit_task.md +0 -0
  116. /package/dist/forge-payload/{workflows → .base-pack/workflows}/fix_bug.md +0 -0
  117. /package/dist/forge-payload/{workflows → .base-pack/workflows}/implement_plan.md +0 -0
  118. /package/dist/forge-payload/{workflows → .base-pack/workflows}/migrate_structural.md +0 -0
  119. /package/dist/forge-payload/{workflows → .base-pack/workflows}/orchestrate_task.md +0 -0
  120. /package/dist/forge-payload/{workflows → .base-pack/workflows}/plan_task.md +0 -0
  121. /package/dist/forge-payload/{workflows → .base-pack/workflows}/quiz_agent.md +0 -0
  122. /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_code.md +0 -0
  123. /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_plan.md +0 -0
  124. /package/dist/forge-payload/{workflows → .base-pack/workflows}/run_sprint.md +0 -0
  125. /package/dist/forge-payload/{workflows → .base-pack/workflows}/sprint_retrospective.md +0 -0
  126. /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_implementation.md +0 -0
  127. /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_plan.md +0 -0
  128. /package/dist/forge-payload/{workflows → .base-pack/workflows}/validate_task.md +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,58 @@ All notable changes to `@entelligentsia/forgecli` are documented here.
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.0] — 2026-05-09
9
+
10
+ Headline: `/forge:init` is now a real implementation. The 0.1.0 stub at
11
+ `src/extensions/forgecli/index.ts:77-82` is replaced with a full-parity port of
12
+ the Claude-Code plugin's `/forge:init` flow. Default payload trimmed by 35.8%
13
+ unpacked. Tarball size-budget gate enforced in smoke + CI.
14
+
15
+ ### Added
16
+
17
+ - **`/forge:init` real implementation** (FORGE-S17-T02). Full parity to the
18
+ plugin: 4-phase flow, `--fast` / `--full` flags, resume detection via
19
+ `.forge/init-progress.json`, hero banner with project-name discovery, idempotent
20
+ re-run. Consumes `dist/forge-payload/`, substitutes placeholders against user
21
+ project context, writes `.forge/{personas,skills,workflows,templates,config.json,project-context.json}`.
22
+ - **Tarball size-budget gate** (FORGE-S17-T05) at
23
+ `test/e2e/lib/tarball-size-gate.sh` (sourceable) plus
24
+ `test/e2e/size-budget.test.sh` (18 boundary assertions). Smoke gate runs after
25
+ `npm pack` with PASS / WARN (>35 MB) / FAIL (>50 MB) status. Thresholds
26
+ env-overridable via `FORGE_TARBALL_SIZE_*`.
27
+ - **`scripts/build-payload.cjs --include-full`** flag and `--help`
28
+ (FORGE-S17-T04). Opt-in to the legacy un-trimmed payload for forensic /
29
+ round-trip verification — round-trip verified byte-exact.
30
+ - **Mid-sprint runtime fixes** (FORGE-BUG-017..025) — `/forge:init` runtime
31
+ defects discovered during init-port adaptation review; pi-aware
32
+ `paths.forgeRoot`; skip Claude-Code-only command output during init.
33
+
34
+ ### Changed
35
+
36
+ - **Default payload trimmed by 35.8% unpacked** (FORGE-S17-T03 audit applied
37
+ by FORGE-S17-T04). Files 175 → 105, unpacked 704,388 → 452,445 bytes,
38
+ forge-payload tar.gz 194,067 → 123,505 bytes (−36.4%). Trim sites:
39
+ - top-level `personas/skills/workflows/templates/` removed (Pass 1 vestige,
40
+ never read at runtime),
41
+ - `.tools/lib/` allowlisted to runtime-loaded subset
42
+ (`forge-root, paths, pricing, project-root, result.js, validate.js`),
43
+ - `.init/generation/` reduced to `generate-kb-doc.md`,
44
+ - `.schemas/` reduced to `*.schema.json`.
45
+ - **Full `npm pack` output** (the published artifact, with bundled pi runtime
46
+ as bulk): 30.42 MB compressed, 19.58 MB headroom under the 50 MB hard gate.
47
+
48
+ ### Documentation
49
+
50
+ - README updated with size-budget tuning surface and trimmed-payload note.
51
+
52
+ ### Bundled / pinned (unchanged from 0.1.0)
53
+
54
+ - `@earendil-works/pi-coding-agent@0.74.0`,
55
+ `@earendil-works/pi-ai@0.74.0`,
56
+ `@earendil-works/pi-tui@0.74.0` via `bundledDependencies`.
57
+ - `forge.bundledVersion: 0.40.3` (`Entelligentsia/forge@v0.40.3`) — drift audit
58
+ clean, no upstream movement during sprint.
59
+
8
60
  ## [0.1.0] — 2026-05-08
9
61
 
10
62
  First public stable release of `@entelligentsia/forgecli` — the Forge SDLC
package/README.md CHANGED
@@ -1,52 +1,64 @@
1
- # forgecli
1
+ ## @entelligentsia/forgecli
2
2
 
3
- **Status:** Stage 1 scaffold (FORGE-S15-T01). No runtime logic yet.
3
+ Forge SDLC on the [pi-coding-agent](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) runtime. Three bin aliases: `forge`, `forgecli`, `4ge`.
4
4
 
5
- `forgecli` is the TypeScript port of the Forge SDLC plugin, packaged as a `pi-coding-agent` extension. It will eventually expose the same workflows, personas, and tools that live in the Claude Code Forge plugin (`forge/`), but on the pi runtime.
5
+ Bundled Forge plugin: **v0.40.3**.
6
+ Bundled pi runtime: pinned in `package.json`.
6
7
 
7
- ## Layout
8
+ ## Install
8
9
 
10
+ ```sh
11
+ npm install -g @entelligentsia/forgecli
9
12
  ```
10
- forge-cli/
11
- ├── package.json ← name "forgecli", ESM, peer dep on @earendil-works/pi-coding-agent ^0.73.0
12
- ├── tsconfig.json ← strict, NodeNext, ES2022, outDir dist/
13
- ├── biome.json ← mirrors pi-mono conventions
14
- ├── src/
15
- │ ├── extensions/forgecli/
16
- │ │ ├── index.ts ← extension entrypoint (no-op stub)
17
- │ │ ├── forge-tools.ts ← tool registration shim
18
- │ │ ├── forge-commands.ts command registration shim
19
- │ │ ├── hook-dispatcher.ts← hook routing shim
20
- │ │ ├── forge-root.ts ← .forge/config.json resolver stub
21
- │ │ └── subagent/ ← T02 vendors pi-mono subagent module here
22
- │ └── bin/forgecli.ts ← CLI entry stub (real impl in T03)
23
- ├── agents/ ← reserved for generated agents
24
- ├── prompts/ ← reserved for generated prompts
25
- ├── skills/ ← reserved for skill defs
26
- └── test/poc/ ← spike tests for T04–T09
13
+
14
+ Requires Node 20+.
15
+
16
+ ## Quick start
17
+
18
+ ```sh
19
+ cd your-project
20
+ forge # launch interactive session (forge | forgecli | 4ge)
21
+ > /forge:init # bootstrap Forge SDLC — 4 phases, ~45s
27
22
  ```
28
23
 
29
- ## Reference
24
+ `/forge:init` is idempotent and resumable via `.forge/init-progress.json`. Re-running picks up where the previous run stopped.
30
25
 
31
- - `architectural-review.md` (sibling of this README) — design decisions and constraints.
32
- - `forge-cli-feasibility.txt` — feasibility study and PoC notes.
33
- - `.claude/skills/forge-cli-engineer/SKILL.md` — implementer skill (boundary rules, git protocol).
26
+ ## What `/forge:init` does
34
27
 
35
- ## Next steps
28
+ 1. **Collect** — 5 parallel discovery scans → `.forge/config.json`
29
+ 2. **Discover** — KB doc generation + `.forge/project-context.json`
30
+ 3. **Materialize** — substitute placeholders → fully functional workflows
31
+ 4. **Register** — versioning, manifest, cache, store entries
36
32
 
37
- | Task | What lands |
38
- |---|---|
39
- | FORGE-S15-T02 | Vendor subagent module from pi-mono |
40
- | FORGE-S15-T03 | No-op extension entrypoint + `pi -e` smoke load |
41
- | FORGE-S15-T04–T09 | Spike R1–R6 PoCs |
42
- | FORGE-S15-T10 | Stage 2 gate |
33
+ Outputs land in `.forge/{personas,skills,workflows,templates,config.json,project-context.json}` and the configured KB folder (default `engineering/`).
43
34
 
44
- ## Build / verify (Stage 1)
35
+ ## CLI flags
45
36
 
46
- ```bash
47
- cd forge-cli
48
- npm install
49
- npx tsc --noEmit
50
37
  ```
38
+ forge --version Print version triplet (forgecli, forge, pi)
39
+ forge --help Show forge + pi help
40
+ forge --no-update-check Skip update check
41
+ forge --registry <path> Override model registry
42
+ ```
43
+
44
+ Pi flags (`-p`, `--cwd`, `--session`, `--model`, `--tools`, `--thinking`, …) are forwarded verbatim. Run `forge --help` for the full list.
45
+
46
+ ## Roadmap
47
+
48
+ | Command | Status |
49
+ |---------------------------|---------------------|
50
+ | `/forge:init` | Shipped (0.2.0) |
51
+ | Other `/forge:*` commands | Roadmap |
52
+
53
+ Track via [issues](https://github.com/Entelligentsia/forge-cli/issues).
54
+
55
+ ## Links
56
+
57
+ - Source: <https://github.com/Entelligentsia/forge-cli>
58
+ - Issues: <https://github.com/Entelligentsia/forge-cli/issues>
59
+ - Forge plugin (Claude Code): <https://github.com/Entelligentsia/forge>
60
+ - Changelog: [CHANGELOG.md](./CHANGELOG.md)
61
+
62
+ ## License
51
63
 
52
- No runtime entrypoint is wired up yet `npm run lint` and `npx tsc --noEmit` are the only meaningful verifications at this stage.
64
+ MITsee [LICENSE](./LICENSE).
@@ -7,8 +7,29 @@ interface RegisterOptions {
7
7
  }
8
8
  declare function resetTomoshibiState(): void;
9
9
  export declare function registerForgeCommands(pi: ExtensionAPI, options: RegisterOptions): void;
10
+ /** Parse YAML frontmatter from a markdown file. Returns name and description or null. */
11
+ declare function parseFrontmatter(content: string): {
12
+ name: string;
13
+ description: string;
14
+ } | null;
15
+ export interface RegisterAllOptions {
16
+ /** Absolute path to dist/forge-payload/ (containing .base-pack/commands/). */
17
+ bundlePayloadRoot: string;
18
+ /** Current working directory (for health check). */
19
+ cwd?: string;
20
+ /** Absolute path to dist/forge-payload/ for health check bundle root. */
21
+ bundleRoot?: string;
22
+ }
23
+ /**
24
+ * Register all forge commands from the bundled .base-pack/commands/ directory.
25
+ * Commands already registered (real handlers) are skipped.
26
+ * Returns the number of commands registered.
27
+ */
28
+ export declare function registerAllForgeCommands(pi: ExtensionAPI, options: RegisterAllOptions): number;
10
29
  export declare const __test__: {
11
30
  resetTomoshibiState: typeof resetTomoshibiState;
12
31
  getTomoshibiPending: () => boolean;
32
+ parseFrontmatter: typeof parseFrontmatter;
33
+ REAL_HANDLERS: Set<string>;
13
34
  };
14
35
  export {};
@@ -13,8 +13,18 @@
13
13
  // Q14 contract: every command except /forge:init no-ops gracefully
14
14
  // outside a Forge project with a notify pointing at /forge:init.
15
15
  // /forge:init is registered in index.ts (unconditional, AC#4 from T02).
16
+ //
17
+ // Phase G (FORGE-S17-T02): registerAllForgeCommands enumerates every
18
+ // *.md under dist/forge-payload/.base-pack/commands/ and registers each
19
+ // as a pi command. Real handlers for init/health/refresh-kb-links are
20
+ // wired separately; all others emit advisory stubs.
21
+ import * as fsSync from "node:fs";
16
22
  import { promises as fs } from "node:fs";
17
23
  import * as path from "node:path";
24
+ import { fileURLToPath } from "node:url";
25
+ import { runRefreshKbLinks } from "./refresh-kb-links.js";
26
+ // Resolve the package root for bundle path resolution
27
+ const _PKG_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
18
28
  // Tomoshibi gate — flipped true by /forge:ask, consumed by the
19
29
  // before_agent_start handler on the next turn. Module-private state is
20
30
  // safe under pi turn semantics: pi serialises agent turns, so the gate
@@ -131,10 +141,141 @@ export function registerForgeCommands(pi, options) {
131
141
  },
132
142
  });
133
143
  }
144
+ // ── Phase G: registerAllForgeCommands (FORGE-S17-T02) ─────────────────────
145
+ // Enumerate every *.md under dist/forge-payload/.base-pack/commands/ at
146
+ // runtime, parse YAML frontmatter (name + description), and register each
147
+ // via pi.registerCommand(). Real handlers for init/health/refresh-kb-links
148
+ // are deferred to their dedicated modules (called before this function).
149
+ // All remaining commands get advisory stub handlers.
150
+ //
151
+ // This function is called AFTER registerForgeInit(pi) and registerForgeCommands()
152
+ // so that real handlers (registered first) are not overwritten.
153
+ /** Parse YAML frontmatter from a markdown file. Returns name and description or null. */
154
+ function parseFrontmatter(content) {
155
+ if (!content.startsWith("---"))
156
+ return null;
157
+ const end = content.indexOf("---", 3);
158
+ if (end === -1)
159
+ return null;
160
+ const block = content.slice(3, end);
161
+ let name = "";
162
+ let description = "";
163
+ for (const line of block.split("\n")) {
164
+ const m = line.match(/^(\w+):\s*(.+)$/);
165
+ if (!m)
166
+ continue;
167
+ if (m[1] === "name")
168
+ name = m[2].trim();
169
+ if (m[1] === "description")
170
+ description = m[2].trim();
171
+ }
172
+ if (!name)
173
+ return null;
174
+ return { name, description };
175
+ }
176
+ /** Commands that have real handlers registered by other modules OR explicitly by registerAllForgeCommands. */
177
+ const REAL_HANDLERS = new Set([
178
+ "forge:init",
179
+ "forge:health",
180
+ "forge:ask",
181
+ "forge:config",
182
+ "forge:status",
183
+ "forge:update",
184
+ "forge:refresh-kb-links",
185
+ "forge:enhance",
186
+ ]);
187
+ /**
188
+ * Register all forge commands from the bundled .base-pack/commands/ directory.
189
+ * Commands already registered (real handlers) are skipped.
190
+ * Returns the number of commands registered.
191
+ */
192
+ export function registerAllForgeCommands(pi, options) {
193
+ const commandsDir = path.join(options.bundlePayloadRoot, ".base-pack", "commands");
194
+ let commandFiles;
195
+ try {
196
+ commandFiles = fsSync.readdirSync(commandsDir).filter((f) => f.endsWith(".md"));
197
+ }
198
+ catch {
199
+ // .base-pack not yet built — skip gracefully
200
+ return 0;
201
+ }
202
+ let registered = 0;
203
+ for (const file of commandFiles) {
204
+ const filePath = path.join(commandsDir, file);
205
+ let content;
206
+ try {
207
+ content = fsSync.readFileSync(filePath, "utf8");
208
+ }
209
+ catch {
210
+ continue;
211
+ }
212
+ const meta = parseFrontmatter(content);
213
+ if (!meta)
214
+ continue;
215
+ const commandName = `forge:${meta.name}`;
216
+ // Skip commands that already have real handlers
217
+ if (REAL_HANDLERS.has(commandName))
218
+ continue;
219
+ // Register stub
220
+ const capturedName = commandName;
221
+ pi.registerCommand(capturedName, {
222
+ description: meta.description || `Forge: ${meta.name}`,
223
+ async handler(_args, ctx) {
224
+ ctx.ui.notify(`〇 ${capturedName} — full implementation in S18+.`, "info");
225
+ },
226
+ });
227
+ registered++;
228
+ }
229
+ // Register /forge:refresh-kb-links with real handler (Phase G)
230
+ const capturedCwd = options.cwd ?? process.cwd();
231
+ pi.registerCommand("forge:refresh-kb-links", {
232
+ description: "Refresh Forge KB and workflow links in agent instruction files",
233
+ async handler(_args, ctx) {
234
+ ctx.ui.setStatus?.("forge:refresh-kb-links", "Refreshing KB links…");
235
+ try {
236
+ const result = await runRefreshKbLinks(capturedCwd);
237
+ for (const msg of result.messages) {
238
+ ctx.ui.notify(msg, "info");
239
+ }
240
+ if (result.filesUpdated === 0 && result.filesSkipped > 0) {
241
+ ctx.ui.notify("forge:refresh-kb-links — all agent instruction files already up to date.", "info");
242
+ }
243
+ }
244
+ catch (err) {
245
+ const e = err;
246
+ ctx.ui.notify(`forge:refresh-kb-links error: ${e.message ?? "unknown"}`, "error");
247
+ }
248
+ finally {
249
+ ctx.ui.setStatus?.("forge:refresh-kb-links", undefined);
250
+ }
251
+ },
252
+ });
253
+ // Register /forge:enhance stub with sentinel (PLAN sub-decision #4)
254
+ pi.registerCommand("forge:enhance", {
255
+ description: "Progressive project-specific enrichment of structural elements",
256
+ async handler(_args, ctx) {
257
+ const sentinelPath = path.join(capturedCwd, ".forge", "cache", "post-init-enhancement-triggered");
258
+ const sentinelExists = fsSync.existsSync(sentinelPath);
259
+ ctx.ui.notify(`〇 forge:enhance — full implementation in S18+. ${sentinelExists ? "Sentinel already written." : "Sentinel written; auto-trigger will fire when it lands."}`, "info");
260
+ if (!sentinelExists) {
261
+ try {
262
+ fsSync.mkdirSync(path.dirname(sentinelPath), { recursive: true });
263
+ fsSync.writeFileSync(sentinelPath, new Date().toISOString() + "\n", "utf8");
264
+ }
265
+ catch {
266
+ // non-fatal
267
+ }
268
+ }
269
+ },
270
+ });
271
+ return registered;
272
+ }
134
273
  // ── Test helpers ─────────────────────────────────────────────────────────────
135
274
  // Internal — exported only for unit tests. Not part of the public API.
136
275
  export const __test__ = {
137
276
  resetTomoshibiState,
138
277
  getTomoshibiPending: () => tomoshibiPending,
278
+ parseFrontmatter,
279
+ REAL_HANDLERS,
139
280
  };
140
281
  //# sourceMappingURL=forge-commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forge-commands.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/forge-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forge-commands.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/forge-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ /** Get the bundled forge-payload root (dist/forge-payload/) */
3
+ export declare function getBundledPayloadRoot(): string;
4
+ /** Get the bundled tools directory (dist/forge-payload/.tools/) */
5
+ export declare function getBundledToolsRoot(): string;
6
+ /**
7
+ * Resolve the absolute path to dist/forge-payload/.tools and validate it
8
+ * contains store-cli.cjs. Throws if the directory is missing or incomplete.
9
+ * Exported for test access and for Phase-4 pi-aware forgeRoot stamp.
10
+ */
11
+ export declare function resolveBundleToolsRoot(): string;
12
+ /**
13
+ * Detect pi runtime. forge-init.ts is only ever called from the forgecli pi
14
+ * extension (registerForgeInit is invoked during extension load by pi). There
15
+ * is no Claude Code execution path. Therefore this always returns true.
16
+ *
17
+ * We keep the guard explicit rather than hardcoding `true` so that if a future
18
+ * Claude Code path is added it is obvious where to insert the condition.
19
+ *
20
+ * Heuristic: PI_CODING_AGENT_DIR env set → definitely pi. Otherwise assume pi
21
+ * (our only caller). Only false if explicitly opted-out via env flag in a
22
+ * hypothetical future Claude Code integration.
23
+ * Exported for test access.
24
+ */
25
+ export declare function isPiRuntime(): boolean;
26
+ export declare function registerForgeInit(pi: ExtensionAPI): void;