agent-enderun 1.10.2 → 1.11.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 (322) hide show
  1. package/README.md +34 -44
  2. package/dist/framework-mcp/src/constants.d.ts +47 -0
  3. package/dist/framework-mcp/src/constants.js +65 -0
  4. package/dist/framework-mcp/src/constants.js.map +1 -0
  5. package/dist/framework-mcp/src/index.js +26 -5
  6. package/dist/framework-mcp/src/index.js.map +1 -1
  7. package/dist/framework-mcp/src/tools/control_plane/locking.d.ts +3 -9
  8. package/dist/framework-mcp/src/tools/control_plane/locking.js.map +1 -1
  9. package/dist/framework-mcp/src/tools/control_plane/registry.d.ts +2 -8
  10. package/dist/framework-mcp/src/tools/control_plane/registry.js.map +1 -1
  11. package/dist/framework-mcp/src/tools/dashboard/start_dashboard.d.ts +2 -2
  12. package/dist/framework-mcp/src/tools/dashboard/start_dashboard.js.map +1 -1
  13. package/dist/framework-mcp/src/tools/definitions.js +30 -0
  14. package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
  15. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.d.ts +2 -2
  16. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js +12 -4
  17. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js.map +1 -1
  18. package/dist/framework-mcp/src/tools/file_system/patch_file.d.ts +2 -2
  19. package/dist/framework-mcp/src/tools/file_system/patch_file.js +6 -2
  20. package/dist/framework-mcp/src/tools/file_system/patch_file.js.map +1 -1
  21. package/dist/framework-mcp/src/tools/file_system/read_file.d.ts +2 -2
  22. package/dist/framework-mcp/src/tools/file_system/read_file.js +43 -26
  23. package/dist/framework-mcp/src/tools/file_system/read_file.js.map +1 -1
  24. package/dist/framework-mcp/src/tools/file_system/replace_text.d.ts +2 -2
  25. package/dist/framework-mcp/src/tools/file_system/replace_text.js +7 -3
  26. package/dist/framework-mcp/src/tools/file_system/replace_text.js.map +1 -1
  27. package/dist/framework-mcp/src/tools/file_system/write_file.d.ts +2 -2
  28. package/dist/framework-mcp/src/tools/file_system/write_file.js +27 -15
  29. package/dist/framework-mcp/src/tools/file_system/write_file.js.map +1 -1
  30. package/dist/framework-mcp/src/tools/framework/get_status.d.ts +2 -2
  31. package/dist/framework-mcp/src/tools/framework/get_status.js.map +1 -1
  32. package/dist/framework-mcp/src/tools/framework/orchestrate.d.ts +2 -2
  33. package/dist/framework-mcp/src/tools/framework/orchestrate.js.map +1 -1
  34. package/dist/framework-mcp/src/tools/framework/run_tests.d.ts +2 -2
  35. package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -1
  36. package/dist/framework-mcp/src/tools/framework/update_contract_hash.d.ts +2 -2
  37. package/dist/framework-mcp/src/tools/framework/update_contract_hash.js.map +1 -1
  38. package/dist/framework-mcp/src/tools/framework/update_memory.d.ts +2 -2
  39. package/dist/framework-mcp/src/tools/framework/update_memory.js +1 -1
  40. package/dist/framework-mcp/src/tools/framework/update_memory.js.map +1 -1
  41. package/dist/framework-mcp/src/tools/index.d.ts +1 -2
  42. package/dist/framework-mcp/src/tools/index.js +33 -25
  43. package/dist/framework-mcp/src/tools/index.js.map +1 -1
  44. package/dist/framework-mcp/src/tools/messaging/log_action.d.ts +2 -2
  45. package/dist/framework-mcp/src/tools/messaging/log_action.js.map +1 -1
  46. package/dist/framework-mcp/src/tools/messaging/send_message.d.ts +2 -2
  47. package/dist/framework-mcp/src/tools/messaging/send_message.js +14 -1
  48. package/dist/framework-mcp/src/tools/messaging/send_message.js.map +1 -1
  49. package/dist/framework-mcp/src/tools/observability/check_ports.d.ts +2 -2
  50. package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -1
  51. package/dist/framework-mcp/src/tools/quality/check_lint.d.ts +5 -0
  52. package/dist/framework-mcp/src/tools/quality/check_lint.js +29 -0
  53. package/dist/framework-mcp/src/tools/quality/check_lint.js.map +1 -0
  54. package/dist/framework-mcp/src/tools/search/get_gaps.d.ts +2 -2
  55. package/dist/framework-mcp/src/tools/search/get_gaps.js.map +1 -1
  56. package/dist/framework-mcp/src/tools/search/get_map.d.ts +2 -2
  57. package/dist/framework-mcp/src/tools/search/get_map.js +1 -1
  58. package/dist/framework-mcp/src/tools/search/get_map.js.map +1 -1
  59. package/dist/framework-mcp/src/tools/search/grep_search.d.ts +2 -2
  60. package/dist/framework-mcp/src/tools/search/grep_search.js +45 -28
  61. package/dist/framework-mcp/src/tools/search/grep_search.js.map +1 -1
  62. package/dist/framework-mcp/src/tools/search/list_dir.d.ts +2 -2
  63. package/dist/framework-mcp/src/tools/search/list_dir.js.map +1 -1
  64. package/dist/framework-mcp/src/tools/shell/run_command.d.ts +2 -0
  65. package/dist/framework-mcp/src/tools/shell/run_command.js +47 -0
  66. package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -0
  67. package/dist/framework-mcp/src/tools/types.d.ts +95 -28
  68. package/dist/framework-mcp/src/utils/metrics.d.ts +20 -0
  69. package/dist/framework-mcp/src/utils/metrics.js +24 -6
  70. package/dist/framework-mcp/src/utils/metrics.js.map +1 -1
  71. package/dist/framework-mcp/src/utils/security.d.ts +1 -3
  72. package/dist/framework-mcp/src/utils/security.js +21 -18
  73. package/dist/framework-mcp/src/utils/security.js.map +1 -1
  74. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js +19 -14
  75. package/dist/framework-mcp/tests/tools/file_system/file_system_tools.test.js.map +1 -1
  76. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +1 -1
  77. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
  78. package/dist/framework-mcp/tests/tools/quality/check_lint.test.d.ts +1 -0
  79. package/dist/framework-mcp/tests/tools/quality/check_lint.test.js +36 -0
  80. package/dist/framework-mcp/tests/tools/quality/check_lint.test.js.map +1 -0
  81. package/dist/framework-mcp/tests/tools/shell/run_command.test.d.ts +1 -0
  82. package/dist/framework-mcp/tests/tools/shell/run_command.test.js +43 -0
  83. package/dist/framework-mcp/tests/tools/shell/run_command.test.js.map +1 -0
  84. package/dist/src/cli/adapters/core.d.ts +1 -1
  85. package/dist/src/cli/adapters/core.js +4 -0
  86. package/dist/src/cli/adapters/core.js.map +1 -1
  87. package/dist/src/cli/adapters/index.d.ts +1 -0
  88. package/dist/src/cli/adapters/index.js +1 -0
  89. package/dist/src/cli/adapters/index.js.map +1 -1
  90. package/dist/src/cli/adapters/paths.d.ts +15 -0
  91. package/dist/src/cli/adapters/paths.js +101 -0
  92. package/dist/src/cli/adapters/paths.js.map +1 -0
  93. package/dist/src/cli/adapters/scaffold.d.ts +1 -1
  94. package/dist/src/cli/adapters/scaffold.js +10 -7
  95. package/dist/src/cli/adapters/scaffold.js.map +1 -1
  96. package/dist/src/cli/commands/check.js +15 -36
  97. package/dist/src/cli/commands/check.js.map +1 -1
  98. package/dist/src/cli/commands/dashboard/data-service.d.ts +8 -0
  99. package/dist/src/cli/commands/dashboard/data-service.js +37 -0
  100. package/dist/src/cli/commands/dashboard/data-service.js.map +1 -1
  101. package/dist/src/cli/commands/init/scaffold-core.d.ts +5 -2
  102. package/dist/src/cli/commands/init/scaffold-core.js +28 -6
  103. package/dist/src/cli/commands/init/scaffold-core.js.map +1 -1
  104. package/dist/src/cli/commands/init/scaffold-standards.js +6 -1
  105. package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -1
  106. package/dist/src/cli/commands/init.js +30 -6
  107. package/dist/src/cli/commands/init.js.map +1 -1
  108. package/dist/src/cli/commands/orchestrate.d.ts +11 -6
  109. package/dist/src/cli/commands/orchestrate.js +148 -128
  110. package/dist/src/cli/commands/orchestrate.js.map +1 -1
  111. package/dist/src/cli/commands/plan.d.ts +3 -1
  112. package/dist/src/cli/commands/plan.js +79 -22
  113. package/dist/src/cli/commands/plan.js.map +1 -1
  114. package/dist/src/cli/index.js +11 -15
  115. package/dist/src/cli/index.js.map +1 -1
  116. package/dist/src/cli/utils/compliance.js +0 -1
  117. package/dist/src/cli/utils/compliance.js.map +1 -1
  118. package/dist/src/cli/utils/config-schema.d.ts +7 -7
  119. package/dist/src/cli/utils/fs.js +1 -1
  120. package/dist/src/cli/utils/fs.js.map +1 -1
  121. package/dist/src/cli/utils/memory.d.ts +1 -1
  122. package/dist/src/cli/utils/memory.js +28 -8
  123. package/dist/src/cli/utils/memory.js.map +1 -1
  124. package/dist/src/cli/utils/pkg.d.ts +19 -0
  125. package/dist/src/cli/utils/pkg.js +29 -5
  126. package/dist/src/cli/utils/pkg.js.map +1 -1
  127. package/dist/src/modules/adapters/definitions.js +3 -3
  128. package/dist/src/modules/adapters/definitions.js.map +1 -1
  129. package/dist/src/modules/agents/definitions.js +2 -1
  130. package/dist/src/modules/agents/definitions.js.map +1 -1
  131. package/dist/src/modules/agents/registry/analyst.js +1 -1
  132. package/dist/src/modules/agents/registry/analyst.js.map +1 -1
  133. package/dist/src/modules/agents/registry/architect.js +1 -0
  134. package/dist/src/modules/agents/registry/architect.js.map +1 -1
  135. package/dist/src/modules/agents/registry/backend.js +7 -6
  136. package/dist/src/modules/agents/registry/backend.js.map +1 -1
  137. package/dist/src/modules/agents/registry/database.js +4 -3
  138. package/dist/src/modules/agents/registry/database.js.map +1 -1
  139. package/dist/src/modules/agents/registry/devops.js +1 -1
  140. package/dist/src/modules/agents/registry/devops.js.map +1 -1
  141. package/dist/src/modules/agents/registry/git.js +1 -1
  142. package/dist/src/modules/agents/registry/git.js.map +1 -1
  143. package/dist/src/modules/agents/registry/manager.js +3 -2
  144. package/dist/src/modules/agents/registry/manager.js.map +1 -1
  145. package/dist/src/modules/agents/registry/native.js +1 -1
  146. package/dist/src/modules/agents/registry/native.js.map +1 -1
  147. package/dist/src/modules/agents/registry/quality.js +1 -0
  148. package/dist/src/modules/agents/registry/quality.js.map +1 -1
  149. package/dist/src/modules/agents/registry/security.js +1 -0
  150. package/dist/src/modules/agents/registry/security.js.map +1 -1
  151. package/dist/src/shared/constants.d.ts +113 -0
  152. package/dist/src/shared/constants.js +178 -0
  153. package/dist/src/shared/constants.js.map +1 -0
  154. package/dist/tests/adapters/paths.test.d.ts +1 -0
  155. package/dist/tests/adapters/paths.test.js +63 -0
  156. package/dist/tests/adapters/paths.test.js.map +1 -0
  157. package/dist/tests/approve.test.js +5 -9
  158. package/dist/tests/approve.test.js.map +1 -1
  159. package/dist/tests/cli/init/unified_init.test.d.ts +1 -0
  160. package/dist/tests/cli/init/unified_init.test.js +47 -0
  161. package/dist/tests/cli/init/unified_init.test.js.map +1 -0
  162. package/dist/tests/fs-utils.test.js +1 -1
  163. package/dist/tests/fs-utils.test.js.map +1 -1
  164. package/dist/tests/memory-utils.test.js +1 -1
  165. package/dist/tests/memory-utils.test.js.map +1 -1
  166. package/dist/tests/shared/constants.test.d.ts +1 -0
  167. package/dist/tests/shared/constants.test.js +17 -0
  168. package/dist/tests/shared/constants.test.js.map +1 -0
  169. package/dist/tests/trace.test.js +2 -2
  170. package/dist/tests/trace.test.js.map +1 -1
  171. package/framework-mcp/dist/constants.js +64 -0
  172. package/framework-mcp/dist/index.js +109 -0
  173. package/framework-mcp/dist/tools/control_plane/locking.js +64 -0
  174. package/framework-mcp/dist/tools/control_plane/registry.js +34 -0
  175. package/framework-mcp/dist/tools/dashboard/start_dashboard.js +29 -0
  176. package/framework-mcp/dist/tools/definitions.js +300 -0
  177. package/framework-mcp/dist/tools/file_system/batch_surgical_edit.js +59 -0
  178. package/framework-mcp/dist/tools/file_system/patch_file.js +25 -0
  179. package/framework-mcp/dist/tools/file_system/read_file.js +51 -0
  180. package/framework-mcp/dist/tools/file_system/replace_text.js +43 -0
  181. package/framework-mcp/dist/tools/file_system/write_file.js +38 -0
  182. package/framework-mcp/dist/tools/framework/audit_deps.js +41 -0
  183. package/framework-mcp/dist/tools/framework/get_status.js +5 -0
  184. package/framework-mcp/dist/tools/framework/orchestrate.js +5 -0
  185. package/framework-mcp/dist/tools/framework/run_tests.js +25 -0
  186. package/framework-mcp/dist/tools/framework/update_contract_hash.js +5 -0
  187. package/framework-mcp/dist/tools/framework/update_memory.js +8 -0
  188. package/framework-mcp/dist/tools/index.js +62 -0
  189. package/framework-mcp/dist/tools/memory/get_insights.js +34 -0
  190. package/framework-mcp/dist/tools/memory/read_memory.js +28 -0
  191. package/framework-mcp/dist/tools/messaging/log_action.js +22 -0
  192. package/framework-mcp/dist/tools/messaging/send_message.js +87 -0
  193. package/framework-mcp/dist/tools/observability/check_ports.js +26 -0
  194. package/framework-mcp/dist/tools/observability/get_health.js +19 -0
  195. package/framework-mcp/dist/tools/quality/check_lint.js +28 -0
  196. package/framework-mcp/dist/tools/search/get_gaps.js +48 -0
  197. package/framework-mcp/dist/tools/search/get_map.js +43 -0
  198. package/framework-mcp/dist/tools/search/grep_search.js +76 -0
  199. package/framework-mcp/dist/tools/search/list_dir.js +28 -0
  200. package/framework-mcp/dist/tools/shell/run_command.js +46 -0
  201. package/framework-mcp/dist/tools/types.js +1 -0
  202. package/framework-mcp/dist/utils/cli.js +20 -0
  203. package/framework-mcp/dist/utils/compliance.js +29 -0
  204. package/framework-mcp/dist/utils/fs.js +44 -0
  205. package/framework-mcp/dist/utils/metrics.js +56 -0
  206. package/framework-mcp/dist/utils/security.js +60 -0
  207. package/framework-mcp/package.json +19 -0
  208. package/framework-mcp/src/constants.ts +78 -0
  209. package/framework-mcp/src/declarations.d.ts +17 -0
  210. package/framework-mcp/src/index.ts +132 -0
  211. package/framework-mcp/src/tools/control_plane/locking.ts +71 -0
  212. package/framework-mcp/src/tools/control_plane/registry.ts +38 -0
  213. package/framework-mcp/src/tools/dashboard/start_dashboard.ts +33 -0
  214. package/framework-mcp/src/tools/definitions.ts +302 -0
  215. package/framework-mcp/src/tools/file_system/batch_surgical_edit.ts +79 -0
  216. package/framework-mcp/src/tools/file_system/patch_file.ts +33 -0
  217. package/framework-mcp/src/tools/file_system/read_file.ts +58 -0
  218. package/framework-mcp/src/tools/file_system/replace_text.ts +52 -0
  219. package/framework-mcp/src/tools/file_system/write_file.ts +45 -0
  220. package/framework-mcp/src/tools/framework/audit_deps.ts +49 -0
  221. package/framework-mcp/src/tools/framework/get_status.ts +7 -0
  222. package/framework-mcp/src/tools/framework/orchestrate.ts +7 -0
  223. package/framework-mcp/src/tools/framework/run_tests.ts +28 -0
  224. package/framework-mcp/src/tools/framework/update_contract_hash.ts +7 -0
  225. package/framework-mcp/src/tools/framework/update_memory.ts +10 -0
  226. package/framework-mcp/src/tools/index.ts +66 -0
  227. package/framework-mcp/src/tools/memory/get_insights.ts +41 -0
  228. package/framework-mcp/src/tools/memory/read_memory.ts +31 -0
  229. package/framework-mcp/src/tools/messaging/log_action.ts +28 -0
  230. package/framework-mcp/src/tools/messaging/send_message.ts +89 -0
  231. package/framework-mcp/src/tools/observability/check_ports.ts +30 -0
  232. package/framework-mcp/src/tools/observability/get_health.ts +24 -0
  233. package/framework-mcp/src/tools/quality/check_lint.ts +33 -0
  234. package/framework-mcp/src/tools/search/get_gaps.ts +54 -0
  235. package/framework-mcp/src/tools/search/get_map.ts +48 -0
  236. package/framework-mcp/src/tools/search/grep_search.ts +76 -0
  237. package/framework-mcp/src/tools/search/list_dir.ts +34 -0
  238. package/framework-mcp/src/tools/shell/run_command.ts +56 -0
  239. package/framework-mcp/src/tools/types.ts +89 -0
  240. package/framework-mcp/src/utils/cli.ts +20 -0
  241. package/framework-mcp/src/utils/compliance.ts +37 -0
  242. package/framework-mcp/src/utils/fs.ts +45 -0
  243. package/framework-mcp/src/utils/metrics.ts +73 -0
  244. package/framework-mcp/src/utils/security.ts +66 -0
  245. package/framework-mcp/tests/tools/file_system/file_system_tools.test.ts +212 -0
  246. package/framework-mcp/tests/tools/messaging/send_message.test.ts +136 -0
  247. package/framework-mcp/tests/tools/quality/check_lint.test.ts +46 -0
  248. package/framework-mcp/tests/tools/shell/run_command.test.ts +55 -0
  249. package/framework-mcp/tsconfig.json +14 -0
  250. package/package.json +9 -7
  251. package/src/cli/adapters/core.ts +7 -1
  252. package/src/cli/adapters/index.ts +1 -0
  253. package/src/cli/adapters/paths.ts +134 -0
  254. package/src/cli/adapters/scaffold.ts +17 -7
  255. package/src/cli/commands/check.ts +16 -38
  256. package/src/cli/commands/dashboard/data-service.ts +48 -0
  257. package/src/cli/commands/init/scaffold-core.ts +45 -6
  258. package/src/cli/commands/init/scaffold-standards.ts +6 -1
  259. package/src/cli/commands/init.ts +32 -6
  260. package/src/cli/commands/orchestrate.ts +151 -127
  261. package/src/cli/commands/plan.ts +89 -23
  262. package/src/cli/index.ts +14 -19
  263. package/src/cli/utils/compliance.ts +8 -9
  264. package/src/cli/utils/fs.ts +1 -1
  265. package/src/cli/utils/memory.ts +32 -7
  266. package/src/cli/utils/pkg.ts +42 -13
  267. package/src/modules/adapters/definitions.ts +4 -3
  268. package/src/modules/agents/definitions.ts +2 -1
  269. package/src/modules/agents/registry/analyst.ts +1 -1
  270. package/src/modules/agents/registry/architect.ts +1 -0
  271. package/src/modules/agents/registry/backend.ts +7 -6
  272. package/src/modules/agents/registry/database.ts +4 -3
  273. package/src/modules/agents/registry/devops.ts +1 -1
  274. package/src/modules/agents/registry/git.ts +1 -1
  275. package/src/modules/agents/registry/manager.ts +3 -2
  276. package/src/modules/agents/registry/native.ts +1 -1
  277. package/src/modules/agents/registry/quality.ts +1 -0
  278. package/src/modules/agents/registry/security.ts +1 -0
  279. package/src/shared/constants.ts +212 -0
  280. package/templates/prompts/bug-fix-recipe.md +20 -0
  281. package/templates/prompts/contract-design-recipe.md +21 -0
  282. package/templates/prompts/db-management-recipe.md +25 -0
  283. package/templates/prompts/deployment-recipe.md +23 -0
  284. package/templates/prompts/new-feature-recipe.md +19 -0
  285. package/templates/prompts/performance-optimization-recipe.md +23 -0
  286. package/templates/prompts/pull-request-template.md +21 -0
  287. package/templates/prompts/refactoring-recipe.md +21 -0
  288. package/templates/prompts/security-audit-recipe.md +20 -0
  289. package/templates/standards/architecture-standards.md +23 -0
  290. package/templates/standards/auth-standards.md +125 -0
  291. package/templates/standards/crud-governance.md +21 -0
  292. package/templates/standards/deployment-standards.md +21 -0
  293. package/templates/standards/frontend-standards.md +37 -0
  294. package/templates/standards/github-actions-standards.md +43 -0
  295. package/templates/standards/i18n-standards.md +17 -0
  296. package/templates/standards/kysely-standards.md +47 -0
  297. package/templates/standards/llm-governance.md +15 -0
  298. package/templates/standards/logging-and-secrets.md +34 -0
  299. package/templates/standards/mobile-standards.md +23 -0
  300. package/templates/standards/observability-standards.md +15 -0
  301. package/templates/standards/performance-standards.md +15 -0
  302. package/templates/standards/pino-standards.md +46 -0
  303. package/templates/standards/playwright-standards.md +54 -0
  304. package/templates/standards/quality-standards.md +31 -0
  305. package/templates/standards/react-query-standards.md +72 -0
  306. package/templates/standards/react-router-standards.md +62 -0
  307. package/templates/standards/security-audit-standards.md +16 -0
  308. package/templates/standards/security-standards.md +21 -0
  309. package/templates/standards/swagger-standards.md +50 -0
  310. package/templates/standards/tailwind-standards.md +20 -0
  311. package/templates/standards/testing-standards.md +31 -0
  312. package/templates/standards/typeorm-standards.md +49 -0
  313. package/templates/standards/vitest-standards.md +110 -0
  314. package/bin/validate-agent-army.js +0 -148
  315. package/src/cli/commands/app.ts +0 -56
  316. package/src/cli/utils/app-backend.ts +0 -257
  317. package/src/cli/utils/app-docs.ts +0 -83
  318. package/src/cli/utils/app-frontend.ts +0 -263
  319. package/src/cli/utils/app-inferrer.ts +0 -63
  320. package/src/cli/utils/app-mobile.ts +0 -113
  321. package/src/cli/utils/app-types.ts +0 -248
  322. package/src/cli/utils/app.ts +0 -6
@@ -5,6 +5,9 @@ import {
5
5
  resolveAdapter,
6
6
  runAdapterPostInit,
7
7
  scaffoldAgents,
8
+ resolveAgentsDir,
9
+ mirrorUnifiedAgentsToNative,
10
+ ADAPTER_IDS,
8
11
  type AdapterId,
9
12
  } from "../adapters/index.js";
10
13
  import { ensureDir } from "../utils/fs.js";
@@ -112,18 +115,41 @@ export async function initCommand(adapterName: string, options: { unified?: bool
112
115
  }
113
116
 
114
117
  scaffoldConstitution(projectRoot, coreDir, adapterId, dryRun);
118
+ scaffoldFrameworkConfigs(projectRoot, coreDir, adapter, dryRun, selectedPalette, {
119
+ unified: isUnified,
120
+ adapters: isUnified ? [...ADAPTER_IDS] : [adapterId]
121
+ });
122
+
123
+ scaffoldStandards(path.join(projectRoot, coreDir), dryRun);
115
124
 
116
- scaffoldAgents(projectRoot, adapterId, dryRun, selectedAgents);
125
+ if (isUnified) {
126
+ // Scaffold ALL agents for ALL adapters under unified hub
127
+ for (const id of ADAPTER_IDS) {
128
+ const dest = resolveAgentsDir(id, true, aiToolDir);
129
+ scaffoldAgents(projectRoot, id, dryRun, selectedAgents, dest.agentsDir, dest.agentsExt);
130
+ if (!dryRun) mirrorUnifiedAgentsToNative(projectRoot, id);
131
+ }
132
+ UI.success(`āœ… Scaffolding complete for all adapters under ${aiToolDir}/ with native mirrors.`);
133
+ } else {
134
+ // Standard single-adapter scaffold
135
+ const dest = resolveAgentsDir(adapterId, false);
136
+ scaffoldAgents(projectRoot, adapterId, dryRun, selectedAgents, dest.agentsDir, dest.agentsExt);
137
+ UI.success(`āœ… Generated agent definitions under ${dest.agentsDir}/`);
138
+ }
117
139
 
118
140
  const skillsBaseDir = path.join(projectRoot, aiToolDir, "skills");
119
141
  scaffoldSkills(skillsBaseDir, dryRun);
120
-
121
- initializeMemory(path.join(projectRoot, coreDir), dryRun);
122
- scaffoldFrameworkConfigs(projectRoot, coreDir, adapter, dryRun, selectedPalette);
123
- scaffoldStandards(path.join(projectRoot, coreDir), dryRun);
124
142
  scaffoldOps(path.join(projectRoot, coreDir), dryRun);
125
- scaffoldShims(projectRoot, coreDir, adapterId, adapter, dryRun);
143
+ scaffoldShims(projectRoot, coreDir, adapterId, adapter, dryRun, isUnified);
126
144
 
145
+ // Initialize runtime directories
146
+ if (!dryRun) {
147
+ ensureDir(path.join(projectRoot, coreDir, "messages"));
148
+ ensureDir(path.join(projectRoot, coreDir, "logs"));
149
+ ensureDir(path.join(projectRoot, coreDir, "memory-graph"));
150
+ }
151
+
152
+ initializeMemory(path.join(projectRoot, coreDir), dryRun);
127
153
  runAdapterPostInit(adapter, projectRoot);
128
154
 
129
155
  UI.success(`\nšŸš€ ${FRAMEWORK_NAME} (v${getPackageVersion()}) initialized successfully!`);
@@ -1,6 +1,5 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
- import chalk from "chalk";
4
3
  import { getFrameworkDir, updateDocumentStore, readStatus } from "../utils/memory.js";
5
4
  import { UI } from "../utils/ui.js";
6
5
  import { writeTextFile, appendFile } from "../utils/fs.js";
@@ -19,7 +18,8 @@ export const HermesMessageSchema = z.object({
19
18
  parentId: z.string().optional(),
20
19
  status: z.enum(["PENDING", "PROCESSED", "WAITING", "APPROVED"]),
21
20
  priority: z.enum(["HIGH", "NORMAL", "LOW"]).optional(),
22
- action: z.string().optional()
21
+ action: z.string().optional(),
22
+ requiresApproval: z.boolean().optional(),
23
23
  });
24
24
 
25
25
  export type HermesMessage = z.infer<typeof HermesMessageSchema>;
@@ -49,162 +49,182 @@ export async function orchestrateCommand() {
49
49
  isLooping = true;
50
50
 
51
51
  while (isLooping) {
52
- // Initial load from disk to sync the cache
53
- if (Object.keys(agentStatusCache).length === 0) {
54
- const diskStatus = readStatus();
55
- agentStatusCache = diskStatus || {};
56
- }
52
+ try {
53
+ // Initial load from disk to sync the cache
54
+ if (Object.keys(agentStatusCache).length === 0) {
55
+ const diskStatus = readStatus();
56
+ agentStatusCache = diskStatus || {};
57
+ }
57
58
 
58
- // Check for agent timeouts (e.g. 30 minutes in EXECUTING state)
59
- const agentStatuses = readStatus();
60
- let updatedStatus = false;
61
- for (const [agentName, info] of Object.entries(agentStatuses)) {
62
- const { state, lastUpdated } = info as { state: string; task: string; lastUpdated?: string };
63
- if (state === "EXECUTING" && lastUpdated) {
64
- const lastUpdatedTime = Date.parse(lastUpdated);
65
- if (!isNaN(lastUpdatedTime) && Date.now() - lastUpdatedTime > 30 * 60 * 1000) {
66
- UI.error(`āš ļø Agent ${agentName} has TIMED OUT (in EXECUTING state for >30m). Transitioning to BLOCKED.`);
67
- agentStatuses[agentName] = { state: "BLOCKED", task: "Timeout occurred", lastUpdated: new Date().toISOString() };
68
- updatedStatus = true;
59
+ // Check for agent timeouts (e.g. 30 minutes in EXECUTING state)
60
+ const agentStatuses = readStatus();
61
+ let updatedStatus = false;
62
+ for (const [agentName, info] of Object.entries(agentStatuses)) {
63
+ const { state, lastUpdated } = info as { state: string; task: string; lastUpdated?: string };
64
+ if (state === "EXECUTING" && lastUpdated) {
65
+ const lastUpdatedTime = Date.parse(lastUpdated);
66
+ if (!isNaN(lastUpdatedTime) && Date.now() - lastUpdatedTime > 30 * 60 * 1000) {
67
+ UI.error(`āš ļø Agent ${agentName} has TIMED OUT (in EXECUTING state for >30m). Transitioning to BLOCKED.`);
68
+ agentStatuses[agentName] = { state: "BLOCKED", task: "Timeout occurred", lastUpdated: new Date().toISOString() };
69
+ updatedStatus = true;
70
+ }
69
71
  }
70
72
  }
71
- }
72
- if (updatedStatus) {
73
- updateDocumentStore("status", agentStatuses);
74
- agentStatusCache = { ...agentStatuses }; // Sync cache
75
- }
73
+ if (updatedStatus) {
74
+ updateDocumentStore("status", agentStatuses);
75
+ agentStatusCache = { ...agentStatuses }; // Sync cache
76
+ }
76
77
 
77
- if (fs.existsSync(messagesDir)) {
78
- const messageFiles = fs.readdirSync(messagesDir).filter((f) => f.endsWith(".json"));
79
- const pendingMessages: HermesMessage[] = [];
80
- const fileMessagesMap: Record<string, HermesMessage[]> = {};
78
+ if (fs.existsSync(messagesDir)) {
79
+ const messageFiles = fs.readdirSync(messagesDir).filter((f) => f.endsWith(".json"));
80
+ const pendingMessages: HermesMessage[] = [];
81
+ const fileMessagesMap: Record<string, HermesMessage[]> = {};
81
82
 
82
- for (const file of messageFiles) {
83
- const filePath = path.join(messagesDir, file);
84
- try {
85
- const content = fs.readFileSync(filePath, "utf8").trim();
86
- if (!content) continue;
87
- const lines = content.split("\n");
88
- const allMsgs: HermesMessage[] = [];
89
- lines.forEach((line) => {
90
- if (!line.trim()) return;
91
- try {
92
- const parsed = JSON.parse(line);
93
- const msg = HermesMessageSchema.parse(parsed);
94
-
95
- // Contract Validation
96
- if (msg.category === "ACTION" || msg.category === "DELEGATION") {
97
- try {
98
- const payload = JSON.parse(msg.content);
99
- TaskRequestSchema.parse(payload);
100
- } catch (e) {
101
- UI.error(`Invalid task contract payload: ${(e as Error).message}`);
102
- return; // Skip invalid message
83
+ for (const file of messageFiles) {
84
+ const filePath = path.join(messagesDir, file);
85
+ try {
86
+ const content = fs.readFileSync(filePath, "utf8").trim();
87
+ if (!content) continue;
88
+ const lines = content.split("\n");
89
+ const allMsgs: HermesMessage[] = [];
90
+ lines.forEach((line) => {
91
+ if (!line.trim()) return;
92
+ try {
93
+ const parsed = JSON.parse(line);
94
+ const msg = HermesMessageSchema.parse(parsed);
95
+
96
+ // Contract Validation
97
+ if (msg.category === "ACTION" || msg.category === "DELEGATION") {
98
+ try {
99
+ const payload = JSON.parse(msg.content);
100
+ TaskRequestSchema.parse(payload);
101
+ } catch (e) {
102
+ UI.error(`Invalid task contract payload: ${(e as Error).message}`);
103
+ return; // Skip invalid message
104
+ }
103
105
  }
104
- }
105
106
 
106
- if (msg.status === "PENDING") {
107
- pendingMessages.push(msg);
107
+ // A message is actionable if it's pending, or if it's been approved.
108
+ if (msg.status === "PENDING" || msg.status === "APPROVED") {
109
+ pendingMessages.push(msg);
110
+ }
111
+ allMsgs.push(msg);
112
+ } catch (e) {
113
+ UI.error(`Skipping invalid Hermes message format: ${(e as Error).message}`);
108
114
  }
109
- allMsgs.push(msg);
110
- } catch (e) {
111
- UI.error(`Skipping invalid Hermes message format: ${(e as Error).message}`);
112
- }
113
- });
114
- fileMessagesMap[file] = allMsgs;
115
- } catch (err) {
116
- UI.error(`Error occurred while reading ${file}.`);
117
- logger.debug(`Failed to read message file ${file}`, err);
115
+ });
116
+ fileMessagesMap[file] = allMsgs;
117
+ } catch (err) {
118
+ UI.error(`Error occurred while reading ${file}.`);
119
+ logger.debug(`Failed to read message file ${file}`, err);
120
+ }
118
121
  }
119
- }
120
122
 
121
- if (pendingMessages.length > 0) {
122
- // Sort by priority: HIGH -> NORMAL -> LOW
123
- const priorityOrder = { HIGH: 1, NORMAL: 2, LOW: 3 };
124
- pendingMessages.sort((a, b) => {
125
- const pA = priorityOrder[a.priority || "NORMAL"] || 2;
126
- const pB = priorityOrder[b.priority || "NORMAL"] || 2;
127
- if (pA !== pB) return pA - pB;
128
- return Date.parse(a.timestamp) - Date.parse(b.timestamp);
129
- });
123
+ if (pendingMessages.length > 0) {
124
+ // Sort by priority: HIGH -> NORMAL -> LOW
125
+ const priorityOrder = { HIGH: 1, NORMAL: 2, LOW: 3 };
126
+ pendingMessages.sort((a, b) => {
127
+ const pA = priorityOrder[a.priority || "NORMAL"] || 2;
128
+ const pB = priorityOrder[b.priority || "NORMAL"] || 2;
129
+ if (pA !== pB) return pA - pB;
130
+ return Date.parse(a.timestamp) - Date.parse(b.timestamp);
131
+ });
132
+
133
+ UI.intent("Multi-Agent Orchestration", `${pendingMessages.length} pending tasks and collaboration messages found.`);
130
134
 
131
- UI.intent("Multi-Agent Orchestration", `${pendingMessages.length} pending tasks and collaboration messages found.`);
135
+ const statusChanges: Record<string, { state: string; task: string }> = {};
132
136
 
133
- const statusChanges: Record<string, { state: string; task: string }> = {};
137
+ for (const msg of pendingMessages) {
138
+ const { from, to, content, traceId, category, status, requiresApproval } = msg;
134
139
 
135
- for (const msg of pendingMessages) {
136
- const { from, to, content, traceId, category, parentId } = msg;
140
+ // Approval Gate for high-risk actions.
141
+ // If it requires approval but isn't approved yet, skip it for now.
142
+ if ((category === "ACTION" || category === "ALERT") && requiresApproval && status !== "APPROVED") {
143
+ logger.debug(`Action for @${to} (Trace: ${traceId}) is pending manager approval.`);
144
+ continue;
145
+ }
146
+
147
+ // Gate for regular messages.
148
+ // If it's a non-approval-required message, it should only be processed when PENDING.
149
+ // This prevents re-processing of SUBTASK/REPLY messages that might get set to APPROVED.
150
+ if (!(category === "ACTION" || category === "ALERT") && status !== "PENDING") {
151
+ continue;
152
+ }
137
153
 
138
- const isSubtask = category === "SUBTASK" || !!parentId;
139
- const agentLabel = isSubtask ? `${to} (Sub-Agent)` : to;
140
154
 
141
- UI.agentBox(agentLabel, content, `Trace: ${traceId} | From: ${from} | Category: ${category}`);
155
+ const isSubtask = category === "SUBTASK" || !!msg.parentId;
156
+ const agentLabel = isSubtask ? `${to} (Sub-Agent)` : to;
142
157
 
143
- let targetState = "EXECUTING";
144
- if (category === "DELEGATION" || category === "SUBTASK") targetState = "BRIEFED";
158
+ UI.agentBox(agentLabel, content, `Trace: ${traceId} | From: ${from} | Category: ${category}`);
145
159
 
146
- let taskDescription = content;
147
- if (category === "DELEGATION" || category === "ACTION") {
148
- try {
149
- const payload = JSON.parse(content);
150
- taskDescription = payload.task || content;
151
- } catch {
152
- // Ignore
160
+ let targetState = "EXECUTING";
161
+ if (category === "DELEGATION" || category === "SUBTASK") targetState = "BRIEFED";
162
+
163
+ let taskDescription = content;
164
+ if (category === "DELEGATION" || category === "ACTION") {
165
+ try {
166
+ const payload = JSON.parse(content);
167
+ taskDescription = payload.task || content;
168
+ } catch {
169
+ // Ignore
170
+ }
153
171
  }
154
- }
155
172
 
156
- statusChanges[to] = { state: targetState, task: taskDescription };
173
+ statusChanges[to] = { state: targetState, task: taskDescription };
157
174
 
158
- if (targetState === "BRIEFED") {
159
- UI.success(`${to} informed and took over the task.`);
160
- statusChanges[to] = { state: "EXECUTING", task: taskDescription };
161
- }
175
+ if (targetState === "BRIEFED") {
176
+ UI.success(`${to} informed and took over the task.`);
177
+ statusChanges[to] = { state: "EXECUTING", task: taskDescription };
178
+ }
162
179
 
163
- if (isSubtask) {
164
- UI.success(`Sub-task connection established (Parent: ${parentId || "Unknown"}).`);
165
- }
180
+ if (isSubtask) {
181
+ UI.success(`Sub-task connection established (Parent: ${msg.parentId || "Unknown"}).`);
182
+ }
166
183
 
167
- UI.success(`Collaboration initiated: ${from} -> ${to}`);
168
- console.warn(chalk.gray(` šŸ‘‰ Instructions: ${frameworkDir}/agents/${to.replace("@", "")}.md`));
184
+ UI.success(`Collaboration initiated: ${from} -> ${to}`);
169
185
 
170
- msg.status = "PROCESSED";
171
- }
186
+ msg.status = "PROCESSED";
187
+ }
172
188
 
173
- applyBatchStatusUpdates(statusChanges);
189
+ applyBatchStatusUpdates(statusChanges);
174
190
 
175
- const archiveDir = path.join(messagesDir, "archive");
176
-
177
- for (const file of Object.keys(fileMessagesMap)) {
178
- const filePath = path.join(messagesDir, file);
179
- const msgs = fileMessagesMap[file];
180
-
181
- const activeMsgs = msgs.filter(m => m.status !== "PROCESSED");
182
- const processedMsgs = msgs.filter(m => m.status === "PROCESSED");
191
+ const archiveDir = path.join(messagesDir, "archive");
183
192
 
184
- try {
185
- if (activeMsgs.length > 0) {
186
- const updatedContent = activeMsgs.map(m => JSON.stringify(m)).join("\n") + "\n";
187
- writeTextFile(filePath, updatedContent);
188
- } else if (fs.existsSync(filePath)) {
189
- writeTextFile(filePath, "");
190
- }
193
+ for (const file of Object.keys(fileMessagesMap)) {
194
+ const filePath = path.join(messagesDir, file);
195
+ const msgs = fileMessagesMap[file];
196
+
197
+ const activeMsgs = msgs.filter(m => m.status !== "PROCESSED");
198
+ const processedMsgs = msgs.filter(m => m.status === "PROCESSED");
199
+
200
+ try {
201
+ if (activeMsgs.length > 0) {
202
+ const updatedContent = activeMsgs.map(m => JSON.stringify(m)).join("\n") + "\n";
203
+ writeTextFile(filePath, updatedContent);
204
+ } else if (fs.existsSync(filePath)) {
205
+ writeTextFile(filePath, "");
206
+ }
191
207
 
192
- if (processedMsgs.length > 0) {
193
- if (!fs.existsSync(archiveDir)) {
194
- fs.mkdirSync(archiveDir, { recursive: true });
208
+ if (processedMsgs.length > 0) {
209
+ if (!fs.existsSync(archiveDir)) {
210
+ fs.mkdirSync(archiveDir, { recursive: true });
211
+ }
212
+ const agentName = file.replace(".json", "");
213
+ const archivePath = path.join(archiveDir, `${agentName}_archive.json`);
214
+ const archiveContent = processedMsgs.map(m => JSON.stringify(m)).join("\n") + "\n";
215
+ appendFile(archivePath, archiveContent);
216
+ UI.success(`Archived ${processedMsgs.length} messages for @${agentName}`);
195
217
  }
196
- const agentName = file.replace(".json", "");
197
- const archivePath = path.join(archiveDir, `${agentName}_archive.json`);
198
- const archiveContent = processedMsgs.map(m => JSON.stringify(m)).join("\n") + "\n";
199
- appendFile(archivePath, archiveContent);
200
- UI.success(`Archived ${processedMsgs.length} messages for @${agentName}`);
218
+ } catch (err) {
219
+ UI.error(`Error occurred while updating and archiving the message file ${file}.`);
220
+ logger.debug(`Failed to update and archive message file ${file}`, err);
201
221
  }
202
- } catch (err) {
203
- UI.error(`Error occurred while updating and archiving the message file ${file}.`);
204
- logger.debug(`Failed to update and archive message file ${file}`, err);
205
222
  }
206
223
  }
207
224
  }
225
+ } catch (globalLoopErr) {
226
+ UI.error(`āš ļø Critical error in Hermes orchestration loop: ${(globalLoopErr as Error).message}`);
227
+ logger.debug("Hermes global loop failure", globalLoopErr);
208
228
  }
209
229
 
210
230
  // Prevent 100% CPU and provide breathing room for I/O
@@ -223,6 +243,7 @@ export async function sendMessage(args: {
223
243
  traceId: string;
224
244
  parentId?: string;
225
245
  priority?: "HIGH" | "NORMAL" | "LOW";
246
+ requiresApproval?: boolean;
226
247
  }) {
227
248
  const frameworkDir = getFrameworkDir();
228
249
  const messagesDir = path.join(frameworkDir, "messages");
@@ -274,11 +295,14 @@ export async function sendMessage(args: {
274
295
 
275
296
  try {
276
297
  const defaultPriority = (args.category === "ALERT" || args.category === "ACTION") ? "HIGH" : "NORMAL";
298
+ const requiresApproval = args.requiresApproval !== undefined ? args.requiresApproval : (args.category === "ALERT" || args.category === "ACTION");
299
+
277
300
  const message: HermesMessage = {
278
301
  timestamp: new Date().toISOString(),
279
302
  priority: args.priority || defaultPriority,
280
303
  ...args,
281
- status: "PENDING"
304
+ status: "PENDING",
305
+ requiresApproval: requiresApproval,
282
306
  };
283
307
 
284
308
  appendFile(messagePath, JSON.stringify(message) + "\n");
@@ -1,47 +1,113 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
- import { updateDocumentStore } from "../utils/memory.js";
4
3
  import { generateULID } from "../utils/time.js";
5
4
  import { UI } from "../utils/ui.js";
6
5
 
7
6
  /**
8
- * Parses docs/user/roadmap.md and injects tasks into the Document Store.
7
+ * Reads ALL markdown files from the docs/ directory and creates
8
+ * planning tasks from them. Agents will use this to understand
9
+ * project requirements and generate code accordingly.
9
10
  */
10
11
  export async function planCommand() {
11
12
  const projectRoot = process.cwd();
12
- const roadmapPath = path.join(projectRoot, "docs/user/roadmap.md");
13
+ const docsDir = path.join(projectRoot, "docs");
13
14
 
14
- if (!fs.existsSync(roadmapPath)) {
15
- UI.error("Roadmap file not found at docs/user/roadmap.md");
15
+ if (!fs.existsSync(docsDir)) {
16
+ UI.error("Docs directory not found at docs/");
17
+ console.warn("šŸ’” Create a docs/ folder with your project requirements in .md files.");
16
18
  return;
17
19
  }
18
20
 
19
- const content = fs.readFileSync(roadmapPath, "utf8");
20
- const taskRegex = /- \[ \] (.*) \| (.*) \| (.*)/g;
21
- let match;
22
- let count = 0;
21
+ const entries = fs.readdirSync(docsDir, { withFileTypes: true });
22
+ const mdFiles = entries.filter(e => e.isFile() && e.name.endsWith(".md"));
23
23
 
24
- UI.intent("Planning Engine", "Parsing roadmap.md and injecting tasks into Document Store...");
24
+ if (mdFiles.length === 0) {
25
+ UI.warning("No markdown files found in docs/ directory.");
26
+ console.warn("šŸ’” Add .md files to docs/ with your project requirements.");
27
+ return;
28
+ }
25
29
 
26
- while ((match = taskRegex.exec(content)) !== null) {
27
- const description = match[1];
28
- const priority = match[2];
29
- const agent = match[3];
30
+ UI.intent("Planning Engine", `Reading ${mdFiles.length} document(s) from docs/...`);
31
+
32
+ // Discover available template standards
33
+ const templatesDir = path.join(projectRoot, "templates");
34
+ const standards: string[] = [];
35
+ if (fs.existsSync(templatesDir)) {
36
+ const templateFiles = fs.readdirSync(templatesDir);
37
+ standards.push(...templateFiles.filter(f => f.endsWith("-standards.md")).map(f => `templates/${f}`));
38
+ if (standards.length > 0) {
39
+ UI.success(`Found ${standards.length} standard templates available for code generation.`);
40
+ }
41
+ }
42
+
43
+ let totalTasks = 0;
44
+
45
+ for (const file of mdFiles) {
46
+ const filePath = path.join(docsDir, file.name);
47
+ const content = fs.readFileSync(filePath, "utf8");
48
+ const lines = content.split("\n");
30
49
  const traceId = generateULID();
31
-
50
+
51
+ UI.success(`šŸ“„ docs/${file.name} (${lines.length} lines) → Trace: ${traceId}`);
52
+
53
+ console.warn(` Content preview: ${content.substring(0, 200).replace(/\n/g, " ")}...`);
54
+
55
+ // Extract headings as task descriptions
56
+ const headingRegex = /^#{2,4}\s+(.+)$/gm;
57
+ let headingMatch;
58
+ let headingCount = 0;
59
+ while ((headingMatch = headingRegex.exec(content)) !== null) {
60
+ headingCount++;
61
+ totalTasks++;
62
+ }
63
+
64
+ // Extract checklist items
65
+ const taskRegex = /- \[ \]\s+(.+)/g;
66
+ let taskMatch;
67
+ let taskCount = 0;
68
+ while ((taskMatch = taskRegex.exec(content)) !== null) {
69
+ if (taskMatch[1].trim().length >= 3) {
70
+ taskCount++;
71
+ totalTasks++;
72
+ }
73
+ }
74
+
75
+ console.warn(` šŸ“‹ ${headingCount} sections, ${taskCount} actionable tasks detected`);
76
+
77
+ // Store in project memory-compatible format
78
+ const memoryDir = path.join(projectRoot, ".enderun", "memory", "tasks");
79
+ if (!fs.existsSync(memoryDir)) {
80
+ fs.mkdirSync(memoryDir, { recursive: true });
81
+ }
82
+
83
+ const taskFile = path.join(memoryDir, `${traceId}.json`);
32
84
  const taskData = {
33
85
  traceId,
34
- description: description.trim(),
35
- priority: priority.trim(),
36
- agent: agent.trim().replace("@", ""),
86
+ source: `docs/${file.name}`,
87
+ description: `Process requirements from docs/${file.name}`,
37
88
  status: "PENDING",
38
- createdAt: new Date().toISOString()
89
+ createdAt: new Date().toISOString(),
90
+ standards,
91
+ headings: headingCount,
92
+ tasks: taskCount,
93
+ preview: content.substring(0, 500),
39
94
  };
95
+ fs.writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
96
+ }
40
97
 
41
- updateDocumentStore("task", taskData, traceId);
42
- UI.success(`Injected task: ${taskData.description} (Agent: ${taskData.agent})`);
43
- count++;
98
+ // Log available standards
99
+ if (standards.length > 0) {
100
+ console.warn("");
101
+ UI.divider();
102
+ console.warn("šŸ“š Available Enterprise Standards:");
103
+ standards.forEach(s => console.warn(` - ${s}`));
104
+ UI.divider();
44
105
  }
45
106
 
46
- UI.success(`Plan complete: ${count} tasks injected into Document Store.`);
107
+ UI.success(`\nāœ… Planning complete: ${totalTasks} tasks identified from ${mdFiles.length} document(s).`);
108
+ console.warn("\nšŸ“‹ Next steps:");
109
+ console.warn(" 1. Run 'agent-enderun status' to see project state");
110
+ console.warn(" 2. AI agents (Claude, Gemini, Grok, etc.) will read docs/ and templates/");
111
+ console.warn(" 3. Agents generate enterprise-standard code based on requirements");
112
+ console.warn(" 4. Use @agent delegation for specific tasks: agent-enderun @backend \"...\"");
47
113
  }
package/src/cli/index.ts CHANGED
@@ -1,17 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import fs from "fs";
3
- import { getPackageVersion, getValidatorPath } from "./utils/pkg.js";
4
- import { getMemoryPath, readActiveTraceId } from "./utils/memory.js";
5
- import { planCommand } from "./commands/plan.js";
6
- import { initCommand } from "./commands/init.js";
3
+ import { approveCommand } from "./commands/approve.js";
7
4
  import { checkCommand } from "./commands/check.js";
8
- import { statusCommand } from "./commands/status.js";
9
- import { traceNewCommand } from "./commands/trace.js";
5
+ import { updateApiContractCommand, verifyApiContractCommand } from "./commands/contract.js";
6
+ import { initCommand } from "./commands/init.js";
10
7
  import { updateProjectMemoryCommand } from "./commands/memory.js";
11
- import { createAppCommand } from "./commands/app.js";
12
- import { verifyApiContractCommand, updateApiContractCommand } from "./commands/contract.js";
13
8
  import { orchestrateCommand, sendMessage } from "./commands/orchestrate.js";
14
- import { approveCommand } from "./commands/approve.js";
9
+ import { planCommand } from "./commands/plan.js";
10
+ import { statusCommand } from "./commands/status.js";
11
+ import { traceNewCommand } from "./commands/trace.js";
12
+ import { getMemoryPath, readActiveTraceId } from "./utils/memory.js";
13
+ import { getPackageVersion, getValidatorPath } from "./utils/pkg.js";
15
14
 
16
15
  /**
17
16
  * Main CLI entry point.
@@ -21,8 +20,8 @@ async function main() {
21
20
  const command = args[0];
22
21
 
23
22
  const KNOWN_COMMANDS = [
24
- "init", "check", "status", "trace:new", "update_project_memory",
25
- "create-app", "orchestrate", "loop", "verify-contract", "update-contract",
23
+ "init", "check", "status", "trace:new", "update_project_memory",
24
+ "plan", "orchestrate", "loop", "verify-contract", "update-contract",
26
25
  "validate", "validate-army", "check:al", "version", "-v", "--version", "help", "-h", "--help",
27
26
  "git:commit", "git:sync", "check:compliance", "explorer:graph", "explorer:audit",
28
27
  "knowledge:update", "knowledge:search", "log:action", "run-script", "security:audit", "check:lint", "approve"
@@ -77,6 +76,7 @@ async function main() {
77
76
  case "plan":
78
77
  await planCommand();
79
78
  break;
79
+
80
80
  case "status":
81
81
  await statusCommand();
82
82
  break;
@@ -100,10 +100,6 @@ async function main() {
100
100
  break;
101
101
  }
102
102
 
103
- case "create-app":
104
- await createAppCommand(args.slice(1));
105
- break;
106
-
107
103
  case "dashboard": {
108
104
  const { dashboardCommand } = await import("./commands/dashboard.js");
109
105
  await dashboardCommand(args.slice(1));
@@ -128,7 +124,7 @@ async function main() {
128
124
  case "verify-contract":
129
125
  await verifyApiContractCommand();
130
126
  break;
131
-
127
+
132
128
  case "update-contract":
133
129
  await updateApiContractCommand();
134
130
  break;
@@ -287,7 +283,7 @@ Commands:
287
283
  check Perform an enterprise-grade system health check
288
284
  status Show active phase, trace ID, and agent statuses
289
285
  trace:new <desc> Start a new task chain with a unique Trace ID
290
- create-app <idea> Generate a new full-stack app from natural language
286
+ plan Read all docs/ files and create planning tasks
291
287
  orchestrate Start the dynamic Hermes agent orchestration loop
292
288
  verify-contract Validate type alignment between backend and frontend
293
289
  update-contract Generate and synchronize a new contract hash
@@ -314,8 +310,8 @@ Example:
314
310
  `);
315
311
  }
316
312
 
317
- import { logger } from "../shared/logger.js";
318
313
  import { EnderunBaseError } from "../shared/errors.js";
314
+ import { logger } from "../shared/logger.js";
319
315
 
320
316
  main().catch((err) => {
321
317
  if (err instanceof EnderunBaseError) {
@@ -330,4 +326,3 @@ main().catch((err) => {
330
326
  logger.fatal("Fatal exception during CLI execution", err);
331
327
  process.exit(1);
332
328
  });
333
-