@specforge/canary-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 (565) 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/node_modules/@specforge/types/dist/api/bulk.d.ts +133 -0
  362. package/node_modules/@specforge/types/dist/api/bulk.d.ts.map +1 -0
  363. package/node_modules/@specforge/types/dist/api/bulk.js +7 -0
  364. package/node_modules/@specforge/types/dist/api/bulk.js.map +1 -0
  365. package/node_modules/@specforge/types/dist/api/feedback.d.ts +22 -0
  366. package/node_modules/@specforge/types/dist/api/feedback.d.ts.map +1 -0
  367. package/node_modules/@specforge/types/dist/api/feedback.js +5 -0
  368. package/node_modules/@specforge/types/dist/api/feedback.js.map +1 -0
  369. package/node_modules/@specforge/types/dist/api/index.d.ts +6 -0
  370. package/node_modules/@specforge/types/dist/api/index.d.ts.map +1 -0
  371. package/node_modules/@specforge/types/dist/api/index.js +6 -0
  372. package/node_modules/@specforge/types/dist/api/index.js.map +1 -0
  373. package/node_modules/@specforge/types/dist/api/lists.d.ts +55 -0
  374. package/node_modules/@specforge/types/dist/api/lists.d.ts.map +1 -0
  375. package/node_modules/@specforge/types/dist/api/lists.js +8 -0
  376. package/node_modules/@specforge/types/dist/api/lists.js.map +1 -0
  377. package/node_modules/@specforge/types/dist/api/lookups.d.ts +92 -0
  378. package/node_modules/@specforge/types/dist/api/lookups.d.ts.map +1 -0
  379. package/node_modules/@specforge/types/dist/api/lookups.js +2 -0
  380. package/node_modules/@specforge/types/dist/api/lookups.js.map +1 -0
  381. package/node_modules/@specforge/types/dist/api/responses.d.ts +92 -0
  382. package/node_modules/@specforge/types/dist/api/responses.d.ts.map +1 -0
  383. package/node_modules/@specforge/types/dist/api/responses.js +9 -0
  384. package/node_modules/@specforge/types/dist/api/responses.js.map +1 -0
  385. package/node_modules/@specforge/types/dist/index.d.ts +4 -0
  386. package/node_modules/@specforge/types/dist/index.d.ts.map +1 -0
  387. package/node_modules/@specforge/types/dist/index.js +4 -0
  388. package/node_modules/@specforge/types/dist/index.js.map +1 -0
  389. package/node_modules/@specforge/types/dist/mcp/index.d.ts +2 -0
  390. package/node_modules/@specforge/types/dist/mcp/index.d.ts.map +1 -0
  391. package/node_modules/@specforge/types/dist/mcp/index.js +2 -0
  392. package/node_modules/@specforge/types/dist/mcp/index.js.map +1 -0
  393. package/node_modules/@specforge/types/dist/mcp/tools/action-planning-session.d.ts +44 -0
  394. package/node_modules/@specforge/types/dist/mcp/tools/action-planning-session.d.ts.map +1 -0
  395. package/node_modules/@specforge/types/dist/mcp/tools/action-planning-session.js +5 -0
  396. package/node_modules/@specforge/types/dist/mcp/tools/action-planning-session.js.map +1 -0
  397. package/node_modules/@specforge/types/dist/mcp/tools/action-review-session.d.ts +68 -0
  398. package/node_modules/@specforge/types/dist/mcp/tools/action-review-session.d.ts.map +1 -0
  399. package/node_modules/@specforge/types/dist/mcp/tools/action-review-session.js +7 -0
  400. package/node_modules/@specforge/types/dist/mcp/tools/action-review-session.js.map +1 -0
  401. package/node_modules/@specforge/types/dist/mcp/tools/action-work-session.d.ts +133 -0
  402. package/node_modules/@specforge/types/dist/mcp/tools/action-work-session.d.ts.map +1 -0
  403. package/node_modules/@specforge/types/dist/mcp/tools/action-work-session.js +8 -0
  404. package/node_modules/@specforge/types/dist/mcp/tools/action-work-session.js.map +1 -0
  405. package/node_modules/@specforge/types/dist/mcp/tools/complete-planning-session.d.ts +21 -0
  406. package/node_modules/@specforge/types/dist/mcp/tools/complete-planning-session.d.ts.map +1 -0
  407. package/node_modules/@specforge/types/dist/mcp/tools/complete-planning-session.js +5 -0
  408. package/node_modules/@specforge/types/dist/mcp/tools/complete-planning-session.js.map +1 -0
  409. package/node_modules/@specforge/types/dist/mcp/tools/complete-review-session.d.ts +21 -0
  410. package/node_modules/@specforge/types/dist/mcp/tools/complete-review-session.d.ts.map +1 -0
  411. package/node_modules/@specforge/types/dist/mcp/tools/complete-review-session.js +8 -0
  412. package/node_modules/@specforge/types/dist/mcp/tools/complete-review-session.js.map +1 -0
  413. package/node_modules/@specforge/types/dist/mcp/tools/complete-work-session.d.ts +42 -0
  414. package/node_modules/@specforge/types/dist/mcp/tools/complete-work-session.d.ts.map +1 -0
  415. package/node_modules/@specforge/types/dist/mcp/tools/complete-work-session.js +8 -0
  416. package/node_modules/@specforge/types/dist/mcp/tools/complete-work-session.js.map +1 -0
  417. package/node_modules/@specforge/types/dist/mcp/tools/create-specification.d.ts +21 -0
  418. package/node_modules/@specforge/types/dist/mcp/tools/create-specification.d.ts.map +1 -0
  419. package/node_modules/@specforge/types/dist/mcp/tools/create-specification.js +5 -0
  420. package/node_modules/@specforge/types/dist/mcp/tools/create-specification.js.map +1 -0
  421. package/node_modules/@specforge/types/dist/mcp/tools/feedback.d.ts +59 -0
  422. package/node_modules/@specforge/types/dist/mcp/tools/feedback.d.ts.map +1 -0
  423. package/node_modules/@specforge/types/dist/mcp/tools/feedback.js +5 -0
  424. package/node_modules/@specforge/types/dist/mcp/tools/feedback.js.map +1 -0
  425. package/node_modules/@specforge/types/dist/mcp/tools/get-blocked-tickets.d.ts +33 -0
  426. package/node_modules/@specforge/types/dist/mcp/tools/get-blocked-tickets.d.ts.map +1 -0
  427. package/node_modules/@specforge/types/dist/mcp/tools/get-blocked-tickets.js +7 -0
  428. package/node_modules/@specforge/types/dist/mcp/tools/get-blocked-tickets.js.map +1 -0
  429. package/node_modules/@specforge/types/dist/mcp/tools/get-critical-path.d.ts +15 -0
  430. package/node_modules/@specforge/types/dist/mcp/tools/get-critical-path.d.ts.map +1 -0
  431. package/node_modules/@specforge/types/dist/mcp/tools/get-critical-path.js +5 -0
  432. package/node_modules/@specforge/types/dist/mcp/tools/get-critical-path.js.map +1 -0
  433. package/node_modules/@specforge/types/dist/mcp/tools/get-dependency-tree.d.ts +15 -0
  434. package/node_modules/@specforge/types/dist/mcp/tools/get-dependency-tree.d.ts.map +1 -0
  435. package/node_modules/@specforge/types/dist/mcp/tools/get-dependency-tree.js +5 -0
  436. package/node_modules/@specforge/types/dist/mcp/tools/get-dependency-tree.js.map +1 -0
  437. package/node_modules/@specforge/types/dist/mcp/tools/get-next-actionable-tickets.d.ts +28 -0
  438. package/node_modules/@specforge/types/dist/mcp/tools/get-next-actionable-tickets.d.ts.map +1 -0
  439. package/node_modules/@specforge/types/dist/mcp/tools/get-next-actionable-tickets.js +7 -0
  440. package/node_modules/@specforge/types/dist/mcp/tools/get-next-actionable-tickets.js.map +1 -0
  441. package/node_modules/@specforge/types/dist/mcp/tools/get-report.d.ts +44 -0
  442. package/node_modules/@specforge/types/dist/mcp/tools/get-report.d.ts.map +1 -0
  443. package/node_modules/@specforge/types/dist/mcp/tools/get-report.js +8 -0
  444. package/node_modules/@specforge/types/dist/mcp/tools/get-report.js.map +1 -0
  445. package/node_modules/@specforge/types/dist/mcp/tools/get.d.ts +23 -0
  446. package/node_modules/@specforge/types/dist/mcp/tools/get.d.ts.map +1 -0
  447. package/node_modules/@specforge/types/dist/mcp/tools/get.js +7 -0
  448. package/node_modules/@specforge/types/dist/mcp/tools/get.js.map +1 -0
  449. package/node_modules/@specforge/types/dist/mcp/tools/index.d.ts +23 -0
  450. package/node_modules/@specforge/types/dist/mcp/tools/index.d.ts.map +1 -0
  451. package/node_modules/@specforge/types/dist/mcp/tools/index.js +23 -0
  452. package/node_modules/@specforge/types/dist/mcp/tools/index.js.map +1 -0
  453. package/node_modules/@specforge/types/dist/mcp/tools/link-pull-request.d.ts +27 -0
  454. package/node_modules/@specforge/types/dist/mcp/tools/link-pull-request.d.ts.map +1 -0
  455. package/node_modules/@specforge/types/dist/mcp/tools/link-pull-request.js +5 -0
  456. package/node_modules/@specforge/types/dist/mcp/tools/link-pull-request.js.map +1 -0
  457. package/node_modules/@specforge/types/dist/mcp/tools/list.d.ts +23 -0
  458. package/node_modules/@specforge/types/dist/mcp/tools/list.d.ts.map +1 -0
  459. package/node_modules/@specforge/types/dist/mcp/tools/list.js +7 -0
  460. package/node_modules/@specforge/types/dist/mcp/tools/list.js.map +1 -0
  461. package/node_modules/@specforge/types/dist/mcp/tools/reopen-specification.d.ts +14 -0
  462. package/node_modules/@specforge/types/dist/mcp/tools/reopen-specification.d.ts.map +1 -0
  463. package/node_modules/@specforge/types/dist/mcp/tools/reopen-specification.js +7 -0
  464. package/node_modules/@specforge/types/dist/mcp/tools/reopen-specification.js.map +1 -0
  465. package/node_modules/@specforge/types/dist/mcp/tools/reset-work-session.d.ts +35 -0
  466. package/node_modules/@specforge/types/dist/mcp/tools/reset-work-session.d.ts.map +1 -0
  467. package/node_modules/@specforge/types/dist/mcp/tools/reset-work-session.js +5 -0
  468. package/node_modules/@specforge/types/dist/mcp/tools/reset-work-session.js.map +1 -0
  469. package/node_modules/@specforge/types/dist/mcp/tools/search.d.ts +47 -0
  470. package/node_modules/@specforge/types/dist/mcp/tools/search.d.ts.map +1 -0
  471. package/node_modules/@specforge/types/dist/mcp/tools/search.js +7 -0
  472. package/node_modules/@specforge/types/dist/mcp/tools/search.js.map +1 -0
  473. package/node_modules/@specforge/types/dist/mcp/tools/start-planning-session.d.ts +20 -0
  474. package/node_modules/@specforge/types/dist/mcp/tools/start-planning-session.d.ts.map +1 -0
  475. package/node_modules/@specforge/types/dist/mcp/tools/start-planning-session.js +5 -0
  476. package/node_modules/@specforge/types/dist/mcp/tools/start-planning-session.js.map +1 -0
  477. package/node_modules/@specforge/types/dist/mcp/tools/start-review-session.d.ts +17 -0
  478. package/node_modules/@specforge/types/dist/mcp/tools/start-review-session.d.ts.map +1 -0
  479. package/node_modules/@specforge/types/dist/mcp/tools/start-review-session.js +8 -0
  480. package/node_modules/@specforge/types/dist/mcp/tools/start-review-session.js.map +1 -0
  481. package/node_modules/@specforge/types/dist/mcp/tools/start-work-session.d.ts +16 -0
  482. package/node_modules/@specforge/types/dist/mcp/tools/start-work-session.d.ts.map +1 -0
  483. package/node_modules/@specforge/types/dist/mcp/tools/start-work-session.js +7 -0
  484. package/node_modules/@specforge/types/dist/mcp/tools/start-work-session.js.map +1 -0
  485. package/node_modules/@specforge/types/dist/runtime/epic.d.ts +105 -0
  486. package/node_modules/@specforge/types/dist/runtime/epic.d.ts.map +1 -0
  487. package/node_modules/@specforge/types/dist/runtime/epic.js +10 -0
  488. package/node_modules/@specforge/types/dist/runtime/epic.js.map +1 -0
  489. package/node_modules/@specforge/types/dist/runtime/index.d.ts +11 -0
  490. package/node_modules/@specforge/types/dist/runtime/index.d.ts.map +1 -0
  491. package/node_modules/@specforge/types/dist/runtime/index.js +11 -0
  492. package/node_modules/@specforge/types/dist/runtime/index.js.map +1 -0
  493. package/node_modules/@specforge/types/dist/runtime/project.d.ts +22 -0
  494. package/node_modules/@specforge/types/dist/runtime/project.d.ts.map +1 -0
  495. package/node_modules/@specforge/types/dist/runtime/project.js +9 -0
  496. package/node_modules/@specforge/types/dist/runtime/project.js.map +1 -0
  497. package/node_modules/@specforge/types/dist/runtime/specification.d.ts +111 -0
  498. package/node_modules/@specforge/types/dist/runtime/specification.d.ts.map +1 -0
  499. package/node_modules/@specforge/types/dist/runtime/specification.js +10 -0
  500. package/node_modules/@specforge/types/dist/runtime/specification.js.map +1 -0
  501. package/node_modules/@specforge/types/dist/runtime/ticket.d.ts +80 -0
  502. package/node_modules/@specforge/types/dist/runtime/ticket.d.ts.map +1 -0
  503. package/node_modules/@specforge/types/dist/runtime/ticket.js +12 -0
  504. package/node_modules/@specforge/types/dist/runtime/ticket.js.map +1 -0
  505. package/node_modules/@specforge/types/dist/schema/blueprint.d.ts +18 -0
  506. package/node_modules/@specforge/types/dist/schema/blueprint.d.ts.map +1 -0
  507. package/node_modules/@specforge/types/dist/schema/blueprint.js +3 -0
  508. package/node_modules/@specforge/types/dist/schema/blueprint.js.map +1 -0
  509. package/node_modules/@specforge/types/dist/schema/epic.d.ts +28 -0
  510. package/node_modules/@specforge/types/dist/schema/epic.d.ts.map +1 -0
  511. package/node_modules/@specforge/types/dist/schema/epic.js +3 -0
  512. package/node_modules/@specforge/types/dist/schema/epic.js.map +1 -0
  513. package/node_modules/@specforge/types/dist/schema/extensions/epic.extensions.d.ts +2 -0
  514. package/node_modules/@specforge/types/dist/schema/extensions/epic.extensions.d.ts.map +1 -0
  515. package/node_modules/@specforge/types/dist/schema/extensions/epic.extensions.js +4 -0
  516. package/node_modules/@specforge/types/dist/schema/extensions/epic.extensions.js.map +1 -0
  517. package/node_modules/@specforge/types/dist/schema/extensions/specification.extensions.d.ts +6 -0
  518. package/node_modules/@specforge/types/dist/schema/extensions/specification.extensions.d.ts.map +1 -0
  519. package/node_modules/@specforge/types/dist/schema/extensions/specification.extensions.js +3 -0
  520. package/node_modules/@specforge/types/dist/schema/extensions/specification.extensions.js.map +1 -0
  521. package/node_modules/@specforge/types/dist/schema/extensions/ticket.extensions.d.ts +6 -0
  522. package/node_modules/@specforge/types/dist/schema/extensions/ticket.extensions.d.ts.map +1 -0
  523. package/node_modules/@specforge/types/dist/schema/extensions/ticket.extensions.js +3 -0
  524. package/node_modules/@specforge/types/dist/schema/extensions/ticket.extensions.js.map +1 -0
  525. package/node_modules/@specforge/types/dist/schema/index.d.ts +7 -0
  526. package/node_modules/@specforge/types/dist/schema/index.d.ts.map +1 -0
  527. package/node_modules/@specforge/types/dist/schema/index.js +7 -0
  528. package/node_modules/@specforge/types/dist/schema/index.js.map +1 -0
  529. package/node_modules/@specforge/types/dist/schema/patterns.d.ts +6 -0
  530. package/node_modules/@specforge/types/dist/schema/patterns.d.ts.map +1 -0
  531. package/node_modules/@specforge/types/dist/schema/patterns.js +3 -0
  532. package/node_modules/@specforge/types/dist/schema/patterns.js.map +1 -0
  533. package/node_modules/@specforge/types/dist/schema/project.d.ts +7 -0
  534. package/node_modules/@specforge/types/dist/schema/project.d.ts.map +1 -0
  535. package/node_modules/@specforge/types/dist/schema/project.js +3 -0
  536. package/node_modules/@specforge/types/dist/schema/project.js.map +1 -0
  537. package/node_modules/@specforge/types/dist/schema/specification.d.ts +35 -0
  538. package/node_modules/@specforge/types/dist/schema/specification.d.ts.map +1 -0
  539. package/node_modules/@specforge/types/dist/schema/specification.js +3 -0
  540. package/node_modules/@specforge/types/dist/schema/specification.js.map +1 -0
  541. package/node_modules/@specforge/types/dist/schema/ticket.d.ts +69 -0
  542. package/node_modules/@specforge/types/dist/schema/ticket.d.ts.map +1 -0
  543. package/node_modules/@specforge/types/dist/schema/ticket.js +3 -0
  544. package/node_modules/@specforge/types/dist/schema/ticket.js.map +1 -0
  545. package/node_modules/@specforge/types/package.json +69 -0
  546. package/package.json +76 -0
  547. package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +165 -0
  548. package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +348 -0
  549. package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +259 -0
  550. package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +132 -0
  551. package/src/cli/templates/agents/index.ts +47 -0
  552. package/src/cli/templates/commands.ts +90 -0
  553. package/src/cli/templates/content/sf-blockers.ts +71 -0
  554. package/src/cli/templates/content/sf-commit.ts +81 -0
  555. package/src/cli/templates/content/sf-context.ts +65 -0
  556. package/src/cli/templates/content/sf-help.ts +44 -0
  557. package/src/cli/templates/content/sf-init.ts +64 -0
  558. package/src/cli/templates/content/sf-reset.ts +69 -0
  559. package/src/cli/templates/content/sf-search.ts +65 -0
  560. package/src/cli/templates/content/sf-status.ts +64 -0
  561. package/src/cli/templates/index.ts +16 -0
  562. package/src/cli/templates/skills/specforge-conventions.md +114 -0
  563. package/src/cli/templates/skills/specforge-orchestrator.md +409 -0
  564. package/src/cli/templates/skills/specforge-validator.md +128 -0
  565. package/src/cli/templates/skills/specforge-worker.md +412 -0
@@ -0,0 +1,728 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { COMMAND_CATEGORIES } from "./types.js";
4
+ import { AGENT_CATEGORIES } from "./agent-types.js";
5
+ import {
6
+ TARGETS,
7
+ isValidTarget,
8
+ resolveTargetAlias,
9
+ getSupportedTargets,
10
+ getTargetPath,
11
+ getAgentPath,
12
+ getSkillPath,
13
+ getAgentSupportedTargets
14
+ } from "./targets.js";
15
+ import {
16
+ scaffoldMultiCli
17
+ } from "./files.js";
18
+ import { loadGlobalConfig } from "../../config/index.js";
19
+ import { getCommandTemplates } from "../../templates/commands.js";
20
+ import { getAgentTemplates } from "../../templates/agents/index.js";
21
+ import {
22
+ detectInstalledTools,
23
+ generateCommandContent,
24
+ generateAgentContent,
25
+ ensureDirectory,
26
+ writeFile,
27
+ getCommandFilename,
28
+ getAgentFilename,
29
+ compareFiles,
30
+ generateDiff
31
+ } from "./utils.js";
32
+ import {
33
+ displayCommandList,
34
+ displayAgentList,
35
+ displayScaffoldHeader,
36
+ displayAgentScaffoldHeader,
37
+ displayFileOperation,
38
+ displayScaffoldSummary,
39
+ displayAgentScaffoldSummary,
40
+ displayTargetError,
41
+ displayAgentTargetError,
42
+ displayDiff,
43
+ displayCommandPreview,
44
+ displayAgentPreview
45
+ } from "./display.js";
46
+ import { colors } from "../../ui/colors.js";
47
+ async function selectTarget(mode = "command") {
48
+ const installed = detectInstalledTools();
49
+ const inquirer = await import("inquirer");
50
+ const availableTargets = Object.entries(TARGETS).filter(([_, config]) => {
51
+ if (mode === "agent") return config.supportsAgents;
52
+ if (mode === "skill") return config.supportsSkills;
53
+ return true;
54
+ });
55
+ const choices = availableTargets.map(([key, config]) => ({
56
+ name: `${config.name}${installed.includes(key) ? colors.success(" (detected)") : ""}`,
57
+ value: key
58
+ }));
59
+ const { target } = await inquirer.default.prompt([
60
+ {
61
+ type: "list",
62
+ name: "target",
63
+ message: mode === "agent" ? "Select target AI CLI tool (agent support):" : mode === "skill" ? "Select target AI CLI tool (skill support):" : "Select target AI CLI tool:",
64
+ choices
65
+ }
66
+ ]);
67
+ return target;
68
+ }
69
+ async function interactivePreview(target) {
70
+ const inquirer = await import("inquirer");
71
+ const templates = getCommandTemplates();
72
+ const config = TARGETS[target];
73
+ const choices = [];
74
+ for (const [category, commandNames] of Object.entries(COMMAND_CATEGORIES)) {
75
+ choices.push(new inquirer.default.Separator(`\u2500\u2500 ${category} \u2500\u2500`));
76
+ for (const name of commandNames) {
77
+ const template = templates.find((t) => t.name === name);
78
+ if (template) {
79
+ choices.push({
80
+ name: `${name.padEnd(25)} ${colors.dim(template.description)}`,
81
+ value: name
82
+ });
83
+ }
84
+ }
85
+ }
86
+ let continuePreview = true;
87
+ while (continuePreview) {
88
+ const { command } = await inquirer.default.prompt([{
89
+ type: "list",
90
+ name: "command",
91
+ message: "Select command to preview (Ctrl+C to exit):",
92
+ choices: [
93
+ ...choices,
94
+ new inquirer.default.Separator(),
95
+ { name: "Exit", value: null }
96
+ ],
97
+ pageSize: 20
98
+ }]);
99
+ if (!command) {
100
+ continuePreview = false;
101
+ } else {
102
+ const template = templates.find((t) => t.name === command);
103
+ if (template) {
104
+ console.clear();
105
+ const content = generateCommandContent(template, config.needsFrontmatter, target);
106
+ displayCommandPreview(template.name, content);
107
+ await inquirer.default.prompt([{
108
+ type: "input",
109
+ name: "continue",
110
+ message: "Press Enter to continue..."
111
+ }]);
112
+ console.clear();
113
+ }
114
+ }
115
+ }
116
+ }
117
+ async function interactiveAgentPreview(target) {
118
+ const inquirer = await import("inquirer");
119
+ const templates = getAgentTemplates();
120
+ const config = TARGETS[target];
121
+ const choices = [];
122
+ for (const [category, agentNames] of Object.entries(AGENT_CATEGORIES)) {
123
+ choices.push(new inquirer.default.Separator(`\u2500\u2500 ${category} \u2500\u2500`));
124
+ for (const name of agentNames) {
125
+ const template = templates.find((t) => t.name === name);
126
+ if (template) {
127
+ choices.push({
128
+ name: `${name.padEnd(25)} ${colors.dim(`[${template.model}]`)} ${colors.dim(template.description)}`,
129
+ value: name
130
+ });
131
+ }
132
+ }
133
+ }
134
+ let continuePreview = true;
135
+ while (continuePreview) {
136
+ const { agent } = await inquirer.default.prompt([{
137
+ type: "list",
138
+ name: "agent",
139
+ message: "Select agent to preview (Ctrl+C to exit):",
140
+ choices: [
141
+ ...choices,
142
+ new inquirer.default.Separator(),
143
+ { name: "Exit", value: null }
144
+ ],
145
+ pageSize: 20
146
+ }]);
147
+ if (!agent) {
148
+ continuePreview = false;
149
+ } else {
150
+ const template = templates.find((t) => t.name === agent);
151
+ if (template) {
152
+ console.clear();
153
+ const content = generateAgentContent(template, config.agentFrontmatter, target);
154
+ displayAgentPreview(template.name, content, template.model);
155
+ await inquirer.default.prompt([{
156
+ type: "input",
157
+ name: "continue",
158
+ message: "Press Enter to continue..."
159
+ }]);
160
+ console.clear();
161
+ }
162
+ }
163
+ }
164
+ }
165
+ async function interactiveDiff(target) {
166
+ const inquirer = await import("inquirer");
167
+ const templates = getCommandTemplates();
168
+ const config = TARGETS[target];
169
+ const targetPath = getTargetPath(target, false);
170
+ const outdated = [];
171
+ for (const template of templates) {
172
+ const filename = getCommandFilename(template.name, config.fileExtension);
173
+ const filepath = path.join(targetPath, filename);
174
+ const content = generateCommandContent(template, config.needsFrontmatter, target);
175
+ const comparison = compareFiles(filepath, content);
176
+ if (comparison.status === "outdated") {
177
+ outdated.push({ name: template.name, template, kept: false });
178
+ }
179
+ }
180
+ if (outdated.length === 0) {
181
+ console.log(colors.success("\nAll commands are up to date!"));
182
+ return;
183
+ }
184
+ const buildChoices = () => outdated.map(({ name, template, kept }) => ({
185
+ name: `${kept ? colors.dim("\u25CB") : "\u26A0"} ${name.padEnd(23)} ${kept ? colors.dim("(keeping current)") : colors.dim(template.description)}`,
186
+ value: name
187
+ }));
188
+ let continueDiff = true;
189
+ while (continueDiff) {
190
+ const keptCount = outdated.filter((o) => o.kept).length;
191
+ const updateCount = outdated.length - keptCount;
192
+ const choices = buildChoices();
193
+ const { command } = await inquirer.default.prompt([{
194
+ type: "list",
195
+ name: "command",
196
+ message: `Select command to view diff (${updateCount} to update, ${keptCount} keeping):`,
197
+ choices: [
198
+ ...choices,
199
+ new inquirer.default.Separator(),
200
+ { name: "Apply changes & Exit", value: "apply" },
201
+ { name: "Exit without changes", value: null }
202
+ ],
203
+ pageSize: 15
204
+ }]);
205
+ if (!command) {
206
+ continueDiff = false;
207
+ } else if (command === "apply") {
208
+ const toUpdate = outdated.filter((o) => !o.kept);
209
+ if (toUpdate.length === 0) {
210
+ console.log(colors.dim("\nNo commands to update (all marked as keep)"));
211
+ } else {
212
+ console.log();
213
+ for (const item of toUpdate) {
214
+ const filename = getCommandFilename(item.name, config.fileExtension);
215
+ const filepath = path.join(targetPath, filename);
216
+ const content = generateCommandContent(item.template, config.needsFrontmatter, target);
217
+ writeFile(filepath, content);
218
+ console.log(colors.success(` \u2713 Updated ${filename}`));
219
+ }
220
+ console.log(colors.success(`
221
+ Updated ${toUpdate.length} commands`));
222
+ }
223
+ if (keptCount > 0) {
224
+ console.log(colors.dim(`Kept ${keptCount} commands unchanged`));
225
+ }
226
+ continueDiff = false;
227
+ } else {
228
+ console.clear();
229
+ const item = outdated.find((o) => o.name === command);
230
+ if (item) {
231
+ const filename = getCommandFilename(item.name, config.fileExtension);
232
+ const filepath = path.join(targetPath, filename);
233
+ const content = generateCommandContent(item.template, config.needsFrontmatter, target);
234
+ const comparison = compareFiles(filepath, content);
235
+ console.log(colors.bold(`
236
+ Diff: ${item.name}`));
237
+ console.log("\u2500".repeat(50));
238
+ if (comparison.existingContent) {
239
+ displayDiff(generateDiff(comparison.existingContent, content, filename));
240
+ }
241
+ const { action } = await inquirer.default.prompt([{
242
+ type: "list",
243
+ name: "action",
244
+ message: "What do you want to do?",
245
+ choices: [
246
+ { name: item.kept ? "Mark for update" : "Keep current version (skip update)", value: "toggle" },
247
+ { name: "Back to list", value: "back" }
248
+ ]
249
+ }]);
250
+ if (action === "toggle") {
251
+ item.kept = !item.kept;
252
+ }
253
+ console.clear();
254
+ }
255
+ }
256
+ }
257
+ }
258
+ async function interactiveAgentDiff(target) {
259
+ const inquirer = await import("inquirer");
260
+ const templates = getAgentTemplates();
261
+ const config = TARGETS[target];
262
+ const targetPath = getAgentPath(target, false);
263
+ const outdated = [];
264
+ for (const template of templates) {
265
+ const filename = getAgentFilename(template.name, target);
266
+ const filepath = path.join(targetPath, filename);
267
+ const content = generateAgentContent(template, config.agentFrontmatter, target);
268
+ const comparison = compareFiles(filepath, content);
269
+ if (comparison.status === "outdated") {
270
+ outdated.push({ name: template.name, template, kept: false });
271
+ }
272
+ }
273
+ if (outdated.length === 0) {
274
+ console.log(colors.success("\nAll agents are up to date!"));
275
+ return;
276
+ }
277
+ const buildChoices = () => outdated.map(({ name, template, kept }) => ({
278
+ name: `${kept ? colors.dim("\u25CB") : "\u26A0"} ${name.padEnd(23)} ${kept ? colors.dim("(keeping current)") : colors.dim(template.description)}`,
279
+ value: name
280
+ }));
281
+ let continueDiff = true;
282
+ while (continueDiff) {
283
+ const keptCount = outdated.filter((o) => o.kept).length;
284
+ const updateCount = outdated.length - keptCount;
285
+ const choices = buildChoices();
286
+ const { agent } = await inquirer.default.prompt([{
287
+ type: "list",
288
+ name: "agent",
289
+ message: `Select agent to view diff (${updateCount} to update, ${keptCount} keeping):`,
290
+ choices: [
291
+ ...choices,
292
+ new inquirer.default.Separator(),
293
+ { name: "Apply changes & Exit", value: "apply" },
294
+ { name: "Exit without changes", value: null }
295
+ ],
296
+ pageSize: 15
297
+ }]);
298
+ if (!agent) {
299
+ continueDiff = false;
300
+ } else if (agent === "apply") {
301
+ const toUpdate = outdated.filter((o) => !o.kept);
302
+ if (toUpdate.length === 0) {
303
+ console.log(colors.dim("\nNo agents to update (all marked as keep)"));
304
+ } else {
305
+ console.log();
306
+ for (const item of toUpdate) {
307
+ const filename = getAgentFilename(item.name, target);
308
+ const filepath = path.join(targetPath, filename);
309
+ const content = generateAgentContent(item.template, config.agentFrontmatter, target);
310
+ writeFile(filepath, content);
311
+ console.log(colors.success(` \u2713 Updated ${filename}`));
312
+ }
313
+ console.log(colors.success(`
314
+ Updated ${toUpdate.length} agents`));
315
+ }
316
+ if (keptCount > 0) {
317
+ console.log(colors.dim(`Kept ${keptCount} agents unchanged`));
318
+ }
319
+ continueDiff = false;
320
+ } else {
321
+ console.clear();
322
+ const item = outdated.find((o) => o.name === agent);
323
+ if (item) {
324
+ const filename = getAgentFilename(item.name, target);
325
+ const filepath = path.join(targetPath, filename);
326
+ const content = generateAgentContent(item.template, config.agentFrontmatter, target);
327
+ const comparison = compareFiles(filepath, content);
328
+ console.log(colors.bold(`
329
+ Diff: ${item.name}`));
330
+ console.log("\u2500".repeat(50));
331
+ if (comparison.existingContent) {
332
+ displayDiff(generateDiff(comparison.existingContent, content, filename));
333
+ }
334
+ const { action } = await inquirer.default.prompt([{
335
+ type: "list",
336
+ name: "action",
337
+ message: "What do you want to do?",
338
+ choices: [
339
+ { name: item.kept ? "Mark for update" : "Keep current version (skip update)", value: "toggle" },
340
+ { name: "Back to list", value: "back" }
341
+ ]
342
+ }]);
343
+ if (action === "toggle") {
344
+ item.kept = !item.kept;
345
+ }
346
+ console.clear();
347
+ }
348
+ }
349
+ }
350
+ }
351
+ async function scaffoldCommands(target, options) {
352
+ const config = TARGETS[target];
353
+ if (!config.supportsCommands) {
354
+ console.log(colors.warning(`
355
+ ${config.name} does not support slash commands.`));
356
+ console.log(colors.dim("Commands will be generated as skills instead.\n"));
357
+ await scaffoldSkills(target, options);
358
+ return;
359
+ }
360
+ const isProject = options.project === true;
361
+ const targetPath = getTargetPath(target, isProject);
362
+ const templates = getCommandTemplates();
363
+ displayScaffoldHeader(target, targetPath, options.dryRun === true);
364
+ if (!options.dryRun) {
365
+ ensureDirectory(targetPath);
366
+ }
367
+ const result = {
368
+ created: 0,
369
+ updated: 0,
370
+ skipped: 0,
371
+ outdated: 0,
372
+ targetPath
373
+ };
374
+ for (const template of templates) {
375
+ const filename = getCommandFilename(template.name, config.commandExtension);
376
+ const filepath = path.join(targetPath, filename);
377
+ const content = generateCommandContent(
378
+ template,
379
+ config.commandFrontmatter,
380
+ target
381
+ );
382
+ const comparison = compareFiles(filepath, content);
383
+ displayFileOperation(filename, comparison.status, options.dryRun === true, options.update === true);
384
+ if (options.diff && comparison.status === "outdated" && comparison.existingContent) {
385
+ const diff = generateDiff(comparison.existingContent, content, filename);
386
+ displayDiff(diff);
387
+ }
388
+ switch (comparison.status) {
389
+ case "new":
390
+ if (!options.dryRun) {
391
+ writeFile(filepath, content);
392
+ }
393
+ result.created++;
394
+ break;
395
+ case "identical":
396
+ result.skipped++;
397
+ break;
398
+ case "outdated":
399
+ if (options.update) {
400
+ if (!options.dryRun) {
401
+ writeFile(filepath, content);
402
+ }
403
+ result.updated++;
404
+ } else {
405
+ result.outdated++;
406
+ }
407
+ break;
408
+ }
409
+ }
410
+ displayScaffoldSummary(result, target, options.dryRun === true);
411
+ }
412
+ async function scaffoldSkills(target, options) {
413
+ const config = TARGETS[target];
414
+ if (!config.supportsSkills) {
415
+ console.error(colors.error(`
416
+ ${config.name} does not support skills.`));
417
+ return;
418
+ }
419
+ const isProject = options.project === true;
420
+ const targetPath = getSkillPath(target, isProject);
421
+ console.log(colors.bold(`
422
+ Scaffolding SpecForge skills for ${config.name}`));
423
+ console.log(`Target: ${colors.primary(targetPath)}
424
+ `);
425
+ if (options.dryRun) {
426
+ console.log(colors.warning("DRY RUN - No files will be written\n"));
427
+ }
428
+ const skillName = "specforge-conventions";
429
+ const skillDir = path.join(targetPath, skillName);
430
+ const skillFile = path.join(skillDir, "SKILL.md");
431
+ const { fileURLToPath } = await import("url");
432
+ const __filename = fileURLToPath(import.meta.url);
433
+ const __dirname = path.dirname(__filename);
434
+ const packageRoot = path.resolve(__dirname, "..", "..", "..");
435
+ const templatePath = path.join(packageRoot, "src", "cli", "templates", "skills", "specforge-conventions.md");
436
+ if (!fs.existsSync(templatePath)) {
437
+ console.log(colors.warning("Skill template not found. Skipping."));
438
+ return;
439
+ }
440
+ const templateContent = fs.readFileSync(templatePath, "utf-8");
441
+ const comparison = compareFiles(skillFile, templateContent);
442
+ displayFileOperation(`${skillName}/SKILL.md`, comparison.status, options.dryRun === true, options.update === true);
443
+ if (!options.dryRun) {
444
+ if (comparison.status === "new" || comparison.status === "outdated" && options.update) {
445
+ ensureDirectory(skillDir);
446
+ writeFile(skillFile, templateContent);
447
+ }
448
+ }
449
+ const created = comparison.status === "new" ? 1 : 0;
450
+ const updated = comparison.status === "outdated" && options.update ? 1 : 0;
451
+ const skipped = comparison.status === "identical" ? 1 : 0;
452
+ const outdated = comparison.status === "outdated" && !options.update ? 1 : 0;
453
+ console.log();
454
+ if (created > 0) console.log(colors.success(`\u2713 Created ${created} skill(s)`));
455
+ if (updated > 0) console.log(colors.secondary(`\u2713 Updated ${updated} skill(s)`));
456
+ if (skipped > 0) console.log(colors.dim(`\u25CB Skipped ${skipped} up-to-date skill(s)`));
457
+ if (outdated > 0) console.log(colors.warning(`\u26A0 ${outdated} outdated skill(s) (run with --update to update)`));
458
+ console.log();
459
+ }
460
+ async function scaffoldAgents(target, options) {
461
+ const config = TARGETS[target];
462
+ if (target === "codex") {
463
+ console.log(colors.warning("\nCodex CLI uses TOML agent roles, not markdown agent files."));
464
+ console.log(colors.dim("Agent scaffolding is not available for Codex. Configure roles in .codex/config.toml instead.\n"));
465
+ return;
466
+ }
467
+ const isProject = options.project === true;
468
+ const targetPath = getAgentPath(target, isProject);
469
+ let templates = getAgentTemplates();
470
+ if (options.category) {
471
+ const categoryLower = options.category.toLowerCase();
472
+ templates = templates.filter((t) => t.category.toLowerCase() === categoryLower);
473
+ if (templates.length === 0) {
474
+ console.error(colors.error(`
475
+ No agents found in category "${options.category}"`));
476
+ console.error(colors.dim(`Available categories: Orchestration, SpecForge, Research`));
477
+ process.exit(1);
478
+ return;
479
+ }
480
+ }
481
+ displayAgentScaffoldHeader(target, targetPath, options.dryRun === true);
482
+ if (target === "gemini") {
483
+ console.log(colors.warning("Note: Gemini CLI agents require experimental.enableAgents: true in .gemini/settings.json\n"));
484
+ }
485
+ if (!options.dryRun) {
486
+ ensureDirectory(targetPath);
487
+ }
488
+ const result = {
489
+ created: 0,
490
+ updated: 0,
491
+ skipped: 0,
492
+ outdated: 0,
493
+ targetPath
494
+ };
495
+ for (const template of templates) {
496
+ const filename = getAgentFilename(template.name, target);
497
+ const filepath = path.join(targetPath, filename);
498
+ const content = generateAgentContent(template, config.agentFrontmatter, target);
499
+ const comparison = compareFiles(filepath, content);
500
+ displayFileOperation(filename, comparison.status, options.dryRun === true, options.update === true);
501
+ if (options.diff && comparison.status === "outdated" && comparison.existingContent) {
502
+ const diff = generateDiff(comparison.existingContent, content, filename);
503
+ displayDiff(diff);
504
+ }
505
+ switch (comparison.status) {
506
+ case "new":
507
+ if (!options.dryRun) {
508
+ writeFile(filepath, content);
509
+ }
510
+ result.created++;
511
+ break;
512
+ case "identical":
513
+ result.skipped++;
514
+ break;
515
+ case "outdated":
516
+ if (options.update) {
517
+ if (!options.dryRun) {
518
+ writeFile(filepath, content);
519
+ }
520
+ result.updated++;
521
+ } else {
522
+ result.outdated++;
523
+ }
524
+ break;
525
+ }
526
+ if (target === "claude" && isProject && template.memory === "project" && !options.dryRun) {
527
+ const claudeDir = path.dirname(targetPath);
528
+ const agentMemoryDir = path.join(claudeDir, "agent-memory", template.name);
529
+ ensureDirectory(agentMemoryDir);
530
+ }
531
+ }
532
+ displayAgentScaffoldSummary(result, target, options.dryRun === true);
533
+ }
534
+ function renderWriteResult(w) {
535
+ const action = w.action;
536
+ switch (action) {
537
+ case "created":
538
+ console.log(colors.success(` + ${w.relPath} (created)`));
539
+ break;
540
+ case "overwrote":
541
+ console.log(colors.secondary(` \u21BB ${w.relPath} (overwrote)`));
542
+ break;
543
+ case "skipped":
544
+ console.log(colors.dim(` \u25CB ${w.relPath} (exists, skip \u2014 use --force)`));
545
+ break;
546
+ case "would-create":
547
+ console.log(colors.success(` + ${w.relPath} (would create)`));
548
+ break;
549
+ case "would-overwrite":
550
+ console.log(colors.secondary(` \u21BB ${w.relPath} (would overwrite)`));
551
+ break;
552
+ case "would-skip":
553
+ console.log(colors.dim(` \u25CB ${w.relPath} (exists, skip \u2014 use --force)`));
554
+ break;
555
+ }
556
+ }
557
+ function runMultiCli(label, subset, targets, options) {
558
+ const apiKey = loadGlobalConfig().apiKey;
559
+ const { detected, writes } = scaffoldMultiCli({
560
+ targets,
561
+ dryRun: options.dryRun === true,
562
+ force: options.force === true,
563
+ apiKey,
564
+ skipConfigs: !subset.configs,
565
+ skipInstructions: !subset.instructions,
566
+ skipSkills: !subset.skills
567
+ });
568
+ console.log(colors.bold(`
569
+ Scaffolding SpecForge ${label}`));
570
+ if (detected.length > 0) {
571
+ console.log(colors.dim(`Detected: ${detected.map((t) => TARGETS[t].name).join(", ")}`));
572
+ }
573
+ if (options.dryRun) {
574
+ console.log(colors.warning("\nDRY RUN \u2014 no files will be written"));
575
+ }
576
+ console.log();
577
+ for (const w of writes) {
578
+ renderWriteResult(w);
579
+ }
580
+ console.log();
581
+ return writes;
582
+ }
583
+ async function scaffoldCommand(options) {
584
+ if (options.target) {
585
+ options.target = resolveTargetAlias(options.target);
586
+ }
587
+ const isAgentMode = options.agents === true;
588
+ const isSkillMode = options.skills === true;
589
+ const isCommandMode = options.commands === true;
590
+ const isConfigsMode = options.configs === true;
591
+ const isInstructionsMode = options.instructions === true;
592
+ const anySubset = isAgentMode || isSkillMode || isCommandMode || isConfigsMode || isInstructionsMode;
593
+ const mode = isAgentMode ? "agent" : isSkillMode ? "skill" : "command";
594
+ if (options.list) {
595
+ if (isAgentMode) {
596
+ const templates = getAgentTemplates();
597
+ displayAgentList(templates, options.category);
598
+ } else {
599
+ const templates = getCommandTemplates();
600
+ displayCommandList(templates);
601
+ }
602
+ return;
603
+ }
604
+ if (typeof options.preview === "string") {
605
+ if (isAgentMode) {
606
+ const templates = getAgentTemplates();
607
+ const template = templates.find((t) => t.name === options.preview);
608
+ if (!template) {
609
+ console.error(colors.error(`
610
+ Error: Unknown agent "${options.preview}"`));
611
+ console.error(`Run 'specforge scaffold --agents --list' to see available agents`);
612
+ process.exit(1);
613
+ return;
614
+ }
615
+ const content = generateAgentContent(template, true);
616
+ displayAgentPreview(template.name, content, template.model);
617
+ } else {
618
+ const templates = getCommandTemplates();
619
+ const template = templates.find((t) => t.name === options.preview);
620
+ if (!template) {
621
+ console.error(colors.error(`
622
+ Error: Unknown command "${options.preview}"`));
623
+ console.error(`Run 'specforge scaffold --list' to see available commands`);
624
+ process.exit(1);
625
+ return;
626
+ }
627
+ const content = generateCommandContent(template, true, "claude");
628
+ displayCommandPreview(template.name, content);
629
+ }
630
+ return;
631
+ }
632
+ if (options.preview === true) {
633
+ let target2;
634
+ if (options.target && isValidTarget(options.target)) {
635
+ target2 = options.target;
636
+ } else {
637
+ target2 = await selectTarget(mode);
638
+ }
639
+ if (isAgentMode && !TARGETS[target2].supportsAgents) {
640
+ displayAgentTargetError(target2, getAgentSupportedTargets());
641
+ process.exit(1);
642
+ return;
643
+ }
644
+ if (isAgentMode) {
645
+ await interactiveAgentPreview(target2);
646
+ } else {
647
+ await interactivePreview(target2);
648
+ }
649
+ return;
650
+ }
651
+ if (options.diff && !options.update) {
652
+ let target2;
653
+ if (options.target && isValidTarget(options.target)) {
654
+ target2 = options.target;
655
+ } else {
656
+ target2 = await selectTarget(mode);
657
+ }
658
+ if (isAgentMode && !TARGETS[target2].supportsAgents) {
659
+ displayAgentTargetError(target2, getAgentSupportedTargets());
660
+ process.exit(1);
661
+ return;
662
+ }
663
+ if (isAgentMode) {
664
+ await interactiveAgentDiff(target2);
665
+ } else {
666
+ await interactiveDiff(target2);
667
+ }
668
+ return;
669
+ }
670
+ let scopedTargets;
671
+ if (options.target) {
672
+ if (!isValidTarget(options.target)) {
673
+ displayTargetError(options.target, getSupportedTargets());
674
+ process.exit(1);
675
+ return;
676
+ }
677
+ scopedTargets = [options.target];
678
+ }
679
+ if (isConfigsMode && !isInstructionsMode && !isSkillMode && !isCommandMode && !isAgentMode) {
680
+ runMultiCli("MCP configs", { configs: true, instructions: false, skills: false }, scopedTargets, options);
681
+ return;
682
+ }
683
+ if (isInstructionsMode && !isConfigsMode && !isSkillMode && !isCommandMode && !isAgentMode) {
684
+ runMultiCli("instruction files", { configs: false, instructions: true, skills: false }, scopedTargets, options);
685
+ return;
686
+ }
687
+ if (!anySubset) {
688
+ const writes = runMultiCli(
689
+ "integration artifacts",
690
+ { configs: true, instructions: true, skills: true },
691
+ scopedTargets,
692
+ options
693
+ );
694
+ const targetSet = scopedTargets ?? detectInstalledTools();
695
+ for (const t of targetSet) {
696
+ if (TARGETS[t].supportsCommands) {
697
+ await scaffoldCommands(t, options);
698
+ }
699
+ if (TARGETS[t].supportsAgents && t !== "codex") {
700
+ await scaffoldAgents(t, options);
701
+ }
702
+ }
703
+ void writes;
704
+ return;
705
+ }
706
+ let target;
707
+ if (options.target) {
708
+ target = options.target;
709
+ } else {
710
+ target = await selectTarget(mode);
711
+ }
712
+ if (isAgentMode && !TARGETS[target].supportsAgents && target !== "codex") {
713
+ displayAgentTargetError(target, getAgentSupportedTargets());
714
+ process.exit(1);
715
+ return;
716
+ }
717
+ if (isAgentMode) {
718
+ await scaffoldAgents(target, options);
719
+ } else if (isSkillMode) {
720
+ await scaffoldSkills(target, options);
721
+ } else {
722
+ await scaffoldCommands(target, options);
723
+ }
724
+ }
725
+ export {
726
+ scaffoldCommand
727
+ };
728
+ //# sourceMappingURL=scaffold.js.map