@codified/cli 0.3.9 → 0.4.1
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/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +164 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +4 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +291 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js +47 -8
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +5 -4
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +205 -3
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/collect.d.ts +1 -1
- package/dist/commands/collect.d.ts.map +1 -1
- package/dist/commands/collect.js +15 -8
- package/dist/commands/collect.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +59 -3
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/embed.d.ts +3 -0
- package/dist/commands/embed.d.ts.map +1 -0
- package/dist/commands/embed.js +164 -0
- package/dist/commands/embed.js.map +1 -0
- package/dist/commands/explain.d.ts.map +1 -1
- package/dist/commands/explain.js +8 -5
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +8 -4
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/gaps.d.ts.map +1 -1
- package/dist/commands/gaps.js +61 -25
- package/dist/commands/gaps.js.map +1 -1
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +7 -4
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/import-cmd.d.ts.map +1 -1
- package/dist/commands/import-cmd.js +9 -6
- package/dist/commands/import-cmd.js.map +1 -1
- package/dist/commands/refresh-freshness.d.ts +3 -0
- package/dist/commands/refresh-freshness.d.ts.map +1 -0
- package/dist/commands/refresh-freshness.js +90 -0
- package/dist/commands/refresh-freshness.js.map +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +167 -19
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +81 -7
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +110 -81
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/timeline.d.ts.map +1 -1
- package/dist/commands/timeline.js +8 -6
- package/dist/commands/timeline.js.map +1 -1
- package/dist/commands/triage.d.ts.map +1 -1
- package/dist/commands/triage.js +8 -5
- package/dist/commands/triage.js.map +1 -1
- package/dist/index.js +577 -465
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +6 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +12 -0
- package/dist/lib/config.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from "vitest";
|
|
2
|
+
let pool;
|
|
3
|
+
let testProjectId;
|
|
4
|
+
const DEFAULT_PROJECT_ID = "00000000-0000-0000-0000-000000000000";
|
|
5
|
+
beforeAll(async () => {
|
|
6
|
+
process.env.DATABASE_URL =
|
|
7
|
+
process.env.DATABASE_URL ??
|
|
8
|
+
"postgresql://codify:codify@localhost:5432/codify";
|
|
9
|
+
const pg = await import("pg");
|
|
10
|
+
pool = new pg.default.Pool({ connectionString: process.env.DATABASE_URL });
|
|
11
|
+
// Create a test project
|
|
12
|
+
const result = await pool.query("INSERT INTO projects (name, description) VALUES ($1, $2) RETURNING id", ["test-isolation-" + Date.now(), "Test project for isolation tests"]);
|
|
13
|
+
testProjectId = result.rows[0].id;
|
|
14
|
+
// Insert test nodes in the test project
|
|
15
|
+
await pool.query(`INSERT INTO nodes (id, type, layer, properties, metadata, confidence, freshness, source_system, source_reference, project_id)
|
|
16
|
+
VALUES (gen_random_uuid(), 'Decision', 'permanent', '{"title": "Test Auth Decision", "description": "test auth decision"}', '{}', 0.8, 1.0, 'test', 'test', $1)`, [testProjectId]);
|
|
17
|
+
await pool.query(`INSERT INTO nodes (id, type, layer, properties, metadata, confidence, freshness, source_system, source_reference, project_id)
|
|
18
|
+
VALUES (gen_random_uuid(), 'Gap', 'permanent', '{"title": "Test Gap", "severity": "high", "description": "test gap"}', '{}', 0.8, 1.0, 'test', 'test', $1)`, [testProjectId]);
|
|
19
|
+
});
|
|
20
|
+
afterAll(async () => {
|
|
21
|
+
await pool.query("DELETE FROM nodes WHERE project_id = $1", [testProjectId]);
|
|
22
|
+
await pool.query("DELETE FROM projects WHERE id = $1", [testProjectId]);
|
|
23
|
+
await pool.end();
|
|
24
|
+
});
|
|
25
|
+
describe("Project Isolation", () => {
|
|
26
|
+
it("nodes in test project are not visible from default project", async () => {
|
|
27
|
+
const result = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND properties::text ILIKE '%Test Auth Decision%'`, [DEFAULT_PROJECT_ID]);
|
|
28
|
+
expect(result.rows.length).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
it("nodes in test project are visible when querying that project", async () => {
|
|
31
|
+
const result = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND properties::text ILIKE '%Test Auth Decision%'`, [testProjectId]);
|
|
32
|
+
expect(result.rows.length).toBe(1);
|
|
33
|
+
});
|
|
34
|
+
it("gaps in test project are isolated", async () => {
|
|
35
|
+
const defaultGaps = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND type = 'Gap' AND properties::text ILIKE '%Test Gap%'`, [DEFAULT_PROJECT_ID]);
|
|
36
|
+
expect(defaultGaps.rows.length).toBe(0);
|
|
37
|
+
const testGaps = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND type = 'Gap' AND properties::text ILIKE '%Test Gap%'`, [testProjectId]);
|
|
38
|
+
expect(testGaps.rows.length).toBe(1);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("Search Keyword Splitting", () => {
|
|
42
|
+
beforeAll(async () => {
|
|
43
|
+
await pool.query(`INSERT INTO nodes (id, type, layer, properties, metadata, confidence, freshness, source_system, source_reference, project_id)
|
|
44
|
+
VALUES (gen_random_uuid(), 'CodeArtifact', 'permanent', '{"title": "Authentication Middleware Handler", "description": "handles auth middleware"}', '{}', 0.8, 1.0, 'test', 'test', $1)`, [testProjectId]);
|
|
45
|
+
});
|
|
46
|
+
it("search splits multi-word queries into keywords", async () => {
|
|
47
|
+
const result = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND properties::text ILIKE '%auth%' AND properties::text ILIKE '%middleware%'`, [testProjectId]);
|
|
48
|
+
expect(result.rows.length).toBeGreaterThanOrEqual(1);
|
|
49
|
+
});
|
|
50
|
+
it("keyword splitting finds results that exact phrase would miss", async () => {
|
|
51
|
+
// "middleware authentication" as a phrase doesn't appear in "Authentication Middleware Handler"
|
|
52
|
+
// but splitting into keywords "middleware" + "authentication" finds it via AND
|
|
53
|
+
const phraseResult = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND properties::text ILIKE '%middleware authentication handler xyz%'`, [testProjectId]);
|
|
54
|
+
expect(phraseResult.rows.length).toBe(0);
|
|
55
|
+
// But splitting "middleware" AND "authentication" works
|
|
56
|
+
const splitResult = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND properties::text ILIKE '%middleware%' AND properties::text ILIKE '%authentication%'`, [testProjectId]);
|
|
57
|
+
expect(splitResult.rows.length).toBeGreaterThanOrEqual(1);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("Metabolism Audit", () => {
|
|
61
|
+
let testNodeId;
|
|
62
|
+
beforeAll(async () => {
|
|
63
|
+
// Get a node ID from the test project for audit events
|
|
64
|
+
const nodeResult = await pool.query(`SELECT id FROM nodes WHERE project_id = $1 LIMIT 1`, [testProjectId]);
|
|
65
|
+
testNodeId = nodeResult.rows[0].id;
|
|
66
|
+
// Insert test audit events
|
|
67
|
+
await pool.query(`INSERT INTO metabolism_audit (event_type, node_ids, action, reason, metadata)
|
|
68
|
+
VALUES ($1, $2, $3, $4, $5)`, [
|
|
69
|
+
"metabolism.decay.applied",
|
|
70
|
+
[testNodeId],
|
|
71
|
+
"decayed",
|
|
72
|
+
"Node freshness below threshold",
|
|
73
|
+
JSON.stringify({ oldFreshness: 0.8, newFreshness: 0.6 }),
|
|
74
|
+
]);
|
|
75
|
+
await pool.query(`INSERT INTO metabolism_audit (event_type, node_ids, action, reason, metadata)
|
|
76
|
+
VALUES ($1, $2, $3, $4, $5)`, [
|
|
77
|
+
"metabolism.gate.promoted",
|
|
78
|
+
[testNodeId],
|
|
79
|
+
"promoted",
|
|
80
|
+
"High confidence node promoted to permanent",
|
|
81
|
+
JSON.stringify({ confidence: 0.95 }),
|
|
82
|
+
]);
|
|
83
|
+
await pool.query(`INSERT INTO metabolism_audit (event_type, node_ids, action, reason, metadata)
|
|
84
|
+
VALUES ($1, $2, $3, $4, $5)`, [
|
|
85
|
+
"metabolism.prune.archived",
|
|
86
|
+
[testNodeId],
|
|
87
|
+
"pruned",
|
|
88
|
+
"Stale node archived after 90 days",
|
|
89
|
+
JSON.stringify({}),
|
|
90
|
+
]);
|
|
91
|
+
});
|
|
92
|
+
afterAll(async () => {
|
|
93
|
+
await pool.query(`DELETE FROM metabolism_audit WHERE node_ids @> $1`, [[testNodeId]]);
|
|
94
|
+
});
|
|
95
|
+
it("audit events are queryable by action type", async () => {
|
|
96
|
+
const result = await pool.query(`SELECT * FROM metabolism_audit WHERE action = $1 AND node_ids @> $2`, ["decayed", [testNodeId]]);
|
|
97
|
+
expect(result.rows.length).toBe(1);
|
|
98
|
+
expect(result.rows[0].reason).toBe("Node freshness below threshold");
|
|
99
|
+
});
|
|
100
|
+
it("audit events are filterable by time range", async () => {
|
|
101
|
+
const recent = await pool.query(`SELECT * FROM metabolism_audit WHERE created_at > NOW() - INTERVAL '1 hour' AND node_ids @> $1`, [[testNodeId]]);
|
|
102
|
+
expect(recent.rows.length).toBe(3);
|
|
103
|
+
const future = await pool.query(`SELECT * FROM metabolism_audit WHERE created_at > NOW() + INTERVAL '1 hour' AND node_ids @> $1`, [[testNodeId]]);
|
|
104
|
+
expect(future.rows.length).toBe(0);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe("Markdown Connector SourceRef", () => {
|
|
108
|
+
it("document sourceRef format uses doc: prefix", async () => {
|
|
109
|
+
// Insert a node with a document sourceRef
|
|
110
|
+
await pool.query(`INSERT INTO nodes (id, type, layer, properties, metadata, confidence, freshness, source_system, source_reference, project_id)
|
|
111
|
+
VALUES (gen_random_uuid(), 'Decision', 'permanent', '{"title": "Use PostgreSQL ADR", "description": "ADR-003: Use PostgreSQL for graph storage"}', '{}', 0.9, 1.0, 'markdown', 'doc:docs/adr/003-use-postgresql.md', $1)`, [testProjectId]);
|
|
112
|
+
// Verify sourceRef dedup would match
|
|
113
|
+
const result = await pool.query(`SELECT * FROM nodes WHERE source_reference = $1 AND project_id = $2`, ["doc:docs/adr/003-use-postgresql.md", testProjectId]);
|
|
114
|
+
expect(result.rows.length).toBe(1);
|
|
115
|
+
expect(result.rows[0].properties.title).toBe("Use PostgreSQL ADR");
|
|
116
|
+
expect(result.rows[0].source_system).toBe("markdown");
|
|
117
|
+
});
|
|
118
|
+
it("document nodes are searchable alongside git nodes", async () => {
|
|
119
|
+
const result = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND properties::text ILIKE '%PostgreSQL%'`, [testProjectId]);
|
|
120
|
+
expect(result.rows.length).toBeGreaterThanOrEqual(1);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe("Export/Import Round-Trip", () => {
|
|
124
|
+
it("export and import preserves data", async () => {
|
|
125
|
+
// Count nodes in the test project
|
|
126
|
+
const countBefore = await pool.query(`SELECT count(*) as cnt FROM nodes WHERE project_id = $1 AND superseded_by IS NULL`, [testProjectId]);
|
|
127
|
+
const originalCount = parseInt(countBefore.rows[0].cnt, 10);
|
|
128
|
+
expect(originalCount).toBeGreaterThan(0);
|
|
129
|
+
// Export nodes
|
|
130
|
+
const exported = await pool.query(`SELECT * FROM nodes WHERE project_id = $1 AND superseded_by IS NULL`, [testProjectId]);
|
|
131
|
+
const rows = exported.rows;
|
|
132
|
+
// Delete all nodes from the test project
|
|
133
|
+
await pool.query("DELETE FROM nodes WHERE project_id = $1", [
|
|
134
|
+
testProjectId,
|
|
135
|
+
]);
|
|
136
|
+
// Verify deletion
|
|
137
|
+
const countAfterDelete = await pool.query(`SELECT count(*) as cnt FROM nodes WHERE project_id = $1`, [testProjectId]);
|
|
138
|
+
expect(parseInt(countAfterDelete.rows[0].cnt, 10)).toBe(0);
|
|
139
|
+
// Re-insert exported nodes
|
|
140
|
+
for (const row of rows) {
|
|
141
|
+
await pool.query(`INSERT INTO nodes (id, type, layer, properties, metadata, confidence, freshness, source_system, source_reference, project_id)
|
|
142
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, [
|
|
143
|
+
row.id,
|
|
144
|
+
row.type,
|
|
145
|
+
row.layer,
|
|
146
|
+
row.properties,
|
|
147
|
+
row.metadata,
|
|
148
|
+
row.confidence,
|
|
149
|
+
row.freshness,
|
|
150
|
+
row.source_system,
|
|
151
|
+
row.source_reference,
|
|
152
|
+
row.project_id,
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
155
|
+
// Count again
|
|
156
|
+
const countAfterImport = await pool.query(`SELECT count(*) as cnt FROM nodes WHERE project_id = $1 AND superseded_by IS NULL`, [testProjectId]);
|
|
157
|
+
expect(parseInt(countAfterImport.rows[0].cnt, 10)).toBe(originalCount);
|
|
158
|
+
// Verify specific property is preserved
|
|
159
|
+
const verify = await pool.query(`SELECT properties FROM nodes WHERE project_id = $1 AND properties::text ILIKE '%Test Auth Decision%'`, [testProjectId]);
|
|
160
|
+
expect(verify.rows.length).toBe(1);
|
|
161
|
+
expect(verify.rows[0].properties.title).toBe("Test Auth Decision");
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEnE,IAAI,IAAS,CAAC;AACd,IAAI,aAAqB,CAAC;AAC1B,MAAM,kBAAkB,GAAG,sCAAsC,CAAC;AAElE,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,OAAO,CAAC,GAAG,CAAC,YAAY;QACtB,OAAO,CAAC,GAAG,CAAC,YAAY;YACxB,kDAAkD,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAE3E,wBAAwB;IACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,uEAAuE,EACvE,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,kCAAkC,CAAC,CACrE,CAAC;IACF,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElC,wCAAwC;IACxC,MAAM,IAAI,CAAC,KAAK,CACd;qKACiK,EACjK,CAAC,aAAa,CAAC,CAChB,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd;gKAC4J,EAC5J,CAAC,aAAa,CAAC,CAChB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,IAAI,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,6FAA6F,EAC7F,CAAC,kBAAkB,CAAC,CACrB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,6FAA6F,EAC7F,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAClC,oGAAoG,EACpG,CAAC,kBAAkB,CAAC,CACrB,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B,oGAAoG,EACpG,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAI,CAAC,KAAK,CACd;+LACyL,EACzL,CAAC,aAAa,CAAC,CAChB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,yHAAyH,EACzH,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,gGAAgG;QAChG,+EAA+E;QAC/E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CACnC,gHAAgH,EAChH,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzC,wDAAwD;QACxD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAClC,mIAAmI,EACnI,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,UAAkB,CAAC;IAEvB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,uDAAuD;QACvD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CACjC,oDAAoD,EACpD,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnC,2BAA2B;QAC3B,MAAM,IAAI,CAAC,KAAK,CACd;mCAC6B,EAC7B;YACE,0BAA0B;YAC1B,CAAC,UAAU,CAAC;YACZ,SAAS;YACT,gCAAgC;YAChC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;SACzD,CACF,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CACd;mCAC6B,EAC7B;YACE,0BAA0B;YAC1B,CAAC,UAAU,CAAC;YACZ,UAAU;YACV,4CAA4C;YAC5C,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SACrC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CACd;mCAC6B,EAC7B;YACE,2BAA2B;YAC3B,CAAC,UAAU,CAAC;YACZ,QAAQ;YACR,mCAAmC;YACnC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACnB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,IAAI,CAAC,KAAK,CACd,mDAAmD,EACnD,CAAC,CAAC,UAAU,CAAC,CAAC,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,qEAAqE,EACrE,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,CAAC,CAC1B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,gGAAgG,EAChG,CAAC,CAAC,UAAU,CAAC,CAAC,CACf,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,gGAAgG,EAChG,CAAC,CAAC,UAAU,CAAC,CAAC,CACf,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,0CAA0C;QAC1C,MAAM,IAAI,CAAC,KAAK,CACd;gOAC0N,EAC1N,CAAC,aAAa,CAAC,CAChB,CAAC;QAEF,qCAAqC;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,qEAAqE,EACrE,CAAC,oCAAoC,EAAE,aAAa,CAAC,CACtD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,qFAAqF,EACrF,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,kCAAkC;QAClC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAClC,mFAAmF,EACnF,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEzC,eAAe;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B,qEAAqE,EACrE,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE3B,yCAAyC;QACzC,MAAM,IAAI,CAAC,KAAK,CAAC,yCAAyC,EAAE;YAC1D,aAAa;SACd,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,KAAK,CACvC,yDAAyD,EACzD,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3D,2BAA2B;QAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,KAAK,CACd;0DACkD,EAClD;gBACE,GAAG,CAAC,EAAE;gBACN,GAAG,CAAC,IAAI;gBACR,GAAG,CAAC,KAAK;gBACT,GAAG,CAAC,UAAU;gBACd,GAAG,CAAC,QAAQ;gBACZ,GAAG,CAAC,UAAU;gBACd,GAAG,CAAC,SAAS;gBACb,GAAG,CAAC,aAAa;gBACjB,GAAG,CAAC,gBAAgB;gBACpB,GAAG,CAAC,UAAU;aACf,CACF,CAAC;QACJ,CAAC;QAED,cAAc;QACd,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,KAAK,CACvC,mFAAmF,EACnF,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvE,wCAAwC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,sGAAsG,EACtG,CAAC,aAAa,CAAC,CAChB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwMpC,eAAO,MAAM,UAAU,SAwBQ,CAAC"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// codify add — record context into the graph from the terminal
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
|
-
import { loadProjectConfig } from "../lib/config.js";
|
|
4
|
+
import { loadProjectConfig, getProjectId } from "../lib/config.js";
|
|
5
5
|
// --- Color helpers (ANSI escape codes) ---
|
|
6
6
|
const RESET = "\x1b[0m";
|
|
7
7
|
const BOLD = "\x1b[1m";
|
|
@@ -43,6 +43,7 @@ async function insertNode(typeDef, title, opts) {
|
|
|
43
43
|
console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
|
|
44
44
|
process.exit(1);
|
|
45
45
|
}
|
|
46
|
+
const projectId = getProjectId();
|
|
46
47
|
const nodeId = randomUUID();
|
|
47
48
|
const tags = opts.tags ? opts.tags.split(",").map((t) => t.trim()).filter(Boolean) : [];
|
|
48
49
|
const properties = {
|
|
@@ -53,8 +54,8 @@ async function insertNode(typeDef, title, opts) {
|
|
|
53
54
|
properties.description = opts.description;
|
|
54
55
|
}
|
|
55
56
|
// Insert the node
|
|
56
|
-
await pool.query(`INSERT INTO nodes (id, type, layer, confidence, freshness, source_system, source_reference, source_agent_id, source_reliability, properties, tags)
|
|
57
|
-
VALUES ($1, $2, 'permanent', 0.8, 1.0, 'cli', 'codify-add', 'user', 0.8, $3, $4)`, [nodeId, typeDef.type, JSON.stringify(properties), tags]);
|
|
57
|
+
await pool.query(`INSERT INTO nodes (id, type, layer, confidence, freshness, source_system, source_reference, source_agent_id, source_reliability, properties, tags, project_id)
|
|
58
|
+
VALUES ($1, $2, 'permanent', 0.8, 1.0, 'cli', 'codify-add', 'user', 0.8, $3, $4, $5)`, [nodeId, typeDef.type, JSON.stringify(properties), tags, projectId]);
|
|
58
59
|
// If --link is provided, also create an edge
|
|
59
60
|
if (opts.link) {
|
|
60
61
|
const edgeType = opts.linkType ?? "relates_to";
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqIpC,eAAO,MAAM,YAAY,SA4OrB,CAAC"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// codify audit — show metabolism audit trail
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { loadProjectConfig, getProjectId } from "../lib/config.js";
|
|
4
|
+
// --- ANSI color helpers ---
|
|
5
|
+
const RESET = "\x1b[0m";
|
|
6
|
+
const BOLD = "\x1b[1m";
|
|
7
|
+
const DIM = "\x1b[2m";
|
|
8
|
+
const GREEN = "\x1b[32m";
|
|
9
|
+
const YELLOW = "\x1b[33m";
|
|
10
|
+
const RED = "\x1b[31m";
|
|
11
|
+
const CYAN = "\x1b[36m";
|
|
12
|
+
const MAGENTA = "\x1b[35m";
|
|
13
|
+
// --- Duration parsing ---
|
|
14
|
+
/**
|
|
15
|
+
* Parse a duration string like "7d", "1h", "24h", "30m" into milliseconds.
|
|
16
|
+
*/
|
|
17
|
+
function parseDuration(input) {
|
|
18
|
+
const match = input.match(/^(\d+)(d|h|m)$/);
|
|
19
|
+
if (!match)
|
|
20
|
+
return null;
|
|
21
|
+
const value = parseInt(match[1], 10);
|
|
22
|
+
const unit = match[2];
|
|
23
|
+
switch (unit) {
|
|
24
|
+
case "d":
|
|
25
|
+
return value * 24 * 60 * 60 * 1000;
|
|
26
|
+
case "h":
|
|
27
|
+
return value * 60 * 60 * 1000;
|
|
28
|
+
case "m":
|
|
29
|
+
return value * 60 * 1000;
|
|
30
|
+
default:
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a cutoff date from the --since flag.
|
|
36
|
+
* Default: 24 hours ago.
|
|
37
|
+
*/
|
|
38
|
+
function resolveCutoff(since) {
|
|
39
|
+
const ms = parseDuration(since);
|
|
40
|
+
if (ms === null) {
|
|
41
|
+
console.error(`\n ERROR: Invalid duration "${since}". Use formats like 24h, 7d, 30m.\n`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
return new Date(Date.now() - ms);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Map an action to its display color.
|
|
48
|
+
*/
|
|
49
|
+
function actionColor(action) {
|
|
50
|
+
switch (action) {
|
|
51
|
+
case "promoted":
|
|
52
|
+
return GREEN;
|
|
53
|
+
case "decayed":
|
|
54
|
+
return YELLOW;
|
|
55
|
+
case "pruned":
|
|
56
|
+
return RED;
|
|
57
|
+
case "gate_rejected":
|
|
58
|
+
return RED;
|
|
59
|
+
case "merged":
|
|
60
|
+
return CYAN;
|
|
61
|
+
case "evolved":
|
|
62
|
+
return MAGENTA;
|
|
63
|
+
default:
|
|
64
|
+
return DIM;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Map an action to an icon prefix.
|
|
69
|
+
*/
|
|
70
|
+
function actionIcon(action) {
|
|
71
|
+
switch (action) {
|
|
72
|
+
case "promoted":
|
|
73
|
+
return "+";
|
|
74
|
+
case "decayed":
|
|
75
|
+
return "~";
|
|
76
|
+
case "pruned":
|
|
77
|
+
return "x";
|
|
78
|
+
case "gate_rejected":
|
|
79
|
+
return "!";
|
|
80
|
+
case "merged":
|
|
81
|
+
return "=";
|
|
82
|
+
case "evolved":
|
|
83
|
+
return "^";
|
|
84
|
+
default:
|
|
85
|
+
return "*";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Format a timestamp for display (HH:MM:SS).
|
|
90
|
+
*/
|
|
91
|
+
function formatTime(date) {
|
|
92
|
+
return date.toLocaleTimeString("en-US", {
|
|
93
|
+
hour12: false,
|
|
94
|
+
hour: "2-digit",
|
|
95
|
+
minute: "2-digit",
|
|
96
|
+
second: "2-digit",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Truncate a string, adding "..." if needed.
|
|
101
|
+
*/
|
|
102
|
+
function truncate(str, maxLen) {
|
|
103
|
+
if (str.length <= maxLen)
|
|
104
|
+
return str;
|
|
105
|
+
return str.slice(0, maxLen - 3) + "...";
|
|
106
|
+
}
|
|
107
|
+
// --- Command definition ---
|
|
108
|
+
export const auditCommand = new Command("audit")
|
|
109
|
+
.description("Show metabolism audit trail — what the graph auto-maintained")
|
|
110
|
+
.option("--action <type>", "Filter by action type (e.g. promoted, decayed, pruned, gate_rejected)")
|
|
111
|
+
.option("--since <duration>", "Time range (e.g. 7d, 1h, 24h, 30m)", "24h")
|
|
112
|
+
.option("--limit <n>", "Maximum events to show", "100")
|
|
113
|
+
.option("--json", "Output structured JSON")
|
|
114
|
+
.action(async (opts) => {
|
|
115
|
+
try {
|
|
116
|
+
await loadProjectConfig();
|
|
117
|
+
const { getPool, closePool } = await import("@codify/graph");
|
|
118
|
+
const pool = getPool();
|
|
119
|
+
try {
|
|
120
|
+
await pool.query("SELECT 1");
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
const projectId = getProjectId();
|
|
127
|
+
const cutoff = resolveCutoff(opts.since);
|
|
128
|
+
const limit = parseInt(opts.limit, 10);
|
|
129
|
+
if (isNaN(limit) || limit < 1) {
|
|
130
|
+
console.error("\n ERROR: --limit must be a positive integer.\n");
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
// --- Build query ---
|
|
134
|
+
const conditions = ["ma.created_at >= $1"];
|
|
135
|
+
const params = [cutoff.toISOString()];
|
|
136
|
+
let paramIdx = 2;
|
|
137
|
+
if (opts.action) {
|
|
138
|
+
conditions.push(`ma.action = $${paramIdx++}`);
|
|
139
|
+
params.push(opts.action);
|
|
140
|
+
}
|
|
141
|
+
// Scope to project: only include audit events whose node_ids overlap
|
|
142
|
+
// with nodes belonging to this project. Events with empty node_ids
|
|
143
|
+
// (system-level) are also included.
|
|
144
|
+
conditions.push(`(ma.node_ids = '{}' OR EXISTS (
|
|
145
|
+
SELECT 1 FROM nodes n
|
|
146
|
+
WHERE n.id = ANY(ma.node_ids::uuid[]) AND n.project_id = $${paramIdx++}
|
|
147
|
+
))`);
|
|
148
|
+
params.push(projectId);
|
|
149
|
+
// Check if the table exists first
|
|
150
|
+
try {
|
|
151
|
+
await pool.query("SELECT 1 FROM information_schema.tables WHERE table_name = 'metabolism_audit' LIMIT 1");
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// table doesn't exist at all — show empty state
|
|
155
|
+
printEmptyState(opts.since);
|
|
156
|
+
await closePool();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const tableCheck = await pool.query("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'metabolism_audit') as exists");
|
|
160
|
+
if (!tableCheck.rows[0].exists) {
|
|
161
|
+
printEmptyState(opts.since);
|
|
162
|
+
await closePool();
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const result = await pool.query(`SELECT ma.id, ma.event_type, ma.node_ids, ma.action, ma.reason,
|
|
166
|
+
ma.metadata, ma.created_at
|
|
167
|
+
FROM metabolism_audit ma
|
|
168
|
+
WHERE ${conditions.join(" AND ")}
|
|
169
|
+
ORDER BY ma.created_at DESC
|
|
170
|
+
LIMIT $${paramIdx}`, [...params, limit]);
|
|
171
|
+
if (result.rows.length === 0) {
|
|
172
|
+
printEmptyState(opts.since);
|
|
173
|
+
await closePool();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// --- Resolve node titles ---
|
|
177
|
+
// Collect all unique node_ids across all events
|
|
178
|
+
const allNodeIds = new Set();
|
|
179
|
+
for (const row of result.rows) {
|
|
180
|
+
for (const nid of row.node_ids) {
|
|
181
|
+
allNodeIds.add(nid);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Batch-fetch node titles
|
|
185
|
+
const titleMap = new Map();
|
|
186
|
+
if (allNodeIds.size > 0) {
|
|
187
|
+
const nodeIdsArray = [...allNodeIds];
|
|
188
|
+
const titleResult = await pool.query(`SELECT id, properties, metadata FROM nodes
|
|
189
|
+
WHERE id = ANY($1::uuid[])`, [nodeIdsArray]);
|
|
190
|
+
for (const row of titleResult.rows) {
|
|
191
|
+
const props = row.properties ?? {};
|
|
192
|
+
const meta = row.metadata ?? {};
|
|
193
|
+
const title = props.title ??
|
|
194
|
+
meta.title ??
|
|
195
|
+
props.name ??
|
|
196
|
+
meta.name ??
|
|
197
|
+
null;
|
|
198
|
+
if (title) {
|
|
199
|
+
titleMap.set(row.id, title);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Build enriched events
|
|
204
|
+
const events = result.rows.map((row) => {
|
|
205
|
+
const nodeTitles = new Map();
|
|
206
|
+
for (const nid of row.node_ids) {
|
|
207
|
+
nodeTitles.set(nid, titleMap.get(nid) ?? nid.slice(0, 8));
|
|
208
|
+
}
|
|
209
|
+
return { ...row, node_titles: nodeTitles };
|
|
210
|
+
});
|
|
211
|
+
// --- JSON output ---
|
|
212
|
+
if (opts.json) {
|
|
213
|
+
const jsonEvents = events.map((ev) => ({
|
|
214
|
+
id: ev.id,
|
|
215
|
+
event_type: ev.event_type,
|
|
216
|
+
action: ev.action,
|
|
217
|
+
reason: ev.reason,
|
|
218
|
+
node_ids: ev.node_ids,
|
|
219
|
+
node_titles: Object.fromEntries(ev.node_titles),
|
|
220
|
+
metadata: ev.metadata,
|
|
221
|
+
created_at: ev.created_at,
|
|
222
|
+
}));
|
|
223
|
+
console.log(JSON.stringify({
|
|
224
|
+
since: opts.since,
|
|
225
|
+
cutoff: cutoff.toISOString(),
|
|
226
|
+
count: events.length,
|
|
227
|
+
events: jsonEvents,
|
|
228
|
+
}, null, 2));
|
|
229
|
+
await closePool();
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// --- Pretty output: group by action ---
|
|
233
|
+
const actionGroups = new Map();
|
|
234
|
+
for (const ev of events) {
|
|
235
|
+
const existing = actionGroups.get(ev.action);
|
|
236
|
+
if (existing) {
|
|
237
|
+
existing.push(ev);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
actionGroups.set(ev.action, [ev]);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Sort action groups by count descending
|
|
244
|
+
const sortedActions = [...actionGroups.entries()].sort((a, b) => b[1].length - a[1].length);
|
|
245
|
+
console.log(`\n ${BOLD}Codify — Metabolism Audit (last ${opts.since})${RESET}\n`);
|
|
246
|
+
// Summary line
|
|
247
|
+
const summaryParts = [];
|
|
248
|
+
for (const [action, group] of sortedActions) {
|
|
249
|
+
const color = actionColor(action);
|
|
250
|
+
summaryParts.push(`${color}${group.length} ${action}${RESET}`);
|
|
251
|
+
}
|
|
252
|
+
console.log(` ${events.length} events: ${summaryParts.join(", ")}\n`);
|
|
253
|
+
// Display each group
|
|
254
|
+
for (const [action, group] of sortedActions) {
|
|
255
|
+
const color = actionColor(action);
|
|
256
|
+
const icon = actionIcon(action);
|
|
257
|
+
console.log(` ${color}${BOLD}${action.toUpperCase()}${RESET} ${DIM}(${group.length})${RESET}`);
|
|
258
|
+
for (const ev of group) {
|
|
259
|
+
const created = new Date(ev.created_at);
|
|
260
|
+
const timeStr = formatTime(created);
|
|
261
|
+
const dateStr = created.toISOString().slice(0, 10);
|
|
262
|
+
// Build node label
|
|
263
|
+
const nodeLabels = [...ev.node_titles.values()]
|
|
264
|
+
.map((t) => truncate(t, 50))
|
|
265
|
+
.join(", ");
|
|
266
|
+
const reasonStr = ev.reason ? ` -- ${truncate(ev.reason, 60)}` : "";
|
|
267
|
+
console.log(` ${color}${icon}${RESET} ${DIM}${dateStr} ${timeStr}${RESET} ${nodeLabels || DIM + "(no nodes)" + RESET}${DIM}${reasonStr}${RESET}`);
|
|
268
|
+
}
|
|
269
|
+
console.log("");
|
|
270
|
+
}
|
|
271
|
+
// Footer
|
|
272
|
+
console.log(` ${DIM}Flags: --action <type> --since <duration> --limit <n> --json${RESET}`);
|
|
273
|
+
console.log("");
|
|
274
|
+
await closePool();
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
278
|
+
if (message.includes("ECONNREFUSED")) {
|
|
279
|
+
console.error("\n ERROR: Cannot connect to Codify services.");
|
|
280
|
+
console.error(" Run 'codify init' to start the infrastructure.\n");
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
console.error(`\n ERROR: ${message}\n`);
|
|
284
|
+
}
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
function printEmptyState(since) {
|
|
289
|
+
console.log(`\n No metabolism events in the last ${since}. The graph maintains itself automatically when \`codify start\` is running.\n`);
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,gBAAgB,SA+LzB,CAAC"}
|