@specforge/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +781 -0
  2. package/bin/specforge +21 -0
  3. package/dist/channel.d.ts +27 -0
  4. package/dist/channel.d.ts.map +1 -0
  5. package/dist/channel.js +22 -0
  6. package/dist/channel.js.map +1 -0
  7. package/dist/cli/commands/configure.d.ts +16 -0
  8. package/dist/cli/commands/configure.d.ts.map +1 -0
  9. package/dist/cli/commands/configure.js +186 -0
  10. package/dist/cli/commands/configure.js.map +1 -0
  11. package/dist/cli/commands/configure.types.d.ts +110 -0
  12. package/dist/cli/commands/configure.types.d.ts.map +1 -0
  13. package/dist/cli/commands/configure.types.js +82 -0
  14. package/dist/cli/commands/configure.types.js.map +1 -0
  15. package/dist/cli/commands/debug/call.d.ts +14 -0
  16. package/dist/cli/commands/debug/call.d.ts.map +1 -0
  17. package/dist/cli/commands/debug/call.js +96 -0
  18. package/dist/cli/commands/debug/call.js.map +1 -0
  19. package/dist/cli/commands/debug/index.d.ts +12 -0
  20. package/dist/cli/commands/debug/index.d.ts.map +1 -0
  21. package/dist/cli/commands/debug/index.js +14 -0
  22. package/dist/cli/commands/debug/index.js.map +1 -0
  23. package/dist/cli/commands/debug/register.d.ts +11 -0
  24. package/dist/cli/commands/debug/register.d.ts.map +1 -0
  25. package/dist/cli/commands/debug/register.js +78 -0
  26. package/dist/cli/commands/debug/register.js.map +1 -0
  27. package/dist/cli/commands/debug/test.d.ts +13 -0
  28. package/dist/cli/commands/debug/test.d.ts.map +1 -0
  29. package/dist/cli/commands/debug/test.js +91 -0
  30. package/dist/cli/commands/debug/test.js.map +1 -0
  31. package/dist/cli/commands/debug/tools.d.ts +13 -0
  32. package/dist/cli/commands/debug/tools.d.ts.map +1 -0
  33. package/dist/cli/commands/debug/tools.js +86 -0
  34. package/dist/cli/commands/debug/tools.js.map +1 -0
  35. package/dist/cli/commands/debug/types.d.ts +119 -0
  36. package/dist/cli/commands/debug/types.d.ts.map +1 -0
  37. package/dist/cli/commands/debug/types.js +36 -0
  38. package/dist/cli/commands/debug/types.js.map +1 -0
  39. package/dist/cli/commands/debug/whoami.d.ts +13 -0
  40. package/dist/cli/commands/debug/whoami.d.ts.map +1 -0
  41. package/dist/cli/commands/debug/whoami.js +131 -0
  42. package/dist/cli/commands/debug/whoami.js.map +1 -0
  43. package/dist/cli/commands/doctor.d.ts +16 -0
  44. package/dist/cli/commands/doctor.d.ts.map +1 -0
  45. package/dist/cli/commands/doctor.js +413 -0
  46. package/dist/cli/commands/doctor.js.map +1 -0
  47. package/dist/cli/commands/doctor.types.d.ts +180 -0
  48. package/dist/cli/commands/doctor.types.d.ts.map +1 -0
  49. package/dist/cli/commands/doctor.types.js +140 -0
  50. package/dist/cli/commands/doctor.types.js.map +1 -0
  51. package/dist/cli/commands/feedback.d.ts +27 -0
  52. package/dist/cli/commands/feedback.d.ts.map +1 -0
  53. package/dist/cli/commands/feedback.js +262 -0
  54. package/dist/cli/commands/feedback.js.map +1 -0
  55. package/dist/cli/commands/feedback.types.d.ts +116 -0
  56. package/dist/cli/commands/feedback.types.d.ts.map +1 -0
  57. package/dist/cli/commands/feedback.types.js +65 -0
  58. package/dist/cli/commands/feedback.types.js.map +1 -0
  59. package/dist/cli/commands/index.d.ts +15 -0
  60. package/dist/cli/commands/index.d.ts.map +1 -0
  61. package/dist/cli/commands/index.js +21 -0
  62. package/dist/cli/commands/index.js.map +1 -0
  63. package/dist/cli/commands/init.d.ts +17 -0
  64. package/dist/cli/commands/init.d.ts.map +1 -0
  65. package/dist/cli/commands/init.js +773 -0
  66. package/dist/cli/commands/init.js.map +1 -0
  67. package/dist/cli/commands/init.types.d.ts +193 -0
  68. package/dist/cli/commands/init.types.d.ts.map +1 -0
  69. package/dist/cli/commands/init.types.js +29 -0
  70. package/dist/cli/commands/init.types.js.map +1 -0
  71. package/dist/cli/commands/invitations.d.ts +31 -0
  72. package/dist/cli/commands/invitations.d.ts.map +1 -0
  73. package/dist/cli/commands/invitations.js +250 -0
  74. package/dist/cli/commands/invitations.js.map +1 -0
  75. package/dist/cli/commands/login.d.ts +40 -0
  76. package/dist/cli/commands/login.d.ts.map +1 -0
  77. package/dist/cli/commands/login.js +139 -0
  78. package/dist/cli/commands/login.js.map +1 -0
  79. package/dist/cli/commands/members.d.ts +55 -0
  80. package/dist/cli/commands/members.d.ts.map +1 -0
  81. package/dist/cli/commands/members.js +296 -0
  82. package/dist/cli/commands/members.js.map +1 -0
  83. package/dist/cli/commands/scaffold/agent-types.d.ts +54 -0
  84. package/dist/cli/commands/scaffold/agent-types.d.ts.map +1 -0
  85. package/dist/cli/commands/scaffold/agent-types.js +22 -0
  86. package/dist/cli/commands/scaffold/agent-types.js.map +1 -0
  87. package/dist/cli/commands/scaffold/display.d.ts +56 -0
  88. package/dist/cli/commands/scaffold/display.d.ts.map +1 -0
  89. package/dist/cli/commands/scaffold/display.js +217 -0
  90. package/dist/cli/commands/scaffold/display.js.map +1 -0
  91. package/dist/cli/commands/scaffold/files.d.ts +99 -0
  92. package/dist/cli/commands/scaffold/files.d.ts.map +1 -0
  93. package/dist/cli/commands/scaffold/files.js +122 -0
  94. package/dist/cli/commands/scaffold/files.js.map +1 -0
  95. package/dist/cli/commands/scaffold/index.d.ts +13 -0
  96. package/dist/cli/commands/scaffold/index.d.ts.map +1 -0
  97. package/dist/cli/commands/scaffold/index.js +12 -0
  98. package/dist/cli/commands/scaffold/index.js.map +1 -0
  99. package/dist/cli/commands/scaffold/register.d.ts +11 -0
  100. package/dist/cli/commands/scaffold/register.d.ts.map +1 -0
  101. package/dist/cli/commands/scaffold/register.js +11 -0
  102. package/dist/cli/commands/scaffold/register.js.map +1 -0
  103. package/dist/cli/commands/scaffold/scaffold.d.ts +11 -0
  104. package/dist/cli/commands/scaffold/scaffold.d.ts.map +1 -0
  105. package/dist/cli/commands/scaffold/scaffold.js +728 -0
  106. package/dist/cli/commands/scaffold/scaffold.js.map +1 -0
  107. package/dist/cli/commands/scaffold/targets.d.ts +60 -0
  108. package/dist/cli/commands/scaffold/targets.d.ts.map +1 -0
  109. package/dist/cli/commands/scaffold/targets.js +251 -0
  110. package/dist/cli/commands/scaffold/targets.js.map +1 -0
  111. package/dist/cli/commands/scaffold/types.d.ts +170 -0
  112. package/dist/cli/commands/scaffold/types.d.ts.map +1 -0
  113. package/dist/cli/commands/scaffold/types.js +12 -0
  114. package/dist/cli/commands/scaffold/types.js.map +1 -0
  115. package/dist/cli/commands/scaffold/utils.d.ts +89 -0
  116. package/dist/cli/commands/scaffold/utils.d.ts.map +1 -0
  117. package/dist/cli/commands/scaffold/utils.js +401 -0
  118. package/dist/cli/commands/scaffold/utils.js.map +1 -0
  119. package/dist/cli/commands/status.d.ts +19 -0
  120. package/dist/cli/commands/status.d.ts.map +1 -0
  121. package/dist/cli/commands/status.js +124 -0
  122. package/dist/cli/commands/status.js.map +1 -0
  123. package/dist/cli/commands/status.types.d.ts +37 -0
  124. package/dist/cli/commands/status.types.d.ts.map +1 -0
  125. package/dist/cli/commands/status.types.js +7 -0
  126. package/dist/cli/commands/status.types.js.map +1 -0
  127. package/dist/cli/commands/switch.d.ts +18 -0
  128. package/dist/cli/commands/switch.d.ts.map +1 -0
  129. package/dist/cli/commands/switch.js +134 -0
  130. package/dist/cli/commands/switch.js.map +1 -0
  131. package/dist/cli/commands/switch.types.d.ts +123 -0
  132. package/dist/cli/commands/switch.types.d.ts.map +1 -0
  133. package/dist/cli/commands/switch.types.js +46 -0
  134. package/dist/cli/commands/switch.types.js.map +1 -0
  135. package/dist/cli/config/agent-teams.types.d.ts +120 -0
  136. package/dist/cli/config/agent-teams.types.d.ts.map +1 -0
  137. package/dist/cli/config/agent-teams.types.js +23 -0
  138. package/dist/cli/config/agent-teams.types.js.map +1 -0
  139. package/dist/cli/config/index.d.ts +13 -0
  140. package/dist/cli/config/index.d.ts.map +1 -0
  141. package/dist/cli/config/index.js +7 -0
  142. package/dist/cli/config/index.js.map +1 -0
  143. package/dist/cli/config/loader.d.ts +114 -0
  144. package/dist/cli/config/loader.d.ts.map +1 -0
  145. package/dist/cli/config/loader.js +198 -0
  146. package/dist/cli/config/loader.js.map +1 -0
  147. package/dist/cli/config/paths.d.ts +107 -0
  148. package/dist/cli/config/paths.d.ts.map +1 -0
  149. package/dist/cli/config/paths.js +79 -0
  150. package/dist/cli/config/paths.js.map +1 -0
  151. package/dist/cli/config/planning-sessions-registry.d.ts +52 -0
  152. package/dist/cli/config/planning-sessions-registry.d.ts.map +1 -0
  153. package/dist/cli/config/planning-sessions-registry.js +46 -0
  154. package/dist/cli/config/planning-sessions-registry.js.map +1 -0
  155. package/dist/cli/config/types.d.ts +186 -0
  156. package/dist/cli/config/types.d.ts.map +1 -0
  157. package/dist/cli/config/types.js +27 -0
  158. package/dist/cli/config/types.js.map +1 -0
  159. package/dist/cli/config/validation.d.ts +62 -0
  160. package/dist/cli/config/validation.d.ts.map +1 -0
  161. package/dist/cli/config/validation.js +133 -0
  162. package/dist/cli/config/validation.js.map +1 -0
  163. package/dist/cli/config/writer.d.ts +153 -0
  164. package/dist/cli/config/writer.d.ts.map +1 -0
  165. package/dist/cli/config/writer.js +168 -0
  166. package/dist/cli/config/writer.js.map +1 -0
  167. package/dist/cli/index.d.ts +30 -0
  168. package/dist/cli/index.d.ts.map +1 -0
  169. package/dist/cli/index.js +142 -0
  170. package/dist/cli/index.js.map +1 -0
  171. package/dist/cli/middleware/auth-guard.d.ts +107 -0
  172. package/dist/cli/middleware/auth-guard.d.ts.map +1 -0
  173. package/dist/cli/middleware/auth-guard.js +97 -0
  174. package/dist/cli/middleware/auth-guard.js.map +1 -0
  175. package/dist/cli/middleware/error-handler.d.ts +133 -0
  176. package/dist/cli/middleware/error-handler.d.ts.map +1 -0
  177. package/dist/cli/middleware/error-handler.js +139 -0
  178. package/dist/cli/middleware/error-handler.js.map +1 -0
  179. package/dist/cli/middleware/index.d.ts +6 -0
  180. package/dist/cli/middleware/index.d.ts.map +1 -0
  181. package/dist/cli/middleware/index.js +3 -0
  182. package/dist/cli/middleware/index.js.map +1 -0
  183. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +9 -0
  184. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -0
  185. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +160 -0
  186. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -0
  187. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts +9 -0
  188. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -0
  189. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +343 -0
  190. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -0
  191. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +9 -0
  192. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -0
  193. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +254 -0
  194. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -0
  195. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts +8 -0
  196. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts.map +1 -0
  197. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js +128 -0
  198. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js.map +1 -0
  199. package/dist/cli/templates/agents/index.d.ts +23 -0
  200. package/dist/cli/templates/agents/index.d.ts.map +1 -0
  201. package/dist/cli/templates/agents/index.js +29 -0
  202. package/dist/cli/templates/agents/index.js.map +1 -0
  203. package/dist/cli/templates/commands.d.ts +17 -0
  204. package/dist/cli/templates/commands.d.ts.map +1 -0
  205. package/dist/cli/templates/commands.js +78 -0
  206. package/dist/cli/templates/commands.js.map +1 -0
  207. package/dist/cli/templates/content/sf-blockers.d.ts +7 -0
  208. package/dist/cli/templates/content/sf-blockers.d.ts.map +1 -0
  209. package/dist/cli/templates/content/sf-blockers.js +69 -0
  210. package/dist/cli/templates/content/sf-blockers.js.map +1 -0
  211. package/dist/cli/templates/content/sf-commit.d.ts +7 -0
  212. package/dist/cli/templates/content/sf-commit.d.ts.map +1 -0
  213. package/dist/cli/templates/content/sf-commit.js +79 -0
  214. package/dist/cli/templates/content/sf-commit.js.map +1 -0
  215. package/dist/cli/templates/content/sf-context.d.ts +7 -0
  216. package/dist/cli/templates/content/sf-context.d.ts.map +1 -0
  217. package/dist/cli/templates/content/sf-context.js +63 -0
  218. package/dist/cli/templates/content/sf-context.js.map +1 -0
  219. package/dist/cli/templates/content/sf-help.d.ts +7 -0
  220. package/dist/cli/templates/content/sf-help.d.ts.map +1 -0
  221. package/dist/cli/templates/content/sf-help.js +42 -0
  222. package/dist/cli/templates/content/sf-help.js.map +1 -0
  223. package/dist/cli/templates/content/sf-init.d.ts +7 -0
  224. package/dist/cli/templates/content/sf-init.d.ts.map +1 -0
  225. package/dist/cli/templates/content/sf-init.js +62 -0
  226. package/dist/cli/templates/content/sf-init.js.map +1 -0
  227. package/dist/cli/templates/content/sf-reset.d.ts +7 -0
  228. package/dist/cli/templates/content/sf-reset.d.ts.map +1 -0
  229. package/dist/cli/templates/content/sf-reset.js +67 -0
  230. package/dist/cli/templates/content/sf-reset.js.map +1 -0
  231. package/dist/cli/templates/content/sf-search.d.ts +7 -0
  232. package/dist/cli/templates/content/sf-search.d.ts.map +1 -0
  233. package/dist/cli/templates/content/sf-search.js +63 -0
  234. package/dist/cli/templates/content/sf-search.js.map +1 -0
  235. package/dist/cli/templates/content/sf-status.d.ts +7 -0
  236. package/dist/cli/templates/content/sf-status.d.ts.map +1 -0
  237. package/dist/cli/templates/content/sf-status.js +62 -0
  238. package/dist/cli/templates/content/sf-status.js.map +1 -0
  239. package/dist/cli/templates/index.d.ts +8 -0
  240. package/dist/cli/templates/index.d.ts.map +1 -0
  241. package/dist/cli/templates/index.js +17 -0
  242. package/dist/cli/templates/index.js.map +1 -0
  243. package/dist/cli/ui/banner.d.ts +38 -0
  244. package/dist/cli/ui/banner.d.ts.map +1 -0
  245. package/dist/cli/ui/banner.js +89 -0
  246. package/dist/cli/ui/banner.js.map +1 -0
  247. package/dist/cli/ui/colors.d.ts +76 -0
  248. package/dist/cli/ui/colors.d.ts.map +1 -0
  249. package/dist/cli/ui/colors.js +67 -0
  250. package/dist/cli/ui/colors.js.map +1 -0
  251. package/dist/cli/ui/index.d.ts +7 -0
  252. package/dist/cli/ui/index.d.ts.map +1 -0
  253. package/dist/cli/ui/index.js +4 -0
  254. package/dist/cli/ui/index.js.map +1 -0
  255. package/dist/cli/ui/output.d.ts +117 -0
  256. package/dist/cli/ui/output.d.ts.map +1 -0
  257. package/dist/cli/ui/output.js +83 -0
  258. package/dist/cli/ui/output.js.map +1 -0
  259. package/dist/cli/ui/spinner.d.ts +120 -0
  260. package/dist/cli/ui/spinner.d.ts.map +1 -0
  261. package/dist/cli/ui/spinner.js +158 -0
  262. package/dist/cli/ui/spinner.js.map +1 -0
  263. package/dist/cli/ui/time.d.ts +54 -0
  264. package/dist/cli/ui/time.d.ts.map +1 -0
  265. package/dist/cli/ui/time.js +119 -0
  266. package/dist/cli/ui/time.js.map +1 -0
  267. package/dist/client/api-client.d.ts +123 -0
  268. package/dist/client/api-client.d.ts.map +1 -0
  269. package/dist/client/api-client.js +105 -0
  270. package/dist/client/api-client.js.map +1 -0
  271. package/dist/client/cli-client.d.ts +26 -0
  272. package/dist/client/cli-client.d.ts.map +1 -0
  273. package/dist/client/cli-client.js +20 -0
  274. package/dist/client/cli-client.js.map +1 -0
  275. package/dist/config/index.d.ts +78 -0
  276. package/dist/config/index.d.ts.map +1 -0
  277. package/dist/config/index.js +79 -0
  278. package/dist/config/index.js.map +1 -0
  279. package/dist/index.d.ts +16 -0
  280. package/dist/index.d.ts.map +1 -0
  281. package/dist/index.js +73 -0
  282. package/dist/index.js.map +1 -0
  283. package/dist/lib/format.d.ts +126 -0
  284. package/dist/lib/format.d.ts.map +1 -0
  285. package/dist/lib/format.js +71 -0
  286. package/dist/lib/format.js.map +1 -0
  287. package/dist/lib/index.d.ts +11 -0
  288. package/dist/lib/index.d.ts.map +1 -0
  289. package/dist/lib/index.js +45 -0
  290. package/dist/lib/index.js.map +1 -0
  291. package/dist/lib/monorepo-detector.d.ts +31 -0
  292. package/dist/lib/monorepo-detector.d.ts.map +1 -0
  293. package/dist/lib/monorepo-detector.js +188 -0
  294. package/dist/lib/monorepo-detector.js.map +1 -0
  295. package/dist/lib/prompt-generator.d.ts +65 -0
  296. package/dist/lib/prompt-generator.d.ts.map +1 -0
  297. package/dist/lib/prompt-generator.js +162 -0
  298. package/dist/lib/prompt-generator.js.map +1 -0
  299. package/dist/lib/strategy-analyzer.d.ts +59 -0
  300. package/dist/lib/strategy-analyzer.d.ts.map +1 -0
  301. package/dist/lib/strategy-analyzer.js +91 -0
  302. package/dist/lib/strategy-analyzer.js.map +1 -0
  303. package/dist/lib/workflow-definitions.d.ts +41 -0
  304. package/dist/lib/workflow-definitions.d.ts.map +1 -0
  305. package/dist/lib/workflow-definitions.js +497 -0
  306. package/dist/lib/workflow-definitions.js.map +1 -0
  307. package/dist/patterns/index.d.ts +9 -0
  308. package/dist/patterns/index.d.ts.map +1 -0
  309. package/dist/patterns/index.js +21 -0
  310. package/dist/patterns/index.js.map +1 -0
  311. package/dist/patterns/inheritance.d.ts +193 -0
  312. package/dist/patterns/inheritance.d.ts.map +1 -0
  313. package/dist/patterns/inheritance.js +125 -0
  314. package/dist/patterns/inheritance.js.map +1 -0
  315. package/dist/server.d.ts +44 -0
  316. package/dist/server.d.ts.map +1 -0
  317. package/dist/server.js +91 -0
  318. package/dist/server.js.map +1 -0
  319. package/dist/tools/core/context-helper.d.ts +50 -0
  320. package/dist/tools/core/context-helper.d.ts.map +1 -0
  321. package/dist/tools/core/context-helper.js +49 -0
  322. package/dist/tools/core/context-helper.js.map +1 -0
  323. package/dist/tools/core/index.d.ts +2 -0
  324. package/dist/tools/core/index.d.ts.map +1 -0
  325. package/dist/tools/core/index.js +2 -0
  326. package/dist/tools/core/index.js.map +1 -0
  327. package/dist/tools/index.d.ts +58 -0
  328. package/dist/tools/index.d.ts.map +1 -0
  329. package/dist/tools/index.js +1499 -0
  330. package/dist/tools/index.js.map +1 -0
  331. package/dist/transport/__tests__/resolve-endpoint.test.d.ts +6 -0
  332. package/dist/transport/__tests__/resolve-endpoint.test.d.ts.map +1 -0
  333. package/dist/transport/index.d.ts +6 -0
  334. package/dist/transport/index.d.ts.map +1 -0
  335. package/dist/transport/index.js +5 -0
  336. package/dist/transport/index.js.map +1 -0
  337. package/dist/transport/interface.d.ts +25 -0
  338. package/dist/transport/interface.d.ts.map +1 -0
  339. package/dist/transport/interface.js +1 -0
  340. package/dist/transport/interface.js.map +1 -0
  341. package/dist/transport/remote.d.ts +38 -0
  342. package/dist/transport/remote.d.ts.map +1 -0
  343. package/dist/transport/remote.js +107 -0
  344. package/dist/transport/remote.js.map +1 -0
  345. package/dist/transport/resolve-endpoint.d.ts +58 -0
  346. package/dist/transport/resolve-endpoint.d.ts.map +1 -0
  347. package/dist/transport/resolve-endpoint.js +146 -0
  348. package/dist/transport/resolve-endpoint.js.map +1 -0
  349. package/dist/types/index.d.ts +212 -0
  350. package/dist/types/index.d.ts.map +1 -0
  351. package/dist/types/index.js +16 -0
  352. package/dist/types/index.js.map +1 -0
  353. package/dist/validation/index.d.ts +86 -0
  354. package/dist/validation/index.d.ts.map +1 -0
  355. package/dist/validation/index.js +392 -0
  356. package/dist/validation/index.js.map +1 -0
  357. package/dist/validation/ticket-validation.d.ts +162 -0
  358. package/dist/validation/ticket-validation.d.ts.map +1 -0
  359. package/dist/validation/ticket-validation.js +188 -0
  360. package/dist/validation/ticket-validation.js.map +1 -0
  361. package/package.json +69 -0
  362. package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +165 -0
  363. package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +348 -0
  364. package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +259 -0
  365. package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +132 -0
  366. package/src/cli/templates/agents/index.ts +47 -0
  367. package/src/cli/templates/commands.ts +90 -0
  368. package/src/cli/templates/content/sf-blockers.ts +71 -0
  369. package/src/cli/templates/content/sf-commit.ts +81 -0
  370. package/src/cli/templates/content/sf-context.ts +65 -0
  371. package/src/cli/templates/content/sf-help.ts +44 -0
  372. package/src/cli/templates/content/sf-init.ts +64 -0
  373. package/src/cli/templates/content/sf-reset.ts +69 -0
  374. package/src/cli/templates/content/sf-search.ts +65 -0
  375. package/src/cli/templates/content/sf-status.ts +64 -0
  376. package/src/cli/templates/index.ts +16 -0
  377. package/src/cli/templates/skills/specforge-conventions.md +114 -0
  378. package/src/cli/templates/skills/specforge-orchestrator.md +409 -0
  379. package/src/cli/templates/skills/specforge-validator.md +128 -0
  380. package/src/cli/templates/skills/specforge-worker.md +412 -0
@@ -0,0 +1,188 @@
1
+ const validationRules = {
2
+ small: {
3
+ requiresImplementation: false,
4
+ requiresTechnicalDetails: false,
5
+ requiresNotes: false,
6
+ minSteps: 0,
7
+ minAcceptanceCriteria: 1,
8
+ requiresFileInfo: false
9
+ },
10
+ medium: {
11
+ requiresImplementation: true,
12
+ requiresTechnicalDetails: false,
13
+ requiresNotes: false,
14
+ minSteps: 2,
15
+ minAcceptanceCriteria: 2,
16
+ requiresFileInfo: false
17
+ },
18
+ large: {
19
+ requiresImplementation: true,
20
+ requiresTechnicalDetails: true,
21
+ requiresNotes: false,
22
+ minSteps: 4,
23
+ minAcceptanceCriteria: 3,
24
+ requiresFileInfo: true
25
+ },
26
+ xlarge: {
27
+ requiresImplementation: true,
28
+ requiresTechnicalDetails: true,
29
+ requiresNotes: true,
30
+ minSteps: 6,
31
+ minAcceptanceCriteria: 5,
32
+ requiresFileInfo: true
33
+ }
34
+ };
35
+ function validateTicket(ticket) {
36
+ const warnings = [];
37
+ const complexity = ticket.complexity || "medium";
38
+ const rules = validationRules[complexity];
39
+ if (rules.requiresImplementation) {
40
+ if (!ticket.implementation?.steps?.length) {
41
+ warnings.push({
42
+ code: "MISSING_IMPLEMENTATION",
43
+ message: `${complexity} tickets should have implementation steps`,
44
+ field: "implementation",
45
+ severity: "warning"
46
+ });
47
+ } else if (ticket.implementation.steps.length < rules.minSteps) {
48
+ warnings.push({
49
+ code: "INSUFFICIENT_STEPS",
50
+ message: `${complexity} tickets should have at least ${rules.minSteps} implementation steps (found ${ticket.implementation.steps.length})`,
51
+ field: "implementation.steps",
52
+ severity: "recommendation"
53
+ });
54
+ }
55
+ }
56
+ if (rules.requiresTechnicalDetails && !ticket.technicalDetails) {
57
+ warnings.push({
58
+ code: "MISSING_TECHNICAL_DETAILS",
59
+ message: `${complexity} tickets should have technicalDetails`,
60
+ field: "technicalDetails",
61
+ severity: "warning"
62
+ });
63
+ }
64
+ if (rules.requiresFileInfo) {
65
+ const hasFiles = (ticket.implementation?.filesToCreate?.length ?? 0) > 0 || (ticket.implementation?.filesToModify?.length ?? 0) > 0;
66
+ if (!hasFiles) {
67
+ warnings.push({
68
+ code: "MISSING_FILE_INFO",
69
+ message: `${complexity} tickets should specify files to create/modify`,
70
+ field: "implementation",
71
+ severity: "recommendation"
72
+ });
73
+ }
74
+ }
75
+ if (rules.requiresNotes && !ticket.notes) {
76
+ warnings.push({
77
+ code: "MISSING_NOTES",
78
+ message: `${complexity} tickets should have notes with context`,
79
+ field: "notes",
80
+ severity: "info"
81
+ });
82
+ }
83
+ const criteriaCount = ticket.acceptanceCriteria?.length || 0;
84
+ if (criteriaCount < rules.minAcceptanceCriteria) {
85
+ warnings.push({
86
+ code: "INSUFFICIENT_ACCEPTANCE_CRITERIA",
87
+ message: `${complexity} tickets should have at least ${rules.minAcceptanceCriteria} acceptance criteria (found ${criteriaCount})`,
88
+ field: "acceptanceCriteria",
89
+ severity: "recommendation"
90
+ });
91
+ }
92
+ const completenessScore = calculateCompletenessScore(ticket, rules);
93
+ return {
94
+ valid: true,
95
+ warnings,
96
+ completenessScore
97
+ };
98
+ }
99
+ function calculateCompletenessScore(ticket, rules) {
100
+ let score = 0;
101
+ let maxScore = 0;
102
+ if (rules.requiresImplementation) {
103
+ maxScore += 30;
104
+ if (ticket.implementation?.steps?.length) {
105
+ const stepRatio = Math.min(ticket.implementation.steps.length / rules.minSteps, 1);
106
+ score += 30 * stepRatio;
107
+ }
108
+ }
109
+ if (rules.requiresTechnicalDetails) {
110
+ maxScore += 25;
111
+ if (ticket.technicalDetails) {
112
+ score += 15;
113
+ const hasFiles = (ticket.implementation?.filesToCreate?.length ?? 0) > 0 || (ticket.implementation?.filesToModify?.length ?? 0) > 0;
114
+ if (hasFiles) score += 10;
115
+ }
116
+ }
117
+ if (rules.requiresNotes) {
118
+ maxScore += 15;
119
+ if (ticket.notes) score += 15;
120
+ }
121
+ maxScore += 30;
122
+ const criteriaRatio = Math.min(
123
+ (ticket.acceptanceCriteria?.length || 0) / rules.minAcceptanceCriteria,
124
+ 1
125
+ );
126
+ score += 30 * criteriaRatio;
127
+ return maxScore > 0 ? Math.round(score / maxScore * 100) : 100;
128
+ }
129
+ function filterWarningsByStrictness(warnings, strictness) {
130
+ switch (strictness) {
131
+ case "lenient":
132
+ return warnings.filter((w) => w.severity === "warning");
133
+ case "normal":
134
+ return warnings.filter((w) => w.severity !== "info");
135
+ case "strict":
136
+ return warnings;
137
+ }
138
+ }
139
+ function getComplexityRules(complexity) {
140
+ return validationRules[complexity];
141
+ }
142
+ function isValidComplexity(value) {
143
+ return value === "small" || value === "medium" || value === "large" || value === "xlarge";
144
+ }
145
+ function getComplexityDescription(complexity) {
146
+ const descriptions = {
147
+ small: "Simple tasks that can be completed quickly with minimal documentation",
148
+ medium: "Standard tasks requiring basic implementation planning",
149
+ large: "Complex tasks requiring detailed implementation and technical specs",
150
+ xlarge: "Major features requiring comprehensive documentation and planning"
151
+ };
152
+ return descriptions[complexity];
153
+ }
154
+ function suggestComplexity(ticket) {
155
+ let score = 0;
156
+ const stepCount = ticket.implementation?.steps?.length || 0;
157
+ if (stepCount >= 6) score += 3;
158
+ else if (stepCount >= 4) score += 2;
159
+ else if (stepCount >= 2) score += 1;
160
+ if (ticket.technicalDetails) {
161
+ score += 1;
162
+ if (ticket.technicalDetails.endpoints?.length) score += 1;
163
+ if (ticket.technicalDetails.database) score += 1;
164
+ }
165
+ if ((ticket.implementation?.filesToCreate?.length ?? 0) > 0 || (ticket.implementation?.filesToModify?.length ?? 0) > 0) {
166
+ score += 1;
167
+ }
168
+ if (ticket.notes) {
169
+ score += 1;
170
+ }
171
+ const criteriaCount = ticket.acceptanceCriteria?.length || 0;
172
+ if (criteriaCount >= 5) score += 2;
173
+ else if (criteriaCount >= 3) score += 1;
174
+ if (score >= 8) return "xlarge";
175
+ if (score >= 5) return "large";
176
+ if (score >= 2) return "medium";
177
+ return "small";
178
+ }
179
+ export {
180
+ filterWarningsByStrictness,
181
+ getComplexityDescription,
182
+ getComplexityRules,
183
+ isValidComplexity,
184
+ suggestComplexity,
185
+ validateTicket,
186
+ validationRules
187
+ };
188
+ //# sourceMappingURL=ticket-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/validation/ticket-validation.ts"],"sourcesContent":["/**\n * Ticket Complexity Validation\n *\n * Provides complexity-based validation rules that return warnings rather than\n * errors. This encourages completeness without blocking ticket creation.\n *\n * @see MCI-023-04-complexity-validation-rules\n */\n\nimport type {\n TicketImplementation,\n TicketTechnicalDetails,\n} from '../types/index.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Ticket complexity levels\n */\nexport type TicketComplexity = 'small' | 'medium' | 'large' | 'xlarge';\n\n/**\n * Validation warning severity levels\n */\nexport type WarningSeverity = 'info' | 'warning' | 'recommendation';\n\n/**\n * Validation strictness levels\n */\nexport type StrictnessLevel = 'lenient' | 'normal' | 'strict';\n\n/**\n * Single validation warning\n */\nexport interface ValidationWarning {\n /** Warning code for programmatic handling */\n code: string;\n /** Human-readable message */\n message: string;\n /** Field that triggered the warning */\n field?: string;\n /** Severity level */\n severity: WarningSeverity;\n}\n\n/**\n * Complete validation result\n */\nexport interface TicketValidationResult {\n /** Always true - warnings don't block creation */\n valid: true;\n /** List of warnings */\n warnings: ValidationWarning[];\n /** Completeness score (0-100) */\n completenessScore: number;\n}\n\n/**\n * Validation rules for a complexity level\n */\nexport interface ComplexityRules {\n /** Whether implementation steps are recommended */\n requiresImplementation: boolean;\n /** Whether technical details are recommended */\n requiresTechnicalDetails: boolean;\n /** Whether notes are recommended */\n requiresNotes: boolean;\n /** Minimum recommended implementation steps */\n minSteps: number;\n /** Minimum recommended acceptance criteria */\n minAcceptanceCriteria: number;\n /** Whether file information is recommended */\n requiresFileInfo: boolean;\n}\n\n// =============================================================================\n// Validation Rules Configuration\n// =============================================================================\n\n/**\n * Validation rules by complexity\n *\n * These rules define what fields are recommended for each complexity level.\n * Small tickets have minimal requirements, while xlarge tickets need\n * comprehensive documentation.\n */\nexport const validationRules: Record<TicketComplexity, ComplexityRules> = {\n small: {\n requiresImplementation: false,\n requiresTechnicalDetails: false,\n requiresNotes: false,\n minSteps: 0,\n minAcceptanceCriteria: 1,\n requiresFileInfo: false,\n },\n medium: {\n requiresImplementation: true,\n requiresTechnicalDetails: false,\n requiresNotes: false,\n minSteps: 2,\n minAcceptanceCriteria: 2,\n requiresFileInfo: false,\n },\n large: {\n requiresImplementation: true,\n requiresTechnicalDetails: true,\n requiresNotes: false,\n minSteps: 4,\n minAcceptanceCriteria: 3,\n requiresFileInfo: true,\n },\n xlarge: {\n requiresImplementation: true,\n requiresTechnicalDetails: true,\n requiresNotes: true,\n minSteps: 6,\n minAcceptanceCriteria: 5,\n requiresFileInfo: true,\n },\n};\n\n// =============================================================================\n// Validation Functions\n// =============================================================================\n\n/**\n * Ticket data for validation\n */\nexport interface TicketValidationInput {\n complexity?: TicketComplexity;\n implementation?: TicketImplementation | null;\n technicalDetails?: TicketTechnicalDetails | null;\n notes?: string | null;\n acceptanceCriteria?: string[];\n}\n\n/**\n * Validate a ticket against complexity-based rules\n *\n * Returns warnings for missing or incomplete fields based on the ticket's\n * complexity level. Does not block ticket creation - all validations\n * produce warnings, not errors.\n *\n * @param ticket - The ticket data to validate\n * @returns Validation result with warnings and completeness score\n *\n * @example\n * ```typescript\n * const result = validateTicket({\n * complexity: 'large',\n * implementation: { steps: [{ order: 1, title: 'Setup', action: 'create', detail: '...' }] },\n * acceptanceCriteria: ['Works correctly']\n * });\n *\n * if (result.warnings.length > 0) {\n * console.log('Suggestions:', result.warnings.map(w => w.message));\n * }\n * console.log('Completeness:', result.completenessScore + '%');\n * ```\n */\nexport function validateTicket(ticket: TicketValidationInput): TicketValidationResult {\n const warnings: ValidationWarning[] = [];\n const complexity = ticket.complexity || 'medium';\n const rules = validationRules[complexity];\n\n // Check implementation\n if (rules.requiresImplementation) {\n if (!ticket.implementation?.steps?.length) {\n warnings.push({\n code: 'MISSING_IMPLEMENTATION',\n message: `${complexity} tickets should have implementation steps`,\n field: 'implementation',\n severity: 'warning',\n });\n } else if (ticket.implementation.steps.length < rules.minSteps) {\n warnings.push({\n code: 'INSUFFICIENT_STEPS',\n message: `${complexity} tickets should have at least ${rules.minSteps} implementation steps (found ${ticket.implementation.steps.length})`,\n field: 'implementation.steps',\n severity: 'recommendation',\n });\n }\n }\n\n // Check technical details\n if (rules.requiresTechnicalDetails && !ticket.technicalDetails) {\n warnings.push({\n code: 'MISSING_TECHNICAL_DETAILS',\n message: `${complexity} tickets should have technicalDetails`,\n field: 'technicalDetails',\n severity: 'warning',\n });\n }\n\n // Check file info\n if (rules.requiresFileInfo) {\n const hasFiles =\n (ticket.implementation?.filesToCreate?.length ?? 0) > 0 ||\n (ticket.implementation?.filesToModify?.length ?? 0) > 0;\n if (!hasFiles) {\n warnings.push({\n code: 'MISSING_FILE_INFO',\n message: `${complexity} tickets should specify files to create/modify`,\n field: 'implementation',\n severity: 'recommendation',\n });\n }\n }\n\n // Check notes\n if (rules.requiresNotes && !ticket.notes) {\n warnings.push({\n code: 'MISSING_NOTES',\n message: `${complexity} tickets should have notes with context`,\n field: 'notes',\n severity: 'info',\n });\n }\n\n // Check acceptance criteria\n const criteriaCount = ticket.acceptanceCriteria?.length || 0;\n if (criteriaCount < rules.minAcceptanceCriteria) {\n warnings.push({\n code: 'INSUFFICIENT_ACCEPTANCE_CRITERIA',\n message: `${complexity} tickets should have at least ${rules.minAcceptanceCriteria} acceptance criteria (found ${criteriaCount})`,\n field: 'acceptanceCriteria',\n severity: 'recommendation',\n });\n }\n\n // Calculate completeness score\n const completenessScore = calculateCompletenessScore(ticket, rules);\n\n return {\n valid: true,\n warnings,\n completenessScore,\n };\n}\n\n/**\n * Calculate how complete a ticket is (0-100)\n *\n * Weights different fields based on complexity requirements.\n * A fully complete ticket for its complexity level scores 100.\n *\n * @param ticket - The ticket data\n * @param rules - Complexity rules to evaluate against\n * @returns Completeness score from 0 to 100\n */\nfunction calculateCompletenessScore(\n ticket: TicketValidationInput,\n rules: ComplexityRules\n): number {\n let score = 0;\n let maxScore = 0;\n\n // Implementation (30 points max)\n if (rules.requiresImplementation) {\n maxScore += 30;\n if (ticket.implementation?.steps?.length) {\n const stepRatio = Math.min(ticket.implementation.steps.length / rules.minSteps, 1);\n score += 30 * stepRatio;\n }\n }\n\n // Technical details (25 points max)\n if (rules.requiresTechnicalDetails) {\n maxScore += 25;\n if (ticket.technicalDetails) {\n score += 15;\n const hasFiles =\n (ticket.implementation?.filesToCreate?.length ?? 0) > 0 ||\n (ticket.implementation?.filesToModify?.length ?? 0) > 0;\n if (hasFiles) score += 10;\n }\n }\n\n // Notes (15 points max)\n if (rules.requiresNotes) {\n maxScore += 15;\n if (ticket.notes) score += 15;\n }\n\n // Acceptance criteria (30 points max)\n maxScore += 30;\n const criteriaRatio = Math.min(\n (ticket.acceptanceCriteria?.length || 0) / rules.minAcceptanceCriteria,\n 1\n );\n score += 30 * criteriaRatio;\n\n return maxScore > 0 ? Math.round((score / maxScore) * 100) : 100;\n}\n\n/**\n * Filter warnings by strictness level\n *\n * Allows callers to filter out lower-priority warnings based on their\n * desired strictness level.\n *\n * - lenient: Only show 'warning' severity (most important issues only)\n * - normal: Show 'warning' and 'recommendation' (default)\n * - strict: Show all warnings including 'info' level\n *\n * @param warnings - Array of validation warnings\n * @param strictness - Desired strictness level\n * @returns Filtered array of warnings\n *\n * @example\n * ```typescript\n * const result = validateTicket(ticket);\n * const warnings = filterWarningsByStrictness(result.warnings, 'lenient');\n * // Only includes warnings with severity 'warning'\n * ```\n */\nexport function filterWarningsByStrictness(\n warnings: ValidationWarning[],\n strictness: StrictnessLevel\n): ValidationWarning[] {\n switch (strictness) {\n case 'lenient':\n return warnings.filter((w) => w.severity === 'warning');\n case 'normal':\n return warnings.filter((w) => w.severity !== 'info');\n case 'strict':\n return warnings;\n }\n}\n\n/**\n * Get the rules for a specific complexity level\n *\n * Useful for displaying requirements to users or for custom validation.\n *\n * @param complexity - The complexity level\n * @returns Rules for that complexity level\n */\nexport function getComplexityRules(complexity: TicketComplexity): ComplexityRules {\n return validationRules[complexity];\n}\n\n/**\n * Check if a complexity value is valid\n *\n * @param value - The value to check\n * @returns True if value is a valid TicketComplexity\n */\nexport function isValidComplexity(value: unknown): value is TicketComplexity {\n return value === 'small' || value === 'medium' || value === 'large' || value === 'xlarge';\n}\n\n/**\n * Get human-readable description of complexity level\n *\n * @param complexity - The complexity level\n * @returns Description of what this complexity level means\n */\nexport function getComplexityDescription(complexity: TicketComplexity): string {\n const descriptions: Record<TicketComplexity, string> = {\n small: 'Simple tasks that can be completed quickly with minimal documentation',\n medium: 'Standard tasks requiring basic implementation planning',\n large: 'Complex tasks requiring detailed implementation and technical specs',\n xlarge: 'Major features requiring comprehensive documentation and planning',\n };\n return descriptions[complexity];\n}\n\n/**\n * Suggest appropriate complexity based on ticket content\n *\n * Analyzes the provided ticket data and suggests an appropriate\n * complexity level. Useful for auto-suggesting complexity during\n * ticket creation.\n *\n * @param ticket - The ticket data\n * @returns Suggested complexity level\n */\nexport function suggestComplexity(ticket: TicketValidationInput): TicketComplexity {\n let score = 0;\n\n // Implementation steps add complexity\n const stepCount = ticket.implementation?.steps?.length || 0;\n if (stepCount >= 6) score += 3;\n else if (stepCount >= 4) score += 2;\n else if (stepCount >= 2) score += 1;\n\n // Technical details add complexity\n if (ticket.technicalDetails) {\n score += 1;\n if (ticket.technicalDetails.endpoints?.length) score += 1;\n if (ticket.technicalDetails.database) score += 1;\n }\n\n // File operations on the implementation indicate more complex work\n if (\n (ticket.implementation?.filesToCreate?.length ?? 0) > 0 ||\n (ticket.implementation?.filesToModify?.length ?? 0) > 0\n ) {\n score += 1;\n }\n\n // Notes indicate more complex work\n if (ticket.notes) {\n score += 1;\n }\n\n // Acceptance criteria count\n const criteriaCount = ticket.acceptanceCriteria?.length || 0;\n if (criteriaCount >= 5) score += 2;\n else if (criteriaCount >= 3) score += 1;\n\n // Map score to complexity\n if (score >= 8) return 'xlarge';\n if (score >= 5) return 'large';\n if (score >= 2) return 'medium';\n return 'small';\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@specforge/cli",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for SpecForge - AI agent integration",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "bin": {
9
+ "specforge": "./bin/specforge"
10
+ },
11
+ "scripts": {
12
+ "build": "tsup && tsc --emitDeclarationOnly --outDir dist",
13
+ "typecheck": "tsc --noEmit",
14
+ "start": "node dist/index.js",
15
+ "dev": "tsx src/index.ts",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "test:planning": "vitest run --config vitest.planning.config.ts",
19
+ "test:coverage": "vitest run --coverage",
20
+ "test:real": "vitest run --config vitest.real.config.ts",
21
+ "test:real:watch": "vitest --config vitest.real.config.ts",
22
+ "test:smoke": "vitest run --config vitest.real.config.ts src/__tests__/real/smoke",
23
+ "seed:planning": "tsx src/__tests__/integration/seed-planning-session.ts",
24
+ "seed:implementation": "tsx src/__tests__/integration/seed-implementation-session.ts",
25
+ "seed:review": "tsx src/__tests__/integration/seed-review-session.ts",
26
+ "seed:canary": "tsx src/__tests__/integration/seed-ticket-status-canary.ts",
27
+ "test:implementation": "vitest run --config vitest.implementation.config.ts",
28
+ "test:review": "vitest run --config vitest.review.config.ts"
29
+ },
30
+ "dependencies": {
31
+ "@modelcontextprotocol/sdk": "^1.0.0",
32
+ "@specforge/types": "workspace:*",
33
+ "@toon-format/toon": "^2.1.0",
34
+ "chalk": "^5.6.2",
35
+ "cli-table3": "^0.6.5",
36
+ "commander": "^12.1.0",
37
+ "inquirer": "^9.3.8",
38
+ "minimatch": "^10.1.1",
39
+ "ora": "^8.2.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/inquirer": "^9.0.9",
43
+ "@types/minimatch": "^5.1.2",
44
+ "@types/node": "^20.0.0",
45
+ "@vitest/coverage-v8": "4.0.18",
46
+ "mock-fs": "^5.5.0",
47
+ "tsup": "^8.5.1",
48
+ "tsx": "^4.7.0",
49
+ "typescript": "^5.0.0",
50
+ "vitest": "4.0.18"
51
+ },
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ },
55
+ "files": [
56
+ "dist",
57
+ "bin",
58
+ "src/cli/templates"
59
+ ],
60
+ "keywords": [
61
+ "mcp",
62
+ "specforge",
63
+ "ai",
64
+ "claude",
65
+ "cursor",
66
+ "copilot"
67
+ ],
68
+ "license": "MIT"
69
+ }
@@ -0,0 +1,165 @@
1
+ /**
2
+ * SFAG-Orchestrator Agent Template v2
3
+ *
4
+ * Strategic task decomposition with concrete decision trees.
5
+ * Knows when to delegate, to whom, and in what order.
6
+ */
7
+
8
+ import type { AgentTemplate } from '../../../../commands/scaffold/agent-types.js';
9
+
10
+ export const SFAG_ORCHESTRATOR: AgentTemplate = {
11
+ name: 'sfag-orchestrator',
12
+ description: 'Decompose complex tasks and coordinate specialized agents',
13
+ triggerDescription: `Use this agent when a task spans multiple domains and requires coordination between specialized agents. The orchestrator decides WHAT to delegate, to WHOM, and in WHAT ORDER.
14
+
15
+ <example>
16
+ Context: User requests a full feature that needs spec + implementation + tests
17
+ user: "Preciso de um módulo completo de pagamentos — desde a spec até deploy"
18
+ assistant: "This spans multiple domains. Launching sfag-orchestrator to decompose and coordinate."
19
+ </example>
20
+
21
+ <example>
22
+ Context: User has a complex task touching schema, API, frontend, and tests
23
+ user: "Adiciona um sistema de comentários — precisa de tabela, API, componente, e testes"
24
+ assistant: "Multi-domain task detected. Launching sfag-orchestrator to plan the execution."
25
+ </example>
26
+
27
+ <example>
28
+ Context: User needs analysis across multiple dimensions
29
+ user: "Faz uma análise completa desse módulo — segurança, performance, e qualidade"
30
+ assistant: "Launching sfag-orchestrator to coordinate a multi-perspective analysis."
31
+ </example>`,
32
+ model: 'opus',
33
+ color: 'magenta',
34
+ category: 'Orchestration',
35
+ memory: 'project',
36
+ content: `# SpecForge Orchestrator Agent
37
+
38
+ You are the brain. You don't write code. You don't write specs. You decide WHO does WHAT and WHEN, then you make it happen.
39
+
40
+ ## Context Bootstrapping
41
+
42
+ Before any decision, read the project context from the local config:
43
+ \`\`\`
44
+ Read .specforge.json from project root → extract:
45
+ - project.id → projectId
46
+ - activeSpecification.id → specificationId (may be null if no spec exists yet)
47
+ - agentTeams config (if Agent Teams mode)
48
+ \`\`\`
49
+ All tool calls that need projectId/specificationId use these values. No session store, no get_working_context.
50
+
51
+ ## Available Agents
52
+
53
+ | Agent | What it does | When to use |
54
+ |-------|-------------|-------------|
55
+ | **sfag-spec-creator** | Dense interrogation → SpecForge spec | When requirements are unclear or no spec exists |
56
+ | **sfag-ticket-implementer** | Lifecycle-tracked ticket implementation | When a spec exists and tickets are ready |
57
+ | **sfag-package-researcher** | Web research for packages/APIs/docs | When external knowledge is needed before implementation |
58
+
59
+ ## Decision Tree
60
+
61
+ When a task arrives, follow this tree:
62
+
63
+ ### 1. Does a specification exist for this work?
64
+
65
+ **NO →** Route to \`sfag-spec-creator\` first. Full stop. No implementation without a spec.
66
+
67
+ **YES →** Continue to step 2.
68
+
69
+ ### 2. Does the task require external package/API knowledge?
70
+
71
+ **YES →** Launch \`sfag-package-researcher\` BEFORE implementation. Feed research output into implementation context.
72
+
73
+ **NO →** Continue to step 3.
74
+
75
+ ### 3. Are tickets created and ready?
76
+
77
+ **NO →** Check if the spec needs more tickets. If yes, route back to \`sfag-spec-creator\` for ticket creation. If tickets exist but are blocked, diagnose with:
78
+ \`\`\`
79
+ get_blocked_tickets({ specificationId })
80
+ get_dependency_tree({ specificationId })
81
+ \`\`\`
82
+
83
+ **YES →** Route to \`sfag-ticket-implementer\`. Give it the ticket ID or let it pick from actionable tickets.
84
+
85
+ ### 4. Is this a multi-ticket task?
86
+
87
+ **YES →** Determine execution order:
88
+ \`\`\`
89
+ get_critical_path({ specificationId })
90
+ get_next_actionable_tickets({ specificationId })
91
+ \`\`\`
92
+ Launch \`sfag-ticket-implementer\` for each ticket in dependency order. Between tickets, verify the previous completed successfully before starting the next.
93
+
94
+ **NO →** Single ticket, single launch.
95
+
96
+ ## Coordination Patterns
97
+
98
+ ### Pattern A: Greenfield Feature
99
+ \`\`\`
100
+ sfag-spec-creator (interrogation → spec + epics + tickets)
101
+
102
+ sfag-package-researcher (if unknown packages involved)
103
+
104
+ sfag-ticket-implementer (ticket 1 → ticket 2 → ... → ticket N)
105
+ \`\`\`
106
+
107
+ ### Pattern B: Add to Existing Spec
108
+ \`\`\`
109
+ Check spec status → create new epic/tickets if needed
110
+
111
+ sfag-ticket-implementer (new tickets only)
112
+ \`\`\`
113
+
114
+ ### Pattern C: Research-First Implementation
115
+ \`\`\`
116
+ sfag-package-researcher (gather docs, patterns, gotchas)
117
+
118
+ Feed research into ticket notes/context
119
+
120
+ sfag-ticket-implementer (implement with research context)
121
+ \`\`\`
122
+
123
+ ### Pattern D: Multi-Domain Parallel
124
+ When tickets are independent (no dependency chain):
125
+ \`\`\`
126
+ sfag-ticket-implementer (ticket A) ─┐
127
+ sfag-ticket-implementer (ticket B) ─┼→ verify all complete
128
+ sfag-ticket-implementer (ticket C) ─┘
129
+ \`\`\`
130
+
131
+ ## Your Responsibilities
132
+
133
+ ### Before Delegation
134
+ - Understand the full scope of the request
135
+ - Check SpecForge state: existing specs, ticket statuses, blockers
136
+ - Identify the right pattern (A, B, C, or D)
137
+ - Load relevant context for the agents you're about to launch
138
+
139
+ ### During Execution
140
+ - Monitor agent outputs for problems
141
+ - If an agent hits a blocker, decide: fix it, skip it, or escalate to user
142
+ - Track which tickets completed and which are next
143
+ - Maintain the execution plan — update if dependencies shift
144
+
145
+ ### After Completion
146
+ - Verify all delegated work completed (check ticket statuses)
147
+ - Report summary to user: what was done, what's pending, what's blocked
148
+ - Suggest next steps if work remains
149
+
150
+ ## What You Are NOT
151
+
152
+ - You are NOT an implementer. Don't write code. Delegate to ticket-implementer.
153
+ - You are NOT a spec creator. Don't interrogate requirements. Delegate to spec-creator.
154
+ - You are NOT a researcher. Don't search the web. Delegate to package-researcher.
155
+ - You ARE the one who decides the plan, sequences the work, and ensures nothing falls through the cracks.
156
+
157
+ ## Anti-Patterns
158
+
159
+ - ❌ Don't launch ticket-implementer without a spec. Spec-creator goes first.
160
+ - ❌ Don't implement tickets out of dependency order. Check the critical path.
161
+ - ❌ Don't assume packages are known. If the ticket references an unfamiliar package, research first.
162
+ - ❌ Don't run everything sequentially when tickets are independent. Parallel when possible.
163
+ - ❌ Don't silently skip blockers. Report them to the user with diagnosis.
164
+ `,
165
+ };