thanh-kit 2.5.0 → 2.5.2

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 (886) hide show
  1. package/dist/index.js +20 -61
  2. package/dist/index.js.map +1 -1
  3. package/package.json +1 -1
  4. package/templates/.ck.json +60 -0
  5. package/templates/.ckignore +27 -0
  6. package/templates/.mcp.json.example +23 -0
  7. package/templates/agents/brainstormer.md +18 -2
  8. package/templates/agents/code-reviewer.md +122 -142
  9. package/templates/agents/code-simplifier.md +50 -100
  10. package/templates/agents/debugger.md +27 -11
  11. package/templates/agents/docs-manager.md +100 -38
  12. package/templates/agents/fullstack-developer.md +15 -3
  13. package/templates/agents/git-manager.md +11 -386
  14. package/templates/agents/journal-writer.md +13 -8
  15. package/templates/agents/mcp-manager.md +21 -6
  16. package/templates/agents/planner.md +24 -8
  17. package/templates/agents/project-manager.md +17 -121
  18. package/templates/agents/researcher.md +22 -7
  19. package/templates/agents/tester.md +23 -7
  20. package/templates/agents/ui-ux-designer.md +23 -14
  21. package/templates/{commands → command-archive}/ask.md +5 -5
  22. package/templates/{commands → command-archive}/ck-help.md +18 -2
  23. package/templates/command-archive/docs/init.md +38 -0
  24. package/templates/command-archive/docs/summarize.md +22 -0
  25. package/templates/command-archive/docs/update.md +76 -0
  26. package/templates/command-archive/journal.md +18 -0
  27. package/templates/{commands → command-archive}/kanban.md +5 -7
  28. package/templates/{commands → command-archive}/plan/archive.md +2 -2
  29. package/templates/command-archive/plan/red-team.md +200 -0
  30. package/templates/command-archive/plan/validate.md +188 -0
  31. package/templates/command-archive/preview.md +283 -0
  32. package/templates/command-archive/review/codebase/parallel.md +122 -0
  33. package/templates/{commands → command-archive}/test/ui.md +3 -3
  34. package/templates/{commands → command-archive}/use-mcp.md +6 -2
  35. package/templates/command-archive/worktree.md +109 -0
  36. package/templates/hooks/__tests__/ck-config-utils.test.cjs +557 -0
  37. package/templates/hooks/__tests__/descriptive-name.test.cjs +292 -0
  38. package/templates/hooks/__tests__/dev-rules-reminder.test.cjs +336 -0
  39. package/templates/hooks/__tests__/integration/path-resolution.test.cjs +319 -0
  40. package/templates/hooks/__tests__/privacy-block.test.cjs +273 -0
  41. package/templates/hooks/__tests__/session-init.test.cjs +308 -0
  42. package/templates/hooks/__tests__/skill-dedup.test.cjs +527 -0
  43. package/templates/hooks/__tests__/subagent-init.test.cjs +622 -0
  44. package/templates/hooks/__tests__/task-completed-handler.test.cjs +246 -0
  45. package/templates/hooks/__tests__/team-context-inject.test.cjs +804 -0
  46. package/templates/hooks/__tests__/teammate-idle-handler.test.cjs +254 -0
  47. package/templates/hooks/cook-after-plan-reminder.cjs +72 -0
  48. package/templates/hooks/descriptive-name.cjs +47 -0
  49. package/templates/hooks/dev-rules-reminder.cjs +37 -214
  50. package/templates/hooks/lib/__tests__/README.md +240 -0
  51. package/templates/hooks/lib/__tests__/ck-config-utils.test.cjs +613 -1
  52. package/templates/hooks/lib/__tests__/context-builder.test.cjs +468 -0
  53. package/templates/hooks/lib/__tests__/project-detector.test.cjs +754 -0
  54. package/templates/hooks/lib/__tests__/statusline-integration.test.cjs +678 -0
  55. package/templates/hooks/lib/__tests__/statusline.test.cjs +689 -0
  56. package/templates/hooks/lib/ck-config-utils.cjs +146 -21
  57. package/templates/hooks/lib/colors.cjs +95 -0
  58. package/templates/hooks/lib/config-counter.cjs +103 -0
  59. package/templates/hooks/lib/context-builder.cjs +616 -0
  60. package/templates/hooks/lib/git-info-cache.cjs +143 -0
  61. package/templates/hooks/lib/hook-logger.cjs +92 -0
  62. package/templates/hooks/lib/privacy-checker.cjs +297 -0
  63. package/templates/hooks/lib/project-detector.cjs +474 -0
  64. package/templates/hooks/lib/scout-checker.cjs +263 -0
  65. package/templates/hooks/lib/transcript-parser.cjs +181 -0
  66. package/templates/hooks/notifications/discord_notify.sh +17 -4
  67. package/templates/hooks/notifications/docs/discord-hook-setup.md +26 -10
  68. package/templates/hooks/notifications/docs/telegram-hook-setup.md +24 -6
  69. package/templates/hooks/notifications/notify.cjs +0 -0
  70. package/templates/hooks/notifications/send-discord.sh +0 -0
  71. package/templates/hooks/notifications/telegram_notify.sh +17 -4
  72. package/templates/hooks/post-edit-simplify-reminder.cjs +156 -0
  73. package/templates/hooks/privacy-block.cjs +97 -188
  74. package/templates/hooks/scout-block/broad-pattern-detector.cjs +4 -6
  75. package/templates/hooks/scout-block/error-formatter.cjs +0 -0
  76. package/templates/hooks/scout-block/path-extractor.cjs +102 -13
  77. package/templates/hooks/scout-block/pattern-matcher.cjs +16 -1
  78. package/templates/hooks/scout-block/tests/{test-broad-pattern-detector.js → test-broad-pattern-detector.cjs} +1 -61
  79. package/templates/hooks/scout-block/tests/{test-build-command-allowlist.js → test-build-command-allowlist.cjs} +1 -1
  80. package/templates/hooks/scout-block/tests/{test-error-formatter.js → test-error-formatter.cjs} +1 -1
  81. package/templates/hooks/scout-block/tests/{test-full-flow-edge-cases.js → test-full-flow-edge-cases.cjs} +1 -1
  82. package/templates/hooks/scout-block/tests/{test-monorepo-scenarios.js → test-monorepo-scenarios.cjs} +1 -1
  83. package/templates/hooks/scout-block/tests/{test-path-extractor.js → test-path-extractor.cjs} +1 -1
  84. package/templates/hooks/scout-block/tests/{test-pattern-matcher.js → test-pattern-matcher.cjs} +1 -1
  85. package/templates/hooks/scout-block.cjs +100 -87
  86. package/templates/hooks/session-init.cjs +197 -330
  87. package/templates/hooks/skill-dedup.cjs +268 -0
  88. package/templates/hooks/subagent-init.cjs +75 -22
  89. package/templates/hooks/task-completed-handler.cjs +118 -0
  90. package/templates/hooks/team-context-inject.cjs +176 -0
  91. package/templates/hooks/teammate-idle-handler.cjs +121 -0
  92. package/templates/hooks/tests/scout-block/broad-pattern-detector.test.cjs +231 -0
  93. package/templates/hooks/tests/scout-block/fixtures/ckignore-custom.txt +6 -0
  94. package/templates/hooks/tests/scout-block/fixtures/ckignore-default.txt +13 -0
  95. package/templates/hooks/tests/scout-block/fixtures/ckignore-negation.txt +8 -0
  96. package/templates/hooks/tests/scout-block/path-extractor.test.cjs +527 -0
  97. package/templates/hooks/tests/scout-block/pattern-matcher.test.cjs +293 -0
  98. package/templates/hooks/tests/scout-block/scout-checker.test.cjs +741 -0
  99. package/templates/hooks/tests/{test-ckignore.js → test-ckignore.cjs} +0 -0
  100. package/templates/hooks/tests/{test-modularization-hook.js → test-modularization-hook.cjs} +0 -0
  101. package/templates/hooks/tests/{test-privacy-block.js → test-privacy-block.cjs} +1 -1
  102. package/templates/hooks/tests/test-scout-block.cjs +315 -0
  103. package/templates/hooks/usage-context-awareness.cjs +179 -0
  104. package/templates/metadata.json +104 -0
  105. package/templates/{workflows → rules}/development-rules.md +12 -53
  106. package/templates/rules/orchestration-protocol.md +43 -0
  107. package/templates/{workflows → rules}/primary-workflow.md +16 -4
  108. package/templates/rules/team-coordination-rules.md +90 -0
  109. package/templates/schemas/ck-config.schema.json +381 -0
  110. package/templates/scripts/README.md +94 -198
  111. package/templates/scripts/ck-help.py +19 -855
  112. package/templates/scripts/commands_data.yaml +3 -621
  113. package/templates/scripts/fix-shebang-permissions.sh +50 -0
  114. package/templates/scripts/generate_catalogs.py +37 -8
  115. package/templates/scripts/resolve_env.py +0 -0
  116. package/templates/scripts/scan_commands.py +14 -96
  117. package/templates/scripts/scan_skills.py +59 -19
  118. package/templates/scripts/set-active-plan.cjs +8 -3
  119. package/templates/scripts/skills_data.yaml +2 -596
  120. package/templates/scripts/test-ck-help.py +15 -0
  121. package/templates/scripts/test_ck_help.py +139 -0
  122. package/templates/scripts/test_ck_help_integration.py +72 -0
  123. package/templates/scripts/validate-docs.cjs +342 -0
  124. package/templates/scripts/win_compat.py +0 -0
  125. package/templates/scripts/worktree.cjs +4 -652
  126. package/templates/scripts/worktree.test.cjs +5 -330
  127. package/templates/settings.json +104 -239
  128. package/templates/skills/README.md +95 -255
  129. package/templates/skills/THIRD_PARTY_NOTICES.md +405 -0
  130. package/templates/skills/agent-browser/SKILL.md +294 -0
  131. package/templates/skills/agent-browser/references/.gitkeep +0 -0
  132. package/templates/skills/agent-browser/references/agent-browser-vs-chrome-devtools.md +112 -0
  133. package/templates/skills/agent-browser/references/browserbase-cloud-setup.md +161 -0
  134. package/templates/skills/ai-artist/SKILL.md +103 -56
  135. package/templates/skills/ai-artist/data/awesome-prompts.csv +3592 -0
  136. package/templates/skills/ai-artist/data/lighting.csv +19 -0
  137. package/templates/skills/ai-artist/data/nano-banana-templates.csv +17 -0
  138. package/templates/skills/ai-artist/data/platforms.csv +11 -0
  139. package/templates/skills/ai-artist/data/styles.csv +26 -0
  140. package/templates/skills/ai-artist/data/techniques.csv +19 -0
  141. package/templates/skills/ai-artist/data/use-cases.csv +16 -0
  142. package/templates/skills/ai-artist/references/awesome-nano-banana-pro-prompts.md +8575 -0
  143. package/templates/skills/ai-artist/references/nano-banana.md +78 -1
  144. package/templates/skills/ai-artist/references/validation-workflow.md +117 -0
  145. package/templates/skills/ai-artist/scripts/core.py +197 -0
  146. package/templates/skills/ai-artist/scripts/extract_prompts.py +102 -0
  147. package/templates/skills/ai-artist/scripts/generate.py +370 -0
  148. package/templates/skills/ai-artist/scripts/search.py +147 -0
  149. package/templates/skills/ai-multimodal/SKILL.md +4 -3
  150. package/templates/skills/ai-multimodal/scripts/check_setup.py +12 -2
  151. package/templates/skills/ai-multimodal/scripts/document_converter.py +0 -0
  152. package/templates/skills/ai-multimodal/scripts/gemini_batch_process.py +3 -2
  153. package/templates/skills/ai-multimodal/scripts/media_optimizer.py +0 -0
  154. package/templates/skills/ask/SKILL.md +58 -0
  155. package/templates/skills/backend-development/SKILL.md +3 -2
  156. package/templates/skills/better-auth/SKILL.md +3 -2
  157. package/templates/skills/better-auth/scripts/better_auth_init.py +3 -3
  158. package/templates/skills/bootstrap/SKILL.md +101 -0
  159. package/templates/skills/bootstrap/references/shared-phases.md +59 -0
  160. package/templates/skills/bootstrap/references/workflow-auto.md +52 -0
  161. package/templates/skills/bootstrap/references/workflow-fast.md +50 -0
  162. package/templates/skills/bootstrap/references/workflow-full.md +60 -0
  163. package/templates/skills/bootstrap/references/workflow-parallel.md +59 -0
  164. package/templates/{commands/brainstorm.md → skills/brainstorm/SKILL.md} +21 -18
  165. package/templates/skills/chrome-devtools/SKILL.md +221 -68
  166. package/templates/skills/chrome-devtools/scripts/README.md +18 -0
  167. package/templates/skills/chrome-devtools/scripts/__tests__/error-handling.test.js +102 -0
  168. package/templates/skills/chrome-devtools/scripts/aria-snapshot.js +2 -1
  169. package/templates/skills/chrome-devtools/scripts/click.js +2 -1
  170. package/templates/skills/chrome-devtools/scripts/connect-chrome.js +146 -0
  171. package/templates/skills/chrome-devtools/scripts/console.js +3 -1
  172. package/templates/skills/chrome-devtools/scripts/evaluate.js +6 -3
  173. package/templates/skills/chrome-devtools/scripts/fill.js +2 -1
  174. package/templates/skills/chrome-devtools/scripts/import-cookies.js +205 -0
  175. package/templates/skills/chrome-devtools/scripts/inject-auth.js +2 -1
  176. package/templates/skills/chrome-devtools/scripts/install-deps.sh +0 -0
  177. package/templates/skills/chrome-devtools/scripts/install.sh +0 -0
  178. package/templates/skills/chrome-devtools/scripts/lib/browser.js +60 -4
  179. package/templates/skills/chrome-devtools/scripts/navigate.js +86 -2
  180. package/templates/skills/chrome-devtools/scripts/network.js +3 -1
  181. package/templates/skills/chrome-devtools/scripts/performance.js +3 -1
  182. package/templates/skills/chrome-devtools/scripts/screenshot.js +2 -1
  183. package/templates/skills/chrome-devtools/scripts/select-ref.js +2 -1
  184. package/templates/skills/chrome-devtools/scripts/snapshot.js +2 -1
  185. package/templates/skills/chrome-devtools/scripts/ws-debug.js +44 -0
  186. package/templates/skills/chrome-devtools/scripts/ws-full-debug.js +107 -0
  187. package/templates/skills/ck-help/SKILL.md +102 -0
  188. package/templates/skills/ck-help/scripts/ck-help.py +1321 -0
  189. package/templates/skills/ck-help/scripts/commands_data.yaml +3 -0
  190. package/templates/skills/ck-help/scripts/skills_data.yaml +593 -0
  191. package/templates/skills/code-review/SKILL.md +97 -93
  192. package/templates/skills/code-review/references/code-review-reception.md +113 -209
  193. package/templates/skills/code-review/references/codebase-scan-workflow.md +29 -0
  194. package/templates/skills/code-review/references/edge-case-scouting.md +119 -0
  195. package/templates/skills/code-review/references/parallel-review-workflow.md +69 -0
  196. package/templates/skills/code-review/references/requesting-code-review.md +115 -104
  197. package/templates/skills/code-review/references/task-management-reviews.md +140 -0
  198. package/templates/skills/code-review/references/verification-before-completion.md +138 -138
  199. package/templates/skills/coding-level/SKILL.md +56 -0
  200. package/templates/skills/common/README.md +120 -0
  201. package/templates/skills/common/api_key_helper.py +411 -0
  202. package/templates/skills/common/api_key_rotator.py +248 -0
  203. package/templates/skills/context-engineering/SKILL.md +108 -0
  204. package/templates/skills/context-engineering/references/context-compression.md +84 -0
  205. package/templates/skills/context-engineering/references/context-degradation.md +93 -0
  206. package/templates/skills/context-engineering/references/context-fundamentals.md +75 -0
  207. package/templates/skills/context-engineering/references/context-optimization.md +82 -0
  208. package/templates/skills/context-engineering/references/evaluation.md +89 -0
  209. package/templates/skills/context-engineering/references/memory-systems.md +88 -0
  210. package/templates/skills/context-engineering/references/multi-agent-patterns.md +90 -0
  211. package/templates/skills/context-engineering/references/project-development.md +97 -0
  212. package/templates/skills/context-engineering/references/runtime-awareness.md +202 -0
  213. package/templates/skills/context-engineering/references/tool-design.md +86 -0
  214. package/templates/skills/context-engineering/scripts/compression_evaluator.py +349 -0
  215. package/templates/skills/context-engineering/scripts/context_analyzer.py +317 -0
  216. package/templates/skills/context-engineering/scripts/tests/test_edge_cases.py +246 -0
  217. package/templates/skills/cook/README.md +86 -0
  218. package/templates/skills/cook/SKILL.md +113 -0
  219. package/templates/skills/cook/references/intent-detection.md +101 -0
  220. package/templates/skills/cook/references/review-cycle.md +75 -0
  221. package/templates/skills/cook/references/subagent-patterns.md +75 -0
  222. package/templates/skills/cook/references/workflow-steps.md +172 -0
  223. package/templates/skills/copywriting/SKILL.md +94 -0
  224. package/templates/skills/copywriting/references/copy-formulas.md +150 -0
  225. package/templates/skills/copywriting/references/cta-patterns.md +168 -0
  226. package/templates/skills/copywriting/references/email-copy.md +193 -0
  227. package/templates/skills/copywriting/references/headline-templates.md +140 -0
  228. package/templates/skills/copywriting/references/landing-page-copy.md +175 -0
  229. package/templates/skills/copywriting/references/power-words.md +189 -0
  230. package/templates/skills/copywriting/references/social-media-copy.md +222 -0
  231. package/templates/skills/copywriting/references/workflow-cro.md +83 -0
  232. package/templates/skills/copywriting/references/workflow-enhance.md +32 -0
  233. package/templates/skills/copywriting/references/workflow-fast.md +29 -0
  234. package/templates/skills/copywriting/references/workflow-good.md +39 -0
  235. package/templates/skills/copywriting/references/writing-styles.md +247 -0
  236. package/templates/skills/copywriting/scripts/extract-writing-styles.py +308 -0
  237. package/templates/skills/copywriting/templates/copy-brief.md +49 -0
  238. package/templates/skills/databases/SKILL.md +7 -155
  239. package/templates/skills/databases/analytics.md +198 -0
  240. package/templates/skills/databases/db-design.md +188 -0
  241. package/templates/skills/databases/incremental-etl.md +213 -0
  242. package/templates/skills/databases/scripts/db_backup.py +0 -0
  243. package/templates/skills/databases/scripts/db_migrate.py +3 -2
  244. package/templates/skills/databases/scripts/db_performance_check.py +3 -2
  245. package/templates/skills/databases/stacks/bigquery.md +231 -0
  246. package/templates/skills/databases/stacks/d1_cloudflare.md +137 -0
  247. package/templates/skills/databases/stacks/mysql.md +216 -0
  248. package/templates/skills/databases/stacks/postgres.md +235 -0
  249. package/templates/skills/databases/stacks/sqlite.md +244 -0
  250. package/templates/skills/databases/transactional.md +176 -0
  251. package/templates/skills/debug/SKILL.md +121 -0
  252. package/templates/skills/debug/references/frontend-verification.md +103 -0
  253. package/templates/skills/debug/references/investigation-methodology.md +101 -0
  254. package/templates/skills/debug/references/log-and-ci-analysis.md +97 -0
  255. package/templates/skills/debug/references/performance-diagnostics.md +113 -0
  256. package/templates/skills/debug/references/reporting-standards.md +122 -0
  257. package/templates/skills/debug/references/task-management-debugging.md +155 -0
  258. package/templates/skills/devops/SKILL.md +65 -253
  259. package/templates/skills/devops/references/kubernetes-basics.md +99 -0
  260. package/templates/skills/devops/references/kubernetes-helm-advanced.md +75 -0
  261. package/templates/skills/devops/references/kubernetes-helm.md +81 -0
  262. package/templates/skills/devops/references/kubernetes-kubectl.md +74 -0
  263. package/templates/skills/devops/references/kubernetes-security-advanced.md +98 -0
  264. package/templates/skills/devops/references/kubernetes-security.md +95 -0
  265. package/templates/skills/devops/references/kubernetes-troubleshooting-advanced.md +74 -0
  266. package/templates/skills/devops/references/kubernetes-troubleshooting.md +49 -0
  267. package/templates/skills/devops/references/kubernetes-workflows-advanced.md +75 -0
  268. package/templates/skills/devops/references/kubernetes-workflows.md +78 -0
  269. package/templates/skills/devops/scripts/cloudflare_deploy.py +0 -0
  270. package/templates/skills/devops/scripts/docker_optimize.py +3 -2
  271. package/templates/skills/docs/SKILL.md +55 -0
  272. package/templates/skills/docs/references/init-workflow.md +32 -0
  273. package/templates/skills/docs/references/summarize-workflow.md +18 -0
  274. package/templates/skills/docs/references/update-workflow.md +59 -0
  275. package/templates/skills/docs-seeker/SKILL.md +3 -2
  276. package/templates/skills/docs-seeker/scripts/analyze-llms-txt.js +0 -0
  277. package/templates/skills/docs-seeker/scripts/detect-topic.js +0 -0
  278. package/templates/skills/docs-seeker/scripts/fetch-docs.js +0 -0
  279. package/templates/skills/docs-seeker/scripts/tests/run-tests.js +0 -0
  280. package/templates/skills/docs-seeker/scripts/tests/test-analyze-llms.js +0 -0
  281. package/templates/skills/docs-seeker/scripts/tests/test-detect-topic.js +0 -0
  282. package/templates/skills/docs-seeker/scripts/tests/test-fetch-docs.js +0 -0
  283. package/templates/skills/docs-seeker/scripts/utils/env-loader.js +0 -0
  284. package/templates/skills/document-skills/docx/SKILL.md +2 -2
  285. package/templates/skills/document-skills/docx/ooxml/scripts/pack.py +0 -0
  286. package/templates/skills/document-skills/docx/ooxml/scripts/unpack.py +0 -0
  287. package/templates/skills/document-skills/docx/ooxml/scripts/validate.py +0 -0
  288. package/templates/skills/document-skills/docx/scripts/document.py +0 -0
  289. package/templates/skills/document-skills/docx/scripts/utilities.py +0 -0
  290. package/templates/skills/document-skills/pdf/SKILL.md +2 -2
  291. package/templates/skills/document-skills/pptx/SKILL.md +2 -2
  292. package/templates/skills/document-skills/pptx/ooxml/scripts/pack.py +0 -0
  293. package/templates/skills/document-skills/pptx/ooxml/scripts/unpack.py +0 -0
  294. package/templates/skills/document-skills/pptx/ooxml/scripts/validate.py +0 -0
  295. package/templates/skills/document-skills/pptx/scripts/inventory.py +0 -0
  296. package/templates/skills/document-skills/pptx/scripts/rearrange.py +0 -0
  297. package/templates/skills/document-skills/pptx/scripts/replace.py +0 -0
  298. package/templates/skills/document-skills/pptx/scripts/thumbnail.py +0 -0
  299. package/templates/skills/document-skills/xlsx/SKILL.md +2 -2
  300. package/templates/skills/document-skills/xlsx/recalc.py +3 -2
  301. package/templates/skills/find-skills/SKILL.md +134 -0
  302. package/templates/skills/fix/SKILL.md +111 -0
  303. package/templates/skills/fix/references/complexity-assessment.md +72 -0
  304. package/templates/skills/fix/references/mode-selection.md +46 -0
  305. package/templates/skills/fix/references/parallel-exploration.md +100 -0
  306. package/templates/skills/fix/references/review-cycle.md +77 -0
  307. package/templates/skills/fix/references/skill-activation-matrix.md +78 -0
  308. package/templates/skills/fix/references/task-orchestration.md +103 -0
  309. package/templates/skills/fix/references/workflow-ci.md +28 -0
  310. package/templates/skills/fix/references/workflow-deep.md +122 -0
  311. package/templates/skills/fix/references/workflow-logs.md +72 -0
  312. package/templates/skills/fix/references/workflow-quick.md +59 -0
  313. package/templates/skills/fix/references/workflow-standard.md +111 -0
  314. package/templates/skills/fix/references/workflow-test.md +75 -0
  315. package/templates/skills/fix/references/workflow-types.md +33 -0
  316. package/templates/skills/fix/references/workflow-ui.md +75 -0
  317. package/templates/skills/frontend-design/SKILL.md +78 -91
  318. package/templates/skills/frontend-design/references/ai-multimodal-overview.md +6 -6
  319. package/templates/skills/frontend-design/references/animejs.md +395 -395
  320. package/templates/skills/frontend-design/references/asset-generation.md +4 -4
  321. package/templates/skills/frontend-design/references/visual-analysis-overview.md +1 -1
  322. package/templates/skills/frontend-design/references/workflow-3d.md +102 -0
  323. package/templates/skills/frontend-design/references/workflow-describe.md +87 -0
  324. package/templates/skills/frontend-design/references/workflow-immersive.md +87 -0
  325. package/templates/skills/frontend-design/references/workflow-quick.md +57 -0
  326. package/templates/skills/frontend-design/references/workflow-screenshot.md +63 -0
  327. package/templates/skills/frontend-design/references/workflow-video.md +74 -0
  328. package/templates/skills/frontend-development/SKILL.md +4 -3
  329. package/templates/skills/git/SKILL.md +114 -0
  330. package/templates/skills/git/references/branch-management.md +88 -0
  331. package/templates/skills/git/references/commit-standards.md +46 -0
  332. package/templates/skills/git/references/gh-cli-guide.md +109 -0
  333. package/templates/skills/git/references/safety-protocols.md +69 -0
  334. package/templates/skills/git/references/workflow-commit.md +58 -0
  335. package/templates/skills/git/references/workflow-merge.md +48 -0
  336. package/templates/skills/git/references/workflow-pr.md +58 -0
  337. package/templates/skills/git/references/workflow-push.md +52 -0
  338. package/templates/skills/gkg/SKILL.md +91 -0
  339. package/templates/skills/gkg/references/cli-commands.md +106 -0
  340. package/templates/skills/gkg/references/http-api.md +102 -0
  341. package/templates/skills/gkg/references/language-support.md +57 -0
  342. package/templates/skills/gkg/references/mcp-tools.md +99 -0
  343. package/templates/skills/google-adk-python/SKILL.md +91 -195
  344. package/templates/skills/google-adk-python/references/agent-types-and-architecture.md +128 -0
  345. package/templates/skills/google-adk-python/references/callbacks-plugins-observability.md +117 -0
  346. package/templates/skills/google-adk-python/references/deployment-cloud-run-vertex-gke.md +138 -0
  347. package/templates/skills/google-adk-python/references/evaluation-testing-cli.md +112 -0
  348. package/templates/skills/google-adk-python/references/multi-agent-and-a2a-protocol.md +145 -0
  349. package/templates/skills/google-adk-python/references/sessions-state-memory-artifacts.md +131 -0
  350. package/templates/skills/google-adk-python/references/tools-and-mcp-integration.md +146 -0
  351. package/templates/skills/install.ps1 +130 -26
  352. package/templates/skills/install.sh +383 -63
  353. package/templates/{commands/journal.md → skills/journal/SKILL.md} +5 -1
  354. package/templates/skills/kanban/SKILL.md +99 -0
  355. package/templates/skills/markdown-novel-viewer/SKILL.md +314 -0
  356. package/templates/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
  357. package/templates/skills/markdown-novel-viewer/assets/favicon.png +0 -0
  358. package/templates/skills/markdown-novel-viewer/assets/novel-theme.css +16 -0
  359. package/templates/skills/markdown-novel-viewer/assets/reader.js +838 -0
  360. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-base.css +54 -0
  361. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-components.css +180 -0
  362. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-content.css +176 -0
  363. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-header.css +217 -0
  364. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-mermaid.css +153 -0
  365. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-overlays.css +202 -0
  366. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-responsive.css +285 -0
  367. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-sidebar.css +359 -0
  368. package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-variables.css +56 -0
  369. package/templates/skills/markdown-novel-viewer/assets/template.html +149 -0
  370. package/templates/skills/markdown-novel-viewer/bun.lock +38 -0
  371. package/templates/skills/markdown-novel-viewer/package.json +15 -0
  372. package/templates/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
  373. package/templates/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
  374. package/templates/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +571 -0
  375. package/templates/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
  376. package/templates/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
  377. package/templates/skills/markdown-novel-viewer/scripts/server.cjs +411 -0
  378. package/templates/skills/markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
  379. package/templates/skills/markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
  380. package/templates/skills/markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
  381. package/templates/skills/markdown-novel-viewer/tests/http-server.test.cjs +271 -0
  382. package/templates/skills/markdown-novel-viewer/tests/run-tests.cjs +51 -0
  383. package/templates/skills/markdown-novel-viewer/tests/test-framework.cjs +154 -0
  384. package/templates/skills/markdown-novel-viewer/tests/verify-xss.cjs +90 -0
  385. package/templates/skills/mcp-builder/SKILL.md +3 -2
  386. package/templates/skills/mcp-builder/scripts/evaluation.py +9 -1
  387. package/templates/skills/mcp-management/SKILL.md +8 -7
  388. package/templates/skills/mcp-management/references/gemini-cli-integration.md +16 -10
  389. package/templates/skills/mcp-management/scripts/cli.ts +0 -0
  390. package/templates/skills/mcp-management/scripts/dist/analyze-tools.js +0 -0
  391. package/templates/skills/mcp-management/scripts/dist/cli.js +0 -0
  392. package/templates/skills/mcp-management/scripts/dist/mcp-client.js +0 -0
  393. package/templates/skills/mcp-management/scripts/mcp-client.ts +0 -0
  394. package/templates/skills/media-processing/SKILL.md +3 -2
  395. package/templates/skills/media-processing/scripts/batch-remove-background.sh +0 -0
  396. package/templates/skills/media-processing/scripts/batch_resize.py +0 -0
  397. package/templates/skills/media-processing/scripts/media_convert.py +0 -0
  398. package/templates/skills/media-processing/scripts/remove-background.sh +0 -0
  399. package/templates/skills/media-processing/scripts/remove-bg-node.js +0 -0
  400. package/templates/skills/media-processing/scripts/tests/test_batch_resize.py +0 -0
  401. package/templates/skills/media-processing/scripts/tests/test_media_convert.py +0 -0
  402. package/templates/skills/media-processing/scripts/tests/test_video_optimize.py +0 -0
  403. package/templates/skills/media-processing/scripts/video_optimize.py +0 -0
  404. package/templates/skills/mermaidjs-v11/SKILL.md +116 -0
  405. package/templates/skills/mermaidjs-v11/references/cli-usage.md +228 -0
  406. package/templates/skills/mermaidjs-v11/references/configuration.md +232 -0
  407. package/templates/skills/mermaidjs-v11/references/diagram-types.md +315 -0
  408. package/templates/skills/mermaidjs-v11/references/examples.md +344 -0
  409. package/templates/skills/mermaidjs-v11/references/integration.md +310 -0
  410. package/templates/skills/mintlify/SKILL.md +121 -0
  411. package/templates/skills/mintlify/references/ai-features-and-integrations-reference.md +756 -0
  412. package/templates/skills/mintlify/references/api-documentation-components-reference.md +873 -0
  413. package/templates/skills/mintlify/references/deployment-and-continuous-integration-reference.md +674 -0
  414. package/templates/skills/mintlify/references/docs-json-configuration-reference.md +724 -0
  415. package/templates/skills/mintlify/references/mdx-components-reference.md +551 -0
  416. package/templates/skills/mintlify/references/navigation-structure-and-organization-reference.md +775 -0
  417. package/templates/skills/mobile-development/SKILL.md +3 -2
  418. package/templates/skills/payment-integration/README.md +44 -12
  419. package/templates/skills/payment-integration/SKILL.md +82 -97
  420. package/templates/skills/payment-integration/references/creem/api.md +139 -0
  421. package/templates/skills/payment-integration/references/creem/checkouts.md +99 -0
  422. package/templates/skills/payment-integration/references/creem/licensing.md +136 -0
  423. package/templates/skills/payment-integration/references/creem/overview.md +65 -0
  424. package/templates/skills/payment-integration/references/creem/sdk.md +161 -0
  425. package/templates/skills/payment-integration/references/creem/subscriptions.md +129 -0
  426. package/templates/skills/payment-integration/references/creem/webhooks.md +120 -0
  427. package/templates/skills/payment-integration/references/implementation-workflows.md +43 -0
  428. package/templates/skills/payment-integration/references/multi-provider-order-management-patterns.md +821 -0
  429. package/templates/skills/payment-integration/references/paddle/api.md +116 -0
  430. package/templates/skills/payment-integration/references/paddle/best-practices.md +130 -0
  431. package/templates/skills/payment-integration/references/paddle/overview.md +57 -0
  432. package/templates/skills/payment-integration/references/paddle/paddle-js.md +106 -0
  433. package/templates/skills/payment-integration/references/paddle/sdk.md +131 -0
  434. package/templates/skills/payment-integration/references/paddle/subscriptions.md +118 -0
  435. package/templates/skills/payment-integration/references/paddle/webhooks.md +112 -0
  436. package/templates/skills/payment-integration/references/polar/best-practices.md +781 -361
  437. package/templates/skills/payment-integration/references/sepay/best-practices.md +870 -268
  438. package/templates/skills/payment-integration/references/stripe/stripe-best-practices.md +32 -0
  439. package/templates/skills/payment-integration/references/stripe/stripe-cli.md +148 -0
  440. package/templates/skills/payment-integration/references/stripe/stripe-js.md +116 -0
  441. package/templates/skills/payment-integration/references/stripe/stripe-sdks.md +84 -0
  442. package/templates/skills/payment-integration/references/stripe/stripe-upgrade.md +175 -0
  443. package/templates/skills/payment-integration/scripts/checkout-helper.js +0 -0
  444. package/templates/skills/payment-integration/scripts/polar-webhook-verify.js +0 -0
  445. package/templates/skills/payment-integration/scripts/sepay-webhook-verify.js +0 -0
  446. package/templates/skills/payment-integration/scripts/test-scripts.js +0 -0
  447. package/templates/skills/plan/SKILL.md +137 -0
  448. package/templates/skills/plan/references/archive-workflow.md +53 -0
  449. package/templates/skills/{planning → plan}/references/codebase-understanding.md +1 -1
  450. package/templates/skills/{planning → plan}/references/output-standards.md +15 -1
  451. package/templates/skills/{planning → plan}/references/plan-organization.md +12 -19
  452. package/templates/skills/plan/references/red-team-personas.md +69 -0
  453. package/templates/skills/plan/references/red-team-workflow.md +77 -0
  454. package/templates/skills/{planning → plan}/references/research-phase.md +2 -2
  455. package/templates/skills/plan/references/task-management.md +132 -0
  456. package/templates/skills/plan/references/validate-question-framework.md +80 -0
  457. package/templates/skills/plan/references/validate-workflow.md +65 -0
  458. package/templates/skills/plan/references/workflow-modes.md +145 -0
  459. package/templates/skills/plans-kanban/SKILL.md +167 -0
  460. package/templates/skills/plans-kanban/assets/dashboard-template.html +119 -0
  461. package/templates/skills/plans-kanban/assets/dashboard.css +1594 -0
  462. package/templates/skills/plans-kanban/assets/dashboard.js +596 -0
  463. package/templates/skills/plans-kanban/assets/favicon.png +0 -0
  464. package/templates/skills/plans-kanban/package.json +13 -0
  465. package/templates/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +884 -0
  466. package/templates/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
  467. package/templates/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
  468. package/templates/skills/plans-kanban/scripts/lib/plan-parser.cjs +175 -0
  469. package/templates/skills/plans-kanban/scripts/lib/plan-scanner.cjs +272 -0
  470. package/templates/skills/plans-kanban/scripts/lib/port-finder.cjs +48 -0
  471. package/templates/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
  472. package/templates/skills/plans-kanban/scripts/server.cjs +260 -0
  473. package/templates/skills/preview/SKILL.md +75 -0
  474. package/templates/skills/preview/references/generation-modes.md +95 -0
  475. package/templates/skills/preview/references/view-mode.md +42 -0
  476. package/templates/skills/problem-solving/SKILL.md +3 -2
  477. package/templates/skills/project-management/SKILL.md +122 -0
  478. package/templates/skills/project-management/references/documentation-triggers.md +60 -0
  479. package/templates/skills/project-management/references/hydration-workflow.md +85 -0
  480. package/templates/skills/project-management/references/progress-tracking.md +96 -0
  481. package/templates/skills/project-management/references/reporting-patterns.md +94 -0
  482. package/templates/skills/project-management/references/task-operations.md +85 -0
  483. package/templates/skills/react-best-practices/AGENTS.md +2249 -0
  484. package/templates/skills/react-best-practices/README.md +123 -0
  485. package/templates/skills/react-best-practices/SKILL.md +122 -0
  486. package/templates/skills/react-best-practices/metadata.json +15 -0
  487. package/templates/skills/react-best-practices/rules/_sections.md +46 -0
  488. package/templates/skills/react-best-practices/rules/_template.md +28 -0
  489. package/templates/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  490. package/templates/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  491. package/templates/skills/react-best-practices/rules/async-api-routes.md +38 -0
  492. package/templates/skills/react-best-practices/rules/async-defer-await.md +80 -0
  493. package/templates/skills/react-best-practices/rules/async-dependencies.md +36 -0
  494. package/templates/skills/react-best-practices/rules/async-parallel.md +28 -0
  495. package/templates/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  496. package/templates/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  497. package/templates/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  498. package/templates/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  499. package/templates/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  500. package/templates/skills/react-best-practices/rules/bundle-preload.md +50 -0
  501. package/templates/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  502. package/templates/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  503. package/templates/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  504. package/templates/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  505. package/templates/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  506. package/templates/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  507. package/templates/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  508. package/templates/skills/react-best-practices/rules/js-early-exit.md +50 -0
  509. package/templates/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  510. package/templates/skills/react-best-practices/rules/js-index-maps.md +37 -0
  511. package/templates/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  512. package/templates/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  513. package/templates/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  514. package/templates/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  515. package/templates/skills/react-best-practices/rules/rendering-activity.md +26 -0
  516. package/templates/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  517. package/templates/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  518. package/templates/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  519. package/templates/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  520. package/templates/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  521. package/templates/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  522. package/templates/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  523. package/templates/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  524. package/templates/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  525. package/templates/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  526. package/templates/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  527. package/templates/skills/react-best-practices/rules/rerender-memo.md +44 -0
  528. package/templates/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  529. package/templates/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  530. package/templates/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  531. package/templates/skills/react-best-practices/rules/server-cache-react.md +26 -0
  532. package/templates/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  533. package/templates/skills/react-best-practices/rules/server-serialization.md +38 -0
  534. package/templates/skills/remotion/SKILL.md +44 -0
  535. package/templates/skills/remotion/rules/3d.md +86 -0
  536. package/templates/skills/remotion/rules/animations.md +29 -0
  537. package/templates/skills/remotion/rules/assets/charts-bar-chart.tsx +173 -0
  538. package/templates/skills/remotion/rules/assets/text-animations-typewriter.tsx +100 -0
  539. package/templates/skills/remotion/rules/assets/text-animations-word-highlight.tsx +108 -0
  540. package/templates/skills/remotion/rules/assets.md +78 -0
  541. package/templates/skills/remotion/rules/audio.md +172 -0
  542. package/templates/skills/remotion/rules/calculate-metadata.md +104 -0
  543. package/templates/skills/remotion/rules/can-decode.md +75 -0
  544. package/templates/skills/remotion/rules/charts.md +58 -0
  545. package/templates/skills/remotion/rules/compositions.md +146 -0
  546. package/templates/skills/remotion/rules/display-captions.md +126 -0
  547. package/templates/skills/remotion/rules/extract-frames.md +229 -0
  548. package/templates/skills/remotion/rules/fonts.md +152 -0
  549. package/templates/skills/remotion/rules/get-audio-duration.md +58 -0
  550. package/templates/skills/remotion/rules/get-video-dimensions.md +68 -0
  551. package/templates/skills/remotion/rules/get-video-duration.md +58 -0
  552. package/templates/skills/remotion/rules/gifs.md +138 -0
  553. package/templates/skills/remotion/rules/images.md +130 -0
  554. package/templates/skills/remotion/rules/import-srt-captions.md +67 -0
  555. package/templates/skills/remotion/rules/lottie.md +68 -0
  556. package/templates/skills/remotion/rules/measuring-dom-nodes.md +35 -0
  557. package/templates/skills/remotion/rules/measuring-text.md +143 -0
  558. package/templates/skills/remotion/rules/sequencing.md +106 -0
  559. package/templates/skills/remotion/rules/tailwind.md +11 -0
  560. package/templates/skills/remotion/rules/text-animations.md +20 -0
  561. package/templates/skills/remotion/rules/timing.md +179 -0
  562. package/templates/skills/remotion/rules/transcribe-captions.md +19 -0
  563. package/templates/skills/remotion/rules/transitions.md +122 -0
  564. package/templates/skills/remotion/rules/trimming.md +53 -0
  565. package/templates/skills/remotion/rules/videos.md +171 -0
  566. package/templates/skills/repomix/SKILL.md +3 -2
  567. package/templates/skills/repomix/scripts/repomix_batch.py +0 -0
  568. package/templates/skills/research/SKILL.md +9 -6
  569. package/templates/skills/scout/SKILL.md +89 -0
  570. package/templates/skills/scout/references/external-scouting.md +140 -0
  571. package/templates/skills/scout/references/internal-scouting.md +119 -0
  572. package/templates/skills/scout/references/task-management-scouting.md +125 -0
  573. package/templates/skills/sequential-thinking/SKILL.md +3 -2
  574. package/templates/skills/sequential-thinking/scripts/format-thought.js +0 -0
  575. package/templates/skills/sequential-thinking/scripts/process-thought.js +0 -0
  576. package/templates/skills/shader/SKILL.md +113 -0
  577. package/templates/skills/shader/references/glsl-cellular-voronoi-worley-noise-patterns.md +142 -0
  578. package/templates/skills/shader/references/glsl-colors-rgb-hsb-gradients-mixing-color-spaces.md +143 -0
  579. package/templates/skills/shader/references/glsl-fbm-fractional-brownian-motion-turbulence-octaves.md +146 -0
  580. package/templates/skills/shader/references/glsl-fundamentals-data-types-vectors-precision-coordinates.md +104 -0
  581. package/templates/skills/shader/references/glsl-noise-random-perlin-simplex-cellular-voronoi.md +115 -0
  582. package/templates/skills/shader/references/glsl-pattern-symmetry-truchet-domain-warping.md +134 -0
  583. package/templates/skills/shader/references/glsl-patterns-tiling-fract-matrices-transformations.md +133 -0
  584. package/templates/skills/shader/references/glsl-procedural-textures-clouds-marble-wood-terrain.md +144 -0
  585. package/templates/skills/shader/references/glsl-shader-builtin-functions-complete-api-reference.md +112 -0
  586. package/templates/skills/shader/references/glsl-shapes-polygon-star-polar-sdf-combinations.md +124 -0
  587. package/templates/skills/shader/references/glsl-shapes-sdf-circles-rectangles-polar-distance-fields.md +106 -0
  588. package/templates/skills/shader/references/glsl-shaping-functions-step-smoothstep-curves-interpolation.md +141 -0
  589. package/templates/skills/shopify/SKILL.md +3 -2
  590. package/templates/skills/shopify/scripts/shopify_init.py +5 -5
  591. package/templates/skills/skill-creator/SKILL.md +91 -238
  592. package/templates/skills/skill-creator/references/benchmark-optimization-guide.md +86 -0
  593. package/templates/skills/skill-creator/references/distribution-guide.md +79 -0
  594. package/templates/skills/skill-creator/references/mcp-skills-integration.md +71 -0
  595. package/templates/skills/skill-creator/references/metadata-quality-criteria.md +76 -0
  596. package/templates/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -0
  597. package/templates/skills/skill-creator/references/plugin-marketplace-overview.md +89 -0
  598. package/templates/skills/skill-creator/references/plugin-marketplace-schema.md +93 -0
  599. package/templates/skills/skill-creator/references/plugin-marketplace-sources.md +103 -0
  600. package/templates/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -0
  601. package/templates/skills/skill-creator/references/script-quality-criteria.md +106 -0
  602. package/templates/skills/skill-creator/references/skill-anatomy-and-requirements.md +76 -0
  603. package/templates/skills/skill-creator/references/skill-creation-workflow.md +95 -0
  604. package/templates/skills/skill-creator/references/skill-design-patterns.md +75 -0
  605. package/templates/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -0
  606. package/templates/skills/skill-creator/references/structure-organization-criteria.md +114 -0
  607. package/templates/skills/skill-creator/references/testing-and-iteration.md +78 -0
  608. package/templates/skills/skill-creator/references/token-efficiency-criteria.md +74 -0
  609. package/templates/skills/skill-creator/references/troubleshooting-guide.md +80 -0
  610. package/templates/skills/skill-creator/references/validation-checklist.md +83 -0
  611. package/templates/skills/skill-creator/references/writing-effective-instructions.md +88 -0
  612. package/templates/skills/skill-creator/references/yaml-frontmatter-reference.md +91 -0
  613. package/templates/skills/skill-creator/scripts/debug.zip +0 -0
  614. package/templates/skills/skill-creator/scripts/encoding_utils.py +36 -0
  615. package/templates/skills/skill-creator/scripts/init_skill.py +9 -4
  616. package/templates/skills/skill-creator/scripts/package_skill.py +5 -0
  617. package/templates/skills/skill-creator/scripts/quick_validate.py +6 -2
  618. package/templates/skills/tanstack/SKILL.md +141 -0
  619. package/templates/skills/tanstack/references/tanstack-ai.md +97 -0
  620. package/templates/skills/tanstack/references/tanstack-form.md +125 -0
  621. package/templates/skills/tanstack/references/tanstack-start.md +100 -0
  622. package/templates/skills/team/SKILL.md +285 -0
  623. package/templates/skills/team/references/agent-teams-controls-and-modes.md +107 -0
  624. package/templates/skills/team/references/agent-teams-examples-and-best-practices.md +182 -0
  625. package/templates/skills/team/references/agent-teams-official-docs.md +175 -0
  626. package/templates/skills/template-skill/SKILL.md +1 -1
  627. package/templates/skills/test/SKILL.md +109 -0
  628. package/templates/skills/test/references/report-format.md +58 -0
  629. package/templates/skills/test/references/test-execution-workflow.md +103 -0
  630. package/templates/skills/test/references/ui-testing-workflow.md +65 -0
  631. package/templates/skills/threejs/SKILL.md +106 -53
  632. package/templates/skills/threejs/data/api-reference.csv +61 -0
  633. package/templates/skills/threejs/data/categories.csv +14 -0
  634. package/templates/skills/threejs/data/examples-all.csv +557 -0
  635. package/templates/skills/threejs/data/use-cases.csv +21 -0
  636. package/templates/skills/threejs/references/00-fundamentals.md +487 -0
  637. package/templates/skills/threejs/references/11-materials-advanced.md +1 -1
  638. package/templates/skills/threejs/references/11-materials.md +519 -0
  639. package/templates/skills/threejs/references/17-shader.md +641 -0
  640. package/templates/skills/threejs/references/18-geometry.md +547 -0
  641. package/templates/skills/threejs/scripts/core.py +236 -0
  642. package/templates/skills/threejs/scripts/extract_examples.py +688 -0
  643. package/templates/skills/threejs/scripts/generate_csv_from_json.py +135 -0
  644. package/templates/skills/threejs/scripts/search.py +77 -0
  645. package/templates/skills/ui-styling/SKILL.md +3 -2
  646. package/templates/skills/ui-styling/scripts/shadcn_add.py +0 -0
  647. package/templates/skills/ui-styling/scripts/tailwind_config_gen.py +1 -1
  648. package/templates/skills/ui-ux-pro-max/SKILL.md +69 -32
  649. package/templates/skills/ui-ux-pro-max/data/charts.csv +25 -25
  650. package/templates/skills/ui-ux-pro-max/data/colors.csv +96 -96
  651. package/templates/skills/ui-ux-pro-max/data/landing.csv +30 -30
  652. package/templates/skills/ui-ux-pro-max/data/products.csv +96 -96
  653. package/templates/skills/ui-ux-pro-max/data/prompts.csv +20 -20
  654. package/templates/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  655. package/templates/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  656. package/templates/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  657. package/templates/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  658. package/templates/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  659. package/templates/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  660. package/templates/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  661. package/templates/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  662. package/templates/skills/ui-ux-pro-max/data/styles.csv +58 -58
  663. package/templates/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  664. package/templates/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  665. package/templates/skills/ui-ux-pro-max/scripts/design_system.py +494 -0
  666. package/templates/skills/ui-ux-pro-max/scripts/search.py +84 -61
  667. package/templates/skills/use-mcp/SKILL.md +42 -0
  668. package/templates/skills/watzup/SKILL.md +12 -0
  669. package/templates/skills/web-design-guidelines/SKILL.md +36 -0
  670. package/templates/skills/web-frameworks/SKILL.md +4 -3
  671. package/templates/skills/web-frameworks/scripts/nextjs_init.py +13 -13
  672. package/templates/skills/web-frameworks/scripts/turborepo_migrate.py +0 -0
  673. package/templates/skills/web-testing/SKILL.md +97 -0
  674. package/templates/skills/web-testing/references/accessibility-testing.md +84 -0
  675. package/templates/skills/web-testing/references/api-testing.md +78 -0
  676. package/templates/skills/web-testing/references/ci-cd-testing-workflows.md +121 -0
  677. package/templates/skills/web-testing/references/component-testing.md +94 -0
  678. package/templates/skills/web-testing/references/contract-testing.md +146 -0
  679. package/templates/skills/web-testing/references/cross-browser-checklist.md +72 -0
  680. package/templates/skills/web-testing/references/database-testing.md +139 -0
  681. package/templates/skills/web-testing/references/e2e-testing-playwright.md +119 -0
  682. package/templates/skills/web-testing/references/functional-testing-checklist.md +88 -0
  683. package/templates/skills/web-testing/references/interactive-testing-patterns.md +89 -0
  684. package/templates/skills/web-testing/references/load-testing-k6.md +93 -0
  685. package/templates/skills/web-testing/references/mobile-gesture-testing.md +85 -0
  686. package/templates/skills/web-testing/references/performance-core-web-vitals.md +124 -0
  687. package/templates/skills/web-testing/references/playwright-component-testing.md +115 -0
  688. package/templates/skills/web-testing/references/pre-release-checklist.md +75 -0
  689. package/templates/skills/web-testing/references/security-checklists.md +81 -0
  690. package/templates/skills/web-testing/references/security-testing-overview.md +92 -0
  691. package/templates/skills/web-testing/references/shadow-dom-testing.md +70 -0
  692. package/templates/skills/web-testing/references/test-data-management.md +131 -0
  693. package/templates/skills/web-testing/references/test-flakiness-mitigation.md +86 -0
  694. package/templates/skills/web-testing/references/testing-pyramid-strategy.md +76 -0
  695. package/templates/skills/web-testing/references/unit-integration-testing.md +138 -0
  696. package/templates/skills/web-testing/references/visual-regression.md +92 -0
  697. package/templates/skills/web-testing/references/vulnerability-payloads.md +93 -0
  698. package/templates/skills/web-testing/scripts/analyze-test-results.js +280 -0
  699. package/templates/skills/web-testing/scripts/init-playwright.js +233 -0
  700. package/templates/skills/worktree/SKILL.md +96 -0
  701. package/templates/skills/worktree/scripts/worktree.cjs +916 -0
  702. package/templates/skills/worktree/scripts/worktree.test.cjs +792 -0
  703. package/templates/statusline.cjs +477 -244
  704. package/templates/statusline.ps1 +0 -1
  705. package/templates/statusline.sh +0 -1
  706. package/templates/agents/README.md +0 -172
  707. package/templates/agents/copywriter.md +0 -113
  708. package/templates/agents/database-admin.md +0 -97
  709. package/templates/agents/scout-external.md +0 -146
  710. package/templates/agents/scout.md +0 -260
  711. package/templates/commands/README.md +0 -251
  712. package/templates/commands/bootstrap/auto/fast.md +0 -111
  713. package/templates/commands/bootstrap/auto/parallel.md +0 -66
  714. package/templates/commands/bootstrap/auto.md +0 -115
  715. package/templates/commands/bootstrap.md +0 -137
  716. package/templates/commands/build.md +0 -39
  717. package/templates/commands/checkpoint.md +0 -156
  718. package/templates/commands/code/auto.md +0 -170
  719. package/templates/commands/code/no-test.md +0 -158
  720. package/templates/commands/code/parallel.md +0 -55
  721. package/templates/commands/code-simplifier.md +0 -71
  722. package/templates/commands/code.md +0 -176
  723. package/templates/commands/compact.md +0 -57
  724. package/templates/commands/content/cro.md +0 -43
  725. package/templates/commands/content/enhance.md +0 -14
  726. package/templates/commands/content/fast.md +0 -13
  727. package/templates/commands/content/good.md +0 -16
  728. package/templates/commands/context.md +0 -48
  729. package/templates/commands/cook/auto/fast.md +0 -26
  730. package/templates/commands/cook/auto/parallel.md +0 -49
  731. package/templates/commands/cook/auto.md +0 -15
  732. package/templates/commands/cook/fast.md +0 -47
  733. package/templates/commands/cook/hard.md +0 -80
  734. package/templates/commands/cook/parallel.md +0 -90
  735. package/templates/commands/cook.md +0 -105
  736. package/templates/commands/create-feature.md +0 -48
  737. package/templates/commands/db-migrate.md +0 -52
  738. package/templates/commands/debug.md +0 -13
  739. package/templates/commands/design/3d.md +0 -83
  740. package/templates/commands/design/describe.md +0 -23
  741. package/templates/commands/design/fast.md +0 -31
  742. package/templates/commands/design/good.md +0 -35
  743. package/templates/commands/design/screenshot.md +0 -34
  744. package/templates/commands/design/video.md +0 -34
  745. package/templates/commands/docs/init.md +0 -39
  746. package/templates/commands/docs/summarize.md +0 -31
  747. package/templates/commands/docs/update.md +0 -57
  748. package/templates/commands/feature.md +0 -62
  749. package/templates/commands/fix/ci.md +0 -17
  750. package/templates/commands/fix/fast.md +0 -19
  751. package/templates/commands/fix/hard.md +0 -39
  752. package/templates/commands/fix/logs.md +0 -26
  753. package/templates/commands/fix/parallel.md +0 -54
  754. package/templates/commands/fix/test.md +0 -20
  755. package/templates/commands/fix/types.md +0 -9
  756. package/templates/commands/fix/ui.md +0 -48
  757. package/templates/commands/fix-issue.md +0 -177
  758. package/templates/commands/fix.md +0 -43
  759. package/templates/commands/generate-dto.md +0 -67
  760. package/templates/commands/git/cm.md +0 -5
  761. package/templates/commands/git/cp.md +0 -4
  762. package/templates/commands/git/merge.md +0 -40
  763. package/templates/commands/git/pr.md +0 -48
  764. package/templates/commands/integrate/polar.md +0 -28
  765. package/templates/commands/integrate/sepay.md +0 -28
  766. package/templates/commands/investigate.md +0 -324
  767. package/templates/commands/lint.md +0 -47
  768. package/templates/commands/migration.md +0 -111
  769. package/templates/commands/performance.md +0 -110
  770. package/templates/commands/plan/ci.md +0 -33
  771. package/templates/commands/plan/cro.md +0 -69
  772. package/templates/commands/plan/fast.md +0 -86
  773. package/templates/commands/plan/hard.md +0 -103
  774. package/templates/commands/plan/parallel.md +0 -152
  775. package/templates/commands/plan/preview.md +0 -40
  776. package/templates/commands/plan/two.md +0 -52
  777. package/templates/commands/plan/validate.md +0 -132
  778. package/templates/commands/plan.md +0 -36
  779. package/templates/commands/pr.md +0 -49
  780. package/templates/commands/preview.md +0 -87
  781. package/templates/commands/release-notes.md +0 -144
  782. package/templates/commands/review/post-task.md +0 -157
  783. package/templates/commands/review-changes.md +0 -46
  784. package/templates/commands/review.md +0 -56
  785. package/templates/commands/scout/ext.md +0 -35
  786. package/templates/commands/scout.md +0 -283
  787. package/templates/commands/security.md +0 -119
  788. package/templates/commands/skill/add.md +0 -36
  789. package/templates/commands/skill/create.md +0 -29
  790. package/templates/commands/skill/fix-logs.md +0 -22
  791. package/templates/commands/skill/optimize/auto.md +0 -25
  792. package/templates/commands/skill/optimize.md +0 -34
  793. package/templates/commands/skill/plan.md +0 -45
  794. package/templates/commands/worktree.md +0 -126
  795. package/templates/hooks/.python-cache.json +0 -1
  796. package/templates/hooks/README.md +0 -246
  797. package/templates/hooks/backend-csharp-context.cjs +0 -223
  798. package/templates/hooks/design-system-context.cjs +0 -185
  799. package/templates/hooks/frontend-typescript-context.cjs +0 -233
  800. package/templates/hooks/lib/ck-paths.cjs +0 -110
  801. package/templates/hooks/lib/context-tracker.cjs +0 -335
  802. package/templates/hooks/notify-waiting.js +0 -117
  803. package/templates/hooks/post-edit-prettier.cjs +0 -189
  804. package/templates/hooks/post-task-review.cjs +0 -142
  805. package/templates/hooks/scss-styling-context.cjs +0 -213
  806. package/templates/hooks/session-end.cjs +0 -35
  807. package/templates/hooks/tests/test-context-tracker.cjs +0 -454
  808. package/templates/hooks/tests/test-scout-block.js +0 -163
  809. package/templates/hooks/workflow-router.cjs +0 -326
  810. package/templates/hooks/write-compact-marker.cjs +0 -159
  811. package/templates/memory/session-log.md +0 -186
  812. package/templates/router/README.md +0 -294
  813. package/templates/router/agents-guide.md +0 -38
  814. package/templates/router/commands-guide.md +0 -122
  815. package/templates/router/decision-flow.md +0 -92
  816. package/templates/router/skills-guide.md +0 -127
  817. package/templates/router/workflows-guide.md +0 -68
  818. package/templates/scripts/__pycache__/win_compat.cpython-312.pyc +0 -0
  819. package/templates/scripts/plan-preview.cjs +0 -921
  820. package/templates/skills/arch-cross-service-integration/SKILL.md +0 -48
  821. package/templates/skills/arch-performance-optimization/SKILL.md +0 -306
  822. package/templates/skills/arch-security-review/SKILL.md +0 -344
  823. package/templates/skills/branch-comparison/SKILL.md +0 -150
  824. package/templates/skills/bug-diagnosis/SKILL.md +0 -309
  825. package/templates/skills/claude-code/references/advanced-features.md +0 -399
  826. package/templates/skills/claude-code/references/agent-skills.md +0 -399
  827. package/templates/skills/claude-code/references/api-reference.md +0 -498
  828. package/templates/skills/claude-code/references/best-practices.md +0 -447
  829. package/templates/skills/claude-code/references/cicd-integration.md +0 -428
  830. package/templates/skills/claude-code/references/common-workflows.md +0 -119
  831. package/templates/skills/claude-code/references/configuration.md +0 -480
  832. package/templates/skills/claude-code/references/enterprise-features.md +0 -472
  833. package/templates/skills/claude-code/references/getting-started.md +0 -252
  834. package/templates/skills/claude-code/references/hooks-and-plugins.md +0 -444
  835. package/templates/skills/claude-code/references/hooks-comprehensive.md +0 -622
  836. package/templates/skills/claude-code/references/ide-integration.md +0 -316
  837. package/templates/skills/claude-code/references/mcp-integration.md +0 -386
  838. package/templates/skills/claude-code/references/slash-commands.md +0 -489
  839. package/templates/skills/claude-code/references/troubleshooting.md +0 -456
  840. package/templates/skills/claude-code/skill.md +0 -60
  841. package/templates/skills/debugging/SKILL.md +0 -84
  842. package/templates/skills/developer-growth-analysis/SKILL.md +0 -322
  843. package/templates/skills/documentation/SKILL.md +0 -134
  844. package/templates/skills/domain-name-brainstormer/SKILL.md +0 -212
  845. package/templates/skills/dual-pass-review/SKILL.md +0 -249
  846. package/templates/skills/feature-docs/SKILL.md +0 -294
  847. package/templates/skills/feature-implementation/SKILL.md +0 -262
  848. package/templates/skills/feature-investigation/SKILL.md +0 -346
  849. package/templates/skills/frontend-design-pro/SKILL.md +0 -58
  850. package/templates/skills/package-upgrade/SKILL.md +0 -189
  851. package/templates/skills/plan-analysis/SKILL.md +0 -191
  852. package/templates/skills/planning/SKILL.md +0 -115
  853. package/templates/skills/planning-with-files/SKILL.md +0 -160
  854. package/templates/skills/planning-with-files/examples.md +0 -202
  855. package/templates/skills/planning-with-files/reference.md +0 -110
  856. package/templates/skills/project-index/SKILL.md +0 -97
  857. package/templates/skills/project-index/scripts/scan-structure.js +0 -417
  858. package/templates/skills/project-index/scripts/scan_structure.py +0 -450
  859. package/templates/skills/readme-improvement/SKILL.md +0 -177
  860. package/templates/skills/skill-share/SKILL.md +0 -80
  861. package/templates/skills/tasks-code-review/SKILL.md +0 -298
  862. package/templates/skills/tasks-documentation/SKILL.md +0 -328
  863. package/templates/skills/tasks-spec-update/SKILL.md +0 -318
  864. package/templates/skills/tasks-test-generation/SKILL.md +0 -433
  865. package/templates/skills/test-generation/SKILL.md +0 -203
  866. package/templates/skills/webapp-testing/LICENSE.txt +0 -202
  867. package/templates/skills/webapp-testing/SKILL.md +0 -96
  868. package/templates/skills/webapp-testing/examples/console_logging.py +0 -35
  869. package/templates/skills/webapp-testing/examples/element_discovery.py +0 -40
  870. package/templates/skills/webapp-testing/examples/static_html_automation.py +0 -33
  871. package/templates/skills/webapp-testing/scripts/with_server.py +0 -106
  872. package/templates/workflows/README.md +0 -241
  873. package/templates/workflows/orchestration-protocol.md +0 -16
  874. /package/templates/{commands → command-archive}/coding-level.md +0 -0
  875. /package/templates/{commands → command-archive}/review/codebase.md +0 -0
  876. /package/templates/{commands → command-archive}/test.md +0 -0
  877. /package/templates/{commands → command-archive}/watzup.md +0 -0
  878. /package/templates/hooks/scout-block/vendor/{ignore.js → ignore.cjs} +0 -0
  879. /package/templates/{workflows → rules}/documentation-management.md +0 -0
  880. /package/templates/skills/{debugging → debug}/references/defense-in-depth.md +0 -0
  881. /package/templates/skills/{debugging → debug}/references/root-cause-tracing.md +0 -0
  882. /package/templates/skills/{debugging → debug}/references/systematic-debugging.md +0 -0
  883. /package/templates/skills/{debugging → debug}/references/verification.md +0 -0
  884. /package/templates/skills/{debugging → debug}/scripts/find-polluter.sh +0 -0
  885. /package/templates/skills/{debugging → debug}/scripts/find-polluter.test.md +0 -0
  886. /package/templates/skills/{planning → plan}/references/solution-design.md +0 -0
@@ -0,0 +1,916 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Git Worktree Manager for ClaudeKit
4
+ * Cross-platform Node.js script for creating isolated git worktrees
5
+ *
6
+ * Usage: node worktree.cjs <command> [options]
7
+ * Commands:
8
+ * create <project> <feature> Create a new worktree (project optional for standalone)
9
+ * remove <name-or-path> Remove a worktree and its branch
10
+ * info Get repo info (type, projects, env files)
11
+ * list List existing worktrees
12
+ *
13
+ * Options:
14
+ * --prefix <type> Branch prefix (feat|fix|refactor|docs|test|chore|perf)
15
+ * --worktree-root <path> Explicit worktree directory (Claude's decision)
16
+ * --json Output in JSON format for LLM consumption
17
+ * --env <files> Comma-separated list of .env files to copy (legacy)
18
+ * --dry-run Show what would be done without executing
19
+ */
20
+
21
+ const { execSync } = require('child_process');
22
+ const fs = require('fs');
23
+ const path = require('path');
24
+ const crypto = require('crypto');
25
+
26
+ function sanitizeBranchPrefix(value) {
27
+ const raw = String(value || '').trim().toLowerCase();
28
+ if (!raw) return 'feat';
29
+ const safe = raw
30
+ .replace(/[^a-z0-9-]/g, '-')
31
+ .replace(/-+/g, '-')
32
+ .replace(/^-|-$/g, '')
33
+ .slice(0, 20);
34
+ return safe || 'feat';
35
+ }
36
+
37
+ function isSafeEnvFileName(fileName) {
38
+ if (!fileName || typeof fileName !== 'string') return false;
39
+ if (fileName.includes('\0')) return false;
40
+ if (path.isAbsolute(fileName)) return false;
41
+ const normalized = path.normalize(fileName.trim());
42
+ if (normalized.startsWith('..') || normalized.includes(`..${path.sep}`)) return false;
43
+ if (normalized.includes(path.sep)) return false;
44
+ return /^\.env[\w.-]*$/.test(normalized);
45
+ }
46
+
47
+ // Minimum Node.js version check
48
+ const MIN_NODE_VERSION = 18;
49
+ const nodeVersion = parseInt(process.version.slice(1).split('.')[0], 10);
50
+ if (nodeVersion < MIN_NODE_VERSION) {
51
+ outputError('NODE_VERSION_ERROR', `Node.js ${MIN_NODE_VERSION}+ required. Current: ${process.version}`);
52
+ process.exit(1);
53
+ }
54
+
55
+ // Parse arguments
56
+ const args = process.argv.slice(2);
57
+ const jsonOutput = args.includes('--json');
58
+ const jsonIndex = args.indexOf('--json');
59
+ if (jsonIndex > -1) args.splice(jsonIndex, 1);
60
+
61
+ const prefixIndex = args.indexOf('--prefix');
62
+ let branchPrefix = 'feat';
63
+ let branchPrefixWarning = null;
64
+ if (prefixIndex > -1) {
65
+ const rawPrefix = args[prefixIndex + 1] || 'feat';
66
+ branchPrefix = sanitizeBranchPrefix(rawPrefix);
67
+ if (branchPrefix !== rawPrefix.toLowerCase()) {
68
+ branchPrefixWarning = `Branch prefix sanitized: "${rawPrefix}" → "${branchPrefix}"`;
69
+ }
70
+ args.splice(prefixIndex, 2);
71
+ }
72
+
73
+ const envIndex = args.indexOf('--env');
74
+ let envFilesToCopy = [];
75
+ if (envIndex > -1) {
76
+ envFilesToCopy = (args[envIndex + 1] || '').split(',').map(v => v.trim()).filter(Boolean);
77
+ args.splice(envIndex, 2);
78
+ }
79
+
80
+ const dryRunIndex = args.indexOf('--dry-run');
81
+ const dryRun = dryRunIndex > -1;
82
+ if (dryRunIndex > -1) args.splice(dryRunIndex, 1);
83
+
84
+ // --worktree-root: explicit override for worktree location (Claude's decision)
85
+ const worktreeRootIndex = args.indexOf('--worktree-root');
86
+ let explicitWorktreeRoot = null;
87
+ if (worktreeRootIndex > -1) {
88
+ explicitWorktreeRoot = args[worktreeRootIndex + 1];
89
+ args.splice(worktreeRootIndex, 2);
90
+ }
91
+
92
+ const command = args[0];
93
+ // For create: args[1] is project (or feature for standalone), args[2] is feature
94
+ // For remove: args[1] is worktree name or path
95
+ const arg1 = args[1];
96
+ const arg2 = args[2];
97
+
98
+ // Output helpers
99
+ function output(data) {
100
+ if (jsonOutput) {
101
+ console.log(JSON.stringify(data, null, 2));
102
+ } else {
103
+ if (data.success) {
104
+ console.log(`\n✅ ${data.message}`);
105
+ if (data.worktreePath) {
106
+ console.log(`\n📋 Next Steps:`);
107
+ console.log(` 1. cd ${data.worktreePath}`);
108
+ console.log(` 2. claude`);
109
+ console.log(` 3. Start working on your feature`);
110
+ console.log(`\n🧹 Cleanup when done:`);
111
+ console.log(` git worktree remove ${data.worktreePath}`);
112
+ console.log(` git branch -d ${data.branch}`);
113
+ }
114
+ if (data.envTemplatesCopied && data.envTemplatesCopied.length > 0) {
115
+ console.log(`\n📄 Environment templates copied:`);
116
+ data.envTemplatesCopied.forEach(t => console.log(` ✓ ${t.from} → ${t.to}`));
117
+ } else if (data.envFilesCopied && data.envFilesCopied.length > 0) {
118
+ console.log(`\n📄 Environment files copied:`);
119
+ data.envFilesCopied.forEach(f => console.log(` ✓ ${f}`));
120
+ }
121
+ if (data.warnings && data.warnings.length > 0) {
122
+ console.log(`\n⚠️ Warnings:`);
123
+ data.warnings.forEach(w => console.log(` ${w}`));
124
+ }
125
+ } else if (data.info) {
126
+ // Info output
127
+ console.log(`\n📦 Repository Info:`);
128
+ console.log(` Type: ${data.repoType}`);
129
+ console.log(` Base branch: ${data.baseBranch}`);
130
+ if (data.worktreeRoot) {
131
+ console.log(`\n📂 Worktree location:`);
132
+ console.log(` Path: ${data.worktreeRoot}`);
133
+ console.log(` Source: ${data.worktreeRootSource}`);
134
+ }
135
+ if (data.projects && data.projects.length > 0) {
136
+ console.log(`\n📁 Available projects:`);
137
+ data.projects.forEach(p => console.log(` - ${p.name} (${p.path})`));
138
+ }
139
+ if (data.envFiles && data.envFiles.length > 0) {
140
+ console.log(`\n🔐 Environment files found:`);
141
+ data.envFiles.forEach(f => console.log(` - ${f}`));
142
+ }
143
+ if (data.dirtyState) {
144
+ console.log(`\n⚠️ Working directory has uncommitted changes`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ function outputError(code, message, details = {}) {
151
+ const errorData = {
152
+ success: false,
153
+ error: { code, message, ...details }
154
+ };
155
+ if (jsonOutput) {
156
+ console.log(JSON.stringify(errorData, null, 2));
157
+ } else {
158
+ console.error(`\n❌ Error [${code}]: ${message}`);
159
+ if (details.suggestion) {
160
+ console.error(` 💡 ${details.suggestion}`);
161
+ }
162
+ if (details.availableProjects) {
163
+ console.error(`\n Available projects:`);
164
+ details.availableProjects.forEach(p => console.error(` - ${p}`));
165
+ }
166
+ }
167
+ process.exit(1);
168
+ }
169
+
170
+ // Git command wrapper with error handling
171
+ function git(command, options = {}) {
172
+ try {
173
+ const result = execSync(`git ${command}`, {
174
+ encoding: 'utf-8',
175
+ stdio: options.silent ? 'pipe' : ['pipe', 'pipe', 'pipe'],
176
+ cwd: options.cwd || process.cwd()
177
+ });
178
+ return { success: true, output: result.trim() };
179
+ } catch (error) {
180
+ return {
181
+ success: false,
182
+ error: error.message,
183
+ stderr: error.stderr?.toString().trim() || '',
184
+ code: error.status
185
+ };
186
+ }
187
+ }
188
+
189
+ // Check if in git repo
190
+ function checkGitRepo() {
191
+ const result = git('rev-parse --show-toplevel', { silent: true });
192
+ if (!result.success) {
193
+ outputError('NOT_GIT_REPO', 'Not in a git repository', {
194
+ suggestion: 'Run this command from within a git repository'
195
+ });
196
+ }
197
+ return result.output;
198
+ }
199
+
200
+ // Check git version supports worktree
201
+ function checkGitVersion() {
202
+ const result = git('worktree list', { silent: true });
203
+ if (!result.success && result.stderr.includes('not a git command')) {
204
+ outputError('GIT_VERSION_ERROR', 'Git version too old (worktree requires git 2.5+)', {
205
+ suggestion: 'Upgrade git to version 2.5 or newer'
206
+ });
207
+ }
208
+ }
209
+
210
+ // Detect base branch
211
+ function detectBaseBranch(cwd) {
212
+ const branches = ['dev', 'develop', 'main', 'master'];
213
+ for (const branch of branches) {
214
+ const local = git(`show-ref --verify --quiet refs/heads/${branch}`, { silent: true, cwd });
215
+ if (local.success) return branch;
216
+ const remote = git(`show-ref --verify --quiet refs/remotes/origin/${branch}`, { silent: true, cwd });
217
+ if (remote.success) return branch;
218
+ }
219
+ return 'main'; // fallback
220
+ }
221
+
222
+ // Find the topmost superproject by walking up the directory tree
223
+ // This handles submodules within monorepos - worktrees go to the root monorepo
224
+ // Safety limit prevents infinite loops in edge cases (max 10 levels deep)
225
+ const MAX_SUPERPROJECT_DEPTH = 10;
226
+
227
+ function findTopmostSuperproject(gitRoot) {
228
+ let current = gitRoot;
229
+ let topmost = gitRoot;
230
+ let depth = 0;
231
+
232
+ // Keep walking up while we find superprojects (with safety limit)
233
+ while (depth < MAX_SUPERPROJECT_DEPTH) {
234
+ const result = git('rev-parse --show-superproject-working-tree', { silent: true, cwd: current });
235
+ if (!result.success || !result.output) {
236
+ break; // No more superprojects above
237
+ }
238
+ topmost = result.output;
239
+ current = result.output;
240
+ depth++;
241
+ }
242
+
243
+ return topmost;
244
+ }
245
+
246
+ // Validate that a path can be used as worktree root (exists or can be created)
247
+ function validateWorktreeRoot(rootPath) {
248
+ if (typeof rootPath !== 'string' || rootPath.trim().length === 0) {
249
+ return { valid: false, error: 'Worktree root path is empty' };
250
+ }
251
+ if (/[\0\r\n]/.test(rootPath)) {
252
+ return { valid: false, error: 'Worktree root contains invalid control characters' };
253
+ }
254
+ const resolved = path.resolve(rootPath);
255
+
256
+ // Check if path exists and is a directory
257
+ if (fs.existsSync(resolved)) {
258
+ const stat = fs.statSync(resolved);
259
+ if (!stat.isDirectory()) {
260
+ return { valid: false, error: `Path exists but is not a directory: ${resolved}` };
261
+ }
262
+ return { valid: true, path: resolved };
263
+ }
264
+
265
+ // Check if parent directory exists (we can create the worktree dir)
266
+ const parent = path.dirname(resolved);
267
+ if (fs.existsSync(parent)) {
268
+ const parentStat = fs.statSync(parent);
269
+ if (!parentStat.isDirectory()) {
270
+ return { valid: false, error: `Parent path is not a directory: ${parent}` };
271
+ }
272
+ return { valid: true, path: resolved };
273
+ }
274
+
275
+ // Parent doesn't exist - check if grandparent exists (allows mkdir -p one level)
276
+ const grandparent = path.dirname(parent);
277
+ if (fs.existsSync(grandparent)) {
278
+ return { valid: true, path: resolved };
279
+ }
280
+
281
+ return { valid: false, error: `Cannot create worktree directory: parent path does not exist: ${parent}` };
282
+ }
283
+
284
+ // Determine the worktree root directory with priority:
285
+ // 1. Explicit --worktree-root flag (Claude's decision)
286
+ // 2. WORKTREE_ROOT env var (explicit override)
287
+ // 3. Topmost superproject's worktrees/ (for submodules)
288
+ // 4. Monorepo: worktrees/ inside repo (keeps related worktrees together)
289
+ // 5. Standalone: sibling worktrees/ (avoids polluting repo)
290
+ function getWorktreeRoot(gitRoot, isMonorepo, explicitRoot = null) {
291
+ // Priority 0: Explicit --worktree-root flag (Claude's decision)
292
+ if (explicitRoot) {
293
+ const validation = validateWorktreeRoot(explicitRoot);
294
+ if (!validation.valid) {
295
+ outputError('INVALID_WORKTREE_ROOT', validation.error, {
296
+ suggestion: 'Provide a valid directory path that exists or can be created'
297
+ });
298
+ }
299
+ return { dir: validation.path, source: '--worktree-root flag' };
300
+ }
301
+
302
+ // Priority 1: Environment variable override
303
+ const envRoot = process.env.WORKTREE_ROOT;
304
+ if (envRoot) {
305
+ const validation = validateWorktreeRoot(envRoot);
306
+ if (!validation.valid) {
307
+ outputError('INVALID_WORKTREE_ROOT', validation.error, {
308
+ suggestion: 'Fix WORKTREE_ROOT env var or unset it'
309
+ });
310
+ }
311
+ return { dir: validation.path, source: 'WORKTREE_ROOT env' };
312
+ }
313
+
314
+ // Priority 2: Check for superproject (we might be in a submodule)
315
+ const topmostRoot = findTopmostSuperproject(gitRoot);
316
+ if (topmostRoot !== gitRoot) {
317
+ return {
318
+ dir: path.join(topmostRoot, 'worktrees'),
319
+ source: `superproject (${path.basename(topmostRoot)})`
320
+ };
321
+ }
322
+
323
+ // Priority 3: Monorepo - use worktrees/ inside the repo
324
+ // Keeps all project worktrees organized together within the monorepo
325
+ if (isMonorepo) {
326
+ return { dir: path.join(gitRoot, 'worktrees'), source: 'monorepo internal' };
327
+ }
328
+
329
+ // Priority 4: Standalone repos - use sibling worktrees/
330
+ // Avoids polluting the repo with worktree directories
331
+ return { dir: path.join(path.dirname(gitRoot), 'worktrees'), source: 'sibling directory' };
332
+ }
333
+
334
+ // Check for uncommitted changes
335
+ function checkDirtyState() {
336
+ const diff = git('diff --quiet', { silent: true });
337
+ const diffCached = git('diff --cached --quiet', { silent: true });
338
+ return !diff.success || !diffCached.success;
339
+ }
340
+
341
+ // Get dirty state details
342
+ function getDirtyStateDetails() {
343
+ const status = git('status --porcelain', { silent: true });
344
+ if (!status.success) return null;
345
+ const lines = status.output.split('\n').filter(Boolean);
346
+ const modified = lines.filter(l => l.startsWith(' M') || l.startsWith('M ')).length;
347
+ const staged = lines.filter(l => l.startsWith('A ') || l.startsWith('M ') || l.startsWith('D ')).length;
348
+ const untracked = lines.filter(l => l.startsWith('??')).length;
349
+ return { modified, staged, untracked, total: lines.length };
350
+ }
351
+
352
+ // Parse .gitmodules for monorepo detection
353
+ function parseGitModules(gitRoot) {
354
+ const modulesPath = path.join(gitRoot, '.gitmodules');
355
+ if (!fs.existsSync(modulesPath)) return [];
356
+
357
+ const content = fs.readFileSync(modulesPath, 'utf-8');
358
+ const projects = [];
359
+ const pathRegex = /path\s*=\s*(.+)/g;
360
+ let match;
361
+ while ((match = pathRegex.exec(content)) !== null) {
362
+ const projectPath = match[1].trim();
363
+ projects.push({
364
+ path: projectPath,
365
+ name: path.basename(projectPath)
366
+ });
367
+ }
368
+ return projects;
369
+ }
370
+
371
+ // Find .env files
372
+ function findEnvFiles(dir) {
373
+ try {
374
+ const files = fs.readdirSync(dir);
375
+ return files.filter(f => {
376
+ if (!f.startsWith('.env')) return false;
377
+ const fullPath = path.join(dir, f);
378
+ const stat = fs.statSync(fullPath);
379
+ return stat.isFile() && !stat.isSymbolicLink();
380
+ });
381
+ } catch {
382
+ return [];
383
+ }
384
+ }
385
+
386
+ // Find .env template files (*.example)
387
+ function findEnvTemplates(dir) {
388
+ try {
389
+ const files = fs.readdirSync(dir);
390
+ return files.filter(f => {
391
+ if (!f.startsWith('.env') || !f.endsWith('.example')) return false;
392
+ const fullPath = path.join(dir, f);
393
+ const stat = fs.statSync(fullPath);
394
+ return stat.isFile() && !stat.isSymbolicLink();
395
+ });
396
+ } catch {
397
+ return [];
398
+ }
399
+ }
400
+
401
+ // Copy env templates to worktree (strips .example suffix)
402
+ function copyEnvTemplates(srcDir, destDir) {
403
+ const templates = findEnvTemplates(srcDir);
404
+ const copied = [];
405
+ const warnings = [];
406
+
407
+ templates.forEach(template => {
408
+ const srcPath = path.join(srcDir, template);
409
+ const destName = template.replace(/\.example$/, '');
410
+ const destPath = path.join(destDir, destName);
411
+
412
+ try {
413
+ fs.copyFileSync(srcPath, destPath);
414
+ copied.push({ from: template, to: destName });
415
+ } catch (err) {
416
+ warnings.push(`Failed to copy ${template}: ${err.message}`);
417
+ }
418
+ });
419
+
420
+ return { copied, warnings };
421
+ }
422
+
423
+ // Find matching projects
424
+ function findMatchingProjects(projects, query) {
425
+ const queryLower = query.toLowerCase();
426
+ return projects.filter(p =>
427
+ p.name.toLowerCase().includes(queryLower) ||
428
+ p.path.toLowerCase().includes(queryLower)
429
+ );
430
+ }
431
+
432
+ // Check if branch is already checked out
433
+ function isBranchCheckedOut(branchName, cwd) {
434
+ const result = git('worktree list --porcelain', { silent: true, cwd });
435
+ if (!result.success) return false;
436
+ return result.output.includes(`branch refs/heads/${branchName}`);
437
+ }
438
+
439
+ // Check if branch exists
440
+ function branchExists(branchName, cwd) {
441
+ const local = git(`show-ref --verify --quiet refs/heads/${branchName}`, { silent: true, cwd });
442
+ if (local.success) return 'local';
443
+ const remote = git(`show-ref --verify --quiet refs/remotes/origin/${branchName}`, { silent: true, cwd });
444
+ if (remote.success) return 'remote';
445
+ return false;
446
+ }
447
+
448
+ // Sanitize feature name to valid branch name
449
+ function sanitizeFeatureName(name) {
450
+ const raw = String(name || '').trim();
451
+ if (!raw) return '';
452
+
453
+ // Keep ASCII branch names; drop diacritics first for better readability.
454
+ const ascii = raw
455
+ .normalize('NFKD')
456
+ .replace(/[\u0300-\u036f]/g, '')
457
+ .toLowerCase()
458
+ .replace(/[^a-z0-9-]/g, '-')
459
+ .replace(/-+/g, '-')
460
+ .replace(/^-|-$/g, '')
461
+ .slice(0, 50); // Limit length
462
+
463
+ if (ascii) return ascii;
464
+
465
+ // If input had alphanumeric Unicode but collapsed to empty, keep deterministic fallback.
466
+ if (/[\p{L}\p{N}]/u.test(raw)) {
467
+ const hash = crypto.createHash('sha1').update(raw).digest('hex').slice(0, 8);
468
+ return `feature-${hash}`;
469
+ }
470
+
471
+ return '';
472
+ }
473
+
474
+ // COMMANDS
475
+
476
+ function cmdInfo() {
477
+ const gitRoot = checkGitRepo();
478
+ checkGitVersion();
479
+
480
+ const projects = parseGitModules(gitRoot);
481
+ const isMonorepo = projects.length > 0;
482
+ const baseBranch = detectBaseBranch(gitRoot);
483
+ const dirtyState = checkDirtyState();
484
+ const dirtyDetails = dirtyState ? getDirtyStateDetails() : null;
485
+ const envFiles = findEnvFiles(gitRoot);
486
+
487
+ // Get worktree root info (shows where worktrees will be created)
488
+ const worktreeRoot = getWorktreeRoot(gitRoot, isMonorepo);
489
+
490
+ // For monorepo, also check each project for env files
491
+ const projectEnvFiles = {};
492
+ if (isMonorepo) {
493
+ projects.forEach(p => {
494
+ const projectDir = path.join(gitRoot, p.path);
495
+ if (fs.existsSync(projectDir)) {
496
+ const files = findEnvFiles(projectDir);
497
+ if (files.length > 0) {
498
+ projectEnvFiles[p.name] = files;
499
+ }
500
+ }
501
+ });
502
+ }
503
+
504
+ output({
505
+ info: true,
506
+ repoType: isMonorepo ? 'monorepo' : 'standalone',
507
+ gitRoot,
508
+ baseBranch,
509
+ worktreeRoot: worktreeRoot.dir,
510
+ worktreeRootSource: worktreeRoot.source,
511
+ projects: isMonorepo ? projects : [],
512
+ envFiles,
513
+ projectEnvFiles: isMonorepo ? projectEnvFiles : {},
514
+ dirtyState,
515
+ dirtyDetails
516
+ });
517
+ }
518
+
519
+ function cmdList() {
520
+ checkGitRepo();
521
+ const result = git('worktree list', { silent: true });
522
+ if (!result.success) {
523
+ outputError('WORKTREE_LIST_ERROR', 'Failed to list worktrees', {
524
+ suggestion: 'Ensure you are in a git repository'
525
+ });
526
+ }
527
+
528
+ const worktrees = result.output.split('\n').filter(Boolean).map(line => {
529
+ const parts = line.split(/\s+/);
530
+ return {
531
+ path: parts[0],
532
+ commit: parts[1],
533
+ branch: parts[2]?.replace(/[\[\]]/g, '') || 'detached'
534
+ };
535
+ });
536
+
537
+ if (jsonOutput) {
538
+ console.log(JSON.stringify({ success: true, worktrees }, null, 2));
539
+ } else {
540
+ console.log('\n📂 Existing worktrees:');
541
+ worktrees.forEach(w => {
542
+ console.log(` ${w.path}`);
543
+ console.log(` Branch: ${w.branch} (${w.commit.slice(0, 7)})`);
544
+ });
545
+ }
546
+ }
547
+
548
+ function cmdCreate() {
549
+ const gitRoot = checkGitRepo();
550
+ checkGitVersion();
551
+
552
+ const projects = parseGitModules(gitRoot);
553
+ const isMonorepo = projects.length > 0;
554
+ const warnings = [];
555
+ if (branchPrefixWarning) warnings.push(branchPrefixWarning);
556
+ const safeEnvFilesToCopy = [];
557
+ if (envFilesToCopy.length > 0) {
558
+ envFilesToCopy.forEach(envFile => {
559
+ if (!isSafeEnvFileName(envFile)) {
560
+ warnings.push(`Skipped unsafe env file entry: ${envFile}`);
561
+ return;
562
+ }
563
+ if (!safeEnvFilesToCopy.includes(envFile)) {
564
+ safeEnvFilesToCopy.push(envFile);
565
+ }
566
+ });
567
+ }
568
+
569
+ // Parse arguments based on repo type
570
+ // Monorepo: create <project> <feature>
571
+ // Standalone: create <feature>
572
+ let project, feature;
573
+ if (isMonorepo) {
574
+ project = arg1;
575
+ feature = arg2;
576
+ if (!project || !feature) {
577
+ outputError('MISSING_ARGS', 'Both project and feature are required for monorepo', {
578
+ suggestion: 'Usage: node worktree.cjs create <project> <feature> --prefix <type>',
579
+ availableProjects: projects.map(p => p.name)
580
+ });
581
+ }
582
+ } else {
583
+ feature = arg1;
584
+ if (!feature) {
585
+ outputError('MISSING_FEATURE', 'Feature name is required', {
586
+ suggestion: 'Usage: node worktree.cjs create <feature> --prefix <type>'
587
+ });
588
+ }
589
+ }
590
+
591
+ // Check dirty state
592
+ if (checkDirtyState()) {
593
+ const details = getDirtyStateDetails();
594
+ warnings.push(`Uncommitted changes: ${details.modified} modified, ${details.staged} staged, ${details.untracked} untracked`);
595
+ }
596
+
597
+ // Determine working directory
598
+ let workDir = gitRoot;
599
+ let projectPath = '';
600
+ let projectName = '';
601
+
602
+ if (isMonorepo) {
603
+ const matches = findMatchingProjects(projects, project);
604
+
605
+ if (matches.length === 0) {
606
+ outputError('PROJECT_NOT_FOUND', `Project "${project}" not found`, {
607
+ suggestion: 'Check available projects with: node worktree.cjs info',
608
+ availableProjects: projects.map(p => p.name)
609
+ });
610
+ }
611
+
612
+ if (matches.length > 1) {
613
+ outputError('MULTIPLE_PROJECTS_MATCH', `Multiple projects match "${project}"`, {
614
+ suggestion: 'Use AskUserQuestion to let user select one',
615
+ matchingProjects: matches.map(p => ({ name: p.name, path: p.path }))
616
+ });
617
+ }
618
+
619
+ projectPath = matches[0].path;
620
+ projectName = matches[0].name;
621
+ workDir = path.join(gitRoot, projectPath);
622
+
623
+ if (!fs.existsSync(workDir)) {
624
+ outputError('PROJECT_DIR_NOT_FOUND', `Project directory not found: ${workDir}`, {
625
+ suggestion: 'Initialize submodules: git submodule update --init'
626
+ });
627
+ }
628
+ }
629
+
630
+ // Sanitize feature name
631
+ const sanitizedFeature = sanitizeFeatureName(feature);
632
+ if (!sanitizedFeature) {
633
+ outputError('INVALID_FEATURE_NAME', 'Feature name became empty after sanitization', {
634
+ suggestion: 'Use letters/numbers in feature name (example: "login-validation")'
635
+ });
636
+ }
637
+ if (sanitizedFeature !== feature.toLowerCase().replace(/\s+/g, '-')) {
638
+ warnings.push(`Feature name sanitized: "${feature}" → "${sanitizedFeature}"`);
639
+ }
640
+
641
+ // Create branch name
642
+ const branchName = `${branchPrefix}/${sanitizedFeature}`;
643
+
644
+ // Detect base branch
645
+ const baseBranch = detectBaseBranch(workDir);
646
+
647
+ // Check if branch already checked out
648
+ if (isBranchCheckedOut(branchName, workDir)) {
649
+ outputError('BRANCH_CHECKED_OUT', `Branch "${branchName}" is already checked out in another worktree`, {
650
+ suggestion: 'Use a different feature name or remove the existing worktree'
651
+ });
652
+ }
653
+
654
+ // Determine worktree path using smart root detection
655
+ // explicitWorktreeRoot comes from --worktree-root flag (Claude's decision)
656
+ const worktreeRoot = getWorktreeRoot(gitRoot, isMonorepo, explicitWorktreeRoot);
657
+ const worktreesDir = worktreeRoot.dir;
658
+
659
+ // Build worktree name: always include repo name for clarity
660
+ const repoName = path.basename(gitRoot);
661
+ const worktreeName = isMonorepo
662
+ ? `${projectName}-${sanitizedFeature}`
663
+ : `${repoName}-${sanitizedFeature}`;
664
+
665
+ const worktreePath = path.join(worktreesDir, worktreeName);
666
+
667
+ // Check if worktree already exists
668
+ if (fs.existsSync(worktreePath)) {
669
+ outputError('WORKTREE_EXISTS', `Worktree already exists: ${worktreePath}`, {
670
+ suggestion: `To use: cd ${worktreePath} && claude\nTo remove: git worktree remove ${worktreePath}`
671
+ });
672
+ }
673
+
674
+ // Check if branch exists
675
+ const branchStatus = branchExists(branchName, workDir);
676
+
677
+ // Dry-run mode: show what would be done
678
+ if (dryRun) {
679
+ output({
680
+ success: true,
681
+ dryRun: true,
682
+ message: 'Dry run - no changes made',
683
+ wouldCreate: {
684
+ worktreePath,
685
+ worktreeRootSource: worktreeRoot.source,
686
+ branch: branchName,
687
+ baseBranch,
688
+ branchExists: !!branchStatus,
689
+ project: isMonorepo ? projectName : null,
690
+ envFilesToCopy: safeEnvFilesToCopy.length > 0 ? safeEnvFilesToCopy : undefined
691
+ },
692
+ warnings: warnings.length > 0 ? warnings : undefined
693
+ });
694
+ return;
695
+ }
696
+
697
+ // Create worktrees directory
698
+ try {
699
+ fs.mkdirSync(worktreesDir, { recursive: true });
700
+ } catch (err) {
701
+ outputError('MKDIR_FAILED', `Failed to create worktrees directory: ${worktreesDir}`, {
702
+ suggestion: 'Check write permissions'
703
+ });
704
+ }
705
+
706
+ // Fetch remote branch if needed
707
+ if (branchStatus === 'remote') {
708
+ const fetchResult = git(`fetch origin ${branchName}`, { silent: true, cwd: workDir });
709
+ if (!fetchResult.success) {
710
+ outputError('FETCH_FAILED', `Failed to fetch branch from remote: ${branchName}`, {
711
+ suggestion: 'Check network connection and remote repository access'
712
+ });
713
+ }
714
+ }
715
+
716
+ // Create worktree
717
+ let createResult;
718
+ if (branchStatus) {
719
+ createResult = git(`worktree add "${worktreePath}" ${branchName}`, { cwd: workDir });
720
+ } else {
721
+ createResult = git(`worktree add -b ${branchName} "${worktreePath}" ${baseBranch}`, { cwd: workDir });
722
+ }
723
+
724
+ if (!createResult.success) {
725
+ outputError('WORKTREE_CREATE_FAILED', `Failed to create worktree`, {
726
+ suggestion: createResult.stderr || createResult.error,
727
+ gitError: createResult.stderr
728
+ });
729
+ }
730
+
731
+ // Auto-copy env templates (.env*.example → .env*)
732
+ const sourceDir = isMonorepo ? workDir : gitRoot;
733
+ const envResult = copyEnvTemplates(sourceDir, worktreePath);
734
+ envResult.warnings.forEach(w => warnings.push(w));
735
+
736
+ // Also copy explicitly specified env files (legacy --env flag support)
737
+ const envFilesCopied = envResult.copied.map(c => c.to);
738
+ if (safeEnvFilesToCopy.length > 0) {
739
+ safeEnvFilesToCopy.forEach(envFile => {
740
+ const sourcePath = path.join(sourceDir, envFile);
741
+ const destPath = path.join(worktreePath, envFile);
742
+ if (fs.existsSync(sourcePath)) {
743
+ try {
744
+ fs.copyFileSync(sourcePath, destPath);
745
+ if (!envFilesCopied.includes(envFile)) {
746
+ envFilesCopied.push(envFile);
747
+ }
748
+ } catch (err) {
749
+ warnings.push(`Failed to copy ${envFile}: ${err.message}`);
750
+ }
751
+ } else {
752
+ warnings.push(`Env file not found: ${envFile}`);
753
+ }
754
+ });
755
+ }
756
+
757
+ output({
758
+ success: true,
759
+ message: 'Worktree created successfully!',
760
+ worktreePath,
761
+ worktreeRootSource: worktreeRoot.source,
762
+ branch: branchName,
763
+ baseBranch,
764
+ project: isMonorepo ? projectName : null,
765
+ envFilesCopied,
766
+ envTemplatesCopied: envResult.copied,
767
+ warnings: warnings.length > 0 ? warnings : undefined
768
+ });
769
+ }
770
+
771
+ function cmdRemove() {
772
+ if (!arg1) {
773
+ outputError('MISSING_WORKTREE', 'Worktree name or path is required', {
774
+ suggestion: 'Usage: node worktree.cjs remove <name-or-path>\nUse "node worktree.cjs list" to see available worktrees'
775
+ });
776
+ }
777
+
778
+ const gitRoot = checkGitRepo();
779
+ checkGitVersion();
780
+
781
+ // Get list of worktrees
782
+ const result = git('worktree list --porcelain', { silent: true });
783
+ if (!result.success) {
784
+ outputError('WORKTREE_LIST_ERROR', 'Failed to list worktrees');
785
+ }
786
+
787
+ // Parse worktrees
788
+ const worktrees = [];
789
+ let current = {};
790
+ result.output.split('\n').forEach(line => {
791
+ if (line.startsWith('worktree ')) {
792
+ if (current.path) worktrees.push(current);
793
+ current = { path: line.replace('worktree ', '') };
794
+ } else if (line.startsWith('branch ')) {
795
+ current.branch = line.replace('branch refs/heads/', '');
796
+ }
797
+ });
798
+ if (current.path) worktrees.push(current);
799
+
800
+ // Find matching worktree
801
+ const searchTerm = arg1.toLowerCase();
802
+ const removable = worktrees.filter(w => !w.path.includes('.git/'));
803
+ const exactMatches = removable.filter(w => {
804
+ const name = path.basename(w.path).toLowerCase();
805
+ const fullPath = w.path.toLowerCase();
806
+ const branch = (w.branch || '').toLowerCase();
807
+ return name === searchTerm || fullPath === searchTerm || branch === searchTerm;
808
+ });
809
+ const prefixMatches = removable.filter(w => {
810
+ const name = path.basename(w.path).toLowerCase();
811
+ const fullPath = w.path.toLowerCase();
812
+ const branch = (w.branch || '').toLowerCase();
813
+ return name.startsWith(searchTerm) || fullPath.startsWith(searchTerm) || branch.startsWith(searchTerm);
814
+ });
815
+ const containsMatches = removable.filter(w => {
816
+ const name = path.basename(w.path).toLowerCase();
817
+ const fullPath = w.path.toLowerCase();
818
+ const branch = (w.branch || '').toLowerCase();
819
+ return name.includes(searchTerm) || fullPath.includes(searchTerm) || branch.includes(searchTerm);
820
+ });
821
+
822
+ let removableMatches = exactMatches;
823
+ if (removableMatches.length === 0) {
824
+ removableMatches = prefixMatches;
825
+ }
826
+ if (removableMatches.length === 0 && searchTerm.length >= 4) {
827
+ removableMatches = containsMatches;
828
+ }
829
+
830
+ if (removableMatches.length === 0) {
831
+ outputError('WORKTREE_NOT_FOUND', `No worktree matching "${arg1}" found`, {
832
+ suggestion: 'Use "node worktree.cjs list" to see available worktrees',
833
+ availableWorktrees: removable.map(w => path.basename(w.path))
834
+ });
835
+ }
836
+
837
+ if (removableMatches.length > 1) {
838
+ outputError('MULTIPLE_WORKTREES_MATCH', `Multiple worktrees match "${arg1}"`, {
839
+ suggestion: 'Be more specific or use full path',
840
+ matchingWorktrees: removableMatches.map(w => ({ name: path.basename(w.path), path: w.path, branch: w.branch }))
841
+ });
842
+ }
843
+
844
+ const worktree = removableMatches[0];
845
+ const worktreePath = worktree.path;
846
+ const branchName = worktree.branch;
847
+
848
+ // Dry-run mode
849
+ if (dryRun) {
850
+ output({
851
+ success: true,
852
+ dryRun: true,
853
+ message: 'Dry run - no changes made',
854
+ wouldRemove: {
855
+ worktreePath,
856
+ branch: branchName,
857
+ deleteBranch: !!branchName
858
+ }
859
+ });
860
+ return;
861
+ }
862
+
863
+ // Remove worktree
864
+ const removeResult = git(`worktree remove "${worktreePath}" --force`, { silent: true });
865
+ if (!removeResult.success) {
866
+ outputError('WORKTREE_REMOVE_FAILED', `Failed to remove worktree: ${worktreePath}`, {
867
+ suggestion: removeResult.stderr || 'Check if the worktree has uncommitted changes',
868
+ gitError: removeResult.stderr
869
+ });
870
+ }
871
+
872
+ // Delete branch if it exists
873
+ let branchDeleted = false;
874
+ let branchDeleteWarning = null;
875
+ if (branchName) {
876
+ const deleteResult = git(`branch -d "${branchName}"`, { silent: true });
877
+ if (deleteResult.success) {
878
+ branchDeleted = true;
879
+ } else {
880
+ branchDeleteWarning = `Branch kept: ${branchName} (${deleteResult.stderr || 'not fully merged'})`;
881
+ }
882
+ }
883
+
884
+ output({
885
+ success: true,
886
+ message: 'Worktree removed successfully!',
887
+ removedPath: worktreePath,
888
+ branchDeleted: branchDeleted ? branchName : null,
889
+ branchKept: !branchDeleted && branchName ? branchName : null,
890
+ warnings: branchDeleteWarning ? [branchDeleteWarning] : undefined
891
+ });
892
+ }
893
+
894
+ // Main
895
+ function main() {
896
+ switch (command) {
897
+ case 'create':
898
+ cmdCreate();
899
+ break;
900
+ case 'remove':
901
+ cmdRemove();
902
+ break;
903
+ case 'info':
904
+ cmdInfo();
905
+ break;
906
+ case 'list':
907
+ cmdList();
908
+ break;
909
+ default:
910
+ outputError('UNKNOWN_COMMAND', `Unknown command: ${command || '(none)'}`, {
911
+ suggestion: 'Available commands: create, remove, info, list'
912
+ });
913
+ }
914
+ }
915
+
916
+ main();