@codified/cli 0.3.4 → 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.
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +163 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +141 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +332 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/cleanup.d.ts +3 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +166 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/collect.d.ts +26 -0
- package/dist/commands/collect.d.ts.map +1 -0
- package/dist/commands/collect.js +269 -0
- package/dist/commands/collect.js.map +1 -0
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +321 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/explain.d.ts +3 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +527 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +59 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/gaps.d.ts +3 -0
- package/dist/commands/gaps.d.ts.map +1 -0
- package/dist/commands/gaps.js +315 -0
- package/dist/commands/gaps.js.map +1 -0
- package/dist/commands/graph.d.ts +3 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +293 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/import-cmd.d.ts +3 -0
- package/dist/commands/import-cmd.d.ts.map +1 -0
- package/dist/commands/import-cmd.js +199 -0
- package/dist/commands/import-cmd.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +215 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +179 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reset.d.ts +3 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +157 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +183 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +205 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +242 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/timeline.d.ts +3 -0
- package/dist/commands/timeline.d.ts.map +1 -0
- package/dist/commands/timeline.js +424 -0
- package/dist/commands/timeline.js.map +1 -0
- package/dist/commands/triage.d.ts +3 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +336 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +312 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +224 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +668 -494
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +52 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +142 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/docker.d.ts +23 -0
- package/dist/lib/docker.d.ts.map +1 -0
- package/dist/lib/docker.js +84 -0
- package/dist/lib/docker.js.map +1 -0
- package/dist/lib/migrate.d.ts +9 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +97 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/paths.d.ts +9 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +28 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/prompt.d.ts +14 -0
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/prompt.js +87 -0
- package/dist/lib/prompt.js.map +1 -0
- 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 @@
|
|
|
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"}
|