@specforge/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +781 -0
  2. package/bin/specforge +21 -0
  3. package/dist/channel.d.ts +27 -0
  4. package/dist/channel.d.ts.map +1 -0
  5. package/dist/channel.js +22 -0
  6. package/dist/channel.js.map +1 -0
  7. package/dist/cli/commands/configure.d.ts +16 -0
  8. package/dist/cli/commands/configure.d.ts.map +1 -0
  9. package/dist/cli/commands/configure.js +186 -0
  10. package/dist/cli/commands/configure.js.map +1 -0
  11. package/dist/cli/commands/configure.types.d.ts +110 -0
  12. package/dist/cli/commands/configure.types.d.ts.map +1 -0
  13. package/dist/cli/commands/configure.types.js +82 -0
  14. package/dist/cli/commands/configure.types.js.map +1 -0
  15. package/dist/cli/commands/debug/call.d.ts +14 -0
  16. package/dist/cli/commands/debug/call.d.ts.map +1 -0
  17. package/dist/cli/commands/debug/call.js +96 -0
  18. package/dist/cli/commands/debug/call.js.map +1 -0
  19. package/dist/cli/commands/debug/index.d.ts +12 -0
  20. package/dist/cli/commands/debug/index.d.ts.map +1 -0
  21. package/dist/cli/commands/debug/index.js +14 -0
  22. package/dist/cli/commands/debug/index.js.map +1 -0
  23. package/dist/cli/commands/debug/register.d.ts +11 -0
  24. package/dist/cli/commands/debug/register.d.ts.map +1 -0
  25. package/dist/cli/commands/debug/register.js +78 -0
  26. package/dist/cli/commands/debug/register.js.map +1 -0
  27. package/dist/cli/commands/debug/test.d.ts +13 -0
  28. package/dist/cli/commands/debug/test.d.ts.map +1 -0
  29. package/dist/cli/commands/debug/test.js +91 -0
  30. package/dist/cli/commands/debug/test.js.map +1 -0
  31. package/dist/cli/commands/debug/tools.d.ts +13 -0
  32. package/dist/cli/commands/debug/tools.d.ts.map +1 -0
  33. package/dist/cli/commands/debug/tools.js +86 -0
  34. package/dist/cli/commands/debug/tools.js.map +1 -0
  35. package/dist/cli/commands/debug/types.d.ts +119 -0
  36. package/dist/cli/commands/debug/types.d.ts.map +1 -0
  37. package/dist/cli/commands/debug/types.js +36 -0
  38. package/dist/cli/commands/debug/types.js.map +1 -0
  39. package/dist/cli/commands/debug/whoami.d.ts +13 -0
  40. package/dist/cli/commands/debug/whoami.d.ts.map +1 -0
  41. package/dist/cli/commands/debug/whoami.js +131 -0
  42. package/dist/cli/commands/debug/whoami.js.map +1 -0
  43. package/dist/cli/commands/doctor.d.ts +16 -0
  44. package/dist/cli/commands/doctor.d.ts.map +1 -0
  45. package/dist/cli/commands/doctor.js +413 -0
  46. package/dist/cli/commands/doctor.js.map +1 -0
  47. package/dist/cli/commands/doctor.types.d.ts +180 -0
  48. package/dist/cli/commands/doctor.types.d.ts.map +1 -0
  49. package/dist/cli/commands/doctor.types.js +140 -0
  50. package/dist/cli/commands/doctor.types.js.map +1 -0
  51. package/dist/cli/commands/feedback.d.ts +27 -0
  52. package/dist/cli/commands/feedback.d.ts.map +1 -0
  53. package/dist/cli/commands/feedback.js +262 -0
  54. package/dist/cli/commands/feedback.js.map +1 -0
  55. package/dist/cli/commands/feedback.types.d.ts +116 -0
  56. package/dist/cli/commands/feedback.types.d.ts.map +1 -0
  57. package/dist/cli/commands/feedback.types.js +65 -0
  58. package/dist/cli/commands/feedback.types.js.map +1 -0
  59. package/dist/cli/commands/index.d.ts +15 -0
  60. package/dist/cli/commands/index.d.ts.map +1 -0
  61. package/dist/cli/commands/index.js +21 -0
  62. package/dist/cli/commands/index.js.map +1 -0
  63. package/dist/cli/commands/init.d.ts +17 -0
  64. package/dist/cli/commands/init.d.ts.map +1 -0
  65. package/dist/cli/commands/init.js +773 -0
  66. package/dist/cli/commands/init.js.map +1 -0
  67. package/dist/cli/commands/init.types.d.ts +193 -0
  68. package/dist/cli/commands/init.types.d.ts.map +1 -0
  69. package/dist/cli/commands/init.types.js +29 -0
  70. package/dist/cli/commands/init.types.js.map +1 -0
  71. package/dist/cli/commands/invitations.d.ts +31 -0
  72. package/dist/cli/commands/invitations.d.ts.map +1 -0
  73. package/dist/cli/commands/invitations.js +250 -0
  74. package/dist/cli/commands/invitations.js.map +1 -0
  75. package/dist/cli/commands/login.d.ts +40 -0
  76. package/dist/cli/commands/login.d.ts.map +1 -0
  77. package/dist/cli/commands/login.js +139 -0
  78. package/dist/cli/commands/login.js.map +1 -0
  79. package/dist/cli/commands/members.d.ts +55 -0
  80. package/dist/cli/commands/members.d.ts.map +1 -0
  81. package/dist/cli/commands/members.js +296 -0
  82. package/dist/cli/commands/members.js.map +1 -0
  83. package/dist/cli/commands/scaffold/agent-types.d.ts +54 -0
  84. package/dist/cli/commands/scaffold/agent-types.d.ts.map +1 -0
  85. package/dist/cli/commands/scaffold/agent-types.js +22 -0
  86. package/dist/cli/commands/scaffold/agent-types.js.map +1 -0
  87. package/dist/cli/commands/scaffold/display.d.ts +56 -0
  88. package/dist/cli/commands/scaffold/display.d.ts.map +1 -0
  89. package/dist/cli/commands/scaffold/display.js +217 -0
  90. package/dist/cli/commands/scaffold/display.js.map +1 -0
  91. package/dist/cli/commands/scaffold/files.d.ts +99 -0
  92. package/dist/cli/commands/scaffold/files.d.ts.map +1 -0
  93. package/dist/cli/commands/scaffold/files.js +122 -0
  94. package/dist/cli/commands/scaffold/files.js.map +1 -0
  95. package/dist/cli/commands/scaffold/index.d.ts +13 -0
  96. package/dist/cli/commands/scaffold/index.d.ts.map +1 -0
  97. package/dist/cli/commands/scaffold/index.js +12 -0
  98. package/dist/cli/commands/scaffold/index.js.map +1 -0
  99. package/dist/cli/commands/scaffold/register.d.ts +11 -0
  100. package/dist/cli/commands/scaffold/register.d.ts.map +1 -0
  101. package/dist/cli/commands/scaffold/register.js +11 -0
  102. package/dist/cli/commands/scaffold/register.js.map +1 -0
  103. package/dist/cli/commands/scaffold/scaffold.d.ts +11 -0
  104. package/dist/cli/commands/scaffold/scaffold.d.ts.map +1 -0
  105. package/dist/cli/commands/scaffold/scaffold.js +728 -0
  106. package/dist/cli/commands/scaffold/scaffold.js.map +1 -0
  107. package/dist/cli/commands/scaffold/targets.d.ts +60 -0
  108. package/dist/cli/commands/scaffold/targets.d.ts.map +1 -0
  109. package/dist/cli/commands/scaffold/targets.js +251 -0
  110. package/dist/cli/commands/scaffold/targets.js.map +1 -0
  111. package/dist/cli/commands/scaffold/types.d.ts +170 -0
  112. package/dist/cli/commands/scaffold/types.d.ts.map +1 -0
  113. package/dist/cli/commands/scaffold/types.js +12 -0
  114. package/dist/cli/commands/scaffold/types.js.map +1 -0
  115. package/dist/cli/commands/scaffold/utils.d.ts +89 -0
  116. package/dist/cli/commands/scaffold/utils.d.ts.map +1 -0
  117. package/dist/cli/commands/scaffold/utils.js +401 -0
  118. package/dist/cli/commands/scaffold/utils.js.map +1 -0
  119. package/dist/cli/commands/status.d.ts +19 -0
  120. package/dist/cli/commands/status.d.ts.map +1 -0
  121. package/dist/cli/commands/status.js +124 -0
  122. package/dist/cli/commands/status.js.map +1 -0
  123. package/dist/cli/commands/status.types.d.ts +37 -0
  124. package/dist/cli/commands/status.types.d.ts.map +1 -0
  125. package/dist/cli/commands/status.types.js +7 -0
  126. package/dist/cli/commands/status.types.js.map +1 -0
  127. package/dist/cli/commands/switch.d.ts +18 -0
  128. package/dist/cli/commands/switch.d.ts.map +1 -0
  129. package/dist/cli/commands/switch.js +134 -0
  130. package/dist/cli/commands/switch.js.map +1 -0
  131. package/dist/cli/commands/switch.types.d.ts +123 -0
  132. package/dist/cli/commands/switch.types.d.ts.map +1 -0
  133. package/dist/cli/commands/switch.types.js +46 -0
  134. package/dist/cli/commands/switch.types.js.map +1 -0
  135. package/dist/cli/config/agent-teams.types.d.ts +120 -0
  136. package/dist/cli/config/agent-teams.types.d.ts.map +1 -0
  137. package/dist/cli/config/agent-teams.types.js +23 -0
  138. package/dist/cli/config/agent-teams.types.js.map +1 -0
  139. package/dist/cli/config/index.d.ts +13 -0
  140. package/dist/cli/config/index.d.ts.map +1 -0
  141. package/dist/cli/config/index.js +7 -0
  142. package/dist/cli/config/index.js.map +1 -0
  143. package/dist/cli/config/loader.d.ts +114 -0
  144. package/dist/cli/config/loader.d.ts.map +1 -0
  145. package/dist/cli/config/loader.js +198 -0
  146. package/dist/cli/config/loader.js.map +1 -0
  147. package/dist/cli/config/paths.d.ts +107 -0
  148. package/dist/cli/config/paths.d.ts.map +1 -0
  149. package/dist/cli/config/paths.js +79 -0
  150. package/dist/cli/config/paths.js.map +1 -0
  151. package/dist/cli/config/planning-sessions-registry.d.ts +52 -0
  152. package/dist/cli/config/planning-sessions-registry.d.ts.map +1 -0
  153. package/dist/cli/config/planning-sessions-registry.js +46 -0
  154. package/dist/cli/config/planning-sessions-registry.js.map +1 -0
  155. package/dist/cli/config/types.d.ts +186 -0
  156. package/dist/cli/config/types.d.ts.map +1 -0
  157. package/dist/cli/config/types.js +27 -0
  158. package/dist/cli/config/types.js.map +1 -0
  159. package/dist/cli/config/validation.d.ts +62 -0
  160. package/dist/cli/config/validation.d.ts.map +1 -0
  161. package/dist/cli/config/validation.js +133 -0
  162. package/dist/cli/config/validation.js.map +1 -0
  163. package/dist/cli/config/writer.d.ts +153 -0
  164. package/dist/cli/config/writer.d.ts.map +1 -0
  165. package/dist/cli/config/writer.js +168 -0
  166. package/dist/cli/config/writer.js.map +1 -0
  167. package/dist/cli/index.d.ts +30 -0
  168. package/dist/cli/index.d.ts.map +1 -0
  169. package/dist/cli/index.js +142 -0
  170. package/dist/cli/index.js.map +1 -0
  171. package/dist/cli/middleware/auth-guard.d.ts +107 -0
  172. package/dist/cli/middleware/auth-guard.d.ts.map +1 -0
  173. package/dist/cli/middleware/auth-guard.js +97 -0
  174. package/dist/cli/middleware/auth-guard.js.map +1 -0
  175. package/dist/cli/middleware/error-handler.d.ts +133 -0
  176. package/dist/cli/middleware/error-handler.d.ts.map +1 -0
  177. package/dist/cli/middleware/error-handler.js +139 -0
  178. package/dist/cli/middleware/error-handler.js.map +1 -0
  179. package/dist/cli/middleware/index.d.ts +6 -0
  180. package/dist/cli/middleware/index.d.ts.map +1 -0
  181. package/dist/cli/middleware/index.js +3 -0
  182. package/dist/cli/middleware/index.js.map +1 -0
  183. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +9 -0
  184. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -0
  185. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +160 -0
  186. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -0
  187. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts +9 -0
  188. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -0
  189. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +343 -0
  190. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -0
  191. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +9 -0
  192. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -0
  193. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +254 -0
  194. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -0
  195. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts +8 -0
  196. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts.map +1 -0
  197. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js +128 -0
  198. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js.map +1 -0
  199. package/dist/cli/templates/agents/index.d.ts +23 -0
  200. package/dist/cli/templates/agents/index.d.ts.map +1 -0
  201. package/dist/cli/templates/agents/index.js +29 -0
  202. package/dist/cli/templates/agents/index.js.map +1 -0
  203. package/dist/cli/templates/commands.d.ts +17 -0
  204. package/dist/cli/templates/commands.d.ts.map +1 -0
  205. package/dist/cli/templates/commands.js +78 -0
  206. package/dist/cli/templates/commands.js.map +1 -0
  207. package/dist/cli/templates/content/sf-blockers.d.ts +7 -0
  208. package/dist/cli/templates/content/sf-blockers.d.ts.map +1 -0
  209. package/dist/cli/templates/content/sf-blockers.js +69 -0
  210. package/dist/cli/templates/content/sf-blockers.js.map +1 -0
  211. package/dist/cli/templates/content/sf-commit.d.ts +7 -0
  212. package/dist/cli/templates/content/sf-commit.d.ts.map +1 -0
  213. package/dist/cli/templates/content/sf-commit.js +79 -0
  214. package/dist/cli/templates/content/sf-commit.js.map +1 -0
  215. package/dist/cli/templates/content/sf-context.d.ts +7 -0
  216. package/dist/cli/templates/content/sf-context.d.ts.map +1 -0
  217. package/dist/cli/templates/content/sf-context.js +63 -0
  218. package/dist/cli/templates/content/sf-context.js.map +1 -0
  219. package/dist/cli/templates/content/sf-help.d.ts +7 -0
  220. package/dist/cli/templates/content/sf-help.d.ts.map +1 -0
  221. package/dist/cli/templates/content/sf-help.js +42 -0
  222. package/dist/cli/templates/content/sf-help.js.map +1 -0
  223. package/dist/cli/templates/content/sf-init.d.ts +7 -0
  224. package/dist/cli/templates/content/sf-init.d.ts.map +1 -0
  225. package/dist/cli/templates/content/sf-init.js +62 -0
  226. package/dist/cli/templates/content/sf-init.js.map +1 -0
  227. package/dist/cli/templates/content/sf-reset.d.ts +7 -0
  228. package/dist/cli/templates/content/sf-reset.d.ts.map +1 -0
  229. package/dist/cli/templates/content/sf-reset.js +67 -0
  230. package/dist/cli/templates/content/sf-reset.js.map +1 -0
  231. package/dist/cli/templates/content/sf-search.d.ts +7 -0
  232. package/dist/cli/templates/content/sf-search.d.ts.map +1 -0
  233. package/dist/cli/templates/content/sf-search.js +63 -0
  234. package/dist/cli/templates/content/sf-search.js.map +1 -0
  235. package/dist/cli/templates/content/sf-status.d.ts +7 -0
  236. package/dist/cli/templates/content/sf-status.d.ts.map +1 -0
  237. package/dist/cli/templates/content/sf-status.js +62 -0
  238. package/dist/cli/templates/content/sf-status.js.map +1 -0
  239. package/dist/cli/templates/index.d.ts +8 -0
  240. package/dist/cli/templates/index.d.ts.map +1 -0
  241. package/dist/cli/templates/index.js +17 -0
  242. package/dist/cli/templates/index.js.map +1 -0
  243. package/dist/cli/ui/banner.d.ts +38 -0
  244. package/dist/cli/ui/banner.d.ts.map +1 -0
  245. package/dist/cli/ui/banner.js +89 -0
  246. package/dist/cli/ui/banner.js.map +1 -0
  247. package/dist/cli/ui/colors.d.ts +76 -0
  248. package/dist/cli/ui/colors.d.ts.map +1 -0
  249. package/dist/cli/ui/colors.js +67 -0
  250. package/dist/cli/ui/colors.js.map +1 -0
  251. package/dist/cli/ui/index.d.ts +7 -0
  252. package/dist/cli/ui/index.d.ts.map +1 -0
  253. package/dist/cli/ui/index.js +4 -0
  254. package/dist/cli/ui/index.js.map +1 -0
  255. package/dist/cli/ui/output.d.ts +117 -0
  256. package/dist/cli/ui/output.d.ts.map +1 -0
  257. package/dist/cli/ui/output.js +83 -0
  258. package/dist/cli/ui/output.js.map +1 -0
  259. package/dist/cli/ui/spinner.d.ts +120 -0
  260. package/dist/cli/ui/spinner.d.ts.map +1 -0
  261. package/dist/cli/ui/spinner.js +158 -0
  262. package/dist/cli/ui/spinner.js.map +1 -0
  263. package/dist/cli/ui/time.d.ts +54 -0
  264. package/dist/cli/ui/time.d.ts.map +1 -0
  265. package/dist/cli/ui/time.js +119 -0
  266. package/dist/cli/ui/time.js.map +1 -0
  267. package/dist/client/api-client.d.ts +123 -0
  268. package/dist/client/api-client.d.ts.map +1 -0
  269. package/dist/client/api-client.js +105 -0
  270. package/dist/client/api-client.js.map +1 -0
  271. package/dist/client/cli-client.d.ts +26 -0
  272. package/dist/client/cli-client.d.ts.map +1 -0
  273. package/dist/client/cli-client.js +20 -0
  274. package/dist/client/cli-client.js.map +1 -0
  275. package/dist/config/index.d.ts +78 -0
  276. package/dist/config/index.d.ts.map +1 -0
  277. package/dist/config/index.js +79 -0
  278. package/dist/config/index.js.map +1 -0
  279. package/dist/index.d.ts +16 -0
  280. package/dist/index.d.ts.map +1 -0
  281. package/dist/index.js +73 -0
  282. package/dist/index.js.map +1 -0
  283. package/dist/lib/format.d.ts +126 -0
  284. package/dist/lib/format.d.ts.map +1 -0
  285. package/dist/lib/format.js +71 -0
  286. package/dist/lib/format.js.map +1 -0
  287. package/dist/lib/index.d.ts +11 -0
  288. package/dist/lib/index.d.ts.map +1 -0
  289. package/dist/lib/index.js +45 -0
  290. package/dist/lib/index.js.map +1 -0
  291. package/dist/lib/monorepo-detector.d.ts +31 -0
  292. package/dist/lib/monorepo-detector.d.ts.map +1 -0
  293. package/dist/lib/monorepo-detector.js +188 -0
  294. package/dist/lib/monorepo-detector.js.map +1 -0
  295. package/dist/lib/prompt-generator.d.ts +65 -0
  296. package/dist/lib/prompt-generator.d.ts.map +1 -0
  297. package/dist/lib/prompt-generator.js +162 -0
  298. package/dist/lib/prompt-generator.js.map +1 -0
  299. package/dist/lib/strategy-analyzer.d.ts +59 -0
  300. package/dist/lib/strategy-analyzer.d.ts.map +1 -0
  301. package/dist/lib/strategy-analyzer.js +91 -0
  302. package/dist/lib/strategy-analyzer.js.map +1 -0
  303. package/dist/lib/workflow-definitions.d.ts +41 -0
  304. package/dist/lib/workflow-definitions.d.ts.map +1 -0
  305. package/dist/lib/workflow-definitions.js +497 -0
  306. package/dist/lib/workflow-definitions.js.map +1 -0
  307. package/dist/patterns/index.d.ts +9 -0
  308. package/dist/patterns/index.d.ts.map +1 -0
  309. package/dist/patterns/index.js +21 -0
  310. package/dist/patterns/index.js.map +1 -0
  311. package/dist/patterns/inheritance.d.ts +193 -0
  312. package/dist/patterns/inheritance.d.ts.map +1 -0
  313. package/dist/patterns/inheritance.js +125 -0
  314. package/dist/patterns/inheritance.js.map +1 -0
  315. package/dist/server.d.ts +44 -0
  316. package/dist/server.d.ts.map +1 -0
  317. package/dist/server.js +91 -0
  318. package/dist/server.js.map +1 -0
  319. package/dist/tools/core/context-helper.d.ts +50 -0
  320. package/dist/tools/core/context-helper.d.ts.map +1 -0
  321. package/dist/tools/core/context-helper.js +49 -0
  322. package/dist/tools/core/context-helper.js.map +1 -0
  323. package/dist/tools/core/index.d.ts +2 -0
  324. package/dist/tools/core/index.d.ts.map +1 -0
  325. package/dist/tools/core/index.js +2 -0
  326. package/dist/tools/core/index.js.map +1 -0
  327. package/dist/tools/index.d.ts +58 -0
  328. package/dist/tools/index.d.ts.map +1 -0
  329. package/dist/tools/index.js +1499 -0
  330. package/dist/tools/index.js.map +1 -0
  331. package/dist/transport/__tests__/resolve-endpoint.test.d.ts +6 -0
  332. package/dist/transport/__tests__/resolve-endpoint.test.d.ts.map +1 -0
  333. package/dist/transport/index.d.ts +6 -0
  334. package/dist/transport/index.d.ts.map +1 -0
  335. package/dist/transport/index.js +5 -0
  336. package/dist/transport/index.js.map +1 -0
  337. package/dist/transport/interface.d.ts +25 -0
  338. package/dist/transport/interface.d.ts.map +1 -0
  339. package/dist/transport/interface.js +1 -0
  340. package/dist/transport/interface.js.map +1 -0
  341. package/dist/transport/remote.d.ts +38 -0
  342. package/dist/transport/remote.d.ts.map +1 -0
  343. package/dist/transport/remote.js +107 -0
  344. package/dist/transport/remote.js.map +1 -0
  345. package/dist/transport/resolve-endpoint.d.ts +58 -0
  346. package/dist/transport/resolve-endpoint.d.ts.map +1 -0
  347. package/dist/transport/resolve-endpoint.js +146 -0
  348. package/dist/transport/resolve-endpoint.js.map +1 -0
  349. package/dist/types/index.d.ts +212 -0
  350. package/dist/types/index.d.ts.map +1 -0
  351. package/dist/types/index.js +16 -0
  352. package/dist/types/index.js.map +1 -0
  353. package/dist/validation/index.d.ts +86 -0
  354. package/dist/validation/index.d.ts.map +1 -0
  355. package/dist/validation/index.js +392 -0
  356. package/dist/validation/index.js.map +1 -0
  357. package/dist/validation/ticket-validation.d.ts +162 -0
  358. package/dist/validation/ticket-validation.d.ts.map +1 -0
  359. package/dist/validation/ticket-validation.js +188 -0
  360. package/dist/validation/ticket-validation.js.map +1 -0
  361. package/package.json +69 -0
  362. package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +165 -0
  363. package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +348 -0
  364. package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +259 -0
  365. package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +132 -0
  366. package/src/cli/templates/agents/index.ts +47 -0
  367. package/src/cli/templates/commands.ts +90 -0
  368. package/src/cli/templates/content/sf-blockers.ts +71 -0
  369. package/src/cli/templates/content/sf-commit.ts +81 -0
  370. package/src/cli/templates/content/sf-context.ts +65 -0
  371. package/src/cli/templates/content/sf-help.ts +44 -0
  372. package/src/cli/templates/content/sf-init.ts +64 -0
  373. package/src/cli/templates/content/sf-reset.ts +69 -0
  374. package/src/cli/templates/content/sf-search.ts +65 -0
  375. package/src/cli/templates/content/sf-status.ts +64 -0
  376. package/src/cli/templates/index.ts +16 -0
  377. package/src/cli/templates/skills/specforge-conventions.md +114 -0
  378. package/src/cli/templates/skills/specforge-orchestrator.md +409 -0
  379. package/src/cli/templates/skills/specforge-validator.md +128 -0
  380. package/src/cli/templates/skills/specforge-worker.md +412 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/commands/debug/call.ts"],"sourcesContent":["/**\n * Call Command Implementation\n *\n * Allows directly calling MCP tools with JSON arguments, useful for testing\n * and debugging.\n */\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { resolveConfig } from '../../config/index.js';\nimport { colors } from '../../ui/colors.js';\nimport { ApiClient } from '../../../client/api-client.js';\nimport { handleToolCall } from '../../../tools/index.js';\nimport type { CallOptions } from './types.js';\n\n/**\n * Parse JSON arguments safely\n */\nfunction parseArgs(argsString: string | undefined): Record<string, unknown> {\n if (!argsString) {\n return {};\n }\n\n try {\n return JSON.parse(argsString);\n } catch (error) {\n throw new Error(\n `Invalid JSON in --args. Example: --args='{\"ticketId\": \"abc123\"}'`\n );\n }\n}\n\n/**\n * Format response as TOON\n */\nfunction formatToon(response: unknown): string {\n if (typeof response === 'object' && response !== null) {\n const lines: string[] = ['@response'];\n const entries = Object.entries(response);\n for (const [key, value] of entries) {\n if (typeof value === 'object' && value !== null) {\n lines.push(` ${key}: ${JSON.stringify(value)}`);\n } else {\n lines.push(` ${key}: ${value}`);\n }\n }\n return lines.join('\\n');\n }\n return String(response);\n}\n\n/**\n * Format output based on options\n */\nfunction formatOutput(response: unknown, options: CallOptions): string {\n if (options.raw) {\n return typeof response === 'string' ? response : JSON.stringify(response);\n }\n\n if (options.format === 'toon') {\n return formatToon(response);\n }\n\n // Default to formatted JSON\n return JSON.stringify(response, null, 2);\n}\n\n/**\n * Call command implementation\n *\n * Directly calls an MCP tool with optional JSON arguments.\n */\nexport async function callCommand(tool: string, options: CallOptions): Promise<void> {\n // Validate tool name\n if (!tool) {\n console.error(colors.error('\\nError: Tool name is required.'));\n console.error(\"Usage: specforge call <tool> --args='{\\\"key\\\": \\\"value\\\"}'\");\n process.exit(1);\n }\n\n const config = resolveConfig();\n\n // Parse arguments\n let args: Record<string, unknown>;\n try {\n args = parseArgs(options.args);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid JSON';\n console.error(colors.error(`\\nError: ${message}`));\n process.exit(1);\n }\n\n const spinner = ora(`Calling ${tool}...`).start();\n\n try {\n if (!config.apiKey) {\n spinner.fail('Not authenticated');\n console.error(colors.error('\\nError: Not authenticated.'));\n console.error(colors.muted('Run `specforge login` to authenticate first.'));\n process.exit(1);\n }\n\n const client = new ApiClient({\n apiKey: config.apiKey,\n apiUrl: config.apiUrl,\n debug: config.debug,\n });\n\n // Use handleToolCall to route through MCP tool dispatcher\n // This handles local tools (workflow_guide, feedback, blueprint) properly\n // while forwarding backend tools to the API\n const response = await handleToolCall(client, tool, args, config.debug);\n\n spinner.stop();\n\n // Format and display output\n const output = formatOutput(response, options);\n console.log(output);\n } catch (error) {\n spinner.fail(`Failed to call ${tool}`);\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Provide helpful error messages\n if (message.includes('Unknown tool') || message.includes('not found')) {\n console.error(colors.error(`\\nError: Unknown tool \"${tool}\".`));\n console.error(colors.muted(\"Run 'specforge tools' to see available tools.\"));\n } else if (message.includes('required')) {\n console.error(colors.error(`\\nError: ${message}`));\n console.error(colors.muted('Check the tool requires specific arguments.'));\n } else {\n console.error(colors.error(`\\nError: ${message}`));\n }\n\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Debug Command Module
3
+ *
4
+ * Exports all debug command types and utilities.
5
+ */
6
+ export * from './types.js';
7
+ export { callCommand } from './call.js';
8
+ export { toolsCommand } from './tools.js';
9
+ export { testCommand } from './test.js';
10
+ export { whoamiCommand } from './whoami.js';
11
+ export { registerDebugCommands } from './register.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/debug/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,14 @@
1
+ export * from "./types.js";
2
+ import { callCommand } from "./call.js";
3
+ import { toolsCommand } from "./tools.js";
4
+ import { testCommand } from "./test.js";
5
+ import { whoamiCommand } from "./whoami.js";
6
+ import { registerDebugCommands } from "./register.js";
7
+ export {
8
+ callCommand,
9
+ registerDebugCommands,
10
+ testCommand,
11
+ toolsCommand,
12
+ whoamiCommand
13
+ };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/commands/debug/index.ts"],"sourcesContent":["/**\n * Debug Command Module\n *\n * Exports all debug command types and utilities.\n */\n\nexport * from './types.js';\nexport { callCommand } from './call.js';\nexport { toolsCommand } from './tools.js';\nexport { testCommand } from './test.js';\nexport { whoamiCommand } from './whoami.js';\nexport { registerDebugCommands } from './register.js';\n"],"mappings":"AAMA,cAAc;AACd,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;","names":[]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Debug Command Registration
3
+ *
4
+ * Registers all debug commands with the CLI framework.
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Register all debug commands with the CLI
9
+ */
10
+ export declare function registerDebugCommands(program: Command): void;
11
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/debug/register.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkG5D"}
@@ -0,0 +1,78 @@
1
+ import { withErrorHandler } from "../../middleware/error-handler.js";
2
+ import { callCommand } from "./call.js";
3
+ import { toolsCommand } from "./tools.js";
4
+ import { testCommand } from "./test.js";
5
+ import { whoamiCommand } from "./whoami.js";
6
+ function registerDebugCommands(program) {
7
+ program.command("call <tool>").description("Directly call an MCP tool").option("--args <json>", "Tool arguments as JSON").option("--format <format>", "Output format (json, toon)", "json").option("--raw", "Show raw API response").addHelpText(
8
+ "after",
9
+ `
10
+ Examples:
11
+ $ specforge call list_projects
12
+ $ specforge call get_ticket --args='{"ticketId":"abc123"}'
13
+ $ specforge call list_tickets --format toon
14
+ $ specforge call get_specification --args='{"specificationId":"spec-1"}' --raw
15
+
16
+ The call command allows you to directly invoke MCP tools with JSON arguments.
17
+ This is useful for testing, debugging, and scripting. Output can be formatted
18
+ as JSON (default), TOON, or raw API response.
19
+ `
20
+ ).action(
21
+ withErrorHandler(async (tool, options) => {
22
+ await callCommand(tool, options);
23
+ })
24
+ );
25
+ program.command("tools").description("List available MCP tools").option("--category <category>", "Filter by category").option("--search <query>", "Search tool names/descriptions").option("--json", "Output as JSON").addHelpText(
26
+ "after",
27
+ `
28
+ Examples:
29
+ $ specforge tools
30
+ $ specforge tools --category context
31
+ $ specforge tools --search ticket
32
+ $ specforge tools --json
33
+
34
+ The tools command lists all available MCP tools grouped by category.
35
+ Use filters to narrow down the list. This command doesn't require
36
+ authentication since it lists locally defined tools.
37
+ `
38
+ ).action(
39
+ withErrorHandler(async (options) => {
40
+ await toolsCommand(options);
41
+ })
42
+ );
43
+ program.command("test").description("Test API connection and authentication").addHelpText(
44
+ "after",
45
+ `
46
+ Examples:
47
+ $ specforge test
48
+
49
+ The test command verifies your API connection and authentication.
50
+ It displays response time, user information, and accessible projects.
51
+ Helpful error messages are provided for common connection issues.
52
+ `
53
+ ).action(
54
+ withErrorHandler(async () => {
55
+ await testCommand();
56
+ })
57
+ );
58
+ program.command("whoami").description("Show current user and configuration").option("--json", "Output as JSON").addHelpText(
59
+ "after",
60
+ `
61
+ Examples:
62
+ $ specforge whoami
63
+ $ specforge whoami --json
64
+
65
+ The whoami command displays your current user information, configuration
66
+ settings, and config file paths. Useful for debugging authentication and
67
+ configuration issues.
68
+ `
69
+ ).action(
70
+ withErrorHandler(async (options) => {
71
+ await whoamiCommand(options);
72
+ })
73
+ );
74
+ }
75
+ export {
76
+ registerDebugCommands
77
+ };
78
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/commands/debug/register.ts"],"sourcesContent":["/**\n * Debug Command Registration\n *\n * Registers all debug commands with the CLI framework.\n */\n\nimport { Command } from 'commander';\nimport { withErrorHandler } from '../../middleware/error-handler.js';\nimport { callCommand } from './call.js';\nimport { toolsCommand } from './tools.js';\nimport { testCommand } from './test.js';\nimport { whoamiCommand } from './whoami.js';\nimport type { CallOptions, ToolsOptions, WhoamiOptions } from './types.js';\n\n/**\n * Register all debug commands with the CLI\n */\nexport function registerDebugCommands(program: Command): void {\n // Call command - directly call MCP tools\n program\n .command('call <tool>')\n .description('Directly call an MCP tool')\n .option('--args <json>', 'Tool arguments as JSON')\n .option('--format <format>', 'Output format (json, toon)', 'json')\n .option('--raw', 'Show raw API response')\n .addHelpText(\n 'after',\n `\nExamples:\n $ specforge call list_projects\n $ specforge call get_ticket --args='{\"ticketId\":\"abc123\"}'\n $ specforge call list_tickets --format toon\n $ specforge call get_specification --args='{\"specificationId\":\"spec-1\"}' --raw\n\nThe call command allows you to directly invoke MCP tools with JSON arguments.\nThis is useful for testing, debugging, and scripting. Output can be formatted\nas JSON (default), TOON, or raw API response.\n`\n )\n .action(\n withErrorHandler(async (tool: string, options: CallOptions) => {\n await callCommand(tool, options);\n })\n );\n\n // Tools command - list available MCP tools\n program\n .command('tools')\n .description('List available MCP tools')\n .option('--category <category>', 'Filter by category')\n .option('--search <query>', 'Search tool names/descriptions')\n .option('--json', 'Output as JSON')\n .addHelpText(\n 'after',\n `\nExamples:\n $ specforge tools\n $ specforge tools --category context\n $ specforge tools --search ticket\n $ specforge tools --json\n\nThe tools command lists all available MCP tools grouped by category.\nUse filters to narrow down the list. This command doesn't require\nauthentication since it lists locally defined tools.\n`\n )\n .action(\n withErrorHandler(async (options: ToolsOptions) => {\n await toolsCommand(options);\n })\n );\n\n // Test command - test API connection\n program\n .command('test')\n .description('Test API connection and authentication')\n .addHelpText(\n 'after',\n `\nExamples:\n $ specforge test\n\nThe test command verifies your API connection and authentication.\nIt displays response time, user information, and accessible projects.\nHelpful error messages are provided for common connection issues.\n`\n )\n .action(\n withErrorHandler(async () => {\n await testCommand();\n })\n );\n\n // Whoami command - show current user and config\n program\n .command('whoami')\n .description('Show current user and configuration')\n .option('--json', 'Output as JSON')\n .addHelpText(\n 'after',\n `\nExamples:\n $ specforge whoami\n $ specforge whoami --json\n\nThe whoami command displays your current user information, configuration\nsettings, and config file paths. Useful for debugging authentication and\nconfiguration issues.\n`\n )\n .action(\n withErrorHandler(async (options: WhoamiOptions) => {\n await whoamiCommand(options);\n })\n );\n}\n"],"mappings":"AAOA,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAMvB,SAAS,sBAAsB,SAAwB;AAE5D,UACG,QAAQ,aAAa,EACrB,YAAY,2BAA2B,EACvC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,qBAAqB,8BAA8B,MAAM,EAChE,OAAO,SAAS,uBAAuB,EACvC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EACC;AAAA,IACC,iBAAiB,OAAO,MAAc,YAAyB;AAC7D,YAAM,YAAY,MAAM,OAAO;AAAA,IACjC,CAAC;AAAA,EACH;AAGF,UACG,QAAQ,OAAO,EACf,YAAY,0BAA0B,EACtC,OAAO,yBAAyB,oBAAoB,EACpD,OAAO,oBAAoB,gCAAgC,EAC3D,OAAO,UAAU,gBAAgB,EACjC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EACC;AAAA,IACC,iBAAiB,OAAO,YAA0B;AAChD,YAAM,aAAa,OAAO;AAAA,IAC5B,CAAC;AAAA,EACH;AAGF,UACG,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,EACC;AAAA,IACC,iBAAiB,YAAY;AAC3B,YAAM,YAAY;AAAA,IACpB,CAAC;AAAA,EACH;AAGF,UACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,UAAU,gBAAgB,EACjC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,EACC;AAAA,IACC,iBAAiB,OAAO,YAA2B;AACjD,YAAM,cAAc,OAAO;AAAA,IAC7B,CAAC;AAAA,EACH;AACJ;","names":[]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Test Command Implementation
3
+ *
4
+ * Tests the API connection and authentication, displaying connection status,
5
+ * response time, and user information.
6
+ */
7
+ /**
8
+ * Test command implementation
9
+ *
10
+ * Tests the API connection and authentication.
11
+ */
12
+ export declare function testCommand(): Promise<void>;
13
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/debug/test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+EH;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6CjD"}
@@ -0,0 +1,91 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { resolveConfig } from "../../config/index.js";
4
+ import { createCliClient } from "../../../client/cli-client.js";
5
+ import { CHANNEL } from "../../../channel.js";
6
+ function maskApiKey(apiKey) {
7
+ if (apiKey.length < 12) {
8
+ return "****";
9
+ }
10
+ return `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`;
11
+ }
12
+ function displayTestHeader(apiUrl, apiKey) {
13
+ console.log(chalk.bold("\nTesting SpecForge API connection..."));
14
+ console.log();
15
+ console.log(`Endpoint: ${chalk.cyan(apiUrl)}`);
16
+ console.log(`API Key: ${chalk.cyan(maskApiKey(apiKey))} (valid format)`);
17
+ console.log();
18
+ }
19
+ function displaySuccess(result) {
20
+ console.log(chalk.green(`\u2713 Connection successful (${result.responseTime}ms)`));
21
+ console.log(chalk.green("\u2713 Authentication valid"));
22
+ if (result.userEmail) {
23
+ console.log(chalk.green(`\u2713 User: ${result.userEmail}`));
24
+ }
25
+ if (result.projectCount !== void 0) {
26
+ console.log(chalk.green(`\u2713 Projects accessible: ${result.projectCount}`));
27
+ }
28
+ console.log();
29
+ }
30
+ function displayFailure(error) {
31
+ if (error.includes("401") || error.includes("Unauthorized")) {
32
+ console.log(chalk.red("\u2717 Authentication failed: Invalid API key"));
33
+ console.log(chalk.dim("\nCheck your API key:"));
34
+ console.log(chalk.dim(' - Run "specforge login" to authenticate'));
35
+ console.log(chalk.dim(" - Or set SPECFORGE_API_KEY environment variable"));
36
+ } else if (error.includes("ENOTFOUND") || error.includes("ECONNREFUSED")) {
37
+ console.log(chalk.red("\u2717 Connection failed: Could not reach API"));
38
+ console.log(chalk.dim("\nCheck your network connection:"));
39
+ console.log(chalk.dim(" - Verify internet connectivity"));
40
+ console.log(chalk.dim(" - Check if API URL is correct"));
41
+ } else if (error.includes("timeout") || error.includes("ETIMEDOUT")) {
42
+ console.log(chalk.red("\u2717 Connection timeout"));
43
+ console.log(chalk.dim("\nThe API took too long to respond:"));
44
+ console.log(chalk.dim(" - Check your network speed"));
45
+ console.log(chalk.dim(" - Try again later"));
46
+ } else if (error.includes("certificate") || error.includes("SSL")) {
47
+ console.log(chalk.red("\u2717 SSL/TLS error"));
48
+ console.log(chalk.dim("\nThere was a certificate issue:"));
49
+ console.log(chalk.dim(" - Check your system time is correct"));
50
+ console.log(chalk.dim(" - Your network may be blocking secure connections"));
51
+ } else {
52
+ console.log(chalk.red(`\u2717 Error: ${error}`));
53
+ }
54
+ console.log();
55
+ }
56
+ async function testCommand() {
57
+ const config = resolveConfig();
58
+ const apiUrl = process.env.SPECFORGE_API_URL || CHANNEL.endpoint.primary;
59
+ displayTestHeader(apiUrl, config.apiKey);
60
+ const spinner = ora("Testing connection...").start();
61
+ try {
62
+ const startTime = Date.now();
63
+ const client = createCliClient({
64
+ apiKey: config.apiKey,
65
+ apiUrl,
66
+ debug: config.debug
67
+ });
68
+ const userResponse = await client.call("get_current_user", {});
69
+ const userEmail = userResponse.email || "Unknown";
70
+ const response = await client.call("list_projects", {});
71
+ const elapsed = Date.now() - startTime;
72
+ spinner.stop();
73
+ const projects = response.projects || [];
74
+ const result = {
75
+ success: true,
76
+ responseTime: elapsed,
77
+ userEmail,
78
+ projectCount: projects.length
79
+ };
80
+ displaySuccess(result);
81
+ } catch (error) {
82
+ spinner.stop();
83
+ const message = error instanceof Error ? error.message : "Unknown error";
84
+ displayFailure(message);
85
+ process.exit(1);
86
+ }
87
+ }
88
+ export {
89
+ testCommand
90
+ };
91
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/commands/debug/test.ts"],"sourcesContent":["/**\n * Test Command Implementation\n *\n * Tests the API connection and authentication, displaying connection status,\n * response time, and user information.\n */\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { resolveConfig } from '../../config/index.js';\nimport { createCliClient } from '../../../client/cli-client.js';\nimport { CHANNEL } from '../../../channel.js';\nimport type { TestResult } from './types.js';\n\n/**\n * Mask API key for display\n */\nfunction maskApiKey(apiKey: string): string {\n if (apiKey.length < 12) {\n return '****';\n }\n return `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`;\n}\n\n/**\n * Display test header with configuration\n */\nfunction displayTestHeader(apiUrl: string, apiKey: string): void {\n console.log(chalk.bold('\\nTesting SpecForge API connection...'));\n console.log();\n console.log(`Endpoint: ${chalk.cyan(apiUrl)}`);\n console.log(`API Key: ${chalk.cyan(maskApiKey(apiKey))} (valid format)`);\n console.log();\n}\n\n/**\n * Display successful test results\n */\nfunction displaySuccess(result: TestResult): void {\n console.log(chalk.green(`✓ Connection successful (${result.responseTime}ms)`));\n console.log(chalk.green('✓ Authentication valid'));\n\n if (result.userEmail) {\n console.log(chalk.green(`✓ User: ${result.userEmail}`));\n }\n\n if (result.projectCount !== undefined) {\n console.log(chalk.green(`✓ Projects accessible: ${result.projectCount}`));\n }\n\n console.log();\n}\n\n/**\n * Display connection failure\n */\nfunction displayFailure(error: string): void {\n if (error.includes('401') || error.includes('Unauthorized')) {\n console.log(chalk.red('✗ Authentication failed: Invalid API key'));\n console.log(chalk.dim('\\nCheck your API key:'));\n console.log(chalk.dim(' - Run \"specforge login\" to authenticate'));\n console.log(chalk.dim(' - Or set SPECFORGE_API_KEY environment variable'));\n } else if (error.includes('ENOTFOUND') || error.includes('ECONNREFUSED')) {\n console.log(chalk.red('✗ Connection failed: Could not reach API'));\n console.log(chalk.dim('\\nCheck your network connection:'));\n console.log(chalk.dim(' - Verify internet connectivity'));\n console.log(chalk.dim(' - Check if API URL is correct'));\n } else if (error.includes('timeout') || error.includes('ETIMEDOUT')) {\n console.log(chalk.red('✗ Connection timeout'));\n console.log(chalk.dim('\\nThe API took too long to respond:'));\n console.log(chalk.dim(' - Check your network speed'));\n console.log(chalk.dim(' - Try again later'));\n } else if (error.includes('certificate') || error.includes('SSL')) {\n console.log(chalk.red('✗ SSL/TLS error'));\n console.log(chalk.dim('\\nThere was a certificate issue:'));\n console.log(chalk.dim(' - Check your system time is correct'));\n console.log(chalk.dim(' - Your network may be blocking secure connections'));\n } else {\n console.log(chalk.red(`✗ Error: ${error}`));\n }\n\n console.log();\n}\n\n/**\n * Test command implementation\n *\n * Tests the API connection and authentication.\n */\nexport async function testCommand(): Promise<void> {\n const config = resolveConfig();\n const apiUrl = process.env.SPECFORGE_API_URL || CHANNEL.endpoint.primary;\n\n // Display header\n displayTestHeader(apiUrl, config.apiKey!);\n\n const spinner = ora('Testing connection...').start();\n\n try {\n const startTime = Date.now();\n\n const client = createCliClient({\n apiKey: config.apiKey!,\n apiUrl,\n debug: config.debug,\n });\n\n // Get user info first\n const userResponse = await client.call('get_current_user', {}) as { email?: string };\n const userEmail = userResponse.email || 'Unknown';\n\n // Test with list_projects\n const response = await client.call('list_projects', {});\n const elapsed = Date.now() - startTime;\n\n spinner.stop();\n\n const projects = (response as { projects?: unknown[] }).projects || [];\n\n const result: TestResult = {\n success: true,\n responseTime: elapsed,\n userEmail,\n projectCount: projects.length,\n };\n\n displaySuccess(result);\n\n } catch (error) {\n spinner.stop();\n const message = error instanceof Error ? error.message : 'Unknown error';\n displayFailure(message);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tools Command Implementation
3
+ *
4
+ * Lists all available MCP tools with filtering and search capabilities.
5
+ */
6
+ import type { ToolsOptions } from './types.js';
7
+ /**
8
+ * Tools command implementation
9
+ *
10
+ * Lists all available MCP tools with filtering and search.
11
+ */
12
+ export declare function toolsCommand(options: ToolsOptions): Promise<void>;
13
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/debug/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AAkGzD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCvE"}
@@ -0,0 +1,86 @@
1
+ import chalk from "chalk";
2
+ import { getTools } from "../../../tools/index.js";
3
+ import { TOOL_CATEGORIES as categories } from "./types.js";
4
+ function getToolCategory(toolName) {
5
+ for (const [category, toolNames] of Object.entries(categories)) {
6
+ if (toolNames.includes(toolName)) {
7
+ return category;
8
+ }
9
+ }
10
+ return "Other";
11
+ }
12
+ function buildToolList() {
13
+ const tools = getTools();
14
+ return tools.map((tool) => ({
15
+ name: tool.name,
16
+ description: tool.description || "",
17
+ category: getToolCategory(tool.name)
18
+ }));
19
+ }
20
+ function filterByCategory(toolList, category) {
21
+ return toolList.filter(
22
+ (t) => t.category.toLowerCase().includes(category.toLowerCase())
23
+ );
24
+ }
25
+ function filterBySearch(toolList, search) {
26
+ const searchLower = search.toLowerCase();
27
+ return toolList.filter(
28
+ (t) => t.name.toLowerCase().includes(searchLower) || t.description.toLowerCase().includes(searchLower)
29
+ );
30
+ }
31
+ function groupByCategory(toolList) {
32
+ const grouped = {};
33
+ for (const tool of toolList) {
34
+ if (!grouped[tool.category]) {
35
+ grouped[tool.category] = [];
36
+ }
37
+ grouped[tool.category].push(tool);
38
+ }
39
+ return grouped;
40
+ }
41
+ function displayTools(byCategory, total) {
42
+ console.log(chalk.bold("\nAvailable MCP Tools"));
43
+ console.log("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n");
44
+ const sortedCategories = Object.keys(byCategory).sort();
45
+ for (const category of sortedCategories) {
46
+ const categoryTools = byCategory[category];
47
+ console.log(chalk.bold(category));
48
+ for (const tool of categoryTools) {
49
+ const desc = tool.description.length > 50 ? tool.description.slice(0, 47) + "..." : tool.description;
50
+ console.log(` ${chalk.cyan(tool.name.padEnd(30))} ${chalk.dim(desc)}`);
51
+ }
52
+ console.log();
53
+ }
54
+ console.log(chalk.dim(`(${total} tools total)
55
+ `));
56
+ }
57
+ async function toolsCommand(options) {
58
+ let toolList = buildToolList();
59
+ if (options.category) {
60
+ toolList = filterByCategory(toolList, options.category);
61
+ }
62
+ if (options.search) {
63
+ toolList = filterBySearch(toolList, options.search);
64
+ }
65
+ if (options.json) {
66
+ console.log(JSON.stringify({ tools: toolList }, null, 2));
67
+ return;
68
+ }
69
+ if (toolList.length === 0) {
70
+ console.log(chalk.yellow("\nNo tools found matching your filters."));
71
+ if (options.category) {
72
+ console.log(chalk.dim(`Category filter: "${options.category}"`));
73
+ }
74
+ if (options.search) {
75
+ console.log(chalk.dim(`Search filter: "${options.search}"`));
76
+ }
77
+ console.log(chalk.dim('\nRun "specforge tools" without filters to see all tools.'));
78
+ return;
79
+ }
80
+ const byCategory = groupByCategory(toolList);
81
+ displayTools(byCategory, toolList.length);
82
+ }
83
+ export {
84
+ toolsCommand
85
+ };
86
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/commands/debug/tools.ts"],"sourcesContent":["/**\n * Tools Command Implementation\n *\n * Lists all available MCP tools with filtering and search capabilities.\n */\n\nimport chalk from 'chalk';\nimport { getTools } from '../../../tools/index.js';\nimport type { ToolsOptions, ToolInfo } from './types.js';\nimport { TOOL_CATEGORIES as categories } from './types.js';\n\n/**\n * Get category for a tool\n */\nfunction getToolCategory(toolName: string): string {\n for (const [category, toolNames] of Object.entries(categories)) {\n if (toolNames.includes(toolName)) {\n return category;\n }\n }\n return 'Other';\n}\n\n/**\n * Build tool list from MCP tools registry\n */\nfunction buildToolList(): ToolInfo[] {\n const tools = getTools();\n return tools.map(tool => ({\n name: tool.name,\n description: tool.description || '',\n category: getToolCategory(tool.name),\n }));\n}\n\n/**\n * Filter tools by category\n */\nfunction filterByCategory(\n toolList: ToolInfo[],\n category: string\n): ToolInfo[] {\n return toolList.filter(t =>\n t.category.toLowerCase().includes(category.toLowerCase())\n );\n}\n\n/**\n * Filter tools by search query\n */\nfunction filterBySearch(\n toolList: ToolInfo[],\n search: string\n): ToolInfo[] {\n const searchLower = search.toLowerCase();\n return toolList.filter(t =>\n t.name.toLowerCase().includes(searchLower) ||\n t.description.toLowerCase().includes(searchLower)\n );\n}\n\n/**\n * Group tools by category\n */\nfunction groupByCategory(toolList: ToolInfo[]): Record<string, ToolInfo[]> {\n const grouped: Record<string, ToolInfo[]> = {};\n\n for (const tool of toolList) {\n if (!grouped[tool.category]) {\n grouped[tool.category] = [];\n }\n grouped[tool.category].push(tool);\n }\n\n return grouped;\n}\n\n/**\n * Display tools in formatted output\n */\nfunction displayTools(byCategory: Record<string, ToolInfo[]>, total: number): void {\n console.log(chalk.bold('\\nAvailable MCP Tools'));\n console.log('═══════════════════\\n');\n\n // Sort categories for consistent display\n const sortedCategories = Object.keys(byCategory).sort();\n\n for (const category of sortedCategories) {\n const categoryTools = byCategory[category];\n console.log(chalk.bold(category));\n\n for (const tool of categoryTools) {\n // Truncate long descriptions\n const desc = tool.description.length > 50\n ? tool.description.slice(0, 47) + '...'\n : tool.description;\n\n console.log(` ${chalk.cyan(tool.name.padEnd(30))} ${chalk.dim(desc)}`);\n }\n\n console.log();\n }\n\n console.log(chalk.dim(`(${total} tools total)\\n`));\n}\n\n/**\n * Tools command implementation\n *\n * Lists all available MCP tools with filtering and search.\n */\nexport async function toolsCommand(options: ToolsOptions): Promise<void> {\n // Build tool list from registry\n let toolList = buildToolList();\n\n // Apply category filter\n if (options.category) {\n toolList = filterByCategory(toolList, options.category);\n }\n\n // Apply search filter\n if (options.search) {\n toolList = filterBySearch(toolList, options.search);\n }\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify({ tools: toolList }, null, 2));\n return;\n }\n\n // Check if any tools match\n if (toolList.length === 0) {\n console.log(chalk.yellow('\\nNo tools found matching your filters.'));\n\n if (options.category) {\n console.log(chalk.dim(`Category filter: \"${options.category}\"`));\n }\n if (options.search) {\n console.log(chalk.dim(`Search filter: \"${options.search}\"`));\n }\n\n console.log(chalk.dim('\\nRun \"specforge tools\" without filters to see all tools.'));\n return;\n }\n\n // Group and display\n const byCategory = groupByCategory(toolList);\n displayTools(byCategory, toolList.length);\n}\n"],"mappings":"AAMA,OAAO,WAAW;AAClB,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB,kBAAkB;AAK9C,SAAS,gBAAgB,UAA0B;AACjD,aAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,QAAI,UAAU,SAAS,QAAQ,GAAG;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,gBAA4B;AACnC,QAAM,QAAQ,SAAS;AACvB,SAAO,MAAM,IAAI,WAAS;AAAA,IACxB,MAAM,KAAK;AAAA,IACX,aAAa,KAAK,eAAe;AAAA,IACjC,UAAU,gBAAgB,KAAK,IAAI;AAAA,EACrC,EAAE;AACJ;AAKA,SAAS,iBACP,UACA,UACY;AACZ,SAAO,SAAS;AAAA,IAAO,OACrB,EAAE,SAAS,YAAY,EAAE,SAAS,SAAS,YAAY,CAAC;AAAA,EAC1D;AACF;AAKA,SAAS,eACP,UACA,QACY;AACZ,QAAM,cAAc,OAAO,YAAY;AACvC,SAAO,SAAS;AAAA,IAAO,OACrB,EAAE,KAAK,YAAY,EAAE,SAAS,WAAW,KACzC,EAAE,YAAY,YAAY,EAAE,SAAS,WAAW;AAAA,EAClD;AACF;AAKA,SAAS,gBAAgB,UAAkD;AACzE,QAAM,UAAsC,CAAC;AAE7C,aAAW,QAAQ,UAAU;AAC3B,QAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG;AAC3B,cAAQ,KAAK,QAAQ,IAAI,CAAC;AAAA,IAC5B;AACA,YAAQ,KAAK,QAAQ,EAAE,KAAK,IAAI;AAAA,EAClC;AAEA,SAAO;AACT;AAKA,SAAS,aAAa,YAAwC,OAAqB;AACjF,UAAQ,IAAI,MAAM,KAAK,uBAAuB,CAAC;AAC/C,UAAQ,IAAI,sHAAuB;AAGnC,QAAM,mBAAmB,OAAO,KAAK,UAAU,EAAE,KAAK;AAEtD,aAAW,YAAY,kBAAkB;AACvC,UAAM,gBAAgB,WAAW,QAAQ;AACzC,YAAQ,IAAI,MAAM,KAAK,QAAQ,CAAC;AAEhC,eAAW,QAAQ,eAAe;AAEhC,YAAM,OAAO,KAAK,YAAY,SAAS,KACnC,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,QAChC,KAAK;AAET,cAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,EAAE;AAAA,IACxE;AAEA,YAAQ,IAAI;AAAA,EACd;AAEA,UAAQ,IAAI,MAAM,IAAI,IAAI,KAAK;AAAA,CAAiB,CAAC;AACnD;AAOA,eAAsB,aAAa,SAAsC;AAEvE,MAAI,WAAW,cAAc;AAG7B,MAAI,QAAQ,UAAU;AACpB,eAAW,iBAAiB,UAAU,QAAQ,QAAQ;AAAA,EACxD;AAGA,MAAI,QAAQ,QAAQ;AAClB,eAAW,eAAe,UAAU,QAAQ,MAAM;AAAA,EACpD;AAGA,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,GAAG,MAAM,CAAC,CAAC;AACxD;AAAA,EACF;AAGA,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,MAAM,OAAO,yCAAyC,CAAC;AAEnE,QAAI,QAAQ,UAAU;AACpB,cAAQ,IAAI,MAAM,IAAI,qBAAqB,QAAQ,QAAQ,GAAG,CAAC;AAAA,IACjE;AACA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,MAAM,IAAI,mBAAmB,QAAQ,MAAM,GAAG,CAAC;AAAA,IAC7D;AAEA,YAAQ,IAAI,MAAM,IAAI,2DAA2D,CAAC;AAClF;AAAA,EACF;AAGA,QAAM,aAAa,gBAAgB,QAAQ;AAC3C,eAAa,YAAY,SAAS,MAAM;AAC1C;","names":[]}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Debug Command Types & Interfaces
3
+ *
4
+ * Type definitions for debug commands including call, tools, test, and whoami.
5
+ */
6
+ /**
7
+ * Options for the call command
8
+ */
9
+ export interface CallOptions {
10
+ /** Tool arguments as JSON string */
11
+ args?: string;
12
+ /** Output format (json, toon) */
13
+ format?: 'json' | 'toon';
14
+ /** Show raw API response */
15
+ raw?: boolean;
16
+ }
17
+ /**
18
+ * Options for the tools command
19
+ */
20
+ export interface ToolsOptions {
21
+ /** Filter by category */
22
+ category?: string;
23
+ /** Search tool names/descriptions */
24
+ search?: string;
25
+ /** Output as JSON */
26
+ json?: boolean;
27
+ }
28
+ /**
29
+ * Tool information structure
30
+ */
31
+ export interface ToolInfo {
32
+ /** Tool name */
33
+ name: string;
34
+ /** Tool description */
35
+ description: string;
36
+ /** Tool category */
37
+ category: string;
38
+ }
39
+ /**
40
+ * Tool categories mapping
41
+ */
42
+ export type ToolCategories = Record<string, string[]>;
43
+ /**
44
+ * Options for the whoami command
45
+ */
46
+ export interface WhoamiOptions {
47
+ /** Output as JSON */
48
+ json?: boolean;
49
+ }
50
+ /**
51
+ * User information structure
52
+ */
53
+ export interface UserInfo {
54
+ /** User display name */
55
+ name?: string;
56
+ /** User email address */
57
+ email: string;
58
+ /** Masked API key */
59
+ apiKey: string;
60
+ }
61
+ /**
62
+ * Configuration information structure
63
+ */
64
+ export interface ConfigurationInfo {
65
+ /** Configuration source (environment, global, project) */
66
+ source: string;
67
+ /** Current project ID if set */
68
+ projectId?: string;
69
+ /** Current project name if set */
70
+ projectName?: string;
71
+ /** Current specification ID if set */
72
+ specificationId?: string;
73
+ /** Current specification title if set */
74
+ specificationTitle?: string;
75
+ /** Resolved local MCP response encoding (json or toon) */
76
+ mcpOutputFormat: string;
77
+ }
78
+ /**
79
+ * Configuration file paths
80
+ */
81
+ export interface ConfigPaths {
82
+ /** Project config path (.specforge.json) */
83
+ projectConfig: string;
84
+ /** MCP config path (.mcp.json) */
85
+ mcpConfig: string;
86
+ /** Global config path (~/.specforge/config.json) */
87
+ globalConfig: string;
88
+ }
89
+ /**
90
+ * Full whoami information structure
91
+ */
92
+ export interface WhoamiInfo {
93
+ /** User information */
94
+ user: UserInfo;
95
+ /** Configuration information */
96
+ configuration: ConfigurationInfo;
97
+ /** Configuration file paths */
98
+ paths: ConfigPaths;
99
+ }
100
+ /**
101
+ * Test command result
102
+ */
103
+ export interface TestResult {
104
+ /** Whether connection was successful */
105
+ success: boolean;
106
+ /** Response time in milliseconds */
107
+ responseTime?: number;
108
+ /** User email from API */
109
+ userEmail?: string;
110
+ /** Number of accessible projects */
111
+ projectCount?: number;
112
+ /** Error message if failed */
113
+ error?: string;
114
+ }
115
+ /**
116
+ * Default tool categories
117
+ */
118
+ export declare const TOOL_CATEGORIES: ToolCategories;
119
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/debug/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uBAAuB;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,gCAAgC;IAChC,aAAa,EAAE,iBAAiB,CAAC;IACjC,+BAA+B;IAC/B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,cA+B7B,CAAC"}
@@ -0,0 +1,36 @@
1
+ const TOOL_CATEGORIES = {
2
+ "Core Operations": [
3
+ "list_projects",
4
+ "get_project",
5
+ "list_specifications",
6
+ "get_specification",
7
+ "create_specification",
8
+ "update_specification",
9
+ "list_epics",
10
+ "get_epic",
11
+ "create_epic",
12
+ "update_epic",
13
+ "list_tickets",
14
+ "get_ticket",
15
+ "create_ticket",
16
+ "update_ticket",
17
+ "search_tickets"
18
+ ],
19
+ "Context & AI": [
20
+ "get_working_context",
21
+ "set_working_context",
22
+ "get_implementation_context",
23
+ "get_full_context",
24
+ "get_pattern_chain"
25
+ ],
26
+ "Sessions & Workflow": [
27
+ "start_ticket",
28
+ "complete_ticket",
29
+ "update_ticket_progress"
30
+ ],
31
+ Validation: ["validate_ticket", "validate_acceptance_criteria"]
32
+ };
33
+ export {
34
+ TOOL_CATEGORIES
35
+ };
36
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/commands/debug/types.ts"],"sourcesContent":["/**\n * Debug Command Types & Interfaces\n *\n * Type definitions for debug commands including call, tools, test, and whoami.\n */\n\n/**\n * Options for the call command\n */\nexport interface CallOptions {\n /** Tool arguments as JSON string */\n args?: string;\n /** Output format (json, toon) */\n format?: 'json' | 'toon';\n /** Show raw API response */\n raw?: boolean;\n}\n\n/**\n * Options for the tools command\n */\nexport interface ToolsOptions {\n /** Filter by category */\n category?: string;\n /** Search tool names/descriptions */\n search?: string;\n /** Output as JSON */\n json?: boolean;\n}\n\n/**\n * Tool information structure\n */\nexport interface ToolInfo {\n /** Tool name */\n name: string;\n /** Tool description */\n description: string;\n /** Tool category */\n category: string;\n}\n\n/**\n * Tool categories mapping\n */\nexport type ToolCategories = Record<string, string[]>;\n\n/**\n * Options for the whoami command\n */\nexport interface WhoamiOptions {\n /** Output as JSON */\n json?: boolean;\n}\n\n/**\n * User information structure\n */\nexport interface UserInfo {\n /** User display name */\n name?: string;\n /** User email address */\n email: string;\n /** Masked API key */\n apiKey: string;\n}\n\n/**\n * Configuration information structure\n */\nexport interface ConfigurationInfo {\n /** Configuration source (environment, global, project) */\n source: string;\n /** Current project ID if set */\n projectId?: string;\n /** Current project name if set */\n projectName?: string;\n /** Current specification ID if set */\n specificationId?: string;\n /** Current specification title if set */\n specificationTitle?: string;\n /** Resolved local MCP response encoding (json or toon) */\n mcpOutputFormat: string;\n}\n\n/**\n * Configuration file paths\n */\nexport interface ConfigPaths {\n /** Project config path (.specforge.json) */\n projectConfig: string;\n /** MCP config path (.mcp.json) */\n mcpConfig: string;\n /** Global config path (~/.specforge/config.json) */\n globalConfig: string;\n}\n\n/**\n * Full whoami information structure\n */\nexport interface WhoamiInfo {\n /** User information */\n user: UserInfo;\n /** Configuration information */\n configuration: ConfigurationInfo;\n /** Configuration file paths */\n paths: ConfigPaths;\n}\n\n/**\n * Test command result\n */\nexport interface TestResult {\n /** Whether connection was successful */\n success: boolean;\n /** Response time in milliseconds */\n responseTime?: number;\n /** User email from API */\n userEmail?: string;\n /** Number of accessible projects */\n projectCount?: number;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Default tool categories\n */\nexport const TOOL_CATEGORIES: ToolCategories = {\n 'Core Operations': [\n 'list_projects',\n 'get_project',\n 'list_specifications',\n 'get_specification',\n 'create_specification',\n 'update_specification',\n 'list_epics',\n 'get_epic',\n 'create_epic',\n 'update_epic',\n 'list_tickets',\n 'get_ticket',\n 'create_ticket',\n 'update_ticket',\n 'search_tickets',\n ],\n 'Context & AI': [\n 'get_working_context',\n 'set_working_context',\n 'get_implementation_context',\n 'get_full_context',\n 'get_pattern_chain',\n ],\n 'Sessions & Workflow': [\n 'start_ticket',\n 'complete_ticket',\n 'update_ticket_progress',\n ],\n Validation: ['validate_ticket', 'validate_acceptance_criteria'],\n};\n"],"mappings":"AAgIO,MAAM,kBAAkC;AAAA,EAC7C,mBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY,CAAC,mBAAmB,8BAA8B;AAChE;","names":[]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Whoami Command Implementation
3
+ *
4
+ * Displays current user information, configuration settings, and config file paths.
5
+ */
6
+ import type { WhoamiOptions } from './types.js';
7
+ /**
8
+ * Whoami command implementation
9
+ *
10
+ * Displays current user and configuration information.
11
+ */
12
+ export declare function whoamiCommand(options: WhoamiOptions): Promise<void>;
13
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/debug/whoami.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAgF5D;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFzE"}