@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,799 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Update agent context files with information from plan.md
4
+ #
5
+ # This script maintains AI agent context files by parsing feature specifications
6
+ # and updating agent-specific configuration files with project information.
7
+ #
8
+ # MAIN FUNCTIONS:
9
+ # 1. Environment Validation
10
+ # - Verifies git repository structure and branch information
11
+ # - Checks for required plan.md files and templates
12
+ # - Validates file permissions and accessibility
13
+ #
14
+ # 2. Plan Data Extraction
15
+ # - Parses plan.md files to extract project metadata
16
+ # - Identifies language/version, frameworks, databases, and project types
17
+ # - Handles missing or incomplete specification data gracefully
18
+ #
19
+ # 3. Agent File Management
20
+ # - Creates new agent context files from templates when needed
21
+ # - Updates existing agent files with new project information
22
+ # - Preserves manual additions and custom configurations
23
+ # - Supports multiple AI agent formats and directory structures
24
+ #
25
+ # 4. Content Generation
26
+ # - Generates language-specific build/test commands
27
+ # - Creates appropriate project directory structures
28
+ # - Updates technology stacks and recent changes sections
29
+ # - Maintains consistent formatting and timestamps
30
+ #
31
+ # 5. Multi-Agent Support
32
+ # - Handles agent-specific file paths and naming conventions
33
+ # - Supports: Claude, Gemini, Copilot, Cursor, Qwen, opencode, Codex, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy CLI, Qoder CLI, Amp, SHAI, or Amazon Q Developer CLI
34
+ # - Can update single agents or all existing agent files
35
+ # - Creates default Claude file if no agent files exist
36
+ #
37
+ # Usage: ./update-agent-context.sh [agent_type]
38
+ # Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|shai|q|bob|qoder
39
+ # Leave empty to update all existing agent files
40
+
41
+ set -e
42
+
43
+ # Enable strict error handling
44
+ set -u
45
+ set -o pipefail
46
+
47
+ #==============================================================================
48
+ # Configuration and Global Variables
49
+ #==============================================================================
50
+
51
+ # Get script directory and load common functions
52
+ SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
53
+ source "$SCRIPT_DIR/common.sh"
54
+
55
+ # Get all paths and variables from common functions
56
+ eval $(get_feature_paths)
57
+
58
+ NEW_PLAN="$IMPL_PLAN" # Alias for compatibility with existing code
59
+ AGENT_TYPE="${1:-}"
60
+
61
+ # Agent-specific file paths
62
+ CLAUDE_FILE="$REPO_ROOT/CLAUDE.md"
63
+ GEMINI_FILE="$REPO_ROOT/GEMINI.md"
64
+ COPILOT_FILE="$REPO_ROOT/.github/agents/copilot-instructions.md"
65
+ CURSOR_FILE="$REPO_ROOT/.cursor/rules/specify-rules.mdc"
66
+ QWEN_FILE="$REPO_ROOT/QWEN.md"
67
+ AGENTS_FILE="$REPO_ROOT/AGENTS.md"
68
+ WINDSURF_FILE="$REPO_ROOT/.windsurf/rules/specify-rules.md"
69
+ KILOCODE_FILE="$REPO_ROOT/.kilocode/rules/specify-rules.md"
70
+ AUGGIE_FILE="$REPO_ROOT/.augment/rules/specify-rules.md"
71
+ ROO_FILE="$REPO_ROOT/.roo/rules/specify-rules.md"
72
+ CODEBUDDY_FILE="$REPO_ROOT/CODEBUDDY.md"
73
+ QODER_FILE="$REPO_ROOT/QODER.md"
74
+ AMP_FILE="$REPO_ROOT/AGENTS.md"
75
+ SHAI_FILE="$REPO_ROOT/SHAI.md"
76
+ Q_FILE="$REPO_ROOT/AGENTS.md"
77
+ BOB_FILE="$REPO_ROOT/AGENTS.md"
78
+
79
+ # Template file
80
+ TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md"
81
+
82
+ # Global variables for parsed plan data
83
+ NEW_LANG=""
84
+ NEW_FRAMEWORK=""
85
+ NEW_DB=""
86
+ NEW_PROJECT_TYPE=""
87
+
88
+ #==============================================================================
89
+ # Utility Functions
90
+ #==============================================================================
91
+
92
+ log_info() {
93
+ echo "INFO: $1"
94
+ }
95
+
96
+ log_success() {
97
+ echo "✓ $1"
98
+ }
99
+
100
+ log_error() {
101
+ echo "ERROR: $1" >&2
102
+ }
103
+
104
+ log_warning() {
105
+ echo "WARNING: $1" >&2
106
+ }
107
+
108
+ # Cleanup function for temporary files
109
+ cleanup() {
110
+ local exit_code=$?
111
+ rm -f /tmp/agent_update_*_$$
112
+ rm -f /tmp/manual_additions_$$
113
+ exit $exit_code
114
+ }
115
+
116
+ # Set up cleanup trap
117
+ trap cleanup EXIT INT TERM
118
+
119
+ #==============================================================================
120
+ # Validation Functions
121
+ #==============================================================================
122
+
123
+ validate_environment() {
124
+ # Check if we have a current branch/feature (git or non-git)
125
+ if [[ -z "$CURRENT_BRANCH" ]]; then
126
+ log_error "Unable to determine current feature"
127
+ if [[ "$HAS_GIT" == "true" ]]; then
128
+ log_info "Make sure you're on a feature branch"
129
+ else
130
+ log_info "Set SPECIFY_FEATURE environment variable or create a feature first"
131
+ fi
132
+ exit 1
133
+ fi
134
+
135
+ # Check if plan.md exists
136
+ if [[ ! -f "$NEW_PLAN" ]]; then
137
+ log_error "No plan.md found at $NEW_PLAN"
138
+ log_info "Make sure you're working on a feature with a corresponding spec directory"
139
+ if [[ "$HAS_GIT" != "true" ]]; then
140
+ log_info "Use: export SPECIFY_FEATURE=your-feature-name or create a new feature first"
141
+ fi
142
+ exit 1
143
+ fi
144
+
145
+ # Check if template exists (needed for new files)
146
+ if [[ ! -f "$TEMPLATE_FILE" ]]; then
147
+ log_warning "Template file not found at $TEMPLATE_FILE"
148
+ log_warning "Creating new agent files will fail"
149
+ fi
150
+ }
151
+
152
+ #==============================================================================
153
+ # Plan Parsing Functions
154
+ #==============================================================================
155
+
156
+ extract_plan_field() {
157
+ local field_pattern="$1"
158
+ local plan_file="$2"
159
+
160
+ grep "^\*\*${field_pattern}\*\*: " "$plan_file" 2>/dev/null | \
161
+ head -1 | \
162
+ sed "s|^\*\*${field_pattern}\*\*: ||" | \
163
+ sed 's/^[ \t]*//;s/[ \t]*$//' | \
164
+ grep -v "NEEDS CLARIFICATION" | \
165
+ grep -v "^N/A$" || echo ""
166
+ }
167
+
168
+ parse_plan_data() {
169
+ local plan_file="$1"
170
+
171
+ if [[ ! -f "$plan_file" ]]; then
172
+ log_error "Plan file not found: $plan_file"
173
+ return 1
174
+ fi
175
+
176
+ if [[ ! -r "$plan_file" ]]; then
177
+ log_error "Plan file is not readable: $plan_file"
178
+ return 1
179
+ fi
180
+
181
+ log_info "Parsing plan data from $plan_file"
182
+
183
+ NEW_LANG=$(extract_plan_field "Language/Version" "$plan_file")
184
+ NEW_FRAMEWORK=$(extract_plan_field "Primary Dependencies" "$plan_file")
185
+ NEW_DB=$(extract_plan_field "Storage" "$plan_file")
186
+ NEW_PROJECT_TYPE=$(extract_plan_field "Project Type" "$plan_file")
187
+
188
+ # Log what we found
189
+ if [[ -n "$NEW_LANG" ]]; then
190
+ log_info "Found language: $NEW_LANG"
191
+ else
192
+ log_warning "No language information found in plan"
193
+ fi
194
+
195
+ if [[ -n "$NEW_FRAMEWORK" ]]; then
196
+ log_info "Found framework: $NEW_FRAMEWORK"
197
+ fi
198
+
199
+ if [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]]; then
200
+ log_info "Found database: $NEW_DB"
201
+ fi
202
+
203
+ if [[ -n "$NEW_PROJECT_TYPE" ]]; then
204
+ log_info "Found project type: $NEW_PROJECT_TYPE"
205
+ fi
206
+ }
207
+
208
+ format_technology_stack() {
209
+ local lang="$1"
210
+ local framework="$2"
211
+ local parts=()
212
+
213
+ # Add non-empty parts
214
+ [[ -n "$lang" && "$lang" != "NEEDS CLARIFICATION" ]] && parts+=("$lang")
215
+ [[ -n "$framework" && "$framework" != "NEEDS CLARIFICATION" && "$framework" != "N/A" ]] && parts+=("$framework")
216
+
217
+ # Join with proper formatting
218
+ if [[ ${#parts[@]} -eq 0 ]]; then
219
+ echo ""
220
+ elif [[ ${#parts[@]} -eq 1 ]]; then
221
+ echo "${parts[0]}"
222
+ else
223
+ # Join multiple parts with " + "
224
+ local result="${parts[0]}"
225
+ for ((i=1; i<${#parts[@]}; i++)); do
226
+ result="$result + ${parts[i]}"
227
+ done
228
+ echo "$result"
229
+ fi
230
+ }
231
+
232
+ #==============================================================================
233
+ # Template and Content Generation Functions
234
+ #==============================================================================
235
+
236
+ get_project_structure() {
237
+ local project_type="$1"
238
+
239
+ if [[ "$project_type" == *"web"* ]]; then
240
+ echo "backend/\\nfrontend/\\ntests/"
241
+ else
242
+ echo "src/\\ntests/"
243
+ fi
244
+ }
245
+
246
+ get_commands_for_language() {
247
+ local lang="$1"
248
+
249
+ case "$lang" in
250
+ *"Python"*)
251
+ echo "cd src && pytest && ruff check ."
252
+ ;;
253
+ *"Rust"*)
254
+ echo "cargo test && cargo clippy"
255
+ ;;
256
+ *"JavaScript"*|*"TypeScript"*)
257
+ echo "npm test \\&\\& npm run lint"
258
+ ;;
259
+ *)
260
+ echo "# Add commands for $lang"
261
+ ;;
262
+ esac
263
+ }
264
+
265
+ get_language_conventions() {
266
+ local lang="$1"
267
+ echo "$lang: Follow standard conventions"
268
+ }
269
+
270
+ create_new_agent_file() {
271
+ local target_file="$1"
272
+ local temp_file="$2"
273
+ local project_name="$3"
274
+ local current_date="$4"
275
+
276
+ if [[ ! -f "$TEMPLATE_FILE" ]]; then
277
+ log_error "Template not found at $TEMPLATE_FILE"
278
+ return 1
279
+ fi
280
+
281
+ if [[ ! -r "$TEMPLATE_FILE" ]]; then
282
+ log_error "Template file is not readable: $TEMPLATE_FILE"
283
+ return 1
284
+ fi
285
+
286
+ log_info "Creating new agent context file from template..."
287
+
288
+ if ! cp "$TEMPLATE_FILE" "$temp_file"; then
289
+ log_error "Failed to copy template file"
290
+ return 1
291
+ fi
292
+
293
+ # Replace template placeholders
294
+ local project_structure
295
+ project_structure=$(get_project_structure "$NEW_PROJECT_TYPE")
296
+
297
+ local commands
298
+ commands=$(get_commands_for_language "$NEW_LANG")
299
+
300
+ local language_conventions
301
+ language_conventions=$(get_language_conventions "$NEW_LANG")
302
+
303
+ # Perform substitutions with error checking using safer approach
304
+ # Escape special characters for sed by using a different delimiter or escaping
305
+ local escaped_lang=$(printf '%s\n' "$NEW_LANG" | sed 's/[\[\.*^$()+{}|]/\\&/g')
306
+ local escaped_framework=$(printf '%s\n' "$NEW_FRAMEWORK" | sed 's/[\[\.*^$()+{}|]/\\&/g')
307
+ local escaped_branch=$(printf '%s\n' "$CURRENT_BRANCH" | sed 's/[\[\.*^$()+{}|]/\\&/g')
308
+
309
+ # Build technology stack and recent change strings conditionally
310
+ local tech_stack
311
+ if [[ -n "$escaped_lang" && -n "$escaped_framework" ]]; then
312
+ tech_stack="- $escaped_lang + $escaped_framework ($escaped_branch)"
313
+ elif [[ -n "$escaped_lang" ]]; then
314
+ tech_stack="- $escaped_lang ($escaped_branch)"
315
+ elif [[ -n "$escaped_framework" ]]; then
316
+ tech_stack="- $escaped_framework ($escaped_branch)"
317
+ else
318
+ tech_stack="- ($escaped_branch)"
319
+ fi
320
+
321
+ local recent_change
322
+ if [[ -n "$escaped_lang" && -n "$escaped_framework" ]]; then
323
+ recent_change="- $escaped_branch: Added $escaped_lang + $escaped_framework"
324
+ elif [[ -n "$escaped_lang" ]]; then
325
+ recent_change="- $escaped_branch: Added $escaped_lang"
326
+ elif [[ -n "$escaped_framework" ]]; then
327
+ recent_change="- $escaped_branch: Added $escaped_framework"
328
+ else
329
+ recent_change="- $escaped_branch: Added"
330
+ fi
331
+
332
+ local substitutions=(
333
+ "s|\[PROJECT NAME\]|$project_name|"
334
+ "s|\[DATE\]|$current_date|"
335
+ "s|\[EXTRACTED FROM ALL PLAN.MD FILES\]|$tech_stack|"
336
+ "s|\[ACTUAL STRUCTURE FROM PLANS\]|$project_structure|g"
337
+ "s|\[ONLY COMMANDS FOR ACTIVE TECHNOLOGIES\]|$commands|"
338
+ "s|\[LANGUAGE-SPECIFIC, ONLY FOR LANGUAGES IN USE\]|$language_conventions|"
339
+ "s|\[LAST 3 FEATURES AND WHAT THEY ADDED\]|$recent_change|"
340
+ )
341
+
342
+ for substitution in "${substitutions[@]}"; do
343
+ if ! sed -i.bak -e "$substitution" "$temp_file"; then
344
+ log_error "Failed to perform substitution: $substitution"
345
+ rm -f "$temp_file" "$temp_file.bak"
346
+ return 1
347
+ fi
348
+ done
349
+
350
+ # Convert \n sequences to actual newlines
351
+ newline=$(printf '\n')
352
+ sed -i.bak2 "s/\\\\n/${newline}/g" "$temp_file"
353
+
354
+ # Clean up backup files
355
+ rm -f "$temp_file.bak" "$temp_file.bak2"
356
+
357
+ return 0
358
+ }
359
+
360
+
361
+
362
+
363
+ update_existing_agent_file() {
364
+ local target_file="$1"
365
+ local current_date="$2"
366
+
367
+ log_info "Updating existing agent context file..."
368
+
369
+ # Use a single temporary file for atomic update
370
+ local temp_file
371
+ temp_file=$(mktemp) || {
372
+ log_error "Failed to create temporary file"
373
+ return 1
374
+ }
375
+
376
+ # Process the file in one pass
377
+ local tech_stack=$(format_technology_stack "$NEW_LANG" "$NEW_FRAMEWORK")
378
+ local new_tech_entries=()
379
+ local new_change_entry=""
380
+
381
+ # Prepare new technology entries
382
+ if [[ -n "$tech_stack" ]] && ! grep -q "$tech_stack" "$target_file"; then
383
+ new_tech_entries+=("- $tech_stack ($CURRENT_BRANCH)")
384
+ fi
385
+
386
+ if [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]] && [[ "$NEW_DB" != "NEEDS CLARIFICATION" ]] && ! grep -q "$NEW_DB" "$target_file"; then
387
+ new_tech_entries+=("- $NEW_DB ($CURRENT_BRANCH)")
388
+ fi
389
+
390
+ # Prepare new change entry
391
+ if [[ -n "$tech_stack" ]]; then
392
+ new_change_entry="- $CURRENT_BRANCH: Added $tech_stack"
393
+ elif [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]] && [[ "$NEW_DB" != "NEEDS CLARIFICATION" ]]; then
394
+ new_change_entry="- $CURRENT_BRANCH: Added $NEW_DB"
395
+ fi
396
+
397
+ # Check if sections exist in the file
398
+ local has_active_technologies=0
399
+ local has_recent_changes=0
400
+
401
+ if grep -q "^## Active Technologies" "$target_file" 2>/dev/null; then
402
+ has_active_technologies=1
403
+ fi
404
+
405
+ if grep -q "^## Recent Changes" "$target_file" 2>/dev/null; then
406
+ has_recent_changes=1
407
+ fi
408
+
409
+ # Process file line by line
410
+ local in_tech_section=false
411
+ local in_changes_section=false
412
+ local tech_entries_added=false
413
+ local changes_entries_added=false
414
+ local existing_changes_count=0
415
+ local file_ended=false
416
+
417
+ while IFS= read -r line || [[ -n "$line" ]]; do
418
+ # Handle Active Technologies section
419
+ if [[ "$line" == "## Active Technologies" ]]; then
420
+ echo "$line" >> "$temp_file"
421
+ in_tech_section=true
422
+ continue
423
+ elif [[ $in_tech_section == true ]] && [[ "$line" =~ ^##[[:space:]] ]]; then
424
+ # Add new tech entries before closing the section
425
+ if [[ $tech_entries_added == false ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then
426
+ printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file"
427
+ tech_entries_added=true
428
+ fi
429
+ echo "$line" >> "$temp_file"
430
+ in_tech_section=false
431
+ continue
432
+ elif [[ $in_tech_section == true ]] && [[ -z "$line" ]]; then
433
+ # Add new tech entries before empty line in tech section
434
+ if [[ $tech_entries_added == false ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then
435
+ printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file"
436
+ tech_entries_added=true
437
+ fi
438
+ echo "$line" >> "$temp_file"
439
+ continue
440
+ fi
441
+
442
+ # Handle Recent Changes section
443
+ if [[ "$line" == "## Recent Changes" ]]; then
444
+ echo "$line" >> "$temp_file"
445
+ # Add new change entry right after the heading
446
+ if [[ -n "$new_change_entry" ]]; then
447
+ echo "$new_change_entry" >> "$temp_file"
448
+ fi
449
+ in_changes_section=true
450
+ changes_entries_added=true
451
+ continue
452
+ elif [[ $in_changes_section == true ]] && [[ "$line" =~ ^##[[:space:]] ]]; then
453
+ echo "$line" >> "$temp_file"
454
+ in_changes_section=false
455
+ continue
456
+ elif [[ $in_changes_section == true ]] && [[ "$line" == "- "* ]]; then
457
+ # Keep only first 2 existing changes
458
+ if [[ $existing_changes_count -lt 2 ]]; then
459
+ echo "$line" >> "$temp_file"
460
+ ((existing_changes_count++))
461
+ fi
462
+ continue
463
+ fi
464
+
465
+ # Update timestamp
466
+ if [[ "$line" =~ \*\*Last\ updated\*\*:.*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] ]]; then
467
+ echo "$line" | sed "s/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/$current_date/" >> "$temp_file"
468
+ else
469
+ echo "$line" >> "$temp_file"
470
+ fi
471
+ done < "$target_file"
472
+
473
+ # Post-loop check: if we're still in the Active Technologies section and haven't added new entries
474
+ if [[ $in_tech_section == true ]] && [[ $tech_entries_added == false ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then
475
+ printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file"
476
+ tech_entries_added=true
477
+ fi
478
+
479
+ # If sections don't exist, add them at the end of the file
480
+ if [[ $has_active_technologies -eq 0 ]] && [[ ${#new_tech_entries[@]} -gt 0 ]]; then
481
+ echo "" >> "$temp_file"
482
+ echo "## Active Technologies" >> "$temp_file"
483
+ printf '%s\n' "${new_tech_entries[@]}" >> "$temp_file"
484
+ tech_entries_added=true
485
+ fi
486
+
487
+ if [[ $has_recent_changes -eq 0 ]] && [[ -n "$new_change_entry" ]]; then
488
+ echo "" >> "$temp_file"
489
+ echo "## Recent Changes" >> "$temp_file"
490
+ echo "$new_change_entry" >> "$temp_file"
491
+ changes_entries_added=true
492
+ fi
493
+
494
+ # Move temp file to target atomically
495
+ if ! mv "$temp_file" "$target_file"; then
496
+ log_error "Failed to update target file"
497
+ rm -f "$temp_file"
498
+ return 1
499
+ fi
500
+
501
+ return 0
502
+ }
503
+ #==============================================================================
504
+ # Main Agent File Update Function
505
+ #==============================================================================
506
+
507
+ update_agent_file() {
508
+ local target_file="$1"
509
+ local agent_name="$2"
510
+
511
+ if [[ -z "$target_file" ]] || [[ -z "$agent_name" ]]; then
512
+ log_error "update_agent_file requires target_file and agent_name parameters"
513
+ return 1
514
+ fi
515
+
516
+ log_info "Updating $agent_name context file: $target_file"
517
+
518
+ local project_name
519
+ project_name=$(basename "$REPO_ROOT")
520
+ local current_date
521
+ current_date=$(date +%Y-%m-%d)
522
+
523
+ # Create directory if it doesn't exist
524
+ local target_dir
525
+ target_dir=$(dirname "$target_file")
526
+ if [[ ! -d "$target_dir" ]]; then
527
+ if ! mkdir -p "$target_dir"; then
528
+ log_error "Failed to create directory: $target_dir"
529
+ return 1
530
+ fi
531
+ fi
532
+
533
+ if [[ ! -f "$target_file" ]]; then
534
+ # Create new file from template
535
+ local temp_file
536
+ temp_file=$(mktemp) || {
537
+ log_error "Failed to create temporary file"
538
+ return 1
539
+ }
540
+
541
+ if create_new_agent_file "$target_file" "$temp_file" "$project_name" "$current_date"; then
542
+ if mv "$temp_file" "$target_file"; then
543
+ log_success "Created new $agent_name context file"
544
+ else
545
+ log_error "Failed to move temporary file to $target_file"
546
+ rm -f "$temp_file"
547
+ return 1
548
+ fi
549
+ else
550
+ log_error "Failed to create new agent file"
551
+ rm -f "$temp_file"
552
+ return 1
553
+ fi
554
+ else
555
+ # Update existing file
556
+ if [[ ! -r "$target_file" ]]; then
557
+ log_error "Cannot read existing file: $target_file"
558
+ return 1
559
+ fi
560
+
561
+ if [[ ! -w "$target_file" ]]; then
562
+ log_error "Cannot write to existing file: $target_file"
563
+ return 1
564
+ fi
565
+
566
+ if update_existing_agent_file "$target_file" "$current_date"; then
567
+ log_success "Updated existing $agent_name context file"
568
+ else
569
+ log_error "Failed to update existing agent file"
570
+ return 1
571
+ fi
572
+ fi
573
+
574
+ return 0
575
+ }
576
+
577
+ #==============================================================================
578
+ # Agent Selection and Processing
579
+ #==============================================================================
580
+
581
+ update_specific_agent() {
582
+ local agent_type="$1"
583
+
584
+ case "$agent_type" in
585
+ claude)
586
+ update_agent_file "$CLAUDE_FILE" "Claude Code"
587
+ ;;
588
+ gemini)
589
+ update_agent_file "$GEMINI_FILE" "Gemini CLI"
590
+ ;;
591
+ copilot)
592
+ update_agent_file "$COPILOT_FILE" "GitHub Copilot"
593
+ ;;
594
+ cursor-agent)
595
+ update_agent_file "$CURSOR_FILE" "Cursor IDE"
596
+ ;;
597
+ qwen)
598
+ update_agent_file "$QWEN_FILE" "Qwen Code"
599
+ ;;
600
+ opencode)
601
+ update_agent_file "$AGENTS_FILE" "opencode"
602
+ ;;
603
+ codex)
604
+ update_agent_file "$AGENTS_FILE" "Codex CLI"
605
+ ;;
606
+ windsurf)
607
+ update_agent_file "$WINDSURF_FILE" "Windsurf"
608
+ ;;
609
+ kilocode)
610
+ update_agent_file "$KILOCODE_FILE" "Kilo Code"
611
+ ;;
612
+ auggie)
613
+ update_agent_file "$AUGGIE_FILE" "Auggie CLI"
614
+ ;;
615
+ roo)
616
+ update_agent_file "$ROO_FILE" "Roo Code"
617
+ ;;
618
+ codebuddy)
619
+ update_agent_file "$CODEBUDDY_FILE" "CodeBuddy CLI"
620
+ ;;
621
+ qoder)
622
+ update_agent_file "$QODER_FILE" "Qoder CLI"
623
+ ;;
624
+ amp)
625
+ update_agent_file "$AMP_FILE" "Amp"
626
+ ;;
627
+ shai)
628
+ update_agent_file "$SHAI_FILE" "SHAI"
629
+ ;;
630
+ q)
631
+ update_agent_file "$Q_FILE" "Amazon Q Developer CLI"
632
+ ;;
633
+ bob)
634
+ update_agent_file "$BOB_FILE" "IBM Bob"
635
+ ;;
636
+ *)
637
+ log_error "Unknown agent type '$agent_type'"
638
+ log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|amp|shai|q|bob|qoder"
639
+ exit 1
640
+ ;;
641
+ esac
642
+ }
643
+
644
+ update_all_existing_agents() {
645
+ local found_agent=false
646
+
647
+ # Check each possible agent file and update if it exists
648
+ if [[ -f "$CLAUDE_FILE" ]]; then
649
+ update_agent_file "$CLAUDE_FILE" "Claude Code"
650
+ found_agent=true
651
+ fi
652
+
653
+ if [[ -f "$GEMINI_FILE" ]]; then
654
+ update_agent_file "$GEMINI_FILE" "Gemini CLI"
655
+ found_agent=true
656
+ fi
657
+
658
+ if [[ -f "$COPILOT_FILE" ]]; then
659
+ update_agent_file "$COPILOT_FILE" "GitHub Copilot"
660
+ found_agent=true
661
+ fi
662
+
663
+ if [[ -f "$CURSOR_FILE" ]]; then
664
+ update_agent_file "$CURSOR_FILE" "Cursor IDE"
665
+ found_agent=true
666
+ fi
667
+
668
+ if [[ -f "$QWEN_FILE" ]]; then
669
+ update_agent_file "$QWEN_FILE" "Qwen Code"
670
+ found_agent=true
671
+ fi
672
+
673
+ if [[ -f "$AGENTS_FILE" ]]; then
674
+ update_agent_file "$AGENTS_FILE" "Codex/opencode"
675
+ found_agent=true
676
+ fi
677
+
678
+ if [[ -f "$WINDSURF_FILE" ]]; then
679
+ update_agent_file "$WINDSURF_FILE" "Windsurf"
680
+ found_agent=true
681
+ fi
682
+
683
+ if [[ -f "$KILOCODE_FILE" ]]; then
684
+ update_agent_file "$KILOCODE_FILE" "Kilo Code"
685
+ found_agent=true
686
+ fi
687
+
688
+ if [[ -f "$AUGGIE_FILE" ]]; then
689
+ update_agent_file "$AUGGIE_FILE" "Auggie CLI"
690
+ found_agent=true
691
+ fi
692
+
693
+ if [[ -f "$ROO_FILE" ]]; then
694
+ update_agent_file "$ROO_FILE" "Roo Code"
695
+ found_agent=true
696
+ fi
697
+
698
+ if [[ -f "$CODEBUDDY_FILE" ]]; then
699
+ update_agent_file "$CODEBUDDY_FILE" "CodeBuddy CLI"
700
+ found_agent=true
701
+ fi
702
+
703
+ if [[ -f "$SHAI_FILE" ]]; then
704
+ update_agent_file "$SHAI_FILE" "SHAI"
705
+ found_agent=true
706
+ fi
707
+
708
+ if [[ -f "$QODER_FILE" ]]; then
709
+ update_agent_file "$QODER_FILE" "Qoder CLI"
710
+ found_agent=true
711
+ fi
712
+
713
+ if [[ -f "$Q_FILE" ]]; then
714
+ update_agent_file "$Q_FILE" "Amazon Q Developer CLI"
715
+ found_agent=true
716
+ fi
717
+
718
+ if [[ -f "$BOB_FILE" ]]; then
719
+ update_agent_file "$BOB_FILE" "IBM Bob"
720
+ found_agent=true
721
+ fi
722
+
723
+ # If no agent files exist, create a default Claude file
724
+ if [[ "$found_agent" == false ]]; then
725
+ log_info "No existing agent files found, creating default Claude file..."
726
+ update_agent_file "$CLAUDE_FILE" "Claude Code"
727
+ fi
728
+ }
729
+ print_summary() {
730
+ echo
731
+ log_info "Summary of changes:"
732
+
733
+ if [[ -n "$NEW_LANG" ]]; then
734
+ echo " - Added language: $NEW_LANG"
735
+ fi
736
+
737
+ if [[ -n "$NEW_FRAMEWORK" ]]; then
738
+ echo " - Added framework: $NEW_FRAMEWORK"
739
+ fi
740
+
741
+ if [[ -n "$NEW_DB" ]] && [[ "$NEW_DB" != "N/A" ]]; then
742
+ echo " - Added database: $NEW_DB"
743
+ fi
744
+
745
+ echo
746
+
747
+ log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|codebuddy|shai|q|bob|qoder]"
748
+ }
749
+
750
+ #==============================================================================
751
+ # Main Execution
752
+ #==============================================================================
753
+
754
+ main() {
755
+ # Validate environment before proceeding
756
+ validate_environment
757
+
758
+ log_info "=== Updating agent context files for feature $CURRENT_BRANCH ==="
759
+
760
+ # Parse the plan file to extract project information
761
+ if ! parse_plan_data "$NEW_PLAN"; then
762
+ log_error "Failed to parse plan data"
763
+ exit 1
764
+ fi
765
+
766
+ # Process based on agent type argument
767
+ local success=true
768
+
769
+ if [[ -z "$AGENT_TYPE" ]]; then
770
+ # No specific agent provided - update all existing agent files
771
+ log_info "No agent specified, updating all existing agent files..."
772
+ if ! update_all_existing_agents; then
773
+ success=false
774
+ fi
775
+ else
776
+ # Specific agent provided - update only that agent
777
+ log_info "Updating specific agent: $AGENT_TYPE"
778
+ if ! update_specific_agent "$AGENT_TYPE"; then
779
+ success=false
780
+ fi
781
+ fi
782
+
783
+ # Print summary
784
+ print_summary
785
+
786
+ if [[ "$success" == true ]]; then
787
+ log_success "Agent context update completed successfully"
788
+ exit 0
789
+ else
790
+ log_error "Agent context update completed with errors"
791
+ exit 1
792
+ fi
793
+ }
794
+
795
+ # Execute main function if script is run directly
796
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
797
+ main "$@"
798
+ fi
799
+