sandstream-kit 1.3.1 → 1.4.1
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/README.md +62 -0
- package/dist/check-security.d.ts +2 -0
- package/dist/check-security.js +8 -1
- package/dist/check-security.js.map +1 -1
- package/dist/cli.js +92 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/hooks.js +5 -0
- package/dist/commands/hooks.js.map +1 -1
- package/dist/commands/memory.js +23 -4
- package/dist/commands/memory.js.map +1 -1
- package/dist/config.d.ts +32 -0
- package/dist/config.js +25 -1
- package/dist/config.js.map +1 -1
- package/dist/context-lock.d.ts +81 -0
- package/dist/context-lock.js +203 -0
- package/dist/context-lock.js.map +1 -0
- package/dist/hooks.d.ts +12 -0
- package/dist/hooks.js +44 -3
- package/dist/hooks.js.map +1 -1
- package/dist/install.d.ts +10 -0
- package/dist/install.js +34 -1
- package/dist/install.js.map +1 -1
- package/dist/login.d.ts +1 -1
- package/dist/login.js +15 -2
- package/dist/login.js.map +1 -1
- package/dist/memory/db.js +9 -0
- package/dist/memory/db.js.map +1 -1
- package/dist/memory/pal.d.ts +19 -2
- package/dist/memory/pal.js +67 -27
- package/dist/memory/pal.js.map +1 -1
- package/dist/memory/types.d.ts +7 -0
- package/dist/output.js +4 -2
- package/dist/output.js.map +1 -1
- package/dist/rules/catalog.d.ts +31 -0
- package/dist/rules/catalog.js +49 -0
- package/dist/rules/catalog.js.map +1 -0
- package/dist/secrets.d.ts +1 -0
- package/dist/secrets.js +10 -0
- package/dist/secrets.js.map +1 -1
- package/dist/utils/redactSecrets.d.ts +11 -0
- package/dist/utils/redactSecrets.js +17 -0
- package/dist/utils/redactSecrets.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-project CLI context lock.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that each tool's LIVE (account, project) pair matches what `.kit.toml`
|
|
5
|
+
* `[context]` declares. The core rule: a logged-in account and a selected project
|
|
6
|
+
* are NEVER assumed to belong together. Only the declared pair is trusted; the
|
|
7
|
+
* ambient CLI state is data to be checked against it. A right account paired with
|
|
8
|
+
* the wrong project (or vice versa) is a mismatch, not a pass.
|
|
9
|
+
*
|
|
10
|
+
* Read-only: this never changes any tool's state (that is `kit context use`).
|
|
11
|
+
*/
|
|
12
|
+
import { execFile } from "node:child_process";
|
|
13
|
+
import { promisify } from "node:util";
|
|
14
|
+
import { readFile } from "node:fs/promises";
|
|
15
|
+
import { readFileSync } from "node:fs";
|
|
16
|
+
import { resolve, join } from "node:path";
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
const exec = promisify(execFile);
|
|
19
|
+
function field(tool, name, expected, actual) {
|
|
20
|
+
if (expected === undefined)
|
|
21
|
+
return null; // not declared -> not checked
|
|
22
|
+
if (actual === null)
|
|
23
|
+
return { tool, field: name, status: "unknown", expected, actual: null };
|
|
24
|
+
return { tool, field: name, status: actual === expected ? "ok" : "mismatch", expected, actual };
|
|
25
|
+
}
|
|
26
|
+
// One row per checkable (tool, field). Adding a CLI to the lock is one row.
|
|
27
|
+
// `declared` returns the expected value (undefined = not declared = not checked);
|
|
28
|
+
// `live` returns the read value (null = unreadable). vercel context = the ids in
|
|
29
|
+
// .vercel/project.json (deterministic + local): team -> orgId, project -> projectId.
|
|
30
|
+
const FIELD_SPECS = [
|
|
31
|
+
{ tool: "gcloud", field: "account", declared: (d) => d.gcloud?.account, live: (l) => l.gcloud?.account ?? null },
|
|
32
|
+
{ tool: "gcloud", field: "project", declared: (d) => d.gcloud?.project, live: (l) => l.gcloud?.project ?? null },
|
|
33
|
+
{ tool: "git", field: "email", declared: (d) => d.git?.email, live: (l) => l.git?.email ?? null },
|
|
34
|
+
{ tool: "github", field: "org", declared: (d) => d.github?.org, live: (l) => l.github?.org ?? null },
|
|
35
|
+
{ tool: "github", field: "remote", declared: (d) => d.github?.remote, live: (l) => l.github?.remote ?? null },
|
|
36
|
+
{ tool: "npm", field: "registry", declared: (d) => d.npm?.registry, live: (l) => l.npm?.registry ?? null },
|
|
37
|
+
{ tool: "vercel", field: "team(orgId)", declared: (d) => d.vercel?.team, live: (l) => l.vercel?.orgId ?? null },
|
|
38
|
+
{ tool: "vercel", field: "project(projectId)", declared: (d) => d.vercel?.project, live: (l) => l.vercel?.projectId ?? null },
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Compare a declared context against a live snapshot. PURE (no I/O) so the
|
|
42
|
+
* principle is unit-testable: only the exact declared pair passes.
|
|
43
|
+
*/
|
|
44
|
+
export function compareContext(declared, live) {
|
|
45
|
+
return FIELD_SPECS.map((s) => field(s.tool, s.field, s.declared(declared), s.live(live))).filter((f) => f !== null);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build a ready-to-paste `[context]` block from a live snapshot, for the
|
|
49
|
+
* empty-state hint. Every value is what kit DETECTED as the currently-active
|
|
50
|
+
* CLI state — which is exactly what the lock exists to question, not trust.
|
|
51
|
+
* So each field is annotated with its source: git/github/vercel come from
|
|
52
|
+
* repo-local truth (config, origin remote, .vercel/project.json) and are
|
|
53
|
+
* authoritative; gcloud/npm are ambient/global and are flagged to verify.
|
|
54
|
+
* Tools kit could not read are omitted. PURE so it is unit-testable.
|
|
55
|
+
*/
|
|
56
|
+
export function suggestContextToml(live) {
|
|
57
|
+
const out = [];
|
|
58
|
+
const emit = (header, rows) => {
|
|
59
|
+
const present = rows.filter(([, v]) => v);
|
|
60
|
+
if (present.length === 0)
|
|
61
|
+
return;
|
|
62
|
+
out.push(header);
|
|
63
|
+
for (const [k, v, note] of present) {
|
|
64
|
+
out.push(`${k} = "${v}"${note ? ` # ${note}` : ""}`);
|
|
65
|
+
}
|
|
66
|
+
out.push("");
|
|
67
|
+
};
|
|
68
|
+
emit("[context.git]", [["email", live.git?.email, "this repo's git config"]]);
|
|
69
|
+
emit("[context.github]", [
|
|
70
|
+
["org", live.github?.org, "from origin remote — authoritative"],
|
|
71
|
+
["remote", live.github?.remote, ""],
|
|
72
|
+
]);
|
|
73
|
+
emit("[context.vercel]", [
|
|
74
|
+
["team", live.vercel?.orgId, "orgId from .vercel/project.json — authoritative"],
|
|
75
|
+
["project", live.vercel?.projectId, "projectId"],
|
|
76
|
+
]);
|
|
77
|
+
emit("[context.gcloud]", [
|
|
78
|
+
["account", live.gcloud?.account, "⚠ currently-active gcloud — VERIFY it is right for THIS repo"],
|
|
79
|
+
["project", live.gcloud?.project, "⚠ verify"],
|
|
80
|
+
]);
|
|
81
|
+
emit("[context.npm]", [["registry", live.npm?.registry, "global npm registry"]]);
|
|
82
|
+
return out.join("\n").trimEnd();
|
|
83
|
+
}
|
|
84
|
+
async function run(cmd, args) {
|
|
85
|
+
try {
|
|
86
|
+
const { stdout } = await exec(cmd, args, { timeout: 8_000 });
|
|
87
|
+
return stdout.trim() || null;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** github.com[:/]org/repo(.git) -> { org, "github.com/org/repo" }. */
|
|
94
|
+
export function parseGithubRemote(url) {
|
|
95
|
+
if (!url)
|
|
96
|
+
return { org: null, remote: null };
|
|
97
|
+
const m = url.match(/github\.com[:/]([^/]+)\/(.+?)(?:\.git)?$/);
|
|
98
|
+
if (!m)
|
|
99
|
+
return { org: null, remote: null };
|
|
100
|
+
return { org: m[1], remote: `github.com/${m[1]}/${m[2]}` };
|
|
101
|
+
}
|
|
102
|
+
/** Read the live context from each tool. Every read fails soft to null. */
|
|
103
|
+
export async function gatherLive(cwd = process.cwd()) {
|
|
104
|
+
const live = {};
|
|
105
|
+
const gcloudJson = await run("gcloud", ["config", "list", "--format=json"]);
|
|
106
|
+
if (gcloudJson !== null) {
|
|
107
|
+
try {
|
|
108
|
+
const c = JSON.parse(gcloudJson);
|
|
109
|
+
live.gcloud = { account: c.core?.account ?? null, project: c.core?.project ?? null };
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
live.gcloud = { account: null, project: null };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
live.gcloud = { account: null, project: null };
|
|
117
|
+
}
|
|
118
|
+
live.git = { email: await run("git", ["config", "user.email"]) };
|
|
119
|
+
const remote = await run("git", ["remote", "get-url", "origin"]);
|
|
120
|
+
live.github = parseGithubRemote(remote);
|
|
121
|
+
const registry = await run("npm", ["config", "get", "registry"]);
|
|
122
|
+
live.npm = { registry: registry ? registry.replace(/\/+$/, "") : null };
|
|
123
|
+
try {
|
|
124
|
+
const raw = await readFile(resolve(cwd, ".vercel", "project.json"), "utf8");
|
|
125
|
+
const j = JSON.parse(raw);
|
|
126
|
+
live.vercel = { orgId: j.orgId ?? null, projectId: j.projectId ?? null };
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
live.vercel = { orgId: null, projectId: null };
|
|
130
|
+
}
|
|
131
|
+
return live;
|
|
132
|
+
}
|
|
133
|
+
/** Verify the declared context against live tool state. Empty if nothing declared. */
|
|
134
|
+
export async function checkContext(ctx, cwd = process.cwd()) {
|
|
135
|
+
if (!ctx)
|
|
136
|
+
return [];
|
|
137
|
+
// Normalize a declared npm registry the same way the live read is normalized.
|
|
138
|
+
const declared = ctx.npm?.registry
|
|
139
|
+
? { ...ctx, npm: { ...ctx.npm, registry: ctx.npm.registry.replace(/\/+$/, "") } }
|
|
140
|
+
: ctx;
|
|
141
|
+
return compareContext(declared, await gatherLive(cwd));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Plan the commands that would activate the declared context. PURE (no I/O) so
|
|
145
|
+
* the mapping is unit-testable. Only LOCAL CLI config is ever touched (gcloud
|
|
146
|
+
* config, repo git identity) — never an account or a deploy. vercel/npm are not
|
|
147
|
+
* auto-activated (no clean per-repo "active" state); `use` prints guidance.
|
|
148
|
+
*/
|
|
149
|
+
export function planContext(ctx) {
|
|
150
|
+
const steps = [];
|
|
151
|
+
const g = ctx.gcloud;
|
|
152
|
+
if (g?.config)
|
|
153
|
+
steps.push({ tool: "gcloud", argv: ["config", "configurations", "activate", g.config], describe: `activate config ${g.config}` });
|
|
154
|
+
if (g?.account)
|
|
155
|
+
steps.push({ tool: "gcloud", argv: ["config", "set", "account", g.account], describe: `account=${g.account}` });
|
|
156
|
+
if (g?.project)
|
|
157
|
+
steps.push({ tool: "gcloud", argv: ["config", "set", "project", g.project], describe: `project=${g.project}` });
|
|
158
|
+
if (g?.region)
|
|
159
|
+
steps.push({ tool: "gcloud", argv: ["config", "set", "run/region", g.region], describe: `run/region=${g.region}` });
|
|
160
|
+
if (ctx.git?.email)
|
|
161
|
+
steps.push({ tool: "git", argv: ["config", "user.email", ctx.git.email], local: true, describe: `git user.email=${ctx.git.email}` });
|
|
162
|
+
return steps;
|
|
163
|
+
}
|
|
164
|
+
/** Execute the activation plan. Each step runs via execFile (no shell). */
|
|
165
|
+
export async function applyContext(ctx, cwd = process.cwd()) {
|
|
166
|
+
const results = [];
|
|
167
|
+
for (const step of planContext(ctx)) {
|
|
168
|
+
let ok = false;
|
|
169
|
+
try {
|
|
170
|
+
await exec(step.tool, step.argv, { timeout: 8_000, cwd: step.local ? cwd : undefined });
|
|
171
|
+
ok = true;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
ok = false;
|
|
175
|
+
}
|
|
176
|
+
results.push({ step, ok });
|
|
177
|
+
}
|
|
178
|
+
return results;
|
|
179
|
+
}
|
|
180
|
+
// ── kit context --prompt — a fast, read-only PS1 indicator ───────────────────
|
|
181
|
+
/** Extract `project = <value>` from a gcloud configuration INI. PURE. */
|
|
182
|
+
export function parseGcloudProject(ini) {
|
|
183
|
+
const m = ini.match(/^\s*project\s*=\s*(.+?)\s*$/m);
|
|
184
|
+
return m ? m[1].trim() : null;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* A compact indicator of the ACTIVE gcloud context for a shell prompt, read from
|
|
188
|
+
* gcloud's config files (no subprocess, so it is cheap to call per prompt).
|
|
189
|
+
* Returns "" if gcloud config cannot be read. Example: "[gcp:cbd-platform]".
|
|
190
|
+
*/
|
|
191
|
+
export function contextPrompt() {
|
|
192
|
+
try {
|
|
193
|
+
const dir = process.env.CLOUDSDK_CONFIG || join(homedir(), ".config", "gcloud");
|
|
194
|
+
const active = readFileSync(join(dir, "active_config"), "utf8").trim();
|
|
195
|
+
const ini = readFileSync(join(dir, "configurations", `config_${active}`), "utf8");
|
|
196
|
+
const project = parseGcloudProject(ini);
|
|
197
|
+
return project ? `[gcp:${project}]` : active ? `[gcp:${active}]` : "";
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return "";
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=context-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-lock.js","sourceRoot":"","sources":["../src/context-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAmBjC,SAAS,KAAK,CACZ,IAAY,EACZ,IAAY,EACZ,QAA4B,EAC5B,MAAqB;IAErB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;IACvE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7F,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAClG,CAAC;AAED,4EAA4E;AAC5E,kFAAkF;AAClF,iFAAiF;AACjF,qFAAqF;AACrF,MAAM,WAAW,GAKX;IACJ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,EAAE;IAChH,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,EAAE;IAChH,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI,EAAE;IACjG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE;IACpG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE;IAC7G,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,IAAI,IAAI,EAAE;IAC1G,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE;IAC/G,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,EAAE;CAC9H,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAuB,EAAE,IAAiB;IACvE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAC9F,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,KAAK,IAAI,CACvC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAiB;IAClD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,IAAmD,EAAQ,EAAE;QACzF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC,CAAC;IACF,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,kBAAkB,EAAE;QACvB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,oCAAoC,CAAC;QAC/D,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,kBAAkB,EAAE;QACvB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,iDAAiD,CAAC;QAC/E,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC;KACjD,CAAC,CAAC;IACH,IAAI,CAAC,kBAAkB,EAAE;QACvB,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,8DAA8D,CAAC;QACjG,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC;KAC9C,CAAC,CAAC;IACH,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAAC,GAAkB;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7D,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,IAAI,GAAgB,EAAE,CAAC;IAE7B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5E,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAsD,CAAC;YACtF,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;IAEjE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAExE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5E,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2C,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAA8B,EAC9B,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,8EAA8E;IAC9E,MAAM,QAAQ,GAAkB,GAAG,CAAC,GAAG,EAAE,QAAQ;QAC/C,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;QACjF,CAAC,CAAC,GAAG,CAAC;IACR,OAAO,cAAc,CAAC,QAAQ,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAYD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAAkB;IAC5C,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM;QACX,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpI,IAAI,CAAC,EAAE,OAAO;QACZ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClH,IAAI,CAAC,EAAE,OAAO;QACZ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClH,IAAI,CAAC,EAAE,MAAM;QACX,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtH,IAAI,GAAG,CAAC,GAAG,EAAE,KAAK;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvI,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAkB,EAClB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,EAAE,GAAG,KAAK,CAAC;QACf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACxF,EAAE,GAAG,IAAI,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAEhF,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,UAAU,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import type { HooksConfig } from "./config.js";
|
|
2
|
+
/**
|
|
3
|
+
* The directory git ACTUALLY runs hooks from. When `core.hooksPath` is set
|
|
4
|
+
* (husky, lefthook, a committed `.githooks/`), git ignores `.git/hooks`
|
|
5
|
+
* entirely — installing there is a silent no-op, so a security gate like
|
|
6
|
+
* `context-check` would report installed but never run. Honor hooksPath so an
|
|
7
|
+
* installed hook actually fires.
|
|
8
|
+
*
|
|
9
|
+
* Detection is scoped to the target repo (the parent of `gitDir`), not the
|
|
10
|
+
* process cwd, so temp-dir tests that pass an absolute throwaway gitDir fall
|
|
11
|
+
* back to `<gitDir>/hooks` even when the kit repo itself sets hooksPath.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveHooksDir(gitDir?: string): string;
|
|
2
14
|
/**
|
|
3
15
|
* Path (relative to .git) of the sentinel file written by the kit
|
|
4
16
|
* pre-commit hook. The post-commit detector reads it back; if it's missing
|
package/dist/hooks.js
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
import { writeFile, chmod, mkdir } from "node:fs/promises";
|
|
2
|
-
import { resolve } from "node:path";
|
|
2
|
+
import { resolve, isAbsolute, dirname } from "node:path";
|
|
3
3
|
import { existsSync } from "node:fs";
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
/**
|
|
6
|
+
* The directory git ACTUALLY runs hooks from. When `core.hooksPath` is set
|
|
7
|
+
* (husky, lefthook, a committed `.githooks/`), git ignores `.git/hooks`
|
|
8
|
+
* entirely — installing there is a silent no-op, so a security gate like
|
|
9
|
+
* `context-check` would report installed but never run. Honor hooksPath so an
|
|
10
|
+
* installed hook actually fires.
|
|
11
|
+
*
|
|
12
|
+
* Detection is scoped to the target repo (the parent of `gitDir`), not the
|
|
13
|
+
* process cwd, so temp-dir tests that pass an absolute throwaway gitDir fall
|
|
14
|
+
* back to `<gitDir>/hooks` even when the kit repo itself sets hooksPath.
|
|
15
|
+
*/
|
|
16
|
+
export function resolveHooksDir(gitDir = ".git") {
|
|
17
|
+
const repoRoot = isAbsolute(gitDir) ? dirname(gitDir) : process.cwd();
|
|
18
|
+
try {
|
|
19
|
+
const hp = execFileSync("git", ["-C", repoRoot, "config", "--get", "core.hooksPath"], {
|
|
20
|
+
encoding: "utf-8",
|
|
21
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
22
|
+
}).trim();
|
|
23
|
+
if (hp)
|
|
24
|
+
return isAbsolute(hp) ? hp : resolve(repoRoot, hp);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
/* not a git repo, hooksPath unset, or git absent — fall back below */
|
|
28
|
+
}
|
|
29
|
+
return resolve(process.cwd(), gitDir, "hooks");
|
|
30
|
+
}
|
|
4
31
|
/**
|
|
5
32
|
* Path (relative to .git) of the sentinel file written by the kit
|
|
6
33
|
* pre-commit hook. The post-commit detector reads it back; if it's missing
|
|
@@ -25,7 +52,7 @@ export async function installHooks(config, gitDir = ".git") {
|
|
|
25
52
|
return [{ hookName: "read-only-refusal", action: "failed", detail: refusal.reason }];
|
|
26
53
|
}
|
|
27
54
|
const results = [];
|
|
28
|
-
const hooksDir =
|
|
55
|
+
const hooksDir = resolveHooksDir(gitDir);
|
|
29
56
|
// Ensure hooks directory exists
|
|
30
57
|
try {
|
|
31
58
|
await mkdir(hooksDir, { recursive: true });
|
|
@@ -185,6 +212,20 @@ async function installHook(hooksDir, hookName, commands) {
|
|
|
185
212
|
try {
|
|
186
213
|
// Check if hook already exists
|
|
187
214
|
const exists = existsSync(hookPath);
|
|
215
|
+
// Never overwrite a hook kit did not generate (e.g. a committed
|
|
216
|
+
// .githooks/pre-push). Clobbering the operator's own gate would silently
|
|
217
|
+
// drop whatever it enforced. Skip and tell them to merge or remove it.
|
|
218
|
+
if (exists) {
|
|
219
|
+
const { readFile } = await import("node:fs/promises");
|
|
220
|
+
const current = await readFile(hookPath, "utf-8").catch(() => "");
|
|
221
|
+
if (current && !current.includes("Generated by kit")) {
|
|
222
|
+
return {
|
|
223
|
+
hookName,
|
|
224
|
+
action: "skipped",
|
|
225
|
+
detail: `existing non-kit ${hookName} at ${hookPath} — left untouched; add \`${commands.join(" && ")}\` to it manually or remove it, then re-run`,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
188
229
|
const action = exists ? "updated" : "installed";
|
|
189
230
|
// Write hook file
|
|
190
231
|
await writeFile(hookPath, hookContent, "utf-8");
|
|
@@ -247,7 +288,7 @@ exit 0
|
|
|
247
288
|
*/
|
|
248
289
|
export async function uninstallHooks(hookNames, gitDir = ".git") {
|
|
249
290
|
const results = [];
|
|
250
|
-
const hooksDir =
|
|
291
|
+
const hooksDir = resolveHooksDir(gitDir);
|
|
251
292
|
for (const hookName of hookNames) {
|
|
252
293
|
const hookPath = resolve(hooksDir, hookName);
|
|
253
294
|
try {
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/install.d.ts
CHANGED
|
@@ -5,6 +5,16 @@ export interface InstallResult {
|
|
|
5
5
|
action: "installed" | "already_ok" | "failed";
|
|
6
6
|
detail: string;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Turn a mise exec failure into an actionable message. PURE so it can be
|
|
10
|
+
* unit-tested. `message` is the error's `.message` (often just the generic
|
|
11
|
+
* "Command failed: mise install node@24"); `stderr` is mise's real output,
|
|
12
|
+
* which carries the actionable cause. Common cases:
|
|
13
|
+
* - mise not installed at all (`spawn mise ENOENT`)
|
|
14
|
+
* - the repo's .mise.toml is untrusted (mise refuses to run until `mise trust`)
|
|
15
|
+
* Otherwise prefer the real `mise ERROR` line from stderr over "Command failed".
|
|
16
|
+
*/
|
|
17
|
+
export declare function miseErrorDetail(message: string, stderr?: string): string;
|
|
8
18
|
export interface InstallDeps {
|
|
9
19
|
checkTools: (tools: ToolConfig) => Promise<ToolStatus[]>;
|
|
10
20
|
miseInstall: (tool: string, version: string) => Promise<{
|
package/dist/install.js
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
import { checkTools } from "./check-tools.js";
|
|
2
2
|
import { exec } from "./utils/exec.js";
|
|
3
|
+
/**
|
|
4
|
+
* Turn a mise exec failure into an actionable message. PURE so it can be
|
|
5
|
+
* unit-tested. `message` is the error's `.message` (often just the generic
|
|
6
|
+
* "Command failed: mise install node@24"); `stderr` is mise's real output,
|
|
7
|
+
* which carries the actionable cause. Common cases:
|
|
8
|
+
* - mise not installed at all (`spawn mise ENOENT`)
|
|
9
|
+
* - the repo's .mise.toml is untrusted (mise refuses to run until `mise trust`)
|
|
10
|
+
* Otherwise prefer the real `mise ERROR` line from stderr over "Command failed".
|
|
11
|
+
*/
|
|
12
|
+
export function miseErrorDetail(message, stderr = "") {
|
|
13
|
+
const firstMsg = message.split("\n")[0];
|
|
14
|
+
if (/ENOENT/.test(firstMsg)) {
|
|
15
|
+
return "mise is not installed — kit installs and pins tool versions with it. Install mise (brew install mise, or: curl https://mise.run | sh) and re-run, or install the tool yourself.";
|
|
16
|
+
}
|
|
17
|
+
const combined = `${message}\n${stderr}`;
|
|
18
|
+
if (/not trusted|mise trust/i.test(combined)) {
|
|
19
|
+
return "mise refused this repo's .mise.toml because it is not trusted. Review the file, then run `mise trust` here and re-run kit setup.";
|
|
20
|
+
}
|
|
21
|
+
// Prefer a concrete `mise ERROR ...` line over the generic "Command failed".
|
|
22
|
+
const miseErr = stderr
|
|
23
|
+
.split("\n")
|
|
24
|
+
.map((l) => l.trim())
|
|
25
|
+
.find((l) => /^mise ERROR/.test(l));
|
|
26
|
+
if (miseErr)
|
|
27
|
+
return miseErr.replace(/^mise ERROR\s*/, "");
|
|
28
|
+
const firstStderr = stderr.trim().split("\n")[0];
|
|
29
|
+
if (firstStderr)
|
|
30
|
+
return firstStderr;
|
|
31
|
+
return firstMsg;
|
|
32
|
+
}
|
|
3
33
|
async function miseInstall(tool, version) {
|
|
4
34
|
const versionArg = version === "latest" ? "latest" : version;
|
|
5
35
|
try {
|
|
@@ -16,7 +46,10 @@ async function miseInstall(tool, version) {
|
|
|
16
46
|
}
|
|
17
47
|
catch (err) {
|
|
18
48
|
const message = err instanceof Error ? err.message : String(err);
|
|
19
|
-
|
|
49
|
+
const stderr = typeof err?.stderr === "string"
|
|
50
|
+
? err.stderr
|
|
51
|
+
: "";
|
|
52
|
+
return { ok: false, detail: miseErrorDetail(message, stderr) };
|
|
20
53
|
}
|
|
21
54
|
}
|
|
22
55
|
const defaultDeps = { checkTools, miseInstall };
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AASvC,KAAK,UAAU,WAAW,CACxB,IAAY,EACZ,OAAe;IAEf,MAAM,UAAU,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC,EAAE;YACvD,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,2CAA2C;QAC3C,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC,EAAE;YACnD,OAAO,EAAE,MAAM;YACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,IAAI,IAAI,UAAU,WAAW,EAAE,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/login.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { ServiceConfig } from "./config.js";
|
|
|
2
2
|
import { type ServiceStatus } from "./check-services.js";
|
|
3
3
|
export interface LoginResult {
|
|
4
4
|
name: string;
|
|
5
|
-
action: "already_authenticated" | "logged_in" | "login_unverified" | "failed";
|
|
5
|
+
action: "already_authenticated" | "logged_in" | "login_unverified" | "manual" | "failed";
|
|
6
6
|
detail: string;
|
|
7
7
|
}
|
|
8
8
|
export interface LoginDeps {
|
package/dist/login.js
CHANGED
|
@@ -3,6 +3,7 @@ import { promisify } from "node:util";
|
|
|
3
3
|
import { checkServices } from "./check-services.js";
|
|
4
4
|
import { isNonInteractive } from "./environment.js";
|
|
5
5
|
import { parseCommand } from "./utils/parseCommand.js";
|
|
6
|
+
import { safeStatusLine } from "./utils/redactSecrets.js";
|
|
6
7
|
const exec = promisify(execFile);
|
|
7
8
|
function runInteractive(command) {
|
|
8
9
|
const parsed = parseCommand(command);
|
|
@@ -69,7 +70,7 @@ export async function loginServices(services, deps = defaultDeps) {
|
|
|
69
70
|
results.push({
|
|
70
71
|
name: status.name,
|
|
71
72
|
action: "already_authenticated",
|
|
72
|
-
detail: status.output,
|
|
73
|
+
detail: safeStatusLine(status.output),
|
|
73
74
|
});
|
|
74
75
|
continue;
|
|
75
76
|
}
|
|
@@ -82,6 +83,18 @@ export async function loginServices(services, deps = defaultDeps) {
|
|
|
82
83
|
});
|
|
83
84
|
continue;
|
|
84
85
|
}
|
|
86
|
+
// A service whose "login" is informational (no CLI login — set an env var,
|
|
87
|
+
// paste a DSN) is expected manual setup, not a failure. Surface it as
|
|
88
|
+
// "manual" so it doesn't fail the step or get pointlessly retried.
|
|
89
|
+
const parsedLogin = parseCommand(config.login);
|
|
90
|
+
if (parsedLogin.kind === "informational") {
|
|
91
|
+
results.push({
|
|
92
|
+
name: status.name,
|
|
93
|
+
action: "manual",
|
|
94
|
+
detail: parsedLogin.message,
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
85
98
|
console.log(`\n\x1b[1mLogging in to ${status.name}...\x1b[0m`);
|
|
86
99
|
const login = await deps.runLogin(config.login);
|
|
87
100
|
if (!login.ok) {
|
|
@@ -108,7 +121,7 @@ export async function loginServices(services, deps = defaultDeps) {
|
|
|
108
121
|
results.push({
|
|
109
122
|
name: status.name,
|
|
110
123
|
action: "logged_in",
|
|
111
|
-
detail: verify.output,
|
|
124
|
+
detail: safeStatusLine(verify.output),
|
|
112
125
|
});
|
|
113
126
|
}
|
|
114
127
|
else {
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAsB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAsB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAajC,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,0BAA0B,MAAM,CAAC,OAAO,EAAE;SACnD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,iCAAiC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;YAC3C,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,IAAI,EAAE,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,OAAe;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;YAC7D,OAAO,EAAE,MAAM;YACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACjD,CAAC;AACH,CAAC;AASD,MAAM,WAAW,GAAc;IAC7B,aAAa;IACb,QAAQ,EAAE,cAAc;IACxB,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAuC,EACvC,OAAkB,WAAW;IAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,uBAAuB;gBAC/B,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;aACtC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,6BAA6B;aACtC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,2EAA2E;QAC3E,sEAAsE;QACtE,mEAAmE;QACnE,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,WAAW,CAAC,OAAO;aAC5B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,mEAAmE;QACnE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,MAAM,EAAE,kBAAkB;oBAC1B,MAAM,EAAE,6BAA6B,IAAI,CAAC,MAAM,EAAE;iBACnD,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,MAAM,EAAE,WAAW;oBACnB,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;iBACtC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,MAAM,EAAE,kBAAkB;oBAC1B,MAAM,EAAE,iDAAiD;iBAC1D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/memory/db.js
CHANGED
|
@@ -82,6 +82,7 @@ CREATE TABLE IF NOT EXISTS pending_actions (
|
|
|
82
82
|
scope TEXT,
|
|
83
83
|
kind TEXT NOT NULL DEFAULT 'manual',
|
|
84
84
|
verify_cmd TEXT,
|
|
85
|
+
verify_check TEXT,
|
|
85
86
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
86
87
|
next_check TEXT,
|
|
87
88
|
snooze_until TEXT,
|
|
@@ -131,6 +132,10 @@ function migrate(db) {
|
|
|
131
132
|
// v2: pending_actions.verify_passes (N=2 auto-verify confirmation). Add to
|
|
132
133
|
// tables created before this column existed.
|
|
133
134
|
ensureColumn(db, "pending_actions", "verify_passes", "INTEGER NOT NULL DEFAULT 0");
|
|
135
|
+
// v3: pending_actions.verify_check (declarative typed verify replacing raw
|
|
136
|
+
// shell verify_cmd). Legacy verify_cmd rows have a NULL verify_check and are
|
|
137
|
+
// never auto-executed.
|
|
138
|
+
ensureColumn(db, "pending_actions", "verify_check", "TEXT");
|
|
134
139
|
const row = db.prepare("SELECT version FROM schema_meta LIMIT 1").get();
|
|
135
140
|
if (!row) {
|
|
136
141
|
db.prepare("INSERT INTO schema_meta(version) VALUES (?)").run(SCHEMA_VERSION);
|
|
@@ -263,6 +268,9 @@ export function getStats(db) {
|
|
|
263
268
|
// best-effort: size is informational only
|
|
264
269
|
}
|
|
265
270
|
}
|
|
271
|
+
const byHarness = db
|
|
272
|
+
.prepare("SELECT harness, COUNT(*) AS n FROM sessions GROUP BY harness ORDER BY n DESC, harness ASC")
|
|
273
|
+
.all().map((r) => ({ harness: r.harness, sessions: Number(r.n) }));
|
|
266
274
|
return {
|
|
267
275
|
sessions: count("SELECT COUNT(*) AS n FROM sessions"),
|
|
268
276
|
messages: count("SELECT COUNT(*) AS n FROM messages"),
|
|
@@ -270,6 +278,7 @@ export function getStats(db) {
|
|
|
270
278
|
pendingOpen: count("SELECT COUNT(*) AS n FROM pending_actions WHERE status = 'open'"),
|
|
271
279
|
dbPath,
|
|
272
280
|
sizeBytes,
|
|
281
|
+
byHarness,
|
|
273
282
|
};
|
|
274
283
|
}
|
|
275
284
|
//# sourceMappingURL=db.js.map
|
package/dist/memory/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/memory/db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AASrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,GAAG
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/memory/db.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/pal.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
/**
|
|
3
|
+
* A declarative verify check. Fixed shapes only, executed natively by kit (no
|
|
4
|
+
* shell, no arbitrary binary). Add a new shape here only if it can be run as a
|
|
5
|
+
* pure data operation that cannot be coerced into command execution.
|
|
6
|
+
*/
|
|
7
|
+
export type VerifyCheck = {
|
|
8
|
+
type: "http-status";
|
|
9
|
+
url: string;
|
|
10
|
+
expect: number;
|
|
11
|
+
} | {
|
|
12
|
+
type: "file-exists";
|
|
13
|
+
path: string;
|
|
14
|
+
};
|
|
2
15
|
export interface PendingAction {
|
|
3
16
|
id: string;
|
|
4
17
|
status: string;
|
|
@@ -6,7 +19,11 @@ export interface PendingAction {
|
|
|
6
19
|
detail: string | null;
|
|
7
20
|
scope: string | null;
|
|
8
21
|
kind: string;
|
|
22
|
+
/** Legacy raw shell command from pre-1.4 stores. NEVER executed; kept only so
|
|
23
|
+
* `kit memory scan` can still find secrets leaked into old rows. */
|
|
9
24
|
verify_cmd: string | null;
|
|
25
|
+
/** JSON-encoded VerifyCheck. The only field auto-verify ever executes. */
|
|
26
|
+
verify_check: string | null;
|
|
10
27
|
created_at: string | null;
|
|
11
28
|
next_check: string | null;
|
|
12
29
|
snooze_until: string | null;
|
|
@@ -18,7 +35,7 @@ export interface PalAddInput {
|
|
|
18
35
|
detail?: string;
|
|
19
36
|
scope?: string;
|
|
20
37
|
kind?: "manual" | "auto";
|
|
21
|
-
|
|
38
|
+
check?: VerifyCheck;
|
|
22
39
|
}
|
|
23
40
|
export declare function palAdd(db: DatabaseSync, input: PalAddInput): string;
|
|
24
41
|
export interface PalListOptions {
|
|
@@ -39,7 +56,7 @@ export interface AutoVerifyResult {
|
|
|
39
56
|
* times is closed (a pass increments the streak, a fail resets it). A CLOSED item
|
|
40
57
|
* whose verify now FAILS is reopened (reopen-on-regress). No-info leaves it alone.
|
|
41
58
|
*/
|
|
42
|
-
export declare function palAutoVerify(db: DatabaseSync, confirmPasses?: number): AutoVerifyResult
|
|
59
|
+
export declare function palAutoVerify(db: DatabaseSync, confirmPasses?: number): Promise<AutoVerifyResult>;
|
|
43
60
|
export declare function getLegacyLedgerPath(): string;
|
|
44
61
|
/** Import the old `~/.claude/pal/ledger.jsonl` into pending_actions. Idempotent (by id). */
|
|
45
62
|
export declare function importLegacyLedger(db: DatabaseSync, path?: string): {
|