@glxmart/boss-cli 1.0.0-beta.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 (506) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/assets/claude-folder/agents/.gitkeep +0 -0
  4. package/assets/claude-folder/commands/boss-commands.md +138 -0
  5. package/assets/claude-folder/rules/boss-workflow.md +33 -0
  6. package/assets/claude-folder/rules/code-style.md +23 -0
  7. package/assets/claude-folder/rules/security.md +22 -0
  8. package/assets/claude-folder/rules/testing.md +32 -0
  9. package/assets/claude-folder/settings.local.json +88 -0
  10. package/assets/claude-folder/skills/.gitkeep +0 -0
  11. package/assets/claude-md/docs/container-use.md +140 -0
  12. package/assets/claude-md/docs/github-operations.md +238 -0
  13. package/assets/claude-md/docs/initialization.md +186 -0
  14. package/assets/claude-md/docs/quality-standards.md +15 -0
  15. package/assets/claude-md/docs/spec-kit.md +46 -0
  16. package/assets/claude-md/docs/workers.md +174 -0
  17. package/assets/claude-md/docs/workflow.md +140 -0
  18. package/assets/claude-md/template.md +812 -0
  19. package/assets/docker-compose/docker-compose.yml +52 -0
  20. package/assets/git-hooks/commit-msg.sh +102 -0
  21. package/assets/git-hooks/pre-commit-check.sh +21 -0
  22. package/assets/git-hooks/pre-commit.sh +6 -0
  23. package/assets/git-hooks/pre-push.sh +154 -0
  24. package/assets/git-hooks/security-check.sh +40 -0
  25. package/assets/git-hooks/test-changed.sh +84 -0
  26. package/assets/github-workflows/CODEOWNERS +3 -0
  27. package/assets/github-workflows/boss-ci.yml +40 -0
  28. package/assets/github-workflows/boss-gates.yml +28 -0
  29. package/assets/start-boss-sh/start-boss.sh +471 -0
  30. package/assets/template-docs/api-service-fastify.md +98 -0
  31. package/assets/template-docs/blank.md +91 -0
  32. package/assets/template-docs/nextjs-app-turbo.md +102 -0
  33. package/assets/template-docs/t3-app.md +106 -0
  34. package/assets/template-loader/README.md +28 -0
  35. package/assets/template-loader/eslint.config.node.js +28 -0
  36. package/assets/template-loader/eslint.config.react.js +47 -0
  37. package/assets/template-loader/gitignore +42 -0
  38. package/assets/template-loader/index.test.ts +10 -0
  39. package/assets/template-loader/index.ts +13 -0
  40. package/assets/template-loader/prettierignore +8 -0
  41. package/assets/template-loader/vitest.config.ts +19 -0
  42. package/assets/worker-configs/architect/.claude/commands/.gitkeep +0 -0
  43. package/assets/worker-configs/architect/.claude/skills/.gitkeep +0 -0
  44. package/assets/worker-configs/architect/CLAUDE.md +106 -0
  45. package/assets/worker-configs/clarifier/.claude/commands/.gitkeep +1 -0
  46. package/assets/worker-configs/clarifier/.claude/skills/.gitkeep +1 -0
  47. package/assets/worker-configs/clarifier/CLAUDE.md +112 -0
  48. package/assets/worker-configs/code-reviewer/CLAUDE.md +113 -0
  49. package/assets/worker-configs/consolidator/.claude/commands/.gitkeep +1 -0
  50. package/assets/worker-configs/consolidator/.claude/skills/.gitkeep +1 -0
  51. package/assets/worker-configs/consolidator/CLAUDE.md +114 -0
  52. package/assets/worker-configs/developer-backend/.claude/commands/.gitkeep +1 -0
  53. package/assets/worker-configs/developer-backend/.claude/skills/.gitkeep +1 -0
  54. package/assets/worker-configs/developer-backend/CLAUDE.md +116 -0
  55. package/assets/worker-configs/developer-frontend/.claude/commands/.gitkeep +1 -0
  56. package/assets/worker-configs/developer-frontend/.claude/skills/.gitkeep +1 -0
  57. package/assets/worker-configs/developer-frontend/CLAUDE.md +116 -0
  58. package/assets/worker-configs/developer-fullstack/.claude/commands/.gitkeep +1 -0
  59. package/assets/worker-configs/developer-fullstack/.claude/skills/.gitkeep +1 -0
  60. package/assets/worker-configs/developer-fullstack/CLAUDE.md +116 -0
  61. package/assets/worker-configs/devops-engineer/CLAUDE.md +111 -0
  62. package/assets/worker-configs/planner/.claude/commands/.gitkeep +1 -0
  63. package/assets/worker-configs/planner/.claude/skills/.gitkeep +1 -0
  64. package/assets/worker-configs/planner/CLAUDE.md +111 -0
  65. package/assets/worker-configs/product-owner/CLAUDE.md +108 -0
  66. package/assets/worker-configs/reviewer/.claude/commands/.gitkeep +1 -0
  67. package/assets/worker-configs/reviewer/.claude/skills/.gitkeep +1 -0
  68. package/assets/worker-configs/reviewer/CLAUDE.md +110 -0
  69. package/assets/worker-configs/security-engineer/CLAUDE.md +109 -0
  70. package/assets/worker-configs/spec-writer/.claude/commands/.gitkeep +1 -0
  71. package/assets/worker-configs/spec-writer/.claude/skills/.gitkeep +1 -0
  72. package/assets/worker-configs/spec-writer/CLAUDE.md +110 -0
  73. package/assets/worker-configs/technical-writer/CLAUDE.md +107 -0
  74. package/assets/worker-configs/tester/CLAUDE.md +110 -0
  75. package/dist/assets/claude-folder/agents/.gitkeep +0 -0
  76. package/dist/assets/claude-folder/commands/boss-commands.md +138 -0
  77. package/dist/assets/claude-folder/rules/boss-workflow.md +33 -0
  78. package/dist/assets/claude-folder/rules/code-style.md +23 -0
  79. package/dist/assets/claude-folder/rules/security.md +22 -0
  80. package/dist/assets/claude-folder/rules/testing.md +32 -0
  81. package/dist/assets/claude-folder/settings.local.json +88 -0
  82. package/dist/assets/claude-folder/skills/.gitkeep +0 -0
  83. package/dist/assets/claude-md/docs/container-use.md +140 -0
  84. package/dist/assets/claude-md/docs/github-operations.md +238 -0
  85. package/dist/assets/claude-md/docs/initialization.md +186 -0
  86. package/dist/assets/claude-md/docs/quality-standards.md +15 -0
  87. package/dist/assets/claude-md/docs/spec-kit.md +46 -0
  88. package/dist/assets/claude-md/docs/workers.md +174 -0
  89. package/dist/assets/claude-md/docs/workflow.md +140 -0
  90. package/dist/assets/claude-md/template.md +812 -0
  91. package/dist/assets/docker-compose/docker-compose.yml +52 -0
  92. package/dist/assets/git-hooks/commit-msg.sh +102 -0
  93. package/dist/assets/git-hooks/pre-commit-check.sh +21 -0
  94. package/dist/assets/git-hooks/pre-commit.sh +6 -0
  95. package/dist/assets/git-hooks/pre-push.sh +154 -0
  96. package/dist/assets/git-hooks/security-check.sh +40 -0
  97. package/dist/assets/git-hooks/test-changed.sh +84 -0
  98. package/dist/assets/github-workflows/CODEOWNERS +3 -0
  99. package/dist/assets/github-workflows/boss-ci.yml +40 -0
  100. package/dist/assets/github-workflows/boss-gates.yml +28 -0
  101. package/dist/assets/start-boss-sh/start-boss.sh +471 -0
  102. package/dist/assets/template-docs/api-service-fastify.md +98 -0
  103. package/dist/assets/template-docs/blank.md +91 -0
  104. package/dist/assets/template-docs/nextjs-app-turbo.md +102 -0
  105. package/dist/assets/template-docs/t3-app.md +106 -0
  106. package/dist/assets/template-loader/README.md +28 -0
  107. package/dist/assets/template-loader/eslint.config.node.js +28 -0
  108. package/dist/assets/template-loader/eslint.config.react.js +47 -0
  109. package/dist/assets/template-loader/gitignore +42 -0
  110. package/dist/assets/template-loader/index.test.ts +10 -0
  111. package/dist/assets/template-loader/index.ts +13 -0
  112. package/dist/assets/template-loader/prettierignore +8 -0
  113. package/dist/assets/template-loader/vitest.config.ts +19 -0
  114. package/dist/assets/worker-configs/architect/.claude/commands/.gitkeep +0 -0
  115. package/dist/assets/worker-configs/architect/.claude/skills/.gitkeep +0 -0
  116. package/dist/assets/worker-configs/architect/CLAUDE.md +106 -0
  117. package/dist/assets/worker-configs/clarifier/.claude/commands/.gitkeep +1 -0
  118. package/dist/assets/worker-configs/clarifier/.claude/skills/.gitkeep +1 -0
  119. package/dist/assets/worker-configs/clarifier/CLAUDE.md +112 -0
  120. package/dist/assets/worker-configs/code-reviewer/CLAUDE.md +113 -0
  121. package/dist/assets/worker-configs/consolidator/.claude/commands/.gitkeep +1 -0
  122. package/dist/assets/worker-configs/consolidator/.claude/skills/.gitkeep +1 -0
  123. package/dist/assets/worker-configs/consolidator/CLAUDE.md +114 -0
  124. package/dist/assets/worker-configs/developer-backend/.claude/commands/.gitkeep +1 -0
  125. package/dist/assets/worker-configs/developer-backend/.claude/skills/.gitkeep +1 -0
  126. package/dist/assets/worker-configs/developer-backend/CLAUDE.md +116 -0
  127. package/dist/assets/worker-configs/developer-frontend/.claude/commands/.gitkeep +1 -0
  128. package/dist/assets/worker-configs/developer-frontend/.claude/skills/.gitkeep +1 -0
  129. package/dist/assets/worker-configs/developer-frontend/CLAUDE.md +116 -0
  130. package/dist/assets/worker-configs/developer-fullstack/.claude/commands/.gitkeep +1 -0
  131. package/dist/assets/worker-configs/developer-fullstack/.claude/skills/.gitkeep +1 -0
  132. package/dist/assets/worker-configs/developer-fullstack/CLAUDE.md +116 -0
  133. package/dist/assets/worker-configs/devops-engineer/CLAUDE.md +111 -0
  134. package/dist/assets/worker-configs/planner/.claude/commands/.gitkeep +1 -0
  135. package/dist/assets/worker-configs/planner/.claude/skills/.gitkeep +1 -0
  136. package/dist/assets/worker-configs/planner/CLAUDE.md +111 -0
  137. package/dist/assets/worker-configs/product-owner/CLAUDE.md +108 -0
  138. package/dist/assets/worker-configs/reviewer/.claude/commands/.gitkeep +1 -0
  139. package/dist/assets/worker-configs/reviewer/.claude/skills/.gitkeep +1 -0
  140. package/dist/assets/worker-configs/reviewer/CLAUDE.md +110 -0
  141. package/dist/assets/worker-configs/security-engineer/CLAUDE.md +109 -0
  142. package/dist/assets/worker-configs/spec-writer/.claude/commands/.gitkeep +1 -0
  143. package/dist/assets/worker-configs/spec-writer/.claude/skills/.gitkeep +1 -0
  144. package/dist/assets/worker-configs/spec-writer/CLAUDE.md +110 -0
  145. package/dist/assets/worker-configs/technical-writer/CLAUDE.md +107 -0
  146. package/dist/assets/worker-configs/tester/CLAUDE.md +110 -0
  147. package/dist/commands/__tests__/bootstrap.test.d.ts +2 -0
  148. package/dist/commands/__tests__/bootstrap.test.d.ts.map +1 -0
  149. package/dist/commands/__tests__/bootstrap.test.js +379 -0
  150. package/dist/commands/__tests__/bootstrap.test.js.map +1 -0
  151. package/dist/commands/__tests__/doctor.test.d.ts +2 -0
  152. package/dist/commands/__tests__/doctor.test.d.ts.map +1 -0
  153. package/dist/commands/__tests__/doctor.test.js +13 -0
  154. package/dist/commands/__tests__/doctor.test.js.map +1 -0
  155. package/dist/commands/bootstrap.d.ts +3 -0
  156. package/dist/commands/bootstrap.d.ts.map +1 -0
  157. package/dist/commands/bootstrap.js +390 -0
  158. package/dist/commands/bootstrap.js.map +1 -0
  159. package/dist/commands/doctor.d.ts +2 -0
  160. package/dist/commands/doctor.d.ts.map +1 -0
  161. package/dist/commands/doctor.js +171 -0
  162. package/dist/commands/doctor.js.map +1 -0
  163. package/dist/commands/templates.d.ts +2 -0
  164. package/dist/commands/templates.d.ts.map +1 -0
  165. package/dist/commands/templates.js +12 -0
  166. package/dist/commands/templates.js.map +1 -0
  167. package/dist/constants.d.ts +23 -0
  168. package/dist/constants.d.ts.map +1 -0
  169. package/dist/constants.js +23 -0
  170. package/dist/constants.js.map +1 -0
  171. package/dist/generators/__tests__/boss-config.test.d.ts +2 -0
  172. package/dist/generators/__tests__/boss-config.test.d.ts.map +1 -0
  173. package/dist/generators/__tests__/boss-config.test.js +61 -0
  174. package/dist/generators/__tests__/boss-config.test.js.map +1 -0
  175. package/dist/generators/__tests__/claude-folder.test.d.ts +2 -0
  176. package/dist/generators/__tests__/claude-folder.test.d.ts.map +1 -0
  177. package/dist/generators/__tests__/claude-folder.test.js +128 -0
  178. package/dist/generators/__tests__/claude-folder.test.js.map +1 -0
  179. package/dist/generators/__tests__/claude-md.test.d.ts +2 -0
  180. package/dist/generators/__tests__/claude-md.test.d.ts.map +1 -0
  181. package/dist/generators/__tests__/claude-md.test.js +55 -0
  182. package/dist/generators/__tests__/claude-md.test.js.map +1 -0
  183. package/dist/generators/__tests__/container-use-config.test.d.ts +2 -0
  184. package/dist/generators/__tests__/container-use-config.test.d.ts.map +1 -0
  185. package/dist/generators/__tests__/container-use-config.test.js +80 -0
  186. package/dist/generators/__tests__/container-use-config.test.js.map +1 -0
  187. package/dist/generators/__tests__/docker-compose.test.d.ts +2 -0
  188. package/dist/generators/__tests__/docker-compose.test.d.ts.map +1 -0
  189. package/dist/generators/__tests__/docker-compose.test.js +39 -0
  190. package/dist/generators/__tests__/docker-compose.test.js.map +1 -0
  191. package/dist/generators/__tests__/git-hooks.test.d.ts +2 -0
  192. package/dist/generators/__tests__/git-hooks.test.d.ts.map +1 -0
  193. package/dist/generators/__tests__/git-hooks.test.js +118 -0
  194. package/dist/generators/__tests__/git-hooks.test.js.map +1 -0
  195. package/dist/generators/__tests__/github-workflows.test.d.ts +2 -0
  196. package/dist/generators/__tests__/github-workflows.test.d.ts.map +1 -0
  197. package/dist/generators/__tests__/github-workflows.test.js +86 -0
  198. package/dist/generators/__tests__/github-workflows.test.js.map +1 -0
  199. package/dist/generators/__tests__/mcp-config.test.d.ts +2 -0
  200. package/dist/generators/__tests__/mcp-config.test.d.ts.map +1 -0
  201. package/dist/generators/__tests__/mcp-config.test.js +131 -0
  202. package/dist/generators/__tests__/mcp-config.test.js.map +1 -0
  203. package/dist/generators/__tests__/project-structure.test.d.ts +2 -0
  204. package/dist/generators/__tests__/project-structure.test.d.ts.map +1 -0
  205. package/dist/generators/__tests__/project-structure.test.js +40 -0
  206. package/dist/generators/__tests__/project-structure.test.js.map +1 -0
  207. package/dist/generators/__tests__/quality-gates.test.d.ts +2 -0
  208. package/dist/generators/__tests__/quality-gates.test.d.ts.map +1 -0
  209. package/dist/generators/__tests__/quality-gates.test.js +71 -0
  210. package/dist/generators/__tests__/quality-gates.test.js.map +1 -0
  211. package/dist/generators/__tests__/specify-structure.test.d.ts +2 -0
  212. package/dist/generators/__tests__/specify-structure.test.d.ts.map +1 -0
  213. package/dist/generators/__tests__/specify-structure.test.js +63 -0
  214. package/dist/generators/__tests__/specify-structure.test.js.map +1 -0
  215. package/dist/generators/__tests__/start-boss-sh.test.d.ts +2 -0
  216. package/dist/generators/__tests__/start-boss-sh.test.d.ts.map +1 -0
  217. package/dist/generators/__tests__/start-boss-sh.test.js +36 -0
  218. package/dist/generators/__tests__/start-boss-sh.test.js.map +1 -0
  219. package/dist/generators/__tests__/template-docs.test.d.ts +2 -0
  220. package/dist/generators/__tests__/template-docs.test.d.ts.map +1 -0
  221. package/dist/generators/__tests__/template-docs.test.js +92 -0
  222. package/dist/generators/__tests__/template-docs.test.js.map +1 -0
  223. package/dist/generators/__tests__/template-loader.test.d.ts +2 -0
  224. package/dist/generators/__tests__/template-loader.test.d.ts.map +1 -0
  225. package/dist/generators/__tests__/template-loader.test.js +215 -0
  226. package/dist/generators/__tests__/template-loader.test.js.map +1 -0
  227. package/dist/generators/__tests__/worker-configs.test.d.ts +2 -0
  228. package/dist/generators/__tests__/worker-configs.test.d.ts.map +1 -0
  229. package/dist/generators/__tests__/worker-configs.test.js +122 -0
  230. package/dist/generators/__tests__/worker-configs.test.js.map +1 -0
  231. package/dist/generators/boss-config.d.ts +3 -0
  232. package/dist/generators/boss-config.d.ts.map +1 -0
  233. package/dist/generators/boss-config.js +242 -0
  234. package/dist/generators/boss-config.js.map +1 -0
  235. package/dist/generators/claude-folder.d.ts +3 -0
  236. package/dist/generators/claude-folder.d.ts.map +1 -0
  237. package/dist/generators/claude-folder.js +94 -0
  238. package/dist/generators/claude-folder.js.map +1 -0
  239. package/dist/generators/claude-md.d.ts +3 -0
  240. package/dist/generators/claude-md.d.ts.map +1 -0
  241. package/dist/generators/claude-md.js +64 -0
  242. package/dist/generators/claude-md.js.map +1 -0
  243. package/dist/generators/container-use-config.d.ts +13 -0
  244. package/dist/generators/container-use-config.d.ts.map +1 -0
  245. package/dist/generators/container-use-config.js +60 -0
  246. package/dist/generators/container-use-config.js.map +1 -0
  247. package/dist/generators/docker-compose.d.ts +2 -0
  248. package/dist/generators/docker-compose.d.ts.map +1 -0
  249. package/dist/generators/docker-compose.js +8 -0
  250. package/dist/generators/docker-compose.js.map +1 -0
  251. package/dist/generators/git-hooks.d.ts +3 -0
  252. package/dist/generators/git-hooks.d.ts.map +1 -0
  253. package/dist/generators/git-hooks.js +58 -0
  254. package/dist/generators/git-hooks.js.map +1 -0
  255. package/dist/generators/github-workflows.d.ts +3 -0
  256. package/dist/generators/github-workflows.d.ts.map +1 -0
  257. package/dist/generators/github-workflows.js +27 -0
  258. package/dist/generators/github-workflows.js.map +1 -0
  259. package/dist/generators/mcp-config.d.ts +3 -0
  260. package/dist/generators/mcp-config.d.ts.map +1 -0
  261. package/dist/generators/mcp-config.js +183 -0
  262. package/dist/generators/mcp-config.js.map +1 -0
  263. package/dist/generators/project-structure.d.ts +3 -0
  264. package/dist/generators/project-structure.d.ts.map +1 -0
  265. package/dist/generators/project-structure.js +24 -0
  266. package/dist/generators/project-structure.js.map +1 -0
  267. package/dist/generators/quality-gates.d.ts +3 -0
  268. package/dist/generators/quality-gates.d.ts.map +1 -0
  269. package/dist/generators/quality-gates.js +32 -0
  270. package/dist/generators/quality-gates.js.map +1 -0
  271. package/dist/generators/specify-structure.d.ts +2 -0
  272. package/dist/generators/specify-structure.d.ts.map +1 -0
  273. package/dist/generators/specify-structure.js +43 -0
  274. package/dist/generators/specify-structure.js.map +1 -0
  275. package/dist/generators/start-boss-sh.d.ts +2 -0
  276. package/dist/generators/start-boss-sh.d.ts.map +1 -0
  277. package/dist/generators/start-boss-sh.js +10 -0
  278. package/dist/generators/start-boss-sh.js.map +1 -0
  279. package/dist/generators/template-docs.d.ts +3 -0
  280. package/dist/generators/template-docs.d.ts.map +1 -0
  281. package/dist/generators/template-docs.js +19 -0
  282. package/dist/generators/template-docs.js.map +1 -0
  283. package/dist/generators/template-loader.d.ts +3 -0
  284. package/dist/generators/template-loader.d.ts.map +1 -0
  285. package/dist/generators/template-loader.js +308 -0
  286. package/dist/generators/template-loader.js.map +1 -0
  287. package/dist/generators/worker-configs.d.ts +3 -0
  288. package/dist/generators/worker-configs.d.ts.map +1 -0
  289. package/dist/generators/worker-configs.js +119 -0
  290. package/dist/generators/worker-configs.js.map +1 -0
  291. package/dist/index.d.ts +3 -0
  292. package/dist/index.d.ts.map +1 -0
  293. package/dist/index.js +57 -0
  294. package/dist/index.js.map +1 -0
  295. package/dist/presets/__tests__/quality-presets.test.d.ts +2 -0
  296. package/dist/presets/__tests__/quality-presets.test.d.ts.map +1 -0
  297. package/dist/presets/__tests__/quality-presets.test.js +152 -0
  298. package/dist/presets/__tests__/quality-presets.test.js.map +1 -0
  299. package/dist/presets/quality-presets.d.ts +3 -0
  300. package/dist/presets/quality-presets.d.ts.map +1 -0
  301. package/dist/presets/quality-presets.js +65 -0
  302. package/dist/presets/quality-presets.js.map +1 -0
  303. package/dist/types/index.d.ts +42 -0
  304. package/dist/types/index.d.ts.map +1 -0
  305. package/dist/types/index.js +2 -0
  306. package/dist/types/index.js.map +1 -0
  307. package/dist/utils/__tests__/file-system.test.d.ts +2 -0
  308. package/dist/utils/__tests__/file-system.test.d.ts.map +1 -0
  309. package/dist/utils/__tests__/file-system.test.js +83 -0
  310. package/dist/utils/__tests__/file-system.test.js.map +1 -0
  311. package/dist/utils/__tests__/git.test.d.ts +2 -0
  312. package/dist/utils/__tests__/git.test.d.ts.map +1 -0
  313. package/dist/utils/__tests__/git.test.js +79 -0
  314. package/dist/utils/__tests__/git.test.js.map +1 -0
  315. package/dist/utils/__tests__/template-loader.test.d.ts +2 -0
  316. package/dist/utils/__tests__/template-loader.test.d.ts.map +1 -0
  317. package/dist/utils/__tests__/template-loader.test.js +109 -0
  318. package/dist/utils/__tests__/template-loader.test.js.map +1 -0
  319. package/dist/utils/__tests__/validators.test.d.ts +2 -0
  320. package/dist/utils/__tests__/validators.test.d.ts.map +1 -0
  321. package/dist/utils/__tests__/validators.test.js +118 -0
  322. package/dist/utils/__tests__/validators.test.js.map +1 -0
  323. package/dist/utils/file-system.d.ts +8 -0
  324. package/dist/utils/file-system.d.ts.map +1 -0
  325. package/dist/utils/file-system.js +54 -0
  326. package/dist/utils/file-system.js.map +1 -0
  327. package/dist/utils/git.d.ts +7 -0
  328. package/dist/utils/git.d.ts.map +1 -0
  329. package/dist/utils/git.js +98 -0
  330. package/dist/utils/git.js.map +1 -0
  331. package/dist/utils/logger.d.ts +13 -0
  332. package/dist/utils/logger.d.ts.map +1 -0
  333. package/dist/utils/logger.js +42 -0
  334. package/dist/utils/logger.js.map +1 -0
  335. package/dist/utils/prompts.d.ts +18 -0
  336. package/dist/utils/prompts.d.ts.map +1 -0
  337. package/dist/utils/prompts.js +197 -0
  338. package/dist/utils/prompts.js.map +1 -0
  339. package/dist/utils/template-loader.d.ts +18 -0
  340. package/dist/utils/template-loader.d.ts.map +1 -0
  341. package/dist/utils/template-loader.js +92 -0
  342. package/dist/utils/template-loader.js.map +1 -0
  343. package/dist/utils/validators.d.ts +21 -0
  344. package/dist/utils/validators.d.ts.map +1 -0
  345. package/dist/utils/validators.js +50 -0
  346. package/dist/utils/validators.js.map +1 -0
  347. package/package.json +79 -0
  348. package/templates/spec-kit/README.md +17 -0
  349. package/templates/spec-kit/memory/constitution.md +50 -0
  350. package/templates/spec-kit/scripts/bash/check-prerequisites.sh +166 -0
  351. package/templates/spec-kit/scripts/bash/common.sh +156 -0
  352. package/templates/spec-kit/scripts/bash/create-new-feature.sh +297 -0
  353. package/templates/spec-kit/scripts/bash/setup-plan.sh +61 -0
  354. package/templates/spec-kit/scripts/bash/update-agent-context.sh +799 -0
  355. package/templates/spec-kit/scripts/powershell/check-prerequisites.ps1 +148 -0
  356. package/templates/spec-kit/scripts/powershell/common.ps1 +137 -0
  357. package/templates/spec-kit/scripts/powershell/create-new-feature.ps1 +283 -0
  358. package/templates/spec-kit/scripts/powershell/setup-plan.ps1 +61 -0
  359. package/templates/spec-kit/scripts/powershell/update-agent-context.ps1 +448 -0
  360. package/templates/spec-kit/src/specify_cli/__init__.py +1369 -0
  361. package/templates/spec-kit/templates/agent-file-template.md +28 -0
  362. package/templates/spec-kit/templates/checklist-template.md +40 -0
  363. package/templates/spec-kit/templates/commands/analyze.md +187 -0
  364. package/templates/spec-kit/templates/commands/checklist.md +297 -0
  365. package/templates/spec-kit/templates/commands/clarify.md +184 -0
  366. package/templates/spec-kit/templates/commands/constitution.md +82 -0
  367. package/templates/spec-kit/templates/commands/implement.md +138 -0
  368. package/templates/spec-kit/templates/commands/plan.md +95 -0
  369. package/templates/spec-kit/templates/commands/specify.md +261 -0
  370. package/templates/spec-kit/templates/commands/tasks.md +140 -0
  371. package/templates/spec-kit/templates/commands/taskstoissues.md +33 -0
  372. package/templates/spec-kit/templates/plan-template.md +104 -0
  373. package/templates/spec-kit/templates/spec-template.md +115 -0
  374. package/templates/spec-kit/templates/tasks-template.md +251 -0
  375. package/templates/spec-kit/templates/vscode-settings.json +14 -0
  376. package/templates/t3-app/README.md +41 -0
  377. package/templates/t3-app/base/README.md +29 -0
  378. package/templates/t3-app/base/_gitignore +47 -0
  379. package/templates/t3-app/base/next-env.d.ts +5 -0
  380. package/templates/t3-app/base/next.config.js +22 -0
  381. package/templates/t3-app/base/package.json +26 -0
  382. package/templates/t3-app/base/public/favicon.ico +0 -0
  383. package/templates/t3-app/base/src/env.js +40 -0
  384. package/templates/t3-app/base/src/styles/globals.css +16 -0
  385. package/templates/t3-app/base/tsconfig.json +42 -0
  386. package/templates/t3-app/extras/config/_eslint.base.js +45 -0
  387. package/templates/t3-app/extras/config/_eslint.drizzle.js +58 -0
  388. package/templates/t3-app/extras/config/_prettier.config.js +2 -0
  389. package/templates/t3-app/extras/config/_tailwind.prettier.config.js +4 -0
  390. package/templates/t3-app/extras/config/biome.jsonc +69 -0
  391. package/templates/t3-app/extras/config/drizzle-config-mysql.ts +12 -0
  392. package/templates/t3-app/extras/config/drizzle-config-postgres.ts +12 -0
  393. package/templates/t3-app/extras/config/drizzle-config-sqlite.ts +12 -0
  394. package/templates/t3-app/extras/config/next-config-appdir.js +10 -0
  395. package/templates/t3-app/extras/config/postcss.config.js +5 -0
  396. package/templates/t3-app/extras/pnpm/_npmrc +2 -0
  397. package/templates/t3-app/extras/prisma/schema/base-planetscale.prisma +25 -0
  398. package/templates/t3-app/extras/prisma/schema/base.prisma +21 -0
  399. package/templates/t3-app/extras/prisma/schema/with-auth-planetscale.prisma +79 -0
  400. package/templates/t3-app/extras/prisma/schema/with-auth.prisma +75 -0
  401. package/templates/t3-app/extras/prisma/schema/with-better-auth-planetscale.prisma +90 -0
  402. package/templates/t3-app/extras/prisma/schema/with-better-auth.prisma +89 -0
  403. package/templates/t3-app/extras/src/app/_components/post-tw.tsx +50 -0
  404. package/templates/t3-app/extras/src/app/_components/post.tsx +54 -0
  405. package/templates/t3-app/extras/src/app/api/auth/[...all]/route.ts +5 -0
  406. package/templates/t3-app/extras/src/app/api/auth/[...nextauth]/route.ts +3 -0
  407. package/templates/t3-app/extras/src/app/api/trpc/[trpc]/route.ts +34 -0
  408. package/templates/t3-app/extras/src/app/layout/base.tsx +24 -0
  409. package/templates/t3-app/extras/src/app/layout/with-trpc-tw.tsx +29 -0
  410. package/templates/t3-app/extras/src/app/layout/with-trpc.tsx +28 -0
  411. package/templates/t3-app/extras/src/app/layout/with-tw.tsx +25 -0
  412. package/templates/t3-app/extras/src/app/page/base.tsx +39 -0
  413. package/templates/t3-app/extras/src/app/page/with-auth-trpc-tw.tsx +69 -0
  414. package/templates/t3-app/extras/src/app/page/with-auth-trpc.tsx +70 -0
  415. package/templates/t3-app/extras/src/app/page/with-better-auth-trpc-tw.tsx +105 -0
  416. package/templates/t3-app/extras/src/app/page/with-better-auth-trpc.tsx +103 -0
  417. package/templates/t3-app/extras/src/app/page/with-better-auth-tw.tsx +90 -0
  418. package/templates/t3-app/extras/src/app/page/with-better-auth.tsx +88 -0
  419. package/templates/t3-app/extras/src/app/page/with-trpc-tw.tsx +53 -0
  420. package/templates/t3-app/extras/src/app/page/with-trpc.tsx +54 -0
  421. package/templates/t3-app/extras/src/app/page/with-tw.tsx +37 -0
  422. package/templates/t3-app/extras/src/env/with-auth-db-planetscale.js +58 -0
  423. package/templates/t3-app/extras/src/env/with-auth-db.js +52 -0
  424. package/templates/t3-app/extras/src/env/with-auth.js +51 -0
  425. package/templates/t3-app/extras/src/env/with-better-auth-db-planetscale.js +58 -0
  426. package/templates/t3-app/extras/src/env/with-better-auth-db.js +50 -0
  427. package/templates/t3-app/extras/src/env/with-better-auth.js +49 -0
  428. package/templates/t3-app/extras/src/env/with-db-planetscale.js +50 -0
  429. package/templates/t3-app/extras/src/env/with-db.js +44 -0
  430. package/templates/t3-app/extras/src/index.module.css +177 -0
  431. package/templates/t3-app/extras/src/pages/_app/base.tsx +18 -0
  432. package/templates/t3-app/extras/src/pages/_app/with-auth-trpc-tw.tsx +27 -0
  433. package/templates/t3-app/extras/src/pages/_app/with-auth-trpc.tsx +27 -0
  434. package/templates/t3-app/extras/src/pages/_app/with-auth-tw.tsx +25 -0
  435. package/templates/t3-app/extras/src/pages/_app/with-auth.tsx +25 -0
  436. package/templates/t3-app/extras/src/pages/_app/with-better-auth-trpc-tw.tsx +20 -0
  437. package/templates/t3-app/extras/src/pages/_app/with-better-auth-trpc.tsx +20 -0
  438. package/templates/t3-app/extras/src/pages/_app/with-trpc-tw.tsx +20 -0
  439. package/templates/t3-app/extras/src/pages/_app/with-trpc.tsx +20 -0
  440. package/templates/t3-app/extras/src/pages/_app/with-tw.tsx +18 -0
  441. package/templates/t3-app/extras/src/pages/api/auth/[...all].ts +8 -0
  442. package/templates/t3-app/extras/src/pages/api/trpc/[trpc].ts +19 -0
  443. package/templates/t3-app/extras/src/pages/index/base.tsx +47 -0
  444. package/templates/t3-app/extras/src/pages/index/with-auth-trpc-tw.tsx +81 -0
  445. package/templates/t3-app/extras/src/pages/index/with-auth-trpc.tsx +82 -0
  446. package/templates/t3-app/extras/src/pages/index/with-better-auth-trpc-tw.tsx +99 -0
  447. package/templates/t3-app/extras/src/pages/index/with-better-auth-trpc.tsx +100 -0
  448. package/templates/t3-app/extras/src/pages/index/with-better-auth-tw.tsx +87 -0
  449. package/templates/t3-app/extras/src/pages/index/with-better-auth.tsx +88 -0
  450. package/templates/t3-app/extras/src/pages/index/with-trpc-tw.tsx +52 -0
  451. package/templates/t3-app/extras/src/pages/index/with-trpc.tsx +53 -0
  452. package/templates/t3-app/extras/src/pages/index/with-tw.tsx +45 -0
  453. package/templates/t3-app/extras/src/server/api/root.ts +23 -0
  454. package/templates/t3-app/extras/src/server/api/routers/post/base.ts +40 -0
  455. package/templates/t3-app/extras/src/server/api/routers/post/with-auth-drizzle.ts +39 -0
  456. package/templates/t3-app/extras/src/server/api/routers/post/with-auth-prisma.ts +41 -0
  457. package/templates/t3-app/extras/src/server/api/routers/post/with-auth.ts +37 -0
  458. package/templates/t3-app/extras/src/server/api/routers/post/with-drizzle.ts +30 -0
  459. package/templates/t3-app/extras/src/server/api/routers/post/with-prisma.ts +31 -0
  460. package/templates/t3-app/extras/src/server/api/trpc-app/base.ts +103 -0
  461. package/templates/t3-app/extras/src/server/api/trpc-app/with-auth-db.ts +133 -0
  462. package/templates/t3-app/extras/src/server/api/trpc-app/with-auth.ts +130 -0
  463. package/templates/t3-app/extras/src/server/api/trpc-app/with-better-auth-db.ts +134 -0
  464. package/templates/t3-app/extras/src/server/api/trpc-app/with-better-auth.ts +131 -0
  465. package/templates/t3-app/extras/src/server/api/trpc-app/with-db.ts +106 -0
  466. package/templates/t3-app/extras/src/server/api/trpc-pages/base.ts +122 -0
  467. package/templates/t3-app/extras/src/server/api/trpc-pages/with-auth-db.ts +160 -0
  468. package/templates/t3-app/extras/src/server/api/trpc-pages/with-auth.ts +158 -0
  469. package/templates/t3-app/extras/src/server/api/trpc-pages/with-better-auth-db.ts +168 -0
  470. package/templates/t3-app/extras/src/server/api/trpc-pages/with-better-auth.ts +166 -0
  471. package/templates/t3-app/extras/src/server/api/trpc-pages/with-db.ts +125 -0
  472. package/templates/t3-app/extras/src/server/auth/config/base.ts +52 -0
  473. package/templates/t3-app/extras/src/server/auth/config/with-drizzle.ts +67 -0
  474. package/templates/t3-app/extras/src/server/auth/config/with-prisma.ts +56 -0
  475. package/templates/t3-app/extras/src/server/auth/index.ts +10 -0
  476. package/templates/t3-app/extras/src/server/better-auth/client.ts +5 -0
  477. package/templates/t3-app/extras/src/server/better-auth/config/base.ts +12 -0
  478. package/templates/t3-app/extras/src/server/better-auth/config/with-drizzle.ts +26 -0
  479. package/templates/t3-app/extras/src/server/better-auth/config/with-prisma.ts +26 -0
  480. package/templates/t3-app/extras/src/server/better-auth/index.ts +1 -0
  481. package/templates/t3-app/extras/src/server/better-auth/server.ts +7 -0
  482. package/templates/t3-app/extras/src/server/db/db-prisma-planetscale.ts +19 -0
  483. package/templates/t3-app/extras/src/server/db/db-prisma.ts +16 -0
  484. package/templates/t3-app/extras/src/server/db/index-drizzle/with-mysql.ts +18 -0
  485. package/templates/t3-app/extras/src/server/db/index-drizzle/with-planetscale.ts +7 -0
  486. package/templates/t3-app/extras/src/server/db/index-drizzle/with-postgres.ts +18 -0
  487. package/templates/t3-app/extras/src/server/db/index-drizzle/with-sqlite.ts +19 -0
  488. package/templates/t3-app/extras/src/server/db/schema-drizzle/base-mysql.ts +26 -0
  489. package/templates/t3-app/extras/src/server/db/schema-drizzle/base-planetscale.ts +26 -0
  490. package/templates/t3-app/extras/src/server/db/schema-drizzle/base-postgres.ts +26 -0
  491. package/templates/t3-app/extras/src/server/db/schema-drizzle/base-sqlite.ts +27 -0
  492. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-mysql.ts +111 -0
  493. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-planetscale.ts +100 -0
  494. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-postgres.ts +108 -0
  495. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-auth-sqlite.ts +105 -0
  496. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-mysql.ts +106 -0
  497. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-planetscale.ts +106 -0
  498. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-postgres.ts +105 -0
  499. package/templates/t3-app/extras/src/server/db/schema-drizzle/with-better-auth-sqlite.ts +134 -0
  500. package/templates/t3-app/extras/src/styles/globals.css +6 -0
  501. package/templates/t3-app/extras/src/trpc/query-client.ts +25 -0
  502. package/templates/t3-app/extras/src/trpc/react.tsx +78 -0
  503. package/templates/t3-app/extras/src/trpc/server.ts +30 -0
  504. package/templates/t3-app/extras/src/utils/api.ts +68 -0
  505. package/templates/t3-app/extras/start-database/mysql.sh +86 -0
  506. package/templates/t3-app/extras/start-database/postgres.sh +88 -0
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env pwsh
2
+
3
+ # Consolidated prerequisite checking script (PowerShell)
4
+ #
5
+ # This script provides unified prerequisite checking for Spec-Driven Development workflow.
6
+ # It replaces the functionality previously spread across multiple scripts.
7
+ #
8
+ # Usage: ./check-prerequisites.ps1 [OPTIONS]
9
+ #
10
+ # OPTIONS:
11
+ # -Json Output in JSON format
12
+ # -RequireTasks Require tasks.md to exist (for implementation phase)
13
+ # -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
14
+ # -PathsOnly Only output path variables (no validation)
15
+ # -Help, -h Show help message
16
+
17
+ [CmdletBinding()]
18
+ param(
19
+ [switch]$Json,
20
+ [switch]$RequireTasks,
21
+ [switch]$IncludeTasks,
22
+ [switch]$PathsOnly,
23
+ [switch]$Help
24
+ )
25
+
26
+ $ErrorActionPreference = 'Stop'
27
+
28
+ # Show help if requested
29
+ if ($Help) {
30
+ Write-Output @"
31
+ Usage: check-prerequisites.ps1 [OPTIONS]
32
+
33
+ Consolidated prerequisite checking for Spec-Driven Development workflow.
34
+
35
+ OPTIONS:
36
+ -Json Output in JSON format
37
+ -RequireTasks Require tasks.md to exist (for implementation phase)
38
+ -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
39
+ -PathsOnly Only output path variables (no prerequisite validation)
40
+ -Help, -h Show this help message
41
+
42
+ EXAMPLES:
43
+ # Check task prerequisites (plan.md required)
44
+ .\check-prerequisites.ps1 -Json
45
+
46
+ # Check implementation prerequisites (plan.md + tasks.md required)
47
+ .\check-prerequisites.ps1 -Json -RequireTasks -IncludeTasks
48
+
49
+ # Get feature paths only (no validation)
50
+ .\check-prerequisites.ps1 -PathsOnly
51
+
52
+ "@
53
+ exit 0
54
+ }
55
+
56
+ # Source common functions
57
+ . "$PSScriptRoot/common.ps1"
58
+
59
+ # Get feature paths and validate branch
60
+ $paths = Get-FeaturePathsEnv
61
+
62
+ if (-not (Test-FeatureBranch -Branch $paths.CURRENT_BRANCH -HasGit:$paths.HAS_GIT)) {
63
+ exit 1
64
+ }
65
+
66
+ # If paths-only mode, output paths and exit (support combined -Json -PathsOnly)
67
+ if ($PathsOnly) {
68
+ if ($Json) {
69
+ [PSCustomObject]@{
70
+ REPO_ROOT = $paths.REPO_ROOT
71
+ BRANCH = $paths.CURRENT_BRANCH
72
+ FEATURE_DIR = $paths.FEATURE_DIR
73
+ FEATURE_SPEC = $paths.FEATURE_SPEC
74
+ IMPL_PLAN = $paths.IMPL_PLAN
75
+ TASKS = $paths.TASKS
76
+ } | ConvertTo-Json -Compress
77
+ } else {
78
+ Write-Output "REPO_ROOT: $($paths.REPO_ROOT)"
79
+ Write-Output "BRANCH: $($paths.CURRENT_BRANCH)"
80
+ Write-Output "FEATURE_DIR: $($paths.FEATURE_DIR)"
81
+ Write-Output "FEATURE_SPEC: $($paths.FEATURE_SPEC)"
82
+ Write-Output "IMPL_PLAN: $($paths.IMPL_PLAN)"
83
+ Write-Output "TASKS: $($paths.TASKS)"
84
+ }
85
+ exit 0
86
+ }
87
+
88
+ # Validate required directories and files
89
+ if (-not (Test-Path $paths.FEATURE_DIR -PathType Container)) {
90
+ Write-Output "ERROR: Feature directory not found: $($paths.FEATURE_DIR)"
91
+ Write-Output "Run /speckit.specify first to create the feature structure."
92
+ exit 1
93
+ }
94
+
95
+ if (-not (Test-Path $paths.IMPL_PLAN -PathType Leaf)) {
96
+ Write-Output "ERROR: plan.md not found in $($paths.FEATURE_DIR)"
97
+ Write-Output "Run /speckit.plan first to create the implementation plan."
98
+ exit 1
99
+ }
100
+
101
+ # Check for tasks.md if required
102
+ if ($RequireTasks -and -not (Test-Path $paths.TASKS -PathType Leaf)) {
103
+ Write-Output "ERROR: tasks.md not found in $($paths.FEATURE_DIR)"
104
+ Write-Output "Run /speckit.tasks first to create the task list."
105
+ exit 1
106
+ }
107
+
108
+ # Build list of available documents
109
+ $docs = @()
110
+
111
+ # Always check these optional docs
112
+ if (Test-Path $paths.RESEARCH) { $docs += 'research.md' }
113
+ if (Test-Path $paths.DATA_MODEL) { $docs += 'data-model.md' }
114
+
115
+ # Check contracts directory (only if it exists and has files)
116
+ if ((Test-Path $paths.CONTRACTS_DIR) -and (Get-ChildItem -Path $paths.CONTRACTS_DIR -ErrorAction SilentlyContinue | Select-Object -First 1)) {
117
+ $docs += 'contracts/'
118
+ }
119
+
120
+ if (Test-Path $paths.QUICKSTART) { $docs += 'quickstart.md' }
121
+
122
+ # Include tasks.md if requested and it exists
123
+ if ($IncludeTasks -and (Test-Path $paths.TASKS)) {
124
+ $docs += 'tasks.md'
125
+ }
126
+
127
+ # Output results
128
+ if ($Json) {
129
+ # JSON output
130
+ [PSCustomObject]@{
131
+ FEATURE_DIR = $paths.FEATURE_DIR
132
+ AVAILABLE_DOCS = $docs
133
+ } | ConvertTo-Json -Compress
134
+ } else {
135
+ # Text output
136
+ Write-Output "FEATURE_DIR:$($paths.FEATURE_DIR)"
137
+ Write-Output "AVAILABLE_DOCS:"
138
+
139
+ # Show status of each potential document
140
+ Test-FileExists -Path $paths.RESEARCH -Description 'research.md' | Out-Null
141
+ Test-FileExists -Path $paths.DATA_MODEL -Description 'data-model.md' | Out-Null
142
+ Test-DirHasFiles -Path $paths.CONTRACTS_DIR -Description 'contracts/' | Out-Null
143
+ Test-FileExists -Path $paths.QUICKSTART -Description 'quickstart.md' | Out-Null
144
+
145
+ if ($IncludeTasks) {
146
+ Test-FileExists -Path $paths.TASKS -Description 'tasks.md' | Out-Null
147
+ }
148
+ }
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env pwsh
2
+ # Common PowerShell functions analogous to common.sh
3
+
4
+ function Get-RepoRoot {
5
+ try {
6
+ $result = git rev-parse --show-toplevel 2>$null
7
+ if ($LASTEXITCODE -eq 0) {
8
+ return $result
9
+ }
10
+ } catch {
11
+ # Git command failed
12
+ }
13
+
14
+ # Fall back to script location for non-git repos
15
+ return (Resolve-Path (Join-Path $PSScriptRoot "../../..")).Path
16
+ }
17
+
18
+ function Get-CurrentBranch {
19
+ # First check if SPECIFY_FEATURE environment variable is set
20
+ if ($env:SPECIFY_FEATURE) {
21
+ return $env:SPECIFY_FEATURE
22
+ }
23
+
24
+ # Then check git if available
25
+ try {
26
+ $result = git rev-parse --abbrev-ref HEAD 2>$null
27
+ if ($LASTEXITCODE -eq 0) {
28
+ return $result
29
+ }
30
+ } catch {
31
+ # Git command failed
32
+ }
33
+
34
+ # For non-git repos, try to find the latest feature directory
35
+ $repoRoot = Get-RepoRoot
36
+ $specsDir = Join-Path $repoRoot "specs"
37
+
38
+ if (Test-Path $specsDir) {
39
+ $latestFeature = ""
40
+ $highest = 0
41
+
42
+ Get-ChildItem -Path $specsDir -Directory | ForEach-Object {
43
+ if ($_.Name -match '^(\d{3})-') {
44
+ $num = [int]$matches[1]
45
+ if ($num -gt $highest) {
46
+ $highest = $num
47
+ $latestFeature = $_.Name
48
+ }
49
+ }
50
+ }
51
+
52
+ if ($latestFeature) {
53
+ return $latestFeature
54
+ }
55
+ }
56
+
57
+ # Final fallback
58
+ return "main"
59
+ }
60
+
61
+ function Test-HasGit {
62
+ try {
63
+ git rev-parse --show-toplevel 2>$null | Out-Null
64
+ return ($LASTEXITCODE -eq 0)
65
+ } catch {
66
+ return $false
67
+ }
68
+ }
69
+
70
+ function Test-FeatureBranch {
71
+ param(
72
+ [string]$Branch,
73
+ [bool]$HasGit = $true
74
+ )
75
+
76
+ # For non-git repos, we can't enforce branch naming but still provide output
77
+ if (-not $HasGit) {
78
+ Write-Warning "[specify] Warning: Git repository not detected; skipped branch validation"
79
+ return $true
80
+ }
81
+
82
+ if ($Branch -notmatch '^[0-9]{3}-') {
83
+ Write-Output "ERROR: Not on a feature branch. Current branch: $Branch"
84
+ Write-Output "Feature branches should be named like: 001-feature-name"
85
+ return $false
86
+ }
87
+ return $true
88
+ }
89
+
90
+ function Get-FeatureDir {
91
+ param([string]$RepoRoot, [string]$Branch)
92
+ Join-Path $RepoRoot "specs/$Branch"
93
+ }
94
+
95
+ function Get-FeaturePathsEnv {
96
+ $repoRoot = Get-RepoRoot
97
+ $currentBranch = Get-CurrentBranch
98
+ $hasGit = Test-HasGit
99
+ $featureDir = Get-FeatureDir -RepoRoot $repoRoot -Branch $currentBranch
100
+
101
+ [PSCustomObject]@{
102
+ REPO_ROOT = $repoRoot
103
+ CURRENT_BRANCH = $currentBranch
104
+ HAS_GIT = $hasGit
105
+ FEATURE_DIR = $featureDir
106
+ FEATURE_SPEC = Join-Path $featureDir 'spec.md'
107
+ IMPL_PLAN = Join-Path $featureDir 'plan.md'
108
+ TASKS = Join-Path $featureDir 'tasks.md'
109
+ RESEARCH = Join-Path $featureDir 'research.md'
110
+ DATA_MODEL = Join-Path $featureDir 'data-model.md'
111
+ QUICKSTART = Join-Path $featureDir 'quickstart.md'
112
+ CONTRACTS_DIR = Join-Path $featureDir 'contracts'
113
+ }
114
+ }
115
+
116
+ function Test-FileExists {
117
+ param([string]$Path, [string]$Description)
118
+ if (Test-Path -Path $Path -PathType Leaf) {
119
+ Write-Output " ✓ $Description"
120
+ return $true
121
+ } else {
122
+ Write-Output " ✗ $Description"
123
+ return $false
124
+ }
125
+ }
126
+
127
+ function Test-DirHasFiles {
128
+ param([string]$Path, [string]$Description)
129
+ if ((Test-Path -Path $Path -PathType Container) -and (Get-ChildItem -Path $Path -ErrorAction SilentlyContinue | Where-Object { -not $_.PSIsContainer } | Select-Object -First 1)) {
130
+ Write-Output " ✓ $Description"
131
+ return $true
132
+ } else {
133
+ Write-Output " ✗ $Description"
134
+ return $false
135
+ }
136
+ }
137
+
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env pwsh
2
+ # Create a new feature
3
+ [CmdletBinding()]
4
+ param(
5
+ [switch]$Json,
6
+ [string]$ShortName,
7
+ [int]$Number = 0,
8
+ [switch]$Help,
9
+ [Parameter(ValueFromRemainingArguments = $true)]
10
+ [string[]]$FeatureDescription
11
+ )
12
+ $ErrorActionPreference = 'Stop'
13
+
14
+ # Show help if requested
15
+ if ($Help) {
16
+ Write-Host "Usage: ./create-new-feature.ps1 [-Json] [-ShortName <name>] [-Number N] <feature description>"
17
+ Write-Host ""
18
+ Write-Host "Options:"
19
+ Write-Host " -Json Output in JSON format"
20
+ Write-Host " -ShortName <name> Provide a custom short name (2-4 words) for the branch"
21
+ Write-Host " -Number N Specify branch number manually (overrides auto-detection)"
22
+ Write-Host " -Help Show this help message"
23
+ Write-Host ""
24
+ Write-Host "Examples:"
25
+ Write-Host " ./create-new-feature.ps1 'Add user authentication system' -ShortName 'user-auth'"
26
+ Write-Host " ./create-new-feature.ps1 'Implement OAuth2 integration for API'"
27
+ exit 0
28
+ }
29
+
30
+ # Check if feature description provided
31
+ if (-not $FeatureDescription -or $FeatureDescription.Count -eq 0) {
32
+ Write-Error "Usage: ./create-new-feature.ps1 [-Json] [-ShortName <name>] <feature description>"
33
+ exit 1
34
+ }
35
+
36
+ $featureDesc = ($FeatureDescription -join ' ').Trim()
37
+
38
+ # Resolve repository root. Prefer git information when available, but fall back
39
+ # to searching for repository markers so the workflow still functions in repositories that
40
+ # were initialized with --no-git.
41
+ function Find-RepositoryRoot {
42
+ param(
43
+ [string]$StartDir,
44
+ [string[]]$Markers = @('.git', '.specify')
45
+ )
46
+ $current = Resolve-Path $StartDir
47
+ while ($true) {
48
+ foreach ($marker in $Markers) {
49
+ if (Test-Path (Join-Path $current $marker)) {
50
+ return $current
51
+ }
52
+ }
53
+ $parent = Split-Path $current -Parent
54
+ if ($parent -eq $current) {
55
+ # Reached filesystem root without finding markers
56
+ return $null
57
+ }
58
+ $current = $parent
59
+ }
60
+ }
61
+
62
+ function Get-HighestNumberFromSpecs {
63
+ param([string]$SpecsDir)
64
+
65
+ $highest = 0
66
+ if (Test-Path $SpecsDir) {
67
+ Get-ChildItem -Path $SpecsDir -Directory | ForEach-Object {
68
+ if ($_.Name -match '^(\d+)') {
69
+ $num = [int]$matches[1]
70
+ if ($num -gt $highest) { $highest = $num }
71
+ }
72
+ }
73
+ }
74
+ return $highest
75
+ }
76
+
77
+ function Get-HighestNumberFromBranches {
78
+ param()
79
+
80
+ $highest = 0
81
+ try {
82
+ $branches = git branch -a 2>$null
83
+ if ($LASTEXITCODE -eq 0) {
84
+ foreach ($branch in $branches) {
85
+ # Clean branch name: remove leading markers and remote prefixes
86
+ $cleanBranch = $branch.Trim() -replace '^\*?\s+', '' -replace '^remotes/[^/]+/', ''
87
+
88
+ # Extract feature number if branch matches pattern ###-*
89
+ if ($cleanBranch -match '^(\d+)-') {
90
+ $num = [int]$matches[1]
91
+ if ($num -gt $highest) { $highest = $num }
92
+ }
93
+ }
94
+ }
95
+ } catch {
96
+ # If git command fails, return 0
97
+ Write-Verbose "Could not check Git branches: $_"
98
+ }
99
+ return $highest
100
+ }
101
+
102
+ function Get-NextBranchNumber {
103
+ param(
104
+ [string]$SpecsDir
105
+ )
106
+
107
+ # Fetch all remotes to get latest branch info (suppress errors if no remotes)
108
+ try {
109
+ git fetch --all --prune 2>$null | Out-Null
110
+ } catch {
111
+ # Ignore fetch errors
112
+ }
113
+
114
+ # Get highest number from ALL branches (not just matching short name)
115
+ $highestBranch = Get-HighestNumberFromBranches
116
+
117
+ # Get highest number from ALL specs (not just matching short name)
118
+ $highestSpec = Get-HighestNumberFromSpecs -SpecsDir $SpecsDir
119
+
120
+ # Take the maximum of both
121
+ $maxNum = [Math]::Max($highestBranch, $highestSpec)
122
+
123
+ # Return next number
124
+ return $maxNum + 1
125
+ }
126
+
127
+ function ConvertTo-CleanBranchName {
128
+ param([string]$Name)
129
+
130
+ return $Name.ToLower() -replace '[^a-z0-9]', '-' -replace '-{2,}', '-' -replace '^-', '' -replace '-$', ''
131
+ }
132
+ $fallbackRoot = (Find-RepositoryRoot -StartDir $PSScriptRoot)
133
+ if (-not $fallbackRoot) {
134
+ Write-Error "Error: Could not determine repository root. Please run this script from within the repository."
135
+ exit 1
136
+ }
137
+
138
+ try {
139
+ $repoRoot = git rev-parse --show-toplevel 2>$null
140
+ if ($LASTEXITCODE -eq 0) {
141
+ $hasGit = $true
142
+ } else {
143
+ throw "Git not available"
144
+ }
145
+ } catch {
146
+ $repoRoot = $fallbackRoot
147
+ $hasGit = $false
148
+ }
149
+
150
+ Set-Location $repoRoot
151
+
152
+ $specsDir = Join-Path $repoRoot 'specs'
153
+ New-Item -ItemType Directory -Path $specsDir -Force | Out-Null
154
+
155
+ # Function to generate branch name with stop word filtering and length filtering
156
+ function Get-BranchName {
157
+ param([string]$Description)
158
+
159
+ # Common stop words to filter out
160
+ $stopWords = @(
161
+ 'i', 'a', 'an', 'the', 'to', 'for', 'of', 'in', 'on', 'at', 'by', 'with', 'from',
162
+ 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had',
163
+ 'do', 'does', 'did', 'will', 'would', 'should', 'could', 'can', 'may', 'might', 'must', 'shall',
164
+ 'this', 'that', 'these', 'those', 'my', 'your', 'our', 'their',
165
+ 'want', 'need', 'add', 'get', 'set'
166
+ )
167
+
168
+ # Convert to lowercase and extract words (alphanumeric only)
169
+ $cleanName = $Description.ToLower() -replace '[^a-z0-9\s]', ' '
170
+ $words = $cleanName -split '\s+' | Where-Object { $_ }
171
+
172
+ # Filter words: remove stop words and words shorter than 3 chars (unless they're uppercase acronyms in original)
173
+ $meaningfulWords = @()
174
+ foreach ($word in $words) {
175
+ # Skip stop words
176
+ if ($stopWords -contains $word) { continue }
177
+
178
+ # Keep words that are length >= 3 OR appear as uppercase in original (likely acronyms)
179
+ if ($word.Length -ge 3) {
180
+ $meaningfulWords += $word
181
+ } elseif ($Description -match "\b$($word.ToUpper())\b") {
182
+ # Keep short words if they appear as uppercase in original (likely acronyms)
183
+ $meaningfulWords += $word
184
+ }
185
+ }
186
+
187
+ # If we have meaningful words, use first 3-4 of them
188
+ if ($meaningfulWords.Count -gt 0) {
189
+ $maxWords = if ($meaningfulWords.Count -eq 4) { 4 } else { 3 }
190
+ $result = ($meaningfulWords | Select-Object -First $maxWords) -join '-'
191
+ return $result
192
+ } else {
193
+ # Fallback to original logic if no meaningful words found
194
+ $result = ConvertTo-CleanBranchName -Name $Description
195
+ $fallbackWords = ($result -split '-') | Where-Object { $_ } | Select-Object -First 3
196
+ return [string]::Join('-', $fallbackWords)
197
+ }
198
+ }
199
+
200
+ # Generate branch name
201
+ if ($ShortName) {
202
+ # Use provided short name, just clean it up
203
+ $branchSuffix = ConvertTo-CleanBranchName -Name $ShortName
204
+ } else {
205
+ # Generate from description with smart filtering
206
+ $branchSuffix = Get-BranchName -Description $featureDesc
207
+ }
208
+
209
+ # Determine branch number
210
+ if ($Number -eq 0) {
211
+ if ($hasGit) {
212
+ # Check existing branches on remotes
213
+ $Number = Get-NextBranchNumber -SpecsDir $specsDir
214
+ } else {
215
+ # Fall back to local directory check
216
+ $Number = (Get-HighestNumberFromSpecs -SpecsDir $specsDir) + 1
217
+ }
218
+ }
219
+
220
+ $featureNum = ('{0:000}' -f $Number)
221
+ $branchName = "$featureNum-$branchSuffix"
222
+
223
+ # GitHub enforces a 244-byte limit on branch names
224
+ # Validate and truncate if necessary
225
+ $maxBranchLength = 244
226
+ if ($branchName.Length -gt $maxBranchLength) {
227
+ # Calculate how much we need to trim from suffix
228
+ # Account for: feature number (3) + hyphen (1) = 4 chars
229
+ $maxSuffixLength = $maxBranchLength - 4
230
+
231
+ # Truncate suffix
232
+ $truncatedSuffix = $branchSuffix.Substring(0, [Math]::Min($branchSuffix.Length, $maxSuffixLength))
233
+ # Remove trailing hyphen if truncation created one
234
+ $truncatedSuffix = $truncatedSuffix -replace '-$', ''
235
+
236
+ $originalBranchName = $branchName
237
+ $branchName = "$featureNum-$truncatedSuffix"
238
+
239
+ Write-Warning "[specify] Branch name exceeded GitHub's 244-byte limit"
240
+ Write-Warning "[specify] Original: $originalBranchName ($($originalBranchName.Length) bytes)"
241
+ Write-Warning "[specify] Truncated to: $branchName ($($branchName.Length) bytes)"
242
+ }
243
+
244
+ if ($hasGit) {
245
+ try {
246
+ git checkout -b $branchName | Out-Null
247
+ } catch {
248
+ Write-Warning "Failed to create git branch: $branchName"
249
+ }
250
+ } else {
251
+ Write-Warning "[specify] Warning: Git repository not detected; skipped branch creation for $branchName"
252
+ }
253
+
254
+ $featureDir = Join-Path $specsDir $branchName
255
+ New-Item -ItemType Directory -Path $featureDir -Force | Out-Null
256
+
257
+ $template = Join-Path $repoRoot '.specify/templates/spec-template.md'
258
+ $specFile = Join-Path $featureDir 'spec.md'
259
+ if (Test-Path $template) {
260
+ Copy-Item $template $specFile -Force
261
+ } else {
262
+ New-Item -ItemType File -Path $specFile | Out-Null
263
+ }
264
+
265
+ # Set the SPECIFY_FEATURE environment variable for the current session
266
+ $env:SPECIFY_FEATURE = $branchName
267
+
268
+ if ($Json) {
269
+ $obj = [PSCustomObject]@{
270
+ BRANCH_NAME = $branchName
271
+ SPEC_FILE = $specFile
272
+ FEATURE_NUM = $featureNum
273
+ HAS_GIT = $hasGit
274
+ }
275
+ $obj | ConvertTo-Json -Compress
276
+ } else {
277
+ Write-Output "BRANCH_NAME: $branchName"
278
+ Write-Output "SPEC_FILE: $specFile"
279
+ Write-Output "FEATURE_NUM: $featureNum"
280
+ Write-Output "HAS_GIT: $hasGit"
281
+ Write-Output "SPECIFY_FEATURE environment variable set to: $branchName"
282
+ }
283
+
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env pwsh
2
+ # Setup implementation plan for a feature
3
+
4
+ [CmdletBinding()]
5
+ param(
6
+ [switch]$Json,
7
+ [switch]$Help
8
+ )
9
+
10
+ $ErrorActionPreference = 'Stop'
11
+
12
+ # Show help if requested
13
+ if ($Help) {
14
+ Write-Output "Usage: ./setup-plan.ps1 [-Json] [-Help]"
15
+ Write-Output " -Json Output results in JSON format"
16
+ Write-Output " -Help Show this help message"
17
+ exit 0
18
+ }
19
+
20
+ # Load common functions
21
+ . "$PSScriptRoot/common.ps1"
22
+
23
+ # Get all paths and variables from common functions
24
+ $paths = Get-FeaturePathsEnv
25
+
26
+ # Check if we're on a proper feature branch (only for git repos)
27
+ if (-not (Test-FeatureBranch -Branch $paths.CURRENT_BRANCH -HasGit $paths.HAS_GIT)) {
28
+ exit 1
29
+ }
30
+
31
+ # Ensure the feature directory exists
32
+ New-Item -ItemType Directory -Path $paths.FEATURE_DIR -Force | Out-Null
33
+
34
+ # Copy plan template if it exists, otherwise note it or create empty file
35
+ $template = Join-Path $paths.REPO_ROOT '.specify/templates/plan-template.md'
36
+ if (Test-Path $template) {
37
+ Copy-Item $template $paths.IMPL_PLAN -Force
38
+ Write-Output "Copied plan template to $($paths.IMPL_PLAN)"
39
+ } else {
40
+ Write-Warning "Plan template not found at $template"
41
+ # Create a basic plan file if template doesn't exist
42
+ New-Item -ItemType File -Path $paths.IMPL_PLAN -Force | Out-Null
43
+ }
44
+
45
+ # Output results
46
+ if ($Json) {
47
+ $result = [PSCustomObject]@{
48
+ FEATURE_SPEC = $paths.FEATURE_SPEC
49
+ IMPL_PLAN = $paths.IMPL_PLAN
50
+ SPECS_DIR = $paths.FEATURE_DIR
51
+ BRANCH = $paths.CURRENT_BRANCH
52
+ HAS_GIT = $paths.HAS_GIT
53
+ }
54
+ $result | ConvertTo-Json -Compress
55
+ } else {
56
+ Write-Output "FEATURE_SPEC: $($paths.FEATURE_SPEC)"
57
+ Write-Output "IMPL_PLAN: $($paths.IMPL_PLAN)"
58
+ Write-Output "SPECS_DIR: $($paths.FEATURE_DIR)"
59
+ Write-Output "BRANCH: $($paths.CURRENT_BRANCH)"
60
+ Write-Output "HAS_GIT: $($paths.HAS_GIT)"
61
+ }