@radix-ai/ai-memory 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 (105) hide show
  1. package/.claude-plugin/marketplace.json +19 -0
  2. package/.cursor-plugin/marketplace.json +19 -0
  3. package/LICENSE +21 -0
  4. package/README.md +331 -0
  5. package/dist/cli/adapters.d.ts +32 -0
  6. package/dist/cli/adapters.d.ts.map +1 -0
  7. package/dist/cli/adapters.js +368 -0
  8. package/dist/cli/adapters.js.map +1 -0
  9. package/dist/cli/environment.d.ts +34 -0
  10. package/dist/cli/environment.d.ts.map +1 -0
  11. package/dist/cli/environment.js +119 -0
  12. package/dist/cli/environment.js.map +1 -0
  13. package/dist/cli/index.d.ts +3 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +1108 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/docs-schema.d.ts +27 -0
  18. package/dist/docs-schema.d.ts.map +1 -0
  19. package/dist/docs-schema.js +100 -0
  20. package/dist/docs-schema.js.map +1 -0
  21. package/dist/evals/index.d.ts +13 -0
  22. package/dist/evals/index.d.ts.map +1 -0
  23. package/dist/evals/index.js +205 -0
  24. package/dist/evals/index.js.map +1 -0
  25. package/dist/evals/performance-comparison.d.ts +23 -0
  26. package/dist/evals/performance-comparison.d.ts.map +1 -0
  27. package/dist/evals/performance-comparison.js +76 -0
  28. package/dist/evals/performance-comparison.js.map +1 -0
  29. package/dist/evals/platform-integration.d.ts +34 -0
  30. package/dist/evals/platform-integration.d.ts.map +1 -0
  31. package/dist/evals/platform-integration.js +186 -0
  32. package/dist/evals/platform-integration.js.map +1 -0
  33. package/dist/formatter/index.d.ts +15 -0
  34. package/dist/formatter/index.d.ts.map +1 -0
  35. package/dist/formatter/index.js +207 -0
  36. package/dist/formatter/index.js.map +1 -0
  37. package/dist/hybrid-search/index.d.ts +40 -0
  38. package/dist/hybrid-search/index.d.ts.map +1 -0
  39. package/dist/hybrid-search/index.js +277 -0
  40. package/dist/hybrid-search/index.js.map +1 -0
  41. package/dist/index.d.ts +4 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +5 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/mcp-server/index.d.ts +6 -0
  46. package/dist/mcp-server/index.d.ts.map +1 -0
  47. package/dist/mcp-server/index.js +114 -0
  48. package/dist/mcp-server/index.js.map +1 -0
  49. package/dist/mcp-server/p0-parser.d.ts +43 -0
  50. package/dist/mcp-server/p0-parser.d.ts.map +1 -0
  51. package/dist/mcp-server/p0-parser.js +108 -0
  52. package/dist/mcp-server/p0-parser.js.map +1 -0
  53. package/dist/mcp-server/resources.d.ts +3 -0
  54. package/dist/mcp-server/resources.d.ts.map +1 -0
  55. package/dist/mcp-server/resources.js +156 -0
  56. package/dist/mcp-server/resources.js.map +1 -0
  57. package/dist/mcp-server/tools.d.ts +15 -0
  58. package/dist/mcp-server/tools.d.ts.map +1 -0
  59. package/dist/mcp-server/tools.js +928 -0
  60. package/dist/mcp-server/tools.js.map +1 -0
  61. package/dist/schema-constants.d.ts +7 -0
  62. package/dist/schema-constants.d.ts.map +1 -0
  63. package/dist/schema-constants.js +33 -0
  64. package/dist/schema-constants.js.map +1 -0
  65. package/package.json +84 -0
  66. package/plugins/adapters/claude-code/.claude-plugin/plugin.json +26 -0
  67. package/plugins/adapters/claude-code/CLAUDE.md +21 -0
  68. package/plugins/adapters/claude-code/README.md +37 -0
  69. package/plugins/adapters/claude-code/agents/governance-checker.md +27 -0
  70. package/plugins/adapters/claude-code/agents/memory-writer.md +31 -0
  71. package/plugins/adapters/claude-code/hooks/SessionStart.js +55 -0
  72. package/plugins/adapters/claude-code/hooks/hooks.json +52 -0
  73. package/plugins/adapters/generic/BOOTSTRAP_INSTRUCTION.md +30 -0
  74. package/plugins/adapters/generic/README.md +50 -0
  75. package/plugins/ai-memory/.claude-plugin/plugin.json +30 -0
  76. package/plugins/ai-memory/.cursor-plugin/plugin.json +18 -0
  77. package/plugins/ai-memory/.mcp.json +19 -0
  78. package/plugins/ai-memory/agents/governance-critic/AGENT.md +57 -0
  79. package/plugins/ai-memory/agents/memory-auditor/AGENT.md +54 -0
  80. package/plugins/ai-memory/rules/context7-tool-reference.md +16 -0
  81. package/plugins/ai-memory/rules/load-memory.md +22 -0
  82. package/plugins/ai-memory/rules/parallel-safe-planning.md +19 -0
  83. package/plugins/ai-memory/skills/mem-auto-review/SKILL.md +51 -0
  84. package/plugins/ai-memory/skills/mem-compound/SKILL.md +105 -0
  85. package/plugins/ai-memory/skills/mem-init/SKILL.md +48 -0
  86. package/plugins/ai-memory/skills/mem-session-close/SKILL.md +38 -0
  87. package/plugins/ai-memory/skills/mem-validate/SKILL.md +54 -0
  88. package/templates/.ai/IDENTITY.md +23 -0
  89. package/templates/.ai/agents/_base-auditor.md +28 -0
  90. package/templates/.ai/agents/_template.md +23 -0
  91. package/templates/.ai/memory/debugging.md +14 -0
  92. package/templates/.ai/memory/decisions.md +8 -0
  93. package/templates/.ai/memory/improvements.md +7 -0
  94. package/templates/.ai/memory/memory-index.md +9 -0
  95. package/templates/.ai/memory/patterns.md +8 -0
  96. package/templates/.ai/reference/PROJECT.md +5 -0
  97. package/templates/.ai/reference/capability-specs.json +31 -0
  98. package/templates/.ai/reference/environment-specs.json +41 -0
  99. package/templates/.ai/sessions/archive/thread-archive.md +15 -0
  100. package/templates/.ai/sessions/open-items.md +13 -0
  101. package/templates/.ai/toolbox/README.md +5 -0
  102. package/templates/.ai/toolbox/browser.md +30 -0
  103. package/templates/.ai/toolbox/integrations.md +44 -0
  104. package/templates/.ai/toolbox/shell.md +38 -0
  105. package/templates/AGENTS.md +4 -0
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Platform integration evals.
3
+ * Measures how well ai-memory integrates with Cursor, Claude Code, and cloud environments.
4
+ */
5
+ import { readFile, readdir } from "fs/promises";
6
+ import { join } from "path";
7
+ import { existsSync } from "fs";
8
+ /**
9
+ * Hook coverage: % of recommended Claude Code hooks installed.
10
+ * Checks for Stop, PreCompact, SubagentStop, WorktreeCreate in .claude/settings.json
11
+ * or plugin hooks.
12
+ */
13
+ export async function evalHookCoverage(projectDir) {
14
+ const recommended = ["Stop", "PreCompact", "SubagentStop", "WorktreeCreate"];
15
+ let found = 0;
16
+ // Check .claude/settings.json
17
+ const settingsPath = join(projectDir, ".claude", "settings.json");
18
+ if (existsSync(settingsPath)) {
19
+ try {
20
+ const settings = JSON.parse(await readFile(settingsPath, "utf-8"));
21
+ const hooks = settings.hooks ?? {};
22
+ for (const hook of recommended) {
23
+ if (hooks[hook])
24
+ found++;
25
+ }
26
+ }
27
+ catch { /* malformed */ }
28
+ }
29
+ // Check plugin hooks — take the max of settings.json and plugin hooks
30
+ const pluginHooksPath = join(projectDir, "plugins", "adapters", "claude-code", "hooks", "hooks.json");
31
+ if (existsSync(pluginHooksPath)) {
32
+ try {
33
+ const pluginHooks = JSON.parse(await readFile(pluginHooksPath, "utf-8"));
34
+ const hooks = pluginHooks.hooks ?? {};
35
+ let pluginFound = 0;
36
+ for (const hook of recommended) {
37
+ if (hooks[hook])
38
+ pluginFound++;
39
+ }
40
+ found = Math.max(found, pluginFound);
41
+ }
42
+ catch { /* malformed */ }
43
+ }
44
+ const pct = Math.round((found / recommended.length) * 100);
45
+ return {
46
+ name: "hook_coverage",
47
+ value: `${pct}%`,
48
+ status: pct >= 75 ? "good" : pct >= 50 ? "warn" : "bad",
49
+ note: `${found}/${recommended.length} recommended hooks (${recommended.join(", ")})`,
50
+ };
51
+ }
52
+ /**
53
+ * Skill discoverability: % of skills present in portable .agents/skills/ directory.
54
+ */
55
+ export async function evalSkillDiscoverability(projectDir) {
56
+ const expected = ["mem-compound", "mem-session-close", "mem-validate", "mem-init"];
57
+ const agentsSkillsDir = join(projectDir, ".agents", "skills");
58
+ let found = 0;
59
+ if (existsSync(agentsSkillsDir)) {
60
+ for (const skill of expected) {
61
+ if (existsSync(join(agentsSkillsDir, skill, "SKILL.md")))
62
+ found++;
63
+ }
64
+ }
65
+ const pct = Math.round((found / expected.length) * 100);
66
+ return {
67
+ name: "skill_discoverability",
68
+ value: `${pct}%`,
69
+ status: pct === 100 ? "good" : pct >= 50 ? "warn" : "bad",
70
+ note: found === expected.length
71
+ ? "All skills in portable .agents/skills/"
72
+ : `${found}/${expected.length} skills found. Run \`ai-memory install --to cursor\` or \`--to claude-code\` to install.`,
73
+ };
74
+ }
75
+ /**
76
+ * Cloud readiness: .ai/ is git-tracked + sync_memory available + HTTP transport exists.
77
+ */
78
+ export async function evalCloudReadiness(projectDir) {
79
+ const checks = [];
80
+ let passed = 0;
81
+ // Check .ai/ is git-tracked
82
+ const aiDir = join(projectDir, ".ai");
83
+ if (existsSync(aiDir)) {
84
+ checks.push("✓ .ai/ exists");
85
+ passed++;
86
+ }
87
+ else {
88
+ checks.push("✗ .ai/ missing");
89
+ }
90
+ // Check .mcp.json exists (sync_memory available via MCP)
91
+ if (existsSync(join(projectDir, ".mcp.json"))) {
92
+ checks.push("✓ .mcp.json present (sync_memory available)");
93
+ passed++;
94
+ }
95
+ else {
96
+ checks.push("✗ .mcp.json missing");
97
+ }
98
+ // Check if MCP server code supports HTTP
99
+ const mcpIndex = join(projectDir, "src", "mcp-server", "index.ts");
100
+ if (existsSync(mcpIndex)) {
101
+ try {
102
+ const content = await readFile(mcpIndex, "utf-8");
103
+ if (content.includes("StreamableHTTPServerTransport") || content.includes("--http")) {
104
+ checks.push("✓ HTTP transport supported");
105
+ passed++;
106
+ }
107
+ else {
108
+ checks.push("✗ HTTP transport not implemented");
109
+ }
110
+ }
111
+ catch {
112
+ checks.push("? Could not read MCP server source");
113
+ }
114
+ }
115
+ else {
116
+ // Check dist for published package
117
+ checks.push("~ HTTP transport (check package)");
118
+ passed++; // Give benefit of doubt for installed packages
119
+ }
120
+ return {
121
+ name: "cloud_readiness",
122
+ value: `${passed}/3`,
123
+ status: passed === 3 ? "good" : passed >= 2 ? "warn" : "bad",
124
+ note: checks.join("; "),
125
+ };
126
+ }
127
+ /**
128
+ * Automation readiness: skills have automation sections and sync_memory calls.
129
+ */
130
+ export async function evalAutomationReadiness(projectDir) {
131
+ const skillDirs = [
132
+ join(projectDir, "plugins", "ai-memory", "skills"),
133
+ join(projectDir, ".agents", "skills"),
134
+ ];
135
+ let totalSkills = 0;
136
+ let automationReady = 0;
137
+ for (const dir of skillDirs) {
138
+ if (!existsSync(dir))
139
+ continue;
140
+ const entries = await readdir(dir, { withFileTypes: true });
141
+ for (const entry of entries) {
142
+ if (!entry.isDirectory())
143
+ continue;
144
+ const skillPath = join(dir, entry.name, "SKILL.md");
145
+ if (!existsSync(skillPath))
146
+ continue;
147
+ totalSkills++;
148
+ const content = await readFile(skillPath, "utf-8");
149
+ if (content.toLowerCase().includes("automation") || content.includes("sync_memory")) {
150
+ automationReady++;
151
+ }
152
+ }
153
+ }
154
+ if (totalSkills === 0) {
155
+ return { name: "automation_readiness", value: "n/a", status: "warn", note: "No skills found" };
156
+ }
157
+ const pct = Math.round((automationReady / totalSkills) * 100);
158
+ return {
159
+ name: "automation_readiness",
160
+ value: `${pct}%`,
161
+ status: pct >= 80 ? "good" : pct >= 50 ? "warn" : "bad",
162
+ note: `${automationReady}/${totalSkills} skills are automation-ready (mention automation/sync_memory)`,
163
+ };
164
+ }
165
+ /**
166
+ * Integration coverage: % of recommended toolbox files that exist.
167
+ */
168
+ export async function evalIntegrationCoverage(aiDir) {
169
+ const expected = ["integrations.md", "browser.md", "shell.md"];
170
+ const toolboxDir = join(aiDir, "toolbox");
171
+ let found = 0;
172
+ if (existsSync(toolboxDir)) {
173
+ for (const file of expected) {
174
+ if (existsSync(join(toolboxDir, file)))
175
+ found++;
176
+ }
177
+ }
178
+ const pct = Math.round((found / expected.length) * 100);
179
+ return {
180
+ name: "integration_coverage",
181
+ value: `${pct}%`,
182
+ status: pct === 100 ? "good" : pct >= 33 ? "warn" : "bad",
183
+ note: `${found}/${expected.length} toolbox files (${expected.join(", ")})`,
184
+ };
185
+ }
186
+ //# sourceMappingURL=platform-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-integration.js","sourceRoot":"","sources":["../../src/evals/platform-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ValidationError {
2
+ file: string;
3
+ message: string;
4
+ /** "error" fails validate; "warn" logs but does not fail */
5
+ severity?: "error" | "warn";
6
+ }
7
+ export declare function validateFrontmatter(filePath: string, content: string): string[];
8
+ /** Warn if skill content contains tool names — skills should declare capabilities, not tools. */
9
+ export declare function validateSkillContent(filePath: string, content: string): string[];
10
+ export declare function ensureFrontmatter(filePath: string, content: string): string;
11
+ export declare function validateAll(aiDir: string): Promise<ValidationError[]>;
12
+ export declare function formatAll(aiDir: string): Promise<number>;
13
+ /** Regenerate memory-index.md from decisions, patterns, debugging, improvements. */
14
+ export declare function generateMemoryIndex(aiDir: string): Promise<void>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7B;AAGD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CA+BV;AAED,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhF;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA8C3E;AAGD,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkB3E;AAGD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc9D;AAiCD,oFAAoF;AACpF,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CtE"}
@@ -0,0 +1,207 @@
1
+ import { readFile, writeFile, readdir } from "fs/promises";
2
+ import { join } from "path";
3
+ import { existsSync } from "fs";
4
+ import matter from "gray-matter";
5
+ import { VALID_TYPES, VALID_STATUSES, SKILL_TOOL_NAMES_BLOCKLIST } from "../schema-constants.js";
6
+ // Validate frontmatter of a single file
7
+ export function validateFrontmatter(filePath, content) {
8
+ const errors = [];
9
+ let parsed;
10
+ try {
11
+ parsed = matter(content);
12
+ }
13
+ catch {
14
+ return [`Invalid YAML frontmatter`];
15
+ }
16
+ const fm = parsed.data;
17
+ // Files in temp/ are auto-generated — skip validation
18
+ if (filePath.includes("/temp/") || filePath.includes("\\temp\\")) {
19
+ return [];
20
+ }
21
+ // Required fields
22
+ if (!fm.id)
23
+ errors.push(`Missing required field: id`);
24
+ if (!fm.type)
25
+ errors.push(`Missing required field: type`);
26
+ if (!fm.status)
27
+ errors.push(`Missing required field: status`);
28
+ // Valid enum values
29
+ if (fm.type && !VALID_TYPES.includes(fm.type)) {
30
+ errors.push(`Invalid type "${fm.type}". Must be one of: ${VALID_TYPES.join(", ")}`);
31
+ }
32
+ if (fm.status && !VALID_STATUSES.includes(fm.status)) {
33
+ errors.push(`Invalid status "${fm.status}". Must be one of: ${VALID_STATUSES.join(", ")}`);
34
+ }
35
+ return errors;
36
+ }
37
+ /** Warn if skill content contains tool names — skills should declare capabilities, not tools. */
38
+ export function validateSkillContent(filePath, content) {
39
+ const warnings = [];
40
+ if (!filePath.includes("/skills/") || !filePath.endsWith("SKILL.md"))
41
+ return warnings;
42
+ const body = content.replace(/^---[\s\S]*?---\s*/m, "").toLowerCase();
43
+ for (const tool of SKILL_TOOL_NAMES_BLOCKLIST) {
44
+ if (body.includes(tool)) {
45
+ warnings.push(`Skill references tool "${tool}" — prefer capability-based requires (see [P1] Capability-based skills)`);
46
+ }
47
+ }
48
+ return warnings;
49
+ }
50
+ // Auto-add minimal frontmatter if missing
51
+ export function ensureFrontmatter(filePath, content) {
52
+ // Skip temp/ and non-.md files
53
+ if (filePath.includes("/temp/") || filePath.includes("\\temp\\"))
54
+ return content;
55
+ let parsed;
56
+ try {
57
+ parsed = matter(content);
58
+ }
59
+ catch {
60
+ return content;
61
+ }
62
+ const fm = parsed.data;
63
+ let changed = false;
64
+ if (!fm.id) {
65
+ // Derive id from filename
66
+ const basename = filePath.split(/[\\/]/).pop()?.replace(".md", "") ?? "unknown";
67
+ fm.id = basename.toLowerCase().replace(/[^a-z0-9]+/g, "-");
68
+ changed = true;
69
+ }
70
+ if (!fm.type) {
71
+ // Infer type from path
72
+ if (filePath.includes("/memory/"))
73
+ fm.type = "decision";
74
+ else if (filePath.includes("/agents/"))
75
+ fm.type = "agent";
76
+ else if (filePath.includes("/skills/"))
77
+ fm.type = "skill";
78
+ else if (filePath.includes("/toolbox/"))
79
+ fm.type = "toolbox";
80
+ else if (filePath.includes("/rules/"))
81
+ fm.type = "rule";
82
+ else if (filePath.endsWith("IDENTITY.md"))
83
+ fm.type = "identity";
84
+ else if (filePath.endsWith("PROJECT_STATUS.md"))
85
+ fm.type = "project-status";
86
+ else
87
+ fm.type = "decision";
88
+ changed = true;
89
+ }
90
+ if (!fm.status) {
91
+ fm.status = "active";
92
+ changed = true;
93
+ }
94
+ if (!changed)
95
+ return content;
96
+ // Reconstruct file with updated frontmatter
97
+ const newFm = Object.keys(fm)
98
+ .map((k) => `${k}: ${JSON.stringify(fm[k])}`)
99
+ .join("\n");
100
+ return `---\n${newFm}\n---\n\n${parsed.content.trimStart()}`;
101
+ }
102
+ // Validate all .md files under aiDir
103
+ export async function validateAll(aiDir) {
104
+ const errors = [];
105
+ const files = await collectMdFiles(aiDir);
106
+ for (const file of files) {
107
+ const content = await readFile(file, "utf-8");
108
+ const fileErrors = validateFrontmatter(file, content);
109
+ const skillWarnings = validateSkillContent(file, content);
110
+ const rel = file.replace(aiDir, "").replace(/^[/\\]/, "");
111
+ for (const msg of fileErrors) {
112
+ errors.push({ file: rel, message: msg, severity: "error" });
113
+ }
114
+ for (const msg of skillWarnings) {
115
+ errors.push({ file: rel, message: msg, severity: "warn" });
116
+ }
117
+ }
118
+ return errors;
119
+ }
120
+ // Format (auto-fix frontmatter) on all .md files under aiDir
121
+ export async function formatAll(aiDir) {
122
+ const files = await collectMdFiles(aiDir);
123
+ let count = 0;
124
+ for (const file of files) {
125
+ const original = await readFile(file, "utf-8");
126
+ const formatted = ensureFrontmatter(file, original);
127
+ if (formatted !== original) {
128
+ await writeFile(file, formatted);
129
+ count++;
130
+ }
131
+ }
132
+ return count;
133
+ }
134
+ async function collectMdFiles(dir) {
135
+ const results = [];
136
+ if (!existsSync(dir))
137
+ return results;
138
+ const entries = await readdir(dir, { withFileTypes: true });
139
+ for (const entry of entries) {
140
+ const full = join(dir, entry.name);
141
+ if (entry.isDirectory()) {
142
+ results.push(...(await collectMdFiles(full)));
143
+ }
144
+ else if (entry.name.endsWith(".md")) {
145
+ results.push(full);
146
+ }
147
+ }
148
+ return results;
149
+ }
150
+ /** Extract [P0]/[P1]/[P2] entry titles from markdown (skip [DEPRECATED]). */
151
+ function extractEntries(content) {
152
+ const entries = [];
153
+ const lines = content.split("\n");
154
+ for (const line of lines) {
155
+ const m = line.match(/^###\s*\[(P[012])\]\s*(.+?)(?:\s*\[DEPRECATED\])?$/);
156
+ if (m) {
157
+ const title = m[2].replace(/\s*\[DEPRECATED\]\s*$/, "").trim();
158
+ if (!line.includes("[DEPRECATED]"))
159
+ entries.push({ priority: m[1], title });
160
+ }
161
+ }
162
+ return entries;
163
+ }
164
+ /** Regenerate memory-index.md from decisions, patterns, debugging, improvements. */
165
+ export async function generateMemoryIndex(aiDir) {
166
+ const memoryDir = join(aiDir, "memory");
167
+ if (!existsSync(memoryDir))
168
+ return;
169
+ const sections = [];
170
+ for (const file of ["decisions.md", "patterns.md", "debugging.md", "improvements.md"]) {
171
+ const path = join(memoryDir, file);
172
+ if (!existsSync(path))
173
+ continue;
174
+ const content = await readFile(path, "utf-8");
175
+ const entries = extractEntries(content);
176
+ if (entries.length > 0)
177
+ sections.push({ file, entries });
178
+ }
179
+ const priorityOrder = ["P0", "P1", "P2"];
180
+ const lines = [
181
+ "---",
182
+ `id: memory-index`,
183
+ "type: index",
184
+ "status: active",
185
+ `last_updated: ${new Date().toISOString().slice(0, 10)}`,
186
+ "---",
187
+ "",
188
+ "# Memory Index",
189
+ "",
190
+ "**Auto-generated.** Run `ai-memory index` or `/mem-compound` to regenerate.",
191
+ "",
192
+ "---",
193
+ "",
194
+ ];
195
+ for (const { file, entries } of sections) {
196
+ const label = file.replace(".md", "").replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
197
+ lines.push(`## ${label}\n`);
198
+ const sorted = [...entries].sort((a, b) => priorityOrder.indexOf(a.priority) - priorityOrder.indexOf(b.priority));
199
+ for (const e of sorted) {
200
+ lines.push(`- **[${e.priority}]** ${e.title}`);
201
+ }
202
+ lines.push("");
203
+ }
204
+ const indexPath = join(memoryDir, "memory-index.md");
205
+ await writeFile(indexPath, lines.join("\n").trimEnd() + "\n");
206
+ }
207
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatter/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export type SearchMode = "keyword" | "semantic" | "hybrid";
2
+ /** Backend used for search: native (onnxruntime-node), wasm, or keyword-only. */
3
+ export type SearchBackend = "native" | "wasm" | "keyword";
4
+ export interface SearchResult {
5
+ file: string;
6
+ excerpt: string;
7
+ score: number;
8
+ }
9
+ export interface HybridSearchResponse {
10
+ results: SearchResult[];
11
+ backend: SearchBackend;
12
+ }
13
+ export interface Chunk {
14
+ file: string;
15
+ text: string;
16
+ content: string;
17
+ }
18
+ export declare function loadChunks(aiDir: string): Promise<Chunk[]>;
19
+ /** Pre-warm the semantic model (download + load). Call at init or session start to avoid first-query latency. */
20
+ export declare function warmSearchModel(): Promise<void>;
21
+ /** Backend used for the last semantic/hybrid search, or "keyword" if only keyword was used. */
22
+ export declare function getLastSearchBackend(): SearchBackend;
23
+ export interface HybridSearchOptions {
24
+ mode: SearchMode;
25
+ limit?: number;
26
+ tags?: string[];
27
+ includeDeprecated?: boolean;
28
+ }
29
+ /**
30
+ * Run hybrid search. Returns results ordered by relevance.
31
+ * - keyword: TF-based only
32
+ * - semantic: vector similarity only (requires model load)
33
+ * - hybrid: RRF merge of keyword + semantic
34
+ */
35
+ export declare function hybridSearch(aiDir: string, query: string, options: HybridSearchOptions): Promise<HybridSearchResponse>;
36
+ /**
37
+ * Get current search mode from env. Default: hybrid.
38
+ */
39
+ export declare function getSearchMode(): SearchMode;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hybrid-search/index.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3D,iFAAiF;AACjF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CA6BhE;AA+ID,iHAAiH;AACjH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD;AAED,+FAA+F;AAC/F,wBAAgB,oBAAoB,IAAI,aAAa,CAEpD;AAuBD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAuE/B;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAI1C"}