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,53 @@
1
+ import { slugifyName, titleCase } from "./string.js";
2
+
3
+ export interface AppSpec {
4
+ rawDescription: string;
5
+ appName: string;
6
+ title: string;
7
+ domain: string;
8
+ modules: {
9
+ auth: boolean;
10
+ users: boolean;
11
+ roles: boolean;
12
+ reports: boolean;
13
+ };
14
+ }
15
+
16
+ export function inferAppSpec(description: string): AppSpec {
17
+ const normalized = String(description || "").toLowerCase();
18
+ const isCrm = /\bcrm\b|customer|musteri|müşteri/.test(normalized);
19
+ const hasAuth = /auth|login|giris|giriş|signin|sign in|user|kullanici|kullanıcı|role|rol/.test(normalized);
20
+ const hasRoles = /role|rol|permission|yetki|admin/.test(normalized);
21
+ const hasReports = /report|rapor|analytics|dashboard|chart|metric/.test(normalized);
22
+ const appName = isCrm ? "crm-dashboard" : slugifyName(description).split("-").slice(0, 4).join("-");
23
+
24
+ return {
25
+ rawDescription: description,
26
+ appName,
27
+ title: isCrm ? "CRM Dashboard" : titleCase(appName),
28
+ domain: isCrm ? "CRM" : "Business",
29
+ modules: {
30
+ auth: hasAuth || isCrm,
31
+ users: hasAuth || hasRoles || isCrm,
32
+ roles: hasRoles || isCrm,
33
+ reports: hasReports || isCrm,
34
+ },
35
+ };
36
+ }
37
+
38
+ export async function collectCreateAppDescription(args: string[]): Promise<string> {
39
+ const initial = args.join(" ").trim();
40
+ if (initial) return initial;
41
+
42
+ const readline = await import("readline/promises");
43
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
44
+ try {
45
+ const idea = await rl.question("What do you want to build? ");
46
+ const platform = await rl.question("Platform? (full-stack/web/backend) ");
47
+ const auth = await rl.question("Auth and roles? (yes/no) ");
48
+ const reports = await rl.question("Reports/dashboard? (yes/no) ");
49
+ return [idea, platform, auth.includes("y") ? "with auth and roles" : "", reports.includes("y") ? "with reports dashboard" : ""].filter(Boolean).join(" ");
50
+ } finally {
51
+ rl.close();
52
+ }
53
+ }
@@ -0,0 +1,243 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { computeTypesHash, ensureDir, writeTextFile } from "./fs.js";
4
+ import { getConfiguredPaths } from "./memory.js";
5
+ import { UI } from "./ui.js";
6
+
7
+ const targetDir = process.cwd();
8
+
9
+ export function buildSharedTypesContent(existingContent: string): string {
10
+ const marker = "// --- Generated Application Contract ---";
11
+ const generated = [
12
+ marker,
13
+ "export type RoleID = Brand<string, \"RoleID\">;",
14
+ "export type ReportID = Brand<string, \"ReportID\">;",
15
+ "export type CustomerID = Brand<string, \"CustomerID\">;",
16
+ "",
17
+ "export interface AuthSession {",
18
+ " user: User;",
19
+ " token: string;",
20
+ " expiresAt: string;",
21
+ "}",
22
+ "",
23
+ "export interface Role {",
24
+ " id: RoleID;",
25
+ " name: string;",
26
+ " permissions: string[];",
27
+ "}",
28
+ "",
29
+ "export interface Customer {",
30
+ " id: CustomerID;",
31
+ " name: string;",
32
+ " ownerId: UserID;",
33
+ " status: \"LEAD\" | \"ACTIVE\" | \"AT_RISK\";",
34
+ " annualValue: number;",
35
+ " createdAt: string;",
36
+ "}",
37
+ "",
38
+ "export interface ReportMetric {",
39
+ " id: ReportID;",
40
+ " label: string;",
41
+ " value: number;",
42
+ " trend: \"UP\" | \"DOWN\" | \"FLAT\";",
43
+ "}",
44
+ "",
45
+ "export interface DashboardSummary {",
46
+ " customers: Customer[];",
47
+ " users: User[];",
48
+ " roles: Role[];",
49
+ " reports: ReportMetric[];",
50
+ "}",
51
+ ].join("\n");
52
+
53
+ if (existingContent.includes(marker)) return existingContent;
54
+ return `${existingContent.trim()}\n\n${generated}\n`;
55
+ }
56
+
57
+ export function updateContractHashFile(): void {
58
+ const pathsMap = getConfiguredPaths();
59
+ const sharedDir = path.join(targetDir, pathsMap.backend, "src/types");
60
+ const contractPath = path.join(targetDir, pathsMap.backend, "contract.version.json");
61
+ if (!fs.existsSync(sharedDir) || !fs.existsSync(contractPath)) return;
62
+
63
+ const currentHash = computeTypesHash(targetDir, sharedDir);
64
+
65
+ const contract = JSON.parse(fs.readFileSync(contractPath, "utf8"));
66
+ contract.contract_hash = currentHash;
67
+ contract.last_updated = new Date().toISOString();
68
+ fs.writeFileSync(contractPath, JSON.stringify(contract, null, 2));
69
+ }
70
+
71
+ export function createBaseTypeFiles(baseDir: string): void {
72
+ const typesDir = path.join(baseDir, "types");
73
+ ensureDir(typesDir);
74
+
75
+ writeTextFile(path.join(typesDir, "api.ts"), `import { TraceID } from "./brands.js";
76
+
77
+ /**
78
+ * API Response Wrappers
79
+ */
80
+ export interface ApiResponse<T> {
81
+ data: T;
82
+ meta?: {
83
+ requestId: TraceID;
84
+ timestamp: string;
85
+ };
86
+ }
87
+
88
+ export interface ApiError {
89
+ error: {
90
+ code: string;
91
+ message: string;
92
+ details?: unknown;
93
+ };
94
+ }
95
+ `);
96
+
97
+ writeTextFile(path.join(typesDir, "brands.ts"), `/**
98
+ * Branded Type Utility
99
+ */
100
+ export type Brand<K, T> = K & { __brand: T };
101
+
102
+ /**
103
+ * Entity IDs (Branded)
104
+ */
105
+ export type TraceID = Brand<string, "TraceID">;
106
+ export type AgentID = Brand<string, "AgentID">;
107
+ export type ProjectID = Brand<string, "ProjectID">;
108
+ export type UserID = Brand<string, "UserID">;
109
+ `);
110
+
111
+ writeTextFile(path.join(typesDir, "constants.ts"), `import { TraceID } from "./brands.js";
112
+
113
+ /**
114
+ * Project Phases
115
+ */
116
+ export const PROJECT_PHASES = ["PHASE_0", "PHASE_1", "PHASE_2", "PHASE_3", "PHASE_4"] as const;
117
+ export type ProjectPhase = (typeof PROJECT_PHASES)[number];
118
+
119
+ /**
120
+ * Execution Profiles
121
+ */
122
+ export const EXECUTION_PROFILES = ["Lightweight", "Full"] as const;
123
+ export type ExecutionProfile = (typeof EXECUTION_PROFILES)[number];
124
+
125
+ /**
126
+ * Task Priorities
127
+ */
128
+ export const TASK_PRIORITIES = ["P0", "P1", "P2", "P3"] as const;
129
+ export type TaskPriority = (typeof TASK_PRIORITIES)[number];
130
+
131
+ /**
132
+ * Task Statuses
133
+ */
134
+ export const TASK_STATUSES = ["PENDING", "IN_PROGRESS", "BLOCKED", "COMPLETED", "FAILED"] as const;
135
+ export type TaskStatus = (typeof TASK_STATUSES)[number];
136
+
137
+ /**
138
+ * Action Types & Status
139
+ */
140
+ export const ACTION_TYPES = ["CREATE", "MODIFY", "DELETE", "RESEARCH", "ORCHESTRATE"] as const;
141
+ export type ActionType = (typeof ACTION_TYPES)[number];
142
+
143
+ export const ACTION_STATUSES = ["SUCCESS", "FAILURE", "WAITING"] as const;
144
+ export type ActionStatus = (typeof ACTION_STATUSES)[number];
145
+ `);
146
+
147
+ writeTextFile(path.join(typesDir, "index.ts"), `/**
148
+ * Agent Enderun — App-Local Types (Modular)
149
+ */
150
+
151
+ export * from "./brands.js";
152
+ export * from "./constants.js";
153
+ export * from "./models.js";
154
+ export * from "./api.js";
155
+ export * from "./logs.js";
156
+ `);
157
+
158
+ writeTextFile(path.join(typesDir, "logs.ts"), `import { TraceID, AgentID } from "./brands.js";
159
+ import { ActionType, ActionStatus } from "./constants.js";
160
+
161
+ /**
162
+ * Audit & Agent Logging Types
163
+ */
164
+ export interface AgentActionLog {
165
+ timestamp: string;
166
+ agent: AgentID;
167
+ action: ActionType;
168
+ requestId: TraceID | "—";
169
+ status: ActionStatus;
170
+ summary: string;
171
+ files?: string[];
172
+ details?: Record<string, unknown>;
173
+ }
174
+ `);
175
+
176
+ writeTextFile(path.join(typesDir, "models.ts"), `import { UserID, TraceID, AgentID } from "./brands.js";
177
+ import { ProjectPhase, ExecutionProfile, TaskPriority, TaskStatus } from "./constants.js";
178
+
179
+ /**
180
+ * Base Entity Fields
181
+ */
182
+ export interface BaseEntity {
183
+ id: string; // Usually ULID
184
+ createdAt: string;
185
+ updatedAt: string;
186
+ deletedAt?: string | null;
187
+ }
188
+
189
+ /**
190
+ * Audit Log Model
191
+ */
192
+ export interface AuditLog extends BaseEntity {
193
+ entityName: string;
194
+ entityId: string;
195
+ action: "CREATE" | "UPDATE" | "DELETE" | "RESTORE";
196
+ userId: UserID;
197
+ previousState?: Record<string, unknown> | null;
198
+ newState?: Record<string, unknown> | null;
199
+ traceId: TraceID;
200
+ }
201
+
202
+ /**
203
+ * User Model
204
+ */
205
+ export interface User extends BaseEntity {
206
+ id: UserID;
207
+ email: string;
208
+ fullName: string;
209
+ role: "ADMIN" | "DEVELOPER" | "VIEWER";
210
+ }
211
+
212
+ export interface UserProfile extends User {
213
+ avatarUrl?: string;
214
+ bio?: string;
215
+ preferences: Record<string, unknown>;
216
+ }
217
+
218
+ /**
219
+ * Project Status
220
+ */
221
+ export interface ProjectStatus {
222
+ phase: ProjectPhase;
223
+ profile: ExecutionProfile;
224
+ lastUpdate: string;
225
+ activeTraceId: TraceID | null;
226
+ blockers: string[];
227
+ }
228
+
229
+ /**
230
+ * Task Model
231
+ */
232
+ export interface Task {
233
+ id: TraceID;
234
+ description: string;
235
+ agent: AgentID;
236
+ priority: TaskPriority;
237
+ status: TaskStatus;
238
+ createdAt: string;
239
+ updatedAt: string;
240
+ }
241
+ `);
242
+ UI.success(`Base types created in ${path.relative(targetDir, typesDir)}`);
243
+ }