@entelligentsia/forgecli 0.1.0 → 0.3.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 (144) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/README.md +177 -38
  3. package/dist/bin/argv.js +5 -0
  4. package/dist/bin/argv.js.map +1 -1
  5. package/dist/bin/forge.js +1 -0
  6. package/dist/bin/forge.js.map +1 -1
  7. package/dist/extensions/forgecli/ask-user-tool.d.ts +17 -0
  8. package/dist/extensions/forgecli/ask-user-tool.js +139 -0
  9. package/dist/extensions/forgecli/ask-user-tool.js.map +1 -0
  10. package/dist/extensions/forgecli/forge-commands.d.ts +21 -0
  11. package/dist/extensions/forgecli/forge-commands.js +141 -0
  12. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  13. package/dist/extensions/forgecli/forge-init.d.ts +26 -0
  14. package/dist/extensions/forgecli/forge-init.js +948 -0
  15. package/dist/extensions/forgecli/forge-init.js.map +1 -0
  16. package/dist/extensions/forgecli/health-check.d.ts +18 -0
  17. package/dist/extensions/forgecli/health-check.js +154 -0
  18. package/dist/extensions/forgecli/health-check.js.map +1 -0
  19. package/dist/extensions/forgecli/hook-dispatcher.d.ts +34 -1
  20. package/dist/extensions/forgecli/hook-dispatcher.js +237 -3
  21. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  22. package/dist/extensions/forgecli/index.js +28 -11
  23. package/dist/extensions/forgecli/index.js.map +1 -1
  24. package/dist/extensions/forgecli/init-context.d.ts +99 -0
  25. package/dist/extensions/forgecli/init-context.js +163 -0
  26. package/dist/extensions/forgecli/init-context.js.map +1 -0
  27. package/dist/extensions/forgecli/init-progress.d.ts +39 -0
  28. package/dist/extensions/forgecli/init-progress.js +117 -0
  29. package/dist/extensions/forgecli/init-progress.js.map +1 -0
  30. package/dist/extensions/forgecli/refresh-kb-links.d.ts +18 -0
  31. package/dist/extensions/forgecli/refresh-kb-links.js +228 -0
  32. package/dist/extensions/forgecli/refresh-kb-links.js.map +1 -0
  33. package/dist/extensions/forgecli/store-validator.d.ts +13 -0
  34. package/dist/extensions/forgecli/store-validator.js +35 -0
  35. package/dist/extensions/forgecli/store-validator.js.map +1 -0
  36. package/dist/extensions/forgecli/transition-guard.d.ts +20 -0
  37. package/dist/extensions/forgecli/transition-guard.js +125 -0
  38. package/dist/extensions/forgecli/transition-guard.js.map +1 -0
  39. package/dist/forge-payload/.base-pack/commands/approve.md +22 -0
  40. package/dist/forge-payload/.base-pack/commands/collate.md +22 -0
  41. package/dist/forge-payload/.base-pack/commands/commit.md +22 -0
  42. package/dist/forge-payload/.base-pack/commands/enhance.md +37 -0
  43. package/dist/forge-payload/.base-pack/commands/fix-bug.md +22 -0
  44. package/dist/forge-payload/.base-pack/commands/implement.md +22 -0
  45. package/dist/forge-payload/.base-pack/commands/plan.md +22 -0
  46. package/dist/forge-payload/.base-pack/commands/quiz-agent.md +22 -0
  47. package/dist/forge-payload/.base-pack/commands/retrospective.md +22 -0
  48. package/dist/forge-payload/.base-pack/commands/review-code.md +22 -0
  49. package/dist/forge-payload/.base-pack/commands/review-plan.md +22 -0
  50. package/dist/forge-payload/.base-pack/commands/run-sprint.md +22 -0
  51. package/dist/forge-payload/.base-pack/commands/run-task.md +22 -0
  52. package/dist/forge-payload/.base-pack/commands/sprint-intake.md +22 -0
  53. package/dist/forge-payload/.base-pack/commands/sprint-plan.md +22 -0
  54. package/dist/forge-payload/.base-pack/commands/validate.md +22 -0
  55. package/dist/forge-payload/.claude-plugin/plugin.json +15 -0
  56. package/dist/forge-payload/.init/discovery/discover-database.md +32 -0
  57. package/dist/forge-payload/.init/discovery/discover-processes.md +31 -0
  58. package/dist/forge-payload/.init/discovery/discover-routing.md +31 -0
  59. package/dist/forge-payload/.init/discovery/discover-stack.md +33 -0
  60. package/dist/forge-payload/.init/discovery/discover-testing.md +34 -0
  61. package/dist/forge-payload/.init/generation/generate-kb-doc.md +60 -0
  62. package/dist/forge-payload/.schemas/bug.schema.json +53 -0
  63. package/dist/forge-payload/.schemas/collation-state.schema.json +16 -0
  64. package/dist/forge-payload/.schemas/event-sidecar.schema.json +22 -0
  65. package/dist/forge-payload/.schemas/event.schema.json +32 -0
  66. package/dist/forge-payload/.schemas/feature.schema.json +22 -0
  67. package/dist/forge-payload/.schemas/progress-entry.schema.json +16 -0
  68. package/dist/forge-payload/.schemas/project-context.schema.json +167 -0
  69. package/dist/forge-payload/.schemas/project-overlay.schema.json +25 -0
  70. package/dist/forge-payload/.schemas/sprint.schema.json +27 -0
  71. package/dist/forge-payload/.schemas/structure-versions.schema.json +57 -0
  72. package/dist/forge-payload/.schemas/task.schema.json +58 -0
  73. package/dist/forge-payload/.tools/banners.cjs +435 -0
  74. package/dist/forge-payload/.tools/build-context-pack.cjs +290 -0
  75. package/dist/forge-payload/.tools/build-init-context.cjs +322 -0
  76. package/dist/forge-payload/.tools/build-overlay.cjs +326 -0
  77. package/dist/forge-payload/.tools/build-persona-pack.cjs +226 -0
  78. package/dist/forge-payload/.tools/collate.cjs +1041 -0
  79. package/dist/forge-payload/.tools/generation-manifest.cjs +311 -0
  80. package/dist/forge-payload/.tools/lib/forge-root.cjs +59 -0
  81. package/dist/forge-payload/.tools/lib/paths.cjs +29 -0
  82. package/dist/forge-payload/.tools/lib/pricing.cjs +165 -0
  83. package/dist/forge-payload/.tools/lib/project-root.cjs +32 -0
  84. package/dist/forge-payload/.tools/lib/result.js +40 -0
  85. package/dist/forge-payload/.tools/lib/validate.js +131 -0
  86. package/dist/forge-payload/.tools/manage-config.cjs +340 -0
  87. package/dist/forge-payload/.tools/manage-versions.cjs +365 -0
  88. package/dist/forge-payload/.tools/seed-store.cjs +237 -0
  89. package/dist/forge-payload/.tools/store-cli.cjs +1123 -0
  90. package/dist/forge-payload/.tools/store.cjs +315 -0
  91. package/dist/forge-payload/.tools/substitute-placeholders.cjs +625 -0
  92. package/dist/forge-payload/.tools/validate-store.cjs +522 -0
  93. package/package.json +1 -1
  94. /package/dist/forge-payload/{personas → .base-pack/personas}/architect.md +0 -0
  95. /package/dist/forge-payload/{personas → .base-pack/personas}/bug-fixer.md +0 -0
  96. /package/dist/forge-payload/{personas → .base-pack/personas}/collator.md +0 -0
  97. /package/dist/forge-payload/{personas → .base-pack/personas}/engineer.md +0 -0
  98. /package/dist/forge-payload/{personas → .base-pack/personas}/librarian.md +0 -0
  99. /package/dist/forge-payload/{personas → .base-pack/personas}/orchestrator.md +0 -0
  100. /package/dist/forge-payload/{personas → .base-pack/personas}/product-manager.md +0 -0
  101. /package/dist/forge-payload/{personas → .base-pack/personas}/qa-engineer.md +0 -0
  102. /package/dist/forge-payload/{personas → .base-pack/personas}/supervisor.md +0 -0
  103. /package/dist/forge-payload/{skills → .base-pack/skills}/architect-skills.md +0 -0
  104. /package/dist/forge-payload/{skills → .base-pack/skills}/bug-fixer-skills.md +0 -0
  105. /package/dist/forge-payload/{skills → .base-pack/skills}/collator-skills.md +0 -0
  106. /package/dist/forge-payload/{skills → .base-pack/skills}/engineer-skills.md +0 -0
  107. /package/dist/forge-payload/{skills → .base-pack/skills}/generic-skills.md +0 -0
  108. /package/dist/forge-payload/{skills → .base-pack/skills}/librarian-skills.md +0 -0
  109. /package/dist/forge-payload/{skills → .base-pack/skills}/qa-engineer-skills.md +0 -0
  110. /package/dist/forge-payload/{skills → .base-pack/skills}/store-custodian-skills.md +0 -0
  111. /package/dist/forge-payload/{skills → .base-pack/skills}/supervisor-skills.md +0 -0
  112. /package/dist/forge-payload/{templates → .base-pack/templates}/CODE_REVIEW_TEMPLATE.md +0 -0
  113. /package/dist/forge-payload/{templates → .base-pack/templates}/COST_REPORT_TEMPLATE.md +0 -0
  114. /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_REVIEW_TEMPLATE.md +0 -0
  115. /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_SUMMARY_TEMPLATE.json +0 -0
  116. /package/dist/forge-payload/{templates → .base-pack/templates}/PLAN_TEMPLATE.md +0 -0
  117. /package/dist/forge-payload/{templates → .base-pack/templates}/PROGRESS_TEMPLATE.md +0 -0
  118. /package/dist/forge-payload/{templates → .base-pack/templates}/RETROSPECTIVE_TEMPLATE.md +0 -0
  119. /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_MANIFEST_TEMPLATE.md +0 -0
  120. /package/dist/forge-payload/{templates → .base-pack/templates}/SPRINT_REQUIREMENTS_TEMPLATE.md +0 -0
  121. /package/dist/forge-payload/{templates → .base-pack/templates}/TASK_PROMPT_TEMPLATE.md +0 -0
  122. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/context-injection.md +0 -0
  123. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/event-emission-schema.md +0 -0
  124. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/finalize.md +0 -0
  125. /package/dist/forge-payload/{workflows → .base-pack/workflows}/_fragments/progress-reporting.md +0 -0
  126. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_approve.md +0 -0
  127. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_review_sprint_completion.md +0 -0
  128. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_intake.md +0 -0
  129. /package/dist/forge-payload/{workflows → .base-pack/workflows}/architect_sprint_plan.md +0 -0
  130. /package/dist/forge-payload/{workflows → .base-pack/workflows}/collator_agent.md +0 -0
  131. /package/dist/forge-payload/{workflows → .base-pack/workflows}/commit_task.md +0 -0
  132. /package/dist/forge-payload/{workflows → .base-pack/workflows}/fix_bug.md +0 -0
  133. /package/dist/forge-payload/{workflows → .base-pack/workflows}/implement_plan.md +0 -0
  134. /package/dist/forge-payload/{workflows → .base-pack/workflows}/migrate_structural.md +0 -0
  135. /package/dist/forge-payload/{workflows → .base-pack/workflows}/orchestrate_task.md +0 -0
  136. /package/dist/forge-payload/{workflows → .base-pack/workflows}/plan_task.md +0 -0
  137. /package/dist/forge-payload/{workflows → .base-pack/workflows}/quiz_agent.md +0 -0
  138. /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_code.md +0 -0
  139. /package/dist/forge-payload/{workflows → .base-pack/workflows}/review_plan.md +0 -0
  140. /package/dist/forge-payload/{workflows → .base-pack/workflows}/run_sprint.md +0 -0
  141. /package/dist/forge-payload/{workflows → .base-pack/workflows}/sprint_retrospective.md +0 -0
  142. /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_implementation.md +0 -0
  143. /package/dist/forge-payload/{workflows → .base-pack/workflows}/update_plan.md +0 -0
  144. /package/dist/forge-payload/{workflows → .base-pack/workflows}/validate_task.md +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-init.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/forge-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface HealthGap {
2
+ check: string;
3
+ severity: "warning" | "error";
4
+ message: string;
5
+ }
6
+ export interface HealthCheckResult {
7
+ clean: boolean;
8
+ gaps: HealthGap[];
9
+ configPresent: boolean;
10
+ summary: string;
11
+ }
12
+ /**
13
+ * Run a programmatic health check on a Forge project.
14
+ *
15
+ * @param cwd - project working directory (where .forge/ lives)
16
+ * @param bundleRoot - path to dist/forge-payload/ (contains .tools/)
17
+ */
18
+ export declare function runHealthCheck(cwd: string, bundleRoot: string): Promise<HealthCheckResult>;
@@ -0,0 +1,154 @@
1
+ // health-check.ts — shared runHealthCheck() function for /forge:health command
2
+ // and /forge:init post-Phase-4 health verification.
3
+ //
4
+ // Per PLAN.md sub-decision #9 (F4 fix): extracted from forge-commands.ts
5
+ // so both the /forge:health command handler AND the init handler call this
6
+ // function directly. sendUserMessage is NOT used here (skill §198 pitfall).
7
+ //
8
+ // Implements a programmatic subset of the checks listed in
9
+ // forge/forge/commands/health.md (config-completeness + KB freshness +
10
+ // store integrity). Full check output is returned as structured data;
11
+ // the caller formats it for display.
12
+ import { execFileSync } from "node:child_process";
13
+ import * as crypto from "node:crypto";
14
+ import * as fs from "node:fs";
15
+ import * as path from "node:path";
16
+ // ── Required config fields ─────────────────────────────────────────────────
17
+ const REQUIRED_TOP_LEVEL = ["version", "project", "stack", "commands", "paths"];
18
+ const REQUIRED_PROJECT = ["name", "prefix"];
19
+ const REQUIRED_COMMANDS = ["test"];
20
+ const REQUIRED_PATHS = ["engineering", "store", "workflows", "commands", "templates"];
21
+ // ── Main function ──────────────────────────────────────────────────────────
22
+ /**
23
+ * Run a programmatic health check on a Forge project.
24
+ *
25
+ * @param cwd - project working directory (where .forge/ lives)
26
+ * @param bundleRoot - path to dist/forge-payload/ (contains .tools/)
27
+ */
28
+ export async function runHealthCheck(cwd, bundleRoot) {
29
+ const gaps = [];
30
+ // 1. Config-completeness check
31
+ const configPath = path.join(cwd, ".forge", "config.json");
32
+ let config = null;
33
+ let configPresent = false;
34
+ try {
35
+ const raw = fs.readFileSync(configPath, "utf8");
36
+ config = JSON.parse(raw);
37
+ configPresent = true;
38
+ }
39
+ catch {
40
+ gaps.push({
41
+ check: "config-completeness",
42
+ severity: "error",
43
+ message: ".forge/config.json missing — run /forge:init first",
44
+ });
45
+ }
46
+ if (!configPresent) {
47
+ return {
48
+ clean: false,
49
+ gaps,
50
+ configPresent: false,
51
+ summary: "△ Config missing — run /forge:init first.",
52
+ };
53
+ }
54
+ // Validate required fields
55
+ const configRecord = config;
56
+ const missingFields = [];
57
+ for (const field of REQUIRED_TOP_LEVEL) {
58
+ if (!(field in configRecord) || configRecord[field] === "" || configRecord[field] === null) {
59
+ missingFields.push(field);
60
+ }
61
+ }
62
+ if ("project" in configRecord && configRecord.project && typeof configRecord.project === "object") {
63
+ const project = configRecord.project;
64
+ for (const field of REQUIRED_PROJECT) {
65
+ if (!(field in project) || project[field] === "" || project[field] === null) {
66
+ missingFields.push(`project.${field}`);
67
+ }
68
+ }
69
+ }
70
+ if ("commands" in configRecord && configRecord.commands && typeof configRecord.commands === "object") {
71
+ const commands = configRecord.commands;
72
+ for (const field of REQUIRED_COMMANDS) {
73
+ if (!(field in commands) || commands[field] === "" || commands[field] === null) {
74
+ missingFields.push(`commands.${field}`);
75
+ }
76
+ }
77
+ }
78
+ if ("paths" in configRecord && configRecord.paths && typeof configRecord.paths === "object") {
79
+ const paths_ = configRecord.paths;
80
+ for (const field of REQUIRED_PATHS) {
81
+ if (!(field in paths_) || paths_[field] === "" || paths_[field] === null) {
82
+ missingFields.push(`paths.${field}`);
83
+ }
84
+ }
85
+ }
86
+ if (missingFields.length > 0) {
87
+ gaps.push({
88
+ check: "config-completeness",
89
+ severity: "warning",
90
+ message: `Config incomplete — missing fields: ${missingFields.join(", ")}`,
91
+ });
92
+ }
93
+ // 2. KB freshness check
94
+ const calibrationBaseline = configRecord.calibrationBaseline;
95
+ if (!calibrationBaseline) {
96
+ gaps.push({
97
+ check: "kb-freshness",
98
+ severity: "warning",
99
+ message: "No calibration baseline found — run /forge:calibrate to establish one.",
100
+ });
101
+ }
102
+ else if (calibrationBaseline.masterIndexHash) {
103
+ const engPath = configRecord.paths?.engineering ?? "engineering";
104
+ const masterIndexPath = path.join(cwd, engPath, "MASTER_INDEX.md");
105
+ try {
106
+ const content = fs.readFileSync(masterIndexPath, "utf8");
107
+ const currentHash = crypto.createHash("sha256").update(content, "utf8").digest("hex");
108
+ if (currentHash !== calibrationBaseline.masterIndexHash) {
109
+ gaps.push({
110
+ check: "kb-freshness",
111
+ severity: "warning",
112
+ message: "KB freshness: MASTER_INDEX.md hash has changed since last calibration — consider /forge:calibrate.",
113
+ });
114
+ }
115
+ }
116
+ catch {
117
+ gaps.push({
118
+ check: "kb-freshness",
119
+ severity: "warning",
120
+ message: "MASTER_INDEX.md not found — KB docs may not have been written yet.",
121
+ });
122
+ }
123
+ }
124
+ // 3. Store integrity check
125
+ const validateStoreTool = path.join(bundleRoot, ".tools", "validate-store.cjs");
126
+ if (fs.existsSync(validateStoreTool)) {
127
+ try {
128
+ execFileSync("node", [validateStoreTool, "--dry-run"], {
129
+ cwd,
130
+ encoding: "utf8",
131
+ timeout: 10000,
132
+ stdio: ["ignore", "pipe", "pipe"],
133
+ });
134
+ }
135
+ catch (err) {
136
+ const e = err;
137
+ const detail = e.stderr || e.stdout || "unknown error";
138
+ gaps.push({
139
+ check: "store-integrity",
140
+ severity: "warning",
141
+ message: `Store integrity check failed: ${detail.trim().slice(0, 200)}`,
142
+ });
143
+ }
144
+ }
145
+ const clean = gaps.length === 0;
146
+ const summary = clean ? "〇 /forge:health: clean." : `△ /forge:health: ${gaps.length} gap(s) detected.`;
147
+ return {
148
+ clean,
149
+ gaps,
150
+ configPresent: true,
151
+ summary,
152
+ };
153
+ }
154
+ //# sourceMappingURL=health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/health-check.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,35 @@
1
1
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- export declare function registerHookDispatcher(_pi: ExtensionAPI): void;
2
+ /** Parsed representation of a store-cli invocation intercepted from a bash command. */
3
+ export interface StoreCLICall {
4
+ /** Subcommand: write or update-status */
5
+ subcmd: "write" | "update-status";
6
+ /** Entity type: "task" | "sprint" | "bug" | "event" | ... */
7
+ entity: string;
8
+ /** For "write": parsed JSON payload. For "update-status": { field: string, value: string } */
9
+ payload: unknown;
10
+ }
11
+ /**
12
+ * Parses a bash command string to detect a store-cli write or update-status invocation.
13
+ *
14
+ * Handles forms produced by Forge workflows:
15
+ * node "$FORGE_ROOT/tools/store-cli.cjs" write task '{"taskId":"X",...}'
16
+ * node "/abs/path/to/store-cli.cjs" update-status task X status Y
17
+ *
18
+ * Returns null if the command does not invoke store-cli.cjs.
19
+ *
20
+ * NOTE (T02 scope): extraction only — no validation performed here.
21
+ * T03 imports this function and layers schema validation on the returned payload.
22
+ */
23
+ export declare function parseStoreCLIInvocation(command: string, _forgeRoot: string): StoreCLICall | null;
24
+ /**
25
+ * Wire Forge hook semantics onto pi's tool_call and tool_result events.
26
+ *
27
+ * @param pi The ExtensionAPI instance provided by pi at extension init.
28
+ * @param forgeRoot Absolute path to the Forge plugin root (from .forge/config.json).
29
+ *
30
+ * AC#1: Both tool_call and tool_result handlers are registered.
31
+ * AC#2: write calls validated via store-validator; blocked on schema violation.
32
+ * AC#3: update-status calls checked via transition-guard; blocked on illegal transition.
33
+ * AC#4: FORGE_HOOK_AUDIT=1 — all decisions logged, nothing blocked.
34
+ */
35
+ export declare function registerHookDispatcher(pi: ExtensionAPI, forgeRoot: string): void;
@@ -1,5 +1,239 @@
1
- // Stage 1 scaffold (FORGE-S15-T01). Hook dispatcher shim.
2
- export function registerHookDispatcher(_pi) {
3
- // intentionally empty populated in T06 (bash custom-tool routing)
1
+ // Pi-runtime hook adapter FORGE-S18-T02 / FORGE-S18-T03
2
+ //
3
+ // Wires Forge's hook semantics onto pi's tool_call / tool_result events.
4
+ // T02: Provides audit-only observation scaffolding.
5
+ // T03: Adds enforcement — validates store-cli write payloads via store-validator,
6
+ // checks status transitions via transition-guard, and blocks on violation
7
+ // by returning { block: true, reason } from the tool_call handler.
8
+ //
9
+ // Audit logging: set FORGE_HOOK_AUDIT=1 to write to .forge/logs/hooks.log.
10
+ // In enforcement mode (default): violations are blocked.
11
+ // In audit mode (FORGE_HOOK_AUDIT=1): violations are logged but never blocked.
12
+ //
13
+ // --force scope:
14
+ // When --force is present in store-cli argv, transition-guard is bypassed.
15
+ // store-validator still runs — a malformed payload is always invalid.
16
+ import { appendFileSync, mkdirSync } from "node:fs";
17
+ import * as path from "node:path";
18
+ import { isToolCallEventType } from "@earendil-works/pi-coding-agent";
19
+ import { validateStoreCLIPayload } from "./store-validator.js";
20
+ import { checkTransition } from "./transition-guard.js";
21
+ // ── Internal helpers ──────────────────────────────────────────────────────────
22
+ function auditEnabled() {
23
+ return process.env.FORGE_HOOK_AUDIT === "1";
24
+ }
25
+ function appendAudit(logsDir, line) {
26
+ if (!auditEnabled())
27
+ return;
28
+ try {
29
+ mkdirSync(logsDir, { recursive: true });
30
+ appendFileSync(path.join(logsDir, "hooks.log"), line + "\n", "utf8");
31
+ }
32
+ catch {
33
+ // Audit is best-effort — never throw from the dispatch path.
34
+ }
35
+ }
36
+ // ── Store-CLI invocation parser (exported for T03) ───────────────────────────
37
+ /**
38
+ * Parses a bash command string to detect a store-cli write or update-status invocation.
39
+ *
40
+ * Handles forms produced by Forge workflows:
41
+ * node "$FORGE_ROOT/tools/store-cli.cjs" write task '{"taskId":"X",...}'
42
+ * node "/abs/path/to/store-cli.cjs" update-status task X status Y
43
+ *
44
+ * Returns null if the command does not invoke store-cli.cjs.
45
+ *
46
+ * NOTE (T02 scope): extraction only — no validation performed here.
47
+ * T03 imports this function and layers schema validation on the returned payload.
48
+ */
49
+ export function parseStoreCLIInvocation(command, _forgeRoot) {
50
+ // Quick pre-filter before any parsing overhead.
51
+ if (!command.includes("store-cli.cjs"))
52
+ return null;
53
+ // Tokenise the command string into whitespace-separated tokens, respecting
54
+ // single-quoted strings (the common form produced by Forge workflows for JSON payloads).
55
+ const tokens = tokeniseShellCommand(command);
56
+ if (tokens.length < 2)
57
+ return null;
58
+ // Find the token that names store-cli.cjs — it may be the first or second arg
59
+ // depending on whether the invocation is: `node ... store-cli.cjs subcmd ...`
60
+ // or `store-cli.cjs subcmd ...`.
61
+ let storeCliIdx = -1;
62
+ for (let i = 0; i < tokens.length; i++) {
63
+ if (tokens[i].endsWith("store-cli.cjs")) {
64
+ storeCliIdx = i;
65
+ break;
66
+ }
67
+ }
68
+ if (storeCliIdx === -1 || storeCliIdx + 1 >= tokens.length)
69
+ return null;
70
+ const subcmdRaw = tokens[storeCliIdx + 1];
71
+ const rest = tokens.slice(storeCliIdx + 2);
72
+ if (subcmdRaw === "write") {
73
+ // Form: store-cli.cjs write <entity> '<json-payload>'
74
+ if (rest.length < 2)
75
+ return null;
76
+ const entity = rest[0];
77
+ const payloadRaw = rest[1];
78
+ let payload;
79
+ try {
80
+ payload = JSON.parse(payloadRaw);
81
+ }
82
+ catch {
83
+ // Non-JSON payload — record raw string for T03 to handle.
84
+ payload = payloadRaw;
85
+ }
86
+ return { subcmd: "write", entity, payload };
87
+ }
88
+ if (subcmdRaw === "update-status") {
89
+ // Form: store-cli.cjs update-status <entity> <id> status <value>
90
+ // e.g.: update-status task FORGE-S18-T02 status implemented
91
+ if (rest.length < 4)
92
+ return null;
93
+ const entity = rest[0];
94
+ // rest[1] is the entity ID — included in payload for T03.
95
+ const entityId = rest[1];
96
+ // rest[2] should be "status", rest[3] the new value.
97
+ const field = rest[2];
98
+ const value = rest[3];
99
+ return {
100
+ subcmd: "update-status",
101
+ entity,
102
+ payload: { entityId, field, value },
103
+ };
104
+ }
105
+ // Other subcommands (emit, list, nlp, etc.) — not intercepted in T02.
106
+ return null;
107
+ }
108
+ /**
109
+ * Minimal shell tokeniser that handles:
110
+ * - whitespace delimiters
111
+ * - single-quoted strings (no escape sequences inside — shell literal)
112
+ * - double-quoted strings (basic; no escape sequences for simplicity)
113
+ * - unquoted tokens with embedded env-var expansions treated as opaque
114
+ *
115
+ * This is T02-quality — good enough to extract store-cli arguments.
116
+ * A full POSIX tokeniser is not needed here.
117
+ */
118
+ function tokeniseShellCommand(command) {
119
+ const tokens = [];
120
+ let i = 0;
121
+ while (i < command.length) {
122
+ // Skip whitespace.
123
+ while (i < command.length && /\s/.test(command[i]))
124
+ i++;
125
+ if (i >= command.length)
126
+ break;
127
+ const ch = command[i];
128
+ if (ch === "'") {
129
+ // Single-quoted literal.
130
+ i++; // skip opening quote
131
+ let tok = "";
132
+ while (i < command.length && command[i] !== "'") {
133
+ tok += command[i++];
134
+ }
135
+ if (i < command.length)
136
+ i++; // skip closing quote
137
+ tokens.push(tok);
138
+ }
139
+ else if (ch === '"') {
140
+ // Double-quoted — treat as literal for T02.
141
+ i++; // skip opening quote
142
+ let tok = "";
143
+ while (i < command.length && command[i] !== '"') {
144
+ tok += command[i++];
145
+ }
146
+ if (i < command.length)
147
+ i++; // skip closing quote
148
+ tokens.push(tok);
149
+ }
150
+ else {
151
+ // Unquoted token — ends at whitespace or end of string.
152
+ let tok = "";
153
+ while (i < command.length && !/\s/.test(command[i])) {
154
+ tok += command[i++];
155
+ }
156
+ tokens.push(tok);
157
+ }
158
+ }
159
+ return tokens;
160
+ }
161
+ // ── Public API ────────────────────────────────────────────────────────────────
162
+ /**
163
+ * Wire Forge hook semantics onto pi's tool_call and tool_result events.
164
+ *
165
+ * @param pi The ExtensionAPI instance provided by pi at extension init.
166
+ * @param forgeRoot Absolute path to the Forge plugin root (from .forge/config.json).
167
+ *
168
+ * AC#1: Both tool_call and tool_result handlers are registered.
169
+ * AC#2: write calls validated via store-validator; blocked on schema violation.
170
+ * AC#3: update-status calls checked via transition-guard; blocked on illegal transition.
171
+ * AC#4: FORGE_HOOK_AUDIT=1 — all decisions logged, nothing blocked.
172
+ */
173
+ export function registerHookDispatcher(pi, forgeRoot) {
174
+ const logsDir = path.join(process.cwd(), ".forge", "logs");
175
+ // ── tool_call: fires before any tool executes ─────────────────────────────
176
+ pi.on("tool_call", (event) => {
177
+ appendAudit(logsDir, `[tool_call] toolName=${event.toolName} toolCallId=${event.toolCallId}`);
178
+ // Bash interception: identify store-cli write/update-status calls.
179
+ if (isToolCallEventType("bash", event)) {
180
+ const bashEvent = event;
181
+ const intercept = parseStoreCLIInvocation(bashEvent.input.command, forgeRoot);
182
+ if (intercept) {
183
+ appendAudit(logsDir, `[store-cli-intercept] subcmd=${intercept.subcmd} entity=${intercept.entity} payload=${JSON.stringify(intercept.payload)}`);
184
+ // Detect --force in the original argv tokens.
185
+ const tokens = tokeniseShellCommand(bashEvent.input.command);
186
+ const hasForce = tokens.includes("--force");
187
+ if (intercept.subcmd === "write") {
188
+ // AC#2: Validate payload against schema via store-validator.
189
+ // --force does NOT bypass schema validation.
190
+ const validation = validateStoreCLIPayload(intercept.entity, intercept.payload, forgeRoot);
191
+ if (!validation.ok) {
192
+ appendAudit(logsDir, `[store-cli-intercept] decision=would-block reason=${validation.reason}`);
193
+ if (auditEnabled()) {
194
+ // Audit mode: log and allow.
195
+ return undefined;
196
+ }
197
+ return { block: true, reason: validation.reason };
198
+ }
199
+ appendAudit(logsDir, `[store-cli-intercept] decision=would-allow`);
200
+ }
201
+ else if (intercept.subcmd === "update-status") {
202
+ // AC#3: Check transition via transition-guard.
203
+ // --force bypasses transition-guard only (not schema validation).
204
+ if (!hasForce) {
205
+ const payloadRecord = intercept.payload;
206
+ const guard = checkTransition({
207
+ entity: intercept.entity,
208
+ entityId: payloadRecord.entityId,
209
+ toStatus: payloadRecord.value,
210
+ }, forgeRoot);
211
+ if (guard.reason === "lookup-failed") {
212
+ // Fail-open: lookup error must never block.
213
+ appendAudit(logsDir, `[store-cli-intercept] decision=lookup-failed entity=${intercept.entity} entityId=${payloadRecord.entityId}`);
214
+ return undefined;
215
+ }
216
+ if (!guard.allowed) {
217
+ appendAudit(logsDir, `[store-cli-intercept] decision=would-block reason=${guard.reason}`);
218
+ if (auditEnabled()) {
219
+ return undefined;
220
+ }
221
+ return { block: true, reason: guard.reason };
222
+ }
223
+ appendAudit(logsDir, `[store-cli-intercept] decision=would-allow`);
224
+ }
225
+ else {
226
+ appendAudit(logsDir, `[store-cli-intercept] decision=would-allow (--force bypasses transition-guard)`);
227
+ }
228
+ }
229
+ }
230
+ }
231
+ return undefined;
232
+ });
233
+ // ── tool_result: fires after any tool completes (observe-only) ──────────────
234
+ pi.on("tool_result", (event) => {
235
+ appendAudit(logsDir, `[tool_result] toolName=${event.toolName} toolCallId=${event.toolCallId}`);
236
+ // Audit-only in T02 — return void (no result replacement).
237
+ });
4
238
  }
5
239
  //# sourceMappingURL=hook-dispatcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hook-dispatcher.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/hook-dispatcher.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAI1D,MAAM,UAAU,sBAAsB,CAAC,GAAiB;IACvD,sEAAsE;AACvE,CAAC"}
1
+ {"version":3,"file":"hook-dispatcher.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/hook-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -10,15 +10,18 @@
10
10
  //
11
11
  // Spike R1/R2 env-gated blocks are preserved for backward-compat — no-op in
12
12
  // production when env flags are absent.
13
- import { readFileSync } from "node:fs";
13
+ import { existsSync, readFileSync } from "node:fs";
14
14
  import * as path from "node:path";
15
15
  import { fileURLToPath } from "node:url";
16
+ import { registerAskUserTool } from "./ask-user-tool.js";
16
17
  import { readProjectMeta } from "./banner.js";
17
- import { registerForgeCommands } from "./forge-commands.js";
18
+ import { registerAllForgeCommands, registerForgeCommands } from "./forge-commands.js";
19
+ import { registerForgeInit } from "./forge-init.js";
18
20
  import { discoverForgeConfig } from "./forge-root.js";
19
21
  import { registerForgeTools } from "./forge-tools.js";
20
22
  import { checkBundledForgeDrift, registerForgeUpdateCommand } from "./forge-update-command.js";
21
23
  import { detectFoundryCollision, markCollisionSeen, wasCollisionSeen } from "./foundry-collision.js";
24
+ import { registerHookDispatcher } from "./hook-dispatcher.js";
22
25
  import { detectMissingCredentials, loadRegistry, seedEnabledModels } from "./model-registry.js";
23
26
  import { triggerUpdateCheck } from "./update-check.js";
24
27
  // Resolve the vendored prompts directory at module load. After build, this
@@ -63,13 +66,11 @@ export default async function forgecli(pi) {
63
66
  const forgeConfig = discoverForgeConfig();
64
67
  const forgeRoot = forgeConfig?.forgeRoot ?? null;
65
68
  // ── Unconditional /forge:init (AC#4) ─────────────────────────────────────
66
- // Stub full implementation lands in FORGE-S16-T04.
67
- pi.registerCommand("forge:init", {
68
- description: "Bootstrap a new Forge SDLC project at the current working directory",
69
- async handler(_args, ctx) {
70
- ctx.ui.notify("forge:init — coming in FORGE-S16-T04", "info");
71
- },
72
- });
69
+ // Full 4-phase implementation FORGE-S17-T02.
70
+ // Banner suppression: outside-Forge banner below only fires when
71
+ // .forge/config.json is absent. Once /forge:init writes config.json,
72
+ // the banner is suppressed automatically (no extra guard needed here).
73
+ registerForgeInit(pi);
73
74
  // ── Session start — banners + collision detection ─────────────────────────
74
75
  pi.on("session_start", async (_event, ctx) => {
75
76
  if (!ctx.hasUI)
@@ -145,13 +146,29 @@ export default async function forgecli(pi) {
145
146
  // guarantee: forgeRoot captured at init; projectRoot passed as cwd to execFile.
146
147
  const projectRoot = path.dirname(path.dirname(forgeConfig.configPath));
147
148
  registerForgeTools(pi, forgeRoot, projectRoot);
148
- // T05 stub hook dispatcher registration
149
- // registerHookDispatcher(pi, forgeRoot); — FORGE-S16-T05
149
+ // T05 T02 (FORGE-S18-T02): hook dispatcher wired — audit-only, no blocking.
150
+ registerHookDispatcher(pi, forgeRoot);
151
+ // T04 (FORGE-S18-T04): forge:ask_user interactive prompt tool.
152
+ registerAskUserTool(pi);
150
153
  }
151
154
  // ── /forge:* command set (FORGE-S16-T04) ─────────────────────────────────
152
155
  // Registered unconditionally so /forge:ask works outside a Forge project.
153
156
  // Per-command handlers enforce the Q14 outside-project no-op contract.
154
157
  registerForgeCommands(pi, { forgeRoot, promptsRoot: PROMPTS_ROOT });
158
+ // ── Phase G: all bundled commands (FORGE-S17-T02) ─────────────────────────
159
+ // Enumerate every *.md under dist/forge-payload/.base-pack/commands/ and
160
+ // register each as a pi command. Real handlers (init/health/ask/config/
161
+ // status/refresh-kb-links) were registered above; stubs for the rest.
162
+ // Banner-suppression guard: outside-Forge banner is gated on forgeRoot
163
+ // being null — once /forge:init writes .forge/config.json, forgeRoot is
164
+ // non-null and the outside-Forge banner no longer fires (F3 AC#8).
165
+ const payloadRoot = path.join(PKG_ROOT, "dist", "forge-payload");
166
+ const configExists = existsSync(path.join(process.cwd(), ".forge", "config.json"));
167
+ registerAllForgeCommands(pi, {
168
+ bundlePayloadRoot: payloadRoot,
169
+ cwd: process.cwd(),
170
+ bundleRoot: configExists ? payloadRoot : undefined,
171
+ });
155
172
  // ── /forge:update guided upgrade (FORGE-S16-T15) ─────────────────────────
156
173
  // Registered unconditionally — useful even outside a Forge project (the
157
174
  // command upgrades the globally-installed forgecli, not the project).