@codified/cli 0.3.5 → 0.3.6

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 (105) hide show
  1. package/dist/commands/add.d.ts +3 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +163 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/bootstrap.d.ts.map +1 -0
  6. package/dist/commands/bootstrap.js +141 -0
  7. package/dist/commands/bootstrap.js.map +1 -0
  8. package/dist/commands/check.d.ts +3 -0
  9. package/dist/commands/check.d.ts.map +1 -0
  10. package/dist/commands/check.js +332 -0
  11. package/dist/commands/check.js.map +1 -0
  12. package/dist/commands/cleanup.d.ts +3 -0
  13. package/dist/commands/cleanup.d.ts.map +1 -0
  14. package/dist/commands/cleanup.js +166 -0
  15. package/dist/commands/cleanup.js.map +1 -0
  16. package/dist/commands/collect.d.ts +26 -0
  17. package/dist/commands/collect.d.ts.map +1 -0
  18. package/dist/commands/collect.js +269 -0
  19. package/dist/commands/collect.js.map +1 -0
  20. package/dist/commands/connect.d.ts +3 -0
  21. package/dist/commands/connect.d.ts.map +1 -0
  22. package/dist/commands/connect.js +321 -0
  23. package/dist/commands/connect.js.map +1 -0
  24. package/dist/commands/explain.d.ts +3 -0
  25. package/dist/commands/explain.d.ts.map +1 -0
  26. package/dist/commands/explain.js +527 -0
  27. package/dist/commands/explain.js.map +1 -0
  28. package/dist/commands/export.d.ts +3 -0
  29. package/dist/commands/export.d.ts.map +1 -0
  30. package/dist/commands/export.js +59 -0
  31. package/dist/commands/export.js.map +1 -0
  32. package/dist/commands/gaps.d.ts +3 -0
  33. package/dist/commands/gaps.d.ts.map +1 -0
  34. package/dist/commands/gaps.js +315 -0
  35. package/dist/commands/gaps.js.map +1 -0
  36. package/dist/commands/graph.d.ts +3 -0
  37. package/dist/commands/graph.d.ts.map +1 -0
  38. package/dist/commands/graph.js +293 -0
  39. package/dist/commands/graph.js.map +1 -0
  40. package/dist/commands/import-cmd.d.ts +3 -0
  41. package/dist/commands/import-cmd.d.ts.map +1 -0
  42. package/dist/commands/import-cmd.js +199 -0
  43. package/dist/commands/import-cmd.js.map +1 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +215 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/project.d.ts +3 -0
  48. package/dist/commands/project.d.ts.map +1 -0
  49. package/dist/commands/project.js +179 -0
  50. package/dist/commands/project.js.map +1 -0
  51. package/dist/commands/reset.d.ts +3 -0
  52. package/dist/commands/reset.d.ts.map +1 -0
  53. package/dist/commands/reset.js +157 -0
  54. package/dist/commands/reset.js.map +1 -0
  55. package/dist/commands/search.d.ts +3 -0
  56. package/dist/commands/search.d.ts.map +1 -0
  57. package/dist/commands/search.js +183 -0
  58. package/dist/commands/search.js.map +1 -0
  59. package/dist/commands/start.d.ts.map +1 -0
  60. package/dist/commands/start.js +205 -0
  61. package/dist/commands/start.js.map +1 -0
  62. package/dist/commands/status.d.ts.map +1 -0
  63. package/dist/commands/status.js +242 -0
  64. package/dist/commands/status.js.map +1 -0
  65. package/dist/commands/timeline.d.ts +3 -0
  66. package/dist/commands/timeline.d.ts.map +1 -0
  67. package/dist/commands/timeline.js +424 -0
  68. package/dist/commands/timeline.js.map +1 -0
  69. package/dist/commands/triage.d.ts +3 -0
  70. package/dist/commands/triage.d.ts.map +1 -0
  71. package/dist/commands/triage.js +336 -0
  72. package/dist/commands/triage.js.map +1 -0
  73. package/dist/commands/up.d.ts +3 -0
  74. package/dist/commands/up.d.ts.map +1 -0
  75. package/dist/commands/up.js +312 -0
  76. package/dist/commands/up.js.map +1 -0
  77. package/dist/commands/watch.d.ts +3 -0
  78. package/dist/commands/watch.d.ts.map +1 -0
  79. package/dist/commands/watch.js +224 -0
  80. package/dist/commands/watch.js.map +1 -0
  81. package/dist/index.d.ts +2 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +574 -491
  84. package/dist/index.js.map +1 -0
  85. package/dist/lib/config.d.ts +52 -0
  86. package/dist/lib/config.d.ts.map +1 -0
  87. package/dist/lib/config.js +142 -0
  88. package/dist/lib/config.js.map +1 -0
  89. package/dist/lib/docker.d.ts +23 -0
  90. package/dist/lib/docker.d.ts.map +1 -0
  91. package/dist/lib/docker.js +84 -0
  92. package/dist/lib/docker.js.map +1 -0
  93. package/dist/lib/migrate.d.ts +9 -0
  94. package/dist/lib/migrate.d.ts.map +1 -0
  95. package/dist/lib/migrate.js +97 -0
  96. package/dist/lib/migrate.js.map +1 -0
  97. package/dist/lib/paths.d.ts +9 -0
  98. package/dist/lib/paths.d.ts.map +1 -0
  99. package/dist/lib/paths.js +28 -0
  100. package/dist/lib/paths.js.map +1 -0
  101. package/dist/lib/prompt.d.ts +14 -0
  102. package/dist/lib/prompt.d.ts.map +1 -0
  103. package/dist/lib/prompt.js +87 -0
  104. package/dist/lib/prompt.js.map +1 -0
  105. package/package.json +1 -1
@@ -0,0 +1,332 @@
1
+ // codify check — context check for code review / CI gating
2
+ import { Command } from "commander";
3
+ import { loadProjectConfig } from "../lib/config.js";
4
+ // --- Color helpers (ANSI escape codes) ---
5
+ const RESET = "\x1b[0m";
6
+ const BOLD = "\x1b[1m";
7
+ const DIM = "\x1b[2m";
8
+ const RED = "\x1b[31m";
9
+ const GREEN = "\x1b[32m";
10
+ const YELLOW = "\x1b[33m";
11
+ const CYAN = "\x1b[36m";
12
+ // --- Common path words to filter out ---
13
+ const STOP_WORDS = new Set([
14
+ "src", "lib", "utils", "util", "helpers", "helper",
15
+ "index", "test", "tests", "spec", "specs",
16
+ "dist", "build", "out", "node_modules",
17
+ "components", "pages", "app", "main",
18
+ ]);
19
+ // --- Extract keywords from file paths ---
20
+ function extractKeywords(filePaths) {
21
+ const keywords = new Set();
22
+ for (const filePath of filePaths) {
23
+ // Split on path separators and dots (to remove extensions)
24
+ const parts = filePath
25
+ .replace(/\\/g, "/")
26
+ .split("/")
27
+ .flatMap((segment) => {
28
+ // Remove file extension from last segment
29
+ const withoutExt = segment.replace(/\.[^.]+$/, "");
30
+ // Split camelCase and kebab-case
31
+ return withoutExt
32
+ .split(/[-_]/)
33
+ .flatMap((part) => part.replace(/([a-z])([A-Z])/g, "$1 $2").split(" "))
34
+ .map((w) => w.toLowerCase())
35
+ .filter((w) => w.length > 1);
36
+ });
37
+ for (const part of parts) {
38
+ if (!STOP_WORDS.has(part)) {
39
+ keywords.add(part);
40
+ }
41
+ }
42
+ }
43
+ return [...keywords];
44
+ }
45
+ // --- Severity badge ---
46
+ function severityBadge(severity) {
47
+ switch (severity) {
48
+ case "critical":
49
+ return `${RED}${BOLD}CRITICAL${RESET}`;
50
+ case "high":
51
+ return `${RED}HIGH${RESET}`;
52
+ case "medium":
53
+ return `${YELLOW}MEDIUM${RESET}`;
54
+ case "low":
55
+ return `${CYAN}LOW${RESET}`;
56
+ default:
57
+ return `${DIM}${severity?.toUpperCase() ?? "UNKNOWN"}${RESET}`;
58
+ }
59
+ }
60
+ // --- Command definition ---
61
+ export const checkCommand = new Command("check")
62
+ .description("Check context graph for relevant decisions, gaps, and signals related to files")
63
+ .argument("<files...>", "File paths to check")
64
+ .option("--json", "Output raw JSON for piping")
65
+ .action(async (files, opts) => {
66
+ try {
67
+ await loadProjectConfig();
68
+ const { getPool, closePool } = await import("@codify/graph");
69
+ const pool = getPool();
70
+ try {
71
+ await pool.query("SELECT 1");
72
+ }
73
+ catch {
74
+ console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
75
+ process.exit(1);
76
+ }
77
+ // Extract keywords from file paths
78
+ const keywords = extractKeywords(files);
79
+ if (keywords.length === 0) {
80
+ if (opts.json) {
81
+ console.log(JSON.stringify({
82
+ files,
83
+ keywords: [],
84
+ context: { decisions: [], gaps: [], signals: [], features: [], other: [] },
85
+ exitCode: 0,
86
+ reason: "No keywords extracted from file paths",
87
+ }, null, 2));
88
+ }
89
+ else {
90
+ console.log(`\n ${BOLD}Codify — Context Check${RESET}\n`);
91
+ console.log(` No keywords could be extracted from the provided paths.\n`);
92
+ }
93
+ await closePool();
94
+ process.exit(0);
95
+ }
96
+ // Build ILIKE conditions for keywords
97
+ const conditions = ["superseded_by IS NULL"];
98
+ const params = [];
99
+ let paramIdx = 1;
100
+ const keywordConditions = keywords.map((kw) => {
101
+ params.push(`%${kw}%`);
102
+ const idx = paramIdx++;
103
+ return `(properties::text ILIKE $${idx} OR metadata::text ILIKE $${idx})`;
104
+ });
105
+ // If single keyword, use just one condition; otherwise AND them together
106
+ conditions.push(`(${keywordConditions.join(" AND ")})`);
107
+ const sql = `SELECT id, type, properties, metadata, freshness
108
+ FROM nodes
109
+ WHERE ${conditions.join(" AND ")}
110
+ ORDER BY freshness DESC
111
+ LIMIT 20`;
112
+ const result = await pool.query(sql, params);
113
+ const nodes = result.rows;
114
+ // Group results by type
115
+ const decisions = [];
116
+ const gaps = [];
117
+ const signals = [];
118
+ const features = [];
119
+ const other = [];
120
+ for (const node of nodes) {
121
+ switch (node.type) {
122
+ case "Decision":
123
+ decisions.push(node);
124
+ break;
125
+ case "Gap":
126
+ gaps.push(node);
127
+ break;
128
+ case "CustomerSignal":
129
+ signals.push(node);
130
+ break;
131
+ case "Feature":
132
+ features.push(node);
133
+ break;
134
+ default:
135
+ other.push(node);
136
+ break;
137
+ }
138
+ }
139
+ // Determine exit code: exit 1 if any gap with severity critical/high and status not resolved/wont_fix
140
+ const blockingGaps = gaps.filter((g) => {
141
+ const severity = g.properties.severity ?? "";
142
+ const status = g.properties.status ?? "detected";
143
+ const isHighSeverity = severity === "critical" || severity === "high";
144
+ const isResolved = status === "resolved" || status === "wont_fix";
145
+ return isHighSeverity && !isResolved;
146
+ });
147
+ const exitCode = blockingGaps.length > 0 ? 1 : 0;
148
+ // Build reason string
149
+ let reason = "";
150
+ if (blockingGaps.length > 0) {
151
+ const critCount = blockingGaps.filter((g) => g.properties.severity === "critical").length;
152
+ const highCount = blockingGaps.filter((g) => g.properties.severity === "high").length;
153
+ const parts = [];
154
+ if (critCount > 0)
155
+ parts.push(`${critCount} critical-severity gap${critCount === 1 ? "" : "s"}`);
156
+ if (highCount > 0)
157
+ parts.push(`${highCount} high-severity gap${highCount === 1 ? "" : "s"}`);
158
+ reason = `${parts.join(" and ")} found`;
159
+ }
160
+ else if (nodes.length === 0) {
161
+ reason = "No context found";
162
+ }
163
+ else {
164
+ reason = "No blocking gaps";
165
+ }
166
+ // JSON output mode
167
+ if (opts.json) {
168
+ const getTitle = (n) => n.properties.title ?? n.metadata.title ??
169
+ n.properties.name ?? n.metadata.name ?? n.id;
170
+ console.log(JSON.stringify({
171
+ files,
172
+ keywords,
173
+ context: {
174
+ decisions: decisions.map((n) => ({
175
+ id: n.id,
176
+ title: getTitle(n),
177
+ rationale: n.properties.rationale ?? n.properties.reason ?? null,
178
+ freshness: n.freshness,
179
+ })),
180
+ gaps: gaps.map((n) => ({
181
+ id: n.id,
182
+ title: getTitle(n),
183
+ severity: n.properties.severity ?? "unknown",
184
+ status: n.properties.status ?? "detected",
185
+ freshness: n.freshness,
186
+ })),
187
+ signals: signals.map((n) => ({
188
+ id: n.id,
189
+ title: getTitle(n),
190
+ freshness: n.freshness,
191
+ })),
192
+ features: features.map((n) => ({
193
+ id: n.id,
194
+ title: getTitle(n),
195
+ freshness: n.freshness,
196
+ })),
197
+ other: other.map((n) => ({
198
+ id: n.id,
199
+ type: n.type,
200
+ title: getTitle(n),
201
+ freshness: n.freshness,
202
+ })),
203
+ },
204
+ exitCode,
205
+ reason,
206
+ }, null, 2));
207
+ await closePool();
208
+ process.exit(exitCode);
209
+ }
210
+ // Pretty output
211
+ console.log(`\n ${BOLD}Codify — Context Check${RESET}\n`);
212
+ console.log(` Files: ${CYAN}${files.join(", ")}${RESET}`);
213
+ console.log(` Keywords: ${DIM}${keywords.join(", ")}${RESET}\n`);
214
+ if (nodes.length === 0) {
215
+ console.log(` No context found for ${files.join(", ")}. Run 'codify bootstrap' to populate the graph.\n`);
216
+ await closePool();
217
+ process.exit(0);
218
+ }
219
+ // Render grouped results
220
+ if (decisions.length > 0) {
221
+ console.log(` ${BOLD}Decisions (${decisions.length}):${RESET}`);
222
+ for (const n of decisions) {
223
+ const title = n.properties.title ?? n.metadata.title ?? n.id;
224
+ const freshPct = Math.round((n.freshness ?? 0) * 100);
225
+ console.log(` "${title}" ${DIM}(freshness: ${freshPct}%)${RESET}`);
226
+ }
227
+ console.log("");
228
+ }
229
+ if (gaps.length > 0) {
230
+ // Separate open vs resolved gaps
231
+ const openGaps = gaps.filter((g) => {
232
+ const status = g.properties.status ?? "detected";
233
+ return status !== "resolved" && status !== "wont_fix";
234
+ });
235
+ const resolvedGaps = gaps.filter((g) => {
236
+ const status = g.properties.status ?? "detected";
237
+ return status === "resolved" || status === "wont_fix";
238
+ });
239
+ if (openGaps.length > 0) {
240
+ console.log(` ${BOLD}Open Gaps (${openGaps.length}):${RESET}`);
241
+ for (const n of openGaps) {
242
+ const title = n.properties.title ?? n.metadata.title ?? n.id;
243
+ const severity = n.properties.severity ?? "unknown";
244
+ const isBlocking = severity === "critical" || severity === "high";
245
+ const icon = isBlocking ? `${RED}!${RESET}` : `${YELLOW}*${RESET}`;
246
+ console.log(` ${icon} ${severityBadge(severity)}: "${title}"`);
247
+ }
248
+ console.log("");
249
+ }
250
+ if (resolvedGaps.length > 0) {
251
+ console.log(` ${BOLD}Resolved Gaps (${resolvedGaps.length}):${RESET}`);
252
+ for (const n of resolvedGaps) {
253
+ const title = n.properties.title ?? n.metadata.title ?? n.id;
254
+ const status = n.properties.status ?? "resolved";
255
+ console.log(` ${GREEN}✓${RESET} "${title}" ${DIM}(${status})${RESET}`);
256
+ }
257
+ console.log("");
258
+ }
259
+ }
260
+ if (signals.length > 0) {
261
+ console.log(` ${BOLD}Customer Signals (${signals.length}):${RESET}`);
262
+ for (const n of signals) {
263
+ const title = n.properties.title ?? n.metadata.title ?? n.id;
264
+ console.log(` "${title}"`);
265
+ }
266
+ console.log("");
267
+ }
268
+ if (features.length > 0) {
269
+ console.log(` ${BOLD}Features (${features.length}):${RESET}`);
270
+ for (const n of features) {
271
+ const title = n.properties.title ?? n.metadata.title ?? n.id;
272
+ console.log(` "${title}"`);
273
+ }
274
+ console.log("");
275
+ }
276
+ if (other.length > 0) {
277
+ console.log(` ${BOLD}Other (${other.length}):${RESET}`);
278
+ for (const n of other) {
279
+ const title = n.properties.title ?? n.metadata.title ?? n.id;
280
+ console.log(` [${n.type}] "${title}"`);
281
+ }
282
+ console.log("");
283
+ }
284
+ // Footer summary
285
+ const summaryParts = [];
286
+ if (decisions.length > 0)
287
+ summaryParts.push(`${decisions.length} decision${decisions.length === 1 ? "" : "s"}`);
288
+ if (gaps.length > 0) {
289
+ const openCount = gaps.filter((g) => {
290
+ const status = g.properties.status ?? "detected";
291
+ return status !== "resolved" && status !== "wont_fix";
292
+ }).length;
293
+ if (openCount > 0) {
294
+ const maxSeverity = blockingGaps.length > 0
295
+ ? blockingGaps.some((g) => g.properties.severity === "critical") ? "CRITICAL" : "HIGH"
296
+ : "open";
297
+ summaryParts.push(`${openCount} gap${openCount === 1 ? "" : "s"} (${maxSeverity})`);
298
+ }
299
+ }
300
+ if (signals.length > 0)
301
+ summaryParts.push(`${signals.length} signal${signals.length === 1 ? "" : "s"}`);
302
+ if (features.length > 0)
303
+ summaryParts.push(`${features.length} feature${features.length === 1 ? "" : "s"}`);
304
+ console.log(` ${"─".repeat(35)}`);
305
+ console.log(` ${summaryParts.join(", ")}`);
306
+ if (exitCode === 1) {
307
+ console.log(` Exit: ${RED}${BOLD}1${RESET} (${reason})`);
308
+ }
309
+ else {
310
+ console.log(` Exit: ${GREEN}0${RESET} (${reason})`);
311
+ }
312
+ console.log("");
313
+ await closePool();
314
+ process.exit(exitCode);
315
+ }
316
+ catch (err) {
317
+ const message = err instanceof Error ? err.message : String(err);
318
+ if (message.includes("ECONNREFUSED")) {
319
+ console.error("\n ERROR: Cannot connect to Codify services.");
320
+ console.error(" Run 'codify init' to start the infrastructure.\n");
321
+ }
322
+ else if (message.includes("ANTHROPIC_API_KEY")) {
323
+ console.error("\n ERROR: ANTHROPIC_API_KEY not set.");
324
+ console.error(" Export your API key: export ANTHROPIC_API_KEY=sk-...\n");
325
+ }
326
+ else {
327
+ console.error(`\n ERROR: ${message}\n`);
328
+ }
329
+ process.exit(1);
330
+ }
331
+ });
332
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const cleanupCommand: Command;
3
+ //# sourceMappingURL=cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkNpC,eAAO,MAAM,cAAc,SAEE,CAAC"}
@@ -0,0 +1,166 @@
1
+ // codify cleanup gaps — fix legacy gap descriptions containing UUIDs
2
+ import { Command } from "commander";
3
+ import { loadProjectConfig } from "../lib/config.js";
4
+ // --- Color helpers (ANSI escape codes) ---
5
+ const RESET = "\x1b[0m";
6
+ const BOLD = "\x1b[1m";
7
+ const DIM = "\x1b[2m";
8
+ const GREEN = "\x1b[32m";
9
+ const CYAN = "\x1b[36m";
10
+ const YELLOW = "\x1b[33m";
11
+ // UUID regex pattern
12
+ const UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
13
+ /**
14
+ * Resolve a human-readable title for a node, using standard priority:
15
+ * properties.title > metadata.title > properties.name > metadata.name > id prefix
16
+ */
17
+ function resolveTitle(properties, metadata, id) {
18
+ const p = properties ?? {};
19
+ const m = metadata ?? {};
20
+ return (p.title ??
21
+ m.title ??
22
+ p.name ??
23
+ m.name ??
24
+ id.slice(0, 8) + "...");
25
+ }
26
+ // --- Subcommand: gaps ---
27
+ const gapsSubcommand = new Command("gaps")
28
+ .description("Fix gap descriptions that contain UUIDs instead of titles")
29
+ .option("--dry-run", "Show what would be fixed without making changes")
30
+ .action(async (opts) => {
31
+ try {
32
+ await loadProjectConfig();
33
+ const { getPool, closePool } = await import("@codify/graph");
34
+ const pool = getPool();
35
+ try {
36
+ await pool.query("SELECT 1");
37
+ }
38
+ catch {
39
+ console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
40
+ process.exit(1);
41
+ }
42
+ const isDryRun = !!opts.dryRun;
43
+ if (isDryRun) {
44
+ console.log(`\n ${BOLD}Codify — Cleanup Gap Descriptions (dry run)${RESET}\n`);
45
+ }
46
+ else {
47
+ console.log(`\n ${BOLD}Codify — Cleanup Gap Descriptions${RESET}\n`);
48
+ }
49
+ // Fetch all active Gap nodes
50
+ const gapsResult = await pool.query(`SELECT id, properties, metadata FROM nodes WHERE type = 'Gap' AND superseded_by IS NULL`);
51
+ const gaps = gapsResult.rows;
52
+ if (gaps.length === 0) {
53
+ console.log(" No gaps found in the graph.\n");
54
+ await closePool();
55
+ return;
56
+ }
57
+ // Cache for resolved node titles (UUID -> title string)
58
+ const titleCache = new Map();
59
+ async function resolveTitleForUuid(uuid) {
60
+ const cached = titleCache.get(uuid);
61
+ if (cached !== undefined)
62
+ return cached;
63
+ const result = await pool.query(`SELECT properties, metadata FROM nodes WHERE id = $1`, [uuid]);
64
+ let title;
65
+ if (result.rows.length === 0) {
66
+ // Node not found — use truncated UUID
67
+ title = uuid.slice(0, 8) + "...";
68
+ }
69
+ else {
70
+ const row = result.rows[0];
71
+ title = resolveTitle(row.properties, row.metadata, uuid);
72
+ }
73
+ titleCache.set(uuid, title);
74
+ return title;
75
+ }
76
+ /**
77
+ * Replace all UUIDs in a string with resolved titles (wrapped in quotes).
78
+ * Returns [newString, wasChanged].
79
+ */
80
+ async function replaceUuids(text) {
81
+ const uuids = text.match(UUID_RE);
82
+ if (!uuids || uuids.length === 0)
83
+ return [text, false];
84
+ let result = text;
85
+ for (const uuid of uuids) {
86
+ const title = await resolveTitleForUuid(uuid);
87
+ result = result.replace(uuid, `'${title}'`);
88
+ }
89
+ return [result, result !== text];
90
+ }
91
+ let fixedCount = 0;
92
+ let cleanCount = 0;
93
+ for (const gap of gaps) {
94
+ const props = gap.properties ?? {};
95
+ const description = props.description ?? "";
96
+ const title = props.title ?? "";
97
+ // Check if description or title contain UUIDs
98
+ const descHasUuid = UUID_RE.test(description);
99
+ UUID_RE.lastIndex = 0; // Reset regex state (global flag)
100
+ const titleHasUuid = UUID_RE.test(title);
101
+ UUID_RE.lastIndex = 0;
102
+ if (!descHasUuid && !titleHasUuid) {
103
+ cleanCount++;
104
+ continue;
105
+ }
106
+ // Resolve UUIDs in description and title
107
+ const [newDescription, descChanged] = await replaceUuids(description);
108
+ const [newTitle, titleChanged] = await replaceUuids(title);
109
+ if (!descChanged && !titleChanged) {
110
+ cleanCount++;
111
+ continue;
112
+ }
113
+ // Build the short ID for display
114
+ const shortId = gap.id.slice(0, 6);
115
+ // Show what changed
116
+ if (descChanged) {
117
+ const oldSnippet = description.length > 60 ? description.slice(0, 60) + "..." : description;
118
+ const newSnippet = newDescription.length > 60 ? newDescription.slice(0, 60) + "..." : newDescription;
119
+ console.log(` ${GREEN}Fixed${RESET} gap ${CYAN}${shortId}${RESET}: '${oldSnippet}'`);
120
+ console.log(` ${DIM}->${RESET} '${newSnippet}'`);
121
+ }
122
+ if (titleChanged) {
123
+ const oldSnippet = title.length > 60 ? title.slice(0, 60) + "..." : title;
124
+ const newSnippet = newTitle.length > 60 ? newTitle.slice(0, 60) + "..." : newTitle;
125
+ console.log(` ${GREEN}Fixed${RESET} gap ${CYAN}${shortId}${RESET} title: '${oldSnippet}'`);
126
+ console.log(` ${DIM}->${RESET} '${newSnippet}'`);
127
+ }
128
+ if (!isDryRun) {
129
+ // Update the node's properties, preserving all other fields
130
+ const updatedProps = { ...props };
131
+ if (descChanged)
132
+ updatedProps.description = newDescription;
133
+ if (titleChanged)
134
+ updatedProps.title = newTitle;
135
+ await pool.query(`UPDATE nodes SET properties = $1::jsonb, updated_at = now() WHERE id = $2`, [JSON.stringify(updatedProps), gap.id]);
136
+ }
137
+ fixedCount++;
138
+ }
139
+ // Summary
140
+ console.log("");
141
+ if (isDryRun) {
142
+ console.log(` ${YELLOW}Dry run:${RESET} ${fixedCount} gap${fixedCount === 1 ? "" : "s"} would be fixed. ${cleanCount} already clean.`);
143
+ }
144
+ else {
145
+ console.log(` Fixed ${BOLD}${fixedCount}${RESET} gap description${fixedCount === 1 ? "" : "s"}. ${cleanCount} already clean.`);
146
+ }
147
+ console.log("");
148
+ await closePool();
149
+ }
150
+ catch (err) {
151
+ const message = err instanceof Error ? err.message : String(err);
152
+ if (message.includes("ECONNREFUSED")) {
153
+ console.error("\n ERROR: Cannot connect to Codify services.");
154
+ console.error(" Run 'codify init' to start the infrastructure.\n");
155
+ }
156
+ else {
157
+ console.error(`\n ERROR: ${message}\n`);
158
+ }
159
+ process.exit(1);
160
+ }
161
+ });
162
+ // --- Parent command ---
163
+ export const cleanupCommand = new Command("cleanup")
164
+ .description("Fix legacy data quality issues")
165
+ .addCommand(gapsSubcommand);
166
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Core graph-mining logic: search for evidence nodes relevant to an affected node,
4
+ * create evidence_for edges, and return results.
5
+ *
6
+ * Exported so triage.ts can reuse it inline.
7
+ */
8
+ export declare function collectEvidenceForGap(pool: {
9
+ query: <T extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: unknown[]) => Promise<{
10
+ rows: T[];
11
+ }>;
12
+ }, gapId: string, affectedNodes: Array<{
13
+ id: string;
14
+ type: string;
15
+ title: string;
16
+ }>): Promise<{
17
+ evidenceNodes: Array<{
18
+ id: string;
19
+ type: string;
20
+ title: string;
21
+ targetNodeId: string;
22
+ }>;
23
+ edgesCreated: number;
24
+ }>;
25
+ export declare const collectCommand: Command;
26
+ //# sourceMappingURL=collect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/commands/collect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmDpC;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE;IACJ,KAAK,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,KACf,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7B,EACD,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,KAAK,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,GACD,OAAO,CAAC;IACT,aAAa,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CA2FD;AAID,eAAO,MAAM,cAAc,SAiLvB,CAAC"}