agent-enderun 1.1.6 → 1.1.8

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 (254) hide show
  1. package/ENDERUN.md +12 -9
  2. package/README.md +12 -29
  3. package/bin/run-multi-test.js +77 -0
  4. package/dist/framework-mcp/src/tools/dashboard/start_dashboard.d.ts +5 -0
  5. package/dist/framework-mcp/src/tools/dashboard/start_dashboard.js +30 -0
  6. package/dist/framework-mcp/src/tools/dashboard/start_dashboard.js.map +1 -0
  7. package/dist/framework-mcp/src/tools/definitions.js +118 -0
  8. package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
  9. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.d.ts +5 -0
  10. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js +51 -0
  11. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js.map +1 -0
  12. package/dist/framework-mcp/src/tools/file_system/replace_text.js +8 -4
  13. package/dist/framework-mcp/src/tools/file_system/replace_text.js.map +1 -1
  14. package/dist/framework-mcp/src/tools/file_system/write_file.js +3 -0
  15. package/dist/framework-mcp/src/tools/file_system/write_file.js.map +1 -1
  16. package/dist/framework-mcp/src/tools/framework/audit_deps.d.ts +6 -0
  17. package/dist/framework-mcp/src/tools/framework/audit_deps.js +42 -0
  18. package/dist/framework-mcp/src/tools/framework/audit_deps.js.map +1 -0
  19. package/dist/framework-mcp/src/tools/framework/run_tests.d.ts +5 -0
  20. package/dist/framework-mcp/src/tools/framework/run_tests.js +26 -0
  21. package/dist/framework-mcp/src/tools/framework/run_tests.js.map +1 -0
  22. package/dist/framework-mcp/src/tools/index.js +24 -0
  23. package/dist/framework-mcp/src/tools/index.js.map +1 -1
  24. package/dist/framework-mcp/src/tools/memory/get_insights.d.ts +6 -0
  25. package/dist/framework-mcp/src/tools/memory/get_insights.js +35 -0
  26. package/dist/framework-mcp/src/tools/memory/get_insights.js.map +1 -0
  27. package/dist/framework-mcp/src/tools/memory/read_memory.d.ts +6 -0
  28. package/dist/framework-mcp/src/tools/memory/read_memory.js +29 -0
  29. package/dist/framework-mcp/src/tools/memory/read_memory.js.map +1 -0
  30. package/dist/framework-mcp/src/tools/messaging/send_message.js +1 -1
  31. package/dist/framework-mcp/src/tools/messaging/send_message.js.map +1 -1
  32. package/dist/framework-mcp/src/tools/observability/check_ports.d.ts +5 -0
  33. package/dist/framework-mcp/src/tools/observability/check_ports.js +27 -0
  34. package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -0
  35. package/dist/framework-mcp/src/tools/observability/get_health.d.ts +5 -0
  36. package/dist/framework-mcp/src/tools/observability/get_health.js +20 -0
  37. package/dist/framework-mcp/src/tools/observability/get_health.js.map +1 -0
  38. package/dist/framework-mcp/src/tools/search/get_gaps.d.ts +6 -0
  39. package/dist/framework-mcp/src/tools/search/get_gaps.js +49 -0
  40. package/dist/framework-mcp/src/tools/search/get_gaps.js.map +1 -0
  41. package/dist/framework-mcp/src/tools/search/get_map.d.ts +6 -0
  42. package/dist/framework-mcp/src/tools/search/get_map.js +44 -0
  43. package/dist/framework-mcp/src/tools/search/get_map.js.map +1 -0
  44. package/dist/framework-mcp/src/tools/search/grep_search.d.ts +5 -0
  45. package/dist/framework-mcp/src/tools/search/grep_search.js +60 -0
  46. package/dist/framework-mcp/src/tools/search/grep_search.js.map +1 -0
  47. package/dist/framework-mcp/src/tools/search/list_dir.d.ts +5 -0
  48. package/dist/framework-mcp/src/tools/search/list_dir.js +29 -0
  49. package/dist/framework-mcp/src/tools/search/list_dir.js.map +1 -0
  50. package/dist/framework-mcp/src/tools/types.d.ts +10 -5
  51. package/dist/framework-mcp/src/utils/compliance.d.ts +5 -0
  52. package/dist/framework-mcp/src/utils/compliance.js +30 -0
  53. package/dist/framework-mcp/src/utils/compliance.js.map +1 -0
  54. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +5 -5
  55. package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
  56. package/dist/src/cli/adapters/types.d.ts +2 -2
  57. package/dist/src/cli/adapters.d.ts +3 -3
  58. package/dist/src/cli/adapters.js +53 -79
  59. package/dist/src/cli/adapters.js.map +1 -1
  60. package/dist/src/cli/commands/check.js +52 -6
  61. package/dist/src/cli/commands/check.js.map +1 -1
  62. package/dist/src/cli/commands/init.d.ts +5 -1
  63. package/dist/src/cli/commands/init.js +186 -172
  64. package/dist/src/cli/commands/init.js.map +1 -1
  65. package/dist/src/cli/commands/orchestrate.d.ts +3 -3
  66. package/dist/src/cli/commands/orchestrate.js +14 -8
  67. package/dist/src/cli/commands/orchestrate.js.map +1 -1
  68. package/dist/src/cli/commands/status.js +3 -2
  69. package/dist/src/cli/commands/status.js.map +1 -1
  70. package/dist/src/cli/index.js +4 -3
  71. package/dist/src/cli/index.js.map +1 -1
  72. package/dist/src/cli/shims.js +6 -6
  73. package/dist/src/cli/utils/app-backend.d.ts +2 -0
  74. package/dist/src/cli/utils/app-backend.js +236 -0
  75. package/dist/src/cli/utils/app-backend.js.map +1 -0
  76. package/dist/src/cli/utils/app-docs.d.ts +3 -0
  77. package/dist/src/cli/utils/app-docs.js +59 -0
  78. package/dist/src/cli/utils/app-docs.js.map +1 -0
  79. package/dist/src/cli/utils/app-frontend.d.ts +2 -0
  80. package/dist/src/cli/utils/app-frontend.js +248 -0
  81. package/dist/src/cli/utils/app-frontend.js.map +1 -0
  82. package/dist/src/cli/utils/app-inferrer.d.ts +14 -0
  83. package/dist/src/cli/utils/app-inferrer.js +39 -0
  84. package/dist/src/cli/utils/app-inferrer.js.map +1 -0
  85. package/dist/src/cli/utils/app-types.d.ts +3 -0
  86. package/dist/src/cli/utils/app-types.js +233 -0
  87. package/dist/src/cli/utils/app-types.js.map +1 -0
  88. package/dist/src/cli/utils/app.d.ts +5 -32
  89. package/dist/src/cli/utils/app.js +5 -794
  90. package/dist/src/cli/utils/app.js.map +1 -1
  91. package/dist/src/cli/utils/memory.js +8 -4
  92. package/dist/src/cli/utils/memory.js.map +1 -1
  93. package/dist/src/modules/adapters/antigravity-cli.js +3 -3
  94. package/dist/src/modules/adapters/antigravity-cli.js.map +1 -1
  95. package/dist/src/modules/adapters/claude.js +1 -1
  96. package/dist/src/modules/adapters/claude.js.map +1 -1
  97. package/dist/src/modules/adapters/codex.js +2 -2
  98. package/dist/src/modules/adapters/codex.js.map +1 -1
  99. package/dist/src/modules/adapters/cursor.js +1 -1
  100. package/dist/src/modules/adapters/cursor.js.map +1 -1
  101. package/dist/src/modules/adapters/definitions.d.ts +9 -0
  102. package/dist/src/modules/adapters/definitions.js +124 -0
  103. package/dist/src/modules/adapters/definitions.js.map +1 -0
  104. package/dist/src/modules/adapters/gemini.js +2 -2
  105. package/dist/src/modules/adapters/gemini.js.map +1 -1
  106. package/dist/src/modules/adapters/grok.js +1 -1
  107. package/dist/src/modules/adapters/grok.js.map +1 -1
  108. package/dist/src/modules/agents/definitions.js +26 -27
  109. package/dist/src/modules/agents/definitions.js.map +1 -1
  110. package/dist/src/shared/config.d.ts +3 -3
  111. package/dist/src/shared/logger.js +8 -5
  112. package/dist/src/shared/logger.js.map +1 -1
  113. package/dist/tests/adapter.test.d.ts +1 -0
  114. package/dist/tests/adapter.test.js +128 -0
  115. package/dist/tests/adapter.test.js.map +1 -0
  116. package/dist/tests/agents-definitions.test.d.ts +1 -0
  117. package/dist/tests/agents-definitions.test.js +54 -0
  118. package/dist/tests/agents-definitions.test.js.map +1 -0
  119. package/dist/tests/approve.test.d.ts +1 -0
  120. package/dist/tests/approve.test.js +88 -0
  121. package/dist/tests/approve.test.js.map +1 -0
  122. package/dist/tests/config.test.d.ts +1 -0
  123. package/dist/tests/config.test.js +58 -0
  124. package/dist/tests/config.test.js.map +1 -0
  125. package/dist/tests/container.runner.d.ts +1 -0
  126. package/dist/tests/container.runner.js +68 -0
  127. package/dist/tests/container.runner.js.map +1 -0
  128. package/dist/tests/container.test.d.ts +1 -0
  129. package/dist/tests/container.test.js +73 -0
  130. package/dist/tests/container.test.js.map +1 -0
  131. package/dist/tests/errors.test.d.ts +1 -0
  132. package/dist/tests/errors.test.js +64 -0
  133. package/dist/tests/errors.test.js.map +1 -0
  134. package/dist/tests/fs-utils.test.d.ts +1 -0
  135. package/dist/tests/fs-utils.test.js +101 -0
  136. package/dist/tests/fs-utils.test.js.map +1 -0
  137. package/dist/tests/logger.test.d.ts +1 -0
  138. package/dist/tests/logger.test.js +81 -0
  139. package/dist/tests/logger.test.js.map +1 -0
  140. package/dist/tests/memory-utils.test.d.ts +1 -0
  141. package/dist/tests/memory-utils.test.js +173 -0
  142. package/dist/tests/memory-utils.test.js.map +1 -0
  143. package/dist/tests/orchestrate.test.d.ts +1 -0
  144. package/dist/tests/orchestrate.test.js +131 -0
  145. package/dist/tests/orchestrate.test.js.map +1 -0
  146. package/dist/tests/skills-definitions.test.d.ts +1 -0
  147. package/dist/tests/skills-definitions.test.js +34 -0
  148. package/dist/tests/skills-definitions.test.js.map +1 -0
  149. package/dist/tests/status.test.d.ts +1 -0
  150. package/dist/tests/status.test.js +105 -0
  151. package/dist/tests/status.test.js.map +1 -0
  152. package/dist/tests/string.test.d.ts +1 -0
  153. package/dist/tests/string.test.js +89 -0
  154. package/dist/tests/string.test.js.map +1 -0
  155. package/dist/tests/time.test.d.ts +1 -0
  156. package/dist/tests/time.test.js +48 -0
  157. package/dist/tests/time.test.js.map +1 -0
  158. package/dist/tests/trace.test.d.ts +1 -0
  159. package/dist/tests/trace.test.js +61 -0
  160. package/dist/tests/trace.test.js.map +1 -0
  161. package/dist/vitest.config.js +1 -0
  162. package/dist/vitest.config.js.map +1 -1
  163. package/docs/getting-started.md +4 -0
  164. package/docs/user/corporate-governance.md +25 -0
  165. package/eslint.config.js +25 -3
  166. package/framework-mcp/dist/tools/dashboard/start_dashboard.js +29 -0
  167. package/framework-mcp/dist/tools/definitions.js +118 -0
  168. package/framework-mcp/dist/tools/file_system/batch_surgical_edit.js +50 -0
  169. package/framework-mcp/dist/tools/file_system/replace_text.js +8 -4
  170. package/framework-mcp/dist/tools/file_system/write_file.js +3 -0
  171. package/framework-mcp/dist/tools/framework/audit_deps.js +41 -0
  172. package/framework-mcp/dist/tools/framework/run_tests.js +25 -0
  173. package/framework-mcp/dist/tools/index.js +24 -0
  174. package/framework-mcp/dist/tools/memory/get_insights.js +34 -0
  175. package/framework-mcp/dist/tools/memory/read_memory.js +28 -0
  176. package/framework-mcp/dist/tools/messaging/send_message.js +1 -1
  177. package/framework-mcp/dist/tools/observability/check_ports.js +26 -0
  178. package/framework-mcp/dist/tools/observability/get_health.js +19 -0
  179. package/framework-mcp/dist/tools/search/get_gaps.js +48 -0
  180. package/framework-mcp/dist/tools/search/get_map.js +43 -0
  181. package/framework-mcp/dist/tools/search/grep_search.js +59 -0
  182. package/framework-mcp/dist/tools/search/list_dir.js +28 -0
  183. package/framework-mcp/dist/utils/compliance.js +29 -0
  184. package/framework-mcp/package.json +2 -2
  185. package/framework-mcp/src/tools/dashboard/start_dashboard.ts +33 -0
  186. package/framework-mcp/src/tools/definitions.ts +118 -0
  187. package/framework-mcp/src/tools/file_system/batch_surgical_edit.ts +70 -0
  188. package/framework-mcp/src/tools/file_system/replace_text.ts +10 -4
  189. package/framework-mcp/src/tools/file_system/write_file.ts +5 -0
  190. package/framework-mcp/src/tools/framework/audit_deps.ts +49 -0
  191. package/framework-mcp/src/tools/framework/run_tests.ts +28 -0
  192. package/framework-mcp/src/tools/index.ts +24 -0
  193. package/framework-mcp/src/tools/memory/get_insights.ts +41 -0
  194. package/framework-mcp/src/tools/memory/read_memory.ts +31 -0
  195. package/framework-mcp/src/tools/messaging/send_message.ts +1 -1
  196. package/framework-mcp/src/tools/observability/check_ports.ts +30 -0
  197. package/framework-mcp/src/tools/observability/get_health.ts +24 -0
  198. package/framework-mcp/src/tools/search/get_gaps.ts +54 -0
  199. package/framework-mcp/src/tools/search/get_map.ts +48 -0
  200. package/framework-mcp/src/tools/search/grep_search.ts +65 -0
  201. package/framework-mcp/src/tools/search/list_dir.ts +34 -0
  202. package/framework-mcp/src/tools/types.ts +11 -1
  203. package/framework-mcp/src/utils/compliance.ts +37 -0
  204. package/framework-mcp/tests/tools/messaging/send_message.test.ts +5 -5
  205. package/package.json +3 -3
  206. package/src/cli/adapters/types.ts +2 -2
  207. package/src/cli/adapters.ts +57 -86
  208. package/src/cli/commands/check.ts +52 -6
  209. package/src/cli/commands/init.ts +202 -193
  210. package/src/cli/commands/orchestrate.ts +14 -8
  211. package/src/cli/commands/status.ts +3 -2
  212. package/src/cli/index.ts +4 -3
  213. package/src/cli/shims.ts +6 -6
  214. package/src/cli/utils/app-backend.ts +249 -0
  215. package/src/cli/utils/app-docs.ts +65 -0
  216. package/src/cli/utils/app-frontend.ts +257 -0
  217. package/src/cli/utils/app-inferrer.ts +53 -0
  218. package/src/cli/utils/app-types.ts +243 -0
  219. package/src/cli/utils/app.ts +5 -849
  220. package/src/cli/utils/memory.ts +8 -4
  221. package/src/modules/adapters/definitions.ts +125 -0
  222. package/src/modules/agents/definitions.ts +26 -27
  223. package/src/shared/logger.ts +8 -5
  224. package/templates/prompts/bug-fix-recipe.md +20 -0
  225. package/templates/prompts/new-feature-recipe.md +19 -0
  226. package/templates/prompts/refactoring-recipe.md +21 -0
  227. package/templates/standards/architecture-standards.md +23 -0
  228. package/templates/standards/crud-governance.md +21 -0
  229. package/templates/standards/frontend-standards.md +38 -0
  230. package/templates/standards/i18n-standards.md +17 -0
  231. package/templates/standards/logging-and-secrets.md +29 -0
  232. package/templates/standards/mobile-standards.md +24 -0
  233. package/templates/standards/quality-standards.md +31 -0
  234. package/templates/standards/security-standards.md +21 -0
  235. package/templates/standards/tailwind-standards.md +20 -0
  236. package/templates/standards/testing-standards.md +31 -0
  237. package/src/modules/adapters/antigravity-cli.ts +0 -25
  238. package/src/modules/adapters/claude.ts +0 -36
  239. package/src/modules/adapters/codex.ts +0 -22
  240. package/src/modules/adapters/cursor.ts +0 -22
  241. package/src/modules/adapters/gemini.ts +0 -27
  242. package/src/modules/adapters/grok.ts +0 -20
  243. package/templates/architecture/agents-manifest.md +0 -79
  244. package/templates/architecture/approval-flows.md +0 -61
  245. package/templates/architecture/enterprise-architecture.md +0 -69
  246. package/templates/architecture/standards/crud-governance.md +0 -46
  247. package/templates/architecture/standards/data-fetching-patterns.md +0 -13
  248. package/templates/architecture/standards/design-system.md +0 -31
  249. package/templates/architecture/standards/documentation-ownership.md +0 -21
  250. package/templates/architecture/standards/logging.md +0 -7
  251. package/templates/architecture/standards/mobile-standards.md +0 -48
  252. package/templates/architecture/standards/tech-stack.md +0 -9
  253. package/templates/backend/error-handling.md +0 -74
  254. package/templates/frontend/component-patterns.md +0 -91
@@ -0,0 +1,34 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { CORE_SKILLS } from "../src/modules/skills/definitions.js";
3
+ describe("Skills Definitions", () => {
4
+ it("should define all core skills with proper keys", () => {
5
+ const keys = Object.keys(CORE_SKILLS);
6
+ expect(keys).toContain("FILE_SYSTEM");
7
+ expect(keys).toContain("EDITING");
8
+ expect(keys).toContain("ORCHESTRATION");
9
+ expect(keys).toContain("GOVERNANCE");
10
+ expect(keys).toContain("QUALITY_ASSURANCE");
11
+ expect(keys).toContain("DATABASE_MANAGEMENT");
12
+ expect(keys).toContain("DEVOPS_INFRASTRUCTURE");
13
+ });
14
+ it("should ensure all skills have valid properties, mandates and tools", () => {
15
+ for (const [, skill] of Object.entries(CORE_SKILLS)) {
16
+ expect(skill.name).toBeTypeOf("string");
17
+ expect(skill.name.length).toBeGreaterThan(0);
18
+ expect(skill.description).toBeTypeOf("string");
19
+ expect(skill.description.length).toBeGreaterThan(0);
20
+ expect(Array.isArray(skill.tools)).toBe(true);
21
+ expect(skill.tools.length).toBeGreaterThan(0);
22
+ for (const tool of skill.tools) {
23
+ expect(tool).toBeTypeOf("string");
24
+ }
25
+ expect(Array.isArray(skill.mandates)).toBe(true);
26
+ expect(skill.mandates.length).toBeGreaterThan(0);
27
+ for (const mandate of skill.mandates) {
28
+ expect(mandate).toBeTypeOf("string");
29
+ expect(mandate.length).toBeGreaterThan(0);
30
+ }
31
+ }
32
+ });
33
+ });
34
+ //# sourceMappingURL=skills-definitions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-definitions.test.js","sourceRoot":"","sources":["../../tests/skills-definitions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC1E,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAE7C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACjD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnC,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,105 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { statusCommand } from "../src/cli/commands/status.js";
5
+ describe("Status Command", () => {
6
+ const tempDir = path.join(process.cwd(), "tests", "temp-status-test");
7
+ let cwdSpy;
8
+ beforeEach(() => {
9
+ vi.resetModules();
10
+ if (!fs.existsSync(tempDir)) {
11
+ fs.mkdirSync(tempDir, { recursive: true });
12
+ }
13
+ cwdSpy = vi.spyOn(process, "cwd").mockReturnValue(tempDir);
14
+ });
15
+ afterEach(() => {
16
+ cwdSpy.mockRestore();
17
+ if (fs.existsSync(tempDir)) {
18
+ fs.rmSync(tempDir, { recursive: true, force: true });
19
+ }
20
+ });
21
+ it("should print error if PROJECT_MEMORY.md is missing", async () => {
22
+ const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
23
+ statusCommand();
24
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("PROJECT_MEMORY.md not found"));
25
+ consoleErrorSpy.mockRestore();
26
+ });
27
+ it("should parse Table Style status correctly", async () => {
28
+ const frameworkDir = path.join(tempDir, ".gemini");
29
+ fs.mkdirSync(frameworkDir, { recursive: true });
30
+ const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
31
+ const tableMemory = `## STATUS
32
+ | Active Phase | Profile | Last Update | Active Trace ID | Blockers |
33
+ | :----------- | :------ | :---------- | :-------------- | :------- |
34
+ | Phase 1 | Dev | 2024-06-07 | 01HY7Y2A00ABC | None |
35
+
36
+ ## ACTIVE TASKS
37
+ | Task 1 |
38
+ `;
39
+ fs.writeFileSync(memoryPath, tableMemory);
40
+ const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
41
+ statusCommand();
42
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Phase: Phase 1"));
43
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Profile: Dev"));
44
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Trace ID: 01HY7Y2A00ABC"));
45
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Blockers: None"));
46
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Active Tasks:"));
47
+ consoleWarnSpy.mockRestore();
48
+ });
49
+ it("should parse List Style status and render manager state correctly", async () => {
50
+ const frameworkDir = path.join(tempDir, ".gemini");
51
+ fs.mkdirSync(frameworkDir, { recursive: true });
52
+ const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
53
+ const listMemory = `## STATUS
54
+ - Phase: Phase 2
55
+ - Profile: Prod
56
+ - Last Update: 2024-06-08
57
+ - Trace ID: 01HY7Y2A00XYZ
58
+ - Blockers: High CPU
59
+ - @manager state: EXECUTING
60
+ `;
61
+ fs.writeFileSync(memoryPath, listMemory);
62
+ const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
63
+ statusCommand();
64
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Phase: Phase 2"));
65
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Profile: Prod"));
66
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Trace ID: 01HY7Y2A00XYZ"));
67
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Blockers: High CPU"));
68
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Manager: EXECUTING"));
69
+ consoleWarnSpy.mockRestore();
70
+ });
71
+ it("should print warning when format is unrecognized", async () => {
72
+ const frameworkDir = path.join(tempDir, ".gemini");
73
+ fs.mkdirSync(frameworkDir, { recursive: true });
74
+ const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
75
+ fs.writeFileSync(memoryPath, "## STATUS\nRandom text that matches no format.\n");
76
+ const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
77
+ statusCommand();
78
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Status data could not be parsed"));
79
+ consoleWarnSpy.mockRestore();
80
+ });
81
+ it("should display Enderun Army Status if STATUS.md exists", async () => {
82
+ const frameworkDir = path.join(tempDir, ".gemini");
83
+ fs.mkdirSync(frameworkDir, { recursive: true });
84
+ const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
85
+ fs.writeFileSync(memoryPath, "## STATUS\n- Phase: Phase 1\n");
86
+ const statusPath = path.join(frameworkDir, "STATUS.md");
87
+ const statusContent = `
88
+ # Status Log
89
+ | Agent | State | Active Task |
90
+ |---|---|---|
91
+ | @manager | READY | Idle |
92
+ | @coder | EXECUTING | Writing Tests |
93
+ | @tester | BLOCKED | Sandbox issue |
94
+ `;
95
+ fs.writeFileSync(statusPath, statusContent);
96
+ const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
97
+ statusCommand();
98
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("Enderun Army Status"));
99
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("@manager"));
100
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("@coder"));
101
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("@tester"));
102
+ consoleWarnSpy.mockRestore();
103
+ });
104
+ });
105
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../tests/status.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { insertTaskRow, sanitizeTableCell, normalizeAgentName, normalizePriority, slugifyName, titleCase } from "../src/cli/utils/string.js";
3
+ describe("String Utilities", () => {
4
+ describe("insertTaskRow", () => {
5
+ it("should insert a row directly under the active tasks table divider", () => {
6
+ const memoryContent = "## ACTIVE TASKS\n| Task | Status |\n| :--- | :--- | :--- | :--- | :--- |\n| Existing Task | Done |\n";
7
+ const row = "| New Task | Pending |";
8
+ const result = insertTaskRow(memoryContent, row);
9
+ expect(result).toBe("## ACTIVE TASKS\n| Task | Status |\n| :--- | :--- | :--- | :--- | :--- |\n| New Task | Pending |\n| Existing Task | Done |\n");
10
+ });
11
+ it("should return null if ## ACTIVE TASKS section is missing", () => {
12
+ const memoryContent = "## TASKS\n| :--- | :--- | :--- | :--- | :--- |\n";
13
+ const result = insertTaskRow(memoryContent, "| Row |");
14
+ expect(result).toBeNull();
15
+ });
16
+ it("should return null if table divider is missing", () => {
17
+ const memoryContent = "## ACTIVE TASKS\n| Task | Status |\n";
18
+ const result = insertTaskRow(memoryContent, "| Row |");
19
+ expect(result).toBeNull();
20
+ });
21
+ });
22
+ describe("sanitizeTableCell", () => {
23
+ it("should escape vertical pipes", () => {
24
+ expect(sanitizeTableCell("Value | with | pipes")).toBe("Value \\| with \\| pipes");
25
+ });
26
+ it("should replace newlines with spaces", () => {
27
+ expect(sanitizeTableCell("Line 1\nLine 2\r\nLine 3")).toBe("Line 1 Line 2 Line 3");
28
+ });
29
+ it("should trim surrounding whitespace", () => {
30
+ expect(sanitizeTableCell(" some value ")).toBe("some value");
31
+ });
32
+ it("should handle non-string inputs", () => {
33
+ expect(sanitizeTableCell(12345)).toBe("12345");
34
+ expect(sanitizeTableCell(true)).toBe("true");
35
+ });
36
+ });
37
+ describe("normalizeAgentName", () => {
38
+ it("should remove leading @ symbols", () => {
39
+ expect(normalizeAgentName("@manager")).toBe("manager");
40
+ expect(normalizeAgentName("@@@coder")).toBe("coder");
41
+ });
42
+ it("should fallback to manager if name is empty, null or undefined", () => {
43
+ expect(normalizeAgentName(undefined)).toBe("manager");
44
+ expect(normalizeAgentName(null)).toBe("manager");
45
+ expect(normalizeAgentName("")).toBe("manager");
46
+ expect(normalizeAgentName(" ")).toBe("manager");
47
+ });
48
+ it("should trim whitespace", () => {
49
+ expect(normalizeAgentName(" coder ")).toBe("coder");
50
+ });
51
+ });
52
+ describe("normalizePriority", () => {
53
+ it("should accept valid priorities P0, P1, P2, P3", () => {
54
+ expect(normalizePriority("P0")).toBe("P0");
55
+ expect(normalizePriority("p1")).toBe("P1");
56
+ expect(normalizePriority(" P3 ")).toBe("P3");
57
+ });
58
+ it("should fallback to P2 for invalid priorities", () => {
59
+ expect(normalizePriority("P4")).toBe("P2");
60
+ expect(normalizePriority("invalid")).toBe("P2");
61
+ expect(normalizePriority(null)).toBe("P2");
62
+ expect(normalizePriority(undefined)).toBe("P2");
63
+ });
64
+ });
65
+ describe("slugifyName", () => {
66
+ it("should convert to lowercase, replace special chars with hyphens and trim hyphens", () => {
67
+ expect(slugifyName("Enderun App Core")).toBe("enderun-app-core");
68
+ expect(slugifyName("Agent-Manager_123!")).toBe("agent-manager-123");
69
+ expect(slugifyName("---Leading-Trailing---")).toBe("leading-trailing");
70
+ });
71
+ it("should fallback to enderun-app for empty or invalid slugs", () => {
72
+ expect(slugifyName("")).toBe("enderun-app");
73
+ expect(slugifyName("!!!")).toBe("enderun-app");
74
+ expect(slugifyName(null)).toBe("enderun-app");
75
+ });
76
+ });
77
+ describe("titleCase", () => {
78
+ it("should format string to Title Case and handle delimiters", () => {
79
+ expect(titleCase("enderun-app-core")).toBe("Enderun App Core");
80
+ expect(titleCase("agent_manager_test")).toBe("Agent Manager Test");
81
+ expect(titleCase(" multiple spaces ")).toBe("Multiple Spaces");
82
+ });
83
+ it("should fallback to Enderun App for empty input", () => {
84
+ expect(titleCase("")).toBe("Enderun App");
85
+ expect(titleCase(null)).toBe("Enderun App");
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=string.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.test.js","sourceRoot":"","sources":["../../tests/string.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { generateULID, sleep } from "../src/cli/utils/time.js";
3
+ describe("Time Utilities", () => {
4
+ describe("generateULID", () => {
5
+ const CROCKFORD_BASE32 = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
6
+ it("should generate a 26 character string", () => {
7
+ const ulid = generateULID();
8
+ expect(ulid).toHaveLength(26);
9
+ });
10
+ it("should only contain valid Crockford's base32 characters (excluding I, L, O, U)", () => {
11
+ const ulid = generateULID();
12
+ for (const char of ulid) {
13
+ expect(CROCKFORD_BASE32).toContain(char);
14
+ expect("ILOU").not.toContain(char);
15
+ }
16
+ });
17
+ it("should be deterministic when given a seed time and seed number", () => {
18
+ const seedTime = 1717718400000; // 2024-06-07T00:00:00.000Z
19
+ const seed = 42;
20
+ const ulid1 = generateULID(seedTime, seed);
21
+ const ulid2 = generateULID(seedTime, seed);
22
+ expect(ulid1).toBe(ulid2);
23
+ expect(ulid1).toHaveLength(26);
24
+ // Ensure first 10 chars encode seedTime correctly in base32
25
+ expect(ulid1.substring(0, 10)).toBe("01HY7Y2A00");
26
+ });
27
+ it("should generate different random parts without a seed even at the same seedTime", () => {
28
+ const seedTime = Date.now();
29
+ const ulid1 = generateULID(seedTime);
30
+ const ulid2 = generateULID(seedTime);
31
+ expect(ulid1).not.toBe(ulid2);
32
+ expect(ulid1.substring(0, 10)).toBe(ulid2.substring(0, 10)); // Time part must be equal
33
+ expect(ulid1.substring(10)).not.toBe(ulid2.substring(10)); // Random part must differ
34
+ });
35
+ });
36
+ describe("sleep", () => {
37
+ it("should delay execution by approximately the specified time", () => {
38
+ const start = Date.now();
39
+ const delay = 50; // 50ms
40
+ sleep(delay);
41
+ const duration = Date.now() - start;
42
+ // Atomics.wait is quite precise, but let's give a generous buffer for CI
43
+ expect(duration).toBeGreaterThanOrEqual(delay - 5);
44
+ expect(duration).toBeLessThanOrEqual(delay + 50);
45
+ });
46
+ });
47
+ });
48
+ //# sourceMappingURL=time.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.test.js","sourceRoot":"","sources":["../../tests/time.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAE/D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC1B,MAAM,gBAAgB,GAAG,kCAAkC,CAAC;QAE5D,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC7C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;YACtF,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACtE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,2BAA2B;YAC3D,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC/B,4DAA4D;YAC5D,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;YACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YAErC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,0BAA0B;YACvF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,0BAA0B;QACzF,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,OAAO;YACzB,KAAK,CAAC,KAAK,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAEpC,yEAAyE;YACzE,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { traceNewCommand } from "../src/cli/commands/trace.js";
5
+ describe("Trace Command", () => {
6
+ const tempDir = path.join(process.cwd(), "tests", "temp-trace-test");
7
+ let cwdSpy;
8
+ beforeEach(() => {
9
+ vi.resetModules();
10
+ if (!fs.existsSync(tempDir)) {
11
+ fs.mkdirSync(tempDir, { recursive: true });
12
+ }
13
+ cwdSpy = vi.spyOn(process, "cwd").mockReturnValue(tempDir);
14
+ });
15
+ afterEach(() => {
16
+ cwdSpy.mockRestore();
17
+ if (fs.existsSync(tempDir)) {
18
+ fs.rmSync(tempDir, { recursive: true, force: true });
19
+ }
20
+ });
21
+ it("should print error if PROJECT_MEMORY.md is missing", async () => {
22
+ const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
23
+ const result = traceNewCommand("Test description");
24
+ expect(result).toBeUndefined();
25
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("PROJECT_MEMORY.md not found"));
26
+ consoleErrorSpy.mockRestore();
27
+ });
28
+ it("should print error if ACTIVE TASKS table is missing in PROJECT_MEMORY.md", async () => {
29
+ // Setup mock environment structure
30
+ const frameworkDir = path.join(tempDir, ".gemini");
31
+ fs.mkdirSync(frameworkDir, { recursive: true });
32
+ const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
33
+ fs.writeFileSync(memoryPath, "# PROJECT MEMORY\nNo tasks table here.\n");
34
+ const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
35
+ const result = traceNewCommand("Test description");
36
+ expect(result).toBeUndefined();
37
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("ACTIVE TASKS table not found"));
38
+ consoleErrorSpy.mockRestore();
39
+ });
40
+ it("should successfully generate Trace ID and add task to table", async () => {
41
+ const frameworkDir = path.join(tempDir, ".gemini");
42
+ fs.mkdirSync(frameworkDir, { recursive: true });
43
+ const memoryPath = path.join(frameworkDir, "PROJECT_MEMORY.md");
44
+ // Setup proper template with ACTIVE TASKS table
45
+ const template = "## CURRENT STATUS\n\n## ACTIVE TASKS\n| Trace ID | Description | Agent | Priority | Status |\n| :--- | :--- | :--- | :--- | :--- |\n";
46
+ fs.writeFileSync(memoryPath, template);
47
+ const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
48
+ const traceId = traceNewCommand("Implement tests", "coder", "P1");
49
+ expect(traceId).toBeDefined();
50
+ expect(typeof traceId).toBe("string");
51
+ expect(traceId).toHaveLength(26);
52
+ const updatedContent = fs.readFileSync(memoryPath, "utf8");
53
+ expect(updatedContent).toContain(traceId);
54
+ expect(updatedContent).toContain("Implement tests");
55
+ expect(updatedContent).toContain("@coder");
56
+ expect(updatedContent).toContain("P1");
57
+ expect(updatedContent).toContain("IN_PROGRESS");
58
+ consoleWarnSpy.mockRestore();
59
+ });
60
+ });
61
+ //# sourceMappingURL=trace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.test.js","sourceRoot":"","sources":["../../tests/trace.test.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export default defineConfig({
4
4
  globals: true,
5
5
  environment: "node",
6
6
  include: ["tests/**/*.test.ts", "framework-mcp/tests/**/*.test.ts"],
7
+ cache: false,
7
8
  coverage: {
8
9
  provider: "v8",
9
10
  reporter: ["text", "json", "html"],
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IACxB,IAAI,EAAE;QACF,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;QACnE,QAAQ,EAAE;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAClC,UAAU,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,EAAE;aACjB;SACJ;KACJ;CACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IACxB,IAAI,EAAE;QACF,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;QACnE,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAClC,UAAU,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,EAAE;aACjB;SACJ;KACJ;CACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ # 🚀 Getting Started
2
+
3
+ ## Project Requirements
4
+ Write the core requirements and features of your application here.
@@ -0,0 +1,25 @@
1
+ # 🏛️ Kurumsal Yönetim Asistanı Kurulum Rehberi
2
+
3
+ Agent Enderun, projenize entegre edildiğinde sadece kod yazmakla kalmaz, aynı zamanda kurumsal standartlarınızı koruyan bir **Yönetim Asistanı** (AL Assistant) olarak görev yapar.
4
+
5
+ ## 🚀 Nasıl Çalışır?
6
+
7
+ 1. **İlklendirme:** `npx agent-enderun init gemini --unified` komutunu çalıştırdığınızda, kurumsal standartlar `.gemini/knowledge/` dizinine otomatik olarak kopyalanır.
8
+ 2. **Ajan Disiplini:** `@manager` ajanı, tüm geliştirmeleri bu standartlara göre denetler. Eğer bir uzman ajan (örn: `@backend`) kurumsal kurallara aykırı bir işlem yapmaya çalışırsa (örn: `any` tipi kullanmak veya doğrudan DB silme işlemi), `@manager` bu işlemi durdurur ve onay mekanizmasını tetikler.
9
+ 3. **AL (Agent Lifecycle):** Projeniz Faz 0'dan Faz 4'e kadar disiplinli bir şekilde ilerler.
10
+
11
+ ## 🛠️ Standartları Özelleştirme
12
+
13
+ Kendi kurumsal kurallarınızı eklemek için şu dosyaları düzenleyebilirsiniz:
14
+ - `.gemini/knowledge/crud-governance.md`: Veri erişim ve güvenlik kuralları.
15
+ - `.gemini/knowledge/architecture-standards.md`: Mimari katman ve teknoloji standartları.
16
+ - `ENDERUN.md`: Projenin genel anayasası.
17
+
18
+ ## 🎖️ Denetim Komutları
19
+
20
+ - `agent-enderun check`: Projenin kurumsal standartlara ve dosya yapısına uyumunu denetler.
21
+ - `agent-enderun status`: Aktif fazı ve ajanların durumunu gösterir.
22
+ - `agent-enderun approve [TraceID]`: `@manager` tarafından durdurulan yüksek riskli işlemler için insan onayı verir.
23
+
24
+ ---
25
+ *Agent Enderun ile projeleriniz kurumsal disiplin altında, otonom ve güvenli bir şekilde büyür.*
package/eslint.config.js CHANGED
@@ -1,5 +1,5 @@
1
- import globals from "globals";
2
1
  import js from "@eslint/js";
2
+ import globals from "globals";
3
3
  import tseslint from "typescript-eslint";
4
4
 
5
5
  const styleRules = {
@@ -30,7 +30,7 @@ export default tseslint.config(
30
30
  js.configs.recommended,
31
31
  ...tseslint.configs.recommended,
32
32
  {
33
- files: ["**/*.{ts,tsx}"],
33
+ files: ["src/**/*.{ts,tsx}", "framework-mcp/src/**/*.{ts,tsx}"],
34
34
  languageOptions: {
35
35
  ecmaVersion: 2022,
36
36
  sourceType: "module",
@@ -49,7 +49,29 @@ export default tseslint.config(
49
49
  "no-unused-vars": "off",
50
50
  "@typescript-eslint/no-explicit-any": "error",
51
51
  "@typescript-eslint/explicit-module-boundary-types": "off",
52
- "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
52
+ "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_", caughtErrorsIgnorePattern: "^_" }],
53
+ },
54
+ },
55
+ {
56
+ files: ["tests/**/*.{ts,tsx}", "framework-mcp/tests/**/*.{ts,tsx}", "vitest.config.ts"],
57
+ languageOptions: {
58
+ ecmaVersion: 2022,
59
+ sourceType: "module",
60
+ globals: {
61
+ ...globals.node,
62
+ ...globals.es2021,
63
+ },
64
+ parserOptions: {
65
+ project: ["./tsconfig.json", "./framework-mcp/tsconfig.json"],
66
+ tsconfigRootDir: import.meta.dirname,
67
+ },
68
+ },
69
+ rules: {
70
+ ...styleRules,
71
+ "no-unused-vars": "off",
72
+ "@typescript-eslint/no-explicit-any": "off",
73
+ "@typescript-eslint/explicit-module-boundary-types": "off",
74
+ "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_", caughtErrorsIgnorePattern: "^_" }],
53
75
  },
54
76
  },
55
77
  {
@@ -0,0 +1,29 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { exec } from "child_process";
4
+ /**
5
+ * Starts the Enderun Web Dashboard server.
6
+ */
7
+ export function handleStartDashboard(projectRoot, args) {
8
+ const port = args.port || 5858;
9
+ const dashboardScript = path.join(projectRoot, "bin/enderun-dashboard.js");
10
+ if (!fs.existsSync(dashboardScript)) {
11
+ throw new Error("Dashboard server script not found in bin/enderun-dashboard.js");
12
+ }
13
+ try {
14
+ // Start the dashboard as a background process
15
+ exec(`node "${dashboardScript}"`, {
16
+ cwd: projectRoot,
17
+ env: { ...process.env, PORT: String(port) }
18
+ });
19
+ return {
20
+ content: [{
21
+ type: "text",
22
+ text: `🖥️ **Enderun Web Dashboard started!**\n\nAccess it at: http://localhost:${port}\n\nThis interface will show real-time agent status, system health, and orchestration logs.`
23
+ }]
24
+ };
25
+ }
26
+ catch (e) {
27
+ return { isError: true, content: [{ type: "text", text: `Failed to start dashboard: ${String(e)}` }] };
28
+ }
29
+ }