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.
- package/dist/index.js +20 -61
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/.ck.json +60 -0
- package/templates/.ckignore +27 -0
- package/templates/.mcp.json.example +23 -0
- package/templates/agents/brainstormer.md +18 -2
- package/templates/agents/code-reviewer.md +122 -142
- package/templates/agents/code-simplifier.md +50 -100
- package/templates/agents/debugger.md +27 -11
- package/templates/agents/docs-manager.md +100 -38
- package/templates/agents/fullstack-developer.md +15 -3
- package/templates/agents/git-manager.md +11 -386
- package/templates/agents/journal-writer.md +13 -8
- package/templates/agents/mcp-manager.md +21 -6
- package/templates/agents/planner.md +24 -8
- package/templates/agents/project-manager.md +17 -121
- package/templates/agents/researcher.md +22 -7
- package/templates/agents/tester.md +23 -7
- package/templates/agents/ui-ux-designer.md +23 -14
- package/templates/{commands → command-archive}/ask.md +5 -5
- package/templates/{commands → command-archive}/ck-help.md +18 -2
- package/templates/command-archive/docs/init.md +38 -0
- package/templates/command-archive/docs/summarize.md +22 -0
- package/templates/command-archive/docs/update.md +76 -0
- package/templates/command-archive/journal.md +18 -0
- package/templates/{commands → command-archive}/kanban.md +5 -7
- package/templates/{commands → command-archive}/plan/archive.md +2 -2
- package/templates/command-archive/plan/red-team.md +200 -0
- package/templates/command-archive/plan/validate.md +188 -0
- package/templates/command-archive/preview.md +283 -0
- package/templates/command-archive/review/codebase/parallel.md +122 -0
- package/templates/{commands → command-archive}/test/ui.md +3 -3
- package/templates/{commands → command-archive}/use-mcp.md +6 -2
- package/templates/command-archive/worktree.md +109 -0
- package/templates/hooks/__tests__/ck-config-utils.test.cjs +557 -0
- package/templates/hooks/__tests__/descriptive-name.test.cjs +292 -0
- package/templates/hooks/__tests__/dev-rules-reminder.test.cjs +336 -0
- package/templates/hooks/__tests__/integration/path-resolution.test.cjs +319 -0
- package/templates/hooks/__tests__/privacy-block.test.cjs +273 -0
- package/templates/hooks/__tests__/session-init.test.cjs +308 -0
- package/templates/hooks/__tests__/skill-dedup.test.cjs +527 -0
- package/templates/hooks/__tests__/subagent-init.test.cjs +622 -0
- package/templates/hooks/__tests__/task-completed-handler.test.cjs +246 -0
- package/templates/hooks/__tests__/team-context-inject.test.cjs +804 -0
- package/templates/hooks/__tests__/teammate-idle-handler.test.cjs +254 -0
- package/templates/hooks/cook-after-plan-reminder.cjs +72 -0
- package/templates/hooks/descriptive-name.cjs +47 -0
- package/templates/hooks/dev-rules-reminder.cjs +37 -214
- package/templates/hooks/lib/__tests__/README.md +240 -0
- package/templates/hooks/lib/__tests__/ck-config-utils.test.cjs +613 -1
- package/templates/hooks/lib/__tests__/context-builder.test.cjs +468 -0
- package/templates/hooks/lib/__tests__/project-detector.test.cjs +754 -0
- package/templates/hooks/lib/__tests__/statusline-integration.test.cjs +678 -0
- package/templates/hooks/lib/__tests__/statusline.test.cjs +689 -0
- package/templates/hooks/lib/ck-config-utils.cjs +146 -21
- package/templates/hooks/lib/colors.cjs +95 -0
- package/templates/hooks/lib/config-counter.cjs +103 -0
- package/templates/hooks/lib/context-builder.cjs +616 -0
- package/templates/hooks/lib/git-info-cache.cjs +143 -0
- package/templates/hooks/lib/hook-logger.cjs +92 -0
- package/templates/hooks/lib/privacy-checker.cjs +297 -0
- package/templates/hooks/lib/project-detector.cjs +474 -0
- package/templates/hooks/lib/scout-checker.cjs +263 -0
- package/templates/hooks/lib/transcript-parser.cjs +181 -0
- package/templates/hooks/notifications/discord_notify.sh +17 -4
- package/templates/hooks/notifications/docs/discord-hook-setup.md +26 -10
- package/templates/hooks/notifications/docs/telegram-hook-setup.md +24 -6
- package/templates/hooks/notifications/notify.cjs +0 -0
- package/templates/hooks/notifications/send-discord.sh +0 -0
- package/templates/hooks/notifications/telegram_notify.sh +17 -4
- package/templates/hooks/post-edit-simplify-reminder.cjs +156 -0
- package/templates/hooks/privacy-block.cjs +97 -188
- package/templates/hooks/scout-block/broad-pattern-detector.cjs +4 -6
- package/templates/hooks/scout-block/error-formatter.cjs +0 -0
- package/templates/hooks/scout-block/path-extractor.cjs +102 -13
- package/templates/hooks/scout-block/pattern-matcher.cjs +16 -1
- package/templates/hooks/scout-block/tests/{test-broad-pattern-detector.js → test-broad-pattern-detector.cjs} +1 -61
- package/templates/hooks/scout-block/tests/{test-build-command-allowlist.js → test-build-command-allowlist.cjs} +1 -1
- package/templates/hooks/scout-block/tests/{test-error-formatter.js → test-error-formatter.cjs} +1 -1
- package/templates/hooks/scout-block/tests/{test-full-flow-edge-cases.js → test-full-flow-edge-cases.cjs} +1 -1
- package/templates/hooks/scout-block/tests/{test-monorepo-scenarios.js → test-monorepo-scenarios.cjs} +1 -1
- package/templates/hooks/scout-block/tests/{test-path-extractor.js → test-path-extractor.cjs} +1 -1
- package/templates/hooks/scout-block/tests/{test-pattern-matcher.js → test-pattern-matcher.cjs} +1 -1
- package/templates/hooks/scout-block.cjs +100 -87
- package/templates/hooks/session-init.cjs +197 -330
- package/templates/hooks/skill-dedup.cjs +268 -0
- package/templates/hooks/subagent-init.cjs +75 -22
- package/templates/hooks/task-completed-handler.cjs +118 -0
- package/templates/hooks/team-context-inject.cjs +176 -0
- package/templates/hooks/teammate-idle-handler.cjs +121 -0
- package/templates/hooks/tests/scout-block/broad-pattern-detector.test.cjs +231 -0
- package/templates/hooks/tests/scout-block/fixtures/ckignore-custom.txt +6 -0
- package/templates/hooks/tests/scout-block/fixtures/ckignore-default.txt +13 -0
- package/templates/hooks/tests/scout-block/fixtures/ckignore-negation.txt +8 -0
- package/templates/hooks/tests/scout-block/path-extractor.test.cjs +527 -0
- package/templates/hooks/tests/scout-block/pattern-matcher.test.cjs +293 -0
- package/templates/hooks/tests/scout-block/scout-checker.test.cjs +741 -0
- package/templates/hooks/tests/{test-ckignore.js → test-ckignore.cjs} +0 -0
- package/templates/hooks/tests/{test-modularization-hook.js → test-modularization-hook.cjs} +0 -0
- package/templates/hooks/tests/{test-privacy-block.js → test-privacy-block.cjs} +1 -1
- package/templates/hooks/tests/test-scout-block.cjs +315 -0
- package/templates/hooks/usage-context-awareness.cjs +179 -0
- package/templates/metadata.json +104 -0
- package/templates/{workflows → rules}/development-rules.md +12 -53
- package/templates/rules/orchestration-protocol.md +43 -0
- package/templates/{workflows → rules}/primary-workflow.md +16 -4
- package/templates/rules/team-coordination-rules.md +90 -0
- package/templates/schemas/ck-config.schema.json +381 -0
- package/templates/scripts/README.md +94 -198
- package/templates/scripts/ck-help.py +19 -855
- package/templates/scripts/commands_data.yaml +3 -621
- package/templates/scripts/fix-shebang-permissions.sh +50 -0
- package/templates/scripts/generate_catalogs.py +37 -8
- package/templates/scripts/resolve_env.py +0 -0
- package/templates/scripts/scan_commands.py +14 -96
- package/templates/scripts/scan_skills.py +59 -19
- package/templates/scripts/set-active-plan.cjs +8 -3
- package/templates/scripts/skills_data.yaml +2 -596
- package/templates/scripts/test-ck-help.py +15 -0
- package/templates/scripts/test_ck_help.py +139 -0
- package/templates/scripts/test_ck_help_integration.py +72 -0
- package/templates/scripts/validate-docs.cjs +342 -0
- package/templates/scripts/win_compat.py +0 -0
- package/templates/scripts/worktree.cjs +4 -652
- package/templates/scripts/worktree.test.cjs +5 -330
- package/templates/settings.json +104 -239
- package/templates/skills/README.md +95 -255
- package/templates/skills/THIRD_PARTY_NOTICES.md +405 -0
- package/templates/skills/agent-browser/SKILL.md +294 -0
- package/templates/skills/agent-browser/references/.gitkeep +0 -0
- package/templates/skills/agent-browser/references/agent-browser-vs-chrome-devtools.md +112 -0
- package/templates/skills/agent-browser/references/browserbase-cloud-setup.md +161 -0
- package/templates/skills/ai-artist/SKILL.md +103 -56
- package/templates/skills/ai-artist/data/awesome-prompts.csv +3592 -0
- package/templates/skills/ai-artist/data/lighting.csv +19 -0
- package/templates/skills/ai-artist/data/nano-banana-templates.csv +17 -0
- package/templates/skills/ai-artist/data/platforms.csv +11 -0
- package/templates/skills/ai-artist/data/styles.csv +26 -0
- package/templates/skills/ai-artist/data/techniques.csv +19 -0
- package/templates/skills/ai-artist/data/use-cases.csv +16 -0
- package/templates/skills/ai-artist/references/awesome-nano-banana-pro-prompts.md +8575 -0
- package/templates/skills/ai-artist/references/nano-banana.md +78 -1
- package/templates/skills/ai-artist/references/validation-workflow.md +117 -0
- package/templates/skills/ai-artist/scripts/core.py +197 -0
- package/templates/skills/ai-artist/scripts/extract_prompts.py +102 -0
- package/templates/skills/ai-artist/scripts/generate.py +370 -0
- package/templates/skills/ai-artist/scripts/search.py +147 -0
- package/templates/skills/ai-multimodal/SKILL.md +4 -3
- package/templates/skills/ai-multimodal/scripts/check_setup.py +12 -2
- package/templates/skills/ai-multimodal/scripts/document_converter.py +0 -0
- package/templates/skills/ai-multimodal/scripts/gemini_batch_process.py +3 -2
- package/templates/skills/ai-multimodal/scripts/media_optimizer.py +0 -0
- package/templates/skills/ask/SKILL.md +58 -0
- package/templates/skills/backend-development/SKILL.md +3 -2
- package/templates/skills/better-auth/SKILL.md +3 -2
- package/templates/skills/better-auth/scripts/better_auth_init.py +3 -3
- package/templates/skills/bootstrap/SKILL.md +101 -0
- package/templates/skills/bootstrap/references/shared-phases.md +59 -0
- package/templates/skills/bootstrap/references/workflow-auto.md +52 -0
- package/templates/skills/bootstrap/references/workflow-fast.md +50 -0
- package/templates/skills/bootstrap/references/workflow-full.md +60 -0
- package/templates/skills/bootstrap/references/workflow-parallel.md +59 -0
- package/templates/{commands/brainstorm.md → skills/brainstorm/SKILL.md} +21 -18
- package/templates/skills/chrome-devtools/SKILL.md +221 -68
- package/templates/skills/chrome-devtools/scripts/README.md +18 -0
- package/templates/skills/chrome-devtools/scripts/__tests__/error-handling.test.js +102 -0
- package/templates/skills/chrome-devtools/scripts/aria-snapshot.js +2 -1
- package/templates/skills/chrome-devtools/scripts/click.js +2 -1
- package/templates/skills/chrome-devtools/scripts/connect-chrome.js +146 -0
- package/templates/skills/chrome-devtools/scripts/console.js +3 -1
- package/templates/skills/chrome-devtools/scripts/evaluate.js +6 -3
- package/templates/skills/chrome-devtools/scripts/fill.js +2 -1
- package/templates/skills/chrome-devtools/scripts/import-cookies.js +205 -0
- package/templates/skills/chrome-devtools/scripts/inject-auth.js +2 -1
- package/templates/skills/chrome-devtools/scripts/install-deps.sh +0 -0
- package/templates/skills/chrome-devtools/scripts/install.sh +0 -0
- package/templates/skills/chrome-devtools/scripts/lib/browser.js +60 -4
- package/templates/skills/chrome-devtools/scripts/navigate.js +86 -2
- package/templates/skills/chrome-devtools/scripts/network.js +3 -1
- package/templates/skills/chrome-devtools/scripts/performance.js +3 -1
- package/templates/skills/chrome-devtools/scripts/screenshot.js +2 -1
- package/templates/skills/chrome-devtools/scripts/select-ref.js +2 -1
- package/templates/skills/chrome-devtools/scripts/snapshot.js +2 -1
- package/templates/skills/chrome-devtools/scripts/ws-debug.js +44 -0
- package/templates/skills/chrome-devtools/scripts/ws-full-debug.js +107 -0
- package/templates/skills/ck-help/SKILL.md +102 -0
- package/templates/skills/ck-help/scripts/ck-help.py +1321 -0
- package/templates/skills/ck-help/scripts/commands_data.yaml +3 -0
- package/templates/skills/ck-help/scripts/skills_data.yaml +593 -0
- package/templates/skills/code-review/SKILL.md +97 -93
- package/templates/skills/code-review/references/code-review-reception.md +113 -209
- package/templates/skills/code-review/references/codebase-scan-workflow.md +29 -0
- package/templates/skills/code-review/references/edge-case-scouting.md +119 -0
- package/templates/skills/code-review/references/parallel-review-workflow.md +69 -0
- package/templates/skills/code-review/references/requesting-code-review.md +115 -104
- package/templates/skills/code-review/references/task-management-reviews.md +140 -0
- package/templates/skills/code-review/references/verification-before-completion.md +138 -138
- package/templates/skills/coding-level/SKILL.md +56 -0
- package/templates/skills/common/README.md +120 -0
- package/templates/skills/common/api_key_helper.py +411 -0
- package/templates/skills/common/api_key_rotator.py +248 -0
- package/templates/skills/context-engineering/SKILL.md +108 -0
- package/templates/skills/context-engineering/references/context-compression.md +84 -0
- package/templates/skills/context-engineering/references/context-degradation.md +93 -0
- package/templates/skills/context-engineering/references/context-fundamentals.md +75 -0
- package/templates/skills/context-engineering/references/context-optimization.md +82 -0
- package/templates/skills/context-engineering/references/evaluation.md +89 -0
- package/templates/skills/context-engineering/references/memory-systems.md +88 -0
- package/templates/skills/context-engineering/references/multi-agent-patterns.md +90 -0
- package/templates/skills/context-engineering/references/project-development.md +97 -0
- package/templates/skills/context-engineering/references/runtime-awareness.md +202 -0
- package/templates/skills/context-engineering/references/tool-design.md +86 -0
- package/templates/skills/context-engineering/scripts/compression_evaluator.py +349 -0
- package/templates/skills/context-engineering/scripts/context_analyzer.py +317 -0
- package/templates/skills/context-engineering/scripts/tests/test_edge_cases.py +246 -0
- package/templates/skills/cook/README.md +86 -0
- package/templates/skills/cook/SKILL.md +113 -0
- package/templates/skills/cook/references/intent-detection.md +101 -0
- package/templates/skills/cook/references/review-cycle.md +75 -0
- package/templates/skills/cook/references/subagent-patterns.md +75 -0
- package/templates/skills/cook/references/workflow-steps.md +172 -0
- package/templates/skills/copywriting/SKILL.md +94 -0
- package/templates/skills/copywriting/references/copy-formulas.md +150 -0
- package/templates/skills/copywriting/references/cta-patterns.md +168 -0
- package/templates/skills/copywriting/references/email-copy.md +193 -0
- package/templates/skills/copywriting/references/headline-templates.md +140 -0
- package/templates/skills/copywriting/references/landing-page-copy.md +175 -0
- package/templates/skills/copywriting/references/power-words.md +189 -0
- package/templates/skills/copywriting/references/social-media-copy.md +222 -0
- package/templates/skills/copywriting/references/workflow-cro.md +83 -0
- package/templates/skills/copywriting/references/workflow-enhance.md +32 -0
- package/templates/skills/copywriting/references/workflow-fast.md +29 -0
- package/templates/skills/copywriting/references/workflow-good.md +39 -0
- package/templates/skills/copywriting/references/writing-styles.md +247 -0
- package/templates/skills/copywriting/scripts/extract-writing-styles.py +308 -0
- package/templates/skills/copywriting/templates/copy-brief.md +49 -0
- package/templates/skills/databases/SKILL.md +7 -155
- package/templates/skills/databases/analytics.md +198 -0
- package/templates/skills/databases/db-design.md +188 -0
- package/templates/skills/databases/incremental-etl.md +213 -0
- package/templates/skills/databases/scripts/db_backup.py +0 -0
- package/templates/skills/databases/scripts/db_migrate.py +3 -2
- package/templates/skills/databases/scripts/db_performance_check.py +3 -2
- package/templates/skills/databases/stacks/bigquery.md +231 -0
- package/templates/skills/databases/stacks/d1_cloudflare.md +137 -0
- package/templates/skills/databases/stacks/mysql.md +216 -0
- package/templates/skills/databases/stacks/postgres.md +235 -0
- package/templates/skills/databases/stacks/sqlite.md +244 -0
- package/templates/skills/databases/transactional.md +176 -0
- package/templates/skills/debug/SKILL.md +121 -0
- package/templates/skills/debug/references/frontend-verification.md +103 -0
- package/templates/skills/debug/references/investigation-methodology.md +101 -0
- package/templates/skills/debug/references/log-and-ci-analysis.md +97 -0
- package/templates/skills/debug/references/performance-diagnostics.md +113 -0
- package/templates/skills/debug/references/reporting-standards.md +122 -0
- package/templates/skills/debug/references/task-management-debugging.md +155 -0
- package/templates/skills/devops/SKILL.md +65 -253
- package/templates/skills/devops/references/kubernetes-basics.md +99 -0
- package/templates/skills/devops/references/kubernetes-helm-advanced.md +75 -0
- package/templates/skills/devops/references/kubernetes-helm.md +81 -0
- package/templates/skills/devops/references/kubernetes-kubectl.md +74 -0
- package/templates/skills/devops/references/kubernetes-security-advanced.md +98 -0
- package/templates/skills/devops/references/kubernetes-security.md +95 -0
- package/templates/skills/devops/references/kubernetes-troubleshooting-advanced.md +74 -0
- package/templates/skills/devops/references/kubernetes-troubleshooting.md +49 -0
- package/templates/skills/devops/references/kubernetes-workflows-advanced.md +75 -0
- package/templates/skills/devops/references/kubernetes-workflows.md +78 -0
- package/templates/skills/devops/scripts/cloudflare_deploy.py +0 -0
- package/templates/skills/devops/scripts/docker_optimize.py +3 -2
- package/templates/skills/docs/SKILL.md +55 -0
- package/templates/skills/docs/references/init-workflow.md +32 -0
- package/templates/skills/docs/references/summarize-workflow.md +18 -0
- package/templates/skills/docs/references/update-workflow.md +59 -0
- package/templates/skills/docs-seeker/SKILL.md +3 -2
- package/templates/skills/docs-seeker/scripts/analyze-llms-txt.js +0 -0
- package/templates/skills/docs-seeker/scripts/detect-topic.js +0 -0
- package/templates/skills/docs-seeker/scripts/fetch-docs.js +0 -0
- package/templates/skills/docs-seeker/scripts/tests/run-tests.js +0 -0
- package/templates/skills/docs-seeker/scripts/tests/test-analyze-llms.js +0 -0
- package/templates/skills/docs-seeker/scripts/tests/test-detect-topic.js +0 -0
- package/templates/skills/docs-seeker/scripts/tests/test-fetch-docs.js +0 -0
- package/templates/skills/docs-seeker/scripts/utils/env-loader.js +0 -0
- package/templates/skills/document-skills/docx/SKILL.md +2 -2
- package/templates/skills/document-skills/docx/ooxml/scripts/pack.py +0 -0
- package/templates/skills/document-skills/docx/ooxml/scripts/unpack.py +0 -0
- package/templates/skills/document-skills/docx/ooxml/scripts/validate.py +0 -0
- package/templates/skills/document-skills/docx/scripts/document.py +0 -0
- package/templates/skills/document-skills/docx/scripts/utilities.py +0 -0
- package/templates/skills/document-skills/pdf/SKILL.md +2 -2
- package/templates/skills/document-skills/pptx/SKILL.md +2 -2
- package/templates/skills/document-skills/pptx/ooxml/scripts/pack.py +0 -0
- package/templates/skills/document-skills/pptx/ooxml/scripts/unpack.py +0 -0
- package/templates/skills/document-skills/pptx/ooxml/scripts/validate.py +0 -0
- package/templates/skills/document-skills/pptx/scripts/inventory.py +0 -0
- package/templates/skills/document-skills/pptx/scripts/rearrange.py +0 -0
- package/templates/skills/document-skills/pptx/scripts/replace.py +0 -0
- package/templates/skills/document-skills/pptx/scripts/thumbnail.py +0 -0
- package/templates/skills/document-skills/xlsx/SKILL.md +2 -2
- package/templates/skills/document-skills/xlsx/recalc.py +3 -2
- package/templates/skills/find-skills/SKILL.md +134 -0
- package/templates/skills/fix/SKILL.md +111 -0
- package/templates/skills/fix/references/complexity-assessment.md +72 -0
- package/templates/skills/fix/references/mode-selection.md +46 -0
- package/templates/skills/fix/references/parallel-exploration.md +100 -0
- package/templates/skills/fix/references/review-cycle.md +77 -0
- package/templates/skills/fix/references/skill-activation-matrix.md +78 -0
- package/templates/skills/fix/references/task-orchestration.md +103 -0
- package/templates/skills/fix/references/workflow-ci.md +28 -0
- package/templates/skills/fix/references/workflow-deep.md +122 -0
- package/templates/skills/fix/references/workflow-logs.md +72 -0
- package/templates/skills/fix/references/workflow-quick.md +59 -0
- package/templates/skills/fix/references/workflow-standard.md +111 -0
- package/templates/skills/fix/references/workflow-test.md +75 -0
- package/templates/skills/fix/references/workflow-types.md +33 -0
- package/templates/skills/fix/references/workflow-ui.md +75 -0
- package/templates/skills/frontend-design/SKILL.md +78 -91
- package/templates/skills/frontend-design/references/ai-multimodal-overview.md +6 -6
- package/templates/skills/frontend-design/references/animejs.md +395 -395
- package/templates/skills/frontend-design/references/asset-generation.md +4 -4
- package/templates/skills/frontend-design/references/visual-analysis-overview.md +1 -1
- package/templates/skills/frontend-design/references/workflow-3d.md +102 -0
- package/templates/skills/frontend-design/references/workflow-describe.md +87 -0
- package/templates/skills/frontend-design/references/workflow-immersive.md +87 -0
- package/templates/skills/frontend-design/references/workflow-quick.md +57 -0
- package/templates/skills/frontend-design/references/workflow-screenshot.md +63 -0
- package/templates/skills/frontend-design/references/workflow-video.md +74 -0
- package/templates/skills/frontend-development/SKILL.md +4 -3
- package/templates/skills/git/SKILL.md +114 -0
- package/templates/skills/git/references/branch-management.md +88 -0
- package/templates/skills/git/references/commit-standards.md +46 -0
- package/templates/skills/git/references/gh-cli-guide.md +109 -0
- package/templates/skills/git/references/safety-protocols.md +69 -0
- package/templates/skills/git/references/workflow-commit.md +58 -0
- package/templates/skills/git/references/workflow-merge.md +48 -0
- package/templates/skills/git/references/workflow-pr.md +58 -0
- package/templates/skills/git/references/workflow-push.md +52 -0
- package/templates/skills/gkg/SKILL.md +91 -0
- package/templates/skills/gkg/references/cli-commands.md +106 -0
- package/templates/skills/gkg/references/http-api.md +102 -0
- package/templates/skills/gkg/references/language-support.md +57 -0
- package/templates/skills/gkg/references/mcp-tools.md +99 -0
- package/templates/skills/google-adk-python/SKILL.md +91 -195
- package/templates/skills/google-adk-python/references/agent-types-and-architecture.md +128 -0
- package/templates/skills/google-adk-python/references/callbacks-plugins-observability.md +117 -0
- package/templates/skills/google-adk-python/references/deployment-cloud-run-vertex-gke.md +138 -0
- package/templates/skills/google-adk-python/references/evaluation-testing-cli.md +112 -0
- package/templates/skills/google-adk-python/references/multi-agent-and-a2a-protocol.md +145 -0
- package/templates/skills/google-adk-python/references/sessions-state-memory-artifacts.md +131 -0
- package/templates/skills/google-adk-python/references/tools-and-mcp-integration.md +146 -0
- package/templates/skills/install.ps1 +130 -26
- package/templates/skills/install.sh +383 -63
- package/templates/{commands/journal.md → skills/journal/SKILL.md} +5 -1
- package/templates/skills/kanban/SKILL.md +99 -0
- package/templates/skills/markdown-novel-viewer/SKILL.md +314 -0
- package/templates/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/templates/skills/markdown-novel-viewer/assets/favicon.png +0 -0
- package/templates/skills/markdown-novel-viewer/assets/novel-theme.css +16 -0
- package/templates/skills/markdown-novel-viewer/assets/reader.js +838 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-base.css +54 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-components.css +180 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-content.css +176 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-header.css +217 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-mermaid.css +153 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-overlays.css +202 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-responsive.css +285 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-sidebar.css +359 -0
- package/templates/skills/markdown-novel-viewer/assets/styles/novel-theme-variables.css +56 -0
- package/templates/skills/markdown-novel-viewer/assets/template.html +149 -0
- package/templates/skills/markdown-novel-viewer/bun.lock +38 -0
- package/templates/skills/markdown-novel-viewer/package.json +15 -0
- package/templates/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/templates/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
- package/templates/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +571 -0
- package/templates/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/templates/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/templates/skills/markdown-novel-viewer/scripts/server.cjs +411 -0
- package/templates/skills/markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
- package/templates/skills/markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
- package/templates/skills/markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
- package/templates/skills/markdown-novel-viewer/tests/http-server.test.cjs +271 -0
- package/templates/skills/markdown-novel-viewer/tests/run-tests.cjs +51 -0
- package/templates/skills/markdown-novel-viewer/tests/test-framework.cjs +154 -0
- package/templates/skills/markdown-novel-viewer/tests/verify-xss.cjs +90 -0
- package/templates/skills/mcp-builder/SKILL.md +3 -2
- package/templates/skills/mcp-builder/scripts/evaluation.py +9 -1
- package/templates/skills/mcp-management/SKILL.md +8 -7
- package/templates/skills/mcp-management/references/gemini-cli-integration.md +16 -10
- package/templates/skills/mcp-management/scripts/cli.ts +0 -0
- package/templates/skills/mcp-management/scripts/dist/analyze-tools.js +0 -0
- package/templates/skills/mcp-management/scripts/dist/cli.js +0 -0
- package/templates/skills/mcp-management/scripts/dist/mcp-client.js +0 -0
- package/templates/skills/mcp-management/scripts/mcp-client.ts +0 -0
- package/templates/skills/media-processing/SKILL.md +3 -2
- package/templates/skills/media-processing/scripts/batch-remove-background.sh +0 -0
- package/templates/skills/media-processing/scripts/batch_resize.py +0 -0
- package/templates/skills/media-processing/scripts/media_convert.py +0 -0
- package/templates/skills/media-processing/scripts/remove-background.sh +0 -0
- package/templates/skills/media-processing/scripts/remove-bg-node.js +0 -0
- package/templates/skills/media-processing/scripts/tests/test_batch_resize.py +0 -0
- package/templates/skills/media-processing/scripts/tests/test_media_convert.py +0 -0
- package/templates/skills/media-processing/scripts/tests/test_video_optimize.py +0 -0
- package/templates/skills/media-processing/scripts/video_optimize.py +0 -0
- package/templates/skills/mermaidjs-v11/SKILL.md +116 -0
- package/templates/skills/mermaidjs-v11/references/cli-usage.md +228 -0
- package/templates/skills/mermaidjs-v11/references/configuration.md +232 -0
- package/templates/skills/mermaidjs-v11/references/diagram-types.md +315 -0
- package/templates/skills/mermaidjs-v11/references/examples.md +344 -0
- package/templates/skills/mermaidjs-v11/references/integration.md +310 -0
- package/templates/skills/mintlify/SKILL.md +121 -0
- package/templates/skills/mintlify/references/ai-features-and-integrations-reference.md +756 -0
- package/templates/skills/mintlify/references/api-documentation-components-reference.md +873 -0
- package/templates/skills/mintlify/references/deployment-and-continuous-integration-reference.md +674 -0
- package/templates/skills/mintlify/references/docs-json-configuration-reference.md +724 -0
- package/templates/skills/mintlify/references/mdx-components-reference.md +551 -0
- package/templates/skills/mintlify/references/navigation-structure-and-organization-reference.md +775 -0
- package/templates/skills/mobile-development/SKILL.md +3 -2
- package/templates/skills/payment-integration/README.md +44 -12
- package/templates/skills/payment-integration/SKILL.md +82 -97
- package/templates/skills/payment-integration/references/creem/api.md +139 -0
- package/templates/skills/payment-integration/references/creem/checkouts.md +99 -0
- package/templates/skills/payment-integration/references/creem/licensing.md +136 -0
- package/templates/skills/payment-integration/references/creem/overview.md +65 -0
- package/templates/skills/payment-integration/references/creem/sdk.md +161 -0
- package/templates/skills/payment-integration/references/creem/subscriptions.md +129 -0
- package/templates/skills/payment-integration/references/creem/webhooks.md +120 -0
- package/templates/skills/payment-integration/references/implementation-workflows.md +43 -0
- package/templates/skills/payment-integration/references/multi-provider-order-management-patterns.md +821 -0
- package/templates/skills/payment-integration/references/paddle/api.md +116 -0
- package/templates/skills/payment-integration/references/paddle/best-practices.md +130 -0
- package/templates/skills/payment-integration/references/paddle/overview.md +57 -0
- package/templates/skills/payment-integration/references/paddle/paddle-js.md +106 -0
- package/templates/skills/payment-integration/references/paddle/sdk.md +131 -0
- package/templates/skills/payment-integration/references/paddle/subscriptions.md +118 -0
- package/templates/skills/payment-integration/references/paddle/webhooks.md +112 -0
- package/templates/skills/payment-integration/references/polar/best-practices.md +781 -361
- package/templates/skills/payment-integration/references/sepay/best-practices.md +870 -268
- package/templates/skills/payment-integration/references/stripe/stripe-best-practices.md +32 -0
- package/templates/skills/payment-integration/references/stripe/stripe-cli.md +148 -0
- package/templates/skills/payment-integration/references/stripe/stripe-js.md +116 -0
- package/templates/skills/payment-integration/references/stripe/stripe-sdks.md +84 -0
- package/templates/skills/payment-integration/references/stripe/stripe-upgrade.md +175 -0
- package/templates/skills/payment-integration/scripts/checkout-helper.js +0 -0
- package/templates/skills/payment-integration/scripts/polar-webhook-verify.js +0 -0
- package/templates/skills/payment-integration/scripts/sepay-webhook-verify.js +0 -0
- package/templates/skills/payment-integration/scripts/test-scripts.js +0 -0
- package/templates/skills/plan/SKILL.md +137 -0
- package/templates/skills/plan/references/archive-workflow.md +53 -0
- package/templates/skills/{planning → plan}/references/codebase-understanding.md +1 -1
- package/templates/skills/{planning → plan}/references/output-standards.md +15 -1
- package/templates/skills/{planning → plan}/references/plan-organization.md +12 -19
- package/templates/skills/plan/references/red-team-personas.md +69 -0
- package/templates/skills/plan/references/red-team-workflow.md +77 -0
- package/templates/skills/{planning → plan}/references/research-phase.md +2 -2
- package/templates/skills/plan/references/task-management.md +132 -0
- package/templates/skills/plan/references/validate-question-framework.md +80 -0
- package/templates/skills/plan/references/validate-workflow.md +65 -0
- package/templates/skills/plan/references/workflow-modes.md +145 -0
- package/templates/skills/plans-kanban/SKILL.md +167 -0
- package/templates/skills/plans-kanban/assets/dashboard-template.html +119 -0
- package/templates/skills/plans-kanban/assets/dashboard.css +1594 -0
- package/templates/skills/plans-kanban/assets/dashboard.js +596 -0
- package/templates/skills/plans-kanban/assets/favicon.png +0 -0
- package/templates/skills/plans-kanban/package.json +13 -0
- package/templates/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +884 -0
- package/templates/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
- package/templates/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
- package/templates/skills/plans-kanban/scripts/lib/plan-parser.cjs +175 -0
- package/templates/skills/plans-kanban/scripts/lib/plan-scanner.cjs +272 -0
- package/templates/skills/plans-kanban/scripts/lib/port-finder.cjs +48 -0
- package/templates/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
- package/templates/skills/plans-kanban/scripts/server.cjs +260 -0
- package/templates/skills/preview/SKILL.md +75 -0
- package/templates/skills/preview/references/generation-modes.md +95 -0
- package/templates/skills/preview/references/view-mode.md +42 -0
- package/templates/skills/problem-solving/SKILL.md +3 -2
- package/templates/skills/project-management/SKILL.md +122 -0
- package/templates/skills/project-management/references/documentation-triggers.md +60 -0
- package/templates/skills/project-management/references/hydration-workflow.md +85 -0
- package/templates/skills/project-management/references/progress-tracking.md +96 -0
- package/templates/skills/project-management/references/reporting-patterns.md +94 -0
- package/templates/skills/project-management/references/task-operations.md +85 -0
- package/templates/skills/react-best-practices/AGENTS.md +2249 -0
- package/templates/skills/react-best-practices/README.md +123 -0
- package/templates/skills/react-best-practices/SKILL.md +122 -0
- package/templates/skills/react-best-practices/metadata.json +15 -0
- package/templates/skills/react-best-practices/rules/_sections.md +46 -0
- package/templates/skills/react-best-practices/rules/_template.md +28 -0
- package/templates/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/templates/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/templates/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/templates/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/templates/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/templates/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/templates/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/templates/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/templates/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/templates/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/templates/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/templates/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/templates/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/templates/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/templates/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/templates/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/templates/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/templates/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/templates/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/templates/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/templates/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/templates/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/templates/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/templates/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/templates/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/templates/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/templates/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/templates/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/templates/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/templates/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/templates/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/templates/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/templates/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/templates/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/templates/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/templates/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/templates/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/templates/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/templates/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/templates/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/templates/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/templates/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/templates/skills/react-best-practices/rules/server-cache-react.md +26 -0
- package/templates/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
- package/templates/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/templates/skills/remotion/SKILL.md +44 -0
- package/templates/skills/remotion/rules/3d.md +86 -0
- package/templates/skills/remotion/rules/animations.md +29 -0
- package/templates/skills/remotion/rules/assets/charts-bar-chart.tsx +173 -0
- package/templates/skills/remotion/rules/assets/text-animations-typewriter.tsx +100 -0
- package/templates/skills/remotion/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/templates/skills/remotion/rules/assets.md +78 -0
- package/templates/skills/remotion/rules/audio.md +172 -0
- package/templates/skills/remotion/rules/calculate-metadata.md +104 -0
- package/templates/skills/remotion/rules/can-decode.md +75 -0
- package/templates/skills/remotion/rules/charts.md +58 -0
- package/templates/skills/remotion/rules/compositions.md +146 -0
- package/templates/skills/remotion/rules/display-captions.md +126 -0
- package/templates/skills/remotion/rules/extract-frames.md +229 -0
- package/templates/skills/remotion/rules/fonts.md +152 -0
- package/templates/skills/remotion/rules/get-audio-duration.md +58 -0
- package/templates/skills/remotion/rules/get-video-dimensions.md +68 -0
- package/templates/skills/remotion/rules/get-video-duration.md +58 -0
- package/templates/skills/remotion/rules/gifs.md +138 -0
- package/templates/skills/remotion/rules/images.md +130 -0
- package/templates/skills/remotion/rules/import-srt-captions.md +67 -0
- package/templates/skills/remotion/rules/lottie.md +68 -0
- package/templates/skills/remotion/rules/measuring-dom-nodes.md +35 -0
- package/templates/skills/remotion/rules/measuring-text.md +143 -0
- package/templates/skills/remotion/rules/sequencing.md +106 -0
- package/templates/skills/remotion/rules/tailwind.md +11 -0
- package/templates/skills/remotion/rules/text-animations.md +20 -0
- package/templates/skills/remotion/rules/timing.md +179 -0
- package/templates/skills/remotion/rules/transcribe-captions.md +19 -0
- package/templates/skills/remotion/rules/transitions.md +122 -0
- package/templates/skills/remotion/rules/trimming.md +53 -0
- package/templates/skills/remotion/rules/videos.md +171 -0
- package/templates/skills/repomix/SKILL.md +3 -2
- package/templates/skills/repomix/scripts/repomix_batch.py +0 -0
- package/templates/skills/research/SKILL.md +9 -6
- package/templates/skills/scout/SKILL.md +89 -0
- package/templates/skills/scout/references/external-scouting.md +140 -0
- package/templates/skills/scout/references/internal-scouting.md +119 -0
- package/templates/skills/scout/references/task-management-scouting.md +125 -0
- package/templates/skills/sequential-thinking/SKILL.md +3 -2
- package/templates/skills/sequential-thinking/scripts/format-thought.js +0 -0
- package/templates/skills/sequential-thinking/scripts/process-thought.js +0 -0
- package/templates/skills/shader/SKILL.md +113 -0
- package/templates/skills/shader/references/glsl-cellular-voronoi-worley-noise-patterns.md +142 -0
- package/templates/skills/shader/references/glsl-colors-rgb-hsb-gradients-mixing-color-spaces.md +143 -0
- package/templates/skills/shader/references/glsl-fbm-fractional-brownian-motion-turbulence-octaves.md +146 -0
- package/templates/skills/shader/references/glsl-fundamentals-data-types-vectors-precision-coordinates.md +104 -0
- package/templates/skills/shader/references/glsl-noise-random-perlin-simplex-cellular-voronoi.md +115 -0
- package/templates/skills/shader/references/glsl-pattern-symmetry-truchet-domain-warping.md +134 -0
- package/templates/skills/shader/references/glsl-patterns-tiling-fract-matrices-transformations.md +133 -0
- package/templates/skills/shader/references/glsl-procedural-textures-clouds-marble-wood-terrain.md +144 -0
- package/templates/skills/shader/references/glsl-shader-builtin-functions-complete-api-reference.md +112 -0
- package/templates/skills/shader/references/glsl-shapes-polygon-star-polar-sdf-combinations.md +124 -0
- package/templates/skills/shader/references/glsl-shapes-sdf-circles-rectangles-polar-distance-fields.md +106 -0
- package/templates/skills/shader/references/glsl-shaping-functions-step-smoothstep-curves-interpolation.md +141 -0
- package/templates/skills/shopify/SKILL.md +3 -2
- package/templates/skills/shopify/scripts/shopify_init.py +5 -5
- package/templates/skills/skill-creator/SKILL.md +91 -238
- package/templates/skills/skill-creator/references/benchmark-optimization-guide.md +86 -0
- package/templates/skills/skill-creator/references/distribution-guide.md +79 -0
- package/templates/skills/skill-creator/references/mcp-skills-integration.md +71 -0
- package/templates/skills/skill-creator/references/metadata-quality-criteria.md +76 -0
- package/templates/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -0
- package/templates/skills/skill-creator/references/plugin-marketplace-overview.md +89 -0
- package/templates/skills/skill-creator/references/plugin-marketplace-schema.md +93 -0
- package/templates/skills/skill-creator/references/plugin-marketplace-sources.md +103 -0
- package/templates/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -0
- package/templates/skills/skill-creator/references/script-quality-criteria.md +106 -0
- package/templates/skills/skill-creator/references/skill-anatomy-and-requirements.md +76 -0
- package/templates/skills/skill-creator/references/skill-creation-workflow.md +95 -0
- package/templates/skills/skill-creator/references/skill-design-patterns.md +75 -0
- package/templates/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -0
- package/templates/skills/skill-creator/references/structure-organization-criteria.md +114 -0
- package/templates/skills/skill-creator/references/testing-and-iteration.md +78 -0
- package/templates/skills/skill-creator/references/token-efficiency-criteria.md +74 -0
- package/templates/skills/skill-creator/references/troubleshooting-guide.md +80 -0
- package/templates/skills/skill-creator/references/validation-checklist.md +83 -0
- package/templates/skills/skill-creator/references/writing-effective-instructions.md +88 -0
- package/templates/skills/skill-creator/references/yaml-frontmatter-reference.md +91 -0
- package/templates/skills/skill-creator/scripts/debug.zip +0 -0
- package/templates/skills/skill-creator/scripts/encoding_utils.py +36 -0
- package/templates/skills/skill-creator/scripts/init_skill.py +9 -4
- package/templates/skills/skill-creator/scripts/package_skill.py +5 -0
- package/templates/skills/skill-creator/scripts/quick_validate.py +6 -2
- package/templates/skills/tanstack/SKILL.md +141 -0
- package/templates/skills/tanstack/references/tanstack-ai.md +97 -0
- package/templates/skills/tanstack/references/tanstack-form.md +125 -0
- package/templates/skills/tanstack/references/tanstack-start.md +100 -0
- package/templates/skills/team/SKILL.md +285 -0
- package/templates/skills/team/references/agent-teams-controls-and-modes.md +107 -0
- package/templates/skills/team/references/agent-teams-examples-and-best-practices.md +182 -0
- package/templates/skills/team/references/agent-teams-official-docs.md +175 -0
- package/templates/skills/template-skill/SKILL.md +1 -1
- package/templates/skills/test/SKILL.md +109 -0
- package/templates/skills/test/references/report-format.md +58 -0
- package/templates/skills/test/references/test-execution-workflow.md +103 -0
- package/templates/skills/test/references/ui-testing-workflow.md +65 -0
- package/templates/skills/threejs/SKILL.md +106 -53
- package/templates/skills/threejs/data/api-reference.csv +61 -0
- package/templates/skills/threejs/data/categories.csv +14 -0
- package/templates/skills/threejs/data/examples-all.csv +557 -0
- package/templates/skills/threejs/data/use-cases.csv +21 -0
- package/templates/skills/threejs/references/00-fundamentals.md +487 -0
- package/templates/skills/threejs/references/11-materials-advanced.md +1 -1
- package/templates/skills/threejs/references/11-materials.md +519 -0
- package/templates/skills/threejs/references/17-shader.md +641 -0
- package/templates/skills/threejs/references/18-geometry.md +547 -0
- package/templates/skills/threejs/scripts/core.py +236 -0
- package/templates/skills/threejs/scripts/extract_examples.py +688 -0
- package/templates/skills/threejs/scripts/generate_csv_from_json.py +135 -0
- package/templates/skills/threejs/scripts/search.py +77 -0
- package/templates/skills/ui-styling/SKILL.md +3 -2
- package/templates/skills/ui-styling/scripts/shadcn_add.py +0 -0
- package/templates/skills/ui-styling/scripts/tailwind_config_gen.py +1 -1
- package/templates/skills/ui-ux-pro-max/SKILL.md +69 -32
- package/templates/skills/ui-ux-pro-max/data/charts.csv +25 -25
- package/templates/skills/ui-ux-pro-max/data/colors.csv +96 -96
- package/templates/skills/ui-ux-pro-max/data/landing.csv +30 -30
- package/templates/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/templates/skills/ui-ux-pro-max/data/prompts.csv +20 -20
- package/templates/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/templates/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/templates/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/templates/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/templates/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/templates/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/templates/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/templates/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/templates/skills/ui-ux-pro-max/data/styles.csv +58 -58
- package/templates/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/templates/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/templates/skills/ui-ux-pro-max/scripts/design_system.py +494 -0
- package/templates/skills/ui-ux-pro-max/scripts/search.py +84 -61
- package/templates/skills/use-mcp/SKILL.md +42 -0
- package/templates/skills/watzup/SKILL.md +12 -0
- package/templates/skills/web-design-guidelines/SKILL.md +36 -0
- package/templates/skills/web-frameworks/SKILL.md +4 -3
- package/templates/skills/web-frameworks/scripts/nextjs_init.py +13 -13
- package/templates/skills/web-frameworks/scripts/turborepo_migrate.py +0 -0
- package/templates/skills/web-testing/SKILL.md +97 -0
- package/templates/skills/web-testing/references/accessibility-testing.md +84 -0
- package/templates/skills/web-testing/references/api-testing.md +78 -0
- package/templates/skills/web-testing/references/ci-cd-testing-workflows.md +121 -0
- package/templates/skills/web-testing/references/component-testing.md +94 -0
- package/templates/skills/web-testing/references/contract-testing.md +146 -0
- package/templates/skills/web-testing/references/cross-browser-checklist.md +72 -0
- package/templates/skills/web-testing/references/database-testing.md +139 -0
- package/templates/skills/web-testing/references/e2e-testing-playwright.md +119 -0
- package/templates/skills/web-testing/references/functional-testing-checklist.md +88 -0
- package/templates/skills/web-testing/references/interactive-testing-patterns.md +89 -0
- package/templates/skills/web-testing/references/load-testing-k6.md +93 -0
- package/templates/skills/web-testing/references/mobile-gesture-testing.md +85 -0
- package/templates/skills/web-testing/references/performance-core-web-vitals.md +124 -0
- package/templates/skills/web-testing/references/playwright-component-testing.md +115 -0
- package/templates/skills/web-testing/references/pre-release-checklist.md +75 -0
- package/templates/skills/web-testing/references/security-checklists.md +81 -0
- package/templates/skills/web-testing/references/security-testing-overview.md +92 -0
- package/templates/skills/web-testing/references/shadow-dom-testing.md +70 -0
- package/templates/skills/web-testing/references/test-data-management.md +131 -0
- package/templates/skills/web-testing/references/test-flakiness-mitigation.md +86 -0
- package/templates/skills/web-testing/references/testing-pyramid-strategy.md +76 -0
- package/templates/skills/web-testing/references/unit-integration-testing.md +138 -0
- package/templates/skills/web-testing/references/visual-regression.md +92 -0
- package/templates/skills/web-testing/references/vulnerability-payloads.md +93 -0
- package/templates/skills/web-testing/scripts/analyze-test-results.js +280 -0
- package/templates/skills/web-testing/scripts/init-playwright.js +233 -0
- package/templates/skills/worktree/SKILL.md +96 -0
- package/templates/skills/worktree/scripts/worktree.cjs +916 -0
- package/templates/skills/worktree/scripts/worktree.test.cjs +792 -0
- package/templates/statusline.cjs +477 -244
- package/templates/statusline.ps1 +0 -1
- package/templates/statusline.sh +0 -1
- package/templates/agents/README.md +0 -172
- package/templates/agents/copywriter.md +0 -113
- package/templates/agents/database-admin.md +0 -97
- package/templates/agents/scout-external.md +0 -146
- package/templates/agents/scout.md +0 -260
- package/templates/commands/README.md +0 -251
- package/templates/commands/bootstrap/auto/fast.md +0 -111
- package/templates/commands/bootstrap/auto/parallel.md +0 -66
- package/templates/commands/bootstrap/auto.md +0 -115
- package/templates/commands/bootstrap.md +0 -137
- package/templates/commands/build.md +0 -39
- package/templates/commands/checkpoint.md +0 -156
- package/templates/commands/code/auto.md +0 -170
- package/templates/commands/code/no-test.md +0 -158
- package/templates/commands/code/parallel.md +0 -55
- package/templates/commands/code-simplifier.md +0 -71
- package/templates/commands/code.md +0 -176
- package/templates/commands/compact.md +0 -57
- package/templates/commands/content/cro.md +0 -43
- package/templates/commands/content/enhance.md +0 -14
- package/templates/commands/content/fast.md +0 -13
- package/templates/commands/content/good.md +0 -16
- package/templates/commands/context.md +0 -48
- package/templates/commands/cook/auto/fast.md +0 -26
- package/templates/commands/cook/auto/parallel.md +0 -49
- package/templates/commands/cook/auto.md +0 -15
- package/templates/commands/cook/fast.md +0 -47
- package/templates/commands/cook/hard.md +0 -80
- package/templates/commands/cook/parallel.md +0 -90
- package/templates/commands/cook.md +0 -105
- package/templates/commands/create-feature.md +0 -48
- package/templates/commands/db-migrate.md +0 -52
- package/templates/commands/debug.md +0 -13
- package/templates/commands/design/3d.md +0 -83
- package/templates/commands/design/describe.md +0 -23
- package/templates/commands/design/fast.md +0 -31
- package/templates/commands/design/good.md +0 -35
- package/templates/commands/design/screenshot.md +0 -34
- package/templates/commands/design/video.md +0 -34
- package/templates/commands/docs/init.md +0 -39
- package/templates/commands/docs/summarize.md +0 -31
- package/templates/commands/docs/update.md +0 -57
- package/templates/commands/feature.md +0 -62
- package/templates/commands/fix/ci.md +0 -17
- package/templates/commands/fix/fast.md +0 -19
- package/templates/commands/fix/hard.md +0 -39
- package/templates/commands/fix/logs.md +0 -26
- package/templates/commands/fix/parallel.md +0 -54
- package/templates/commands/fix/test.md +0 -20
- package/templates/commands/fix/types.md +0 -9
- package/templates/commands/fix/ui.md +0 -48
- package/templates/commands/fix-issue.md +0 -177
- package/templates/commands/fix.md +0 -43
- package/templates/commands/generate-dto.md +0 -67
- package/templates/commands/git/cm.md +0 -5
- package/templates/commands/git/cp.md +0 -4
- package/templates/commands/git/merge.md +0 -40
- package/templates/commands/git/pr.md +0 -48
- package/templates/commands/integrate/polar.md +0 -28
- package/templates/commands/integrate/sepay.md +0 -28
- package/templates/commands/investigate.md +0 -324
- package/templates/commands/lint.md +0 -47
- package/templates/commands/migration.md +0 -111
- package/templates/commands/performance.md +0 -110
- package/templates/commands/plan/ci.md +0 -33
- package/templates/commands/plan/cro.md +0 -69
- package/templates/commands/plan/fast.md +0 -86
- package/templates/commands/plan/hard.md +0 -103
- package/templates/commands/plan/parallel.md +0 -152
- package/templates/commands/plan/preview.md +0 -40
- package/templates/commands/plan/two.md +0 -52
- package/templates/commands/plan/validate.md +0 -132
- package/templates/commands/plan.md +0 -36
- package/templates/commands/pr.md +0 -49
- package/templates/commands/preview.md +0 -87
- package/templates/commands/release-notes.md +0 -144
- package/templates/commands/review/post-task.md +0 -157
- package/templates/commands/review-changes.md +0 -46
- package/templates/commands/review.md +0 -56
- package/templates/commands/scout/ext.md +0 -35
- package/templates/commands/scout.md +0 -283
- package/templates/commands/security.md +0 -119
- package/templates/commands/skill/add.md +0 -36
- package/templates/commands/skill/create.md +0 -29
- package/templates/commands/skill/fix-logs.md +0 -22
- package/templates/commands/skill/optimize/auto.md +0 -25
- package/templates/commands/skill/optimize.md +0 -34
- package/templates/commands/skill/plan.md +0 -45
- package/templates/commands/worktree.md +0 -126
- package/templates/hooks/.python-cache.json +0 -1
- package/templates/hooks/README.md +0 -246
- package/templates/hooks/backend-csharp-context.cjs +0 -223
- package/templates/hooks/design-system-context.cjs +0 -185
- package/templates/hooks/frontend-typescript-context.cjs +0 -233
- package/templates/hooks/lib/ck-paths.cjs +0 -110
- package/templates/hooks/lib/context-tracker.cjs +0 -335
- package/templates/hooks/notify-waiting.js +0 -117
- package/templates/hooks/post-edit-prettier.cjs +0 -189
- package/templates/hooks/post-task-review.cjs +0 -142
- package/templates/hooks/scss-styling-context.cjs +0 -213
- package/templates/hooks/session-end.cjs +0 -35
- package/templates/hooks/tests/test-context-tracker.cjs +0 -454
- package/templates/hooks/tests/test-scout-block.js +0 -163
- package/templates/hooks/workflow-router.cjs +0 -326
- package/templates/hooks/write-compact-marker.cjs +0 -159
- package/templates/memory/session-log.md +0 -186
- package/templates/router/README.md +0 -294
- package/templates/router/agents-guide.md +0 -38
- package/templates/router/commands-guide.md +0 -122
- package/templates/router/decision-flow.md +0 -92
- package/templates/router/skills-guide.md +0 -127
- package/templates/router/workflows-guide.md +0 -68
- package/templates/scripts/__pycache__/win_compat.cpython-312.pyc +0 -0
- package/templates/scripts/plan-preview.cjs +0 -921
- package/templates/skills/arch-cross-service-integration/SKILL.md +0 -48
- package/templates/skills/arch-performance-optimization/SKILL.md +0 -306
- package/templates/skills/arch-security-review/SKILL.md +0 -344
- package/templates/skills/branch-comparison/SKILL.md +0 -150
- package/templates/skills/bug-diagnosis/SKILL.md +0 -309
- package/templates/skills/claude-code/references/advanced-features.md +0 -399
- package/templates/skills/claude-code/references/agent-skills.md +0 -399
- package/templates/skills/claude-code/references/api-reference.md +0 -498
- package/templates/skills/claude-code/references/best-practices.md +0 -447
- package/templates/skills/claude-code/references/cicd-integration.md +0 -428
- package/templates/skills/claude-code/references/common-workflows.md +0 -119
- package/templates/skills/claude-code/references/configuration.md +0 -480
- package/templates/skills/claude-code/references/enterprise-features.md +0 -472
- package/templates/skills/claude-code/references/getting-started.md +0 -252
- package/templates/skills/claude-code/references/hooks-and-plugins.md +0 -444
- package/templates/skills/claude-code/references/hooks-comprehensive.md +0 -622
- package/templates/skills/claude-code/references/ide-integration.md +0 -316
- package/templates/skills/claude-code/references/mcp-integration.md +0 -386
- package/templates/skills/claude-code/references/slash-commands.md +0 -489
- package/templates/skills/claude-code/references/troubleshooting.md +0 -456
- package/templates/skills/claude-code/skill.md +0 -60
- package/templates/skills/debugging/SKILL.md +0 -84
- package/templates/skills/developer-growth-analysis/SKILL.md +0 -322
- package/templates/skills/documentation/SKILL.md +0 -134
- package/templates/skills/domain-name-brainstormer/SKILL.md +0 -212
- package/templates/skills/dual-pass-review/SKILL.md +0 -249
- package/templates/skills/feature-docs/SKILL.md +0 -294
- package/templates/skills/feature-implementation/SKILL.md +0 -262
- package/templates/skills/feature-investigation/SKILL.md +0 -346
- package/templates/skills/frontend-design-pro/SKILL.md +0 -58
- package/templates/skills/package-upgrade/SKILL.md +0 -189
- package/templates/skills/plan-analysis/SKILL.md +0 -191
- package/templates/skills/planning/SKILL.md +0 -115
- package/templates/skills/planning-with-files/SKILL.md +0 -160
- package/templates/skills/planning-with-files/examples.md +0 -202
- package/templates/skills/planning-with-files/reference.md +0 -110
- package/templates/skills/project-index/SKILL.md +0 -97
- package/templates/skills/project-index/scripts/scan-structure.js +0 -417
- package/templates/skills/project-index/scripts/scan_structure.py +0 -450
- package/templates/skills/readme-improvement/SKILL.md +0 -177
- package/templates/skills/skill-share/SKILL.md +0 -80
- package/templates/skills/tasks-code-review/SKILL.md +0 -298
- package/templates/skills/tasks-documentation/SKILL.md +0 -328
- package/templates/skills/tasks-spec-update/SKILL.md +0 -318
- package/templates/skills/tasks-test-generation/SKILL.md +0 -433
- package/templates/skills/test-generation/SKILL.md +0 -203
- package/templates/skills/webapp-testing/LICENSE.txt +0 -202
- package/templates/skills/webapp-testing/SKILL.md +0 -96
- package/templates/skills/webapp-testing/examples/console_logging.py +0 -35
- package/templates/skills/webapp-testing/examples/element_discovery.py +0 -40
- package/templates/skills/webapp-testing/examples/static_html_automation.py +0 -33
- package/templates/skills/webapp-testing/scripts/with_server.py +0 -106
- package/templates/workflows/README.md +0 -241
- package/templates/workflows/orchestration-protocol.md +0 -16
- /package/templates/{commands → command-archive}/coding-level.md +0 -0
- /package/templates/{commands → command-archive}/review/codebase.md +0 -0
- /package/templates/{commands → command-archive}/test.md +0 -0
- /package/templates/{commands → command-archive}/watzup.md +0 -0
- /package/templates/hooks/scout-block/vendor/{ignore.js → ignore.cjs} +0 -0
- /package/templates/{workflows → rules}/documentation-management.md +0 -0
- /package/templates/skills/{debugging → debug}/references/defense-in-depth.md +0 -0
- /package/templates/skills/{debugging → debug}/references/root-cause-tracing.md +0 -0
- /package/templates/skills/{debugging → debug}/references/systematic-debugging.md +0 -0
- /package/templates/skills/{debugging → debug}/references/verification.md +0 -0
- /package/templates/skills/{debugging → debug}/scripts/find-polluter.sh +0 -0
- /package/templates/skills/{debugging → debug}/scripts/find-polluter.test.md +0 -0
- /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
|
+
}
|