context-gatekeeper 0.3.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 (305) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +774 -0
  3. package/README.zh.md +765 -0
  4. package/bin/context-gatekeeper-cli.js +60 -0
  5. package/dist/api/gdpr.d.ts +104 -0
  6. package/dist/api/gdpr.d.ts.map +1 -0
  7. package/dist/api/gdpr.js +229 -0
  8. package/dist/api/gdpr.js.map +1 -0
  9. package/dist/api/health-check.d.ts +13 -0
  10. package/dist/api/health-check.d.ts.map +1 -0
  11. package/dist/api/health-check.js +2 -0
  12. package/dist/api/health-check.js.map +1 -0
  13. package/dist/api/index.d.ts +7 -0
  14. package/dist/api/index.d.ts.map +1 -0
  15. package/dist/api/index.js +8 -0
  16. package/dist/api/index.js.map +1 -0
  17. package/dist/api/observability.d.ts +39 -0
  18. package/dist/api/observability.d.ts.map +1 -0
  19. package/dist/api/observability.js +132 -0
  20. package/dist/api/observability.js.map +1 -0
  21. package/dist/api/session-manager.d.ts +41 -0
  22. package/dist/api/session-manager.d.ts.map +1 -0
  23. package/dist/api/session-manager.js +129 -0
  24. package/dist/api/session-manager.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +7 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mcp/server.d.ts +8 -0
  30. package/dist/mcp/server.d.ts.map +1 -0
  31. package/dist/mcp/server.js +613 -0
  32. package/dist/mcp/server.js.map +1 -0
  33. package/dist/mcp/tools/configure-llm.d.ts +26 -0
  34. package/dist/mcp/tools/configure-llm.d.ts.map +1 -0
  35. package/dist/mcp/tools/configure-llm.js +32 -0
  36. package/dist/mcp/tools/configure-llm.js.map +1 -0
  37. package/dist/mcp/tools/context-compress.d.ts +15 -0
  38. package/dist/mcp/tools/context-compress.d.ts.map +1 -0
  39. package/dist/mcp/tools/context-compress.js +15 -0
  40. package/dist/mcp/tools/context-compress.js.map +1 -0
  41. package/dist/mcp/tools/dual-mode-execute.d.ts +78 -0
  42. package/dist/mcp/tools/dual-mode-execute.d.ts.map +1 -0
  43. package/dist/mcp/tools/dual-mode-execute.js +299 -0
  44. package/dist/mcp/tools/dual-mode-execute.js.map +1 -0
  45. package/dist/mcp/tools/index.d.ts +19 -0
  46. package/dist/mcp/tools/index.d.ts.map +1 -0
  47. package/dist/mcp/tools/index.js +20 -0
  48. package/dist/mcp/tools/index.js.map +1 -0
  49. package/dist/mcp/tools/intelligent-recall.d.ts +67 -0
  50. package/dist/mcp/tools/intelligent-recall.d.ts.map +1 -0
  51. package/dist/mcp/tools/intelligent-recall.js +208 -0
  52. package/dist/mcp/tools/intelligent-recall.js.map +1 -0
  53. package/dist/mcp/tools/memory-anchor.d.ts +13 -0
  54. package/dist/mcp/tools/memory-anchor.d.ts.map +1 -0
  55. package/dist/mcp/tools/memory-anchor.js +16 -0
  56. package/dist/mcp/tools/memory-anchor.js.map +1 -0
  57. package/dist/mcp/tools/memory-delete-batch.d.ts +16 -0
  58. package/dist/mcp/tools/memory-delete-batch.d.ts.map +1 -0
  59. package/dist/mcp/tools/memory-delete-batch.js +26 -0
  60. package/dist/mcp/tools/memory-delete-batch.js.map +1 -0
  61. package/dist/mcp/tools/memory-extract.d.ts +68 -0
  62. package/dist/mcp/tools/memory-extract.d.ts.map +1 -0
  63. package/dist/mcp/tools/memory-extract.js +280 -0
  64. package/dist/mcp/tools/memory-extract.js.map +1 -0
  65. package/dist/mcp/tools/memory-recall.d.ts +42 -0
  66. package/dist/mcp/tools/memory-recall.d.ts.map +1 -0
  67. package/dist/mcp/tools/memory-recall.js +37 -0
  68. package/dist/mcp/tools/memory-recall.js.map +1 -0
  69. package/dist/mcp/tools/memory-report-usage.d.ts +17 -0
  70. package/dist/mcp/tools/memory-report-usage.d.ts.map +1 -0
  71. package/dist/mcp/tools/memory-report-usage.js +15 -0
  72. package/dist/mcp/tools/memory-report-usage.js.map +1 -0
  73. package/dist/mcp/tools/memory-search.d.ts +43 -0
  74. package/dist/mcp/tools/memory-search.d.ts.map +1 -0
  75. package/dist/mcp/tools/memory-search.js +38 -0
  76. package/dist/mcp/tools/memory-search.js.map +1 -0
  77. package/dist/mcp/tools/memory-session.d.ts +118 -0
  78. package/dist/mcp/tools/memory-session.d.ts.map +1 -0
  79. package/dist/mcp/tools/memory-session.js +113 -0
  80. package/dist/mcp/tools/memory-session.js.map +1 -0
  81. package/dist/mcp/tools/memory-stats.d.ts +10 -0
  82. package/dist/mcp/tools/memory-stats.d.ts.map +1 -0
  83. package/dist/mcp/tools/memory-stats.js +35 -0
  84. package/dist/mcp/tools/memory-stats.js.map +1 -0
  85. package/dist/mcp/tools/memory-store-batch.d.ts +49 -0
  86. package/dist/mcp/tools/memory-store-batch.d.ts.map +1 -0
  87. package/dist/mcp/tools/memory-store-batch.js +48 -0
  88. package/dist/mcp/tools/memory-store-batch.js.map +1 -0
  89. package/dist/mcp/tools/memory-store.d.ts +37 -0
  90. package/dist/mcp/tools/memory-store.d.ts.map +1 -0
  91. package/dist/mcp/tools/memory-store.js +34 -0
  92. package/dist/mcp/tools/memory-store.js.map +1 -0
  93. package/dist/mcp/tools/project-create.d.ts +16 -0
  94. package/dist/mcp/tools/project-create.d.ts.map +1 -0
  95. package/dist/mcp/tools/project-create.js +14 -0
  96. package/dist/mcp/tools/project-create.js.map +1 -0
  97. package/dist/models/types.d.ts +88 -0
  98. package/dist/models/types.d.ts.map +1 -0
  99. package/dist/models/types.js +19 -0
  100. package/dist/models/types.js.map +1 -0
  101. package/dist/schema/compression.d.ts +7 -0
  102. package/dist/schema/compression.d.ts.map +1 -0
  103. package/dist/schema/compression.js +66 -0
  104. package/dist/schema/compression.js.map +1 -0
  105. package/dist/schema/fulltext-search.d.ts +10 -0
  106. package/dist/schema/fulltext-search.d.ts.map +1 -0
  107. package/dist/schema/fulltext-search.js +73 -0
  108. package/dist/schema/fulltext-search.js.map +1 -0
  109. package/dist/schema/index.d.ts +9 -0
  110. package/dist/schema/index.d.ts.map +1 -0
  111. package/dist/schema/index.js +9 -0
  112. package/dist/schema/index.js.map +1 -0
  113. package/dist/schema/knowledge-graph.d.ts +108 -0
  114. package/dist/schema/knowledge-graph.d.ts.map +1 -0
  115. package/dist/schema/knowledge-graph.js +372 -0
  116. package/dist/schema/knowledge-graph.js.map +1 -0
  117. package/dist/schema/memory-session.d.ts +62 -0
  118. package/dist/schema/memory-session.d.ts.map +1 -0
  119. package/dist/schema/memory-session.js +258 -0
  120. package/dist/schema/memory-session.js.map +1 -0
  121. package/dist/schema/memory.d.ts +84 -0
  122. package/dist/schema/memory.d.ts.map +1 -0
  123. package/dist/schema/memory.js +622 -0
  124. package/dist/schema/memory.js.map +1 -0
  125. package/dist/schema/project.d.ts +8 -0
  126. package/dist/schema/project.d.ts.map +1 -0
  127. package/dist/schema/project.js +68 -0
  128. package/dist/schema/project.js.map +1 -0
  129. package/dist/schema/schema-init.d.ts +2 -0
  130. package/dist/schema/schema-init.d.ts.map +1 -0
  131. package/dist/schema/schema-init.js +199 -0
  132. package/dist/schema/schema-init.js.map +1 -0
  133. package/dist/schema/vector-index.d.ts +28 -0
  134. package/dist/schema/vector-index.d.ts.map +1 -0
  135. package/dist/schema/vector-index.js +179 -0
  136. package/dist/schema/vector-index.js.map +1 -0
  137. package/dist/scripts/agents/base.d.ts +89 -0
  138. package/dist/scripts/agents/base.d.ts.map +1 -0
  139. package/dist/scripts/agents/base.js +148 -0
  140. package/dist/scripts/agents/base.js.map +1 -0
  141. package/dist/scripts/agents/base.ts +193 -0
  142. package/dist/scripts/agents/claude-code.d.ts +21 -0
  143. package/dist/scripts/agents/claude-code.d.ts.map +1 -0
  144. package/dist/scripts/agents/claude-code.js +33 -0
  145. package/dist/scripts/agents/claude-code.js.map +1 -0
  146. package/dist/scripts/agents/claude-code.ts +36 -0
  147. package/dist/scripts/agents/claude-desktop.d.ts +25 -0
  148. package/dist/scripts/agents/claude-desktop.d.ts.map +1 -0
  149. package/dist/scripts/agents/claude-desktop.js +36 -0
  150. package/dist/scripts/agents/claude-desktop.js.map +1 -0
  151. package/dist/scripts/agents/claude-desktop.ts +39 -0
  152. package/dist/scripts/agents/cline.d.ts +22 -0
  153. package/dist/scripts/agents/cline.d.ts.map +1 -0
  154. package/dist/scripts/agents/cline.js +35 -0
  155. package/dist/scripts/agents/cline.js.map +1 -0
  156. package/dist/scripts/agents/cline.ts +38 -0
  157. package/dist/scripts/agents/continue.d.ts +20 -0
  158. package/dist/scripts/agents/continue.d.ts.map +1 -0
  159. package/dist/scripts/agents/continue.js +35 -0
  160. package/dist/scripts/agents/continue.js.map +1 -0
  161. package/dist/scripts/agents/continue.ts +38 -0
  162. package/dist/scripts/agents/cursor.d.ts +27 -0
  163. package/dist/scripts/agents/cursor.d.ts.map +1 -0
  164. package/dist/scripts/agents/cursor.js +38 -0
  165. package/dist/scripts/agents/cursor.js.map +1 -0
  166. package/dist/scripts/agents/cursor.ts +41 -0
  167. package/dist/scripts/cli/config-gen.d.ts +59 -0
  168. package/dist/scripts/cli/config-gen.d.ts.map +1 -0
  169. package/dist/scripts/cli/config-gen.js +156 -0
  170. package/dist/scripts/cli/config-gen.js.map +1 -0
  171. package/dist/scripts/cli/config-gen.ts +164 -0
  172. package/dist/scripts/cli/detect.d.ts +42 -0
  173. package/dist/scripts/cli/detect.d.ts.map +1 -0
  174. package/dist/scripts/cli/detect.js +131 -0
  175. package/dist/scripts/cli/detect.js.map +1 -0
  176. package/dist/scripts/cli/detect.ts +162 -0
  177. package/dist/scripts/cli/install.d.ts +31 -0
  178. package/dist/scripts/cli/install.d.ts.map +1 -0
  179. package/dist/scripts/cli/install.js +125 -0
  180. package/dist/scripts/cli/install.js.map +1 -0
  181. package/dist/scripts/cli/install.ts +157 -0
  182. package/dist/scripts/cli/status.d.ts +8 -0
  183. package/dist/scripts/cli/status.d.ts.map +1 -0
  184. package/dist/scripts/cli/status.js +39 -0
  185. package/dist/scripts/cli/status.js.map +1 -0
  186. package/dist/scripts/cli/status.ts +48 -0
  187. package/dist/scripts/cli/uninstall.d.ts +22 -0
  188. package/dist/scripts/cli/uninstall.d.ts.map +1 -0
  189. package/dist/scripts/cli/uninstall.js +141 -0
  190. package/dist/scripts/cli/uninstall.js.map +1 -0
  191. package/dist/scripts/cli/uninstall.ts +157 -0
  192. package/dist/scripts/cli.d.ts +23 -0
  193. package/dist/scripts/cli.d.ts.map +1 -0
  194. package/dist/scripts/cli.js +166 -0
  195. package/dist/scripts/cli.js.map +1 -0
  196. package/dist/scripts/cli.ts +173 -0
  197. package/dist/services/classifier/index.d.ts +36 -0
  198. package/dist/services/classifier/index.d.ts.map +1 -0
  199. package/dist/services/classifier/index.js +104 -0
  200. package/dist/services/classifier/index.js.map +1 -0
  201. package/dist/services/classifier/llm.d.ts +37 -0
  202. package/dist/services/classifier/llm.d.ts.map +1 -0
  203. package/dist/services/classifier/llm.js +119 -0
  204. package/dist/services/classifier/llm.js.map +1 -0
  205. package/dist/services/classifier/rules.d.ts +22 -0
  206. package/dist/services/classifier/rules.d.ts.map +1 -0
  207. package/dist/services/classifier/rules.js +98 -0
  208. package/dist/services/classifier/rules.js.map +1 -0
  209. package/dist/services/compressor/index.d.ts +3 -0
  210. package/dist/services/compressor/index.d.ts.map +1 -0
  211. package/dist/services/compressor/index.js +3 -0
  212. package/dist/services/compressor/index.js.map +1 -0
  213. package/dist/services/compressor/threshold.d.ts +35 -0
  214. package/dist/services/compressor/threshold.d.ts.map +1 -0
  215. package/dist/services/compressor/threshold.js +60 -0
  216. package/dist/services/compressor/threshold.js.map +1 -0
  217. package/dist/services/compressor/trigger.d.ts +24 -0
  218. package/dist/services/compressor/trigger.d.ts.map +1 -0
  219. package/dist/services/compressor/trigger.js +91 -0
  220. package/dist/services/compressor/trigger.js.map +1 -0
  221. package/dist/services/constraint-extractor.d.ts +25 -0
  222. package/dist/services/constraint-extractor.d.ts.map +1 -0
  223. package/dist/services/constraint-extractor.js +97 -0
  224. package/dist/services/constraint-extractor.js.map +1 -0
  225. package/dist/services/database-health.d.ts +22 -0
  226. package/dist/services/database-health.d.ts.map +1 -0
  227. package/dist/services/database-health.js +122 -0
  228. package/dist/services/database-health.js.map +1 -0
  229. package/dist/services/embedding-fixed.d.ts +9 -0
  230. package/dist/services/embedding-fixed.d.ts.map +1 -0
  231. package/dist/services/embedding-fixed.js +70 -0
  232. package/dist/services/embedding-fixed.js.map +1 -0
  233. package/dist/services/embedding-provider.d.ts +79 -0
  234. package/dist/services/embedding-provider.d.ts.map +1 -0
  235. package/dist/services/embedding-provider.js +229 -0
  236. package/dist/services/embedding-provider.js.map +1 -0
  237. package/dist/services/embedding.d.ts +17 -0
  238. package/dist/services/embedding.d.ts.map +1 -0
  239. package/dist/services/embedding.js +99 -0
  240. package/dist/services/embedding.js.map +1 -0
  241. package/dist/services/hnsw-index.d.ts +76 -0
  242. package/dist/services/hnsw-index.d.ts.map +1 -0
  243. package/dist/services/hnsw-index.js +301 -0
  244. package/dist/services/hnsw-index.js.map +1 -0
  245. package/dist/services/llm.d.ts +39 -0
  246. package/dist/services/llm.d.ts.map +1 -0
  247. package/dist/services/llm.js +207 -0
  248. package/dist/services/llm.js.map +1 -0
  249. package/dist/services/memory-tiers.d.ts +75 -0
  250. package/dist/services/memory-tiers.d.ts.map +1 -0
  251. package/dist/services/memory-tiers.js +275 -0
  252. package/dist/services/memory-tiers.js.map +1 -0
  253. package/dist/services/memory.d.ts +33 -0
  254. package/dist/services/memory.d.ts.map +1 -0
  255. package/dist/services/memory.js +209 -0
  256. package/dist/services/memory.js.map +1 -0
  257. package/dist/services/multi-agent-sharing.d.ts +83 -0
  258. package/dist/services/multi-agent-sharing.d.ts.map +1 -0
  259. package/dist/services/multi-agent-sharing.js +278 -0
  260. package/dist/services/multi-agent-sharing.js.map +1 -0
  261. package/dist/services/reranker.d.ts +88 -0
  262. package/dist/services/reranker.d.ts.map +1 -0
  263. package/dist/services/reranker.js +234 -0
  264. package/dist/services/reranker.js.map +1 -0
  265. package/dist/services/triple-extractor.d.ts +35 -0
  266. package/dist/services/triple-extractor.d.ts.map +1 -0
  267. package/dist/services/triple-extractor.js +293 -0
  268. package/dist/services/triple-extractor.js.map +1 -0
  269. package/dist/services/vector-provider.d.ts +40 -0
  270. package/dist/services/vector-provider.d.ts.map +1 -0
  271. package/dist/services/vector-provider.js +225 -0
  272. package/dist/services/vector-provider.js.map +1 -0
  273. package/dist/utils/after-chain-executor.d.ts +26 -0
  274. package/dist/utils/after-chain-executor.d.ts.map +1 -0
  275. package/dist/utils/after-chain-executor.js +135 -0
  276. package/dist/utils/after-chain-executor.js.map +1 -0
  277. package/dist/utils/after-chain.d.ts +94 -0
  278. package/dist/utils/after-chain.d.ts.map +1 -0
  279. package/dist/utils/after-chain.js +155 -0
  280. package/dist/utils/after-chain.js.map +1 -0
  281. package/dist/utils/db.d.ts +29 -0
  282. package/dist/utils/db.d.ts.map +1 -0
  283. package/dist/utils/db.js +201 -0
  284. package/dist/utils/db.js.map +1 -0
  285. package/dist/utils/encryption.d.ts +87 -0
  286. package/dist/utils/encryption.d.ts.map +1 -0
  287. package/dist/utils/encryption.js +175 -0
  288. package/dist/utils/encryption.js.map +1 -0
  289. package/dist/utils/errors.d.ts +35 -0
  290. package/dist/utils/errors.d.ts.map +1 -0
  291. package/dist/utils/errors.js +56 -0
  292. package/dist/utils/errors.js.map +1 -0
  293. package/dist/utils/logger.d.ts +27 -0
  294. package/dist/utils/logger.d.ts.map +1 -0
  295. package/dist/utils/logger.js +177 -0
  296. package/dist/utils/logger.js.map +1 -0
  297. package/dist/utils/priority.d.ts +26 -0
  298. package/dist/utils/priority.d.ts.map +1 -0
  299. package/dist/utils/priority.js +43 -0
  300. package/dist/utils/priority.js.map +1 -0
  301. package/dist/utils/watchdog.d.ts +57 -0
  302. package/dist/utils/watchdog.d.ts.map +1 -0
  303. package/dist/utils/watchdog.js +164 -0
  304. package/dist/utils/watchdog.js.map +1 -0
  305. package/package.json +78 -0
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Base adapter interface for MCP-compatible agents.
3
+ *
4
+ * Each adapter encapsulates how a specific AI agent runtime
5
+ * spawns a child process and communicates with the
6
+ * Context Gatekeeper MCP server.
7
+ */
8
+ import { spawn } from 'node:child_process';
9
+ import { writeFileSync, mkdtempSync, rmSync, existsSync } from 'node:fs';
10
+ import { tmpdir } from 'node:os';
11
+ import { join } from 'node:path';
12
+ import { resolve as resolvePath } from 'node:path';
13
+ /**
14
+ * Abstract base class for agent adapters.
15
+ *
16
+ * Subclasses must implement `buildSpawnCommand` to construct the
17
+ * child process invocation. The base class handles:
18
+ * - temp directory creation and cleanup
19
+ * - MCP config file generation
20
+ * - child process lifecycle (spawn, stdin/stdout JSON-RPC, kill)
21
+ */
22
+ export class BaseAgentAdapter {
23
+ child = null;
24
+ dataDir;
25
+ mcpConfigPath;
26
+ config;
27
+ constructor(config) {
28
+ this.config = config;
29
+ this.dataDir =
30
+ config.dataDir ?? mkdtempSync(join(tmpdir(), `cg-${config.name}-`));
31
+ this.mcpConfigPath = join(this.dataDir, 'mcp-config.json');
32
+ writeFileSync(this.mcpConfigPath, JSON.stringify(config.mcpConfig, null, 2));
33
+ }
34
+ /** Spawn the agent child process. Returns the process handle. */
35
+ spawnAgent(prompt) {
36
+ const { command, args, env } = this.buildSpawnCommand();
37
+ const mergedEnv = {
38
+ ...process.env,
39
+ ...env,
40
+ DATA_DIR: this.dataDir,
41
+ ...(this.config.tokens?.read ? { CG_READ_TOKEN: this.config.tokens.read } : {}),
42
+ ...(this.config.tokens?.write ? { CG_WRITE_TOKEN: this.config.tokens.write } : {}),
43
+ ...(this.config.tokens?.watchdog ? { CG_WATCHDOG_TOKEN: this.config.tokens.watchdog } : {}),
44
+ CG_LOG_LEVEL: process.env.CG_LOG_LEVEL ?? 'warn',
45
+ MCP_CONFIG_PATH: this.mcpConfigPath,
46
+ };
47
+ this.child = spawn(command, [...args, prompt], {
48
+ env: mergedEnv,
49
+ stdio: ['pipe', 'pipe', 'pipe'],
50
+ cwd: this.dataDir,
51
+ });
52
+ return this.child;
53
+ }
54
+ /** Read MCP server binary path from config. */
55
+ getMcpServerCommand() {
56
+ const cfg = this.config.mcpConfig;
57
+ // Shape A: { mcpServers: { 'context-gatekeeper': { command, args } } }
58
+ const a = cfg.mcpServers?.['context-gatekeeper'];
59
+ if (a)
60
+ return { command: a.command, args: a.args };
61
+ // Shape B (Continue.dev): { experimental: { modelContextProtocolServers: [{ name, command, args }] } }
62
+ const b = cfg
63
+ .experimental?.modelContextProtocolServers?.find((s) => s.name === 'context-gatekeeper');
64
+ if (b)
65
+ return { command: b.command, args: b.args };
66
+ throw new Error(`mcpServers.context-gatekeeper not configured for agent ${this.name}`);
67
+ }
68
+ /** Build environment variables for a direct MCP server subprocess test. */
69
+ buildMcpServerEnv(extra) {
70
+ const cg = this.getMcpServerCommand();
71
+ return {
72
+ ...process.env,
73
+ DATA_DIR: this.dataDir,
74
+ ...(this.config.tokens?.read ? { CG_READ_TOKEN: this.config.tokens.read } : {}),
75
+ ...(this.config.tokens?.write ? { CG_WRITE_TOKEN: this.config.tokens.write } : {}),
76
+ ...(this.config.tokens?.watchdog ? { CG_WATCHDOG_TOKEN: this.config.tokens.watchdog } : {}),
77
+ CG_LOG_LEVEL: process.env.CG_LOG_LEVEL ?? 'warn',
78
+ MCP_CONFIG_PATH: this.mcpConfigPath,
79
+ CG_SERVER_CMD: cg.command,
80
+ CG_SERVER_ARGS: cg.args.join(' '),
81
+ ...extra,
82
+ };
83
+ }
84
+ /** Wait for the child to exit. Resolves with the exit code. */
85
+ async waitForExit(timeoutMs = this.config.timeoutMs ?? 30000) {
86
+ if (!this.child)
87
+ throw new Error(`Agent ${this.name} not spawned`);
88
+ const child = this.child;
89
+ return new Promise((resolve, reject) => {
90
+ let stdout = '';
91
+ let stderr = '';
92
+ const timer = setTimeout(() => {
93
+ try {
94
+ child.kill('SIGTERM');
95
+ }
96
+ catch { /* ignore */ }
97
+ reject(new Error(`Agent ${this.name} timed out after ${timeoutMs}ms`));
98
+ }, timeoutMs);
99
+ child.stdout?.on('data', (chunk) => { stdout += chunk.toString(); });
100
+ child.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });
101
+ child.on('exit', (code) => {
102
+ clearTimeout(timer);
103
+ resolve({ code, stdout, stderr });
104
+ });
105
+ child.on('error', (err) => {
106
+ clearTimeout(timer);
107
+ reject(err);
108
+ });
109
+ });
110
+ }
111
+ /** Clean up temp directories. */
112
+ cleanup() {
113
+ try {
114
+ if (this.child && !this.child.killed) {
115
+ this.child.kill('SIGTERM');
116
+ }
117
+ }
118
+ catch { /* ignore */ }
119
+ if (existsSync(this.dataDir)) {
120
+ try {
121
+ rmSync(this.dataDir, { recursive: true, force: true });
122
+ }
123
+ catch { /* ignore */ }
124
+ }
125
+ }
126
+ /** Get the absolute path to the temp data directory for this agent run. */
127
+ getDataDir() {
128
+ return this.dataDir;
129
+ }
130
+ }
131
+ /** Resolve the MCP server binary path that will be used by all adapters. */
132
+ export function resolveMcpServerBin() {
133
+ const pkgRoot = resolvePath(process.cwd());
134
+ const candidates = [
135
+ join(pkgRoot, 'dist', 'mcp', 'server.js'),
136
+ join(pkgRoot, 'src', 'mcp', 'server.ts'),
137
+ ];
138
+ for (const path of candidates) {
139
+ if (existsSync(path)) {
140
+ if (path.endsWith('.ts')) {
141
+ return { command: 'npx', args: ['tsx', path] };
142
+ }
143
+ return { command: process.execPath, args: [path] };
144
+ }
145
+ }
146
+ throw new Error(`Cannot find MCP server binary. Looked in: ${candidates.join(', ')}. Run 'npm run build' first.`);
147
+ }
148
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Base adapter interface for MCP-compatible agents.
3
+ *
4
+ * Each adapter encapsulates how a specific AI agent runtime
5
+ * spawns a child process and communicates with the
6
+ * Context Gatekeeper MCP server.
7
+ */
8
+
9
+ import { spawn, ChildProcess } from 'node:child_process';
10
+ import { writeFileSync, mkdtempSync, rmSync, existsSync } from 'node:fs';
11
+ import { tmpdir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ import { resolve as resolvePath } from 'node:path';
14
+
15
+ export type PermissionLevel = 'read' | 'write' | 'watchdog';
16
+
17
+ export interface AgentConfig {
18
+ /** Name of the agent (used in reports) */
19
+ name: string;
20
+ /** Path to the agent CLI binary */
21
+ cliPath?: string;
22
+ /** Optional arguments to pass before the prompt */
23
+ cliArgs?: string[];
24
+ /** MCP config object written to a temp file before spawning */
25
+ mcpConfig: Record<string, unknown>;
26
+ /** Token configuration for Watchdog tests */
27
+ tokens?: {
28
+ read?: string;
29
+ write?: string;
30
+ watchdog?: string;
31
+ };
32
+ /** Per-agent DATA_DIR override */
33
+ dataDir?: string;
34
+ /** Timeout in ms for any single tool call (default 30000) */
35
+ timeoutMs?: number;
36
+ }
37
+
38
+ export interface ToolCallResult {
39
+ agent: string;
40
+ tool: string;
41
+ success: boolean;
42
+ latencyMs: number;
43
+ payload?: unknown;
44
+ error?: string;
45
+ raw?: string;
46
+ }
47
+
48
+ export interface ToolCallRequest {
49
+ tool: string;
50
+ arguments: Record<string, unknown>;
51
+ }
52
+
53
+ /**
54
+ * Abstract base class for agent adapters.
55
+ *
56
+ * Subclasses must implement `buildSpawnCommand` to construct the
57
+ * child process invocation. The base class handles:
58
+ * - temp directory creation and cleanup
59
+ * - MCP config file generation
60
+ * - child process lifecycle (spawn, stdin/stdout JSON-RPC, kill)
61
+ */
62
+ export abstract class BaseAgentAdapter {
63
+ protected child: ChildProcess | null = null;
64
+ protected dataDir: string;
65
+ protected mcpConfigPath: string;
66
+ protected config: AgentConfig;
67
+
68
+ constructor(config: AgentConfig) {
69
+ this.config = config;
70
+ this.dataDir =
71
+ config.dataDir ?? mkdtempSync(join(tmpdir(), `cg-${config.name}-`));
72
+ this.mcpConfigPath = join(this.dataDir, 'mcp-config.json');
73
+ writeFileSync(this.mcpConfigPath, JSON.stringify(config.mcpConfig, null, 2));
74
+ }
75
+
76
+ abstract get name(): string;
77
+ abstract buildSpawnCommand(): {
78
+ command: string;
79
+ args: string[];
80
+ env: Record<string, string | undefined>;
81
+ };
82
+
83
+ /** Spawn the agent child process. Returns the process handle. */
84
+ spawnAgent(prompt: string): ChildProcess {
85
+ const { command, args, env } = this.buildSpawnCommand();
86
+ const mergedEnv = {
87
+ ...process.env,
88
+ ...env,
89
+ DATA_DIR: this.dataDir,
90
+ ...(this.config.tokens?.read ? { CG_READ_TOKEN: this.config.tokens.read } : {}),
91
+ ...(this.config.tokens?.write ? { CG_WRITE_TOKEN: this.config.tokens.write } : {}),
92
+ ...(this.config.tokens?.watchdog ? { CG_WATCHDOG_TOKEN: this.config.tokens.watchdog } : {}),
93
+ CG_LOG_LEVEL: process.env.CG_LOG_LEVEL ?? 'warn',
94
+ MCP_CONFIG_PATH: this.mcpConfigPath,
95
+ };
96
+ this.child = spawn(command, [...args, prompt], {
97
+ env: mergedEnv as NodeJS.ProcessEnv,
98
+ stdio: ['pipe', 'pipe', 'pipe'],
99
+ cwd: this.dataDir,
100
+ });
101
+ return this.child;
102
+ }
103
+
104
+ /** Read MCP server binary path from config. */
105
+ protected getMcpServerCommand(): { command: string; args: string[] } {
106
+ const cfg = this.config.mcpConfig;
107
+ // Shape A: { mcpServers: { 'context-gatekeeper': { command, args } } }
108
+ const a = (cfg as { mcpServers?: Record<string, { command: string; args: string[] }> }).mcpServers?.['context-gatekeeper'];
109
+ if (a) return { command: a.command, args: a.args };
110
+ // Shape B (Continue.dev): { experimental: { modelContextProtocolServers: [{ name, command, args }] } }
111
+ const b = (cfg as { experimental?: { modelContextProtocolServers?: Array<{ name: string; command: string; args: string[] }> } })
112
+ .experimental?.modelContextProtocolServers?.find((s) => s.name === 'context-gatekeeper');
113
+ if (b) return { command: b.command, args: b.args };
114
+ throw new Error(`mcpServers.context-gatekeeper not configured for agent ${this.name}`);
115
+ }
116
+
117
+ /** Build environment variables for a direct MCP server subprocess test. */
118
+ buildMcpServerEnv(extra?: Record<string, string | undefined>): Record<string, string | undefined> {
119
+ const cg = this.getMcpServerCommand();
120
+ return {
121
+ ...process.env,
122
+ DATA_DIR: this.dataDir,
123
+ ...(this.config.tokens?.read ? { CG_READ_TOKEN: this.config.tokens.read } : {}),
124
+ ...(this.config.tokens?.write ? { CG_WRITE_TOKEN: this.config.tokens.write } : {}),
125
+ ...(this.config.tokens?.watchdog ? { CG_WATCHDOG_TOKEN: this.config.tokens.watchdog } : {}),
126
+ CG_LOG_LEVEL: process.env.CG_LOG_LEVEL ?? 'warn',
127
+ MCP_CONFIG_PATH: this.mcpConfigPath,
128
+ CG_SERVER_CMD: cg.command,
129
+ CG_SERVER_ARGS: cg.args.join(' '),
130
+ ...extra,
131
+ };
132
+ }
133
+
134
+ /** Wait for the child to exit. Resolves with the exit code. */
135
+ async waitForExit(timeoutMs = this.config.timeoutMs ?? 30000): Promise<{ code: number | null; stdout: string; stderr: string }> {
136
+ if (!this.child) throw new Error(`Agent ${this.name} not spawned`);
137
+ const child = this.child;
138
+ return new Promise((resolve, reject) => {
139
+ let stdout = '';
140
+ let stderr = '';
141
+ const timer = setTimeout(() => {
142
+ try { child.kill('SIGTERM'); } catch { /* ignore */ }
143
+ reject(new Error(`Agent ${this.name} timed out after ${timeoutMs}ms`));
144
+ }, timeoutMs);
145
+
146
+ child.stdout?.on('data', (chunk: Buffer) => { stdout += chunk.toString(); });
147
+ child.stderr?.on('data', (chunk: Buffer) => { stderr += chunk.toString(); });
148
+ child.on('exit', (code) => {
149
+ clearTimeout(timer);
150
+ resolve({ code, stdout, stderr });
151
+ });
152
+ child.on('error', (err) => {
153
+ clearTimeout(timer);
154
+ reject(err);
155
+ });
156
+ });
157
+ }
158
+
159
+ /** Clean up temp directories. */
160
+ cleanup(): void {
161
+ try {
162
+ if (this.child && !this.child.killed) {
163
+ this.child.kill('SIGTERM');
164
+ }
165
+ } catch { /* ignore */ }
166
+ if (existsSync(this.dataDir)) {
167
+ try { rmSync(this.dataDir, { recursive: true, force: true }); } catch { /* ignore */ }
168
+ }
169
+ }
170
+
171
+ /** Get the absolute path to the temp data directory for this agent run. */
172
+ getDataDir(): string {
173
+ return this.dataDir;
174
+ }
175
+ }
176
+
177
+ /** Resolve the MCP server binary path that will be used by all adapters. */
178
+ export function resolveMcpServerBin(): { command: string; args: string[] } {
179
+ const pkgRoot = resolvePath(process.cwd());
180
+ const candidates = [
181
+ join(pkgRoot, 'dist', 'mcp', 'server.js'),
182
+ join(pkgRoot, 'src', 'mcp', 'server.ts'),
183
+ ];
184
+ for (const path of candidates) {
185
+ if (existsSync(path)) {
186
+ if (path.endsWith('.ts')) {
187
+ return { command: 'npx', args: ['tsx', path] };
188
+ }
189
+ return { command: process.execPath, args: [path] };
190
+ }
191
+ }
192
+ throw new Error(`Cannot find MCP server binary. Looked in: ${candidates.join(', ')}. Run 'npm run build' first.`);
193
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Claude Code adapter.
3
+ *
4
+ * Claude Code reads `.mcp.json` from the project root. This adapter uses the
5
+ * same configuration shape and validates that the MCP server is discoverable
6
+ * by spawning it directly.
7
+ */
8
+ import { BaseAgentAdapter, AgentConfig } from './base.ts';
9
+ export declare class ClaudeCodeAdapter extends BaseAgentAdapter {
10
+ get name(): string;
11
+ buildSpawnCommand(): {
12
+ command: string;
13
+ args: string[];
14
+ env: Record<string, string | undefined>;
15
+ };
16
+ static buildMcpConfig(mcpBin: {
17
+ command: string;
18
+ args: string[];
19
+ }): AgentConfig['mcpConfig'];
20
+ }
21
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE1D,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,IAAa,IAAI,IAAI,MAAM,CAE1B;IAEQ,iBAAiB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;KAAE;IAS1G,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,WAAW,CAAC,WAAW,CAAC;CAW7F"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Claude Code adapter.
3
+ *
4
+ * Claude Code reads `.mcp.json` from the project root. This adapter uses the
5
+ * same configuration shape and validates that the MCP server is discoverable
6
+ * by spawning it directly.
7
+ */
8
+ import { BaseAgentAdapter } from './base.ts';
9
+ export class ClaudeCodeAdapter extends BaseAgentAdapter {
10
+ get name() {
11
+ return 'claude-code';
12
+ }
13
+ buildSpawnCommand() {
14
+ const cliPath = this.config.cliPath ?? 'claude';
15
+ return {
16
+ command: cliPath,
17
+ args: ['--mcp-config', this.mcpConfigPath, '--print', 'noop'],
18
+ env: this.buildMcpServerEnv(),
19
+ };
20
+ }
21
+ static buildMcpConfig(mcpBin) {
22
+ return {
23
+ mcpServers: {
24
+ 'context-gatekeeper': {
25
+ command: mcpBin.command,
26
+ args: mcpBin.args,
27
+ type: 'stdio',
28
+ },
29
+ },
30
+ };
31
+ }
32
+ }
33
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAe,MAAM,WAAW,CAAC;AAE1D,MAAM,OAAO,iBAAkB,SAAQ,gBAAgB;IACrD,IAAa,IAAI;QACf,OAAO,aAAa,CAAC;IACvB,CAAC;IAEQ,iBAAiB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;YAC7D,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAA2C;QAC/D,OAAO;YACL,UAAU,EAAE;gBACV,oBAAoB,EAAE;oBACpB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,OAAO;iBACd;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Claude Code adapter.
3
+ *
4
+ * Claude Code reads `.mcp.json` from the project root. This adapter uses the
5
+ * same configuration shape and validates that the MCP server is discoverable
6
+ * by spawning it directly.
7
+ */
8
+
9
+ import { BaseAgentAdapter, AgentConfig } from './base.ts';
10
+
11
+ export class ClaudeCodeAdapter extends BaseAgentAdapter {
12
+ override get name(): string {
13
+ return 'claude-code';
14
+ }
15
+
16
+ override buildSpawnCommand(): { command: string; args: string[]; env: Record<string, string | undefined> } {
17
+ const cliPath = this.config.cliPath ?? 'claude';
18
+ return {
19
+ command: cliPath,
20
+ args: ['--mcp-config', this.mcpConfigPath, '--print', 'noop'],
21
+ env: this.buildMcpServerEnv(),
22
+ };
23
+ }
24
+
25
+ static buildMcpConfig(mcpBin: { command: string; args: string[] }): AgentConfig['mcpConfig'] {
26
+ return {
27
+ mcpServers: {
28
+ 'context-gatekeeper': {
29
+ command: mcpBin.command,
30
+ args: mcpBin.args,
31
+ type: 'stdio',
32
+ },
33
+ },
34
+ };
35
+ }
36
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Claude Desktop adapter.
3
+ *
4
+ * Claude Desktop reads `~/Library/Application Support/Claude/claude_desktop_config.json`
5
+ * on macOS or `%APPDATA%/Claude/claude_desktop_config.json` on Windows.
6
+ *
7
+ * This adapter uses the same JSON shape and the same stdio-based MCP server
8
+ * contract that Claude Desktop launches. The adapter additionally exercises
9
+ * the optional `claude` CLI for headless smoke testing when available.
10
+ */
11
+ import { BaseAgentAdapter, AgentConfig } from './base.ts';
12
+ export declare class ClaudeDesktopAdapter extends BaseAgentAdapter {
13
+ get name(): string;
14
+ buildSpawnCommand(): {
15
+ command: string;
16
+ args: string[];
17
+ env: Record<string, string | undefined>;
18
+ };
19
+ /** Build the standard `claude_desktop_config.json` shape. */
20
+ static buildMcpConfig(mcpBin: {
21
+ command: string;
22
+ args: string[];
23
+ }): AgentConfig['mcpConfig'];
24
+ }
25
+ //# sourceMappingURL=claude-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["claude-desktop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE1D,qBAAa,oBAAqB,SAAQ,gBAAgB;IACxD,IAAa,IAAI,IAAI,MAAM,CAE1B;IAEQ,iBAAiB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;KAAE;IAS1G,6DAA6D;IAC7D,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,WAAW,CAAC,WAAW,CAAC;CAU7F"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Claude Desktop adapter.
3
+ *
4
+ * Claude Desktop reads `~/Library/Application Support/Claude/claude_desktop_config.json`
5
+ * on macOS or `%APPDATA%/Claude/claude_desktop_config.json` on Windows.
6
+ *
7
+ * This adapter uses the same JSON shape and the same stdio-based MCP server
8
+ * contract that Claude Desktop launches. The adapter additionally exercises
9
+ * the optional `claude` CLI for headless smoke testing when available.
10
+ */
11
+ import { BaseAgentAdapter } from './base.ts';
12
+ export class ClaudeDesktopAdapter extends BaseAgentAdapter {
13
+ get name() {
14
+ return 'claude-desktop';
15
+ }
16
+ buildSpawnCommand() {
17
+ const cg = this.getMcpServerCommand();
18
+ return {
19
+ command: cg.command,
20
+ args: cg.args,
21
+ env: this.buildMcpServerEnv(),
22
+ };
23
+ }
24
+ /** Build the standard `claude_desktop_config.json` shape. */
25
+ static buildMcpConfig(mcpBin) {
26
+ return {
27
+ mcpServers: {
28
+ 'context-gatekeeper': {
29
+ command: mcpBin.command,
30
+ args: mcpBin.args,
31
+ },
32
+ },
33
+ };
34
+ }
35
+ }
36
+ //# sourceMappingURL=claude-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["claude-desktop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,gBAAgB,EAAe,MAAM,WAAW,CAAC;AAE1D,MAAM,OAAO,oBAAqB,SAAQ,gBAAgB;IACxD,IAAa,IAAI;QACf,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEQ,iBAAiB;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAC,cAAc,CAAC,MAA2C;QAC/D,OAAO;YACL,UAAU,EAAE;gBACV,oBAAoB,EAAE;oBACpB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Claude Desktop adapter.
3
+ *
4
+ * Claude Desktop reads `~/Library/Application Support/Claude/claude_desktop_config.json`
5
+ * on macOS or `%APPDATA%/Claude/claude_desktop_config.json` on Windows.
6
+ *
7
+ * This adapter uses the same JSON shape and the same stdio-based MCP server
8
+ * contract that Claude Desktop launches. The adapter additionally exercises
9
+ * the optional `claude` CLI for headless smoke testing when available.
10
+ */
11
+
12
+ import { BaseAgentAdapter, AgentConfig } from './base.ts';
13
+
14
+ export class ClaudeDesktopAdapter extends BaseAgentAdapter {
15
+ override get name(): string {
16
+ return 'claude-desktop';
17
+ }
18
+
19
+ override buildSpawnCommand(): { command: string; args: string[]; env: Record<string, string | undefined> } {
20
+ const cg = this.getMcpServerCommand();
21
+ return {
22
+ command: cg.command,
23
+ args: cg.args,
24
+ env: this.buildMcpServerEnv(),
25
+ };
26
+ }
27
+
28
+ /** Build the standard `claude_desktop_config.json` shape. */
29
+ static buildMcpConfig(mcpBin: { command: string; args: string[] }): AgentConfig['mcpConfig'] {
30
+ return {
31
+ mcpServers: {
32
+ 'context-gatekeeper': {
33
+ command: mcpBin.command,
34
+ args: mcpBin.args,
35
+ },
36
+ },
37
+ };
38
+ }
39
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Cline adapter.
3
+ *
4
+ * Cline reads MCP server configs from VSCode workspace settings. This adapter
5
+ * uses the Cline CLI (`cline`) when available, falling back to a direct MCP
6
+ * stdio invocation. The MCP server configuration shape matches what Cline
7
+ * generates internally.
8
+ */
9
+ import { BaseAgentAdapter, AgentConfig } from './base.ts';
10
+ export declare class ClineAdapter extends BaseAgentAdapter {
11
+ get name(): string;
12
+ buildSpawnCommand(): {
13
+ command: string;
14
+ args: string[];
15
+ env: Record<string, string | undefined>;
16
+ };
17
+ static buildMcpConfig(mcpBin: {
18
+ command: string;
19
+ args: string[];
20
+ }): AgentConfig['mcpConfig'];
21
+ }
22
+ //# sourceMappingURL=cline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["cline.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE1D,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,IAAa,IAAI,IAAI,MAAM,CAE1B;IAEQ,iBAAiB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;KAAE;IAU1G,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,WAAW,CAAC,WAAW,CAAC;CAW7F"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Cline adapter.
3
+ *
4
+ * Cline reads MCP server configs from VSCode workspace settings. This adapter
5
+ * uses the Cline CLI (`cline`) when available, falling back to a direct MCP
6
+ * stdio invocation. The MCP server configuration shape matches what Cline
7
+ * generates internally.
8
+ */
9
+ import { BaseAgentAdapter } from './base.ts';
10
+ export class ClineAdapter extends BaseAgentAdapter {
11
+ get name() {
12
+ return 'cline';
13
+ }
14
+ buildSpawnCommand() {
15
+ const cliPath = this.config.cliPath ?? 'cline';
16
+ const prompt = this.config.cliArgs?.[0] ?? 'noop';
17
+ return {
18
+ command: cliPath,
19
+ args: ['--mcp-config', this.mcpConfigPath, '--prompt', prompt, '--output', 'json'],
20
+ env: this.buildMcpServerEnv(),
21
+ };
22
+ }
23
+ static buildMcpConfig(mcpBin) {
24
+ return {
25
+ mcpServers: {
26
+ 'context-gatekeeper': {
27
+ command: mcpBin.command,
28
+ args: mcpBin.args,
29
+ disabled: false,
30
+ },
31
+ },
32
+ };
33
+ }
34
+ }
35
+ //# sourceMappingURL=cline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.js","sourceRoot":"","sources":["cline.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAe,MAAM,WAAW,CAAC;AAE1D,MAAM,OAAO,YAAa,SAAQ,gBAAgB;IAChD,IAAa,IAAI;QACf,OAAO,OAAO,CAAC;IACjB,CAAC;IAEQ,iBAAiB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAClD,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC;YAClF,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAA2C;QAC/D,OAAO;YACL,UAAU,EAAE;gBACV,oBAAoB,EAAE;oBACpB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,KAAK;iBAChB;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Cline adapter.
3
+ *
4
+ * Cline reads MCP server configs from VSCode workspace settings. This adapter
5
+ * uses the Cline CLI (`cline`) when available, falling back to a direct MCP
6
+ * stdio invocation. The MCP server configuration shape matches what Cline
7
+ * generates internally.
8
+ */
9
+
10
+ import { BaseAgentAdapter, AgentConfig } from './base.ts';
11
+
12
+ export class ClineAdapter extends BaseAgentAdapter {
13
+ override get name(): string {
14
+ return 'cline';
15
+ }
16
+
17
+ override buildSpawnCommand(): { command: string; args: string[]; env: Record<string, string | undefined> } {
18
+ const cliPath = this.config.cliPath ?? 'cline';
19
+ const prompt = this.config.cliArgs?.[0] ?? 'noop';
20
+ return {
21
+ command: cliPath,
22
+ args: ['--mcp-config', this.mcpConfigPath, '--prompt', prompt, '--output', 'json'],
23
+ env: this.buildMcpServerEnv(),
24
+ };
25
+ }
26
+
27
+ static buildMcpConfig(mcpBin: { command: string; args: string[] }): AgentConfig['mcpConfig'] {
28
+ return {
29
+ mcpServers: {
30
+ 'context-gatekeeper': {
31
+ command: mcpBin.command,
32
+ args: mcpBin.args,
33
+ disabled: false,
34
+ },
35
+ },
36
+ };
37
+ }
38
+ }