@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.
- package/README.md +260 -17
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js +52 -3
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +397 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/db/client.d.ts +17 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +54 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/schema.sql +2 -0
- package/dist/mcp/server.d.ts +27 -6
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +156 -15
- package/dist/mcp/server.js.map +1 -1
- package/dist/service/memory-service.d.ts +121 -4
- package/dist/service/memory-service.d.ts.map +1 -1
- package/dist/service/memory-service.js +665 -45
- package/dist/service/memory-service.js.map +1 -1
- package/dist/setup/index.d.ts +6 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +6 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/json-target.d.ts +30 -0
- package/dist/setup/json-target.d.ts.map +1 -0
- package/dist/setup/json-target.js +263 -0
- package/dist/setup/json-target.js.map +1 -0
- package/dist/setup/portable.d.ts +56 -0
- package/dist/setup/portable.d.ts.map +1 -0
- package/dist/setup/portable.js +365 -0
- package/dist/setup/portable.js.map +1 -0
- package/dist/setup/registry.d.ts +54 -0
- package/dist/setup/registry.d.ts.map +1 -0
- package/dist/setup/registry.js +225 -0
- package/dist/setup/registry.js.map +1 -0
- package/dist/setup/rules-target.d.ts +31 -0
- package/dist/setup/rules-target.d.ts.map +1 -0
- package/dist/setup/rules-target.js +270 -0
- package/dist/setup/rules-target.js.map +1 -0
- package/dist/setup/toml-target.d.ts +62 -0
- package/dist/setup/toml-target.d.ts.map +1 -0
- package/dist/setup/toml-target.js +869 -0
- package/dist/setup/toml-target.js.map +1 -0
- 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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"}
|
package/dist/db/client.d.ts
CHANGED
|
@@ -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
|
*/
|
package/dist/db/client.d.ts.map
CHANGED
|
@@ -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,
|
|
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,MAAM,iBAAiB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAExD,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,MAAM,EAAE,iBAAiB,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,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,sgIAkGtB,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,CAwDjF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,QAAQ,CAAC,QAAQ,CA6BnB;AAED,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,4BAAsB,CAAC;AAExD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAoCT"}
|
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
|
*/
|
package/dist/db/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA8EvD,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkGzB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,UAAU,GACd,OAAO,SAAS,KAAK,WAAW;YAC9B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACnD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;QAC9D,OAAO,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC1D,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC7E,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAmB,EACnB,WAAmB,OAAO,CAAC,GAAG,EAAE;IAEhC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QAClD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAe,EAAE,QAAiB;IAC5D,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE3D,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,8EAA8E;QAC9E,2EAA2E;QAC3E,wEAAwE;QACxE,6EAA6E;QAC7E,mBAAmB;QACnB,aAAa,CAAC,YAAY,EAAE;YAC1B,WAAW,EAAE,WAAW,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,SAAS;YAChE,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACjC,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,0EAA0E;QAC1E,4EAA4E;QAC5E,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,EAAE;aACC,OAAO,CAAuB,iCAAiC,CAAC;aAChE,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAChC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,IAAI,CACL,qHAAqH,CACtH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAe,EACf,QAAiB;IAEjB,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,+EAA+E;IAC/E,aAAa,CAAC,YAAY,EAAE;QAC1B,WAAW,EAAE,WAAW,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,SAAS;QAChE,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE;QACpC,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACH,IAAI,CAAC;QACH,0EAA0E;QAC1E,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,EAAqB,EACrB,OAA8B;IAE9B,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,IAAI,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAChF,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IAElG,MAAM,QAAQ,GAAG,EAAE;SAChB,OAAO,CACN,sFAAsF,CACvF;SACA,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEjB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC1E,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAE/B,EAAE,CAAC,OAAO,CACR,4EAA4E,CAC7E,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,EAAE;SACf,OAAO,CACN,+EAA+E,CAChF;SACA,GAAG,CAAC,EAAE,CAAC,CAAC;IAEX,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iDAAiD,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/db/schema.sql
CHANGED
|
@@ -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
|