@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,242 @@
1
+ // codify status — project health dashboard
2
+ import { Command } from "commander";
3
+ import { loadProjectConfig } from "../lib/config.js";
4
+ export const statusCommand = new Command("status")
5
+ .description("Show project health dashboard")
6
+ .action(async () => {
7
+ try {
8
+ await loadProjectConfig();
9
+ const { getPool, closePool } = await import("@codify/graph");
10
+ const pool = getPool();
11
+ try {
12
+ await pool.query("SELECT 1");
13
+ }
14
+ catch {
15
+ console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
16
+ process.exit(1);
17
+ }
18
+ // ── Gather all data ──────────────────────────────────────────
19
+ // Node counts by type
20
+ const nodesByType = await pool.query(`SELECT type, COUNT(*) as count FROM nodes
21
+ WHERE superseded_by IS NULL
22
+ GROUP BY type ORDER BY count DESC`);
23
+ const totalNodes = nodesByType.rows.reduce((sum, r) => sum + parseInt(r.count, 10), 0);
24
+ // Edge count
25
+ const edgeCount = await pool.query(`SELECT COUNT(*) as count FROM edges`);
26
+ const totalEdges = parseInt(edgeCount.rows[0].count, 10);
27
+ // Freshness metrics for health score
28
+ const freshNodes = await pool.query(`SELECT COUNT(*) as count FROM nodes
29
+ WHERE superseded_by IS NULL AND freshness > 0.5`);
30
+ const freshCount = parseInt(freshNodes.rows[0].count, 10);
31
+ const freshPercent = totalNodes > 0 ? freshCount / totalNodes : 0;
32
+ // Decisions with customer evidence (edges from CustomerSignal → Decision)
33
+ const decisionsTotal = await pool.query(`SELECT COUNT(*) as count FROM nodes
34
+ WHERE type = 'Decision' AND superseded_by IS NULL`);
35
+ const decisionsWithEvidence = await pool.query(`SELECT COUNT(DISTINCT d.id) as count
36
+ FROM nodes d
37
+ JOIN edges e ON e.target_id = d.id
38
+ JOIN nodes cs ON cs.id = e.source_id AND cs.type = 'CustomerSignal'
39
+ WHERE d.type = 'Decision' AND d.superseded_by IS NULL
40
+ AND e.type IN ('evidence_for', 'informed_by', 'validates')`);
41
+ const totalDecisions = parseInt(decisionsTotal.rows[0].count, 10);
42
+ const evidencedDecisions = parseInt(decisionsWithEvidence.rows[0].count, 10);
43
+ const evidencePercent = totalDecisions > 0 ? evidencedDecisions / totalDecisions : 0;
44
+ // Gap-to-node ratio
45
+ const gapCount = await pool.query(`SELECT COUNT(*) as count FROM nodes
46
+ WHERE type = 'Gap' AND superseded_by IS NULL`);
47
+ const totalGaps = parseInt(gapCount.rows[0].count, 10);
48
+ const gapRatio = totalNodes > 0 ? totalGaps / totalNodes : 0;
49
+ // Lower ratio = healthier. Score: 1 - (ratio capped at 0.5) * 2
50
+ const gapScore = Math.max(0, 1 - Math.min(gapRatio, 0.5) * 2);
51
+ // Check if any CustomerSignal nodes exist to determine if evidence metric applies
52
+ const customerSignalCount = await pool.query(`SELECT COUNT(*) as count FROM nodes
53
+ WHERE type = 'CustomerSignal' AND superseded_by IS NULL`);
54
+ const totalCustomerSignals = parseInt(customerSignalCount.rows[0].count, 10);
55
+ const hasCustomerSignals = totalCustomerSignals > 0;
56
+ // Weighted health score: adjust weights based on available data
57
+ // If no customer signals exist, don't penalize the evidence component
58
+ const healthScore = hasCustomerSignals
59
+ ? Math.round((freshPercent * 0.4 + evidencePercent * 0.3 + gapScore * 0.3) * 100)
60
+ : Math.round((freshPercent * 0.55 + gapScore * 0.45) * 100);
61
+ // Top 3 critical gaps
62
+ const criticalGaps = await pool.query(`SELECT
63
+ properties->>'title' as title,
64
+ COALESCE(properties->>'severity', 'unknown') as severity,
65
+ freshness,
66
+ COALESCE(properties->>'description', properties->>'reason', '') as description
67
+ FROM nodes
68
+ WHERE type = 'Gap' AND superseded_by IS NULL
69
+ ORDER BY
70
+ CASE COALESCE(properties->>'severity', 'unknown')
71
+ WHEN 'critical' THEN 0
72
+ WHEN 'high' THEN 1
73
+ WHEN 'medium' THEN 2
74
+ WHEN 'low' THEN 3
75
+ ELSE 4
76
+ END,
77
+ freshness DESC
78
+ LIMIT 3`);
79
+ // Freshness distribution for ASCII bar
80
+ const freshnessDist = await pool.query(`SELECT
81
+ CASE
82
+ WHEN freshness >= 0.8 THEN 'fresh'
83
+ WHEN freshness >= 0.5 THEN 'moderate'
84
+ WHEN freshness >= 0.2 THEN 'stale'
85
+ ELSE 'very_stale'
86
+ END as bucket,
87
+ COUNT(*) as count
88
+ FROM nodes WHERE superseded_by IS NULL
89
+ GROUP BY bucket`);
90
+ const freshDist = {
91
+ fresh: 0,
92
+ moderate: 0,
93
+ stale: 0,
94
+ very_stale: 0,
95
+ };
96
+ for (const row of freshnessDist.rows) {
97
+ freshDist[row.bucket] = parseInt(row.count, 10);
98
+ }
99
+ // Connector sync status
100
+ const connectors = await pool.query(`SELECT connector_id, status, last_sync_at, artifact_count, error
101
+ FROM connector_sync_state
102
+ ORDER BY connector_id`);
103
+ // Recent metabolism activity
104
+ const metabolismActivity = await pool.query(`SELECT event_type, action, reason, created_at
105
+ FROM metabolism_audit
106
+ ORDER BY created_at DESC
107
+ LIMIT 5`);
108
+ // Edges by type (top 10 for detail)
109
+ const edgesByType = await pool.query(`SELECT type, COUNT(*) as count FROM edges
110
+ GROUP BY type ORDER BY count DESC LIMIT 10`);
111
+ // Branches
112
+ const branches = await pool.query(`SELECT status, COUNT(*) as count FROM branches GROUP BY status`);
113
+ // Last activity
114
+ const lastActivity = await pool.query(`SELECT MAX(updated_at) as last FROM nodes WHERE superseded_by IS NULL`);
115
+ // ── Render dashboard ─────────────────────────────────────────
116
+ console.log("\n Codify — Project Health Dashboard\n");
117
+ // Health Score (headline)
118
+ const healthBar = renderBar(healthScore, 100, 30);
119
+ console.log(` Health Score: ${healthScore}% ${healthBar}`);
120
+ console.log(` Freshness: ${Math.round(freshPercent * 100)}% of nodes above 0.5`);
121
+ if (hasCustomerSignals) {
122
+ console.log(` Evidence: ${evidencedDecisions}/${totalDecisions} decisions backed by customer signals`);
123
+ }
124
+ else {
125
+ console.log(` Evidence: No customer signals yet. Run 'codify connect slack' or 'codify connect linear' to add.`);
126
+ }
127
+ console.log(` Gap ratio: ${totalGaps} gaps / ${totalNodes} nodes (${(gapRatio * 100).toFixed(1)}%)`);
128
+ // Freshness distribution — ASCII bar chart
129
+ console.log(`\n Freshness Distribution:`);
130
+ const maxFresh = Math.max(freshDist.fresh, freshDist.moderate, freshDist.stale, freshDist.very_stale, 1);
131
+ const barWidth = 30;
132
+ console.log(` Fresh (>0.8) ${renderBar(freshDist.fresh, maxFresh, barWidth)} ${freshDist.fresh}`);
133
+ console.log(` Moderate (0.5-0.8) ${renderBar(freshDist.moderate, maxFresh, barWidth)} ${freshDist.moderate}`);
134
+ console.log(` Stale (0.2-0.5) ${renderBar(freshDist.stale, maxFresh, barWidth)} ${freshDist.stale}`);
135
+ console.log(` Very stale (<0.2)${renderBar(freshDist.very_stale, maxFresh, barWidth)} ${freshDist.very_stale}`);
136
+ // Top 3 critical gaps
137
+ if (criticalGaps.rows.length > 0) {
138
+ console.log(`\n Top Critical Gaps:`);
139
+ for (const gap of criticalGaps.rows) {
140
+ const title = gap.title ?? "(untitled)";
141
+ const sev = gap.severity.toUpperCase();
142
+ const desc = gap.description
143
+ ? truncate(gap.description, 60)
144
+ : "";
145
+ console.log(` [${sev}] ${title}`);
146
+ if (desc) {
147
+ console.log(` ${desc}`);
148
+ }
149
+ }
150
+ }
151
+ else {
152
+ console.log(`\n No active gaps detected.`);
153
+ }
154
+ // Connector sync status
155
+ console.log(`\n Connectors:`);
156
+ if (connectors.rows.length > 0) {
157
+ for (const c of connectors.rows) {
158
+ const syncTime = c.last_sync_at
159
+ ? new Date(c.last_sync_at).toLocaleString()
160
+ : "never";
161
+ const statusIcon = c.status === "error" ? "!" : c.status === "syncing" ? "~" : "*";
162
+ const errorNote = c.error ? ` (${truncate(c.error, 40)})` : "";
163
+ console.log(` ${statusIcon} ${c.connector_id.padEnd(20)} ${c.status.padEnd(10)} last sync: ${syncTime} artifacts: ${c.artifact_count}${errorNote}`);
164
+ }
165
+ }
166
+ else {
167
+ console.log(` No connectors registered. Run 'codify bootstrap' to connect.`);
168
+ }
169
+ // Recent metabolism activity
170
+ console.log(`\n Recent Metabolism Activity:`);
171
+ if (metabolismActivity.rows.length > 0) {
172
+ for (const m of metabolismActivity.rows) {
173
+ const time = new Date(m.created_at).toLocaleString();
174
+ const reason = m.reason ? ` — ${truncate(m.reason, 50)}` : "";
175
+ console.log(` ${time} ${m.event_type} ${m.action}${reason}`);
176
+ }
177
+ }
178
+ else {
179
+ console.log(` No metabolism activity recorded yet.`);
180
+ }
181
+ // Supporting detail: nodes, edges, branches
182
+ console.log(`\n Graph Detail:`);
183
+ console.log(` Nodes: ${totalNodes} total`);
184
+ for (const row of nodesByType.rows) {
185
+ console.log(` ${row.type.padEnd(20)} ${row.count}`);
186
+ }
187
+ console.log(` Edges: ${totalEdges} total`);
188
+ for (const row of edgesByType.rows) {
189
+ console.log(` ${row.type.padEnd(20)} ${row.count}`);
190
+ }
191
+ if (branches.rows.length > 0) {
192
+ console.log(` Branches:`);
193
+ for (const row of branches.rows) {
194
+ console.log(` ${row.status.padEnd(20)} ${row.count}`);
195
+ }
196
+ }
197
+ if (lastActivity.rows[0]?.last) {
198
+ console.log(`\n Last activity: ${new Date(lastActivity.rows[0].last).toLocaleString()}`);
199
+ }
200
+ // Next steps for small graphs
201
+ if (totalNodes < 50) {
202
+ console.log(`\n Next steps:`);
203
+ console.log(` codify bootstrap Mine more git history`);
204
+ console.log(` Ask Claude: "What decisions were made about [topic]?"`);
205
+ }
206
+ console.log("");
207
+ await closePool();
208
+ }
209
+ catch (err) {
210
+ const message = err instanceof Error ? err.message : String(err);
211
+ if (message.includes("ECONNREFUSED")) {
212
+ console.error("\n ERROR: Cannot connect to Codify services.");
213
+ console.error(" Run 'codify init' to start the infrastructure.\n");
214
+ }
215
+ else if (message.includes("ANTHROPIC_API_KEY")) {
216
+ console.error("\n ERROR: ANTHROPIC_API_KEY not set.");
217
+ console.error(" Export your API key: export ANTHROPIC_API_KEY=sk-...\n");
218
+ }
219
+ else {
220
+ console.error(`\n ERROR: ${message}\n`);
221
+ }
222
+ process.exit(1);
223
+ }
224
+ });
225
+ /**
226
+ * Render a simple ASCII bar.
227
+ * value/max scaled to width characters using block characters.
228
+ */
229
+ function renderBar(value, max, width) {
230
+ const filled = max > 0 ? Math.round((value / max) * width) : 0;
231
+ const empty = width - filled;
232
+ return "[" + "#".repeat(filled) + " ".repeat(empty) + "]";
233
+ }
234
+ /**
235
+ * Truncate a string to maxLen characters, adding "..." if truncated.
236
+ */
237
+ function truncate(str, maxLen) {
238
+ if (str.length <= maxLen)
239
+ return str;
240
+ return str.slice(0, maxLen - 3) + "...";
241
+ }
242
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const timelineCommand: Command;
3
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/commands/timeline.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,eAAO,MAAM,eAAe,SA2ZxB,CAAC"}