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