@graphit/cli 0.1.107 → 0.2.18
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/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/bin/graphit +8 -1
- package/bin/graphit.ps1 +5 -1
- package/dist/api/client.d.ts +8 -0
- package/dist/api/client.js +41 -0
- package/dist/api/client.js.map +1 -1
- package/dist/commands/dashboard.d.ts +24 -0
- package/dist/commands/dashboard.js +44 -4
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/ds.d.ts +17 -0
- package/dist/commands/ds.js +84 -10
- package/dist/commands/ds.js.map +1 -1
- package/dist/commands/plugin.js +3 -0
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/query-timeout.d.ts +2 -0
- package/dist/commands/query-timeout.js +19 -0
- package/dist/commands/query-timeout.js.map +1 -0
- package/dist/commands/query.js +12 -2
- package/dist/commands/query.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/update-check.d.ts +1 -0
- package/dist/update-check.js +18 -1
- package/dist/update-check.js.map +1 -1
- package/package.json +1 -1
- package/scripts/plugin-status.mjs +293 -13
- package/skills/graphit/SKILL.md +8 -7
- package/skills/graphit/VERSION.json +1 -1
- package/skills/graphit/references/data-sources.md +2 -0
- package/skills/graphit/references/kb-discovery.md +1 -1
- package/skills/graphit/references/kb-traversal.md +5 -2
- package/skills/graphit/references/operations.md +7 -0
- package/skills/graphit/references/sql-reference.md +1 -3
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Pure timeout resolution for `graphit query`, split out of query.ts so it can
|
|
2
|
+
// be unit-tested without pulling in the API client or Commander.
|
|
3
|
+
//
|
|
4
|
+
// `graphit query` can run long analytical scans (40-70M-row sources) that exceed
|
|
5
|
+
// the 30s global client default in api/client.ts. The query path gets its own
|
|
6
|
+
// 120s default plus a --timeout override (mirroring the per-call overrides ds.ts
|
|
7
|
+
// already uses for refresh/scan). Cloud Run caps the backend request at 900s, so
|
|
8
|
+
// larger --timeout values are capped server-side.
|
|
9
|
+
export const QUERY_TIMEOUT_MS = 120_000;
|
|
10
|
+
export function resolveQueryTimeoutMs(rawTimeout) {
|
|
11
|
+
if (rawTimeout === undefined)
|
|
12
|
+
return QUERY_TIMEOUT_MS;
|
|
13
|
+
const seconds = parseInt(rawTimeout, 10);
|
|
14
|
+
if (isNaN(seconds) || seconds <= 0) {
|
|
15
|
+
throw new Error(`Invalid --timeout value: "${rawTimeout}". Must be a positive number of seconds.`);
|
|
16
|
+
}
|
|
17
|
+
return seconds * 1000;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=query-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-timeout.js","sourceRoot":"","sources":["../../src/commands/query-timeout.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iEAAiE;AACjE,EAAE;AACF,iFAAiF;AACjF,8EAA8E;AAC9E,iFAAiF;AACjF,iFAAiF;AACjF,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAExC,MAAM,UAAU,qBAAqB,CAAC,UAA8B;IAClE,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,6BAA6B,UAAU,0CAA0C,CAClF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,GAAG,IAAI,CAAC;AACxB,CAAC"}
|
package/dist/commands/query.js
CHANGED
|
@@ -2,6 +2,7 @@ import { apiClient } from "../api/client.js";
|
|
|
2
2
|
import { output, errorOutput, getOutputFormat, note } from "../output/format.js";
|
|
3
3
|
import { styledIntro, styledOutro, styledSuccess, styledNote, styledMessage, styledWarn, styledTable, styledConfirm, formatBold, formatDim, formatGreen, formatSeparator, } from "../output/styled.js";
|
|
4
4
|
import chalk from "chalk";
|
|
5
|
+
import { resolveQueryTimeoutMs } from "./query-timeout.js";
|
|
5
6
|
function adhocGateDetail(err) {
|
|
6
7
|
const e = err;
|
|
7
8
|
const detail = e?.detail;
|
|
@@ -45,10 +46,19 @@ export function registerQueryCommands(program) {
|
|
|
45
46
|
.option("--override-rules <names...>", "Governance rule names to override")
|
|
46
47
|
.option("--verbose", "Show expanded SQL after macro resolution")
|
|
47
48
|
.option("--approve-adhoc", "Approve running an ad-hoc measure query on a governed source")
|
|
49
|
+
.option("--timeout <seconds>", "Request timeout in seconds (default 120; backend caps at 900)")
|
|
48
50
|
.action(async function (sql) {
|
|
49
51
|
const cmd = this;
|
|
50
52
|
const opts = cmd.opts();
|
|
51
53
|
const fmt = getOutputFormat(cmd);
|
|
54
|
+
let timeoutMs;
|
|
55
|
+
try {
|
|
56
|
+
timeoutMs = resolveQueryTimeoutMs(opts.timeout);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
errorOutput(err);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
52
62
|
const makeBody = (approveAdhoc) => ({
|
|
53
63
|
sql,
|
|
54
64
|
data_source_id: opts.ds || null,
|
|
@@ -129,7 +139,7 @@ export function registerQueryCommands(program) {
|
|
|
129
139
|
}
|
|
130
140
|
};
|
|
131
141
|
try {
|
|
132
|
-
const resp = await apiClient.post("/api/v1/cli/query", makeBody(!!opts.approveAdhoc));
|
|
142
|
+
const resp = await apiClient.post("/api/v1/cli/query", makeBody(!!opts.approveAdhoc), { timeoutMs });
|
|
133
143
|
renderResult(resp);
|
|
134
144
|
}
|
|
135
145
|
catch (err) {
|
|
@@ -146,7 +156,7 @@ export function registerQueryCommands(program) {
|
|
|
146
156
|
return;
|
|
147
157
|
}
|
|
148
158
|
try {
|
|
149
|
-
const resp = await apiClient.post("/api/v1/cli/query", makeBody(true));
|
|
159
|
+
const resp = await apiClient.post("/api/v1/cli/query", makeBody(true), { timeoutMs });
|
|
150
160
|
renderResult(resp);
|
|
151
161
|
}
|
|
152
162
|
catch (err2) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAC9E,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,GAChF,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import { registerSetupCommand } from "./commands/setup.js";
|
|
|
10
10
|
import { registerGovernanceCommands } from "./commands/governance.js";
|
|
11
11
|
import { registerTeamCommands } from "./commands/team.js";
|
|
12
12
|
import { registerPluginCommands } from "./commands/plugin.js";
|
|
13
|
-
import { getCurrentVersion, printUpdateBanner, printMigrationNoticeIfGlobal, fireBackgroundCheck, } from "./update-check.js";
|
|
13
|
+
import { getCurrentVersion, printUpdateBanner, printMigrationNoticeIfGlobal, printPluginHealthPreflight, fireBackgroundCheck, } from "./update-check.js";
|
|
14
14
|
const program = new Command();
|
|
15
15
|
const args = process.argv.slice(2);
|
|
16
16
|
const pluginArgIndex = args.indexOf("plugin");
|
|
@@ -34,6 +34,7 @@ registerSetupCommand(program);
|
|
|
34
34
|
if (!isPluginStatusCommand) {
|
|
35
35
|
printMigrationNoticeIfGlobal();
|
|
36
36
|
printUpdateBanner();
|
|
37
|
+
printPluginHealthPreflight();
|
|
37
38
|
}
|
|
38
39
|
program.parse();
|
|
39
40
|
fireBackgroundCheck();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,qBAAqB,GAAG,cAAc,IAAI,CAAC,IAAI,cAAc,KAAK,cAAc,GAAG,CAAC,CAAC;AAE3F,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,iBAAiB,EAAE,CAAC;KAC5B,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,EAAE,MAAM,CAAC,CAAC;AAE1F,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC3B,4BAA4B,EAAE,CAAC;IAC/B,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,4BAA4B,EAC5B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,qBAAqB,GAAG,cAAc,IAAI,CAAC,IAAI,cAAc,KAAK,cAAc,GAAG,CAAC,CAAC;AAE3F,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,iBAAiB,EAAE,CAAC;KAC5B,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,EAAE,MAAM,CAAC,CAAC;AAE1F,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC3B,4BAA4B,EAAE,CAAC;IAC/B,iBAAiB,EAAE,CAAC;IACpB,0BAA0B,EAAE,CAAC;AAC/B,CAAC;AACD,OAAO,CAAC,KAAK,EAAE,CAAC;AAChB,mBAAmB,EAAE,CAAC"}
|
package/dist/update-check.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ type InstallContext = "npx" | "global" | "local";
|
|
|
10
10
|
export declare function classifyInstallContext(selfPath: string, cwd: string): InstallContext;
|
|
11
11
|
export declare function getCurrentVersion(): string;
|
|
12
12
|
export declare function printUpdateBanner(): void;
|
|
13
|
+
export declare function printPluginHealthPreflight(): void;
|
|
13
14
|
/**
|
|
14
15
|
* Project #246 self-announcing shim: when the user runs a stale GLOBAL `@graphit/cli`
|
|
15
16
|
* directly (the plugin's PATH wrapper never shadows their interactive shell), tell
|
package/dist/update-check.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "fs";
|
|
2
|
+
import { spawnSync } from "child_process";
|
|
2
3
|
import { homedir } from "os";
|
|
3
|
-
import { join, sep } from "path";
|
|
4
|
+
import { dirname, join, sep } from "path";
|
|
4
5
|
import { fileURLToPath } from "url";
|
|
5
6
|
import { createRequire } from "module";
|
|
6
7
|
import { findOutdatedSkillInstalls, formatSkillStalenessBanner, } from "./skill-version.js";
|
|
@@ -131,6 +132,22 @@ export function printUpdateBanner() {
|
|
|
131
132
|
process.stderr.write(skillBanner);
|
|
132
133
|
}
|
|
133
134
|
}
|
|
135
|
+
export function printPluginHealthPreflight() {
|
|
136
|
+
if (process.env.GRAPHIT_SKIP_PLUGIN_PREFLIGHT === "1")
|
|
137
|
+
return;
|
|
138
|
+
const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
139
|
+
const script = join(packageRoot, "scripts", "plugin-status.mjs");
|
|
140
|
+
if (!existsSync(script))
|
|
141
|
+
return;
|
|
142
|
+
const result = spawnSync(process.execPath, [script, "--preflight", "--repair", "--quiet", "--skip-network"], {
|
|
143
|
+
encoding: "utf-8",
|
|
144
|
+
timeout: 5000,
|
|
145
|
+
env: process.env,
|
|
146
|
+
});
|
|
147
|
+
if (result.stdout) {
|
|
148
|
+
process.stderr.write(result.stdout.endsWith("\n") ? result.stdout : `${result.stdout}\n`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
134
151
|
/**
|
|
135
152
|
* Project #246 self-announcing shim: when the user runs a stale GLOBAL `@graphit/cli`
|
|
136
153
|
* directly (the plugin's PATH wrapper never shadows their interactive shell), tell
|
package/dist/update-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
chmodSync,
|
|
5
|
+
cpSync,
|
|
6
|
+
existsSync,
|
|
7
|
+
mkdirSync,
|
|
8
|
+
readFileSync,
|
|
9
|
+
realpathSync,
|
|
10
|
+
renameSync,
|
|
11
|
+
rmSync,
|
|
12
|
+
writeFileSync,
|
|
13
|
+
} from "node:fs";
|
|
4
14
|
import { homedir } from "node:os";
|
|
5
|
-
import { delimiter, dirname, join } from "node:path";
|
|
15
|
+
import { delimiter, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
6
16
|
import { fileURLToPath } from "node:url";
|
|
7
17
|
|
|
8
18
|
// Project #246: GRAPHIT_REGISTRY_URL lets tests point at a local server and
|
|
@@ -10,6 +20,19 @@ import { fileURLToPath } from "node:url";
|
|
|
10
20
|
const REGISTRY_URL =
|
|
11
21
|
process.env.GRAPHIT_REGISTRY_URL ?? "https://registry.npmjs.org/@graphit/cli/latest";
|
|
12
22
|
const PACKAGE_NAME = "@graphit/cli";
|
|
23
|
+
const PLUGIN_ID = "graphit@graphit-plugin";
|
|
24
|
+
const CLAUDE_MARKETPLACE_NAME = "graphit-plugin";
|
|
25
|
+
const CLAUDE_PLUGIN_NAME = "graphit";
|
|
26
|
+
const REPAIRABLE_BUNDLE_ENTRIES = [
|
|
27
|
+
".claude-plugin",
|
|
28
|
+
".codex-plugin",
|
|
29
|
+
"skills",
|
|
30
|
+
"hooks",
|
|
31
|
+
"scripts",
|
|
32
|
+
"bin",
|
|
33
|
+
"README.md",
|
|
34
|
+
"package.json",
|
|
35
|
+
];
|
|
13
36
|
// Project #246: ~4h TTL (was 24h) so a single-source bump reaches returning
|
|
14
37
|
// sessions within one window (ARCH-2, PERF-2).
|
|
15
38
|
const TTL_MS = 4 * 60 * 60 * 1000;
|
|
@@ -19,6 +42,8 @@ const CACHE_SCHEMA_VERSION = 1;
|
|
|
19
42
|
// Strict semver. The wrapper enforces the same shape (SEC-6); keep them in sync.
|
|
20
43
|
const SEMVER_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
21
44
|
const args = new Set(process.argv.slice(2));
|
|
45
|
+
const shouldRepair = args.has("--repair") || args.has("--auto-repair");
|
|
46
|
+
const isPreflight = args.has("--preflight");
|
|
22
47
|
const hookIndex = process.argv.indexOf("--hook");
|
|
23
48
|
const hookEvent = hookIndex >= 0 ? process.argv[hookIndex + 1] : null;
|
|
24
49
|
const pluginRoot =
|
|
@@ -55,6 +80,28 @@ function readFrontmatterVersion(path) {
|
|
|
55
80
|
}
|
|
56
81
|
}
|
|
57
82
|
|
|
83
|
+
function readBundleInfo(root) {
|
|
84
|
+
const packageJson = tryReadJson(join(root, "package.json"));
|
|
85
|
+
const versionJson = tryReadJson(join(root, "skills", "graphit", "VERSION.json"));
|
|
86
|
+
const claudePlugin = tryReadJson(join(root, ".claude-plugin", "plugin.json"));
|
|
87
|
+
const marketplace = tryReadJson(join(root, ".claude-plugin", "marketplace.json"));
|
|
88
|
+
const marketplacePlugin = marketplace?.plugins?.find((plugin) => plugin.name === CLAUDE_PLUGIN_NAME);
|
|
89
|
+
return {
|
|
90
|
+
packageName: packageJson?.name ?? versionJson?.package ?? PACKAGE_NAME,
|
|
91
|
+
currentVersion:
|
|
92
|
+
packageJson?.version ??
|
|
93
|
+
versionJson?.version ??
|
|
94
|
+
claudePlugin?.version ??
|
|
95
|
+
marketplacePlugin?.version ??
|
|
96
|
+
marketplace?.metadata?.version ??
|
|
97
|
+
readFrontmatterVersion(join(root, "skills", "graphit", "SKILL.md")) ??
|
|
98
|
+
null,
|
|
99
|
+
claudePlugin: claudePlugin ?? null,
|
|
100
|
+
marketplace: marketplace ?? null,
|
|
101
|
+
marketplacePlugin: marketplacePlugin ?? null,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
58
105
|
function compareVersions(left, right) {
|
|
59
106
|
const leftParts = left.split(".").map(Number);
|
|
60
107
|
const rightParts = right.split(".").map(Number);
|
|
@@ -69,6 +116,23 @@ function compareVersions(left, right) {
|
|
|
69
116
|
return 0;
|
|
70
117
|
}
|
|
71
118
|
|
|
119
|
+
function versionIsBehind(version, currentVersion) {
|
|
120
|
+
if (!isStrictSemver(currentVersion)) return false;
|
|
121
|
+
if (!version || !isStrictSemver(version)) return true;
|
|
122
|
+
return compareVersions(version, currentVersion) < 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function sanitizePathPart(value) {
|
|
126
|
+
return value.replace(/[^a-zA-Z0-9\-_.]/g, "-");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function isWithinDirectory(child, parent) {
|
|
130
|
+
const parentResolved = resolve(parent);
|
|
131
|
+
const childResolved = resolve(child);
|
|
132
|
+
const rel = relative(parentResolved, childResolved);
|
|
133
|
+
return rel === "" || (!!rel && rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
|
|
134
|
+
}
|
|
135
|
+
|
|
72
136
|
function copiedSkillTargets(home = homedir(), cwd = process.cwd()) {
|
|
73
137
|
return [
|
|
74
138
|
{ kind: "claude-code", label: "Claude Code global", scope: "global", path: join(home, ".claude", "skills", "graphit", "SKILL.md") },
|
|
@@ -136,6 +200,201 @@ function atomicWriteJson(path, obj) {
|
|
|
136
200
|
}
|
|
137
201
|
}
|
|
138
202
|
|
|
203
|
+
function claudePluginsRoot() {
|
|
204
|
+
return process.env.CLAUDE_PLUGINS_ROOT ?? join(homedir(), ".claude", "plugins");
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function claudeInstalledPluginsPath(root = claudePluginsRoot()) {
|
|
208
|
+
return join(root, "installed_plugins.json");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function claudeVersionedCachePath(version, root = claudePluginsRoot()) {
|
|
212
|
+
return join(
|
|
213
|
+
root,
|
|
214
|
+
"cache",
|
|
215
|
+
CLAUDE_MARKETPLACE_NAME,
|
|
216
|
+
CLAUDE_PLUGIN_NAME,
|
|
217
|
+
sanitizePathPart(version),
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function readClaudeInstalledFile(root = claudePluginsRoot()) {
|
|
222
|
+
const path = claudeInstalledPluginsPath(root);
|
|
223
|
+
const data = tryReadJson(path);
|
|
224
|
+
if (!data || typeof data !== "object") return null;
|
|
225
|
+
return { path, data };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function graphitInstallEntries(installedData) {
|
|
229
|
+
const plugins = installedData.plugins && typeof installedData.plugins === "object"
|
|
230
|
+
? installedData.plugins
|
|
231
|
+
: installedData;
|
|
232
|
+
const raw = plugins?.[PLUGIN_ID];
|
|
233
|
+
if (!raw) return [];
|
|
234
|
+
if (Array.isArray(raw)) {
|
|
235
|
+
return raw
|
|
236
|
+
.filter((entry) => entry && typeof entry === "object")
|
|
237
|
+
.map((entry) => ({ entry }));
|
|
238
|
+
}
|
|
239
|
+
if (typeof raw === "object") {
|
|
240
|
+
return [{ entry: raw }];
|
|
241
|
+
}
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function pluginEntryVersion(entry) {
|
|
246
|
+
if (!entry || typeof entry !== "object") return null;
|
|
247
|
+
const installPath = typeof entry.installPath === "string" ? entry.installPath : null;
|
|
248
|
+
const skillVersion = installPath
|
|
249
|
+
? readFrontmatterVersion(join(installPath, "skills", "graphit", "SKILL.md"))
|
|
250
|
+
: null;
|
|
251
|
+
const versionJson = installPath
|
|
252
|
+
? tryReadJson(join(installPath, "skills", "graphit", "VERSION.json"))?.version
|
|
253
|
+
: null;
|
|
254
|
+
return {
|
|
255
|
+
installPath,
|
|
256
|
+
entryVersion: typeof entry.version === "string" ? entry.version : null,
|
|
257
|
+
skillVersion,
|
|
258
|
+
versionJson: versionJson ?? null,
|
|
259
|
+
effectiveVersion: skillVersion ?? versionJson ?? (typeof entry.version === "string" ? entry.version : null),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function repairSourceLooksCurrent(sourceRoot, currentVersion) {
|
|
264
|
+
if (!isStrictSemver(currentVersion)) return false;
|
|
265
|
+
const skillVersion = readFrontmatterVersion(join(sourceRoot, "skills", "graphit", "SKILL.md"));
|
|
266
|
+
const versionJson = tryReadJson(join(sourceRoot, "skills", "graphit", "VERSION.json"))?.version;
|
|
267
|
+
const claudePlugin = tryReadJson(join(sourceRoot, ".claude-plugin", "plugin.json"))?.version;
|
|
268
|
+
return skillVersion === currentVersion && versionJson === currentVersion && claudePlugin === currentVersion;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function copyRepairableBundle(sourceRoot, targetRoot) {
|
|
272
|
+
if (!isWithinDirectory(targetRoot, claudePluginsRoot())) {
|
|
273
|
+
throw new Error(`Refusing to repair outside Claude plugins directory: ${targetRoot}`);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const tmpRoot = `${targetRoot}.tmp-${process.pid}-${Date.now()}`;
|
|
277
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
278
|
+
mkdirSync(tmpRoot, { recursive: true });
|
|
279
|
+
try {
|
|
280
|
+
for (const entry of REPAIRABLE_BUNDLE_ENTRIES) {
|
|
281
|
+
const source = join(sourceRoot, entry);
|
|
282
|
+
if (!existsSync(source)) continue;
|
|
283
|
+
cpSync(source, join(tmpRoot, entry), {
|
|
284
|
+
recursive: true,
|
|
285
|
+
force: true,
|
|
286
|
+
verbatimSymlinks: true,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
chmodSync(join(tmpRoot, "bin", "graphit"), 0o755);
|
|
291
|
+
} catch {
|
|
292
|
+
// Windows or missing wrapper; integrity checks catch real packaging drift.
|
|
293
|
+
}
|
|
294
|
+
mkdirSync(dirname(targetRoot), { recursive: true });
|
|
295
|
+
rmSync(targetRoot, { recursive: true, force: true });
|
|
296
|
+
renameSync(tmpRoot, targetRoot);
|
|
297
|
+
} catch (error) {
|
|
298
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
299
|
+
throw error;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function updateClaudeInstalledEntriesOnDisk(installedFile, staleRecords, targetPath, currentVersion) {
|
|
304
|
+
const now = new Date().toISOString();
|
|
305
|
+
for (const record of staleRecords) {
|
|
306
|
+
record.entry.installPath = targetPath;
|
|
307
|
+
record.entry.version = currentVersion;
|
|
308
|
+
record.entry.lastUpdated = now;
|
|
309
|
+
if (typeof record.entry.installedAt !== "string") {
|
|
310
|
+
record.entry.installedAt = now;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
atomicWriteJson(installedFile.path, installedFile.data);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function inspectClaudeInstalledPlugin(currentVersion, repair) {
|
|
317
|
+
const installedFile = readClaudeInstalledFile();
|
|
318
|
+
if (!installedFile) return { findings: [], metadata: [] };
|
|
319
|
+
|
|
320
|
+
const metadata = [];
|
|
321
|
+
const entries = graphitInstallEntries(installedFile.data);
|
|
322
|
+
if (entries.length === 0) return { findings: [], metadata };
|
|
323
|
+
|
|
324
|
+
const staleRecords = [];
|
|
325
|
+
for (const record of entries) {
|
|
326
|
+
const versionInfo = pluginEntryVersion(record.entry);
|
|
327
|
+
metadata.push({
|
|
328
|
+
label: `Claude Code installed ${PLUGIN_ID}`,
|
|
329
|
+
version: versionInfo.effectiveVersion,
|
|
330
|
+
installPath: versionInfo.installPath,
|
|
331
|
+
entryVersion: versionInfo.entryVersion,
|
|
332
|
+
skillVersion: versionInfo.skillVersion,
|
|
333
|
+
scope: record.entry.scope ?? "user",
|
|
334
|
+
projectPath: record.entry.projectPath ?? null,
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
if (
|
|
338
|
+
versionIsBehind(versionInfo.effectiveVersion, currentVersion) ||
|
|
339
|
+
versionIsBehind(versionInfo.entryVersion, currentVersion)
|
|
340
|
+
) {
|
|
341
|
+
staleRecords.push({ ...record, versionInfo });
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (staleRecords.length === 0) return { findings: [], metadata };
|
|
346
|
+
|
|
347
|
+
const staleVersions = [...new Set(staleRecords.map((record) => record.versionInfo.effectiveVersion ?? "unknown"))].join(", ");
|
|
348
|
+
const targetPath = claudeVersionedCachePath(currentVersion);
|
|
349
|
+
|
|
350
|
+
if (!repair) {
|
|
351
|
+
return {
|
|
352
|
+
metadata,
|
|
353
|
+
findings: [
|
|
354
|
+
{
|
|
355
|
+
type: "claude-installed-plugin-stale",
|
|
356
|
+
message: `Claude Code installed Graphit plugin is stale (${staleVersions}), expected ${currentVersion}`,
|
|
357
|
+
remediation: "Run `graphit plugin status --repair`, then restart/reload Claude Code. If you prefer the native plugin manager, run `/plugin marketplace update graphit-plugin`, then `/plugin update graphit@graphit-plugin`, then restart/reload.",
|
|
358
|
+
},
|
|
359
|
+
],
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
try {
|
|
364
|
+
if (!repairSourceLooksCurrent(pluginRoot, currentVersion)) {
|
|
365
|
+
throw new Error(`current npm/plugin bundle at ${pluginRoot} is missing synced ${currentVersion} plugin files`);
|
|
366
|
+
}
|
|
367
|
+
const targetSkillVersion = readFrontmatterVersion(join(targetPath, "skills", "graphit", "SKILL.md"));
|
|
368
|
+
if (targetSkillVersion !== currentVersion) {
|
|
369
|
+
copyRepairableBundle(pluginRoot, targetPath);
|
|
370
|
+
}
|
|
371
|
+
updateClaudeInstalledEntriesOnDisk(installedFile, staleRecords, targetPath, currentVersion);
|
|
372
|
+
return {
|
|
373
|
+
metadata,
|
|
374
|
+
findings: [
|
|
375
|
+
{
|
|
376
|
+
type: "claude-installed-plugin-repaired",
|
|
377
|
+
message: `Claude Code installed Graphit plugin was stale (${staleVersions}); repaired disk cache to ${currentVersion}`,
|
|
378
|
+
remediation: `Restart/reload Claude Code so it loads the repaired plugin cache at ${targetPath}. The already-running session may still have the old SKILL.md in memory until then.`,
|
|
379
|
+
repaired: true,
|
|
380
|
+
installPath: targetPath,
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
};
|
|
384
|
+
} catch (error) {
|
|
385
|
+
return {
|
|
386
|
+
metadata,
|
|
387
|
+
findings: [
|
|
388
|
+
{
|
|
389
|
+
type: "claude-installed-plugin-stale",
|
|
390
|
+
message: `Claude Code installed Graphit plugin is stale (${staleVersions}), expected ${currentVersion}; auto-repair failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
391
|
+
remediation: "Run `/plugin marketplace update graphit-plugin`, then `/plugin update graphit@graphit-plugin`, then restart/reload Claude Code. `graphit plugin status --repair` can repair from the npm bundle once the local files are writable.",
|
|
392
|
+
},
|
|
393
|
+
],
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
139
398
|
function writeCache(path, latestVersion) {
|
|
140
399
|
atomicWriteJson(path, {
|
|
141
400
|
schemaVersion: CACHE_SCHEMA_VERSION,
|
|
@@ -255,14 +514,31 @@ function tryParseJson(value) {
|
|
|
255
514
|
}
|
|
256
515
|
|
|
257
516
|
async function collectStatus() {
|
|
258
|
-
const
|
|
259
|
-
const
|
|
517
|
+
const bundleInfo = readBundleInfo(pluginRoot);
|
|
518
|
+
const packageName = bundleInfo.packageName;
|
|
519
|
+
const currentVersion = bundleInfo.currentVersion;
|
|
520
|
+
if (!currentVersion) {
|
|
521
|
+
return {
|
|
522
|
+
packageName,
|
|
523
|
+
sourceOfTruth: "plugin-bundle",
|
|
524
|
+
currentVersion: null,
|
|
525
|
+
latestVersion: null,
|
|
526
|
+
metadata: [],
|
|
527
|
+
findings: [
|
|
528
|
+
{
|
|
529
|
+
type: "metadata-drift",
|
|
530
|
+
message: `Could not determine Graphit plugin version from ${pluginRoot}`,
|
|
531
|
+
remediation: "Reinstall the Graphit plugin from the marketplace, then rerun `graphit plugin status`.",
|
|
532
|
+
},
|
|
533
|
+
],
|
|
534
|
+
};
|
|
535
|
+
}
|
|
260
536
|
const findings = [];
|
|
261
537
|
const metadata = [];
|
|
262
|
-
const claudePlugin =
|
|
538
|
+
const claudePlugin = bundleInfo.claudePlugin;
|
|
263
539
|
const codexPlugin = tryReadJson(join(pluginRoot, ".codex-plugin", "plugin.json"));
|
|
264
|
-
const marketplace =
|
|
265
|
-
const marketplacePlugin =
|
|
540
|
+
const marketplace = bundleInfo.marketplace;
|
|
541
|
+
const marketplacePlugin = bundleInfo.marketplacePlugin;
|
|
266
542
|
|
|
267
543
|
const versionChecks = [
|
|
268
544
|
[".claude-plugin/plugin.json", claudePlugin?.version],
|
|
@@ -277,7 +553,7 @@ async function collectStatus() {
|
|
|
277
553
|
];
|
|
278
554
|
|
|
279
555
|
for (const [label, version] of versionChecks) {
|
|
280
|
-
if (version !== currentVersion) {
|
|
556
|
+
if (!isPreflight && version !== currentVersion) {
|
|
281
557
|
findings.push({
|
|
282
558
|
type: "metadata-drift",
|
|
283
559
|
message: `${label} is ${version ?? "missing"}, expected ${currentVersion}`,
|
|
@@ -290,25 +566,25 @@ async function collectStatus() {
|
|
|
290
566
|
const marketplaceSource = marketplacePlugin?.source;
|
|
291
567
|
const sourceMatches =
|
|
292
568
|
marketplaceSource?.source === "npm" &&
|
|
293
|
-
marketplaceSource.package ===
|
|
569
|
+
marketplaceSource.package === packageName &&
|
|
294
570
|
marketplaceSource.version === currentVersion;
|
|
295
571
|
metadata.push({
|
|
296
572
|
label: ".claude-plugin/marketplace.json source",
|
|
297
573
|
version: marketplaceSource?.version ?? null,
|
|
298
574
|
source: marketplaceSource ?? null,
|
|
299
575
|
});
|
|
300
|
-
if (!sourceMatches) {
|
|
576
|
+
if (!isPreflight && !sourceMatches) {
|
|
301
577
|
findings.push({
|
|
302
578
|
type: "metadata-drift",
|
|
303
579
|
message: `.claude-plugin/marketplace.json source is ${
|
|
304
580
|
marketplaceSource ? JSON.stringify(marketplaceSource) : "missing"
|
|
305
|
-
}, expected npm source ${
|
|
581
|
+
}, expected npm source ${packageName}@${currentVersion}`,
|
|
306
582
|
remediation: "Run `npm run sync:version` before publishing @graphit/cli.",
|
|
307
583
|
});
|
|
308
584
|
}
|
|
309
585
|
|
|
310
586
|
const latestVersion = await getLatestVersion(currentVersion);
|
|
311
|
-
if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) {
|
|
587
|
+
if (!isPreflight && latestVersion && compareVersions(latestVersion, currentVersion) > 0) {
|
|
312
588
|
findings.push({
|
|
313
589
|
type: "package-update",
|
|
314
590
|
message: `@graphit/cli update available: ${currentVersion} -> ${latestVersion}`,
|
|
@@ -316,6 +592,10 @@ async function collectStatus() {
|
|
|
316
592
|
});
|
|
317
593
|
}
|
|
318
594
|
|
|
595
|
+
const claudeInstall = inspectClaudeInstalledPlugin(currentVersion, shouldRepair);
|
|
596
|
+
metadata.push(...claudeInstall.metadata);
|
|
597
|
+
findings.push(...claudeInstall.findings);
|
|
598
|
+
|
|
319
599
|
for (const target of copiedSkillTargets()) {
|
|
320
600
|
const { label, path } = target;
|
|
321
601
|
if (!existsSync(path)) continue;
|
|
@@ -339,7 +619,7 @@ async function collectStatus() {
|
|
|
339
619
|
}
|
|
340
620
|
|
|
341
621
|
return {
|
|
342
|
-
packageName
|
|
622
|
+
packageName,
|
|
343
623
|
sourceOfTruth: "plugin-bundle",
|
|
344
624
|
currentVersion,
|
|
345
625
|
latestVersion,
|