@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,62 @@
1
+ const SF_STATUS_CONTENT = `# Implementation Status (SpecForge)
2
+
3
+ Display comprehensive implementation status with consolidated progress view.
4
+
5
+ ## Arguments
6
+ - \`$ARGUMENTS\` - Optional: Specification ID to view status for
7
+
8
+ ## Task
9
+
10
+ ### 1. Get Specification Context
11
+
12
+ **Logic:**
13
+ \`\`\`typescript
14
+ // Read project config
15
+ const config = readFile('.specforge.json')
16
+ const specificationId = $ARGUMENTS || config.activeSpecification?.id
17
+ \`\`\`
18
+
19
+ ### 2. Load Implementation Data
20
+
21
+ **MCP Calls:**
22
+ \`\`\`typescript
23
+ get_specification(specificationId)
24
+ list_epics({ specificationId })
25
+ list_tickets({ specificationId })
26
+ \`\`\`
27
+
28
+ ### 3. Display Status Overview
29
+
30
+ **Output:**
31
+ \`\`\`
32
+ \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
33
+ IMPLEMENTATION STATUS
34
+ \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
35
+ Specification: {title}
36
+ Progress: {done}/{total} ({percentage}%)
37
+
38
+ EPICS
39
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
40
+ E{n} \u2502 {title} \u2502 {progress}% \u2502 {status}
41
+
42
+ READY TICKETS
43
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
44
+ E{n}-T{m} \u2502 {title} \u2502 {priority}
45
+
46
+ BLOCKED TICKETS
47
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
48
+ E{n}-T{m} \u2502 {title} \u2502 Blocked by: {dependencies}
49
+ \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
50
+
51
+ Next: Run /sf-next to start implementation
52
+ \`\`\`
53
+
54
+ ## Notes
55
+ - Shows overall progress and epic breakdown
56
+ - Lists ready and blocked tickets
57
+ - Use /sf-validate for system health check
58
+ `;
59
+ export {
60
+ SF_STATUS_CONTENT
61
+ };
62
+ //# sourceMappingURL=sf-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/cli/templates/content/sf-status.ts"],"sourcesContent":["/**\n * SF-Status Command Template\n *\n * Template for displaying implementation status with consolidated tools.\n */\n\nexport const SF_STATUS_CONTENT = `# Implementation Status (SpecForge)\n\nDisplay comprehensive implementation status with consolidated progress view.\n\n## Arguments\n- \\`$ARGUMENTS\\` - Optional: Specification ID to view status for\n\n## Task\n\n### 1. Get Specification Context\n\n**Logic:**\n\\`\\`\\`typescript\n// Read project config\nconst config = readFile('.specforge.json')\nconst specificationId = $ARGUMENTS || config.activeSpecification?.id\n\\`\\`\\`\n\n### 2. Load Implementation Data\n\n**MCP Calls:**\n\\`\\`\\`typescript\nget_specification(specificationId)\nlist_epics({ specificationId })\nlist_tickets({ specificationId })\n\\`\\`\\`\n\n### 3. Display Status Overview\n\n**Output:**\n\\`\\`\\`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nIMPLEMENTATION STATUS\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nSpecification: {title}\nProgress: {done}/{total} ({percentage}%)\n\nEPICS\n─────────────────────────────────────────────────────────────────\nE{n} │ {title} │ {progress}% │ {status}\n\nREADY TICKETS\n─────────────────────────────────────────────────────────────────\nE{n}-T{m} │ {title} │ {priority}\n\nBLOCKED TICKETS\n─────────────────────────────────────────────────────────────────\nE{n}-T{m} │ {title} │ Blocked by: {dependencies}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nNext: Run /sf-next to start implementation\n\\`\\`\\`\n\n## Notes\n- Shows overall progress and epic breakdown\n- Lists ready and blocked tickets\n- Use /sf-validate for system health check\n`;\n"],"mappings":"AAMO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Templates Module
3
+ *
4
+ * Exports all template functions for command and agent scaffolding.
5
+ */
6
+ export { getCommandTemplates, getCommandTemplate, getCommandsByCategory } from './commands.js';
7
+ export { getAgentTemplates, getAgentTemplate, getAgentsByCategory, getAgentNames, } from './agents/index.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAG/F,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,GACd,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { getCommandTemplates, getCommandTemplate, getCommandsByCategory } from "./commands.js";
2
+ import {
3
+ getAgentTemplates,
4
+ getAgentTemplate,
5
+ getAgentsByCategory,
6
+ getAgentNames
7
+ } from "./agents/index.js";
8
+ export {
9
+ getAgentNames,
10
+ getAgentTemplate,
11
+ getAgentTemplates,
12
+ getAgentsByCategory,
13
+ getCommandTemplate,
14
+ getCommandTemplates,
15
+ getCommandsByCategory
16
+ };
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/templates/index.ts"],"sourcesContent":["/**\n * Templates Module\n *\n * Exports all template functions for command and agent scaffolding.\n */\n\n// Command templates\nexport { getCommandTemplates, getCommandTemplate, getCommandsByCategory } from './commands.js';\n\n// Agent templates\nexport {\n getAgentTemplates,\n getAgentTemplate,\n getAgentsByCategory,\n getAgentNames,\n} from './agents/index.js';\n"],"mappings":"AAOA,SAAS,qBAAqB,oBAAoB,6BAA6B;AAG/E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * SpecForge CLI Banner
3
+ * Purple/Violet themed ASCII art matching brand identity
4
+ *
5
+ * Usage:
6
+ * import { printBanner } from './banner.js'
7
+ * printBanner('figlet') // startup / --help
8
+ * printBanner('compact') // every command
9
+ */
10
+ export declare const ANSI_RESET = "\u001B[0m";
11
+ export declare const ANSI_BOLD = "\u001B[1m";
12
+ export declare const ANSI_DIM = "\u001B[2m";
13
+ export declare const BRAND_PALETTE: {
14
+ readonly purpleDark: string;
15
+ readonly purple: string;
16
+ readonly violet: string;
17
+ readonly lilac: string;
18
+ readonly pink: string;
19
+ readonly gray: string;
20
+ readonly darkGray: string;
21
+ readonly white: string;
22
+ readonly g1: string;
23
+ readonly g2: string;
24
+ readonly g3: string;
25
+ readonly g4: string;
26
+ readonly g5: string;
27
+ readonly g6: string;
28
+ readonly g7: string;
29
+ readonly g8: string;
30
+ };
31
+ interface PrintBannerOptions {
32
+ noColor?: boolean;
33
+ }
34
+ export declare function printBanner(variant?: string, options?: PrintBannerOptions): void;
35
+ export declare function getBanner(variant?: string): string;
36
+ export declare function listVariants(): string[];
37
+ export {};
38
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/banner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,eAAO,MAAM,UAAU,cAAY,CAAC;AACpC,eAAO,MAAM,SAAS,cAAY,CAAC;AACnC,eAAO,MAAM,QAAQ,cAAY,CAAC;AAKlC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAkBhB,CAAC;AAuDX,UAAU,kBAAkB;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,MAAiB,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAQ9F;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,MAAiB,GAAG,MAAM,CAE5D;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}
@@ -0,0 +1,89 @@
1
+ import { createRequire } from "node:module";
2
+ const fg = (code) => `\x1B[38;5;${code}m`;
3
+ const ANSI_RESET = "\x1B[0m";
4
+ const ANSI_BOLD = "\x1B[1m";
5
+ const ANSI_DIM = "\x1B[2m";
6
+ const RESET = ANSI_RESET;
7
+ const BOLD = ANSI_BOLD;
8
+ const BRAND_PALETTE = {
9
+ purpleDark: fg(54),
10
+ purple: fg(135),
11
+ violet: fg(141),
12
+ lilac: fg(183),
13
+ pink: fg(212),
14
+ gray: fg(245),
15
+ darkGray: fg(240),
16
+ white: fg(255),
17
+ // Gradient stops
18
+ g1: fg(93),
19
+ g2: fg(99),
20
+ g3: fg(105),
21
+ g4: fg(111),
22
+ g5: fg(129),
23
+ g6: fg(135),
24
+ g7: fg(141),
25
+ g8: fg(147)
26
+ };
27
+ const C = BRAND_PALETTE;
28
+ const require2 = createRequire(import.meta.url);
29
+ const VERSION = process.env.SPECFORGE_VERSION || require2("../../../package.json").version || "0.1.0";
30
+ const TAGLINE = "Forge specs into working software";
31
+ const banners = {
32
+ // ─── Emerald v2 outline + </> code symbol + FIGlet ───────
33
+ figlet: () => `
34
+ ${C.g1} \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588${RESET}
35
+ ${C.g1} \u2588\u2588 \u2588\u2588${RESET}
36
+ ${C.g2} \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g1}____${RESET} ${C.g5}_____${RESET}
37
+ ${C.g3} \u2588\u2588 \u2588\u2588 \u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g2}/ ___| _ __ ___ ___ ${C.g6}| ___|__ _ __ __ _ ___${RESET}
38
+ ${C.g4} \u2588\u2588 \u2588\u2588 \u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g2}\\___ \\| '_ \\ / _ \\/ __|${C.g6}| |_ / _ \\| '__/ _\` |/ _ \\${RESET}
39
+ ${C.g5} \u2588\u2588 \u2588\u2588 \u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g3}___) | |_) | __/ (__ ${C.g7}| _| (_) | | | (_| | __/${RESET}
40
+ ${C.g6} \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588${RESET} ${C.g3}|____/| .__/ \\___|\\___${C.g7} |_| \\___/|_| \\__, |\\___|${RESET}
41
+ ${C.g6} \u2588\u2588 \u2588\u2588${RESET} ${C.g4}|_|${RESET} ${C.g8}|___/${RESET}
42
+ ${C.g6} \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588${RESET}
43
+ ${C.darkGray} ${TAGLINE} v${VERSION}${RESET}
44
+ `,
45
+ // ─── Compact one-liner (for every command) ───────────────
46
+ compact: () => `
47
+ ${C.violet}\u2B22${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}
48
+ `,
49
+ // ─── Sleek box ───────────────────────────────────────────
50
+ sleek: () => `
51
+ ${C.purpleDark}\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557${RESET}
52
+ ${C.purpleDark}\u2551${RESET} ${C.purpleDark}\u2551${RESET}
53
+ ${C.purpleDark}\u2551${RESET} ${C.violet}\u2692${RESET} ${BOLD}${C.lilac}S P E C${C.violet}F O R G E${RESET} ${C.darkGray}v${VERSION}${RESET} ${C.purpleDark}\u2551${RESET}
54
+ ${C.purpleDark}\u2551${RESET} ${C.darkGray}${TAGLINE}${RESET} ${C.purpleDark}\u2551${RESET}
55
+ ${C.purpleDark}\u2551${RESET} ${C.purpleDark}\u2551${RESET}
56
+ ${C.purpleDark}\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D${RESET}
57
+ `,
58
+ // ─── Diamond icon + text ─────────────────────────────────
59
+ diamond: () => `
60
+ ${C.violet} \u25C6${RESET}
61
+ ${C.violet} \u25C7${C.lilac}\u25C6${C.violet}\u25C7${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}
62
+ ${C.violet} \u25C6${RESET} ${C.darkGray}${TAGLINE}${RESET}
63
+ `
64
+ };
65
+ function printBanner(variant = "figlet", options = {}) {
66
+ const noColor = options.noColor || process.env.NO_COLOR !== void 0 || !process.stdout.isTTY;
67
+ const bannerFn = banners[variant] || banners.figlet;
68
+ let output = bannerFn();
69
+ if (noColor) {
70
+ output = output.replace(/\x1b\[[0-9;]*m/g, "");
71
+ }
72
+ process.stdout.write(output);
73
+ }
74
+ function getBanner(variant = "figlet") {
75
+ return (banners[variant] || banners.figlet)();
76
+ }
77
+ function listVariants() {
78
+ return Object.keys(banners);
79
+ }
80
+ export {
81
+ ANSI_BOLD,
82
+ ANSI_DIM,
83
+ ANSI_RESET,
84
+ BRAND_PALETTE,
85
+ getBanner,
86
+ listVariants,
87
+ printBanner
88
+ };
89
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/ui/banner.ts"],"sourcesContent":["/**\n * SpecForge CLI Banner\n * Purple/Violet themed ASCII art matching brand identity\n *\n * Usage:\n * import { printBanner } from './banner.js'\n * printBanner('figlet') // startup / --help\n * printBanner('compact') // every command\n */\n\nimport { createRequire } from 'node:module';\n\n// ─── ANSI 256-color helpers ───────────────────────────────\nconst fg = (code: number): string => `\\x1b[38;5;${code}m`;\nexport const ANSI_RESET = '\\x1b[0m';\nexport const ANSI_BOLD = '\\x1b[1m';\nexport const ANSI_DIM = '\\x1b[2m';\nconst RESET = ANSI_RESET;\nconst BOLD = ANSI_BOLD;\n\n// ─── Brand palette ────────────────────────────────────────\nexport const BRAND_PALETTE = {\n purpleDark: fg(54),\n purple: fg(135),\n violet: fg(141),\n lilac: fg(183),\n pink: fg(212),\n gray: fg(245),\n darkGray: fg(240),\n white: fg(255),\n // Gradient stops\n g1: fg(93),\n g2: fg(99),\n g3: fg(105),\n g4: fg(111),\n g5: fg(129),\n g6: fg(135),\n g7: fg(141),\n g8: fg(147),\n} as const;\n\nconst C = BRAND_PALETTE;\n\n// ─── Version ──────────────────────────────────────────────\nconst require = createRequire(import.meta.url);\nconst VERSION: string = process.env.SPECFORGE_VERSION || require('../../../package.json').version || '0.1.0';\nconst TAGLINE = 'Forge specs into working software';\n\n// ═══════════════════════════════════════════════════════════\n// BANNER VARIANTS\n// ═══════════════════════════════════════════════════════════\n\nconst banners: Record<string, () => string> = {\n // ─── Emerald v2 outline + </> code symbol + FIGlet ───────\n figlet: () => `\n${C.g1} █████████████████${RESET}\n${C.g1} ██ ██${RESET}\n${C.g2} ██ ██ ██ ██${RESET} ${C.g1}____${RESET} ${C.g5}_____${RESET}\n${C.g3} ██ ██ █ ██ ██${RESET} ${C.g2}/ ___| _ __ ___ ___ ${C.g6}| ___|__ _ __ __ _ ___${RESET}\n${C.g4} ██ ██ █ ██ ██${RESET} ${C.g2}\\\\___ \\\\| '_ \\\\ / _ \\\\/ __|${C.g6}| |_ / _ \\\\| '__/ _\\` |/ _ \\\\${RESET}\n${C.g5} ██ ██ █ ██ ██${RESET} ${C.g3}___) | |_) | __/ (__ ${C.g7}| _| (_) | | | (_| | __/${RESET}\n${C.g6} ██ ██ ██ ██${RESET} ${C.g3}|____/| .__/ \\\\___|\\\\___${C.g7} |_| \\\\___/|_| \\\\__, |\\\\___|${RESET}\n${C.g6} ██ ██${RESET} ${C.g4}|_|${RESET} ${C.g8}|___/${RESET}\n${C.g6} █████████████████${RESET}\n${C.darkGray} ${TAGLINE} v${VERSION}${RESET}\n`,\n\n // ─── Compact one-liner (for every command) ───────────────\n compact: () => `\n ${C.violet}⬢${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}\n`,\n\n // ─── Sleek box ───────────────────────────────────────────\n sleek: () => `\n ${C.purpleDark}╔══════════════════════════════════════════╗${RESET}\n ${C.purpleDark}║${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}║${RESET} ${C.violet}⚒${RESET} ${BOLD}${C.lilac}S P E C${C.violet}F O R G E${RESET} ${C.darkGray}v${VERSION}${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}║${RESET} ${C.darkGray}${TAGLINE}${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}║${RESET} ${C.purpleDark}║${RESET}\n ${C.purpleDark}╚══════════════════════════════════════════╝${RESET}\n`,\n\n // ─── Diamond icon + text ─────────────────────────────────\n diamond: () => `\n ${C.violet} ◆${RESET}\n ${C.violet} ◇${C.lilac}◆${C.violet}◇${RESET} ${BOLD}${C.lilac}Spec${C.pink}Forge${RESET} ${C.darkGray}v${VERSION}${RESET}\n ${C.violet} ◆${RESET} ${C.darkGray}${TAGLINE}${RESET}\n`,\n};\n\n// ═══════════════════════════════════════════════════════════\n// PUBLIC API\n// ═══════════════════════════════════════════════════════════\n\ninterface PrintBannerOptions {\n noColor?: boolean;\n}\n\nexport function printBanner(variant: string = 'figlet', options: PrintBannerOptions = {}): void {\n const noColor = options.noColor || process.env.NO_COLOR !== undefined || !process.stdout.isTTY;\n const bannerFn = banners[variant] || banners.figlet;\n let output = bannerFn();\n if (noColor) {\n output = output.replace(/\\x1b\\[[0-9;]*m/g, '');\n }\n process.stdout.write(output);\n}\n\nexport function getBanner(variant: string = 'figlet'): string {\n return (banners[variant] || banners.figlet)();\n}\n\nexport function listVariants(): string[] {\n return Object.keys(banners);\n}\n"],"mappings":"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","names":["require"]}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Terminal Color Utilities
3
+ *
4
+ * Provides consistent color theming across the CLI.
5
+ * All colors are defined here to ensure visual consistency.
6
+ */
7
+ /**
8
+ * Brand colors for SpecForge CLI
9
+ */
10
+ export declare const colors: {
11
+ /** Primary brand color - used for emphasis */
12
+ readonly primary: import("chalk").ChalkInstance;
13
+ /** Secondary color - used for less emphasis */
14
+ readonly secondary: import("chalk").ChalkInstance;
15
+ /** Success messages and indicators */
16
+ readonly success: import("chalk").ChalkInstance;
17
+ /** Warning messages */
18
+ readonly warning: import("chalk").ChalkInstance;
19
+ /** Error messages */
20
+ readonly error: import("chalk").ChalkInstance;
21
+ /** Muted/secondary text */
22
+ readonly muted: import("chalk").ChalkInstance;
23
+ /** Bold text */
24
+ readonly bold: import("chalk").ChalkInstance;
25
+ /** Underlined text (for URLs) */
26
+ readonly link: import("chalk").ChalkInstance;
27
+ /** Code/command styling */
28
+ readonly code: import("chalk").ChalkInstance;
29
+ /** Dimmed text for less important info */
30
+ readonly dim: import("chalk").ChalkInstance;
31
+ };
32
+ /**
33
+ * Semantic color functions for common use cases
34
+ */
35
+ export declare const style: {
36
+ /** Style a command for display */
37
+ readonly command: (cmd: string) => string;
38
+ /** Style a URL for display */
39
+ readonly url: (url: string) => string;
40
+ /** Style a file path */
41
+ readonly path: (path: string) => string;
42
+ /** Style a key/label */
43
+ readonly label: (label: string) => string;
44
+ /** Style a value */
45
+ readonly value: (value: string) => string;
46
+ /** Style as success */
47
+ readonly ok: (text: string) => string;
48
+ /** Style as error */
49
+ readonly err: (text: string) => string;
50
+ /** Style as warning */
51
+ readonly warn: (text: string) => string;
52
+ /** Style as info */
53
+ readonly info: (text: string) => string;
54
+ };
55
+ /**
56
+ * Status icons with colors
57
+ */
58
+ export declare const icons: {
59
+ readonly success: string;
60
+ readonly error: string;
61
+ readonly warning: string;
62
+ readonly info: string;
63
+ readonly pending: string;
64
+ readonly running: string;
65
+ readonly arrow: string;
66
+ readonly bullet: string;
67
+ };
68
+ /**
69
+ * Check if terminal supports colors
70
+ */
71
+ export declare function supportsColor(): boolean;
72
+ /**
73
+ * Disable colors (for non-TTY or --no-color flag)
74
+ */
75
+ export declare function disableColors(): void;
76
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/colors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB,8CAA8C;;IAG9C,+CAA+C;;IAG/C,sCAAsC;;IAGtC,uBAAuB;;IAGvB,qBAAqB;;IAGrB,2BAA2B;;IAG3B,gBAAgB;;IAGhB,iCAAiC;;IAGjC,2BAA2B;;IAG3B,0CAA0C;;CAElC,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,KAAK;IAChB,kCAAkC;4BACnB,MAAM;IAErB,8BAA8B;wBACnB,MAAM;IAEjB,wBAAwB;0BACX,MAAM;IAEnB,wBAAwB;4BACT,MAAM;IAErB,oBAAoB;4BACL,MAAM;IAErB,uBAAuB;wBACZ,MAAM;IAEjB,qBAAqB;yBACT,MAAM;IAElB,uBAAuB;0BACV,MAAM;IAEnB,oBAAoB;0BACP,MAAM;CACX,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;CASR,CAAC;AAEX;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -0,0 +1,67 @@
1
+ import chalk from "chalk";
2
+ const colors = {
3
+ /** Primary brand color - used for emphasis */
4
+ primary: chalk.cyan,
5
+ /** Secondary color - used for less emphasis */
6
+ secondary: chalk.blue,
7
+ /** Success messages and indicators */
8
+ success: chalk.green,
9
+ /** Warning messages */
10
+ warning: chalk.yellow,
11
+ /** Error messages */
12
+ error: chalk.red,
13
+ /** Muted/secondary text */
14
+ muted: chalk.gray,
15
+ /** Bold text */
16
+ bold: chalk.bold,
17
+ /** Underlined text (for URLs) */
18
+ link: chalk.underline.cyan,
19
+ /** Code/command styling */
20
+ code: chalk.cyan,
21
+ /** Dimmed text for less important info */
22
+ dim: chalk.dim
23
+ };
24
+ const style = {
25
+ /** Style a command for display */
26
+ command: (cmd) => colors.code(cmd),
27
+ /** Style a URL for display */
28
+ url: (url) => colors.link(url),
29
+ /** Style a file path */
30
+ path: (path) => colors.muted(path),
31
+ /** Style a key/label */
32
+ label: (label) => colors.bold(label),
33
+ /** Style a value */
34
+ value: (value) => colors.primary(value),
35
+ /** Style as success */
36
+ ok: (text) => colors.success(text),
37
+ /** Style as error */
38
+ err: (text) => colors.error(text),
39
+ /** Style as warning */
40
+ warn: (text) => colors.warning(text),
41
+ /** Style as info */
42
+ info: (text) => colors.primary(text)
43
+ };
44
+ const icons = {
45
+ success: colors.success("\u2713"),
46
+ error: colors.error("\u2717"),
47
+ warning: colors.warning("\u26A0"),
48
+ info: colors.primary("\u2139"),
49
+ pending: colors.muted("\u25CB"),
50
+ running: colors.primary("\u25CF"),
51
+ arrow: colors.muted("\u2192"),
52
+ bullet: colors.muted("\u2022")
53
+ };
54
+ function supportsColor() {
55
+ return chalk.level > 0;
56
+ }
57
+ function disableColors() {
58
+ chalk.level = 0;
59
+ }
60
+ export {
61
+ colors,
62
+ disableColors,
63
+ icons,
64
+ style,
65
+ supportsColor
66
+ };
67
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/ui/colors.ts"],"sourcesContent":["/**\n * Terminal Color Utilities\n *\n * Provides consistent color theming across the CLI.\n * All colors are defined here to ensure visual consistency.\n */\n\nimport chalk from 'chalk';\n\n/**\n * Brand colors for SpecForge CLI\n */\nexport const colors = {\n /** Primary brand color - used for emphasis */\n primary: chalk.cyan,\n\n /** Secondary color - used for less emphasis */\n secondary: chalk.blue,\n\n /** Success messages and indicators */\n success: chalk.green,\n\n /** Warning messages */\n warning: chalk.yellow,\n\n /** Error messages */\n error: chalk.red,\n\n /** Muted/secondary text */\n muted: chalk.gray,\n\n /** Bold text */\n bold: chalk.bold,\n\n /** Underlined text (for URLs) */\n link: chalk.underline.cyan,\n\n /** Code/command styling */\n code: chalk.cyan,\n\n /** Dimmed text for less important info */\n dim: chalk.dim,\n} as const;\n\n/**\n * Semantic color functions for common use cases\n */\nexport const style = {\n /** Style a command for display */\n command: (cmd: string) => colors.code(cmd),\n\n /** Style a URL for display */\n url: (url: string) => colors.link(url),\n\n /** Style a file path */\n path: (path: string) => colors.muted(path),\n\n /** Style a key/label */\n label: (label: string) => colors.bold(label),\n\n /** Style a value */\n value: (value: string) => colors.primary(value),\n\n /** Style as success */\n ok: (text: string) => colors.success(text),\n\n /** Style as error */\n err: (text: string) => colors.error(text),\n\n /** Style as warning */\n warn: (text: string) => colors.warning(text),\n\n /** Style as info */\n info: (text: string) => colors.primary(text),\n} as const;\n\n/**\n * Status icons with colors\n */\nexport const icons = {\n success: colors.success('✓'),\n error: colors.error('✗'),\n warning: colors.warning('⚠'),\n info: colors.primary('ℹ'),\n pending: colors.muted('○'),\n running: colors.primary('●'),\n arrow: colors.muted('→'),\n bullet: colors.muted('•'),\n} as const;\n\n/**\n * Check if terminal supports colors\n */\nexport function supportsColor(): boolean {\n return chalk.level > 0;\n}\n\n/**\n * Disable colors (for non-TTY or --no-color flag)\n */\nexport function disableColors(): void {\n chalk.level = 0;\n}\n"],"mappings":"AAOA,OAAO,WAAW;AAKX,MAAM,SAAS;AAAA;AAAA,EAEpB,SAAS,MAAM;AAAA;AAAA,EAGf,WAAW,MAAM;AAAA;AAAA,EAGjB,SAAS,MAAM;AAAA;AAAA,EAGf,SAAS,MAAM;AAAA;AAAA,EAGf,OAAO,MAAM;AAAA;AAAA,EAGb,OAAO,MAAM;AAAA;AAAA,EAGb,MAAM,MAAM;AAAA;AAAA,EAGZ,MAAM,MAAM,UAAU;AAAA;AAAA,EAGtB,MAAM,MAAM;AAAA;AAAA,EAGZ,KAAK,MAAM;AACb;AAKO,MAAM,QAAQ;AAAA;AAAA,EAEnB,SAAS,CAAC,QAAgB,OAAO,KAAK,GAAG;AAAA;AAAA,EAGzC,KAAK,CAAC,QAAgB,OAAO,KAAK,GAAG;AAAA;AAAA,EAGrC,MAAM,CAAC,SAAiB,OAAO,MAAM,IAAI;AAAA;AAAA,EAGzC,OAAO,CAAC,UAAkB,OAAO,KAAK,KAAK;AAAA;AAAA,EAG3C,OAAO,CAAC,UAAkB,OAAO,QAAQ,KAAK;AAAA;AAAA,EAG9C,IAAI,CAAC,SAAiB,OAAO,QAAQ,IAAI;AAAA;AAAA,EAGzC,KAAK,CAAC,SAAiB,OAAO,MAAM,IAAI;AAAA;AAAA,EAGxC,MAAM,CAAC,SAAiB,OAAO,QAAQ,IAAI;AAAA;AAAA,EAG3C,MAAM,CAAC,SAAiB,OAAO,QAAQ,IAAI;AAC7C;AAKO,MAAM,QAAQ;AAAA,EACnB,SAAS,OAAO,QAAQ,QAAG;AAAA,EAC3B,OAAO,OAAO,MAAM,QAAG;AAAA,EACvB,SAAS,OAAO,QAAQ,QAAG;AAAA,EAC3B,MAAM,OAAO,QAAQ,QAAG;AAAA,EACxB,SAAS,OAAO,MAAM,QAAG;AAAA,EACzB,SAAS,OAAO,QAAQ,QAAG;AAAA,EAC3B,OAAO,OAAO,MAAM,QAAG;AAAA,EACvB,QAAQ,OAAO,MAAM,QAAG;AAC1B;AAKO,SAAS,gBAAyB;AACvC,SAAO,MAAM,QAAQ;AACvB;AAKO,SAAS,gBAAsB;AACpC,QAAM,QAAQ;AAChB;","names":[]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI UI Utilities Module
3
+ */
4
+ export * from './colors.js';
5
+ export * from './output.js';
6
+ export * from './spinner.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./colors.js";
2
+ export * from "./output.js";
3
+ export * from "./spinner.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/ui/index.ts"],"sourcesContent":["/**\n * CLI UI Utilities Module\n */\n\nexport * from './colors.js';\nexport * from './output.js';\nexport * from './spinner.js';\n"],"mappings":"AAIA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Output Formatting Utilities
3
+ *
4
+ * Provides consistent output formatting for tables, lists, and structured data.
5
+ */
6
+ /**
7
+ * Print a labeled value
8
+ *
9
+ * @example
10
+ * printField('Project', 'my-project');
11
+ * // Output: Project: my-project
12
+ */
13
+ export declare function printField(label: string, value: string | null | undefined): void;
14
+ /**
15
+ * Print a section header
16
+ *
17
+ * @example
18
+ * printHeader('Configuration');
19
+ * // Output:
20
+ * // Configuration
21
+ * // ─────────────
22
+ */
23
+ export declare function printHeader(title: string): void;
24
+ /**
25
+ * Print a blank line
26
+ */
27
+ export declare function printBlank(): void;
28
+ /**
29
+ * Print a list of items
30
+ *
31
+ * @example
32
+ * printList(['Item 1', 'Item 2', 'Item 3']);
33
+ * // Output:
34
+ * // • Item 1
35
+ * // • Item 2
36
+ * // • Item 3
37
+ */
38
+ export declare function printList(items: string[], bullet?: string): void;
39
+ /**
40
+ * Print a success message
41
+ *
42
+ * @example
43
+ * printSuccess('Configuration saved');
44
+ * // Output: ✓ Configuration saved
45
+ */
46
+ export declare function printSuccess(message: string): void;
47
+ /**
48
+ * Print an error message
49
+ *
50
+ * @example
51
+ * printError('Failed to connect');
52
+ * // Output: ✗ Failed to connect
53
+ */
54
+ export declare function printError(message: string): void;
55
+ /**
56
+ * Print a warning message
57
+ *
58
+ * @example
59
+ * printWarning('API key will expire soon');
60
+ * // Output: ⚠ API key will expire soon
61
+ */
62
+ export declare function printWarning(message: string): void;
63
+ /**
64
+ * Print an info message
65
+ *
66
+ * @example
67
+ * printInfo('Fetching data...');
68
+ * // Output: ℹ Fetching data...
69
+ */
70
+ export declare function printInfo(message: string): void;
71
+ /**
72
+ * Print a key-value table
73
+ *
74
+ * @example
75
+ * printTable({
76
+ * 'Project': 'my-project',
77
+ * 'Specification': 'v2.0',
78
+ * 'Status': 'active',
79
+ * });
80
+ */
81
+ export declare function printTable(data: Record<string, string | null | undefined>): void;
82
+ /**
83
+ * Print JSON output (for --format json)
84
+ *
85
+ * @example
86
+ * printJson({ project: 'my-project', status: 'active' });
87
+ */
88
+ export declare function printJson(data: unknown): void;
89
+ /**
90
+ * Print a command hint
91
+ *
92
+ * @example
93
+ * printHint('specforge init', 'Initialize project');
94
+ * // Output: → Run `specforge init` to initialize project
95
+ */
96
+ export declare function printHint(command: string, description: string): void;
97
+ /**
98
+ * Print a URL with description
99
+ *
100
+ * @example
101
+ * printLink('https://specforge.com', 'Visit documentation');
102
+ * // Output: → Visit documentation: https://specforge.com
103
+ */
104
+ export declare function printLink(url: string, description: string): void;
105
+ /**
106
+ * Format bytes to human readable size
107
+ */
108
+ export declare function formatBytes(bytes: number): string;
109
+ /**
110
+ * Format duration in milliseconds to human readable
111
+ */
112
+ export declare function formatDuration(ms: number): string;
113
+ /**
114
+ * Truncate string with ellipsis
115
+ */
116
+ export declare function truncate(str: string, maxLength: number): string;
117
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAGhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAqB,GAAG,IAAI,CAI9E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAQhF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D"}
@@ -0,0 +1,83 @@
1
+ import { colors, style, icons } from "./colors.js";
2
+ function printField(label, value) {
3
+ const displayValue = value ?? colors.muted("(not set)");
4
+ console.log(`${style.label(label)}: ${displayValue}`);
5
+ }
6
+ function printHeader(title) {
7
+ console.log();
8
+ console.log(style.label(title));
9
+ console.log(colors.muted("\u2500".repeat(title.length)));
10
+ }
11
+ function printBlank() {
12
+ console.log();
13
+ }
14
+ function printList(items, bullet = icons.bullet) {
15
+ for (const item of items) {
16
+ console.log(` ${bullet} ${item}`);
17
+ }
18
+ }
19
+ function printSuccess(message) {
20
+ console.log(`${icons.success} ${message}`);
21
+ }
22
+ function printError(message) {
23
+ console.error(`${icons.error} ${style.err(message)}`);
24
+ }
25
+ function printWarning(message) {
26
+ console.error(`${icons.warning} ${style.warn(message)}`);
27
+ }
28
+ function printInfo(message) {
29
+ console.log(`${icons.info} ${message}`);
30
+ }
31
+ function printTable(data) {
32
+ const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length));
33
+ for (const [key, value] of Object.entries(data)) {
34
+ const paddedKey = key.padEnd(maxKeyLength);
35
+ const displayValue = value ?? colors.muted("(not set)");
36
+ console.log(` ${style.label(paddedKey)} ${displayValue}`);
37
+ }
38
+ }
39
+ function printJson(data) {
40
+ console.log(JSON.stringify(data, null, 2));
41
+ }
42
+ function printHint(command, description) {
43
+ console.log(`${icons.arrow} Run ${style.command(command)} to ${description}`);
44
+ }
45
+ function printLink(url, description) {
46
+ console.log(`${icons.arrow} ${description}: ${style.url(url)}`);
47
+ }
48
+ function formatBytes(bytes) {
49
+ if (bytes === 0) return "0 B";
50
+ const units = ["B", "KB", "MB", "GB", "TB"];
51
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
52
+ return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${units[i]}`;
53
+ }
54
+ function formatDuration(ms) {
55
+ if (ms < 1e3) return `${ms}ms`;
56
+ if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
57
+ if (ms < 36e5) return `${Math.floor(ms / 6e4)}m ${Math.floor(ms % 6e4 / 1e3)}s`;
58
+ const hours = Math.floor(ms / 36e5);
59
+ const minutes = Math.floor(ms % 36e5 / 6e4);
60
+ return `${hours}h ${minutes}m`;
61
+ }
62
+ function truncate(str, maxLength) {
63
+ if (str.length <= maxLength) return str;
64
+ return str.slice(0, maxLength - 1) + "\u2026";
65
+ }
66
+ export {
67
+ formatBytes,
68
+ formatDuration,
69
+ printBlank,
70
+ printError,
71
+ printField,
72
+ printHeader,
73
+ printHint,
74
+ printInfo,
75
+ printJson,
76
+ printLink,
77
+ printList,
78
+ printSuccess,
79
+ printTable,
80
+ printWarning,
81
+ truncate
82
+ };
83
+ //# sourceMappingURL=output.js.map