@dahch/muninn 0.0.0-stage → 0.1.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 (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -2
  3. package/dist/cli.d.ts +23 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +170 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/check.d.ts +3 -0
  8. package/dist/commands/check.d.ts.map +1 -0
  9. package/dist/commands/check.js +56 -0
  10. package/dist/commands/check.js.map +1 -0
  11. package/dist/commands/memory.d.ts +6 -0
  12. package/dist/commands/memory.d.ts.map +1 -0
  13. package/dist/commands/memory.js +325 -0
  14. package/dist/commands/memory.js.map +1 -0
  15. package/dist/contracts/compiler.d.ts +71 -0
  16. package/dist/contracts/compiler.d.ts.map +1 -0
  17. package/dist/contracts/compiler.js +362 -0
  18. package/dist/contracts/compiler.js.map +1 -0
  19. package/dist/contracts/index.d.ts +2 -0
  20. package/dist/contracts/index.d.ts.map +1 -0
  21. package/dist/contracts/index.js +2 -0
  22. package/dist/contracts/index.js.map +1 -0
  23. package/dist/db/client.d.ts +84 -0
  24. package/dist/db/client.d.ts.map +1 -0
  25. package/dist/db/client.js +264 -0
  26. package/dist/db/client.js.map +1 -0
  27. package/dist/db/schema.sql +97 -0
  28. package/dist/index.d.ts +23 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +23 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/indexer/ast-indexer.d.ts +55 -0
  33. package/dist/indexer/ast-indexer.d.ts.map +1 -0
  34. package/dist/indexer/ast-indexer.js +445 -0
  35. package/dist/indexer/ast-indexer.js.map +1 -0
  36. package/dist/indexer/index.d.ts +2 -0
  37. package/dist/indexer/index.d.ts.map +1 -0
  38. package/dist/indexer/index.js +2 -0
  39. package/dist/indexer/index.js.map +1 -0
  40. package/dist/mcp/index.d.ts +2 -0
  41. package/dist/mcp/index.d.ts.map +1 -0
  42. package/dist/mcp/index.js +2 -0
  43. package/dist/mcp/index.js.map +1 -0
  44. package/dist/mcp/server.d.ts +233 -0
  45. package/dist/mcp/server.d.ts.map +1 -0
  46. package/dist/mcp/server.js +495 -0
  47. package/dist/mcp/server.js.map +1 -0
  48. package/dist/service/index.d.ts +2 -0
  49. package/dist/service/index.d.ts.map +1 -0
  50. package/dist/service/index.js +2 -0
  51. package/dist/service/index.js.map +1 -0
  52. package/dist/service/memory-service.d.ts +203 -0
  53. package/dist/service/memory-service.d.ts.map +1 -0
  54. package/dist/service/memory-service.js +891 -0
  55. package/dist/service/memory-service.js.map +1 -0
  56. package/dist/util/path-safety.d.ts +94 -0
  57. package/dist/util/path-safety.d.ts.map +1 -0
  58. package/dist/util/path-safety.js +162 -0
  59. package/dist/util/path-safety.js.map +1 -0
  60. package/dist/util/text.d.ts +9 -0
  61. package/dist/util/text.d.ts.map +1 -0
  62. package/dist/util/text.js +19 -0
  63. package/dist/util/text.js.map +1 -0
  64. package/package.json +87 -4
@@ -0,0 +1,325 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import { MemoryService } from "../service/memory-service.js";
5
+ import { startMcpServer } from "../mcp/server.js";
6
+ import { indexFilesIntoMuninn } from "../indexer/ast-indexer.js";
7
+ import { sanitizeTerminalText } from "../util/text.js";
8
+ const IGNORED_INDEX_DIRS = new Set([
9
+ "node_modules",
10
+ ".git",
11
+ ".harness",
12
+ ".huginn",
13
+ "dist",
14
+ "build",
15
+ ".cache",
16
+ ]);
17
+ const SOURCE_FILE_EXTENSIONS = new Set([
18
+ ".ts",
19
+ ".tsx",
20
+ ".mts",
21
+ ".cts",
22
+ ".js",
23
+ ".jsx",
24
+ ".mjs",
25
+ ".cjs",
26
+ ]);
27
+ export function findSourceFiles(dir) {
28
+ const results = [];
29
+ function walk(current) {
30
+ if (!fs.existsSync(current))
31
+ return;
32
+ try {
33
+ const entries = fs.readdirSync(current, { withFileTypes: true });
34
+ for (const entry of entries) {
35
+ if (entry.isDirectory()) {
36
+ if (!IGNORED_INDEX_DIRS.has(entry.name)) {
37
+ walk(path.join(current, entry.name));
38
+ }
39
+ }
40
+ else if (entry.isFile()) {
41
+ const ext = path.extname(entry.name).toLowerCase();
42
+ if (SOURCE_FILE_EXTENSIONS.has(ext)) {
43
+ results.push(path.join(current, entry.name));
44
+ }
45
+ }
46
+ }
47
+ }
48
+ catch {
49
+ // ignore read error
50
+ }
51
+ }
52
+ walk(dir);
53
+ return results;
54
+ }
55
+ export function printMemoryUsage() {
56
+ console.log(`muninn memory — Persistent codebase memory across spec-build cycles
57
+
58
+ Usage:
59
+ muninn memory init [--db <path>] [--project <path>]
60
+ muninn memory search <query> [--category <cat>] [--limit <n>] [--project <path>]
61
+ muninn memory sync [--import] [--file <path>] [--project <path>]
62
+ muninn memory index [files...] [--project <path>] [--db <path>]
63
+
64
+ Subcommands:
65
+ init Initialize SQLite database and verify schema
66
+ search Search observations with BM25 relevance ranking
67
+ sync Export observations to disk (.jsonl) or import with --import
68
+ index Index AST symbols and dependencies into Muninn memory
69
+ `);
70
+ }
71
+ export function printMcpUsage() {
72
+ console.log(`muninn mcp — Model Context Protocol server for Muninn memory
73
+
74
+ Usage:
75
+ muninn mcp run [--db <path>] [--project <path>]
76
+
77
+ Subcommands:
78
+ run Start the stdio MCP server for agent memory integration
79
+ `);
80
+ }
81
+ export async function handleMemoryCommand(subcommand, args, positionals) {
82
+ const dbPath = typeof args["--db"] === "string" ? args["--db"] : undefined;
83
+ const projectRoot = typeof args["--project"] === "string"
84
+ ? args["--project"]
85
+ : typeof args["--root"] === "string"
86
+ ? args["--root"]
87
+ : undefined;
88
+ if (!subcommand ||
89
+ args["--help"] ||
90
+ args["-h"] ||
91
+ subcommand === "help" ||
92
+ subcommand === "--help" ||
93
+ subcommand === "-h") {
94
+ printMemoryUsage();
95
+ return;
96
+ }
97
+ if (subcommand === "init") {
98
+ const service = new MemoryService({ dbPath, projectRoot });
99
+ try {
100
+ const project = service.currentProject;
101
+ console.log(chalk.green("✔ Muninn memory database initialized"));
102
+ console.log(` Database: ${service.db.name}`);
103
+ console.log(` Project: ${project.name} (${project.root_path})`);
104
+ console.log(` Status: Tables ready`);
105
+ }
106
+ finally {
107
+ service.close?.();
108
+ }
109
+ return;
110
+ }
111
+ if (subcommand === "search") {
112
+ const queryPositional = positionals?.[0] ??
113
+ (typeof args._positional === "string" && args._positional !== "search"
114
+ ? args._positional
115
+ : undefined);
116
+ const query = typeof args["--query"] === "string" ? args["--query"] : queryPositional;
117
+ if (!query || query.trim() === "") {
118
+ console.error(chalk.red("Error: Search query is required."));
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ const category = typeof args["--category"] === "string" ? args["--category"] : undefined;
123
+ const parsedLimit = typeof args["--limit"] === "string"
124
+ ? Math.floor(Number(args["--limit"]))
125
+ : undefined;
126
+ const limit = parsedLimit && parsedLimit > 0 ? parsedLimit : 10;
127
+ const service = new MemoryService({ dbPath, projectRoot });
128
+ try {
129
+ const results = service.search({
130
+ query: query.trim(),
131
+ category,
132
+ limit,
133
+ });
134
+ if (results.length === 0) {
135
+ console.log(`No observations found matching "${query.trim()}".`);
136
+ return;
137
+ }
138
+ console.log(chalk.bold(`Found ${results.length} result(s) for "${query.trim()}" (BM25 ranked):`));
139
+ for (const obs of results) {
140
+ const categoryTag = chalk.cyan(`[${obs.category.toUpperCase()}]`);
141
+ const rankScore = chalk.gray(`(score: ${obs.rank.toFixed(3)})`);
142
+ console.log(`\n${categoryTag} ${chalk.bold(obs.title)} ${rankScore}`);
143
+ if (obs.topic_key) {
144
+ console.log(` ${chalk.dim("Topic:")} ${obs.topic_key}`);
145
+ }
146
+ const preview = obs.content.length > 150
147
+ ? `${obs.content.slice(0, 147)}...`
148
+ : obs.content;
149
+ console.log(` ${chalk.white(preview.replace(/\n/g, " "))}`);
150
+ if (obs.entities && obs.entities.length > 0) {
151
+ const symbols = obs.entities.map((e) => e.identifier).join(", ");
152
+ console.log(` ${chalk.dim("Symbols:")} ${chalk.yellow(symbols)}`);
153
+ }
154
+ }
155
+ }
156
+ finally {
157
+ service.close?.();
158
+ }
159
+ return;
160
+ }
161
+ if (subcommand === "sync") {
162
+ const syncPositional = positionals?.[0] ??
163
+ (typeof args._positional === "string" && args._positional !== "sync"
164
+ ? args._positional
165
+ : undefined);
166
+ const filePath = typeof args["--file"] === "string" ? args["--file"] : syncPositional;
167
+ const isImport = Boolean(args["--import"]);
168
+ const service = new MemoryService({ dbPath, projectRoot });
169
+ try {
170
+ if (isImport) {
171
+ const result = service.importFromDisk(filePath);
172
+ console.log(`Imported ${result.imported} memories (skipped ${result.skipped} duplicates) from ${filePath ?? path.join(service.currentProject.root_path || process.cwd(), ".huginn", "memories.jsonl")}.`);
173
+ }
174
+ else {
175
+ const result = service.syncToDisk(filePath);
176
+ console.log(`Synced ${result.count} memories to ${result.path}.`);
177
+ }
178
+ }
179
+ finally {
180
+ service.close?.();
181
+ }
182
+ return;
183
+ }
184
+ if (subcommand === "index") {
185
+ const rawFiles = positionals && positionals.length > 0
186
+ ? positionals
187
+ : typeof args._positional === "string" && args._positional !== "index"
188
+ ? [args._positional]
189
+ : [];
190
+ const service = new MemoryService({ dbPath, projectRoot });
191
+ try {
192
+ const root = service.currentProject.root_path || process.cwd();
193
+ const targetFiles = rawFiles.length > 0 ? rawFiles : findSourceFiles(root);
194
+ const result = indexFilesIntoMuninn(service, targetFiles, {
195
+ projectRoot: root,
196
+ });
197
+ console.log(chalk.green(`✔ Indexed ${result.indexedFiles} file(s) (${result.indexedSymbols} symbol(s), ${result.indexedDependencies} dependency link(s)) into Muninn memory.`));
198
+ }
199
+ finally {
200
+ service.close?.();
201
+ }
202
+ return;
203
+ }
204
+ console.error(chalk.red(`Unknown subcommand: ${subcommand}`));
205
+ printMemoryUsage();
206
+ process.exitCode = 1;
207
+ }
208
+ /**
209
+ * Logs to stderr without ever risking a second crash (ADR-30.3): once the
210
+ * parent pipe is gone, even the diagnostic write can fail with EPIPE.
211
+ */
212
+ function logToStderr(line) {
213
+ try {
214
+ process.stderr.write(line.endsWith("\n") ? line : `${line}\n`);
215
+ }
216
+ catch {
217
+ /* stderr is gone too — the process is exiting anyway */
218
+ }
219
+ }
220
+ /**
221
+ * Installs the stdio guards that keep `muninn mcp run` from crashing or hanging
222
+ * when its parent goes away (REQ-30 / AC-30.3):
223
+ *
224
+ * - an `'error'` handler on `process.stdout` so an EPIPE from a closed parent
225
+ * pipe is logged and turned into a clean shutdown instead of an unhandled
226
+ * exception that kills the server mid-response;
227
+ * - a no-op `'error'` handler on `process.stderr` for the same reason (a dead
228
+ * parent usually breaks both ends);
229
+ * - `'end'`/`'close'` on `process.stdin` — the SDK transport only observes
230
+ * `'data'`/`'error'`, so without this bridge a parent disconnect is invisible
231
+ * and the server would keep running forever.
232
+ */
233
+ function installStdioGuards(onStdoutFailure) {
234
+ const onStdoutError = (err) => {
235
+ logToStderr(`[muninn] mcp run: stdout write failed (${sanitizeTerminalText(err.message)}); shutting down.`);
236
+ onStdoutFailure();
237
+ };
238
+ const onStderrError = () => {
239
+ /* a broken stderr must never crash the JSON-RPC server */
240
+ };
241
+ process.stdout.on("error", onStdoutError);
242
+ process.stderr.on("error", onStderrError);
243
+ return {
244
+ dispose() {
245
+ process.stdout.off("error", onStdoutError);
246
+ process.stderr.off("error", onStderrError);
247
+ },
248
+ };
249
+ }
250
+ export async function handleMcpCommand(subcommand, args) {
251
+ const dbPath = typeof args["--db"] === "string" ? args["--db"] : undefined;
252
+ const projectRoot = typeof args["--project"] === "string"
253
+ ? args["--project"]
254
+ : typeof args["--root"] === "string"
255
+ ? args["--root"]
256
+ : undefined;
257
+ if (!subcommand ||
258
+ args["--help"] ||
259
+ args["-h"] ||
260
+ subcommand === "help" ||
261
+ subcommand === "--help" ||
262
+ subcommand === "-h") {
263
+ printMcpUsage();
264
+ return;
265
+ }
266
+ if (subcommand === "run") {
267
+ const { server, transport, service } = await startMcpServer({
268
+ dbPath,
269
+ projectRoot,
270
+ });
271
+ try {
272
+ // Protocol failures were previously discarded (AC-30.3): surface them on
273
+ // stderr (never stdout — that stream carries JSON-RPC) without aborting.
274
+ if (server) {
275
+ server.onerror = (err) => {
276
+ logToStderr(`[muninn] mcp run: protocol error: ${sanitizeTerminalText(err.message)}`);
277
+ };
278
+ }
279
+ // Keep process alive while stdio transport is connected:
280
+ await new Promise((resolve) => {
281
+ let finished = false;
282
+ const onStdinClosed = () => {
283
+ if ((process.env.MUNINN_DEBUG || process.env.HUGINN_DEBUG)) {
284
+ logToStderr("[muninn] mcp run: stdin closed by the client; shutting down.");
285
+ }
286
+ done();
287
+ };
288
+ const guards = installStdioGuards(() => done());
289
+ const done = () => {
290
+ if (finished)
291
+ return;
292
+ finished = true;
293
+ process.removeListener("SIGINT", done);
294
+ process.removeListener("SIGTERM", done);
295
+ process.stdin.removeListener("end", onStdinClosed);
296
+ process.stdin.removeListener("close", onStdinClosed);
297
+ guards.dispose();
298
+ resolve();
299
+ };
300
+ if (transport) {
301
+ transport.onclose = () => done();
302
+ }
303
+ else {
304
+ done();
305
+ return;
306
+ }
307
+ // The parent disappearing is a lifecycle event, not a hang: bridge EOF
308
+ // (and an abruptly closed pipe) to the same shutdown path as onclose.
309
+ process.stdin.on("end", onStdinClosed);
310
+ process.stdin.on("close", onStdinClosed);
311
+ process.on("SIGINT", done);
312
+ process.on("SIGTERM", done);
313
+ });
314
+ }
315
+ finally {
316
+ service?.close?.();
317
+ await server?.close?.();
318
+ }
319
+ return;
320
+ }
321
+ console.error(chalk.red(`Unknown subcommand: ${subcommand}`));
322
+ printMcpUsage();
323
+ process.exitCode = 1;
324
+ }
325
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import ts from "typescript";
2
+ export type DiagnosticCategoryName = "error" | "warning" | "message" | "suggestion";
3
+ export interface FormattedDiagnostic {
4
+ filePath: string;
5
+ line: number;
6
+ character: number;
7
+ code: string;
8
+ category: DiagnosticCategoryName;
9
+ message: string;
10
+ snippet?: string;
11
+ }
12
+ export interface ContractVerificationResult {
13
+ valid: boolean;
14
+ errorsCount: number;
15
+ diagnostics: FormattedDiagnostic[];
16
+ }
17
+ /**
18
+ * Safe default TypeScript compiler options used when tsconfig.json is absent or invalid.
19
+ */
20
+ export declare const DEFAULT_COMPILER_OPTIONS: ts.CompilerOptions;
21
+ /**
22
+ * Creates a formatted visual snippet of the line of code containing the error,
23
+ * with a caret pointer underlining the exact error span.
24
+ * Clamps input positions, line lengths, and span lengths to bounded limits (SEC-006, REV-008).
25
+ */
26
+ export declare function createVisualSnippet(sourceFile: ts.SourceFile, start: number, length?: number): string;
27
+ /**
28
+ * Formats a raw TypeScript compiler diagnostic into a structured FormattedDiagnostic.
29
+ */
30
+ export declare function formatDiagnostic(diagnostic: ts.Diagnostic, projectRoot: string): FormattedDiagnostic;
31
+ /**
32
+ * Loads tsconfig.json strictly from projectRoot without walking up parent directories (REV-005, SEC-007).
33
+ */
34
+ export declare function loadProjectConfig(projectRoot: string): {
35
+ configPath: string | undefined;
36
+ options: ts.CompilerOptions;
37
+ fileNames: string[];
38
+ errors: ts.Diagnostic[];
39
+ };
40
+ export declare const TS_JS_EXTENSIONS: Set<string>;
41
+ /**
42
+ * Recursively discovers TypeScript/JavaScript source files within a directory.
43
+ */
44
+ export declare function findSourceFilesInDir(dir: string): string[];
45
+ export type ResolveTargetFilesResult = {
46
+ success: true;
47
+ targetFiles?: string[];
48
+ } | {
49
+ success: false;
50
+ failure: ContractVerificationResult;
51
+ };
52
+ /**
53
+ * Validates requested file paths against path traversal and file existence (SEC-001, REV-003).
54
+ */
55
+ export declare function resolveTargetFiles(projectRoot: string, filePaths?: string[]): ResolveTargetFilesResult;
56
+ /**
57
+ * Verifies TypeScript compilation contracts for the given project and files.
58
+ * Returns structured pre-emit diagnostics with line/character locations and visual code snippets.
59
+ */
60
+ export declare function verifyTypeScriptContracts(projectRoot: string, filePaths?: string[]): ContractVerificationResult;
61
+ /**
62
+ * Formats a ContractVerificationResult into a markdown report suitable for
63
+ * gate evaluation and thinker fix prompts.
64
+ */
65
+ export declare function formatDiagnosticsReport(result: ContractVerificationResult): string;
66
+ export declare const TypeValidator: {
67
+ check: typeof verifyTypeScriptContracts;
68
+ formatReport: typeof formatDiagnosticsReport;
69
+ DEFAULT_COMPILER_OPTIONS: ts.CompilerOptions;
70
+ };
71
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/contracts/compiler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAC9B,OAAO,GACP,SAAS,GACT,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,sBAAsB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,EAAE,CAAC,eASzC,CAAC;AAkBF;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAU,GACjB,MAAM,CA+BR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAwCrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG;IACtD,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;CACzB,CAuCA;AAED,eAAO,MAAM,gBAAgB,aAS3B,CAAC;AAEH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsB1D;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,0BAA0B,CAAA;CAAE,CAAC;AAE5D;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,wBAAwB,CAyD1B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,0BAA0B,CAwI5B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,0BAA0B,GACjC,MAAM,CAyBR;AAED,eAAO,MAAM,aAAa;;;;CAIzB,CAAC"}