@bradygaster/squad-sdk 0.7.0 → 0.8.2

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 (354) hide show
  1. package/README.md +296 -296
  2. package/dist/adapter/client.d.ts +243 -0
  3. package/dist/adapter/client.d.ts.map +1 -0
  4. package/dist/adapter/client.js +567 -0
  5. package/dist/adapter/client.js.map +1 -0
  6. package/dist/adapter/errors.d.ts +260 -0
  7. package/dist/adapter/errors.d.ts.map +1 -0
  8. package/dist/adapter/errors.js +362 -0
  9. package/dist/adapter/errors.js.map +1 -0
  10. package/dist/adapter/types.d.ts +779 -0
  11. package/dist/adapter/types.d.ts.map +1 -0
  12. package/dist/adapter/types.js +11 -0
  13. package/dist/adapter/types.js.map +1 -0
  14. package/dist/agents/charter-compiler.d.ts +102 -0
  15. package/dist/agents/charter-compiler.d.ts.map +1 -0
  16. package/dist/agents/charter-compiler.js +157 -0
  17. package/dist/agents/charter-compiler.js.map +1 -0
  18. package/dist/agents/history-shadow.d.ts +80 -0
  19. package/dist/agents/history-shadow.d.ts.map +1 -0
  20. package/dist/agents/history-shadow.js +239 -0
  21. package/dist/agents/history-shadow.js.map +1 -0
  22. package/dist/agents/index.d.ts +71 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +183 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/lifecycle.d.ts +138 -0
  27. package/dist/agents/lifecycle.d.ts.map +1 -0
  28. package/dist/agents/lifecycle.js +284 -0
  29. package/dist/agents/lifecycle.js.map +1 -0
  30. package/dist/agents/model-selector.d.ts +80 -0
  31. package/dist/agents/model-selector.d.ts.map +1 -0
  32. package/dist/agents/model-selector.js +171 -0
  33. package/dist/agents/model-selector.js.map +1 -0
  34. package/dist/agents/onboarding.d.ts +65 -0
  35. package/dist/agents/onboarding.d.ts.map +1 -0
  36. package/dist/agents/onboarding.js +373 -0
  37. package/dist/agents/onboarding.js.map +1 -0
  38. package/dist/build/bundle.d.ts +32 -0
  39. package/dist/build/bundle.d.ts.map +1 -0
  40. package/dist/build/bundle.js +97 -0
  41. package/dist/build/bundle.js.map +1 -0
  42. package/dist/build/ci-pipeline.d.ts +51 -0
  43. package/dist/build/ci-pipeline.d.ts.map +1 -0
  44. package/dist/build/ci-pipeline.js +180 -0
  45. package/dist/build/ci-pipeline.js.map +1 -0
  46. package/dist/build/github-dist.d.ts +37 -0
  47. package/dist/build/github-dist.d.ts.map +1 -0
  48. package/dist/build/github-dist.js +117 -0
  49. package/dist/build/github-dist.js.map +1 -0
  50. package/dist/build/index.d.ts +11 -0
  51. package/dist/build/index.d.ts.map +1 -0
  52. package/dist/build/index.js +11 -0
  53. package/dist/build/index.js.map +1 -0
  54. package/dist/build/install-migration.d.ts +28 -0
  55. package/dist/build/install-migration.d.ts.map +1 -0
  56. package/dist/build/install-migration.js +103 -0
  57. package/dist/build/install-migration.js.map +1 -0
  58. package/dist/build/npm-package.d.ts +54 -0
  59. package/dist/build/npm-package.d.ts.map +1 -0
  60. package/dist/build/npm-package.js +128 -0
  61. package/dist/build/npm-package.js.map +1 -0
  62. package/dist/build/release.d.ts +108 -0
  63. package/dist/build/release.d.ts.map +1 -0
  64. package/dist/build/release.js +295 -0
  65. package/dist/build/release.js.map +1 -0
  66. package/dist/build/versioning.d.ts +38 -0
  67. package/dist/build/versioning.d.ts.map +1 -0
  68. package/dist/build/versioning.js +113 -0
  69. package/dist/build/versioning.js.map +1 -0
  70. package/dist/casting/casting-engine.d.ts +60 -0
  71. package/dist/casting/casting-engine.d.ts.map +1 -0
  72. package/dist/casting/casting-engine.js +223 -0
  73. package/dist/casting/casting-engine.js.map +1 -0
  74. package/dist/casting/casting-history.d.ts +54 -0
  75. package/dist/casting/casting-history.d.ts.map +1 -0
  76. package/dist/casting/casting-history.js +63 -0
  77. package/dist/casting/casting-history.js.map +1 -0
  78. package/dist/casting/index.d.ts +46 -0
  79. package/dist/casting/index.d.ts.map +1 -0
  80. package/dist/casting/index.js +45 -0
  81. package/dist/casting/index.js.map +1 -0
  82. package/dist/client/event-bus.d.ts +29 -0
  83. package/dist/client/event-bus.d.ts.map +1 -0
  84. package/dist/client/event-bus.js +52 -0
  85. package/dist/client/event-bus.js.map +1 -0
  86. package/dist/client/index.d.ts +100 -0
  87. package/dist/client/index.d.ts.map +1 -0
  88. package/dist/client/index.js +170 -0
  89. package/dist/client/index.js.map +1 -0
  90. package/dist/client/session-pool.d.ts +66 -0
  91. package/dist/client/session-pool.d.ts.map +1 -0
  92. package/dist/client/session-pool.js +145 -0
  93. package/dist/client/session-pool.js.map +1 -0
  94. package/dist/config/agent-doc.d.ts +43 -0
  95. package/dist/config/agent-doc.d.ts.map +1 -0
  96. package/dist/config/agent-doc.js +158 -0
  97. package/dist/config/agent-doc.js.map +1 -0
  98. package/dist/config/agent-source.d.ts +95 -0
  99. package/dist/config/agent-source.d.ts.map +1 -0
  100. package/dist/config/agent-source.js +274 -0
  101. package/dist/config/agent-source.js.map +1 -0
  102. package/dist/config/doc-sync.d.ts +66 -0
  103. package/dist/config/doc-sync.d.ts.map +1 -0
  104. package/dist/config/doc-sync.js +270 -0
  105. package/dist/config/doc-sync.js.map +1 -0
  106. package/dist/config/feature-audit.d.ts +49 -0
  107. package/dist/config/feature-audit.d.ts.map +1 -0
  108. package/dist/config/feature-audit.js +148 -0
  109. package/dist/config/feature-audit.js.map +1 -0
  110. package/dist/config/index.d.ts +15 -0
  111. package/dist/config/index.d.ts.map +1 -0
  112. package/dist/config/index.js +15 -0
  113. package/dist/config/index.js.map +1 -0
  114. package/dist/config/init.d.ts +61 -0
  115. package/dist/config/init.d.ts.map +1 -0
  116. package/dist/config/init.js +376 -0
  117. package/dist/config/init.js.map +1 -0
  118. package/dist/config/legacy-fallback.d.ts +83 -0
  119. package/dist/config/legacy-fallback.d.ts.map +1 -0
  120. package/dist/config/legacy-fallback.js +212 -0
  121. package/dist/config/legacy-fallback.js.map +1 -0
  122. package/dist/config/markdown-migration.d.ts +157 -0
  123. package/dist/config/markdown-migration.d.ts.map +1 -0
  124. package/dist/config/markdown-migration.js +434 -0
  125. package/dist/config/markdown-migration.js.map +1 -0
  126. package/dist/config/migration.d.ts +123 -0
  127. package/dist/config/migration.d.ts.map +1 -0
  128. package/dist/config/migration.js +273 -0
  129. package/dist/config/migration.js.map +1 -0
  130. package/dist/config/migrations/index.d.ts +36 -0
  131. package/dist/config/migrations/index.d.ts.map +1 -0
  132. package/dist/config/migrations/index.js +216 -0
  133. package/dist/config/migrations/index.js.map +1 -0
  134. package/dist/config/models.d.ts +134 -0
  135. package/dist/config/models.d.ts.map +1 -0
  136. package/dist/config/models.js +354 -0
  137. package/dist/config/models.js.map +1 -0
  138. package/dist/config/routing.d.ts +118 -0
  139. package/dist/config/routing.d.ts.map +1 -0
  140. package/dist/config/routing.js +247 -0
  141. package/dist/config/routing.js.map +1 -0
  142. package/dist/config/schema.d.ts +72 -0
  143. package/dist/config/schema.d.ts.map +1 -0
  144. package/dist/config/schema.js +63 -0
  145. package/dist/config/schema.js.map +1 -0
  146. package/dist/coordinator/coordinator.d.ts +82 -0
  147. package/dist/coordinator/coordinator.d.ts.map +1 -0
  148. package/dist/coordinator/coordinator.js +192 -0
  149. package/dist/coordinator/coordinator.js.map +1 -0
  150. package/dist/coordinator/direct-response.d.ts +83 -0
  151. package/dist/coordinator/direct-response.d.ts.map +1 -0
  152. package/dist/coordinator/direct-response.js +187 -0
  153. package/dist/coordinator/direct-response.js.map +1 -0
  154. package/dist/coordinator/fan-out.d.ts +83 -0
  155. package/dist/coordinator/fan-out.d.ts.map +1 -0
  156. package/dist/coordinator/fan-out.js +161 -0
  157. package/dist/coordinator/fan-out.js.map +1 -0
  158. package/dist/coordinator/index.d.ts +62 -0
  159. package/dist/coordinator/index.d.ts.map +1 -0
  160. package/dist/coordinator/index.js +171 -0
  161. package/dist/coordinator/index.js.map +1 -0
  162. package/dist/coordinator/response-tiers.d.ts +49 -0
  163. package/dist/coordinator/response-tiers.d.ts.map +1 -0
  164. package/dist/coordinator/response-tiers.js +149 -0
  165. package/dist/coordinator/response-tiers.js.map +1 -0
  166. package/dist/hooks/index.d.ts +103 -0
  167. package/dist/hooks/index.d.ts.map +1 -0
  168. package/dist/hooks/index.js +279 -0
  169. package/dist/hooks/index.js.map +1 -0
  170. package/dist/index.d.ts +33 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +33 -3
  173. package/dist/index.js.map +1 -1
  174. package/dist/marketplace/backend.d.ts +35 -0
  175. package/dist/marketplace/backend.d.ts.map +1 -0
  176. package/dist/marketplace/backend.js +99 -0
  177. package/dist/marketplace/backend.js.map +1 -0
  178. package/dist/marketplace/browser.d.ts +33 -0
  179. package/dist/marketplace/browser.d.ts.map +1 -0
  180. package/dist/marketplace/browser.js +97 -0
  181. package/dist/marketplace/browser.js.map +1 -0
  182. package/dist/marketplace/extension-adapter.d.ts +51 -0
  183. package/dist/marketplace/extension-adapter.d.ts.map +1 -0
  184. package/dist/marketplace/extension-adapter.js +81 -0
  185. package/dist/marketplace/extension-adapter.js.map +1 -0
  186. package/dist/marketplace/index.d.ts +51 -0
  187. package/dist/marketplace/index.d.ts.map +1 -0
  188. package/dist/marketplace/index.js +108 -0
  189. package/dist/marketplace/index.js.map +1 -0
  190. package/dist/marketplace/packaging.d.ts +25 -0
  191. package/dist/marketplace/packaging.d.ts.map +1 -0
  192. package/dist/marketplace/packaging.js +117 -0
  193. package/dist/marketplace/packaging.js.map +1 -0
  194. package/dist/marketplace/schema.d.ts +50 -0
  195. package/dist/marketplace/schema.d.ts.map +1 -0
  196. package/dist/marketplace/schema.js +120 -0
  197. package/dist/marketplace/schema.js.map +1 -0
  198. package/dist/marketplace/security.d.ts +26 -0
  199. package/dist/marketplace/security.d.ts.map +1 -0
  200. package/dist/marketplace/security.js +199 -0
  201. package/dist/marketplace/security.js.map +1 -0
  202. package/dist/parsers.d.ts +15 -0
  203. package/dist/parsers.d.ts.map +1 -0
  204. package/dist/parsers.js +15 -0
  205. package/dist/parsers.js.map +1 -0
  206. package/dist/ralph/index.d.ts +58 -0
  207. package/dist/ralph/index.d.ts.map +1 -0
  208. package/dist/ralph/index.js +128 -0
  209. package/dist/ralph/index.js.map +1 -0
  210. package/dist/resolution.d.ts +47 -0
  211. package/dist/resolution.d.ts.map +1 -0
  212. package/dist/resolution.js +106 -0
  213. package/dist/resolution.js.map +1 -0
  214. package/dist/runtime/benchmarks.d.ts +121 -0
  215. package/dist/runtime/benchmarks.d.ts.map +1 -0
  216. package/dist/runtime/benchmarks.js +251 -0
  217. package/dist/runtime/benchmarks.js.map +1 -0
  218. package/dist/runtime/config.d.ts +314 -0
  219. package/dist/runtime/config.d.ts.map +1 -0
  220. package/dist/runtime/config.js +467 -0
  221. package/dist/runtime/config.js.map +1 -0
  222. package/dist/runtime/constants.d.ts +35 -0
  223. package/dist/runtime/constants.d.ts.map +1 -0
  224. package/dist/runtime/constants.js +58 -0
  225. package/dist/runtime/constants.js.map +1 -0
  226. package/dist/runtime/cost-tracker.d.ts +73 -0
  227. package/dist/runtime/cost-tracker.d.ts.map +1 -0
  228. package/dist/runtime/cost-tracker.js +157 -0
  229. package/dist/runtime/cost-tracker.js.map +1 -0
  230. package/dist/runtime/event-bus-otel-bridge.d.ts +19 -0
  231. package/dist/runtime/event-bus-otel-bridge.d.ts.map +1 -0
  232. package/dist/runtime/event-bus-otel-bridge.js +61 -0
  233. package/dist/runtime/event-bus-otel-bridge.js.map +1 -0
  234. package/dist/runtime/event-bus-ws-bridge.d.ts +35 -0
  235. package/dist/runtime/event-bus-ws-bridge.d.ts.map +1 -0
  236. package/dist/runtime/event-bus-ws-bridge.js +55 -0
  237. package/dist/runtime/event-bus-ws-bridge.js.map +1 -0
  238. package/dist/runtime/event-bus.d.ts +190 -0
  239. package/dist/runtime/event-bus.d.ts.map +1 -0
  240. package/dist/runtime/event-bus.js +218 -0
  241. package/dist/runtime/event-bus.js.map +1 -0
  242. package/dist/runtime/event-payloads.d.ts +108 -0
  243. package/dist/runtime/event-payloads.d.ts.map +1 -0
  244. package/dist/runtime/event-payloads.js +28 -0
  245. package/dist/runtime/event-payloads.js.map +1 -0
  246. package/dist/runtime/health.d.ts +66 -0
  247. package/dist/runtime/health.d.ts.map +1 -0
  248. package/dist/runtime/health.js +112 -0
  249. package/dist/runtime/health.js.map +1 -0
  250. package/dist/runtime/i18n.d.ts +54 -0
  251. package/dist/runtime/i18n.d.ts.map +1 -0
  252. package/dist/runtime/i18n.js +126 -0
  253. package/dist/runtime/i18n.js.map +1 -0
  254. package/dist/runtime/offline.d.ts +64 -0
  255. package/dist/runtime/offline.d.ts.map +1 -0
  256. package/dist/runtime/offline.js +108 -0
  257. package/dist/runtime/offline.js.map +1 -0
  258. package/dist/runtime/otel-bridge.d.ts +52 -0
  259. package/dist/runtime/otel-bridge.d.ts.map +1 -0
  260. package/dist/runtime/otel-bridge.js +132 -0
  261. package/dist/runtime/otel-bridge.js.map +1 -0
  262. package/dist/runtime/otel-init.d.ts +72 -0
  263. package/dist/runtime/otel-init.d.ts.map +1 -0
  264. package/dist/runtime/otel-init.js +68 -0
  265. package/dist/runtime/otel-init.js.map +1 -0
  266. package/dist/runtime/otel-metrics.d.ts +42 -0
  267. package/dist/runtime/otel-metrics.d.ts.map +1 -0
  268. package/dist/runtime/otel-metrics.js +196 -0
  269. package/dist/runtime/otel-metrics.js.map +1 -0
  270. package/dist/runtime/otel.d.ts +53 -0
  271. package/dist/runtime/otel.d.ts.map +1 -0
  272. package/dist/runtime/otel.js +127 -0
  273. package/dist/runtime/otel.js.map +1 -0
  274. package/dist/runtime/squad-observer.d.ts +75 -0
  275. package/dist/runtime/squad-observer.d.ts.map +1 -0
  276. package/dist/runtime/squad-observer.js +190 -0
  277. package/dist/runtime/squad-observer.js.map +1 -0
  278. package/dist/runtime/streaming.d.ts +106 -0
  279. package/dist/runtime/streaming.d.ts.map +1 -0
  280. package/dist/runtime/streaming.js +192 -0
  281. package/dist/runtime/streaming.js.map +1 -0
  282. package/dist/runtime/telemetry.d.ts +82 -0
  283. package/dist/runtime/telemetry.d.ts.map +1 -0
  284. package/dist/runtime/telemetry.js +120 -0
  285. package/dist/runtime/telemetry.js.map +1 -0
  286. package/dist/sharing/agent-repo.d.ts +33 -0
  287. package/dist/sharing/agent-repo.d.ts.map +1 -0
  288. package/dist/sharing/agent-repo.js +79 -0
  289. package/dist/sharing/agent-repo.js.map +1 -0
  290. package/dist/sharing/cache.d.ts +36 -0
  291. package/dist/sharing/cache.d.ts.map +1 -0
  292. package/dist/sharing/cache.js +85 -0
  293. package/dist/sharing/cache.js.map +1 -0
  294. package/dist/sharing/conflicts.d.ts +32 -0
  295. package/dist/sharing/conflicts.d.ts.map +1 -0
  296. package/dist/sharing/conflicts.js +121 -0
  297. package/dist/sharing/conflicts.js.map +1 -0
  298. package/dist/sharing/export.d.ts +50 -0
  299. package/dist/sharing/export.d.ts.map +1 -0
  300. package/dist/sharing/export.js +156 -0
  301. package/dist/sharing/export.js.map +1 -0
  302. package/dist/sharing/history-split.d.ts +34 -0
  303. package/dist/sharing/history-split.d.ts.map +1 -0
  304. package/dist/sharing/history-split.js +101 -0
  305. package/dist/sharing/history-split.js.map +1 -0
  306. package/dist/sharing/import.d.ts +37 -0
  307. package/dist/sharing/import.d.ts.map +1 -0
  308. package/dist/sharing/import.js +138 -0
  309. package/dist/sharing/import.js.map +1 -0
  310. package/dist/sharing/index.d.ts +11 -0
  311. package/dist/sharing/index.d.ts.map +1 -0
  312. package/dist/sharing/index.js +11 -0
  313. package/dist/sharing/index.js.map +1 -0
  314. package/dist/sharing/versioning.d.ts +32 -0
  315. package/dist/sharing/versioning.d.ts.map +1 -0
  316. package/dist/sharing/versioning.js +64 -0
  317. package/dist/sharing/versioning.js.map +1 -0
  318. package/dist/skills/index.d.ts +49 -0
  319. package/dist/skills/index.d.ts.map +1 -0
  320. package/dist/skills/index.js +85 -0
  321. package/dist/skills/index.js.map +1 -0
  322. package/dist/skills/skill-loader.d.ts +56 -0
  323. package/dist/skills/skill-loader.d.ts.map +1 -0
  324. package/dist/skills/skill-loader.js +106 -0
  325. package/dist/skills/skill-loader.js.map +1 -0
  326. package/dist/skills/skill-source.d.ts +63 -0
  327. package/dist/skills/skill-source.d.ts.map +1 -0
  328. package/dist/skills/skill-source.js +199 -0
  329. package/dist/skills/skill-source.js.map +1 -0
  330. package/dist/tools/index.d.ts +95 -0
  331. package/dist/tools/index.d.ts.map +1 -0
  332. package/dist/tools/index.js +475 -0
  333. package/dist/tools/index.js.map +1 -0
  334. package/dist/types.d.ts +43 -0
  335. package/dist/types.d.ts.map +1 -0
  336. package/dist/types.js +8 -0
  337. package/dist/types.js.map +1 -0
  338. package/dist/upstream/index.d.ts +8 -0
  339. package/dist/upstream/index.d.ts.map +1 -0
  340. package/dist/upstream/index.js +7 -0
  341. package/dist/upstream/index.js.map +1 -0
  342. package/dist/upstream/resolver.d.ts +37 -0
  343. package/dist/upstream/resolver.d.ts.map +1 -0
  344. package/dist/upstream/resolver.js +234 -0
  345. package/dist/upstream/resolver.js.map +1 -0
  346. package/dist/upstream/types.d.ts +55 -0
  347. package/dist/upstream/types.d.ts.map +1 -0
  348. package/dist/upstream/types.js +11 -0
  349. package/dist/upstream/types.js.map +1 -0
  350. package/dist/utils/normalize-eol.d.ts +6 -0
  351. package/dist/utils/normalize-eol.d.ts.map +1 -0
  352. package/dist/utils/normalize-eol.js +8 -0
  353. package/dist/utils/normalize-eol.js.map +1 -0
  354. package/package.json +197 -63
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Squad Initialization Module (M2-6, PRD #98)
3
+ *
4
+ * Creates new Squad projects with typed configuration.
5
+ * Generates squad.config.ts or squad.config.json with agent definitions.
6
+ *
7
+ * @module config/init
8
+ */
9
+ import { mkdir, writeFile } from 'fs/promises';
10
+ import { join } from 'path';
11
+ import { existsSync } from 'fs';
12
+ import { MODELS } from '../runtime/constants.js';
13
+ // ============================================================================
14
+ // Default Agent Templates
15
+ // ============================================================================
16
+ /**
17
+ * Default agent templates for common roles.
18
+ */
19
+ const AGENT_TEMPLATES = {
20
+ 'lead': {
21
+ displayName: 'Lead',
22
+ description: 'Technical lead responsible for architecture, delegation, and project coordination.'
23
+ },
24
+ 'developer': {
25
+ displayName: 'Developer',
26
+ description: 'Software developer focused on feature implementation and code quality.'
27
+ },
28
+ 'tester': {
29
+ displayName: 'Tester',
30
+ description: 'Quality assurance specialist responsible for test coverage and validation.'
31
+ },
32
+ 'scribe': {
33
+ displayName: 'Scribe',
34
+ description: 'Documentation specialist maintaining history, decisions, and technical records.'
35
+ },
36
+ 'ralph': {
37
+ displayName: 'Ralph',
38
+ description: 'Persistent memory agent that maintains context across sessions.'
39
+ }
40
+ };
41
+ // ============================================================================
42
+ // Configuration Templates
43
+ // ============================================================================
44
+ /**
45
+ * Format a readonly string array as a single-quoted TypeScript array literal.
46
+ */
47
+ function formatModelArray(chain) {
48
+ return `[${chain.map(m => `'${m}'`).join(', ')}]`;
49
+ }
50
+ /**
51
+ * Generate TypeScript config file content.
52
+ */
53
+ function generateTypeScriptConfig(options) {
54
+ const { projectName, projectDescription, agents } = options;
55
+ return `import type { SquadConfig } from '@bradygaster/squad';
56
+
57
+ /**
58
+ * Squad Configuration for ${projectName}
59
+ * ${projectDescription ? `\n * ${projectDescription}` : ''}
60
+ */
61
+ const config: SquadConfig = {
62
+ version: '1.0.0',
63
+
64
+ models: {
65
+ defaultModel: '${MODELS.DEFAULT}',
66
+ defaultTier: 'standard',
67
+ fallbackChains: {
68
+ premium: ${formatModelArray(MODELS.FALLBACK_CHAINS.premium)},
69
+ standard: ${formatModelArray(MODELS.FALLBACK_CHAINS.standard)},
70
+ fast: ${formatModelArray(MODELS.FALLBACK_CHAINS.fast)}
71
+ },
72
+ preferSameProvider: true,
73
+ respectTierCeiling: true,
74
+ nuclearFallback: {
75
+ enabled: false,
76
+ model: '${MODELS.NUCLEAR_FALLBACK}',
77
+ maxRetriesBeforeNuclear: ${MODELS.NUCLEAR_MAX_RETRIES}
78
+ }
79
+ },
80
+
81
+ routing: {
82
+ rules: [
83
+ {
84
+ workType: 'feature-dev',
85
+ agents: ['@${agents[0]?.name || 'coordinator'}'],
86
+ confidence: 'high'
87
+ },
88
+ {
89
+ workType: 'bug-fix',
90
+ agents: ['@${agents.find(a => a.role === 'developer')?.name || agents[0]?.name || 'coordinator'}'],
91
+ confidence: 'high'
92
+ },
93
+ {
94
+ workType: 'testing',
95
+ agents: ['@${agents.find(a => a.role === 'tester')?.name || agents[0]?.name || 'coordinator'}'],
96
+ confidence: 'high'
97
+ },
98
+ {
99
+ workType: 'documentation',
100
+ agents: ['@${agents.find(a => a.role === 'scribe')?.name || agents[0]?.name || 'coordinator'}'],
101
+ confidence: 'high'
102
+ }
103
+ ],
104
+ governance: {
105
+ eagerByDefault: true,
106
+ scribeAutoRuns: false,
107
+ allowRecursiveSpawn: false
108
+ }
109
+ },
110
+
111
+ casting: {
112
+ allowlistUniverses: [
113
+ 'The Usual Suspects',
114
+ 'Breaking Bad',
115
+ 'The Wire',
116
+ 'Firefly'
117
+ ],
118
+ overflowStrategy: 'generic',
119
+ universeCapacity: {}
120
+ },
121
+
122
+ platforms: {
123
+ vscode: {
124
+ disableModelSelection: false,
125
+ scribeMode: 'sync'
126
+ }
127
+ }
128
+ };
129
+
130
+ export default config;
131
+ `;
132
+ }
133
+ /**
134
+ * Generate JSON config file content.
135
+ */
136
+ function generateJsonConfig(options) {
137
+ const { agents } = options;
138
+ const config = {
139
+ version: '1.0.0',
140
+ models: {
141
+ defaultModel: MODELS.DEFAULT,
142
+ defaultTier: 'standard',
143
+ fallbackChains: {
144
+ premium: [...MODELS.FALLBACK_CHAINS.premium],
145
+ standard: [...MODELS.FALLBACK_CHAINS.standard],
146
+ fast: [...MODELS.FALLBACK_CHAINS.fast]
147
+ },
148
+ preferSameProvider: true,
149
+ respectTierCeiling: true,
150
+ nuclearFallback: {
151
+ enabled: false,
152
+ model: MODELS.NUCLEAR_FALLBACK,
153
+ maxRetriesBeforeNuclear: MODELS.NUCLEAR_MAX_RETRIES
154
+ }
155
+ },
156
+ routing: {
157
+ rules: [
158
+ {
159
+ workType: 'feature-dev',
160
+ agents: [`@${agents[0]?.name || 'coordinator'}`],
161
+ confidence: 'high'
162
+ },
163
+ {
164
+ workType: 'bug-fix',
165
+ agents: [`@${agents.find(a => a.role === 'developer')?.name || agents[0]?.name || 'coordinator'}`],
166
+ confidence: 'high'
167
+ },
168
+ {
169
+ workType: 'testing',
170
+ agents: [`@${agents.find(a => a.role === 'tester')?.name || agents[0]?.name || 'coordinator'}`],
171
+ confidence: 'high'
172
+ },
173
+ {
174
+ workType: 'documentation',
175
+ agents: [`@${agents.find(a => a.role === 'scribe')?.name || agents[0]?.name || 'coordinator'}`],
176
+ confidence: 'high'
177
+ }
178
+ ],
179
+ governance: {
180
+ eagerByDefault: true,
181
+ scribeAutoRuns: false,
182
+ allowRecursiveSpawn: false
183
+ }
184
+ },
185
+ casting: {
186
+ allowlistUniverses: [
187
+ 'The Usual Suspects',
188
+ 'Breaking Bad',
189
+ 'The Wire',
190
+ 'Firefly'
191
+ ],
192
+ overflowStrategy: 'generic',
193
+ universeCapacity: {}
194
+ },
195
+ platforms: {
196
+ vscode: {
197
+ disableModelSelection: false,
198
+ scribeMode: 'sync'
199
+ }
200
+ }
201
+ };
202
+ return JSON.stringify(config, null, 2);
203
+ }
204
+ // ============================================================================
205
+ // Agent Template Generation
206
+ // ============================================================================
207
+ /**
208
+ * Generate charter.md content for an agent.
209
+ */
210
+ function generateCharter(agent, projectName, projectDescription) {
211
+ const template = AGENT_TEMPLATES[agent.role];
212
+ const displayName = agent.displayName || template?.displayName || titleCase(agent.name);
213
+ const description = template?.description || 'Team member focused on their assigned responsibilities.';
214
+ return `# ${displayName} — ${titleCase(agent.role)}
215
+
216
+ ${description}
217
+
218
+ ## Project Context
219
+
220
+ **Project:** ${projectName}
221
+ ${projectDescription ? `**Description:** ${projectDescription}\n` : ''}
222
+
223
+ ## Responsibilities
224
+
225
+ - Collaborate with team members on assigned work
226
+ - Maintain code quality and project standards
227
+ - Document decisions and progress in history
228
+
229
+ ## Work Style
230
+
231
+ - Read project context and team decisions before starting work
232
+ - Communicate clearly with team members
233
+ - Follow established patterns and conventions
234
+ `;
235
+ }
236
+ /**
237
+ * Generate initial history.md content for an agent.
238
+ */
239
+ function generateInitialHistory(agent, projectName, projectDescription, userName) {
240
+ const displayName = agent.displayName || AGENT_TEMPLATES[agent.role]?.displayName || titleCase(agent.name);
241
+ const now = new Date().toISOString().split('T')[0];
242
+ return `# Project Context
243
+
244
+ ${userName ? `- **Owner:** ${userName}\n` : ''}- **Project:** ${projectName}
245
+ ${projectDescription ? `- **Description:** ${projectDescription}\n` : ''}- **Created:** ${now}
246
+
247
+ ## Core Context
248
+
249
+ Agent ${displayName} initialized and ready for work.
250
+
251
+ ## Recent Updates
252
+
253
+ 📌 Team initialized on ${now}
254
+
255
+ ## Learnings
256
+
257
+ Initial setup complete.
258
+ `;
259
+ }
260
+ /**
261
+ * Convert kebab-case or snake_case to Title Case.
262
+ */
263
+ function titleCase(str) {
264
+ return str
265
+ .split(/[-_]/)
266
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
267
+ .join(' ');
268
+ }
269
+ // ============================================================================
270
+ // Initialization Functions
271
+ // ============================================================================
272
+ /**
273
+ * Initialize a new Squad project.
274
+ *
275
+ * Creates:
276
+ * - .squad/ directory structure
277
+ * - squad.config.ts or squad.config.json
278
+ * - Agent directories with charter.md and history.md
279
+ * - .gitattributes for merge drivers
280
+ *
281
+ * @param options - Initialization options
282
+ * @returns Result with created file paths
283
+ */
284
+ export async function initSquad(options) {
285
+ const { teamRoot, projectName, projectDescription, agents, configFormat = 'typescript', userName } = options;
286
+ const createdFiles = [];
287
+ const agentDirs = [];
288
+ // Validate inputs
289
+ if (!teamRoot) {
290
+ throw new Error('teamRoot is required');
291
+ }
292
+ if (!projectName) {
293
+ throw new Error('projectName is required');
294
+ }
295
+ if (!agents || agents.length === 0) {
296
+ throw new Error('At least one agent is required');
297
+ }
298
+ // Create .squad directory
299
+ const squadDir = join(teamRoot, '.squad');
300
+ if (!existsSync(squadDir)) {
301
+ await mkdir(squadDir, { recursive: true });
302
+ }
303
+ // Create agents directory
304
+ const agentsDir = join(squadDir, 'agents');
305
+ if (!existsSync(agentsDir)) {
306
+ await mkdir(agentsDir, { recursive: true });
307
+ }
308
+ // Create casting directory (for future casting system)
309
+ const castingDir = join(squadDir, 'casting');
310
+ if (!existsSync(castingDir)) {
311
+ await mkdir(castingDir, { recursive: true });
312
+ }
313
+ // Create decisions directory
314
+ const decisionsDir = join(squadDir, 'decisions');
315
+ if (!existsSync(decisionsDir)) {
316
+ await mkdir(decisionsDir, { recursive: true });
317
+ }
318
+ // Create skills directory
319
+ const skillsDir = join(squadDir, 'skills');
320
+ if (!existsSync(skillsDir)) {
321
+ await mkdir(skillsDir, { recursive: true });
322
+ }
323
+ // Generate configuration file
324
+ const configFileName = configFormat === 'typescript' ? 'squad.config.ts' : 'squad.config.json';
325
+ const configPath = join(teamRoot, configFileName);
326
+ const configContent = configFormat === 'typescript'
327
+ ? generateTypeScriptConfig(options)
328
+ : generateJsonConfig(options);
329
+ await writeFile(configPath, configContent, 'utf-8');
330
+ createdFiles.push(configPath);
331
+ // Create agent directories and files
332
+ for (const agent of agents) {
333
+ const agentDir = join(agentsDir, agent.name);
334
+ await mkdir(agentDir, { recursive: true });
335
+ agentDirs.push(agentDir);
336
+ // Create charter.md
337
+ const charterPath = join(agentDir, 'charter.md');
338
+ const charterContent = generateCharter(agent, projectName, projectDescription);
339
+ await writeFile(charterPath, charterContent, 'utf-8');
340
+ createdFiles.push(charterPath);
341
+ // Create history.md
342
+ const historyPath = join(agentDir, 'history.md');
343
+ const historyContent = generateInitialHistory(agent, projectName, projectDescription, userName);
344
+ await writeFile(historyPath, historyContent, 'utf-8');
345
+ createdFiles.push(historyPath);
346
+ }
347
+ // Create .gitattributes for merge drivers
348
+ const gitattributesPath = join(teamRoot, '.gitattributes');
349
+ const gitattributesContent = `.squad/agents/*/history.md merge=union
350
+ .squad/decisions/*.md merge=union
351
+ `;
352
+ await writeFile(gitattributesPath, gitattributesContent, 'utf-8');
353
+ createdFiles.push(gitattributesPath);
354
+ // Create initial decisions.md
355
+ const decisionsPath = join(decisionsDir, 'decisions.md');
356
+ const decisionsContent = `# Squad Decisions
357
+
358
+ ## Active Decisions
359
+
360
+ No decisions recorded yet.
361
+
362
+ ## Governance
363
+
364
+ - All meaningful changes require team consensus
365
+ - Document architectural decisions here
366
+ - Keep history focused on work, decisions focused on direction
367
+ `;
368
+ await writeFile(decisionsPath, decisionsContent, 'utf-8');
369
+ createdFiles.push(decisionsPath);
370
+ return {
371
+ createdFiles,
372
+ configPath,
373
+ agentDirs
374
+ };
375
+ }
376
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/config/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Legacy Fallback — Backwards Compatibility (M3-9, Issue #150)
3
+ *
4
+ * Reads legacy squad.agent.md files and .ai-team/ directory structures,
5
+ * maps them to typed SquadConfig, and merges with any existing config
6
+ * (typed config always wins, legacy fills gaps).
7
+ *
8
+ * @module config/legacy-fallback
9
+ */
10
+ import type { SquadConfig, RoutingRule } from '../runtime/config.js';
11
+ /**
12
+ * Legacy configuration extracted from squad.agent.md and .ai-team/ files.
13
+ */
14
+ export interface LegacyConfig {
15
+ /** System prompt extracted from the agent doc */
16
+ systemPrompt?: string;
17
+ /** Tool names referenced in the agent doc */
18
+ tools: string[];
19
+ /** Agent definitions extracted from agent sections */
20
+ agents: LegacyAgentDef[];
21
+ /** Routing hints extracted from routing sections */
22
+ routingHints: string[];
23
+ /** Routing rules parsed from routing.md */
24
+ routingRules: RoutingRule[];
25
+ /** Model preferences found in the document */
26
+ modelPreferences: string[];
27
+ /** Source path that was loaded */
28
+ sourcePath: string;
29
+ /** Whether .ai-team/ directory was found */
30
+ hasAiTeamDir: boolean;
31
+ }
32
+ /**
33
+ * Agent definition extracted from a legacy squad.agent.md.
34
+ */
35
+ export interface LegacyAgentDef {
36
+ name: string;
37
+ role?: string;
38
+ description?: string;
39
+ tools?: string[];
40
+ model?: string;
41
+ }
42
+ /**
43
+ * Detect whether a project uses the legacy squad.agent.md format.
44
+ *
45
+ * Checks for:
46
+ * - .github/agents/squad.agent.md
47
+ * - .ai-team/squad.agent.md
48
+ * - .ai-team/ directory with team.md or routing.md
49
+ *
50
+ * @param dir - Project root directory
51
+ * @returns true if legacy format is detected
52
+ */
53
+ export declare function detectLegacySetup(dir: string): boolean;
54
+ /**
55
+ * Load and parse a legacy squad.agent.md file from the given directory.
56
+ *
57
+ * Search order:
58
+ * 1. .github/agents/squad.agent.md
59
+ * 2. .ai-team/squad.agent.md
60
+ *
61
+ * Also loads routing.md and team.md if present in .ai-team/ or .github/agents/.
62
+ *
63
+ * @param dir - Project root directory
64
+ * @returns Parsed LegacyConfig, or undefined if no legacy file found
65
+ */
66
+ export declare function loadLegacyAgentMd(dir: string): LegacyConfig | undefined;
67
+ /**
68
+ * Merge a legacy configuration with a typed SquadConfig.
69
+ *
70
+ * The typed config **always wins** on conflict. Legacy values fill gaps
71
+ * where the typed config has no data.
72
+ *
73
+ * @param legacy - Legacy configuration from squad.agent.md
74
+ * @param config - Typed Squad configuration (takes precedence)
75
+ * @returns Merged configuration
76
+ */
77
+ export declare function mergeLegacyWithConfig(legacy: LegacyConfig, config: SquadConfig): SquadConfig;
78
+ /**
79
+ * Emit a deprecation warning when legacy format is detected.
80
+ * Uses console.warn so it's visible but non-blocking.
81
+ */
82
+ export declare function emitDeprecationWarning(sourcePath: string): void;
83
+ //# sourceMappingURL=legacy-fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-fallback.d.ts","sourceRoot":"","sources":["../../src/config/legacy-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EAEX,WAAW,EAEZ,MAAM,sBAAsB,CAAC;AAS9B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sDAAsD;IACtD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,oDAAoD;IACpD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2CAA2C;IAC3C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAStD;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAoDvE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,WAAW,GAClB,WAAW,CAuCb;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAM/D"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Legacy Fallback — Backwards Compatibility (M3-9, Issue #150)
3
+ *
4
+ * Reads legacy squad.agent.md files and .ai-team/ directory structures,
5
+ * maps them to typed SquadConfig, and merges with any existing config
6
+ * (typed config always wins, legacy fills gaps).
7
+ *
8
+ * @module config/legacy-fallback
9
+ */
10
+ import { existsSync, readFileSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { DEFAULT_CONFIG } from '../runtime/config.js';
13
+ import { parseAgentDoc } from './agent-doc.js';
14
+ import { parseRoutingMarkdown } from './routing.js';
15
+ // ============================================================================
16
+ // Detection
17
+ // ============================================================================
18
+ /** Paths to search for legacy agent files, in priority order. */
19
+ const LEGACY_AGENT_PATHS = [
20
+ join('.github', 'agents', 'squad.agent.md'),
21
+ join('.ai-team', 'squad.agent.md'),
22
+ ];
23
+ /** Paths to search for legacy routing files. */
24
+ const LEGACY_ROUTING_PATHS = [
25
+ join('.ai-team', 'routing.md'),
26
+ join('.github', 'agents', 'routing.md'),
27
+ ];
28
+ /** Paths to search for legacy team files. */
29
+ const LEGACY_TEAM_PATHS = [
30
+ join('.ai-team', 'team.md'),
31
+ join('.github', 'agents', 'team.md'),
32
+ ];
33
+ /**
34
+ * Detect whether a project uses the legacy squad.agent.md format.
35
+ *
36
+ * Checks for:
37
+ * - .github/agents/squad.agent.md
38
+ * - .ai-team/squad.agent.md
39
+ * - .ai-team/ directory with team.md or routing.md
40
+ *
41
+ * @param dir - Project root directory
42
+ * @returns true if legacy format is detected
43
+ */
44
+ export function detectLegacySetup(dir) {
45
+ for (const relPath of LEGACY_AGENT_PATHS) {
46
+ if (existsSync(join(dir, relPath)))
47
+ return true;
48
+ }
49
+ // Also detect bare .ai-team/ directories with team or routing files
50
+ for (const relPath of [...LEGACY_ROUTING_PATHS, ...LEGACY_TEAM_PATHS]) {
51
+ if (existsSync(join(dir, relPath)))
52
+ return true;
53
+ }
54
+ return false;
55
+ }
56
+ // ============================================================================
57
+ // Loading
58
+ // ============================================================================
59
+ /**
60
+ * Load and parse a legacy squad.agent.md file from the given directory.
61
+ *
62
+ * Search order:
63
+ * 1. .github/agents/squad.agent.md
64
+ * 2. .ai-team/squad.agent.md
65
+ *
66
+ * Also loads routing.md and team.md if present in .ai-team/ or .github/agents/.
67
+ *
68
+ * @param dir - Project root directory
69
+ * @returns Parsed LegacyConfig, or undefined if no legacy file found
70
+ */
71
+ export function loadLegacyAgentMd(dir) {
72
+ // Find the agent doc
73
+ let agentMdPath;
74
+ let agentMdContent;
75
+ for (const relPath of LEGACY_AGENT_PATHS) {
76
+ const fullPath = join(dir, relPath);
77
+ if (existsSync(fullPath)) {
78
+ agentMdPath = fullPath;
79
+ agentMdContent = readFileSync(fullPath, 'utf-8');
80
+ break;
81
+ }
82
+ }
83
+ if (!agentMdPath || !agentMdContent) {
84
+ return undefined;
85
+ }
86
+ // Parse the agent doc
87
+ const parsed = parseAgentDoc(agentMdContent);
88
+ // Extract agent definitions from the document
89
+ const agents = extractAgentDefs(agentMdContent, parsed);
90
+ // Try to load routing.md
91
+ let routingRules = [];
92
+ for (const relPath of LEGACY_ROUTING_PATHS) {
93
+ const fullPath = join(dir, relPath);
94
+ if (existsSync(fullPath)) {
95
+ const routingContent = readFileSync(fullPath, 'utf-8');
96
+ const routingConfig = parseRoutingMarkdown(routingContent);
97
+ routingRules = routingConfig.rules;
98
+ break;
99
+ }
100
+ }
101
+ // Check for .ai-team directory
102
+ const hasAiTeamDir = existsSync(join(dir, '.ai-team')) &&
103
+ (existsSync(join(dir, '.ai-team', 'team.md')) ||
104
+ existsSync(join(dir, '.ai-team', 'routing.md')));
105
+ return {
106
+ systemPrompt: agentMdContent,
107
+ tools: parsed.tools,
108
+ agents,
109
+ routingHints: parsed.routingHints,
110
+ routingRules,
111
+ modelPreferences: parsed.modelPreferences,
112
+ sourcePath: agentMdPath,
113
+ hasAiTeamDir,
114
+ };
115
+ }
116
+ // ============================================================================
117
+ // Merging
118
+ // ============================================================================
119
+ /**
120
+ * Merge a legacy configuration with a typed SquadConfig.
121
+ *
122
+ * The typed config **always wins** on conflict. Legacy values fill gaps
123
+ * where the typed config has no data.
124
+ *
125
+ * @param legacy - Legacy configuration from squad.agent.md
126
+ * @param config - Typed Squad configuration (takes precedence)
127
+ * @returns Merged configuration
128
+ */
129
+ export function mergeLegacyWithConfig(legacy, config) {
130
+ // Emit deprecation warning
131
+ emitDeprecationWarning(legacy.sourcePath);
132
+ // Merge routing rules: config wins, legacy fills gaps
133
+ const configWorkTypes = new Set((config.routing?.rules ?? []).map((r) => r.workType));
134
+ const legacyRulesFiltered = legacy.routingRules.filter((r) => !configWorkTypes.has(r.workType));
135
+ const mergedRoutingRules = [
136
+ ...(config.routing?.rules ?? []),
137
+ ...legacyRulesFiltered,
138
+ ];
139
+ // Merge model preferences: config wins
140
+ const mergedModels = {
141
+ ...config.models,
142
+ };
143
+ if (legacy.modelPreferences.length > 0 &&
144
+ config.models.defaultModel === DEFAULT_CONFIG.models.defaultModel) {
145
+ // Only use legacy model if config still has the default
146
+ mergedModels.defaultModel = legacy.modelPreferences[0];
147
+ }
148
+ // Build merged routing
149
+ const mergedRouting = {
150
+ ...config.routing,
151
+ rules: mergedRoutingRules,
152
+ };
153
+ return {
154
+ ...config,
155
+ models: mergedModels,
156
+ routing: mergedRouting,
157
+ };
158
+ }
159
+ // ============================================================================
160
+ // Deprecation Warning
161
+ // ============================================================================
162
+ /**
163
+ * Emit a deprecation warning when legacy format is detected.
164
+ * Uses console.warn so it's visible but non-blocking.
165
+ */
166
+ export function emitDeprecationWarning(sourcePath) {
167
+ console.warn(`[squad] DEPRECATION: Legacy squad.agent.md detected at "${sourcePath}". ` +
168
+ 'Migrate to squad.config.ts for typed configuration. ' +
169
+ 'Run `squad init --migrate` to auto-convert.');
170
+ }
171
+ // ============================================================================
172
+ // Internal Helpers
173
+ // ============================================================================
174
+ /**
175
+ * Extract agent definitions from squad.agent.md content.
176
+ * Looks for patterns like "**AgentName** — Role" or "### AgentName" sections.
177
+ */
178
+ function extractAgentDefs(content, parsed) {
179
+ const agents = [];
180
+ const seen = new Set();
181
+ // Pattern 1: ### Agent sections (common in squad.agent.md)
182
+ const sectionPattern = /^###\s+(\w+)\s*(?:[-—]\s*(.+))?$/gm;
183
+ let match;
184
+ while ((match = sectionPattern.exec(content)) !== null) {
185
+ const name = match[1].toLowerCase();
186
+ const role = match[2]?.trim();
187
+ if (!seen.has(name) && name.length > 1) {
188
+ seen.add(name);
189
+ agents.push({ name, role });
190
+ }
191
+ }
192
+ // Pattern 2: **Name** — Role (bold name with dash)
193
+ const boldPattern = /\*\*(\w+)\*\*\s*[-—]\s*(.+)/g;
194
+ while ((match = boldPattern.exec(content)) !== null) {
195
+ const name = match[1].toLowerCase();
196
+ const role = match[2].trim();
197
+ if (!seen.has(name) && name.length > 1) {
198
+ seen.add(name);
199
+ agents.push({ name, role });
200
+ }
201
+ }
202
+ // If the parsed doc itself has a name, add it as the coordinator
203
+ if (parsed.name && !seen.has(parsed.name.toLowerCase())) {
204
+ agents.unshift({
205
+ name: parsed.name.toLowerCase(),
206
+ role: parsed.description ?? 'coordinator',
207
+ tools: parsed.tools,
208
+ });
209
+ }
210
+ return agents;
211
+ }
212
+ //# sourceMappingURL=legacy-fallback.js.map