agent-enderun 1.0.8 → 1.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 (304) hide show
  1. package/.enderun/ARCHITECTURE.md +1 -0
  2. package/.enderun/BRAIN_DASHBOARD.md +1 -1
  3. package/.enderun/ENDERUN.md +4 -3
  4. package/.enderun/SECURITY.md +1 -0
  5. package/.enderun/STATUS.md +4 -4
  6. package/.enderun/agents/agent_army_schema.json +71 -77
  7. package/.enderun/agents/analyst.json +32 -0
  8. package/.enderun/agents/backend.json +32 -0
  9. package/.enderun/agents/database.json +32 -0
  10. package/.enderun/agents/devops.json +32 -0
  11. package/.enderun/agents/explorer.json +32 -0
  12. package/.enderun/agents/frontend.json +32 -0
  13. package/.enderun/agents/git.json +32 -0
  14. package/.enderun/agents/manager.json +34 -0
  15. package/.enderun/agents/mobile.json +32 -0
  16. package/.enderun/agents/native.json +32 -0
  17. package/.enderun/agents/quality.json +32 -0
  18. package/.enderun/agents/schema/agent-lifecycle-schema.json +35 -80
  19. package/.enderun/agents/security.json +32 -0
  20. package/.enderun/cli-commands.json +7 -5
  21. package/.enderun/config.json +1 -1
  22. package/.enderun/knowledge/ARCHITECTURE.md +1 -0
  23. package/.enderun/knowledge/SECURITY.md +1 -0
  24. package/.enderun/knowledge/SHIM_TEMPLATE.md +1 -1
  25. package/.enderun/logs/manager.json +1 -0
  26. package/.enderun/memory/PROJECT_MEMORY.md +6 -0
  27. package/.enderun/observability/README.md +1 -1
  28. package/CLAUDE.md +5 -5
  29. package/GEMINI.md +8 -5
  30. package/GROK.md +1 -1
  31. package/README.md +34 -33
  32. package/agent.md +1 -1
  33. package/bin/hermes-sandbox.js +0 -4
  34. package/bin/init-check.js +0 -1
  35. package/bin/validate-agent-army.js +34 -92
  36. package/dist/apps/backend/src/types/index.d.ts +9 -0
  37. package/dist/apps/backend/src/types/index.js +5 -0
  38. package/dist/apps/backend/src/types/index.js.map +1 -0
  39. package/dist/apps/web/src/main.d.ts +1 -0
  40. package/dist/apps/web/src/main.js +9 -0
  41. package/dist/apps/web/src/main.js.map +1 -0
  42. package/dist/apps/web/vite.config.d.ts +2 -0
  43. package/dist/apps/web/vite.config.js +6 -0
  44. package/dist/apps/web/vite.config.js.map +1 -0
  45. package/dist/framework-mcp/src/index.d.ts +1 -0
  46. package/dist/framework-mcp/src/index.js +71 -0
  47. package/dist/framework-mcp/src/index.js.map +1 -0
  48. package/dist/framework-mcp/src/tools/definitions.d.ts +2 -0
  49. package/dist/framework-mcp/src/tools/definitions.js +111 -0
  50. package/dist/framework-mcp/src/tools/definitions.js.map +1 -0
  51. package/dist/framework-mcp/src/tools/file_system/patch_file.d.ts +2 -0
  52. package/dist/framework-mcp/src/tools/file_system/patch_file.js +19 -0
  53. package/dist/framework-mcp/src/tools/file_system/patch_file.js.map +1 -0
  54. package/dist/framework-mcp/src/tools/file_system/read_file.d.ts +2 -0
  55. package/dist/framework-mcp/src/tools/file_system/read_file.js +8 -0
  56. package/dist/framework-mcp/src/tools/file_system/read_file.js.map +1 -0
  57. package/dist/framework-mcp/src/tools/file_system/replace_text.d.ts +2 -0
  58. package/dist/framework-mcp/src/tools/file_system/replace_text.js +32 -0
  59. package/dist/framework-mcp/src/tools/file_system/replace_text.js.map +1 -0
  60. package/dist/framework-mcp/src/tools/file_system/write_file.d.ts +2 -0
  61. package/dist/framework-mcp/src/tools/file_system/write_file.js +10 -0
  62. package/dist/framework-mcp/src/tools/file_system/write_file.js.map +1 -0
  63. package/dist/framework-mcp/src/tools/framework/get_status.d.ts +2 -0
  64. package/dist/framework-mcp/src/tools/framework/get_status.js +6 -0
  65. package/dist/framework-mcp/src/tools/framework/get_status.js.map +1 -0
  66. package/dist/framework-mcp/src/tools/framework/orchestrate.d.ts +2 -0
  67. package/dist/framework-mcp/src/tools/framework/orchestrate.js +6 -0
  68. package/dist/framework-mcp/src/tools/framework/orchestrate.js.map +1 -0
  69. package/dist/framework-mcp/src/tools/framework/update_contract_hash.d.ts +2 -0
  70. package/dist/framework-mcp/src/tools/framework/update_contract_hash.js +6 -0
  71. package/dist/framework-mcp/src/tools/framework/update_contract_hash.js.map +1 -0
  72. package/dist/framework-mcp/src/tools/framework/update_memory.d.ts +2 -0
  73. package/dist/framework-mcp/src/tools/framework/update_memory.js +9 -0
  74. package/dist/framework-mcp/src/tools/framework/update_memory.js.map +1 -0
  75. package/dist/framework-mcp/src/tools/index.d.ts +5 -0
  76. package/dist/framework-mcp/src/tools/index.js +26 -0
  77. package/dist/framework-mcp/src/tools/index.js.map +1 -0
  78. package/dist/framework-mcp/src/tools/messaging/log_action.d.ts +2 -0
  79. package/dist/framework-mcp/src/tools/messaging/log_action.js +23 -0
  80. package/dist/framework-mcp/src/tools/messaging/log_action.js.map +1 -0
  81. package/dist/framework-mcp/src/tools/messaging/send_message.d.ts +2 -0
  82. package/dist/framework-mcp/src/tools/messaging/send_message.js +24 -0
  83. package/dist/framework-mcp/src/tools/messaging/send_message.js.map +1 -0
  84. package/dist/framework-mcp/src/tools/types.d.ts +47 -0
  85. package/dist/framework-mcp/src/tools/types.js +2 -0
  86. package/dist/framework-mcp/src/tools/types.js.map +1 -0
  87. package/dist/framework-mcp/src/utils/cli.d.ts +5 -0
  88. package/dist/framework-mcp/src/utils/cli.js +21 -0
  89. package/dist/framework-mcp/src/utils/cli.js.map +1 -0
  90. package/dist/framework-mcp/src/utils/security.d.ts +12 -0
  91. package/dist/framework-mcp/src/utils/security.js +54 -0
  92. package/dist/framework-mcp/src/utils/security.js.map +1 -0
  93. package/dist/src/cli/adapters.d.ts +32 -0
  94. package/dist/src/cli/adapters.js +264 -0
  95. package/dist/src/cli/adapters.js.map +1 -0
  96. package/dist/src/cli/commands/app.d.ts +4 -0
  97. package/dist/src/cli/commands/app.js +32 -0
  98. package/dist/src/cli/commands/app.js.map +1 -0
  99. package/dist/src/cli/commands/check.d.ts +6 -0
  100. package/dist/src/cli/commands/check.js +110 -0
  101. package/dist/src/cli/commands/check.js.map +1 -0
  102. package/dist/src/cli/commands/compliance.d.ts +1 -0
  103. package/dist/src/cli/commands/compliance.js +51 -0
  104. package/dist/src/cli/commands/compliance.js.map +1 -0
  105. package/dist/src/cli/commands/contract.d.ts +8 -0
  106. package/dist/src/cli/commands/contract.js +73 -0
  107. package/dist/src/cli/commands/contract.js.map +1 -0
  108. package/dist/src/cli/commands/explorer.d.ts +2 -0
  109. package/dist/src/cli/commands/explorer.js +43 -0
  110. package/dist/src/cli/commands/explorer.js.map +1 -0
  111. package/dist/src/cli/commands/git.d.ts +2 -0
  112. package/dist/src/cli/commands/git.js +41 -0
  113. package/dist/src/cli/commands/git.js.map +1 -0
  114. package/dist/src/cli/commands/init.d.ts +1 -0
  115. package/dist/src/cli/commands/init.js +338 -0
  116. package/dist/src/cli/commands/init.js.map +1 -0
  117. package/dist/src/cli/commands/knowledge.d.ts +2 -0
  118. package/dist/src/cli/commands/knowledge.js +43 -0
  119. package/dist/src/cli/commands/knowledge.js.map +1 -0
  120. package/dist/src/cli/commands/lint.d.ts +4 -0
  121. package/dist/src/cli/commands/lint.js +24 -0
  122. package/dist/src/cli/commands/lint.js.map +1 -0
  123. package/dist/src/cli/commands/log.d.ts +9 -0
  124. package/dist/src/cli/commands/log.js +33 -0
  125. package/dist/src/cli/commands/log.js.map +1 -0
  126. package/dist/src/cli/commands/memory.d.ts +1 -0
  127. package/dist/src/cli/commands/memory.js +72 -0
  128. package/dist/src/cli/commands/memory.js.map +1 -0
  129. package/dist/src/cli/commands/orchestrate.d.ts +1 -0
  130. package/dist/src/cli/commands/orchestrate.js +111 -0
  131. package/dist/src/cli/commands/orchestrate.js.map +1 -0
  132. package/dist/src/cli/commands/script.d.ts +1 -0
  133. package/dist/src/cli/commands/script.js +20 -0
  134. package/dist/src/cli/commands/script.js.map +1 -0
  135. package/dist/src/cli/commands/security.d.ts +1 -0
  136. package/dist/src/cli/commands/security.js +37 -0
  137. package/dist/src/cli/commands/security.js.map +1 -0
  138. package/dist/src/cli/commands/status.d.ts +4 -0
  139. package/dist/src/cli/commands/status.js +56 -0
  140. package/dist/src/cli/commands/status.js.map +1 -0
  141. package/dist/src/cli/commands/trace.d.ts +4 -0
  142. package/dist/src/cli/commands/trace.js +42 -0
  143. package/dist/src/cli/commands/trace.js.map +1 -0
  144. package/dist/src/cli/index.d.ts +2 -0
  145. package/dist/src/cli/index.js +117 -0
  146. package/dist/src/cli/index.js.map +1 -0
  147. package/dist/src/cli/utils/app.d.ts +33 -0
  148. package/dist/src/cli/utils/app.js +710 -0
  149. package/dist/src/cli/utils/app.js.map +1 -0
  150. package/dist/src/cli/utils/claude.d.ts +8 -0
  151. package/dist/src/cli/utils/claude.js +56 -0
  152. package/dist/src/cli/utils/claude.js.map +1 -0
  153. package/dist/src/cli/utils/fs.d.ts +11 -0
  154. package/dist/src/cli/utils/fs.js +144 -0
  155. package/dist/src/cli/utils/fs.js.map +1 -0
  156. package/dist/src/cli/utils/memory.d.ts +14 -0
  157. package/dist/src/cli/utils/memory.js +173 -0
  158. package/dist/src/cli/utils/memory.js.map +1 -0
  159. package/dist/src/cli/utils/pkg.d.ts +24 -0
  160. package/dist/src/cli/utils/pkg.js +254 -0
  161. package/dist/src/cli/utils/pkg.js.map +1 -0
  162. package/dist/src/cli/utils/string.d.ts +6 -0
  163. package/dist/src/cli/utils/string.js +44 -0
  164. package/dist/src/cli/utils/string.js.map +1 -0
  165. package/dist/src/cli/utils/time.d.ts +2 -0
  166. package/dist/src/cli/utils/time.js +28 -0
  167. package/dist/src/cli/utils/time.js.map +1 -0
  168. package/dist/tests/adapter.test.d.ts +1 -0
  169. package/dist/tests/adapter.test.js +80 -0
  170. package/dist/tests/adapter.test.js.map +1 -0
  171. package/dist/tests/framework-init-test/framework-mcp/src/index.d.ts +1 -0
  172. package/dist/tests/framework-init-test/framework-mcp/src/index.js +71 -0
  173. package/dist/tests/framework-init-test/framework-mcp/src/index.js.map +1 -0
  174. package/dist/tests/framework-init-test/framework-mcp/src/tools/definitions.d.ts +2 -0
  175. package/dist/tests/framework-init-test/framework-mcp/src/tools/definitions.js +111 -0
  176. package/dist/tests/framework-init-test/framework-mcp/src/tools/definitions.js.map +1 -0
  177. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/patch_file.d.ts +2 -0
  178. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/patch_file.js +19 -0
  179. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/patch_file.js.map +1 -0
  180. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/read_file.d.ts +2 -0
  181. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/read_file.js +8 -0
  182. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/read_file.js.map +1 -0
  183. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/replace_text.d.ts +2 -0
  184. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/replace_text.js +32 -0
  185. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/replace_text.js.map +1 -0
  186. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/write_file.d.ts +2 -0
  187. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/write_file.js +10 -0
  188. package/dist/tests/framework-init-test/framework-mcp/src/tools/file_system/write_file.js.map +1 -0
  189. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/get_status.d.ts +2 -0
  190. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/get_status.js +6 -0
  191. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/get_status.js.map +1 -0
  192. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/orchestrate.d.ts +2 -0
  193. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/orchestrate.js +6 -0
  194. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/orchestrate.js.map +1 -0
  195. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/update_contract_hash.d.ts +2 -0
  196. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/update_contract_hash.js +6 -0
  197. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/update_contract_hash.js.map +1 -0
  198. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/update_memory.d.ts +2 -0
  199. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/update_memory.js +9 -0
  200. package/dist/tests/framework-init-test/framework-mcp/src/tools/framework/update_memory.js.map +1 -0
  201. package/dist/tests/framework-init-test/framework-mcp/src/tools/index.d.ts +5 -0
  202. package/dist/tests/framework-init-test/framework-mcp/src/tools/index.js +26 -0
  203. package/dist/tests/framework-init-test/framework-mcp/src/tools/index.js.map +1 -0
  204. package/dist/tests/framework-init-test/framework-mcp/src/tools/messaging/log_action.d.ts +2 -0
  205. package/dist/tests/framework-init-test/framework-mcp/src/tools/messaging/log_action.js +23 -0
  206. package/dist/tests/framework-init-test/framework-mcp/src/tools/messaging/log_action.js.map +1 -0
  207. package/dist/tests/framework-init-test/framework-mcp/src/tools/messaging/send_message.d.ts +2 -0
  208. package/dist/tests/framework-init-test/framework-mcp/src/tools/messaging/send_message.js +24 -0
  209. package/dist/tests/framework-init-test/framework-mcp/src/tools/messaging/send_message.js.map +1 -0
  210. package/dist/tests/framework-init-test/framework-mcp/src/tools/types.d.ts +47 -0
  211. package/dist/tests/framework-init-test/framework-mcp/src/tools/types.js +2 -0
  212. package/dist/tests/framework-init-test/framework-mcp/src/tools/types.js.map +1 -0
  213. package/dist/tests/framework-init-test/framework-mcp/src/utils/cli.d.ts +5 -0
  214. package/dist/tests/framework-init-test/framework-mcp/src/utils/cli.js +21 -0
  215. package/dist/tests/framework-init-test/framework-mcp/src/utils/cli.js.map +1 -0
  216. package/dist/tests/framework-init-test/framework-mcp/src/utils/security.d.ts +12 -0
  217. package/dist/tests/framework-init-test/framework-mcp/src/utils/security.js +54 -0
  218. package/dist/tests/framework-init-test/framework-mcp/src/utils/security.js.map +1 -0
  219. package/dist/tests/framework-init-test/framework-mcp/tests/tools/file_system/replace_text.test.d.ts +1 -0
  220. package/dist/tests/framework-init-test/framework-mcp/tests/tools/file_system/replace_text.test.js +69 -0
  221. package/dist/tests/framework-init-test/framework-mcp/tests/tools/file_system/replace_text.test.js.map +1 -0
  222. package/dist/tests/framework-init-test/panda.config.d.ts +4 -0
  223. package/dist/tests/framework-init-test/panda.config.js +95 -0
  224. package/dist/tests/framework-init-test/panda.config.js.map +1 -0
  225. package/dist/tests/framework-init-test/vitest.config.d.ts +2 -0
  226. package/dist/tests/framework-init-test/vitest.config.js +19 -0
  227. package/dist/tests/framework-init-test/vitest.config.js.map +1 -0
  228. package/dist/tests/gemini.test.d.ts +1 -0
  229. package/dist/tests/gemini.test.js +38 -0
  230. package/dist/tests/gemini.test.js.map +1 -0
  231. package/dist/tests/initial.test.d.ts +1 -0
  232. package/dist/tests/initial.test.js +7 -0
  233. package/dist/tests/initial.test.js.map +1 -0
  234. package/dist/vitest.config.d.ts +2 -0
  235. package/dist/vitest.config.js +19 -0
  236. package/dist/vitest.config.js.map +1 -0
  237. package/eslint.config.js +1 -1
  238. package/framework-mcp/dist/index.js +2 -2
  239. package/framework-mcp/dist/src/index.js +70 -0
  240. package/framework-mcp/dist/src/tools/definitions.js +110 -0
  241. package/framework-mcp/dist/src/tools/file_system/patch_file.js +18 -0
  242. package/framework-mcp/dist/src/tools/file_system/read_file.js +7 -0
  243. package/framework-mcp/dist/src/tools/file_system/replace_text.js +31 -0
  244. package/framework-mcp/dist/src/tools/file_system/write_file.js +9 -0
  245. package/framework-mcp/dist/src/tools/framework/get_status.js +5 -0
  246. package/framework-mcp/dist/src/tools/framework/orchestrate.js +5 -0
  247. package/framework-mcp/dist/src/tools/framework/update_contract_hash.js +5 -0
  248. package/framework-mcp/dist/src/tools/framework/update_memory.js +8 -0
  249. package/framework-mcp/dist/src/tools/index.js +25 -0
  250. package/framework-mcp/dist/src/tools/messaging/log_action.js +22 -0
  251. package/framework-mcp/dist/src/tools/messaging/send_message.js +46 -0
  252. package/framework-mcp/dist/src/tools/types.js +1 -0
  253. package/framework-mcp/dist/src/utils/cli.js +20 -0
  254. package/framework-mcp/dist/src/utils/security.js +53 -0
  255. package/framework-mcp/dist/tests/tools/file_system/replace_text.test.js +68 -0
  256. package/framework-mcp/dist/tools/definitions.js +1 -0
  257. package/framework-mcp/dist/tools/file_system/replace_text.js +18 -1
  258. package/framework-mcp/dist/tools/framework/get_status.js +2 -2
  259. package/framework-mcp/dist/tools/framework/orchestrate.js +2 -2
  260. package/framework-mcp/dist/tools/framework/update_contract_hash.js +2 -2
  261. package/framework-mcp/dist/tools/framework/update_memory.js +1 -1
  262. package/framework-mcp/dist/tools/messaging/send_message.js +4 -2
  263. package/framework-mcp/dist/utils/cli.js +2 -2
  264. package/framework-mcp/dist/utils/security.js +23 -5
  265. package/framework-mcp/package.json +3 -3
  266. package/framework-mcp/src/index.ts +2 -2
  267. package/framework-mcp/src/tools/definitions.ts +1 -0
  268. package/framework-mcp/src/tools/file_system/replace_text.ts +21 -1
  269. package/framework-mcp/src/tools/framework/get_status.ts +3 -3
  270. package/framework-mcp/src/tools/framework/orchestrate.ts +3 -3
  271. package/framework-mcp/src/tools/framework/update_contract_hash.ts +3 -3
  272. package/framework-mcp/src/tools/framework/update_memory.ts +1 -1
  273. package/framework-mcp/src/tools/messaging/send_message.ts +37 -13
  274. package/framework-mcp/src/tools/types.ts +3 -0
  275. package/framework-mcp/src/utils/cli.ts +2 -2
  276. package/framework-mcp/src/utils/security.ts +23 -5
  277. package/framework-mcp/tests/tools/file_system/replace_text.test.js +68 -0
  278. package/framework-mcp/tests/tools/file_system/replace_text.test.ts +77 -0
  279. package/framework-mcp/tsconfig.json +1 -2
  280. package/mcp.json +4 -4
  281. package/package.json +4 -3
  282. package/src/cli/adapters.ts +16 -9
  283. package/src/cli/commands/contract.ts +2 -2
  284. package/src/cli/commands/init.ts +211 -432
  285. package/src/cli/commands/memory.ts +5 -0
  286. package/src/cli/commands/orchestrate.ts +53 -0
  287. package/src/cli/index.ts +99 -19
  288. package/src/cli/utils/app.ts +19 -16
  289. package/src/cli/utils/claude.ts +2 -1
  290. package/src/cli/utils/fs.ts +2 -1
  291. package/src/cli/utils/memory.ts +2 -2
  292. package/src/cli/utils/pkg.ts +32 -0
  293. package/.enderun/agents/analyst.md +0 -32
  294. package/.enderun/agents/backend.md +0 -49
  295. package/.enderun/agents/database.md +0 -41
  296. package/.enderun/agents/devops.md +0 -41
  297. package/.enderun/agents/explorer.md +0 -40
  298. package/.enderun/agents/frontend.md +0 -48
  299. package/.enderun/agents/git.md +0 -41
  300. package/.enderun/agents/manager.md +0 -43
  301. package/.enderun/agents/mobile.md +0 -42
  302. package/.enderun/agents/native.md +0 -41
  303. package/.enderun/agents/quality.md +0 -40
  304. package/.enderun/agents/security.md +0 -32
@@ -8,26 +8,24 @@ import path from "path";
8
8
  * - .enderun/agents/ or .agent/skills/ or .grok/plugins/ etc.
9
9
  */
10
10
  const AGENT_FOLDER_NAMES = ["agents", "skills", "plugins"];
11
-
12
11
  const FRAMEWORK_CANDIDATES = [
12
+ ".enderun",
13
13
  ".gemini/antigravity",
14
14
  ".gemini/antigravity-cli",
15
15
  ".gemini",
16
16
  ".claude",
17
17
  ".grok",
18
18
  ".agent",
19
- ".enderun",
20
- ".agents",
21
- ".cursor",
19
+ ".agents"
22
20
  ];
23
21
 
24
22
  /**
25
23
  * Robust detection that works no matter which adapter was used with `init`.
26
- * Returns the actual location of the army .md files + the army schema.
27
24
  */
28
25
  function detectFrameworkDir() {
26
+ const projectRoot = process.cwd();
29
27
  for (const dir of FRAMEWORK_CANDIDATES) {
30
- const dirPath = path.resolve(dir);
28
+ const dirPath = path.resolve(projectRoot, dir);
31
29
  if (!fs.existsSync(dirPath)) continue;
32
30
 
33
31
  for (const folderName of AGENT_FOLDER_NAMES) {
@@ -53,33 +51,23 @@ function detectFrameworkDir() {
53
51
  return { frameworkDir: dir, agentsDir: agentsPath, schemaPath };
54
52
  }
55
53
  }
56
-
57
- // Rare: .md files directly in the framework root
58
- const directMds = fs.readdirSync(dirPath).filter(f => f.endsWith(".md") && !f.startsWith("AGENTS"));
59
- if (directMds.length > 0) {
60
- const schemaPath = path.join(dirPath, "agent_army_schema.json");
61
- if (fs.existsSync(schemaPath)) {
62
- return { frameworkDir: dir, agentsDir: dirPath, schemaPath };
63
- }
64
- }
65
54
  }
66
55
  return null;
67
56
  }
68
57
 
69
- function findSchemaRecursive(startDir) {
58
+ function findSchemaRecursive(dirPath) {
70
59
  try {
71
- const entries = fs.readdirSync(startDir, { withFileTypes: true });
60
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
72
61
  for (const entry of entries) {
73
- const full = path.join(startDir, entry.name);
74
- if (entry.isDirectory()) {
75
- if (entry.name === "node_modules" || entry.name === "dist") continue;
62
+ const full = path.join(dirPath, entry.name);
63
+ if (entry.isDirectory() && !entry.name.startsWith(".")) {
76
64
  const found = findSchemaRecursive(full);
77
65
  if (found) return found;
78
66
  } else if (entry.name === "agent_army_schema.json") {
79
67
  return full;
80
68
  }
81
69
  }
82
- } catch {}
70
+ } catch { /* ignore: non-critical file system access issues during recursive search */ }
83
71
  return null;
84
72
  }
85
73
 
@@ -89,98 +77,52 @@ if (!detected) {
89
77
  process.exit(1);
90
78
  }
91
79
 
92
- const { frameworkDir, agentsDir, schemaPath } = detected;
93
-
94
- console.log(`🛡️ STARTING AUTOMATED AGENT ARMY VALIDATION (${frameworkDir})...`);
95
- console.log(` Agents: ${agentsDir}`);
96
- console.log(` Schema: ${schemaPath}`);
80
+ const { agentsDir, schemaPath } = detected;
97
81
 
98
82
  try {
99
- const schema = JSON.parse(fs.readFileSync(schemaPath, "utf8"));
100
- const requiredKeys = schema.required || ["name", "description"];
83
+ fs.readFileSync(schemaPath, "utf8");
101
84
  const files = fs.readdirSync(agentsDir);
85
+
102
86
  let totalFailed = 0;
103
87
 
88
+ console.log(`🛡️ STARTING AUTOMATED AGENT ARMY VALIDATION (${detected.frameworkDir})...`);
89
+ console.log(` Agents: ${agentsDir}`);
90
+ console.log(` Schema: ${schemaPath}`);
104
91
  console.log("--------------------------------------------------");
105
92
  console.log("| Agent ID | Status | Score | Category |");
106
93
  console.log("--------------------------------------------------");
107
94
 
108
95
  for (const fileName of files) {
109
- if (!fileName.endsWith(".md")) continue;
96
+ if (fileName === "agent_army_schema.json") continue;
97
+ if (!fileName.endsWith(".json")) continue;
98
+
110
99
  const filePath = path.join(agentsDir, fileName);
111
100
  const content = fs.readFileSync(filePath, "utf8");
112
101
 
113
- const match = content.match(/^---\n([\s\S]*?)\n---/);
114
- if (!match) {
115
- console.log(`| ${fileName.padEnd(9)} | ❌ NO YAML | ----- | ---------------- |`);
102
+ let agent;
103
+ try {
104
+ agent = JSON.parse(content);
105
+ } catch (e) {
106
+ console.log(`| ${fileName.padEnd(9)} | ❌ INVALID JSON | ----- | ${String(e).slice(0, 16)} |`);
116
107
  totalFailed++;
117
108
  continue;
118
109
  }
119
110
 
120
- const yamlContent = match[1];
121
- const agent = {};
122
- yamlContent.split("\n").forEach((line) => {
123
- const [key, ...valParts] = line.split(":");
124
- if (key && valParts.length > 0) {
125
- const k = key.trim();
126
- let val = valParts.join(":").trim();
127
- if (val.startsWith("[") && val.endsWith("]")) {
128
- try { val = JSON.parse(val.replace(/'/g, "\"")); } catch { /* ignore */ }
129
- } else if (val === "") {
130
- val = {};
131
- }
132
- if (typeof val === "string" && !isNaN(val) && val !== "") {
133
- agent[k] = Number(val);
134
- } else {
135
- agent[k] = val;
136
- }
137
- }
138
- });
139
-
140
- // AL fields (stateMachine + tags) – the key part of this validator
141
- if (yamlContent.includes("stateMachine:") && yamlContent.includes("schemaRef:")) {
142
- const schemaMatch = yamlContent.match(/schemaRef:\s*"(.*)"/);
143
- if (schemaMatch) {
144
- agent.stateMachine = { schemaRef: schemaMatch[1] };
145
- }
146
- }
147
-
148
- if (typeof agent.tags === "string" && agent.tags.startsWith("[")) {
149
- try { agent.tags = JSON.parse(agent.tags.replace(/'/g, "\"")); } catch { /* ignore */ }
150
- }
151
-
152
- if (agent.name === undefined) {
153
- const nameMatch = yamlContent.match(/name:\s*(.*)/);
154
- if (nameMatch) agent.name = nameMatch[1].trim().replace(/^['"]|['"]$/g, "");
155
- }
156
-
157
- // Registry cross-check (optional but nice)
158
- const registryPath = path.resolve(frameworkDir, "registry/agents.yaml");
159
- let registryApproved = true;
160
- if (fs.existsSync(registryPath)) {
161
- const registry = fs.readFileSync(registryPath, "utf8");
162
- if (!registry.includes(`name: ${agent.name}`)) {
163
- registryApproved = false;
164
- }
165
- }
166
-
167
- const missing = requiredKeys.filter((k) => agent[k] === undefined);
168
- if (!registryApproved) missing.push("Registry (not found)");
169
-
170
- if (agent.stateMachine && typeof agent.stateMachine !== "object") {
171
- missing.push("stateMachine (invalid)");
172
- }
173
- if (!agent.tags || !Array.isArray(agent.tags)) {
174
- missing.push("tags (missing)");
175
- }
111
+ // Validate basic required fields for AL compliance
112
+ const missing = [];
113
+ if (!agent.name) missing.push("name");
114
+ if (!agent.role) missing.push("role");
115
+ if (agent.capability === undefined) missing.push("capability");
116
+ if (!agent.stateMachine || !agent.stateMachine.schemaRef) missing.push("stateMachine");
117
+ if (!agent.tags || !Array.isArray(agent.tags)) missing.push("tags");
176
118
 
177
119
  if (missing.length > 0) {
178
- console.log(`| ${fileName.replace(".md", "").padEnd(9)} | ❌ FAILED | ----- | ${missing.join(",").slice(0, 16)} |`);
120
+ console.log(`| ${fileName.padEnd(9)} | ❌ FAILED | ----- | ${missing.join(",").slice(0, 15)} |`);
179
121
  totalFailed++;
180
122
  } else {
181
- const displayCap = agent.capability || "-";
182
- const displayRole = (agent.role || agent.name || "").substring(0, 14);
183
- console.log(`| ${agent.name.padEnd(9)} | ✅ PASSED | ${String(displayCap).padEnd(5)} | ${displayRole.padEnd(14)} |`);
123
+ const category = (agent.tags[0] || "core").padEnd(14);
124
+ const score = String(agent.capability || 0).padStart(5);
125
+ console.log(`| ${agent.name.padEnd(9)} | ✅ PASSED | ${score} | ${category} |`);
184
126
  }
185
127
  }
186
128
 
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Agent Enderun Shared Contracts
3
+ */
4
+ export type UserID = string & {
5
+ __brand: "UserID";
6
+ };
7
+ export type TraceID = string & {
8
+ __brand: "TraceID";
9
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Agent Enderun Shared Contracts
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../apps/backend/src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ const rootElement = document.getElementById("root");
4
+ if (rootElement) {
5
+ ReactDOM.createRoot(rootElement).render(<React.StrictMode>
6
+ <h1>Agent Enderun Web Active</h1>
7
+ </React.StrictMode>);
8
+ }
9
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../apps/web/src/main.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AAExC,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AACpD,IAAI,WAAW,EAAE,CAAC;IACd,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,MAAM,CACnC,CAAC,KAAK,CAAC,UAAU,CACb;YAAA,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,CACpC;QAAA,EAAE,KAAK,CAAC,UAAU,CAAC,CACtB,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+ export default defineConfig({
4
+ plugins: [react()],
5
+ });
6
+ //# sourceMappingURL=vite.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.config.js","sourceRoot":"","sources":["../../../apps/web/vite.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAEzC,eAAe,YAAY,CAAC;IACxB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC;CACrB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
4
+ import { TOOLS, toolHandlers } from "./tools/index.js";
5
+ // ─── Server Setup ─────────────────────────────────────────────────
6
+ const server = new Server({
7
+ name: "@agent-enderun/mcp",
8
+ version: "1.0.9",
9
+ }, {
10
+ capabilities: {
11
+ tools: {},
12
+ },
13
+ });
14
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
15
+ return { tools: TOOLS };
16
+ });
17
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
18
+ const typedRequest = request;
19
+ const { name, arguments: args } = typedRequest.params;
20
+ const projectRoot = process.env.ENDERUN_PROJECT_ROOT || process.cwd();
21
+ try {
22
+ const handler = toolHandlers[name];
23
+ if (!handler) {
24
+ return {
25
+ isError: true,
26
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
27
+ };
28
+ }
29
+ return handler(projectRoot, args || {});
30
+ }
31
+ catch (error) {
32
+ const message = error instanceof Error ? error.message : "Unknown error occurred";
33
+ return {
34
+ isError: true,
35
+ content: [{ type: "text", text: message }],
36
+ };
37
+ }
38
+ });
39
+ // ─── Graceful Startup & Shutdown ──────────────────────────────────
40
+ async function run() {
41
+ const transport = new StdioServerTransport();
42
+ // Prevent unhandled errors from crashing the MCP stream
43
+ process.on("uncaughtException", (error) => {
44
+ process.stderr.write(`[agent-enderun-mcp] Uncaught exception: ${error.message}
45
+ `);
46
+ });
47
+ process.on("unhandledRejection", (reason) => {
48
+ const message = reason instanceof Error ? reason.message : String(reason);
49
+ process.stderr.write(`[agent-enderun-mcp] Unhandled rejection: ${message}
50
+ `);
51
+ });
52
+ // Graceful shutdown on SIGINT/SIGTERM
53
+ const shutdown = async () => {
54
+ try {
55
+ await server.close();
56
+ }
57
+ catch {
58
+ // Already closed or failed — safe to ignore
59
+ }
60
+ process.exit(0);
61
+ };
62
+ process.on("SIGINT", shutdown);
63
+ process.on("SIGTERM", shutdown);
64
+ await server.connect(transport);
65
+ }
66
+ run().catch((error) => {
67
+ process.stderr.write(`[agent-enderun-mcp] Fatal startup error: ${error.message}
68
+ `);
69
+ process.exit(1);
70
+ });
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../framework-mcp/src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ToolDefinition } from "../tools/types.js";
2
+ export declare const TOOLS: ToolDefinition[];
@@ -0,0 +1,111 @@
1
+ export const TOOLS = [
2
+ {
3
+ name: "read_file",
4
+ description: "Read the content of a file within the project.",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ path: { type: "string", description: "Path to the file relative to project root" },
9
+ },
10
+ required: ["path"],
11
+ },
12
+ },
13
+ {
14
+ name: "write_file",
15
+ description: "Write content to a file. Creates directories if missing.",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ path: { type: "string", description: "Path to the file relative to project root" },
20
+ content: { type: "string", description: "Complete content of the file" },
21
+ },
22
+ required: ["path", "content"],
23
+ },
24
+ },
25
+ {
26
+ name: "replace_text",
27
+ description: "Surgically replace a string in a file with another string.",
28
+ inputSchema: {
29
+ type: "object",
30
+ properties: {
31
+ path: { type: "string", description: "Path to the file" },
32
+ oldText: { type: "string", description: "The exact text to find" },
33
+ newText: { type: "string", description: "The text to replace it with" },
34
+ },
35
+ required: ["path", "oldText", "newText"],
36
+ },
37
+ },
38
+ {
39
+ name: "patch_file",
40
+ description: "Safely update a file by replacing a specific line range with new content.",
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {
44
+ path: { type: "string", description: "Path to the file" },
45
+ startLine: { type: "number", description: "Starting line number (1-indexed)" },
46
+ endLine: { type: "number", description: "Ending line number (inclusive)" },
47
+ newContent: { type: "string", description: "The new lines to insert" },
48
+ },
49
+ required: ["path", "startLine", "endLine", "newContent"],
50
+ },
51
+ },
52
+ {
53
+ name: "get_framework_status",
54
+ description: "Get the current project phase, active traces, and agent states.",
55
+ inputSchema: { type: "object", properties: {} },
56
+ },
57
+ {
58
+ name: "update_project_memory",
59
+ description: "Update a specific section in PROJECT_MEMORY.md.",
60
+ inputSchema: {
61
+ type: "object",
62
+ properties: {
63
+ section: { type: "string", description: "Section name (e.g., HISTORY, ACTIVE TASKS)" },
64
+ content: { type: "string", description: "Markdown content to append or set" },
65
+ },
66
+ required: ["section", "content"],
67
+ },
68
+ },
69
+ {
70
+ name: "orchestrate_loop",
71
+ description: "Process the pending Hermes messages and trigger dynamic state transitions.",
72
+ inputSchema: { type: "object", properties: {} },
73
+ },
74
+ {
75
+ name: "send_agent_message",
76
+ description: "Send a Hermes protocol message to another agent.",
77
+ inputSchema: {
78
+ type: "object",
79
+ properties: {
80
+ from: { type: "string", description: "Sender agent (e.g., @manager, @backend). Defaults to @mcp if omitted." },
81
+ to: { type: "string", description: "Target agent (e.g., @backend, @qa)" },
82
+ category: { type: "string", enum: ["ACTION", "DELEGATION", "INFO", "ALERT"] },
83
+ content: { type: "string", description: "Message content" },
84
+ traceId: { type: "string", description: "Active Trace ID" },
85
+ },
86
+ required: ["to", "category", "content", "traceId"],
87
+ },
88
+ },
89
+ {
90
+ name: "log_agent_action",
91
+ description: "Log an agent action to the framework logs.",
92
+ inputSchema: {
93
+ type: "object",
94
+ properties: {
95
+ agent: { type: "string", description: "The agent name (e.g., @manager, @backend)" },
96
+ action: { type: "string", description: "Action type or name" },
97
+ traceId: { type: "string", description: "The active Trace ID" },
98
+ status: { type: "string", enum: ["SUCCESS", "FAILURE"], description: "The status of the action" },
99
+ summary: { type: "string", description: "Brief description of the action taken" },
100
+ findings: { type: "string", description: "Optional comma-separated findings or details" }
101
+ },
102
+ required: ["agent", "action", "traceId", "status", "summary"]
103
+ }
104
+ },
105
+ {
106
+ name: "update_contract_hash",
107
+ description: "Re-generate and synchronize the backend contract SHA-256 hash.",
108
+ inputSchema: { type: "object", properties: {} }
109
+ }
110
+ ];
111
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../../framework-mcp/src/tools/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handlePatchFile(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,19 @@
1
+ import fs from "fs";
2
+ import { safePath } from "../../utils/security.js";
3
+ export function handlePatchFile(projectRoot, args) {
4
+ const filePath = safePath(projectRoot, args.path);
5
+ const lines = fs.readFileSync(filePath, "utf8").split("\n");
6
+ const start = args.startLine - 1;
7
+ const end = args.endLine;
8
+ const newContent = args.newContent.split("\n");
9
+ if (start < 0 || start > lines.length) {
10
+ throw new Error(`Invalid start line: ${start + 1}. File has ${lines.length} lines.`);
11
+ }
12
+ if (end < start + 1 || end > lines.length) {
13
+ throw new Error(`Invalid end line: ${end}. Must be between ${start + 1} and ${lines.length}.`);
14
+ }
15
+ lines.splice(start, end - start, ...newContent);
16
+ fs.writeFileSync(filePath, lines.join("\n"));
17
+ return { content: [{ type: "text", text: `✅ File patched successfully: ${args.path}` }] };
18
+ }
19
+ //# sourceMappingURL=patch_file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch_file.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/file_system/patch_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,IAAc;IAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAI,IAAI,CAAC,SAAoB,GAAG,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAiB,CAAC;IACnC,MAAM,UAAU,GAAI,IAAI,CAAC,UAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3D,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,GAAG,CAAC,cAAc,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,qBAAqB,KAAK,GAAG,CAAC,QAAQ,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gCAAgC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handleReadFile(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,8 @@
1
+ import fs from "fs";
2
+ import { safePath } from "../../utils/security.js";
3
+ export function handleReadFile(projectRoot, args) {
4
+ const filePath = safePath(projectRoot, args.path);
5
+ const content = fs.readFileSync(filePath, "utf8");
6
+ return { content: [{ type: "text", text: content }] };
7
+ }
8
+ //# sourceMappingURL=read_file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read_file.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/file_system/read_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,IAAc;IAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handleReplaceText(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,32 @@
1
+ import fs from "fs";
2
+ import { safePath } from "../../utils/security.js";
3
+ export function handleReplaceText(projectRoot, args) {
4
+ const filePath = safePath(projectRoot, args.path);
5
+ let content = fs.readFileSync(filePath, "utf8");
6
+ const oldText = args.oldText;
7
+ const newText = args.newText;
8
+ const allowMultiple = args.allowMultiple || false; // Default to false
9
+ if (!content.includes(oldText)) {
10
+ throw new Error(`Text not found in file: ${oldText.slice(0, 100)}...`);
11
+ }
12
+ // Surgical precision guard: reject ambiguous replacements unless allowMultiple is true.
13
+ if (!allowMultiple) {
14
+ const firstIndex = content.indexOf(oldText);
15
+ const lastIndex = content.lastIndexOf(oldText);
16
+ if (firstIndex !== lastIndex) {
17
+ const count = (content.match(new RegExp(oldText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length;
18
+ throw new Error(`Ambiguous replacement: "${oldText.slice(0, 80)}..." found ${count} times in ${args.path}. ` +
19
+ "Provide a longer, unique context string or set 'allow_multiple' to true.");
20
+ }
21
+ }
22
+ // Perform replacement(s)
23
+ if (allowMultiple) {
24
+ content = content.replace(new RegExp(oldText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), newText);
25
+ }
26
+ else {
27
+ content = content.replace(oldText, newText);
28
+ }
29
+ fs.writeFileSync(filePath, content);
30
+ return { content: [{ type: "text", text: `✅ Surgical edit successful in ${args.path}` }] };
31
+ }
32
+ //# sourceMappingURL=replace_text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace_text.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/file_system/replace_text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,IAAc;IACjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC;IAC5D,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC,mBAAmB;IAEtE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED,wFAAwF;IACxF,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC5G,MAAM,IAAI,KAAK,CACX,2BAA2B,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,KAAK,aAAa,IAAI,CAAC,IAAI,IAAI;gBAC5F,0EAA0E,CAC7E,CAAC;QACN,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,IAAI,aAAa,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxG,CAAC;SAAM,CAAC;QACJ,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handleWriteFile(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,10 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { safePath } from "../../utils/security.js";
4
+ export function handleWriteFile(projectRoot, args) {
5
+ const filePath = safePath(projectRoot, args.path);
6
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
7
+ fs.writeFileSync(filePath, args.content);
8
+ return { content: [{ type: "text", text: `✅ File written: ${args.path}` }] };
9
+ }
10
+ //# sourceMappingURL=write_file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write_file.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/file_system/write_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,IAAc;IAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC;IAC5D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAiB,CAAC,CAAC;IACnD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handleGetFrameworkStatus(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,6 @@
1
+ import { safeExec } from "../../utils/cli.js";
2
+ export function handleGetFrameworkStatus(projectRoot, args) {
3
+ const output = safeExec("npx", ["agent-enderun", "status"], projectRoot, args.timeout);
4
+ return { content: [{ type: "text", text: output }] };
5
+ }
6
+ //# sourceMappingURL=get_status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get_status.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/framework/get_status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,UAAU,wBAAwB,CAAC,WAAmB,EAAE,IAAc;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handleOrchestrateLoop(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,6 @@
1
+ import { safeExec } from "../../utils/cli.js";
2
+ export function handleOrchestrateLoop(projectRoot, args) {
3
+ const output = safeExec("npx", ["agent-enderun", "orchestrate"], projectRoot, args.timeout);
4
+ return { content: [{ type: "text", text: output }] };
5
+ }
6
+ //# sourceMappingURL=orchestrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/framework/orchestrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,IAAc;IACrE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handleUpdateContractHash(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,6 @@
1
+ import { safeExec } from "../../utils/cli.js";
2
+ export function handleUpdateContractHash(projectRoot, args) {
3
+ const output = safeExec("npx", ["agent-enderun", "update-contract"], projectRoot, args.timeout);
4
+ return { content: [{ type: "text", text: output }] };
5
+ }
6
+ //# sourceMappingURL=update_contract_hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_contract_hash.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/framework/update_contract_hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,UAAU,wBAAwB,CAAC,WAAmB,EAAE,IAAc;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAChG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ToolArgs, ToolResult } from "../types.js";
2
+ export declare function handleUpdateProjectMemory(projectRoot: string, args: ToolArgs): ToolResult;
@@ -0,0 +1,9 @@
1
+ import { safeExec } from "../../utils/cli.js";
2
+ export function handleUpdateProjectMemory(projectRoot, args) {
3
+ const section = args.section;
4
+ const content = args.content;
5
+ // Using execFileSync with array args prevents command injection
6
+ safeExec("npx", ["agent-enderun", "update_project_memory", section, content], projectRoot, args.timeout);
7
+ return { content: [{ type: "text", text: `✅ Section ${section} updated.` }] };
8
+ }
9
+ //# sourceMappingURL=update_memory.js.map