@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.
- package/CHANGELOG.md +52 -0
- package/README.md +50 -38
- package/dist/extensions/forgecli/forge-commands.d.ts +21 -0
- package/dist/extensions/forgecli/forge-commands.js +141 -0
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-init.d.ts +26 -0
- package/dist/extensions/forgecli/forge-init.js +916 -0
- package/dist/extensions/forgecli/forge-init.js.map +1 -0
- package/dist/extensions/forgecli/health-check.d.ts +18 -0
- package/dist/extensions/forgecli/health-check.js +154 -0
- package/dist/extensions/forgecli/health-check.js.map +1 -0
- package/dist/extensions/forgecli/index.js +22 -9
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/init-context.d.ts +99 -0
- package/dist/extensions/forgecli/init-context.js +163 -0
- package/dist/extensions/forgecli/init-context.js.map +1 -0
- package/dist/extensions/forgecli/init-progress.d.ts +39 -0
- package/dist/extensions/forgecli/init-progress.js +117 -0
- package/dist/extensions/forgecli/init-progress.js.map +1 -0
- package/dist/extensions/forgecli/refresh-kb-links.d.ts +18 -0
- package/dist/extensions/forgecli/refresh-kb-links.js +228 -0
- package/dist/extensions/forgecli/refresh-kb-links.js.map +1 -0
- package/dist/forge-payload/.base-pack/commands/approve.md +22 -0
- package/dist/forge-payload/.base-pack/commands/collate.md +22 -0
- package/dist/forge-payload/.base-pack/commands/commit.md +22 -0
- package/dist/forge-payload/.base-pack/commands/enhance.md +37 -0
- package/dist/forge-payload/.base-pack/commands/fix-bug.md +22 -0
- package/dist/forge-payload/.base-pack/commands/implement.md +22 -0
- package/dist/forge-payload/.base-pack/commands/plan.md +22 -0
- package/dist/forge-payload/.base-pack/commands/quiz-agent.md +22 -0
- package/dist/forge-payload/.base-pack/commands/retrospective.md +22 -0
- package/dist/forge-payload/.base-pack/commands/review-code.md +22 -0
- package/dist/forge-payload/.base-pack/commands/review-plan.md +22 -0
- package/dist/forge-payload/.base-pack/commands/run-sprint.md +22 -0
- package/dist/forge-payload/.base-pack/commands/run-task.md +22 -0
- package/dist/forge-payload/.base-pack/commands/sprint-intake.md +22 -0
- package/dist/forge-payload/.base-pack/commands/sprint-plan.md +22 -0
- package/dist/forge-payload/.base-pack/commands/validate.md +22 -0
- package/dist/forge-payload/.claude-plugin/plugin.json +15 -0
- package/dist/forge-payload/.init/discovery/discover-database.md +32 -0
- package/dist/forge-payload/.init/discovery/discover-processes.md +31 -0
- package/dist/forge-payload/.init/discovery/discover-routing.md +31 -0
- package/dist/forge-payload/.init/discovery/discover-stack.md +33 -0
- package/dist/forge-payload/.init/discovery/discover-testing.md +34 -0
- package/dist/forge-payload/.init/generation/generate-kb-doc.md +60 -0
- package/dist/forge-payload/.schemas/bug.schema.json +53 -0
- package/dist/forge-payload/.schemas/collation-state.schema.json +16 -0
- package/dist/forge-payload/.schemas/event-sidecar.schema.json +22 -0
- package/dist/forge-payload/.schemas/event.schema.json +32 -0
- package/dist/forge-payload/.schemas/feature.schema.json +22 -0
- package/dist/forge-payload/.schemas/progress-entry.schema.json +16 -0
- package/dist/forge-payload/.schemas/project-context.schema.json +167 -0
- package/dist/forge-payload/.schemas/project-overlay.schema.json +25 -0
- package/dist/forge-payload/.schemas/sprint.schema.json +27 -0
- package/dist/forge-payload/.schemas/structure-versions.schema.json +57 -0
- package/dist/forge-payload/.schemas/task.schema.json +58 -0
- package/dist/forge-payload/.tools/banners.cjs +435 -0
- package/dist/forge-payload/.tools/build-context-pack.cjs +290 -0
- package/dist/forge-payload/.tools/build-init-context.cjs +322 -0
- package/dist/forge-payload/.tools/build-overlay.cjs +326 -0
- package/dist/forge-payload/.tools/build-persona-pack.cjs +226 -0
- package/dist/forge-payload/.tools/collate.cjs +1041 -0
- package/dist/forge-payload/.tools/generation-manifest.cjs +311 -0
- package/dist/forge-payload/.tools/lib/forge-root.cjs +59 -0
- package/dist/forge-payload/.tools/lib/paths.cjs +29 -0
- package/dist/forge-payload/.tools/lib/pricing.cjs +165 -0
- package/dist/forge-payload/.tools/lib/project-root.cjs +32 -0
- package/dist/forge-payload/.tools/lib/result.js +40 -0
- package/dist/forge-payload/.tools/lib/validate.js +131 -0
- package/dist/forge-payload/.tools/manage-config.cjs +340 -0
- package/dist/forge-payload/.tools/manage-versions.cjs +365 -0
- package/dist/forge-payload/.tools/seed-store.cjs +237 -0
- package/dist/forge-payload/.tools/store-cli.cjs +1123 -0
- package/dist/forge-payload/.tools/store.cjs +315 -0
- package/dist/forge-payload/.tools/substitute-placeholders.cjs +625 -0
- package/dist/forge-payload/.tools/validate-store.cjs +522 -0
- package/package.json +1 -1
- /package/dist/forge-payload/{personas → .base-pack/personas}/architect.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/bug-fixer.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/collator.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/engineer.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/librarian.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/orchestrator.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/product-manager.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/qa-engineer.md +0 -0
- /package/dist/forge-payload/{personas → .base-pack/personas}/supervisor.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/architect-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/bug-fixer-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/collator-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/engineer-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/generic-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/librarian-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/qa-engineer-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/store-custodian-skills.md +0 -0
- /package/dist/forge-payload/{skills → .base-pack/skills}/supervisor-skills.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/CODE_REVIEW_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/COST_REPORT_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_REVIEW_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_SUMMARY_TEMPLATE.json +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/PROGRESS_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/RETROSPECTIVE_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_MANIFEST_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_REQUIREMENTS_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{templates → .base-pack/templates}/TASK_PROMPT_TEMPLATE.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/context-injection.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/event-emission-schema.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/finalize.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/progress-reporting.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_approve.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_review_sprint_completion.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_intake.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_plan.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/collator_agent.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/commit_task.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/fix_bug.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/implement_plan.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/migrate_structural.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/orchestrate_task.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/plan_task.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/quiz_agent.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_code.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_plan.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/run_sprint.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/sprint_retrospective.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_implementation.md +0 -0
- /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_plan.md +0 -0
- /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
|
-
|
|
1
|
+
## @entelligentsia/forgecli
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
5
|
+
Bundled Forge plugin: **v0.40.3**.
|
|
6
|
+
Bundled pi runtime: pinned in `package.json`.
|
|
6
7
|
|
|
7
|
-
##
|
|
8
|
+
## Install
|
|
8
9
|
|
|
10
|
+
```sh
|
|
11
|
+
npm install -g @entelligentsia/forgecli
|
|
9
12
|
```
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
24
|
+
`/forge:init` is idempotent and resumable via `.forge/init-progress.json`. Re-running picks up where the previous run stopped.
|
|
30
25
|
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
64
|
+
MIT — see [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":"AAAA,2DAA2D;AAC3D,EAAE;AACF,4DAA4D;AAC5D,iEAAiE;AACjE,sEAAsE;AACtE,qEAAqE;AACrE,qEAAqE;AACrE,qEAAqE;AACrE,wCAAwC;AACxC,iEAAiE;AACjE,wDAAwD;AACxD,EAAE;AACF,mEAAmE;AACnE,iEAAiE;AACjE,wEAAwE;
|
|
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;
|