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,792 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Test suite for worktree.cjs
4
+ * Run: node .claude/skills/worktree/scripts/worktree.test.cjs
5
+ */
6
+
7
+ const { execSync } = require('child_process');
8
+ const path = require('path');
9
+ const fs = require('fs');
10
+
11
+ const SCRIPT_PATH = path.join(__dirname, 'worktree.cjs');
12
+ const STANDALONE_DIR = path.dirname(path.dirname(__dirname)); // worktree dir
13
+ const MONOREPO_DIR = '/home/kai/claudekit';
14
+
15
+ let passed = 0;
16
+ let failed = 0;
17
+ const results = [];
18
+
19
+ // Test helper
20
+ function run(args, options = {}) {
21
+ const cwd = options.cwd || STANDALONE_DIR;
22
+ try {
23
+ const output = execSync(`node "${SCRIPT_PATH}" ${args}`, {
24
+ encoding: 'utf-8',
25
+ cwd,
26
+ stdio: ['pipe', 'pipe', 'pipe']
27
+ });
28
+ return { success: true, output: output.trim(), exitCode: 0 };
29
+ } catch (error) {
30
+ return {
31
+ success: false,
32
+ output: error.stdout?.toString().trim() || '',
33
+ stderr: error.stderr?.toString().trim() || '',
34
+ exitCode: error.status || 1
35
+ };
36
+ }
37
+ }
38
+
39
+ function test(name, fn) {
40
+ try {
41
+ fn();
42
+ passed++;
43
+ results.push({ name, status: 'PASS' });
44
+ console.log(` ✓ ${name}`);
45
+ } catch (error) {
46
+ failed++;
47
+ results.push({ name, status: 'FAIL', error: error.message });
48
+ console.log(` ✗ ${name}`);
49
+ console.log(` Error: ${error.message}`);
50
+ }
51
+ }
52
+
53
+ function assert(condition, message) {
54
+ if (!condition) throw new Error(message || 'Assertion failed');
55
+ }
56
+
57
+ function assertJSON(str) {
58
+ try {
59
+ return JSON.parse(str);
60
+ } catch {
61
+ throw new Error(`Invalid JSON: ${str.slice(0, 100)}...`);
62
+ }
63
+ }
64
+
65
+ // ============================================
66
+ // INFO COMMAND TESTS
67
+ // ============================================
68
+ console.log('\n📋 INFO Command Tests');
69
+
70
+ test('info returns valid JSON', () => {
71
+ const result = run('info --json');
72
+ assert(result.success, 'Command should succeed');
73
+ const json = assertJSON(result.output);
74
+ assert(json.info === true, 'Should have info: true');
75
+ });
76
+
77
+ test('info detects repo type', () => {
78
+ const result = run('info --json');
79
+ const json = assertJSON(result.output);
80
+ assert(['standalone', 'monorepo'].includes(json.repoType), 'Should detect repo type');
81
+ });
82
+
83
+ test('info detects base branch', () => {
84
+ const result = run('info --json');
85
+ const json = assertJSON(result.output);
86
+ assert(json.baseBranch, 'Should detect base branch');
87
+ assert(['dev', 'develop', 'main', 'master'].includes(json.baseBranch), 'Should be valid branch');
88
+ });
89
+
90
+ test('info finds env files', () => {
91
+ const result = run('info --json');
92
+ const json = assertJSON(result.output);
93
+ assert(Array.isArray(json.envFiles), 'Should have envFiles array');
94
+ });
95
+
96
+ test('info detects dirty state', () => {
97
+ const result = run('info --json');
98
+ const json = assertJSON(result.output);
99
+ assert(typeof json.dirtyState === 'boolean', 'Should have dirtyState boolean');
100
+ });
101
+
102
+ test('info detects monorepo from monorepo root', () => {
103
+ if (!fs.existsSync(MONOREPO_DIR)) return; // Skip if not available
104
+ const result = run('info --json', { cwd: MONOREPO_DIR });
105
+ const json = assertJSON(result.output);
106
+ assert(json.repoType === 'monorepo', 'Should detect monorepo');
107
+ assert(json.projects.length > 0, 'Should have projects');
108
+ });
109
+
110
+ test('monorepo uses internal worktrees directory', () => {
111
+ if (!fs.existsSync(MONOREPO_DIR)) return; // Skip if not available
112
+ const result = run('info --json', { cwd: MONOREPO_DIR });
113
+ const json = assertJSON(result.output);
114
+ // Monorepo should use worktrees/ inside the repo, not sibling
115
+ assert(json.worktreeRoot === path.join(MONOREPO_DIR, 'worktrees'),
116
+ `Expected ${path.join(MONOREPO_DIR, 'worktrees')}, got ${json.worktreeRoot}`);
117
+ assert(json.worktreeRootSource === 'monorepo internal',
118
+ `Expected 'monorepo internal', got ${json.worktreeRootSource}`);
119
+ });
120
+
121
+ test('info returns text output without --json', () => {
122
+ const result = run('info');
123
+ assert(result.success, 'Command should succeed');
124
+ assert(result.output.includes('Repository Info'), 'Should have text output');
125
+ });
126
+
127
+ // ============================================
128
+ // LIST COMMAND TESTS
129
+ // ============================================
130
+ console.log('\n📂 LIST Command Tests');
131
+
132
+ test('list returns valid JSON', () => {
133
+ const result = run('list --json');
134
+ assert(result.success, 'Command should succeed');
135
+ const json = assertJSON(result.output);
136
+ assert(json.success === true, 'Should have success: true');
137
+ assert(Array.isArray(json.worktrees), 'Should have worktrees array');
138
+ });
139
+
140
+ test('list worktrees have required fields', () => {
141
+ const result = run('list --json');
142
+ const json = assertJSON(result.output);
143
+ if (json.worktrees.length > 0) {
144
+ const wt = json.worktrees[0];
145
+ assert(wt.path, 'Worktree should have path');
146
+ assert(wt.commit, 'Worktree should have commit');
147
+ assert(wt.branch, 'Worktree should have branch');
148
+ }
149
+ });
150
+
151
+ test('list returns text output without --json', () => {
152
+ const result = run('list');
153
+ assert(result.success, 'Command should succeed');
154
+ assert(result.output.includes('worktrees'), 'Should have text output');
155
+ });
156
+
157
+ // ============================================
158
+ // CREATE COMMAND TESTS
159
+ // ============================================
160
+ console.log('\n🆕 CREATE Command Tests');
161
+
162
+ test('create requires feature name', () => {
163
+ const result = run('create --json');
164
+ assert(!result.success, 'Should fail without feature');
165
+ const json = assertJSON(result.output);
166
+ assert(json.error.code === 'MISSING_FEATURE', 'Should have MISSING_FEATURE error');
167
+ });
168
+
169
+ test('create dry-run does not create worktree', () => {
170
+ const result = run('create test-dry-run --prefix feat --dry-run --json');
171
+ assert(result.success, 'Dry-run should succeed');
172
+ const json = assertJSON(result.output);
173
+ assert(json.dryRun === true, 'Should have dryRun: true');
174
+ assert(json.wouldCreate, 'Should have wouldCreate object');
175
+ });
176
+
177
+ test('create dry-run shows correct branch name', () => {
178
+ const result = run('create my-feature --prefix fix --dry-run --json');
179
+ const json = assertJSON(result.output);
180
+ assert(json.wouldCreate.branch === 'fix/my-feature', 'Branch should be fix/my-feature');
181
+ });
182
+
183
+ test('create sanitizes feature name - spaces', () => {
184
+ const result = run('create "my cool feature" --dry-run --json');
185
+ const json = assertJSON(result.output);
186
+ assert(json.wouldCreate.branch.includes('my-cool-feature'), 'Should sanitize spaces');
187
+ });
188
+
189
+ test('create sanitizes feature name - uppercase', () => {
190
+ const result = run('create "MyFeature" --dry-run --json');
191
+ const json = assertJSON(result.output);
192
+ assert(json.wouldCreate.branch.includes('myfeature'), 'Should lowercase');
193
+ });
194
+
195
+ test('create sanitizes feature name - special chars', () => {
196
+ const result = run('create "feat@#$test" --dry-run --json');
197
+ const json = assertJSON(result.output);
198
+ assert(!json.wouldCreate.branch.includes('@'), 'Should remove special chars');
199
+ });
200
+
201
+ test('create respects --prefix flag', () => {
202
+ const prefixes = ['feat', 'fix', 'docs', 'refactor', 'test', 'chore', 'perf'];
203
+ for (const prefix of prefixes) {
204
+ const result = run(`create test-${prefix} --prefix ${prefix} --dry-run --json`);
205
+ const json = assertJSON(result.output);
206
+ assert(json.wouldCreate.branch.startsWith(`${prefix}/`), `Should use ${prefix} prefix`);
207
+ }
208
+ });
209
+
210
+ test('create shows base branch', () => {
211
+ const result = run('create test-base --dry-run --json');
212
+ const json = assertJSON(result.output);
213
+ assert(json.wouldCreate.baseBranch, 'Should show base branch');
214
+ });
215
+
216
+ test('create shows worktree path', () => {
217
+ const result = run('create test-path --dry-run --json');
218
+ const json = assertJSON(result.output);
219
+ assert(json.wouldCreate.worktreePath, 'Should show worktree path');
220
+ assert(json.wouldCreate.worktreePath.includes('worktrees'), 'Path should include worktrees dir');
221
+ });
222
+
223
+ test('create in monorepo requires project', () => {
224
+ if (!fs.existsSync(MONOREPO_DIR)) return;
225
+ const result = run('create --json', { cwd: MONOREPO_DIR });
226
+ assert(!result.success, 'Should fail without project in monorepo');
227
+ const json = assertJSON(result.output);
228
+ assert(json.error.code === 'MISSING_ARGS', 'Should have MISSING_ARGS error');
229
+ });
230
+
231
+ test('create in monorepo with project works', () => {
232
+ if (!fs.existsSync(MONOREPO_DIR)) return;
233
+ const result = run('create engineer test-mono --prefix feat --dry-run --json', { cwd: MONOREPO_DIR });
234
+ assert(result.success, 'Should succeed with project');
235
+ const json = assertJSON(result.output);
236
+ assert(json.wouldCreate.project === 'claudekit-engineer', 'Should detect project');
237
+ });
238
+
239
+ test('create detects invalid project', () => {
240
+ if (!fs.existsSync(MONOREPO_DIR)) return;
241
+ const result = run('create nonexistent test-invalid --json', { cwd: MONOREPO_DIR });
242
+ assert(!result.success, 'Should fail with invalid project');
243
+ const json = assertJSON(result.output);
244
+ assert(json.error.code === 'PROJECT_NOT_FOUND', 'Should have PROJECT_NOT_FOUND error');
245
+ });
246
+
247
+ // ============================================
248
+ // REMOVE COMMAND TESTS
249
+ // ============================================
250
+ console.log('\n🗑️ REMOVE Command Tests');
251
+
252
+ test('remove requires worktree name', () => {
253
+ const result = run('remove --json');
254
+ assert(!result.success, 'Should fail without name');
255
+ const json = assertJSON(result.output);
256
+ assert(json.error.code === 'MISSING_WORKTREE', 'Should have MISSING_WORKTREE error');
257
+ });
258
+
259
+ test('remove dry-run does not remove worktree', () => {
260
+ // First get a worktree name from list
261
+ const listResult = run('list --json');
262
+ const listJson = assertJSON(listResult.output);
263
+ const removable = listJson.worktrees.find(w => !w.path.includes('.git/'));
264
+
265
+ if (removable) {
266
+ const name = path.basename(removable.path);
267
+ const result = run(`remove "${name}" --dry-run --json`);
268
+ assert(result.success, 'Dry-run should succeed');
269
+ const json = assertJSON(result.output);
270
+ assert(json.dryRun === true, 'Should have dryRun: true');
271
+ assert(json.wouldRemove, 'Should have wouldRemove object');
272
+ }
273
+ });
274
+
275
+ test('remove handles not found', () => {
276
+ const result = run('remove nonexistent-worktree-xyz --json');
277
+ assert(!result.success, 'Should fail for nonexistent');
278
+ const json = assertJSON(result.output);
279
+ assert(json.error.code === 'WORKTREE_NOT_FOUND', 'Should have WORKTREE_NOT_FOUND error');
280
+ });
281
+
282
+ test('remove error includes available worktrees', () => {
283
+ const result = run('remove nonexistent-worktree-xyz --json');
284
+ const json = assertJSON(result.output);
285
+ assert(Array.isArray(json.error.availableWorktrees), 'Should list available worktrees');
286
+ });
287
+
288
+ // ============================================
289
+ // AUTO-FEATURES TESTS (env templates)
290
+ // ============================================
291
+ console.log('\n🤖 Auto-Features Tests');
292
+
293
+ test('create dry-run succeeds', () => {
294
+ const result = run('create test-env-feature --prefix feat --dry-run --json');
295
+ assert(result.success, 'Dry-run should succeed');
296
+ const json = assertJSON(result.output);
297
+ assert(json.dryRun === true, 'Should have dryRun: true');
298
+ });
299
+
300
+ test('create ignores unsafe --env traversal entries', () => {
301
+ const result = run('create env-guard --prefix feat --dry-run --json --env "../.env,secrets/.env,.env.local"');
302
+ assert(result.success, 'Dry-run should succeed');
303
+ const json = assertJSON(result.output);
304
+ assert(Array.isArray(json.warnings), 'Should include warnings');
305
+ assert(json.warnings.some(w => w.includes('unsafe env file')), 'Should warn for unsafe env entries');
306
+ });
307
+
308
+ // ============================================
309
+ // WORKTREE ROOT DETECTION TESTS
310
+ // ============================================
311
+ console.log('\n📍 Worktree Root Detection Tests');
312
+
313
+ test('info shows worktreeRoot and worktreeRootSource', () => {
314
+ const result = run('info --json');
315
+ const json = assertJSON(result.output);
316
+ assert(json.worktreeRoot, 'Should have worktreeRoot');
317
+ assert(json.worktreeRootSource, 'Should have worktreeRootSource');
318
+ assert(typeof json.worktreeRoot === 'string', 'worktreeRoot should be string');
319
+ assert(json.worktreeRoot.includes('worktrees'), 'worktreeRoot should include worktrees');
320
+ });
321
+
322
+ test('create --worktree-root overrides default location', () => {
323
+ const customRoot = '/tmp/test-worktrees';
324
+ const result = run(`create test-custom-root --prefix feat --dry-run --json --worktree-root "${customRoot}"`);
325
+ assert(result.success, 'Should succeed with custom root');
326
+ const json = assertJSON(result.output);
327
+ assert(json.wouldCreate.worktreePath.startsWith(customRoot), 'Path should use custom root');
328
+ assert(json.wouldCreate.worktreeRootSource === '--worktree-root flag', 'Source should be flag');
329
+ });
330
+
331
+ test('create --worktree-root with relative path resolves to absolute', () => {
332
+ const result = run('create test-relative --prefix feat --dry-run --json --worktree-root "./custom-worktrees"');
333
+ assert(result.success, 'Should succeed');
334
+ const json = assertJSON(result.output);
335
+ assert(path.isAbsolute(json.wouldCreate.worktreePath), 'Path should be absolute');
336
+ });
337
+
338
+ test('create dry-run shows worktreeRootSource', () => {
339
+ const result = run('create test-source --prefix feat --dry-run --json');
340
+ assert(result.success, 'Should succeed');
341
+ const json = assertJSON(result.output);
342
+ assert(json.wouldCreate.worktreeRootSource, 'Should show worktreeRootSource');
343
+ });
344
+
345
+ test('superproject detection in submodule', () => {
346
+ // Test from claudekit-engineer submodule
347
+ const submodulePath = '/home/kai/claudekit/claudekit-engineer';
348
+ if (!fs.existsSync(submodulePath)) return;
349
+ const result = run('info --json', { cwd: submodulePath });
350
+ const json = assertJSON(result.output);
351
+ // Should detect parent monorepo as superproject
352
+ assert(json.worktreeRootSource.includes('superproject') || json.worktreeRootSource === 'monorepo root',
353
+ 'Should detect superproject or monorepo root');
354
+ });
355
+
356
+ test('WORKTREE_ROOT env var overrides detection', () => {
357
+ const envRoot = '/tmp/env-worktrees';
358
+ try {
359
+ const output = execSync(`WORKTREE_ROOT="${envRoot}" node "${SCRIPT_PATH}" create test-env --prefix feat --dry-run --json`, {
360
+ encoding: 'utf-8',
361
+ cwd: STANDALONE_DIR,
362
+ stdio: ['pipe', 'pipe', 'pipe']
363
+ });
364
+ const json = JSON.parse(output.trim());
365
+ assert(json.wouldCreate.worktreePath.startsWith(envRoot), 'Should use env var root');
366
+ assert(json.wouldCreate.worktreeRootSource === 'WORKTREE_ROOT env', 'Source should be env');
367
+ } catch (error) {
368
+ // May fail if script path issue - skip
369
+ }
370
+ });
371
+
372
+ test('invalid WORKTREE_ROOT env var fails safely', () => {
373
+ const invalidRoot = '/etc/passwd';
374
+ try {
375
+ execSync(`WORKTREE_ROOT="${invalidRoot}" node "${SCRIPT_PATH}" info --json`, {
376
+ encoding: 'utf-8',
377
+ cwd: STANDALONE_DIR,
378
+ stdio: ['pipe', 'pipe', 'pipe']
379
+ });
380
+ assert(false, 'Should fail with invalid WORKTREE_ROOT');
381
+ } catch (error) {
382
+ const json = assertJSON(error.stdout.toString());
383
+ assert(json.error.code === 'INVALID_WORKTREE_ROOT', 'Should have INVALID_WORKTREE_ROOT');
384
+ }
385
+ });
386
+
387
+ test('create --worktree-root validates path existence', () => {
388
+ // Use a deeply nested non-existent path that can't be created
389
+ const invalidRoot = '/nonexistent/deeply/nested/path/that/does/not/exist';
390
+ const result = run(`create test-invalid-root --prefix feat --json --worktree-root "${invalidRoot}"`);
391
+ assert(!result.success, 'Should fail with invalid path');
392
+ const json = assertJSON(result.output);
393
+ assert(json.error.code === 'INVALID_WORKTREE_ROOT', 'Should have INVALID_WORKTREE_ROOT error');
394
+ });
395
+
396
+ // ============================================
397
+ // ERROR HANDLING TESTS
398
+ // ============================================
399
+ console.log('\n⚠️ Error Handling Tests');
400
+
401
+ test('unknown command returns error', () => {
402
+ const result = run('unknowncommand --json');
403
+ assert(!result.success, 'Should fail');
404
+ const json = assertJSON(result.output);
405
+ assert(json.error.code === 'UNKNOWN_COMMAND', 'Should have UNKNOWN_COMMAND error');
406
+ });
407
+
408
+ test('no command returns error', () => {
409
+ const result = run('--json');
410
+ assert(!result.success, 'Should fail');
411
+ const json = assertJSON(result.output);
412
+ assert(json.error.code === 'UNKNOWN_COMMAND', 'Should have UNKNOWN_COMMAND error');
413
+ });
414
+
415
+ test('errors have suggestion field', () => {
416
+ const result = run('create --json');
417
+ const json = assertJSON(result.output);
418
+ assert(json.error.suggestion, 'Error should have suggestion');
419
+ });
420
+
421
+ test('success commands return exit code 0', () => {
422
+ const result = run('info --json');
423
+ assert(result.exitCode === 0, 'Exit code should be 0');
424
+ });
425
+
426
+ test('error commands return exit code 1', () => {
427
+ const result = run('create --json');
428
+ assert(result.exitCode === 1, 'Exit code should be 1');
429
+ });
430
+
431
+ test('non-git directory returns error', () => {
432
+ const result = run('info --json', { cwd: '/tmp' });
433
+ assert(!result.success, 'Should fail in non-git dir');
434
+ const json = assertJSON(result.output);
435
+ assert(json.error.code === 'NOT_GIT_REPO', 'Should have NOT_GIT_REPO error');
436
+ });
437
+
438
+ // ============================================
439
+ // EDGE CASE: FEATURE NAME HANDLING
440
+ // ============================================
441
+ console.log('\n🔤 Feature Name Edge Cases');
442
+
443
+ test('create handles empty string feature', () => {
444
+ const result = run('create "" --json');
445
+ assert(!result.success, 'Should fail with empty feature');
446
+ const json = assertJSON(result.output);
447
+ assert(json.error.code === 'MISSING_FEATURE', 'Should have MISSING_FEATURE error');
448
+ });
449
+
450
+ test('create handles very long feature name (truncates to 50 chars)', () => {
451
+ const longName = 'a'.repeat(100);
452
+ const result = run(`create "${longName}" --dry-run --json`);
453
+ assert(result.success, 'Should succeed');
454
+ const json = assertJSON(result.output);
455
+ const branchPart = json.wouldCreate.branch.split('/')[1];
456
+ assert(branchPart.length <= 50, 'Feature part should be max 50 chars');
457
+ });
458
+
459
+ test('create handles unicode characters', () => {
460
+ const result = run('create "测试功能-тест" --dry-run --json');
461
+ assert(result.success, 'Should succeed');
462
+ const json = assertJSON(result.output);
463
+ // Unicode gets converted to dashes
464
+ assert(!json.wouldCreate.branch.includes('测'), 'Should not contain unicode');
465
+ });
466
+
467
+ test('create handles leading/trailing dashes', () => {
468
+ const result = run('create "---feature---" --dry-run --json');
469
+ assert(result.success, 'Should succeed');
470
+ const json = assertJSON(result.output);
471
+ assert(!json.wouldCreate.branch.endsWith('/-'), 'Should not end with dash');
472
+ assert(!json.wouldCreate.branch.includes('//'), 'Should not have double slashes');
473
+ });
474
+
475
+ test('create handles only special characters', () => {
476
+ const result = run('create "@#$%^&*()" --dry-run --json');
477
+ assert(!result.success, 'Should fail when sanitized feature is empty');
478
+ const json = assertJSON(result.output);
479
+ assert(json.error.code === 'INVALID_FEATURE_NAME', 'Should report invalid feature name');
480
+ });
481
+
482
+ test('create handles numbers only', () => {
483
+ const result = run('create "12345" --dry-run --json');
484
+ assert(result.success, 'Should succeed');
485
+ const json = assertJSON(result.output);
486
+ assert(json.wouldCreate.branch.includes('12345'), 'Should keep numbers');
487
+ });
488
+
489
+ test('create handles mixed case camelCase', () => {
490
+ const result = run('create "myNewFeature" --dry-run --json');
491
+ assert(result.success, 'Should succeed');
492
+ const json = assertJSON(result.output);
493
+ assert(json.wouldCreate.branch.includes('mynewfeature'), 'Should be lowercase');
494
+ });
495
+
496
+ // ============================================
497
+ // EDGE CASE: PATH HANDLING
498
+ // ============================================
499
+ console.log('\n📁 Path Handling Edge Cases');
500
+
501
+ test('create handles path with spaces via --worktree-root', () => {
502
+ const pathWithSpaces = '/tmp/my worktree dir';
503
+ const result = run(`create test-spaces --prefix feat --dry-run --json --worktree-root "${pathWithSpaces}"`);
504
+ assert(result.success, 'Should succeed with quoted path');
505
+ const json = assertJSON(result.output);
506
+ assert(json.wouldCreate.worktreePath.includes('my worktree dir'), 'Should preserve spaces');
507
+ });
508
+
509
+ test('create handles home directory expansion', () => {
510
+ // Script uses path.resolve which doesn't expand ~, so this tests current behavior
511
+ const result = run('create test-home --prefix feat --dry-run --json --worktree-root "~/test-worktrees"');
512
+ assert(result.success, 'Should succeed');
513
+ const json = assertJSON(result.output);
514
+ // ~/test-worktrees should be resolved relative to cwd, not expanded
515
+ assert(json.wouldCreate.worktreePath, 'Should have worktree path');
516
+ });
517
+
518
+ test('create validates file path as worktree root', () => {
519
+ // /etc/passwd exists but is a file, not directory
520
+ const result = run('create test-file --prefix feat --json --worktree-root "/etc/passwd"');
521
+ assert(!result.success, 'Should fail when path is file');
522
+ const json = assertJSON(result.output);
523
+ assert(json.error.code === 'INVALID_WORKTREE_ROOT', 'Should have INVALID_WORKTREE_ROOT');
524
+ assert(json.error.message.includes('not a directory'), 'Should mention not a directory');
525
+ });
526
+
527
+ test('create handles current directory as worktree root', () => {
528
+ const result = run('create test-current --prefix feat --dry-run --json --worktree-root "."');
529
+ assert(result.success, 'Should succeed');
530
+ const json = assertJSON(result.output);
531
+ assert(path.isAbsolute(json.wouldCreate.worktreePath), 'Should resolve to absolute');
532
+ });
533
+
534
+ // ============================================
535
+ // EDGE CASE: BRANCH PREFIX HANDLING
536
+ // ============================================
537
+ console.log('\n🏷️ Branch Prefix Edge Cases');
538
+
539
+ test('create uses default prefix when --prefix missing value', () => {
540
+ // --prefix without value should use 'feat' default
541
+ const result = run('create test-default-prefix --dry-run --json');
542
+ assert(result.success, 'Should succeed');
543
+ const json = assertJSON(result.output);
544
+ assert(json.wouldCreate.branch.startsWith('feat/'), 'Should default to feat');
545
+ });
546
+
547
+ test('create handles invalid prefix gracefully', () => {
548
+ // Prefix is sanitized before use.
549
+ const result = run('create test-custom-prefix --prefix custom --dry-run --json');
550
+ assert(result.success, 'Should succeed');
551
+ const json = assertJSON(result.output);
552
+ assert(json.wouldCreate.branch.startsWith('custom/'), 'Should use custom prefix');
553
+ });
554
+
555
+ // ============================================
556
+ // EDGE CASE: MONOREPO SCENARIOS
557
+ // ============================================
558
+ console.log('\n📦 Monorepo Edge Cases');
559
+
560
+ test('create with partial project match in monorepo', () => {
561
+ if (!fs.existsSync(MONOREPO_DIR)) return;
562
+ // 'cli' should match 'claudekit-cli'
563
+ const result = run('create cli test-partial --prefix feat --dry-run --json', { cwd: MONOREPO_DIR });
564
+ assert(result.success, 'Should succeed with partial match');
565
+ const json = assertJSON(result.output);
566
+ assert(json.wouldCreate.project === 'claudekit-cli', 'Should find claudekit-cli');
567
+ });
568
+
569
+ test('create detects multiple project matches', () => {
570
+ if (!fs.existsSync(MONOREPO_DIR)) return;
571
+ // 'claudekit' matches multiple projects
572
+ const result = run('create claudekit test-multi --prefix feat --json', { cwd: MONOREPO_DIR });
573
+ assert(!result.success, 'Should fail with multiple matches');
574
+ const json = assertJSON(result.output);
575
+ assert(json.error.code === 'MULTIPLE_PROJECTS_MATCH', 'Should have MULTIPLE_PROJECTS_MATCH error');
576
+ assert(json.error.matchingProjects.length > 1, 'Should list multiple matches');
577
+ });
578
+
579
+ test('info shows project env files in monorepo', () => {
580
+ if (!fs.existsSync(MONOREPO_DIR)) return;
581
+ const result = run('info --json', { cwd: MONOREPO_DIR });
582
+ const json = assertJSON(result.output);
583
+ assert(json.projectEnvFiles !== undefined, 'Should have projectEnvFiles');
584
+ });
585
+
586
+ // ============================================
587
+ // EDGE CASE: WORKTREE REMOVAL
588
+ // ============================================
589
+ console.log('\n🗑️ Remove Edge Cases');
590
+
591
+ test('remove matches by full path', () => {
592
+ const listResult = run('list --json');
593
+ const listJson = assertJSON(listResult.output);
594
+ const removable = listJson.worktrees.find(w => !w.path.includes('.git/'));
595
+
596
+ if (removable) {
597
+ const result = run(`remove "${removable.path}" --dry-run --json`);
598
+ assert(result.success, 'Should match by full path');
599
+ const json = assertJSON(result.output);
600
+ assert(json.wouldRemove.worktreePath === removable.path, 'Should match exact path');
601
+ }
602
+ });
603
+
604
+ test('remove matches by branch name', () => {
605
+ const listResult = run('list --json');
606
+ const listJson = assertJSON(listResult.output);
607
+ const removable = listJson.worktrees.find(w => w.branch && !w.path.includes('.git/'));
608
+
609
+ if (removable && removable.branch !== 'detached') {
610
+ const branchPart = removable.branch.split('/').pop(); // Get last part of branch
611
+ const result = run(`remove "${branchPart}" --dry-run --json`);
612
+ // May match or have multiple matches - both are valid behaviors
613
+ assert(result.output, 'Should have output');
614
+ }
615
+ });
616
+
617
+ test('remove is case insensitive', () => {
618
+ const result = run('remove NONEXISTENT-WORKTREE-XYZ --json');
619
+ assert(!result.success, 'Should fail');
620
+ const json = assertJSON(result.output);
621
+ assert(json.error.code === 'WORKTREE_NOT_FOUND', 'Should search case-insensitively');
622
+ });
623
+
624
+ // ============================================
625
+ // EDGE CASE: DIRTY STATE HANDLING
626
+ // ============================================
627
+ console.log('\n📝 Dirty State Edge Cases');
628
+
629
+ test('info provides dirty state details', () => {
630
+ const result = run('info --json');
631
+ const json = assertJSON(result.output);
632
+ assert(typeof json.dirtyState === 'boolean', 'Should have dirtyState');
633
+ if (json.dirtyState) {
634
+ assert(json.dirtyDetails, 'Should have dirtyDetails when dirty');
635
+ assert(typeof json.dirtyDetails.modified === 'number', 'Should have modified count');
636
+ assert(typeof json.dirtyDetails.staged === 'number', 'Should have staged count');
637
+ assert(typeof json.dirtyDetails.untracked === 'number', 'Should have untracked count');
638
+ }
639
+ });
640
+
641
+ test('create includes warning for dirty state', () => {
642
+ // This test depends on repo state - if clean, warning won't appear
643
+ const result = run('create test-dirty-check --dry-run --json');
644
+ assert(result.success, 'Should succeed');
645
+ const json = assertJSON(result.output);
646
+ // warnings may or may not exist depending on repo state
647
+ if (json.warnings) {
648
+ assert(Array.isArray(json.warnings), 'warnings should be array');
649
+ }
650
+ });
651
+
652
+ // ============================================
653
+ // EDGE CASE: JSON VS TEXT OUTPUT
654
+ // ============================================
655
+ console.log('\n📤 Output Format Edge Cases');
656
+
657
+ test('info text output includes all sections', () => {
658
+ const result = run('info');
659
+ assert(result.success, 'Should succeed');
660
+ assert(result.output.includes('Repository Info'), 'Should have repo info');
661
+ assert(result.output.includes('Type:'), 'Should have type');
662
+ assert(result.output.includes('Base branch:'), 'Should have base branch');
663
+ assert(result.output.includes('Worktree location:'), 'Should have worktree location');
664
+ });
665
+
666
+ test('list text output is readable', () => {
667
+ const result = run('list');
668
+ assert(result.success, 'Should succeed');
669
+ assert(result.output.includes('worktrees'), 'Should mention worktrees');
670
+ });
671
+
672
+ test('error text output is readable', () => {
673
+ const result = run('create');
674
+ assert(!result.success, 'Should fail');
675
+ assert(result.stderr.includes('Error') || result.output.includes('Error'), 'Should have error text');
676
+ });
677
+
678
+ // ============================================
679
+ // EDGE CASE: EXISTING BRANCH SCENARIOS
680
+ // ============================================
681
+ console.log('\n🌿 Branch Existence Edge Cases');
682
+
683
+ test('create dry-run shows if branch exists', () => {
684
+ const result = run('create test-branch-exist --prefix feat --dry-run --json');
685
+ assert(result.success, 'Should succeed');
686
+ const json = assertJSON(result.output);
687
+ assert(typeof json.wouldCreate.branchExists === 'boolean', 'Should indicate branch existence');
688
+ });
689
+
690
+ // ============================================
691
+ // EDGE CASE: CONCURRENT/RACE CONDITIONS
692
+ // ============================================
693
+ console.log('\n⚡ Concurrent Access Tests');
694
+
695
+ test('multiple info calls return consistent data', () => {
696
+ const result1 = run('info --json');
697
+ const result2 = run('info --json');
698
+ assert(result1.success && result2.success, 'Both should succeed');
699
+ const json1 = assertJSON(result1.output);
700
+ const json2 = assertJSON(result2.output);
701
+ assert(json1.repoType === json2.repoType, 'Repo type should be consistent');
702
+ assert(json1.baseBranch === json2.baseBranch, 'Base branch should be consistent');
703
+ assert(json1.worktreeRoot === json2.worktreeRoot, 'Worktree root should be consistent');
704
+ });
705
+
706
+ test('list returns consistent worktree count', () => {
707
+ const result1 = run('list --json');
708
+ const result2 = run('list --json');
709
+ assert(result1.success && result2.success, 'Both should succeed');
710
+ const json1 = assertJSON(result1.output);
711
+ const json2 = assertJSON(result2.output);
712
+ assert(json1.worktrees.length === json2.worktrees.length, 'Worktree count should be consistent');
713
+ });
714
+
715
+ // ============================================
716
+ // USER SCENARIO: REAL-WORLD WORKFLOWS
717
+ // ============================================
718
+ console.log('\n👤 User Scenario Tests');
719
+
720
+ test('scenario: new user creates first worktree', () => {
721
+ // Step 1: Check info
722
+ const infoResult = run('info --json');
723
+ assert(infoResult.success, 'Info should succeed');
724
+ const info = assertJSON(infoResult.output);
725
+
726
+ // Step 2: Dry-run create
727
+ const createResult = run('create add-login-feature --prefix feat --dry-run --json');
728
+ assert(createResult.success, 'Create dry-run should succeed');
729
+ const create = assertJSON(createResult.output);
730
+ assert(create.wouldCreate.branch === 'feat/add-login-feature', 'Branch should be correctly named');
731
+ assert(create.wouldCreate.baseBranch === info.baseBranch, 'Should use detected base branch');
732
+ });
733
+
734
+ test('scenario: user fixes bug in submodule', () => {
735
+ const submodulePath = '/home/kai/claudekit/claudekit-engineer';
736
+ if (!fs.existsSync(submodulePath)) return;
737
+
738
+ // From submodule, create a fix branch
739
+ const result = run('create fix-auth-bug --prefix fix --dry-run --json', { cwd: submodulePath });
740
+ assert(result.success, 'Should succeed from submodule');
741
+ const json = assertJSON(result.output);
742
+ assert(json.wouldCreate.branch.startsWith('fix/'), 'Should have fix prefix');
743
+ // Worktree should go to superproject
744
+ assert(json.wouldCreate.worktreeRootSource.includes('superproject') ||
745
+ json.wouldCreate.worktreeRootSource.includes('monorepo'),
746
+ 'Should use superproject worktrees dir');
747
+ });
748
+
749
+ test('scenario: user cleans up old worktrees', () => {
750
+ // List worktrees first
751
+ const listResult = run('list --json');
752
+ assert(listResult.success, 'List should succeed');
753
+ const list = assertJSON(listResult.output);
754
+
755
+ // Try to remove a nonexistent worktree (simulating cleanup)
756
+ const removeResult = run('remove old-feature-xyz --json');
757
+ assert(!removeResult.success, 'Should fail for nonexistent');
758
+ const remove = assertJSON(removeResult.output);
759
+ assert(remove.error.availableWorktrees, 'Should show available worktrees for cleanup');
760
+ });
761
+
762
+ test('scenario: user with WORKTREE_ROOT env var', () => {
763
+ const customRoot = '/tmp/custom-worktrees';
764
+ try {
765
+ const output = execSync(
766
+ `WORKTREE_ROOT="${customRoot}" node "${SCRIPT_PATH}" info --json`,
767
+ { encoding: 'utf-8', cwd: STANDALONE_DIR, stdio: ['pipe', 'pipe', 'pipe'] }
768
+ );
769
+ const json = JSON.parse(output.trim());
770
+ assert(json.worktreeRoot === customRoot, 'Should use env var');
771
+ assert(json.worktreeRootSource === 'WORKTREE_ROOT env', 'Should indicate env source');
772
+ } catch (error) {
773
+ // Skip if env var handling fails
774
+ }
775
+ });
776
+
777
+ // ============================================
778
+ // SUMMARY
779
+ // ============================================
780
+ console.log('\n' + '='.repeat(50));
781
+ console.log(`\n📊 Test Results: ${passed} passed, ${failed} failed\n`);
782
+
783
+ if (failed > 0) {
784
+ console.log('Failed tests:');
785
+ results.filter(r => r.status === 'FAIL').forEach(r => {
786
+ console.log(` - ${r.name}: ${r.error}`);
787
+ });
788
+ process.exit(1);
789
+ } else {
790
+ console.log('✅ All tests passed!\n');
791
+ process.exit(0);
792
+ }