@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,315 @@
1
+ // codify gaps — show gaps detected by the Gap Engine
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 YELLOW = "\x1b[33m";
10
+ const GREEN = "\x1b[32m";
11
+ const CYAN = "\x1b[36m";
12
+ const MAGENTA = "\x1b[35m";
13
+ const WHITE = "\x1b[37m";
14
+ const BG_RED = "\x1b[41m";
15
+ const BG_YELLOW = "\x1b[43m";
16
+ const BG_MAGENTA = "\x1b[45m";
17
+ const BG_CYAN = "\x1b[46m";
18
+ function severityColor(severity) {
19
+ switch (severity) {
20
+ case "critical":
21
+ return `${BG_RED}${WHITE}${BOLD} CRITICAL ${RESET}`;
22
+ case "high":
23
+ return `${RED}${BOLD} HIGH ${RESET}`;
24
+ case "medium":
25
+ return `${YELLOW}${BOLD} MEDIUM ${RESET}`;
26
+ case "low":
27
+ return `${CYAN} LOW ${RESET}`;
28
+ default:
29
+ return `${DIM} ${severity?.toUpperCase() ?? "UNKNOWN"} ${RESET}`;
30
+ }
31
+ }
32
+ function statusLabel(status) {
33
+ switch (status) {
34
+ case "detected":
35
+ return `${YELLOW}detected${RESET}`;
36
+ case "acknowledged":
37
+ return `${CYAN}acknowledged${RESET}`;
38
+ case "collection_in_progress":
39
+ return `${MAGENTA}collecting${RESET}`;
40
+ case "resolved":
41
+ return `${GREEN}resolved${RESET}`;
42
+ case "wont_fix":
43
+ return `${DIM}wont_fix${RESET}`;
44
+ default:
45
+ return `${DIM}${status}${RESET}`;
46
+ }
47
+ }
48
+ function gapTypeLabel(gapType) {
49
+ const labels = {
50
+ missing_data: "Missing Data",
51
+ stale: "Stale",
52
+ contradiction: "Contradiction",
53
+ untested_assumption: "Untested Assumption",
54
+ missing_validation: "Missing Validation",
55
+ coverage_gap: "Coverage Gap",
56
+ };
57
+ return labels[gapType] ?? gapType;
58
+ }
59
+ function resolutionMethodLabel(method) {
60
+ const labels = {
61
+ external_collection: "Collect external data (customer research, market data)",
62
+ internal_collection: "Collect internally (team review, revalidation)",
63
+ metabolism: "Auto-resolve via graph metabolism (contradiction resolution)",
64
+ manual_review: "Manual review required",
65
+ };
66
+ return labels[method] ?? method;
67
+ }
68
+ function formatAge(createdAt) {
69
+ const created = new Date(createdAt);
70
+ const now = new Date();
71
+ const diffMs = now.getTime() - created.getTime();
72
+ const diffMins = Math.floor(diffMs / 60000);
73
+ const diffHours = Math.floor(diffMs / 3600000);
74
+ const diffDays = Math.floor(diffMs / 86400000);
75
+ if (diffMins < 1)
76
+ return "just now";
77
+ if (diffMins < 60)
78
+ return `${diffMins}m ago`;
79
+ if (diffHours < 24)
80
+ return `${diffHours}h ago`;
81
+ if (diffDays < 30)
82
+ return `${diffDays}d ago`;
83
+ return `${Math.floor(diffDays / 30)}mo ago`;
84
+ }
85
+ // --- Severity ordering for priority sort ---
86
+ const SEVERITY_ORDER = {
87
+ critical: 0,
88
+ high: 1,
89
+ medium: 2,
90
+ low: 3,
91
+ };
92
+ // --- Command definition ---
93
+ export const gapsCommand = new Command("gaps")
94
+ .description("Show gaps detected by the Gap Engine")
95
+ .option("--severity <level>", "Filter by severity: critical, high, medium, low")
96
+ .option("--limit <n>", "Maximum gaps to show", "10")
97
+ .option("--status <status>", "Filter by status: detected, acknowledged, collection_in_progress, resolved, wont_fix")
98
+ .action(async (opts) => {
99
+ try {
100
+ await loadProjectConfig();
101
+ const { getPool, closePool } = await import("@codify/graph");
102
+ const pool = getPool();
103
+ try {
104
+ await pool.query("SELECT 1");
105
+ }
106
+ catch {
107
+ console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
108
+ process.exit(1);
109
+ }
110
+ // Build query with filters
111
+ const conditions = [
112
+ "type = 'Gap'",
113
+ "superseded_by IS NULL",
114
+ ];
115
+ const params = [];
116
+ let paramIdx = 1;
117
+ if (opts.severity) {
118
+ const valid = ["critical", "high", "medium", "low"];
119
+ if (!valid.includes(opts.severity)) {
120
+ console.error(`\n ERROR: Invalid severity "${opts.severity}". Use: ${valid.join(", ")}\n`);
121
+ process.exit(1);
122
+ }
123
+ conditions.push(`properties->>'severity' = $${paramIdx++}`);
124
+ params.push(opts.severity);
125
+ }
126
+ if (opts.status) {
127
+ const valid = ["detected", "acknowledged", "collection_in_progress", "resolved", "wont_fix"];
128
+ if (!valid.includes(opts.status)) {
129
+ console.error(`\n ERROR: Invalid status "${opts.status}". Use: ${valid.join(", ")}\n`);
130
+ process.exit(1);
131
+ }
132
+ conditions.push(`properties->>'status' = $${paramIdx++}`);
133
+ params.push(opts.status);
134
+ }
135
+ const limit = parseInt(opts.limit, 10);
136
+ if (isNaN(limit) || limit < 1) {
137
+ console.error("\n ERROR: --limit must be a positive integer.\n");
138
+ process.exit(1);
139
+ }
140
+ // Fetch more gaps than requested to have enough after dedup.
141
+ // We fetch up to 5x the limit so dedup can remove duplicates and still fill the page.
142
+ const fetchLimit = limit * 5;
143
+ // Query gaps sorted by severity priority, then by creation date (newest first)
144
+ const gapsResult = await pool.query(`SELECT id, properties, metadata, freshness, confidence, created_at, updated_at
145
+ FROM nodes
146
+ WHERE ${conditions.join(" AND ")}
147
+ ORDER BY
148
+ CASE properties->>'severity'
149
+ WHEN 'critical' THEN 0
150
+ WHEN 'high' THEN 1
151
+ WHEN 'medium' THEN 2
152
+ WHEN 'low' THEN 3
153
+ ELSE 4
154
+ END ASC,
155
+ created_at DESC
156
+ LIMIT $${paramIdx}`, [...params, fetchLimit]);
157
+ const allGaps = gapsResult.rows;
158
+ // Header
159
+ console.log(`\n ${BOLD}Codify — Gap Report${RESET}\n`);
160
+ if (allGaps.length === 0) {
161
+ const filterDesc = [];
162
+ if (opts.severity)
163
+ filterDesc.push(`severity=${opts.severity}`);
164
+ if (opts.status)
165
+ filterDesc.push(`status=${opts.status}`);
166
+ const filterStr = filterDesc.length > 0 ? ` (filters: ${filterDesc.join(", ")})` : "";
167
+ console.log(` No gaps found${filterStr}.\n`);
168
+ console.log(` The Gap Engine detects issues proactively. Run 'codify start' to`);
169
+ console.log(` activate the Gap Engine, or 'codify bootstrap' to build the graph.\n`);
170
+ await closePool();
171
+ return;
172
+ }
173
+ const gapsWithEdges = [];
174
+ for (const gap of allGaps) {
175
+ const relatedResult = await pool.query(`SELECT n.id, n.type, n.properties, n.metadata
176
+ FROM nodes n
177
+ JOIN edges e ON e.source_id = n.id
178
+ WHERE e.target_id = $1
179
+ AND e.type = 'triggered'
180
+ ORDER BY n.type, n.created_at`, [gap.id]);
181
+ const affectedNodeIds = relatedResult.rows.map((r) => r.id);
182
+ const relatedNodes = relatedResult.rows.map((r) => {
183
+ const p = r.properties ?? {};
184
+ const m = r.metadata ?? {};
185
+ const title = p.title ?? m.title ??
186
+ p.name ?? m.name ??
187
+ p.description?.slice(0, 60) ??
188
+ r.id.slice(0, 8);
189
+ return { type: r.type, title };
190
+ });
191
+ gapsWithEdges.push({ ...gap, affectedNodeIds, relatedNodes });
192
+ }
193
+ // Display-time dedup: gapType + sorted affected node IDs
194
+ const seen = new Map();
195
+ let duplicateCount = 0;
196
+ for (const gap of gapsWithEdges) {
197
+ const gapType = gap.properties.gapType ?? "unknown";
198
+ const dedupKey = gapType + ":" + [...gap.affectedNodeIds].sort().join(",");
199
+ const existing = seen.get(dedupKey);
200
+ if (existing) {
201
+ // Keep the newest by created_at
202
+ const existingDate = new Date(existing.created_at).getTime();
203
+ const currentDate = new Date(gap.created_at).getTime();
204
+ if (currentDate > existingDate) {
205
+ seen.set(dedupKey, gap);
206
+ }
207
+ duplicateCount++;
208
+ }
209
+ else {
210
+ seen.set(dedupKey, gap);
211
+ }
212
+ }
213
+ // Re-sort deduped gaps by severity then created_at (same order as the query)
214
+ const dedupedGaps = [...seen.values()].sort((a, b) => {
215
+ const sevA = SEVERITY_ORDER[a.properties.severity ?? ""] ?? 4;
216
+ const sevB = SEVERITY_ORDER[b.properties.severity ?? ""] ?? 4;
217
+ if (sevA !== sevB)
218
+ return sevA - sevB;
219
+ return new Date(b.created_at).getTime() - new Date(a.created_at).getTime();
220
+ });
221
+ // Apply the user's limit after dedup
222
+ const gaps = dedupedGaps.slice(0, limit);
223
+ // Summary line
224
+ const totalResult = await pool.query(`SELECT COUNT(*) as count FROM nodes
225
+ WHERE type = 'Gap' AND superseded_by IS NULL`);
226
+ const total = parseInt(totalResult.rows[0].count, 10);
227
+ const severityCounts = await pool.query(`SELECT properties->>'severity' as severity, COUNT(*) as count
228
+ FROM nodes WHERE type = 'Gap' AND superseded_by IS NULL
229
+ GROUP BY properties->>'severity' ORDER BY count DESC`);
230
+ const countParts = [];
231
+ for (const row of severityCounts.rows) {
232
+ const sev = row.severity ?? "unknown";
233
+ const cnt = row.count;
234
+ switch (sev) {
235
+ case "critical":
236
+ countParts.push(`${RED}${BOLD}${cnt} critical${RESET}`);
237
+ break;
238
+ case "high":
239
+ countParts.push(`${RED}${cnt} high${RESET}`);
240
+ break;
241
+ case "medium":
242
+ countParts.push(`${YELLOW}${cnt} medium${RESET}`);
243
+ break;
244
+ case "low":
245
+ countParts.push(`${CYAN}${cnt} low${RESET}`);
246
+ break;
247
+ default:
248
+ countParts.push(`${cnt} ${sev}`);
249
+ }
250
+ }
251
+ console.log(` ${total} total gap${total === 1 ? "" : "s"}: ${countParts.join(", ")}`);
252
+ // Dedup summary
253
+ const uniqueCount = dedupedGaps.length;
254
+ if (duplicateCount > 0) {
255
+ console.log(` ${uniqueCount} unique gap${uniqueCount === 1 ? "" : "s"} (${duplicateCount} duplicate${duplicateCount === 1 ? "" : "s"} hidden)`);
256
+ }
257
+ if (gaps.length < uniqueCount) {
258
+ console.log(` ${DIM}Showing top ${gaps.length} of ${uniqueCount} unique. Use --limit to see more.${RESET}`);
259
+ }
260
+ console.log("");
261
+ // Display each gap
262
+ for (let i = 0; i < gaps.length; i++) {
263
+ const gap = gaps[i];
264
+ const props = gap.properties;
265
+ const severity = props.severity ?? "unknown";
266
+ const status = props.status ?? "detected";
267
+ const description = props.description ?? "No description";
268
+ const gapType = props.gapType ?? "unknown";
269
+ const resolutionPath = props.resolutionPath;
270
+ // Gap number
271
+ console.log(` ${BOLD}${DIM}#${i + 1}${RESET} ${severityColor(severity)} ${statusLabel(status)} ${DIM}${gapTypeLabel(gapType)}${RESET} ${DIM}${formatAge(gap.created_at)}${RESET}`);
272
+ // Description
273
+ console.log(` ${description}`);
274
+ // Related nodes
275
+ if (gap.relatedNodes.length > 0) {
276
+ const nodeLabels = gap.relatedNodes.map((n) => `${DIM}${n.type}:${RESET} ${n.title}`);
277
+ console.log(` ${CYAN}Affected:${RESET} ${nodeLabels.join(", ")}`);
278
+ }
279
+ // Suggested resolution
280
+ if (resolutionPath) {
281
+ try {
282
+ const resolution = JSON.parse(resolutionPath);
283
+ if (resolution.method) {
284
+ console.log(` ${MAGENTA}Action:${RESET} ${resolutionMethodLabel(resolution.method)}`);
285
+ }
286
+ }
287
+ catch {
288
+ // resolutionPath is not JSON — show as-is
289
+ console.log(` ${MAGENTA}Action:${RESET} ${resolutionPath}`);
290
+ }
291
+ }
292
+ console.log("");
293
+ }
294
+ // Footer help
295
+ console.log(` ${DIM}Flags: --severity critical|high|medium|low --status detected|resolved --limit <n>${RESET}`);
296
+ console.log("");
297
+ await closePool();
298
+ }
299
+ catch (err) {
300
+ const message = err instanceof Error ? err.message : String(err);
301
+ if (message.includes("ECONNREFUSED")) {
302
+ console.error("\n ERROR: Cannot connect to Codify services.");
303
+ console.error(" Run 'codify init' to start the infrastructure.\n");
304
+ }
305
+ else if (message.includes("ANTHROPIC_API_KEY")) {
306
+ console.error("\n ERROR: ANTHROPIC_API_KEY not set.");
307
+ console.error(" Export your API key: export ANTHROPIC_API_KEY=sk-...\n");
308
+ }
309
+ else {
310
+ console.error(`\n ERROR: ${message}\n`);
311
+ }
312
+ process.exit(1);
313
+ }
314
+ });
315
+ //# sourceMappingURL=gaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaps.js","sourceRoot":"","sources":["../../src/commands/gaps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const graphCommand: Command;
3
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4EpC,eAAO,MAAM,YAAY,SAoRrB,CAAC"}
@@ -0,0 +1,293 @@
1
+ // codify graph — Mermaid diagram visualization of the context graph
2
+ import { Command } from "commander";
3
+ import { loadProjectConfig } from "../lib/config.js";
4
+ import { writeFileSync } from "node:fs";
5
+ // --- Color helpers (ANSI escape codes) ---
6
+ const RESET = "\x1b[0m";
7
+ const BOLD = "\x1b[1m";
8
+ const DIM = "\x1b[2m";
9
+ const CYAN = "\x1b[36m";
10
+ // --- Valid node types ---
11
+ const VALID_TYPES = [
12
+ "Decision", "Feature", "Metric", "CustomerSignal",
13
+ "CodeArtifact", "Discussion", "Gap", "Study", "Person",
14
+ ];
15
+ // --- Mermaid helpers ---
16
+ /** Escape quotes and special chars for Mermaid labels */
17
+ function escapeLabel(str) {
18
+ return str
19
+ .replace(/"/g, "#quot;")
20
+ .replace(/\[/g, "#lsqb;")
21
+ .replace(/\]/g, "#rsqb;")
22
+ .replace(/\(/g, "#lpar;")
23
+ .replace(/\)/g, "#rpar;")
24
+ .replace(/</g, "#lt;")
25
+ .replace(/>/g, "#gt;")
26
+ .replace(/\{/g, "#lbrace;")
27
+ .replace(/\}/g, "#rbrace;");
28
+ }
29
+ /** Generate a short Mermaid node ID from type + index */
30
+ function mermaidId(type, index) {
31
+ const prefixes = {
32
+ Decision: "D",
33
+ Feature: "F",
34
+ Metric: "M",
35
+ CustomerSignal: "CS",
36
+ CodeArtifact: "CA",
37
+ Discussion: "DI",
38
+ Gap: "G",
39
+ Study: "ST",
40
+ Person: "P",
41
+ };
42
+ return `${prefixes[type] ?? "N"}${index}`;
43
+ }
44
+ /** Get the Mermaid style line for a node type */
45
+ function mermaidStyle(nodeId, type) {
46
+ switch (type) {
47
+ case "Decision":
48
+ return ` style ${nodeId} fill:#ffd700`;
49
+ case "Feature":
50
+ return ` style ${nodeId} fill:#90ee90`;
51
+ case "Gap":
52
+ return ` style ${nodeId} fill:#ff6b6b,stroke-dasharray: 5 5`;
53
+ case "CodeArtifact":
54
+ return ` style ${nodeId} fill:#87ceeb`;
55
+ case "CustomerSignal":
56
+ return ` style ${nodeId} fill:#dda0dd`;
57
+ default:
58
+ return null;
59
+ }
60
+ }
61
+ /** Truncate a string to maxLen characters */
62
+ function truncate(str, maxLen) {
63
+ if (str.length <= maxLen)
64
+ return str;
65
+ return str.slice(0, maxLen - 3) + "...";
66
+ }
67
+ // --- Command definition ---
68
+ export const graphCommand = new Command("graph")
69
+ .description("Visualize the context graph as a Mermaid diagram")
70
+ .argument("<query>", "Search query to find seed nodes")
71
+ .option("--depth <n>", "Maximum traversal hops from seed nodes", "2")
72
+ .option("--limit <n>", "Maximum nodes in diagram", "30")
73
+ .option("--type <type>", "Filter seed nodes by type: Decision, Feature, Metric, CustomerSignal, CodeArtifact, Discussion, Gap, Study, Person")
74
+ .option("--output <file>", "Write diagram to file instead of stdout")
75
+ .action(async (queryStr, opts) => {
76
+ try {
77
+ await loadProjectConfig();
78
+ const { getPool, closePool } = await import("@codify/graph");
79
+ const pool = getPool();
80
+ try {
81
+ await pool.query("SELECT 1");
82
+ }
83
+ catch {
84
+ console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
85
+ process.exit(1);
86
+ }
87
+ // Validate options
88
+ if (opts.type) {
89
+ if (!VALID_TYPES.includes(opts.type)) {
90
+ console.error(`\n ERROR: Invalid type "${opts.type}". Use: ${VALID_TYPES.join(", ")}\n`);
91
+ process.exit(1);
92
+ }
93
+ }
94
+ const depth = parseInt(opts.depth, 10);
95
+ if (isNaN(depth) || depth < 1) {
96
+ console.error("\n ERROR: --depth must be a positive integer.\n");
97
+ process.exit(1);
98
+ }
99
+ const limit = parseInt(opts.limit, 10);
100
+ if (isNaN(limit) || limit < 1) {
101
+ console.error("\n ERROR: --limit must be a positive integer.\n");
102
+ process.exit(1);
103
+ }
104
+ // Step 1: Find seed nodes via ILIKE keyword search
105
+ const seedConditions = [
106
+ "superseded_by IS NULL",
107
+ "layer = ANY($1)",
108
+ ];
109
+ const seedParams = [["permanent", "draft", "hot"]];
110
+ let paramIdx = 2;
111
+ const keywords = queryStr.split(/\s+/).filter((w) => w.length > 1);
112
+ if (keywords.length > 0) {
113
+ const keywordConditions = keywords.map((kw) => {
114
+ seedParams.push(`%${kw}%`);
115
+ const idx = paramIdx++;
116
+ return `(properties::text ILIKE $${idx} OR metadata::text ILIKE $${idx} OR $${idx} = ANY(tags))`;
117
+ });
118
+ seedConditions.push(`(${keywordConditions.join(" OR ")})`);
119
+ }
120
+ if (opts.type) {
121
+ seedConditions.push(`type = $${paramIdx++}`);
122
+ seedParams.push(opts.type);
123
+ }
124
+ seedParams.push(limit);
125
+ const seedSql = `SELECT id, type, properties, metadata
126
+ FROM nodes
127
+ WHERE ${seedConditions.join(" AND ")}
128
+ ORDER BY freshness DESC
129
+ LIMIT $${paramIdx}`;
130
+ const seedResult = await pool.query(seedSql, seedParams);
131
+ if (seedResult.rows.length === 0) {
132
+ console.log(`\n ${BOLD}Codify — Graph: "${queryStr}"${RESET}\n`);
133
+ console.log(` No nodes found matching "${queryStr}".`);
134
+ console.log(` Try broader keywords, or run 'codify bootstrap' to build the graph.\n`);
135
+ await closePool();
136
+ return;
137
+ }
138
+ // Step 2: BFS traversal to collect connected nodes up to --depth hops
139
+ // Map uuid -> node data
140
+ const nodeMap = new Map();
141
+ // Edge list: [sourceUuid, targetUuid, edgeType]
142
+ const edgeList = [];
143
+ // Track visited for BFS
144
+ const visited = new Set();
145
+ let frontier = new Set();
146
+ // Initialize with seed nodes
147
+ for (const row of seedResult.rows) {
148
+ const props = row.properties ?? {};
149
+ const meta = row.metadata ?? {};
150
+ const title = props.title ?? meta.title ??
151
+ props.name ?? meta.name ??
152
+ row.id.slice(0, 12);
153
+ nodeMap.set(row.id, { id: row.id, type: row.type, title: truncate(title, 40) });
154
+ visited.add(row.id);
155
+ frontier.add(row.id);
156
+ }
157
+ // BFS expansion — discover edges and neighbors
158
+ for (let hop = 0; hop < depth && frontier.size > 0; hop++) {
159
+ const frontierIds = [...frontier];
160
+ const nextFrontier = new Set();
161
+ // Query edges where frontier node is source or target
162
+ const edgeResult = await pool.query(`SELECT
163
+ e.source_id,
164
+ e.target_id,
165
+ e.type as edge_type,
166
+ n.id as neighbor_id,
167
+ n.type as neighbor_type,
168
+ n.properties as neighbor_properties,
169
+ n.metadata as neighbor_metadata
170
+ FROM edges e
171
+ JOIN nodes n ON (
172
+ (e.source_id = ANY($1::uuid[]) AND n.id = e.target_id)
173
+ OR
174
+ (e.target_id = ANY($1::uuid[]) AND n.id = e.source_id)
175
+ )
176
+ WHERE (e.source_id = ANY($1::uuid[]) OR e.target_id = ANY($1::uuid[]))
177
+ AND n.superseded_by IS NULL`, [frontierIds]);
178
+ for (const row of edgeResult.rows) {
179
+ // Always record edges between known nodes
180
+ edgeList.push({
181
+ source: row.source_id,
182
+ target: row.target_id,
183
+ edgeType: row.edge_type,
184
+ });
185
+ // Add neighbor if not visited and under limit
186
+ if (!visited.has(row.neighbor_id) && nodeMap.size < limit) {
187
+ const props = row.neighbor_properties ?? {};
188
+ const meta = row.neighbor_metadata ?? {};
189
+ const title = props.title ?? meta.title ??
190
+ props.name ?? meta.name ??
191
+ row.neighbor_id.slice(0, 12);
192
+ nodeMap.set(row.neighbor_id, {
193
+ id: row.neighbor_id,
194
+ type: row.neighbor_type,
195
+ title: truncate(title, 40),
196
+ });
197
+ visited.add(row.neighbor_id);
198
+ nextFrontier.add(row.neighbor_id);
199
+ }
200
+ }
201
+ frontier = nextFrontier;
202
+ }
203
+ // Also find edges between all collected nodes (intra-graph edges)
204
+ const allNodeIds = [...nodeMap.keys()];
205
+ if (allNodeIds.length > 1) {
206
+ const intraEdges = await pool.query(`SELECT source_id, target_id, type as edge_type
207
+ FROM edges
208
+ WHERE source_id = ANY($1::uuid[]) AND target_id = ANY($1::uuid[])`, [allNodeIds]);
209
+ for (const row of intraEdges.rows) {
210
+ edgeList.push({ source: row.source_id, target: row.target_id, edgeType: row.edge_type });
211
+ }
212
+ }
213
+ // Step 3: Render Mermaid diagram
214
+ // Assign short IDs
215
+ const uuidToMermaidId = new Map();
216
+ const typeCounts = {};
217
+ for (const [uuid, node] of nodeMap) {
218
+ const count = (typeCounts[node.type] ?? 0) + 1;
219
+ typeCounts[node.type] = count;
220
+ uuidToMermaidId.set(uuid, mermaidId(node.type, count));
221
+ }
222
+ // Build Mermaid lines
223
+ const lines = ["graph TD"];
224
+ // Node definitions
225
+ for (const [uuid, node] of nodeMap) {
226
+ const mid = uuidToMermaidId.get(uuid);
227
+ const label = escapeLabel(`${node.type}: ${node.title}`);
228
+ lines.push(` ${mid}["${label}"]`);
229
+ }
230
+ // Deduplicate edges (same source+target pair)
231
+ const seenEdges = new Set();
232
+ for (const edge of edgeList) {
233
+ const sourceMid = uuidToMermaidId.get(edge.source);
234
+ const targetMid = uuidToMermaidId.get(edge.target);
235
+ if (!sourceMid || !targetMid)
236
+ continue;
237
+ const edgeKey = `${sourceMid}->${targetMid}`;
238
+ if (seenEdges.has(edgeKey))
239
+ continue;
240
+ seenEdges.add(edgeKey);
241
+ // Gap-related edges use dotted arrows
242
+ const sourceNode = nodeMap.get(edge.source);
243
+ const targetNode = nodeMap.get(edge.target);
244
+ const isGapRelated = sourceNode?.type === "Gap" || targetNode?.type === "Gap" ||
245
+ edge.edgeType === "triggered" || edge.edgeType === "gap_for";
246
+ const arrow = isGapRelated ? "-.->" : "-->";
247
+ lines.push(` ${sourceMid} ${arrow} ${targetMid}`);
248
+ }
249
+ // Style lines
250
+ for (const [uuid] of nodeMap) {
251
+ const mid = uuidToMermaidId.get(uuid);
252
+ const node = nodeMap.get(uuid);
253
+ const style = mermaidStyle(mid, node.type);
254
+ if (style)
255
+ lines.push(style);
256
+ }
257
+ const mermaidOutput = lines.join("\n");
258
+ // Step 4: Output
259
+ if (opts.output) {
260
+ const content = "```mermaid\n" + mermaidOutput + "\n```\n";
261
+ writeFileSync(opts.output, content, "utf-8");
262
+ console.log(`\n ${BOLD}Codify — Graph: "${queryStr}"${RESET}\n`);
263
+ console.log(` ${nodeMap.size} nodes, ${seenEdges.size} edges`);
264
+ console.log(` Written to ${opts.output}\n`);
265
+ }
266
+ else {
267
+ console.log(`\n ${BOLD}Codify — Graph: "${queryStr}"${RESET}\n`);
268
+ console.log(` ${nodeMap.size} nodes, ${seenEdges.size} edges\n`);
269
+ console.log(" ```mermaid");
270
+ console.log(" " + mermaidOutput.split("\n").join("\n "));
271
+ console.log(" ```\n");
272
+ console.log(` ${DIM}Copy this diagram to a markdown file or paste into https://mermaid.live${RESET}`);
273
+ console.log(` ${DIM}Flags: --depth <n> --limit <n> --type <Type> --output <file>${RESET}\n`);
274
+ }
275
+ await closePool();
276
+ }
277
+ catch (err) {
278
+ const message = err instanceof Error ? err.message : String(err);
279
+ if (message.includes("ECONNREFUSED")) {
280
+ console.error("\n ERROR: Cannot connect to Codify services.");
281
+ console.error(" Run 'codify init' to start the infrastructure.\n");
282
+ }
283
+ else if (message.includes("ANTHROPIC_API_KEY")) {
284
+ console.error("\n ERROR: ANTHROPIC_API_KEY not set.");
285
+ console.error(" Export your API key: export ANTHROPIC_API_KEY=sk-...\n");
286
+ }
287
+ else {
288
+ console.error(`\n ERROR: ${message}\n`);
289
+ }
290
+ process.exit(1);
291
+ }
292
+ });
293
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const importCommand: Command;
3
+ //# sourceMappingURL=import-cmd.d.ts.map