@entelligentsia/forgecli 1.0.21 → 1.0.25
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 +88 -0
- package/dist/CHANGELOG-forge-plugin.md +118 -0
- package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
- package/dist/extensions/forgecli/forge-tools.js +73 -0
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
- package/dist/extensions/forgecli/lib/forge-root.js +14 -1
- package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/event.schema.json +8 -3
- package/dist/forge-payload/.schemas/migrations.json +56 -0
- package/dist/forge-payload/integrity.json +3 -3
- package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
- package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/event.schema.json +8 -3
- package/dist/forge-payload/schemas/structure-manifest.json +4 -2
- package/dist/forge-payload/tools/commit-task.cjs +218 -0
- package/dist/forge-payload/tools/store-cli.cjs +6 -1
- package/node_modules/@mariozechner/clipboard/package.json +2 -1
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
- package/package.json +2 -2
- package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
- package/dist/extensions/forgecli/add-pipeline.js +0 -143
- package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
- package/dist/extensions/forgecli/add-task.d.ts +0 -20
- package/dist/extensions/forgecli/add-task.js +0 -154
- package/dist/extensions/forgecli/add-task.js.map +0 -1
- package/dist/extensions/forgecli/approve.d.ts +0 -22
- package/dist/extensions/forgecli/approve.js +0 -152
- package/dist/extensions/forgecli/approve.js.map +0 -1
- package/dist/extensions/forgecli/banner.d.ts +0 -10
- package/dist/extensions/forgecli/banner.js +0 -36
- package/dist/extensions/forgecli/banner.js.map +0 -1
- package/dist/extensions/forgecli/calibrate.d.ts +0 -64
- package/dist/extensions/forgecli/calibrate.js +0 -481
- package/dist/extensions/forgecli/calibrate.js.map +0 -1
- package/dist/extensions/forgecli/collate.d.ts +0 -22
- package/dist/extensions/forgecli/collate.js +0 -134
- package/dist/extensions/forgecli/collate.js.map +0 -1
- package/dist/extensions/forgecli/commit.d.ts +0 -22
- package/dist/extensions/forgecli/commit.js +0 -152
- package/dist/extensions/forgecli/commit.js.map +0 -1
- package/dist/extensions/forgecli/config-command.d.ts +0 -8
- package/dist/extensions/forgecli/config-command.js +0 -67
- package/dist/extensions/forgecli/config-command.js.map +0 -1
- package/dist/extensions/forgecli/config-layer.d.ts +0 -53
- package/dist/extensions/forgecli/config-layer.js +0 -72
- package/dist/extensions/forgecli/config-layer.js.map +0 -1
- package/dist/extensions/forgecli/config-writer.d.ts +0 -16
- package/dist/extensions/forgecli/config-writer.js +0 -69
- package/dist/extensions/forgecli/config-writer.js.map +0 -1
- package/dist/extensions/forgecli/enhance.d.ts +0 -27
- package/dist/extensions/forgecli/enhance.js +0 -199
- package/dist/extensions/forgecli/enhance.js.map +0 -1
- package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
- package/dist/extensions/forgecli/fix-bug.js +0 -1580
- package/dist/extensions/forgecli/fix-bug.js.map +0 -1
- package/dist/extensions/forgecli/forge-header.d.ts +0 -12
- package/dist/extensions/forgecli/forge-header.js +0 -114
- package/dist/extensions/forgecli/forge-header.js.map +0 -1
- package/dist/extensions/forgecli/forge-init.d.ts +0 -26
- package/dist/extensions/forgecli/forge-init.js +0 -514
- package/dist/extensions/forgecli/forge-init.js.map +0 -1
- package/dist/extensions/forgecli/forge-root.d.ts +0 -10
- package/dist/extensions/forgecli/forge-root.js +0 -62
- package/dist/extensions/forgecli/forge-root.js.map +0 -1
- package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
- package/dist/extensions/forgecli/forge-update-command.js +0 -435
- package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
- package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
- package/dist/extensions/forgecli/friction-emit.js +0 -245
- package/dist/extensions/forgecli/friction-emit.js.map +0 -1
- package/dist/extensions/forgecli/implement.d.ts +0 -22
- package/dist/extensions/forgecli/implement.js +0 -170
- package/dist/extensions/forgecli/implement.js.map +0 -1
- package/dist/extensions/forgecli/init-context.d.ts +0 -99
- package/dist/extensions/forgecli/init-context.js +0 -178
- package/dist/extensions/forgecli/init-context.js.map +0 -1
- package/dist/extensions/forgecli/init-progress.d.ts +0 -39
- package/dist/extensions/forgecli/init-progress.js +0 -117
- package/dist/extensions/forgecli/init-progress.js.map +0 -1
- package/dist/extensions/forgecli/input-router.d.ts +0 -33
- package/dist/extensions/forgecli/input-router.js +0 -136
- package/dist/extensions/forgecli/input-router.js.map +0 -1
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
- package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
- package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
- package/dist/extensions/forgecli/materialize.d.ts +0 -16
- package/dist/extensions/forgecli/materialize.js +0 -195
- package/dist/extensions/forgecli/materialize.js.map +0 -1
- package/dist/extensions/forgecli/migrate.d.ts +0 -22
- package/dist/extensions/forgecli/migrate.js +0 -260
- package/dist/extensions/forgecli/migrate.js.map +0 -1
- package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
- package/dist/extensions/forgecli/migration-engine.js +0 -563
- package/dist/extensions/forgecli/migration-engine.js.map +0 -1
- package/dist/extensions/forgecli/model-registry.d.ts +0 -61
- package/dist/extensions/forgecli/model-registry.js +0 -127
- package/dist/extensions/forgecli/model-registry.js.map +0 -1
- package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
- package/dist/extensions/forgecli/model-resolver.js +0 -65
- package/dist/extensions/forgecli/model-resolver.js.map +0 -1
- package/dist/extensions/forgecli/model-validator.d.ts +0 -29
- package/dist/extensions/forgecli/model-validator.js +0 -107
- package/dist/extensions/forgecli/model-validator.js.map +0 -1
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
- package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
- package/dist/extensions/forgecli/plan.d.ts +0 -22
- package/dist/extensions/forgecli/plan.js +0 -167
- package/dist/extensions/forgecli/plan.js.map +0 -1
- package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
- package/dist/extensions/forgecli/quiz-agent.js +0 -98
- package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
- package/dist/extensions/forgecli/read-command.d.ts +0 -2
- package/dist/extensions/forgecli/read-command.js +0 -100
- package/dist/extensions/forgecli/read-command.js.map +0 -1
- package/dist/extensions/forgecli/regenerate.d.ts +0 -40
- package/dist/extensions/forgecli/regenerate.js +0 -438
- package/dist/extensions/forgecli/regenerate.js.map +0 -1
- package/dist/extensions/forgecli/remove-command.d.ts +0 -17
- package/dist/extensions/forgecli/remove-command.js +0 -124
- package/dist/extensions/forgecli/remove-command.js.map +0 -1
- package/dist/extensions/forgecli/report-bug.d.ts +0 -25
- package/dist/extensions/forgecli/report-bug.js +0 -159
- package/dist/extensions/forgecli/report-bug.js.map +0 -1
- package/dist/extensions/forgecli/retrospective.d.ts +0 -20
- package/dist/extensions/forgecli/retrospective.js +0 -126
- package/dist/extensions/forgecli/retrospective.js.map +0 -1
- package/dist/extensions/forgecli/review-code.d.ts +0 -35
- package/dist/extensions/forgecli/review-code.js +0 -196
- package/dist/extensions/forgecli/review-code.js.map +0 -1
- package/dist/extensions/forgecli/review-plan.d.ts +0 -35
- package/dist/extensions/forgecli/review-plan.js +0 -200
- package/dist/extensions/forgecli/review-plan.js.map +0 -1
- package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
- package/dist/extensions/forgecli/run-sprint.js +0 -716
- package/dist/extensions/forgecli/run-sprint.js.map +0 -1
- package/dist/extensions/forgecli/run-task.d.ts +0 -204
- package/dist/extensions/forgecli/run-task.js +0 -1403
- package/dist/extensions/forgecli/run-task.js.map +0 -1
- package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
- package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
- package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
- package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
- package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
- package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
- package/dist/extensions/forgecli/skill-retriever.js +0 -246
- package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
- package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
- package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
- package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
- package/dist/extensions/forgecli/sprint-intake.js +0 -91
- package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
- package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
- package/dist/extensions/forgecli/sprint-plan.js +0 -122
- package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
- package/dist/extensions/forgecli/status-command.d.ts +0 -19
- package/dist/extensions/forgecli/status-command.js +0 -140
- package/dist/extensions/forgecli/status-command.js.map +0 -1
- package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
- package/dist/extensions/forgecli/store-error-remediation.js +0 -307
- package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
- package/dist/extensions/forgecli/store-query.d.ts +0 -22
- package/dist/extensions/forgecli/store-query.js +0 -107
- package/dist/extensions/forgecli/store-query.js.map +0 -1
- package/dist/extensions/forgecli/store-repair.d.ts +0 -17
- package/dist/extensions/forgecli/store-repair.js +0 -123
- package/dist/extensions/forgecli/store-repair.js.map +0 -1
- package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
- package/dist/extensions/forgecli/store-resolver.js +0 -263
- package/dist/extensions/forgecli/store-resolver.js.map +0 -1
- package/dist/extensions/forgecli/store-validator.d.ts +0 -16
- package/dist/extensions/forgecli/store-validator.js +0 -32
- package/dist/extensions/forgecli/store-validator.js.map +0 -1
- package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
- package/dist/extensions/forgecli/test-orchestrate.js +0 -182
- package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
- package/dist/extensions/forgecli/thread-switcher.js +0 -189
- package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
- package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
- package/dist/extensions/forgecli/transition-guard.js +0 -89
- package/dist/extensions/forgecli/transition-guard.js.map +0 -1
- package/dist/extensions/forgecli/update-check.d.ts +0 -37
- package/dist/extensions/forgecli/update-check.js +0 -185
- package/dist/extensions/forgecli/update-check.js.map +0 -1
- package/dist/extensions/forgecli/update-tools.d.ts +0 -23
- package/dist/extensions/forgecli/update-tools.js +0 -135
- package/dist/extensions/forgecli/update-tools.js.map +0 -1
- package/dist/extensions/forgecli/validate.d.ts +0 -22
- package/dist/extensions/forgecli/validate.js +0 -152
- package/dist/extensions/forgecli/validate.js.map +0 -1
- package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
- package/dist/extensions/forgecli/viewport-events.js +0 -243
- package/dist/extensions/forgecli/viewport-events.js.map +0 -1
- package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
- package/dist/extensions/forgecli/viewport-renderer.js +0 -233
- package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
- package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
- package/dist/extensions/forgecli/viewport-theme.js +0 -128
- package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
- package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
- package/dist/extensions/forgecli/whats-new-widget.js +0 -376
- package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
- package/dist/extensions/forgecli/whats-new.d.ts +0 -120
- package/dist/extensions/forgecli/whats-new.js +0 -470
- package/dist/extensions/forgecli/whats-new.js.map +0 -1
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
declare function changelogTagUrl(version: string): string;
|
|
3
|
-
export type InstallMethod = "global" | "npx" | "local-dev" | "unknown";
|
|
4
|
-
export interface DetectInstallOptions {
|
|
5
|
-
pkgRoot: string;
|
|
6
|
-
globalRoot?: string | null;
|
|
7
|
-
}
|
|
8
|
-
export declare function detectInstallMethod(opts: DetectInstallOptions): InstallMethod;
|
|
9
|
-
type ExecFileAsync = (cmd: string, args: readonly string[], options?: {
|
|
10
|
-
timeout?: number;
|
|
11
|
-
}) => Promise<{
|
|
12
|
-
stdout: string;
|
|
13
|
-
stderr: string;
|
|
14
|
-
}>;
|
|
15
|
-
export declare function getNpmGlobalRoot(runner?: ExecFileAsync): Promise<string | null>;
|
|
16
|
-
export interface ChangelogResult {
|
|
17
|
-
tag: string;
|
|
18
|
-
version: string;
|
|
19
|
-
body: string;
|
|
20
|
-
}
|
|
21
|
-
export declare function fetchChangelog(fetchImpl: typeof fetch): Promise<ChangelogResult | null>;
|
|
22
|
-
declare function parseTriple(v: string): [number, number, number] | null;
|
|
23
|
-
export declare function isUpgrade(current: string, latest: string): boolean;
|
|
24
|
-
export declare function composeChangelogSummary(current: string, latest: string, body: string): string;
|
|
25
|
-
export interface UpgradeResult {
|
|
26
|
-
ok: boolean;
|
|
27
|
-
stdout: string;
|
|
28
|
-
stderr: string;
|
|
29
|
-
}
|
|
30
|
-
export declare function runUpgrade(spec: string, runner?: ExecFileAsync): Promise<UpgradeResult>;
|
|
31
|
-
interface DriftCache {
|
|
32
|
-
lastSeenBundledForgeVersion: string | null;
|
|
33
|
-
promptedForVersions: string[];
|
|
34
|
-
}
|
|
35
|
-
declare function defaultCacheDir(): string;
|
|
36
|
-
declare function driftCachePath(dir: string): string;
|
|
37
|
-
declare function readDriftCache(dir: string): Promise<DriftCache>;
|
|
38
|
-
declare function writeDriftCache(dir: string, cache: DriftCache): Promise<void>;
|
|
39
|
-
export interface DriftCheckOptions {
|
|
40
|
-
currentBundledForgeVersion: string;
|
|
41
|
-
notify(message: string, level: "info" | "warning" | "error"): void;
|
|
42
|
-
cacheDir?: string;
|
|
43
|
-
}
|
|
44
|
-
export declare function checkBundledForgeDrift(opts: DriftCheckOptions): Promise<void>;
|
|
45
|
-
interface CliPreflightResult {
|
|
46
|
-
method: InstallMethod;
|
|
47
|
-
upgraded: boolean;
|
|
48
|
-
cliOldVersion?: string;
|
|
49
|
-
cliNewVersion?: string;
|
|
50
|
-
npmVersion?: string;
|
|
51
|
-
npmFetchFailed: boolean;
|
|
52
|
-
bundledForgeVersion: string;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Read the bundled update.md and apply forge-cli-specific patches.
|
|
56
|
-
*
|
|
57
|
-
* The plugin's update.md was written for Claude Code's plugin architecture.
|
|
58
|
-
* forge-cli uses a bundled payload instead of the Claude Code plugin cache,
|
|
59
|
-
* so we patch:
|
|
60
|
-
*
|
|
61
|
-
* 1. FORGE_ROOT: Replace CLAUDE_PLUGIN_ROOT with bundled payload path
|
|
62
|
-
* 2. IS_CANARY: Always true (bundle is never in /.claude/plugins/)
|
|
63
|
-
* 3. DISTRIBUTION: Always "forge@forge" (no marketplace detection)
|
|
64
|
-
* 4. migrations.json: Bundle puts it in .schemas/, not top-level
|
|
65
|
-
* 5. CLI preflight result: Instruct agent to skip Steps 1/2A/3
|
|
66
|
-
* 6. CLAUDE_PLUGIN_DATA: Replace with bundled payload path
|
|
67
|
-
*
|
|
68
|
-
* All patches are pure string replacements — no AST parsing needed.
|
|
69
|
-
* If a patch target isn't found, we log a warning but don't crash
|
|
70
|
-
* (the agent may still be able to follow the unpatched instructions
|
|
71
|
-
* partially).
|
|
72
|
-
*/
|
|
73
|
-
export declare function composeUpdateKickoff(updateMd: string, bundleRoot: string, preflight: CliPreflightResult): string;
|
|
74
|
-
export interface RegisterUpdateCommandOptions {
|
|
75
|
-
pkgRoot: string;
|
|
76
|
-
currentCliVersion: string;
|
|
77
|
-
fetchImpl?: typeof fetch;
|
|
78
|
-
globalRootResolver?: () => Promise<string | null>;
|
|
79
|
-
upgradeRunner?: (spec: string) => Promise<UpgradeResult>;
|
|
80
|
-
/** Override bundled-forge version for drift cache */
|
|
81
|
-
currentBundledForgeVersion?: string;
|
|
82
|
-
/** Override drift cache path */
|
|
83
|
-
driftCacheDir?: string;
|
|
84
|
-
}
|
|
85
|
-
export declare function registerForgeUpdateCommand(pi: ExtensionAPI, opts: RegisterUpdateCommandOptions): void;
|
|
86
|
-
export declare const __test__: {
|
|
87
|
-
parseTriple: typeof parseTriple;
|
|
88
|
-
driftCachePath: typeof driftCachePath;
|
|
89
|
-
readDriftCache: typeof readDriftCache;
|
|
90
|
-
writeDriftCache: typeof writeDriftCache;
|
|
91
|
-
defaultCacheDir: typeof defaultCacheDir;
|
|
92
|
-
PKG_NAME: string;
|
|
93
|
-
NPM_DIST_TAGS_URL: string;
|
|
94
|
-
changelogTagUrl: typeof changelogTagUrl;
|
|
95
|
-
UPGRADE_TIMEOUT_MS: number;
|
|
96
|
-
NPM_ROOT_TIMEOUT_MS: number;
|
|
97
|
-
PROBE_TIMEOUT_MS: number;
|
|
98
|
-
composeUpdateKickoff: typeof composeUpdateKickoff;
|
|
99
|
-
};
|
|
100
|
-
export {};
|
|
@@ -1,435 +0,0 @@
|
|
|
1
|
-
// /forge:update — CLI preflight + patched plugin-native flow (FORGE-BUG-039).
|
|
2
|
-
//
|
|
3
|
-
// Two-layer kickoff-shim architecture:
|
|
4
|
-
// Layer 1 (TypeScript): CLI-specific preflight — install method detection,
|
|
5
|
-
// npm changelog + upgrade. NOT handled by the plugin's update.md.
|
|
6
|
-
// Layer 2 (agent follows update.md): Full 7-step plugin update workflow
|
|
7
|
-
// with surgical text patches for forge-cli context differences.
|
|
8
|
-
//
|
|
9
|
-
// This replaces the previous monolithic TypeScript reimplementation that:
|
|
10
|
-
// - Missed generation-manifest checks (data loss risk)
|
|
11
|
-
// - Bypassed /forge:regenerate's modification guard + snapshot replay
|
|
12
|
-
// - Skipped Steps 5 (pipeline audit) and 7 (KB link refresh)
|
|
13
|
-
// - Always lagged behind the plugin's evolving workflow
|
|
14
|
-
//
|
|
15
|
-
// The patched update.md is read from the bundled payload at runtime,
|
|
16
|
-
// so plugin changes are automatically picked up. Patches are minimal
|
|
17
|
-
// and validated by tests.
|
|
18
|
-
import { execFile } from "node:child_process";
|
|
19
|
-
import { existsSync, promises as fs, readFileSync } from "node:fs";
|
|
20
|
-
import * as path from "node:path";
|
|
21
|
-
import { promisify } from "node:util";
|
|
22
|
-
import { getBundledPayloadRoot } from "./forge-init.js";
|
|
23
|
-
import { sendKickoff } from "./kickoff.js";
|
|
24
|
-
import { getUserCacheDir } from "./paths/paths.js";
|
|
25
|
-
const execFileAsync = promisify(execFile);
|
|
26
|
-
const PKG_NAME = "@entelligentsia/forgecli";
|
|
27
|
-
const NPM_DIST_TAGS_URL = "https://registry.npmjs.org/@entelligentsia/forgecli";
|
|
28
|
-
function changelogTagUrl(version) {
|
|
29
|
-
return `https://api.github.com/repos/Entelligentsia/forge-cli/releases/tags/v${version}`;
|
|
30
|
-
}
|
|
31
|
-
const PROBE_TIMEOUT_MS = 5000;
|
|
32
|
-
const UPGRADE_TIMEOUT_MS = 120_000;
|
|
33
|
-
const NPM_ROOT_TIMEOUT_MS = 5000;
|
|
34
|
-
const BODY_EXCERPT_MAX = 1200;
|
|
35
|
-
export function detectInstallMethod(opts) {
|
|
36
|
-
const norm = path.resolve(opts.pkgRoot);
|
|
37
|
-
if (/[/\\]_npx[/\\]/.test(norm))
|
|
38
|
-
return "npx";
|
|
39
|
-
if (opts.globalRoot && norm.startsWith(path.resolve(opts.globalRoot)))
|
|
40
|
-
return "global";
|
|
41
|
-
return "local-dev";
|
|
42
|
-
}
|
|
43
|
-
export async function getNpmGlobalRoot(runner) {
|
|
44
|
-
const run = runner ?? execFileAsync;
|
|
45
|
-
try {
|
|
46
|
-
const { stdout } = await run("npm", ["root", "-g"], { timeout: NPM_ROOT_TIMEOUT_MS });
|
|
47
|
-
const trimmed = stdout.trim();
|
|
48
|
-
return trimmed.length > 0 ? trimmed : null;
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
export async function fetchChangelog(fetchImpl) {
|
|
55
|
-
const npmCtl = new AbortController();
|
|
56
|
-
const npmTimer = setTimeout(() => npmCtl.abort(), PROBE_TIMEOUT_MS);
|
|
57
|
-
let npmVersion = null;
|
|
58
|
-
try {
|
|
59
|
-
const res = await fetchImpl(NPM_DIST_TAGS_URL, {
|
|
60
|
-
signal: npmCtl.signal,
|
|
61
|
-
headers: { Accept: "application/json" },
|
|
62
|
-
});
|
|
63
|
-
if (res.ok) {
|
|
64
|
-
const body = (await res.json());
|
|
65
|
-
const tag = body["dist-tags"]?.latest;
|
|
66
|
-
npmVersion = typeof tag === "string" ? tag : null;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
// fall through to null return
|
|
71
|
-
}
|
|
72
|
-
finally {
|
|
73
|
-
clearTimeout(npmTimer);
|
|
74
|
-
}
|
|
75
|
-
if (!npmVersion)
|
|
76
|
-
return null;
|
|
77
|
-
const version = npmVersion.startsWith("v") ? npmVersion.slice(1) : npmVersion;
|
|
78
|
-
const ghCtl = new AbortController();
|
|
79
|
-
const ghTimer = setTimeout(() => ghCtl.abort(), PROBE_TIMEOUT_MS);
|
|
80
|
-
let releaseBody = "";
|
|
81
|
-
try {
|
|
82
|
-
const res = await fetchImpl(changelogTagUrl(version), {
|
|
83
|
-
signal: ghCtl.signal,
|
|
84
|
-
headers: { Accept: "application/vnd.github+json" },
|
|
85
|
-
});
|
|
86
|
-
if (res.ok) {
|
|
87
|
-
const json = (await res.json());
|
|
88
|
-
if (typeof json.body === "string")
|
|
89
|
-
releaseBody = json.body;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// changelog body is optional — proceed with empty
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
clearTimeout(ghTimer);
|
|
97
|
-
}
|
|
98
|
-
return { tag: `v${version}`, version, body: releaseBody };
|
|
99
|
-
}
|
|
100
|
-
function parseTriple(v) {
|
|
101
|
-
const cleaned = v.startsWith("v") ? v.slice(1) : v;
|
|
102
|
-
const parts = cleaned.split(".");
|
|
103
|
-
if (parts.length !== 3)
|
|
104
|
-
return null;
|
|
105
|
-
const nums = [];
|
|
106
|
-
for (const p of parts) {
|
|
107
|
-
if (!/^\d+$/.test(p))
|
|
108
|
-
return null;
|
|
109
|
-
nums.push(Number.parseInt(p, 10));
|
|
110
|
-
}
|
|
111
|
-
return [nums[0], nums[1], nums[2]];
|
|
112
|
-
}
|
|
113
|
-
export function isUpgrade(current, latest) {
|
|
114
|
-
const a = parseTriple(latest);
|
|
115
|
-
const b = parseTriple(current);
|
|
116
|
-
if (!a || !b)
|
|
117
|
-
return false;
|
|
118
|
-
for (let i = 0; i < 3; i++) {
|
|
119
|
-
if (a[i] > b[i])
|
|
120
|
-
return true;
|
|
121
|
-
if (a[i] < b[i])
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
export function composeChangelogSummary(current, latest, body) {
|
|
127
|
-
const trimmed = body.trim();
|
|
128
|
-
const excerpt = trimmed.length > BODY_EXCERPT_MAX ? `${trimmed.slice(0, BODY_EXCERPT_MAX)}…` : trimmed;
|
|
129
|
-
return [
|
|
130
|
-
`Current: ${current}`,
|
|
131
|
-
`Latest: ${latest}`,
|
|
132
|
-
"",
|
|
133
|
-
"Release notes:",
|
|
134
|
-
excerpt.length > 0 ? excerpt : "(release body empty)",
|
|
135
|
-
"",
|
|
136
|
-
`This will run: npm i -g ${PKG_NAME}@${latest}`,
|
|
137
|
-
].join("\n");
|
|
138
|
-
}
|
|
139
|
-
export async function runUpgrade(spec, runner) {
|
|
140
|
-
const run = runner ?? execFileAsync;
|
|
141
|
-
try {
|
|
142
|
-
const { stdout, stderr } = await run("npm", ["i", "-g", spec], { timeout: UPGRADE_TIMEOUT_MS });
|
|
143
|
-
return { ok: true, stdout, stderr };
|
|
144
|
-
}
|
|
145
|
-
catch (err) {
|
|
146
|
-
const e = err;
|
|
147
|
-
return { ok: false, stdout: e.stdout ?? "", stderr: e.stderr ?? e.message ?? "unknown error" };
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
function truncate(s, max) {
|
|
151
|
-
return s.length > max ? `${s.slice(0, max)}…` : s;
|
|
152
|
-
}
|
|
153
|
-
// ── Bundled-forge drift detection (session-start hook) ──────────────────────
|
|
154
|
-
//
|
|
155
|
-
// On every session_start we compare the bundled-forge version recorded in the
|
|
156
|
-
// drift cache against the current package.json forge.bundledVersion. If the
|
|
157
|
-
// version changed and we have not already prompted for it, emit a one-shot
|
|
158
|
-
// migration prompt. The cache is per-version idempotent.
|
|
159
|
-
//
|
|
160
|
-
// This hook is independent of the /forge:update command — it runs at session
|
|
161
|
-
// start, before the user invokes any command.
|
|
162
|
-
const DRIFT_CACHE_FILE = "drift-seen.json";
|
|
163
|
-
function defaultCacheDir() {
|
|
164
|
-
return getUserCacheDir();
|
|
165
|
-
}
|
|
166
|
-
function driftCachePath(dir) {
|
|
167
|
-
return path.join(dir, DRIFT_CACHE_FILE);
|
|
168
|
-
}
|
|
169
|
-
async function readDriftCache(dir) {
|
|
170
|
-
try {
|
|
171
|
-
const raw = await fs.readFile(driftCachePath(dir), "utf8");
|
|
172
|
-
const parsed = JSON.parse(raw);
|
|
173
|
-
return {
|
|
174
|
-
lastSeenBundledForgeVersion: typeof parsed.lastSeenBundledForgeVersion === "string" ? parsed.lastSeenBundledForgeVersion : null,
|
|
175
|
-
promptedForVersions: Array.isArray(parsed.promptedForVersions)
|
|
176
|
-
? parsed.promptedForVersions.filter((v) => typeof v === "string")
|
|
177
|
-
: [],
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
return { lastSeenBundledForgeVersion: null, promptedForVersions: [] };
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
async function writeDriftCache(dir, cache) {
|
|
185
|
-
await fs.mkdir(dir, { recursive: true });
|
|
186
|
-
const final = driftCachePath(dir);
|
|
187
|
-
const tmp = `${final}.${process.pid}.${Date.now()}.tmp`;
|
|
188
|
-
await fs.writeFile(tmp, JSON.stringify(cache, null, 2), "utf8");
|
|
189
|
-
await fs.rename(tmp, final);
|
|
190
|
-
}
|
|
191
|
-
export async function checkBundledForgeDrift(opts) {
|
|
192
|
-
const current = opts.currentBundledForgeVersion;
|
|
193
|
-
if (!current)
|
|
194
|
-
return;
|
|
195
|
-
const cacheDir = opts.cacheDir ?? defaultCacheDir();
|
|
196
|
-
const cache = await readDriftCache(cacheDir);
|
|
197
|
-
const last = cache.lastSeenBundledForgeVersion;
|
|
198
|
-
if (last && last !== current && !cache.promptedForVersions.includes(current)) {
|
|
199
|
-
opts.notify(`forge: bundled forge plugin changed (${last} → ${current}). ` +
|
|
200
|
-
`Run /forge:update to apply project migrations from v${last} to v${current}.`, "info");
|
|
201
|
-
cache.promptedForVersions = [...cache.promptedForVersions, current];
|
|
202
|
-
}
|
|
203
|
-
cache.lastSeenBundledForgeVersion = current;
|
|
204
|
-
try {
|
|
205
|
-
await writeDriftCache(cacheDir, cache);
|
|
206
|
-
}
|
|
207
|
-
catch {
|
|
208
|
-
// fail-silent — banner already shown if applicable
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Read the bundled update.md and apply forge-cli-specific patches.
|
|
213
|
-
*
|
|
214
|
-
* The plugin's update.md was written for Claude Code's plugin architecture.
|
|
215
|
-
* forge-cli uses a bundled payload instead of the Claude Code plugin cache,
|
|
216
|
-
* so we patch:
|
|
217
|
-
*
|
|
218
|
-
* 1. FORGE_ROOT: Replace CLAUDE_PLUGIN_ROOT with bundled payload path
|
|
219
|
-
* 2. IS_CANARY: Always true (bundle is never in /.claude/plugins/)
|
|
220
|
-
* 3. DISTRIBUTION: Always "forge@forge" (no marketplace detection)
|
|
221
|
-
* 4. migrations.json: Bundle puts it in .schemas/, not top-level
|
|
222
|
-
* 5. CLI preflight result: Instruct agent to skip Steps 1/2A/3
|
|
223
|
-
* 6. CLAUDE_PLUGIN_DATA: Replace with bundled payload path
|
|
224
|
-
*
|
|
225
|
-
* All patches are pure string replacements — no AST parsing needed.
|
|
226
|
-
* If a patch target isn't found, we log a warning but don't crash
|
|
227
|
-
* (the agent may still be able to follow the unpatched instructions
|
|
228
|
-
* partially).
|
|
229
|
-
*/
|
|
230
|
-
export function composeUpdateKickoff(updateMd, bundleRoot, preflight) {
|
|
231
|
-
let patched = updateMd;
|
|
232
|
-
// Patch 1: FORGE_ROOT — replace Claude Code directive with literal path
|
|
233
|
-
// Original: FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
|
|
234
|
-
// Patched: FORGE_ROOT = <bundledPayloadRoot>
|
|
235
|
-
const forgeRootDirective = '!`echo "${CLAUDE_PLUGIN_ROOT}"`';
|
|
236
|
-
if (patched.includes(forgeRootDirective)) {
|
|
237
|
-
patched = patched.replaceAll(forgeRootDirective, bundleRoot);
|
|
238
|
-
}
|
|
239
|
-
// Patch 1b: Second occurrence is in Step 3's "Re-derive FORGE_ROOT"
|
|
240
|
-
// Same directive appears there. Already handled by replaceAll above.
|
|
241
|
-
// Patch 2: CLAUDE_PLUGIN_DATA — used for legacy cache fallback
|
|
242
|
-
// Replace with bundle root since forge-cli doesn't have plugin data dir
|
|
243
|
-
if (patched.includes("${CLAUDE_PLUGIN_DATA}")) {
|
|
244
|
-
patched = patched.replaceAll("${CLAUDE_PLUGIN_DATA}", bundleRoot);
|
|
245
|
-
}
|
|
246
|
-
// Patch 3: IS_CANARY — force to true. The plugin's canary detection
|
|
247
|
-
// checks for "/.claude/plugins/" in FORGE_ROOT, which never matches
|
|
248
|
-
// the bundled payload path. Setting IS_CANARY=true ensures:
|
|
249
|
-
// - Row 3 triggers (skip Step 2A — no plugin manager install)
|
|
250
|
-
// - Step 3 re-derivation is skipped (FORGE_ROOT doesn't change)
|
|
251
|
-
// We insert this right after the IS_CANARY detection paragraph.
|
|
252
|
-
const canaryAnchor = "**Canary / source install** (`IS_CANARY = true`)";
|
|
253
|
-
if (patched.includes(canaryAnchor)) {
|
|
254
|
-
patched = patched.replace(canaryAnchor, ` forge-cli: IS_CANARY is ALWAYS true — the bundled payload is never in the Claude Code plugin directory. ` +
|
|
255
|
-
"Row 3 of the decision table always applies: skip Step 2A, proceed to Step 2B. " +
|
|
256
|
-
"`IS_CANARY` = true");
|
|
257
|
-
}
|
|
258
|
-
// Patch 4: DISTRIBUTION — forge-cli always uses canary distribution
|
|
259
|
-
// Insert after the distribution table
|
|
260
|
-
const distAnchor = "| anything else | `forge@forge` / canary |";
|
|
261
|
-
if (patched.includes(distAnchor)) {
|
|
262
|
-
patched = patched.replace(distAnchor, distAnchor +
|
|
263
|
-
"\n\n> **forge-cli note:** The bundled payload is never in the Claude Code plugin cache, " +
|
|
264
|
-
'so DISTRIBUTION is always `forge@forge` / canary. Set `DISTRIBUTION = "forge@forge"` now.');
|
|
265
|
-
}
|
|
266
|
-
// Patch 5: migrations.json path — bundle puts it in .schemas/, not top-level
|
|
267
|
-
// Step 2B reads: Read `$FORGE_ROOT/migrations.json` (local).
|
|
268
|
-
// Step 4 reads: Read `$FORGE_ROOT/migrations.json` (local — now updated after install).
|
|
269
|
-
if (patched.includes("$FORGE_ROOT/migrations.json")) {
|
|
270
|
-
patched = patched.replaceAll("$FORGE_ROOT/migrations.json", "$FORGE_ROOT/.schemas/migrations.json");
|
|
271
|
-
}
|
|
272
|
-
// Patch 6: CLI preflight result — inject before Step 1
|
|
273
|
-
// This tells the agent what the CLI preflight already did so it can
|
|
274
|
-
// skip the remote version check, Step 2A, and Step 3.
|
|
275
|
-
const cliResult = [
|
|
276
|
-
"",
|
|
277
|
-
"---",
|
|
278
|
-
"",
|
|
279
|
-
"## forge-cli: CLI Preflight Result",
|
|
280
|
-
"",
|
|
281
|
-
`Install method: **${preflight.method}**`,
|
|
282
|
-
preflight.upgraded
|
|
283
|
-
? `CLI upgraded: **${preflight.cliOldVersion} → ${preflight.cliNewVersion}**`
|
|
284
|
-
: "No CLI upgrade needed (or not eligible).",
|
|
285
|
-
preflight.npmVersion
|
|
286
|
-
? `Remote version (npm): **${preflight.npmVersion}**`
|
|
287
|
-
: preflight.npmFetchFailed
|
|
288
|
-
? "Could not reach npm registry — proceeding with local version only."
|
|
289
|
-
: "",
|
|
290
|
-
`LOCAL_VERSION (bundled forge): **${preflight.bundledForgeVersion}**`,
|
|
291
|
-
"",
|
|
292
|
-
"**Action for the agent:**",
|
|
293
|
-
preflight.npmFetchFailed
|
|
294
|
-
? "- Could not reach registry → use LOCAL_VERSION as both local and remote"
|
|
295
|
-
: "- Use LOCAL_VERSION and the npm version above for the decision table",
|
|
296
|
-
"- **Skip Step 2A** — CLI already handled npm upgrade (or not applicable)",
|
|
297
|
-
"- **Skip Step 3** — FORGE_ROOT does not change in forge-cli (npm path is stable)",
|
|
298
|
-
"- Resume detection (FR-002): check `.forge/update-check-cache.json` `updateStatus` as usual",
|
|
299
|
-
"- All other steps (1, 2B, 4, 5, 6, 7) proceed normally",
|
|
300
|
-
`- **FORGE_ROOT resolution**: When reading bundled commands or workflows (e.g. regenerate.md, update-tools.md), replace any Claude-Code plugin-root env-var reference with ${bundleRoot}. FORGE_ROOT = ${bundleRoot} in forge-cli.`,
|
|
301
|
-
`- **Step 6 migratedFrom**: Write migratedFrom: LOCAL_VERSION (the CURRENT version after update, e.g. ${preflight.bundledForgeVersion}), NOT the old baseline. This ensures subsequent updates correctly detect the project is up to date.`,
|
|
302
|
-
`- **substitute-placeholders base-pack path**: In forge-cli, the base-pack is at ${bundleRoot}/.base-pack/ (not init/base-pack). When invoking substitute-placeholders.cjs, pass --base-pack ${bundleRoot}/.base-pack to avoid "base-pack not found" errors.`,
|
|
303
|
-
"",
|
|
304
|
-
"---",
|
|
305
|
-
"",
|
|
306
|
-
].join("\n");
|
|
307
|
-
// Insert before "## Step 1"
|
|
308
|
-
const step1Anchor = "## Step 1 — Check for updates";
|
|
309
|
-
if (patched.includes(step1Anchor)) {
|
|
310
|
-
patched = patched.replace(step1Anchor, cliResult + step1Anchor);
|
|
311
|
-
}
|
|
312
|
-
return patched;
|
|
313
|
-
}
|
|
314
|
-
export function registerForgeUpdateCommand(pi, opts) {
|
|
315
|
-
pi.registerCommand("forge:update", {
|
|
316
|
-
description: "Guided upgrade for forgecli (npm i -g) + project migration via plugin-native update workflow",
|
|
317
|
-
async handler(_args, ctx) {
|
|
318
|
-
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
319
|
-
const resolveGlobal = opts.globalRootResolver ?? (() => getNpmGlobalRoot());
|
|
320
|
-
const upgrade = opts.upgradeRunner ?? ((spec) => runUpgrade(spec));
|
|
321
|
-
// ── Layer 1: CLI Preflight ───────────────────────────────────────
|
|
322
|
-
const globalRoot = await resolveGlobal();
|
|
323
|
-
const method = detectInstallMethod({ pkgRoot: opts.pkgRoot, globalRoot });
|
|
324
|
-
let release = null;
|
|
325
|
-
let upgraded = false;
|
|
326
|
-
let cliOldVersion;
|
|
327
|
-
let cliNewVersion;
|
|
328
|
-
if (method !== "global") {
|
|
329
|
-
ctx.ui.notify(`forge:update — install method '${method}' is not eligible for guided npm upgrade. ` +
|
|
330
|
-
`To upgrade the CLI manually: npm i -g ${PKG_NAME}@latest. ` +
|
|
331
|
-
"Proceeding to project update…", "warning");
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
// Fetch latest changelog + confirm upgrade
|
|
335
|
-
ctx.ui.setStatus("forge:update", "Fetching latest release notes…");
|
|
336
|
-
release = await fetchChangelog(fetchImpl);
|
|
337
|
-
ctx.ui.setStatus("forge:update", undefined);
|
|
338
|
-
if (!release) {
|
|
339
|
-
ctx.ui.notify("forge:update — could not reach the npm registry to check for updates. " +
|
|
340
|
-
`Check your network and retry, or upgrade manually: npm i -g ${PKG_NAME}@latest. ` +
|
|
341
|
-
"Proceeding to project update…", "warning");
|
|
342
|
-
}
|
|
343
|
-
else {
|
|
344
|
-
const current = opts.currentCliVersion;
|
|
345
|
-
if (!isUpgrade(current, release.version)) {
|
|
346
|
-
ctx.ui.notify(`forge:update — already at the latest version (${current}; latest published: ${release.version}).`, "info");
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
const summary = composeChangelogSummary(current, release.version, release.body);
|
|
350
|
-
const proceed = await ctx.ui.confirm(`Upgrade forgecli ${current} → ${release.version}?`, summary);
|
|
351
|
-
if (!proceed) {
|
|
352
|
-
ctx.ui.notify("forge:update — npm upgrade cancelled. Proceeding to project update…", "info");
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
ctx.ui.setStatus("forge:update", `Upgrading to ${release.version}…`);
|
|
356
|
-
const result = await upgrade(`${PKG_NAME}@${release.version}`);
|
|
357
|
-
ctx.ui.setStatus("forge:update", undefined);
|
|
358
|
-
if (!result.ok) {
|
|
359
|
-
ctx.ui.notify(`forge:update — npm i -g failed: ${truncate(result.stderr, 400)}. ` +
|
|
360
|
-
"Check the error above; you may need elevated permissions. " +
|
|
361
|
-
"Proceeding to project update…", "error");
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
upgraded = true;
|
|
365
|
-
cliOldVersion = current;
|
|
366
|
-
cliNewVersion = release.version;
|
|
367
|
-
ctx.ui.notify(`forge:update — installed ${PKG_NAME}@${release.version}. ` +
|
|
368
|
-
"Restart your forge session for the new version to take effect.", "info");
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
} // end global-only branch
|
|
374
|
-
// ── Layer 2: Patched Plugin-Native Flow ──────────────────────────
|
|
375
|
-
const bundleRoot = getBundledPayloadRoot();
|
|
376
|
-
// Read bundled forge version for the preflight result
|
|
377
|
-
let bundledForgeVersion = opts.currentBundledForgeVersion ?? "";
|
|
378
|
-
if (!bundledForgeVersion) {
|
|
379
|
-
try {
|
|
380
|
-
const pluginJsonPath = path.join(bundleRoot, ".claude-plugin", "plugin.json");
|
|
381
|
-
if (existsSync(pluginJsonPath)) {
|
|
382
|
-
const pluginJson = JSON.parse(readFileSync(pluginJsonPath, "utf8"));
|
|
383
|
-
bundledForgeVersion = pluginJson.version ?? "";
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
catch {
|
|
387
|
-
// unable to read
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
if (!bundledForgeVersion) {
|
|
391
|
-
ctx.ui.notify("forge:update — could not determine bundled forge version. " +
|
|
392
|
-
"Run /forge:init first, or check the forge-payload installation.", "error");
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
// Read and patch update.md from bundled payload
|
|
396
|
-
const updateMdPath = path.join(bundleRoot, "commands", "update.md");
|
|
397
|
-
let updateMd;
|
|
398
|
-
try {
|
|
399
|
-
updateMd = readFileSync(updateMdPath, "utf8");
|
|
400
|
-
}
|
|
401
|
-
catch {
|
|
402
|
-
ctx.ui.notify(`forge:update — bundled update.md not found at ${updateMdPath}. ` +
|
|
403
|
-
"The bundled payload may be incomplete. Run /forge:init to repair.", "error");
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
const preflight = {
|
|
407
|
-
method,
|
|
408
|
-
upgraded,
|
|
409
|
-
cliOldVersion,
|
|
410
|
-
cliNewVersion,
|
|
411
|
-
npmVersion: release?.version,
|
|
412
|
-
npmFetchFailed: method === "global" && !release,
|
|
413
|
-
bundledForgeVersion,
|
|
414
|
-
};
|
|
415
|
-
const kickoffText = composeUpdateKickoff(updateMd, bundleRoot, preflight);
|
|
416
|
-
sendKickoff(pi, kickoffText);
|
|
417
|
-
},
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
// ── Test helpers ────────────────────────────────────────────────────────────
|
|
421
|
-
export const __test__ = {
|
|
422
|
-
parseTriple,
|
|
423
|
-
driftCachePath,
|
|
424
|
-
readDriftCache,
|
|
425
|
-
writeDriftCache,
|
|
426
|
-
defaultCacheDir,
|
|
427
|
-
PKG_NAME,
|
|
428
|
-
NPM_DIST_TAGS_URL,
|
|
429
|
-
changelogTagUrl,
|
|
430
|
-
UPGRADE_TIMEOUT_MS,
|
|
431
|
-
NPM_ROOT_TIMEOUT_MS,
|
|
432
|
-
PROBE_TIMEOUT_MS,
|
|
433
|
-
composeUpdateKickoff,
|
|
434
|
-
};
|
|
435
|
-
//# sourceMappingURL=forge-update-command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forge-update-command.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/forge-update-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { type Static, Type } from "typebox";
|
|
2
|
-
/**
|
|
3
|
-
* One retrieved-and-classified skill for the closed task. `retrieved`
|
|
4
|
-
* comes from T08 (skill-retriever); `used` from T09 (skill-usage-tracker).
|
|
5
|
-
* `retrievalScore` is the T08 score (informational — surfaces in evidence).
|
|
6
|
-
*/
|
|
7
|
-
export declare const RetrievedSkillSignalSchema: Type.TObject<{
|
|
8
|
-
skillId: Type.TString;
|
|
9
|
-
retrieved: Type.TBoolean;
|
|
10
|
-
used: Type.TBoolean;
|
|
11
|
-
retrievalScore: Type.TNumber;
|
|
12
|
-
}>;
|
|
13
|
-
export type RetrievedSkillSignal = Static<typeof RetrievedSkillSignalSchema>;
|
|
14
|
-
/** Per-skill historical signal — supplied by caller from sprint history. */
|
|
15
|
-
export declare const SkillHistorySchema: Type.TObject<{
|
|
16
|
-
consecutiveUnusedSprints: Type.TInteger;
|
|
17
|
-
}>;
|
|
18
|
-
export type SkillHistory = Static<typeof SkillHistorySchema>;
|
|
19
|
-
/** One pairwise retrieval-overlap measurement for the closed task. */
|
|
20
|
-
export declare const PairwiseOverlapSchema: Type.TObject<{
|
|
21
|
-
skillA: Type.TString;
|
|
22
|
-
skillB: Type.TString;
|
|
23
|
-
overlap: Type.TNumber;
|
|
24
|
-
}>;
|
|
25
|
-
export type PairwiseOverlap = Static<typeof PairwiseOverlapSchema>;
|
|
26
|
-
export declare const FrictionInputsSchema: Type.TObject<{
|
|
27
|
-
retrievedSkills: Type.TArray<Type.TObject<{
|
|
28
|
-
skillId: Type.TString;
|
|
29
|
-
retrieved: Type.TBoolean;
|
|
30
|
-
used: Type.TBoolean;
|
|
31
|
-
retrievalScore: Type.TNumber;
|
|
32
|
-
}>>;
|
|
33
|
-
taskSuccess: Type.TBoolean;
|
|
34
|
-
toolErrorCount: Type.TInteger;
|
|
35
|
-
history: Type.TRecord<"^.*$", Type.TObject<{
|
|
36
|
-
consecutiveUnusedSprints: Type.TInteger;
|
|
37
|
-
}>>;
|
|
38
|
-
pairwiseRetrievalOverlap: Type.TOptional<Type.TArray<Type.TObject<{
|
|
39
|
-
skillA: Type.TString;
|
|
40
|
-
skillB: Type.TString;
|
|
41
|
-
overlap: Type.TNumber;
|
|
42
|
-
}>>>;
|
|
43
|
-
}>;
|
|
44
|
-
export type FrictionInputs = Static<typeof FrictionInputsSchema>;
|
|
45
|
-
import { FRICTION_SUBKINDS, type FrictionSubkind } from "./lib/catalog-types.js";
|
|
46
|
-
export { FRICTION_SUBKINDS, type FrictionSubkind };
|
|
47
|
-
/**
|
|
48
|
-
* One classifier output. `skillId` is `undefined` for `skill_missing`
|
|
49
|
-
* (no skill to attribute) but always set for the other four subkinds.
|
|
50
|
-
*/
|
|
51
|
-
export interface FrictionSignal {
|
|
52
|
-
subkind: FrictionSubkind;
|
|
53
|
-
skillId: string | undefined;
|
|
54
|
-
evidence: Record<string, unknown>;
|
|
55
|
-
}
|
|
56
|
-
/** Runtime attribution supplied by the orchestrator (IL10). */
|
|
57
|
-
export declare const FrictionEmitRuntimeSchema: Type.TObject<{
|
|
58
|
-
storeCli: Type.TString;
|
|
59
|
-
cwd: Type.TString;
|
|
60
|
-
sprintId: Type.TString;
|
|
61
|
-
taskId: Type.TString;
|
|
62
|
-
/** Orchestrator phase role. @see RoleKind from lib/catalog-types.ts */
|
|
63
|
-
role: Type.TString;
|
|
64
|
-
/** Orchestrator phase action. @see ActionKind from lib/catalog-types.ts */
|
|
65
|
-
action: Type.TString;
|
|
66
|
-
workflow: Type.TString;
|
|
67
|
-
persona: Type.TString;
|
|
68
|
-
phase: Type.TOptional<Type.TString>;
|
|
69
|
-
iteration: Type.TOptional<Type.TInteger>;
|
|
70
|
-
startTimestamp: Type.TString;
|
|
71
|
-
endTimestamp: Type.TString;
|
|
72
|
-
durationMinutes: Type.TNumber;
|
|
73
|
-
model: Type.TString;
|
|
74
|
-
provider: Type.TString;
|
|
75
|
-
}>;
|
|
76
|
-
export type FrictionEmitRuntime = Static<typeof FrictionEmitRuntimeSchema>;
|
|
77
|
-
export interface FrictionEmitResult {
|
|
78
|
-
emitted: number;
|
|
79
|
-
failed: number;
|
|
80
|
-
stderrs: string[];
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Apply the five gating rules and return one signal per matching emit.
|
|
84
|
-
* Pure: no IO, no subprocess. Caller decides whether/when to emit.
|
|
85
|
-
*
|
|
86
|
-
* The `skill_unused` and `skill_failed` gates are mutually exclusive by
|
|
87
|
-
* design — on a failed task we emit `skill_failed` (when used) rather
|
|
88
|
-
* than `skill_unused`, so the two signals never double-count the same
|
|
89
|
-
* outcome.
|
|
90
|
-
*/
|
|
91
|
-
export declare function computeFrictionSignals(inputs: FrictionInputs): FrictionSignal[];
|
|
92
|
-
/**
|
|
93
|
-
* Emit one `friction` event per signal via
|
|
94
|
-
* `node <storeCli> emit <sprintId> <json>`. Runtime attribution
|
|
95
|
-
* (model/provider/timestamps/eventId) is supplied by the caller — never
|
|
96
|
-
* fabricated. Failures surface in the result counter; nothing is thrown
|
|
97
|
-
* for subprocess failure.
|
|
98
|
-
*/
|
|
99
|
-
export declare function emitFrictionEvents(signals: readonly FrictionSignal[], runtime: FrictionEmitRuntime): FrictionEmitResult;
|