@dahch/muninn 0.1.0 → 0.2.0

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 (50) hide show
  1. package/README.md +260 -17
  2. package/dist/cli.d.ts +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +18 -2
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/memory.d.ts.map +1 -1
  7. package/dist/commands/memory.js +52 -3
  8. package/dist/commands/memory.js.map +1 -1
  9. package/dist/commands/setup.d.ts +3 -0
  10. package/dist/commands/setup.d.ts.map +1 -0
  11. package/dist/commands/setup.js +397 -0
  12. package/dist/commands/setup.js.map +1 -0
  13. package/dist/db/client.d.ts +17 -1
  14. package/dist/db/client.d.ts.map +1 -1
  15. package/dist/db/client.js +54 -0
  16. package/dist/db/client.js.map +1 -1
  17. package/dist/db/schema.sql +2 -0
  18. package/dist/mcp/server.d.ts +27 -6
  19. package/dist/mcp/server.d.ts.map +1 -1
  20. package/dist/mcp/server.js +156 -15
  21. package/dist/mcp/server.js.map +1 -1
  22. package/dist/service/memory-service.d.ts +121 -4
  23. package/dist/service/memory-service.d.ts.map +1 -1
  24. package/dist/service/memory-service.js +665 -45
  25. package/dist/service/memory-service.js.map +1 -1
  26. package/dist/setup/index.d.ts +6 -0
  27. package/dist/setup/index.d.ts.map +1 -0
  28. package/dist/setup/index.js +6 -0
  29. package/dist/setup/index.js.map +1 -0
  30. package/dist/setup/json-target.d.ts +30 -0
  31. package/dist/setup/json-target.d.ts.map +1 -0
  32. package/dist/setup/json-target.js +263 -0
  33. package/dist/setup/json-target.js.map +1 -0
  34. package/dist/setup/portable.d.ts +56 -0
  35. package/dist/setup/portable.d.ts.map +1 -0
  36. package/dist/setup/portable.js +365 -0
  37. package/dist/setup/portable.js.map +1 -0
  38. package/dist/setup/registry.d.ts +54 -0
  39. package/dist/setup/registry.d.ts.map +1 -0
  40. package/dist/setup/registry.js +225 -0
  41. package/dist/setup/registry.js.map +1 -0
  42. package/dist/setup/rules-target.d.ts +31 -0
  43. package/dist/setup/rules-target.d.ts.map +1 -0
  44. package/dist/setup/rules-target.js +270 -0
  45. package/dist/setup/rules-target.js.map +1 -0
  46. package/dist/setup/toml-target.d.ts +62 -0
  47. package/dist/setup/toml-target.d.ts.map +1 -0
  48. package/dist/setup/toml-target.js +869 -0
  49. package/dist/setup/toml-target.js.map +1 -0
  50. package/package.json +1 -1
@@ -0,0 +1,397 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import { getPortableStatus, setupPortable, } from "../setup/portable.js";
5
+ import { getJsonTargetStatus, setupJsonTarget, } from "../setup/json-target.js";
6
+ import { getTomlTargetStatus, setupTomlTarget, } from "../setup/toml-target.js";
7
+ import { AGENT_IDS, AGENT_REGISTRY, agentExecutable, parseAgentSelection, resolveMcpPaths, resolveRulesPath, } from "../setup/registry.js";
8
+ import { getRulesTargetStatus, setupRulesTarget, } from "../setup/rules-target.js";
9
+ import { sanitizeTerminalText } from "../util/text.js";
10
+ export function printSetupUsage() {
11
+ console.log(`muninn setup — Install and diagnose Muninn agent integrations
12
+
13
+ Usage:
14
+ muninn setup [--portable] [--no-rules] [--force] [--dry-run] [--status] [--list]
15
+ [--agent <id|all|id,id>] [--project <path>] [--home <path>]
16
+
17
+ Options:
18
+ --list List the agent catalog without modifying anything
19
+ --agent <ids> Configure one ID, all, or a comma-separated list
20
+ --project <path> Project root used by project-level agent configs
21
+ --portable Install the portable MCP configuration (default)
22
+ --no-portable Skip the portable configuration (requires --agent)
23
+ --no-rules Skip installing marked usage rules for selected agents
24
+ --home <path> Home directory to configure (default: OS home directory)
25
+ --force Replace a different existing Muninn entry
26
+ --dry-run Report intended changes without writing
27
+ --status Report configuration state without writing
28
+ `);
29
+ }
30
+ function setupError(message) {
31
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(message)}`));
32
+ process.exitCode = 1;
33
+ }
34
+ function setupWarning(message) {
35
+ console.error(chalk.yellow(`Warning: ${sanitizeTerminalText(message)}`));
36
+ }
37
+ function isEnabled(value) {
38
+ return value === true || value === "true";
39
+ }
40
+ function isExecutableAvailable(binary, envPath) {
41
+ if (envPath === undefined || envPath.length === 0)
42
+ return false;
43
+ const extensions = process.platform === "win32"
44
+ ? (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)
45
+ : [""];
46
+ for (const directory of envPath.split(path.delimiter)) {
47
+ if (directory.length === 0)
48
+ continue;
49
+ for (const extension of extensions) {
50
+ const suffix = process.platform === "win32" &&
51
+ !binary.toLowerCase().endsWith(extension.toLowerCase())
52
+ ? extension
53
+ : "";
54
+ const candidate = path.join(directory, `${binary}${suffix}`);
55
+ try {
56
+ const stat = fs.statSync(candidate);
57
+ if (!stat.isFile())
58
+ continue;
59
+ fs.accessSync(candidate, fs.constants.X_OK);
60
+ return true;
61
+ }
62
+ catch {
63
+ // Try the next directory or extension.
64
+ }
65
+ }
66
+ }
67
+ return false;
68
+ }
69
+ function warnMissingBinaries(targets) {
70
+ for (const target of targets) {
71
+ const binary = agentExecutable(target.id);
72
+ // Targets without a meaningful local executable (IDE/web agents) are
73
+ // explicitly marked as not applicable and never warn.
74
+ if (binary === null)
75
+ continue;
76
+ if (!isExecutableAvailable(binary, process.env.PATH)) {
77
+ setupWarning(`${target.label} (${target.id}) binary "${binary}" is not installed in PATH`);
78
+ }
79
+ }
80
+ }
81
+ function resolveRulesGroups(ids, projectPath) {
82
+ const groups = new Map();
83
+ for (const id of ids) {
84
+ const rulesPath = resolveRulesPath(id, { projectPath });
85
+ const key = path.resolve(rulesPath);
86
+ const existing = groups.get(key);
87
+ if (existing === undefined) {
88
+ groups.set(key, { path: key, agents: [id] });
89
+ }
90
+ else {
91
+ existing.agents.push(id);
92
+ }
93
+ }
94
+ return [...groups.values()];
95
+ }
96
+ function printRulesStatus(status) {
97
+ console.log(`Muninn rules (${status.agents.join(", ")})`);
98
+ console.log(` Path: ${status.path}`);
99
+ console.log(` State: ${status.state}`);
100
+ console.log(` Changed: false`);
101
+ if (status.error) {
102
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(status.error)}`));
103
+ }
104
+ }
105
+ function printRulesReport(report) {
106
+ console.log(`Muninn rules (${report.agents.join(", ")})`);
107
+ console.log(` Path: ${report.path}`);
108
+ console.log(` State: ${report.state}`);
109
+ console.log(` Outcome: ${report.outcome}`);
110
+ console.log(` Changed: ${report.changed}`);
111
+ if (report.dryRun) {
112
+ console.log(" Dry run: no files were written");
113
+ }
114
+ if (report.error) {
115
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(report.error)}`));
116
+ }
117
+ }
118
+ function printStatus(status) {
119
+ console.log("Portable MCP configuration");
120
+ console.log(` Path: ${status.path}`);
121
+ console.log(` State: ${status.state}`);
122
+ if (status.legacyPresent) {
123
+ console.log(` Legacy: ${status.legacyPath} (not modified)`);
124
+ }
125
+ console.log(` Changed: false`);
126
+ if (status.error) {
127
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(status.error)}`));
128
+ }
129
+ }
130
+ function printReport(report) {
131
+ console.log("Portable MCP configuration");
132
+ console.log(` Path: ${report.path}`);
133
+ console.log(` State: ${report.state}`);
134
+ console.log(` Outcome: ${report.outcome}`);
135
+ console.log(` Changed: ${report.changed}`);
136
+ if (report.legacyPresent) {
137
+ console.log(` Legacy: ${report.legacyPath} (not modified)`);
138
+ }
139
+ if (report.dryRun) {
140
+ console.log(" Dry run: no files were written");
141
+ }
142
+ if (report.error) {
143
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(report.error)}`));
144
+ }
145
+ }
146
+ function printTomlStatus(status) {
147
+ console.log(`${status.target.label} (${status.target.id})`);
148
+ console.log(` Path: ${status.path}`);
149
+ console.log(` Format: ${status.target.format}`);
150
+ console.log(` State: ${status.state}`);
151
+ console.log(` Changed: false`);
152
+ if (status.error) {
153
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(status.error)}`));
154
+ }
155
+ }
156
+ function printTomlReport(report) {
157
+ console.log(`${report.target.label} (${report.target.id})`);
158
+ console.log(` Path: ${report.path}`);
159
+ console.log(` Format: ${report.target.format}`);
160
+ console.log(` State: ${report.state}`);
161
+ console.log(` Outcome: ${report.outcome}`);
162
+ console.log(` Changed: ${report.changed}`);
163
+ if (report.dryRun) {
164
+ console.log(" Dry run: no files were written");
165
+ }
166
+ if (report.error) {
167
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(report.error)}`));
168
+ }
169
+ }
170
+ function printJsonStatus(status) {
171
+ console.log(`${status.target.label} (${status.target.id})`);
172
+ console.log(` Path: ${status.path}`);
173
+ console.log(` Format: ${status.target.format}`);
174
+ console.log(` State: ${status.state}`);
175
+ console.log(` Changed: false`);
176
+ if (status.error) {
177
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(status.error)}`));
178
+ }
179
+ }
180
+ function printJsonReport(report) {
181
+ console.log(`${report.target.label} (${report.target.id})`);
182
+ console.log(` Path: ${report.path}`);
183
+ console.log(` Format: ${report.target.format}`);
184
+ console.log(` State: ${report.state}`);
185
+ console.log(` Outcome: ${report.outcome}`);
186
+ console.log(` Changed: ${report.changed}`);
187
+ if (report.dryRun) {
188
+ console.log(" Dry run: no files were written");
189
+ }
190
+ if (report.warning) {
191
+ setupWarning(report.warning);
192
+ }
193
+ if (report.error) {
194
+ console.error(chalk.red(`Error: ${sanitizeTerminalText(report.error)}`));
195
+ }
196
+ }
197
+ function printCatalog(projectPath, homeDir) {
198
+ console.log("Muninn agent setup catalog");
199
+ for (const id of AGENT_IDS) {
200
+ const target = AGENT_REGISTRY[id];
201
+ let mcps;
202
+ try {
203
+ mcps = resolveMcpPaths(target, { projectPath, homeDir });
204
+ }
205
+ catch (err) {
206
+ mcps = [`<error: ${err.message}>`];
207
+ }
208
+ console.log(`${target.id} — ${target.label}`);
209
+ console.log(` Format: ${target.format}`);
210
+ console.log(` MCP: ${mcps.join(", ")}`);
211
+ console.log(` Rules: ${resolveRulesPath(target, { projectPath })}`);
212
+ }
213
+ }
214
+ function selectedTargets(selection) {
215
+ return (selection ?? AGENT_IDS).map((id) => AGENT_REGISTRY[id]);
216
+ }
217
+ export async function handleSetupCommand(args) {
218
+ if (args["--help"] || args["-h"]) {
219
+ printSetupUsage();
220
+ return;
221
+ }
222
+ const homeValue = args["--home"];
223
+ if (homeValue !== undefined && typeof homeValue !== "string") {
224
+ setupError("--home requires a path value.");
225
+ printSetupUsage();
226
+ return;
227
+ }
228
+ const projectValue = args["--project"];
229
+ if (projectValue !== undefined && typeof projectValue !== "string") {
230
+ setupError("--project requires a path value.");
231
+ printSetupUsage();
232
+ return;
233
+ }
234
+ const list = isEnabled(args["--list"]);
235
+ const noPortable = isEnabled(args["--no-portable"]);
236
+ const noRules = isEnabled(args["--no-rules"]);
237
+ const status = isEnabled(args["--status"]);
238
+ const dryRun = isEnabled(args["--dry-run"]);
239
+ const force = isEnabled(args["--force"]);
240
+ const agentValue = args["--agent"];
241
+ const hasAgent = agentValue !== undefined && agentValue !== false;
242
+ if (list && (status || dryRun || force || noPortable || hasAgent)) {
243
+ setupError("--list cannot be combined with --status, --dry-run, --force, --agent, or --no-portable.");
244
+ printSetupUsage();
245
+ return;
246
+ }
247
+ if (hasAgent && typeof agentValue !== "string") {
248
+ setupError("--agent requires an agent ID, `all`, or a comma-separated list.");
249
+ printSetupUsage();
250
+ return;
251
+ }
252
+ let selection;
253
+ if (typeof agentValue === "string") {
254
+ const parsed = parseAgentSelection(agentValue);
255
+ if (!parsed.ok) {
256
+ setupError(`Unknown agent ID${parsed.unknown.length === 1 ? "" : "s"}: ${parsed.unknown.join(", ")}. ` +
257
+ `Valid IDs: ${parsed.valid.join(", ")}, all.`);
258
+ return;
259
+ }
260
+ selection = parsed.ids;
261
+ }
262
+ if (noPortable && selection === undefined) {
263
+ setupError(noRules
264
+ ? "--no-portable --no-rules requires --agent; there is nothing to do."
265
+ : "--no-portable requires --agent; there is nothing to do.");
266
+ printSetupUsage();
267
+ return;
268
+ }
269
+ const home = typeof homeValue === "string" ? path.resolve(homeValue) : undefined;
270
+ const projectPath = typeof projectValue === "string" ? path.resolve(projectValue) : path.resolve(process.cwd());
271
+ const options = { homeDir: home, force, dryRun };
272
+ if (list) {
273
+ printCatalog(typeof projectValue === "string" ? projectPath : undefined, home);
274
+ return;
275
+ }
276
+ if (status) {
277
+ let fatal = false;
278
+ const targets = selectedTargets(selection);
279
+ if (selection !== undefined)
280
+ warnMissingBinaries(targets);
281
+ for (const target of targets) {
282
+ let paths;
283
+ try {
284
+ paths = resolveMcpPaths(target, { projectPath, homeDir: home });
285
+ }
286
+ catch (err) {
287
+ fatal = true;
288
+ setupError(err.message);
289
+ continue;
290
+ }
291
+ for (const configPath of paths) {
292
+ if (target.format === "toml") {
293
+ const result = getTomlTargetStatus({ target, path: configPath, projectPath });
294
+ printTomlStatus(result);
295
+ if (result.error !== undefined || result.errors.length > 0)
296
+ fatal = true;
297
+ }
298
+ else {
299
+ const result = getJsonTargetStatus({ target, path: configPath, projectPath });
300
+ printJsonStatus(result);
301
+ if (result.state === "malformed")
302
+ fatal = true;
303
+ }
304
+ }
305
+ }
306
+ if (selection !== undefined && !noRules) {
307
+ for (const group of resolveRulesGroups(selection, projectPath)) {
308
+ const result = getRulesTargetStatus({
309
+ path: group.path,
310
+ agents: group.agents,
311
+ projectPath,
312
+ });
313
+ printRulesStatus(result);
314
+ if (result.state === "malformed" || result.errors.length > 0)
315
+ fatal = true;
316
+ }
317
+ }
318
+ if (!noPortable) {
319
+ const result = getPortableStatus(options);
320
+ printStatus(result);
321
+ if (result.error !== undefined || result.errors.length > 0)
322
+ fatal = true;
323
+ }
324
+ if (fatal)
325
+ process.exitCode = 1;
326
+ return;
327
+ }
328
+ const includePortable = selection === undefined || !noPortable;
329
+ if (selection !== undefined) {
330
+ const targets = selectedTargets(selection);
331
+ warnMissingBinaries(targets);
332
+ for (const target of targets) {
333
+ let paths;
334
+ try {
335
+ paths = resolveMcpPaths(target, { projectPath, homeDir: home });
336
+ }
337
+ catch (err) {
338
+ setupError(err.message);
339
+ return;
340
+ }
341
+ for (const configPath of paths) {
342
+ if (target.format === "toml") {
343
+ const report = setupTomlTarget({
344
+ target,
345
+ path: configPath,
346
+ projectPath,
347
+ force,
348
+ dryRun,
349
+ });
350
+ printTomlReport(report);
351
+ if (report.outcome === "failed") {
352
+ process.exitCode = 1;
353
+ return;
354
+ }
355
+ }
356
+ else {
357
+ const report = setupJsonTarget({
358
+ target,
359
+ path: configPath,
360
+ projectPath,
361
+ force,
362
+ dryRun,
363
+ });
364
+ printJsonReport(report);
365
+ if (report.outcome === "failed") {
366
+ process.exitCode = 1;
367
+ return;
368
+ }
369
+ }
370
+ }
371
+ }
372
+ if (!noRules) {
373
+ for (const group of resolveRulesGroups(selection, projectPath)) {
374
+ const report = setupRulesTarget({
375
+ path: group.path,
376
+ agents: group.agents,
377
+ projectPath,
378
+ force,
379
+ dryRun,
380
+ });
381
+ printRulesReport(report);
382
+ if (report.outcome === "failed") {
383
+ process.exitCode = 1;
384
+ return;
385
+ }
386
+ }
387
+ }
388
+ }
389
+ if (!includePortable)
390
+ return;
391
+ const report = setupPortable(options);
392
+ printReport(report);
393
+ if (report.outcome === "failed") {
394
+ process.exitCode = 1;
395
+ }
396
+ }
397
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export interface Project {
7
7
  root_path: string;
8
8
  created_at: string;
9
9
  }
10
+ export type ObservationStatus = "active" | "superseded";
10
11
  export interface Observation {
11
12
  id: string;
12
13
  project_id: string;
@@ -14,6 +15,8 @@ export interface Observation {
14
15
  title: string;
15
16
  content: string;
16
17
  topic_key: string | null;
18
+ status: ObservationStatus;
19
+ superseded_by: string | null;
17
20
  created_at: string;
18
21
  updated_at: string;
19
22
  }
@@ -47,7 +50,7 @@ export interface EnsureProjectOptions {
47
50
  */
48
51
  startDir?: string;
49
52
  }
50
- export declare const SCHEMA_SQL = "-- Muninn Engine Database Schema\n-- Version 1.0.0\n\n-- Projects table\nCREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n git_remote TEXT,\n root_path TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX IF NOT EXISTS idx_projects_root_path ON projects(root_path);\n\n-- Observations table\nCREATE TABLE IF NOT EXISTS observations (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n category TEXT CHECK(category IN ('decision', 'convention', 'discovery', 'bugfix', 'architecture')) NOT NULL,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n topic_key TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_observations_project_id ON observations(project_id);\nCREATE INDEX IF NOT EXISTS idx_observations_updated_at ON observations(updated_at);\nCREATE INDEX IF NOT EXISTS idx_observations_project_updated ON observations(project_id, updated_at DESC, created_at DESC);\n\n-- Observations FTS5 virtual table\nCREATE VIRTUAL TABLE IF NOT EXISTS observations_fts USING fts5(\n title,\n content,\n topic_key,\n content='observations',\n content_rowid='rowid'\n);\n\n-- Triggers for automatic FTS5 synchronization\nCREATE TRIGGER IF NOT EXISTS obs_ai AFTER INSERT ON observations BEGIN\n INSERT INTO observations_fts(rowid, title, content, topic_key)\n VALUES (new.rowid, new.title, new.content, new.topic_key);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS obs_ad AFTER DELETE ON observations BEGIN\n INSERT INTO observations_fts(observations_fts, rowid, title, content, topic_key)\n VALUES ('delete', old.rowid, old.title, old.content, old.topic_key);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS obs_au AFTER UPDATE ON observations BEGIN\n INSERT INTO observations_fts(observations_fts, rowid, title, content, topic_key)\n VALUES ('delete', old.rowid, old.title, old.content, old.topic_key);\n INSERT INTO observations_fts(rowid, title, content, topic_key)\n VALUES (new.rowid, new.title, new.content, new.topic_key);\nEND;\n\n-- Entities table\nCREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n entity_type TEXT CHECK(entity_type IN ('file', 'function', 'class', 'interface', 'module')) NOT NULL,\n identifier TEXT NOT NULL,\n file_path TEXT NOT NULL,\n FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_entities_project_id ON entities(project_id);\nCREATE INDEX IF NOT EXISTS idx_entities_identifier ON entities(identifier);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_entities_project_identifier ON entities(project_id, identifier);\n\n-- Observation Entities join table\nCREATE TABLE IF NOT EXISTS observation_entities (\n observation_id TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n PRIMARY KEY(observation_id, entity_id),\n FOREIGN KEY(observation_id) REFERENCES observations(id) ON DELETE CASCADE,\n FOREIGN KEY(entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_observation_entities_entity_id ON observation_entities(entity_id);\n\n-- Entity Dependencies table\n-- Relaciones topol\u00F3gicas entre s\u00EDmbolos (A llama/importa a B, o A implementa a B)\nCREATE TABLE IF NOT EXISTS entity_dependencies (\n source_entity_id TEXT NOT NULL,\n target_entity_id TEXT NOT NULL,\n relation_type TEXT CHECK(relation_type IN ('imports', 'calls', 'implements', 'extends', 'references')) NOT NULL,\n PRIMARY KEY(source_entity_id, target_entity_id, relation_type),\n FOREIGN KEY(source_entity_id) REFERENCES entities(id) ON DELETE CASCADE,\n FOREIGN KEY(target_entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_entity_deps_source ON entity_dependencies(source_entity_id);\nCREATE INDEX IF NOT EXISTS idx_entity_deps_target ON entity_dependencies(target_entity_id);\n";
53
+ export declare const SCHEMA_SQL = "-- Muninn Engine Database Schema\n-- Version 1.0.0\n\n-- Projects table\nCREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n git_remote TEXT,\n root_path TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX IF NOT EXISTS idx_projects_root_path ON projects(root_path);\n\n-- Observations table\nCREATE TABLE IF NOT EXISTS observations (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n category TEXT CHECK(category IN ('decision', 'convention', 'discovery', 'bugfix', 'architecture')) NOT NULL,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n topic_key TEXT,\n status TEXT CHECK(status IN ('active', 'superseded')) NOT NULL DEFAULT 'active',\n superseded_by TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_observations_project_id ON observations(project_id);\nCREATE INDEX IF NOT EXISTS idx_observations_updated_at ON observations(updated_at);\nCREATE INDEX IF NOT EXISTS idx_observations_project_updated ON observations(project_id, updated_at DESC, created_at DESC);\n\n-- Observations FTS5 virtual table\nCREATE VIRTUAL TABLE IF NOT EXISTS observations_fts USING fts5(\n title,\n content,\n topic_key,\n content='observations',\n content_rowid='rowid'\n);\n\n-- Triggers for automatic FTS5 synchronization\nCREATE TRIGGER IF NOT EXISTS obs_ai AFTER INSERT ON observations BEGIN\n INSERT INTO observations_fts(rowid, title, content, topic_key)\n VALUES (new.rowid, new.title, new.content, new.topic_key);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS obs_ad AFTER DELETE ON observations BEGIN\n INSERT INTO observations_fts(observations_fts, rowid, title, content, topic_key)\n VALUES ('delete', old.rowid, old.title, old.content, old.topic_key);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS obs_au AFTER UPDATE ON observations BEGIN\n INSERT INTO observations_fts(observations_fts, rowid, title, content, topic_key)\n VALUES ('delete', old.rowid, old.title, old.content, old.topic_key);\n INSERT INTO observations_fts(rowid, title, content, topic_key)\n VALUES (new.rowid, new.title, new.content, new.topic_key);\nEND;\n\n-- Entities table\nCREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n entity_type TEXT CHECK(entity_type IN ('file', 'function', 'class', 'interface', 'module')) NOT NULL,\n identifier TEXT NOT NULL,\n file_path TEXT NOT NULL,\n FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_entities_project_id ON entities(project_id);\nCREATE INDEX IF NOT EXISTS idx_entities_identifier ON entities(identifier);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_entities_project_identifier ON entities(project_id, identifier);\n\n-- Observation Entities join table\nCREATE TABLE IF NOT EXISTS observation_entities (\n observation_id TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n PRIMARY KEY(observation_id, entity_id),\n FOREIGN KEY(observation_id) REFERENCES observations(id) ON DELETE CASCADE,\n FOREIGN KEY(entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_observation_entities_entity_id ON observation_entities(entity_id);\n\n-- Entity Dependencies table\n-- Relaciones topol\u00F3gicas entre s\u00EDmbolos (A llama/importa a B, o A implementa a B)\nCREATE TABLE IF NOT EXISTS entity_dependencies (\n source_entity_id TEXT NOT NULL,\n target_entity_id TEXT NOT NULL,\n relation_type TEXT CHECK(relation_type IN ('imports', 'calls', 'implements', 'extends', 'references')) NOT NULL,\n PRIMARY KEY(source_entity_id, target_entity_id, relation_type),\n FOREIGN KEY(source_entity_id) REFERENCES entities(id) ON DELETE CASCADE,\n FOREIGN KEY(target_entity_id) REFERENCES entities(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_entity_deps_source ON entity_dependencies(source_entity_id);\nCREATE INDEX IF NOT EXISTS idx_entity_deps_target ON entity_dependencies(target_entity_id);\n";
51
54
  /**
52
55
  * Robustly load schema SQL from disk if available, otherwise fallback to embedded SCHEMA_SQL.
53
56
  */
@@ -77,6 +80,19 @@ export declare function resolveDatabasePath(customPath?: string, startDir?: stri
77
80
  * Configures foreign_keys = ON, journal_mode = WAL, busy_timeout = 5000, recursive_triggers = ON, and executes schema.sql DDL.
78
81
  */
79
82
  export declare function getDatabase(dbPath?: string, startDir?: string): Database.Database;
83
+ /**
84
+ * Opens an **existing** Muninn database without any initialization side effects.
85
+ *
86
+ * This is the access path for read-only bootstrap: it resolves the same default
87
+ * location as {@link getDatabase}, but never creates a directory or file, never
88
+ * applies write-capable pragmas, never runs schema DDL/migrations and never
89
+ * inserts a project row. Opening a missing, inaccessible or corrupt file fails
90
+ * with the underlying SQLite error; callers that must fail open catch it and
91
+ * return an empty session brief with a note.
92
+ */
93
+ export declare function getReadOnlyDatabase(dbPath?: string, startDir?: string): Database.Database;
94
+ /** Alias kept explicit for callers that prefer the `open…` naming convention. */
95
+ export declare const openReadOnlyDatabase: typeof getReadOnlyDatabase;
80
96
  /**
81
97
  * Finds an existing project by root_path or creates a new project record idempotently.
82
98
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAKA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,MAAM,mBAAmB,GAC3B,UAAU,GACV,YAAY,GACZ,WAAW,GACX,QAAQ,GACR,cAAc,CAAC;AAEnB,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,UAAU,GACV,OAAO,GACP,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,OAAO,GACP,YAAY,GACZ,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,UAAU,25HAgGtB,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CActC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAc3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc9D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAsB,GAC/B,MAAM,CASR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAsCjF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAoCT"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
package/dist/db/client.js CHANGED
@@ -27,6 +27,8 @@ CREATE TABLE IF NOT EXISTS observations (
27
27
  title TEXT NOT NULL,
28
28
  content TEXT NOT NULL,
29
29
  topic_key TEXT,
30
+ status TEXT CHECK(status IN ('active', 'superseded')) NOT NULL DEFAULT 'active',
31
+ superseded_by TEXT,
30
32
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
31
33
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
32
34
  FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE
@@ -227,6 +229,56 @@ export function getDatabase(dbPath, startDir) {
227
229
  db.pragma("recursive_triggers = ON");
228
230
  const schema = loadSchemaSql();
229
231
  db.exec(schema);
232
+ // Databases created before decision supersession lack these columns. Keep
233
+ // the migration column-by-column and idempotent, so reopening never touches
234
+ // an already migrated row, index, or trigger.
235
+ const columns = new Set(db
236
+ .prepare("PRAGMA table_info(observations)")
237
+ .all()
238
+ .map((column) => column.name));
239
+ if (!columns.has("status")) {
240
+ db.exec("ALTER TABLE observations ADD COLUMN status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'superseded'))");
241
+ }
242
+ if (!columns.has("superseded_by")) {
243
+ db.exec("ALTER TABLE observations ADD COLUMN superseded_by TEXT");
244
+ }
245
+ }
246
+ catch (err) {
247
+ db.close();
248
+ throw err;
249
+ }
250
+ return db;
251
+ }
252
+ /**
253
+ * Opens an **existing** Muninn database without any initialization side effects.
254
+ *
255
+ * This is the access path for read-only bootstrap: it resolves the same default
256
+ * location as {@link getDatabase}, but never creates a directory or file, never
257
+ * applies write-capable pragmas, never runs schema DDL/migrations and never
258
+ * inserts a project row. Opening a missing, inaccessible or corrupt file fails
259
+ * with the underlying SQLite error; callers that must fail open catch it and
260
+ * return an empty session brief with a note.
261
+ */
262
+ export function getReadOnlyDatabase(dbPath, startDir) {
263
+ const resolvedPath = resolveDatabasePath(dbPath, startDir);
264
+ if (resolvedPath === ":memory:") {
265
+ throw new Error("A read-only session brief requires an existing database file, not :memory:.");
266
+ }
267
+ // Bootstrap must not follow a repository-shipped symlink either. The screen
268
+ // does not write anything; a refused path simply becomes an unavailable brief.
269
+ assertDocPath(resolvedPath, {
270
+ projectPath: findGitRoot(startDir ?? process.cwd()) ?? undefined,
271
+ label: "the Muninn database",
272
+ action: "read",
273
+ });
274
+ const db = new Database(resolvedPath, {
275
+ readonly: true,
276
+ fileMustExist: true,
277
+ timeout: 5000,
278
+ });
279
+ try {
280
+ // A connection-local pragma only; it does not write to the database file.
281
+ db.pragma("busy_timeout = 5000");
230
282
  }
231
283
  catch (err) {
232
284
  db.close();
@@ -234,6 +286,8 @@ export function getDatabase(dbPath, startDir) {
234
286
  }
235
287
  return db;
236
288
  }
289
+ /** Alias kept explicit for callers that prefer the `open…` naming convention. */
290
+ export const openReadOnlyDatabase = getReadOnlyDatabase;
237
291
  /**
238
292
  * Finds an existing project by root_path or creates a new project record idempotently.
239
293
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,8 @@ CREATE TABLE IF NOT EXISTS observations (
20
20
  title TEXT NOT NULL,
21
21
  content TEXT NOT NULL,
22
22
  topic_key TEXT,
23
+ status TEXT CHECK(status IN ('active', 'superseded')) NOT NULL DEFAULT 'active',
24
+ superseded_by TEXT,
23
25
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
24
26
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
25
27
  FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE