@entelligentsia/forgecli 0.10.1 → 0.11.2

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 (161) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +21 -3
  3. package/dist/CHANGELOG-forge-plugin.md +22 -0
  4. package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
  5. package/dist/extensions/forgecli/add-pipeline.js +143 -0
  6. package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
  7. package/dist/extensions/forgecli/add-task.d.ts +20 -0
  8. package/dist/extensions/forgecli/add-task.js +154 -0
  9. package/dist/extensions/forgecli/add-task.js.map +1 -0
  10. package/dist/extensions/forgecli/calibrate.d.ts +61 -0
  11. package/dist/extensions/forgecli/calibrate.js +488 -0
  12. package/dist/extensions/forgecli/calibrate.js.map +1 -0
  13. package/dist/extensions/forgecli/fix-bug.d.ts +9 -1
  14. package/dist/extensions/forgecli/fix-bug.js +70 -8
  15. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  16. package/dist/extensions/forgecli/forge-commands.js +15 -22
  17. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  18. package/dist/extensions/forgecli/forge-subagent.js +34 -7
  19. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  20. package/dist/extensions/forgecli/forge-update-command.d.ts +9 -0
  21. package/dist/extensions/forgecli/forge-update-command.js +106 -7
  22. package/dist/extensions/forgecli/forge-update-command.js.map +1 -1
  23. package/dist/extensions/forgecli/health-check.d.ts +22 -1
  24. package/dist/extensions/forgecli/health-check.js +177 -4
  25. package/dist/extensions/forgecli/health-check.js.map +1 -1
  26. package/dist/extensions/forgecli/hook-dispatcher.d.ts +25 -1
  27. package/dist/extensions/forgecli/hook-dispatcher.js +104 -9
  28. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  29. package/dist/extensions/forgecli/hooks/check-update.d.ts +81 -0
  30. package/dist/extensions/forgecli/hooks/check-update.js +308 -0
  31. package/dist/extensions/forgecli/hooks/check-update.js.map +1 -0
  32. package/dist/extensions/forgecli/hooks/forge-permissions.d.ts +32 -0
  33. package/dist/extensions/forgecli/hooks/forge-permissions.js +119 -0
  34. package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -0
  35. package/dist/extensions/forgecli/hooks/triage-error.d.ts +23 -0
  36. package/dist/extensions/forgecli/hooks/triage-error.js +62 -0
  37. package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -0
  38. package/dist/extensions/forgecli/hooks/write-guard.d.ts +28 -0
  39. package/dist/extensions/forgecli/hooks/write-guard.js +225 -0
  40. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -0
  41. package/dist/extensions/forgecli/index.js +60 -0
  42. package/dist/extensions/forgecli/index.js.map +1 -1
  43. package/dist/extensions/forgecli/init-context.d.ts +1 -1
  44. package/dist/extensions/forgecli/init-context.js +21 -6
  45. package/dist/extensions/forgecli/init-context.js.map +1 -1
  46. package/dist/extensions/forgecli/materialize.d.ts +16 -0
  47. package/dist/extensions/forgecli/materialize.js +195 -0
  48. package/dist/extensions/forgecli/materialize.js.map +1 -0
  49. package/dist/extensions/forgecli/migrate.d.ts +19 -0
  50. package/dist/extensions/forgecli/migrate.js +258 -0
  51. package/dist/extensions/forgecli/migrate.js.map +1 -0
  52. package/dist/extensions/forgecli/migration-engine.d.ts +111 -0
  53. package/dist/extensions/forgecli/migration-engine.js +533 -0
  54. package/dist/extensions/forgecli/migration-engine.js.map +1 -0
  55. package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
  56. package/dist/extensions/forgecli/quiz-agent.js +98 -0
  57. package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
  58. package/dist/extensions/forgecli/remove-command.d.ts +17 -0
  59. package/dist/extensions/forgecli/remove-command.js +124 -0
  60. package/dist/extensions/forgecli/remove-command.js.map +1 -0
  61. package/dist/extensions/forgecli/report-bug.d.ts +25 -0
  62. package/dist/extensions/forgecli/report-bug.js +159 -0
  63. package/dist/extensions/forgecli/report-bug.js.map +1 -0
  64. package/dist/extensions/forgecli/retrospective.d.ts +19 -0
  65. package/dist/extensions/forgecli/retrospective.js +156 -0
  66. package/dist/extensions/forgecli/retrospective.js.map +1 -0
  67. package/dist/extensions/forgecli/run-sprint.js +34 -0
  68. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  69. package/dist/extensions/forgecli/run-task.d.ts +9 -1
  70. package/dist/extensions/forgecli/run-task.js +64 -10
  71. package/dist/extensions/forgecli/run-task.js.map +1 -1
  72. package/dist/extensions/forgecli/session-registry.d.ts +27 -2
  73. package/dist/extensions/forgecli/session-registry.js +52 -1
  74. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  75. package/dist/extensions/forgecli/status-command.d.ts +19 -0
  76. package/dist/extensions/forgecli/status-command.js +140 -0
  77. package/dist/extensions/forgecli/status-command.js.map +1 -0
  78. package/dist/extensions/forgecli/store-query.d.ts +22 -0
  79. package/dist/extensions/forgecli/store-query.js +107 -0
  80. package/dist/extensions/forgecli/store-query.js.map +1 -0
  81. package/dist/extensions/forgecli/store-repair.d.ts +17 -0
  82. package/dist/extensions/forgecli/store-repair.js +123 -0
  83. package/dist/extensions/forgecli/store-repair.js.map +1 -0
  84. package/dist/extensions/forgecli/thread-switcher.js +213 -28
  85. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  86. package/dist/extensions/forgecli/update-tools.d.ts +23 -0
  87. package/dist/extensions/forgecli/update-tools.js +136 -0
  88. package/dist/extensions/forgecli/update-tools.js.map +1 -0
  89. package/dist/extensions/forgecli/viewport-theme.js +4 -0
  90. package/dist/extensions/forgecli/viewport-theme.js.map +1 -1
  91. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  92. package/dist/forge-payload/.schemas/config.schema.json +83 -0
  93. package/dist/forge-payload/.schemas/migrations.json +2049 -0
  94. package/dist/forge-payload/commands/regenerate.md +17 -1
  95. package/dist/forge-payload/meta/personas/README.md +16 -0
  96. package/dist/forge-payload/meta/personas/meta-architect.md +70 -0
  97. package/dist/forge-payload/meta/personas/meta-bug-fixer.md +73 -0
  98. package/dist/forge-payload/meta/personas/meta-collator.md +72 -0
  99. package/dist/forge-payload/meta/personas/meta-engineer.md +70 -0
  100. package/dist/forge-payload/meta/personas/meta-orchestrator.md +71 -0
  101. package/dist/forge-payload/meta/personas/meta-product-manager.md +82 -0
  102. package/dist/forge-payload/meta/personas/meta-qa-engineer.md +91 -0
  103. package/dist/forge-payload/meta/personas/meta-supervisor.md +92 -0
  104. package/dist/forge-payload/meta/skill-recommendations.md +154 -0
  105. package/dist/forge-payload/meta/skills/meta-architect-skills.md +43 -0
  106. package/dist/forge-payload/meta/skills/meta-bug-fixer-skills.md +43 -0
  107. package/dist/forge-payload/meta/skills/meta-collator-skills.md +41 -0
  108. package/dist/forge-payload/meta/skills/meta-engineer-skills.md +43 -0
  109. package/dist/forge-payload/meta/skills/meta-generic-skills.md +58 -0
  110. package/dist/forge-payload/meta/skills/meta-qa-engineer-skills.md +46 -0
  111. package/dist/forge-payload/meta/skills/meta-supervisor-skills.md +43 -0
  112. package/dist/forge-payload/meta/store-schema/bug.schema.md +71 -0
  113. package/dist/forge-payload/meta/store-schema/event.schema.md +76 -0
  114. package/dist/forge-payload/meta/store-schema/feature.schema.md +65 -0
  115. package/dist/forge-payload/meta/store-schema/sprint.schema.md +64 -0
  116. package/dist/forge-payload/meta/store-schema/task.schema.md +78 -0
  117. package/dist/forge-payload/meta/templates/meta-code-review.md +26 -0
  118. package/dist/forge-payload/meta/templates/meta-plan-review.md +28 -0
  119. package/dist/forge-payload/meta/templates/meta-plan.md +28 -0
  120. package/dist/forge-payload/meta/templates/meta-progress.md +25 -0
  121. package/dist/forge-payload/meta/templates/meta-retrospective.md +28 -0
  122. package/dist/forge-payload/meta/templates/meta-sprint-manifest.md +26 -0
  123. package/dist/forge-payload/meta/templates/meta-sprint-requirements.md +91 -0
  124. package/dist/forge-payload/meta/templates/meta-task-prompt.md +26 -0
  125. package/dist/forge-payload/meta/tool-specs/collate.spec.md +88 -0
  126. package/dist/forge-payload/meta/tool-specs/generation-manifest.spec.md +139 -0
  127. package/dist/forge-payload/meta/tool-specs/manage-config.spec.md +143 -0
  128. package/dist/forge-payload/meta/tool-specs/seed-store.spec.md +91 -0
  129. package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +328 -0
  130. package/dist/forge-payload/meta/tool-specs/validate-store.spec.md +191 -0
  131. package/dist/forge-payload/meta/workflows/_fragments/context-injection.md +75 -0
  132. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +73 -0
  133. package/dist/forge-payload/meta/workflows/_fragments/finalize.md +13 -0
  134. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +73 -0
  135. package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +38 -0
  136. package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +39 -0
  137. package/dist/forge-payload/meta/workflows/meta-approve.md +119 -0
  138. package/dist/forge-payload/meta/workflows/meta-collate.md +89 -0
  139. package/dist/forge-payload/meta/workflows/meta-commit.md +93 -0
  140. package/dist/forge-payload/meta/workflows/meta-enhance.md +286 -0
  141. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +501 -0
  142. package/dist/forge-payload/meta/workflows/meta-implement.md +132 -0
  143. package/dist/forge-payload/meta/workflows/meta-migrate.md +455 -0
  144. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +993 -0
  145. package/dist/forge-payload/meta/workflows/meta-plan-task.md +133 -0
  146. package/dist/forge-payload/meta/workflows/meta-quiz-agent.md +135 -0
  147. package/dist/forge-payload/meta/workflows/meta-retrospective.md +65 -0
  148. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +119 -0
  149. package/dist/forge-payload/meta/workflows/meta-review-plan.md +108 -0
  150. package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +65 -0
  151. package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +76 -0
  152. package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +147 -0
  153. package/dist/forge-payload/meta/workflows/meta-update-implementation.md +76 -0
  154. package/dist/forge-payload/meta/workflows/meta-update-plan.md +76 -0
  155. package/dist/forge-payload/meta/workflows/meta-validate.md +111 -0
  156. package/dist/forge-payload/tools/check-structure.cjs +344 -0
  157. package/dist/forge-payload/tools/list-skills.js +76 -0
  158. package/dist/forge-payload/tools/store-cli.cjs +27 -1
  159. package/dist/forge-payload/tools/substitute-placeholders.cjs +60 -8
  160. package/dist/forge-payload/tools/verify-integrity.cjs +86 -0
  161. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- // Pi-runtime hook adapter — FORGE-S18-T02 / FORGE-S18-T03 / FORGE-S21-T04
1
+ // Pi-runtime hook adapter — FORGE-S18-T02 / FORGE-S18-T03 / FORGE-S21-T04 / FORGE-S23-T02 / FORGE-S23-T03
2
2
  //
3
3
  // Wires Forge's hook semantics onto pi's tool_call / tool_result events.
4
4
  // T02: Provides audit-only observation scaffolding.
@@ -8,6 +8,11 @@
8
8
  // T04: Adds typed synthetic event taxonomy (InitCompleteEvent) with
9
9
  // onSyntheticEvent / emitSyntheticEvent for in-process hook dispatch
10
10
  // that bridges deterministic TS handler phases to registered hook handlers.
11
+ // T02 (S23): Adds full FS-level write-boundary schema guard via write-guard.ts —
12
+ // validates Write/Edit tool calls targeting .forge/store/**/*.json and
13
+ // .forge/config.json against Forge JSON schemas. Composed after two-layer-guard.
14
+ // T03 (S23): Adds triage-error hook — on Bash tool_result with isError=true and a
15
+ // Forge-related command, injects ctx.ui.notify suggesting /forge:report-bug.
11
16
  //
12
17
  // Audit logging: set FORGE_HOOK_AUDIT=1 to write to .forge/logs/hooks.log.
13
18
  // In enforcement mode (default): violations are blocked.
@@ -16,10 +21,17 @@
16
21
  // --force scope:
17
22
  // When --force is present in store-cli argv, transition-guard is bypassed.
18
23
  // store-validator still runs — a malformed payload is always invalid.
24
+ //
25
+ // Write-guard bypass:
26
+ // FORGE_SKIP_WRITE_VALIDATION=1 bypasses checkWriteGuard for one turn.
27
+ // The write-guard itself handles this env var; hook-dispatcher defers to it.
19
28
  import { appendFileSync, mkdirSync } from "node:fs";
20
29
  import * as path from "node:path";
21
- import { isToolCallEventType } from "@earendil-works/pi-coding-agent";
30
+ import { isBashToolResult, isToolCallEventType } from "@earendil-works/pi-coding-agent";
22
31
  import { checkTwoLayerBoundary } from "./hooks/two-layer-guard.js";
32
+ import { applyPiEdits, checkWriteGuard } from "./hooks/write-guard.js";
33
+ import { buildTriageMessage, isForgeRelated } from "./hooks/triage-error.js";
34
+ import { matchForgePermission } from "./hooks/forge-permissions.js";
23
35
  import { validateStoreCLIPayload } from "./store-validator.js";
24
36
  import { checkTransition } from "./transition-guard.js";
25
37
  // Module-level registry. Pi extension processes are single-session; the
@@ -222,20 +234,87 @@ export function registerHookDispatcher(pi, forgeRoot) {
222
234
  // ── tool_call: fires before any tool executes ─────────────────────────────
223
235
  pi.on("tool_call", (event) => {
224
236
  appendAudit(logsDir, `[tool_call] toolName=${event.toolName} toolCallId=${event.toolCallId}`);
237
+ // ── Forge-permission auto-allow (FORGE-S23-T04) ───────────────────────
238
+ // Port of forge-permissions.js pattern-match logic. Pi has no PermissionRequest
239
+ // event, so matched patterns silently return undefined (no block) from the
240
+ // tool_call handler.
241
+ //
242
+ // Bash match: full short-circuit — skip all downstream bash handling.
243
+ // Write/Edit: skip two-layer-guard (sets skipTwoLayerGuard=true), but
244
+ // FALL THROUGH to write-guard schema check (AC#4: an allowed
245
+ // write to .forge/store/ that fails schema is still blocked).
246
+ //
247
+ // Security: this guard can only ALLOW, never DENY. Patterns are ported
248
+ // verbatim from forge-permissions.js including the node -e exclusion.
249
+ //
250
+ // Important: bash commands targeting store-cli.cjs must NOT be short-circuited
251
+ // here — they need to fall through to the store-cli schema/transition validation
252
+ // below. The node-tool BASH_PATTERN matches store-cli.cjs invocations, but the
253
+ // security invariant is: store-cli payloads are always validated against schema,
254
+ // regardless of permission match. Skip forge-permissions for store-cli commands.
255
+ if (isToolCallEventType("bash", event)) {
256
+ const bashCmd = event.input.command ?? "";
257
+ if (!bashCmd.includes("store-cli.cjs")) {
258
+ const bashRule = matchForgePermission("bash", { command: bashCmd });
259
+ if (bashRule !== null) {
260
+ appendAudit(logsDir, `[forge-permissions] allowed bash: ${bashRule}`);
261
+ return undefined;
262
+ }
263
+ }
264
+ }
265
+ let skipTwoLayerGuard = false;
266
+ if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
267
+ const filePath = event.input.path ?? "";
268
+ const writeRule = matchForgePermission(event.toolName, { path: filePath });
269
+ if (writeRule !== null) {
270
+ appendAudit(logsDir, `[forge-permissions] allowed ${event.toolName}: ${writeRule}`);
271
+ skipTwoLayerGuard = true;
272
+ }
273
+ }
225
274
  // ── Two-layer boundary guard (FORGE-S20-T07) ───────────────────────────
226
275
  // Reject any write/edit whose target path resolves under
227
276
  // <cwd>/forge/forge/meta/. Two-layer rule: fixes to Forge itself go
228
277
  // through forge-engineer/forge-bugfixer against forge/, not via
229
278
  // forge-cli runtime edits. FORGE_HOOK_AUDIT=1 logs but never blocks.
279
+ // Skipped when forge-permissions already matched the path (skipTwoLayerGuard=true).
230
280
  if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
231
- const verdict = checkTwoLayerBoundary(event.input.path, process.cwd());
232
- if (!verdict.allowed) {
233
- appendAudit(logsDir, `[two-layer-guard] decision=would-block path=${verdict.resolvedPath} reason=${verdict.reason}`);
281
+ if (!skipTwoLayerGuard) {
282
+ const verdict = checkTwoLayerBoundary(event.input.path, process.cwd());
283
+ if (!verdict.allowed) {
284
+ appendAudit(logsDir, `[two-layer-guard] decision=would-block path=${verdict.resolvedPath} reason=${verdict.reason}`);
285
+ if (auditEnabled()) {
286
+ return undefined;
287
+ }
288
+ return { block: true, reason: verdict.reason };
289
+ }
290
+ }
291
+ // ── Write-boundary schema guard (FORGE-S23-T02) ─────────────────────
292
+ // After two-layer passes (or is skipped), validate the post-write contents
293
+ // against the Forge schema for the target path. Always runs regardless of
294
+ // skipTwoLayerGuard — AC#4: an allowed write to .forge/store/ that fails
295
+ // schema is still blocked. Only applies to .forge/store/** and
296
+ // .forge/config.json paths (registry-matched). Fail-open on internal errors.
297
+ // FORGE_SKIP_WRITE_VALIDATION=1 bypasses.
298
+ const resolvedPath = path.resolve(process.cwd(), event.input.path);
299
+ let postContents;
300
+ if (isToolCallEventType("write", event)) {
301
+ postContents = typeof event.input.content === "string" ? event.input.content : "";
302
+ }
303
+ else {
304
+ // Edit event: apply pi edits array to current file contents
305
+ const editsInput = event.input.edits;
306
+ const edits = Array.isArray(editsInput) ? editsInput : [];
307
+ postContents = applyPiEdits(resolvedPath, edits);
308
+ }
309
+ const guardResult = checkWriteGuard(resolvedPath, postContents, forgeRoot);
310
+ if (guardResult.block) {
311
+ appendAudit(logsDir, `[write-guard] decision=would-block path=${resolvedPath} reason=${guardResult.reason ?? "schema violation"}`);
234
312
  if (auditEnabled()) {
235
313
  return undefined;
236
314
  }
237
- return { block: true, reason: verdict.reason };
315
+ return { block: true, reason: guardResult.reason };
238
316
  }
317
+ appendAudit(logsDir, `[write-guard] decision=would-allow path=${resolvedPath}`);
239
318
  }
240
319
  // Bash interception: identify store-cli write/update-status calls.
241
320
  if (isToolCallEventType("bash", event)) {
@@ -292,10 +371,26 @@ export function registerHookDispatcher(pi, forgeRoot) {
292
371
  }
293
372
  return undefined;
294
373
  });
295
- // ── tool_result: fires after any tool completes (observe-only) ──────────────
296
- pi.on("tool_result", (event) => {
374
+ // ── tool_result: fires after any tool completes ───────────────────────────
375
+ pi.on("tool_result", (event, ctx) => {
297
376
  appendAudit(logsDir, `[tool_result] toolName=${event.toolName} toolCallId=${event.toolCallId}`);
298
- // Audit-only in T02 return void (no result replacement).
377
+ // ── Triage-error: post-Bash-failure context injection (FORGE-S23-T03) ──
378
+ // When a Bash command exits non-zero and matches Forge-related patterns,
379
+ // notify the user to file a bug via /forge:report-bug.
380
+ if (isBashToolResult(event) && event.isError) {
381
+ const command = typeof event.input.command === "string" ? event.input.command : "";
382
+ if (isForgeRelated(command)) {
383
+ const snippet = event.content
384
+ .filter((c) => c.type === "text")
385
+ .map((c) => c.text)
386
+ .join("")
387
+ .split("\n")
388
+ .slice(0, 3)
389
+ .join(" ")
390
+ .trim();
391
+ ctx.ui.notify(buildTriageMessage(command, snippet), "warning");
392
+ }
393
+ }
299
394
  });
300
395
  }
301
396
  //# sourceMappingURL=hook-dispatcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hook-dispatcher.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/hook-dispatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook-dispatcher.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/hook-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ export interface CheckUpdateOptions {
2
+ forgeRoot: string;
3
+ configPath: string;
4
+ cwd?: string;
5
+ homeDir?: string;
6
+ }
7
+ export interface ProjectCache {
8
+ migratedFrom?: string;
9
+ localVersion?: string;
10
+ distribution?: string;
11
+ forgeRoot?: string;
12
+ forgeRef?: string;
13
+ updateStatus?: "pending" | "complete";
14
+ pendingReason?: string | null;
15
+ pendingMigrations?: string[];
16
+ }
17
+ export interface InstallRecord {
18
+ path: string;
19
+ version: string;
20
+ distribution: string;
21
+ scope: "user" | "project" | "unknown";
22
+ enabled: boolean;
23
+ }
24
+ /**
25
+ * Derives the distribution name from a plugin root path.
26
+ * Ported verbatim from forge/forge/hooks/check-update.js `detectDistribution()`.
27
+ *
28
+ * Returns "forge@skillforge" for skillforge-marketplace installs,
29
+ * "forge@forge" for all others (direct forge installs).
30
+ */
31
+ export declare function detectDistribution(root: string): string;
32
+ /**
33
+ * Reads and parses the project-level update-check cache from .forge/update-check-cache.json.
34
+ * Returns null if the file is absent or malformed.
35
+ * Non-fatal — all errors are swallowed.
36
+ */
37
+ export declare function readProjectCache(forgeDir: string): ProjectCache | null;
38
+ /**
39
+ * Builds a Forge-awareness message if this project has a .forge/config.json.
40
+ * Corresponds to the forge-awareness context injection in check-update.js.
41
+ *
42
+ * In the plugin, this is emitted as {"additionalContext":"..."} to stdout.
43
+ * In forge-cli, the caller does ctx.ui.notify(msg, "info") — pi has no
44
+ * session_start additionalContext protocol.
45
+ *
46
+ * Returns null when configPath is missing or unreadable (e.g. outside-Forge project).
47
+ */
48
+ export declare function buildForgeAwarenessMsg(configPath: string): string | null;
49
+ /**
50
+ * Scans known plugin locations for all Forge installations.
51
+ * Ported from check-update.js scanPluginInstallations() with injectable options for testing.
52
+ *
53
+ * Returns an array of installation records with version, distribution, scope, enabled status.
54
+ */
55
+ export declare function scanPluginInstallations(opts?: {
56
+ homeDir?: string;
57
+ cwd?: string;
58
+ }): InstallRecord[];
59
+ /**
60
+ * Builds a multi-plugin awareness message if multiple Forge installations are detected.
61
+ * Returns null if only one (or zero) installations found.
62
+ */
63
+ export declare function buildMultiPluginMsg(opts: CheckUpdateOptions): string | null;
64
+ /**
65
+ * Syncs paths.forgeRoot and paths.forgeRef in .forge/config.json if they drift.
66
+ * Detects distribution switches (forge@forge ↔ forge@skillforge) and returns a
67
+ * notification message if the distribution changed; returns null otherwise.
68
+ *
69
+ * Also updates the project-level cache (.forge/update-check-cache.json) with
70
+ * current distribution, forgeRoot, and forgeRef (preserving updateStatus, pendingMigrations).
71
+ *
72
+ * Corresponds to the "Distribution + forgeRoot/forgeRef sync" section in check-update.js.
73
+ */
74
+ export declare function syncForgeRootAndRef(opts: CheckUpdateOptions): string | null;
75
+ /**
76
+ * Surfaces a pending-migration warning if the project cache shows updateStatus === "pending".
77
+ * Returns the warning message string, or null if no pending state or cache absent.
78
+ *
79
+ * Corresponds to FR-002 pending-state surfacing in check-update.js.
80
+ */
81
+ export declare function buildPendingMigrationMsg(configPath: string): string | null;
@@ -0,0 +1,308 @@
1
+ // hooks/check-update.ts — Session-start Forge-awareness + project-state sync (FORGE-S23-T05).
2
+ //
3
+ // Port of forge/forge/hooks/check-update.js functions (1), (3), (4), (5) for the
4
+ // pi extension context. Function (2) — version-check throttle (npm + GH dual-probe)
5
+ // — is covered by the existing update-check.ts and is NOT duplicated here.
6
+ //
7
+ // Five functions ported:
8
+ // (1) buildForgeAwarenessMsg — AC#1: forge-awareness context injection
9
+ // (3) syncForgeRootAndRef — AC#2, AC#6: distribution-switch detection + forgeRoot/forgeRef sync
10
+ // (4) scanPluginInstallations — AC#3: multi-plugin scanning
11
+ // buildMultiPluginMsg — AC#3: builds notification from scan results
12
+ // (5) buildPendingMigrationMsg — AC#4: pending-migration state surfacing
13
+ //
14
+ // Key differences from plugin:
15
+ // - No stdout hook protocol: pi has no `{"additionalContext":"..."}` stdout pipe.
16
+ // All surfacing is via ctx.ui.notify() — callers do the notify, this module
17
+ // returns strings (or null) for testability.
18
+ // - Config-authoritative: forge-cli uses paths.forgeRoot from .forge/config.json
19
+ // as truth; no CLAUDE_PLUGIN_ROOT env var.
20
+ // - forgeRef source: reads <paths.forgeRoot>/.claude-plugin/plugin.json at runtime
21
+ // (live version), not PKG_VERSIONS.bundledForgeVersion (baked at build time).
22
+ // - Plugin-level cache (CLAUDE_PLUGIN_DATA/update-check-cache.json): not used.
23
+ // Only the project-level cache (.forge/update-check-cache.json) is read/written.
24
+ //
25
+ // All file I/O is wrapped in try/catch — non-fatal. Session-start must never throw.
26
+ //
27
+ // Plugin parity reference: forge/forge/hooks/check-update.js (read-only — do NOT edit).
28
+ //
29
+ // Iron Laws:
30
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
31
+ // IL5 — vendored forge is read-only; check-update.js is reference only.
32
+ // IL6 — no shell-string interpolation; no spawn calls; only Node fs built-in.
33
+ import * as fs from "node:fs";
34
+ import * as os from "node:os";
35
+ import * as path from "node:path";
36
+ // ── Distribution detection (ported verbatim from check-update.js) ─────────────
37
+ /**
38
+ * Derives the distribution name from a plugin root path.
39
+ * Ported verbatim from forge/forge/hooks/check-update.js `detectDistribution()`.
40
+ *
41
+ * Returns "forge@skillforge" for skillforge-marketplace installs,
42
+ * "forge@forge" for all others (direct forge installs).
43
+ */
44
+ export function detectDistribution(root) {
45
+ return root.includes("/cache/skillforge/forge/") || root.includes("/marketplaces/skillforge/forge/")
46
+ ? "forge@skillforge"
47
+ : "forge@forge";
48
+ }
49
+ // ── Project cache I/O ─────────────────────────────────────────────────────────
50
+ /**
51
+ * Reads and parses the project-level update-check cache from .forge/update-check-cache.json.
52
+ * Returns null if the file is absent or malformed.
53
+ * Non-fatal — all errors are swallowed.
54
+ */
55
+ export function readProjectCache(forgeDir) {
56
+ try {
57
+ const cacheFile = path.join(forgeDir, "update-check-cache.json");
58
+ const raw = fs.readFileSync(cacheFile, "utf8");
59
+ const parsed = JSON.parse(raw);
60
+ return parsed;
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ // ── Function (1): Forge-awareness context injection ───────────────────────────
67
+ /**
68
+ * Builds a Forge-awareness message if this project has a .forge/config.json.
69
+ * Corresponds to the forge-awareness context injection in check-update.js.
70
+ *
71
+ * In the plugin, this is emitted as {"additionalContext":"..."} to stdout.
72
+ * In forge-cli, the caller does ctx.ui.notify(msg, "info") — pi has no
73
+ * session_start additionalContext protocol.
74
+ *
75
+ * Returns null when configPath is missing or unreadable (e.g. outside-Forge project).
76
+ */
77
+ export function buildForgeAwarenessMsg(configPath) {
78
+ try {
79
+ if (!fs.existsSync(configPath))
80
+ return null;
81
+ return ("This project uses Forge AI-SDLC. Engineering knowledge base: engineering/. " +
82
+ "Generated workflows: .forge/workflows/. Sprint and task store: .forge/store/. " +
83
+ "Use the project slash commands (/plan, /implement, /sprint-plan) to drive development. " +
84
+ "Run /forge:health to check knowledge base currency.");
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ // ── Plugin enabled check (ported from check-update.js) ───────────────────────
91
+ /**
92
+ * Returns true if the Forge plugin is enabled in user/project settings.
93
+ * Mirrors isPluginEnabled() from check-update.js.
94
+ */
95
+ function isPluginEnabled(pluginPath, scope, homeDir, cwd) {
96
+ try {
97
+ const userSettingsPath = path.join(homeDir, ".claude", "settings.json");
98
+ if (fs.existsSync(userSettingsPath)) {
99
+ const userSettings = JSON.parse(fs.readFileSync(userSettingsPath, "utf8"));
100
+ if (userSettings.disablePlugin === true)
101
+ return false;
102
+ const plugins = userSettings.plugins;
103
+ if (plugins && plugins.forge === false)
104
+ return false;
105
+ }
106
+ const projectSettingsPath = path.join(cwd, ".claude", "settings.local.json");
107
+ if (fs.existsSync(projectSettingsPath)) {
108
+ const projectSettings = JSON.parse(fs.readFileSync(projectSettingsPath, "utf8"));
109
+ if (projectSettings.disablePlugin === true)
110
+ return false;
111
+ const plugins = projectSettings.plugins;
112
+ if (plugins && plugins.forge === false)
113
+ return false;
114
+ }
115
+ return true;
116
+ }
117
+ catch {
118
+ return true; // Non-fatal — assume enabled if cannot read settings
119
+ }
120
+ }
121
+ // ── Function (4): Multi-plugin scanning ──────────────────────────────────────
122
+ /**
123
+ * Scans known plugin locations for all Forge installations.
124
+ * Ported from check-update.js scanPluginInstallations() with injectable options for testing.
125
+ *
126
+ * Returns an array of installation records with version, distribution, scope, enabled status.
127
+ */
128
+ export function scanPluginInstallations(opts) {
129
+ const installations = [];
130
+ const homeDir = opts?.homeDir ?? os.homedir();
131
+ const cwd = opts?.cwd ?? process.cwd();
132
+ // Candidate paths — user scope (global) and project scope (local)
133
+ // Also scan skillforge subdirectory variant (skillforge/forge/forge)
134
+ const basePaths = [path.join(homeDir, ".claude", "plugins"), path.join(cwd, ".claude", "plugins")];
135
+ const variants = ["cache", "marketplaces"];
136
+ const pluginNames = ["forge/forge", "skillforge/forge/forge"];
137
+ const candidates = [];
138
+ for (const basePath of basePaths) {
139
+ for (const variant of variants) {
140
+ for (const pluginName of pluginNames) {
141
+ candidates.push(path.join(basePath, variant, pluginName));
142
+ }
143
+ }
144
+ }
145
+ for (const candidate of candidates) {
146
+ try {
147
+ const pluginJsonPath = path.join(candidate, ".claude-plugin", "plugin.json");
148
+ if (!fs.existsSync(pluginJsonPath))
149
+ continue;
150
+ const manifest = JSON.parse(fs.readFileSync(pluginJsonPath, "utf8"));
151
+ // Determine scope: project-scope paths start with cwd/.claude (check first to avoid
152
+ // false positives when cwd is a subdirectory of homeDir)
153
+ const isProjectScope = candidate.startsWith(path.join(cwd, ".claude"));
154
+ const isUserScope = candidate.startsWith(path.join(homeDir, ".claude"));
155
+ const scope = isProjectScope ? "project" : isUserScope ? "user" : "unknown";
156
+ const enabled = isPluginEnabled(candidate, scope, homeDir, cwd);
157
+ // Avoid duplicates
158
+ if (installations.some((i) => i.path === candidate))
159
+ continue;
160
+ installations.push({
161
+ path: candidate,
162
+ version: manifest.version ?? "unknown",
163
+ distribution: detectDistribution(candidate),
164
+ scope,
165
+ enabled,
166
+ });
167
+ }
168
+ catch {
169
+ // Non-fatal — skip broken installations silently
170
+ }
171
+ }
172
+ return installations;
173
+ }
174
+ /**
175
+ * Builds a multi-plugin awareness message if multiple Forge installations are detected.
176
+ * Returns null if only one (or zero) installations found.
177
+ */
178
+ export function buildMultiPluginMsg(opts) {
179
+ try {
180
+ const cwd = opts.cwd ?? process.cwd();
181
+ const homeDir = opts.homeDir ?? os.homedir();
182
+ const allInstallations = scanPluginInstallations({ homeDir, cwd });
183
+ if (allInstallations.length < 2)
184
+ return null;
185
+ const activeInst = allInstallations.find((i) => i.path === opts.forgeRoot) ?? allInstallations[0];
186
+ if (!activeInst)
187
+ return null;
188
+ const otherInsts = allInstallations.filter((i) => i.path !== activeInst.path);
189
+ if (otherInsts.length === 0)
190
+ return null;
191
+ const otherDesc = otherInsts.map((i) => `${i.version} (${i.distribution}, ${i.scope})`).join(", ");
192
+ return `Forge: also installed: ${otherDesc}.`;
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ }
198
+ // ── Function (3): Distribution-switch detection + forgeRoot/forgeRef sync ─────
199
+ /**
200
+ * Syncs paths.forgeRoot and paths.forgeRef in .forge/config.json if they drift.
201
+ * Detects distribution switches (forge@forge ↔ forge@skillforge) and returns a
202
+ * notification message if the distribution changed; returns null otherwise.
203
+ *
204
+ * Also updates the project-level cache (.forge/update-check-cache.json) with
205
+ * current distribution, forgeRoot, and forgeRef (preserving updateStatus, pendingMigrations).
206
+ *
207
+ * Corresponds to the "Distribution + forgeRoot/forgeRef sync" section in check-update.js.
208
+ */
209
+ export function syncForgeRootAndRef(opts) {
210
+ try {
211
+ const forgeDir = path.dirname(opts.configPath);
212
+ const currentDistribution = detectDistribution(opts.forgeRoot);
213
+ // Read current local version from the live plugin.json (faithful port of check-update.js §4.2)
214
+ let localVersion = "unknown";
215
+ try {
216
+ const pluginJsonPath = path.join(opts.forgeRoot, ".claude-plugin", "plugin.json");
217
+ const manifest = JSON.parse(fs.readFileSync(pluginJsonPath, "utf8"));
218
+ localVersion = manifest.version ?? "unknown";
219
+ }
220
+ catch {
221
+ // Non-fatal — version sync skipped if plugin.json unreadable
222
+ }
223
+ // Sync config.json paths.forgeRoot and paths.forgeRef
224
+ try {
225
+ const cfg = JSON.parse(fs.readFileSync(opts.configPath, "utf8"));
226
+ if (!cfg.paths)
227
+ cfg.paths = {};
228
+ let configChanged = false;
229
+ if (cfg.paths.forgeRoot !== opts.forgeRoot) {
230
+ cfg.paths.forgeRoot = opts.forgeRoot;
231
+ configChanged = true;
232
+ }
233
+ if (localVersion !== "unknown" && cfg.paths.forgeRef !== localVersion) {
234
+ cfg.paths.forgeRef = localVersion;
235
+ configChanged = true;
236
+ }
237
+ if (configChanged) {
238
+ fs.writeFileSync(opts.configPath, JSON.stringify(cfg, null, 2) + "\n");
239
+ }
240
+ }
241
+ catch {
242
+ // Non-fatal — config sync skipped
243
+ }
244
+ // Read project cache for distribution-switch detection
245
+ const projectCache = readProjectCache(forgeDir);
246
+ if (!projectCache)
247
+ return null;
248
+ const storedRoot = projectCache.forgeRoot;
249
+ const storedDist = projectCache.distribution;
250
+ const switched = storedRoot !== undefined && storedRoot !== opts.forgeRoot;
251
+ let distributionSwitchMsg = null;
252
+ if (switched && storedDist !== undefined && storedDist !== currentDistribution) {
253
+ const versionNote = projectCache.localVersion !== undefined && projectCache.localVersion !== localVersion
254
+ ? ` Version: ${projectCache.localVersion} → ${localVersion}.`
255
+ : "";
256
+ distributionSwitchMsg =
257
+ `Forge: plugin distribution switched from ${storedDist} to ${currentDistribution}.${versionNote}` +
258
+ ` paths.forgeRoot updated. Run /forge:update to verify migration state.`;
259
+ }
260
+ // Sync distribution + forgeRoot + forgeRef into the project cache whenever they drift.
261
+ // Preserve updateStatus, pendingReason, pendingMigrations via spread (FR-002 parity).
262
+ if (storedRoot !== opts.forgeRoot || storedDist !== currentDistribution) {
263
+ try {
264
+ const updated = {
265
+ ...projectCache,
266
+ distribution: currentDistribution,
267
+ forgeRoot: opts.forgeRoot,
268
+ forgeRef: localVersion,
269
+ };
270
+ const cacheFile = path.join(forgeDir, "update-check-cache.json");
271
+ fs.writeFileSync(cacheFile, JSON.stringify(updated, null, 2) + "\n");
272
+ }
273
+ catch {
274
+ // Non-fatal
275
+ }
276
+ }
277
+ return distributionSwitchMsg;
278
+ }
279
+ catch {
280
+ return null;
281
+ }
282
+ }
283
+ // ── Function (5): Pending-migration state surfacing ───────────────────────────
284
+ /**
285
+ * Surfaces a pending-migration warning if the project cache shows updateStatus === "pending".
286
+ * Returns the warning message string, or null if no pending state or cache absent.
287
+ *
288
+ * Corresponds to FR-002 pending-state surfacing in check-update.js.
289
+ */
290
+ export function buildPendingMigrationMsg(configPath) {
291
+ try {
292
+ const forgeDir = path.dirname(configPath);
293
+ const projectCache = readProjectCache(forgeDir);
294
+ if (!projectCache)
295
+ return null;
296
+ if (projectCache.updateStatus !== "pending")
297
+ return null;
298
+ const pendingMigrations = Array.isArray(projectCache.pendingMigrations)
299
+ ? projectCache.pendingMigrations.join(", ")
300
+ : "(unknown)";
301
+ return (`Forge update is incomplete — pending migration(s): ${pendingMigrations}. ` +
302
+ `Run /forge:update to continue or /forge:migrate to complete.`);
303
+ }
304
+ catch {
305
+ return null;
306
+ }
307
+ }
308
+ //# sourceMappingURL=check-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-update.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/hooks/check-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** A single pattern entry in the permission registry. */
2
+ interface PermissionPattern {
3
+ /** Regex tested against the tool input string. */
4
+ pattern: RegExp;
5
+ /**
6
+ * Human-readable rule string — kept for audit-log display only.
7
+ * NOT persisted: pi has no PermissionRequest event.
8
+ */
9
+ rule: string;
10
+ }
11
+ /** Bash command patterns that are auto-allowed. */
12
+ export declare const BASH_PATTERNS: PermissionPattern[];
13
+ /** Write tool path patterns that are auto-allowed. */
14
+ export declare const WRITE_PATTERNS: PermissionPattern[];
15
+ /** Edit tool path patterns that are auto-allowed. */
16
+ export declare const EDIT_PATTERNS: PermissionPattern[];
17
+ /**
18
+ * Check whether a pi tool_call matches a known Forge auto-allow pattern.
19
+ *
20
+ * @param toolName The pi tool name ("bash", "write", "edit", etc.)
21
+ * @param toolInput The tool's input object (toolCallEvent.input)
22
+ * @returns The matched rule string for audit logging, or null if no match.
23
+ * A non-null return is the "silently allow" signal — the caller
24
+ * should return undefined from the tool_call handler (no block).
25
+ *
26
+ * Input fields tested per tool type (mirrors plugin matchTool):
27
+ * bash → toolInput.command (string)
28
+ * write → toolInput.path (string; pi uses `path`, not `file_path`)
29
+ * edit → toolInput.path (string)
30
+ */
31
+ export declare function matchForgePermission(toolName: string, toolInput: Record<string, unknown>): string | null;
32
+ export {};