@specforge/mcp 2.0.9 → 2.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 (433) hide show
  1. package/README.md +324 -0
  2. package/bin/specforge-mcp +19 -1
  3. package/dist/cli/commands/blocked.d.ts +16 -0
  4. package/dist/cli/commands/blocked.d.ts.map +1 -0
  5. package/dist/cli/commands/blocked.js +214 -0
  6. package/dist/cli/commands/blocked.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 +218 -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 +105 -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 +117 -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 +12 -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 +90 -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 +117 -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 +117 -0
  34. package/dist/cli/commands/debug/tools.js.map +1 -0
  35. package/dist/cli/commands/debug/types.d.ts +117 -0
  36. package/dist/cli/commands/debug/types.d.ts.map +1 -0
  37. package/dist/cli/commands/debug/types.js +43 -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 +161 -0
  42. package/dist/cli/commands/debug/whoami.js.map +1 -0
  43. package/dist/cli/commands/docs/content/api.d.ts +7 -0
  44. package/dist/cli/commands/docs/content/api.d.ts.map +1 -0
  45. package/dist/cli/commands/docs/content/api.js +64 -0
  46. package/dist/cli/commands/docs/content/api.js.map +1 -0
  47. package/dist/cli/commands/docs/content/concepts.d.ts +7 -0
  48. package/dist/cli/commands/docs/content/concepts.d.ts.map +1 -0
  49. package/dist/cli/commands/docs/content/concepts.js +68 -0
  50. package/dist/cli/commands/docs/content/concepts.js.map +1 -0
  51. package/dist/cli/commands/docs/content/examples.d.ts +7 -0
  52. package/dist/cli/commands/docs/content/examples.d.ts.map +1 -0
  53. package/dist/cli/commands/docs/content/examples.js +84 -0
  54. package/dist/cli/commands/docs/content/examples.js.map +1 -0
  55. package/dist/cli/commands/docs/content/index.d.ts +10 -0
  56. package/dist/cli/commands/docs/content/index.d.ts.map +1 -0
  57. package/dist/cli/commands/docs/content/index.js +10 -0
  58. package/dist/cli/commands/docs/content/index.js.map +1 -0
  59. package/dist/cli/commands/docs/content/workflow.d.ts +7 -0
  60. package/dist/cli/commands/docs/content/workflow.d.ts.map +1 -0
  61. package/dist/cli/commands/docs/content/workflow.js +44 -0
  62. package/dist/cli/commands/docs/content/workflow.js.map +1 -0
  63. package/dist/cli/commands/docs/content.d.ts +23 -0
  64. package/dist/cli/commands/docs/content.d.ts.map +1 -0
  65. package/dist/cli/commands/docs/content.js +38 -0
  66. package/dist/cli/commands/docs/content.js.map +1 -0
  67. package/dist/cli/commands/docs/display.d.ts +26 -0
  68. package/dist/cli/commands/docs/display.d.ts.map +1 -0
  69. package/dist/cli/commands/docs/display.js +53 -0
  70. package/dist/cli/commands/docs/display.js.map +1 -0
  71. package/dist/cli/commands/docs/docs.d.ts +19 -0
  72. package/dist/cli/commands/docs/docs.d.ts.map +1 -0
  73. package/dist/cli/commands/docs/docs.js +124 -0
  74. package/dist/cli/commands/docs/docs.js.map +1 -0
  75. package/dist/cli/commands/docs/index.d.ts +13 -0
  76. package/dist/cli/commands/docs/index.d.ts.map +1 -0
  77. package/dist/cli/commands/docs/index.js +13 -0
  78. package/dist/cli/commands/docs/index.js.map +1 -0
  79. package/dist/cli/commands/docs/register.d.ts +23 -0
  80. package/dist/cli/commands/docs/register.d.ts.map +1 -0
  81. package/dist/cli/commands/docs/register.js +64 -0
  82. package/dist/cli/commands/docs/register.js.map +1 -0
  83. package/dist/cli/commands/docs/tool-docs.d.ts +44 -0
  84. package/dist/cli/commands/docs/tool-docs.d.ts.map +1 -0
  85. package/dist/cli/commands/docs/tool-docs.js +182 -0
  86. package/dist/cli/commands/docs/tool-docs.js.map +1 -0
  87. package/dist/cli/commands/docs/tool-examples.d.ts +14 -0
  88. package/dist/cli/commands/docs/tool-examples.d.ts.map +1 -0
  89. package/dist/cli/commands/docs/tool-examples.js +127 -0
  90. package/dist/cli/commands/docs/tool-examples.js.map +1 -0
  91. package/dist/cli/commands/docs/types.d.ts +108 -0
  92. package/dist/cli/commands/docs/types.d.ts.map +1 -0
  93. package/dist/cli/commands/docs/types.js +33 -0
  94. package/dist/cli/commands/docs/types.js.map +1 -0
  95. package/dist/cli/commands/doctor.d.ts +16 -0
  96. package/dist/cli/commands/doctor.d.ts.map +1 -0
  97. package/dist/cli/commands/doctor.js +322 -0
  98. package/dist/cli/commands/doctor.js.map +1 -0
  99. package/dist/cli/commands/doctor.types.d.ts +177 -0
  100. package/dist/cli/commands/doctor.types.d.ts.map +1 -0
  101. package/dist/cli/commands/doctor.types.js +172 -0
  102. package/dist/cli/commands/doctor.types.js.map +1 -0
  103. package/dist/cli/commands/index.d.ts +18 -0
  104. package/dist/cli/commands/index.d.ts.map +1 -0
  105. package/dist/cli/commands/index.js +18 -0
  106. package/dist/cli/commands/index.js.map +1 -0
  107. package/dist/cli/commands/init.d.ts +17 -0
  108. package/dist/cli/commands/init.d.ts.map +1 -0
  109. package/dist/cli/commands/init.js +326 -0
  110. package/dist/cli/commands/init.js.map +1 -0
  111. package/dist/cli/commands/init.types.d.ts +141 -0
  112. package/dist/cli/commands/init.types.d.ts.map +1 -0
  113. package/dist/cli/commands/init.types.js +24 -0
  114. package/dist/cli/commands/init.types.js.map +1 -0
  115. package/dist/cli/commands/login.d.ts +40 -0
  116. package/dist/cli/commands/login.d.ts.map +1 -0
  117. package/dist/cli/commands/login.js +174 -0
  118. package/dist/cli/commands/login.js.map +1 -0
  119. package/dist/cli/commands/next.d.ts +16 -0
  120. package/dist/cli/commands/next.d.ts.map +1 -0
  121. package/dist/cli/commands/next.js +279 -0
  122. package/dist/cli/commands/next.js.map +1 -0
  123. package/dist/cli/commands/next.types.d.ts +191 -0
  124. package/dist/cli/commands/next.types.d.ts.map +1 -0
  125. package/dist/cli/commands/next.types.js +129 -0
  126. package/dist/cli/commands/next.types.js.map +1 -0
  127. package/dist/cli/commands/projects.d.ts +16 -0
  128. package/dist/cli/commands/projects.d.ts.map +1 -0
  129. package/dist/cli/commands/projects.js +149 -0
  130. package/dist/cli/commands/projects.js.map +1 -0
  131. package/dist/cli/commands/projects.types.d.ts +81 -0
  132. package/dist/cli/commands/projects.types.d.ts.map +1 -0
  133. package/dist/cli/commands/projects.types.js +35 -0
  134. package/dist/cli/commands/projects.types.js.map +1 -0
  135. package/dist/cli/commands/review/display.d.ts +33 -0
  136. package/dist/cli/commands/review/display.d.ts.map +1 -0
  137. package/dist/cli/commands/review/display.js +159 -0
  138. package/dist/cli/commands/review/display.js.map +1 -0
  139. package/dist/cli/commands/review/epic-review.d.ts +13 -0
  140. package/dist/cli/commands/review/epic-review.d.ts.map +1 -0
  141. package/dist/cli/commands/review/epic-review.js +69 -0
  142. package/dist/cli/commands/review/epic-review.js.map +1 -0
  143. package/dist/cli/commands/review/index.d.ts +13 -0
  144. package/dist/cli/commands/review/index.d.ts.map +1 -0
  145. package/dist/cli/commands/review/index.js +17 -0
  146. package/dist/cli/commands/review/index.js.map +1 -0
  147. package/dist/cli/commands/review/report.d.ts +31 -0
  148. package/dist/cli/commands/review/report.d.ts.map +1 -0
  149. package/dist/cli/commands/review/report.js +146 -0
  150. package/dist/cli/commands/review/report.js.map +1 -0
  151. package/dist/cli/commands/review/review.d.ts +17 -0
  152. package/dist/cli/commands/review/review.d.ts.map +1 -0
  153. package/dist/cli/commands/review/review.js +129 -0
  154. package/dist/cli/commands/review/review.js.map +1 -0
  155. package/dist/cli/commands/review/spec-review.d.ts +13 -0
  156. package/dist/cli/commands/review/spec-review.d.ts.map +1 -0
  157. package/dist/cli/commands/review/spec-review.js +65 -0
  158. package/dist/cli/commands/review/spec-review.js.map +1 -0
  159. package/dist/cli/commands/review/ticket-review.d.ts +37 -0
  160. package/dist/cli/commands/review/ticket-review.d.ts.map +1 -0
  161. package/dist/cli/commands/review/ticket-review.js +194 -0
  162. package/dist/cli/commands/review/ticket-review.js.map +1 -0
  163. package/dist/cli/commands/review/types.d.ts +232 -0
  164. package/dist/cli/commands/review/types.d.ts.map +1 -0
  165. package/dist/cli/commands/review/types.js +85 -0
  166. package/dist/cli/commands/review/types.js.map +1 -0
  167. package/dist/cli/commands/scaffold/display.d.ts +27 -0
  168. package/dist/cli/commands/scaffold/display.d.ts.map +1 -0
  169. package/dist/cli/commands/scaffold/display.js +90 -0
  170. package/dist/cli/commands/scaffold/display.js.map +1 -0
  171. package/dist/cli/commands/scaffold/index.d.ts +12 -0
  172. package/dist/cli/commands/scaffold/index.d.ts.map +1 -0
  173. package/dist/cli/commands/scaffold/index.js +12 -0
  174. package/dist/cli/commands/scaffold/index.js.map +1 -0
  175. package/dist/cli/commands/scaffold/register.d.ts +11 -0
  176. package/dist/cli/commands/scaffold/register.d.ts.map +1 -0
  177. package/dist/cli/commands/scaffold/register.js +25 -0
  178. package/dist/cli/commands/scaffold/register.js.map +1 -0
  179. package/dist/cli/commands/scaffold/scaffold.d.ts +11 -0
  180. package/dist/cli/commands/scaffold/scaffold.d.ts.map +1 -0
  181. package/dist/cli/commands/scaffold/scaffold.js +111 -0
  182. package/dist/cli/commands/scaffold/scaffold.js.map +1 -0
  183. package/dist/cli/commands/scaffold/targets.d.ts +31 -0
  184. package/dist/cli/commands/scaffold/targets.d.ts.map +1 -0
  185. package/dist/cli/commands/scaffold/targets.js +84 -0
  186. package/dist/cli/commands/scaffold/targets.js.map +1 -0
  187. package/dist/cli/commands/scaffold/types.d.ts +88 -0
  188. package/dist/cli/commands/scaffold/types.d.ts.map +1 -0
  189. package/dist/cli/commands/scaffold/types.js +21 -0
  190. package/dist/cli/commands/scaffold/types.js.map +1 -0
  191. package/dist/cli/commands/scaffold/utils.d.ts +31 -0
  192. package/dist/cli/commands/scaffold/utils.d.ts.map +1 -0
  193. package/dist/cli/commands/scaffold/utils.js +71 -0
  194. package/dist/cli/commands/scaffold/utils.js.map +1 -0
  195. package/dist/cli/commands/session/display.d.ts +40 -0
  196. package/dist/cli/commands/session/display.d.ts.map +1 -0
  197. package/dist/cli/commands/session/display.js +114 -0
  198. package/dist/cli/commands/session/display.js.map +1 -0
  199. package/dist/cli/commands/session/end.d.ts +12 -0
  200. package/dist/cli/commands/session/end.d.ts.map +1 -0
  201. package/dist/cli/commands/session/end.js +165 -0
  202. package/dist/cli/commands/session/end.js.map +1 -0
  203. package/dist/cli/commands/session/index.d.ts +13 -0
  204. package/dist/cli/commands/session/index.d.ts.map +1 -0
  205. package/dist/cli/commands/session/index.js +13 -0
  206. package/dist/cli/commands/session/index.js.map +1 -0
  207. package/dist/cli/commands/session/register.d.ts +12 -0
  208. package/dist/cli/commands/session/register.d.ts.map +1 -0
  209. package/dist/cli/commands/session/register.js +87 -0
  210. package/dist/cli/commands/session/register.js.map +1 -0
  211. package/dist/cli/commands/session/start.d.ts +12 -0
  212. package/dist/cli/commands/session/start.d.ts.map +1 -0
  213. package/dist/cli/commands/session/start.js +189 -0
  214. package/dist/cli/commands/session/start.js.map +1 -0
  215. package/dist/cli/commands/session/status.d.ts +12 -0
  216. package/dist/cli/commands/session/status.d.ts.map +1 -0
  217. package/dist/cli/commands/session/status.js +93 -0
  218. package/dist/cli/commands/session/status.js.map +1 -0
  219. package/dist/cli/commands/session/types.d.ts +179 -0
  220. package/dist/cli/commands/session/types.d.ts.map +1 -0
  221. package/dist/cli/commands/session/types.js +8 -0
  222. package/dist/cli/commands/session/types.js.map +1 -0
  223. package/dist/cli/commands/session/utils.d.ts +24 -0
  224. package/dist/cli/commands/session/utils.d.ts.map +1 -0
  225. package/dist/cli/commands/session/utils.js +72 -0
  226. package/dist/cli/commands/session/utils.js.map +1 -0
  227. package/dist/cli/commands/specs.d.ts +16 -0
  228. package/dist/cli/commands/specs.d.ts.map +1 -0
  229. package/dist/cli/commands/specs.js +212 -0
  230. package/dist/cli/commands/specs.js.map +1 -0
  231. package/dist/cli/commands/specs.types.d.ts +120 -0
  232. package/dist/cli/commands/specs.types.d.ts.map +1 -0
  233. package/dist/cli/commands/specs.types.js +75 -0
  234. package/dist/cli/commands/specs.types.js.map +1 -0
  235. package/dist/cli/commands/status.d.ts +17 -0
  236. package/dist/cli/commands/status.d.ts.map +1 -0
  237. package/dist/cli/commands/status.js +271 -0
  238. package/dist/cli/commands/status.js.map +1 -0
  239. package/dist/cli/commands/status.types.d.ts +382 -0
  240. package/dist/cli/commands/status.types.d.ts.map +1 -0
  241. package/dist/cli/commands/status.types.js +166 -0
  242. package/dist/cli/commands/status.types.js.map +1 -0
  243. package/dist/cli/commands/switch.d.ts +18 -0
  244. package/dist/cli/commands/switch.d.ts.map +1 -0
  245. package/dist/cli/commands/switch.js +181 -0
  246. package/dist/cli/commands/switch.js.map +1 -0
  247. package/dist/cli/commands/switch.types.d.ts +123 -0
  248. package/dist/cli/commands/switch.types.d.ts.map +1 -0
  249. package/dist/cli/commands/switch.types.js +65 -0
  250. package/dist/cli/commands/switch.types.js.map +1 -0
  251. package/dist/cli/commands/ticket/command.d.ts +14 -0
  252. package/dist/cli/commands/ticket/command.d.ts.map +1 -0
  253. package/dist/cli/commands/ticket/command.js +141 -0
  254. package/dist/cli/commands/ticket/command.js.map +1 -0
  255. package/dist/cli/commands/ticket/display.d.ts +56 -0
  256. package/dist/cli/commands/ticket/display.d.ts.map +1 -0
  257. package/dist/cli/commands/ticket/display.js +205 -0
  258. package/dist/cli/commands/ticket/display.js.map +1 -0
  259. package/dist/cli/commands/ticket/index.d.ts +11 -0
  260. package/dist/cli/commands/ticket/index.d.ts.map +1 -0
  261. package/dist/cli/commands/ticket/index.js +11 -0
  262. package/dist/cli/commands/ticket/index.js.map +1 -0
  263. package/dist/cli/commands/ticket/register.d.ts +11 -0
  264. package/dist/cli/commands/ticket/register.d.ts.map +1 -0
  265. package/dist/cli/commands/ticket/register.js +39 -0
  266. package/dist/cli/commands/ticket/register.js.map +1 -0
  267. package/dist/cli/commands/ticket/resolver.d.ts +16 -0
  268. package/dist/cli/commands/ticket/resolver.d.ts.map +1 -0
  269. package/dist/cli/commands/ticket/resolver.js +35 -0
  270. package/dist/cli/commands/ticket/resolver.js.map +1 -0
  271. package/dist/cli/commands/ticket/types.d.ts +157 -0
  272. package/dist/cli/commands/ticket/types.d.ts.map +1 -0
  273. package/dist/cli/commands/ticket/types.js +8 -0
  274. package/dist/cli/commands/ticket/types.js.map +1 -0
  275. package/dist/cli/commands/tickets.d.ts +16 -0
  276. package/dist/cli/commands/tickets.d.ts.map +1 -0
  277. package/dist/cli/commands/tickets.js +271 -0
  278. package/dist/cli/commands/tickets.js.map +1 -0
  279. package/dist/cli/commands/tickets.types.d.ts +202 -0
  280. package/dist/cli/commands/tickets.types.d.ts.map +1 -0
  281. package/dist/cli/commands/tickets.types.js +138 -0
  282. package/dist/cli/commands/tickets.types.js.map +1 -0
  283. package/dist/cli/config/index.d.ts +11 -0
  284. package/dist/cli/config/index.d.ts.map +1 -0
  285. package/dist/cli/config/index.js +11 -0
  286. package/dist/cli/config/index.js.map +1 -0
  287. package/dist/cli/config/loader.d.ts +98 -0
  288. package/dist/cli/config/loader.d.ts.map +1 -0
  289. package/dist/cli/config/loader.js +237 -0
  290. package/dist/cli/config/loader.js.map +1 -0
  291. package/dist/cli/config/paths.d.ts +96 -0
  292. package/dist/cli/config/paths.d.ts.map +1 -0
  293. package/dist/cli/config/paths.js +140 -0
  294. package/dist/cli/config/paths.js.map +1 -0
  295. package/dist/cli/config/types.d.ts +148 -0
  296. package/dist/cli/config/types.d.ts.map +1 -0
  297. package/dist/cli/config/types.js +34 -0
  298. package/dist/cli/config/types.js.map +1 -0
  299. package/dist/cli/config/writer.d.ts +171 -0
  300. package/dist/cli/config/writer.d.ts.map +1 -0
  301. package/dist/cli/config/writer.js +312 -0
  302. package/dist/cli/config/writer.js.map +1 -0
  303. package/dist/cli/index.d.ts +30 -0
  304. package/dist/cli/index.d.ts.map +1 -0
  305. package/dist/cli/index.js +183 -0
  306. package/dist/cli/index.js.map +1 -0
  307. package/dist/cli/middleware/auth-guard.d.ts +107 -0
  308. package/dist/cli/middleware/auth-guard.d.ts.map +1 -0
  309. package/dist/cli/middleware/auth-guard.js +190 -0
  310. package/dist/cli/middleware/auth-guard.js.map +1 -0
  311. package/dist/cli/middleware/error-handler.d.ts +133 -0
  312. package/dist/cli/middleware/error-handler.d.ts.map +1 -0
  313. package/dist/cli/middleware/error-handler.js +209 -0
  314. package/dist/cli/middleware/error-handler.js.map +1 -0
  315. package/dist/cli/middleware/index.d.ts +6 -0
  316. package/dist/cli/middleware/index.d.ts.map +1 -0
  317. package/dist/cli/middleware/index.js +6 -0
  318. package/dist/cli/middleware/index.js.map +1 -0
  319. package/dist/cli/templates/commands.d.ts +20 -0
  320. package/dist/cli/templates/commands.d.ts.map +1 -0
  321. package/dist/cli/templates/commands.js +174 -0
  322. package/dist/cli/templates/commands.js.map +1 -0
  323. package/dist/cli/templates/content/sf-autonomous.d.ts +7 -0
  324. package/dist/cli/templates/content/sf-autonomous.d.ts.map +1 -0
  325. package/dist/cli/templates/content/sf-autonomous.js +78 -0
  326. package/dist/cli/templates/content/sf-autonomous.js.map +1 -0
  327. package/dist/cli/templates/content/sf-blockers.d.ts +7 -0
  328. package/dist/cli/templates/content/sf-blockers.d.ts.map +1 -0
  329. package/dist/cli/templates/content/sf-blockers.js +68 -0
  330. package/dist/cli/templates/content/sf-blockers.js.map +1 -0
  331. package/dist/cli/templates/content/sf-commit.d.ts +7 -0
  332. package/dist/cli/templates/content/sf-commit.d.ts.map +1 -0
  333. package/dist/cli/templates/content/sf-commit.js +78 -0
  334. package/dist/cli/templates/content/sf-commit.js.map +1 -0
  335. package/dist/cli/templates/content/sf-context.d.ts +7 -0
  336. package/dist/cli/templates/content/sf-context.d.ts.map +1 -0
  337. package/dist/cli/templates/content/sf-context.js +64 -0
  338. package/dist/cli/templates/content/sf-context.js.map +1 -0
  339. package/dist/cli/templates/content/sf-create-epics.d.ts +7 -0
  340. package/dist/cli/templates/content/sf-create-epics.d.ts.map +1 -0
  341. package/dist/cli/templates/content/sf-create-epics.js +70 -0
  342. package/dist/cli/templates/content/sf-create-epics.js.map +1 -0
  343. package/dist/cli/templates/content/sf-create-spec.d.ts +7 -0
  344. package/dist/cli/templates/content/sf-create-spec.d.ts.map +1 -0
  345. package/dist/cli/templates/content/sf-create-spec.js +67 -0
  346. package/dist/cli/templates/content/sf-create-spec.js.map +1 -0
  347. package/dist/cli/templates/content/sf-create-tickets.d.ts +7 -0
  348. package/dist/cli/templates/content/sf-create-tickets.d.ts.map +1 -0
  349. package/dist/cli/templates/content/sf-create-tickets.js +76 -0
  350. package/dist/cli/templates/content/sf-create-tickets.js.map +1 -0
  351. package/dist/cli/templates/content/sf-epic.d.ts +7 -0
  352. package/dist/cli/templates/content/sf-epic.d.ts.map +1 -0
  353. package/dist/cli/templates/content/sf-epic.js +69 -0
  354. package/dist/cli/templates/content/sf-epic.js.map +1 -0
  355. package/dist/cli/templates/content/sf-help.d.ts +7 -0
  356. package/dist/cli/templates/content/sf-help.d.ts.map +1 -0
  357. package/dist/cli/templates/content/sf-help.js +61 -0
  358. package/dist/cli/templates/content/sf-help.js.map +1 -0
  359. package/dist/cli/templates/content/sf-import.d.ts +7 -0
  360. package/dist/cli/templates/content/sf-import.d.ts.map +1 -0
  361. package/dist/cli/templates/content/sf-import.js +88 -0
  362. package/dist/cli/templates/content/sf-import.js.map +1 -0
  363. package/dist/cli/templates/content/sf-init.d.ts +7 -0
  364. package/dist/cli/templates/content/sf-init.d.ts.map +1 -0
  365. package/dist/cli/templates/content/sf-init.js +61 -0
  366. package/dist/cli/templates/content/sf-init.js.map +1 -0
  367. package/dist/cli/templates/content/sf-next.d.ts +7 -0
  368. package/dist/cli/templates/content/sf-next.d.ts.map +1 -0
  369. package/dist/cli/templates/content/sf-next.js +67 -0
  370. package/dist/cli/templates/content/sf-next.js.map +1 -0
  371. package/dist/cli/templates/content/sf-reset.d.ts +7 -0
  372. package/dist/cli/templates/content/sf-reset.d.ts.map +1 -0
  373. package/dist/cli/templates/content/sf-reset.js +78 -0
  374. package/dist/cli/templates/content/sf-reset.js.map +1 -0
  375. package/dist/cli/templates/content/sf-review.d.ts +7 -0
  376. package/dist/cli/templates/content/sf-review.d.ts.map +1 -0
  377. package/dist/cli/templates/content/sf-review.js +67 -0
  378. package/dist/cli/templates/content/sf-review.js.map +1 -0
  379. package/dist/cli/templates/content/sf-search.d.ts +7 -0
  380. package/dist/cli/templates/content/sf-search.d.ts.map +1 -0
  381. package/dist/cli/templates/content/sf-search.js +64 -0
  382. package/dist/cli/templates/content/sf-search.js.map +1 -0
  383. package/dist/cli/templates/content/sf-status.d.ts +7 -0
  384. package/dist/cli/templates/content/sf-status.d.ts.map +1 -0
  385. package/dist/cli/templates/content/sf-status.js +67 -0
  386. package/dist/cli/templates/content/sf-status.js.map +1 -0
  387. package/dist/cli/templates/content/sf-ticket.d.ts +7 -0
  388. package/dist/cli/templates/content/sf-ticket.d.ts.map +1 -0
  389. package/dist/cli/templates/content/sf-ticket.js +76 -0
  390. package/dist/cli/templates/content/sf-ticket.js.map +1 -0
  391. package/dist/cli/templates/content/sf-validate.d.ts +7 -0
  392. package/dist/cli/templates/content/sf-validate.d.ts.map +1 -0
  393. package/dist/cli/templates/content/sf-validate.js +78 -0
  394. package/dist/cli/templates/content/sf-validate.js.map +1 -0
  395. package/dist/cli/templates/index.d.ts +7 -0
  396. package/dist/cli/templates/index.d.ts.map +1 -0
  397. package/dist/cli/templates/index.js +7 -0
  398. package/dist/cli/templates/index.js.map +1 -0
  399. package/dist/cli/ui/colors.d.ts +76 -0
  400. package/dist/cli/ui/colors.d.ts.map +1 -0
  401. package/dist/cli/ui/colors.js +81 -0
  402. package/dist/cli/ui/colors.js.map +1 -0
  403. package/dist/cli/ui/dashboard.d.ts +54 -0
  404. package/dist/cli/ui/dashboard.d.ts.map +1 -0
  405. package/dist/cli/ui/dashboard.js +339 -0
  406. package/dist/cli/ui/dashboard.js.map +1 -0
  407. package/dist/cli/ui/index.d.ts +7 -0
  408. package/dist/cli/ui/index.d.ts.map +1 -0
  409. package/dist/cli/ui/index.js +7 -0
  410. package/dist/cli/ui/index.js.map +1 -0
  411. package/dist/cli/ui/output.d.ts +117 -0
  412. package/dist/cli/ui/output.d.ts.map +1 -0
  413. package/dist/cli/ui/output.js +172 -0
  414. package/dist/cli/ui/output.js.map +1 -0
  415. package/dist/cli/ui/spinner.d.ts +105 -0
  416. package/dist/cli/ui/spinner.d.ts.map +1 -0
  417. package/dist/cli/ui/spinner.js +148 -0
  418. package/dist/cli/ui/spinner.js.map +1 -0
  419. package/dist/cli/ui/time.d.ts +54 -0
  420. package/dist/cli/ui/time.d.ts.map +1 -0
  421. package/dist/cli/ui/time.js +173 -0
  422. package/dist/cli/ui/time.js.map +1 -0
  423. package/dist/lib/format.d.ts +4 -4
  424. package/dist/lib/format.js +5 -5
  425. package/dist/server.js +8 -8
  426. package/dist/server.js.map +1 -1
  427. package/dist/tools/core/session.js +6 -6
  428. package/dist/tools/core/session.js.map +1 -1
  429. package/dist/tools/index.js +9 -9
  430. package/dist/tools/index.js.map +1 -1
  431. package/dist/validation/index.js +1 -1
  432. package/dist/validation/index.js.map +1 -1
  433. package/package.json +9 -2
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Specification Review Implementation
3
+ *
4
+ * Reviews all epics within a specification and aggregates
5
+ * the results into an overall specification review status.
6
+ */
7
+ import { ApiClient } from '../../../client/api-client.js';
8
+ import { ReviewOptions, ReviewResult } from './types.js';
9
+ /**
10
+ * Review a specification by reviewing all epics
11
+ */
12
+ export declare function reviewSpecification(client: ApiClient, specificationId: string, options: ReviewOptions): Promise<ReviewResult>;
13
+ //# sourceMappingURL=spec-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-review.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/review/spec-review.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,YAAY,EAOb,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CA4DvB"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Specification Review Implementation
3
+ *
4
+ * Reviews all epics within a specification and aggregates
5
+ * the results into an overall specification review status.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { CHECK_CATEGORIES, createCheck, calculateSummary, determineOverallStatus, } from './types.js';
9
+ import { reviewEpic } from './epic-review.js';
10
+ /**
11
+ * Review a specification by reviewing all epics
12
+ */
13
+ export async function reviewSpecification(client, specificationId, options) {
14
+ const checks = [];
15
+ // Get all epics in specification
16
+ const epicsResponse = await client.call('list_epics', {
17
+ specificationId,
18
+ });
19
+ const epics = epicsResponse.epics || [];
20
+ if (!options.json) {
21
+ console.log(chalk.bold(`\nReviewing Specification`));
22
+ console.log('═'.repeat(50));
23
+ console.log(`Total epics: ${epics.length}\n`);
24
+ }
25
+ // Review each epic
26
+ for (const epic of epics) {
27
+ if (!options.json) {
28
+ console.log(chalk.dim(`\nReviewing Epic ${epic.number}: ${epic.title}...`));
29
+ }
30
+ const epicResult = await reviewEpic(client, epic.id, { ...options, json: true });
31
+ // Format epic identifier
32
+ const epicCode = `E${epic.number.toString().padStart(2, '0')}`;
33
+ const epicName = `${epicCode}: ${truncateTitle(epic.title, 35)}`;
34
+ checks.push(createCheck(CHECK_CATEGORIES.EPICS, epicName, epicResult.status === 'pass' ? 'pass' :
35
+ epicResult.status === 'partial' ? 'warn' : 'fail', `${epicResult.summary.passed}/${epicResult.checks.length} checks passed`, epicResult.summary.failed > 0
36
+ ? { details: `${epicResult.summary.failed} failed, ${epicResult.summary.warnings} warnings` }
37
+ : undefined));
38
+ }
39
+ // Calculate overall specification status
40
+ const passedEpics = checks.filter(c => c.status === 'pass').length;
41
+ const totalEpics = epics.length;
42
+ if (!options.json && totalEpics > 0) {
43
+ console.log(chalk.dim(`\nSpecification summary: ${passedEpics}/${totalEpics} epics passing`));
44
+ }
45
+ // Compile result
46
+ const summary = calculateSummary(checks);
47
+ const status = determineOverallStatus(summary);
48
+ return {
49
+ scope: 'specification',
50
+ id: specificationId,
51
+ title: 'Specification Review',
52
+ status,
53
+ checks,
54
+ summary,
55
+ };
56
+ }
57
+ /**
58
+ * Truncate title to max length
59
+ */
60
+ function truncateTitle(title, maxLength) {
61
+ if (title.length <= maxLength)
62
+ return title;
63
+ return title.slice(0, maxLength - 3) + '...';
64
+ }
65
+ //# sourceMappingURL=spec-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-review.js","sourceRoot":"","sources":["../../../../src/cli/commands/review/spec-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Ticket Review Implementation
3
+ *
4
+ * Reviews a single ticket's implementation against SpecForge documentation,
5
+ * checking acceptance criteria, files, patterns, and validation results.
6
+ */
7
+ import { ApiClient } from '../../../client/api-client.js';
8
+ import { ReviewOptions, ReviewResult, CheckResult, TicketApiResponse, ImplementationContextApiResponse } from './types.js';
9
+ /**
10
+ * Review a single ticket implementation
11
+ */
12
+ export declare function reviewTicket(client: ApiClient, ticketId: string, options: ReviewOptions): Promise<ReviewResult>;
13
+ /**
14
+ * Check acceptance criteria validation status
15
+ */
16
+ export declare function checkAcceptanceCriteria(ticket: TicketApiResponse, options: ReviewOptions): CheckResult[];
17
+ /**
18
+ * Check file existence based on technical details
19
+ */
20
+ export declare function checkFiles(ticket: TicketApiResponse, options: ReviewOptions): CheckResult[];
21
+ /**
22
+ * Check code patterns in files
23
+ */
24
+ export declare function checkPatterns(ticket: TicketApiResponse, context: ImplementationContextApiResponse, options: ReviewOptions): Promise<CheckResult[]>;
25
+ /**
26
+ * Check if a specific pattern is used in files
27
+ */
28
+ export declare function checkPatternUsage(createFiles: (string | {
29
+ path: string;
30
+ })[] | undefined, modifyFiles: (string | {
31
+ path: string;
32
+ })[] | undefined, pattern: string): Promise<CheckResult>;
33
+ /**
34
+ * Check validation results (tests, lint, build, typecheck)
35
+ */
36
+ export declare function checkValidation(ticket: TicketApiResponse, options: ReviewOptions): CheckResult[];
37
+ //# sourceMappingURL=ticket-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-review.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/review/ticket-review.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gCAAgC,EAOjC,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CA0CvB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,WAAW,EAAE,CAmDf;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,WAAW,EAAE,CA2Df;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,gCAAgC,EACzC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,WAAW,EAAE,CAAC,CAuCxB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,YAAK,EAC/C,WAAW,EAAE,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,YAAK,EAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CA4BtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,WAAW,EAAE,CA0Df"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Ticket Review Implementation
3
+ *
4
+ * Reviews a single ticket's implementation against SpecForge documentation,
5
+ * checking acceptance criteria, files, patterns, and validation results.
6
+ */
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import chalk from 'chalk';
10
+ import { CHECK_CATEGORIES, createCheck, calculateSummary, determineOverallStatus, getFilePath, truncateString, } from './types.js';
11
+ /**
12
+ * Maximum length for criterion name display
13
+ */
14
+ const MAX_CRITERION_LENGTH = 50;
15
+ /**
16
+ * Review a single ticket implementation
17
+ */
18
+ export async function reviewTicket(client, ticketId, options) {
19
+ const checks = [];
20
+ // Get ticket details
21
+ const ticket = await client.call('get_ticket', { ticketId });
22
+ // Get implementation context for patterns
23
+ const context = await client.call('get_implementation_context', { ticketId });
24
+ if (!options.json) {
25
+ console.log(chalk.bold(`\nReviewing: ${ticket.title}`));
26
+ console.log('═'.repeat(50));
27
+ }
28
+ // 1. Check Acceptance Criteria
29
+ const criteriaChecks = checkAcceptanceCriteria(ticket, options);
30
+ checks.push(...criteriaChecks);
31
+ // 2. Check Files
32
+ const fileChecks = checkFiles(ticket, options);
33
+ checks.push(...fileChecks);
34
+ // 3. Check Patterns
35
+ const patternChecks = await checkPatterns(ticket, context, options);
36
+ checks.push(...patternChecks);
37
+ // 4. Check Validation Results
38
+ const validationChecks = checkValidation(ticket, options);
39
+ checks.push(...validationChecks);
40
+ // Compile result
41
+ const summary = calculateSummary(checks);
42
+ const status = determineOverallStatus(summary);
43
+ return {
44
+ scope: 'ticket',
45
+ id: ticketId,
46
+ title: ticket.title,
47
+ status,
48
+ checks,
49
+ summary,
50
+ };
51
+ }
52
+ /**
53
+ * Check acceptance criteria validation status
54
+ */
55
+ export function checkAcceptanceCriteria(ticket, options) {
56
+ const checks = [];
57
+ if (!options.json) {
58
+ console.log(chalk.dim('\nChecking acceptance criteria...'));
59
+ }
60
+ if (!ticket.acceptanceCriteria || ticket.acceptanceCriteria.length === 0) {
61
+ checks.push(createCheck(CHECK_CATEGORIES.ACCEPTANCE_CRITERIA, 'Criteria defined', 'warn', 'No acceptance criteria defined for this ticket', { details: 'Consider adding acceptance criteria for better tracking' }));
62
+ return checks;
63
+ }
64
+ const validation = ticket.acceptanceCriteriaValidation || [];
65
+ for (const criterion of ticket.acceptanceCriteria) {
66
+ const criterionName = truncateString(criterion, MAX_CRITERION_LENGTH);
67
+ const v = validation.find(v => v.criterion === criterion);
68
+ if (!v || v.status === 'pending') {
69
+ checks.push(createCheck(CHECK_CATEGORIES.ACCEPTANCE_CRITERIA, criterionName, 'fail', 'Not validated', { fix: 'Verify this criterion is implemented and mark as validated' }));
70
+ }
71
+ else if (v.status === 'passed') {
72
+ checks.push(createCheck(CHECK_CATEGORIES.ACCEPTANCE_CRITERIA, criterionName, 'pass', 'Validated'));
73
+ }
74
+ else {
75
+ checks.push(createCheck(CHECK_CATEGORIES.ACCEPTANCE_CRITERIA, criterionName, 'fail', v.notes || 'Failed validation', { fix: 'Fix the implementation to satisfy this criterion' }));
76
+ }
77
+ }
78
+ return checks;
79
+ }
80
+ /**
81
+ * Check file existence based on technical details
82
+ */
83
+ export function checkFiles(ticket, options) {
84
+ const checks = [];
85
+ if (!options.json) {
86
+ console.log(chalk.dim('Checking file changes...'));
87
+ }
88
+ const technicalDetails = ticket.technicalDetails;
89
+ if (!technicalDetails?.files) {
90
+ // No file specifications, not necessarily an error
91
+ return checks;
92
+ }
93
+ // Check created files
94
+ if (technicalDetails.files.create) {
95
+ for (const file of technicalDetails.files.create) {
96
+ const filePath = getFilePath(file);
97
+ const fullPath = path.resolve(process.cwd(), filePath);
98
+ const exists = fs.existsSync(fullPath);
99
+ checks.push(createCheck(CHECK_CATEGORIES.FILES, `Create: ${filePath}`, exists ? 'pass' : 'fail', exists ? 'File exists' : 'File not found', exists ? undefined : { fix: `Create the file: ${filePath}` }));
100
+ }
101
+ }
102
+ // Check modified files
103
+ if (technicalDetails.files.modify) {
104
+ for (const file of technicalDetails.files.modify) {
105
+ const filePath = getFilePath(file);
106
+ const fullPath = path.resolve(process.cwd(), filePath);
107
+ const exists = fs.existsSync(fullPath);
108
+ if (!exists) {
109
+ checks.push(createCheck(CHECK_CATEGORIES.FILES, `Modify: ${filePath}`, 'fail', 'File not found'));
110
+ }
111
+ else {
112
+ // File exists - could check git diff for actual modifications
113
+ checks.push(createCheck(CHECK_CATEGORIES.FILES, `Modify: ${filePath}`, 'pass', 'File exists', { details: 'Verify changes are correct' }));
114
+ }
115
+ }
116
+ }
117
+ return checks;
118
+ }
119
+ /**
120
+ * Check code patterns in files
121
+ */
122
+ export async function checkPatterns(ticket, context, options) {
123
+ const checks = [];
124
+ if (!options.json) {
125
+ console.log(chalk.dim('Checking code patterns...'));
126
+ }
127
+ const patterns = context.patterns;
128
+ const technicalDetails = ticket.technicalDetails;
129
+ if (!patterns) {
130
+ return checks;
131
+ }
132
+ // Check error handling pattern
133
+ if (patterns.codeStandards?.errorHandling) {
134
+ const createFiles = technicalDetails?.files?.create || [];
135
+ const modifyFiles = technicalDetails?.files?.modify || [];
136
+ const patternCheck = await checkPatternUsage(createFiles, modifyFiles, patterns.codeStandards.errorHandling);
137
+ checks.push(patternCheck);
138
+ }
139
+ // Check return types (manual verification needed)
140
+ if (patterns.returnTypes) {
141
+ const returnTypeKeys = Object.keys(patterns.returnTypes);
142
+ checks.push(createCheck(CHECK_CATEGORIES.PATTERNS, 'Return types', 'warn', 'Manual verification needed', { details: `Expected patterns: ${returnTypeKeys.join(', ')}` }));
143
+ }
144
+ return checks;
145
+ }
146
+ /**
147
+ * Check if a specific pattern is used in files
148
+ */
149
+ export async function checkPatternUsage(createFiles = [], modifyFiles = [], pattern) {
150
+ const allFiles = [...createFiles, ...modifyFiles];
151
+ let found = false;
152
+ for (const file of allFiles) {
153
+ const filePath = getFilePath(file);
154
+ const fullPath = path.resolve(process.cwd(), filePath);
155
+ if (fs.existsSync(fullPath)) {
156
+ try {
157
+ const content = fs.readFileSync(fullPath, 'utf-8');
158
+ if (content.includes(pattern)) {
159
+ found = true;
160
+ break;
161
+ }
162
+ }
163
+ catch {
164
+ // File read error, continue checking other files
165
+ }
166
+ }
167
+ }
168
+ return createCheck(CHECK_CATEGORIES.PATTERNS, `Error handling: ${truncateString(pattern, 30)}`, found ? 'pass' : 'warn', found ? 'Pattern found in code' : 'Pattern not detected', found ? undefined : { details: 'Verify error handling follows specification' });
169
+ }
170
+ /**
171
+ * Check validation results (tests, lint, build, typecheck)
172
+ */
173
+ export function checkValidation(ticket, options) {
174
+ const checks = [];
175
+ if (!options.json) {
176
+ console.log(chalk.dim('Checking validation results...'));
177
+ }
178
+ const validation = ticket.implementation?.validation;
179
+ if (!validation) {
180
+ checks.push(createCheck(CHECK_CATEGORIES.TESTS, 'Validation results', 'fail', 'No validation results recorded', { fix: 'Run validations and complete the ticket with results' }));
181
+ return checks;
182
+ }
183
+ // Test suite
184
+ checks.push(createCheck(CHECK_CATEGORIES.TESTS, 'Test suite', validation.tests === 'passed' ? 'pass' :
185
+ validation.tests === 'skipped' ? 'warn' : 'fail', `Tests: ${validation.tests || 'not run'}`, validation.tests === 'failed' ? { fix: 'Fix failing tests' } : undefined));
186
+ // Type check
187
+ checks.push(createCheck(CHECK_CATEGORIES.TESTS, 'Type check', validation.typeCheck === 'passed' ? 'pass' : 'fail', `TypeScript: ${validation.typeCheck || 'not run'}`, validation.typeCheck === 'failed' ? { fix: 'Fix TypeScript errors' } : undefined));
188
+ // Lint
189
+ checks.push(createCheck(CHECK_CATEGORIES.TESTS, 'Lint', validation.lint === 'passed' ? 'pass' : 'warn', `Lint: ${validation.lint || 'not run'}`, validation.lint === 'failed' ? { fix: 'Fix linting issues' } : undefined));
190
+ // Build
191
+ checks.push(createCheck(CHECK_CATEGORIES.TESTS, 'Build', validation.build === 'passed' ? 'pass' : 'fail', `Build: ${validation.build || 'not run'}`, validation.build === 'failed' ? { fix: 'Fix build errors' } : undefined));
192
+ return checks;
193
+ }
194
+ //# sourceMappingURL=ticket-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-review.js","sourceRoot":"","sources":["../../../../src/cli/commands/review/ticket-review.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAML,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAiB,EACjB,QAAgB,EAChB,OAAsB;IAEtB,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAsB,CAAC;IAElF,0CAA0C;IAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,CAAqC,CAAC;IAElH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,+BAA+B;IAC/B,MAAM,cAAc,GAAG,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;IAE/B,iBAAiB;IACjB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAE3B,oBAAoB;IACpB,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAE9B,8BAA8B;IAC9B,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IAEjC,iBAAiB;IACjB,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM;QACN,MAAM;QACN,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAyB,EACzB,OAAsB;IAEtB,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,mBAAmB,EACpC,kBAAkB,EAClB,MAAM,EACN,gDAAgD,EAChD,EAAE,OAAO,EAAE,yDAAyD,EAAE,CACvE,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,4BAA4B,IAAI,EAAE,CAAC;IAE7D,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAClD,MAAM,aAAa,GAAG,cAAc,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QACtE,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAE1D,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,mBAAmB,EACpC,aAAa,EACb,MAAM,EACN,eAAe,EACf,EAAE,GAAG,EAAE,4DAA4D,EAAE,CACtE,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,mBAAmB,EACpC,aAAa,EACb,MAAM,EACN,WAAW,CACZ,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,mBAAmB,EACpC,aAAa,EACb,MAAM,EACN,CAAC,CAAC,KAAK,IAAI,mBAAmB,EAC9B,EAAE,GAAG,EAAE,kDAAkD,EAAE,CAC5D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,MAAyB,EACzB,OAAsB;IAEtB,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAEjD,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC;QAC7B,mDAAmD;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sBAAsB;IACtB,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,WAAW,QAAQ,EAAE,EACrB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACxB,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,EACzC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,oBAAoB,QAAQ,EAAE,EAAE,CAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,WAAW,QAAQ,EAAE,EACrB,MAAM,EACN,gBAAgB,CACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,8DAA8D;gBAC9D,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,WAAW,QAAQ,EAAE,EACrB,MAAM,EACN,aAAa,EACb,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAyB,EACzB,OAAyC,EACzC,OAAsB;IAEtB,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+BAA+B;IAC/B,IAAI,QAAQ,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,gBAAgB,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,gBAAgB,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAC1C,WAAW,EACX,WAAW,EACX,QAAQ,CAAC,aAAa,CAAC,aAAa,CACrC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,QAAQ,EACzB,cAAc,EACd,MAAM,EACN,4BAA4B,EAC5B,EAAE,OAAO,EAAE,sBAAsB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC/D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,cAA6C,EAAE,EAC/C,cAA6C,EAAE,EAC/C,OAAe;IAEf,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC;IAClD,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEvD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9B,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM;gBACR,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAChB,gBAAgB,CAAC,QAAQ,EACzB,mBAAmB,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAChD,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACvB,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,sBAAsB,EACxD,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAC/E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAyB,EACzB,OAAsB;IAEtB,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC;IAErD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,oBAAoB,EACpB,MAAM,EACN,gCAAgC,EAChC,EAAE,GAAG,EAAE,sDAAsD,EAAE,CAChE,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,aAAa;IACb,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,YAAY,EACZ,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxC,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAChD,UAAU,UAAU,CAAC,KAAK,IAAI,SAAS,EAAE,EACzC,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,SAAS,CACzE,CAAC,CAAC;IAEH,aAAa;IACb,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,YAAY,EACZ,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACnD,eAAe,UAAU,CAAC,SAAS,IAAI,SAAS,EAAE,EAClD,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,SAAS,CACjF,CAAC,CAAC;IAEH,OAAO;IACP,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,MAAM,EACN,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAC9C,SAAS,UAAU,CAAC,IAAI,IAAI,SAAS,EAAE,EACvC,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS,CACzE,CAAC,CAAC;IAEH,QAAQ;IACR,MAAM,CAAC,IAAI,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,EACtB,OAAO,EACP,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAC/C,UAAU,UAAU,CAAC,KAAK,IAAI,SAAS,EAAE,EACzC,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Review Command Types
3
+ *
4
+ * Type definitions for the review command which validates
5
+ * implementations against SpecForge documentation.
6
+ */
7
+ /**
8
+ * Review command options from Commander
9
+ */
10
+ export interface ReviewOptions {
11
+ /** Fail on any non-compliance */
12
+ strict?: boolean;
13
+ /** Show suggested fixes for issues */
14
+ fix?: boolean;
15
+ /** Generate detailed report file */
16
+ report?: boolean;
17
+ /** Output as JSON */
18
+ json?: boolean;
19
+ }
20
+ /**
21
+ * Valid scopes for review
22
+ */
23
+ export type ReviewScope = 'ticket' | 'epic' | 'spec' | 'specification';
24
+ /**
25
+ * Check result status
26
+ */
27
+ export type CheckStatus = 'pass' | 'fail' | 'warn' | 'skip';
28
+ /**
29
+ * Overall review status
30
+ */
31
+ export type ReviewStatus = 'pass' | 'fail' | 'partial';
32
+ /**
33
+ * Individual check result
34
+ */
35
+ export interface CheckResult {
36
+ /** Category of the check (Acceptance Criteria, Files, Patterns, Tests) */
37
+ category: string;
38
+ /** Name/description of the check */
39
+ name: string;
40
+ /** Result status */
41
+ status: CheckStatus;
42
+ /** Human-readable message */
43
+ message: string;
44
+ /** Additional details (optional) */
45
+ details?: string;
46
+ /** Suggested fix (optional, shown with --fix) */
47
+ fix?: string;
48
+ }
49
+ /**
50
+ * Review summary statistics
51
+ */
52
+ export interface ReviewSummary {
53
+ /** Number of passed checks */
54
+ passed: number;
55
+ /** Number of failed checks */
56
+ failed: number;
57
+ /** Number of warnings */
58
+ warnings: number;
59
+ /** Number of suggestions (checks with fixes) */
60
+ suggestions: number;
61
+ }
62
+ /**
63
+ * Complete review result
64
+ */
65
+ export interface ReviewResult {
66
+ /** Scope that was reviewed (ticket, epic, spec) */
67
+ scope: string;
68
+ /** ID of the reviewed item */
69
+ id: string;
70
+ /** Title of the reviewed item */
71
+ title: string;
72
+ /** Overall status */
73
+ status: ReviewStatus;
74
+ /** Individual check results */
75
+ checks: CheckResult[];
76
+ /** Summary statistics */
77
+ summary: ReviewSummary;
78
+ /** Report file path (if generated) */
79
+ report?: string;
80
+ }
81
+ /**
82
+ * Acceptance criteria validation from API
83
+ */
84
+ export interface AcceptanceCriteriaValidation {
85
+ /** The criterion text */
86
+ criterion: string;
87
+ /** Validation status */
88
+ status: 'pending' | 'passed' | 'failed';
89
+ /** Optional notes */
90
+ notes?: string;
91
+ }
92
+ /**
93
+ * File specification from technical details
94
+ */
95
+ export interface FileSpec {
96
+ /** File path */
97
+ path: string;
98
+ /** Optional description */
99
+ description?: string;
100
+ }
101
+ /**
102
+ * Technical details from ticket
103
+ */
104
+ export interface TechnicalDetails {
105
+ /** Files to create */
106
+ files?: {
107
+ create?: (FileSpec | string)[];
108
+ modify?: (FileSpec | string)[];
109
+ };
110
+ /** Additional patterns or requirements */
111
+ patterns?: Record<string, unknown>;
112
+ }
113
+ /**
114
+ * Implementation validation results
115
+ */
116
+ export interface ImplementationValidation {
117
+ /** Test suite result */
118
+ tests?: 'passed' | 'failed' | 'skipped';
119
+ /** Type check result */
120
+ typeCheck?: 'passed' | 'failed';
121
+ /** Lint result */
122
+ lint?: 'passed' | 'failed' | 'skipped';
123
+ /** Build result */
124
+ build?: 'passed' | 'failed';
125
+ }
126
+ /**
127
+ * Ticket API response structure
128
+ */
129
+ export interface TicketApiResponse {
130
+ id: string;
131
+ title: string;
132
+ ticketNumber: number;
133
+ status: string;
134
+ acceptanceCriteria?: string[];
135
+ acceptanceCriteriaValidation?: AcceptanceCriteriaValidation[];
136
+ technicalDetails?: TechnicalDetails;
137
+ implementation?: {
138
+ validation?: ImplementationValidation;
139
+ };
140
+ }
141
+ /**
142
+ * Epic API response structure
143
+ */
144
+ export interface EpicApiResponse {
145
+ id: string;
146
+ title: string;
147
+ number: number;
148
+ status: string;
149
+ }
150
+ /**
151
+ * Implementation context API response
152
+ */
153
+ export interface ImplementationContextApiResponse {
154
+ patterns?: {
155
+ codeStandards?: {
156
+ errorHandling?: string;
157
+ };
158
+ returnTypes?: Record<string, string>;
159
+ };
160
+ }
161
+ /**
162
+ * List tickets API response
163
+ */
164
+ export interface ListTicketsApiResponse {
165
+ tickets: Array<{
166
+ id: string;
167
+ title: string;
168
+ ticketNumber: number;
169
+ status: string;
170
+ }>;
171
+ total: number;
172
+ }
173
+ /**
174
+ * List epics API response
175
+ */
176
+ export interface ListEpicsApiResponse {
177
+ epics: Array<{
178
+ id: string;
179
+ title: string;
180
+ number: number;
181
+ status: string;
182
+ }>;
183
+ total: number;
184
+ }
185
+ /**
186
+ * Check categories
187
+ */
188
+ export declare const CHECK_CATEGORIES: {
189
+ readonly ACCEPTANCE_CRITERIA: "Acceptance Criteria";
190
+ readonly FILES: "Files";
191
+ readonly PATTERNS: "Patterns";
192
+ readonly TESTS: "Tests";
193
+ readonly TICKETS: "Tickets";
194
+ readonly COMPLETION: "Completion";
195
+ readonly EPICS: "Epics";
196
+ };
197
+ /**
198
+ * Valid review scopes
199
+ */
200
+ export declare const VALID_SCOPES: ReviewScope[];
201
+ /**
202
+ * Check if scope is valid
203
+ */
204
+ export declare function isValidScope(scope: string): scope is ReviewScope;
205
+ /**
206
+ * Normalize scope (spec -> specification)
207
+ */
208
+ export declare function normalizeScope(scope: ReviewScope): 'ticket' | 'epic' | 'specification';
209
+ /**
210
+ * Get file path from FileSpec or string
211
+ */
212
+ export declare function getFilePath(file: FileSpec | string): string;
213
+ /**
214
+ * Truncate string with ellipsis
215
+ */
216
+ export declare function truncateString(str: string, maxLength: number): string;
217
+ /**
218
+ * Calculate review summary from checks
219
+ */
220
+ export declare function calculateSummary(checks: CheckResult[]): ReviewSummary;
221
+ /**
222
+ * Determine overall status from summary
223
+ */
224
+ export declare function determineOverallStatus(summary: ReviewSummary): ReviewStatus;
225
+ /**
226
+ * Create a check result
227
+ */
228
+ export declare function createCheck(category: string, name: string, status: CheckStatus, message: string, options?: {
229
+ details?: string;
230
+ fix?: string;
231
+ }): CheckResult;
232
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/review/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Review Command Types
3
+ *
4
+ * Type definitions for the review command which validates
5
+ * implementations against SpecForge documentation.
6
+ */
7
+ /**
8
+ * Check categories
9
+ */
10
+ export const CHECK_CATEGORIES = {
11
+ ACCEPTANCE_CRITERIA: 'Acceptance Criteria',
12
+ FILES: 'Files',
13
+ PATTERNS: 'Patterns',
14
+ TESTS: 'Tests',
15
+ TICKETS: 'Tickets',
16
+ COMPLETION: 'Completion',
17
+ EPICS: 'Epics',
18
+ };
19
+ /**
20
+ * Valid review scopes
21
+ */
22
+ export const VALID_SCOPES = ['ticket', 'epic', 'spec', 'specification'];
23
+ /**
24
+ * Check if scope is valid
25
+ */
26
+ export function isValidScope(scope) {
27
+ return VALID_SCOPES.includes(scope);
28
+ }
29
+ /**
30
+ * Normalize scope (spec -> specification)
31
+ */
32
+ export function normalizeScope(scope) {
33
+ if (scope === 'spec')
34
+ return 'specification';
35
+ return scope;
36
+ }
37
+ /**
38
+ * Get file path from FileSpec or string
39
+ */
40
+ export function getFilePath(file) {
41
+ return typeof file === 'string' ? file : file.path;
42
+ }
43
+ /**
44
+ * Truncate string with ellipsis
45
+ */
46
+ export function truncateString(str, maxLength) {
47
+ if (str.length <= maxLength)
48
+ return str;
49
+ return str.slice(0, maxLength) + '...';
50
+ }
51
+ /**
52
+ * Calculate review summary from checks
53
+ */
54
+ export function calculateSummary(checks) {
55
+ return {
56
+ passed: checks.filter(c => c.status === 'pass').length,
57
+ failed: checks.filter(c => c.status === 'fail').length,
58
+ warnings: checks.filter(c => c.status === 'warn').length,
59
+ suggestions: checks.filter(c => c.fix).length,
60
+ };
61
+ }
62
+ /**
63
+ * Determine overall status from summary
64
+ */
65
+ export function determineOverallStatus(summary) {
66
+ if (summary.failed > 0)
67
+ return 'fail';
68
+ if (summary.warnings > 0)
69
+ return 'partial';
70
+ return 'pass';
71
+ }
72
+ /**
73
+ * Create a check result
74
+ */
75
+ export function createCheck(category, name, status, message, options) {
76
+ return {
77
+ category,
78
+ name,
79
+ status,
80
+ message,
81
+ details: options?.details,
82
+ fix: options?.fix,
83
+ };
84
+ }
85
+ //# sourceMappingURL=types.js.map