sandstream-kit 1.0.1 → 1.2.0
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 +18 -0
- package/dist/check-web-search.js +37 -6
- package/dist/check-web-search.js.map +1 -1
- package/dist/cli.js +520 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/database.d.ts +2 -2
- package/dist/database.js +9 -14
- package/dist/database.js.map +1 -1
- package/dist/lock.js +5 -3
- package/dist/lock.js.map +1 -1
- package/dist/memory/backup 2.d.ts +6 -0
- package/dist/memory/backup 2.js +80 -0
- package/dist/memory/backup 2.js.map +1 -0
- package/dist/memory/backup.d.ts +6 -0
- package/dist/memory/backup.js +80 -0
- package/dist/memory/backup.js.map +1 -0
- package/dist/memory/codex.d.ts +5 -0
- package/dist/memory/codex.js +150 -0
- package/dist/memory/codex.js.map +1 -0
- package/dist/memory/continue.d.ts +5 -0
- package/dist/memory/continue.js +116 -0
- package/dist/memory/continue.js.map +1 -0
- package/dist/memory/db 2.d.ts +40 -0
- package/dist/memory/db 2.js +233 -0
- package/dist/memory/db 2.js.map +1 -0
- package/dist/memory/db.d.ts +51 -0
- package/dist/memory/db.js +275 -0
- package/dist/memory/db.js.map +1 -0
- package/dist/memory/gemini.d.ts +5 -0
- package/dist/memory/gemini.js +176 -0
- package/dist/memory/gemini.js.map +1 -0
- package/dist/memory/hook 2.d.ts +6 -0
- package/dist/memory/hook 2.js +51 -0
- package/dist/memory/hook 2.js.map +1 -0
- package/dist/memory/hook.d.ts +15 -0
- package/dist/memory/hook.js +84 -0
- package/dist/memory/hook.js.map +1 -0
- package/dist/memory/hook.test 2.d.ts +1 -0
- package/dist/memory/hook.test 2.js +35 -0
- package/dist/memory/hook.test 2.js.map +1 -0
- package/dist/memory/install 2.d.ts +8 -0
- package/dist/memory/install 2.js +72 -0
- package/dist/memory/install 2.js.map +1 -0
- package/dist/memory/install.d.ts +8 -0
- package/dist/memory/install.js +73 -0
- package/dist/memory/install.js.map +1 -0
- package/dist/memory/install.test 2.d.ts +1 -0
- package/dist/memory/install.test 2.js +59 -0
- package/dist/memory/install.test 2.js.map +1 -0
- package/dist/memory/merge.d.ts +18 -0
- package/dist/memory/merge.js +109 -0
- package/dist/memory/merge.js.map +1 -0
- package/dist/memory/pal 2.d.ts +47 -0
- package/dist/memory/pal 2.js +154 -0
- package/dist/memory/pal 2.js.map +1 -0
- package/dist/memory/pal.d.ts +47 -0
- package/dist/memory/pal.js +154 -0
- package/dist/memory/pal.js.map +1 -0
- package/dist/memory/parser.d.ts +34 -0
- package/dist/memory/parser.js +195 -0
- package/dist/memory/parser.js.map +1 -0
- package/dist/memory/project 2.d.ts +1 -0
- package/dist/memory/project 2.js +24 -0
- package/dist/memory/project 2.js.map +1 -0
- package/dist/memory/project.d.ts +1 -0
- package/dist/memory/project.js +24 -0
- package/dist/memory/project.js.map +1 -0
- package/dist/memory/scan 2.d.ts +15 -0
- package/dist/memory/scan 2.js +94 -0
- package/dist/memory/scan 2.js.map +1 -0
- package/dist/memory/scan.d.ts +15 -0
- package/dist/memory/scan.js +94 -0
- package/dist/memory/scan.js.map +1 -0
- package/dist/memory/scan.test 2.d.ts +1 -0
- package/dist/memory/scan.test 2.js +55 -0
- package/dist/memory/scan.test 2.js.map +1 -0
- package/dist/memory/shared 2.d.ts +33 -0
- package/dist/memory/shared 2.js +120 -0
- package/dist/memory/shared 2.js.map +1 -0
- package/dist/memory/shared.d.ts +33 -0
- package/dist/memory/shared.js +120 -0
- package/dist/memory/shared.js.map +1 -0
- package/dist/memory/threads 2.d.ts +37 -0
- package/dist/memory/threads 2.js +50 -0
- package/dist/memory/threads 2.js.map +1 -0
- package/dist/memory/threads.d.ts +37 -0
- package/dist/memory/threads.js +50 -0
- package/dist/memory/threads.js.map +1 -0
- package/dist/memory/threads.test 2.d.ts +1 -0
- package/dist/memory/threads.test 2.js +66 -0
- package/dist/memory/threads.test 2.js.map +1 -0
- package/dist/memory/types 2.d.ts +52 -0
- package/dist/memory/types 2.js +5 -0
- package/dist/memory/types 2.js.map +1 -0
- package/dist/memory/types.d.ts +52 -0
- package/dist/memory/types.js +5 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/status.d.ts +9 -0
- package/dist/status.js +119 -0
- package/dist/status.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function saveThread(db, input) {
|
|
2
|
+
db.prepare(`INSERT INTO saved_threads (name, session_id, summary, project_path, saved_at)
|
|
3
|
+
VALUES (?, ?, ?, ?, datetime('now'))
|
|
4
|
+
ON CONFLICT(name) DO UPDATE SET
|
|
5
|
+
session_id = excluded.session_id,
|
|
6
|
+
summary = COALESCE(excluded.summary, saved_threads.summary),
|
|
7
|
+
project_path = COALESCE(excluded.project_path, saved_threads.project_path),
|
|
8
|
+
saved_at = datetime('now')`).run(input.name, input.sessionId, input.summary ?? null, input.projectPath ?? null);
|
|
9
|
+
}
|
|
10
|
+
export function listThreads(db, opts = {}) {
|
|
11
|
+
if (opts.projectPath) {
|
|
12
|
+
return db
|
|
13
|
+
.prepare("SELECT * FROM saved_threads WHERE project_path = ? ORDER BY saved_at DESC")
|
|
14
|
+
.all(opts.projectPath);
|
|
15
|
+
}
|
|
16
|
+
return db
|
|
17
|
+
.prepare("SELECT * FROM saved_threads ORDER BY saved_at DESC")
|
|
18
|
+
.all();
|
|
19
|
+
}
|
|
20
|
+
export function getThread(db, name) {
|
|
21
|
+
return db.prepare("SELECT * FROM saved_threads WHERE name = ?").get(name);
|
|
22
|
+
}
|
|
23
|
+
export function removeThread(db, name) {
|
|
24
|
+
return Number(db.prepare("DELETE FROM saved_threads WHERE name = ?").run(name).changes) > 0;
|
|
25
|
+
}
|
|
26
|
+
/** Most recent session that touched this project (by message timestamp). */
|
|
27
|
+
export function latestSessionId(db, opts = {}) {
|
|
28
|
+
let row;
|
|
29
|
+
if (opts.projectPath) {
|
|
30
|
+
row = db
|
|
31
|
+
.prepare(`SELECT session_id FROM messages
|
|
32
|
+
WHERE cwd = ? OR cwd LIKE ?
|
|
33
|
+
ORDER BY timestamp DESC LIMIT 1`)
|
|
34
|
+
.get(opts.projectPath, `${opts.projectPath}/%`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
row = db
|
|
38
|
+
.prepare("SELECT session_id FROM messages ORDER BY timestamp DESC LIMIT 1")
|
|
39
|
+
.get();
|
|
40
|
+
}
|
|
41
|
+
return row?.session_id;
|
|
42
|
+
}
|
|
43
|
+
/** Resolve a thread by name, or by 1-based index into the (scoped) list. */
|
|
44
|
+
export function resolveThread(db, ref, opts = {}) {
|
|
45
|
+
if (/^\d+$/.test(ref)) {
|
|
46
|
+
return listThreads(db, opts)[Number(ref) - 1];
|
|
47
|
+
}
|
|
48
|
+
return getThread(db, ref);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/memory/threads.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,UAAU,CAAC,EAAgB,EAAE,KAAsB;IACjE,EAAE,CAAC,OAAO,CACR;;;;;;kCAM8B,CAC/B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,EAAgB,EAChB,OAAiC,EAAE;IAEnC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,EAAE;aACN,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,CAAC,IAAI,CAAC,WAAW,CAA6B,CAAC;IACvD,CAAC;IACD,OAAO,EAAE;SACN,OAAO,CAAC,oDAAoD,CAAC;SAC7D,GAAG,EAA8B,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAgB,EAAE,IAAY;IACtD,OAAO,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,IAAI,CAE3D,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAgB,EAAE,IAAY;IACzD,OAAO,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9F,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAC7B,EAAgB,EAChB,OAAiC,EAAE;IAEnC,IAAI,GAAuC,CAAC;IAC5C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,GAAG,GAAG,EAAE;aACL,OAAO,CACN;;yCAEiC,CAClC;aACA,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,CAAuC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,EAAE;aACL,OAAO,CAAC,iEAAiE,CAAC;aAC1E,GAAG,EAAwC,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,EAAE,UAAU,CAAC;AACzB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAC3B,EAAgB,EAChB,GAAW,EACX,OAAiC,EAAE;IAEnC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { openMemoryDb, upsertSession, insertMessage } from "./db.js";
|
|
4
|
+
import { saveThread, listThreads, getThread, removeThread, latestSessionId, resolveThread, } from "./threads.js";
|
|
5
|
+
describe("memory threads (named copilots)", () => {
|
|
6
|
+
const fresh = () => openMemoryDb(":memory:");
|
|
7
|
+
it("save + list + get; name is the key (re-save updates)", () => {
|
|
8
|
+
const db = fresh();
|
|
9
|
+
saveThread(db, { name: "launch", sessionId: "s1", projectPath: "/repo/app-a" });
|
|
10
|
+
saveThread(db, { name: "launch", sessionId: "s2", projectPath: "/repo/app-a" });
|
|
11
|
+
assert.equal(listThreads(db).length, 1);
|
|
12
|
+
assert.equal(getThread(db, "launch")?.session_id, "s2");
|
|
13
|
+
db.close();
|
|
14
|
+
});
|
|
15
|
+
it("lists scoped by project", () => {
|
|
16
|
+
const db = fresh();
|
|
17
|
+
saveThread(db, { name: "a", sessionId: "s1", projectPath: "/repo/app-a" });
|
|
18
|
+
saveThread(db, { name: "b", sessionId: "s2", projectPath: "/repo/app-b" });
|
|
19
|
+
assert.equal(listThreads(db).length, 2);
|
|
20
|
+
const scoped = listThreads(db, { projectPath: "/repo/app-a" });
|
|
21
|
+
assert.equal(scoped.length, 1);
|
|
22
|
+
assert.equal(scoped[0]?.name, "a");
|
|
23
|
+
db.close();
|
|
24
|
+
});
|
|
25
|
+
it("remove tosses a thread", () => {
|
|
26
|
+
const db = fresh();
|
|
27
|
+
saveThread(db, { name: "x", sessionId: "s1" });
|
|
28
|
+
assert.equal(removeThread(db, "x"), true);
|
|
29
|
+
assert.equal(listThreads(db).length, 0);
|
|
30
|
+
assert.equal(removeThread(db, "x"), false);
|
|
31
|
+
db.close();
|
|
32
|
+
});
|
|
33
|
+
it("latestSessionId picks the most recent session touching the project", () => {
|
|
34
|
+
const db = fresh();
|
|
35
|
+
upsertSession(db, { sessionId: "old", harness: "claude-code" });
|
|
36
|
+
upsertSession(db, { sessionId: "new", harness: "claude-code" });
|
|
37
|
+
insertMessage(db, {
|
|
38
|
+
uuid: "m1",
|
|
39
|
+
sessionId: "old",
|
|
40
|
+
type: "user",
|
|
41
|
+
content: "a",
|
|
42
|
+
cwd: "/repo/app-a",
|
|
43
|
+
timestamp: "2026-06-01T00:00:00Z",
|
|
44
|
+
});
|
|
45
|
+
insertMessage(db, {
|
|
46
|
+
uuid: "m2",
|
|
47
|
+
sessionId: "new",
|
|
48
|
+
type: "user",
|
|
49
|
+
content: "b",
|
|
50
|
+
cwd: "/repo/app-a",
|
|
51
|
+
timestamp: "2026-06-02T00:00:00Z",
|
|
52
|
+
});
|
|
53
|
+
assert.equal(latestSessionId(db, { projectPath: "/repo/app-a" }), "new");
|
|
54
|
+
db.close();
|
|
55
|
+
});
|
|
56
|
+
it("resolveThread accepts a name or a 1-based index", () => {
|
|
57
|
+
const db = fresh();
|
|
58
|
+
saveThread(db, { name: "first", sessionId: "s1", projectPath: "/repo/app-a" });
|
|
59
|
+
saveThread(db, { name: "second", sessionId: "s2", projectPath: "/repo/app-a" });
|
|
60
|
+
assert.equal(resolveThread(db, "first", { projectPath: "/repo/app-a" })?.session_id, "s1");
|
|
61
|
+
const list = listThreads(db, { projectPath: "/repo/app-a" });
|
|
62
|
+
assert.equal(resolveThread(db, "1", { projectPath: "/repo/app-a" })?.name, list[0]?.name);
|
|
63
|
+
db.close();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=threads.test%202.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.test 2.js","sourceRoot":"","sources":["../../src/memory/threads.test 2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit memory — shared types for the local conversation store.
|
|
3
|
+
*/
|
|
4
|
+
export interface SessionInput {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
/** Which agent harness produced the session: claude-code | codex | cursor | … */
|
|
7
|
+
harness: string;
|
|
8
|
+
project?: string;
|
|
9
|
+
firstMessageAt?: string;
|
|
10
|
+
lastMessageAt?: string;
|
|
11
|
+
isAgentSidechain?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface MessageInput {
|
|
14
|
+
/** Stable id from the transcript — used for idempotent upsert (one row per message). */
|
|
15
|
+
uuid: string;
|
|
16
|
+
sessionId: string;
|
|
17
|
+
parentUuid?: string;
|
|
18
|
+
/** Transcript event type, e.g. "user" | "assistant". */
|
|
19
|
+
type: string;
|
|
20
|
+
role?: string;
|
|
21
|
+
content?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
inputTokens?: number;
|
|
24
|
+
outputTokens?: number;
|
|
25
|
+
timestamp?: string;
|
|
26
|
+
cwd?: string;
|
|
27
|
+
gitBranch?: string;
|
|
28
|
+
version?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ToolUseInput {
|
|
31
|
+
messageUuid?: string;
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
toolName: string;
|
|
34
|
+
toolInput?: string;
|
|
35
|
+
timestamp?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface SearchHit {
|
|
38
|
+
id: number;
|
|
39
|
+
uuid: string | null;
|
|
40
|
+
sessionId: string;
|
|
41
|
+
role: string | null;
|
|
42
|
+
content: string | null;
|
|
43
|
+
timestamp: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface MemoryStats {
|
|
46
|
+
sessions: number;
|
|
47
|
+
messages: number;
|
|
48
|
+
toolUses: number;
|
|
49
|
+
pendingOpen: number;
|
|
50
|
+
dbPath: string;
|
|
51
|
+
sizeBytes: number;
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types 2.js","sourceRoot":"","sources":["../../src/memory/types 2.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit memory — shared types for the local conversation store.
|
|
3
|
+
*/
|
|
4
|
+
export interface SessionInput {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
/** Which agent harness produced the session: claude-code | codex | cursor | … */
|
|
7
|
+
harness: string;
|
|
8
|
+
project?: string;
|
|
9
|
+
firstMessageAt?: string;
|
|
10
|
+
lastMessageAt?: string;
|
|
11
|
+
isAgentSidechain?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface MessageInput {
|
|
14
|
+
/** Stable id from the transcript — used for idempotent upsert (one row per message). */
|
|
15
|
+
uuid: string;
|
|
16
|
+
sessionId: string;
|
|
17
|
+
parentUuid?: string;
|
|
18
|
+
/** Transcript event type, e.g. "user" | "assistant". */
|
|
19
|
+
type: string;
|
|
20
|
+
role?: string;
|
|
21
|
+
content?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
inputTokens?: number;
|
|
24
|
+
outputTokens?: number;
|
|
25
|
+
timestamp?: string;
|
|
26
|
+
cwd?: string;
|
|
27
|
+
gitBranch?: string;
|
|
28
|
+
version?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ToolUseInput {
|
|
31
|
+
messageUuid?: string;
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
toolName: string;
|
|
34
|
+
toolInput?: string;
|
|
35
|
+
timestamp?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface SearchHit {
|
|
38
|
+
id: number;
|
|
39
|
+
uuid: string | null;
|
|
40
|
+
sessionId: string;
|
|
41
|
+
role: string | null;
|
|
42
|
+
content: string | null;
|
|
43
|
+
timestamp: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface MemoryStats {
|
|
46
|
+
sessions: number;
|
|
47
|
+
messages: number;
|
|
48
|
+
toolUses: number;
|
|
49
|
+
pendingOpen: number;
|
|
50
|
+
dbPath: string;
|
|
51
|
+
sizeBytes: number;
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/status.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface StatusItem {
|
|
2
|
+
key: string;
|
|
3
|
+
label: string;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
detail: string;
|
|
6
|
+
/** Rule-based next step when not ok (deterministic, no inference). */
|
|
7
|
+
hint?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function gatherStatus(cwd?: string): Promise<StatusItem[]>;
|
package/dist/status.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit status — a deterministic "where you are + what to do next" view across kit.
|
|
3
|
+
*
|
|
4
|
+
* Pure facts + rule-based next steps (never LLM advice). Each signal is checked
|
|
5
|
+
* against real local state: the config file, the vault declaration, the agent
|
|
6
|
+
* managed block, the memory store, the installed hooks. Designed to grow: add a
|
|
7
|
+
* StatusItem per subsystem (prescan drift, supply-chain, elevation, …).
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { loadConfig } from "./config.js";
|
|
12
|
+
import { KIT_BLOCK_BEGIN } from "./agent-config.js";
|
|
13
|
+
import { checkGitignore } from "./check-gitignore.js";
|
|
14
|
+
import { openMemoryDb, getStats } from "./memory/db.js";
|
|
15
|
+
import { getClaudeSettingsPath } from "./memory/install.js";
|
|
16
|
+
// Dependency allowlist file (kept as a literal here, matching security-policy.ts
|
|
17
|
+
// + post-pull-audit.ts — the convention isn't exported).
|
|
18
|
+
const ALLOWLIST_FILE = ".kit-allowlist.json";
|
|
19
|
+
function fileIncludes(path, needle) {
|
|
20
|
+
if (!existsSync(path))
|
|
21
|
+
return false;
|
|
22
|
+
try {
|
|
23
|
+
return readFileSync(path, "utf8").includes(needle);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false; // unreadable — treat as absent
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function gatherStatus(cwd = process.cwd()) {
|
|
30
|
+
const items = [];
|
|
31
|
+
const configPath = join(cwd, ".kit.toml");
|
|
32
|
+
const hasConfig = existsSync(configPath);
|
|
33
|
+
items.push({
|
|
34
|
+
key: "config",
|
|
35
|
+
label: ".kit.toml",
|
|
36
|
+
ok: hasConfig,
|
|
37
|
+
detail: hasConfig ? "present" : "missing",
|
|
38
|
+
hint: hasConfig ? undefined : "run `kit init`",
|
|
39
|
+
});
|
|
40
|
+
if (hasConfig) {
|
|
41
|
+
try {
|
|
42
|
+
const cfg = await loadConfig(configPath);
|
|
43
|
+
const hasVault = !!(cfg.secrets &&
|
|
44
|
+
(cfg.secrets.store || (cfg.secrets.keys && Object.keys(cfg.secrets.keys).length > 0)));
|
|
45
|
+
items.push({
|
|
46
|
+
key: "vault",
|
|
47
|
+
label: "secrets vault",
|
|
48
|
+
ok: hasVault,
|
|
49
|
+
detail: hasVault ? `store: ${cfg.secrets?.store ?? "keys"}` : "none configured",
|
|
50
|
+
hint: hasVault ? undefined : "configure [secrets] + `kit secrets`",
|
|
51
|
+
});
|
|
52
|
+
const toolCount = cfg.tools ? Object.keys(cfg.tools).length : 0;
|
|
53
|
+
items.push({
|
|
54
|
+
key: "tools",
|
|
55
|
+
label: "tools",
|
|
56
|
+
ok: toolCount > 0,
|
|
57
|
+
detail: `${toolCount} declared`,
|
|
58
|
+
hint: toolCount > 0 ? undefined : "declare [tools] in .kit.toml",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// malformed config — skip the derived checks rather than crash
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Secret hygiene — does .gitignore cover the sensitive paths kit cares about?
|
|
66
|
+
const ignore = await checkGitignore(cwd);
|
|
67
|
+
items.push({
|
|
68
|
+
key: "gitignore",
|
|
69
|
+
label: "gitignore hygiene",
|
|
70
|
+
ok: ignore.missingPatterns.length === 0,
|
|
71
|
+
detail: ignore.missingPatterns.length === 0
|
|
72
|
+
? "sensitive paths covered"
|
|
73
|
+
: `${ignore.missingPatterns.length} sensitive path(s) unignored`,
|
|
74
|
+
hint: ignore.missingPatterns.length === 0 ? undefined : "run `kit security check-gitignore --fix`",
|
|
75
|
+
});
|
|
76
|
+
// Supply chain — is there a dependency allowlist to enforce on install?
|
|
77
|
+
const hasAllowlist = existsSync(join(cwd, ALLOWLIST_FILE));
|
|
78
|
+
items.push({
|
|
79
|
+
key: "dep-policy",
|
|
80
|
+
label: "dependency policy",
|
|
81
|
+
ok: hasAllowlist,
|
|
82
|
+
detail: hasAllowlist ? "allowlist present" : "no allowlist",
|
|
83
|
+
hint: hasAllowlist ? undefined : "run `kit security policy init`",
|
|
84
|
+
});
|
|
85
|
+
const wired = fileIncludes(join(cwd, "CLAUDE.md"), KIT_BLOCK_BEGIN);
|
|
86
|
+
items.push({
|
|
87
|
+
key: "agent-config",
|
|
88
|
+
label: "agent wired",
|
|
89
|
+
ok: wired,
|
|
90
|
+
detail: wired ? "CLAUDE.md kit block present" : "not wired",
|
|
91
|
+
hint: wired ? undefined : "run `kit agent-config`",
|
|
92
|
+
});
|
|
93
|
+
let messages = 0;
|
|
94
|
+
try {
|
|
95
|
+
const db = openMemoryDb();
|
|
96
|
+
messages = getStats(db).messages;
|
|
97
|
+
db.close();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// memory store unavailable — reported as 0
|
|
101
|
+
}
|
|
102
|
+
items.push({
|
|
103
|
+
key: "memory",
|
|
104
|
+
label: "memory indexed",
|
|
105
|
+
ok: messages > 0,
|
|
106
|
+
detail: `${messages} messages`,
|
|
107
|
+
hint: messages > 0 ? undefined : "run `kit memory index`",
|
|
108
|
+
});
|
|
109
|
+
const hooked = fileIncludes(getClaudeSettingsPath(), "kit memory hook");
|
|
110
|
+
items.push({
|
|
111
|
+
key: "memory-hooks",
|
|
112
|
+
label: "memory hooks",
|
|
113
|
+
ok: hooked,
|
|
114
|
+
detail: hooked ? "installed" : "not installed",
|
|
115
|
+
hint: hooked ? undefined : "run `kit memory install`",
|
|
116
|
+
});
|
|
117
|
+
return items;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED