kiro-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (774) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +2067 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/presets/_template/.env.example +15 -0
  5. package/dist/presets/_template/.mcp.json.example +30 -0
  6. package/dist/presets/_template/README.md +71 -0
  7. package/dist/presets/_template/agents/.gitkeep +1 -0
  8. package/dist/presets/_template/agents/brainstormer.md +47 -0
  9. package/dist/presets/_template/agents/code-reviewer.md +56 -0
  10. package/dist/presets/_template/agents/copywriter.md +47 -0
  11. package/dist/presets/_template/agents/database-admin.md +48 -0
  12. package/dist/presets/_template/agents/debugger.md +47 -0
  13. package/dist/presets/_template/agents/docs-manager.md +46 -0
  14. package/dist/presets/_template/agents/git-manager.md +49 -0
  15. package/dist/presets/_template/agents/journal-writer.md +58 -0
  16. package/dist/presets/_template/agents/mcp-manager.md +46 -0
  17. package/dist/presets/_template/agents/planner.md +44 -0
  18. package/dist/presets/_template/agents/project-manager.md +54 -0
  19. package/dist/presets/_template/agents/researcher.md +47 -0
  20. package/dist/presets/_template/agents/scout-external.md +50 -0
  21. package/dist/presets/_template/agents/scout.md +51 -0
  22. package/dist/presets/_template/agents/tester.md +55 -0
  23. package/dist/presets/_template/agents/ui-ux-designer.md +47 -0
  24. package/dist/presets/_template/commands/bootstrap.md +15 -0
  25. package/dist/presets/_template/commands/clean.md +14 -0
  26. package/dist/presets/_template/commands/design/figma.md +14 -0
  27. package/dist/presets/_template/commands/design/system.md +14 -0
  28. package/dist/presets/_template/commands/design/wireframe.md +14 -0
  29. package/dist/presets/_template/commands/docs/architecture.md +14 -0
  30. package/dist/presets/_template/commands/docs/summarize.md +14 -0
  31. package/dist/presets/_template/commands/docs/update.md +14 -0
  32. package/dist/presets/_template/commands/fix/build.md +14 -0
  33. package/dist/presets/_template/commands/fix/lint.md +13 -0
  34. package/dist/presets/_template/commands/fix/tests.md +14 -0
  35. package/dist/presets/_template/commands/git/branch.md +15 -0
  36. package/dist/presets/_template/commands/git/commit.md +15 -0
  37. package/dist/presets/_template/commands/git/pr.md +14 -0
  38. package/dist/presets/_template/commands/lint.md +14 -0
  39. package/dist/presets/_template/commands/plan/feature.md +15 -0
  40. package/dist/presets/_template/commands/plan/refactor.md +15 -0
  41. package/dist/presets/_template/commands/release.md +16 -0
  42. package/dist/presets/_template/commands/review/code.md +14 -0
  43. package/dist/presets/_template/commands/review/security.md +14 -0
  44. package/dist/presets/_template/commands/scout/ext.md +15 -0
  45. package/dist/presets/_template/commands/scout.md +15 -0
  46. package/dist/presets/_template/commands/skill/add.md +15 -0
  47. package/dist/presets/_template/commands/skill/create.md +15 -0
  48. package/dist/presets/_template/commands/skill/optimize.md +14 -0
  49. package/dist/presets/_template/commands/test.md +15 -0
  50. package/dist/presets/_template/docs/.gitkeep +1 -0
  51. package/dist/presets/_template/hooks/.env.example +9 -0
  52. package/dist/presets/_template/hooks/README.md +28 -0
  53. package/dist/presets/_template/hooks/discord-notify.js +31 -0
  54. package/dist/presets/_template/hooks/discord-notify.ps1 +19 -0
  55. package/dist/presets/_template/hooks/discord-notify.sh +15 -0
  56. package/dist/presets/_template/hooks/git-status-tracker.js +26 -0
  57. package/dist/presets/_template/hooks/modularization-hook.js +36 -0
  58. package/dist/presets/_template/hooks/pre-commit-lint.js +15 -0
  59. package/dist/presets/_template/hooks/scout-block.js +30 -0
  60. package/dist/presets/_template/hooks/scout-block.ps1 +26 -0
  61. package/dist/presets/_template/hooks/scout-block.sh +31 -0
  62. package/dist/presets/_template/hooks/telegram-notify.js +30 -0
  63. package/dist/presets/_template/hooks/telegram-notify.ps1 +22 -0
  64. package/dist/presets/_template/hooks/telegram-notify.sh +16 -0
  65. package/dist/presets/_template/manifest.json +17 -0
  66. package/dist/presets/_template/settings.json +31 -0
  67. package/dist/presets/_template/skills/.env.example +12 -0
  68. package/dist/presets/_template/skills/INSTALLATION.md +37 -0
  69. package/dist/presets/_template/skills/README.md +34 -0
  70. package/dist/presets/_template/skills/THIRD_PARTY_NOTICES.md +24 -0
  71. package/dist/presets/_template/skills/agent_skills_spec.md +41 -0
  72. package/dist/presets/_template/skills/template-skill/SKILL.md +20 -0
  73. package/dist/presets/_template/skills/template-skill/assets/.gitkeep +1 -0
  74. package/dist/presets/_template/skills/template-skill/references/.gitkeep +1 -0
  75. package/dist/presets/_template/skills/template-skill/scripts/.gitkeep +1 -0
  76. package/dist/presets/_template/specs/_templates/_template/.gitkeep +1 -0
  77. package/dist/presets/_template/statusline.js +22 -0
  78. package/dist/presets/_template/statusline.ps1 +16 -0
  79. package/dist/presets/_template/statusline.sh +17 -0
  80. package/dist/presets/_template/steering/.gitkeep +1 -0
  81. package/dist/presets/_template/workflows/development-rules.md +33 -0
  82. package/dist/presets/_template/workflows/documentation-management.md +29 -0
  83. package/dist/presets/_template/workflows/orchestration-protocol.md +25 -0
  84. package/dist/presets/_template/workflows/primary-workflow.md +33 -0
  85. package/dist/presets/backend/.env.example +24 -0
  86. package/dist/presets/backend/.mcp.json.example +34 -0
  87. package/dist/presets/backend/README.md +58 -0
  88. package/dist/presets/backend/agents/api-developer.md +45 -0
  89. package/dist/presets/backend/agents/brainstormer.md +42 -0
  90. package/dist/presets/backend/agents/code-reviewer.md +56 -0
  91. package/dist/presets/backend/agents/copywriter.md +40 -0
  92. package/dist/presets/backend/agents/database-admin.md +41 -0
  93. package/dist/presets/backend/agents/database-architect.md +58 -0
  94. package/dist/presets/backend/agents/debugger.md +40 -0
  95. package/dist/presets/backend/agents/devops-engineer.md +58 -0
  96. package/dist/presets/backend/agents/docs-manager.md +39 -0
  97. package/dist/presets/backend/agents/git-manager.md +47 -0
  98. package/dist/presets/backend/agents/journal-writer.md +58 -0
  99. package/dist/presets/backend/agents/mcp-manager.md +39 -0
  100. package/dist/presets/backend/agents/planner.md +39 -0
  101. package/dist/presets/backend/agents/project-manager.md +54 -0
  102. package/dist/presets/backend/agents/researcher.md +41 -0
  103. package/dist/presets/backend/agents/scout-external.md +43 -0
  104. package/dist/presets/backend/agents/scout.md +46 -0
  105. package/dist/presets/backend/agents/security-auditor.md +59 -0
  106. package/dist/presets/backend/agents/tester.md +55 -0
  107. package/dist/presets/backend/commands/backend/middleware.md +29 -0
  108. package/dist/presets/backend/commands/backend/migration.md +27 -0
  109. package/dist/presets/backend/commands/backend/route.md +27 -0
  110. package/dist/presets/backend/commands/bootstrap.md +16 -0
  111. package/dist/presets/backend/commands/clean.md +12 -0
  112. package/dist/presets/backend/commands/design/figma.md +15 -0
  113. package/dist/presets/backend/commands/design/system.md +17 -0
  114. package/dist/presets/backend/commands/design/wireframe.md +15 -0
  115. package/dist/presets/backend/commands/docs/architecture.md +13 -0
  116. package/dist/presets/backend/commands/docs/summarize.md +15 -0
  117. package/dist/presets/backend/commands/docs/update.md +12 -0
  118. package/dist/presets/backend/commands/fix/build.md +11 -0
  119. package/dist/presets/backend/commands/fix/lint.md +10 -0
  120. package/dist/presets/backend/commands/fix/tests.md +16 -0
  121. package/dist/presets/backend/commands/git/branch.md +16 -0
  122. package/dist/presets/backend/commands/git/commit.md +17 -0
  123. package/dist/presets/backend/commands/git/pr.md +16 -0
  124. package/dist/presets/backend/commands/lint.md +11 -0
  125. package/dist/presets/backend/commands/plan/feature.md +16 -0
  126. package/dist/presets/backend/commands/plan/refactor.md +16 -0
  127. package/dist/presets/backend/commands/release.md +17 -0
  128. package/dist/presets/backend/commands/review/code.md +16 -0
  129. package/dist/presets/backend/commands/review/security.md +17 -0
  130. package/dist/presets/backend/commands/scout/ext.md +17 -0
  131. package/dist/presets/backend/commands/scout.md +16 -0
  132. package/dist/presets/backend/commands/skill/add.md +16 -0
  133. package/dist/presets/backend/commands/skill/create.md +17 -0
  134. package/dist/presets/backend/commands/skill/optimize.md +16 -0
  135. package/dist/presets/backend/commands/test.md +15 -0
  136. package/dist/presets/backend/docs/code-standards.md +84 -0
  137. package/dist/presets/backend/docs/project-roadmap.md +60 -0
  138. package/dist/presets/backend/docs/system-architecture.md +81 -0
  139. package/dist/presets/backend/hooks/.env.example +9 -0
  140. package/dist/presets/backend/hooks/README.md +28 -0
  141. package/dist/presets/backend/hooks/discord-notify.js +31 -0
  142. package/dist/presets/backend/hooks/discord-notify.ps1 +19 -0
  143. package/dist/presets/backend/hooks/discord-notify.sh +15 -0
  144. package/dist/presets/backend/hooks/git-status-tracker.js +26 -0
  145. package/dist/presets/backend/hooks/modularization-hook.js +36 -0
  146. package/dist/presets/backend/hooks/pre-commit-lint.js +15 -0
  147. package/dist/presets/backend/hooks/scout-block.js +30 -0
  148. package/dist/presets/backend/hooks/scout-block.ps1 +26 -0
  149. package/dist/presets/backend/hooks/scout-block.sh +31 -0
  150. package/dist/presets/backend/hooks/telegram-notify.js +30 -0
  151. package/dist/presets/backend/hooks/telegram-notify.ps1 +22 -0
  152. package/dist/presets/backend/hooks/telegram-notify.sh +16 -0
  153. package/dist/presets/backend/manifest.json +152 -0
  154. package/dist/presets/backend/settings.json +31 -0
  155. package/dist/presets/backend/skills/.env.example +9 -0
  156. package/dist/presets/backend/skills/INSTALLATION.md +47 -0
  157. package/dist/presets/backend/skills/README.md +43 -0
  158. package/dist/presets/backend/skills/THIRD_PARTY_NOTICES.md +16 -0
  159. package/dist/presets/backend/skills/agent_skills_spec.md +40 -0
  160. package/dist/presets/backend/skills/ai-multimodal/SKILL.md +32 -0
  161. package/dist/presets/backend/skills/backend-development/SKILL.md +50 -0
  162. package/dist/presets/backend/skills/better-auth/SKILL.md +57 -0
  163. package/dist/presets/backend/skills/chrome-devtools/SKILL.md +43 -0
  164. package/dist/presets/backend/skills/code-review/SKILL.md +45 -0
  165. package/dist/presets/backend/skills/databases/SKILL.md +50 -0
  166. package/dist/presets/backend/skills/debugging/SKILL.md +34 -0
  167. package/dist/presets/backend/skills/devops/SKILL.md +53 -0
  168. package/dist/presets/backend/skills/docs-seeker/SKILL.md +40 -0
  169. package/dist/presets/backend/skills/frontend-design/SKILL.md +39 -0
  170. package/dist/presets/backend/skills/mcp-builder/SKILL.md +53 -0
  171. package/dist/presets/backend/skills/mcp-management/SKILL.md +40 -0
  172. package/dist/presets/backend/skills/media-processing/SKILL.md +55 -0
  173. package/dist/presets/backend/skills/planning/SKILL.md +39 -0
  174. package/dist/presets/backend/skills/problem-solving/SKILL.md +41 -0
  175. package/dist/presets/backend/skills/repomix/SKILL.md +42 -0
  176. package/dist/presets/backend/skills/research/SKILL.md +34 -0
  177. package/dist/presets/backend/skills/sequential-thinking/SKILL.md +33 -0
  178. package/dist/presets/backend/skills/skill-creator/SKILL.md +56 -0
  179. package/dist/presets/backend/skills/template-skill/SKILL.md +25 -0
  180. package/dist/presets/backend/specs/_templates/backend/design.md +87 -0
  181. package/dist/presets/backend/specs/_templates/backend/requirements.md +55 -0
  182. package/dist/presets/backend/specs/_templates/backend/tasks.md +46 -0
  183. package/dist/presets/backend/statusline.js +22 -0
  184. package/dist/presets/backend/statusline.ps1 +16 -0
  185. package/dist/presets/backend/statusline.sh +17 -0
  186. package/dist/presets/backend/steering/api-design-conventions.md +105 -0
  187. package/dist/presets/backend/steering/security-best-practices.md +85 -0
  188. package/dist/presets/backend/workflows/development-rules.md +33 -0
  189. package/dist/presets/backend/workflows/documentation-management.md +29 -0
  190. package/dist/presets/backend/workflows/orchestration-protocol.md +25 -0
  191. package/dist/presets/backend/workflows/primary-workflow.md +33 -0
  192. package/dist/presets/data-ai/.env.example +35 -0
  193. package/dist/presets/data-ai/.mcp.json.example +31 -0
  194. package/dist/presets/data-ai/README.md +58 -0
  195. package/dist/presets/data-ai/agents/brainstormer.md +46 -0
  196. package/dist/presets/data-ai/agents/code-reviewer.md +59 -0
  197. package/dist/presets/data-ai/agents/copywriter.md +46 -0
  198. package/dist/presets/data-ai/agents/data-pipeline-architect.md +45 -0
  199. package/dist/presets/data-ai/agents/data-scientist.md +45 -0
  200. package/dist/presets/data-ai/agents/database-admin.md +43 -0
  201. package/dist/presets/data-ai/agents/debugger.md +44 -0
  202. package/dist/presets/data-ai/agents/docs-manager.md +41 -0
  203. package/dist/presets/data-ai/agents/git-manager.md +49 -0
  204. package/dist/presets/data-ai/agents/journal-writer.md +58 -0
  205. package/dist/presets/data-ai/agents/mcp-manager.md +40 -0
  206. package/dist/presets/data-ai/agents/ml-engineer.md +45 -0
  207. package/dist/presets/data-ai/agents/model-evaluator.md +45 -0
  208. package/dist/presets/data-ai/agents/planner.md +42 -0
  209. package/dist/presets/data-ai/agents/project-manager.md +54 -0
  210. package/dist/presets/data-ai/agents/researcher.md +46 -0
  211. package/dist/presets/data-ai/agents/scout-external.md +45 -0
  212. package/dist/presets/data-ai/agents/scout.md +48 -0
  213. package/dist/presets/data-ai/agents/tester.md +56 -0
  214. package/dist/presets/data-ai/agents/ui-ux-designer.md +45 -0
  215. package/dist/presets/data-ai/commands/bootstrap.md +17 -0
  216. package/dist/presets/data-ai/commands/clean.md +17 -0
  217. package/dist/presets/data-ai/commands/data/clean.md +20 -0
  218. package/dist/presets/data-ai/commands/data/explore.md +18 -0
  219. package/dist/presets/data-ai/commands/data/profile.md +18 -0
  220. package/dist/presets/data-ai/commands/data/validate.md +18 -0
  221. package/dist/presets/data-ai/commands/docs/architecture.md +17 -0
  222. package/dist/presets/data-ai/commands/docs/summarize.md +17 -0
  223. package/dist/presets/data-ai/commands/docs/update.md +17 -0
  224. package/dist/presets/data-ai/commands/fix/build.md +17 -0
  225. package/dist/presets/data-ai/commands/fix/lint.md +16 -0
  226. package/dist/presets/data-ai/commands/fix/tests.md +17 -0
  227. package/dist/presets/data-ai/commands/git/branch.md +16 -0
  228. package/dist/presets/data-ai/commands/git/commit.md +17 -0
  229. package/dist/presets/data-ai/commands/git/pr.md +17 -0
  230. package/dist/presets/data-ai/commands/lint.md +16 -0
  231. package/dist/presets/data-ai/commands/ml/compare.md +17 -0
  232. package/dist/presets/data-ai/commands/ml/deploy.md +18 -0
  233. package/dist/presets/data-ai/commands/ml/evaluate.md +19 -0
  234. package/dist/presets/data-ai/commands/ml/train.md +20 -0
  235. package/dist/presets/data-ai/commands/ml/tune.md +18 -0
  236. package/dist/presets/data-ai/commands/pipeline/build.md +18 -0
  237. package/dist/presets/data-ai/commands/pipeline/run.md +18 -0
  238. package/dist/presets/data-ai/commands/pipeline/validate.md +17 -0
  239. package/dist/presets/data-ai/commands/plan/feature.md +18 -0
  240. package/dist/presets/data-ai/commands/plan/refactor.md +18 -0
  241. package/dist/presets/data-ai/commands/release.md +17 -0
  242. package/dist/presets/data-ai/commands/review/code.md +17 -0
  243. package/dist/presets/data-ai/commands/review/security.md +18 -0
  244. package/dist/presets/data-ai/commands/scout/ext.md +17 -0
  245. package/dist/presets/data-ai/commands/scout.md +17 -0
  246. package/dist/presets/data-ai/commands/skill/add.md +17 -0
  247. package/dist/presets/data-ai/commands/skill/create.md +19 -0
  248. package/dist/presets/data-ai/commands/skill/optimize.md +18 -0
  249. package/dist/presets/data-ai/commands/test.md +17 -0
  250. package/dist/presets/data-ai/docs/code-standards.md +89 -0
  251. package/dist/presets/data-ai/docs/project-roadmap.md +79 -0
  252. package/dist/presets/data-ai/docs/system-architecture.md +97 -0
  253. package/dist/presets/data-ai/hooks/.env.example +9 -0
  254. package/dist/presets/data-ai/hooks/README.md +28 -0
  255. package/dist/presets/data-ai/hooks/discord-notify.js +31 -0
  256. package/dist/presets/data-ai/hooks/discord-notify.ps1 +19 -0
  257. package/dist/presets/data-ai/hooks/discord-notify.sh +15 -0
  258. package/dist/presets/data-ai/hooks/git-status-tracker.js +26 -0
  259. package/dist/presets/data-ai/hooks/modularization-hook.js +36 -0
  260. package/dist/presets/data-ai/hooks/pre-commit-lint.js +15 -0
  261. package/dist/presets/data-ai/hooks/scout-block.js +30 -0
  262. package/dist/presets/data-ai/hooks/scout-block.ps1 +26 -0
  263. package/dist/presets/data-ai/hooks/scout-block.sh +31 -0
  264. package/dist/presets/data-ai/hooks/telegram-notify.js +30 -0
  265. package/dist/presets/data-ai/hooks/telegram-notify.ps1 +22 -0
  266. package/dist/presets/data-ai/hooks/telegram-notify.sh +16 -0
  267. package/dist/presets/data-ai/manifest.json +167 -0
  268. package/dist/presets/data-ai/settings.json +31 -0
  269. package/dist/presets/data-ai/skills/.env.example +16 -0
  270. package/dist/presets/data-ai/skills/INSTALLATION.md +35 -0
  271. package/dist/presets/data-ai/skills/README.md +35 -0
  272. package/dist/presets/data-ai/skills/THIRD_PARTY_NOTICES.md +32 -0
  273. package/dist/presets/data-ai/skills/agent_skills_spec.md +46 -0
  274. package/dist/presets/data-ai/skills/ai-multimodal/SKILL.md +41 -0
  275. package/dist/presets/data-ai/skills/code-review/SKILL.md +49 -0
  276. package/dist/presets/data-ai/skills/data-engineering/SKILL.md +47 -0
  277. package/dist/presets/data-ai/skills/data-visualization/SKILL.md +46 -0
  278. package/dist/presets/data-ai/skills/debugging/SKILL.md +42 -0
  279. package/dist/presets/data-ai/skills/docs-seeker/SKILL.md +41 -0
  280. package/dist/presets/data-ai/skills/document-skills/docx/SKILL.md +49 -0
  281. package/dist/presets/data-ai/skills/document-skills/pdf/SKILL.md +51 -0
  282. package/dist/presets/data-ai/skills/document-skills/pptx/SKILL.md +51 -0
  283. package/dist/presets/data-ai/skills/document-skills/xlsx/SKILL.md +54 -0
  284. package/dist/presets/data-ai/skills/experiment-tracking/SKILL.md +52 -0
  285. package/dist/presets/data-ai/skills/feature-store/SKILL.md +56 -0
  286. package/dist/presets/data-ai/skills/google-adk-python/SKILL.md +56 -0
  287. package/dist/presets/data-ai/skills/jupyter-notebooks/SKILL.md +60 -0
  288. package/dist/presets/data-ai/skills/mcp-builder/SKILL.md +40 -0
  289. package/dist/presets/data-ai/skills/mcp-management/SKILL.md +41 -0
  290. package/dist/presets/data-ai/skills/ml-ops/SKILL.md +45 -0
  291. package/dist/presets/data-ai/skills/nlp-text-processing/SKILL.md +48 -0
  292. package/dist/presets/data-ai/skills/pandas-analysis/SKILL.md +49 -0
  293. package/dist/presets/data-ai/skills/planning/SKILL.md +44 -0
  294. package/dist/presets/data-ai/skills/problem-solving/SKILL.md +42 -0
  295. package/dist/presets/data-ai/skills/pytorch-training/SKILL.md +55 -0
  296. package/dist/presets/data-ai/skills/repomix/SKILL.md +40 -0
  297. package/dist/presets/data-ai/skills/research/SKILL.md +35 -0
  298. package/dist/presets/data-ai/skills/scikit-learn/SKILL.md +47 -0
  299. package/dist/presets/data-ai/skills/sequential-thinking/SKILL.md +34 -0
  300. package/dist/presets/data-ai/skills/skill-creator/SKILL.md +56 -0
  301. package/dist/presets/data-ai/skills/template-skill/SKILL.md +23 -0
  302. package/dist/presets/data-ai/skills/template-skill/assets/.gitkeep +1 -0
  303. package/dist/presets/data-ai/skills/template-skill/references/.gitkeep +1 -0
  304. package/dist/presets/data-ai/skills/template-skill/scripts/.gitkeep +1 -0
  305. package/dist/presets/data-ai/skills/tensorflow-keras/SKILL.md +54 -0
  306. package/dist/presets/data-ai/specs/_templates/data-ai/design.md +81 -0
  307. package/dist/presets/data-ai/specs/_templates/data-ai/requirements.md +49 -0
  308. package/dist/presets/data-ai/specs/_templates/data-ai/tasks.md +50 -0
  309. package/dist/presets/data-ai/statusline.js +22 -0
  310. package/dist/presets/data-ai/statusline.ps1 +16 -0
  311. package/dist/presets/data-ai/statusline.sh +17 -0
  312. package/dist/presets/data-ai/steering/ml-patterns.md +75 -0
  313. package/dist/presets/data-ai/steering/python-conventions.md +78 -0
  314. package/dist/presets/data-ai/workflows/development-rules.md +34 -0
  315. package/dist/presets/data-ai/workflows/documentation-management.md +24 -0
  316. package/dist/presets/data-ai/workflows/orchestration-protocol.md +18 -0
  317. package/dist/presets/data-ai/workflows/primary-workflow.md +33 -0
  318. package/dist/presets/devops/.env.example +36 -0
  319. package/dist/presets/devops/.mcp.json.example +30 -0
  320. package/dist/presets/devops/README.md +57 -0
  321. package/dist/presets/devops/agents/brainstormer.md +46 -0
  322. package/dist/presets/devops/agents/ci-cd-specialist.md +54 -0
  323. package/dist/presets/devops/agents/code-reviewer.md +59 -0
  324. package/dist/presets/devops/agents/copywriter.md +46 -0
  325. package/dist/presets/devops/agents/database-admin.md +43 -0
  326. package/dist/presets/devops/agents/debugger.md +44 -0
  327. package/dist/presets/devops/agents/docs-manager.md +41 -0
  328. package/dist/presets/devops/agents/git-manager.md +49 -0
  329. package/dist/presets/devops/agents/infrastructure-engineer.md +53 -0
  330. package/dist/presets/devops/agents/journal-writer.md +58 -0
  331. package/dist/presets/devops/agents/mcp-manager.md +40 -0
  332. package/dist/presets/devops/agents/monitoring-engineer.md +54 -0
  333. package/dist/presets/devops/agents/planner.md +42 -0
  334. package/dist/presets/devops/agents/project-manager.md +54 -0
  335. package/dist/presets/devops/agents/researcher.md +46 -0
  336. package/dist/presets/devops/agents/scout-external.md +45 -0
  337. package/dist/presets/devops/agents/scout.md +48 -0
  338. package/dist/presets/devops/agents/security-auditor.md +60 -0
  339. package/dist/presets/devops/agents/tester.md +56 -0
  340. package/dist/presets/devops/agents/ui-ux-designer.md +45 -0
  341. package/dist/presets/devops/commands/bootstrap.md +16 -0
  342. package/dist/presets/devops/commands/clean.md +13 -0
  343. package/dist/presets/devops/commands/design/figma.md +15 -0
  344. package/dist/presets/devops/commands/design/system.md +11 -0
  345. package/dist/presets/devops/commands/design/wireframe.md +15 -0
  346. package/dist/presets/devops/commands/devops/container.md +16 -0
  347. package/dist/presets/devops/commands/devops/deploy.md +17 -0
  348. package/dist/presets/devops/commands/devops/infra.md +17 -0
  349. package/dist/presets/devops/commands/devops/monitor.md +16 -0
  350. package/dist/presets/devops/commands/docs/architecture.md +11 -0
  351. package/dist/presets/devops/commands/docs/summarize.md +15 -0
  352. package/dist/presets/devops/commands/docs/update.md +11 -0
  353. package/dist/presets/devops/commands/fix/build.md +11 -0
  354. package/dist/presets/devops/commands/fix/lint.md +10 -0
  355. package/dist/presets/devops/commands/fix/tests.md +16 -0
  356. package/dist/presets/devops/commands/git/branch.md +16 -0
  357. package/dist/presets/devops/commands/git/commit.md +15 -0
  358. package/dist/presets/devops/commands/git/pr.md +16 -0
  359. package/dist/presets/devops/commands/lint.md +13 -0
  360. package/dist/presets/devops/commands/plan/feature.md +15 -0
  361. package/dist/presets/devops/commands/plan/refactor.md +16 -0
  362. package/dist/presets/devops/commands/release.md +17 -0
  363. package/dist/presets/devops/commands/review/code.md +15 -0
  364. package/dist/presets/devops/commands/review/security.md +16 -0
  365. package/dist/presets/devops/commands/scout/ext.md +16 -0
  366. package/dist/presets/devops/commands/scout.md +16 -0
  367. package/dist/presets/devops/commands/skill/add.md +16 -0
  368. package/dist/presets/devops/commands/skill/create.md +16 -0
  369. package/dist/presets/devops/commands/skill/optimize.md +16 -0
  370. package/dist/presets/devops/commands/test.md +15 -0
  371. package/dist/presets/devops/docs/code-standards.md +82 -0
  372. package/dist/presets/devops/docs/project-roadmap.md +58 -0
  373. package/dist/presets/devops/docs/system-architecture.md +85 -0
  374. package/dist/presets/devops/hooks/.env.example +9 -0
  375. package/dist/presets/devops/hooks/README.md +30 -0
  376. package/dist/presets/devops/hooks/build-verify.js +44 -0
  377. package/dist/presets/devops/hooks/discord-notify.js +31 -0
  378. package/dist/presets/devops/hooks/discord-notify.ps1 +19 -0
  379. package/dist/presets/devops/hooks/discord-notify.sh +15 -0
  380. package/dist/presets/devops/hooks/git-status-tracker.js +26 -0
  381. package/dist/presets/devops/hooks/image-scan.js +27 -0
  382. package/dist/presets/devops/hooks/modularization-hook.js +36 -0
  383. package/dist/presets/devops/hooks/pre-commit-lint.js +15 -0
  384. package/dist/presets/devops/hooks/scout-block.js +30 -0
  385. package/dist/presets/devops/hooks/scout-block.ps1 +26 -0
  386. package/dist/presets/devops/hooks/scout-block.sh +31 -0
  387. package/dist/presets/devops/hooks/telegram-notify.js +30 -0
  388. package/dist/presets/devops/hooks/telegram-notify.ps1 +22 -0
  389. package/dist/presets/devops/hooks/telegram-notify.sh +16 -0
  390. package/dist/presets/devops/manifest.json +156 -0
  391. package/dist/presets/devops/settings.json +39 -0
  392. package/dist/presets/devops/skills/.env.example +14 -0
  393. package/dist/presets/devops/skills/INSTALLATION.md +29 -0
  394. package/dist/presets/devops/skills/README.md +48 -0
  395. package/dist/presets/devops/skills/THIRD_PARTY_NOTICES.md +19 -0
  396. package/dist/presets/devops/skills/agent_skills_spec.md +28 -0
  397. package/dist/presets/devops/skills/ai-multimodal/SKILL.md +32 -0
  398. package/dist/presets/devops/skills/backend-development/SKILL.md +36 -0
  399. package/dist/presets/devops/skills/chrome-devtools/SKILL.md +35 -0
  400. package/dist/presets/devops/skills/ci-cd-patterns/SKILL.md +45 -0
  401. package/dist/presets/devops/skills/code-review/SKILL.md +30 -0
  402. package/dist/presets/devops/skills/container-security/SKILL.md +44 -0
  403. package/dist/presets/devops/skills/databases/SKILL.md +34 -0
  404. package/dist/presets/devops/skills/debugging/SKILL.md +35 -0
  405. package/dist/presets/devops/skills/devops/SKILL.md +53 -0
  406. package/dist/presets/devops/skills/docs-seeker/SKILL.md +32 -0
  407. package/dist/presets/devops/skills/frontend-design/SKILL.md +32 -0
  408. package/dist/presets/devops/skills/kubernetes-ops/SKILL.md +54 -0
  409. package/dist/presets/devops/skills/mcp-builder/SKILL.md +33 -0
  410. package/dist/presets/devops/skills/mcp-management/SKILL.md +33 -0
  411. package/dist/presets/devops/skills/media-processing/SKILL.md +30 -0
  412. package/dist/presets/devops/skills/planning/SKILL.md +39 -0
  413. package/dist/presets/devops/skills/problem-solving/SKILL.md +32 -0
  414. package/dist/presets/devops/skills/repomix/SKILL.md +39 -0
  415. package/dist/presets/devops/skills/research/SKILL.md +34 -0
  416. package/dist/presets/devops/skills/sequential-thinking/SKILL.md +33 -0
  417. package/dist/presets/devops/skills/skill-creator/SKILL.md +35 -0
  418. package/dist/presets/devops/skills/template-skill/SKILL.md +24 -0
  419. package/dist/presets/devops/skills/terraform-modules/SKILL.md +47 -0
  420. package/dist/presets/devops/skills/web-frameworks/SKILL.md +31 -0
  421. package/dist/presets/devops/specs/_templates/devops/design.md +87 -0
  422. package/dist/presets/devops/specs/_templates/devops/requirements.md +42 -0
  423. package/dist/presets/devops/specs/_templates/devops/tasks.md +46 -0
  424. package/dist/presets/devops/statusline.js +22 -0
  425. package/dist/presets/devops/statusline.ps1 +16 -0
  426. package/dist/presets/devops/statusline.sh +17 -0
  427. package/dist/presets/devops/steering/docker-conventions.md +45 -0
  428. package/dist/presets/devops/steering/infrastructure-patterns.md +58 -0
  429. package/dist/presets/devops/workflows/development-rules.md +34 -0
  430. package/dist/presets/devops/workflows/documentation-management.md +24 -0
  431. package/dist/presets/devops/workflows/orchestration-protocol.md +18 -0
  432. package/dist/presets/devops/workflows/primary-workflow.md +33 -0
  433. package/dist/presets/frontend/.env.example +19 -0
  434. package/dist/presets/frontend/.mcp.json.example +30 -0
  435. package/dist/presets/frontend/README.md +55 -0
  436. package/dist/presets/frontend/agents/accessibility-auditor.md +56 -0
  437. package/dist/presets/frontend/agents/brainstormer.md +46 -0
  438. package/dist/presets/frontend/agents/code-reviewer.md +59 -0
  439. package/dist/presets/frontend/agents/component-architect.md +59 -0
  440. package/dist/presets/frontend/agents/copywriter.md +46 -0
  441. package/dist/presets/frontend/agents/database-admin.md +43 -0
  442. package/dist/presets/frontend/agents/debugger.md +44 -0
  443. package/dist/presets/frontend/agents/docs-manager.md +41 -0
  444. package/dist/presets/frontend/agents/frontend-developer.md +47 -0
  445. package/dist/presets/frontend/agents/git-manager.md +49 -0
  446. package/dist/presets/frontend/agents/journal-writer.md +58 -0
  447. package/dist/presets/frontend/agents/mcp-manager.md +40 -0
  448. package/dist/presets/frontend/agents/performance-optimizer.md +57 -0
  449. package/dist/presets/frontend/agents/planner.md +42 -0
  450. package/dist/presets/frontend/agents/project-manager.md +54 -0
  451. package/dist/presets/frontend/agents/researcher.md +46 -0
  452. package/dist/presets/frontend/agents/scout-external.md +45 -0
  453. package/dist/presets/frontend/agents/scout.md +48 -0
  454. package/dist/presets/frontend/agents/tester.md +56 -0
  455. package/dist/presets/frontend/agents/ui-ux-designer.md +45 -0
  456. package/dist/presets/frontend/commands/bootstrap.md +15 -0
  457. package/dist/presets/frontend/commands/clean.md +12 -0
  458. package/dist/presets/frontend/commands/design/figma.md +15 -0
  459. package/dist/presets/frontend/commands/design/system.md +11 -0
  460. package/dist/presets/frontend/commands/design/wireframe.md +15 -0
  461. package/dist/presets/frontend/commands/docs/architecture.md +11 -0
  462. package/dist/presets/frontend/commands/docs/summarize.md +15 -0
  463. package/dist/presets/frontend/commands/docs/update.md +11 -0
  464. package/dist/presets/frontend/commands/fix/build.md +11 -0
  465. package/dist/presets/frontend/commands/fix/lint.md +10 -0
  466. package/dist/presets/frontend/commands/fix/tests.md +15 -0
  467. package/dist/presets/frontend/commands/frontend/component.md +31 -0
  468. package/dist/presets/frontend/commands/frontend/hook.md +29 -0
  469. package/dist/presets/frontend/commands/frontend/layout.md +29 -0
  470. package/dist/presets/frontend/commands/frontend/page.md +31 -0
  471. package/dist/presets/frontend/commands/git/branch.md +14 -0
  472. package/dist/presets/frontend/commands/git/commit.md +15 -0
  473. package/dist/presets/frontend/commands/git/pr.md +16 -0
  474. package/dist/presets/frontend/commands/lint.md +11 -0
  475. package/dist/presets/frontend/commands/plan/feature.md +15 -0
  476. package/dist/presets/frontend/commands/plan/refactor.md +15 -0
  477. package/dist/presets/frontend/commands/release.md +17 -0
  478. package/dist/presets/frontend/commands/review/code.md +15 -0
  479. package/dist/presets/frontend/commands/review/security.md +12 -0
  480. package/dist/presets/frontend/commands/scout/ext.md +17 -0
  481. package/dist/presets/frontend/commands/scout.md +16 -0
  482. package/dist/presets/frontend/commands/skill/add.md +16 -0
  483. package/dist/presets/frontend/commands/skill/create.md +16 -0
  484. package/dist/presets/frontend/commands/skill/optimize.md +16 -0
  485. package/dist/presets/frontend/commands/test.md +15 -0
  486. package/dist/presets/frontend/docs/code-standards.md +79 -0
  487. package/dist/presets/frontend/docs/project-roadmap.md +78 -0
  488. package/dist/presets/frontend/docs/system-architecture.md +90 -0
  489. package/dist/presets/frontend/hooks/.env.example +9 -0
  490. package/dist/presets/frontend/hooks/README.md +28 -0
  491. package/dist/presets/frontend/hooks/discord-notify.js +31 -0
  492. package/dist/presets/frontend/hooks/discord-notify.ps1 +19 -0
  493. package/dist/presets/frontend/hooks/discord-notify.sh +15 -0
  494. package/dist/presets/frontend/hooks/git-status-tracker.js +26 -0
  495. package/dist/presets/frontend/hooks/modularization-hook.js +36 -0
  496. package/dist/presets/frontend/hooks/pre-commit-lint.js +15 -0
  497. package/dist/presets/frontend/hooks/scout-block.js +30 -0
  498. package/dist/presets/frontend/hooks/scout-block.ps1 +26 -0
  499. package/dist/presets/frontend/hooks/scout-block.sh +31 -0
  500. package/dist/presets/frontend/hooks/telegram-notify.js +30 -0
  501. package/dist/presets/frontend/hooks/telegram-notify.ps1 +22 -0
  502. package/dist/presets/frontend/hooks/telegram-notify.sh +16 -0
  503. package/dist/presets/frontend/manifest.json +151 -0
  504. package/dist/presets/frontend/settings.json +31 -0
  505. package/dist/presets/frontend/skills/.env.example +8 -0
  506. package/dist/presets/frontend/skills/INSTALLATION.md +34 -0
  507. package/dist/presets/frontend/skills/README.md +32 -0
  508. package/dist/presets/frontend/skills/THIRD_PARTY_NOTICES.md +18 -0
  509. package/dist/presets/frontend/skills/aesthetic/SKILL.md +60 -0
  510. package/dist/presets/frontend/skills/agent_skills_spec.md +37 -0
  511. package/dist/presets/frontend/skills/ai-multimodal/SKILL.md +32 -0
  512. package/dist/presets/frontend/skills/chrome-devtools/SKILL.md +51 -0
  513. package/dist/presets/frontend/skills/code-review/SKILL.md +42 -0
  514. package/dist/presets/frontend/skills/debugging/SKILL.md +34 -0
  515. package/dist/presets/frontend/skills/docs-seeker/SKILL.md +38 -0
  516. package/dist/presets/frontend/skills/frontend-design/SKILL.md +43 -0
  517. package/dist/presets/frontend/skills/frontend-development/SKILL.md +50 -0
  518. package/dist/presets/frontend/skills/mcp-builder/SKILL.md +41 -0
  519. package/dist/presets/frontend/skills/mcp-management/SKILL.md +40 -0
  520. package/dist/presets/frontend/skills/media-processing/SKILL.md +41 -0
  521. package/dist/presets/frontend/skills/planning/SKILL.md +39 -0
  522. package/dist/presets/frontend/skills/problem-solving/SKILL.md +37 -0
  523. package/dist/presets/frontend/skills/repomix/SKILL.md +39 -0
  524. package/dist/presets/frontend/skills/research/SKILL.md +34 -0
  525. package/dist/presets/frontend/skills/sequential-thinking/SKILL.md +33 -0
  526. package/dist/presets/frontend/skills/skill-creator/SKILL.md +55 -0
  527. package/dist/presets/frontend/skills/template-skill/SKILL.md +20 -0
  528. package/dist/presets/frontend/skills/template-skill/assets/.gitkeep +0 -0
  529. package/dist/presets/frontend/skills/template-skill/references/.gitkeep +0 -0
  530. package/dist/presets/frontend/skills/template-skill/scripts/.gitkeep +0 -0
  531. package/dist/presets/frontend/skills/threejs/SKILL.md +65 -0
  532. package/dist/presets/frontend/skills/ui-styling/SKILL.md +49 -0
  533. package/dist/presets/frontend/skills/web-frameworks/SKILL.md +56 -0
  534. package/dist/presets/frontend/specs/_templates/frontend/design.md +66 -0
  535. package/dist/presets/frontend/specs/_templates/frontend/requirements.md +41 -0
  536. package/dist/presets/frontend/specs/_templates/frontend/tasks.md +44 -0
  537. package/dist/presets/frontend/statusline.js +22 -0
  538. package/dist/presets/frontend/statusline.ps1 +16 -0
  539. package/dist/presets/frontend/statusline.sh +17 -0
  540. package/dist/presets/frontend/steering/nextjs-patterns.md +77 -0
  541. package/dist/presets/frontend/steering/react-conventions.md +59 -0
  542. package/dist/presets/frontend/workflows/development-rules.md +34 -0
  543. package/dist/presets/frontend/workflows/documentation-management.md +24 -0
  544. package/dist/presets/frontend/workflows/orchestration-protocol.md +18 -0
  545. package/dist/presets/frontend/workflows/primary-workflow.md +33 -0
  546. package/dist/presets/fullstack/.env.example +37 -0
  547. package/dist/presets/fullstack/.mcp.json.example +37 -0
  548. package/dist/presets/fullstack/README.md +40 -0
  549. package/dist/presets/fullstack/agents/api-developer.md +45 -0
  550. package/dist/presets/fullstack/agents/brainstormer.md +33 -0
  551. package/dist/presets/fullstack/agents/code-reviewer.md +32 -0
  552. package/dist/presets/fullstack/agents/copywriter.md +34 -0
  553. package/dist/presets/fullstack/agents/database-admin.md +34 -0
  554. package/dist/presets/fullstack/agents/database-architect.md +45 -0
  555. package/dist/presets/fullstack/agents/debugger.md +33 -0
  556. package/dist/presets/fullstack/agents/docs-manager.md +30 -0
  557. package/dist/presets/fullstack/agents/fullstack-developer.md +45 -0
  558. package/dist/presets/fullstack/agents/git-manager.md +32 -0
  559. package/dist/presets/fullstack/agents/journal-writer.md +32 -0
  560. package/dist/presets/fullstack/agents/mcp-manager.md +30 -0
  561. package/dist/presets/fullstack/agents/performance-optimizer.md +52 -0
  562. package/dist/presets/fullstack/agents/planner.md +31 -0
  563. package/dist/presets/fullstack/agents/project-manager.md +31 -0
  564. package/dist/presets/fullstack/agents/researcher.md +30 -0
  565. package/dist/presets/fullstack/agents/scout-external.md +29 -0
  566. package/dist/presets/fullstack/agents/scout.md +29 -0
  567. package/dist/presets/fullstack/agents/tester.md +32 -0
  568. package/dist/presets/fullstack/agents/ui-ux-designer.md +33 -0
  569. package/dist/presets/fullstack/commands/bootstrap.md +16 -0
  570. package/dist/presets/fullstack/commands/clean.md +12 -0
  571. package/dist/presets/fullstack/commands/design/figma.md +15 -0
  572. package/dist/presets/fullstack/commands/design/system.md +11 -0
  573. package/dist/presets/fullstack/commands/design/wireframe.md +15 -0
  574. package/dist/presets/fullstack/commands/docs/architecture.md +11 -0
  575. package/dist/presets/fullstack/commands/docs/summarize.md +15 -0
  576. package/dist/presets/fullstack/commands/docs/update.md +15 -0
  577. package/dist/presets/fullstack/commands/fix/build.md +11 -0
  578. package/dist/presets/fullstack/commands/fix/lint.md +10 -0
  579. package/dist/presets/fullstack/commands/fix/tests.md +16 -0
  580. package/dist/presets/fullstack/commands/fullstack/api-route.md +17 -0
  581. package/dist/presets/fullstack/commands/fullstack/component.md +17 -0
  582. package/dist/presets/fullstack/commands/fullstack/deploy.md +17 -0
  583. package/dist/presets/fullstack/commands/fullstack/migration.md +16 -0
  584. package/dist/presets/fullstack/commands/git/branch.md +15 -0
  585. package/dist/presets/fullstack/commands/git/commit.md +16 -0
  586. package/dist/presets/fullstack/commands/git/pr.md +16 -0
  587. package/dist/presets/fullstack/commands/lint.md +11 -0
  588. package/dist/presets/fullstack/commands/plan/feature.md +15 -0
  589. package/dist/presets/fullstack/commands/plan/refactor.md +15 -0
  590. package/dist/presets/fullstack/commands/release.md +17 -0
  591. package/dist/presets/fullstack/commands/review/code.md +15 -0
  592. package/dist/presets/fullstack/commands/review/security.md +16 -0
  593. package/dist/presets/fullstack/commands/scout/ext.md +17 -0
  594. package/dist/presets/fullstack/commands/scout.md +16 -0
  595. package/dist/presets/fullstack/commands/skill/add.md +16 -0
  596. package/dist/presets/fullstack/commands/skill/create.md +16 -0
  597. package/dist/presets/fullstack/commands/skill/optimize.md +16 -0
  598. package/dist/presets/fullstack/commands/test.md +15 -0
  599. package/dist/presets/fullstack/docs/code-standards.md +74 -0
  600. package/dist/presets/fullstack/docs/project-roadmap.md +78 -0
  601. package/dist/presets/fullstack/docs/system-architecture.md +97 -0
  602. package/dist/presets/fullstack/hooks/.env.example +9 -0
  603. package/dist/presets/fullstack/hooks/README.md +28 -0
  604. package/dist/presets/fullstack/hooks/discord-notify.js +31 -0
  605. package/dist/presets/fullstack/hooks/discord-notify.ps1 +19 -0
  606. package/dist/presets/fullstack/hooks/discord-notify.sh +15 -0
  607. package/dist/presets/fullstack/hooks/git-status-tracker.js +26 -0
  608. package/dist/presets/fullstack/hooks/modularization-hook.js +36 -0
  609. package/dist/presets/fullstack/hooks/pre-commit-lint.js +15 -0
  610. package/dist/presets/fullstack/hooks/scout-block.js +30 -0
  611. package/dist/presets/fullstack/hooks/scout-block.ps1 +26 -0
  612. package/dist/presets/fullstack/hooks/scout-block.sh +31 -0
  613. package/dist/presets/fullstack/hooks/telegram-notify.js +30 -0
  614. package/dist/presets/fullstack/hooks/telegram-notify.ps1 +22 -0
  615. package/dist/presets/fullstack/hooks/telegram-notify.sh +16 -0
  616. package/dist/presets/fullstack/manifest.json +156 -0
  617. package/dist/presets/fullstack/settings.json +31 -0
  618. package/dist/presets/fullstack/skills/.env.example +10 -0
  619. package/dist/presets/fullstack/skills/INSTALLATION.md +28 -0
  620. package/dist/presets/fullstack/skills/README.md +38 -0
  621. package/dist/presets/fullstack/skills/THIRD_PARTY_NOTICES.md +22 -0
  622. package/dist/presets/fullstack/skills/agent_skills_spec.md +39 -0
  623. package/dist/presets/fullstack/skills/ai-multimodal/SKILL.md +32 -0
  624. package/dist/presets/fullstack/skills/backend-development/SKILL.md +40 -0
  625. package/dist/presets/fullstack/skills/better-auth/SKILL.md +45 -0
  626. package/dist/presets/fullstack/skills/code-review/SKILL.md +28 -0
  627. package/dist/presets/fullstack/skills/databases/SKILL.md +39 -0
  628. package/dist/presets/fullstack/skills/debugging/SKILL.md +46 -0
  629. package/dist/presets/fullstack/skills/devops/SKILL.md +42 -0
  630. package/dist/presets/fullstack/skills/docs-seeker/SKILL.md +30 -0
  631. package/dist/presets/fullstack/skills/frontend-design/SKILL.md +32 -0
  632. package/dist/presets/fullstack/skills/frontend-development/SKILL.md +33 -0
  633. package/dist/presets/fullstack/skills/mcp-builder/SKILL.md +37 -0
  634. package/dist/presets/fullstack/skills/payment-integration/SKILL.md +50 -0
  635. package/dist/presets/fullstack/skills/planning/SKILL.md +41 -0
  636. package/dist/presets/fullstack/skills/problem-solving/SKILL.md +32 -0
  637. package/dist/presets/fullstack/skills/repomix/SKILL.md +40 -0
  638. package/dist/presets/fullstack/skills/research/SKILL.md +32 -0
  639. package/dist/presets/fullstack/skills/sequential-thinking/SKILL.md +32 -0
  640. package/dist/presets/fullstack/skills/shopify/SKILL.md +44 -0
  641. package/dist/presets/fullstack/skills/skill-creator/SKILL.md +36 -0
  642. package/dist/presets/fullstack/skills/template-skill/SKILL.md +26 -0
  643. package/dist/presets/fullstack/skills/ui-styling/SKILL.md +39 -0
  644. package/dist/presets/fullstack/skills/web-frameworks/SKILL.md +39 -0
  645. package/dist/presets/fullstack/specs/_templates/fullstack/design.md +87 -0
  646. package/dist/presets/fullstack/specs/_templates/fullstack/requirements.md +54 -0
  647. package/dist/presets/fullstack/specs/_templates/fullstack/tasks.md +40 -0
  648. package/dist/presets/fullstack/statusline.js +15 -0
  649. package/dist/presets/fullstack/statusline.ps1 +5 -0
  650. package/dist/presets/fullstack/statusline.sh +5 -0
  651. package/dist/presets/fullstack/steering/fullstack-conventions.md +77 -0
  652. package/dist/presets/fullstack/steering/nextjs-app-router.md +92 -0
  653. package/dist/presets/fullstack/workflows/development-rules.md +34 -0
  654. package/dist/presets/fullstack/workflows/documentation-management.md +24 -0
  655. package/dist/presets/fullstack/workflows/orchestration-protocol.md +18 -0
  656. package/dist/presets/fullstack/workflows/primary-workflow.md +33 -0
  657. package/dist/presets/mobile/.env.example +28 -0
  658. package/dist/presets/mobile/.mcp.json.example +30 -0
  659. package/dist/presets/mobile/README.md +56 -0
  660. package/dist/presets/mobile/agents/accessibility-auditor.md +73 -0
  661. package/dist/presets/mobile/agents/brainstormer.md +45 -0
  662. package/dist/presets/mobile/agents/code-reviewer.md +53 -0
  663. package/dist/presets/mobile/agents/copywriter.md +34 -0
  664. package/dist/presets/mobile/agents/database-admin.md +36 -0
  665. package/dist/presets/mobile/agents/debugger.md +44 -0
  666. package/dist/presets/mobile/agents/docs-manager.md +41 -0
  667. package/dist/presets/mobile/agents/git-manager.md +47 -0
  668. package/dist/presets/mobile/agents/journal-writer.md +46 -0
  669. package/dist/presets/mobile/agents/mcp-manager.md +30 -0
  670. package/dist/presets/mobile/agents/mobile-developer.md +57 -0
  671. package/dist/presets/mobile/agents/navigation-architect.md +50 -0
  672. package/dist/presets/mobile/agents/performance-optimizer.md +75 -0
  673. package/dist/presets/mobile/agents/planner.md +40 -0
  674. package/dist/presets/mobile/agents/platform-specialist.md +55 -0
  675. package/dist/presets/mobile/agents/project-manager.md +41 -0
  676. package/dist/presets/mobile/agents/researcher.md +41 -0
  677. package/dist/presets/mobile/agents/scout-external.md +35 -0
  678. package/dist/presets/mobile/agents/scout.md +36 -0
  679. package/dist/presets/mobile/agents/state-manager.md +50 -0
  680. package/dist/presets/mobile/agents/tester.md +60 -0
  681. package/dist/presets/mobile/agents/ui-ux-designer.md +46 -0
  682. package/dist/presets/mobile/agents/widget-architect.md +52 -0
  683. package/dist/presets/mobile/commands/bootstrap.md +16 -0
  684. package/dist/presets/mobile/commands/clean.md +15 -0
  685. package/dist/presets/mobile/commands/design/figma.md +15 -0
  686. package/dist/presets/mobile/commands/design/system.md +15 -0
  687. package/dist/presets/mobile/commands/design/wireframe.md +16 -0
  688. package/dist/presets/mobile/commands/docs/architecture.md +16 -0
  689. package/dist/presets/mobile/commands/docs/summarize.md +15 -0
  690. package/dist/presets/mobile/commands/docs/update.md +15 -0
  691. package/dist/presets/mobile/commands/fix/build.md +15 -0
  692. package/dist/presets/mobile/commands/fix/lint.md +14 -0
  693. package/dist/presets/mobile/commands/fix/tests.md +16 -0
  694. package/dist/presets/mobile/commands/git/branch.md +16 -0
  695. package/dist/presets/mobile/commands/git/commit.md +16 -0
  696. package/dist/presets/mobile/commands/git/pr.md +16 -0
  697. package/dist/presets/mobile/commands/lint.md +15 -0
  698. package/dist/presets/mobile/commands/mobile/navigation.md +34 -0
  699. package/dist/presets/mobile/commands/mobile/platform.md +42 -0
  700. package/dist/presets/mobile/commands/mobile/screen.md +46 -0
  701. package/dist/presets/mobile/commands/mobile/widget.md +42 -0
  702. package/dist/presets/mobile/commands/plan/feature.md +16 -0
  703. package/dist/presets/mobile/commands/plan/refactor.md +17 -0
  704. package/dist/presets/mobile/commands/release.md +17 -0
  705. package/dist/presets/mobile/commands/review/code.md +16 -0
  706. package/dist/presets/mobile/commands/review/security.md +16 -0
  707. package/dist/presets/mobile/commands/scout/ext.md +16 -0
  708. package/dist/presets/mobile/commands/scout.md +16 -0
  709. package/dist/presets/mobile/commands/skill/add.md +16 -0
  710. package/dist/presets/mobile/commands/skill/create.md +16 -0
  711. package/dist/presets/mobile/commands/skill/optimize.md +16 -0
  712. package/dist/presets/mobile/commands/test.md +17 -0
  713. package/dist/presets/mobile/docs/code-standards.md +74 -0
  714. package/dist/presets/mobile/docs/project-roadmap.md +48 -0
  715. package/dist/presets/mobile/docs/system-architecture.md +70 -0
  716. package/dist/presets/mobile/hooks/.env.example +9 -0
  717. package/dist/presets/mobile/hooks/README.md +28 -0
  718. package/dist/presets/mobile/hooks/discord-notify.js +31 -0
  719. package/dist/presets/mobile/hooks/discord-notify.ps1 +19 -0
  720. package/dist/presets/mobile/hooks/discord-notify.sh +15 -0
  721. package/dist/presets/mobile/hooks/git-status-tracker.js +26 -0
  722. package/dist/presets/mobile/hooks/modularization-hook.js +36 -0
  723. package/dist/presets/mobile/hooks/pre-commit-lint.js +26 -0
  724. package/dist/presets/mobile/hooks/scout-block.js +30 -0
  725. package/dist/presets/mobile/hooks/scout-block.ps1 +26 -0
  726. package/dist/presets/mobile/hooks/scout-block.sh +31 -0
  727. package/dist/presets/mobile/hooks/telegram-notify.js +30 -0
  728. package/dist/presets/mobile/hooks/telegram-notify.ps1 +22 -0
  729. package/dist/presets/mobile/hooks/telegram-notify.sh +16 -0
  730. package/dist/presets/mobile/manifest.json +158 -0
  731. package/dist/presets/mobile/settings.json +31 -0
  732. package/dist/presets/mobile/skills/.env.example +12 -0
  733. package/dist/presets/mobile/skills/INSTALLATION.md +28 -0
  734. package/dist/presets/mobile/skills/README.md +46 -0
  735. package/dist/presets/mobile/skills/THIRD_PARTY_NOTICES.md +12 -0
  736. package/dist/presets/mobile/skills/agent_skills_spec.md +37 -0
  737. package/dist/presets/mobile/skills/ai-multimodal/SKILL.md +41 -0
  738. package/dist/presets/mobile/skills/app-deployment/SKILL.md +50 -0
  739. package/dist/presets/mobile/skills/chrome-devtools/SKILL.md +39 -0
  740. package/dist/presets/mobile/skills/code-review/SKILL.md +30 -0
  741. package/dist/presets/mobile/skills/debugging/SKILL.md +36 -0
  742. package/dist/presets/mobile/skills/docs-seeker/SKILL.md +39 -0
  743. package/dist/presets/mobile/skills/flutter-state/SKILL.md +42 -0
  744. package/dist/presets/mobile/skills/frontend-design/SKILL.md +42 -0
  745. package/dist/presets/mobile/skills/frontend-development/SKILL.md +42 -0
  746. package/dist/presets/mobile/skills/mcp-builder/SKILL.md +32 -0
  747. package/dist/presets/mobile/skills/mcp-management/SKILL.md +32 -0
  748. package/dist/presets/mobile/skills/media-processing/SKILL.md +38 -0
  749. package/dist/presets/mobile/skills/mobile-development/SKILL.md +48 -0
  750. package/dist/presets/mobile/skills/mobile-testing/SKILL.md +43 -0
  751. package/dist/presets/mobile/skills/native-integration/SKILL.md +41 -0
  752. package/dist/presets/mobile/skills/offline-first/SKILL.md +41 -0
  753. package/dist/presets/mobile/skills/planning/SKILL.md +39 -0
  754. package/dist/presets/mobile/skills/problem-solving/SKILL.md +32 -0
  755. package/dist/presets/mobile/skills/repomix/SKILL.md +36 -0
  756. package/dist/presets/mobile/skills/research/SKILL.md +34 -0
  757. package/dist/presets/mobile/skills/sequential-thinking/SKILL.md +33 -0
  758. package/dist/presets/mobile/skills/skill-creator/SKILL.md +40 -0
  759. package/dist/presets/mobile/skills/template-skill/SKILL.md +23 -0
  760. package/dist/presets/mobile/skills/ui-styling/SKILL.md +51 -0
  761. package/dist/presets/mobile/skills/web-frameworks/SKILL.md +37 -0
  762. package/dist/presets/mobile/specs/_templates/mobile/design.md +62 -0
  763. package/dist/presets/mobile/specs/_templates/mobile/requirements.md +47 -0
  764. package/dist/presets/mobile/specs/_templates/mobile/tasks.md +52 -0
  765. package/dist/presets/mobile/statusline.js +22 -0
  766. package/dist/presets/mobile/statusline.ps1 +16 -0
  767. package/dist/presets/mobile/statusline.sh +17 -0
  768. package/dist/presets/mobile/steering/flutter-conventions.md +60 -0
  769. package/dist/presets/mobile/steering/mobile-patterns.md +54 -0
  770. package/dist/presets/mobile/workflows/development-rules.md +36 -0
  771. package/dist/presets/mobile/workflows/documentation-management.md +25 -0
  772. package/dist/presets/mobile/workflows/orchestration-protocol.md +19 -0
  773. package/dist/presets/mobile/workflows/primary-workflow.md +36 -0
  774. package/package.json +65 -0
package/dist/index.js ADDED
@@ -0,0 +1,2067 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import { createRequire } from "module";
5
+ import process13 from "process";
6
+ import { Command } from "commander";
7
+
8
+ // src/commands/init.ts
9
+ import fs10 from "fs";
10
+ import path9 from "path";
11
+ import process5 from "process";
12
+ import readline from "readline";
13
+ import crypto3 from "crypto";
14
+
15
+ // src/core/PresetLoader.ts
16
+ import fs2 from "fs";
17
+ import path2 from "path";
18
+ import { fileURLToPath } from "url";
19
+
20
+ // src/core/ManifestParser.ts
21
+ import { z } from "zod";
22
+ import fs from "fs";
23
+ import path from "path";
24
+
25
+ // src/core/errors.ts
26
+ var KKError = class _KKError extends Error {
27
+ code;
28
+ suggestion;
29
+ constructor(code, message, suggestion) {
30
+ super(message);
31
+ this.name = "KKError";
32
+ this.code = code;
33
+ this.suggestion = suggestion;
34
+ Object.setPrototypeOf(this, _KKError.prototype);
35
+ }
36
+ format() {
37
+ let output = `[${this.code}] ${this.message}`;
38
+ if (this.suggestion) {
39
+ output += `
40
+ Suggestion: ${this.suggestion}`;
41
+ }
42
+ return output;
43
+ }
44
+ };
45
+ var ErrorCodes = {
46
+ NODE_VERSION: "KK001",
47
+ MANIFEST_INVALID: "KK010",
48
+ MANIFEST_MISSING_FIELD: "KK011",
49
+ MANIFEST_ORPHAN_FILE: "KK012",
50
+ MANIFEST_INCOMPLETE: "KK013",
51
+ PRESET_NOT_FOUND: "KK020",
52
+ PRESET_LOAD_FAILED: "KK021",
53
+ CONFLICT_UNRESOLVED: "KK030",
54
+ TRACKING_CORRUPT: "KK040",
55
+ TRACKING_WRITE_FAILED: "KK041",
56
+ BACKUP_NOT_FOUND: "KK050",
57
+ BACKUP_WRITE_FAILED: "KK051",
58
+ MCP_MERGE_CONFLICT: "KK060",
59
+ MCP_INVALID_JSON: "KK061",
60
+ SETTINGS_MERGE_WARN: "KK070",
61
+ FRONTMATTER_INVALID: "KK080",
62
+ FRONTMATTER_MISSING: "KK081",
63
+ DOCTOR_FAIL: "KK090",
64
+ DOCTOR_WARN: "KK091"
65
+ };
66
+
67
+ // src/core/ManifestParser.ts
68
+ var ArtifactTypeSchema = z.enum([
69
+ "steering",
70
+ "hook",
71
+ "mcp",
72
+ "skill",
73
+ "agent",
74
+ "command",
75
+ "workflow",
76
+ "statusline",
77
+ "metadata",
78
+ "settings",
79
+ "env",
80
+ "spec",
81
+ "docs",
82
+ "doc",
83
+ "config",
84
+ "other"
85
+ ]);
86
+ var PresetNameSchema = z.enum([
87
+ "frontend",
88
+ "backend",
89
+ "fullstack",
90
+ "mobile",
91
+ "devops",
92
+ "data-ai"
93
+ ]);
94
+ var FileEntrySchema = z.object({
95
+ source: z.string().min(1),
96
+ target: z.string().min(1),
97
+ type: ArtifactTypeSchema,
98
+ executable: z.boolean().optional()
99
+ });
100
+ var MCPServerDefSchema = z.object({
101
+ command: z.string().min(1),
102
+ args: z.array(z.string()).optional(),
103
+ env: z.record(z.string()).optional()
104
+ });
105
+ var HookEntrySchema = z.union([
106
+ z.object({
107
+ matcher: z.string().optional(),
108
+ command: z.string().min(1)
109
+ }),
110
+ z.string().min(1)
111
+ ]);
112
+ var ManifestSchema = z.object({
113
+ name: z.string().min(1),
114
+ version: z.string().min(1),
115
+ description: z.string().min(1),
116
+ category: PresetNameSchema,
117
+ files: z.array(FileEntrySchema).min(1),
118
+ dependencies: z.array(PresetNameSchema).optional(),
119
+ mcpServers: z.record(MCPServerDefSchema).optional(),
120
+ hooks: z.object({
121
+ PreToolUse: z.array(HookEntrySchema).optional(),
122
+ PostToolUse: z.array(HookEntrySchema).optional(),
123
+ agentStop: z.array(HookEntrySchema).optional(),
124
+ fileEdited: z.array(HookEntrySchema).optional()
125
+ }).optional(),
126
+ tags: z.array(z.string()).optional(),
127
+ minCounts: z.object({
128
+ agents: z.number().int().nonnegative().optional(),
129
+ skills: z.number().int().nonnegative().optional(),
130
+ commands: z.number().int().nonnegative().optional(),
131
+ hooks: z.number().int().nonnegative().optional(),
132
+ workflows: z.number().int().nonnegative().optional()
133
+ }).optional()
134
+ });
135
+ function parse(json) {
136
+ let raw;
137
+ try {
138
+ raw = JSON.parse(json);
139
+ } catch {
140
+ return {
141
+ ok: false,
142
+ error: {
143
+ code: ErrorCodes.MANIFEST_INVALID,
144
+ message: "Manifest is not valid JSON."
145
+ }
146
+ };
147
+ }
148
+ const result = ManifestSchema.safeParse(raw);
149
+ if (!result.success) {
150
+ const issues = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
151
+ return {
152
+ ok: false,
153
+ error: {
154
+ code: ErrorCodes.MANIFEST_MISSING_FIELD,
155
+ message: `Manifest schema validation failed: ${issues}`
156
+ }
157
+ };
158
+ }
159
+ return { ok: true, value: result.data };
160
+ }
161
+
162
+ // src/core/PresetLoader.ts
163
+ var __dirname = path2.dirname(fileURLToPath(import.meta.url));
164
+ function getPresetsDir() {
165
+ const candidates = [
166
+ path2.resolve(__dirname, "presets"),
167
+ // dist/presets (current bundle)
168
+ path2.resolve(__dirname, "../presets"),
169
+ // legacy layout
170
+ path2.resolve(__dirname, "../../../../presets")
171
+ // dev/source checkout
172
+ ];
173
+ for (const candidate of candidates) {
174
+ if (fs2.existsSync(candidate)) return candidate;
175
+ }
176
+ throw new KKError(
177
+ ErrorCodes.PRESET_NOT_FOUND,
178
+ "Cannot locate presets directory.",
179
+ "Ensure kiro-kit is installed correctly."
180
+ );
181
+ }
182
+ function load(name) {
183
+ const presetsDir = getPresetsDir();
184
+ const presetDir = path2.join(presetsDir, name);
185
+ if (!fs2.existsSync(presetDir)) {
186
+ throw new KKError(
187
+ ErrorCodes.PRESET_NOT_FOUND,
188
+ `Preset "${name}" not found.`,
189
+ `Available presets: ${listAvailable().join(", ")}`
190
+ );
191
+ }
192
+ const manifestPath = path2.join(presetDir, "manifest.json");
193
+ if (!fs2.existsSync(manifestPath)) {
194
+ throw new KKError(
195
+ ErrorCodes.PRESET_LOAD_FAILED,
196
+ `Preset "${name}" is missing manifest.json.`
197
+ );
198
+ }
199
+ const raw = fs2.readFileSync(manifestPath, "utf-8");
200
+ const result = parse(raw);
201
+ if (!result.ok) {
202
+ throw new KKError(
203
+ ErrorCodes.PRESET_LOAD_FAILED,
204
+ `Preset "${name}" manifest parse error: ${result.error.message}`
205
+ );
206
+ }
207
+ return { manifest: result.value, dir: presetDir };
208
+ }
209
+ function loadAll(names) {
210
+ return names.map((n) => load(n));
211
+ }
212
+ function listAvailable() {
213
+ const presetsDir = getPresetsDir();
214
+ try {
215
+ return fs2.readdirSync(presetsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).filter((d) => !d.name.startsWith("_")).filter(
216
+ (d) => fs2.existsSync(path2.join(presetsDir, d.name, "manifest.json"))
217
+ ).map((d) => d.name);
218
+ } catch {
219
+ return [];
220
+ }
221
+ }
222
+
223
+ // src/core/ConflictResolver.ts
224
+ import fs3 from "fs";
225
+ import crypto from "crypto";
226
+ function sha256(data) {
227
+ return crypto.createHash("sha256").update(data).digest("hex");
228
+ }
229
+ async function resolve(opts) {
230
+ const { target, sourceContent, mode, sessionState, prompt, showDiff: showDiff2 } = opts;
231
+ if (!fs3.existsSync(target)) {
232
+ return "WRITE_NEW";
233
+ }
234
+ const currentContent = fs3.readFileSync(target);
235
+ const currentHash = sha256(currentContent);
236
+ const newHash = sha256(sourceContent);
237
+ if (currentHash === newHash) {
238
+ return "NO_OP";
239
+ }
240
+ if (mode === "force") {
241
+ return "OVERWRITE_WITH_BACKUP";
242
+ }
243
+ if (mode === "skip-existing") {
244
+ return "SKIP";
245
+ }
246
+ if (sessionState.overwriteAll) {
247
+ return "OVERWRITE_WITH_BACKUP";
248
+ }
249
+ if (!prompt) {
250
+ return "SKIP";
251
+ }
252
+ while (true) {
253
+ const choice = await prompt(target);
254
+ switch (choice) {
255
+ case "view-diff":
256
+ if (showDiff2) {
257
+ showDiff2(target, sourceContent);
258
+ }
259
+ continue;
260
+ case "overwrite":
261
+ return "OVERWRITE_WITH_BACKUP";
262
+ case "skip":
263
+ return "SKIP";
264
+ case "overwrite-all":
265
+ sessionState.overwriteAll = true;
266
+ return "OVERWRITE_WITH_BACKUP";
267
+ }
268
+ }
269
+ }
270
+
271
+ // src/core/BackupManager.ts
272
+ import fs4 from "fs";
273
+ import path3 from "path";
274
+ var BACKUP_DIR = ".kiro/.backup";
275
+ function generateTimestamp() {
276
+ const now = /* @__PURE__ */ new Date();
277
+ const y = now.getFullYear();
278
+ const mo = String(now.getMonth() + 1).padStart(2, "0");
279
+ const d = String(now.getDate()).padStart(2, "0");
280
+ const h = String(now.getHours()).padStart(2, "0");
281
+ const mi = String(now.getMinutes()).padStart(2, "0");
282
+ const s = String(now.getSeconds()).padStart(2, "0");
283
+ const ms = String(now.getMilliseconds()).padStart(3, "0");
284
+ return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
285
+ }
286
+ function backup(workspaceRoot, target, timestamp) {
287
+ const ts = timestamp ?? generateTimestamp();
288
+ const relPath = path3.relative(workspaceRoot, target);
289
+ const backupPath = path3.join(workspaceRoot, BACKUP_DIR, ts, relPath);
290
+ const backupDir = path3.dirname(backupPath);
291
+ fs4.mkdirSync(backupDir, { recursive: true });
292
+ fs4.copyFileSync(target, backupPath);
293
+ return ts;
294
+ }
295
+ function restore(workspaceRoot, timestamp) {
296
+ const ts = timestamp ?? getLatestTimestamp(workspaceRoot);
297
+ if (!ts) {
298
+ throw new KKError(
299
+ ErrorCodes.BACKUP_NOT_FOUND,
300
+ "No backup found.",
301
+ "Run kiro-kit init or add first to create backups."
302
+ );
303
+ }
304
+ const backupRoot = path3.join(workspaceRoot, BACKUP_DIR, ts);
305
+ if (!fs4.existsSync(backupRoot)) {
306
+ throw new KKError(
307
+ ErrorCodes.BACKUP_NOT_FOUND,
308
+ `Backup timestamp "${ts}" not found.`,
309
+ `Available: ${listTimestamps(workspaceRoot).join(", ") || "none"}`
310
+ );
311
+ }
312
+ const restored = [];
313
+ const walkAndRestore = (dir, relPrefix) => {
314
+ const entries = fs4.readdirSync(dir, { withFileTypes: true });
315
+ for (const entry of entries) {
316
+ const fullPath = path3.join(dir, entry.name);
317
+ const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;
318
+ if (entry.isDirectory()) {
319
+ walkAndRestore(fullPath, rel);
320
+ } else if (entry.isFile()) {
321
+ const targetPath = path3.join(workspaceRoot, rel);
322
+ const targetDir = path3.dirname(targetPath);
323
+ fs4.mkdirSync(targetDir, { recursive: true });
324
+ fs4.copyFileSync(fullPath, targetPath);
325
+ restored.push(rel);
326
+ }
327
+ }
328
+ };
329
+ walkAndRestore(backupRoot, "");
330
+ return restored;
331
+ }
332
+ function listTimestamps(workspaceRoot) {
333
+ const backupBase = path3.join(workspaceRoot, BACKUP_DIR);
334
+ if (!fs4.existsSync(backupBase)) return [];
335
+ try {
336
+ return fs4.readdirSync(backupBase, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name).sort().reverse();
337
+ } catch {
338
+ return [];
339
+ }
340
+ }
341
+ function getLatestTimestamp(workspaceRoot) {
342
+ const timestamps = listTimestamps(workspaceRoot);
343
+ return timestamps[0];
344
+ }
345
+
346
+ // src/core/TrackingStore.ts
347
+ import fs5 from "fs";
348
+ import path4 from "path";
349
+
350
+ // src/utils/logger.ts
351
+ import process3 from "process";
352
+
353
+ // src/utils/color.ts
354
+ import pc from "picocolors";
355
+ import process2 from "process";
356
+ var isColorDisabled = !!process2.env["NO_COLOR"] || process2.argv.includes("--no-color") || !process2.stdout.isTTY;
357
+ function wrap(fn) {
358
+ return (s) => isColorDisabled ? s : fn(s);
359
+ }
360
+ var color = {
361
+ green: wrap(pc.green),
362
+ red: wrap(pc.red),
363
+ yellow: wrap(pc.yellow),
364
+ blue: wrap(pc.blue),
365
+ cyan: wrap(pc.cyan),
366
+ gray: wrap(pc.gray),
367
+ bold: wrap(pc.bold),
368
+ dim: wrap(pc.dim)
369
+ };
370
+
371
+ // src/utils/logger.ts
372
+ var verboseEnabled = false;
373
+ var quietEnabled = false;
374
+ function setVerbose(enabled) {
375
+ verboseEnabled = enabled;
376
+ }
377
+ function setQuiet(enabled) {
378
+ quietEnabled = enabled;
379
+ }
380
+ var logger = {
381
+ info(msg) {
382
+ if (!quietEnabled) {
383
+ process3.stdout.write(`${msg}
384
+ `);
385
+ }
386
+ },
387
+ success(msg) {
388
+ if (!quietEnabled) {
389
+ process3.stdout.write(`${color.green(msg)}
390
+ `);
391
+ }
392
+ },
393
+ warn(msg) {
394
+ process3.stderr.write(`${color.yellow("WARN")} ${msg}
395
+ `);
396
+ },
397
+ error(msg) {
398
+ process3.stderr.write(`${color.red("ERROR")} ${msg}
399
+ `);
400
+ },
401
+ debug(msg) {
402
+ if (verboseEnabled) {
403
+ process3.stderr.write(`${color.dim("[debug]")} ${msg}
404
+ `);
405
+ }
406
+ }
407
+ };
408
+
409
+ // src/core/TrackingStore.ts
410
+ var TRACKING_FILE = ".kiro/.kiro-kit.json";
411
+ function getTrackingPath(workspaceRoot) {
412
+ return path4.join(workspaceRoot, TRACKING_FILE);
413
+ }
414
+ function read(workspaceRoot) {
415
+ const filePath = getTrackingPath(workspaceRoot);
416
+ if (!fs5.existsSync(filePath)) {
417
+ return null;
418
+ }
419
+ const raw = fs5.readFileSync(filePath, "utf-8");
420
+ try {
421
+ return JSON.parse(raw);
422
+ } catch {
423
+ logger.warn(`Tracking file is corrupt: ${filePath}`);
424
+ throw new KKError(
425
+ ErrorCodes.TRACKING_CORRUPT,
426
+ "Tracking file .kiro/.kiro-kit.json is corrupt (invalid JSON).",
427
+ "Delete the file and re-run kiro-kit init to regenerate."
428
+ );
429
+ }
430
+ }
431
+ function write(workspaceRoot, data) {
432
+ const filePath = getTrackingPath(workspaceRoot);
433
+ const dir = path4.dirname(filePath);
434
+ fs5.mkdirSync(dir, { recursive: true });
435
+ fs5.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8");
436
+ }
437
+ function upsertPreset(data, preset) {
438
+ const existing = data.presets.findIndex((p) => p.name === preset.name);
439
+ if (existing >= 0) {
440
+ data.presets[existing] = preset;
441
+ } else {
442
+ data.presets.push(preset);
443
+ }
444
+ data.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
445
+ return data;
446
+ }
447
+ function createInitial(kitVersion) {
448
+ return {
449
+ kitVersion,
450
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
451
+ presets: []
452
+ };
453
+ }
454
+
455
+ // src/core/MetadataWriter.ts
456
+ import fs6 from "fs";
457
+ import path5 from "path";
458
+ var METADATA_FILE = ".kiro/metadata.json";
459
+ function compose(opts) {
460
+ return {
461
+ version: "1.0.0",
462
+ name: "kiro-kit",
463
+ description: "Kiro IDE workspace bootstrapped by kiro-kit.",
464
+ buildDate: (/* @__PURE__ */ new Date()).toISOString(),
465
+ repository: opts.repository,
466
+ presets: opts.presets,
467
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
468
+ kitVersion: opts.kitVersion
469
+ };
470
+ }
471
+ function write2(workspaceRoot, metadata) {
472
+ const filePath = path5.join(workspaceRoot, METADATA_FILE);
473
+ const dir = path5.dirname(filePath);
474
+ fs6.mkdirSync(dir, { recursive: true });
475
+ fs6.writeFileSync(filePath, JSON.stringify(metadata, null, 2) + "\n", "utf-8");
476
+ }
477
+ function read2(workspaceRoot) {
478
+ const filePath = path5.join(workspaceRoot, METADATA_FILE);
479
+ if (!fs6.existsSync(filePath)) return null;
480
+ try {
481
+ return JSON.parse(fs6.readFileSync(filePath, "utf-8"));
482
+ } catch {
483
+ return null;
484
+ }
485
+ }
486
+ function mergePresets(existing, newPresets) {
487
+ const merged = [...existing.presets];
488
+ for (const p of newPresets) {
489
+ const idx = merged.findIndex((m) => m.name === p.name);
490
+ if (idx >= 0) {
491
+ merged[idx] = p;
492
+ } else {
493
+ merged.push(p);
494
+ }
495
+ }
496
+ return { ...existing, presets: merged, buildDate: (/* @__PURE__ */ new Date()).toISOString() };
497
+ }
498
+
499
+ // src/core/StatuslineSelector.ts
500
+ import fs7 from "fs";
501
+ import path6 from "path";
502
+ import process4 from "process";
503
+ var STATUSLINE_FILES = ["statusline.js", "statusline.sh", "statusline.ps1"];
504
+ function getCommand() {
505
+ switch (process4.platform) {
506
+ case "win32":
507
+ return "powershell -ExecutionPolicy Bypass -File .kiro/statusline.ps1";
508
+ default:
509
+ return "node .kiro/statusline.js";
510
+ }
511
+ }
512
+ function install(presetDir, workspaceRoot) {
513
+ const installed = [];
514
+ const targetDir = path6.join(workspaceRoot, ".kiro");
515
+ fs7.mkdirSync(targetDir, { recursive: true });
516
+ for (const file of STATUSLINE_FILES) {
517
+ const source = path6.join(presetDir, file);
518
+ if (!fs7.existsSync(source)) continue;
519
+ const target = path6.join(targetDir, file);
520
+ fs7.copyFileSync(source, target);
521
+ installed.push(`.kiro/${file}`);
522
+ if (file.endsWith(".sh") && process4.platform !== "win32") {
523
+ try {
524
+ fs7.chmodSync(target, 493);
525
+ } catch {
526
+ }
527
+ }
528
+ }
529
+ return installed;
530
+ }
531
+ function resolveSettingsCommand(settings) {
532
+ const statusLine = settings["statusLine"];
533
+ if (statusLine && statusLine["type"] === "command") {
534
+ statusLine["command"] = getCommand();
535
+ }
536
+ return settings;
537
+ }
538
+
539
+ // src/core/merge/mergeMCP.ts
540
+ function mergeMCP(existing, presetServers, presetName) {
541
+ const result = existing ? structuredClone(existing) : { mcpServers: {} };
542
+ if (!result.mcpServers) {
543
+ result.mcpServers = {};
544
+ }
545
+ for (const [serverName, def] of Object.entries(presetServers)) {
546
+ if (serverName in result.mcpServers) {
547
+ logger.warn(
548
+ `MCP server "${serverName}" already exists, keeping user definition.` + (presetName ? ` (from preset: ${presetName})` : "")
549
+ );
550
+ continue;
551
+ }
552
+ result.mcpServers[serverName] = structuredClone(def);
553
+ }
554
+ return result;
555
+ }
556
+
557
+ // src/core/merge/mergeSettings.ts
558
+ function mergeSettings(existing, preset) {
559
+ const result = existing ? structuredClone(existing) : {};
560
+ if (preset.hooks) {
561
+ if (!result.hooks) result.hooks = {};
562
+ for (const key of ["PreToolUse", "PostToolUse", "agentStop"]) {
563
+ const presetArr = preset.hooks[key];
564
+ if (!presetArr || presetArr.length === 0) continue;
565
+ const existingArr = result.hooks[key] ?? [];
566
+ const existingCommands = new Set(existingArr.map((h) => h.command));
567
+ for (const hook of presetArr) {
568
+ if (!existingCommands.has(hook.command)) {
569
+ existingArr.push(structuredClone(hook));
570
+ }
571
+ }
572
+ result.hooks[key] = existingArr;
573
+ }
574
+ }
575
+ if (preset.statusLine !== void 0) {
576
+ if (result.statusLine !== void 0) {
577
+ logger.warn("statusLine already set in settings, overwriting with preset value.");
578
+ }
579
+ result.statusLine = structuredClone(preset.statusLine);
580
+ }
581
+ if (preset.includeCoAuthoredBy !== void 0) {
582
+ if (result.includeCoAuthoredBy !== void 0 && result.includeCoAuthoredBy !== preset.includeCoAuthoredBy) {
583
+ logger.warn("includeCoAuthoredBy already set, overwriting with preset value.");
584
+ }
585
+ result.includeCoAuthoredBy = preset.includeCoAuthoredBy;
586
+ }
587
+ return result;
588
+ }
589
+
590
+ // src/prompts/DiffViewer.ts
591
+ import fs8 from "fs";
592
+ import { createTwoFilesPatch } from "diff";
593
+ function showDiff(target, sourceContent) {
594
+ const existing = fs8.existsSync(target) ? fs8.readFileSync(target, "utf-8") : "";
595
+ const incoming = sourceContent.toString("utf-8");
596
+ const patch = createTwoFilesPatch(
597
+ `a/${target}`,
598
+ `b/${target}`,
599
+ existing,
600
+ incoming,
601
+ "current",
602
+ "incoming",
603
+ { context: 3 }
604
+ );
605
+ const lines = patch.split("\n");
606
+ for (const line of lines) {
607
+ if (line.startsWith("+") && !line.startsWith("+++")) {
608
+ process.stdout.write(color.green(line) + "\n");
609
+ } else if (line.startsWith("-") && !line.startsWith("---")) {
610
+ process.stdout.write(color.red(line) + "\n");
611
+ } else if (line.startsWith("@@")) {
612
+ process.stdout.write(color.cyan(line) + "\n");
613
+ } else {
614
+ process.stdout.write(line + "\n");
615
+ }
616
+ }
617
+ }
618
+
619
+ // src/utils/fs-safe.ts
620
+ import fs9 from "fs";
621
+ import path7 from "path";
622
+ import crypto2 from "crypto";
623
+ import os from "os";
624
+ var LF_EXTENSIONS = /* @__PURE__ */ new Set([".json", ".yaml", ".yml"]);
625
+ function getLineEnding(filePath) {
626
+ const ext = path7.extname(filePath).toLowerCase();
627
+ if (LF_EXTENSIONS.has(ext)) return "\n";
628
+ return os.EOL;
629
+ }
630
+ function normalizeLineEndings(content, filePath) {
631
+ const eol = getLineEnding(filePath);
632
+ const normalized = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
633
+ if (eol === "\n") return normalized;
634
+ return normalized.replace(/\n/g, eol);
635
+ }
636
+ function atomicWrite(target, content) {
637
+ const dir = path7.dirname(target);
638
+ fs9.mkdirSync(dir, { recursive: true });
639
+ const rand = crypto2.randomBytes(6).toString("hex");
640
+ const tmpPath = path7.join(dir, `.tmp.${rand}`);
641
+ let data;
642
+ if (typeof content === "string") {
643
+ const normalized = normalizeLineEndings(content, target);
644
+ data = Buffer.from(normalized, "utf-8");
645
+ } else {
646
+ data = content;
647
+ }
648
+ try {
649
+ fs9.writeFileSync(tmpPath, data);
650
+ fs9.renameSync(tmpPath, target);
651
+ } catch (err) {
652
+ try {
653
+ fs9.unlinkSync(tmpPath);
654
+ } catch {
655
+ }
656
+ throw err;
657
+ }
658
+ }
659
+
660
+ // src/utils/paths.ts
661
+ import path8 from "path";
662
+ function safePathInside(workspaceRoot, target) {
663
+ const resolved = path8.resolve(workspaceRoot, target);
664
+ const root = path8.resolve(workspaceRoot);
665
+ return resolved.startsWith(root + path8.sep) || resolved === root;
666
+ }
667
+
668
+ // src/commands/init.ts
669
+ function setupSigintHandler() {
670
+ process5.on("SIGINT", () => {
671
+ process5.exit(130);
672
+ });
673
+ }
674
+ async function multiPickPrompt(items) {
675
+ const selected = /* @__PURE__ */ new Set();
676
+ let cursor = 0;
677
+ const rl = readline.createInterface({
678
+ input: process5.stdin,
679
+ output: process5.stdout,
680
+ terminal: false
681
+ });
682
+ if (!process5.stdin.isTTY) {
683
+ rl.close();
684
+ return [];
685
+ }
686
+ return new Promise((resolve2, reject) => {
687
+ const render = () => {
688
+ if (cursor >= 0) {
689
+ process5.stdout.write(`\x1B[${items.length + 1}A`);
690
+ }
691
+ process5.stdout.write(
692
+ color.bold("? Select presets to install:") + color.dim(" (Space to select, <a> toggle all, Enter to confirm)") + "\n"
693
+ );
694
+ for (let i = 0; i < items.length; i++) {
695
+ const marker = cursor === i ? color.cyan(">") : " ";
696
+ const check = selected.has(i) ? color.green("[x]") : "[ ]";
697
+ const name = color.bold(items[i].name.padEnd(12));
698
+ const desc = color.dim(`- ${items[i].description}`);
699
+ process5.stdout.write(` ${marker} ${check} ${name} ${desc}
700
+ `);
701
+ }
702
+ };
703
+ process5.stdout.write("\n".repeat(items.length + 1));
704
+ render();
705
+ process5.stdin.setRawMode(true);
706
+ process5.stdin.resume();
707
+ process5.stdin.setEncoding("utf-8");
708
+ const onData = (key) => {
709
+ if (key === "") {
710
+ process5.stdin.setRawMode(false);
711
+ process5.stdin.removeListener("data", onData);
712
+ process5.stdin.pause();
713
+ rl.close();
714
+ reject(new Error("SIGINT"));
715
+ return;
716
+ }
717
+ if (key === "\r" || key === "\n") {
718
+ process5.stdin.setRawMode(false);
719
+ process5.stdin.removeListener("data", onData);
720
+ process5.stdin.pause();
721
+ rl.close();
722
+ const result = [...selected].map((i) => items[i].name);
723
+ resolve2(result);
724
+ return;
725
+ }
726
+ if (key === " ") {
727
+ if (selected.has(cursor)) {
728
+ selected.delete(cursor);
729
+ } else {
730
+ selected.add(cursor);
731
+ }
732
+ render();
733
+ return;
734
+ }
735
+ if (key === "a" || key === "A") {
736
+ if (selected.size === items.length) {
737
+ selected.clear();
738
+ } else {
739
+ for (let i = 0; i < items.length; i++) selected.add(i);
740
+ }
741
+ render();
742
+ return;
743
+ }
744
+ if (key === "\x1B[A" || key === "k") {
745
+ cursor = (cursor - 1 + items.length) % items.length;
746
+ render();
747
+ return;
748
+ }
749
+ if (key === "\x1B[B" || key === "j") {
750
+ cursor = (cursor + 1) % items.length;
751
+ render();
752
+ return;
753
+ }
754
+ };
755
+ process5.stdin.on("data", onData);
756
+ });
757
+ }
758
+ async function confirmPrompt(message) {
759
+ if (!process5.stdin.isTTY) return true;
760
+ return new Promise((resolve2, reject) => {
761
+ const rl = readline.createInterface({
762
+ input: process5.stdin,
763
+ output: process5.stdout
764
+ });
765
+ rl.question(`${color.bold("?")} ${message} `, (answer) => {
766
+ rl.close();
767
+ const normalized = answer.trim().toLowerCase();
768
+ resolve2(normalized === "" || normalized === "y" || normalized === "yes");
769
+ });
770
+ rl.on("SIGINT", () => {
771
+ rl.close();
772
+ reject(new Error("SIGINT"));
773
+ });
774
+ });
775
+ }
776
+ async function conflictPrompt(target) {
777
+ if (!process5.stdin.isTTY) return "skip";
778
+ const relTarget = path9.relative(process5.cwd(), target);
779
+ process5.stdout.write(
780
+ `
781
+ ${color.yellow("?")} File ${color.bold(relTarget)} already exists with different content.
782
+ ${color.cyan(">")} overwrite - Replace existing file (backup will be saved)
783
+ skip - Keep existing file
784
+ view diff - Show unified diff and ask again
785
+ overwrite all - Replace this and all remaining conflicting files
786
+ `
787
+ );
788
+ return new Promise((resolve2, reject) => {
789
+ const rl = readline.createInterface({
790
+ input: process5.stdin,
791
+ output: process5.stdout
792
+ });
793
+ rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {
794
+ rl.close();
795
+ const a = answer.trim().toLowerCase();
796
+ if (a === "o" || a === "overwrite") resolve2("overwrite");
797
+ else if (a === "s" || a === "skip") resolve2("skip");
798
+ else if (a === "d" || a === "diff" || a === "view diff") resolve2("view-diff");
799
+ else if (a === "a" || a === "all" || a === "overwrite all") resolve2("overwrite-all");
800
+ else resolve2("skip");
801
+ });
802
+ rl.on("SIGINT", () => {
803
+ rl.close();
804
+ reject(new Error("SIGINT"));
805
+ });
806
+ });
807
+ }
808
+ function sha2562(data) {
809
+ return crypto3.createHash("sha256").update(data).digest("hex");
810
+ }
811
+ function registerInitCommand(program2) {
812
+ program2.command("init").description("Initialize workspace with selected presets").option("-y, --yes", "Skip confirmation, accept defaults").option("--preset <name>", "Specify preset (repeatable)", collectPreset, []).option("--force", "Overwrite all files (with backup)").option("--skip-existing", "Skip all existing files").option("--no-color", "Disable ANSI colors").action(async (opts) => {
813
+ setupSigintHandler();
814
+ try {
815
+ await runInit(opts);
816
+ } catch (err) {
817
+ if (err instanceof Error && err.message === "SIGINT") {
818
+ process5.exit(130);
819
+ }
820
+ logger.error(err instanceof Error ? err.message : String(err));
821
+ process5.exit(1);
822
+ }
823
+ });
824
+ }
825
+ function collectPreset(value, previous) {
826
+ return [...previous, value];
827
+ }
828
+ async function runInit(opts) {
829
+ const workspaceRoot = process5.cwd();
830
+ const available = listAvailable();
831
+ let selectedNames;
832
+ if (opts.preset && opts.preset.length > 0) {
833
+ for (const name of opts.preset) {
834
+ if (!available.includes(name)) {
835
+ logger.error(
836
+ `Preset "${name}" not found. Available: ${available.join(", ")}`
837
+ );
838
+ process5.exit(1);
839
+ }
840
+ }
841
+ selectedNames = opts.preset;
842
+ } else {
843
+ const items = available.map((name) => {
844
+ try {
845
+ const preset = load(name);
846
+ return { name, description: preset.manifest.description };
847
+ } catch {
848
+ return { name, description: "" };
849
+ }
850
+ });
851
+ selectedNames = await multiPickPrompt(items);
852
+ }
853
+ if (selectedNames.length === 0) {
854
+ logger.info("No presets selected. Exiting.");
855
+ process5.exit(0);
856
+ }
857
+ const presets = loadAll(selectedNames);
858
+ let totalFiles = 0;
859
+ for (const preset of presets) {
860
+ totalFiles += preset.manifest.files.length;
861
+ }
862
+ if (!opts.yes) {
863
+ const confirmed = await confirmPrompt(
864
+ `About to write ${totalFiles} files into .kiro/ and workspace. Continue? (Y/n)`
865
+ );
866
+ if (!confirmed) {
867
+ logger.info("Cancelled.");
868
+ process5.exit(0);
869
+ }
870
+ }
871
+ let mode = "interactive";
872
+ if (opts.force) mode = "force";
873
+ else if (opts.skipExisting) mode = "skip-existing";
874
+ else if (opts.yes) mode = "skip-existing";
875
+ const sessionState = { overwriteAll: false };
876
+ const timestamp = generateTimestamp2();
877
+ const allTrackedFiles = [];
878
+ let filesWritten = 0;
879
+ let filesSkipped = 0;
880
+ for (const preset of presets) {
881
+ const { manifest, dir: presetDir } = preset;
882
+ const regularFiles = manifest.files.filter(
883
+ (f) => !["mcp", "settings", "statusline"].includes(f.type)
884
+ );
885
+ const mcpFiles = manifest.files.filter((f) => f.type === "mcp");
886
+ const settingsFiles = manifest.files.filter((f) => f.type === "settings");
887
+ const statuslineFiles = manifest.files.filter((f) => f.type === "statusline");
888
+ for (const fileEntry of regularFiles) {
889
+ const sourcePath = path9.join(presetDir, fileEntry.source);
890
+ const targetPath = path9.resolve(workspaceRoot, fileEntry.target);
891
+ if (!safePathInside(workspaceRoot, fileEntry.target)) {
892
+ logger.warn(`Skipping unsafe path: ${fileEntry.target}`);
893
+ filesSkipped++;
894
+ continue;
895
+ }
896
+ if (!fs10.existsSync(sourcePath)) {
897
+ logger.debug(`Source file missing: ${sourcePath}`);
898
+ continue;
899
+ }
900
+ const sourceContent = fs10.readFileSync(sourcePath);
901
+ const action = await resolve({
902
+ target: targetPath,
903
+ sourceContent,
904
+ mode,
905
+ sessionState,
906
+ prompt: conflictPrompt,
907
+ showDiff: (t, s) => showDiff(t, s)
908
+ });
909
+ switch (action) {
910
+ case "WRITE_NEW":
911
+ fs10.mkdirSync(path9.dirname(targetPath), { recursive: true });
912
+ atomicWrite(targetPath, sourceContent.toString("utf-8"));
913
+ if (fileEntry.executable && process5.platform !== "win32") {
914
+ try {
915
+ fs10.chmodSync(targetPath, 493);
916
+ } catch {
917
+ }
918
+ }
919
+ filesWritten++;
920
+ break;
921
+ case "OVERWRITE_WITH_BACKUP":
922
+ backup(workspaceRoot, targetPath, timestamp);
923
+ atomicWrite(targetPath, sourceContent.toString("utf-8"));
924
+ if (fileEntry.executable && process5.platform !== "win32") {
925
+ try {
926
+ fs10.chmodSync(targetPath, 493);
927
+ } catch {
928
+ }
929
+ }
930
+ filesWritten++;
931
+ break;
932
+ case "SKIP":
933
+ filesSkipped++;
934
+ break;
935
+ case "NO_OP":
936
+ break;
937
+ }
938
+ if (action !== "SKIP") {
939
+ allTrackedFiles.push({
940
+ target: fileEntry.target,
941
+ sourcePreset: manifest.name,
942
+ contentHash: sha2562(sourceContent),
943
+ installedAt: (/* @__PURE__ */ new Date()).toISOString()
944
+ });
945
+ }
946
+ }
947
+ if (statuslineFiles.length > 0) {
948
+ const installed = install(presetDir, workspaceRoot);
949
+ filesWritten += installed.length;
950
+ for (const f of installed) {
951
+ allTrackedFiles.push({
952
+ target: f,
953
+ sourcePreset: manifest.name,
954
+ contentHash: "",
955
+ installedAt: (/* @__PURE__ */ new Date()).toISOString()
956
+ });
957
+ }
958
+ }
959
+ if (mcpFiles.length > 0 && manifest.mcpServers) {
960
+ const mcpPath = path9.join(workspaceRoot, ".kiro/settings/mcp.json");
961
+ let existingMcp = null;
962
+ if (fs10.existsSync(mcpPath)) {
963
+ try {
964
+ existingMcp = JSON.parse(fs10.readFileSync(mcpPath, "utf-8"));
965
+ } catch {
966
+ existingMcp = null;
967
+ }
968
+ }
969
+ const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);
970
+ fs10.mkdirSync(path9.dirname(mcpPath), { recursive: true });
971
+ atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + "\n");
972
+ filesWritten++;
973
+ }
974
+ if (settingsFiles.length > 0) {
975
+ const settingsPath = path9.join(workspaceRoot, ".kiro/settings.json");
976
+ let existingSettings = null;
977
+ if (fs10.existsSync(settingsPath)) {
978
+ try {
979
+ existingSettings = JSON.parse(
980
+ fs10.readFileSync(settingsPath, "utf-8")
981
+ );
982
+ } catch {
983
+ existingSettings = null;
984
+ }
985
+ }
986
+ const presetSettingsPath = path9.join(presetDir, "settings.json");
987
+ if (fs10.existsSync(presetSettingsPath)) {
988
+ const presetSettings = JSON.parse(
989
+ fs10.readFileSync(presetSettingsPath, "utf-8")
990
+ );
991
+ const resolvedSettings = resolveSettingsCommand(
992
+ presetSettings
993
+ );
994
+ const merged = mergeSettings(existingSettings, resolvedSettings);
995
+ fs10.mkdirSync(path9.dirname(settingsPath), { recursive: true });
996
+ atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + "\n");
997
+ filesWritten++;
998
+ }
999
+ }
1000
+ const mcpExampleSource = path9.join(presetDir, ".mcp.json.example");
1001
+ if (fs10.existsSync(mcpExampleSource)) {
1002
+ const mcpExampleTarget = path9.join(workspaceRoot, ".kiro/.mcp.json.example");
1003
+ if (!fs10.existsSync(mcpExampleTarget)) {
1004
+ fs10.mkdirSync(path9.dirname(mcpExampleTarget), { recursive: true });
1005
+ fs10.copyFileSync(mcpExampleSource, mcpExampleTarget);
1006
+ }
1007
+ }
1008
+ }
1009
+ const kitVersion = getKitVersion();
1010
+ const presetMetas = presets.map((p) => ({
1011
+ name: p.manifest.name,
1012
+ version: p.manifest.version
1013
+ }));
1014
+ const existingMeta = read2(workspaceRoot);
1015
+ const metadata = existingMeta ? mergePresets(existingMeta, presetMetas) : compose({
1016
+ kitVersion,
1017
+ repository: "https://github.com/ihatesea69/kiro-kit.git",
1018
+ presets: presetMetas
1019
+ });
1020
+ write2(workspaceRoot, metadata);
1021
+ let trackingData = read(workspaceRoot) ?? createInitial(kitVersion);
1022
+ for (const preset of presets) {
1023
+ const presetFiles = allTrackedFiles.filter(
1024
+ (f) => f.sourcePreset === preset.manifest.name
1025
+ );
1026
+ const trackedPreset = {
1027
+ name: preset.manifest.name,
1028
+ version: preset.manifest.version,
1029
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
1030
+ files: presetFiles
1031
+ };
1032
+ trackingData = upsertPreset(trackingData, trackedPreset);
1033
+ }
1034
+ trackingData.kitVersion = kitVersion;
1035
+ write(workspaceRoot, trackingData);
1036
+ logger.success(
1037
+ `Done! ${filesWritten} files written, ${filesSkipped} skipped.`
1038
+ );
1039
+ logger.info(
1040
+ `Presets installed: ${selectedNames.join(", ")}`
1041
+ );
1042
+ }
1043
+ function generateTimestamp2() {
1044
+ const now = /* @__PURE__ */ new Date();
1045
+ const y = now.getFullYear();
1046
+ const mo = String(now.getMonth() + 1).padStart(2, "0");
1047
+ const d = String(now.getDate()).padStart(2, "0");
1048
+ const h = String(now.getHours()).padStart(2, "0");
1049
+ const mi = String(now.getMinutes()).padStart(2, "0");
1050
+ const s = String(now.getSeconds()).padStart(2, "0");
1051
+ const ms = String(now.getMilliseconds()).padStart(3, "0");
1052
+ return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
1053
+ }
1054
+ function getKitVersion() {
1055
+ try {
1056
+ const pkgPath = new URL("../package.json", import.meta.url);
1057
+ const pkg2 = JSON.parse(fs10.readFileSync(pkgPath, "utf-8"));
1058
+ return pkg2.version;
1059
+ } catch {
1060
+ return "0.1.0";
1061
+ }
1062
+ }
1063
+
1064
+ // src/commands/add.ts
1065
+ import fs11 from "fs";
1066
+ import path10 from "path";
1067
+ import process6 from "process";
1068
+ import crypto4 from "crypto";
1069
+ function sha2563(data) {
1070
+ return crypto4.createHash("sha256").update(data).digest("hex");
1071
+ }
1072
+ function generateTimestamp3() {
1073
+ const now = /* @__PURE__ */ new Date();
1074
+ const y = now.getFullYear();
1075
+ const mo = String(now.getMonth() + 1).padStart(2, "0");
1076
+ const d = String(now.getDate()).padStart(2, "0");
1077
+ const h = String(now.getHours()).padStart(2, "0");
1078
+ const mi = String(now.getMinutes()).padStart(2, "0");
1079
+ const s = String(now.getSeconds()).padStart(2, "0");
1080
+ const ms = String(now.getMilliseconds()).padStart(3, "0");
1081
+ return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
1082
+ }
1083
+ function getKitVersion2() {
1084
+ try {
1085
+ const pkgPath = new URL("../../package.json", import.meta.url);
1086
+ const pkg2 = JSON.parse(fs11.readFileSync(pkgPath, "utf-8"));
1087
+ return pkg2.version;
1088
+ } catch {
1089
+ return "0.1.0";
1090
+ }
1091
+ }
1092
+ async function conflictPrompt2(target) {
1093
+ if (!process6.stdin.isTTY) return "skip";
1094
+ const { default: readline2 } = await import("readline");
1095
+ const relTarget = path10.relative(process6.cwd(), target);
1096
+ process6.stdout.write(
1097
+ `
1098
+ ${color.yellow("?")} File ${color.bold(relTarget)} already exists with different content.
1099
+ ${color.cyan(">")} overwrite - Replace existing file (backup will be saved)
1100
+ skip - Keep existing file
1101
+ view diff - Show unified diff and ask again
1102
+ overwrite all - Replace this and all remaining conflicting files
1103
+ `
1104
+ );
1105
+ return new Promise((resolve2) => {
1106
+ const rl = readline2.createInterface({ input: process6.stdin, output: process6.stdout });
1107
+ rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {
1108
+ rl.close();
1109
+ const a = answer.trim().toLowerCase();
1110
+ if (a === "o" || a === "overwrite") resolve2("overwrite");
1111
+ else if (a === "s" || a === "skip") resolve2("skip");
1112
+ else if (a === "d" || a === "diff" || a === "view diff") resolve2("view-diff");
1113
+ else if (a === "a" || a === "all" || a === "overwrite all") resolve2("overwrite-all");
1114
+ else resolve2("skip");
1115
+ });
1116
+ });
1117
+ }
1118
+ function registerAddCommand(program2) {
1119
+ program2.command("add <preset>").description("Add a preset to existing workspace").option("-y, --yes", "Skip confirmation").option("--force", "Overwrite all files (with backup)").option("--skip-existing", "Skip all existing files").option("--no-color", "Disable ANSI colors").action(async (presetName, opts) => {
1120
+ try {
1121
+ await runAdd(presetName, opts);
1122
+ } catch (err) {
1123
+ logger.error(err instanceof Error ? err.message : String(err));
1124
+ process6.exit(1);
1125
+ }
1126
+ });
1127
+ }
1128
+ async function runAdd(presetName, opts) {
1129
+ const workspaceRoot = process6.cwd();
1130
+ const available = listAvailable();
1131
+ if (!available.includes(presetName)) {
1132
+ logger.error(
1133
+ `Preset "${presetName}" not found. Available: ${available.join(", ")}`
1134
+ );
1135
+ process6.exit(1);
1136
+ }
1137
+ const kiroDir = path10.join(workspaceRoot, ".kiro");
1138
+ if (!fs11.existsSync(kiroDir)) {
1139
+ fs11.mkdirSync(kiroDir, { recursive: true });
1140
+ logger.info("Created .kiro/ directory.");
1141
+ }
1142
+ const preset = load(presetName);
1143
+ let mode = "interactive";
1144
+ if (opts.force) mode = "force";
1145
+ else if (opts.skipExisting) mode = "skip-existing";
1146
+ else if (opts.yes) mode = "skip-existing";
1147
+ const sessionState = { overwriteAll: false };
1148
+ const timestamp = generateTimestamp3();
1149
+ const allTrackedFiles = [];
1150
+ let filesWritten = 0;
1151
+ let filesSkipped = 0;
1152
+ const { manifest, dir: presetDir } = preset;
1153
+ const regularFiles = manifest.files.filter(
1154
+ (f) => !["mcp", "settings", "statusline"].includes(f.type)
1155
+ );
1156
+ const statuslineFiles = manifest.files.filter((f) => f.type === "statusline");
1157
+ for (const fileEntry of regularFiles) {
1158
+ const sourcePath = path10.join(presetDir, fileEntry.source);
1159
+ const targetPath = path10.resolve(workspaceRoot, fileEntry.target);
1160
+ if (!safePathInside(workspaceRoot, fileEntry.target)) {
1161
+ logger.warn(`Skipping unsafe path: ${fileEntry.target}`);
1162
+ filesSkipped++;
1163
+ continue;
1164
+ }
1165
+ if (!fs11.existsSync(sourcePath)) {
1166
+ logger.debug(`Source file missing: ${sourcePath}`);
1167
+ continue;
1168
+ }
1169
+ const sourceContent = fs11.readFileSync(sourcePath);
1170
+ const action = await resolve({
1171
+ target: targetPath,
1172
+ sourceContent,
1173
+ mode,
1174
+ sessionState,
1175
+ prompt: conflictPrompt2,
1176
+ showDiff: (t, s) => showDiff(t, s)
1177
+ });
1178
+ switch (action) {
1179
+ case "WRITE_NEW":
1180
+ fs11.mkdirSync(path10.dirname(targetPath), { recursive: true });
1181
+ atomicWrite(targetPath, sourceContent.toString("utf-8"));
1182
+ if (fileEntry.executable && process6.platform !== "win32") {
1183
+ try {
1184
+ fs11.chmodSync(targetPath, 493);
1185
+ } catch {
1186
+ }
1187
+ }
1188
+ filesWritten++;
1189
+ break;
1190
+ case "OVERWRITE_WITH_BACKUP":
1191
+ backup(workspaceRoot, targetPath, timestamp);
1192
+ atomicWrite(targetPath, sourceContent.toString("utf-8"));
1193
+ if (fileEntry.executable && process6.platform !== "win32") {
1194
+ try {
1195
+ fs11.chmodSync(targetPath, 493);
1196
+ } catch {
1197
+ }
1198
+ }
1199
+ filesWritten++;
1200
+ break;
1201
+ case "SKIP":
1202
+ filesSkipped++;
1203
+ break;
1204
+ case "NO_OP":
1205
+ break;
1206
+ }
1207
+ if (action !== "SKIP") {
1208
+ allTrackedFiles.push({
1209
+ target: fileEntry.target,
1210
+ sourcePreset: manifest.name,
1211
+ contentHash: sha2563(sourceContent),
1212
+ installedAt: (/* @__PURE__ */ new Date()).toISOString()
1213
+ });
1214
+ }
1215
+ }
1216
+ if (statuslineFiles.length > 0) {
1217
+ const installed = install(presetDir, workspaceRoot);
1218
+ filesWritten += installed.length;
1219
+ for (const f of installed) {
1220
+ allTrackedFiles.push({
1221
+ target: f,
1222
+ sourcePreset: manifest.name,
1223
+ contentHash: "",
1224
+ installedAt: (/* @__PURE__ */ new Date()).toISOString()
1225
+ });
1226
+ }
1227
+ }
1228
+ if (manifest.mcpServers) {
1229
+ const mcpPath = path10.join(workspaceRoot, ".kiro/settings/mcp.json");
1230
+ let existingMcp = null;
1231
+ if (fs11.existsSync(mcpPath)) {
1232
+ try {
1233
+ existingMcp = JSON.parse(fs11.readFileSync(mcpPath, "utf-8"));
1234
+ } catch {
1235
+ existingMcp = null;
1236
+ }
1237
+ }
1238
+ const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);
1239
+ fs11.mkdirSync(path10.dirname(mcpPath), { recursive: true });
1240
+ atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + "\n");
1241
+ filesWritten++;
1242
+ }
1243
+ const presetSettingsPath = path10.join(presetDir, "settings.json");
1244
+ if (fs11.existsSync(presetSettingsPath)) {
1245
+ const settingsPath = path10.join(workspaceRoot, ".kiro/settings.json");
1246
+ let existingSettings = null;
1247
+ if (fs11.existsSync(settingsPath)) {
1248
+ try {
1249
+ existingSettings = JSON.parse(fs11.readFileSync(settingsPath, "utf-8"));
1250
+ } catch {
1251
+ existingSettings = null;
1252
+ }
1253
+ }
1254
+ const presetSettings = JSON.parse(fs11.readFileSync(presetSettingsPath, "utf-8"));
1255
+ const resolvedSettings = resolveSettingsCommand(
1256
+ presetSettings
1257
+ );
1258
+ const merged = mergeSettings(existingSettings, resolvedSettings);
1259
+ fs11.mkdirSync(path10.dirname(settingsPath), { recursive: true });
1260
+ atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + "\n");
1261
+ filesWritten++;
1262
+ }
1263
+ const kitVersion = getKitVersion2();
1264
+ const presetMeta = { name: manifest.name, version: manifest.version };
1265
+ const existingMeta = read2(workspaceRoot);
1266
+ const metadata = existingMeta ? mergePresets(existingMeta, [presetMeta]) : compose({ kitVersion, repository: "https://github.com/ihatesea69/kiro-kit.git", presets: [presetMeta] });
1267
+ write2(workspaceRoot, metadata);
1268
+ let trackingData = read(workspaceRoot) ?? createInitial(kitVersion);
1269
+ const trackedPreset = {
1270
+ name: manifest.name,
1271
+ version: manifest.version,
1272
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
1273
+ files: allTrackedFiles
1274
+ };
1275
+ trackingData = upsertPreset(trackingData, trackedPreset);
1276
+ trackingData.kitVersion = kitVersion;
1277
+ write(workspaceRoot, trackingData);
1278
+ logger.success(`Done! ${filesWritten} files written, ${filesSkipped} skipped.`);
1279
+ logger.info(`Preset added: ${presetName}`);
1280
+ }
1281
+
1282
+ // src/commands/list.ts
1283
+ import process7 from "process";
1284
+ function countArtifacts(files) {
1285
+ const counts = {
1286
+ agent: 0,
1287
+ skill: 0,
1288
+ command: 0,
1289
+ hook: 0,
1290
+ workflow: 0,
1291
+ mcp: 0
1292
+ };
1293
+ for (const f of files) {
1294
+ if (f.type in counts) {
1295
+ counts[f.type]++;
1296
+ }
1297
+ }
1298
+ return counts;
1299
+ }
1300
+ function registerListCommand(program2) {
1301
+ program2.command("list").description("List available presets").option("--json", "Output as JSON").action((opts) => {
1302
+ try {
1303
+ runList(opts);
1304
+ } catch (err) {
1305
+ logger.error(err instanceof Error ? err.message : String(err));
1306
+ process7.exit(1);
1307
+ }
1308
+ });
1309
+ }
1310
+ function runList(opts) {
1311
+ const available = listAvailable();
1312
+ const summaries = [];
1313
+ for (const name of available) {
1314
+ try {
1315
+ const preset = load(name);
1316
+ const counts = countArtifacts(preset.manifest.files);
1317
+ summaries.push({
1318
+ name,
1319
+ description: preset.manifest.description,
1320
+ agents: counts["agent"],
1321
+ skills: counts["skill"],
1322
+ commands: counts["command"],
1323
+ hooks: counts["hook"],
1324
+ workflows: counts["workflow"],
1325
+ mcp: Object.keys(preset.manifest.mcpServers ?? {}).length
1326
+ });
1327
+ } catch {
1328
+ summaries.push({
1329
+ name,
1330
+ description: "(failed to load)",
1331
+ agents: 0,
1332
+ skills: 0,
1333
+ commands: 0,
1334
+ hooks: 0,
1335
+ workflows: 0,
1336
+ mcp: 0
1337
+ });
1338
+ }
1339
+ }
1340
+ if (opts.json) {
1341
+ process7.stdout.write(JSON.stringify(summaries, null, 2) + "\n");
1342
+ return;
1343
+ }
1344
+ for (const s of summaries) {
1345
+ const nameStr = color.bold(s.name.padEnd(12));
1346
+ const descStr = color.dim(`- ${s.description}`);
1347
+ process7.stdout.write(` ${nameStr} ${descStr}
1348
+ `);
1349
+ const counts = `${s.agents} agents, ${s.skills} skills, ${s.commands} commands, ${s.hooks} hooks, ${s.workflows} workflows, ${s.mcp} MCP servers`;
1350
+ process7.stdout.write(`${"".padEnd(14)} ${color.gray(counts)}
1351
+ `);
1352
+ }
1353
+ }
1354
+
1355
+ // src/commands/info.ts
1356
+ import process8 from "process";
1357
+ function registerInfoCommand(program2) {
1358
+ program2.command("info <preset>").description("Show detailed preset information").option("--json", "Output as JSON").action((presetName, opts) => {
1359
+ try {
1360
+ runInfo(presetName, opts);
1361
+ } catch (err) {
1362
+ logger.error(err instanceof Error ? err.message : String(err));
1363
+ process8.exit(1);
1364
+ }
1365
+ });
1366
+ }
1367
+ function runInfo(presetName, opts) {
1368
+ const available = listAvailable();
1369
+ if (!available.includes(presetName)) {
1370
+ logger.error(
1371
+ `Preset "${presetName}" not found. Available: ${available.join(", ")}`
1372
+ );
1373
+ process8.exit(1);
1374
+ }
1375
+ const preset = load(presetName);
1376
+ const { manifest } = preset;
1377
+ const agents = manifest.files.filter((f) => f.type === "agent").map((f) => f.source);
1378
+ const skills = manifest.files.filter((f) => f.type === "skill").map((f) => f.source);
1379
+ const commands = manifest.files.filter((f) => f.type === "command").map((f) => f.source);
1380
+ const workflows = manifest.files.filter((f) => f.type === "workflow").map((f) => f.source);
1381
+ const hooks = manifest.files.filter((f) => f.type === "hook").map((f) => f.source);
1382
+ const mcpServers = Object.keys(manifest.mcpServers ?? {});
1383
+ const info = {
1384
+ name: manifest.name,
1385
+ version: manifest.version,
1386
+ description: manifest.description,
1387
+ category: manifest.category,
1388
+ files: manifest.files.map((f) => ({ source: f.source, target: f.target, type: f.type })),
1389
+ mcpServers,
1390
+ hooks,
1391
+ agents,
1392
+ skills,
1393
+ commands,
1394
+ workflows
1395
+ };
1396
+ if (opts.json) {
1397
+ process8.stdout.write(JSON.stringify(info, null, 2) + "\n");
1398
+ return;
1399
+ }
1400
+ process8.stdout.write(`
1401
+ ${color.bold(manifest.name)} v${manifest.version}
1402
+ `);
1403
+ process8.stdout.write(`${manifest.description}
1404
+
1405
+ `);
1406
+ process8.stdout.write(`${color.dim("Category:")} ${manifest.category}
1407
+ `);
1408
+ process8.stdout.write(`${color.dim("Total files:")} ${manifest.files.length}
1409
+
1410
+ `);
1411
+ if (mcpServers.length > 0) {
1412
+ process8.stdout.write(`${color.bold("MCP Servers")} (${mcpServers.length}):
1413
+ `);
1414
+ for (const s of mcpServers) {
1415
+ process8.stdout.write(` - ${s}
1416
+ `);
1417
+ }
1418
+ process8.stdout.write("\n");
1419
+ }
1420
+ if (agents.length > 0) {
1421
+ process8.stdout.write(`${color.bold("Agents")} (${agents.length}):
1422
+ `);
1423
+ for (const a of agents) {
1424
+ process8.stdout.write(` - ${a}
1425
+ `);
1426
+ }
1427
+ process8.stdout.write("\n");
1428
+ }
1429
+ if (skills.length > 0) {
1430
+ process8.stdout.write(`${color.bold("Skills")} (${skills.length}):
1431
+ `);
1432
+ for (const s of skills) {
1433
+ process8.stdout.write(` - ${s}
1434
+ `);
1435
+ }
1436
+ process8.stdout.write("\n");
1437
+ }
1438
+ if (commands.length > 0) {
1439
+ process8.stdout.write(`${color.bold("Commands")} (${commands.length}):
1440
+ `);
1441
+ for (const c of commands) {
1442
+ process8.stdout.write(` - ${c}
1443
+ `);
1444
+ }
1445
+ process8.stdout.write("\n");
1446
+ }
1447
+ if (workflows.length > 0) {
1448
+ process8.stdout.write(`${color.bold("Workflows")} (${workflows.length}):
1449
+ `);
1450
+ for (const w of workflows) {
1451
+ process8.stdout.write(` - ${w}
1452
+ `);
1453
+ }
1454
+ process8.stdout.write("\n");
1455
+ }
1456
+ if (hooks.length > 0) {
1457
+ process8.stdout.write(`${color.bold("Hooks")} (${hooks.length}):
1458
+ `);
1459
+ for (const h of hooks) {
1460
+ process8.stdout.write(` - ${h}
1461
+ `);
1462
+ }
1463
+ process8.stdout.write("\n");
1464
+ }
1465
+ process8.stdout.write(`${color.bold("File Targets")}:
1466
+ `);
1467
+ for (const f of manifest.files) {
1468
+ process8.stdout.write(` ${color.dim(f.type.padEnd(12))} ${f.target}
1469
+ `);
1470
+ }
1471
+ }
1472
+
1473
+ // src/commands/update.ts
1474
+ import fs12 from "fs";
1475
+ import path11 from "path";
1476
+ import process9 from "process";
1477
+ import crypto5 from "crypto";
1478
+ function sha2564(data) {
1479
+ return crypto5.createHash("sha256").update(data).digest("hex");
1480
+ }
1481
+ function generateTimestamp4() {
1482
+ const now = /* @__PURE__ */ new Date();
1483
+ const y = now.getFullYear();
1484
+ const mo = String(now.getMonth() + 1).padStart(2, "0");
1485
+ const d = String(now.getDate()).padStart(2, "0");
1486
+ const h = String(now.getHours()).padStart(2, "0");
1487
+ const mi = String(now.getMinutes()).padStart(2, "0");
1488
+ const s = String(now.getSeconds()).padStart(2, "0");
1489
+ const ms = String(now.getMilliseconds()).padStart(3, "0");
1490
+ return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;
1491
+ }
1492
+ function getKitVersion3() {
1493
+ try {
1494
+ const pkgPath = new URL("../../package.json", import.meta.url);
1495
+ const pkg2 = JSON.parse(fs12.readFileSync(pkgPath, "utf-8"));
1496
+ return pkg2.version;
1497
+ } catch {
1498
+ return "0.1.0";
1499
+ }
1500
+ }
1501
+ async function conflictPrompt3(target) {
1502
+ if (!process9.stdin.isTTY) return "skip";
1503
+ const { default: readline2 } = await import("readline");
1504
+ const relTarget = path11.relative(process9.cwd(), target);
1505
+ process9.stdout.write(
1506
+ `
1507
+ ${color.yellow("?")} File ${color.bold(relTarget)} has changed in the new version.
1508
+ ${color.cyan(">")} overwrite - Replace with new version (backup saved)
1509
+ skip - Keep current file
1510
+ view diff - Show unified diff and ask again
1511
+ overwrite all - Replace all remaining changed files
1512
+ `
1513
+ );
1514
+ return new Promise((resolve2) => {
1515
+ const rl = readline2.createInterface({ input: process9.stdin, output: process9.stdout });
1516
+ rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {
1517
+ rl.close();
1518
+ const a = answer.trim().toLowerCase();
1519
+ if (a === "o" || a === "overwrite") resolve2("overwrite");
1520
+ else if (a === "s" || a === "skip") resolve2("skip");
1521
+ else if (a === "d" || a === "diff" || a === "view diff") resolve2("view-diff");
1522
+ else if (a === "a" || a === "all" || a === "overwrite all") resolve2("overwrite-all");
1523
+ else resolve2("skip");
1524
+ });
1525
+ });
1526
+ }
1527
+ function registerUpdateCommand(program2) {
1528
+ program2.command("update").description("Update installed presets to latest bundled version").option("-y, --yes", "Skip confirmation, auto-skip conflicts").option("--force", "Overwrite all changed files (with backup)").option("--skip-existing", "Skip all changed files").action(async (opts) => {
1529
+ try {
1530
+ await runUpdate(opts);
1531
+ } catch (err) {
1532
+ logger.error(err instanceof Error ? err.message : String(err));
1533
+ process9.exit(1);
1534
+ }
1535
+ });
1536
+ }
1537
+ async function runUpdate(opts) {
1538
+ const workspaceRoot = process9.cwd();
1539
+ const tracking = read(workspaceRoot);
1540
+ if (!tracking || tracking.presets.length === 0) {
1541
+ logger.info("No presets installed. Nothing to update.");
1542
+ process9.exit(0);
1543
+ }
1544
+ let mode = "interactive";
1545
+ if (opts.force) mode = "force";
1546
+ else if (opts.skipExisting) mode = "skip-existing";
1547
+ else if (opts.yes) mode = "skip-existing";
1548
+ const sessionState = { overwriteAll: false };
1549
+ const timestamp = generateTimestamp4();
1550
+ let totalUpdated = 0;
1551
+ let totalSkipped = 0;
1552
+ for (const trackedPreset of tracking.presets) {
1553
+ let bundled;
1554
+ try {
1555
+ bundled = load(trackedPreset.name);
1556
+ } catch {
1557
+ logger.warn(`Preset "${trackedPreset.name}" not found in bundled presets. Skipping.`);
1558
+ continue;
1559
+ }
1560
+ const bundledVersion = bundled.manifest.version;
1561
+ if (bundledVersion === trackedPreset.version) {
1562
+ logger.debug(`Preset "${trackedPreset.name}" is up to date (v${bundledVersion}).`);
1563
+ continue;
1564
+ }
1565
+ logger.info(
1566
+ `Updating ${color.bold(trackedPreset.name)}: v${trackedPreset.version} -> v${bundledVersion}`
1567
+ );
1568
+ const presetDir = bundled.dir;
1569
+ const updatedFiles = [];
1570
+ for (const fileEntry of bundled.manifest.files) {
1571
+ if (["mcp", "settings", "statusline"].includes(fileEntry.type)) continue;
1572
+ const sourcePath = path11.join(presetDir, fileEntry.source);
1573
+ const targetPath = path11.resolve(workspaceRoot, fileEntry.target);
1574
+ if (!safePathInside(workspaceRoot, fileEntry.target)) continue;
1575
+ if (!fs12.existsSync(sourcePath)) continue;
1576
+ const sourceContent = fs12.readFileSync(sourcePath);
1577
+ const newHash = sha2564(sourceContent);
1578
+ const trackedFile = trackedPreset.files.find((f) => f.target === fileEntry.target);
1579
+ if (trackedFile && trackedFile.contentHash === newHash) {
1580
+ continue;
1581
+ }
1582
+ const action = await resolve({
1583
+ target: targetPath,
1584
+ sourceContent,
1585
+ mode,
1586
+ sessionState,
1587
+ prompt: conflictPrompt3,
1588
+ showDiff: (t, s) => showDiff(t, s)
1589
+ });
1590
+ switch (action) {
1591
+ case "WRITE_NEW":
1592
+ fs12.mkdirSync(path11.dirname(targetPath), { recursive: true });
1593
+ atomicWrite(targetPath, sourceContent.toString("utf-8"));
1594
+ if (fileEntry.executable && process9.platform !== "win32") {
1595
+ try {
1596
+ fs12.chmodSync(targetPath, 493);
1597
+ } catch {
1598
+ }
1599
+ }
1600
+ totalUpdated++;
1601
+ break;
1602
+ case "OVERWRITE_WITH_BACKUP":
1603
+ backup(workspaceRoot, targetPath, timestamp);
1604
+ atomicWrite(targetPath, sourceContent.toString("utf-8"));
1605
+ if (fileEntry.executable && process9.platform !== "win32") {
1606
+ try {
1607
+ fs12.chmodSync(targetPath, 493);
1608
+ } catch {
1609
+ }
1610
+ }
1611
+ totalUpdated++;
1612
+ break;
1613
+ case "SKIP":
1614
+ totalSkipped++;
1615
+ break;
1616
+ case "NO_OP":
1617
+ break;
1618
+ }
1619
+ updatedFiles.push({
1620
+ target: fileEntry.target,
1621
+ sourcePreset: bundled.manifest.name,
1622
+ contentHash: newHash,
1623
+ installedAt: (/* @__PURE__ */ new Date()).toISOString()
1624
+ });
1625
+ }
1626
+ trackedPreset.version = bundledVersion;
1627
+ trackedPreset.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
1628
+ for (const uf of updatedFiles) {
1629
+ const idx = trackedPreset.files.findIndex((f) => f.target === uf.target);
1630
+ if (idx >= 0) {
1631
+ trackedPreset.files[idx] = uf;
1632
+ } else {
1633
+ trackedPreset.files.push(uf);
1634
+ }
1635
+ }
1636
+ }
1637
+ tracking.kitVersion = getKitVersion3();
1638
+ tracking.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
1639
+ write(workspaceRoot, tracking);
1640
+ if (totalUpdated === 0 && totalSkipped === 0) {
1641
+ logger.success("All presets are up to date.");
1642
+ } else {
1643
+ logger.success(`Update complete: ${totalUpdated} files updated, ${totalSkipped} skipped.`);
1644
+ }
1645
+ }
1646
+
1647
+ // src/commands/restore.ts
1648
+ import process10 from "process";
1649
+ function registerRestoreCommand(program2) {
1650
+ program2.command("restore").description("Restore files from backup").option("--timestamp <ts>", "Restore from specific backup timestamp").option("--list", "List available backup timestamps").action((opts) => {
1651
+ try {
1652
+ runRestore(opts);
1653
+ } catch (err) {
1654
+ logger.error(err instanceof Error ? err.message : String(err));
1655
+ process10.exit(1);
1656
+ }
1657
+ });
1658
+ }
1659
+ function runRestore(opts) {
1660
+ const workspaceRoot = process10.cwd();
1661
+ if (opts.list) {
1662
+ const timestamps2 = listTimestamps(workspaceRoot);
1663
+ if (timestamps2.length === 0) {
1664
+ logger.info("No backups available.");
1665
+ process10.exit(0);
1666
+ }
1667
+ process10.stdout.write(`${color.bold("Available backups")}:
1668
+ `);
1669
+ for (const ts of timestamps2) {
1670
+ process10.stdout.write(` ${ts}
1671
+ `);
1672
+ }
1673
+ process10.exit(0);
1674
+ }
1675
+ const timestamps = listTimestamps(workspaceRoot);
1676
+ if (timestamps.length === 0) {
1677
+ logger.error("No backups found. Nothing to restore.");
1678
+ process10.exit(1);
1679
+ }
1680
+ const restored = restore(workspaceRoot, opts.timestamp);
1681
+ if (restored.length === 0) {
1682
+ logger.info("No files to restore from backup.");
1683
+ process10.exit(0);
1684
+ }
1685
+ process10.stdout.write(`${color.bold("Restored files")}:
1686
+ `);
1687
+ for (const file of restored) {
1688
+ process10.stdout.write(` ${color.green("+")} ${file}
1689
+ `);
1690
+ }
1691
+ logger.success(`Restored ${restored.length} files.`);
1692
+ }
1693
+
1694
+ // src/commands/doctor.ts
1695
+ import fs13 from "fs";
1696
+ import path12 from "path";
1697
+ import process11 from "process";
1698
+ function registerDoctorCommand(program2) {
1699
+ program2.command("doctor").description("Run workspace health checks").option("--fix", "Auto-fix fixable issues").action((opts) => {
1700
+ try {
1701
+ runDoctor(opts);
1702
+ } catch (err) {
1703
+ logger.error(err instanceof Error ? err.message : String(err));
1704
+ process11.exit(1);
1705
+ }
1706
+ });
1707
+ }
1708
+ function runDoctor(opts) {
1709
+ const workspaceRoot = process11.cwd();
1710
+ const checks = [];
1711
+ checks.push(checkNodeVersion());
1712
+ checks.push(checkKiroDir(workspaceRoot));
1713
+ checks.push(checkMcpJson(workspaceRoot));
1714
+ checks.push(checkTracking(workspaceRoot));
1715
+ checks.push(checkTrackedFiles(workspaceRoot));
1716
+ checks.push(checkSteeringFrontMatter(workspaceRoot));
1717
+ checks.push(checkMetadataJson(workspaceRoot));
1718
+ checks.push(checkStatuslineExecBit(workspaceRoot));
1719
+ let hasFail = false;
1720
+ for (const check of checks) {
1721
+ const tag = formatTag(check.result);
1722
+ process11.stdout.write(`${tag} ${check.message}
1723
+ `);
1724
+ if (check.result === "FAIL") hasFail = true;
1725
+ if (opts.fix && check.fixable && check.fixAction) {
1726
+ check.fixAction();
1727
+ process11.stdout.write(` ${color.green("Fixed!")}
1728
+ `);
1729
+ }
1730
+ }
1731
+ process11.exit(hasFail ? 1 : 0);
1732
+ }
1733
+ function formatTag(result) {
1734
+ switch (result) {
1735
+ case "PASS":
1736
+ return color.green("[PASS]");
1737
+ case "FAIL":
1738
+ return color.red("[FAIL]");
1739
+ case "WARN":
1740
+ return color.yellow("[WARN]");
1741
+ }
1742
+ }
1743
+ function checkNodeVersion() {
1744
+ const major2 = parseInt(process11.versions.node.split(".")[0], 10);
1745
+ if (major2 >= 18) {
1746
+ return {
1747
+ name: "node-version",
1748
+ result: "PASS",
1749
+ message: `Node.js version >= 18 (${process11.version})`
1750
+ };
1751
+ }
1752
+ return {
1753
+ name: "node-version",
1754
+ result: "FAIL",
1755
+ message: `Node.js version >= 18 required (current: ${process11.version})`
1756
+ };
1757
+ }
1758
+ function checkKiroDir(workspaceRoot) {
1759
+ const kiroDir = path12.join(workspaceRoot, ".kiro");
1760
+ if (fs13.existsSync(kiroDir) && fs13.statSync(kiroDir).isDirectory()) {
1761
+ return { name: "kiro-dir", result: "PASS", message: ".kiro/ directory exists" };
1762
+ }
1763
+ return {
1764
+ name: "kiro-dir",
1765
+ result: "FAIL",
1766
+ message: ".kiro/ directory not found. Run `kiro-kit init` to create it."
1767
+ };
1768
+ }
1769
+ function checkMcpJson(workspaceRoot) {
1770
+ const mcpPath = path12.join(workspaceRoot, ".kiro/settings/mcp.json");
1771
+ if (!fs13.existsSync(mcpPath)) {
1772
+ return { name: "mcp-json", result: "WARN", message: ".kiro/settings/mcp.json not found (optional)" };
1773
+ }
1774
+ try {
1775
+ const content = fs13.readFileSync(mcpPath, "utf-8");
1776
+ JSON.parse(content);
1777
+ return { name: "mcp-json", result: "PASS", message: ".kiro/settings/mcp.json is valid JSON" };
1778
+ } catch {
1779
+ return {
1780
+ name: "mcp-json",
1781
+ result: "FAIL",
1782
+ message: ".kiro/settings/mcp.json is not valid JSON",
1783
+ fixable: true,
1784
+ fixAction: () => {
1785
+ const mcpPath2 = path12.join(workspaceRoot, ".kiro/settings/mcp.json");
1786
+ fs13.writeFileSync(mcpPath2, '{\n "mcpServers": {}\n}\n', "utf-8");
1787
+ }
1788
+ };
1789
+ }
1790
+ }
1791
+ function checkTracking(workspaceRoot) {
1792
+ const trackingPath = path12.join(workspaceRoot, ".kiro/.kiro-kit.json");
1793
+ if (!fs13.existsSync(trackingPath)) {
1794
+ return { name: "tracking", result: "WARN", message: ".kiro/.kiro-kit.json not found (no presets installed)" };
1795
+ }
1796
+ try {
1797
+ const content = fs13.readFileSync(trackingPath, "utf-8");
1798
+ JSON.parse(content);
1799
+ return { name: "tracking", result: "PASS", message: ".kiro/.kiro-kit.json is valid" };
1800
+ } catch {
1801
+ return {
1802
+ name: "tracking",
1803
+ result: "FAIL",
1804
+ message: ".kiro/.kiro-kit.json is corrupt (invalid JSON)"
1805
+ };
1806
+ }
1807
+ }
1808
+ function checkTrackedFiles(workspaceRoot) {
1809
+ let tracking;
1810
+ try {
1811
+ tracking = read(workspaceRoot);
1812
+ } catch {
1813
+ return { name: "tracked-files", result: "WARN", message: "Cannot read tracking file, skipping file check" };
1814
+ }
1815
+ if (!tracking || tracking.presets.length === 0) {
1816
+ return { name: "tracked-files", result: "PASS", message: "No tracked files to verify" };
1817
+ }
1818
+ const missing = [];
1819
+ for (const preset of tracking.presets) {
1820
+ for (const file of preset.files) {
1821
+ const fullPath = path12.resolve(workspaceRoot, file.target);
1822
+ if (!fs13.existsSync(fullPath)) {
1823
+ missing.push(file.target);
1824
+ }
1825
+ }
1826
+ }
1827
+ if (missing.length === 0) {
1828
+ return { name: "tracked-files", result: "PASS", message: "All tracked files exist on disk" };
1829
+ }
1830
+ return {
1831
+ name: "tracked-files",
1832
+ result: "FAIL",
1833
+ message: `${missing.length} tracked file(s) missing: ${missing.slice(0, 3).join(", ")}${missing.length > 3 ? "..." : ""}`
1834
+ };
1835
+ }
1836
+ function checkSteeringFrontMatter(workspaceRoot) {
1837
+ const steeringDir = path12.join(workspaceRoot, ".kiro/steering");
1838
+ if (!fs13.existsSync(steeringDir)) {
1839
+ return { name: "steering-fm", result: "PASS", message: "No steering files to check" };
1840
+ }
1841
+ const issues = [];
1842
+ const walkDir = (dir) => {
1843
+ let entries;
1844
+ try {
1845
+ entries = fs13.readdirSync(dir, { withFileTypes: true });
1846
+ } catch {
1847
+ return;
1848
+ }
1849
+ for (const entry of entries) {
1850
+ const fullPath = path12.join(dir, entry.name);
1851
+ if (entry.isDirectory()) {
1852
+ walkDir(fullPath);
1853
+ } else if (entry.isFile() && entry.name.endsWith(".md")) {
1854
+ checkSingleSteering(fullPath, issues);
1855
+ }
1856
+ }
1857
+ };
1858
+ walkDir(steeringDir);
1859
+ if (issues.length === 0) {
1860
+ return { name: "steering-fm", result: "PASS", message: "Steering front-matter has no trailing whitespace" };
1861
+ }
1862
+ return {
1863
+ name: "steering-fm",
1864
+ result: "WARN",
1865
+ message: `${issues.length} steering file(s) have trailing whitespace in front-matter`,
1866
+ fixable: true,
1867
+ fixAction: () => {
1868
+ fixSteeringWhitespace(steeringDir);
1869
+ }
1870
+ };
1871
+ }
1872
+ function checkSingleSteering(filePath, issues) {
1873
+ try {
1874
+ const content = fs13.readFileSync(filePath, "utf-8");
1875
+ const lines = content.split("\n");
1876
+ if (lines[0]?.trim() !== "---") return;
1877
+ let endIdx = -1;
1878
+ for (let i = 1; i < lines.length; i++) {
1879
+ if (lines[i]?.trim() === "---") {
1880
+ endIdx = i;
1881
+ break;
1882
+ }
1883
+ }
1884
+ if (endIdx === -1) return;
1885
+ for (let i = 1; i < endIdx; i++) {
1886
+ if (lines[i] !== lines[i].trimEnd()) {
1887
+ issues.push(filePath);
1888
+ return;
1889
+ }
1890
+ }
1891
+ } catch {
1892
+ }
1893
+ }
1894
+ function fixSteeringWhitespace(steeringDir) {
1895
+ const walkAndFix = (dir) => {
1896
+ let entries;
1897
+ try {
1898
+ entries = fs13.readdirSync(dir, { withFileTypes: true });
1899
+ } catch {
1900
+ return;
1901
+ }
1902
+ for (const entry of entries) {
1903
+ const fullPath = path12.join(dir, entry.name);
1904
+ if (entry.isDirectory()) {
1905
+ walkAndFix(fullPath);
1906
+ } else if (entry.isFile() && entry.name.endsWith(".md")) {
1907
+ const content = fs13.readFileSync(fullPath, "utf-8");
1908
+ const lines = content.split("\n");
1909
+ if (lines[0]?.trim() !== "---") continue;
1910
+ let endIdx = -1;
1911
+ for (let i = 1; i < lines.length; i++) {
1912
+ if (lines[i]?.trim() === "---") {
1913
+ endIdx = i;
1914
+ break;
1915
+ }
1916
+ }
1917
+ if (endIdx === -1) continue;
1918
+ let changed = false;
1919
+ for (let i = 1; i < endIdx; i++) {
1920
+ const trimmed = lines[i].trimEnd();
1921
+ if (lines[i] !== trimmed) {
1922
+ lines[i] = trimmed;
1923
+ changed = true;
1924
+ }
1925
+ }
1926
+ if (changed) {
1927
+ fs13.writeFileSync(fullPath, lines.join("\n"), "utf-8");
1928
+ }
1929
+ }
1930
+ }
1931
+ };
1932
+ walkAndFix(steeringDir);
1933
+ }
1934
+ function checkMetadataJson(workspaceRoot) {
1935
+ const metaPath = path12.join(workspaceRoot, ".kiro/metadata.json");
1936
+ if (!fs13.existsSync(metaPath)) {
1937
+ return { name: "metadata-json", result: "WARN", message: ".kiro/metadata.json not found (optional)" };
1938
+ }
1939
+ try {
1940
+ const content = fs13.readFileSync(metaPath, "utf-8");
1941
+ const parsed = JSON.parse(content);
1942
+ if (!parsed.version || !parsed.name) {
1943
+ return { name: "metadata-json", result: "FAIL", message: ".kiro/metadata.json missing required fields (version, name)" };
1944
+ }
1945
+ return { name: "metadata-json", result: "PASS", message: ".kiro/metadata.json is valid" };
1946
+ } catch {
1947
+ return { name: "metadata-json", result: "FAIL", message: ".kiro/metadata.json is not valid JSON" };
1948
+ }
1949
+ }
1950
+ function checkStatuslineExecBit(workspaceRoot) {
1951
+ if (process11.platform === "win32") {
1952
+ return { name: "statusline-exec", result: "PASS", message: "Statusline exec bit check (skipped on Windows)" };
1953
+ }
1954
+ const shPath = path12.join(workspaceRoot, ".kiro/statusline.sh");
1955
+ if (!fs13.existsSync(shPath)) {
1956
+ return { name: "statusline-exec", result: "PASS", message: "No statusline.sh to check" };
1957
+ }
1958
+ try {
1959
+ const stat = fs13.statSync(shPath);
1960
+ const isExecutable = (stat.mode & 73) !== 0;
1961
+ if (isExecutable) {
1962
+ return { name: "statusline-exec", result: "PASS", message: "statusline.sh is executable" };
1963
+ }
1964
+ return {
1965
+ name: "statusline-exec",
1966
+ result: "WARN",
1967
+ message: "statusline.sh is not executable",
1968
+ fixable: true,
1969
+ fixAction: () => {
1970
+ fs13.chmodSync(shPath, 493);
1971
+ }
1972
+ };
1973
+ } catch {
1974
+ return { name: "statusline-exec", result: "WARN", message: "Cannot check statusline.sh permissions" };
1975
+ }
1976
+ }
1977
+
1978
+ // src/commands/telemetry.ts
1979
+ import fs14 from "fs";
1980
+ import path13 from "path";
1981
+ import os2 from "os";
1982
+ import process12 from "process";
1983
+ var CONFIG_DIR = path13.join(os2.homedir(), ".kiro-kit");
1984
+ var CONFIG_FILE = path13.join(CONFIG_DIR, "config.json");
1985
+ function readConfig() {
1986
+ try {
1987
+ if (fs14.existsSync(CONFIG_FILE)) {
1988
+ return JSON.parse(fs14.readFileSync(CONFIG_FILE, "utf-8"));
1989
+ }
1990
+ } catch {
1991
+ }
1992
+ return { telemetry: false };
1993
+ }
1994
+ function writeConfig(config) {
1995
+ fs14.mkdirSync(CONFIG_DIR, { recursive: true });
1996
+ fs14.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
1997
+ }
1998
+ function registerTelemetryCommand(program2) {
1999
+ const telemetry = program2.command("telemetry").description("Manage anonymous usage telemetry");
2000
+ telemetry.command("enable").description("Opt in to anonymous telemetry").action(() => {
2001
+ try {
2002
+ const config = readConfig();
2003
+ config.telemetry = true;
2004
+ writeConfig(config);
2005
+ logger.success("Telemetry enabled. Anonymous usage data will be collected.");
2006
+ } catch (err) {
2007
+ logger.error(err instanceof Error ? err.message : String(err));
2008
+ process12.exit(1);
2009
+ }
2010
+ });
2011
+ telemetry.command("disable").description("Opt out of telemetry").action(() => {
2012
+ try {
2013
+ const config = readConfig();
2014
+ config.telemetry = false;
2015
+ writeConfig(config);
2016
+ logger.success("Telemetry disabled. No data will be collected.");
2017
+ } catch (err) {
2018
+ logger.error(err instanceof Error ? err.message : String(err));
2019
+ process12.exit(1);
2020
+ }
2021
+ });
2022
+ telemetry.command("status").description("Show current telemetry status").action(() => {
2023
+ try {
2024
+ const config = readConfig();
2025
+ const status = config.telemetry ? color.green("enabled") : color.yellow("disabled");
2026
+ process12.stdout.write(`Telemetry: ${status}
2027
+ `);
2028
+ process12.stdout.write(`Config: ${CONFIG_FILE}
2029
+ `);
2030
+ } catch (err) {
2031
+ logger.error(err instanceof Error ? err.message : String(err));
2032
+ process12.exit(1);
2033
+ }
2034
+ });
2035
+ }
2036
+
2037
+ // src/index.ts
2038
+ var major = parseInt(process13.versions.node.split(".")[0], 10);
2039
+ if (major < 18) {
2040
+ process13.stderr.write(
2041
+ `[KK001] kiro-kit requires Node.js >= 18. Current version: ${process13.version}. Please upgrade Node.js.
2042
+ `
2043
+ );
2044
+ process13.exit(1);
2045
+ }
2046
+ var require2 = createRequire(import.meta.url);
2047
+ var pkg = require2("../package.json");
2048
+ var program = new Command();
2049
+ program.name("kiro-kit").description("CLI tool for bootstrapping engineer-grade Kiro IDE workspaces.").version(pkg.version, "-v, --version");
2050
+ program.option("--verbose", "Enable verbose output");
2051
+ program.option("--quiet", "Suppress non-essential output");
2052
+ program.option("--no-color", "Disable colored output");
2053
+ registerInitCommand(program);
2054
+ registerAddCommand(program);
2055
+ registerListCommand(program);
2056
+ registerInfoCommand(program);
2057
+ registerUpdateCommand(program);
2058
+ registerRestoreCommand(program);
2059
+ registerDoctorCommand(program);
2060
+ registerTelemetryCommand(program);
2061
+ program.hook("preAction", (thisCommand) => {
2062
+ const opts = thisCommand.opts();
2063
+ if (opts["verbose"]) setVerbose(true);
2064
+ if (opts["quiet"]) setQuiet(true);
2065
+ });
2066
+ program.parse(process13.argv);
2067
+ //# sourceMappingURL=index.js.map