mewkit 1.11.2 → 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/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/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/index.js +9 -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,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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"}
|