mewkit 1.11.1 → 1.12.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/dist/commands/build-plugin.d.ts +8 -0
- package/dist/commands/build-plugin.d.ts.map +1 -0
- package/dist/commands/build-plugin.js +48 -0
- package/dist/commands/build-plugin.js.map +1 -0
- package/dist/commands/doctor-checks.d.ts +9 -0
- package/dist/commands/doctor-checks.d.ts.map +1 -1
- package/dist/commands/doctor-checks.js +42 -0
- package/dist/commands/doctor-checks.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +2 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/index-command.d.ts.map +1 -1
- package/dist/commands/index-command.js +2 -1
- package/dist/commands/index-command.js.map +1 -1
- package/dist/commands/validate.d.ts +3 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +9 -0
- package/dist/commands/validate.js.map +1 -1
- package/dist/core/check-plugin-manifests.d.ts +10 -0
- package/dist/core/check-plugin-manifests.d.ts.map +1 -0
- package/dist/core/check-plugin-manifests.js +150 -0
- package/dist/core/check-plugin-manifests.js.map +1 -0
- package/dist/core/derived-index.d.ts +5 -3
- package/dist/core/derived-index.d.ts.map +1 -1
- package/dist/core/derived-index.js +35 -10
- package/dist/core/derived-index.js.map +1 -1
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/plugin-agent-refs.d.ts +22 -0
- package/dist/core/plugin-agent-refs.d.ts.map +1 -0
- package/dist/core/plugin-agent-refs.js +87 -0
- package/dist/core/plugin-agent-refs.js.map +1 -0
- package/dist/core/plugin-hooks.d.ts +15 -0
- package/dist/core/plugin-hooks.d.ts.map +1 -0
- package/dist/core/plugin-hooks.js +58 -0
- package/dist/core/plugin-hooks.js.map +1 -0
- package/dist/core/plugin-manifest.d.ts +289 -0
- package/dist/core/plugin-manifest.d.ts.map +1 -0
- package/dist/core/plugin-manifest.js +125 -0
- package/dist/core/plugin-manifest.js.map +1 -0
- package/dist/core/plugin-payload.d.ts +26 -0
- package/dist/core/plugin-payload.d.ts.map +1 -0
- package/dist/core/plugin-payload.js +138 -0
- package/dist/core/plugin-payload.js.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/wiki/application/ports.d.ts +111 -0
- package/dist/wiki/application/ports.d.ts.map +1 -0
- package/dist/wiki/application/ports.js +33 -0
- package/dist/wiki/application/ports.js.map +1 -0
- package/dist/wiki/application/queries.d.ts +5 -0
- package/dist/wiki/application/queries.d.ts.map +1 -0
- package/dist/wiki/application/queries.js +10 -0
- package/dist/wiki/application/queries.js.map +1 -0
- package/dist/wiki/application/research.d.ts +16 -0
- package/dist/wiki/application/research.d.ts.map +1 -0
- package/dist/wiki/application/research.js +48 -0
- package/dist/wiki/application/research.js.map +1 -0
- package/dist/wiki/application/service.d.ts +27 -0
- package/dist/wiki/application/service.d.ts.map +1 -0
- package/dist/wiki/application/service.js +153 -0
- package/dist/wiki/application/service.js.map +1 -0
- package/dist/wiki/domain/index.d.ts +5 -0
- package/dist/wiki/domain/index.d.ts.map +1 -0
- package/dist/wiki/domain/index.js +6 -0
- package/dist/wiki/domain/index.js.map +1 -0
- package/dist/wiki/domain/invariants.d.ts +28 -0
- package/dist/wiki/domain/invariants.d.ts.map +1 -0
- package/dist/wiki/domain/invariants.js +84 -0
- package/dist/wiki/domain/invariants.js.map +1 -0
- package/dist/wiki/domain/salience.d.ts +11 -0
- package/dist/wiki/domain/salience.d.ts.map +1 -0
- package/dist/wiki/domain/salience.js +40 -0
- package/dist/wiki/domain/salience.js.map +1 -0
- package/dist/wiki/domain/types.d.ts +151 -0
- package/dist/wiki/domain/types.d.ts.map +1 -0
- package/dist/wiki/domain/types.js +27 -0
- package/dist/wiki/domain/types.js.map +1 -0
- package/dist/wiki/domain/write-decision.d.ts +25 -0
- package/dist/wiki/domain/write-decision.d.ts.map +1 -0
- package/dist/wiki/domain/write-decision.js +71 -0
- package/dist/wiki/domain/write-decision.js.map +1 -0
- package/dist/wiki/infrastructure/fetcher-adapter.d.ts +45 -0
- package/dist/wiki/infrastructure/fetcher-adapter.d.ts.map +1 -0
- package/dist/wiki/infrastructure/fetcher-adapter.js +99 -0
- package/dist/wiki/infrastructure/fetcher-adapter.js.map +1 -0
- package/dist/wiki/infrastructure/inventory-adapter.d.ts +13 -0
- package/dist/wiki/infrastructure/inventory-adapter.d.ts.map +1 -0
- package/dist/wiki/infrastructure/inventory-adapter.js +46 -0
- package/dist/wiki/infrastructure/inventory-adapter.js.map +1 -0
- package/dist/wiki/infrastructure/markdown-repository.d.ts +23 -0
- package/dist/wiki/infrastructure/markdown-repository.d.ts.map +1 -0
- package/dist/wiki/infrastructure/markdown-repository.js +168 -0
- package/dist/wiki/infrastructure/markdown-repository.js.map +1 -0
- package/dist/wiki/infrastructure/scan-patterns.d.ts +20 -0
- package/dist/wiki/infrastructure/scan-patterns.d.ts.map +1 -0
- package/dist/wiki/infrastructure/scan-patterns.js +106 -0
- package/dist/wiki/infrastructure/scan-patterns.js.map +1 -0
- package/dist/wiki/infrastructure/scanner-adapter.d.ts +10 -0
- package/dist/wiki/infrastructure/scanner-adapter.d.ts.map +1 -0
- package/dist/wiki/infrastructure/scanner-adapter.js +147 -0
- package/dist/wiki/infrastructure/scanner-adapter.js.map +1 -0
- package/dist/wiki/infrastructure/sqlite-index.d.ts +9 -0
- package/dist/wiki/infrastructure/sqlite-index.d.ts.map +1 -0
- package/dist/wiki/infrastructure/sqlite-index.js +36 -0
- package/dist/wiki/infrastructure/sqlite-index.js.map +1 -0
- package/dist/wiki/infrastructure/trace-adapter.d.ts +7 -0
- package/dist/wiki/infrastructure/trace-adapter.d.ts.map +1 -0
- package/dist/wiki/infrastructure/trace-adapter.js +42 -0
- package/dist/wiki/infrastructure/trace-adapter.js.map +1 -0
- package/dist/wiki/infrastructure/wiki-ingest.d.ts +14 -0
- package/dist/wiki/infrastructure/wiki-ingest.d.ts.map +1 -0
- package/dist/wiki/infrastructure/wiki-ingest.js +138 -0
- package/dist/wiki/infrastructure/wiki-ingest.js.map +1 -0
- package/dist/wiki/infrastructure/wiki-query.d.ts +15 -0
- package/dist/wiki/infrastructure/wiki-query.d.ts.map +1 -0
- package/dist/wiki/infrastructure/wiki-query.js +46 -0
- package/dist/wiki/infrastructure/wiki-query.js.map +1 -0
- package/dist/wiki/infrastructure/wiki-schema.d.ts +3 -0
- package/dist/wiki/infrastructure/wiki-schema.d.ts.map +1 -0
- package/dist/wiki/infrastructure/wiki-schema.js +43 -0
- package/dist/wiki/infrastructure/wiki-schema.js.map +1 -0
- package/dist/wiki/interface/cli.d.ts +7 -0
- package/dist/wiki/interface/cli.d.ts.map +1 -0
- package/dist/wiki/interface/cli.js +160 -0
- package/dist/wiki/interface/cli.js.map +1 -0
- package/dist/wiki/render.d.ts +3 -0
- package/dist/wiki/render.d.ts.map +1 -0
- package/dist/wiki/render.js +58 -0
- package/dist/wiki/render.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Tracer } from "../application/ports.js";
|
|
2
|
+
export declare class TraceAdapter implements Tracer {
|
|
3
|
+
private readonly claudeDir;
|
|
4
|
+
constructor(claudeDir: string);
|
|
5
|
+
recordWikiTrace(event: string, data: Record<string, unknown>): void;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=trace-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-adapter.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/trace-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAoBtD,qBAAa,YAAa,YAAW,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAE9C,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAcnE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { scrubSecrets } from "./scan-patterns.js";
|
|
4
|
+
// Appends wiki trace events to .claude/memory/trace-log.jsonl. Re-implements the JSONL
|
|
5
|
+
// append + redaction because the only existing writer (commands/trace.ts recordFriction)
|
|
6
|
+
// is private and hardcodes event:"friction". Fixed line shape:
|
|
7
|
+
// {schema_version:"1.0", ts, event, run_id, model, density, data:{...}}
|
|
8
|
+
// Every string value in `data` is secret-scrubbed before it is written.
|
|
9
|
+
function scrubDeep(value) {
|
|
10
|
+
if (typeof value === "string")
|
|
11
|
+
return scrubSecrets(value);
|
|
12
|
+
if (Array.isArray(value))
|
|
13
|
+
return value.map(scrubDeep);
|
|
14
|
+
if (value && typeof value === "object") {
|
|
15
|
+
const out = {};
|
|
16
|
+
for (const [k, v] of Object.entries(value))
|
|
17
|
+
out[k] = scrubDeep(v);
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
export class TraceAdapter {
|
|
23
|
+
claudeDir;
|
|
24
|
+
constructor(claudeDir) {
|
|
25
|
+
this.claudeDir = claudeDir;
|
|
26
|
+
}
|
|
27
|
+
recordWikiTrace(event, data) {
|
|
28
|
+
const line = {
|
|
29
|
+
schema_version: "1.0",
|
|
30
|
+
ts: new Date().toISOString(),
|
|
31
|
+
event,
|
|
32
|
+
run_id: process.env["MEOWKIT_RUN_ID"] ?? "",
|
|
33
|
+
model: process.env["MEOWKIT_MODEL_HINT"] ?? "",
|
|
34
|
+
density: process.env["MEOWKIT_AUTOBUILD_MODE"] ?? "",
|
|
35
|
+
data: scrubDeep(data),
|
|
36
|
+
};
|
|
37
|
+
const logPath = path.join(this.claudeDir, "memory", "trace-log.jsonl");
|
|
38
|
+
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
39
|
+
fs.appendFileSync(logPath, JSON.stringify(line) + "\n", "utf-8");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=trace-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-adapter.js","sourceRoot":"","sources":["../../../src/wiki/infrastructure/trace-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,uFAAuF;AACvF,yFAAyF;AACzF,+DAA+D;AAC/D,0EAA0E;AAC1E,wEAAwE;AAExE,SAAS,SAAS,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,OAAO,YAAY;IACK;IAA7B,YAA6B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAElD,eAAe,CAAC,KAAa,EAAE,IAA6B;QAC3D,MAAM,IAAI,GAAG;YACZ,cAAc,EAAE,KAAK;YACrB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE;YAC3C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE;YAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,EAAE;YACpD,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC;SACrB,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACvE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;CACD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export interface WikiIngestCounts {
|
|
3
|
+
wikis: number;
|
|
4
|
+
pages: number;
|
|
5
|
+
sources: number;
|
|
6
|
+
claims: number;
|
|
7
|
+
candidates: number;
|
|
8
|
+
seeds: number;
|
|
9
|
+
interventions: number;
|
|
10
|
+
links: number;
|
|
11
|
+
}
|
|
12
|
+
/** Clear and rebuild every wiki table from the canonical tree. Returns row counts. */
|
|
13
|
+
export declare function ingestWiki(db: DatabaseSync, projectRoot: string): WikiIngestCounts;
|
|
14
|
+
//# sourceMappingURL=wiki-ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-ingest.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-ingest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACd;AA0JD,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAUlF"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import yaml from "js-yaml";
|
|
4
|
+
import { WIKI_TABLES } from "./wiki-schema.js";
|
|
5
|
+
function s(v) {
|
|
6
|
+
if (v === null || v === undefined)
|
|
7
|
+
return null;
|
|
8
|
+
return typeof v === "string" ? v : String(v);
|
|
9
|
+
}
|
|
10
|
+
function n(v) {
|
|
11
|
+
return typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
12
|
+
}
|
|
13
|
+
function readJsonl(file) {
|
|
14
|
+
if (!fs.existsSync(file))
|
|
15
|
+
return [];
|
|
16
|
+
const out = [];
|
|
17
|
+
for (const line of fs.readFileSync(file, "utf-8").split("\n")) {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
if (!trimmed)
|
|
20
|
+
continue;
|
|
21
|
+
try {
|
|
22
|
+
const parsed = JSON.parse(trimmed);
|
|
23
|
+
if (parsed && typeof parsed === "object")
|
|
24
|
+
out.push(parsed);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// tolerant: skip a malformed line, keep ingesting the rest
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
function parseFrontmatter(raw) {
|
|
33
|
+
if (!raw.startsWith("---"))
|
|
34
|
+
return { meta: {}, body: raw };
|
|
35
|
+
const end = raw.indexOf("\n---", 3);
|
|
36
|
+
if (end === -1)
|
|
37
|
+
return { meta: {}, body: raw };
|
|
38
|
+
const loaded = yaml.load(raw.slice(3, end).trim());
|
|
39
|
+
const meta = loaded && typeof loaded === "object" ? loaded : {};
|
|
40
|
+
return { meta, body: raw.slice(end + 4).replace(/^\r?\n/, "") };
|
|
41
|
+
}
|
|
42
|
+
function listDirs(root) {
|
|
43
|
+
if (!fs.existsSync(root))
|
|
44
|
+
return [];
|
|
45
|
+
return fs
|
|
46
|
+
.readdirSync(root, { withFileTypes: true })
|
|
47
|
+
.filter((e) => e.isDirectory())
|
|
48
|
+
.map((e) => e.name)
|
|
49
|
+
.sort();
|
|
50
|
+
}
|
|
51
|
+
function ingestSlug(db, root, slug, c) {
|
|
52
|
+
const dir = path.join(root, slug);
|
|
53
|
+
const wikiMeta = (() => {
|
|
54
|
+
const f = path.join(dir, "wiki.json");
|
|
55
|
+
if (!fs.existsSync(f))
|
|
56
|
+
return { slug };
|
|
57
|
+
try {
|
|
58
|
+
const parsed = JSON.parse(fs.readFileSync(f, "utf-8"));
|
|
59
|
+
return parsed && typeof parsed === "object" ? parsed : { slug };
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return { slug };
|
|
63
|
+
}
|
|
64
|
+
})();
|
|
65
|
+
db.prepare("INSERT OR REPLACE INTO wiki (slug, title, created_at, updated_at) VALUES (?, ?, ?, ?)").run(slug, s(wikiMeta["title"]) ?? slug, s(wikiMeta["createdAt"]), s(wikiMeta["updatedAt"]));
|
|
66
|
+
c.wikis += 1;
|
|
67
|
+
// OR IGNORE (not OR REPLACE): two files claiming the same id is malformed input;
|
|
68
|
+
// ignoring the later one keeps ingest crash-free AND keeps wiki_fts consistent —
|
|
69
|
+
// REPLACE's implicit delete does NOT fire the AFTER DELETE trigger under the default
|
|
70
|
+
// recursive_triggers=off, which would strand a duplicate FTS row. First file wins
|
|
71
|
+
// (files are read in sorted order, so the choice is deterministic).
|
|
72
|
+
const pageStmt = db.prepare("INSERT OR IGNORE INTO wiki_page (id, slug, title, path, content, state, origin, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
73
|
+
const linkStmt = db.prepare("INSERT OR IGNORE INTO wiki_link (from_page_id, to_page_id) VALUES (?, ?)");
|
|
74
|
+
const pagesDir = path.join(dir, "pages");
|
|
75
|
+
if (fs.existsSync(pagesDir)) {
|
|
76
|
+
for (const file of fs.readdirSync(pagesDir).filter((f) => f.endsWith(".md")).sort()) {
|
|
77
|
+
const { meta, body } = parseFrontmatter(fs.readFileSync(path.join(pagesDir, file), "utf-8"));
|
|
78
|
+
const id = s(meta["id"]) ?? `${slug}/${file}`;
|
|
79
|
+
const inserted = pageStmt.run(id, s(meta["slug"]) ?? slug, s(meta["title"]) ?? file.replace(/\.md$/, ""), `pages/${file}`, body, s(meta["state"]) ?? "committed", s(meta["origin"]) ?? "human", s(meta["createdAt"]), s(meta["updatedAt"])).changes > 0;
|
|
80
|
+
if (!inserted)
|
|
81
|
+
continue; // duplicate id ignored — skip the page and its links
|
|
82
|
+
c.pages += 1;
|
|
83
|
+
const links = Array.isArray(meta["links"]) ? meta["links"] : [];
|
|
84
|
+
for (const to of links) {
|
|
85
|
+
const toId = s(to);
|
|
86
|
+
if (toId) {
|
|
87
|
+
linkStmt.run(id, toId);
|
|
88
|
+
c.links += 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const srcStmt = db.prepare("INSERT OR REPLACE INTO wiki_source (id, kind, url, title, fetched_at, content_hash) VALUES (?, ?, ?, ?, ?, ?)");
|
|
94
|
+
for (const o of readJsonl(path.join(dir, "sources.jsonl"))) {
|
|
95
|
+
srcStmt.run(s(o["id"]), s(o["kind"]), s(o["url"]), s(o["title"]), s(o["fetchedAt"]), s(o["contentHash"]));
|
|
96
|
+
c.sources += 1;
|
|
97
|
+
}
|
|
98
|
+
const claimStmt = db.prepare("INSERT OR REPLACE INTO wiki_claim (id, text, external, source_id, page_id) VALUES (?, ?, ?, ?, ?)");
|
|
99
|
+
for (const o of readJsonl(path.join(dir, "claims.jsonl"))) {
|
|
100
|
+
claimStmt.run(s(o["id"]), s(o["text"]), o["external"] ? 1 : 0, s(o["sourceId"]), s(o["pageId"]));
|
|
101
|
+
c.claims += 1;
|
|
102
|
+
}
|
|
103
|
+
const seedStmt = db.prepare("INSERT OR REPLACE INTO wiki_seed (id, query, kind, status, created_at) VALUES (?, ?, ?, ?, ?)");
|
|
104
|
+
for (const o of readJsonl(path.join(dir, "seeds.jsonl"))) {
|
|
105
|
+
seedStmt.run(s(o["id"]), s(o["query"]), s(o["kind"]), s(o["status"]), s(o["createdAt"]));
|
|
106
|
+
c.seeds += 1;
|
|
107
|
+
}
|
|
108
|
+
const candStmt = db.prepare("INSERT OR REPLACE INTO wiki_candidate (id, slug, origin, title, content, why_save, evidence, novelty_delta, reuse_scope, verification_state, risk_score, salience_total, state, created_at, review_after) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
109
|
+
const salStmt = db.prepare("INSERT OR REPLACE INTO wiki_salience (candidate_id, explicit_user_intent, verified_outcome, recurrence_or_friction, novelty_vs_existing_wiki, future_reuse_likelihood, source_quality, blast_radius, security_risk_penalty, staleness_penalty, total) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
110
|
+
for (const o of readJsonl(path.join(dir, "candidates.jsonl"))) {
|
|
111
|
+
const id = s(o["id"]);
|
|
112
|
+
const sal = (o["salience"] && typeof o["salience"] === "object" ? o["salience"] : {});
|
|
113
|
+
const comp = (sal["components"] && typeof sal["components"] === "object" ? sal["components"] : {});
|
|
114
|
+
candStmt.run(id, s(o["slug"]) ?? slug, s(o["origin"]) ?? "agent", s(o["title"]) ?? "", s(o["content"]) ?? "", s(o["whySave"]), s(o["evidence"]), n(o["noveltyDelta"]), s(o["reuseScope"]), s(o["verificationState"]), n(o["riskScore"]), n(sal["total"]), s(o["state"]) ?? "proposed", s(o["createdAt"]), s(o["reviewAfter"]));
|
|
115
|
+
if (id) {
|
|
116
|
+
salStmt.run(id, n(comp["explicit_user_intent"]), n(comp["verified_outcome"]), n(comp["recurrence_or_friction"]), n(comp["novelty_vs_existing_wiki"]), n(comp["future_reuse_likelihood"]), n(comp["source_quality"]), n(comp["blast_radius"]), n(comp["security_risk_penalty"]), n(comp["staleness_penalty"]), n(sal["total"]));
|
|
117
|
+
}
|
|
118
|
+
c.candidates += 1;
|
|
119
|
+
}
|
|
120
|
+
const intStmt = db.prepare("INSERT OR REPLACE INTO wiki_intervention (id, kind, candidate_id, reason, actor, created_at) VALUES (?, ?, ?, ?, ?, ?)");
|
|
121
|
+
for (const o of readJsonl(path.join(dir, "interventions.jsonl"))) {
|
|
122
|
+
intStmt.run(s(o["id"]), s(o["kind"]), s(o["candidateId"]), s(o["reason"]), s(o["actor"]), s(o["createdAt"]));
|
|
123
|
+
c.interventions += 1;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Clear and rebuild every wiki table from the canonical tree. Returns row counts. */
|
|
127
|
+
export function ingestWiki(db, projectRoot) {
|
|
128
|
+
const counts = { wikis: 0, pages: 0, sources: 0, claims: 0, candidates: 0, seeds: 0, interventions: 0, links: 0 };
|
|
129
|
+
for (const table of WIKI_TABLES) {
|
|
130
|
+
db.exec("DELETE FROM " + table); // table is a constant from WIKI_TABLES, never user input
|
|
131
|
+
}
|
|
132
|
+
const root = path.join(projectRoot, "tasks", "wikis");
|
|
133
|
+
for (const slug of listDirs(root)) {
|
|
134
|
+
ingestSlug(db, root, slug, counts);
|
|
135
|
+
}
|
|
136
|
+
return counts;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=wiki-ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-ingest.js","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WikiSearchHit } from "../application/ports.js";
|
|
2
|
+
export type { WikiSearchHit };
|
|
3
|
+
export type WikiPageRow = {
|
|
4
|
+
id: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
title: string;
|
|
7
|
+
path: string;
|
|
8
|
+
state: string;
|
|
9
|
+
};
|
|
10
|
+
/** Full-text search over page title + body. Returns provenance (slug/path via the
|
|
11
|
+
* page id) and a snippet with a token-budget estimate. */
|
|
12
|
+
export declare function searchWiki(dbFile: string, query: string, limit?: number): WikiSearchHit[];
|
|
13
|
+
/** List committed/approved pages for a slug (or all slugs when omitted). */
|
|
14
|
+
export declare function listWikiPages(dbFile: string, slug?: string): WikiPageRow[];
|
|
15
|
+
//# sourceMappingURL=wiki-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-query.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM7D,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,MAAM,WAAW,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAOF;0DAC0D;AAC1D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,aAAa,EAAE,CAmBrF;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAc1E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { DatabaseSync } from "node:sqlite";
|
|
3
|
+
/** ~4 chars per token — a cheap budget hint, not an exact tokenizer. */
|
|
4
|
+
function estimateTokens(text) {
|
|
5
|
+
return Math.ceil(text.length / 4);
|
|
6
|
+
}
|
|
7
|
+
/** Full-text search over page title + body. Returns provenance (slug/path via the
|
|
8
|
+
* page id) and a snippet with a token-budget estimate. */
|
|
9
|
+
export function searchWiki(dbFile, query, limit = 10) {
|
|
10
|
+
if (!fs.existsSync(dbFile))
|
|
11
|
+
return [];
|
|
12
|
+
const db = new DatabaseSync(dbFile, { readOnly: true });
|
|
13
|
+
try {
|
|
14
|
+
const rows = db
|
|
15
|
+
.prepare("SELECT f.page_id AS pageId, f.slug AS slug, f.title AS title, snippet(wiki_fts, 3, '[', ']', '…', 12) AS snippet, p.content AS content FROM wiki_fts f JOIN wiki_page p ON p.id = f.page_id WHERE wiki_fts MATCH ? ORDER BY rank LIMIT ?")
|
|
16
|
+
.all(query, limit);
|
|
17
|
+
return rows.map((r) => ({
|
|
18
|
+
pageId: r.pageId,
|
|
19
|
+
slug: r.slug,
|
|
20
|
+
title: r.title,
|
|
21
|
+
snippet: r.snippet,
|
|
22
|
+
tokenEstimate: estimateTokens(r.content ?? ""),
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
db.close();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** List committed/approved pages for a slug (or all slugs when omitted). */
|
|
30
|
+
export function listWikiPages(dbFile, slug) {
|
|
31
|
+
if (!fs.existsSync(dbFile))
|
|
32
|
+
return [];
|
|
33
|
+
const db = new DatabaseSync(dbFile, { readOnly: true });
|
|
34
|
+
try {
|
|
35
|
+
const sql = "SELECT id, slug, title, path, state FROM wiki_page" +
|
|
36
|
+
(slug ? " WHERE slug = ?" : "") +
|
|
37
|
+
" ORDER BY slug, title";
|
|
38
|
+
const stmt = db.prepare(sql);
|
|
39
|
+
const rows = (slug ? stmt.all(slug) : stmt.all());
|
|
40
|
+
return rows;
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
db.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=wiki-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-query.js","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,wEAAwE;AACxE,SAAS,cAAc,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;0DAC0D;AAC1D,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,KAAK,GAAG,EAAE;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,EAAE;aACb,OAAO,CACP,0OAA0O,CAC1O;aACA,GAAG,CAAC,KAAK,EAAE,KAAK,CAAwF,CAAC;QAC3G,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;SAC9C,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACV,EAAE,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAa;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC;QACJ,MAAM,GAAG,GACR,oDAAoD;YACpD,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,uBAAuB,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAkB,CAAC;QACnE,OAAO,IAAI,CAAC;IACb,CAAC;YAAS,CAAC;QACV,EAAE,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-schema.d.ts","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-schema.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAaxC,CAAC;AAuBF,eAAO,MAAM,kBAAkB,EAAE,MAAuC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Wiki DDL for the consolidated derived index (report section 5). Applied as the
|
|
2
|
+
// derived-index migration v2. Columns mirror the domain types. Every
|
|
3
|
+
// statement here is a compile-time constant with no interpolation. wiki_fts is a
|
|
4
|
+
// standalone FTS5 table kept in sync with wiki_page by triggers; the full-rebuild
|
|
5
|
+
// ingest stays the source of truth.
|
|
6
|
+
// Tables cleared (FK-safe order) before a full wiki re-ingest. These names are
|
|
7
|
+
// hard-coded constants, never user input, so they are safe to use in a clear loop.
|
|
8
|
+
export const WIKI_TABLES = [
|
|
9
|
+
"wiki_fts",
|
|
10
|
+
"wiki_link",
|
|
11
|
+
"wiki_salience",
|
|
12
|
+
"wiki_candidate",
|
|
13
|
+
"wiki_seed",
|
|
14
|
+
"wiki_claim",
|
|
15
|
+
"wiki_source",
|
|
16
|
+
"wiki_page_version",
|
|
17
|
+
"wiki_page",
|
|
18
|
+
"wiki_write_event",
|
|
19
|
+
"wiki_intervention",
|
|
20
|
+
"wiki",
|
|
21
|
+
];
|
|
22
|
+
// One DDL statement per element, joined into a single migration script. Plain
|
|
23
|
+
// string literals (no template strings) keep this provably interpolation-free.
|
|
24
|
+
const WIKI_DDL_STATEMENTS = [
|
|
25
|
+
"CREATE TABLE wiki (slug TEXT PRIMARY KEY, title TEXT NOT NULL, created_at TEXT, updated_at TEXT);",
|
|
26
|
+
"CREATE TABLE wiki_page (id TEXT PRIMARY KEY, slug TEXT NOT NULL, title TEXT NOT NULL, path TEXT NOT NULL, content TEXT NOT NULL, state TEXT NOT NULL, origin TEXT NOT NULL, created_at TEXT, updated_at TEXT);",
|
|
27
|
+
"CREATE INDEX idx_wiki_page_slug ON wiki_page(slug);",
|
|
28
|
+
"CREATE TABLE wiki_page_version (id INTEGER PRIMARY KEY, page_id TEXT NOT NULL, version INTEGER NOT NULL, content TEXT NOT NULL, created_at TEXT);",
|
|
29
|
+
"CREATE TABLE wiki_source (id TEXT PRIMARY KEY, kind TEXT NOT NULL, url TEXT NOT NULL, title TEXT, fetched_at TEXT, content_hash TEXT);",
|
|
30
|
+
"CREATE TABLE wiki_claim (id TEXT PRIMARY KEY, text TEXT NOT NULL, external INTEGER NOT NULL, source_id TEXT, page_id TEXT);",
|
|
31
|
+
"CREATE TABLE wiki_seed (id TEXT PRIMARY KEY, query TEXT NOT NULL, kind TEXT NOT NULL, status TEXT NOT NULL, created_at TEXT);",
|
|
32
|
+
"CREATE TABLE wiki_candidate (id TEXT PRIMARY KEY, slug TEXT NOT NULL, origin TEXT NOT NULL, title TEXT NOT NULL, content TEXT NOT NULL, why_save TEXT, evidence TEXT, novelty_delta REAL, reuse_scope TEXT, verification_state TEXT, risk_score REAL, salience_total REAL, state TEXT NOT NULL, created_at TEXT, review_after TEXT);",
|
|
33
|
+
"CREATE TABLE wiki_salience (candidate_id TEXT PRIMARY KEY, explicit_user_intent REAL, verified_outcome REAL, recurrence_or_friction REAL, novelty_vs_existing_wiki REAL, future_reuse_likelihood REAL, source_quality REAL, blast_radius REAL, security_risk_penalty REAL, staleness_penalty REAL, total REAL);",
|
|
34
|
+
"CREATE TABLE wiki_write_event (id INTEGER PRIMARY KEY, ts TEXT, decision_kind TEXT NOT NULL, candidate_id TEXT, page_id TEXT, reason TEXT);",
|
|
35
|
+
"CREATE TABLE wiki_intervention (id TEXT PRIMARY KEY, kind TEXT NOT NULL, candidate_id TEXT, reason TEXT, actor TEXT, created_at TEXT);",
|
|
36
|
+
"CREATE TABLE wiki_link (from_page_id TEXT NOT NULL, to_page_id TEXT NOT NULL, PRIMARY KEY (from_page_id, to_page_id));",
|
|
37
|
+
"CREATE VIRTUAL TABLE wiki_fts USING fts5(page_id UNINDEXED, slug UNINDEXED, title, body);",
|
|
38
|
+
"CREATE TRIGGER wiki_page_ai AFTER INSERT ON wiki_page BEGIN INSERT INTO wiki_fts(page_id, slug, title, body) VALUES (new.id, new.slug, new.title, new.content); END;",
|
|
39
|
+
"CREATE TRIGGER wiki_page_ad AFTER DELETE ON wiki_page BEGIN DELETE FROM wiki_fts WHERE page_id = old.id; END;",
|
|
40
|
+
"CREATE TRIGGER wiki_page_au AFTER UPDATE ON wiki_page BEGIN DELETE FROM wiki_fts WHERE page_id = old.id; INSERT INTO wiki_fts(page_id, slug, title, body) VALUES (new.id, new.slug, new.title, new.content); END;",
|
|
41
|
+
];
|
|
42
|
+
export const WIKI_MIGRATION_SQL = WIKI_DDL_STATEMENTS.join("\n");
|
|
43
|
+
//# sourceMappingURL=wiki-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-schema.js","sourceRoot":"","sources":["../../../src/wiki/infrastructure/wiki-schema.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,qEAAqE;AACrE,iFAAiF;AACjF,kFAAkF;AAClF,oCAAoC;AAEpC,+EAA+E;AAC/E,mFAAmF;AACnF,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC7C,UAAU;IACV,WAAW;IACX,eAAe;IACf,gBAAgB;IAChB,WAAW;IACX,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,WAAW;IACX,kBAAkB;IAClB,mBAAmB;IACnB,MAAM;CACN,CAAC;AAEF,8EAA8E;AAC9E,+EAA+E;AAC/E,MAAM,mBAAmB,GAAsB;IAC9C,mGAAmG;IACnG,gNAAgN;IAChN,qDAAqD;IACrD,mJAAmJ;IACnJ,wIAAwI;IACxI,6HAA6H;IAC7H,+HAA+H;IAC/H,sUAAsU;IACtU,iTAAiT;IACjT,6IAA6I;IAC7I,wIAAwI;IACxI,wHAAwH;IACxH,2FAA2F;IAC3F,sKAAsK;IACtK,+GAA+G;IAC/G,mNAAmN;CACnN,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAW,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/wiki/interface/cli.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAuCD,wBAAsB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GrE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { MarkdownWikiRepository } from "../infrastructure/markdown-repository.js";
|
|
5
|
+
import { ScannerAdapter } from "../infrastructure/scanner-adapter.js";
|
|
6
|
+
import { SqliteWikiIndex } from "../infrastructure/sqlite-index.js";
|
|
7
|
+
import { TraceAdapter } from "../infrastructure/trace-adapter.js";
|
|
8
|
+
import { FetcherAdapter } from "../infrastructure/fetcher-adapter.js";
|
|
9
|
+
import { WikiService } from "../application/service.js";
|
|
10
|
+
import { listWikiPages, searchWiki } from "../application/queries.js";
|
|
11
|
+
import { renderWiki } from "../render.js";
|
|
12
|
+
import { dbPath } from "../../core/derived-index.js";
|
|
13
|
+
import { makeWikiSlug } from "../domain/index.js";
|
|
14
|
+
function findClaudeDir() {
|
|
15
|
+
let cur = process.cwd();
|
|
16
|
+
for (;;) {
|
|
17
|
+
const candidate = path.join(cur, ".claude");
|
|
18
|
+
if (fs.existsSync(candidate))
|
|
19
|
+
return candidate;
|
|
20
|
+
const parent = path.dirname(cur);
|
|
21
|
+
if (parent === cur)
|
|
22
|
+
return null;
|
|
23
|
+
cur = parent;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function buildService(claudeDir) {
|
|
27
|
+
return new WikiService({
|
|
28
|
+
repo: new MarkdownWikiRepository(path.dirname(claudeDir)),
|
|
29
|
+
scanner: new ScannerAdapter(),
|
|
30
|
+
index: new SqliteWikiIndex(dbPath(claudeDir)),
|
|
31
|
+
tracer: new TraceAdapter(claudeDir),
|
|
32
|
+
fetcher: new FetcherAdapter(),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const CLI_SALIENCE = {
|
|
36
|
+
explicit_user_intent: 3, // a human ran the command = explicit intent
|
|
37
|
+
verified_outcome: 0,
|
|
38
|
+
recurrence_or_friction: 0,
|
|
39
|
+
novelty_vs_existing_wiki: 2,
|
|
40
|
+
future_reuse_likelihood: 2,
|
|
41
|
+
source_quality: 2,
|
|
42
|
+
blast_radius: 1,
|
|
43
|
+
security_risk_penalty: 0,
|
|
44
|
+
staleness_penalty: 0,
|
|
45
|
+
};
|
|
46
|
+
function str(v) {
|
|
47
|
+
return typeof v === "string" ? v : undefined;
|
|
48
|
+
}
|
|
49
|
+
export async function wikiCommand(opts) {
|
|
50
|
+
const claudeDir = findClaudeDir();
|
|
51
|
+
if (!claudeDir) {
|
|
52
|
+
console.error("Could not find a .claude/ directory.");
|
|
53
|
+
process.exit(0);
|
|
54
|
+
}
|
|
55
|
+
const projectRoot = path.dirname(claudeDir);
|
|
56
|
+
const { subcommand, rest, flags } = opts;
|
|
57
|
+
const svc = buildService(claudeDir);
|
|
58
|
+
switch (subcommand) {
|
|
59
|
+
case "init": {
|
|
60
|
+
const slug = makeWikiSlug(rest[0] ?? "");
|
|
61
|
+
svc.createWiki(slug, str(flags["title"]) ?? rest[1] ?? rest[0] ?? slug);
|
|
62
|
+
console.log("created wiki: " + slug);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
case "search": {
|
|
66
|
+
const hits = searchWiki(new SqliteWikiIndex(dbPath(claudeDir)), rest.join(" "));
|
|
67
|
+
if (flags["json"])
|
|
68
|
+
return void console.log(JSON.stringify(hits, null, 2));
|
|
69
|
+
for (const h of hits)
|
|
70
|
+
console.log(`${h.title} [${h.slug}] ~${h.tokenEstimate}tok\n ${h.snippet}`);
|
|
71
|
+
if (!hits.length)
|
|
72
|
+
console.log("(no results)");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
case "hint": {
|
|
76
|
+
// Context-discipline surface: title + score + path ONLY, never content.
|
|
77
|
+
const hits = searchWiki(new SqliteWikiIndex(dbPath(claudeDir)), rest.join(" "), 5);
|
|
78
|
+
const hints = hits.map((h) => ({ title: h.title, score: h.tokenEstimate, path: h.pageId }));
|
|
79
|
+
console.log(JSON.stringify(hints));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
case "list": {
|
|
83
|
+
for (const p of listWikiPages(new MarkdownWikiRepository(projectRoot), makeWikiSlug(rest[0] ?? "")))
|
|
84
|
+
console.log(p);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
case "render": {
|
|
88
|
+
const html = renderWiki(projectRoot, rest[0] ?? "");
|
|
89
|
+
const out = str(flags["out"]);
|
|
90
|
+
if (out) {
|
|
91
|
+
fs.writeFileSync(out, html, "utf-8");
|
|
92
|
+
console.log("wrote " + out);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.log(html);
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
case "reindex": {
|
|
100
|
+
const r = svc.reindexWiki(claudeDir);
|
|
101
|
+
console.log(`reindexed: ${r.wiki.pages} page(s)`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
case "enqueue": {
|
|
105
|
+
const seed = {
|
|
106
|
+
id: "seed-" + randomUUID().slice(0, 8),
|
|
107
|
+
query: rest.slice(1).join(" "),
|
|
108
|
+
kind: str(flags["kind"]) ?? "web",
|
|
109
|
+
status: "queued",
|
|
110
|
+
createdAt: new Date().toISOString(),
|
|
111
|
+
};
|
|
112
|
+
svc.enqueueSeed(makeWikiSlug(rest[0] ?? ""), seed);
|
|
113
|
+
console.log("enqueued seed: " + seed.id);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
case "research": {
|
|
117
|
+
const slug = makeWikiSlug(rest[0] ?? "");
|
|
118
|
+
const seed = {
|
|
119
|
+
id: "seed-" + randomUUID().slice(0, 8),
|
|
120
|
+
query: rest.slice(1).join(" "),
|
|
121
|
+
kind: str(flags["kind"]) ?? "web",
|
|
122
|
+
status: "queued",
|
|
123
|
+
createdAt: new Date().toISOString(),
|
|
124
|
+
};
|
|
125
|
+
const outcome = await svc.runResearchStep(slug, seed);
|
|
126
|
+
console.log(`research → ${outcome.decision}${outcome.candidateId ? " (" + outcome.candidateId + ")" : ""}`);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
case "propose": {
|
|
130
|
+
const file = str(flags["file"]);
|
|
131
|
+
const content = file ? fs.readFileSync(file, "utf-8") : (str(flags["content"]) ?? "");
|
|
132
|
+
const result = svc.proposeCandidate({
|
|
133
|
+
slug: makeWikiSlug(rest[0] ?? ""),
|
|
134
|
+
title: str(flags["title"]) ?? (rest.slice(1).join(" ") || "Untitled"),
|
|
135
|
+
content,
|
|
136
|
+
origin: "human",
|
|
137
|
+
whySave: str(flags["why"]) ?? "cli propose",
|
|
138
|
+
evidence: str(flags["evidence"]) ?? "",
|
|
139
|
+
sourceIds: [],
|
|
140
|
+
salience: CLI_SALIENCE,
|
|
141
|
+
});
|
|
142
|
+
console.log(`propose → ${result.decision.kind}${result.candidate ? " (" + result.candidate.id + ")" : ""}`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
case "approve": {
|
|
146
|
+
const page = svc.approveCandidate(makeWikiSlug(rest[0] ?? ""), rest[1] ?? "", str(flags["by"]) ?? "cli-user");
|
|
147
|
+
console.log("approved → " + page.path);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
case "reject": {
|
|
151
|
+
svc.rejectCandidate(makeWikiSlug(rest[0] ?? ""), rest[1] ?? "", str(flags["reason"]) ?? "rejected via cli");
|
|
152
|
+
console.log("rejected: " + (rest[1] ?? ""));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
default:
|
|
156
|
+
console.log("usage: mewkit wiki <init|propose|approve|reject|search|hint|list|render|reindex|enqueue|research>");
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/wiki/interface/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/wiki/render.ts"],"names":[],"mappings":"AAyBA,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAuCvE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { MarkdownWikiRepository } from "./infrastructure/markdown-repository.js";
|
|
4
|
+
import { makeWikiSlug } from "./domain/index.js";
|
|
5
|
+
// Self-contained HTML snapshot of a wiki (no CDN, no remote assets).
|
|
6
|
+
// Page content is DATA → HTML-escaped before embedding (no script execution from wiki content).
|
|
7
|
+
// Provenance (origin / approvedBy / source URL) renders as escaped TEXT, never as a live <a href>
|
|
8
|
+
// or <img src>, so the artifact opens offline with zero network requests.
|
|
9
|
+
function esc(s) {
|
|
10
|
+
return s
|
|
11
|
+
.replace(/&/g, "&")
|
|
12
|
+
.replace(/</g, "<")
|
|
13
|
+
.replace(/>/g, ">")
|
|
14
|
+
.replace(/"/g, """);
|
|
15
|
+
}
|
|
16
|
+
const STYLE = "body{font:16px/1.6 system-ui,sans-serif;max-width:48rem;margin:2rem auto;padding:0 1rem;color:#1a1a1a}" +
|
|
17
|
+
"h1{border-bottom:2px solid #333;padding-bottom:.3rem}" +
|
|
18
|
+
"article{margin:2rem 0;padding:1rem;border:1px solid #ddd;border-radius:8px}" +
|
|
19
|
+
".prov{font-size:.8rem;color:#666;margin-top:.5rem}" +
|
|
20
|
+
"pre{white-space:pre-wrap;word-wrap:break-word;background:#f6f6f6;padding:.75rem;border-radius:6px}";
|
|
21
|
+
/** Render a wiki to a single self-contained HTML string. */
|
|
22
|
+
export function renderWiki(projectRoot, slugStr) {
|
|
23
|
+
const slug = makeWikiSlug(slugStr);
|
|
24
|
+
const repo = new MarkdownWikiRepository(projectRoot);
|
|
25
|
+
const wikiJson = path.join(projectRoot, "tasks", "wikis", slug, "wiki.json");
|
|
26
|
+
let title = slug;
|
|
27
|
+
if (fs.existsSync(wikiJson)) {
|
|
28
|
+
try {
|
|
29
|
+
const meta = JSON.parse(fs.readFileSync(wikiJson, "utf-8"));
|
|
30
|
+
if (typeof meta.title === "string")
|
|
31
|
+
title = meta.title;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// fall back to slug
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const articles = repo
|
|
38
|
+
.listPages(slug)
|
|
39
|
+
.map((file) => {
|
|
40
|
+
const page = repo.readPage(slug, file);
|
|
41
|
+
if (!page)
|
|
42
|
+
return "";
|
|
43
|
+
const prov = "origin: " + esc(page.provenance.origin) +
|
|
44
|
+
(page.provenance.approvedBy ? " · approved by " + esc(page.provenance.approvedBy) : "") +
|
|
45
|
+
(page.provenance.sourceIds.length ? " · sources: " + esc(page.provenance.sourceIds.join(", ")) : "");
|
|
46
|
+
return ("<article><h2>" + esc(page.title) + "</h2>" +
|
|
47
|
+
"<pre>" + esc(page.content) + "</pre>" +
|
|
48
|
+
'<div class="prov">' + prov + "</div></article>");
|
|
49
|
+
})
|
|
50
|
+
.join("\n");
|
|
51
|
+
return ("<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\">" +
|
|
52
|
+
'<meta name="viewport" content="width=device-width,initial-scale=1">' +
|
|
53
|
+
"<title>" + esc(title) + "</title><style>" + STYLE + "</style></head>" +
|
|
54
|
+
"<body><h1>" + esc(title) + "</h1>" +
|
|
55
|
+
(articles || "<p>No pages yet.</p>") +
|
|
56
|
+
"</body></html>\n");
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/wiki/render.ts"],"names":[],"mappings":"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"}
|