@tangle-network/agent-knowledge 5.0.4 → 6.1.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -2
  3. package/dist/benchmarks/index.d.ts +2 -53
  4. package/dist/benchmarks/index.js +2 -49
  5. package/dist/benchmarks-CmW6iORW.js +2718 -0
  6. package/dist/benchmarks-CmW6iORW.js.map +1 -0
  7. package/dist/cli.d.ts +1 -1
  8. package/dist/cli.js +180 -274
  9. package/dist/cli.js.map +1 -1
  10. package/dist/ids-DRqPZ42_.js +15 -0
  11. package/dist/ids-DRqPZ42_.js.map +1 -0
  12. package/dist/index-CGBctbit.d.ts +857 -0
  13. package/dist/index-CGBctbit.d.ts.map +1 -0
  14. package/dist/index-CIW3G4s_.d.ts +680 -0
  15. package/dist/index-CIW3G4s_.d.ts.map +1 -0
  16. package/dist/index.d.ts +1671 -1876
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +5836 -6530
  19. package/dist/index.js.map +1 -1
  20. package/dist/inspect-D5iarJc2.js +1864 -0
  21. package/dist/inspect-D5iarJc2.js.map +1 -0
  22. package/dist/memory/index.d.ts +3 -8
  23. package/dist/memory/index.js +3 -81
  24. package/dist/memory-C6KPRhoU.js +4494 -0
  25. package/dist/memory-C6KPRhoU.js.map +1 -0
  26. package/dist/search-CP0QtBJZ.js +113 -0
  27. package/dist/search-CP0QtBJZ.js.map +1 -0
  28. package/dist/sources/index.d.ts +212 -205
  29. package/dist/sources/index.d.ts.map +1 -0
  30. package/dist/sources/index.js +614 -33
  31. package/dist/sources/index.js.map +1 -1
  32. package/dist/types-DcCCzreS.d.ts +175 -0
  33. package/dist/types-DcCCzreS.d.ts.map +1 -0
  34. package/dist/viz/index.d.ts +23 -22
  35. package/dist/viz/index.d.ts.map +1 -0
  36. package/dist/viz/index.js +134 -10
  37. package/dist/viz/index.js.map +1 -1
  38. package/docs/results/investment-thesis.md +1 -1
  39. package/docs/results/research-driving.md +1 -1
  40. package/docs/{two-agent-research-ab.md → verified-research-ab.md} +2 -2
  41. package/package.json +22 -11
  42. package/dist/benchmarks/index.js.map +0 -1
  43. package/dist/chunk-4PNXQ2NT.js +0 -147
  44. package/dist/chunk-4PNXQ2NT.js.map +0 -1
  45. package/dist/chunk-AKYJG2MR.js +0 -2183
  46. package/dist/chunk-AKYJG2MR.js.map +0 -1
  47. package/dist/chunk-DQ3PDMDP.js +0 -115
  48. package/dist/chunk-DQ3PDMDP.js.map +0 -1
  49. package/dist/chunk-EYIA5PLQ.js +0 -3153
  50. package/dist/chunk-EYIA5PLQ.js.map +0 -1
  51. package/dist/chunk-LMR53POQ.js +0 -5437
  52. package/dist/chunk-LMR53POQ.js.map +0 -1
  53. package/dist/chunk-MYFM6LKH.js +0 -551
  54. package/dist/chunk-MYFM6LKH.js.map +0 -1
  55. package/dist/chunk-YMKHCTS2.js +0 -19
  56. package/dist/chunk-YMKHCTS2.js.map +0 -1
  57. package/dist/index-Cf7txrYP.d.ts +0 -790
  58. package/dist/memory/index.js.map +0 -1
  59. package/dist/types-6x0OpfW6.d.ts +0 -173
  60. package/dist/types-BY-xLVw-.d.ts +0 -622
package/dist/cli.js CHANGED
@@ -1,51 +1,32 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- addSourcePath,
4
- applyKnowledgeWriteBlocksFile,
5
- explainKnowledgeTarget,
6
- initKnowledgeBase,
7
- inspectKnowledgeIndex,
8
- layoutFor,
9
- lintKnowledgeIndex,
10
- loadSourceRegistry,
11
- validateKnowledgeIndex,
12
- writeKnowledgeIndex
13
- } from "./chunk-AKYJG2MR.js";
14
- import {
15
- detectKnowledgeGaps,
16
- findSurprisingConnections,
17
- toKnowledgeVizGraph
18
- } from "./chunk-4PNXQ2NT.js";
19
- import {
20
- searchKnowledge
21
- } from "./chunk-DQ3PDMDP.js";
22
- import "./chunk-YMKHCTS2.js";
23
-
24
- // src/cli.ts
25
- import { existsSync, readFileSync } from "fs";
26
- import { join, resolve } from "path";
2
+ import { D as initKnowledgeBase, a as applyKnowledgeWriteBlocksFile, c as validateKnowledgeIndex, d as writeKnowledgeIndex, f as addSourcePath, k as layoutFor, l as lintKnowledgeIndex, m as loadSourceRegistry, n as inspectKnowledgeIndex, t as explainKnowledgeTarget } from "./inspect-D5iarJc2.js";
3
+ import { n as searchKnowledge } from "./search-CP0QtBJZ.js";
4
+ import { detectKnowledgeGaps, findSurprisingConnections, toKnowledgeVizGraph } from "./viz/index.js";
5
+ import { join, resolve } from "node:path";
6
+ import { existsSync, readFileSync } from "node:fs";
7
+ //#region src/cli.ts
27
8
  function parseArgs(argv) {
28
- const [command, ...rest] = argv;
29
- const positional = [];
30
- const flags = {};
31
- for (let i = 0; i < rest.length; i++) {
32
- const token = rest[i];
33
- if (token.startsWith("--")) {
34
- const key = token.slice(2);
35
- const next = rest[i + 1];
36
- if (next && !next.startsWith("--")) {
37
- flags[key] = next;
38
- i++;
39
- } else {
40
- flags[key] = "true";
41
- }
42
- } else {
43
- positional.push(token);
44
- }
45
- }
46
- return { command: command ?? "help", positional, flags };
9
+ const [command, ...rest] = argv;
10
+ const positional = [];
11
+ const flags = {};
12
+ for (let i = 0; i < rest.length; i++) {
13
+ const token = rest[i];
14
+ if (token.startsWith("--")) {
15
+ const key = token.slice(2);
16
+ const next = rest[i + 1];
17
+ if (next && !next.startsWith("--")) {
18
+ flags[key] = next;
19
+ i++;
20
+ } else flags[key] = "true";
21
+ } else positional.push(token);
22
+ }
23
+ return {
24
+ command: command ?? "help",
25
+ positional,
26
+ flags
27
+ };
47
28
  }
48
- var HELP = `agent-knowledge \u2014 source-grounded knowledge graph CLI.
29
+ const HELP = `agent-knowledge — source-grounded knowledge graph CLI.
49
30
 
50
31
  Commands:
51
32
  init [--root .]
@@ -78,238 +59,163 @@ Commands:
78
59
  Print package version.
79
60
  `;
80
61
  async function main() {
81
- const args = parseArgs(process.argv.slice(2));
82
- const root = resolve(args.flags.root ?? ".");
83
- switch (args.command) {
84
- case "init": {
85
- const layout = await initKnowledgeBase(root);
86
- process.stdout.write(`initialized knowledge base at ${layout.root}
87
- `);
88
- return 0;
89
- }
90
- case "index": {
91
- const index = await writeKnowledgeIndex(root);
92
- if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(index, null, 2)}
93
- `);
94
- else
95
- process.stdout.write(
96
- `indexed ${index.pages.length} pages, ${index.graph.edges.length} edges
97
- `
98
- );
99
- return 0;
100
- }
101
- case "source-add": {
102
- const [path] = args.positional;
103
- if (!path) {
104
- process.stderr.write("source-add requires a file or directory path\n");
105
- return 1;
106
- }
107
- await initKnowledgeBase(root);
108
- const sources = await addSourcePath(root, resolve(path));
109
- if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(sources, null, 2)}
110
- `);
111
- else for (const source of sources) process.stdout.write(`${source.id} ${source.uri}
112
- `);
113
- return 0;
114
- }
115
- case "sources": {
116
- const registry = await loadSourceRegistry(root);
117
- if (args.flags.json === "true")
118
- process.stdout.write(`${JSON.stringify(registry.sources, null, 2)}
119
- `);
120
- else {
121
- for (const source of registry.sources)
122
- process.stdout.write(`${source.id} ${source.title ?? source.uri} ${source.uri}
123
- `);
124
- }
125
- return 0;
126
- }
127
- case "apply-write-blocks": {
128
- const [proposalPath] = args.positional;
129
- if (!proposalPath) {
130
- process.stderr.write("apply-write-blocks requires a proposal file\n");
131
- return 1;
132
- }
133
- await initKnowledgeBase(root);
134
- const result = await applyKnowledgeWriteBlocksFile(root, resolve(proposalPath));
135
- await writeKnowledgeIndex(root);
136
- if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(result, null, 2)}
137
- `);
138
- else {
139
- for (const path of result.written) process.stdout.write(`wrote ${path}
140
- `);
141
- for (const warning of result.warnings) process.stderr.write(`warning: ${warning}
142
- `);
143
- }
144
- return result.warnings.length > 0 ? 2 : 0;
145
- }
146
- case "inspect": {
147
- const index = await loadOrBuildIndex(root);
148
- const inspection = inspectKnowledgeIndex(index);
149
- if (args.flags.json === "true")
150
- process.stdout.write(`${JSON.stringify(inspection, null, 2)}
151
- `);
152
- else {
153
- process.stdout.write(
154
- `pages=${inspection.pageCount} sources=${inspection.sourceCount} edges=${inspection.edgeCount} findings=${inspection.findingCount} blocking=${inspection.blockingFindingCount}
155
- `
156
- );
157
- for (const page of inspection.topPages.slice(0, 5))
158
- process.stdout.write(`${page.degree} ${page.path} sources=${page.sources}
159
- `);
160
- }
161
- return inspection.blockingFindingCount > 0 ? 2 : 0;
162
- }
163
- case "explain": {
164
- const target = args.positional.join(" ");
165
- if (!target) {
166
- process.stderr.write("explain requires a page path, id, title, or query\n");
167
- return 1;
168
- }
169
- const explanation = explainKnowledgeTarget(await loadOrBuildIndex(root), target);
170
- if (args.flags.json === "true")
171
- process.stdout.write(`${JSON.stringify(explanation, null, 2)}
172
- `);
173
- else {
174
- process.stdout.write(`${explanation.page ? explanation.page.title : target}
175
- `);
176
- for (const source of explanation.sources)
177
- process.stdout.write(`source ${source.id} ${source.title ?? source.uri}
178
- `);
179
- for (const link of explanation.links) process.stdout.write(`out ${link}
180
- `);
181
- for (const inbound of explanation.inbound) process.stdout.write(`in ${inbound}
182
- `);
183
- for (const related of explanation.related.slice(0, 5))
184
- process.stdout.write(`related ${related.path} score=${related.score.toFixed(5)}
185
- `);
186
- }
187
- return 0;
188
- }
189
- case "search": {
190
- const query = args.positional.join(" ");
191
- if (!query) {
192
- process.stderr.write("search requires a query\n");
193
- return 1;
194
- }
195
- const index = await loadOrBuildIndex(root);
196
- const results = searchKnowledge(index, query, Number(args.flags.limit ?? 10));
197
- if (args.flags.json === "true") {
198
- process.stdout.write(`${JSON.stringify(results, null, 2)}
199
- `);
200
- } else {
201
- for (const result of results) {
202
- process.stdout.write(
203
- `${result.rank}. ${result.page.title} (${result.page.path}) score=${result.score.toFixed(5)}
204
- `
205
- );
206
- if (result.snippet) process.stdout.write(` ${result.snippet}
207
- `);
208
- }
209
- }
210
- return 0;
211
- }
212
- case "graph": {
213
- const index = await loadOrBuildIndex(root);
214
- if ((args.flags.format ?? "summary") === "json")
215
- process.stdout.write(`${JSON.stringify(index.graph, null, 2)}
216
- `);
217
- else
218
- process.stdout.write(
219
- `nodes=${index.graph.nodes.length} edges=${index.graph.edges.length}
220
- `
221
- );
222
- return 0;
223
- }
224
- case "lint": {
225
- const index = await loadOrBuildIndex(root);
226
- const findings = lintKnowledgeIndex(index);
227
- if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(findings, null, 2)}
228
- `);
229
- else {
230
- if (findings.length === 0) process.stdout.write("no findings\n");
231
- for (const finding of findings) {
232
- process.stdout.write(
233
- `${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ""}: ${finding.message}
234
- `
235
- );
236
- }
237
- }
238
- return findings.some((finding) => finding.severity === "error") ? 2 : 0;
239
- }
240
- case "validate": {
241
- const result = validateKnowledgeIndex(await loadOrBuildIndex(root), {
242
- strict: args.flags.strict === "true"
243
- });
244
- if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(result, null, 2)}
245
- `);
246
- else {
247
- process.stdout.write(result.ok ? "valid\n" : "invalid\n");
248
- for (const finding of result.findings)
249
- process.stdout.write(
250
- `${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ""}: ${finding.message}
251
- `
252
- );
253
- }
254
- return result.ok ? 0 : 2;
255
- }
256
- case "export": {
257
- const index = await loadOrBuildIndex(root);
258
- const format = args.flags.format ?? "json";
259
- if (format !== "json") {
260
- process.stderr.write("export currently supports --format json\n");
261
- return 1;
262
- }
263
- process.stdout.write(`${JSON.stringify(index, null, 2)}
264
- `);
265
- return 0;
266
- }
267
- case "viz": {
268
- const index = await loadOrBuildIndex(root);
269
- const viz = toKnowledgeVizGraph(index.graph);
270
- const payload = {
271
- graph: viz,
272
- gaps: detectKnowledgeGaps(viz),
273
- surprisingConnections: findSurprisingConnections(viz)
274
- };
275
- if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(payload, null, 2)}
276
- `);
277
- else {
278
- process.stdout.write(
279
- `communities=${viz.communities.length} gaps=${payload.gaps.length} surprising=${payload.surprisingConnections.length}
280
- `
281
- );
282
- }
283
- return 0;
284
- }
285
- case "version": {
286
- const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
287
- process.stdout.write(`${pkg.version}
288
- `);
289
- return 0;
290
- }
291
- case "help":
292
- case "--help":
293
- case "-h":
294
- process.stdout.write(HELP);
295
- return 0;
296
- default:
297
- process.stderr.write(`unknown command: ${args.command}
298
- ${HELP}`);
299
- return 1;
300
- }
62
+ const args = parseArgs(process.argv.slice(2));
63
+ const root = resolve(args.flags.root ?? ".");
64
+ switch (args.command) {
65
+ case "init": {
66
+ const layout = await initKnowledgeBase(root);
67
+ process.stdout.write(`initialized knowledge base at ${layout.root}\n`);
68
+ return 0;
69
+ }
70
+ case "index": {
71
+ const index = await writeKnowledgeIndex(root);
72
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(index, null, 2)}\n`);
73
+ else process.stdout.write(`indexed ${index.pages.length} pages, ${index.graph.edges.length} edges\n`);
74
+ return 0;
75
+ }
76
+ case "source-add": {
77
+ const [path] = args.positional;
78
+ if (!path) {
79
+ process.stderr.write("source-add requires a file or directory path\n");
80
+ return 1;
81
+ }
82
+ await initKnowledgeBase(root);
83
+ const sources = await addSourcePath(root, resolve(path));
84
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(sources, null, 2)}\n`);
85
+ else for (const source of sources) process.stdout.write(`${source.id} ${source.uri}\n`);
86
+ return 0;
87
+ }
88
+ case "sources": {
89
+ const registry = await loadSourceRegistry(root);
90
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(registry.sources, null, 2)}\n`);
91
+ else for (const source of registry.sources) process.stdout.write(`${source.id} ${source.title ?? source.uri} ${source.uri}\n`);
92
+ return 0;
93
+ }
94
+ case "apply-write-blocks": {
95
+ const [proposalPath] = args.positional;
96
+ if (!proposalPath) {
97
+ process.stderr.write("apply-write-blocks requires a proposal file\n");
98
+ return 1;
99
+ }
100
+ await initKnowledgeBase(root);
101
+ const result = await applyKnowledgeWriteBlocksFile(root, resolve(proposalPath));
102
+ await writeKnowledgeIndex(root);
103
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
104
+ else {
105
+ for (const path of result.written) process.stdout.write(`wrote ${path}\n`);
106
+ for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\n`);
107
+ }
108
+ return result.warnings.length > 0 ? 2 : 0;
109
+ }
110
+ case "inspect": {
111
+ const inspection = inspectKnowledgeIndex(await loadOrBuildIndex(root));
112
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(inspection, null, 2)}\n`);
113
+ else {
114
+ process.stdout.write(`pages=${inspection.pageCount} sources=${inspection.sourceCount} edges=${inspection.edgeCount} findings=${inspection.findingCount} blocking=${inspection.blockingFindingCount}\n`);
115
+ for (const page of inspection.topPages.slice(0, 5)) process.stdout.write(`${page.degree} ${page.path} sources=${page.sources}\n`);
116
+ }
117
+ return inspection.blockingFindingCount > 0 ? 2 : 0;
118
+ }
119
+ case "explain": {
120
+ const target = args.positional.join(" ");
121
+ if (!target) {
122
+ process.stderr.write("explain requires a page path, id, title, or query\n");
123
+ return 1;
124
+ }
125
+ const explanation = explainKnowledgeTarget(await loadOrBuildIndex(root), target);
126
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(explanation, null, 2)}\n`);
127
+ else {
128
+ process.stdout.write(`${explanation.page ? explanation.page.title : target}\n`);
129
+ for (const source of explanation.sources) process.stdout.write(`source ${source.id} ${source.title ?? source.uri}\n`);
130
+ for (const link of explanation.links) process.stdout.write(`out ${link}\n`);
131
+ for (const inbound of explanation.inbound) process.stdout.write(`in ${inbound}\n`);
132
+ for (const related of explanation.related.slice(0, 5)) process.stdout.write(`related ${related.path} score=${related.score.toFixed(5)}\n`);
133
+ }
134
+ return 0;
135
+ }
136
+ case "search": {
137
+ const query = args.positional.join(" ");
138
+ if (!query) {
139
+ process.stderr.write("search requires a query\n");
140
+ return 1;
141
+ }
142
+ const results = searchKnowledge(await loadOrBuildIndex(root), query, Number(args.flags.limit ?? 10));
143
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(results, null, 2)}\n`);
144
+ else for (const result of results) {
145
+ process.stdout.write(`${result.rank}. ${result.page.title} (${result.page.path}) score=${result.score.toFixed(5)}\n`);
146
+ if (result.snippet) process.stdout.write(` ${result.snippet}\n`);
147
+ }
148
+ return 0;
149
+ }
150
+ case "graph": {
151
+ const index = await loadOrBuildIndex(root);
152
+ if ((args.flags.format ?? "summary") === "json") process.stdout.write(`${JSON.stringify(index.graph, null, 2)}\n`);
153
+ else process.stdout.write(`nodes=${index.graph.nodes.length} edges=${index.graph.edges.length}\n`);
154
+ return 0;
155
+ }
156
+ case "lint": {
157
+ const findings = lintKnowledgeIndex(await loadOrBuildIndex(root));
158
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(findings, null, 2)}\n`);
159
+ else {
160
+ if (findings.length === 0) process.stdout.write("no findings\n");
161
+ for (const finding of findings) process.stdout.write(`${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ""}: ${finding.message}\n`);
162
+ }
163
+ return findings.some((finding) => finding.severity === "error") ? 2 : 0;
164
+ }
165
+ case "validate": {
166
+ const result = validateKnowledgeIndex(await loadOrBuildIndex(root), { strict: args.flags.strict === "true" });
167
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
168
+ else {
169
+ process.stdout.write(result.ok ? "valid\n" : "invalid\n");
170
+ for (const finding of result.findings) process.stdout.write(`${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ""}: ${finding.message}\n`);
171
+ }
172
+ return result.ok ? 0 : 2;
173
+ }
174
+ case "export": {
175
+ const index = await loadOrBuildIndex(root);
176
+ if ((args.flags.format ?? "json") !== "json") {
177
+ process.stderr.write("export currently supports --format json\n");
178
+ return 1;
179
+ }
180
+ process.stdout.write(`${JSON.stringify(index, null, 2)}\n`);
181
+ return 0;
182
+ }
183
+ case "viz": {
184
+ const viz = toKnowledgeVizGraph((await loadOrBuildIndex(root)).graph);
185
+ const payload = {
186
+ graph: viz,
187
+ gaps: detectKnowledgeGaps(viz),
188
+ surprisingConnections: findSurprisingConnections(viz)
189
+ };
190
+ if (args.flags.json === "true") process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
191
+ else process.stdout.write(`communities=${viz.communities.length} gaps=${payload.gaps.length} surprising=${payload.surprisingConnections.length}\n`);
192
+ return 0;
193
+ }
194
+ case "version": {
195
+ const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
196
+ process.stdout.write(`${pkg.version}\n`);
197
+ return 0;
198
+ }
199
+ case "help":
200
+ case "--help":
201
+ case "-h":
202
+ process.stdout.write(HELP);
203
+ return 0;
204
+ default:
205
+ process.stderr.write(`unknown command: ${args.command}\n${HELP}`);
206
+ return 1;
207
+ }
301
208
  }
302
209
  async function loadOrBuildIndex(root) {
303
- const path = join(layoutFor(root).cacheDir, "index.json");
304
- if (existsSync(path))
305
- return JSON.parse(readFileSync(path, "utf8"));
306
- return await writeKnowledgeIndex(root);
210
+ const path = join(layoutFor(root).cacheDir, "index.json");
211
+ if (existsSync(path)) return JSON.parse(readFileSync(path, "utf8"));
212
+ return await writeKnowledgeIndex(root);
307
213
  }
308
214
  main().then((code) => process.exit(code)).catch((err) => {
309
- process.stderr.write(
310
- `agent-knowledge error: ${err instanceof Error ? err.stack ?? err.message : String(err)}
311
- `
312
- );
313
- process.exit(1);
215
+ process.stderr.write(`agent-knowledge error: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
216
+ process.exit(1);
314
217
  });
218
+ //#endregion
219
+ export {};
220
+
315
221
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { type buildKnowledgeIndex, writeKnowledgeIndex } from './indexer'\nimport { explainKnowledgeTarget, inspectKnowledgeIndex } from './inspect'\nimport { lintKnowledgeIndex } from './lint'\nimport { applyKnowledgeWriteBlocksFile } from './proposals'\nimport { searchKnowledge } from './search'\nimport { addSourcePath, loadSourceRegistry } from './sources'\nimport { initKnowledgeBase, layoutFor } from './store'\nimport { validateKnowledgeIndex } from './validate'\nimport { detectKnowledgeGaps, findSurprisingConnections, toKnowledgeVizGraph } from './viz/index'\n\ninterface Args {\n command: string\n positional: string[]\n flags: Record<string, string>\n}\n\nfunction parseArgs(argv: string[]): Args {\n const [command, ...rest] = argv\n const positional: string[] = []\n const flags: Record<string, string> = {}\n for (let i = 0; i < rest.length; i++) {\n const token = rest[i]!\n if (token.startsWith('--')) {\n const key = token.slice(2)\n const next = rest[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = 'true'\n }\n } else {\n positional.push(token)\n }\n }\n return { command: command ?? 'help', positional, flags }\n}\n\nconst HELP = `agent-knowledge — source-grounded knowledge graph CLI.\n\nCommands:\n init [--root .]\n Create raw/sources, knowledge, and cache directories.\n index [--root .] [--json]\n Build .agent-knowledge/index.json from knowledge/**/*.md.\n source-add <path> [--root .] [--json]\n Copy a file or directory into raw/sources and register immutable source records.\n sources [--root .] [--json]\n List registered sources.\n apply-write-blocks <proposal-file> [--root .] [--json]\n Apply safe ---FILE: knowledge/...--- blocks emitted by an agent.\n inspect [--root .] [--json]\n Summarize page/source/edge counts, top pages, and lint state.\n explain <page|id|query> [--root .] [--json]\n Explain sources, links, inbound links, and related pages.\n search <query> [--root .] [--limit 10] [--json]\n Fast local token+graph search over the generated knowledge index.\n graph [--root .] [--format summary|json]\n Emit graph summary or JSON.\n lint [--root .] [--json]\n Run deterministic structural lint.\n validate [--root .] [--strict] [--json]\n Run schema + lint validation. Exits non-zero on blocking findings.\n export [--root .] [--format json]\n Export the current index.\n viz [--root .] [--json]\n Emit graph gaps and surprising connections.\n version\n Print package version.\n`\n\nasync function main(): Promise<number> {\n const args = parseArgs(process.argv.slice(2))\n const root = resolve(args.flags.root ?? '.')\n switch (args.command) {\n case 'init': {\n const layout = await initKnowledgeBase(root)\n process.stdout.write(`initialized knowledge base at ${layout.root}\\n`)\n return 0\n }\n case 'index': {\n const index = await writeKnowledgeIndex(root)\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(index, null, 2)}\\n`)\n else\n process.stdout.write(\n `indexed ${index.pages.length} pages, ${index.graph.edges.length} edges\\n`,\n )\n return 0\n }\n case 'source-add': {\n const [path] = args.positional\n if (!path) {\n process.stderr.write('source-add requires a file or directory path\\n')\n return 1\n }\n await initKnowledgeBase(root)\n const sources = await addSourcePath(root, resolve(path))\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(sources, null, 2)}\\n`)\n else for (const source of sources) process.stdout.write(`${source.id} ${source.uri}\\n`)\n return 0\n }\n case 'sources': {\n const registry = await loadSourceRegistry(root)\n if (args.flags.json === 'true')\n process.stdout.write(`${JSON.stringify(registry.sources, null, 2)}\\n`)\n else {\n for (const source of registry.sources)\n process.stdout.write(`${source.id} ${source.title ?? source.uri} ${source.uri}\\n`)\n }\n return 0\n }\n case 'apply-write-blocks': {\n const [proposalPath] = args.positional\n if (!proposalPath) {\n process.stderr.write('apply-write-blocks requires a proposal file\\n')\n return 1\n }\n await initKnowledgeBase(root)\n const result = await applyKnowledgeWriteBlocksFile(root, resolve(proposalPath))\n await writeKnowledgeIndex(root)\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`)\n else {\n for (const path of result.written) process.stdout.write(`wrote ${path}\\n`)\n for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\\n`)\n }\n return result.warnings.length > 0 ? 2 : 0\n }\n case 'inspect': {\n const index = await loadOrBuildIndex(root)\n const inspection = inspectKnowledgeIndex(index)\n if (args.flags.json === 'true')\n process.stdout.write(`${JSON.stringify(inspection, null, 2)}\\n`)\n else {\n process.stdout.write(\n `pages=${inspection.pageCount} sources=${inspection.sourceCount} edges=${inspection.edgeCount} findings=${inspection.findingCount} blocking=${inspection.blockingFindingCount}\\n`,\n )\n for (const page of inspection.topPages.slice(0, 5))\n process.stdout.write(`${page.degree} ${page.path} sources=${page.sources}\\n`)\n }\n return inspection.blockingFindingCount > 0 ? 2 : 0\n }\n case 'explain': {\n const target = args.positional.join(' ')\n if (!target) {\n process.stderr.write('explain requires a page path, id, title, or query\\n')\n return 1\n }\n const explanation = explainKnowledgeTarget(await loadOrBuildIndex(root), target)\n if (args.flags.json === 'true')\n process.stdout.write(`${JSON.stringify(explanation, null, 2)}\\n`)\n else {\n process.stdout.write(`${explanation.page ? explanation.page.title : target}\\n`)\n for (const source of explanation.sources)\n process.stdout.write(`source ${source.id} ${source.title ?? source.uri}\\n`)\n for (const link of explanation.links) process.stdout.write(`out ${link}\\n`)\n for (const inbound of explanation.inbound) process.stdout.write(`in ${inbound}\\n`)\n for (const related of explanation.related.slice(0, 5))\n process.stdout.write(`related ${related.path} score=${related.score.toFixed(5)}\\n`)\n }\n return 0\n }\n case 'search': {\n const query = args.positional.join(' ')\n if (!query) {\n process.stderr.write('search requires a query\\n')\n return 1\n }\n const index = await loadOrBuildIndex(root)\n const results = searchKnowledge(index, query, Number(args.flags.limit ?? 10))\n if (args.flags.json === 'true') {\n process.stdout.write(`${JSON.stringify(results, null, 2)}\\n`)\n } else {\n for (const result of results) {\n process.stdout.write(\n `${result.rank}. ${result.page.title} (${result.page.path}) score=${result.score.toFixed(5)}\\n`,\n )\n if (result.snippet) process.stdout.write(` ${result.snippet}\\n`)\n }\n }\n return 0\n }\n case 'graph': {\n const index = await loadOrBuildIndex(root)\n if ((args.flags.format ?? 'summary') === 'json')\n process.stdout.write(`${JSON.stringify(index.graph, null, 2)}\\n`)\n else\n process.stdout.write(\n `nodes=${index.graph.nodes.length} edges=${index.graph.edges.length}\\n`,\n )\n return 0\n }\n case 'lint': {\n const index = await loadOrBuildIndex(root)\n const findings = lintKnowledgeIndex(index)\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(findings, null, 2)}\\n`)\n else {\n if (findings.length === 0) process.stdout.write('no findings\\n')\n for (const finding of findings) {\n process.stdout.write(\n `${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ''}: ${finding.message}\\n`,\n )\n }\n }\n return findings.some((finding) => finding.severity === 'error') ? 2 : 0\n }\n case 'validate': {\n const result = validateKnowledgeIndex(await loadOrBuildIndex(root), {\n strict: args.flags.strict === 'true',\n })\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`)\n else {\n process.stdout.write(result.ok ? 'valid\\n' : 'invalid\\n')\n for (const finding of result.findings)\n process.stdout.write(\n `${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ''}: ${finding.message}\\n`,\n )\n }\n return result.ok ? 0 : 2\n }\n case 'export': {\n const index = await loadOrBuildIndex(root)\n const format = args.flags.format ?? 'json'\n if (format !== 'json') {\n process.stderr.write('export currently supports --format json\\n')\n return 1\n }\n process.stdout.write(`${JSON.stringify(index, null, 2)}\\n`)\n return 0\n }\n case 'viz': {\n const index = await loadOrBuildIndex(root)\n const viz = toKnowledgeVizGraph(index.graph)\n const payload = {\n graph: viz,\n gaps: detectKnowledgeGaps(viz),\n surprisingConnections: findSurprisingConnections(viz),\n }\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`)\n else {\n process.stdout.write(\n `communities=${viz.communities.length} gaps=${payload.gaps.length} surprising=${payload.surprisingConnections.length}\\n`,\n )\n }\n return 0\n }\n case 'version': {\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as {\n version: string\n }\n process.stdout.write(`${pkg.version}\\n`)\n return 0\n }\n case 'help':\n case '--help':\n case '-h':\n process.stdout.write(HELP)\n return 0\n default:\n process.stderr.write(`unknown command: ${args.command}\\n${HELP}`)\n return 1\n }\n}\n\nasync function loadOrBuildIndex(root: string) {\n const path = join(layoutFor(root).cacheDir, 'index.json')\n if (existsSync(path))\n return JSON.parse(readFileSync(path, 'utf8')) as Awaited<ReturnType<typeof buildKnowledgeIndex>>\n return await writeKnowledgeIndex(root)\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(\n `agent-knowledge error: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}\\n`,\n )\n process.exit(1)\n })\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"cli.js","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { type buildKnowledgeIndex, writeKnowledgeIndex } from './indexer'\nimport { explainKnowledgeTarget, inspectKnowledgeIndex } from './inspect'\nimport { lintKnowledgeIndex } from './lint'\nimport { applyKnowledgeWriteBlocksFile } from './proposals'\nimport { searchKnowledge } from './search'\nimport { addSourcePath, loadSourceRegistry } from './sources'\nimport { initKnowledgeBase, layoutFor } from './store'\nimport { validateKnowledgeIndex } from './validate'\nimport { detectKnowledgeGaps, findSurprisingConnections, toKnowledgeVizGraph } from './viz/index'\n\ninterface Args {\n command: string\n positional: string[]\n flags: Record<string, string>\n}\n\nfunction parseArgs(argv: string[]): Args {\n const [command, ...rest] = argv\n const positional: string[] = []\n const flags: Record<string, string> = {}\n for (let i = 0; i < rest.length; i++) {\n const token = rest[i]!\n if (token.startsWith('--')) {\n const key = token.slice(2)\n const next = rest[i + 1]\n if (next && !next.startsWith('--')) {\n flags[key] = next\n i++\n } else {\n flags[key] = 'true'\n }\n } else {\n positional.push(token)\n }\n }\n return { command: command ?? 'help', positional, flags }\n}\n\nconst HELP = `agent-knowledge — source-grounded knowledge graph CLI.\n\nCommands:\n init [--root .]\n Create raw/sources, knowledge, and cache directories.\n index [--root .] [--json]\n Build .agent-knowledge/index.json from knowledge/**/*.md.\n source-add <path> [--root .] [--json]\n Copy a file or directory into raw/sources and register immutable source records.\n sources [--root .] [--json]\n List registered sources.\n apply-write-blocks <proposal-file> [--root .] [--json]\n Apply safe ---FILE: knowledge/...--- blocks emitted by an agent.\n inspect [--root .] [--json]\n Summarize page/source/edge counts, top pages, and lint state.\n explain <page|id|query> [--root .] [--json]\n Explain sources, links, inbound links, and related pages.\n search <query> [--root .] [--limit 10] [--json]\n Fast local token+graph search over the generated knowledge index.\n graph [--root .] [--format summary|json]\n Emit graph summary or JSON.\n lint [--root .] [--json]\n Run deterministic structural lint.\n validate [--root .] [--strict] [--json]\n Run schema + lint validation. Exits non-zero on blocking findings.\n export [--root .] [--format json]\n Export the current index.\n viz [--root .] [--json]\n Emit graph gaps and surprising connections.\n version\n Print package version.\n`\n\nasync function main(): Promise<number> {\n const args = parseArgs(process.argv.slice(2))\n const root = resolve(args.flags.root ?? '.')\n switch (args.command) {\n case 'init': {\n const layout = await initKnowledgeBase(root)\n process.stdout.write(`initialized knowledge base at ${layout.root}\\n`)\n return 0\n }\n case 'index': {\n const index = await writeKnowledgeIndex(root)\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(index, null, 2)}\\n`)\n else\n process.stdout.write(\n `indexed ${index.pages.length} pages, ${index.graph.edges.length} edges\\n`,\n )\n return 0\n }\n case 'source-add': {\n const [path] = args.positional\n if (!path) {\n process.stderr.write('source-add requires a file or directory path\\n')\n return 1\n }\n await initKnowledgeBase(root)\n const sources = await addSourcePath(root, resolve(path))\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(sources, null, 2)}\\n`)\n else for (const source of sources) process.stdout.write(`${source.id} ${source.uri}\\n`)\n return 0\n }\n case 'sources': {\n const registry = await loadSourceRegistry(root)\n if (args.flags.json === 'true')\n process.stdout.write(`${JSON.stringify(registry.sources, null, 2)}\\n`)\n else {\n for (const source of registry.sources)\n process.stdout.write(`${source.id} ${source.title ?? source.uri} ${source.uri}\\n`)\n }\n return 0\n }\n case 'apply-write-blocks': {\n const [proposalPath] = args.positional\n if (!proposalPath) {\n process.stderr.write('apply-write-blocks requires a proposal file\\n')\n return 1\n }\n await initKnowledgeBase(root)\n const result = await applyKnowledgeWriteBlocksFile(root, resolve(proposalPath))\n await writeKnowledgeIndex(root)\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`)\n else {\n for (const path of result.written) process.stdout.write(`wrote ${path}\\n`)\n for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\\n`)\n }\n return result.warnings.length > 0 ? 2 : 0\n }\n case 'inspect': {\n const index = await loadOrBuildIndex(root)\n const inspection = inspectKnowledgeIndex(index)\n if (args.flags.json === 'true')\n process.stdout.write(`${JSON.stringify(inspection, null, 2)}\\n`)\n else {\n process.stdout.write(\n `pages=${inspection.pageCount} sources=${inspection.sourceCount} edges=${inspection.edgeCount} findings=${inspection.findingCount} blocking=${inspection.blockingFindingCount}\\n`,\n )\n for (const page of inspection.topPages.slice(0, 5))\n process.stdout.write(`${page.degree} ${page.path} sources=${page.sources}\\n`)\n }\n return inspection.blockingFindingCount > 0 ? 2 : 0\n }\n case 'explain': {\n const target = args.positional.join(' ')\n if (!target) {\n process.stderr.write('explain requires a page path, id, title, or query\\n')\n return 1\n }\n const explanation = explainKnowledgeTarget(await loadOrBuildIndex(root), target)\n if (args.flags.json === 'true')\n process.stdout.write(`${JSON.stringify(explanation, null, 2)}\\n`)\n else {\n process.stdout.write(`${explanation.page ? explanation.page.title : target}\\n`)\n for (const source of explanation.sources)\n process.stdout.write(`source ${source.id} ${source.title ?? source.uri}\\n`)\n for (const link of explanation.links) process.stdout.write(`out ${link}\\n`)\n for (const inbound of explanation.inbound) process.stdout.write(`in ${inbound}\\n`)\n for (const related of explanation.related.slice(0, 5))\n process.stdout.write(`related ${related.path} score=${related.score.toFixed(5)}\\n`)\n }\n return 0\n }\n case 'search': {\n const query = args.positional.join(' ')\n if (!query) {\n process.stderr.write('search requires a query\\n')\n return 1\n }\n const index = await loadOrBuildIndex(root)\n const results = searchKnowledge(index, query, Number(args.flags.limit ?? 10))\n if (args.flags.json === 'true') {\n process.stdout.write(`${JSON.stringify(results, null, 2)}\\n`)\n } else {\n for (const result of results) {\n process.stdout.write(\n `${result.rank}. ${result.page.title} (${result.page.path}) score=${result.score.toFixed(5)}\\n`,\n )\n if (result.snippet) process.stdout.write(` ${result.snippet}\\n`)\n }\n }\n return 0\n }\n case 'graph': {\n const index = await loadOrBuildIndex(root)\n if ((args.flags.format ?? 'summary') === 'json')\n process.stdout.write(`${JSON.stringify(index.graph, null, 2)}\\n`)\n else\n process.stdout.write(\n `nodes=${index.graph.nodes.length} edges=${index.graph.edges.length}\\n`,\n )\n return 0\n }\n case 'lint': {\n const index = await loadOrBuildIndex(root)\n const findings = lintKnowledgeIndex(index)\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(findings, null, 2)}\\n`)\n else {\n if (findings.length === 0) process.stdout.write('no findings\\n')\n for (const finding of findings) {\n process.stdout.write(\n `${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ''}: ${finding.message}\\n`,\n )\n }\n }\n return findings.some((finding) => finding.severity === 'error') ? 2 : 0\n }\n case 'validate': {\n const result = validateKnowledgeIndex(await loadOrBuildIndex(root), {\n strict: args.flags.strict === 'true',\n })\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`)\n else {\n process.stdout.write(result.ok ? 'valid\\n' : 'invalid\\n')\n for (const finding of result.findings)\n process.stdout.write(\n `${finding.severity.toUpperCase()} ${finding.type}${finding.page ? ` ${finding.page}` : ''}: ${finding.message}\\n`,\n )\n }\n return result.ok ? 0 : 2\n }\n case 'export': {\n const index = await loadOrBuildIndex(root)\n const format = args.flags.format ?? 'json'\n if (format !== 'json') {\n process.stderr.write('export currently supports --format json\\n')\n return 1\n }\n process.stdout.write(`${JSON.stringify(index, null, 2)}\\n`)\n return 0\n }\n case 'viz': {\n const index = await loadOrBuildIndex(root)\n const viz = toKnowledgeVizGraph(index.graph)\n const payload = {\n graph: viz,\n gaps: detectKnowledgeGaps(viz),\n surprisingConnections: findSurprisingConnections(viz),\n }\n if (args.flags.json === 'true') process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`)\n else {\n process.stdout.write(\n `communities=${viz.communities.length} gaps=${payload.gaps.length} surprising=${payload.surprisingConnections.length}\\n`,\n )\n }\n return 0\n }\n case 'version': {\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as {\n version: string\n }\n process.stdout.write(`${pkg.version}\\n`)\n return 0\n }\n case 'help':\n case '--help':\n case '-h':\n process.stdout.write(HELP)\n return 0\n default:\n process.stderr.write(`unknown command: ${args.command}\\n${HELP}`)\n return 1\n }\n}\n\nasync function loadOrBuildIndex(root: string) {\n const path = join(layoutFor(root).cacheDir, 'index.json')\n if (existsSync(path))\n return JSON.parse(readFileSync(path, 'utf8')) as Awaited<ReturnType<typeof buildKnowledgeIndex>>\n return await writeKnowledgeIndex(root)\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(\n `agent-knowledge error: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}\\n`,\n )\n process.exit(1)\n })\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { createHash } from "node:crypto";
2
+ //#region src/ids.ts
3
+ function sha256(text) {
4
+ return createHash("sha256").update(text).digest("hex");
5
+ }
6
+ function slugify(input) {
7
+ return input.trim().toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9\u4e00-\u9fff]+/g, "-").replace(/^-+|-+$/g, "") || "untitled";
8
+ }
9
+ function stableId(prefix, content) {
10
+ return `${prefix}_${sha256(content).slice(0, 16)}`;
11
+ }
12
+ //#endregion
13
+ export { slugify as n, stableId as r, sha256 as t };
14
+
15
+ //# sourceMappingURL=ids-DRqPZ42_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids-DRqPZ42_.js","names":[],"sources":["../src/ids.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\n\nexport function sha256(text: string): string {\n return createHash('sha256').update(text).digest('hex')\n}\n\nexport function slugify(input: string): string {\n const out = input\n .trim()\n .toLowerCase()\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9\\u4e00-\\u9fff]+/g, '-')\n .replace(/^-+|-+$/g, '')\n return out || 'untitled'\n}\n\nexport function stableId(prefix: string, content: string): string {\n return `${prefix}_${sha256(content).slice(0, 16)}`\n}\n"],"mappings":";;AAEA,SAAgB,OAAO,MAAsB;CAC3C,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK;AACvD;AAEA,SAAgB,QAAQ,OAAuB;CAQ7C,OAPY,MACT,KAAK,CAAC,CACN,YAAY,CAAC,CACb,UAAU,MAAM,CAAC,CACjB,QAAQ,oBAAoB,EAAE,CAAC,CAC/B,QAAQ,4BAA4B,GAAG,CAAC,CACxC,QAAQ,YAAY,EACd,KAAK;AAChB;AAEA,SAAgB,SAAS,QAAgB,SAAyB;CAChE,OAAO,GAAG,OAAO,GAAG,OAAO,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE;AACjD"}