@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.
- package/CHANGELOG.md +78 -0
- package/README.md +21 -3
- package/dist/CHANGELOG-forge-plugin.md +22 -0
- package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
- package/dist/extensions/forgecli/add-pipeline.js +143 -0
- package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/add-task.d.ts +20 -0
- package/dist/extensions/forgecli/add-task.js +154 -0
- package/dist/extensions/forgecli/add-task.js.map +1 -0
- package/dist/extensions/forgecli/calibrate.d.ts +61 -0
- package/dist/extensions/forgecli/calibrate.js +488 -0
- package/dist/extensions/forgecli/calibrate.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.d.ts +9 -1
- package/dist/extensions/forgecli/fix-bug.js +70 -8
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-commands.js +15 -22
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.js +34 -7
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-update-command.d.ts +9 -0
- package/dist/extensions/forgecli/forge-update-command.js +106 -7
- package/dist/extensions/forgecli/forge-update-command.js.map +1 -1
- package/dist/extensions/forgecli/health-check.d.ts +22 -1
- package/dist/extensions/forgecli/health-check.js +177 -4
- package/dist/extensions/forgecli/health-check.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +25 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +104 -9
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/hooks/check-update.d.ts +81 -0
- package/dist/extensions/forgecli/hooks/check-update.js +308 -0
- package/dist/extensions/forgecli/hooks/check-update.js.map +1 -0
- package/dist/extensions/forgecli/hooks/forge-permissions.d.ts +32 -0
- package/dist/extensions/forgecli/hooks/forge-permissions.js +119 -0
- package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -0
- package/dist/extensions/forgecli/hooks/triage-error.d.ts +23 -0
- package/dist/extensions/forgecli/hooks/triage-error.js +62 -0
- package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -0
- package/dist/extensions/forgecli/hooks/write-guard.d.ts +28 -0
- package/dist/extensions/forgecli/hooks/write-guard.js +225 -0
- package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -0
- package/dist/extensions/forgecli/index.js +60 -0
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/init-context.d.ts +1 -1
- package/dist/extensions/forgecli/init-context.js +21 -6
- package/dist/extensions/forgecli/init-context.js.map +1 -1
- package/dist/extensions/forgecli/materialize.d.ts +16 -0
- package/dist/extensions/forgecli/materialize.js +195 -0
- package/dist/extensions/forgecli/materialize.js.map +1 -0
- package/dist/extensions/forgecli/migrate.d.ts +19 -0
- package/dist/extensions/forgecli/migrate.js +258 -0
- package/dist/extensions/forgecli/migrate.js.map +1 -0
- package/dist/extensions/forgecli/migration-engine.d.ts +111 -0
- package/dist/extensions/forgecli/migration-engine.js +533 -0
- package/dist/extensions/forgecli/migration-engine.js.map +1 -0
- package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
- package/dist/extensions/forgecli/quiz-agent.js +98 -0
- package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
- package/dist/extensions/forgecli/remove-command.d.ts +17 -0
- package/dist/extensions/forgecli/remove-command.js +124 -0
- package/dist/extensions/forgecli/remove-command.js.map +1 -0
- package/dist/extensions/forgecli/report-bug.d.ts +25 -0
- package/dist/extensions/forgecli/report-bug.js +159 -0
- package/dist/extensions/forgecli/report-bug.js.map +1 -0
- package/dist/extensions/forgecli/retrospective.d.ts +19 -0
- package/dist/extensions/forgecli/retrospective.js +156 -0
- package/dist/extensions/forgecli/retrospective.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.js +34 -0
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +9 -1
- package/dist/extensions/forgecli/run-task.js +64 -10
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/session-registry.d.ts +27 -2
- package/dist/extensions/forgecli/session-registry.js +52 -1
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/status-command.d.ts +19 -0
- package/dist/extensions/forgecli/status-command.js +140 -0
- package/dist/extensions/forgecli/status-command.js.map +1 -0
- package/dist/extensions/forgecli/store-query.d.ts +22 -0
- package/dist/extensions/forgecli/store-query.js +107 -0
- package/dist/extensions/forgecli/store-query.js.map +1 -0
- package/dist/extensions/forgecli/store-repair.d.ts +17 -0
- package/dist/extensions/forgecli/store-repair.js +123 -0
- package/dist/extensions/forgecli/store-repair.js.map +1 -0
- package/dist/extensions/forgecli/thread-switcher.js +213 -28
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/update-tools.d.ts +23 -0
- package/dist/extensions/forgecli/update-tools.js +136 -0
- package/dist/extensions/forgecli/update-tools.js.map +1 -0
- package/dist/extensions/forgecli/viewport-theme.js +4 -0
- package/dist/extensions/forgecli/viewport-theme.js.map +1 -1
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/config.schema.json +83 -0
- package/dist/forge-payload/.schemas/migrations.json +2049 -0
- package/dist/forge-payload/commands/regenerate.md +17 -1
- package/dist/forge-payload/meta/personas/README.md +16 -0
- package/dist/forge-payload/meta/personas/meta-architect.md +70 -0
- package/dist/forge-payload/meta/personas/meta-bug-fixer.md +73 -0
- package/dist/forge-payload/meta/personas/meta-collator.md +72 -0
- package/dist/forge-payload/meta/personas/meta-engineer.md +70 -0
- package/dist/forge-payload/meta/personas/meta-orchestrator.md +71 -0
- package/dist/forge-payload/meta/personas/meta-product-manager.md +82 -0
- package/dist/forge-payload/meta/personas/meta-qa-engineer.md +91 -0
- package/dist/forge-payload/meta/personas/meta-supervisor.md +92 -0
- package/dist/forge-payload/meta/skill-recommendations.md +154 -0
- package/dist/forge-payload/meta/skills/meta-architect-skills.md +43 -0
- package/dist/forge-payload/meta/skills/meta-bug-fixer-skills.md +43 -0
- package/dist/forge-payload/meta/skills/meta-collator-skills.md +41 -0
- package/dist/forge-payload/meta/skills/meta-engineer-skills.md +43 -0
- package/dist/forge-payload/meta/skills/meta-generic-skills.md +58 -0
- package/dist/forge-payload/meta/skills/meta-qa-engineer-skills.md +46 -0
- package/dist/forge-payload/meta/skills/meta-supervisor-skills.md +43 -0
- package/dist/forge-payload/meta/store-schema/bug.schema.md +71 -0
- package/dist/forge-payload/meta/store-schema/event.schema.md +76 -0
- package/dist/forge-payload/meta/store-schema/feature.schema.md +65 -0
- package/dist/forge-payload/meta/store-schema/sprint.schema.md +64 -0
- package/dist/forge-payload/meta/store-schema/task.schema.md +78 -0
- package/dist/forge-payload/meta/templates/meta-code-review.md +26 -0
- package/dist/forge-payload/meta/templates/meta-plan-review.md +28 -0
- package/dist/forge-payload/meta/templates/meta-plan.md +28 -0
- package/dist/forge-payload/meta/templates/meta-progress.md +25 -0
- package/dist/forge-payload/meta/templates/meta-retrospective.md +28 -0
- package/dist/forge-payload/meta/templates/meta-sprint-manifest.md +26 -0
- package/dist/forge-payload/meta/templates/meta-sprint-requirements.md +91 -0
- package/dist/forge-payload/meta/templates/meta-task-prompt.md +26 -0
- package/dist/forge-payload/meta/tool-specs/collate.spec.md +88 -0
- package/dist/forge-payload/meta/tool-specs/generation-manifest.spec.md +139 -0
- package/dist/forge-payload/meta/tool-specs/manage-config.spec.md +143 -0
- package/dist/forge-payload/meta/tool-specs/seed-store.spec.md +91 -0
- package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +328 -0
- package/dist/forge-payload/meta/tool-specs/validate-store.spec.md +191 -0
- package/dist/forge-payload/meta/workflows/_fragments/context-injection.md +75 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +73 -0
- package/dist/forge-payload/meta/workflows/_fragments/finalize.md +13 -0
- package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +73 -0
- package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +38 -0
- package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +39 -0
- package/dist/forge-payload/meta/workflows/meta-approve.md +119 -0
- package/dist/forge-payload/meta/workflows/meta-collate.md +89 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +93 -0
- package/dist/forge-payload/meta/workflows/meta-enhance.md +286 -0
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +501 -0
- package/dist/forge-payload/meta/workflows/meta-implement.md +132 -0
- package/dist/forge-payload/meta/workflows/meta-migrate.md +455 -0
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +993 -0
- package/dist/forge-payload/meta/workflows/meta-plan-task.md +133 -0
- package/dist/forge-payload/meta/workflows/meta-quiz-agent.md +135 -0
- package/dist/forge-payload/meta/workflows/meta-retrospective.md +65 -0
- package/dist/forge-payload/meta/workflows/meta-review-implementation.md +119 -0
- package/dist/forge-payload/meta/workflows/meta-review-plan.md +108 -0
- package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +65 -0
- package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +76 -0
- package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +147 -0
- package/dist/forge-payload/meta/workflows/meta-update-implementation.md +76 -0
- package/dist/forge-payload/meta/workflows/meta-update-plan.md +76 -0
- package/dist/forge-payload/meta/workflows/meta-validate.md +111 -0
- package/dist/forge-payload/tools/check-structure.cjs +344 -0
- package/dist/forge-payload/tools/list-skills.js +76 -0
- package/dist/forge-payload/tools/store-cli.cjs +27 -1
- package/dist/forge-payload/tools/substitute-placeholders.cjs +60 -8
- package/dist/forge-payload/tools/verify-integrity.cjs +86 -0
- 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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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:
|
|
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
|
|
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
|
-
//
|
|
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":"AAAA,0EAA0E;AAC1E,EAAE;AACF,yEAAyE;AACzE,oDAAoD;AACpD,kFAAkF;AAClF,+EAA+E;AAC/E,wEAAwE;AACxE,oEAAoE;AACpE,0EAA0E;AAC1E,iFAAiF;AACjF,EAAE;AACF,2EAA2E;AAC3E,yDAAyD;AACzD,+EAA+E;AAC/E,EAAE;AACF,iBAAiB;AACjB,6EAA6E;AAC7E,wEAAwE;AAExE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA4DxD,wEAAwE;AACxE,kDAAkD;AAClD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAmD,CAAC;AAEtF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC/B,SAAoB,EACpB,OAAiC;IAEjC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACzD,QAAQ,CAAC,IAAI,CAAC,OAAgD,CAAC,CAAC;IAChE,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAqB,EAAE,GAA4B;IAC3F,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,6CAA6C;YAC7C,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC;gBACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,KAAK,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC;YACnG,CAAC;YAAC,MAAM,CAAC;gBACR,yDAAyD;YAC1D,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACtC,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC;AAcD,iFAAiF;AAEjF,SAAS,YAAY;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,IAAY;IACjD,IAAI,CAAC,YAAY,EAAE;QAAE,OAAO;IAC5B,IAAI,CAAC;QACJ,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACR,6DAA6D;IAC9D,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,UAAkB;IAC1E,gDAAgD;IAChD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,2EAA2E;IAC3E,yFAAyF;IACzF,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,8EAA8E;IAC9E,8EAA8E;IAC9E,iCAAiC;IACjC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACzC,WAAW,GAAG,CAAC,CAAC;YAChB,MAAM;QACP,CAAC;IACF,CAAC;IACD,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAExE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IAE3C,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC3B,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACJ,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACR,0DAA0D;YAC1D,OAAO,GAAG,UAAU,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QACnC,iEAAiE;QACjE,4DAA4D;QAC5D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,qDAAqD;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO;YACN,MAAM,EAAE,eAAe;YACvB,MAAM;YACN,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;SACnC,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAAC,OAAe;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,mBAAmB;QACnB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAAE,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM;QAE/B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAChB,yBAAyB;YACzB,CAAC,EAAE,CAAC,CAAC,qBAAqB;YAC1B,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjD,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM;gBAAE,CAAC,EAAE,CAAC,CAAC,qBAAqB;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACvB,4CAA4C;YAC5C,CAAC,EAAE,CAAC,CAAC,qBAAqB;YAC1B,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjD,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM;gBAAE,CAAC,EAAE,CAAC,CAAC,qBAAqB;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,wDAAwD;YACxD,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAgB,EAAE,SAAiB;IACzE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE3D,6EAA6E;IAC7E,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAoB,EAA8B,EAAE;QACvE,WAAW,CAAC,OAAO,EAAE,wBAAwB,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAE9F,0EAA0E;QAC1E,yDAAyD;QACzD,oEAAoE;QACpE,gEAAgE;QAChE,qEAAqE;QACrE,IAAI,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/E,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACtB,WAAW,CACV,OAAO,EACP,+CAA+C,OAAO,CAAC,YAAY,WAAW,OAAO,CAAC,MAAM,EAAE,CAC9F,CAAC;gBACF,IAAI,YAAY,EAAE,EAAE,CAAC;oBACpB,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAgB,EAAE,CAAC;YAC1D,CAAC;QACF,CAAC;QAED,mEAAmE;QACnE,IAAI,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,KAA0B,CAAC;YAC7C,MAAM,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC9E,IAAI,SAAS,EAAE,CAAC;gBACf,WAAW,CACV,OAAO,EACP,gCAAgC,SAAS,CAAC,MAAM,WAAW,SAAS,CAAC,MAAM,YAAY,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAC1H,CAAC;gBAEF,8CAA8C;gBAC9C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAE5C,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAClC,6DAA6D;oBAC7D,6CAA6C;oBAC7C,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBAC3F,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;wBACpB,WAAW,CAAC,OAAO,EAAE,qDAAqD,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC/F,IAAI,YAAY,EAAE,EAAE,CAAC;4BACpB,6BAA6B;4BAC7B,OAAO,SAAS,CAAC;wBAClB,CAAC;wBACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;oBACnD,CAAC;oBACD,WAAW,CAAC,OAAO,EAAE,4CAA4C,CAAC,CAAC;gBACpE,CAAC;qBAAM,IAAI,SAAS,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;oBACjD,+CAA+C;oBAC/C,kEAAkE;oBAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACf,MAAM,aAAa,GAAG,SAAS,CAAC,OAI/B,CAAC;wBACF,MAAM,KAAK,GAAG,eAAe,CAC5B;4BACC,MAAM,EAAE,SAAS,CAAC,MAAM;4BACxB,QAAQ,EAAE,aAAa,CAAC,QAAQ;4BAChC,QAAQ,EAAE,aAAa,CAAC,KAAK;yBAC7B,EACD,SAAS,CACT,CAAC;wBAEF,IAAI,KAAK,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;4BACtC,4CAA4C;4BAC5C,WAAW,CACV,OAAO,EACP,uDAAuD,SAAS,CAAC,MAAM,aAAa,aAAa,CAAC,QAAQ,EAAE,CAC5G,CAAC;4BACF,OAAO,SAAS,CAAC;wBAClB,CAAC;wBAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;4BACpB,WAAW,CAAC,OAAO,EAAE,qDAAqD,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;4BAC1F,IAAI,YAAY,EAAE,EAAE,CAAC;gCACpB,OAAO,SAAS,CAAC;4BAClB,CAAC;4BACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC9C,CAAC;wBACD,WAAW,CAAC,OAAO,EAAE,4CAA4C,CAAC,CAAC;oBACpE,CAAC;yBAAM,CAAC;wBACP,WAAW,CACV,OAAO,EACP,gFAAgF,CAChF,CAAC;oBACH,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAsB,EAAQ,EAAE;QACrD,WAAW,CAAC,OAAO,EAAE,0BAA0B,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAChG,2DAA2D;IAC5D,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
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 {};
|