agent-enderun 1.1.5 → 1.1.7

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 (253) hide show
  1. package/ENDERUN.md +13 -10
  2. package/README.md +14 -31
  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 +21 -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 +45 -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 +1 -1
  58. package/dist/src/cli/adapters.js +45 -77
  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 +184 -106
  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 +129 -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/framework-mcp/dist/tools/dashboard/start_dashboard.js +29 -0
  166. package/framework-mcp/dist/tools/definitions.js +118 -0
  167. package/framework-mcp/dist/tools/file_system/batch_surgical_edit.js +50 -0
  168. package/framework-mcp/dist/tools/file_system/replace_text.js +8 -4
  169. package/framework-mcp/dist/tools/file_system/write_file.js +3 -0
  170. package/framework-mcp/dist/tools/framework/audit_deps.js +41 -0
  171. package/framework-mcp/dist/tools/framework/run_tests.js +25 -0
  172. package/framework-mcp/dist/tools/index.js +24 -0
  173. package/framework-mcp/dist/tools/memory/get_insights.js +34 -0
  174. package/framework-mcp/dist/tools/memory/read_memory.js +28 -0
  175. package/framework-mcp/dist/tools/messaging/send_message.js +1 -1
  176. package/framework-mcp/dist/tools/observability/check_ports.js +26 -0
  177. package/framework-mcp/dist/tools/observability/get_health.js +20 -0
  178. package/framework-mcp/dist/tools/search/get_gaps.js +48 -0
  179. package/framework-mcp/dist/tools/search/get_map.js +44 -0
  180. package/framework-mcp/dist/tools/search/grep_search.js +59 -0
  181. package/framework-mcp/dist/tools/search/list_dir.js +28 -0
  182. package/framework-mcp/dist/utils/compliance.js +29 -0
  183. package/framework-mcp/package.json +1 -1
  184. package/framework-mcp/src/tools/dashboard/start_dashboard.ts +33 -0
  185. package/framework-mcp/src/tools/definitions.ts +118 -0
  186. package/framework-mcp/src/tools/file_system/batch_surgical_edit.ts +70 -0
  187. package/framework-mcp/src/tools/file_system/replace_text.ts +10 -4
  188. package/framework-mcp/src/tools/file_system/write_file.ts +5 -0
  189. package/framework-mcp/src/tools/framework/audit_deps.ts +49 -0
  190. package/framework-mcp/src/tools/framework/run_tests.ts +28 -0
  191. package/framework-mcp/src/tools/index.ts +24 -0
  192. package/framework-mcp/src/tools/memory/get_insights.ts +41 -0
  193. package/framework-mcp/src/tools/memory/read_memory.ts +31 -0
  194. package/framework-mcp/src/tools/messaging/send_message.ts +1 -1
  195. package/framework-mcp/src/tools/observability/check_ports.ts +30 -0
  196. package/framework-mcp/src/tools/observability/get_health.ts +25 -0
  197. package/framework-mcp/src/tools/search/get_gaps.ts +54 -0
  198. package/framework-mcp/src/tools/search/get_map.ts +50 -0
  199. package/framework-mcp/src/tools/search/grep_search.ts +66 -0
  200. package/framework-mcp/src/tools/search/list_dir.ts +34 -0
  201. package/framework-mcp/src/tools/types.ts +11 -1
  202. package/framework-mcp/src/utils/compliance.ts +37 -0
  203. package/framework-mcp/tests/tools/messaging/send_message.test.ts +5 -5
  204. package/package.json +3 -3
  205. package/src/cli/adapters/types.ts +2 -2
  206. package/src/cli/adapters.ts +45 -80
  207. package/src/cli/commands/check.ts +52 -6
  208. package/src/cli/commands/init.ts +193 -114
  209. package/src/cli/commands/orchestrate.ts +14 -8
  210. package/src/cli/commands/status.ts +3 -2
  211. package/src/cli/index.ts +4 -3
  212. package/src/cli/shims.ts +6 -6
  213. package/src/cli/utils/app-backend.ts +249 -0
  214. package/src/cli/utils/app-docs.ts +65 -0
  215. package/src/cli/utils/app-frontend.ts +257 -0
  216. package/src/cli/utils/app-inferrer.ts +53 -0
  217. package/src/cli/utils/app-types.ts +243 -0
  218. package/src/cli/utils/app.ts +5 -849
  219. package/src/cli/utils/memory.ts +8 -4
  220. package/src/modules/adapters/definitions.ts +125 -0
  221. package/src/modules/agents/definitions.ts +26 -27
  222. package/src/shared/logger.ts +8 -5
  223. package/templates/prompts/bug-fix-recipe.md +20 -0
  224. package/templates/prompts/new-feature-recipe.md +19 -0
  225. package/templates/prompts/refactoring-recipe.md +21 -0
  226. package/templates/standards/architecture-standards.md +23 -0
  227. package/templates/standards/crud-governance.md +21 -0
  228. package/templates/standards/frontend-standards.md +38 -0
  229. package/templates/standards/i18n-standards.md +17 -0
  230. package/templates/standards/logging-and-secrets.md +29 -0
  231. package/templates/standards/mobile-standards.md +24 -0
  232. package/templates/standards/quality-standards.md +31 -0
  233. package/templates/standards/security-standards.md +21 -0
  234. package/templates/standards/tailwind-standards.md +20 -0
  235. package/templates/standards/testing-standards.md +31 -0
  236. package/src/modules/adapters/antigravity-cli.ts +0 -25
  237. package/src/modules/adapters/claude.ts +0 -36
  238. package/src/modules/adapters/codex.ts +0 -22
  239. package/src/modules/adapters/cursor.ts +0 -22
  240. package/src/modules/adapters/gemini.ts +0 -27
  241. package/src/modules/adapters/grok.ts +0 -20
  242. package/templates/architecture/agents-manifest.md +0 -79
  243. package/templates/architecture/approval-flows.md +0 -61
  244. package/templates/architecture/enterprise-architecture.md +0 -69
  245. package/templates/architecture/standards/crud-governance.md +0 -46
  246. package/templates/architecture/standards/data-fetching-patterns.md +0 -13
  247. package/templates/architecture/standards/design-system.md +0 -31
  248. package/templates/architecture/standards/documentation-ownership.md +0 -21
  249. package/templates/architecture/standards/logging.md +0 -7
  250. package/templates/architecture/standards/mobile-standards.md +0 -48
  251. package/templates/architecture/standards/tech-stack.md +0 -9
  252. package/templates/backend/error-handling.md +0 -74
  253. package/templates/frontend/component-patterns.md +0 -91
@@ -6,13 +6,16 @@ import {
6
6
  resolveAdapter,
7
7
  runAdapterPostInit,
8
8
  remapFrameworkContent,
9
+ scaffoldAgents,
9
10
  type AdapterConfig,
10
11
  type AdapterId,
11
12
  } from "../adapters.js";
12
13
  import { getPackageRoot, getPackageVersion } from "../utils/pkg.js";
13
14
  import { ensureDir, writeJsonFile } from "../utils/fs.js";
14
15
  import { initializeMemory, getConfiguredPaths } from "../utils/memory.js";
16
+ import { logger } from "../../shared/logger.js";
15
17
  import { SHIM_TEMPLATES } from "../shims.js";
18
+ import { UI } from "../utils/ui.js";
16
19
 
17
20
  // Import Modular Definitions
18
21
  import { ALL_AGENTS, buildAgentJson } from "../../modules/agents/definitions.js";
@@ -26,6 +29,7 @@ const FRAMEWORK_SUBDIRS = [
26
29
  "agents",
27
30
  "skills",
28
31
  "knowledge",
32
+ "prompts",
29
33
  "memory",
30
34
  "router",
31
35
  "registry",
@@ -80,8 +84,11 @@ function scaffoldConstitution(targetDir: string, frameworkDir: string, adapterId
80
84
  console.warn(`⚠️ Failed to read global constitution template: ${e}`);
81
85
  }
82
86
  content = remapFrameworkContent(content, frameworkDir, adapterId);
83
- fs.writeFileSync(path.join(targetDir, "ENDERUN.md"), content);
84
- console.warn(`✅ Constitution file created: ENDERUN.md${readSuccess ? "" : " (default template)"}`);
87
+
88
+ // Write ONLY to the framework directory (e.g. .gemini/ENDERUN.md)
89
+ const destPath = path.join(targetDir, frameworkDir, "ENDERUN.md");
90
+ fs.writeFileSync(destPath, content);
91
+ console.warn(`✅ Constitution file created inside: ${frameworkDir}/ENDERUN.md${readSuccess ? "" : " (default template)"}`);
85
92
  }
86
93
 
87
94
  function scaffoldCoreAgents(agentsToScaffold: string[], agentsBaseDir: string, adapterId: string, dryRun: boolean) {
@@ -185,6 +192,96 @@ This document outlines the strict ESLint coding standards for Agent Enderun proj
185
192
  const knowledgePath = path.join(frameworkDir, knowledgeDir);
186
193
  if (!fs.existsSync(knowledgePath)) fs.mkdirSync(knowledgePath, { recursive: true });
187
194
  fs.writeFileSync(path.join(knowledgePath, "eslint-standards.md"), eslintStandardsContent);
195
+
196
+ // Scaffold Corporate Standards (CRUD & Architecture)
197
+ const standards = [
198
+ {
199
+ file: "crud-governance.md",
200
+ template: "templates/standards/crud-governance.md",
201
+ default: "# 🏛️ Kurumsal CRUD ve Yönetişim Standartları\n\n1. **Yüksek Riskli İşlemler:** @manager onayı gerektirir.\n2. **Branded Types:** Zorunludur.\n3. **Kysely:** Ham SQL yasaktır."
202
+ },
203
+ {
204
+ file: "architecture-standards.md",
205
+ template: "templates/standards/architecture-standards.md",
206
+ default: "# 📐 Kurumsal Mimari Standartları\n\n1. **Layered Architecture:** Route -> Service -> Repository.\n2. **Zero Mock:** Gerçek veri/kontrat kullanımı zorunludur.\n3. **any Forbidden:** TypeScript disiplini."
207
+ },
208
+ {
209
+ file: "frontend-standards.md",
210
+ template: "templates/standards/frontend-standards.md",
211
+ default: "# 🎨 Kurumsal Frontend Standartları\n\n1. **Style Discipline:** Tip güvenli veya utility-first sistemler tercih edilir.\n2. **Responsive-First:** Mobil-ilk tasarım zorunludur.\n3. **WCAG AA:** Erişilebilirlik standarttır."
212
+ },
213
+ {
214
+ file: "tailwind-standards.md",
215
+ template: "templates/standards/tailwind-standards.md",
216
+ default: "# 🌊 Kurumsal Tailwind Standartları\n\n1. **No Arbitrary Values:** h-[10px] yasaktır.\n2. **Mobile-First:** sm:, md: kullanımı zorunludur.\n3. **Prettier:** Tailwind plugin kullanımı önerilir."
217
+ },
218
+ {
219
+ file: "mobile-standards.md",
220
+ template: "templates/standards/mobile-standards.md",
221
+ default: "# 📱 Kurumsal Mobil Standartları\n\n1. **Expo/React Native:** Standart platformdur.\n2. **Dynamic Scaling:** useWindowDimensions kullanımı zorunludur.\n3. **FlashList:** Büyük listeler için Shopify FlashList kullanılır."
222
+ },
223
+ {
224
+ file: "security-standards.md",
225
+ template: "templates/standards/security-standards.md",
226
+ default: "# 🛡️ Kurumsal Güvenlik Standartları\n\n1. **No Ham SQL:** Kysely zorunluluğu.\n2. **RLS:** Row Level Security uygulanmalıdır.\n3. **Secrets:** .env disiplini."
227
+ },
228
+ {
229
+ file: "quality-standards.md",
230
+ template: "templates/standards/quality-standards.md",
231
+ default: "# ⚖️ Kurumsal Kod Kalitesi Standartları\n\n1. **Zero any:** TypeScript disiplini.\n2. **Zero Warnings:** ESLint temizliği.\n3. **4 Spaces:** Girintileme kuralı."
232
+ },
233
+ {
234
+ file: "logging-and-secrets.md",
235
+ template: "templates/standards/logging-and-secrets.md",
236
+ default: "# 🪵 Kurumsal Loglama Standartları\n\n1. **Zero Console:** console.log yasaktır.\n2. **Logger:** Kurumsal logger kullanılır.\n3. **Secrets:** .env disiplini zorunludur."
237
+ },
238
+ {
239
+ file: "testing-standards.md",
240
+ template: "templates/standards/testing-standards.md",
241
+ default: "# 🧪 Kurumsal Test Standartları\n\n1. **Framework:** Vitest kullanılır.\n2. **Naming:** .test.ts formatı.\n3. **Zero Mock:** İç servisler mocklanmaz."
242
+ },
243
+ {
244
+ file: "i18n-standards.md",
245
+ template: "templates/standards/i18n-standards.md",
246
+ default: "# 🌐 Kurumsal i18n Standartları\n\n1. **No Hardcoded:** Metinler JSON'da tutulur.\n2. **i18next:** Standart kütüphanedir.\n3. **Centralized:** Locales dizini zorunludur."
247
+ }
248
+ ];
249
+
250
+ for (const std of standards) {
251
+ let content = std.default;
252
+ try {
253
+ const fullTemplatePath = path.join(getPackageRoot(), std.template);
254
+ if (fs.existsSync(fullTemplatePath)) {
255
+ content = fs.readFileSync(fullTemplatePath, "utf8");
256
+ }
257
+ } catch {
258
+ // Intentional: if the template file is unreadable, fall back to the inline default.
259
+ // No logging needed — the default value is a valid fallback, not an error condition.
260
+ }
261
+ fs.writeFileSync(path.join(knowledgePath, std.file), content);
262
+ }
263
+
264
+ // Scaffold Prompt Recipes
265
+ const promptsPath = path.join(frameworkDir, "prompts");
266
+ if (!fs.existsSync(promptsPath)) fs.mkdirSync(promptsPath, { recursive: true });
267
+
268
+ const recipes = [
269
+ { file: "refactoring-recipe.md", template: "templates/prompts/refactoring-recipe.md" },
270
+ { file: "bug-fix-recipe.md", template: "templates/prompts/bug-fix-recipe.md" },
271
+ { file: "new-feature-recipe.md", template: "templates/prompts/new-feature-recipe.md" }
272
+ ];
273
+
274
+ for (const recipe of recipes) {
275
+ try {
276
+ const fullTemplatePath = path.join(getPackageRoot(), recipe.template);
277
+ if (fs.existsSync(fullTemplatePath)) {
278
+ const content = fs.readFileSync(fullTemplatePath, "utf8");
279
+ fs.writeFileSync(path.join(promptsPath, recipe.file), content);
280
+ }
281
+ } catch (e) {
282
+ logger.debug(`Failed to scaffold prompt recipe: ${recipe.file}`, e);
283
+ }
284
+ }
188
285
 
189
286
  // Scaffold cli-commands.json
190
287
  const cliCommands = {
@@ -248,135 +345,117 @@ List of active agents, their roles, capacities, and matching directory patterns.
248
345
  // Scaffold observability files
249
346
  const obsDir = path.join(frameworkDir, "observability");
250
347
  if (!fs.existsSync(obsDir)) fs.mkdirSync(obsDir, { recursive: true });
251
- fs.writeFileSync(
252
- path.join(obsDir, "audit_log.md"),
253
- `# 🕵️ Agent Enderun — Audit Log
348
+
349
+ // Add audit log
350
+ const auditLogPath = path.join(obsDir, "audit_log.md");
351
+ if (!fs.existsSync(auditLogPath)) {
352
+ fs.writeFileSync(auditLogPath, "# 🎖️ Agent Enderun — Audit Log\n\n| Timestamp | Agent | Action | Trace ID | Status |\n|---|---|---|---|---|\n");
353
+ }
254
354
 
255
- This log tracks all asynchronous agent communication and state transitions handled by the Hermes Message Broker.
355
+ // Add metrics.json
356
+ const metricsPath = path.join(obsDir, "metrics.json");
357
+ if (!fs.existsSync(metricsPath)) {
358
+ fs.writeFileSync(metricsPath, "[]");
359
+ }
256
360
 
257
- ## Hermes Event Log
258
- `
259
- );
260
- fs.writeFileSync(
261
- path.join(obsDir, "telemetry.md"),
262
- `# 📊 Agent Enderun — Telemetry & Memory Observability
361
+ // Scaffold rules
362
+ const rulesDir = path.join(frameworkDir, "rules");
363
+ if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });
364
+ fs.writeFileSync(path.join(rulesDir, "global_rules.mdc"), `---
365
+ description: Global Rules for Agent Enderun Army
366
+ globs: **/*
367
+ ---
263
368
 
264
- ## 🧠 Context & Token Observability
265
- - **Memory File:** \`${fDir}/memory/PROJECT_MEMORY.md\` (SSOT)
266
- - **Pruning Trigger:** Active history entries are pruned and archived under \`${fDir}/memory-graph/archive/\` once the log exceeds 10 records.
267
- - **Audit Logs:** Agent interactions are saved locally inside \`observability/audit_log.md\` to keep API usage transparent and track performance bottlenecks.
268
- `
269
- );
369
+ # 🎖️ Agent Enderun Global Army Rules
270
370
 
271
- if (fDir === adapter.frameworkDir) {
272
- const entryFileName = adapter.shimFile || `${adapter.id.toUpperCase()}.md`;
273
- const destShimPath = path.join(targetDir, entryFileName);
274
-
275
- let shimContent = SHIM_TEMPLATES[adapter.id] || `# 🎖️ ${FRAMEWORK_NAME} — ${adapter.id.toUpperCase()} Strategy\n`;
276
- shimContent = remapFrameworkContent(shimContent, fDir, adapter.id);
277
-
278
- fs.writeFileSync(destShimPath, shimContent);
279
- console.warn(`✅ Strategy shim created: ${entryFileName}`);
280
- }
371
+ - **Traceability:** Prefix every commit and log with the active Trace ID.
372
+ - **Surgical Edits:** Use \`replace_text\` or \`patch_file\` tools. Overwriting entire files is forbidden.
373
+ - **Contract-First:** Verify types before implementation.
374
+ - **Zero Mock:** Use real data contracts.
375
+ - **any Forbidden:** Strictly use TypeScript types.
376
+ `);
281
377
  }
282
378
 
283
- function scaffoldKnowledgeDocs(targetDir: string, fDir: string, dryRun: boolean) {
284
- if (dryRun) return;
285
- const pkgRoot = getPackageRoot();
286
- const sourceDocsDir = path.join(pkgRoot, "templates");
287
- const frameworkDir = path.join(targetDir, fDir);
379
+ export async function initCommand(adapterName: string, options: { unified?: boolean, dryRun?: boolean, yes?: boolean }) {
380
+ const adapterId = (adapterName || "gemini") as AdapterId;
381
+ const adapter = resolveAdapter(adapterId);
288
382
 
289
- let knowledgeDirName = "knowledge";
290
- if (fDir === ".github") knowledgeDirName = "instructions";
291
- const destKnowledgeDir = path.join(frameworkDir, knowledgeDirName);
383
+ if (!adapter) {
384
+ UI.error(`Unknown adapter: ${adapterId}`);
385
+ process.exit(1);
386
+ }
387
+
388
+ const projectRoot = process.cwd();
389
+ const isUnified = options.unified || false;
390
+
391
+ // STRICT ISOLATION STRATEGY
392
+ const coreDir = ".enderun"; // Pure Memory & Knowledge
393
+ const aiToolDir = isUnified ? ".agents" : adapter.frameworkDir; // Pure Agents & Skills
292
394
 
293
- if (!fs.existsSync(destKnowledgeDir)) {
294
- fs.mkdirSync(destKnowledgeDir, { recursive: true });
395
+ const dryRun = options.dryRun || false;
396
+ const forceYes = options.yes || false;
397
+
398
+ UI.intent("Enderun Initialization", `Bootstrapping ${FRAMEWORK_NAME} (v${FRAMEWORK_VERSION}) with ${adapterId} adapter...`);
399
+
400
+ let selectedDirs: string[];
401
+ let selectedAgents: string[];
402
+ let selectedPalette: string;
403
+
404
+ if (forceYes) {
405
+ selectedDirs = ["knowledge", "prompts", "memory", "router", "registry", "observability", "rules"];
406
+ selectedAgents = ALL_AGENTS.map(a => a.name);
407
+ selectedPalette = "Modern Blue";
408
+ UI.success("Non-interactive mode: Using default configurations.");
409
+ } else {
410
+ const result = await runInteractiveInit();
411
+ selectedDirs = result.selectedDirs.filter(d => d !== "agents" && d !== "skills");
412
+ selectedAgents = result.selectedAgents;
413
+ selectedPalette = result.selectedPalette;
295
414
  }
296
415
 
297
- const filesToCopy = [
298
- { src: "architecture/standards/data-fetching-patterns.md", dest: "data-fetching-patterns.md" },
299
- { src: "architecture/standards/design-system.md", dest: "design-system.md" },
300
- { src: "architecture/standards/logging.md", dest: "logging.md" },
301
- { src: "architecture/standards/tech-stack.md", dest: "tech-stack.md" },
302
- { src: "architecture/standards/documentation-ownership.md", dest: "documentation_ownership.md" },
303
- { src: "architecture/standards/mobile-standards.md", dest: "mobile_standards.md" },
304
- { src: "architecture/standards/crud-governance.md", dest: "crud-governance.md" },
305
- { src: "backend/error-handling.md", dest: "error-handling.md" },
306
- { src: "frontend/component-patterns.md", dest: "component-patterns.md" },
307
- { src: "architecture/enterprise-architecture.md", dest: "enterprise-architecture.md" },
308
- { src: "architecture/approval-flows.md", dest: "approval-flows.md" },
309
- { src: "architecture/agents-manifest.md", dest: "agents-manifest.md" }
310
- ];
416
+ // 1. Create Core Framework Structure (.enderun) - EXCLUSIVELY FOR DATA
417
+ ensureDir(path.join(projectRoot, coreDir), dryRun);
418
+ ["knowledge", "memory", "logs", "observability", "router", "registry", "rules", "prompts"].forEach(dir => {
419
+ ensureDir(path.join(projectRoot, coreDir, dir), dryRun);
420
+ });
311
421
 
312
- for (const item of filesToCopy) {
313
- const srcPath = path.join(sourceDocsDir, item.src);
314
- const destPath = path.join(destKnowledgeDir, item.dest);
315
- try {
316
- if (fs.existsSync(srcPath)) {
317
- let content = fs.readFileSync(srcPath, "utf8");
318
- content = remapFrameworkContent(content, fDir, fDir === ".github" ? "codex" : "gemini");
319
- fs.writeFileSync(destPath, content);
320
- console.warn(`✅ Copied document: ${item.dest} to ${fDir}/${knowledgeDirName}/`);
321
- }
322
- } catch (e) {
323
- console.warn(`⚠️ Failed to copy ${item.src} to ${destPath}: ${e}`);
324
- }
422
+ // 2. Create AI Tool Specific Structure (.agents, .claude, etc.) - EXCLUSIVELY FOR AGENTS/SKILLS
423
+ ensureDir(path.join(projectRoot, aiToolDir), dryRun);
424
+ if (adapter.nestedDirs) {
425
+ adapter.nestedDirs.forEach(dir => ensureDir(path.join(projectRoot, aiToolDir, dir), dryRun));
325
426
  }
326
- }
327
427
 
328
- export async function initCommand(adapterInput?: string, dryRun = false, isInteractive = false) {
329
- const selections = isInteractive ? await runInteractiveInit() : { selectedDirs: FRAMEWORK_SUBDIRS, selectedAgents: ALL_AGENTS.map(a => a.name), selectedPalette: "Modern Blue" };
330
- const targetDir = process.cwd();
331
- const adapter = resolveAdapter(adapterInput);
332
- const frameworkDirs = [adapter.frameworkDir];
428
+ // 3. Scaffold Constitution (Inside .enderun)
429
+ scaffoldConstitution(projectRoot, coreDir, adapterId, dryRun);
333
430
 
334
- for (const fdir of [...new Set(frameworkDirs)]) {
335
- const base = path.join(targetDir, fdir);
336
- ensureDir(base, dryRun);
431
+ // 4. Scaffold Core Agents (Inside AI Tool Dir ONLY - Centralized)
432
+ scaffoldAgents(projectRoot, adapterId, dryRun);
337
433
 
338
- for (const sub of selections.selectedDirs) ensureDir(path.join(base, sub), dryRun);
339
-
340
- scaffoldCoreAgents(selections.selectedAgents, path.join(base, "agents"), adapter.id, dryRun);
341
- scaffoldSkills(path.join(base, "skills"), dryRun);
342
- scaffoldFrameworkConfigs(targetDir, fdir, adapter, dryRun, selections.selectedPalette);
343
- scaffoldKnowledgeDocs(targetDir, fdir, dryRun);
344
-
345
- // NATIVE TOOL CONFIGURATION (MCP REGISTRATION)
346
- if (!dryRun) {
347
- runAdapterPostInit(adapter, targetDir);
348
- }
349
- }
350
-
351
- scaffoldConstitution(targetDir, adapter.frameworkDir, adapter.id, dryRun);
352
- ensureDir(path.join(targetDir, "apps"), dryRun);
353
-
354
- // Scaffold target project docs/ folder
355
- const targetDocsDir = path.join(targetDir, "docs");
356
- ensureDir(targetDocsDir, dryRun);
357
- if (!dryRun) {
358
- const readmePath = path.join(targetDocsDir, "README.md");
359
- if (!fs.existsSync(readmePath)) {
360
- fs.writeFileSync(readmePath, "# 📝 Project Documentation\n\nWelcome to your new project scaffolded with Agent Enderun.\n\n## Project Overview\nWrite your project description, goals, and target audience here. The AI agents will read this file to understand the scope.\n");
361
- }
362
- const gettingStartedPath = path.join(targetDocsDir, "getting-started.md");
363
- if (!fs.existsSync(gettingStartedPath)) {
364
- fs.writeFileSync(gettingStartedPath, "# 🚀 Getting Started\n\n## Project Requirements\nWrite the core requirements and features of your application here.\n");
434
+ // 5. Scaffold Skills (Inside AI Tool Dir ONLY)
435
+ const skillsBaseDir = path.join(projectRoot, aiToolDir, "skills");
436
+ scaffoldSkills(skillsBaseDir, dryRun);
437
+
438
+ // 6. Scaffold Memory & Knowledge (Inside .enderun ONLY)
439
+ initializeMemory(projectRoot, coreDir, dryRun);
440
+ scaffoldFrameworkConfigs(projectRoot, coreDir, adapter, dryRun, selectedPalette);
441
+
442
+ // 7. Platform Specific Shims (At project root)
443
+ for (const [name, content] of Object.entries(SHIM_TEMPLATES)) {
444
+ if (name.toLowerCase() === adapterId.split("-")[0] || name === adapterId) {
445
+ const shimContent = remapFrameworkContent(content, coreDir, adapterId);
446
+ const shimFileName = adapter.shimFile || `${name.toUpperCase()}.md`;
447
+ if (!dryRun) fs.writeFileSync(path.join(projectRoot, shimFileName), shimContent);
448
+ console.warn(`✅ Platform shim created: ${shimFileName}`);
365
449
  }
366
- console.warn("✅ Project docs folder initialized with placeholders.");
367
450
  }
368
451
 
369
- initializeMemory(path.join(targetDir, adapter.frameworkDir, "memory/PROJECT_MEMORY.md"), adapter.frameworkDir, dryRun);
370
- const mcpConfig = { mcpServers: { "agent-enderun": { command: "node", args: [path.join(getPackageRoot(), "framework-mcp/dist/index.js")], env: { ENDERUN_PROJECT_ROOT: targetDir } } } };
371
- fs.writeFileSync(path.join(targetDir, "mcp.json"), JSON.stringify(mcpConfig, null, 2));
372
-
373
- const paths = getConfiguredPaths();
374
- const frontendDir = path.join(targetDir, paths.frontend);
375
- ensureDir(frontendDir, dryRun);
452
+ // 8. Run Adapter Post-Init
453
+ runAdapterPostInit(adapter, projectRoot);
376
454
 
377
- const pandaTemplate = `import { defineConfig } from "@pandacss/dev";\nexport default defineConfig({ theme: { extend: { tokens: { colors: { primary: { value: "${COLOR_PALETTES[selections.selectedPalette as keyof typeof COLOR_PALETTES]?.primary || "#0ea5e9"}" } } } } } });`;
378
- if (!dryRun) {
379
- fs.writeFileSync(path.join(frontendDir, "panda.config.ts"), pandaTemplate);
380
- }
381
- console.warn(`\n✨ ${FRAMEWORK_NAME} scaffolded! (v${FRAMEWORK_VERSION})`);
455
+ UI.success(`\n🚀 ${FRAMEWORK_NAME} initialized successfully!`);
456
+ console.warn(`\n- Brain & Memory Hub (Protected): ${coreDir}/`);
457
+ console.warn(`- AI Agent Commands (Active): ${aiToolDir}/`);
458
+ console.warn("\nNext Steps:");
459
+ console.warn(" 1. Run 'agent-enderun status' to verify the environment.");
460
+ console.warn(` 2. Open ${adapterId === "claude" ? "Claude Desktop" : "your AI Assistant"} and start commanding the Army.`);
382
461
  }
@@ -4,6 +4,7 @@ import chalk from "chalk";
4
4
  import { getFrameworkDir } from "../utils/memory.js";
5
5
  import { UI } from "../utils/ui.js";
6
6
  import { z } from "zod";
7
+ import { logger } from "../../shared/logger.js";
7
8
 
8
9
  export const HermesMessageSchema = z.object({
9
10
  timestamp: z.string(),
@@ -62,8 +63,9 @@ export async function orchestrateCommand() {
62
63
  if (updatedStatus) {
63
64
  fs.writeFileSync(statusPath, newLines.join("\n"));
64
65
  }
65
- } catch {
66
+ } catch (err) {
66
67
  UI.error("Ajan zaman aşımı kontrolü sırasında hata oluştu.");
68
+ logger.debug("Agent timeout check failed", err);
67
69
  }
68
70
  }
69
71
 
@@ -97,8 +99,9 @@ export async function orchestrateCommand() {
97
99
  }
98
100
  });
99
101
  fileMessagesMap[file] = allMsgs;
100
- } catch {
102
+ } catch (err) {
101
103
  UI.error(`${file} mesajı okunurken hata oluştu.`);
104
+ logger.debug(`Failed to read message file ${file}`, err);
102
105
  }
103
106
  }
104
107
 
@@ -181,8 +184,9 @@ export async function orchestrateCommand() {
181
184
  fs.appendFileSync(archivePath, archiveContent, "utf8");
182
185
  UI.success(`Archived ${processedMsgs.length} messages for @${agentName}`);
183
186
  }
184
- } catch {
187
+ } catch (err) {
185
188
  UI.error(`${file} mesaj dosyası güncellenirken ve arşivlenirken hata oluştu.`);
189
+ logger.debug(`Failed to update and archive message file ${file}`, err);
186
190
  }
187
191
  }
188
192
  }
@@ -203,7 +207,7 @@ export async function sendMessage(args: {
203
207
  const messagesDir = path.join(frameworkDir, "messages");
204
208
  const agentName = args.to.replace("@", "");
205
209
  const messagePath = path.join(messagesDir, `${agentName}.json`);
206
- const lockPath = path.join(messagesDir, ".lock");
210
+ const lockPath = path.join(messagesDir, `${agentName}.lock`);
207
211
 
208
212
  let retries = 3;
209
213
  let acquired = false;
@@ -215,8 +219,8 @@ export async function sendMessage(args: {
215
219
  if (Date.now() - stats.mtimeMs > 5000) {
216
220
  fs.unlinkSync(lockPath);
217
221
  }
218
- } catch {
219
- // ignore if concurrently unlinked
222
+ } catch (err) {
223
+ logger.debug(`Failed to unlink stale Hermes lock for ${agentName} concurrently`, err);
220
224
  }
221
225
  }
222
226
  if (!fs.existsSync(messagesDir)) {
@@ -263,8 +267,9 @@ export async function sendMessage(args: {
263
267
  }
264
268
 
265
269
  return message;
266
- } catch {
270
+ } catch (err) {
267
271
  UI.error(`Mesaj iletilemedi: ${args.from} -> ${args.to}`);
272
+ logger.debug(`Hermes sendMessage failed (${args.from} -> ${args.to})`, err);
268
273
  } finally {
269
274
  if (acquired && fs.existsSync(lockPath)) {
270
275
  try {
@@ -297,7 +302,8 @@ function transitionAgentState(agent: string, state: string, task: string) {
297
302
  return line;
298
303
  });
299
304
  fs.writeFileSync(statusPath, newLines.join("\n"));
300
- } catch {
305
+ } catch (err) {
301
306
  UI.error("STATUS.md güncellenemedi.");
307
+ logger.debug(`Failed to transition agent state for ${agent}`, err);
302
308
  }
303
309
  }
@@ -3,6 +3,7 @@ import path from "path";
3
3
  import chalk from "chalk";
4
4
 
5
5
  import { getMemoryPath, getFrameworkDir } from "../utils/memory.js";
6
+ import { logger } from "../../shared/logger.js";
6
7
 
7
8
  /**
8
9
  * Print the current framework status.
@@ -77,8 +78,8 @@ export function statusCommand() {
77
78
  }
78
79
  });
79
80
  }
80
- } catch {
81
- // Ignore status read errors
81
+ } catch (err) {
82
+ logger.debug("Failed to read army status file", err);
82
83
  }
83
84
  }
84
85
 
package/src/cli/index.ts CHANGED
@@ -62,9 +62,10 @@ async function main() {
62
62
  switch (command) {
63
63
  case "init": {
64
64
  const dryRun = args.includes("--dry-run");
65
- const isInteractive = args.includes("--interactive");
66
- const adapter = args.find(a => !a.startsWith("-") && a !== "init");
67
- await initCommand(adapter, dryRun, isInteractive);
65
+ const isUnified = args.includes("--unified");
66
+ const forceYes = args.includes("--yes") || args.includes("-y");
67
+ const adapter = args.find(a => !a.startsWith("-") && a !== "init") || "gemini";
68
+ await initCommand(adapter, { dryRun, unified: isUnified, yes: forceYes });
68
69
  break;
69
70
  }
70
71
 
package/src/cli/shims.ts CHANGED
@@ -4,7 +4,7 @@ export const SHIM_TEMPLATES: Record<string, string> = {
4
4
  You are the **Gemini Commander** (Strategic Decision Center).
5
5
 
6
6
  ## 🏛️ Directives
7
- - **Constitutional Supremacy:** Read \`ENDERUN.md\` first.
7
+ - **Constitutional Supremacy:** Read \`{{FRAMEWORK_DIR}}/ENDERUN.md\` first.
8
8
  - **State Persistence:** Read \`{{FRAMEWORK_DIR}}/memory/PROJECT_MEMORY.md\` to restore session memory.
9
9
  - **Zero-Request Logging:** Write logs to \`{{FRAMEWORK_DIR}}/logs/\` at the end of every turn.
10
10
  `,
@@ -13,7 +13,7 @@ You are the **Gemini Commander** (Strategic Decision Center).
13
13
  You are the **Antigravity Specialist** (Preserve Coding Standards).
14
14
 
15
15
  ## 🏛️ Directives
16
- - **Constitutional Supremacy:** Read \`ENDERUN.md\` first.
16
+ - **Constitutional Supremacy:** Read \`{{FRAMEWORK_DIR}}/ENDERUN.md\` first.
17
17
  - **State Persistence:** Read \`{{FRAMEWORK_DIR}}/memory/PROJECT_MEMORY.md\` to restore session memory.
18
18
  - **Standard Check:** Run health checks regularly to preserve framework integrity.
19
19
  `,
@@ -22,7 +22,7 @@ You are the **Antigravity Specialist** (Preserve Coding Standards).
22
22
  You are the **Claude Field Engineer** (Surgical Operations).
23
23
 
24
24
  ## 🏛️ Directives
25
- - **Constitutional Supremacy:** Read \`ENDERUN.md\` first.
25
+ - **Constitutional Supremacy:** Read \`{{FRAMEWORK_DIR}}/ENDERUN.md\` first.
26
26
  - **State Persistence:** Read \`{{FRAMEWORK_DIR}}/memory/PROJECT_MEMORY.md\` to restore session memory.
27
27
  - **Surgical Precision:** Do not rewrite files. Execute surgical edits.
28
28
  `,
@@ -31,7 +31,7 @@ You are the **Claude Field Engineer** (Surgical Operations).
31
31
  You are the **Grok Explorer** (Experimental Protocols).
32
32
 
33
33
  ## 🏛️ Directives
34
- - **Constitutional Supremacy:** Read \`ENDERUN.md\` first.
34
+ - **Constitutional Supremacy:** Read \`{{FRAMEWORK_DIR}}/ENDERUN.md\` first.
35
35
  - **State Persistence:** Read \`{{FRAMEWORK_DIR}}/memory/PROJECT_MEMORY.md\` to restore session memory.
36
36
  `,
37
37
  cursor: `# 🎖️ Enderun Core — CURSOR Strategy
@@ -39,7 +39,7 @@ You are the **Grok Explorer** (Experimental Protocols).
39
39
  You are the **Cursor Implementer** (IDE Integration).
40
40
 
41
41
  ## 🏛️ Directives
42
- - **Constitutional Supremacy:** Read \`ENDERUN.md\` first.
42
+ - **Constitutional Supremacy:** Read \`{{FRAMEWORK_DIR}}/ENDERUN.md\` first.
43
43
  - **State Persistence:** Read \`{{FRAMEWORK_DIR}}/memory/PROJECT_MEMORY.md\` to restore session memory.
44
44
  `,
45
45
  codex: `# 🎖️ Enderun Core — COPILOT Strategy
@@ -47,7 +47,7 @@ You are the **Cursor Implementer** (IDE Integration).
47
47
  You are the **Copilot Implementer** (GitHub Copilot Integration).
48
48
 
49
49
  ## 🏛️ Directives
50
- - **Constitutional Supremacy:** Read \`ENDERUN.md\` first.
50
+ - **Constitutional Supremacy:** Read \`{{FRAMEWORK_DIR}}/ENDERUN.md\` first.
51
51
  - **State Persistence:** Read \`{{FRAMEWORK_DIR}}/memory/PROJECT_MEMORY.md\` to restore session memory.
52
52
  `
53
53
  };