@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
package/README.md ADDED
@@ -0,0 +1,781 @@
1
+ # @specforge/mcp
2
+
3
+ MCP (Model Context Protocol) server for SpecForge - enables AI agents to interact with your projects, specifications, epics, and tickets.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @specforge/mcp
9
+ ```
10
+
11
+ Or install locally:
12
+
13
+ ```bash
14
+ npm install @specforge/mcp
15
+ ```
16
+
17
+ ## Getting Your API Key
18
+
19
+ 1. Log in to the SpecForge webapp
20
+ 2. Navigate to **Settings > API Keys**
21
+ 3. Click **Create New API Key**
22
+ 4. Select the permissions you need (read, write, or both)
23
+ 5. Copy the key immediately - it's only shown once!
24
+
25
+ API keys have the format: `sf_live_xxxxxxxxxxxxxxxxxxxxxx`
26
+
27
+ ## Environment Variables
28
+
29
+ | Variable | Required | Description |
30
+ |----------|----------|-------------|
31
+ | `SPECFORGE_API_KEY` | Yes | Your API key from the webapp |
32
+ | `SPECFORGE_API_URL` | Yes | The MCP API Gateway URL from your deployment |
33
+ | `SPECFORGE_DEBUG` | No | Set to `true` to enable debug logging |
34
+
35
+ ## AI Client Configuration
36
+
37
+ ### Claude Desktop
38
+
39
+ Add to `~/.config/claude/claude_desktop_config.json` (Linux/macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
40
+
41
+ ```json
42
+ {
43
+ "mcpServers": {
44
+ "specforge": {
45
+ "command": "specforge",
46
+ "env": {
47
+ "SPECFORGE_API_KEY": "sf_live_your_api_key_here",
48
+ "SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
49
+ }
50
+ }
51
+ }
52
+ }
53
+ ```
54
+
55
+ ### Claude Code (CLI)
56
+
57
+ Add to `~/.claude/settings.json`:
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "specforge": {
63
+ "command": "specforge",
64
+ "env": {
65
+ "SPECFORGE_API_KEY": "sf_live_your_api_key_here",
66
+ "SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
67
+ }
68
+ }
69
+ }
70
+ }
71
+ ```
72
+
73
+ Or set environment variables in your shell and run:
74
+
75
+ ```bash
76
+ export SPECFORGE_API_KEY="sf_live_your_api_key_here"
77
+ export SPECFORGE_API_URL="https://your-api-gateway-url.amazonaws.com/prod"
78
+ specforge
79
+ ```
80
+
81
+ ### Cursor
82
+
83
+ Add to your Cursor MCP configuration:
84
+
85
+ ```json
86
+ {
87
+ "mcpServers": {
88
+ "specforge": {
89
+ "command": "npx",
90
+ "args": ["-y", "@specforge/mcp"],
91
+ "env": {
92
+ "SPECFORGE_API_KEY": "sf_live_your_api_key_here",
93
+ "SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
94
+ }
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ ### GitHub Copilot VS Code Extension
101
+
102
+ Add to your VS Code `settings.json`:
103
+
104
+ ```json
105
+ {
106
+ "github.copilot.advanced": {
107
+ "mcp": {
108
+ "servers": {
109
+ "specforge": {
110
+ "command": "specforge",
111
+ "env": {
112
+ "SPECFORGE_API_KEY": "sf_live_your_api_key_here",
113
+ "SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+ ```
121
+
122
+ ### GitHub Copilot CLI
123
+
124
+ Create a config file at `~/.config/gh-copilot/mcp.json`:
125
+
126
+ ```json
127
+ {
128
+ "servers": {
129
+ "specforge": {
130
+ "command": "specforge",
131
+ "env": {
132
+ "SPECFORGE_API_KEY": "sf_live_your_api_key_here",
133
+ "SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
134
+ }
135
+ }
136
+ }
137
+ }
138
+ ```
139
+
140
+ ### OpenAI Codex CLI
141
+
142
+ Configure using environment variables:
143
+
144
+ ```bash
145
+ export SPECFORGE_API_KEY="sf_live_your_api_key_here"
146
+ export SPECFORGE_API_URL="https://your-api-gateway-url.amazonaws.com/prod"
147
+
148
+ # Then configure your Codex CLI to use the MCP server
149
+ codex --mcp-server specforge
150
+ ```
151
+
152
+ ### ChatGPT Desktop
153
+
154
+ Add to ChatGPT Desktop's MCP configuration:
155
+
156
+ ```json
157
+ {
158
+ "mcpServers": {
159
+ "specforge": {
160
+ "command": "specforge",
161
+ "env": {
162
+ "SPECFORGE_API_KEY": "sf_live_your_api_key_here",
163
+ "SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
164
+ }
165
+ }
166
+ }
167
+ }
168
+ ```
169
+
170
+ ### Windsurf
171
+
172
+ Add to Windsurf's settings:
173
+
174
+ ```json
175
+ {
176
+ "mcp": {
177
+ "servers": {
178
+ "specforge": {
179
+ "command": "specforge",
180
+ "env": {
181
+ "SPECFORGE_API_KEY": "sf_live_your_api_key_here",
182
+ "SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ ```
189
+
190
+ ### Generic MCP Client
191
+
192
+ For any MCP-compatible client, the server uses stdio transport:
193
+
194
+ ```bash
195
+ # Start the server with environment variables
196
+ SPECFORGE_API_KEY="sf_live_xxx" SPECFORGE_API_URL="https://xxx" specforge
197
+ ```
198
+
199
+ The server communicates via JSON-RPC over stdin/stdout.
200
+
201
+ ## Available Tools
202
+
203
+ The SpecForge MCP server provides the following tool categories:
204
+
205
+ ### Core Operations
206
+ - `list_projects` - List all accessible projects
207
+ - `get_project` - Get project details
208
+ - `list_specifications` - List specifications in a project
209
+ - `get_specification` - Get specification details
210
+ - `list_epics` - List epics in a specification
211
+ - `get_epic` - Get epic details
212
+ - `list_tickets` - List tickets in an epic
213
+ - `get_ticket` - Get ticket details with implementation steps
214
+
215
+ ### Context & AI Tools
216
+ - `get_implementation_context` - Get full context for implementing a ticket
217
+ - `get_next_actionable_tickets` - Get tickets ready to work on
218
+ - `get_blocked_tickets` - Get blocked tickets with reasons
219
+ - `get_critical_path` - Get the critical implementation path
220
+
221
+ ### Workflow & Tracking
222
+ - `start_work_session` - Start working on a ticket
223
+ - `complete_work_session` - Mark work complete with summary
224
+ - `report_progress` - Report progress on a ticket
225
+
226
+ ### Testing Tools
227
+ - `report_test_results` - Report test results for a ticket
228
+ - `get_ticket_test_status` - Get test status
229
+ - `validate_ticket_completion` - Validate completion criteria
230
+
231
+ ### Discovery Tools
232
+ - `discover_work_session` - Report bugs, tech debt, or new requirements
233
+ - `get_pending_discoveries` - Get unresolved discoveries
234
+ - `resolve_discovery` - Mark a discovery as resolved
235
+
236
+ ### Status & Analytics
237
+ - `get_specification_status` - Get specification progress
238
+ - `get_epic_status` - Get epic progress
239
+ - `get_implementation_summary` - Get overall project summary
240
+ - `get_blockers_report` - Get blocking dependencies
241
+
242
+ ### Search Tools
243
+ - `search_tickets` - Search tickets by text
244
+ - `find_tickets_by_file` - Find tickets affecting a file
245
+ - `find_tickets_by_tag` - Find tickets with specific tags
246
+ - `find_related_tickets` - Find related tickets
247
+
248
+ ### Git Integration
249
+ - `link_commit` - Link a commit to a ticket
250
+ - `link_pull_request` - Link a PR to a ticket
251
+ - `get_ticket_commits` - Get commits for a ticket
252
+ - `get_ticket_prs` - Get PRs for a ticket
253
+
254
+ ### Blueprint Management
255
+ - `blueprint` - Manage specification blueprints (diagrams, mockups, ADRs)
256
+ - Operations: `create`, `get`, `update`, `list`, `delete`, `link`, `unlink`, `get_for_ticket`
257
+ - Categories: flowchart, architecture, state, sequence, erd, mockup, adr, component, deployment, api
258
+ - See [Blueprint Documentation](/docs/mcp/tools/blueprint.md)
259
+
260
+ ### Project Sharing
261
+ - `list_project_members` - List all members of a project
262
+ - `invite_to_project` - Invite a user by email
263
+ - `remove_project_member` - Remove a member from project
264
+ - `update_member_role` - Change a member's role (owner, editor, viewer)
265
+ - `list_invitations` - List pending invitations
266
+ - `accept_project_invitation` - Accept an invitation
267
+ - `decline_project_invitation` - Decline an invitation
268
+ - See [Project Sharing Documentation](/docs/mcp/collaboration/)
269
+
270
+ ## CLI Commands
271
+
272
+ The SpecForge MCP package includes a CLI for project configuration and management.
273
+
274
+ ### Quick Reference
275
+
276
+ | Command | Description |
277
+ |---------|-------------|
278
+ | `login` | Authenticate with your API key |
279
+ | `init` | Initialize SpecForge in a project |
280
+ | `configure` | Configure output preferences |
281
+ | `doctor` | Diagnose configuration issues |
282
+ | `status` | Show specification status |
283
+ | `projects` | List accessible projects |
284
+ | `specs` | List specifications |
285
+ | `switch` | Switch project/specification context |
286
+ | `tickets` | List tickets |
287
+ | `ticket <id>` | Show ticket details |
288
+ | `next` | Get next actionable ticket |
289
+ | `blocked` | List blocked tickets |
290
+ | `session` | Show session status |
291
+ | `session start` | Start implementation session |
292
+ | `session end` | End current session |
293
+ | `call <tool>` | Directly call an MCP tool |
294
+ | `tools` | List available MCP tools |
295
+ | `test` | Test API connection |
296
+ | `whoami` | Show current user/config |
297
+ | `autopilot run` | Start autonomous implementation |
298
+ | `autopilot status` | Show autopilot session status |
299
+ | `autopilot pause` | Pause active session |
300
+ | `autopilot resume` | Resume paused session |
301
+ | `autopilot abort` | Stop and cleanup session |
302
+
303
+ ### Setup Commands
304
+
305
+ #### login
306
+
307
+ ```bash
308
+ specforge login [--api-key <key>] [--force]
309
+ ```
310
+
311
+ Authenticate with the SpecForge API.
312
+
313
+ | Option | Description |
314
+ |--------|-------------|
315
+ | `--api-key <key>` | Provide API key non-interactively (for CI/scripts) |
316
+ | `-f, --force` | Overwrite existing authentication |
317
+
318
+ Examples:
319
+ ```bash
320
+ specforge login # Interactive login
321
+ specforge login --api-key sf_live_xxx # Non-interactive
322
+ specforge login --force # Re-authenticate
323
+ ```
324
+
325
+ #### init
326
+
327
+ ```bash
328
+ specforge init [--project <id>] [--spec <id>] [--format <format>] [--force]
329
+ ```
330
+
331
+ Initialize SpecForge in the current directory.
332
+
333
+ | Option | Description |
334
+ |--------|-------------|
335
+ | `--project <id>` | Project ID (non-interactive mode) |
336
+ | `--spec <id>` | Specification ID (non-interactive mode) |
337
+ | `--format <format>` | Output format: json or toon |
338
+ | `-f, --force` | Overwrite existing configuration |
339
+
340
+ Creates:
341
+ - `.mcp.json` - Claude Code MCP server configuration
342
+ - `.specforge.json` - Project-specific settings
343
+
344
+ Examples:
345
+ ```bash
346
+ specforge init # Interactive setup
347
+ specforge init --project proj_abc # Set project
348
+ specforge init --project proj_abc --spec spec_xyz --format toon
349
+ ```
350
+
351
+ #### configure
352
+
353
+ ```bash
354
+ specforge configure [--format <format>] [--project <id>]
355
+ ```
356
+
357
+ Configure default preferences.
358
+
359
+ #### doctor
360
+
361
+ ```bash
362
+ specforge doctor [--json]
363
+ ```
364
+
365
+ Diagnose configuration and connection issues.
366
+
367
+ | Option | Description |
368
+ |--------|-------------|
369
+ | `--json` | Output as JSON for scripting |
370
+
371
+ Check categories:
372
+ - Configuration - Config files presence
373
+ - Authentication - API key format and validity
374
+ - Connection - API connectivity and response time
375
+ - Project Access - Access to configured project/specification
376
+
377
+ ### Navigation Commands
378
+
379
+ #### switch
380
+
381
+ ```bash
382
+ specforge switch [--project <id>] [--spec <id>]
383
+ ```
384
+
385
+ Switch between projects or specifications.
386
+
387
+ #### projects
388
+
389
+ ```bash
390
+ specforge projects [--json] [--toon]
391
+ ```
392
+
393
+ List all accessible projects.
394
+
395
+ #### specs
396
+
397
+ ```bash
398
+ specforge specs [--project <id>] [--status <status>] [--json]
399
+ ```
400
+
401
+ List specifications for the current or specified project.
402
+
403
+ ### Query Commands
404
+
405
+ #### status
406
+
407
+ ```bash
408
+ specforge status [--spec <id>] [--json]
409
+ ```
410
+
411
+ Show current specification status with progress metrics.
412
+
413
+ #### tickets
414
+
415
+ ```bash
416
+ specforge tickets [--epic <id>] [--status <status>] [--limit <n>] [--json]
417
+ ```
418
+
419
+ List tickets for the current specification.
420
+
421
+ #### ticket
422
+
423
+ ```bash
424
+ specforge ticket <id> [--json] [--context]
425
+ ```
426
+
427
+ Show full details for a specific ticket.
428
+
429
+ | Option | Description |
430
+ |--------|-------------|
431
+ | `--json` | Output as JSON |
432
+ | `--context` | Include implementation context |
433
+
434
+ #### next
435
+
436
+ ```bash
437
+ specforge next [--spec <id>] [--count <n>] [--json]
438
+ ```
439
+
440
+ Get the next actionable tickets (dependencies satisfied).
441
+
442
+ #### blocked
443
+
444
+ ```bash
445
+ specforge blocked [--spec <id>] [--json]
446
+ ```
447
+
448
+ List blocked tickets with blocking reasons.
449
+
450
+ ### Session Commands
451
+
452
+ #### session
453
+
454
+ ```bash
455
+ specforge session [--json]
456
+ ```
457
+
458
+ Show current implementation session status.
459
+
460
+ #### session start
461
+
462
+ ```bash
463
+ specforge session start [specId] [--mode <mode>] [--max-tickets <n>] [--stop-on-failure] [--force]
464
+ ```
465
+
466
+ Start a new implementation session.
467
+
468
+ | Option | Description |
469
+ |--------|-------------|
470
+ | `[specId]` | Target specification (uses current if omitted) |
471
+ | `--mode <mode>` | Session mode: single, autonomous, guided |
472
+ | `--max-tickets <n>` | Maximum tickets to process |
473
+ | `--stop-on-failure` | Stop on first failure |
474
+ | `--force` | End existing session and start new |
475
+
476
+ #### session end
477
+
478
+ ```bash
479
+ specforge session end [--status <status>] [--summary <text>]
480
+ ```
481
+
482
+ End the current implementation session.
483
+
484
+ | Option | Description |
485
+ |--------|-------------|
486
+ | `--status <status>` | End status: completed or aborted |
487
+ | `--summary <text>` | Custom session summary |
488
+
489
+ ### Debug Commands
490
+
491
+ #### call
492
+
493
+ ```bash
494
+ specforge call <tool> [--args <json>] [--format <format>] [--raw]
495
+ ```
496
+
497
+ Directly call an MCP tool with JSON arguments.
498
+
499
+ Examples:
500
+ ```bash
501
+ specforge call list_projects
502
+ specforge call get_ticket --args='{"ticketId":"abc123"}'
503
+ specforge call list_tickets --format toon
504
+ ```
505
+
506
+ #### tools
507
+
508
+ ```bash
509
+ specforge tools [--category <category>] [--search <query>] [--json]
510
+ ```
511
+
512
+ List available MCP tools with optional filtering.
513
+
514
+ #### test
515
+
516
+ ```bash
517
+ specforge test
518
+ ```
519
+
520
+ Test API connection and authentication. Shows response time and user info.
521
+
522
+ #### whoami
523
+
524
+ ```bash
525
+ specforge whoami [--json]
526
+ ```
527
+
528
+ Show current user information and configuration settings.
529
+
530
+ ### Autopilot Commands
531
+
532
+ Autopilot enables autonomous ticket implementation using Claude Code. See [full documentation](/docs/mcp/autopilot/).
533
+
534
+ #### autopilot run
535
+
536
+ ```bash
537
+ specforge autopilot run [options]
538
+ ```
539
+
540
+ Start autonomous ticket implementation.
541
+
542
+ | Option | Description |
543
+ |--------|-------------|
544
+ | `-s, --spec <id>` | Specification ID |
545
+ | `-e, --epic <id>` | Only implement tickets from this epic |
546
+ | `-p, --parallel <n>` | Number of parallel workers (1-10) |
547
+ | `-c, --max-cost <usd>` | Maximum cost in USD |
548
+ | `-n, --dry-run` | Show plan without executing |
549
+ | `-w, --watch` | Watch mode with live dashboard |
550
+ | `-r, --resume <id>` | Resume a previous run |
551
+
552
+ Examples:
553
+ ```bash
554
+ specforge autopilot run --dry-run # Preview
555
+ specforge autopilot run --parallel 2 # Run with 2 workers
556
+ specforge autopilot run --max-cost 10 # Limit to $10
557
+ specforge autopilot run --watch # Live dashboard
558
+ ```
559
+
560
+ #### autopilot status
561
+
562
+ ```bash
563
+ specforge autopilot status [options]
564
+ ```
565
+
566
+ Show current autopilot session status.
567
+
568
+ | Option | Description |
569
+ |--------|-------------|
570
+ | `-w, --watch` | Live updates (2s refresh) |
571
+ | `-v, --verbose` | Show detailed dashboard |
572
+ | `--json` | Output as JSON |
573
+
574
+ #### autopilot pause / resume / abort
575
+
576
+ ```bash
577
+ specforge autopilot pause # Pause gracefully
578
+ specforge autopilot resume # Resume latest session
579
+ specforge autopilot abort --force # Stop and cleanup
580
+ ```
581
+
582
+ ### Configuration Files
583
+
584
+ | File | Location | Purpose |
585
+ |------|----------|---------|
586
+ | Global config | `~/.specforge/config.json` | API key, default format |
587
+ | Project config | `.specforge.json` | Project/spec IDs, format override |
588
+ | MCP config | `.mcp.json` | Claude Code integration |
589
+
590
+ Configuration priority (highest to lowest):
591
+ 1. Environment variables
592
+ 2. Project config (`.specforge.json`)
593
+ 3. Global config (`~/.specforge/config.json`)
594
+ 4. Default values
595
+
596
+ ### Environment Variables
597
+
598
+ | Variable | Description |
599
+ |----------|-------------|
600
+ | `SPECFORGE_API_KEY` | API key (overrides config) |
601
+ | `SPECFORGE_API_URL` | API endpoint URL |
602
+ | `SPECFORGE_FORMAT` | Output format (json/toon) |
603
+ | `SPECFORGE_DEBUG` | Enable debug mode (true/false) |
604
+
605
+ ### Exit Codes
606
+
607
+ | Code | Name | Description |
608
+ |------|------|-------------|
609
+ | 0 | SUCCESS | Successful execution |
610
+ | 1 | ERROR | General error |
611
+ | 2 | AUTH_ERROR | Authentication failed |
612
+ | 3 | CONFIG_ERROR | Configuration error |
613
+ | 4 | NETWORK_ERROR | Network/API error |
614
+ | 5 | NOT_FOUND | Resource not found |
615
+ | 6 | VALIDATION_ERROR | Input validation error |
616
+
617
+ ### Automation & CI/CD
618
+
619
+ Non-interactive usage for scripts:
620
+
621
+ ```bash
622
+ # Authenticate via environment or flag
623
+ export SPECFORGE_API_KEY="sf_live_xxx"
624
+ specforge login --api-key $SPECFORGE_API_KEY
625
+
626
+ # Initialize non-interactively
627
+ specforge init --project $PROJECT_ID --spec $SPEC_ID --format json --force
628
+
629
+ # Check health (exits 1 on failure)
630
+ specforge doctor --json
631
+
632
+ # Get tickets as JSON for processing
633
+ specforge tickets --json | jq '.[]'
634
+
635
+ # Get next actionable ticket ID
636
+ specforge next --json | jq -r '.tickets[0].id'
637
+ ```
638
+
639
+ ### Global Options
640
+
641
+ These options work with any command:
642
+
643
+ | Option | Description |
644
+ |--------|-------------|
645
+ | `--debug` | Enable debug output |
646
+ | `--no-color` | Disable colored output |
647
+ | `--json` | Output in JSON format |
648
+ | `-v, --version` | Show version |
649
+ | `-h, --help` | Show command help |
650
+
651
+ ## Troubleshooting
652
+
653
+ ### "SPECFORGE_API_KEY environment variable is required"
654
+
655
+ Make sure you've set the `SPECFORGE_API_KEY` environment variable with your API key from the SpecForge webapp.
656
+
657
+ ```bash
658
+ # Check if it's set
659
+ echo $SPECFORGE_API_KEY
660
+
661
+ # Set it
662
+ export SPECFORGE_API_KEY="sf_live_your_key_here"
663
+ ```
664
+
665
+ ### "Invalid API key format"
666
+
667
+ API keys must start with `sf_live_`. If your key doesn't match this format, regenerate it in the webapp.
668
+
669
+ ### "SPECFORGE_API_URL environment variable is required"
670
+
671
+ You need to provide the API Gateway URL from your SpecForge deployment. This is output when you deploy the backend.
672
+
673
+ ### Connection Timeouts
674
+
675
+ If you're experiencing connection issues:
676
+
677
+ 1. Verify your API URL is correct
678
+ 2. Check your network connection
679
+ 3. Enable debug mode to see detailed logs:
680
+
681
+ ```bash
682
+ export SPECFORGE_DEBUG=true
683
+ specforge
684
+ ```
685
+
686
+ ### Debug Mode
687
+
688
+ Enable debug logging to troubleshoot issues:
689
+
690
+ ```bash
691
+ export SPECFORGE_DEBUG=true
692
+ ```
693
+
694
+ This will output detailed logs to stderr, including:
695
+ - Configuration loaded
696
+ - Tool calls received
697
+ - API requests made
698
+ - Response data
699
+
700
+ ### Server Not Starting
701
+
702
+ 1. Ensure Node.js 18+ is installed
703
+ 2. Check that the package is installed globally: `npm list -g @specforge/mcp`
704
+ 3. Try reinstalling: `npm install -g @specforge/mcp`
705
+
706
+ ### Permission Denied
707
+
708
+ If you get "permission denied" when running `specforge`:
709
+
710
+ ```bash
711
+ # On macOS/Linux
712
+ chmod +x $(which specforge)
713
+
714
+ # Or run with node directly
715
+ node $(npm root -g)/@specforge/mcp/dist/index.js
716
+ ```
717
+
718
+ ## Development
719
+
720
+ To contribute to the MCP server:
721
+
722
+ ```bash
723
+ # Clone the repo
724
+ git clone https://github.com/your-org/specforge.git
725
+ cd specforge/mcp
726
+
727
+ # Install dependencies
728
+ npm install
729
+
730
+ # Build
731
+ npm run build
732
+
733
+ # Link for local testing
734
+ npm link
735
+
736
+ # Run in development mode
737
+ npm run dev
738
+ ```
739
+
740
+ ### Channel-aware build
741
+
742
+ The CLI ships as two distinct npm packages:
743
+
744
+ | Channel | Package | Endpoints | Config dir |
745
+ |---------|---------|-----------|------------|
746
+ | `stable` | `@specforge/cli` | `mcp.specforge.tech` (primary) + `mcp.specforge.com.br` (fallback) | `~/.specforge/` |
747
+ | `canary` | `@specforge/canary-cli` | `devmcp.specforge.tech` + `devmcp.specforge.com.br` | `~/.specforge-canary/` |
748
+
749
+ The build picks the channel from `SPECFORGE_BUILD_CHANNEL` (defaults to
750
+ `stable` when unset). To build a canary tarball locally:
751
+
752
+ ```bash
753
+ SPECFORGE_BUILD_CHANNEL=canary pnpm --filter @specforge/cli build
754
+ ```
755
+
756
+ The CD workflows (`.github/workflows/deploy-{dev,prod}.yml`) set this env
757
+ var on the `publish-cli-{canary,stable}` jobs so the published tarballs
758
+ contain the matching endpoint literals.
759
+
760
+ ### Endpoint resolver and overrides
761
+
762
+ On first call in a process, the MCP transport probes
763
+ `CHANNEL.endpoint.healthPrimary` (2 s timeout). On a DNS-class failure
764
+ (`ENOTFOUND`, `ENETUNREACH`, TLS handshake, timeout) it falls over to
765
+ `CHANNEL.endpoint.healthFallback`. The selection is cached for 5 minutes
766
+ under `~/${CHANNEL.configDir}/mcp-endpoint-cache.json`. The CLI REST
767
+ client uses the same resolver with `cli-rest-endpoint-cache.json`.
768
+
769
+ To bypass the resolver (for ops smokes or self-hosting):
770
+
771
+ ```bash
772
+ export SPECFORGE_API_URL=https://your-mcp.example/local
773
+ export SPECFORGE_CLI_REST_URL=https://your-cli.example
774
+ ```
775
+
776
+ Reachable-but-rejecting responses (4xx/5xx, `ECONNRESET` mid-stream) do
777
+ NOT trigger fallover — the backend was reachable, just unhealthy.
778
+
779
+ ## License
780
+
781
+ MIT