@devflow-tools/cli 0.15.0 → 0.16.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 (95) hide show
  1. package/dist/commands/benchmark-cmd.d.ts +17 -4
  2. package/dist/commands/benchmark-cmd.d.ts.map +1 -1
  3. package/dist/commands/benchmark-cmd.js +71 -14
  4. package/dist/commands/benchmark-cmd.js.map +1 -1
  5. package/dist/commands/connect.d.ts +0 -1
  6. package/dist/commands/connect.d.ts.map +1 -1
  7. package/dist/commands/connect.js +4 -10
  8. package/dist/commands/connect.js.map +1 -1
  9. package/dist/commands/context.d.ts +2 -2
  10. package/dist/commands/context.d.ts.map +1 -1
  11. package/dist/commands/context.js +5 -3
  12. package/dist/commands/context.js.map +1 -1
  13. package/dist/commands/db.d.ts +25 -0
  14. package/dist/commands/db.d.ts.map +1 -0
  15. package/dist/commands/db.js +258 -0
  16. package/dist/commands/db.js.map +1 -0
  17. package/dist/commands/docs.d.ts +20 -0
  18. package/dist/commands/docs.d.ts.map +1 -0
  19. package/dist/commands/docs.js +37 -0
  20. package/dist/commands/docs.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +59 -1
  22. package/dist/commands/doctor.d.ts.map +1 -1
  23. package/dist/commands/doctor.js +3912 -50
  24. package/dist/commands/doctor.js.map +1 -1
  25. package/dist/commands/index-cmd.d.ts +1 -0
  26. package/dist/commands/index-cmd.d.ts.map +1 -1
  27. package/dist/commands/index-cmd.js +7 -0
  28. package/dist/commands/index-cmd.js.map +1 -1
  29. package/dist/commands/init.d.ts.map +1 -1
  30. package/dist/commands/init.js +3 -6
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/knowledge.d.ts +2 -1
  33. package/dist/commands/knowledge.d.ts.map +1 -1
  34. package/dist/commands/knowledge.js +11 -8
  35. package/dist/commands/knowledge.js.map +1 -1
  36. package/dist/commands/memory.d.ts +17 -1
  37. package/dist/commands/memory.d.ts.map +1 -1
  38. package/dist/commands/memory.js +22 -3
  39. package/dist/commands/memory.js.map +1 -1
  40. package/dist/commands/plugin-loader.d.ts +1 -1
  41. package/dist/commands/plugin-loader.d.ts.map +1 -1
  42. package/dist/commands/plugin-loader.js +1 -1
  43. package/dist/commands/plugin-loader.js.map +1 -1
  44. package/dist/commands/plugin-memory-hints.d.ts +23 -0
  45. package/dist/commands/plugin-memory-hints.d.ts.map +1 -0
  46. package/dist/commands/plugin-memory-hints.js +58 -0
  47. package/dist/commands/plugin-memory-hints.js.map +1 -0
  48. package/dist/commands/reset.d.ts +32 -0
  49. package/dist/commands/reset.d.ts.map +1 -0
  50. package/dist/commands/reset.js +316 -0
  51. package/dist/commands/reset.js.map +1 -0
  52. package/dist/commands/session.d.ts.map +1 -1
  53. package/dist/commands/session.js +2 -1
  54. package/dist/commands/session.js.map +1 -1
  55. package/dist/commands/status.d.ts.map +1 -1
  56. package/dist/commands/status.js +33 -6
  57. package/dist/commands/status.js.map +1 -1
  58. package/dist/index.js +225 -96
  59. package/dist/index.js.map +1 -1
  60. package/dist/lib/plugin-setup.d.ts.map +1 -1
  61. package/dist/lib/plugin-setup.js +37 -2
  62. package/dist/lib/plugin-setup.js.map +1 -1
  63. package/dist/plugin-files/.claude-plugin/plugin.json +1 -1
  64. package/dist/plugin-files/dist/command-registry.json +34 -36
  65. package/dist/plugin-files/dist/hooks/enforcer-summary.js +6 -0
  66. package/dist/plugin-files/dist/hooks/hook-client.js +6 -0
  67. package/dist/plugin-files/dist/hooks/hook-daemon.js +14 -0
  68. package/dist/plugin-files/dist/hooks/post-tool-use-failure.js +2 -0
  69. package/dist/plugin-files/dist/hooks/post-tool-use.js +3 -0
  70. package/dist/plugin-files/dist/hooks/pre-compact.js +3 -0
  71. package/dist/plugin-files/dist/hooks/pre-tool-use.js +2 -0
  72. package/dist/plugin-files/dist/hooks/server-bootstrap.js +109 -0
  73. package/dist/plugin-files/dist/hooks/session-end.js +2 -0
  74. package/dist/plugin-files/dist/hooks/stop.js +2 -0
  75. package/dist/plugin-files/dist/hooks/user-prompt-submit.js +2 -0
  76. package/dist/plugin-files/dist/skills/devflow:graphql/SKILL.md +2 -4
  77. package/dist/plugin-files/dist/skills/devflow:nest/SKILL.md +4 -4
  78. package/dist/plugin-files/dist/skills/devflow:nextjs/SKILL.md +4 -4
  79. package/dist/plugin-files/dist/skills/devflow:react/SKILL.md +6 -8
  80. package/dist/plugin-files/dist/skills/devflow:tailwind/SKILL.md +4 -2
  81. package/dist/plugin-files/dist/skills/devflow:vue/SKILL.md +2 -4
  82. package/dist/plugin-files/hooks/post-tool-use +2 -2
  83. package/dist/plugin-files/hooks/post-tool-use-failure +2 -2
  84. package/dist/plugin-files/hooks/pre-compact +2 -2
  85. package/dist/plugin-files/hooks/pre-tool-use +4 -4
  86. package/dist/plugin-files/hooks/session-end +2 -2
  87. package/dist/plugin-files/hooks/session-start +160 -77
  88. package/dist/plugin-files/hooks/stop +2 -8
  89. package/dist/plugin-files/hooks/user-prompt-submit +2 -2
  90. package/dist/plugin-files/package.json +13 -2
  91. package/package.json +27 -27
  92. package/dist/commands/dashboard.d.ts +0 -3
  93. package/dist/commands/dashboard.d.ts.map +0 -1
  94. package/dist/commands/dashboard.js +0 -10
  95. package/dist/commands/dashboard.js.map +0 -1
@@ -1,5 +1,18 @@
1
- export declare function runBenchmark(_target: string, _opts: {
2
- iterations?: number;
3
- output?: string;
4
- }): Promise<string>;
1
+ import { type BenchmarkReportFormat } from "@devflow-tools/benchmark";
2
+ import { type DevFlowDatabase } from "@devflow-tools/database";
3
+ export interface RunBenchmarkOptions {
4
+ projectRoot: string;
5
+ suite?: string;
6
+ rounds?: number;
7
+ output?: "text" | "json";
8
+ database?: DevFlowDatabase;
9
+ }
10
+ export interface ReportBenchmarkOptions {
11
+ runId?: string;
12
+ baselineRunId?: string;
13
+ output?: BenchmarkReportFormat;
14
+ database?: DevFlowDatabase;
15
+ }
16
+ export declare function runBenchmarkCommand(options: RunBenchmarkOptions): Promise<string>;
17
+ export declare function reportBenchmarkCommand(options?: ReportBenchmarkOptions): Promise<string>;
5
18
  //# sourceMappingURL=benchmark-cmd.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/benchmark-cmd.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
1
+ {"version":3,"file":"benchmark-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/benchmark-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -1,18 +1,75 @@
1
- import { BenchmarkEngine } from "@devflow-tools/benchmark";
2
- import chalk from "chalk";
3
- export async function runBenchmark(_target, _opts) {
1
+ import { BenchmarkEngine, getBenchmarkSuite, renderBenchmarkReport, } from "@devflow-tools/benchmark";
2
+ import { getGlobalDevFlowDbPath, openGlobalDevFlowDatabase, } from "@devflow-tools/database";
3
+ export async function runBenchmarkCommand(options) {
4
+ const suiteId = options.suite ?? "default";
5
+ const suite = getBenchmarkSuite(suiteId);
6
+ if (!suite)
7
+ throw new Error(`Unknown benchmark suite "${suiteId}"`);
4
8
  const engine = new BenchmarkEngine();
5
- const tasks = engine.getTasks();
6
- const lines = [
7
- chalk.blue("◉ DevFlow Benchmark"),
8
- "───────────────────────────────",
9
- `Available tasks: ${tasks.length}`,
10
- "",
11
- "Benchmark requires a real runner implementation.",
12
- "No fake data or estimated scores are shown.",
13
- "",
14
- "Setup: devflow benchmark --runner <path-to-runner>",
9
+ const report = await engine.runSuite(options.projectRoot, suite, {
10
+ rounds: options.rounds,
11
+ });
12
+ const database = options.database ?? openGlobalDevFlowDatabase();
13
+ try {
14
+ database.insertBenchmarkReport(report);
15
+ }
16
+ finally {
17
+ if (!options.database)
18
+ database.close();
19
+ }
20
+ const rendered = renderBenchmarkReport(report, options.output ?? "text");
21
+ if (options.output === "json")
22
+ return rendered;
23
+ return `${rendered}\n\nStored: ${getGlobalDevFlowDbPath()} (${report.runId})`;
24
+ }
25
+ export async function reportBenchmarkCommand(options = {}) {
26
+ const database = options.database ?? openGlobalDevFlowDatabase();
27
+ let report;
28
+ let baseline = null;
29
+ try {
30
+ report = options.runId
31
+ ? database.getBenchmarkReport(options.runId)
32
+ : database.getLatestBenchmarkReport();
33
+ if (options.baselineRunId) {
34
+ baseline = database.getBenchmarkReport(options.baselineRunId);
35
+ }
36
+ }
37
+ finally {
38
+ if (!options.database)
39
+ database.close();
40
+ }
41
+ if (!report) {
42
+ throw new Error(options.runId
43
+ ? `Benchmark report "${options.runId}" not found`
44
+ : "No benchmark reports found. Run `devflow benchmark run` first.");
45
+ }
46
+ if (options.baselineRunId && !baseline) {
47
+ throw new Error(`Benchmark baseline "${options.baselineRunId}" not found`);
48
+ }
49
+ const format = options.output ?? "text";
50
+ const rendered = renderBenchmarkReport(report, format);
51
+ if (!baseline || format === "json")
52
+ return rendered;
53
+ const comparison = compareReports(baseline, report);
54
+ if (format === "markdown") {
55
+ return `${rendered}\n## Change From Prior Baseline\n\n${comparison.map((line) => `- ${line}`).join("\n")}\n`;
56
+ }
57
+ return `${rendered}\n\nChange from ${baseline.runId}:\n${comparison.map((line) => `- ${line}`).join("\n")}`;
58
+ }
59
+ function compareReports(baseline, candidate) {
60
+ const before = baseline.summary.devflow;
61
+ const after = candidate.summary.devflow;
62
+ return [
63
+ formatChange("tokensUsed", before.avgTokensUsed, after.avgTokensUsed, false),
64
+ formatChange("filesTouched", before.avgFilesTouched, after.avgFilesTouched, false),
65
+ formatChange("correctnessScore", before.avgCorrectnessScore, after.avgCorrectnessScore, true),
66
+ formatChange("durationMs", before.avgDurationMs, after.avgDurationMs, false),
15
67
  ];
16
- return lines.join("\n");
68
+ }
69
+ function formatChange(metric, baseline, candidate, higherIsBetter) {
70
+ const change = baseline > 0 ? (candidate - baseline) / baseline : 0;
71
+ const regressed = higherIsBetter ? change < -0.1 : change > 0.1;
72
+ const sign = change > 0 ? "+" : "";
73
+ return `${metric}: ${sign}${(change * 100).toFixed(1)}%${regressed ? " (regression >10%)" : ""}`;
17
74
  }
18
75
  //# sourceMappingURL=benchmark-cmd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark-cmd.js","sourceRoot":"","sources":["../../src/commands/benchmark-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,KAA+C;IAE/C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG;QACZ,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;QACjC,iCAAiC;QACjC,oBAAoB,KAAK,CAAC,MAAM,EAAE;QAClC,EAAE;QACF,kDAAkD;QAClD,6CAA6C;QAC7C,EAAE;QACF,oDAAoD;KACrD,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"benchmark-cmd.js","sourceRoot":"","sources":["../../src/commands/benchmark-cmd.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  export interface ConnectOptions {
2
2
  agent?: string;
3
3
  command?: string;
4
- sseUrl?: string;
5
4
  }
6
5
  export declare function connectAgent(options: ConnectOptions): Promise<string[]>;
7
6
  export declare function getAvailableAgents(): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuB7E;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB7E;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -1,16 +1,10 @@
1
1
  import { connect, listAdapters } from "@devflow-tools/adapters";
2
2
  export async function connectAgent(options) {
3
3
  const results = [];
4
- let connectionConfig;
5
- if (options.sseUrl) {
6
- connectionConfig = { url: options.sseUrl };
7
- }
8
- else {
9
- connectionConfig = {
10
- command: options.command ?? "devflow-mcp",
11
- args: ["--mode", "stdio"],
12
- };
13
- }
4
+ const connectionConfig = {
5
+ command: options.command ?? "devflow-mcp",
6
+ args: ["--mode", "stdio"],
7
+ };
14
8
  const targets = options.agent
15
9
  ? [options.agent]
16
10
  : await import("@devflow-tools/adapters").then((m) => m.detectAll());
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAShE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,gBAAkC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,gBAAgB,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,gBAAgB,GAAG;YACjB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,aAAa;YACzC,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK;QAC3B,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACjB,CAAC,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAQhE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,gBAAgB,GAAqB;QACzC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,aAAa;QACzC,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC1B,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK;QAC3B,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACjB,CAAC,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { TaskContextResult } from "@devflow-tools/sdk";
1
+ import type { GetProjectContextResult } from "@devflow-tools/sdk";
2
2
  export interface ContextOptions {
3
3
  query: string;
4
4
  mode?: "fast" | "deep";
@@ -11,5 +11,5 @@ export interface ContextResult {
11
11
  tokenCount: number;
12
12
  }
13
13
  export declare function getContext(options: ContextOptions): Promise<ContextResult>;
14
- export declare function getTaskContext(options: ContextOptions): Promise<TaskContextResult>;
14
+ export declare function getTaskContext(options: ContextOptions): Promise<GetProjectContextResult>;
15
15
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAchF;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAexF"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAchF;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAiB9F"}
@@ -1,5 +1,5 @@
1
1
  import { withServer } from "../lib/with-server.js";
2
- import { createEngines } from "@devflow-tools/context-engine";
2
+ import { createEngines, getProjectContextResult } from "@devflow-tools/context-engine";
3
3
  export async function getContext(options) {
4
4
  return withServer(process.cwd(), (client) => client.buildContext(options.query, options.mode ?? "fast", options.maxTokens), async () => {
5
5
  const { context } = await createEngines(process.cwd());
@@ -17,8 +17,10 @@ export async function getTaskContext(options) {
17
17
  maxTokens: options.maxTokens ?? 8000,
18
18
  };
19
19
  return withServer(rootPath, (client) => client.buildTaskContext(options.query, rootPath, taskOptions), async () => {
20
- const { context } = await createEngines(rootPath);
21
- return context.buildTaskContext(options.query, taskOptions);
20
+ const { context, codegraph } = await createEngines(rootPath);
21
+ const lastUpdated = codegraph.getStats().lastUpdated;
22
+ const freshnessMs = lastUpdated > 0 ? Date.now() - lastUpdated : 0;
23
+ return getProjectContextResult(context, { query: options.query, ...taskOptions }, freshnessMs);
22
24
  }, { skipServer: options.skipServer });
23
25
  }
24
26
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA0B,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAgB9D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB;IACtD,OAAO,UAAU,CACf,OAAO,CAAC,GAAG,EAAE,EACb,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EACzF,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,OAAO,CAAC,KAAK,CAAC;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;SACrC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;KACrC,CAAC;IACF,OAAO,UAAU,CACf,QAAQ,EACR,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,EACzE,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC,EACD,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CACnC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA0B,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAgBvF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB;IACtD,OAAO,UAAU,CACf,OAAO,CAAC,GAAG,EAAE,EACb,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EACzF,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,OAAO,CAAC,KAAK,CAAC;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;SACrC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;KACrC,CAAC;IACF,OAAO,UAAU,CACf,QAAQ,EACR,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,EACzE,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC;QACrD,MAAM,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,uBAAuB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;IACjG,CAAC,EACD,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface ConsolidateOptions {
2
+ project: string;
3
+ dryRun?: boolean;
4
+ globalDbPath?: string;
5
+ backupRoot?: string;
6
+ now?: number;
7
+ }
8
+ export interface ConsolidateSourceReport {
9
+ kind: 'project' | 'codegraph';
10
+ path: string;
11
+ exists: boolean;
12
+ tables: Record<string, number>;
13
+ conflicts: Record<string, number>;
14
+ }
15
+ export interface ConsolidateResult {
16
+ dryRun: boolean;
17
+ targetPath: string;
18
+ sources: ConsolidateSourceReport[];
19
+ inserted: Record<string, number>;
20
+ backupDir?: string;
21
+ retired: string[];
22
+ }
23
+ export declare function consolidateDatabases(options: ConsolidateOptions): ConsolidateResult;
24
+ export declare function formatConsolidateResult(result: ConsolidateResult): string[];
25
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,GAAG,WAAW,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA2FnF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAe3E"}
@@ -0,0 +1,258 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { existsSync, mkdirSync, renameSync, } from 'node:fs';
3
+ import { basename, dirname, join, resolve } from 'node:path';
4
+ import { DevFlowDatabase, getGlobalDevFlowDbPath } from '@devflow-tools/database';
5
+ import { DEVFLOW_SCHEMA_SQL, DEVFLOW_TABLE_NAMES } from '@devflow-tools/sdk';
6
+ const OMIT_NUMERIC_PRIMARY_KEY = new Set([
7
+ 'run_steps',
8
+ 'telemetry_events',
9
+ 'devflow_tool_calls',
10
+ 'devflow_audit_chain',
11
+ ]);
12
+ export function consolidateDatabases(options) {
13
+ const project = resolve(options.project);
14
+ const targetPath = options.globalDbPath ?? getGlobalDevFlowDbPath();
15
+ const projectDbPath = join(project, '.devflow', 'devflow.db');
16
+ const codegraphDbPath = join(project, '.codegraph', 'codegraph.db');
17
+ if (resolve(targetPath) === resolve(projectDbPath)) {
18
+ throw new Error('The global target database cannot be the project-local legacy database');
19
+ }
20
+ const targetExists = existsSync(targetPath);
21
+ const sources = [
22
+ inspectSource('project', projectDbPath, targetExists ? targetPath : undefined),
23
+ inspectSource('codegraph', codegraphDbPath, targetExists ? targetPath : undefined),
24
+ ];
25
+ const result = {
26
+ dryRun: Boolean(options.dryRun),
27
+ targetPath,
28
+ sources,
29
+ inserted: {},
30
+ retired: [],
31
+ };
32
+ if (options.dryRun)
33
+ return result;
34
+ const existingSources = sources.filter(source => source.exists && Object.keys(source.tables).length > 0);
35
+ const timestamp = new Date(options.now ?? Date.now()).toISOString().replace(/[:.]/g, '-');
36
+ const defaultBackupBase = basename(dirname(targetPath)) === 'global'
37
+ ? join(dirname(dirname(targetPath)), 'backup')
38
+ : join(dirname(targetPath), 'backup');
39
+ const backupDir = join(options.backupRoot ?? defaultBackupBase, timestamp);
40
+ mkdirSync(backupDir, { recursive: true });
41
+ result.backupDir = backupDir;
42
+ const projectLock = existingSources.some(source => source.kind === 'project')
43
+ ? acquireMigrationLock(projectDbPath)
44
+ : null;
45
+ try {
46
+ const snapshots = new Map();
47
+ for (const source of existingSources) {
48
+ const snapshot = join(backupDir, `${source.kind}-${basename(source.path)}.snapshot`);
49
+ snapshotDatabase(source.path, snapshot);
50
+ snapshots.set(source.kind, snapshot);
51
+ }
52
+ if (targetExists)
53
+ snapshotDatabase(targetPath, join(backupDir, 'global-devflow.db.before'));
54
+ const retiredProjectFiles = snapshots.has('project')
55
+ ? retireProjectDatabase(projectDbPath, backupDir)
56
+ : [];
57
+ result.retired.push(...retiredProjectFiles.map(item => item.destination));
58
+ let target = null;
59
+ let transactionStarted = false;
60
+ try {
61
+ const canonical = new DevFlowDatabase(project, { dbPath: targetPath });
62
+ canonical.close();
63
+ target = new DatabaseSync(targetPath);
64
+ target.exec('PRAGMA busy_timeout = 10000');
65
+ target.exec(DEVFLOW_SCHEMA_SQL);
66
+ if (snapshots.has('project')) {
67
+ target.prepare('ATTACH DATABASE ? AS project_source').run(snapshots.get('project'));
68
+ }
69
+ if (snapshots.has('codegraph')) {
70
+ target.prepare('ATTACH DATABASE ? AS codegraph_source').run(codegraphDbPath);
71
+ }
72
+ target.exec('BEGIN IMMEDIATE');
73
+ transactionStarted = true;
74
+ if (snapshots.has('project')) {
75
+ mergeSchema(target, 'project_source', undefined, result.inserted);
76
+ }
77
+ if (snapshots.has('codegraph')) {
78
+ mergeSchema(target, 'codegraph_source', new Set(DEVFLOW_TABLE_NAMES), result.inserted);
79
+ for (const table of listTables(target, 'codegraph_source').filter(name => name.startsWith('devflow_'))) {
80
+ target.exec(`DROP TABLE codegraph_source.${identifier(table)}`);
81
+ }
82
+ }
83
+ target.exec('COMMIT');
84
+ transactionStarted = false;
85
+ }
86
+ catch (error) {
87
+ if (transactionStarted) {
88
+ try {
89
+ target?.exec('ROLLBACK');
90
+ }
91
+ catch { }
92
+ }
93
+ restoreRetiredProjectDatabase(retiredProjectFiles);
94
+ throw error;
95
+ }
96
+ finally {
97
+ target?.close();
98
+ }
99
+ return result;
100
+ }
101
+ finally {
102
+ releaseMigrationLock(projectLock);
103
+ }
104
+ }
105
+ export function formatConsolidateResult(result) {
106
+ const lines = [
107
+ `${result.dryRun ? 'Dry run' : 'Consolidated'} target: ${result.targetPath}`,
108
+ ];
109
+ for (const source of result.sources) {
110
+ const rows = Object.values(source.tables).reduce((sum, count) => sum + count, 0);
111
+ const conflicts = Object.values(source.conflicts).reduce((sum, count) => sum + count, 0);
112
+ lines.push(`${source.kind}: ${source.exists ? `${rows} rows, ${conflicts} conflicts` : 'not found'} (${source.path})`);
113
+ }
114
+ if (!result.dryRun) {
115
+ const inserted = Object.values(result.inserted).reduce((sum, count) => sum + count, 0);
116
+ lines.push(`Inserted: ${inserted} rows`);
117
+ if (result.backupDir)
118
+ lines.push(`Backup: ${result.backupDir}`);
119
+ }
120
+ return lines;
121
+ }
122
+ function inspectSource(kind, path, targetPath) {
123
+ const report = { kind, path, exists: existsSync(path), tables: {}, conflicts: {} };
124
+ if (!report.exists)
125
+ return report;
126
+ const source = new DatabaseSync(path, { readOnly: true });
127
+ const target = targetPath && existsSync(targetPath)
128
+ ? new DatabaseSync(targetPath, { readOnly: true })
129
+ : null;
130
+ try {
131
+ const allowed = kind === 'codegraph' ? new Set(DEVFLOW_TABLE_NAMES) : null;
132
+ for (const table of listTables(source).filter(name => !allowed || allowed.has(name))) {
133
+ report.tables[table] = countRows(source, table);
134
+ report.conflicts[table] = target && listTables(target).includes(table)
135
+ ? countNaturalKeyConflicts(source, target, table)
136
+ : 0;
137
+ }
138
+ }
139
+ finally {
140
+ source.close();
141
+ target?.close();
142
+ }
143
+ return report;
144
+ }
145
+ function snapshotDatabase(source, destination) {
146
+ mkdirSync(dirname(destination), { recursive: true });
147
+ const db = new DatabaseSync(source, { readOnly: true, timeout: 10_000 });
148
+ try {
149
+ db.prepare('VACUUM INTO ?').run(destination);
150
+ }
151
+ finally {
152
+ db.close();
153
+ }
154
+ }
155
+ function acquireMigrationLock(path) {
156
+ const db = new DatabaseSync(path);
157
+ db.exec('PRAGMA busy_timeout = 1000');
158
+ try {
159
+ db.exec('BEGIN IMMEDIATE');
160
+ return db;
161
+ }
162
+ catch (error) {
163
+ db.close();
164
+ throw new Error(`Cannot lock legacy database for migration: ${error.message}`);
165
+ }
166
+ }
167
+ function releaseMigrationLock(db) {
168
+ if (!db)
169
+ return;
170
+ try {
171
+ db.exec('ROLLBACK');
172
+ }
173
+ catch { }
174
+ db.close();
175
+ }
176
+ function retireProjectDatabase(path, backupDir) {
177
+ const retired = [];
178
+ try {
179
+ for (const suffix of ['', '-wal', '-shm']) {
180
+ const source = `${path}${suffix}`;
181
+ if (!existsSync(source))
182
+ continue;
183
+ const destination = join(backupDir, `project-devflow.db.retired${suffix}`);
184
+ renameSync(source, destination);
185
+ retired.push({ source, destination });
186
+ }
187
+ }
188
+ catch (error) {
189
+ restoreRetiredProjectDatabase(retired);
190
+ throw error;
191
+ }
192
+ return retired;
193
+ }
194
+ function restoreRetiredProjectDatabase(retired) {
195
+ for (const item of retired.reverse()) {
196
+ if (existsSync(item.destination) && !existsSync(item.source))
197
+ renameSync(item.destination, item.source);
198
+ }
199
+ }
200
+ function mergeSchema(db, sourceSchema, allowedTables, inserted) {
201
+ const targetTables = new Set(listTables(db));
202
+ const sourceTables = listTables(db, sourceSchema)
203
+ .filter(table => targetTables.has(table) && (!allowedTables || allowedTables.has(table)));
204
+ for (const table of sourceTables) {
205
+ const targetColumns = tableInfo(db, 'main', table);
206
+ const sourceColumnNames = new Set(tableInfo(db, sourceSchema, table).map(column => column.name));
207
+ let columns = targetColumns.filter(column => sourceColumnNames.has(column.name));
208
+ if (OMIT_NUMERIC_PRIMARY_KEY.has(table))
209
+ columns = columns.filter(column => column.pk === 0);
210
+ if (columns.length === 0)
211
+ continue;
212
+ const before = countRows(db, table);
213
+ const columnSql = columns.map(column => identifier(column.name)).join(', ');
214
+ const sourceSql = columns.map(column => `s.${identifier(column.name)}`).join(', ');
215
+ const primaryKeys = columns.filter(column => column.pk > 0);
216
+ if (primaryKeys.length > 0 && !OMIT_NUMERIC_PRIMARY_KEY.has(table)) {
217
+ db.exec(`INSERT OR IGNORE INTO main.${identifier(table)} (${columnSql}) SELECT ${sourceSql} FROM ${identifier(sourceSchema)}.${identifier(table)} s`);
218
+ }
219
+ else {
220
+ const equality = columns.map(column => `t.${identifier(column.name)} IS s.${identifier(column.name)}`).join(' AND ');
221
+ db.exec(`
222
+ INSERT INTO main.${identifier(table)} (${columnSql})
223
+ SELECT ${sourceSql} FROM ${identifier(sourceSchema)}.${identifier(table)} s
224
+ WHERE NOT EXISTS (SELECT 1 FROM main.${identifier(table)} t WHERE ${equality})
225
+ `);
226
+ }
227
+ inserted[table] = (inserted[table] ?? 0) + (countRows(db, table) - before);
228
+ }
229
+ }
230
+ function countNaturalKeyConflicts(source, target, table) {
231
+ const targetColumns = new Set(tableInfo(target, 'main', table).map(column => column.name));
232
+ const primaryKeys = tableInfo(source, 'main', table)
233
+ .filter(column => column.pk > 0 && targetColumns.has(column.name));
234
+ if (primaryKeys.length === 0 || OMIT_NUMERIC_PRIMARY_KEY.has(table))
235
+ return 0;
236
+ const columns = primaryKeys.map(column => identifier(column.name));
237
+ const rows = source.prepare(`SELECT ${columns.join(', ')} FROM ${identifier(table)}`).all();
238
+ const where = primaryKeys.map(column => `${identifier(column.name)} IS ?`).join(' AND ');
239
+ const find = target.prepare(`SELECT 1 found FROM ${identifier(table)} WHERE ${where} LIMIT 1`);
240
+ return rows.reduce((count, row) => count + (find.get(...primaryKeys.map(column => row[column.name])) ? 1 : 0), 0);
241
+ }
242
+ function listTables(db, schema = 'main') {
243
+ const rows = db.prepare(`SELECT name FROM ${identifier(schema)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all();
244
+ return rows.map(row => row.name);
245
+ }
246
+ function tableInfo(db, schema, table) {
247
+ return db.prepare(`PRAGMA ${identifier(schema)}.table_info(${identifier(table)})`).all();
248
+ }
249
+ function countRows(db, table) {
250
+ const row = db.prepare(`SELECT COUNT(*) count FROM ${identifier(table)}`).get();
251
+ return Number(row.count);
252
+ }
253
+ function identifier(value) {
254
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(value))
255
+ throw new Error(`Unsafe SQLite identifier: ${value}`);
256
+ return `"${value}"`;
257
+ }
258
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { KnowledgeEngine } from '@devflow-tools/knowledge-engine';
2
+ export declare function resyncKnowledgeDocs(options: {
3
+ projectRoot?: string;
4
+ source?: string;
5
+ withHeadings?: boolean;
6
+ }): Promise<Awaited<ReturnType<KnowledgeEngine['syncDocs']>>>;
7
+ export declare function backfillKnowledgeVectors(options?: {
8
+ projectRoot?: string;
9
+ source?: string;
10
+ batchSize?: number;
11
+ onProgress?: (progress: {
12
+ processed: number;
13
+ remaining: number;
14
+ lastId?: string;
15
+ }) => void;
16
+ }): Promise<{
17
+ processed: number;
18
+ remaining: number;
19
+ }>;
20
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAkBlE,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAa5D;AAED,wBAAsB,wBAAwB,CAAC,OAAO,GAAE;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACvF,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAWzD"}
@@ -0,0 +1,37 @@
1
+ import { KnowledgeEngine } from '@devflow-tools/knowledge-engine';
2
+ import { EmbeddingProvider } from '@devflow-tools/memory-engine';
3
+ function createKnowledgeEngine(projectRoot) {
4
+ return new KnowledgeEngine({
5
+ projectRoot,
6
+ embedder: new EmbeddingProvider(),
7
+ });
8
+ }
9
+ export async function resyncKnowledgeDocs(options) {
10
+ if (!options.withHeadings) {
11
+ throw new Error('Knowledge resync requires --with-headings');
12
+ }
13
+ const engine = createKnowledgeEngine(options.projectRoot ?? process.cwd());
14
+ try {
15
+ return await engine.syncDocs(options.source, {
16
+ withHeadings: true,
17
+ deferVectorBackfill: true,
18
+ });
19
+ }
20
+ finally {
21
+ engine.close();
22
+ }
23
+ }
24
+ export async function backfillKnowledgeVectors(options = {}) {
25
+ const engine = createKnowledgeEngine(options.projectRoot ?? process.cwd());
26
+ try {
27
+ return await engine.backfillVectors({
28
+ source: options.source,
29
+ batchSize: options.batchSize,
30
+ onProgress: options.onProgress,
31
+ });
32
+ }
33
+ finally {
34
+ engine.close();
35
+ }
36
+ }
37
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAUjE,SAAS,qBAAqB,CAAC,WAAmB;IAChD,OAAO,IAAI,eAAe,CAAC;QACzB,WAAW;QACX,QAAQ,EAAE,IAAI,iBAAiB,EAAE;KAClC,CAAuB,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAIzC;IACC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;YAC3C,YAAY,EAAE,IAAI;YAClB,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,UAK3C,EAAE;IACJ,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,eAAe,CAAC;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}