@iamsyr/agentmind 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 (229) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +462 -0
  4. package/RELEASING.md +42 -0
  5. package/dist/adapters/cursor.d.ts +2 -0
  6. package/dist/adapters/cursor.d.ts.map +1 -0
  7. package/dist/adapters/cursor.js +39 -0
  8. package/dist/adapters/cursor.js.map +1 -0
  9. package/dist/adapters/index.d.ts +9 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +16 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/types.d.ts +24 -0
  14. package/dist/adapters/types.d.ts.map +1 -0
  15. package/dist/adapters/types.js +66 -0
  16. package/dist/adapters/types.js.map +1 -0
  17. package/dist/adapters/windsurf.d.ts +2 -0
  18. package/dist/adapters/windsurf.d.ts.map +1 -0
  19. package/dist/adapters/windsurf.js +44 -0
  20. package/dist/adapters/windsurf.js.map +1 -0
  21. package/dist/bridge/conflict.d.ts +9 -0
  22. package/dist/bridge/conflict.d.ts.map +1 -0
  23. package/dist/bridge/conflict.js +38 -0
  24. package/dist/bridge/conflict.js.map +1 -0
  25. package/dist/bridge/index.d.ts +5 -0
  26. package/dist/bridge/index.d.ts.map +1 -0
  27. package/dist/bridge/index.js +3 -0
  28. package/dist/bridge/index.js.map +1 -0
  29. package/dist/bridge/state.d.ts +30 -0
  30. package/dist/bridge/state.d.ts.map +1 -0
  31. package/dist/bridge/state.js +130 -0
  32. package/dist/bridge/state.js.map +1 -0
  33. package/dist/cli/commands/agents.d.ts +2 -0
  34. package/dist/cli/commands/agents.d.ts.map +1 -0
  35. package/dist/cli/commands/agents.js +38 -0
  36. package/dist/cli/commands/agents.js.map +1 -0
  37. package/dist/cli/commands/annotate.d.ts +4 -0
  38. package/dist/cli/commands/annotate.d.ts.map +1 -0
  39. package/dist/cli/commands/annotate.js +116 -0
  40. package/dist/cli/commands/annotate.js.map +1 -0
  41. package/dist/cli/commands/behaviors.d.ts +6 -0
  42. package/dist/cli/commands/behaviors.d.ts.map +1 -0
  43. package/dist/cli/commands/behaviors.js +76 -0
  44. package/dist/cli/commands/behaviors.js.map +1 -0
  45. package/dist/cli/commands/bridge.d.ts +15 -0
  46. package/dist/cli/commands/bridge.d.ts.map +1 -0
  47. package/dist/cli/commands/bridge.js +75 -0
  48. package/dist/cli/commands/bridge.js.map +1 -0
  49. package/dist/cli/commands/health.d.ts +4 -0
  50. package/dist/cli/commands/health.d.ts.map +1 -0
  51. package/dist/cli/commands/health.js +382 -0
  52. package/dist/cli/commands/health.js.map +1 -0
  53. package/dist/cli/commands/hooks.d.ts +3 -0
  54. package/dist/cli/commands/hooks.d.ts.map +1 -0
  55. package/dist/cli/commands/hooks.js +59 -0
  56. package/dist/cli/commands/hooks.js.map +1 -0
  57. package/dist/cli/commands/init.d.ts +2 -0
  58. package/dist/cli/commands/init.d.ts.map +1 -0
  59. package/dist/cli/commands/init.js +128 -0
  60. package/dist/cli/commands/init.js.map +1 -0
  61. package/dist/cli/commands/inject.d.ts +6 -0
  62. package/dist/cli/commands/inject.d.ts.map +1 -0
  63. package/dist/cli/commands/inject.js +84 -0
  64. package/dist/cli/commands/inject.js.map +1 -0
  65. package/dist/cli/commands/insights.d.ts +4 -0
  66. package/dist/cli/commands/insights.d.ts.map +1 -0
  67. package/dist/cli/commands/insights.js +124 -0
  68. package/dist/cli/commands/insights.js.map +1 -0
  69. package/dist/cli/commands/learn.d.ts +8 -0
  70. package/dist/cli/commands/learn.d.ts.map +1 -0
  71. package/dist/cli/commands/learn.js +121 -0
  72. package/dist/cli/commands/learn.js.map +1 -0
  73. package/dist/cli/commands/log-behavior.d.ts +14 -0
  74. package/dist/cli/commands/log-behavior.d.ts.map +1 -0
  75. package/dist/cli/commands/log-behavior.js +50 -0
  76. package/dist/cli/commands/log-behavior.js.map +1 -0
  77. package/dist/cli/commands/overlay.d.ts +10 -0
  78. package/dist/cli/commands/overlay.d.ts.map +1 -0
  79. package/dist/cli/commands/overlay.js +303 -0
  80. package/dist/cli/commands/overlay.js.map +1 -0
  81. package/dist/cli/commands/pull.d.ts +4 -0
  82. package/dist/cli/commands/pull.d.ts.map +1 -0
  83. package/dist/cli/commands/pull.js +93 -0
  84. package/dist/cli/commands/pull.js.map +1 -0
  85. package/dist/cli/commands/push.d.ts +5 -0
  86. package/dist/cli/commands/push.d.ts.map +1 -0
  87. package/dist/cli/commands/push.js +71 -0
  88. package/dist/cli/commands/push.js.map +1 -0
  89. package/dist/cli/commands/scan.d.ts +5 -0
  90. package/dist/cli/commands/scan.d.ts.map +1 -0
  91. package/dist/cli/commands/scan.js +134 -0
  92. package/dist/cli/commands/scan.js.map +1 -0
  93. package/dist/cli/commands/serve.d.ts +2 -0
  94. package/dist/cli/commands/serve.d.ts.map +1 -0
  95. package/dist/cli/commands/serve.js +17 -0
  96. package/dist/cli/commands/serve.js.map +1 -0
  97. package/dist/cli/commands/share.d.ts +5 -0
  98. package/dist/cli/commands/share.d.ts.map +1 -0
  99. package/dist/cli/commands/share.js +97 -0
  100. package/dist/cli/commands/share.js.map +1 -0
  101. package/dist/cli/commands/status.d.ts +2 -0
  102. package/dist/cli/commands/status.d.ts.map +1 -0
  103. package/dist/cli/commands/status.js +167 -0
  104. package/dist/cli/commands/status.js.map +1 -0
  105. package/dist/cli/commands/sync.d.ts +6 -0
  106. package/dist/cli/commands/sync.d.ts.map +1 -0
  107. package/dist/cli/commands/sync.js +60 -0
  108. package/dist/cli/commands/sync.js.map +1 -0
  109. package/dist/cli/commands/template.d.ts +5 -0
  110. package/dist/cli/commands/template.d.ts.map +1 -0
  111. package/dist/cli/commands/template.js +98 -0
  112. package/dist/cli/commands/template.js.map +1 -0
  113. package/dist/cli/index.d.ts +3 -0
  114. package/dist/cli/index.d.ts.map +1 -0
  115. package/dist/cli/index.js +172 -0
  116. package/dist/cli/index.js.map +1 -0
  117. package/dist/cli/utils.d.ts +6 -0
  118. package/dist/cli/utils.d.ts.map +1 -0
  119. package/dist/cli/utils.js +49 -0
  120. package/dist/cli/utils.js.map +1 -0
  121. package/dist/hooks/claude.d.ts +6 -0
  122. package/dist/hooks/claude.d.ts.map +1 -0
  123. package/dist/hooks/claude.js +189 -0
  124. package/dist/hooks/claude.js.map +1 -0
  125. package/dist/hooks/codex.d.ts +6 -0
  126. package/dist/hooks/codex.d.ts.map +1 -0
  127. package/dist/hooks/codex.js +120 -0
  128. package/dist/hooks/codex.js.map +1 -0
  129. package/dist/hooks/index.d.ts +5 -0
  130. package/dist/hooks/index.d.ts.map +1 -0
  131. package/dist/hooks/index.js +4 -0
  132. package/dist/hooks/index.js.map +1 -0
  133. package/dist/hooks/template.d.ts +5 -0
  134. package/dist/hooks/template.d.ts.map +1 -0
  135. package/dist/hooks/template.js +176 -0
  136. package/dist/hooks/template.js.map +1 -0
  137. package/dist/index.d.ts +5 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +4 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/learn/analyzer.d.ts +11 -0
  142. package/dist/learn/analyzer.d.ts.map +1 -0
  143. package/dist/learn/analyzer.js +145 -0
  144. package/dist/learn/analyzer.js.map +1 -0
  145. package/dist/learn/generator.d.ts +12 -0
  146. package/dist/learn/generator.d.ts.map +1 -0
  147. package/dist/learn/generator.js +37 -0
  148. package/dist/learn/generator.js.map +1 -0
  149. package/dist/mcp/index.d.ts +2 -0
  150. package/dist/mcp/index.d.ts.map +1 -0
  151. package/dist/mcp/index.js +2 -0
  152. package/dist/mcp/index.js.map +1 -0
  153. package/dist/mcp/server.d.ts +2 -0
  154. package/dist/mcp/server.d.ts.map +1 -0
  155. package/dist/mcp/server.js +325 -0
  156. package/dist/mcp/server.js.map +1 -0
  157. package/dist/router/index.d.ts +3 -0
  158. package/dist/router/index.d.ts.map +1 -0
  159. package/dist/router/index.js +44 -0
  160. package/dist/router/index.js.map +1 -0
  161. package/dist/scanner/classify.d.ts +6 -0
  162. package/dist/scanner/classify.d.ts.map +1 -0
  163. package/dist/scanner/classify.js +101 -0
  164. package/dist/scanner/classify.js.map +1 -0
  165. package/dist/scanner/graph.d.ts +3 -0
  166. package/dist/scanner/graph.d.ts.map +1 -0
  167. package/dist/scanner/graph.js +104 -0
  168. package/dist/scanner/graph.js.map +1 -0
  169. package/dist/scanner/index.d.ts +6 -0
  170. package/dist/scanner/index.d.ts.map +1 -0
  171. package/dist/scanner/index.js +23 -0
  172. package/dist/scanner/index.js.map +1 -0
  173. package/dist/scanner/patterns.d.ts +3 -0
  174. package/dist/scanner/patterns.d.ts.map +1 -0
  175. package/dist/scanner/patterns.js +179 -0
  176. package/dist/scanner/patterns.js.map +1 -0
  177. package/dist/store/db.d.ts +21 -0
  178. package/dist/store/db.d.ts.map +1 -0
  179. package/dist/store/db.js +55 -0
  180. package/dist/store/db.js.map +1 -0
  181. package/dist/store/index.d.ts +3 -0
  182. package/dist/store/index.d.ts.map +1 -0
  183. package/dist/store/index.js +3 -0
  184. package/dist/store/index.js.map +1 -0
  185. package/dist/store/jsonl.d.ts +6 -0
  186. package/dist/store/jsonl.d.ts.map +1 -0
  187. package/dist/store/jsonl.js +55 -0
  188. package/dist/store/jsonl.js.map +1 -0
  189. package/dist/store/schema.d.ts +32 -0
  190. package/dist/store/schema.d.ts.map +1 -0
  191. package/dist/store/schema.js +210 -0
  192. package/dist/store/schema.js.map +1 -0
  193. package/dist/templates/go.d.ts +3 -0
  194. package/dist/templates/go.d.ts.map +1 -0
  195. package/dist/templates/go.js +35 -0
  196. package/dist/templates/go.js.map +1 -0
  197. package/dist/templates/index.d.ts +13 -0
  198. package/dist/templates/index.d.ts.map +1 -0
  199. package/dist/templates/index.js +98 -0
  200. package/dist/templates/index.js.map +1 -0
  201. package/dist/templates/nextjs.d.ts +3 -0
  202. package/dist/templates/nextjs.d.ts.map +1 -0
  203. package/dist/templates/nextjs.js +53 -0
  204. package/dist/templates/nextjs.js.map +1 -0
  205. package/dist/templates/python.d.ts +3 -0
  206. package/dist/templates/python.d.ts.map +1 -0
  207. package/dist/templates/python.js +41 -0
  208. package/dist/templates/python.js.map +1 -0
  209. package/dist/templates/react-native.d.ts +3 -0
  210. package/dist/templates/react-native.d.ts.map +1 -0
  211. package/dist/templates/react-native.js +35 -0
  212. package/dist/templates/react-native.js.map +1 -0
  213. package/dist/templates/registry.d.ts +24 -0
  214. package/dist/templates/registry.d.ts.map +1 -0
  215. package/dist/templates/registry.js +2 -0
  216. package/dist/templates/registry.js.map +1 -0
  217. package/dist/templates/rust.d.ts +3 -0
  218. package/dist/templates/rust.d.ts.map +1 -0
  219. package/dist/templates/rust.js +41 -0
  220. package/dist/templates/rust.js.map +1 -0
  221. package/dist/templates/sst.d.ts +3 -0
  222. package/dist/templates/sst.d.ts.map +1 -0
  223. package/dist/templates/sst.js +35 -0
  224. package/dist/templates/sst.js.map +1 -0
  225. package/dist/types/index.d.ts +92 -0
  226. package/dist/types/index.d.ts.map +1 -0
  227. package/dist/types/index.js +2 -0
  228. package/dist/types/index.js.map +1 -0
  229. package/package.json +62 -0
@@ -0,0 +1,120 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { generatePreToolUseHook, generatePostToolUseHook, generatePostCommitHook } from "./template.js";
5
+ const HOOKS_DIR = ".agentmind/hooks";
6
+ const CODEX_CONFIG_DIR = ".codex";
7
+ const CODEX_CONFIG_FILE = "config.json";
8
+ function getAgentMindBin() {
9
+ if (process.env.AGENTMIND_DEV) {
10
+ return "agentmind";
11
+ }
12
+ return "agentmind";
13
+ }
14
+ function getHookScript(name) {
15
+ return path.join(HOOKS_DIR, `${name}.mjs`);
16
+ }
17
+ function getNodeHookCommand(name) {
18
+ return `node ${getHookScript(name)}`;
19
+ }
20
+ function writeAgentMindConfig(projectRoot) {
21
+ const cliEntry = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../cli/index.js");
22
+ const configPath = path.join(projectRoot, ".agentmind", "config.json");
23
+ const config = {
24
+ command: [process.execPath, cliEntry],
25
+ };
26
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
27
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
28
+ }
29
+ export function getCodexHookConfig(agentMindBin) {
30
+ return [
31
+ {
32
+ agent: "codex",
33
+ events: [{ type: "pre_prompt", filter: "read|edit|write" }],
34
+ script: getHookScript("pre-tool-use"),
35
+ enabled: true,
36
+ },
37
+ {
38
+ agent: "codex",
39
+ events: [{ type: "post_response", filter: "edit|write" }],
40
+ script: getHookScript("post-tool-use"),
41
+ enabled: true,
42
+ },
43
+ ];
44
+ }
45
+ export function installCodexHooks(projectRoot, agentMindBin) {
46
+ const hooksDir = path.join(projectRoot, HOOKS_DIR);
47
+ const codexDir = path.join(projectRoot, CODEX_CONFIG_DIR);
48
+ if (!fs.existsSync(hooksDir)) {
49
+ fs.mkdirSync(hooksDir, { recursive: true });
50
+ }
51
+ if (!fs.existsSync(codexDir)) {
52
+ fs.mkdirSync(codexDir, { recursive: true });
53
+ }
54
+ writeAgentMindConfig(projectRoot);
55
+ fs.writeFileSync(path.join(hooksDir, "pre-tool-use.mjs"), generatePreToolUseHook());
56
+ fs.writeFileSync(path.join(hooksDir, "post-tool-use.mjs"), generatePostToolUseHook());
57
+ fs.writeFileSync(path.join(hooksDir, "post-commit.mjs"), generatePostCommitHook());
58
+ const configPath = path.join(codexDir, CODEX_CONFIG_FILE);
59
+ let config = {};
60
+ if (fs.existsSync(configPath)) {
61
+ try {
62
+ config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
63
+ }
64
+ catch {
65
+ config = {};
66
+ }
67
+ }
68
+ config.hooks = {
69
+ preToolUse: getNodeHookCommand("pre-tool-use"),
70
+ postToolUse: getNodeHookCommand("post-tool-use"),
71
+ onFileChange: getNodeHookCommand("post-commit"),
72
+ };
73
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
74
+ }
75
+ export function uninstallCodexHooks(projectRoot) {
76
+ const configPath = path.join(projectRoot, CODEX_CONFIG_DIR, CODEX_CONFIG_FILE);
77
+ if (!fs.existsSync(configPath)) {
78
+ return;
79
+ }
80
+ let config;
81
+ try {
82
+ config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
83
+ }
84
+ catch {
85
+ return;
86
+ }
87
+ if (config.hooks) {
88
+ delete config.hooks.preToolUse;
89
+ delete config.hooks.postToolUse;
90
+ delete config.hooks.onFileChange;
91
+ if (Object.keys(config.hooks).length === 0) {
92
+ delete config.hooks;
93
+ }
94
+ }
95
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
96
+ const hooksDir = path.join(projectRoot, HOOKS_DIR);
97
+ if (fs.existsSync(hooksDir)) {
98
+ const hookFiles = ["pre-tool-use.mjs", "post-tool-use.mjs", "post-commit.mjs"];
99
+ for (const file of hookFiles) {
100
+ const filePath = path.join(hooksDir, file);
101
+ if (fs.existsSync(filePath)) {
102
+ fs.unlinkSync(filePath);
103
+ }
104
+ }
105
+ }
106
+ }
107
+ export function isCodexHooksInstalled(projectRoot) {
108
+ const configPath = path.join(projectRoot, CODEX_CONFIG_DIR, CODEX_CONFIG_FILE);
109
+ if (!fs.existsSync(configPath)) {
110
+ return false;
111
+ }
112
+ try {
113
+ const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
114
+ return !!(config.hooks?.preToolUse?.includes("pre-tool-use.mjs"));
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/hooks/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { generatePreToolUseHook, generatePostToolUseHook, generatePostCommitHook, generateAllHooks, } from "./template.js";
2
+ export { installClaudeHooks, uninstallClaudeHooks, getClaudeHookConfig, isClaudeHooksInstalled, } from "./claude.js";
3
+ export { installCodexHooks, uninstallCodexHooks, getCodexHookConfig, isCodexHooksInstalled, } from "./codex.js";
4
+ export type { HookConfig, HookEvent } from "../types/index.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { generatePreToolUseHook, generatePostToolUseHook, generatePostCommitHook, generateAllHooks, } from "./template.js";
2
+ export { installClaudeHooks, uninstallClaudeHooks, getClaudeHookConfig, isClaudeHooksInstalled, } from "./claude.js";
3
+ export { installCodexHooks, uninstallCodexHooks, getCodexHookConfig, isCodexHooksInstalled, } from "./codex.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare function generatePreToolUseHook(): string;
2
+ export declare function generatePostToolUseHook(): string;
3
+ export declare function generatePostCommitHook(): string;
4
+ export declare function generateAllHooks(): Map<string, string>;
5
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/hooks/template.ts"],"names":[],"mappings":"AA2BA,wBAAgB,sBAAsB,IAAI,MAAM,CAkD/C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CA4ChD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CA8C/C;AAED,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMtD"}
@@ -0,0 +1,176 @@
1
+ const CONFIG_READER = `
2
+ import { readFileSync } from "node:fs"
3
+
4
+ function getAgentMindCommand() {
5
+ try {
6
+ const config = JSON.parse(readFileSync(".agentmind/config.json", "utf-8"))
7
+ if (Array.isArray(config.command) && config.command.every((part) => typeof part === "string" && part.length > 0)) {
8
+ return config.command
9
+ }
10
+ if (typeof config.bin === "string" && config.bin.length > 0) {
11
+ return [config.bin]
12
+ }
13
+ } catch {}
14
+ return ["agentmind"]
15
+ }
16
+ `;
17
+ const STDIN_READER = `
18
+ async function readStdin() {
19
+ const chunks = []
20
+ for await (const chunk of process.stdin) {
21
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk)
22
+ }
23
+ return Buffer.concat(chunks).toString("utf-8")
24
+ }
25
+ `;
26
+ export function generatePreToolUseHook() {
27
+ return `#!/usr/bin/env node
28
+ import { existsSync } from "node:fs"
29
+ import { spawn } from "node:child_process"
30
+ ${CONFIG_READER}
31
+ ${STDIN_READER}
32
+
33
+ async function main() {
34
+ try {
35
+ const input = await readStdin()
36
+ if (!input.trim()) {
37
+ process.exit(0)
38
+ }
39
+
40
+ let toolInfo
41
+ try {
42
+ toolInfo = JSON.parse(input)
43
+ } catch {
44
+ process.exit(0)
45
+ }
46
+
47
+ const filePath = toolInfo?.tool_input?.file_path || toolInfo?.tool_input?.path
48
+ if (!filePath || !existsSync(".agentmind/context.db")) {
49
+ process.exit(0)
50
+ }
51
+
52
+ const command = getAgentMindCommand()
53
+ const child = spawn(command[0], [...command.slice(1), "inject", "--file", filePath], {
54
+ stdio: ["ignore", "pipe", "pipe"],
55
+ })
56
+
57
+ let stdout = ""
58
+ for await (const chunk of child.stdout) {
59
+ stdout += chunk.toString()
60
+ }
61
+
62
+ await new Promise((resolve) => child.on("close", resolve))
63
+
64
+ if (stdout.trim()) {
65
+ process.stdout.write(stdout)
66
+ }
67
+ } catch (error) {
68
+ if (process.env.AGENTMIND_DEBUG) {
69
+ console.error("[agentmind hook error]", error)
70
+ }
71
+ }
72
+ }
73
+
74
+ main()
75
+ `;
76
+ }
77
+ export function generatePostToolUseHook() {
78
+ return `#!/usr/bin/env node
79
+ import { existsSync } from "node:fs"
80
+ import { spawn } from "node:child_process"
81
+ ${CONFIG_READER}
82
+ ${STDIN_READER}
83
+
84
+ async function main() {
85
+ try {
86
+ const input = await readStdin()
87
+ if (!input.trim()) {
88
+ process.exit(0)
89
+ }
90
+
91
+ let resultInfo
92
+ try {
93
+ resultInfo = JSON.parse(input)
94
+ } catch {
95
+ process.exit(0)
96
+ }
97
+
98
+ const filePath = resultInfo?.tool_input?.file_path || resultInfo?.tool_input?.path
99
+ if (!filePath || !existsSync(".agentmind/context.db")) {
100
+ process.exit(0)
101
+ }
102
+
103
+ const toolName = resultInfo?.tool_name || "unknown"
104
+ const success = !resultInfo?.tool_result?.error
105
+ const command = getAgentMindCommand()
106
+ const child = spawn(
107
+ command[0],
108
+ [...command.slice(1), "log-behavior", "--file", filePath, "--tool", toolName, "--success", String(success)],
109
+ { stdio: "ignore", detached: true }
110
+ )
111
+ child.unref()
112
+ } catch (error) {
113
+ if (process.env.AGENTMIND_DEBUG) {
114
+ console.error("[agentmind hook error]", error)
115
+ }
116
+ }
117
+ }
118
+
119
+ main()
120
+ `;
121
+ }
122
+ export function generatePostCommitHook() {
123
+ return `#!/usr/bin/env node
124
+ import { existsSync } from "node:fs"
125
+ import { spawn } from "node:child_process"
126
+ ${CONFIG_READER}
127
+
128
+ async function main() {
129
+ try {
130
+ if (!existsSync(".agentmind/context.db")) {
131
+ process.exit(0)
132
+ }
133
+
134
+ const diff = spawn("git", ["diff-tree", "--no-commit-id", "--name-only", "-r", "HEAD"], {
135
+ stdio: ["ignore", "pipe", "ignore"],
136
+ })
137
+
138
+ let output = ""
139
+ for await (const chunk of diff.stdout) {
140
+ output += chunk.toString()
141
+ }
142
+
143
+ await new Promise((resolve) => diff.on("close", resolve))
144
+
145
+ const changedFiles = output.trim().split("\\n").filter(Boolean)
146
+ if (changedFiles.length === 0) {
147
+ process.exit(0)
148
+ }
149
+
150
+ const command = getAgentMindCommand()
151
+ for (const filePath of changedFiles) {
152
+ const child = spawn(
153
+ command[0],
154
+ [...command.slice(1), "log-behavior", "--file", filePath, "--event", "commit"],
155
+ { stdio: "ignore", detached: true }
156
+ )
157
+ child.unref()
158
+ }
159
+ } catch (error) {
160
+ if (process.env.AGENTMIND_DEBUG) {
161
+ console.error("[agentmind hook error]", error)
162
+ }
163
+ }
164
+ }
165
+
166
+ main()
167
+ `;
168
+ }
169
+ export function generateAllHooks() {
170
+ return new Map([
171
+ ["pre-tool-use.mjs", generatePreToolUseHook()],
172
+ ["post-tool-use.mjs", generatePostToolUseHook()],
173
+ ["post-commit.mjs", generatePostCommitHook()],
174
+ ]);
175
+ }
176
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/hooks/template.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;CAerB,CAAA;AAED,MAAM,YAAY,GAAG;;;;;;;;CAQpB,CAAA;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;EAGP,aAAa;EACb,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Cb,CAAA;AACD,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;EAGP,aAAa;EACb,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCb,CAAA;AACD,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;EAGP,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCd,CAAA;AACD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,GAAG,CAAC;QACb,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,CAAC;QAC9C,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,CAAC;QAChD,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;KAC9C,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { startServer } from "./mcp/index.js";
2
+ export { ContextStore, importJSONL, exportJSONL, appendJSONL } from "./store/index.js";
3
+ export { scan, classify, detectPatterns, buildGraph } from "./scanner/index.js";
4
+ export type { Annotation, BehaviorEntry, ContextEntry, DependencyGraph, DependencyNode, FileClassification, FileInfo, HookConfig, HookEvent, NonInferablePattern, ProjectMeta, Rule, ScanResult, StoreHealth, } from "./types/index.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/E,YAAY,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,WAAW,EACX,IAAI,EACJ,UAAU,EACV,WAAW,GACZ,MAAM,kBAAkB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { startServer } from "./mcp/index.js";
2
+ export { ContextStore, importJSONL, exportJSONL, appendJSONL } from "./store/index.js";
3
+ export { scan, classify, detectPatterns, buildGraph } from "./scanner/index.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { ContextStore } from "../store/schema.js";
2
+ export interface LearnedRule {
3
+ filePath: string;
4
+ pattern: "frequent-failure" | "retry-loop" | "tool-mismatch" | "success-pattern" | "time-pattern";
5
+ description: string;
6
+ confidence: number;
7
+ evidence: string[];
8
+ suggestedPriority: "critical" | "high" | "normal";
9
+ }
10
+ export declare function analyzeBehaviors(store: ContextStore): LearnedRule[];
11
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/learn/analyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,kBAAkB,GAAG,YAAY,GAAG,eAAe,GAAG,iBAAiB,GAAG,cAAc,CAAA;IACjG,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,iBAAiB,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAA;CAClD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,EAAE,CAanE"}
@@ -0,0 +1,145 @@
1
+ export function analyzeBehaviors(store) {
2
+ const db = store.getDb();
3
+ const totalRow = db.query("SELECT COUNT(*) as c FROM behavior_log").get();
4
+ if (totalRow.c === 0)
5
+ return [];
6
+ const rules = [];
7
+ rules.push(...findFrequentFailures(db));
8
+ rules.push(...findRetryLoops(db));
9
+ rules.push(...findToolMismatches(db));
10
+ rules.push(...findSuccessPatterns(db));
11
+ rules.push(...findTimePatterns(db));
12
+ return rules;
13
+ }
14
+ function findFrequentFailures(db) {
15
+ const rows = db.query(`
16
+ SELECT file_path, COUNT(*) as failures
17
+ FROM behavior_log
18
+ WHERE success = 0 AND file_path IS NOT NULL AND file_path != ''
19
+ GROUP BY file_path
20
+ HAVING failures >= 2
21
+ ORDER BY failures DESC
22
+ `).all();
23
+ return rows.map((r) => {
24
+ const evidenceRows = db.query("SELECT id FROM behavior_log WHERE success = 0 AND file_path = ? ORDER BY timestamp DESC LIMIT 10").all(r.file_path);
25
+ const confidence = Math.min(0.95, 0.5 + r.failures * 0.1);
26
+ const priority = r.failures >= 5 ? "critical" : r.failures >= 3 ? "high" : "normal";
27
+ return {
28
+ filePath: r.file_path,
29
+ pattern: "frequent-failure",
30
+ description: `Agent fails frequently when editing this file (${r.failures} failures) — add annotation with guidance`,
31
+ confidence,
32
+ evidence: evidenceRows.map((e) => String(e.id)),
33
+ suggestedPriority: priority,
34
+ };
35
+ });
36
+ }
37
+ function findRetryLoops(db) {
38
+ const rows = db.query(`
39
+ SELECT file_path, COUNT(*) as edits, MIN(timestamp) as first_edit, MAX(timestamp) as last_edit
40
+ FROM behavior_log
41
+ WHERE file_path IS NOT NULL AND file_path != ''
42
+ GROUP BY file_path
43
+ HAVING edits >= 3
44
+ ORDER BY edits DESC
45
+ `).all();
46
+ const rules = [];
47
+ for (const r of rows) {
48
+ const first = new Date(r.first_edit).getTime();
49
+ const last = new Date(r.last_edit).getTime();
50
+ const spanMin = (last - first) / 60000;
51
+ if (spanMin <= 30 && r.edits >= 3) {
52
+ const evidenceRows = db.query("SELECT id FROM behavior_log WHERE file_path = ? ORDER BY timestamp DESC LIMIT 10").all(r.file_path);
53
+ const confidence = Math.min(0.9, 0.4 + r.edits * 0.1);
54
+ rules.push({
55
+ filePath: r.file_path,
56
+ pattern: "retry-loop",
57
+ description: `Agent retried edits ${r.edits} times in ${Math.round(spanMin)} min — file may need clarification or simpler structure`,
58
+ confidence,
59
+ evidence: evidenceRows.map((e) => String(e.id)),
60
+ suggestedPriority: r.edits >= 5 ? "high" : "normal",
61
+ });
62
+ }
63
+ }
64
+ return rules;
65
+ }
66
+ function findToolMismatches(db) {
67
+ const rows = db.query(`
68
+ SELECT file_path, action, COUNT(*) as failures
69
+ FROM behavior_log
70
+ WHERE success = 0 AND file_path IS NOT NULL AND file_path != ''
71
+ GROUP BY file_path, action
72
+ HAVING failures >= 2
73
+ ORDER BY failures DESC
74
+ `).all();
75
+ const rules = [];
76
+ for (const r of rows) {
77
+ if (r.action.startsWith("tool:")) {
78
+ const tool = r.action.replace("tool:", "");
79
+ const ext = r.file_path.split(".").pop()?.toLowerCase() ?? "";
80
+ const binaryExts = ["png", "jpg", "jpeg", "gif", "ico", "svg", "webp", "mp3", "mp4", "zip", "gz", "tar", "woff", "woff2", "ttf", "eot", "pdf"];
81
+ if (binaryExts.includes(ext) && (tool === "Edit" || tool === "edit")) {
82
+ const evidenceRows = db.query("SELECT id FROM behavior_log WHERE success = 0 AND file_path = ? AND action = ? ORDER BY timestamp DESC LIMIT 10").all(r.file_path, r.action);
83
+ rules.push({
84
+ filePath: r.file_path,
85
+ pattern: "tool-mismatch",
86
+ description: `Agent uses Edit on binary file (.${ext}) — use Write or shell commands instead`,
87
+ confidence: 0.85,
88
+ evidence: evidenceRows.map((e) => String(e.id)),
89
+ suggestedPriority: "high",
90
+ });
91
+ }
92
+ }
93
+ }
94
+ return rules;
95
+ }
96
+ function findSuccessPatterns(db) {
97
+ const rows = db.query(`
98
+ SELECT
99
+ file_path,
100
+ COUNT(*) as total,
101
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as successes
102
+ FROM behavior_log
103
+ WHERE file_path IS NOT NULL AND file_path != ''
104
+ GROUP BY file_path
105
+ HAVING total >= 3 AND successes = total
106
+ ORDER BY total DESC
107
+ `).all();
108
+ return rows.map((r) => {
109
+ const evidenceRows = db.query("SELECT id FROM behavior_log WHERE file_path = ? ORDER BY timestamp DESC LIMIT 5").all(r.file_path);
110
+ return {
111
+ filePath: r.file_path,
112
+ pattern: "success-pattern",
113
+ description: `Agent handles this file perfectly (${r.total}/${r.total} successes) — well-documented or straightforward`,
114
+ confidence: Math.min(0.95, 0.5 + r.total * 0.05),
115
+ evidence: evidenceRows.map((e) => String(e.id)),
116
+ suggestedPriority: "normal",
117
+ };
118
+ });
119
+ }
120
+ function findTimePatterns(db) {
121
+ const rows = db.query(`
122
+ SELECT file_path,
123
+ CAST(strftime('%H', timestamp) AS INTEGER) as hour,
124
+ COUNT(*) as failures
125
+ FROM behavior_log
126
+ WHERE success = 0 AND file_path IS NOT NULL AND file_path != ''
127
+ GROUP BY file_path, hour
128
+ HAVING failures >= 2
129
+ ORDER BY failures DESC
130
+ `).all();
131
+ const rules = [];
132
+ for (const r of rows) {
133
+ const evidenceRows = db.query("SELECT id FROM behavior_log WHERE success = 0 AND file_path = ? AND CAST(strftime('%H', timestamp) AS INTEGER) = ? LIMIT 5").all(r.file_path, r.hour);
134
+ rules.push({
135
+ filePath: r.file_path,
136
+ pattern: "time-pattern",
137
+ description: `Failures cluster around ${r.hour}:00 — possibly related to CI queue or external service load`,
138
+ confidence: 0.35,
139
+ evidence: evidenceRows.map((e) => String(e.id)),
140
+ suggestedPriority: "normal",
141
+ });
142
+ }
143
+ return rules;
144
+ }
145
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/learn/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ContextStore } from "../store/schema.js";
2
+ import type { LearnedRule } from "./analyzer.js";
3
+ import type { Rule } from "../types/index.js";
4
+ export interface GeneratedRule {
5
+ filePath: string;
6
+ rule: Rule;
7
+ confidence: number;
8
+ source: "learned";
9
+ }
10
+ export declare function generateRules(learned: LearnedRule[]): GeneratedRule[];
11
+ export declare function applyRules(store: ContextStore, rules: GeneratedRule[]): number;
12
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/learn/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE7C,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,SAAS,CAAA;CAClB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAoBrE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CA0B9E"}
@@ -0,0 +1,37 @@
1
+ export function generateRules(learned) {
2
+ return learned.map((l) => {
3
+ const priority = l.suggestedPriority === "critical" ? 90
4
+ : l.suggestedPriority === "high" ? 70
5
+ : 40;
6
+ return {
7
+ filePath: l.filePath,
8
+ rule: {
9
+ id: `learned-${l.pattern}-${l.filePath.replace(/[^a-zA-Z0-9]/g, "_")}`,
10
+ path: l.filePath,
11
+ pattern: l.pattern,
12
+ description: l.description,
13
+ priority,
14
+ },
15
+ confidence: l.confidence,
16
+ source: "learned",
17
+ };
18
+ });
19
+ }
20
+ export function applyRules(store, rules) {
21
+ const db = store.getDb();
22
+ let applied = 0;
23
+ for (const gr of rules) {
24
+ const existing = db.query("SELECT COUNT(*) as c FROM context_entries WHERE file_path = ? AND source = 'learned'").get(gr.filePath);
25
+ if (existing && existing.c > 0)
26
+ continue;
27
+ const content = JSON.stringify(gr.rule);
28
+ const priorityLabel = gr.rule.priority >= 80 ? "critical"
29
+ : gr.rule.priority >= 60 ? "high"
30
+ : gr.rule.priority >= 30 ? "normal"
31
+ : "low";
32
+ db.run("INSERT INTO context_entries (file_path, type, content, scope, priority, source) VALUES (?, 'rule', ?, 'global', ?, 'learned')", [gr.filePath, content, priorityLabel]);
33
+ applied++;
34
+ }
35
+ return applied;
36
+ }
37
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/learn/generator.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,QAAQ,GACZ,CAAC,CAAC,iBAAiB,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE;YACvC,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE;gBACrC,CAAC,CAAC,EAAE,CAAA;QAEN,OAAO;YACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE;gBACJ,EAAE,EAAE,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE;gBACtE,IAAI,EAAE,CAAC,CAAC,QAAQ;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ;aACT;YACD,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,MAAM,EAAE,SAAkB;SAC3B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAmB,EAAE,KAAsB;IACpE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;IACxB,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CACvB,sFAAsF,CACvF,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAA8B,CAAA;QAE/C,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC;YAAE,SAAQ;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,aAAa,GACjB,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU;YACnC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM;gBACjC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ;oBACnC,CAAC,CAAC,KAAK,CAAA;QAET,EAAE,CAAC,GAAG,CACJ,+HAA+H,EAC/H,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CACtC,CAAA;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { startServer } from "./server.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { startServer } from "./server.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function startServer(projectRoot: string): void;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AA2FA,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAgCrD"}