@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 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,YAAY,SAmKrB,CAAC"}
@@ -0,0 +1,157 @@
1
+ // codify reset — drop graph data and re-run migrations
2
+ //
3
+ // Default: TRUNCATE all data tables, re-run migrations. Docker stays running.
4
+ // --hard: Stop Docker, remove volumes, rebuild everything from scratch.
5
+ import { Command } from "commander";
6
+ import { resolve } from "node:path";
7
+ import { spawnSync } from "node:child_process";
8
+ import { existsSync } from "node:fs";
9
+ import { loadProjectConfig } from "../lib/config.js";
10
+ import { confirm } from "../lib/prompt.js";
11
+ import { getMigrationsDir } from "../lib/paths.js";
12
+ import { runMigrations } from "../lib/migrate.js";
13
+ export const resetCommand = new Command("reset")
14
+ .description("Reset the context graph (drop data, re-run migrations)")
15
+ .option("--hard", "Full reset: stop Docker, remove volumes, rebuild")
16
+ .option("--yes", "Skip confirmation prompt")
17
+ .action(async (opts) => {
18
+ try {
19
+ const cwd = process.cwd();
20
+ const configDir = resolve(cwd, ".codify");
21
+ const dockerDir = resolve(configDir, "docker");
22
+ const isHard = !!opts.hard;
23
+ const mode = isHard ? "HARD" : "SOFT";
24
+ console.log(`\n Codify Reset (${mode})\n`);
25
+ if (isHard) {
26
+ console.log(" This will:");
27
+ console.log(" - Stop all Docker services");
28
+ console.log(" - Remove all Docker volumes (all data permanently deleted)");
29
+ console.log(" - Rebuild and restart containers");
30
+ console.log(" - Re-run all migrations\n");
31
+ }
32
+ else {
33
+ console.log(" This will:");
34
+ console.log(" - Truncate all data tables (nodes, edges, etc.)");
35
+ console.log(" - Clear migration tracking");
36
+ console.log(" - Re-run all migrations");
37
+ console.log(" - Docker services remain running\n");
38
+ }
39
+ if (!opts.yes) {
40
+ const proceed = await confirm(" Are you sure?", false);
41
+ if (!proceed) {
42
+ console.log(" Aborted.\n");
43
+ process.exit(0);
44
+ }
45
+ }
46
+ if (isHard) {
47
+ // ── Hard reset: tear down Docker entirely ──────────────────
48
+ const composePath = resolve(dockerDir, "docker-compose.yml");
49
+ if (!existsSync(composePath)) {
50
+ console.error(" ERROR: docker-compose.yml not found at " + composePath);
51
+ console.error(" Run 'codify init' first.\n");
52
+ process.exit(1);
53
+ }
54
+ console.log("\n [1/3] Stopping Docker and removing volumes...");
55
+ const down = spawnSync("docker", ["compose", "-f", composePath, "down", "-v"], { stdio: "inherit" });
56
+ if (down.status !== 0) {
57
+ console.error(" ERROR: docker compose down -v failed.\n");
58
+ process.exit(1);
59
+ }
60
+ console.log(" Done.");
61
+ console.log("\n [2/3] Rebuilding and starting Docker services...");
62
+ const up = spawnSync("docker", ["compose", "-f", composePath, "up", "-d", "--build"], { stdio: "inherit" });
63
+ if (up.status !== 0) {
64
+ console.error(" ERROR: docker compose up failed.\n");
65
+ process.exit(1);
66
+ }
67
+ console.log(" Done.");
68
+ // Wait for PostgreSQL to be ready
69
+ console.log(" Waiting for PostgreSQL to accept connections...");
70
+ const { waitForPostgres } = await import("../lib/docker.js");
71
+ const pgReady = await waitForPostgres(dockerDir);
72
+ if (!pgReady) {
73
+ console.error(" ERROR: PostgreSQL did not become ready within 120s.\n");
74
+ process.exit(1);
75
+ }
76
+ console.log(" PostgreSQL is ready.");
77
+ console.log("\n [3/3] Running migrations...");
78
+ const databaseUrl = process.env.DATABASE_URL ?? "postgresql://codify:codify@localhost:5432/codify";
79
+ const migrationsDir = getMigrationsDir();
80
+ const result = await runMigrations(databaseUrl, migrationsDir);
81
+ console.log(` ${result.applied.length} migration${result.applied.length === 1 ? "" : "s"} applied.`);
82
+ }
83
+ else {
84
+ // ── Soft reset: truncate tables, re-run migrations ─────────
85
+ await loadProjectConfig();
86
+ const { getPool, closePool } = await import("@codify/graph");
87
+ const pool = getPool();
88
+ try {
89
+ await pool.query("SELECT 1");
90
+ }
91
+ catch {
92
+ console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
93
+ process.exit(1);
94
+ }
95
+ console.log(" [1/3] Truncating data tables...");
96
+ // Order matters: truncate in dependency order with CASCADE
97
+ const tablesToTruncate = [
98
+ "collection_plans",
99
+ "metabolism_audit",
100
+ "connector_sync_state",
101
+ "node_versions",
102
+ "edges",
103
+ "nodes",
104
+ "branches",
105
+ ];
106
+ for (const table of tablesToTruncate) {
107
+ try {
108
+ await pool.query(`TRUNCATE TABLE ${table} CASCADE`);
109
+ console.log(` Truncated: ${table}`);
110
+ }
111
+ catch (err) {
112
+ const msg = err instanceof Error ? err.message : String(err);
113
+ // Table may not exist if migrations haven't run yet — that's OK
114
+ if (msg.includes("does not exist")) {
115
+ console.log(` Skipped: ${table} (does not exist)`);
116
+ }
117
+ else {
118
+ throw err;
119
+ }
120
+ }
121
+ }
122
+ console.log("\n [2/3] Clearing migration tracking...");
123
+ try {
124
+ await pool.query("TRUNCATE TABLE _migrations");
125
+ console.log(" Migration history cleared.");
126
+ }
127
+ catch (err) {
128
+ const msg = err instanceof Error ? err.message : String(err);
129
+ if (msg.includes("does not exist")) {
130
+ console.log(" No migration history to clear.");
131
+ }
132
+ else {
133
+ throw err;
134
+ }
135
+ }
136
+ await closePool();
137
+ console.log("\n [3/3] Re-running migrations...");
138
+ const databaseUrl = process.env.DATABASE_URL ?? "postgresql://codify:codify@localhost:5432/codify";
139
+ const migrationsDir = getMigrationsDir();
140
+ const result = await runMigrations(databaseUrl, migrationsDir);
141
+ console.log(` ${result.applied.length} migration${result.applied.length === 1 ? "" : "s"} applied.`);
142
+ }
143
+ console.log("\n Reset complete. Run 'codify bootstrap' to rebuild the graph.\n");
144
+ }
145
+ catch (err) {
146
+ const message = err instanceof Error ? err.message : String(err);
147
+ if (message.includes("ECONNREFUSED")) {
148
+ console.error("\n ERROR: Cannot connect to Codify services.");
149
+ console.error(" Run 'codify init' to start the infrastructure.\n");
150
+ }
151
+ else {
152
+ console.error(`\n ERROR: ${message}\n`);
153
+ }
154
+ process.exit(1);
155
+ }
156
+ });
157
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const searchCommand: Command;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiDpC,eAAO,MAAM,aAAa,SA4KtB,CAAC"}
@@ -0,0 +1,183 @@
1
+ // codify search — search the context graph from the terminal
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 CYAN = "\x1b[36m";
9
+ const GREEN = "\x1b[32m";
10
+ const YELLOW = "\x1b[33m";
11
+ const MAGENTA = "\x1b[35m";
12
+ const WHITE = "\x1b[37m";
13
+ function typeColor(type) {
14
+ const colors = {
15
+ Decision: "\x1b[33m", // yellow
16
+ Feature: "\x1b[32m", // green
17
+ Metric: "\x1b[36m", // cyan
18
+ CustomerSignal: "\x1b[35m", // magenta
19
+ CodeArtifact: "\x1b[34m", // blue
20
+ Discussion: "\x1b[37m", // white
21
+ Gap: "\x1b[31m", // red
22
+ Study: "\x1b[36m", // cyan
23
+ Person: "\x1b[33m", // yellow
24
+ };
25
+ return `${colors[type] ?? DIM}${type}${RESET}`;
26
+ }
27
+ function freshnessLabel(freshness) {
28
+ if (freshness >= 0.8)
29
+ return `${GREEN}${freshness.toFixed(2)}${RESET}`;
30
+ if (freshness >= 0.5)
31
+ return `${YELLOW}${freshness.toFixed(2)}${RESET}`;
32
+ return `${DIM}${freshness.toFixed(2)}${RESET}`;
33
+ }
34
+ function truncate(str, maxLen) {
35
+ if (str.length <= maxLen)
36
+ return str;
37
+ return str.slice(0, maxLen - 3) + "...";
38
+ }
39
+ // --- Valid node types ---
40
+ const VALID_TYPES = [
41
+ "Decision", "Feature", "Metric", "CustomerSignal",
42
+ "CodeArtifact", "Discussion", "Gap", "Study", "Person",
43
+ ];
44
+ // --- Command definition ---
45
+ export const searchCommand = new Command("search")
46
+ .description("Search the context graph by keyword")
47
+ .argument("<query>", "Search query (keywords)")
48
+ .option("--type <type>", "Filter by node type: Decision, Feature, Metric, CustomerSignal, CodeArtifact, Discussion, Gap, Study, Person")
49
+ .option("--limit <n>", "Maximum results to show", "10")
50
+ .option("--freshness <min>", "Minimum freshness threshold (0.0-1.0)")
51
+ .option("--json", "Output raw JSON for piping")
52
+ .action(async (queryStr, opts) => {
53
+ try {
54
+ await loadProjectConfig();
55
+ const { getPool, closePool } = await import("@codify/graph");
56
+ const pool = getPool();
57
+ try {
58
+ await pool.query("SELECT 1");
59
+ }
60
+ catch {
61
+ console.error(" ERROR: Cannot connect to PostgreSQL. Run 'codify init' first.\n");
62
+ process.exit(1);
63
+ }
64
+ // Validate options
65
+ if (opts.type) {
66
+ if (!VALID_TYPES.includes(opts.type)) {
67
+ console.error(`\n ERROR: Invalid type "${opts.type}". Use: ${VALID_TYPES.join(", ")}\n`);
68
+ process.exit(1);
69
+ }
70
+ }
71
+ const limit = parseInt(opts.limit, 10);
72
+ if (isNaN(limit) || limit < 1) {
73
+ console.error("\n ERROR: --limit must be a positive integer.\n");
74
+ process.exit(1);
75
+ }
76
+ let minFreshness;
77
+ if (opts.freshness !== undefined) {
78
+ minFreshness = parseFloat(opts.freshness);
79
+ if (isNaN(minFreshness) || minFreshness < 0 || minFreshness > 1) {
80
+ console.error("\n ERROR: --freshness must be a number between 0.0 and 1.0.\n");
81
+ process.exit(1);
82
+ }
83
+ }
84
+ // Build query — split keywords, ILIKE against properties::text and metadata::text
85
+ const conditions = [
86
+ "superseded_by IS NULL",
87
+ "layer = ANY($1)",
88
+ ];
89
+ const params = [["permanent", "draft", "hot"]];
90
+ let paramIdx = 2;
91
+ // Keyword search: split query into words, match any keyword
92
+ const keywords = queryStr.split(/\s+/).filter((w) => w.length > 1);
93
+ if (keywords.length > 0) {
94
+ const keywordConditions = keywords.map((kw) => {
95
+ params.push(`%${kw}%`);
96
+ const idx = paramIdx++;
97
+ return `(properties::text ILIKE $${idx} OR metadata::text ILIKE $${idx} OR $${idx} = ANY(tags))`;
98
+ });
99
+ conditions.push(`(${keywordConditions.join(" OR ")})`);
100
+ }
101
+ if (opts.type) {
102
+ conditions.push(`type = $${paramIdx++}`);
103
+ params.push(opts.type);
104
+ }
105
+ if (minFreshness !== undefined) {
106
+ conditions.push(`freshness >= $${paramIdx++}`);
107
+ params.push(minFreshness);
108
+ }
109
+ params.push(limit);
110
+ const sql = `SELECT id, type, properties, metadata, freshness, confidence, tags, layer, created_at, updated_at
111
+ FROM nodes
112
+ WHERE ${conditions.join(" AND ")}
113
+ ORDER BY freshness DESC
114
+ LIMIT $${paramIdx}`;
115
+ const result = await pool.query(sql, params);
116
+ const nodes = result.rows;
117
+ // JSON output mode
118
+ if (opts.json) {
119
+ console.log(JSON.stringify(nodes, null, 2));
120
+ await closePool();
121
+ return;
122
+ }
123
+ // Pretty output
124
+ console.log(`\n ${BOLD}Codify — Search Results${RESET}\n`);
125
+ if (nodes.length === 0) {
126
+ const filterDesc = [`query="${queryStr}"`];
127
+ if (opts.type)
128
+ filterDesc.push(`type=${opts.type}`);
129
+ if (minFreshness !== undefined)
130
+ filterDesc.push(`freshness>=${minFreshness}`);
131
+ console.log(` No results found (${filterDesc.join(", ")}).\n`);
132
+ console.log(` Try broader keywords, or run 'codify bootstrap' to build the graph.\n`);
133
+ await closePool();
134
+ return;
135
+ }
136
+ console.log(` ${nodes.length} result${nodes.length === 1 ? "" : "s"} for "${CYAN}${queryStr}${RESET}"${opts.type ? ` (type: ${opts.type})` : ""}${minFreshness !== undefined ? ` (freshness >= ${minFreshness})` : ""}\n`);
137
+ for (let i = 0; i < nodes.length; i++) {
138
+ const node = nodes[i];
139
+ const props = node.properties ?? {};
140
+ const meta = node.metadata ?? {};
141
+ // Extract title
142
+ const title = props.title ?? meta.title ??
143
+ props.name ?? meta.name ??
144
+ node.id.slice(0, 12);
145
+ // Extract description
146
+ const description = props.description ?? meta.description ??
147
+ props.reason ?? props.summary ?? "";
148
+ // Rank number
149
+ const rank = `${DIM}#${i + 1}${RESET}`;
150
+ // Type badge
151
+ const typeBadge = `[${typeColor(node.type)}]`;
152
+ // Freshness and confidence
153
+ const fresh = freshnessLabel(node.freshness ?? 0);
154
+ const conf = `${DIM}conf:${(node.confidence ?? 0).toFixed(2)}${RESET}`;
155
+ console.log(` ${rank} ${typeBadge} ${BOLD}${title}${RESET}`);
156
+ console.log(` freshness: ${fresh} ${conf} ${DIM}${node.layer}${RESET}`);
157
+ if (description) {
158
+ console.log(` ${DIM}${truncate(description, 80)}${RESET}`);
159
+ }
160
+ console.log("");
161
+ }
162
+ // Footer
163
+ console.log(` ${DIM}Flags: --type <Type> --freshness <0.0-1.0> --limit <n> --json${RESET}`);
164
+ console.log("");
165
+ await closePool();
166
+ }
167
+ catch (err) {
168
+ const message = err instanceof Error ? err.message : String(err);
169
+ if (message.includes("ECONNREFUSED")) {
170
+ console.error("\n ERROR: Cannot connect to Codify services.");
171
+ console.error(" Run 'codify init' to start the infrastructure.\n");
172
+ }
173
+ else if (message.includes("ANTHROPIC_API_KEY")) {
174
+ console.error("\n ERROR: ANTHROPIC_API_KEY not set.");
175
+ console.error(" Export your API key: export ANTHROPIC_API_KEY=sk-...\n");
176
+ }
177
+ else {
178
+ console.error(`\n ERROR: ${message}\n`);
179
+ }
180
+ process.exit(1);
181
+ }
182
+ });
183
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,YAAY,SAmPrB,CAAC"}
@@ -0,0 +1,205 @@
1
+ // codify start — start the Codify MCP server + background services
2
+ import { Command } from "commander";
3
+ import { loadProjectConfig } from "../lib/config.js";
4
+ export const startCommand = new Command("start")
5
+ .description("Start the Codify MCP server (for Claude Code integration)")
6
+ .option("--http", "Also start the HTTP API (GraphQL + REST) on port 4000")
7
+ .action(async (opts) => {
8
+ try {
9
+ // Set environment defaults from .codify/config.json if present
10
+ await loadProjectConfig();
11
+ // Import app modules dynamically to avoid loading everything at CLI parse time
12
+ const { getPool, closePool } = await import("@codify/graph");
13
+ const { createEventBus } = await import("@codify/events");
14
+ const { startGapEngine, CollectionPlanner } = await import("@codify/agents");
15
+ const { MetabolismService } = await import("@codify/metabolism");
16
+ const { GraphServiceAdapter } = await import("@codify/app");
17
+ // 1. Connect to PostgreSQL
18
+ const pool = getPool();
19
+ const { rows } = await pool.query("SELECT 1 AS ok");
20
+ if (rows[0]?.ok !== 1) {
21
+ console.error("Failed to connect to PostgreSQL. Run 'codify init' first.");
22
+ process.exit(1);
23
+ }
24
+ console.error(" ✓ PostgreSQL connected");
25
+ // 2. Set up graph service
26
+ const graphService = new GraphServiceAdapter();
27
+ // 3. Connect event bus
28
+ const eventBus = await createEventBus({
29
+ servers: process.env.NATS_URL ?? "nats://localhost:4222",
30
+ });
31
+ console.error(" ✓ NATS connected");
32
+ // 4. Start background services
33
+ const gapEngine = await startGapEngine();
34
+ const metabolism = new MetabolismService(eventBus);
35
+ await metabolism.start();
36
+ // 5. Start collection planner (listens for gap events, creates plans)
37
+ const collectionPlanner = new CollectionPlanner(eventBus);
38
+ await collectionPlanner.start();
39
+ // 5b. Auto-collection subscriber: mine graph for evidence when gaps are detected
40
+ {
41
+ const { collectEvidenceForGap } = await import("./collect.js");
42
+ let lastCollectionTime = 0;
43
+ let collectionsThisMinute = 0;
44
+ let minuteStart = Date.now();
45
+ eventBus.subscriber.subscribe("gap.detected.>", async (event) => {
46
+ const ev = event;
47
+ if (!ev.gapNodeId)
48
+ return;
49
+ // Rate limit: max 10 per minute, 5s cooldown
50
+ const now = Date.now();
51
+ if (now - minuteStart > 60_000) {
52
+ collectionsThisMinute = 0;
53
+ minuteStart = now;
54
+ }
55
+ if (collectionsThisMinute >= 10)
56
+ return;
57
+ if (now - lastCollectionTime < 5_000)
58
+ return;
59
+ collectionsThisMinute++;
60
+ lastCollectionTime = now;
61
+ try {
62
+ // Get affected nodes for this gap
63
+ const affectedResult = await pool.query(`SELECT n.id, n.type, n.properties, n.metadata
64
+ FROM nodes n
65
+ JOIN edges e ON (e.source_id = n.id OR e.target_id = n.id)
66
+ WHERE (e.source_id = $1 OR e.target_id = $1)
67
+ AND n.id != $1
68
+ AND n.superseded_by IS NULL
69
+ GROUP BY n.id, n.type, n.properties, n.metadata`, [ev.gapNodeId]);
70
+ const affectedNodes = affectedResult.rows.map((r) => {
71
+ const p = r.properties ?? {};
72
+ const m = r.metadata ?? {};
73
+ return {
74
+ id: r.id,
75
+ type: r.type,
76
+ title: p.title ?? m.title ??
77
+ p.name ?? m.name ?? "(untitled)",
78
+ };
79
+ });
80
+ if (affectedNodes.length === 0)
81
+ return;
82
+ const { evidenceNodes, edgesCreated } = await collectEvidenceForGap(pool, ev.gapNodeId, affectedNodes);
83
+ if (evidenceNodes.length > 0) {
84
+ // Update gap status to evidence_found
85
+ await pool.query(`UPDATE nodes
86
+ SET properties = jsonb_set(properties, '{status}', '"evidence_found"'),
87
+ updated_at = now()
88
+ WHERE id = $1
89
+ AND COALESCE(properties->>'status', 'detected') = 'detected'`, [ev.gapNodeId]);
90
+ // Get gap title for logging
91
+ const gapResult = await pool.query(`SELECT properties FROM nodes WHERE id = $1`, [ev.gapNodeId]);
92
+ const gapTitle = gapResult.rows[0]?.properties?.title ??
93
+ gapResult.rows[0]?.properties?.description?.slice(0, 50) ?? ev.gapNodeId.slice(0, 12);
94
+ console.error(`[collection] Auto-collected ${evidenceNodes.length} evidence node${evidenceNodes.length === 1 ? "" : "s"} for gap: ${gapTitle}`);
95
+ }
96
+ }
97
+ catch (err) {
98
+ // Log and continue — never crash the MCP server
99
+ console.error(`[collection] Auto-collection error: ${err instanceof Error ? err.message : String(err)}`);
100
+ }
101
+ }, { group: "auto-collector" });
102
+ console.error(" ✓ Auto-collection subscriber ready");
103
+ }
104
+ // 6. Wire up bootstrap and graph stats functions
105
+ const { createIngestService } = await import("@codify/agents");
106
+ const bootstrapFn = async (repoPath) => {
107
+ const ingest = await createIngestService({
108
+ minerBatchSize: 10,
109
+ enableDedup: true,
110
+ autoPromoteThreshold: 0.7,
111
+ });
112
+ await ingest.registry.connect("local-git", {
113
+ type: "local",
114
+ credentials: { repoPath },
115
+ });
116
+ const startTime = Date.now();
117
+ const result = await ingest.bootstrap.run("local-git");
118
+ return {
119
+ connectorId: "local-git",
120
+ totalArtifacts: result.totalArtifacts,
121
+ nodesCreated: result.pipeline.created.length,
122
+ nodesMerged: result.pipeline.merged.length,
123
+ durationMs: Date.now() - startTime,
124
+ };
125
+ };
126
+ const graphStatsFn = async () => {
127
+ const { query } = await import("@codify/graph");
128
+ const [nodeStats, edgeCount, gapCount, freshnessAvg, oldestNewest] = await Promise.all([
129
+ query("SELECT type, COUNT(*)::int as count FROM nodes WHERE superseded_by IS NULL GROUP BY type"),
130
+ query("SELECT COUNT(*)::int as count FROM edges"),
131
+ query("SELECT COUNT(*)::int as count FROM nodes WHERE type = 'Gap' AND superseded_by IS NULL"),
132
+ query("SELECT COALESCE(AVG(freshness), 0)::float as avg FROM nodes WHERE superseded_by IS NULL"),
133
+ query("SELECT MIN(created_at) as oldest, MAX(created_at) as newest FROM nodes WHERE superseded_by IS NULL"),
134
+ ]);
135
+ const nodesByType = {};
136
+ let totalNodes = 0;
137
+ for (const row of nodeStats.rows) {
138
+ nodesByType[row.type] = row.count;
139
+ totalNodes += row.count;
140
+ }
141
+ const layerStats = await query("SELECT layer, COUNT(*)::int as count FROM nodes WHERE superseded_by IS NULL GROUP BY layer");
142
+ const nodesByLayer = {};
143
+ for (const row of layerStats.rows) {
144
+ nodesByLayer[row.layer] = row.count;
145
+ }
146
+ return {
147
+ totalNodes,
148
+ totalEdges: edgeCount.rows[0]?.count ?? 0,
149
+ nodesByType,
150
+ nodesByLayer,
151
+ avgFreshness: freshnessAvg.rows[0]?.avg ?? 0,
152
+ gapCount: gapCount.rows[0]?.count ?? 0,
153
+ oldestNode: oldestNewest.rows[0]?.oldest?.toISOString() ?? null,
154
+ newestNode: oldestNewest.rows[0]?.newest?.toISOString() ?? null,
155
+ };
156
+ };
157
+ // 6. Start MCP server on stdio (primary mode for Claude Code)
158
+ if (opts.http) {
159
+ const { startServer } = await import("@codify/api");
160
+ await startServer(graphService, { eventBus });
161
+ }
162
+ else {
163
+ const { startMcpStdio } = await import("@codify/api");
164
+ await startMcpStdio(graphService, {
165
+ bootstrapFn,
166
+ graphStatsFn,
167
+ collectionPlannerFn: () => collectionPlanner.listPlans(),
168
+ gapQueueFn: (filters) => gapEngine.gapQueue.listGaps(filters),
169
+ });
170
+ console.error(" ✓ MCP server ready on stdio");
171
+ }
172
+ // Graceful shutdown
173
+ const shutdown = async (signal) => {
174
+ console.error(`[codify] Shutting down (${signal})...`);
175
+ try {
176
+ await metabolism.stop();
177
+ await gapEngine.stop();
178
+ await eventBus.close();
179
+ await closePool();
180
+ process.exit(0);
181
+ }
182
+ catch {
183
+ process.exit(1);
184
+ }
185
+ };
186
+ process.on("SIGINT", () => shutdown("SIGINT"));
187
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
188
+ }
189
+ catch (err) {
190
+ const message = err instanceof Error ? err.message : String(err);
191
+ if (message.includes("ECONNREFUSED")) {
192
+ console.error("\n ERROR: Cannot connect to Codify services.");
193
+ console.error(" Run 'codify init' to start the infrastructure.\n");
194
+ }
195
+ else if (message.includes("ANTHROPIC_API_KEY")) {
196
+ console.error("\n ERROR: ANTHROPIC_API_KEY not set.");
197
+ console.error(" Export your API key: export ANTHROPIC_API_KEY=sk-...\n");
198
+ }
199
+ else {
200
+ console.error(`\n ERROR: ${message}\n`);
201
+ }
202
+ process.exit(1);
203
+ }
204
+ });
205
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SAiStB,CAAC"}