macro-agent 0.0.11 → 0.0.13

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 (408) hide show
  1. package/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
  2. package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
  3. package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
  4. package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
  5. package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
  6. package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
  7. package/.macro-agent/teams/self-driving/team.yaml +103 -0
  8. package/.macro-agent/teams/structured/prompts/developer.md +26 -0
  9. package/.macro-agent/teams/structured/prompts/lead.md +25 -0
  10. package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
  11. package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
  12. package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
  13. package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
  14. package/.macro-agent/teams/structured/team.yaml +89 -0
  15. package/.sudocode/issues.jsonl +6 -0
  16. package/.sudocode/specs.jsonl +7 -0
  17. package/CLAUDE.md +110 -30
  18. package/README.md +60 -3
  19. package/dist/acp/macro-agent.d.ts +4 -0
  20. package/dist/acp/macro-agent.d.ts.map +1 -1
  21. package/dist/acp/macro-agent.js +50 -4
  22. package/dist/acp/macro-agent.js.map +1 -1
  23. package/dist/acp/session-mapper.d.ts +20 -1
  24. package/dist/acp/session-mapper.d.ts.map +1 -1
  25. package/dist/acp/session-mapper.js +90 -1
  26. package/dist/acp/session-mapper.js.map +1 -1
  27. package/dist/acp/types.d.ts +24 -1
  28. package/dist/acp/types.d.ts.map +1 -1
  29. package/dist/acp/types.js.map +1 -1
  30. package/dist/agent/agent-manager.d.ts +25 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +93 -7
  33. package/dist/agent/agent-manager.js.map +1 -1
  34. package/dist/agent/types.d.ts +22 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/agent/types.js.map +1 -1
  37. package/dist/agent-detection/command-builder.d.ts +30 -0
  38. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  39. package/dist/agent-detection/command-builder.js +71 -0
  40. package/dist/agent-detection/command-builder.js.map +1 -0
  41. package/dist/agent-detection/detector.d.ts +84 -0
  42. package/dist/agent-detection/detector.d.ts.map +1 -0
  43. package/dist/agent-detection/detector.js +240 -0
  44. package/dist/agent-detection/detector.js.map +1 -0
  45. package/dist/agent-detection/index.d.ts +12 -0
  46. package/dist/agent-detection/index.d.ts.map +1 -0
  47. package/dist/agent-detection/index.js +14 -0
  48. package/dist/agent-detection/index.js.map +1 -0
  49. package/dist/agent-detection/registry.d.ts +53 -0
  50. package/dist/agent-detection/registry.d.ts.map +1 -0
  51. package/dist/agent-detection/registry.js +177 -0
  52. package/dist/agent-detection/registry.js.map +1 -0
  53. package/dist/agent-detection/types.d.ts +121 -0
  54. package/dist/agent-detection/types.d.ts.map +1 -0
  55. package/dist/agent-detection/types.js +20 -0
  56. package/dist/agent-detection/types.js.map +1 -0
  57. package/dist/api/server.d.ts.map +1 -1
  58. package/dist/api/server.js +95 -0
  59. package/dist/api/server.js.map +1 -1
  60. package/dist/cli/index.js +29 -0
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/mcp.js +38 -0
  63. package/dist/cli/mcp.js.map +1 -1
  64. package/dist/config/index.d.ts +2 -0
  65. package/dist/config/index.d.ts.map +1 -0
  66. package/dist/config/index.js +2 -0
  67. package/dist/config/index.js.map +1 -0
  68. package/dist/config/project-config.d.ts +46 -0
  69. package/dist/config/project-config.d.ts.map +1 -0
  70. package/dist/config/project-config.js +68 -0
  71. package/dist/config/project-config.js.map +1 -0
  72. package/dist/lifecycle/cascade.d.ts +1 -1
  73. package/dist/lifecycle/cascade.d.ts.map +1 -1
  74. package/dist/lifecycle/handlers/index.d.ts +4 -0
  75. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  76. package/dist/lifecycle/handlers/index.js +2 -0
  77. package/dist/lifecycle/handlers/index.js.map +1 -1
  78. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  79. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  80. package/dist/lifecycle/handlers/worker.js +35 -3
  81. package/dist/lifecycle/handlers/worker.js.map +1 -1
  82. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  83. package/dist/map/adapter/acp-over-map.js +32 -2
  84. package/dist/map/adapter/acp-over-map.js.map +1 -1
  85. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  86. package/dist/map/adapter/event-translator.js +1 -0
  87. package/dist/map/adapter/event-translator.js.map +1 -1
  88. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  89. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  90. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  91. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  92. package/dist/map/adapter/extensions/index.d.ts +10 -1
  93. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  94. package/dist/map/adapter/extensions/index.js +39 -0
  95. package/dist/map/adapter/extensions/index.js.map +1 -1
  96. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  97. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  98. package/dist/map/adapter/extensions/resume.js +59 -0
  99. package/dist/map/adapter/extensions/resume.js.map +1 -0
  100. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  101. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  102. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  103. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  104. package/dist/mcp/mcp-server.d.ts +6 -0
  105. package/dist/mcp/mcp-server.d.ts.map +1 -1
  106. package/dist/mcp/mcp-server.js +45 -0
  107. package/dist/mcp/mcp-server.js.map +1 -1
  108. package/dist/mcp/tools/claim_task.d.ts +35 -0
  109. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  110. package/dist/mcp/tools/claim_task.js +58 -0
  111. package/dist/mcp/tools/claim_task.js.map +1 -0
  112. package/dist/mcp/tools/done.d.ts +11 -2
  113. package/dist/mcp/tools/done.d.ts.map +1 -1
  114. package/dist/mcp/tools/done.js +15 -10
  115. package/dist/mcp/tools/done.js.map +1 -1
  116. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  117. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  118. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  119. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  120. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  121. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  122. package/dist/mcp/tools/unclaim_task.js +47 -0
  123. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  124. package/dist/metrics/index.d.ts +2 -0
  125. package/dist/metrics/index.d.ts.map +1 -0
  126. package/dist/metrics/index.js +2 -0
  127. package/dist/metrics/index.js.map +1 -0
  128. package/dist/metrics/metrics.d.ts +79 -0
  129. package/dist/metrics/metrics.d.ts.map +1 -0
  130. package/dist/metrics/metrics.js +166 -0
  131. package/dist/metrics/metrics.js.map +1 -0
  132. package/dist/roles/capabilities.d.ts +1 -0
  133. package/dist/roles/capabilities.d.ts.map +1 -1
  134. package/dist/roles/capabilities.js +3 -0
  135. package/dist/roles/capabilities.js.map +1 -1
  136. package/dist/roles/types.d.ts +1 -1
  137. package/dist/roles/types.d.ts.map +1 -1
  138. package/dist/router/message-router.d.ts +41 -0
  139. package/dist/router/message-router.d.ts.map +1 -1
  140. package/dist/router/message-router.js +136 -5
  141. package/dist/router/message-router.js.map +1 -1
  142. package/dist/store/event-store.d.ts +8 -1
  143. package/dist/store/event-store.d.ts.map +1 -1
  144. package/dist/store/event-store.js +120 -4
  145. package/dist/store/event-store.js.map +1 -1
  146. package/dist/store/types/agents.d.ts +1 -1
  147. package/dist/store/types/agents.d.ts.map +1 -1
  148. package/dist/store/types/events.d.ts +1 -1
  149. package/dist/store/types/events.d.ts.map +1 -1
  150. package/dist/store/types/events.js.map +1 -1
  151. package/dist/store/types/index.d.ts +1 -0
  152. package/dist/store/types/index.d.ts.map +1 -1
  153. package/dist/store/types/index.js +1 -0
  154. package/dist/store/types/index.js.map +1 -1
  155. package/dist/store/types/sessions.d.ts +44 -0
  156. package/dist/store/types/sessions.d.ts.map +1 -0
  157. package/dist/store/types/sessions.js +9 -0
  158. package/dist/store/types/sessions.js.map +1 -0
  159. package/dist/store/types/tasks.d.ts +2 -0
  160. package/dist/store/types/tasks.d.ts.map +1 -1
  161. package/dist/task/backend/memory.d.ts +4 -1
  162. package/dist/task/backend/memory.d.ts.map +1 -1
  163. package/dist/task/backend/memory.js +81 -0
  164. package/dist/task/backend/memory.js.map +1 -1
  165. package/dist/task/backend/types.d.ts +30 -0
  166. package/dist/task/backend/types.d.ts.map +1 -1
  167. package/dist/task/backend/types.js.map +1 -1
  168. package/dist/teams/index.d.ts +4 -0
  169. package/dist/teams/index.d.ts.map +1 -0
  170. package/dist/teams/index.js +4 -0
  171. package/dist/teams/index.js.map +1 -0
  172. package/dist/teams/team-loader.d.ts +20 -0
  173. package/dist/teams/team-loader.d.ts.map +1 -0
  174. package/dist/teams/team-loader.js +293 -0
  175. package/dist/teams/team-loader.js.map +1 -0
  176. package/dist/teams/team-runtime.d.ts +139 -0
  177. package/dist/teams/team-runtime.d.ts.map +1 -0
  178. package/dist/teams/team-runtime.js +613 -0
  179. package/dist/teams/team-runtime.js.map +1 -0
  180. package/dist/teams/types.d.ts +266 -0
  181. package/dist/teams/types.d.ts.map +1 -0
  182. package/dist/teams/types.js +20 -0
  183. package/dist/teams/types.js.map +1 -0
  184. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  185. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  186. package/dist/workspace/dataplane-adapter.js +1 -1
  187. package/dist/workspace/dataplane-adapter.js.map +1 -1
  188. package/dist/workspace/index.d.ts +1 -1
  189. package/dist/workspace/index.d.ts.map +1 -1
  190. package/dist/workspace/strategies/index.d.ts +6 -0
  191. package/dist/workspace/strategies/index.d.ts.map +1 -0
  192. package/dist/workspace/strategies/index.js +5 -0
  193. package/dist/workspace/strategies/index.js.map +1 -0
  194. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  195. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  196. package/dist/workspace/strategies/optimistic.js +121 -0
  197. package/dist/workspace/strategies/optimistic.js.map +1 -0
  198. package/dist/workspace/strategies/queue.d.ts +26 -0
  199. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  200. package/dist/workspace/strategies/queue.js +67 -0
  201. package/dist/workspace/strategies/queue.js.map +1 -0
  202. package/dist/workspace/strategies/registry.d.ts +37 -0
  203. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  204. package/dist/workspace/strategies/registry.js +63 -0
  205. package/dist/workspace/strategies/registry.js.map +1 -0
  206. package/dist/workspace/strategies/trunk.d.ts +20 -0
  207. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  208. package/dist/workspace/strategies/trunk.js +108 -0
  209. package/dist/workspace/strategies/trunk.js.map +1 -0
  210. package/dist/workspace/strategies/types.d.ts +104 -0
  211. package/dist/workspace/strategies/types.d.ts.map +1 -0
  212. package/dist/workspace/strategies/types.js +11 -0
  213. package/dist/workspace/strategies/types.js.map +1 -0
  214. package/dist/workspace/types.d.ts +1 -1
  215. package/dist/workspace/types.d.ts.map +1 -1
  216. package/dist/workspace/workspace-manager.d.ts +1 -1
  217. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  218. package/docs/implementation-details.md +1127 -0
  219. package/docs/implementation-summary.md +448 -0
  220. package/docs/plan-self-driving-support.md +433 -0
  221. package/docs/spec-self-driving-support.md +462 -0
  222. package/docs/team-templates.md +860 -0
  223. package/docs/teams.md +233 -0
  224. package/package.json +5 -3
  225. package/src/acp/__tests__/integration.test.ts +161 -1
  226. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  227. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  228. package/src/acp/macro-agent.ts +79 -7
  229. package/src/acp/session-mapper.ts +108 -1
  230. package/src/acp/types.ts +33 -1
  231. package/src/agent/agent-manager.ts +158 -6
  232. package/src/agent/types.ts +27 -0
  233. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  234. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  235. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  236. package/src/agent-detection/command-builder.ts +90 -0
  237. package/src/agent-detection/detector.ts +307 -0
  238. package/src/agent-detection/index.ts +36 -0
  239. package/src/agent-detection/registry.ts +200 -0
  240. package/src/agent-detection/types.ts +184 -0
  241. package/src/api/server.ts +110 -0
  242. package/src/cli/index.ts +44 -0
  243. package/src/cli/mcp.ts +47 -0
  244. package/src/config/index.ts +9 -0
  245. package/src/config/project-config.ts +107 -0
  246. package/src/lifecycle/cascade.ts +1 -1
  247. package/src/lifecycle/handlers/index.ts +8 -0
  248. package/src/lifecycle/handlers/worker.ts +48 -3
  249. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  250. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  251. package/src/map/adapter/acp-over-map.ts +45 -2
  252. package/src/map/adapter/event-translator.ts +1 -0
  253. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  254. package/src/map/adapter/extensions/index.ts +63 -0
  255. package/src/map/adapter/extensions/resume.ts +114 -0
  256. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  257. package/src/mcp/mcp-server.ts +67 -0
  258. package/src/mcp/tools/claim_task.ts +86 -0
  259. package/src/mcp/tools/done.ts +24 -10
  260. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  261. package/src/mcp/tools/unclaim_task.ts +71 -0
  262. package/src/metrics/index.ts +9 -0
  263. package/src/metrics/metrics.ts +280 -0
  264. package/src/roles/capabilities.ts +3 -0
  265. package/src/roles/types.ts +2 -1
  266. package/src/router/__tests__/message-router.test.ts +561 -0
  267. package/src/router/message-router.ts +223 -6
  268. package/src/store/event-store.ts +151 -3
  269. package/src/store/types/agents.ts +1 -1
  270. package/src/store/types/events.ts +2 -1
  271. package/src/store/types/index.ts +1 -0
  272. package/src/store/types/sessions.ts +53 -0
  273. package/src/store/types/tasks.ts +3 -0
  274. package/src/task/backend/memory.ts +116 -0
  275. package/src/task/backend/types.ts +43 -0
  276. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  277. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  278. package/src/teams/__tests__/team-system.test.ts +1280 -0
  279. package/src/teams/index.ts +13 -0
  280. package/src/teams/team-loader.ts +434 -0
  281. package/src/teams/team-runtime.ts +727 -0
  282. package/src/teams/types.ts +377 -0
  283. package/src/workspace/dataplane-adapter.ts +1 -1
  284. package/src/workspace/index.ts +1 -1
  285. package/src/workspace/strategies/index.ts +18 -0
  286. package/src/workspace/strategies/optimistic.ts +136 -0
  287. package/src/workspace/strategies/queue.ts +81 -0
  288. package/src/workspace/strategies/registry.ts +89 -0
  289. package/src/workspace/strategies/trunk.ts +123 -0
  290. package/src/workspace/strategies/types.ts +145 -0
  291. package/src/workspace/types.ts +1 -1
  292. package/src/workspace/workspace-manager.ts +1 -1
  293. package/.claude/settings.local.json +0 -59
  294. package/dist/map/utils/address-translation.d.ts +0 -99
  295. package/dist/map/utils/address-translation.d.ts.map +0 -1
  296. package/dist/map/utils/address-translation.js +0 -285
  297. package/dist/map/utils/address-translation.js.map +0 -1
  298. package/dist/map/utils/index.d.ts +0 -7
  299. package/dist/map/utils/index.d.ts.map +0 -1
  300. package/dist/map/utils/index.js +0 -7
  301. package/dist/map/utils/index.js.map +0 -1
  302. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  303. package/references/acp-factory-ref/LICENSE +0 -21
  304. package/references/acp-factory-ref/README.md +0 -341
  305. package/references/acp-factory-ref/package-lock.json +0 -3102
  306. package/references/acp-factory-ref/package.json +0 -96
  307. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  308. package/references/acp-factory-ref/python/LICENSE +0 -21
  309. package/references/acp-factory-ref/python/Makefile +0 -57
  310. package/references/acp-factory-ref/python/README.md +0 -253
  311. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  312. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  313. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  314. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  315. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  316. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  317. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  318. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  319. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  320. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  321. package/references/claude-code-acp/.prettierrc.json +0 -4
  322. package/references/claude-code-acp/CHANGELOG.md +0 -249
  323. package/references/claude-code-acp/LICENSE +0 -222
  324. package/references/claude-code-acp/README.md +0 -53
  325. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  326. package/references/claude-code-acp/eslint.config.js +0 -48
  327. package/references/claude-code-acp/package-lock.json +0 -4570
  328. package/references/claude-code-acp/package.json +0 -88
  329. package/references/claude-code-acp/scripts/release.sh +0 -119
  330. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  331. package/references/claude-code-acp/src/index.ts +0 -26
  332. package/references/claude-code-acp/src/lib.ts +0 -38
  333. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  334. package/references/claude-code-acp/src/settings.ts +0 -522
  335. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  336. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  337. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  338. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  339. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  340. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  341. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  342. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  343. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  344. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  345. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  346. package/references/claude-code-acp/src/tools.ts +0 -819
  347. package/references/claude-code-acp/src/utils.ts +0 -171
  348. package/references/claude-code-acp/tsconfig.json +0 -18
  349. package/references/claude-code-acp/vitest.config.ts +0 -19
  350. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
  351. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
  352. package/references/multi-agent-protocol/LICENSE +0 -21
  353. package/references/multi-agent-protocol/README.md +0 -113
  354. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
  355. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  356. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  357. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  358. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  359. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  360. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  361. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  362. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  363. package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
  364. package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
  365. package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
  366. package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
  367. package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
  368. package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
  369. package/references/multi-agent-protocol/docs-site/README.md +0 -82
  370. package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
  371. package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
  372. package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
  373. package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
  374. package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
  375. package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
  376. package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
  377. package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
  378. package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
  379. package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
  380. package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
  381. package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
  382. package/references/multi-agent-protocol/docs-site/index.md +0 -136
  383. package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
  384. package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
  385. package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
  386. package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
  387. package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
  388. package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
  389. package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
  390. package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
  391. package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
  392. package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
  393. package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
  394. package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
  395. package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
  396. package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
  397. package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
  398. package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
  399. package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
  400. package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
  401. package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
  402. package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
  403. package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
  404. package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
  405. package/references/multi-agent-protocol/package-lock.json +0 -3886
  406. package/references/multi-agent-protocol/package.json +0 -56
  407. package/references/multi-agent-protocol/schema/meta.json +0 -467
  408. package/references/multi-agent-protocol/schema/schema.json +0 -2558
@@ -1,617 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import { SettingsManager } from "../settings.js";
3
- import * as fs from "node:fs";
4
- import * as path from "node:path";
5
- import * as os from "node:os";
6
-
7
- describe("SettingsManager", () => {
8
- let tempDir: string;
9
- let settingsManager: SettingsManager;
10
-
11
- beforeEach(async () => {
12
- tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "settings-test-"));
13
- });
14
-
15
- afterEach(async () => {
16
- settingsManager?.dispose();
17
- await fs.promises.rm(tempDir, { recursive: true, force: true });
18
- });
19
-
20
- describe("permission checking", () => {
21
- it("should return 'ask' when no settings exist", async () => {
22
- settingsManager = new SettingsManager(tempDir);
23
- await settingsManager.initialize();
24
-
25
- const result = settingsManager.checkPermission("mcp__acp__Read", {
26
- file_path: "/some/file.txt",
27
- });
28
- expect(result.decision).toBe("ask");
29
- });
30
-
31
- it("should return 'ask' for non-ACP tools (permission checks only apply to mcp__acp__* tools)", async () => {
32
- const claudeDir = path.join(tempDir, ".claude");
33
- await fs.promises.mkdir(claudeDir, { recursive: true });
34
- await fs.promises.writeFile(
35
- path.join(claudeDir, "settings.json"),
36
- JSON.stringify({
37
- permissions: {
38
- deny: ["Read"],
39
- },
40
- }),
41
- );
42
-
43
- settingsManager = new SettingsManager(tempDir);
44
- await settingsManager.initialize();
45
-
46
- // Non-ACP tools should always return 'ask' regardless of rules
47
- const result = settingsManager.checkPermission("Read", { file_path: "/some/file.txt" });
48
- expect(result.decision).toBe("ask");
49
- });
50
-
51
- it("should allow tool use when matching allow rule exists", async () => {
52
- const claudeDir = path.join(tempDir, ".claude");
53
- await fs.promises.mkdir(claudeDir, { recursive: true });
54
- await fs.promises.writeFile(
55
- path.join(claudeDir, "settings.json"),
56
- JSON.stringify({
57
- permissions: {
58
- allow: ["Read"],
59
- },
60
- }),
61
- );
62
-
63
- settingsManager = new SettingsManager(tempDir);
64
- await settingsManager.initialize();
65
-
66
- const result = settingsManager.checkPermission("mcp__acp__Read", {
67
- file_path: "/some/file.txt",
68
- });
69
- expect(result.decision).toBe("allow");
70
- expect(result.rule).toBe("Read");
71
- });
72
-
73
- it("should deny tool use when matching deny rule exists", async () => {
74
- const claudeDir = path.join(tempDir, ".claude");
75
- await fs.promises.mkdir(claudeDir, { recursive: true });
76
- await fs.promises.writeFile(
77
- path.join(claudeDir, "settings.json"),
78
- JSON.stringify({
79
- permissions: {
80
- deny: ["Read(./.env)"],
81
- },
82
- }),
83
- );
84
-
85
- settingsManager = new SettingsManager(tempDir);
86
- await settingsManager.initialize();
87
-
88
- const result = settingsManager.checkPermission("mcp__acp__Read", {
89
- file_path: path.join(tempDir, ".env"),
90
- });
91
- expect(result.decision).toBe("deny");
92
- expect(result.rule).toBe("Read(./.env)");
93
- });
94
-
95
- it("should prioritize deny rules over allow rules", async () => {
96
- const claudeDir = path.join(tempDir, ".claude");
97
- await fs.promises.mkdir(claudeDir, { recursive: true });
98
- await fs.promises.writeFile(
99
- path.join(claudeDir, "settings.json"),
100
- JSON.stringify({
101
- permissions: {
102
- allow: ["Read"],
103
- deny: ["Read(./.env)"],
104
- },
105
- }),
106
- );
107
-
108
- settingsManager = new SettingsManager(tempDir);
109
- await settingsManager.initialize();
110
-
111
- // .env should be denied
112
- const envResult = settingsManager.checkPermission("mcp__acp__Read", {
113
- file_path: path.join(tempDir, ".env"),
114
- });
115
- expect(envResult.decision).toBe("deny");
116
-
117
- // other files should be allowed
118
- const otherResult = settingsManager.checkPermission("mcp__acp__Read", {
119
- file_path: path.join(tempDir, "other.txt"),
120
- });
121
- expect(otherResult.decision).toBe("allow");
122
- });
123
-
124
- it("should handle ACP-prefixed tool names", async () => {
125
- const claudeDir = path.join(tempDir, ".claude");
126
- await fs.promises.mkdir(claudeDir, { recursive: true });
127
- await fs.promises.writeFile(
128
- path.join(claudeDir, "settings.json"),
129
- JSON.stringify({
130
- permissions: {
131
- allow: ["Read"],
132
- },
133
- }),
134
- );
135
-
136
- settingsManager = new SettingsManager(tempDir);
137
- await settingsManager.initialize();
138
-
139
- const result = settingsManager.checkPermission("mcp__acp__Read", {
140
- file_path: "/some/file.txt",
141
- });
142
- expect(result.decision).toBe("allow");
143
- });
144
- });
145
-
146
- describe("Bash permission rules", () => {
147
- it("should match exact Bash commands without :* wildcard", async () => {
148
- const claudeDir = path.join(tempDir, ".claude");
149
- await fs.promises.mkdir(claudeDir, { recursive: true });
150
- await fs.promises.writeFile(
151
- path.join(claudeDir, "settings.json"),
152
- JSON.stringify({
153
- permissions: {
154
- // Per docs: Bash(npm run build) matches the EXACT command "npm run build"
155
- allow: ["Bash(npm run lint)"],
156
- },
157
- }),
158
- );
159
-
160
- settingsManager = new SettingsManager(tempDir);
161
- await settingsManager.initialize();
162
-
163
- // Exact match should be allowed
164
- const exactResult = settingsManager.checkPermission("mcp__acp__Bash", {
165
- command: "npm run lint",
166
- });
167
- expect(exactResult.decision).toBe("allow");
168
-
169
- // Command with extra arguments should NOT match (exact match only)
170
- const withArgsResult = settingsManager.checkPermission("mcp__acp__Bash", {
171
- command: "npm run lint --fix",
172
- });
173
- expect(withArgsResult.decision).toBe("ask");
174
-
175
- // Similar command should NOT match (exact match only)
176
- const similarResult = settingsManager.checkPermission("mcp__acp__Bash", {
177
- command: "npm run linting",
178
- });
179
- expect(similarResult.decision).toBe("ask");
180
-
181
- // Different command should not match
182
- const differentResult = settingsManager.checkPermission("mcp__acp__Bash", {
183
- command: "npm run test",
184
- });
185
- expect(differentResult.decision).toBe("ask");
186
- });
187
-
188
- it("should match Bash commands with :* wildcard suffix (prefix matching)", async () => {
189
- const claudeDir = path.join(tempDir, ".claude");
190
- await fs.promises.mkdir(claudeDir, { recursive: true });
191
- await fs.promises.writeFile(
192
- path.join(claudeDir, "settings.json"),
193
- JSON.stringify({
194
- permissions: {
195
- // The :* suffix is a convention to make prefix matching explicit
196
- allow: ["Bash(npm run:*)"],
197
- },
198
- }),
199
- );
200
-
201
- settingsManager = new SettingsManager(tempDir);
202
- await settingsManager.initialize();
203
-
204
- // Any command starting with "npm run" should match (prefix matching with :*)
205
- const lintResult = settingsManager.checkPermission("mcp__acp__Bash", {
206
- command: "npm run lint",
207
- });
208
- expect(lintResult.decision).toBe("allow");
209
-
210
- const testResult = settingsManager.checkPermission("mcp__acp__Bash", {
211
- command: "npm run test",
212
- });
213
- expect(testResult.decision).toBe("allow");
214
-
215
- // Commands with additional args also match
216
- const withArgsResult = settingsManager.checkPermission("mcp__acp__Bash", {
217
- command: "npm run test --watch",
218
- });
219
- expect(withArgsResult.decision).toBe("allow");
220
-
221
- // Non-matching command
222
- const installResult = settingsManager.checkPermission("mcp__acp__Bash", {
223
- command: "npm install",
224
- });
225
- expect(installResult.decision).toBe("ask");
226
- });
227
-
228
- it("should not allow shell operators to bypass prefix matching", async () => {
229
- const claudeDir = path.join(tempDir, ".claude");
230
- await fs.promises.mkdir(claudeDir, { recursive: true });
231
- await fs.promises.writeFile(
232
- path.join(claudeDir, "settings.json"),
233
- JSON.stringify({
234
- permissions: {
235
- allow: ["Bash(safe-cmd:*)"],
236
- },
237
- }),
238
- );
239
-
240
- settingsManager = new SettingsManager(tempDir);
241
- await settingsManager.initialize();
242
-
243
- // Normal prefix match should work
244
- const normalResult = settingsManager.checkPermission("mcp__acp__Bash", {
245
- command: "safe-cmd --flag",
246
- });
247
- expect(normalResult.decision).toBe("allow");
248
-
249
- // Shell operators should NOT be allowed (per docs: Claude Code is aware of shell operators)
250
- const andResult = settingsManager.checkPermission("mcp__acp__Bash", {
251
- command: "safe-cmd && malicious-cmd",
252
- });
253
- expect(andResult.decision).toBe("ask");
254
-
255
- const orResult = settingsManager.checkPermission("mcp__acp__Bash", {
256
- command: "safe-cmd || malicious-cmd",
257
- });
258
- expect(orResult.decision).toBe("ask");
259
-
260
- const semicolonResult = settingsManager.checkPermission("mcp__acp__Bash", {
261
- command: "safe-cmd; malicious-cmd",
262
- });
263
- expect(semicolonResult.decision).toBe("ask");
264
-
265
- const pipeResult = settingsManager.checkPermission("mcp__acp__Bash", {
266
- command: "safe-cmd | malicious-cmd",
267
- });
268
- expect(pipeResult.decision).toBe("ask");
269
-
270
- const subshellResult = settingsManager.checkPermission("mcp__acp__Bash", {
271
- command: "safe-cmd $(malicious-cmd)",
272
- });
273
- expect(subshellResult.decision).toBe("ask");
274
-
275
- const backtickResult = settingsManager.checkPermission("mcp__acp__Bash", {
276
- command: "safe-cmd `malicious-cmd`",
277
- });
278
- expect(backtickResult.decision).toBe("ask");
279
-
280
- const newlineResult = settingsManager.checkPermission("mcp__acp__Bash", {
281
- command: "safe-cmd\nmalicious-cmd",
282
- });
283
- expect(newlineResult.decision).toBe("ask");
284
- });
285
-
286
- it("should deny dangerous Bash commands", async () => {
287
- const claudeDir = path.join(tempDir, ".claude");
288
- await fs.promises.mkdir(claudeDir, { recursive: true });
289
- await fs.promises.writeFile(
290
- path.join(claudeDir, "settings.json"),
291
- JSON.stringify({
292
- permissions: {
293
- deny: ["Bash(curl:*)", "Bash(wget:*)"],
294
- },
295
- }),
296
- );
297
-
298
- settingsManager = new SettingsManager(tempDir);
299
- await settingsManager.initialize();
300
-
301
- const curlResult = settingsManager.checkPermission("mcp__acp__Bash", {
302
- command: "curl https://example.com",
303
- });
304
- expect(curlResult.decision).toBe("deny");
305
-
306
- const wgetResult = settingsManager.checkPermission("mcp__acp__Bash", {
307
- command: "wget https://example.com",
308
- });
309
- expect(wgetResult.decision).toBe("deny");
310
-
311
- const lsResult = settingsManager.checkPermission("mcp__acp__Bash", { command: "ls -la" });
312
- expect(lsResult.decision).toBe("ask");
313
- });
314
- });
315
-
316
- describe("file path glob matching", () => {
317
- it("should match exact file paths", async () => {
318
- const claudeDir = path.join(tempDir, ".claude");
319
- await fs.promises.mkdir(claudeDir, { recursive: true });
320
- await fs.promises.writeFile(
321
- path.join(claudeDir, "settings.json"),
322
- JSON.stringify({
323
- permissions: {
324
- deny: ["Read(./.env)"],
325
- },
326
- }),
327
- );
328
-
329
- settingsManager = new SettingsManager(tempDir);
330
- await settingsManager.initialize();
331
-
332
- const envResult = settingsManager.checkPermission("mcp__acp__Read", {
333
- file_path: path.join(tempDir, ".env"),
334
- });
335
- expect(envResult.decision).toBe("deny");
336
-
337
- const otherResult = settingsManager.checkPermission("mcp__acp__Read", {
338
- file_path: path.join(tempDir, ".envrc"),
339
- });
340
- expect(otherResult.decision).toBe("ask");
341
- });
342
-
343
- it("should match glob patterns with single wildcard", async () => {
344
- const claudeDir = path.join(tempDir, ".claude");
345
- await fs.promises.mkdir(claudeDir, { recursive: true });
346
- await fs.promises.writeFile(
347
- path.join(claudeDir, "settings.json"),
348
- JSON.stringify({
349
- permissions: {
350
- deny: ["Read(./.env.*)"],
351
- },
352
- }),
353
- );
354
-
355
- settingsManager = new SettingsManager(tempDir);
356
- await settingsManager.initialize();
357
-
358
- const envLocalResult = settingsManager.checkPermission("mcp__acp__Read", {
359
- file_path: path.join(tempDir, ".env.local"),
360
- });
361
- expect(envLocalResult.decision).toBe("deny");
362
-
363
- const envProdResult = settingsManager.checkPermission("mcp__acp__Read", {
364
- file_path: path.join(tempDir, ".env.production"),
365
- });
366
- expect(envProdResult.decision).toBe("deny");
367
-
368
- // Plain .env should not match .env.*
369
- const plainEnvResult = settingsManager.checkPermission("mcp__acp__Read", {
370
- file_path: path.join(tempDir, ".env"),
371
- });
372
- expect(plainEnvResult.decision).toBe("ask");
373
- });
374
-
375
- it("should match glob patterns with double wildcard (recursive)", async () => {
376
- const claudeDir = path.join(tempDir, ".claude");
377
- await fs.promises.mkdir(claudeDir, { recursive: true });
378
- await fs.promises.writeFile(
379
- path.join(claudeDir, "settings.json"),
380
- JSON.stringify({
381
- permissions: {
382
- deny: ["Read(./secrets/**)"],
383
- },
384
- }),
385
- );
386
-
387
- settingsManager = new SettingsManager(tempDir);
388
- await settingsManager.initialize();
389
-
390
- const secretResult = settingsManager.checkPermission("mcp__acp__Read", {
391
- file_path: path.join(tempDir, "secrets", "api-key.txt"),
392
- });
393
- expect(secretResult.decision).toBe("deny");
394
-
395
- const nestedSecretResult = settingsManager.checkPermission("mcp__acp__Read", {
396
- file_path: path.join(tempDir, "secrets", "deep", "nested", "key.txt"),
397
- });
398
- expect(nestedSecretResult.decision).toBe("deny");
399
-
400
- const otherResult = settingsManager.checkPermission("mcp__acp__Read", {
401
- file_path: path.join(tempDir, "public", "file.txt"),
402
- });
403
- expect(otherResult.decision).toBe("ask");
404
- });
405
-
406
- it("should handle home directory expansion", async () => {
407
- const claudeDir = path.join(tempDir, ".claude");
408
- await fs.promises.mkdir(claudeDir, { recursive: true });
409
- await fs.promises.writeFile(
410
- path.join(claudeDir, "settings.json"),
411
- JSON.stringify({
412
- permissions: {
413
- allow: ["Read(~/.zshrc)"],
414
- },
415
- }),
416
- );
417
-
418
- settingsManager = new SettingsManager(tempDir);
419
- await settingsManager.initialize();
420
-
421
- const zshrcResult = settingsManager.checkPermission("mcp__acp__Read", {
422
- file_path: path.join(os.homedir(), ".zshrc"),
423
- });
424
- expect(zshrcResult.decision).toBe("allow");
425
- });
426
- });
427
-
428
- describe("settings merging", () => {
429
- it("should merge project and local settings", async () => {
430
- const claudeDir = path.join(tempDir, ".claude");
431
- await fs.promises.mkdir(claudeDir, { recursive: true });
432
-
433
- // Project settings
434
- await fs.promises.writeFile(
435
- path.join(claudeDir, "settings.json"),
436
- JSON.stringify({
437
- permissions: {
438
- allow: ["Read"],
439
- },
440
- }),
441
- );
442
-
443
- // Local settings
444
- await fs.promises.writeFile(
445
- path.join(claudeDir, "settings.local.json"),
446
- JSON.stringify({
447
- permissions: {
448
- deny: ["Read(./.env)"],
449
- },
450
- }),
451
- );
452
-
453
- settingsManager = new SettingsManager(tempDir);
454
- await settingsManager.initialize();
455
-
456
- // Read should be allowed in general
457
- const readResult = settingsManager.checkPermission("mcp__acp__Read", {
458
- file_path: path.join(tempDir, "file.txt"),
459
- });
460
- expect(readResult.decision).toBe("allow");
461
-
462
- // But .env should be denied (local settings take precedence)
463
- const envResult = settingsManager.checkPermission("mcp__acp__Read", {
464
- file_path: path.join(tempDir, ".env"),
465
- });
466
- expect(envResult.decision).toBe("deny");
467
- });
468
- });
469
-
470
- describe("ask rules", () => {
471
- it("should return 'ask' for matching ask rules", async () => {
472
- const claudeDir = path.join(tempDir, ".claude");
473
- await fs.promises.mkdir(claudeDir, { recursive: true });
474
- await fs.promises.writeFile(
475
- path.join(claudeDir, "settings.json"),
476
- JSON.stringify({
477
- permissions: {
478
- ask: ["Bash(git push:*)"],
479
- },
480
- }),
481
- );
482
-
483
- settingsManager = new SettingsManager(tempDir);
484
- await settingsManager.initialize();
485
-
486
- const result = settingsManager.checkPermission("mcp__acp__Bash", {
487
- command: "git push origin main",
488
- });
489
- expect(result.decision).toBe("ask");
490
- expect(result.rule).toBe("Bash(git push:*)");
491
- });
492
- });
493
-
494
- describe("Edit and Write tools", () => {
495
- it("should handle Edit tool permissions", async () => {
496
- const claudeDir = path.join(tempDir, ".claude");
497
- await fs.promises.mkdir(claudeDir, { recursive: true });
498
- await fs.promises.writeFile(
499
- path.join(claudeDir, "settings.json"),
500
- JSON.stringify({
501
- permissions: {
502
- deny: ["Edit(./package-lock.json)"],
503
- },
504
- }),
505
- );
506
-
507
- settingsManager = new SettingsManager(tempDir);
508
- await settingsManager.initialize();
509
-
510
- const lockFileResult = settingsManager.checkPermission("mcp__acp__Edit", {
511
- file_path: path.join(tempDir, "package-lock.json"),
512
- });
513
- expect(lockFileResult.decision).toBe("deny");
514
-
515
- const otherResult = settingsManager.checkPermission("mcp__acp__Edit", {
516
- file_path: path.join(tempDir, "package.json"),
517
- });
518
- expect(otherResult.decision).toBe("ask");
519
- });
520
-
521
- it("should handle mcp__acp__Edit and mcp__acp__Write tool names", async () => {
522
- const claudeDir = path.join(tempDir, ".claude");
523
- await fs.promises.mkdir(claudeDir, { recursive: true });
524
- await fs.promises.writeFile(
525
- path.join(claudeDir, "settings.json"),
526
- JSON.stringify({
527
- permissions: {
528
- allow: ["Edit", "Write"],
529
- },
530
- }),
531
- );
532
-
533
- settingsManager = new SettingsManager(tempDir);
534
- await settingsManager.initialize();
535
-
536
- const editResult = settingsManager.checkPermission("mcp__acp__Edit", {
537
- file_path: "/some/file.ts",
538
- });
539
- expect(editResult.decision).toBe("allow");
540
-
541
- const writeResult = settingsManager.checkPermission("mcp__acp__Write", {
542
- file_path: "/some/file.ts",
543
- });
544
- expect(writeResult.decision).toBe("allow");
545
- });
546
- });
547
-
548
- describe("getSettings", () => {
549
- it("should return merged settings", async () => {
550
- const claudeDir = path.join(tempDir, ".claude");
551
- await fs.promises.mkdir(claudeDir, { recursive: true });
552
- await fs.promises.writeFile(
553
- path.join(claudeDir, "settings.json"),
554
- JSON.stringify({
555
- permissions: {
556
- allow: ["Read", "Bash(npm:*)"],
557
- deny: ["Read(./.env)"],
558
- },
559
- env: {
560
- FOO: "bar",
561
- },
562
- }),
563
- );
564
-
565
- settingsManager = new SettingsManager(tempDir);
566
- await settingsManager.initialize();
567
-
568
- const settings = settingsManager.getSettings();
569
- expect(settings.permissions?.allow).toContain("Read");
570
- expect(settings.permissions?.allow).toContain("Bash(npm:*)");
571
- expect(settings.permissions?.deny).toContain("Read(./.env)");
572
- expect(settings.env?.FOO).toBe("bar");
573
- });
574
- });
575
-
576
- describe("setCwd", () => {
577
- it("should reload settings when cwd changes", async () => {
578
- const claudeDir1 = path.join(tempDir, ".claude");
579
- await fs.promises.mkdir(claudeDir1, { recursive: true });
580
- await fs.promises.writeFile(
581
- path.join(claudeDir1, "settings.json"),
582
- JSON.stringify({
583
- permissions: {
584
- allow: ["Read"],
585
- },
586
- }),
587
- );
588
-
589
- settingsManager = new SettingsManager(tempDir);
590
- await settingsManager.initialize();
591
-
592
- let result = settingsManager.checkPermission("mcp__acp__Read", { file_path: "/file.txt" });
593
- expect(result.decision).toBe("allow");
594
-
595
- // Create a new temp directory with different settings
596
- const tempDir2 = await fs.promises.mkdtemp(path.join(os.tmpdir(), "settings-test-2-"));
597
- const claudeDir2 = path.join(tempDir2, ".claude");
598
- await fs.promises.mkdir(claudeDir2, { recursive: true });
599
- await fs.promises.writeFile(
600
- path.join(claudeDir2, "settings.json"),
601
- JSON.stringify({
602
- permissions: {
603
- deny: ["Read"],
604
- },
605
- }),
606
- );
607
-
608
- await settingsManager.setCwd(tempDir2);
609
-
610
- result = settingsManager.checkPermission("mcp__acp__Read", { file_path: "/file.txt" });
611
- expect(result.decision).toBe("deny");
612
-
613
- // Cleanup second temp dir
614
- await fs.promises.rm(tempDir2, { recursive: true, force: true });
615
- });
616
- });
617
- });