kiro-kit 0.1.3 → 0.2.1
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 +28 -6
- package/dist/index.js.map +1 -1
- package/dist/presets/backend/commands/ask.md +57 -0
- package/dist/presets/backend/commands/bootstrap/auto/fast.md +112 -0
- package/dist/presets/backend/commands/bootstrap/auto.md +116 -0
- package/dist/presets/backend/commands/brainstorm.md +70 -0
- package/dist/presets/backend/commands/code.md +94 -0
- package/dist/presets/backend/commands/content/cro.md +44 -0
- package/dist/presets/backend/commands/content/enhance.md +15 -0
- package/dist/presets/backend/commands/content/fast.md +14 -0
- package/dist/presets/backend/commands/content/good.md +17 -0
- package/dist/presets/backend/commands/cook/auto/fast.md +27 -0
- package/dist/presets/backend/commands/cook/auto.md +16 -0
- package/dist/presets/backend/commands/cook.md +106 -0
- package/dist/presets/backend/commands/debug.md +14 -0
- package/dist/presets/backend/commands/docs/init.md +15 -0
- package/dist/presets/backend/commands/fix/ci.md +21 -0
- package/dist/presets/backend/commands/fix/fast.md +20 -0
- package/dist/presets/backend/commands/fix/hard.md +44 -0
- package/dist/presets/backend/commands/fix/logs.md +21 -0
- package/dist/presets/backend/commands/fix/test.md +21 -0
- package/dist/presets/backend/commands/fix/types.md +9 -0
- package/dist/presets/backend/commands/fix/ui.md +36 -0
- package/dist/presets/backend/commands/fix.md +13 -0
- package/dist/presets/backend/commands/git/cm.md +5 -0
- package/dist/presets/backend/commands/git/cp.md +4 -0
- package/dist/presets/backend/commands/integrate/polar.md +29 -0
- package/dist/presets/backend/commands/integrate/sepay.md +29 -0
- package/dist/presets/backend/commands/journal.md +5 -0
- package/dist/presets/backend/commands/plan/ci.md +19 -0
- package/dist/presets/backend/commands/plan/cro.md +57 -0
- package/dist/presets/backend/commands/plan/fast.md +47 -0
- package/dist/presets/backend/commands/plan/hard.md +58 -0
- package/dist/presets/backend/commands/plan/two.md +31 -0
- package/dist/presets/backend/commands/plan.md +24 -0
- package/dist/presets/backend/commands/review/codebase.md +50 -0
- package/dist/presets/backend/commands/skill/fix-logs.md +22 -0
- package/dist/presets/backend/commands/use-mcp.md +35 -0
- package/dist/presets/backend/commands/watzup.md +8 -0
- package/dist/presets/backend/hooks/discord-hook-setup.md +412 -0
- package/dist/presets/backend/hooks/telegram-hook-setup.md +774 -0
- package/dist/presets/backend/manifest.json +1948 -152
- package/dist/presets/backend/metadata.json +15 -0
- package/dist/presets/backend/skills/ai-multimodal/.env.example +97 -0
- package/dist/presets/backend/skills/ai-multimodal/SKILL.md +12 -4
- package/dist/presets/backend/skills/ai-multimodal/references/audio-processing.md +373 -0
- package/dist/presets/backend/skills/ai-multimodal/references/image-generation.md +558 -0
- package/dist/presets/backend/skills/ai-multimodal/references/video-analysis.md +498 -0
- package/dist/presets/backend/skills/ai-multimodal/references/vision-understanding.md +479 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/.coverage +0 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/document_converter.py +395 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/gemini_batch_process.py +480 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/requirements.txt +26 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/tests/.coverage +0 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/tests/test_failures.log +258 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/dist/presets/backend/skills/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/dist/presets/backend/skills/backend-development/SKILL.md +9 -4
- package/dist/presets/backend/skills/backend-development/references/backend-api-design.md +495 -0
- package/dist/presets/backend/skills/backend-development/references/backend-architecture.md +454 -0
- package/dist/presets/backend/skills/backend-development/references/backend-authentication.md +338 -0
- package/dist/presets/backend/skills/backend-development/references/backend-code-quality.md +659 -0
- package/dist/presets/backend/skills/backend-development/references/backend-debugging.md +904 -0
- package/dist/presets/backend/skills/backend-development/references/backend-devops.md +494 -0
- package/dist/presets/backend/skills/backend-development/references/backend-mindset.md +387 -0
- package/dist/presets/backend/skills/backend-development/references/backend-performance.md +397 -0
- package/dist/presets/backend/skills/backend-development/references/backend-security.md +290 -0
- package/dist/presets/backend/skills/backend-development/references/backend-technologies.md +256 -0
- package/dist/presets/backend/skills/backend-development/references/backend-testing.md +429 -0
- package/dist/presets/backend/skills/better-auth/SKILL.md +9 -4
- package/dist/presets/backend/skills/better-auth/references/advanced-features.md +553 -0
- package/dist/presets/backend/skills/better-auth/references/database-integration.md +577 -0
- package/dist/presets/backend/skills/better-auth/references/email-password-auth.md +416 -0
- package/dist/presets/backend/skills/better-auth/references/oauth-providers.md +430 -0
- package/dist/presets/backend/skills/better-auth/scripts/.coverage +0 -0
- package/dist/presets/backend/skills/better-auth/scripts/better_auth_init.py +521 -0
- package/dist/presets/backend/skills/better-auth/scripts/requirements.txt +15 -0
- package/dist/presets/backend/skills/better-auth/scripts/tests/.coverage +0 -0
- package/dist/presets/backend/skills/better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/dist/presets/backend/skills/chrome-devtools/SKILL.md +8 -4
- package/dist/presets/backend/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/dist/presets/backend/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/dist/presets/backend/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/README.md +213 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/click.js +79 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/console.js +75 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/evaluate.js +49 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/fill.js +72 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/install-deps.sh +181 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/install.sh +83 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/lib/browser.js +122 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/lib/selector.js +178 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/navigate.js +46 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/network.js +102 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/package.json +15 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/performance.js +145 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/screenshot.js +180 -0
- package/dist/presets/backend/skills/chrome-devtools/scripts/snapshot.js +131 -0
- package/dist/presets/backend/skills/claude-code/references/advanced-features.md +399 -0
- package/dist/presets/backend/skills/claude-code/references/agent-skills.md +399 -0
- package/dist/presets/backend/skills/claude-code/references/api-reference.md +498 -0
- package/dist/presets/backend/skills/claude-code/references/best-practices.md +447 -0
- package/dist/presets/backend/skills/claude-code/references/cicd-integration.md +428 -0
- package/dist/presets/backend/skills/claude-code/references/configuration.md +480 -0
- package/dist/presets/backend/skills/claude-code/references/enterprise-features.md +472 -0
- package/dist/presets/backend/skills/claude-code/references/getting-started.md +252 -0
- package/dist/presets/backend/skills/claude-code/references/hooks-and-plugins.md +441 -0
- package/dist/presets/backend/skills/claude-code/references/ide-integration.md +316 -0
- package/dist/presets/backend/skills/claude-code/references/mcp-integration.md +386 -0
- package/dist/presets/backend/skills/claude-code/references/slash-commands.md +489 -0
- package/dist/presets/backend/skills/claude-code/references/troubleshooting.md +456 -0
- package/dist/presets/backend/skills/claude-code/skill.md +194 -0
- package/dist/presets/backend/skills/code-review/references/code-review-reception.md +213 -0
- package/dist/presets/backend/skills/code-review/references/requesting-code-review.md +108 -0
- package/dist/presets/backend/skills/code-review/references/verification-before-completion.md +142 -0
- package/dist/presets/backend/skills/common/README.md +120 -0
- package/dist/presets/backend/skills/common/api_key_helper.py +300 -0
- package/dist/presets/backend/skills/databases/SKILL.md +8 -4
- package/dist/presets/backend/skills/databases/references/mongodb-aggregation.md +447 -0
- package/dist/presets/backend/skills/databases/references/mongodb-atlas.md +465 -0
- package/dist/presets/backend/skills/databases/references/mongodb-crud.md +408 -0
- package/dist/presets/backend/skills/databases/references/mongodb-indexing.md +442 -0
- package/dist/presets/backend/skills/databases/references/postgresql-administration.md +594 -0
- package/dist/presets/backend/skills/databases/references/postgresql-performance.md +527 -0
- package/dist/presets/backend/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/dist/presets/backend/skills/databases/references/postgresql-queries.md +475 -0
- package/dist/presets/backend/skills/databases/scripts/.coverage +0 -0
- package/dist/presets/backend/skills/databases/scripts/db_backup.py +502 -0
- package/dist/presets/backend/skills/databases/scripts/db_migrate.py +414 -0
- package/dist/presets/backend/skills/databases/scripts/db_performance_check.py +444 -0
- package/dist/presets/backend/skills/databases/scripts/requirements.txt +20 -0
- package/dist/presets/backend/skills/databases/scripts/tests/coverage-db.json +1 -0
- package/dist/presets/backend/skills/databases/scripts/tests/requirements.txt +4 -0
- package/dist/presets/backend/skills/databases/scripts/tests/test_db_backup.py +340 -0
- package/dist/presets/backend/skills/databases/scripts/tests/test_db_migrate.py +277 -0
- package/dist/presets/backend/skills/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/dist/presets/backend/skills/debugging/SKILL.md +8 -4
- package/dist/presets/backend/skills/debugging/references/defense-in-depth.md +124 -0
- package/dist/presets/backend/skills/debugging/references/root-cause-tracing.md +122 -0
- package/dist/presets/backend/skills/debugging/references/systematic-debugging.md +102 -0
- package/dist/presets/backend/skills/debugging/references/verification.md +123 -0
- package/dist/presets/backend/skills/debugging/scripts/find-polluter.sh +63 -0
- package/dist/presets/backend/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/dist/presets/backend/skills/devops/.env.example +76 -0
- package/dist/presets/backend/skills/devops/SKILL.md +9 -4
- package/dist/presets/backend/skills/devops/references/browser-rendering.md +305 -0
- package/dist/presets/backend/skills/devops/references/cloudflare-d1-kv.md +123 -0
- package/dist/presets/backend/skills/devops/references/cloudflare-platform.md +271 -0
- package/dist/presets/backend/skills/devops/references/cloudflare-r2-storage.md +280 -0
- package/dist/presets/backend/skills/devops/references/cloudflare-workers-advanced.md +312 -0
- package/dist/presets/backend/skills/devops/references/cloudflare-workers-apis.md +309 -0
- package/dist/presets/backend/skills/devops/references/cloudflare-workers-basics.md +418 -0
- package/dist/presets/backend/skills/devops/references/docker-basics.md +297 -0
- package/dist/presets/backend/skills/devops/references/docker-compose.md +292 -0
- package/dist/presets/backend/skills/devops/references/gcloud-platform.md +297 -0
- package/dist/presets/backend/skills/devops/references/gcloud-services.md +304 -0
- package/dist/presets/backend/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/dist/presets/backend/skills/devops/scripts/docker_optimize.py +320 -0
- package/dist/presets/backend/skills/devops/scripts/requirements.txt +20 -0
- package/dist/presets/backend/skills/devops/scripts/tests/requirements.txt +3 -0
- package/dist/presets/backend/skills/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/dist/presets/backend/skills/devops/scripts/tests/test_docker_optimize.py +436 -0
- package/dist/presets/backend/skills/docs-seeker/.env.example +15 -0
- package/dist/presets/backend/skills/docs-seeker/SKILL.md +7 -4
- package/dist/presets/backend/skills/docs-seeker/package.json +25 -0
- package/dist/presets/backend/skills/docs-seeker/references/advanced.md +79 -0
- package/dist/presets/backend/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/dist/presets/backend/skills/docs-seeker/references/errors.md +68 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/dist/presets/backend/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/dist/presets/backend/skills/docs-seeker/workflows/library-search.md +87 -0
- package/dist/presets/backend/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/dist/presets/backend/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/dist/presets/backend/skills/mcp-builder/LICENSE.txt +202 -0
- package/dist/presets/backend/skills/mcp-builder/SKILL.md +7 -4
- package/dist/presets/backend/skills/mcp-builder/reference/evaluation.md +602 -0
- package/dist/presets/backend/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/dist/presets/backend/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/dist/presets/backend/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/dist/presets/backend/skills/mcp-builder/scripts/connections.py +151 -0
- package/dist/presets/backend/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/dist/presets/backend/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/dist/presets/backend/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/dist/presets/backend/skills/mcp-management/README.md +219 -0
- package/dist/presets/backend/skills/mcp-management/assets/tools.json +3146 -0
- package/dist/presets/backend/skills/mcp-management/references/configuration.md +114 -0
- package/dist/presets/backend/skills/mcp-management/references/gemini-cli-integration.md +215 -0
- package/dist/presets/backend/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/dist/presets/backend/skills/mcp-management/scripts/.env.example +10 -0
- package/dist/presets/backend/skills/mcp-management/scripts/cli.ts +195 -0
- package/dist/presets/backend/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/dist/presets/backend/skills/mcp-management/scripts/dist/cli.js +127 -0
- package/dist/presets/backend/skills/mcp-management/scripts/dist/mcp-client.js +115 -0
- package/dist/presets/backend/skills/mcp-management/scripts/mcp-client.ts +230 -0
- package/dist/presets/backend/skills/mcp-management/scripts/package.json +20 -0
- package/dist/presets/backend/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/dist/presets/backend/skills/payment-integration/README.md +185 -0
- package/dist/presets/backend/skills/payment-integration/SKILL.md +127 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/benefits.md +396 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/best-practices.md +482 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/checkouts.md +266 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/overview.md +184 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/products.md +244 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/sdk.md +436 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/subscriptions.md +340 -0
- package/dist/presets/backend/skills/payment-integration/references/polar/webhooks.md +405 -0
- package/dist/presets/backend/skills/payment-integration/references/sepay/api.md +140 -0
- package/dist/presets/backend/skills/payment-integration/references/sepay/best-practices.md +337 -0
- package/dist/presets/backend/skills/payment-integration/references/sepay/overview.md +138 -0
- package/dist/presets/backend/skills/payment-integration/references/sepay/qr-codes.md +228 -0
- package/dist/presets/backend/skills/payment-integration/references/sepay/sdk.md +213 -0
- package/dist/presets/backend/skills/payment-integration/references/sepay/webhooks.md +208 -0
- package/dist/presets/backend/skills/payment-integration/scripts/.env.example +20 -0
- package/dist/presets/backend/skills/payment-integration/scripts/checkout-helper.js +244 -0
- package/dist/presets/backend/skills/payment-integration/scripts/package.json +17 -0
- package/dist/presets/backend/skills/payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/dist/presets/backend/skills/payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/dist/presets/backend/skills/payment-integration/scripts/test-scripts.js +237 -0
- package/dist/presets/backend/skills/planning/SKILL.md +8 -4
- package/dist/presets/backend/skills/planning/references/codebase-understanding.md +62 -0
- package/dist/presets/backend/skills/planning/references/output-standards.md +87 -0
- package/dist/presets/backend/skills/planning/references/plan-organization.md +100 -0
- package/dist/presets/backend/skills/planning/references/research-phase.md +49 -0
- package/dist/presets/backend/skills/planning/references/solution-design.md +63 -0
- package/dist/presets/backend/skills/problem-solving/SKILL.md +8 -4
- package/dist/presets/backend/skills/problem-solving/references/attribution.md +69 -0
- package/dist/presets/backend/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/dist/presets/backend/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/dist/presets/backend/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/dist/presets/backend/skills/problem-solving/references/scale-game.md +95 -0
- package/dist/presets/backend/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/dist/presets/backend/skills/problem-solving/references/when-stuck.md +72 -0
- package/dist/presets/backend/skills/repomix/references/configuration.md +211 -0
- package/dist/presets/backend/skills/repomix/references/usage-patterns.md +232 -0
- package/dist/presets/backend/skills/repomix/scripts/.coverage +0 -0
- package/dist/presets/backend/skills/repomix/scripts/README.md +179 -0
- package/dist/presets/backend/skills/repomix/scripts/repomix_batch.py +455 -0
- package/dist/presets/backend/skills/repomix/scripts/repos.example.json +15 -0
- package/dist/presets/backend/skills/repomix/scripts/requirements.txt +15 -0
- package/dist/presets/backend/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/dist/presets/backend/skills/sequential-thinking/.env.example +8 -0
- package/dist/presets/backend/skills/sequential-thinking/README.md +183 -0
- package/dist/presets/backend/skills/sequential-thinking/SKILL.md +9 -4
- package/dist/presets/backend/skills/sequential-thinking/package.json +31 -0
- package/dist/presets/backend/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/dist/presets/backend/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/dist/presets/backend/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/dist/presets/backend/skills/sequential-thinking/references/examples-api.md +88 -0
- package/dist/presets/backend/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/dist/presets/backend/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/dist/presets/backend/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/dist/presets/backend/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/dist/presets/backend/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/dist/presets/backend/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/dist/presets/backend/skills/shopify/README.md +66 -0
- package/dist/presets/backend/skills/shopify/SKILL.md +328 -0
- package/dist/presets/backend/skills/shopify/references/app-development.md +470 -0
- package/dist/presets/backend/skills/shopify/references/extensions.md +493 -0
- package/dist/presets/backend/skills/shopify/references/themes.md +498 -0
- package/dist/presets/backend/skills/shopify/scripts/.coverage +0 -0
- package/dist/presets/backend/skills/shopify/scripts/requirements.txt +19 -0
- package/dist/presets/backend/skills/shopify/scripts/shopify_init.py +423 -0
- package/dist/presets/backend/skills/shopify/scripts/tests/.coverage +0 -0
- package/dist/presets/backend/skills/shopify/scripts/tests/test_shopify_init.py +385 -0
- package/dist/presets/backend/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/presets/backend/skills/skill-creator/SKILL.md +7 -4
- package/dist/presets/backend/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/presets/backend/skills/skill-creator/scripts/package_skill.py +110 -0
- package/dist/presets/backend/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/dist/presets/data-ai/commands/ask.md +57 -0
- package/dist/presets/data-ai/commands/bootstrap/auto/fast.md +112 -0
- package/dist/presets/data-ai/commands/bootstrap/auto.md +116 -0
- package/dist/presets/data-ai/commands/brainstorm.md +70 -0
- package/dist/presets/data-ai/commands/code.md +94 -0
- package/dist/presets/data-ai/commands/content/cro.md +44 -0
- package/dist/presets/data-ai/commands/content/enhance.md +15 -0
- package/dist/presets/data-ai/commands/content/fast.md +14 -0
- package/dist/presets/data-ai/commands/content/good.md +17 -0
- package/dist/presets/data-ai/commands/cook/auto/fast.md +27 -0
- package/dist/presets/data-ai/commands/cook/auto.md +16 -0
- package/dist/presets/data-ai/commands/cook.md +106 -0
- package/dist/presets/data-ai/commands/debug.md +14 -0
- package/dist/presets/data-ai/commands/docs/init.md +15 -0
- package/dist/presets/data-ai/commands/fix/ci.md +21 -0
- package/dist/presets/data-ai/commands/fix/fast.md +20 -0
- package/dist/presets/data-ai/commands/fix/hard.md +44 -0
- package/dist/presets/data-ai/commands/fix/logs.md +21 -0
- package/dist/presets/data-ai/commands/fix/test.md +21 -0
- package/dist/presets/data-ai/commands/fix/types.md +9 -0
- package/dist/presets/data-ai/commands/fix/ui.md +36 -0
- package/dist/presets/data-ai/commands/fix.md +13 -0
- package/dist/presets/data-ai/commands/git/cm.md +5 -0
- package/dist/presets/data-ai/commands/git/cp.md +4 -0
- package/dist/presets/data-ai/commands/journal.md +5 -0
- package/dist/presets/data-ai/commands/plan/ci.md +19 -0
- package/dist/presets/data-ai/commands/plan/cro.md +57 -0
- package/dist/presets/data-ai/commands/plan/fast.md +47 -0
- package/dist/presets/data-ai/commands/plan/hard.md +58 -0
- package/dist/presets/data-ai/commands/plan/two.md +31 -0
- package/dist/presets/data-ai/commands/plan.md +24 -0
- package/dist/presets/data-ai/commands/review/codebase.md +50 -0
- package/dist/presets/data-ai/commands/skill/fix-logs.md +22 -0
- package/dist/presets/data-ai/commands/use-mcp.md +35 -0
- package/dist/presets/data-ai/commands/watzup.md +8 -0
- package/dist/presets/data-ai/hooks/discord-hook-setup.md +412 -0
- package/dist/presets/data-ai/hooks/telegram-hook-setup.md +774 -0
- package/dist/presets/data-ai/manifest.json +1664 -167
- package/dist/presets/data-ai/metadata.json +15 -0
- package/dist/presets/data-ai/skills/ai-multimodal/.env.example +97 -0
- package/dist/presets/data-ai/skills/ai-multimodal/SKILL.md +13 -4
- package/dist/presets/data-ai/skills/ai-multimodal/references/audio-processing.md +373 -0
- package/dist/presets/data-ai/skills/ai-multimodal/references/image-generation.md +558 -0
- package/dist/presets/data-ai/skills/ai-multimodal/references/video-analysis.md +498 -0
- package/dist/presets/data-ai/skills/ai-multimodal/references/vision-understanding.md +479 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/.coverage +0 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/document_converter.py +395 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/gemini_batch_process.py +480 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/requirements.txt +26 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/tests/.coverage +0 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/tests/test_failures.log +258 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/dist/presets/data-ai/skills/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/dist/presets/data-ai/skills/claude-code/references/advanced-features.md +399 -0
- package/dist/presets/data-ai/skills/claude-code/references/agent-skills.md +399 -0
- package/dist/presets/data-ai/skills/claude-code/references/api-reference.md +498 -0
- package/dist/presets/data-ai/skills/claude-code/references/best-practices.md +447 -0
- package/dist/presets/data-ai/skills/claude-code/references/cicd-integration.md +428 -0
- package/dist/presets/data-ai/skills/claude-code/references/configuration.md +480 -0
- package/dist/presets/data-ai/skills/claude-code/references/enterprise-features.md +472 -0
- package/dist/presets/data-ai/skills/claude-code/references/getting-started.md +252 -0
- package/dist/presets/data-ai/skills/claude-code/references/hooks-and-plugins.md +441 -0
- package/dist/presets/data-ai/skills/claude-code/references/ide-integration.md +316 -0
- package/dist/presets/data-ai/skills/claude-code/references/mcp-integration.md +386 -0
- package/dist/presets/data-ai/skills/claude-code/references/slash-commands.md +489 -0
- package/dist/presets/data-ai/skills/claude-code/references/troubleshooting.md +456 -0
- package/dist/presets/data-ai/skills/claude-code/skill.md +194 -0
- package/dist/presets/data-ai/skills/code-review/references/code-review-reception.md +213 -0
- package/dist/presets/data-ai/skills/code-review/references/requesting-code-review.md +108 -0
- package/dist/presets/data-ai/skills/code-review/references/verification-before-completion.md +142 -0
- package/dist/presets/data-ai/skills/common/README.md +120 -0
- package/dist/presets/data-ai/skills/common/api_key_helper.py +300 -0
- package/dist/presets/data-ai/skills/databases/SKILL.md +239 -0
- package/dist/presets/data-ai/skills/databases/references/mongodb-aggregation.md +447 -0
- package/dist/presets/data-ai/skills/databases/references/mongodb-atlas.md +465 -0
- package/dist/presets/data-ai/skills/databases/references/mongodb-crud.md +408 -0
- package/dist/presets/data-ai/skills/databases/references/mongodb-indexing.md +442 -0
- package/dist/presets/data-ai/skills/databases/references/postgresql-administration.md +594 -0
- package/dist/presets/data-ai/skills/databases/references/postgresql-performance.md +527 -0
- package/dist/presets/data-ai/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/dist/presets/data-ai/skills/databases/references/postgresql-queries.md +475 -0
- package/dist/presets/data-ai/skills/databases/scripts/.coverage +0 -0
- package/dist/presets/data-ai/skills/databases/scripts/db_backup.py +502 -0
- package/dist/presets/data-ai/skills/databases/scripts/db_migrate.py +414 -0
- package/dist/presets/data-ai/skills/databases/scripts/db_performance_check.py +444 -0
- package/dist/presets/data-ai/skills/databases/scripts/requirements.txt +20 -0
- package/dist/presets/data-ai/skills/databases/scripts/tests/coverage-db.json +1 -0
- package/dist/presets/data-ai/skills/databases/scripts/tests/requirements.txt +4 -0
- package/dist/presets/data-ai/skills/databases/scripts/tests/test_db_backup.py +340 -0
- package/dist/presets/data-ai/skills/databases/scripts/tests/test_db_migrate.py +277 -0
- package/dist/presets/data-ai/skills/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/dist/presets/data-ai/skills/debugging/SKILL.md +8 -4
- package/dist/presets/data-ai/skills/debugging/references/defense-in-depth.md +124 -0
- package/dist/presets/data-ai/skills/debugging/references/root-cause-tracing.md +122 -0
- package/dist/presets/data-ai/skills/debugging/references/systematic-debugging.md +102 -0
- package/dist/presets/data-ai/skills/debugging/references/verification.md +123 -0
- package/dist/presets/data-ai/skills/debugging/scripts/find-polluter.sh +63 -0
- package/dist/presets/data-ai/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/dist/presets/data-ai/skills/docs-seeker/.env.example +15 -0
- package/dist/presets/data-ai/skills/docs-seeker/SKILL.md +8 -4
- package/dist/presets/data-ai/skills/docs-seeker/package.json +25 -0
- package/dist/presets/data-ai/skills/docs-seeker/references/advanced.md +79 -0
- package/dist/presets/data-ai/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/dist/presets/data-ai/skills/docs-seeker/references/errors.md +68 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/dist/presets/data-ai/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/dist/presets/data-ai/skills/docs-seeker/workflows/library-search.md +87 -0
- package/dist/presets/data-ai/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/dist/presets/data-ai/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/dist/presets/data-ai/skills/mcp-builder/LICENSE.txt +202 -0
- package/dist/presets/data-ai/skills/mcp-builder/SKILL.md +8 -4
- package/dist/presets/data-ai/skills/mcp-builder/reference/evaluation.md +602 -0
- package/dist/presets/data-ai/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/dist/presets/data-ai/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/dist/presets/data-ai/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/dist/presets/data-ai/skills/mcp-builder/scripts/connections.py +151 -0
- package/dist/presets/data-ai/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/dist/presets/data-ai/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/dist/presets/data-ai/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/dist/presets/data-ai/skills/mcp-management/README.md +219 -0
- package/dist/presets/data-ai/skills/mcp-management/assets/tools.json +3146 -0
- package/dist/presets/data-ai/skills/mcp-management/references/configuration.md +114 -0
- package/dist/presets/data-ai/skills/mcp-management/references/gemini-cli-integration.md +215 -0
- package/dist/presets/data-ai/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/.env.example +10 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/cli.ts +195 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/dist/cli.js +127 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/dist/mcp-client.js +115 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/mcp-client.ts +230 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/package.json +20 -0
- package/dist/presets/data-ai/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/dist/presets/data-ai/skills/media-processing/SKILL.md +367 -0
- package/dist/presets/data-ai/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/dist/presets/data-ai/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/dist/presets/data-ai/skills/media-processing/references/ffmpeg-streaming.md +403 -0
- package/dist/presets/data-ai/skills/media-processing/references/format-compatibility.md +375 -0
- package/dist/presets/data-ai/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/dist/presets/data-ai/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/batch_resize.py +342 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/media_convert.py +311 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/requirements.txt +24 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/tests/.coverage +0 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/tests/requirements.txt +2 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/tests/test_media_convert.py +259 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/dist/presets/data-ai/skills/media-processing/scripts/video_optimize.py +414 -0
- package/dist/presets/data-ai/skills/planning/SKILL.md +7 -4
- package/dist/presets/data-ai/skills/planning/references/codebase-understanding.md +62 -0
- package/dist/presets/data-ai/skills/planning/references/output-standards.md +87 -0
- package/dist/presets/data-ai/skills/planning/references/plan-organization.md +100 -0
- package/dist/presets/data-ai/skills/planning/references/research-phase.md +49 -0
- package/dist/presets/data-ai/skills/planning/references/solution-design.md +63 -0
- package/dist/presets/data-ai/skills/problem-solving/SKILL.md +8 -4
- package/dist/presets/data-ai/skills/problem-solving/references/attribution.md +69 -0
- package/dist/presets/data-ai/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/dist/presets/data-ai/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/dist/presets/data-ai/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/dist/presets/data-ai/skills/problem-solving/references/scale-game.md +95 -0
- package/dist/presets/data-ai/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/dist/presets/data-ai/skills/problem-solving/references/when-stuck.md +72 -0
- package/dist/presets/data-ai/skills/repomix/references/configuration.md +211 -0
- package/dist/presets/data-ai/skills/repomix/references/usage-patterns.md +232 -0
- package/dist/presets/data-ai/skills/repomix/scripts/.coverage +0 -0
- package/dist/presets/data-ai/skills/repomix/scripts/README.md +179 -0
- package/dist/presets/data-ai/skills/repomix/scripts/repomix_batch.py +455 -0
- package/dist/presets/data-ai/skills/repomix/scripts/repos.example.json +15 -0
- package/dist/presets/data-ai/skills/repomix/scripts/requirements.txt +15 -0
- package/dist/presets/data-ai/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/dist/presets/data-ai/skills/sequential-thinking/.env.example +8 -0
- package/dist/presets/data-ai/skills/sequential-thinking/README.md +183 -0
- package/dist/presets/data-ai/skills/sequential-thinking/SKILL.md +9 -4
- package/dist/presets/data-ai/skills/sequential-thinking/package.json +31 -0
- package/dist/presets/data-ai/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/dist/presets/data-ai/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/dist/presets/data-ai/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/dist/presets/data-ai/skills/sequential-thinking/references/examples-api.md +88 -0
- package/dist/presets/data-ai/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/dist/presets/data-ai/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/dist/presets/data-ai/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/dist/presets/data-ai/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/dist/presets/data-ai/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/dist/presets/data-ai/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/dist/presets/data-ai/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/presets/data-ai/skills/skill-creator/SKILL.md +7 -4
- package/dist/presets/data-ai/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/presets/data-ai/skills/skill-creator/scripts/package_skill.py +110 -0
- package/dist/presets/data-ai/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/dist/presets/devops/commands/ask.md +57 -0
- package/dist/presets/devops/commands/bootstrap/auto/fast.md +112 -0
- package/dist/presets/devops/commands/bootstrap/auto.md +116 -0
- package/dist/presets/devops/commands/brainstorm.md +70 -0
- package/dist/presets/devops/commands/code.md +94 -0
- package/dist/presets/devops/commands/content/cro.md +44 -0
- package/dist/presets/devops/commands/content/enhance.md +15 -0
- package/dist/presets/devops/commands/content/fast.md +14 -0
- package/dist/presets/devops/commands/content/good.md +17 -0
- package/dist/presets/devops/commands/cook/auto/fast.md +27 -0
- package/dist/presets/devops/commands/cook/auto.md +16 -0
- package/dist/presets/devops/commands/cook.md +106 -0
- package/dist/presets/devops/commands/debug.md +14 -0
- package/dist/presets/devops/commands/docs/init.md +15 -0
- package/dist/presets/devops/commands/fix/ci.md +21 -0
- package/dist/presets/devops/commands/fix/fast.md +20 -0
- package/dist/presets/devops/commands/fix/hard.md +44 -0
- package/dist/presets/devops/commands/fix/logs.md +21 -0
- package/dist/presets/devops/commands/fix/test.md +21 -0
- package/dist/presets/devops/commands/fix/types.md +9 -0
- package/dist/presets/devops/commands/fix/ui.md +36 -0
- package/dist/presets/devops/commands/fix.md +13 -0
- package/dist/presets/devops/commands/git/cm.md +5 -0
- package/dist/presets/devops/commands/git/cp.md +4 -0
- package/dist/presets/devops/commands/journal.md +5 -0
- package/dist/presets/devops/commands/plan/ci.md +19 -0
- package/dist/presets/devops/commands/plan/cro.md +57 -0
- package/dist/presets/devops/commands/plan/fast.md +47 -0
- package/dist/presets/devops/commands/plan/hard.md +58 -0
- package/dist/presets/devops/commands/plan/two.md +31 -0
- package/dist/presets/devops/commands/plan.md +24 -0
- package/dist/presets/devops/commands/review/codebase.md +50 -0
- package/dist/presets/devops/commands/skill/fix-logs.md +22 -0
- package/dist/presets/devops/commands/use-mcp.md +35 -0
- package/dist/presets/devops/commands/watzup.md +8 -0
- package/dist/presets/devops/hooks/discord-hook-setup.md +412 -0
- package/dist/presets/devops/hooks/telegram-hook-setup.md +774 -0
- package/dist/presets/devops/manifest.json +1853 -156
- package/dist/presets/devops/metadata.json +15 -0
- package/dist/presets/devops/skills/ai-multimodal/.env.example +97 -0
- package/dist/presets/devops/skills/ai-multimodal/SKILL.md +12 -4
- package/dist/presets/devops/skills/ai-multimodal/references/audio-processing.md +373 -0
- package/dist/presets/devops/skills/ai-multimodal/references/image-generation.md +558 -0
- package/dist/presets/devops/skills/ai-multimodal/references/video-analysis.md +498 -0
- package/dist/presets/devops/skills/ai-multimodal/references/vision-understanding.md +479 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/.coverage +0 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/document_converter.py +395 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/gemini_batch_process.py +480 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/requirements.txt +26 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/tests/.coverage +0 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/tests/test_failures.log +258 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/dist/presets/devops/skills/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/dist/presets/devops/skills/backend-development/SKILL.md +9 -4
- package/dist/presets/devops/skills/backend-development/references/backend-api-design.md +495 -0
- package/dist/presets/devops/skills/backend-development/references/backend-architecture.md +454 -0
- package/dist/presets/devops/skills/backend-development/references/backend-authentication.md +338 -0
- package/dist/presets/devops/skills/backend-development/references/backend-code-quality.md +659 -0
- package/dist/presets/devops/skills/backend-development/references/backend-debugging.md +904 -0
- package/dist/presets/devops/skills/backend-development/references/backend-devops.md +494 -0
- package/dist/presets/devops/skills/backend-development/references/backend-mindset.md +387 -0
- package/dist/presets/devops/skills/backend-development/references/backend-performance.md +397 -0
- package/dist/presets/devops/skills/backend-development/references/backend-security.md +290 -0
- package/dist/presets/devops/skills/backend-development/references/backend-technologies.md +256 -0
- package/dist/presets/devops/skills/backend-development/references/backend-testing.md +429 -0
- package/dist/presets/devops/skills/chrome-devtools/SKILL.md +8 -4
- package/dist/presets/devops/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/dist/presets/devops/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/dist/presets/devops/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/README.md +213 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/click.js +79 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/console.js +75 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/evaluate.js +49 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/fill.js +72 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/install-deps.sh +181 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/install.sh +83 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/lib/browser.js +122 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/lib/selector.js +178 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/navigate.js +46 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/network.js +102 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/package.json +15 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/performance.js +145 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/screenshot.js +180 -0
- package/dist/presets/devops/skills/chrome-devtools/scripts/snapshot.js +131 -0
- package/dist/presets/devops/skills/claude-code/references/advanced-features.md +399 -0
- package/dist/presets/devops/skills/claude-code/references/agent-skills.md +399 -0
- package/dist/presets/devops/skills/claude-code/references/api-reference.md +498 -0
- package/dist/presets/devops/skills/claude-code/references/best-practices.md +447 -0
- package/dist/presets/devops/skills/claude-code/references/cicd-integration.md +428 -0
- package/dist/presets/devops/skills/claude-code/references/configuration.md +480 -0
- package/dist/presets/devops/skills/claude-code/references/enterprise-features.md +472 -0
- package/dist/presets/devops/skills/claude-code/references/getting-started.md +252 -0
- package/dist/presets/devops/skills/claude-code/references/hooks-and-plugins.md +441 -0
- package/dist/presets/devops/skills/claude-code/references/ide-integration.md +316 -0
- package/dist/presets/devops/skills/claude-code/references/mcp-integration.md +386 -0
- package/dist/presets/devops/skills/claude-code/references/slash-commands.md +489 -0
- package/dist/presets/devops/skills/claude-code/references/troubleshooting.md +456 -0
- package/dist/presets/devops/skills/claude-code/skill.md +194 -0
- package/dist/presets/devops/skills/code-review/references/code-review-reception.md +213 -0
- package/dist/presets/devops/skills/code-review/references/requesting-code-review.md +108 -0
- package/dist/presets/devops/skills/code-review/references/verification-before-completion.md +142 -0
- package/dist/presets/devops/skills/common/README.md +120 -0
- package/dist/presets/devops/skills/common/api_key_helper.py +300 -0
- package/dist/presets/devops/skills/databases/SKILL.md +8 -4
- package/dist/presets/devops/skills/databases/references/mongodb-aggregation.md +447 -0
- package/dist/presets/devops/skills/databases/references/mongodb-atlas.md +465 -0
- package/dist/presets/devops/skills/databases/references/mongodb-crud.md +408 -0
- package/dist/presets/devops/skills/databases/references/mongodb-indexing.md +442 -0
- package/dist/presets/devops/skills/databases/references/postgresql-administration.md +594 -0
- package/dist/presets/devops/skills/databases/references/postgresql-performance.md +527 -0
- package/dist/presets/devops/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/dist/presets/devops/skills/databases/references/postgresql-queries.md +475 -0
- package/dist/presets/devops/skills/databases/scripts/.coverage +0 -0
- package/dist/presets/devops/skills/databases/scripts/db_backup.py +502 -0
- package/dist/presets/devops/skills/databases/scripts/db_migrate.py +414 -0
- package/dist/presets/devops/skills/databases/scripts/db_performance_check.py +444 -0
- package/dist/presets/devops/skills/databases/scripts/requirements.txt +20 -0
- package/dist/presets/devops/skills/databases/scripts/tests/coverage-db.json +1 -0
- package/dist/presets/devops/skills/databases/scripts/tests/requirements.txt +4 -0
- package/dist/presets/devops/skills/databases/scripts/tests/test_db_backup.py +340 -0
- package/dist/presets/devops/skills/databases/scripts/tests/test_db_migrate.py +277 -0
- package/dist/presets/devops/skills/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/dist/presets/devops/skills/debugging/SKILL.md +8 -4
- package/dist/presets/devops/skills/debugging/references/defense-in-depth.md +124 -0
- package/dist/presets/devops/skills/debugging/references/root-cause-tracing.md +122 -0
- package/dist/presets/devops/skills/debugging/references/systematic-debugging.md +102 -0
- package/dist/presets/devops/skills/debugging/references/verification.md +123 -0
- package/dist/presets/devops/skills/debugging/scripts/find-polluter.sh +63 -0
- package/dist/presets/devops/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/dist/presets/devops/skills/devops/.env.example +76 -0
- package/dist/presets/devops/skills/devops/SKILL.md +9 -4
- package/dist/presets/devops/skills/devops/references/browser-rendering.md +305 -0
- package/dist/presets/devops/skills/devops/references/cloudflare-d1-kv.md +123 -0
- package/dist/presets/devops/skills/devops/references/cloudflare-platform.md +271 -0
- package/dist/presets/devops/skills/devops/references/cloudflare-r2-storage.md +280 -0
- package/dist/presets/devops/skills/devops/references/cloudflare-workers-advanced.md +312 -0
- package/dist/presets/devops/skills/devops/references/cloudflare-workers-apis.md +309 -0
- package/dist/presets/devops/skills/devops/references/cloudflare-workers-basics.md +418 -0
- package/dist/presets/devops/skills/devops/references/docker-basics.md +297 -0
- package/dist/presets/devops/skills/devops/references/docker-compose.md +292 -0
- package/dist/presets/devops/skills/devops/references/gcloud-platform.md +297 -0
- package/dist/presets/devops/skills/devops/references/gcloud-services.md +304 -0
- package/dist/presets/devops/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/dist/presets/devops/skills/devops/scripts/docker_optimize.py +320 -0
- package/dist/presets/devops/skills/devops/scripts/requirements.txt +20 -0
- package/dist/presets/devops/skills/devops/scripts/tests/requirements.txt +3 -0
- package/dist/presets/devops/skills/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/dist/presets/devops/skills/devops/scripts/tests/test_docker_optimize.py +436 -0
- package/dist/presets/devops/skills/docs-seeker/.env.example +15 -0
- package/dist/presets/devops/skills/docs-seeker/SKILL.md +8 -4
- package/dist/presets/devops/skills/docs-seeker/package.json +25 -0
- package/dist/presets/devops/skills/docs-seeker/references/advanced.md +79 -0
- package/dist/presets/devops/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/dist/presets/devops/skills/docs-seeker/references/errors.md +68 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/dist/presets/devops/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/dist/presets/devops/skills/docs-seeker/workflows/library-search.md +87 -0
- package/dist/presets/devops/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/dist/presets/devops/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/dist/presets/devops/skills/mcp-builder/LICENSE.txt +202 -0
- package/dist/presets/devops/skills/mcp-builder/SKILL.md +7 -4
- package/dist/presets/devops/skills/mcp-builder/reference/evaluation.md +602 -0
- package/dist/presets/devops/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/dist/presets/devops/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/dist/presets/devops/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/dist/presets/devops/skills/mcp-builder/scripts/connections.py +151 -0
- package/dist/presets/devops/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/dist/presets/devops/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/dist/presets/devops/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/dist/presets/devops/skills/mcp-management/README.md +219 -0
- package/dist/presets/devops/skills/mcp-management/assets/tools.json +3146 -0
- package/dist/presets/devops/skills/mcp-management/references/configuration.md +114 -0
- package/dist/presets/devops/skills/mcp-management/references/gemini-cli-integration.md +215 -0
- package/dist/presets/devops/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/dist/presets/devops/skills/mcp-management/scripts/.env.example +10 -0
- package/dist/presets/devops/skills/mcp-management/scripts/cli.ts +195 -0
- package/dist/presets/devops/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/dist/presets/devops/skills/mcp-management/scripts/dist/cli.js +127 -0
- package/dist/presets/devops/skills/mcp-management/scripts/dist/mcp-client.js +115 -0
- package/dist/presets/devops/skills/mcp-management/scripts/mcp-client.ts +230 -0
- package/dist/presets/devops/skills/mcp-management/scripts/package.json +20 -0
- package/dist/presets/devops/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/dist/presets/devops/skills/planning/SKILL.md +7 -4
- package/dist/presets/devops/skills/planning/references/codebase-understanding.md +62 -0
- package/dist/presets/devops/skills/planning/references/output-standards.md +87 -0
- package/dist/presets/devops/skills/planning/references/plan-organization.md +100 -0
- package/dist/presets/devops/skills/planning/references/research-phase.md +49 -0
- package/dist/presets/devops/skills/planning/references/solution-design.md +63 -0
- package/dist/presets/devops/skills/problem-solving/SKILL.md +8 -4
- package/dist/presets/devops/skills/problem-solving/references/attribution.md +69 -0
- package/dist/presets/devops/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/dist/presets/devops/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/dist/presets/devops/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/dist/presets/devops/skills/problem-solving/references/scale-game.md +95 -0
- package/dist/presets/devops/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/dist/presets/devops/skills/problem-solving/references/when-stuck.md +72 -0
- package/dist/presets/devops/skills/repomix/references/configuration.md +211 -0
- package/dist/presets/devops/skills/repomix/references/usage-patterns.md +232 -0
- package/dist/presets/devops/skills/repomix/scripts/.coverage +0 -0
- package/dist/presets/devops/skills/repomix/scripts/README.md +179 -0
- package/dist/presets/devops/skills/repomix/scripts/repomix_batch.py +455 -0
- package/dist/presets/devops/skills/repomix/scripts/repos.example.json +15 -0
- package/dist/presets/devops/skills/repomix/scripts/requirements.txt +15 -0
- package/dist/presets/devops/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/dist/presets/devops/skills/sequential-thinking/.env.example +8 -0
- package/dist/presets/devops/skills/sequential-thinking/README.md +183 -0
- package/dist/presets/devops/skills/sequential-thinking/SKILL.md +9 -4
- package/dist/presets/devops/skills/sequential-thinking/package.json +31 -0
- package/dist/presets/devops/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/dist/presets/devops/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/dist/presets/devops/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/dist/presets/devops/skills/sequential-thinking/references/examples-api.md +88 -0
- package/dist/presets/devops/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/dist/presets/devops/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/dist/presets/devops/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/dist/presets/devops/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/dist/presets/devops/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/dist/presets/devops/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/dist/presets/devops/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/presets/devops/skills/skill-creator/SKILL.md +7 -4
- package/dist/presets/devops/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/presets/devops/skills/skill-creator/scripts/package_skill.py +110 -0
- package/dist/presets/devops/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/dist/presets/devops/skills/web-frameworks/SKILL.md +8 -4
- package/dist/presets/devops/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/dist/presets/devops/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/dist/presets/devops/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/dist/presets/devops/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/dist/presets/devops/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/dist/presets/devops/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/dist/presets/devops/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/dist/presets/devops/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/.coverage +0 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/__init__.py +0 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/requirements.txt +16 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/tests/requirements.txt +3 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/dist/presets/devops/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/dist/presets/frontend/commands/ask.md +57 -0
- package/dist/presets/frontend/commands/bootstrap/auto/fast.md +112 -0
- package/dist/presets/frontend/commands/bootstrap/auto.md +116 -0
- package/dist/presets/frontend/commands/brainstorm.md +70 -0
- package/dist/presets/frontend/commands/code.md +94 -0
- package/dist/presets/frontend/commands/content/cro.md +44 -0
- package/dist/presets/frontend/commands/content/enhance.md +15 -0
- package/dist/presets/frontend/commands/content/fast.md +14 -0
- package/dist/presets/frontend/commands/content/good.md +17 -0
- package/dist/presets/frontend/commands/cook/auto/fast.md +27 -0
- package/dist/presets/frontend/commands/cook/auto.md +16 -0
- package/dist/presets/frontend/commands/cook.md +106 -0
- package/dist/presets/frontend/commands/debug.md +14 -0
- package/dist/presets/frontend/commands/design/3d.md +75 -0
- package/dist/presets/frontend/commands/design/describe.md +22 -0
- package/dist/presets/frontend/commands/design/fast.md +23 -0
- package/dist/presets/frontend/commands/design/good.md +27 -0
- package/dist/presets/frontend/commands/design/screenshot.md +33 -0
- package/dist/presets/frontend/commands/design/video.md +33 -0
- package/dist/presets/frontend/commands/docs/init.md +15 -0
- package/dist/presets/frontend/commands/fix/ci.md +21 -0
- package/dist/presets/frontend/commands/fix/fast.md +20 -0
- package/dist/presets/frontend/commands/fix/hard.md +44 -0
- package/dist/presets/frontend/commands/fix/logs.md +21 -0
- package/dist/presets/frontend/commands/fix/test.md +21 -0
- package/dist/presets/frontend/commands/fix/types.md +9 -0
- package/dist/presets/frontend/commands/fix/ui.md +36 -0
- package/dist/presets/frontend/commands/fix.md +13 -0
- package/dist/presets/frontend/commands/git/cm.md +5 -0
- package/dist/presets/frontend/commands/git/cp.md +4 -0
- package/dist/presets/frontend/commands/journal.md +5 -0
- package/dist/presets/frontend/commands/plan/ci.md +19 -0
- package/dist/presets/frontend/commands/plan/cro.md +57 -0
- package/dist/presets/frontend/commands/plan/fast.md +47 -0
- package/dist/presets/frontend/commands/plan/hard.md +58 -0
- package/dist/presets/frontend/commands/plan/two.md +31 -0
- package/dist/presets/frontend/commands/plan.md +24 -0
- package/dist/presets/frontend/commands/review/codebase.md +50 -0
- package/dist/presets/frontend/commands/skill/fix-logs.md +22 -0
- package/dist/presets/frontend/commands/use-mcp.md +35 -0
- package/dist/presets/frontend/commands/watzup.md +8 -0
- package/dist/presets/frontend/hooks/discord-hook-setup.md +412 -0
- package/dist/presets/frontend/hooks/telegram-hook-setup.md +774 -0
- package/dist/presets/frontend/manifest.json +2294 -151
- package/dist/presets/frontend/metadata.json +15 -0
- package/dist/presets/frontend/skills/aesthetic/assets/design-guideline-template.md +163 -0
- package/dist/presets/frontend/skills/aesthetic/assets/design-story-template.md +135 -0
- package/dist/presets/frontend/skills/aesthetic/references/design-principles.md +62 -0
- package/dist/presets/frontend/skills/aesthetic/references/design-resources.md +75 -0
- package/dist/presets/frontend/skills/aesthetic/references/micro-interactions.md +53 -0
- package/dist/presets/frontend/skills/aesthetic/references/storytelling-design.md +50 -0
- package/dist/presets/frontend/skills/ai-multimodal/.env.example +97 -0
- package/dist/presets/frontend/skills/ai-multimodal/SKILL.md +364 -32
- package/dist/presets/frontend/skills/ai-multimodal/references/audio-processing.md +373 -0
- package/dist/presets/frontend/skills/ai-multimodal/references/image-generation.md +558 -0
- package/dist/presets/frontend/skills/ai-multimodal/references/video-analysis.md +498 -0
- package/dist/presets/frontend/skills/ai-multimodal/references/vision-understanding.md +479 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/.coverage +0 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/document_converter.py +395 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/gemini_batch_process.py +480 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/requirements.txt +26 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/tests/.coverage +0 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/tests/test_failures.log +258 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/dist/presets/frontend/skills/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/dist/presets/frontend/skills/chrome-devtools/SKILL.md +364 -51
- package/dist/presets/frontend/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/dist/presets/frontend/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/dist/presets/frontend/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/README.md +213 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/click.js +79 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/console.js +75 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/evaluate.js +49 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/fill.js +72 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/install-deps.sh +181 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/install.sh +83 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/lib/browser.js +122 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/lib/selector.js +178 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/navigate.js +46 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/network.js +102 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/package.json +15 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/performance.js +145 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/screenshot.js +180 -0
- package/dist/presets/frontend/skills/chrome-devtools/scripts/snapshot.js +131 -0
- package/dist/presets/frontend/skills/claude-code/references/advanced-features.md +399 -0
- package/dist/presets/frontend/skills/claude-code/references/agent-skills.md +399 -0
- package/dist/presets/frontend/skills/claude-code/references/api-reference.md +498 -0
- package/dist/presets/frontend/skills/claude-code/references/best-practices.md +447 -0
- package/dist/presets/frontend/skills/claude-code/references/cicd-integration.md +428 -0
- package/dist/presets/frontend/skills/claude-code/references/configuration.md +480 -0
- package/dist/presets/frontend/skills/claude-code/references/enterprise-features.md +472 -0
- package/dist/presets/frontend/skills/claude-code/references/getting-started.md +252 -0
- package/dist/presets/frontend/skills/claude-code/references/hooks-and-plugins.md +441 -0
- package/dist/presets/frontend/skills/claude-code/references/ide-integration.md +316 -0
- package/dist/presets/frontend/skills/claude-code/references/mcp-integration.md +386 -0
- package/dist/presets/frontend/skills/claude-code/references/slash-commands.md +489 -0
- package/dist/presets/frontend/skills/claude-code/references/troubleshooting.md +456 -0
- package/dist/presets/frontend/skills/claude-code/skill.md +194 -0
- package/dist/presets/frontend/skills/code-review/references/code-review-reception.md +213 -0
- package/dist/presets/frontend/skills/code-review/references/requesting-code-review.md +108 -0
- package/dist/presets/frontend/skills/code-review/references/verification-before-completion.md +142 -0
- package/dist/presets/frontend/skills/common/README.md +120 -0
- package/dist/presets/frontend/skills/common/api_key_helper.py +300 -0
- package/dist/presets/frontend/skills/debugging/SKILL.md +90 -34
- package/dist/presets/frontend/skills/debugging/references/defense-in-depth.md +124 -0
- package/dist/presets/frontend/skills/debugging/references/root-cause-tracing.md +122 -0
- package/dist/presets/frontend/skills/debugging/references/systematic-debugging.md +102 -0
- package/dist/presets/frontend/skills/debugging/references/verification.md +123 -0
- package/dist/presets/frontend/skills/debugging/scripts/find-polluter.sh +63 -0
- package/dist/presets/frontend/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/dist/presets/frontend/skills/docs-seeker/.env.example +15 -0
- package/dist/presets/frontend/skills/docs-seeker/SKILL.md +102 -38
- package/dist/presets/frontend/skills/docs-seeker/package.json +25 -0
- package/dist/presets/frontend/skills/docs-seeker/references/advanced.md +79 -0
- package/dist/presets/frontend/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/dist/presets/frontend/skills/docs-seeker/references/errors.md +68 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/dist/presets/frontend/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/dist/presets/frontend/skills/docs-seeker/workflows/library-search.md +87 -0
- package/dist/presets/frontend/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/dist/presets/frontend/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/dist/presets/frontend/skills/frontend-design/SKILL.md +46 -43
- package/dist/presets/frontend/skills/frontend-design/references/animejs.md +396 -0
- package/dist/presets/frontend/skills/mcp-builder/LICENSE.txt +202 -0
- package/dist/presets/frontend/skills/mcp-builder/SKILL.md +332 -41
- package/dist/presets/frontend/skills/mcp-builder/reference/evaluation.md +602 -0
- package/dist/presets/frontend/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/dist/presets/frontend/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/dist/presets/frontend/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/dist/presets/frontend/skills/mcp-builder/scripts/connections.py +151 -0
- package/dist/presets/frontend/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/dist/presets/frontend/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/dist/presets/frontend/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/dist/presets/frontend/skills/mcp-management/README.md +219 -0
- package/dist/presets/frontend/skills/mcp-management/assets/tools.json +3146 -0
- package/dist/presets/frontend/skills/mcp-management/references/configuration.md +114 -0
- package/dist/presets/frontend/skills/mcp-management/references/gemini-cli-integration.md +215 -0
- package/dist/presets/frontend/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/.env.example +10 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/cli.ts +195 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/dist/cli.js +127 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/dist/mcp-client.js +115 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/mcp-client.ts +230 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/package.json +20 -0
- package/dist/presets/frontend/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/dist/presets/frontend/skills/media-processing/SKILL.md +367 -41
- package/dist/presets/frontend/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/dist/presets/frontend/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/dist/presets/frontend/skills/media-processing/references/ffmpeg-streaming.md +403 -0
- package/dist/presets/frontend/skills/media-processing/references/format-compatibility.md +375 -0
- package/dist/presets/frontend/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/dist/presets/frontend/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/dist/presets/frontend/skills/media-processing/scripts/batch_resize.py +342 -0
- package/dist/presets/frontend/skills/media-processing/scripts/media_convert.py +311 -0
- package/dist/presets/frontend/skills/media-processing/scripts/requirements.txt +24 -0
- package/dist/presets/frontend/skills/media-processing/scripts/tests/.coverage +0 -0
- package/dist/presets/frontend/skills/media-processing/scripts/tests/requirements.txt +2 -0
- package/dist/presets/frontend/skills/media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/dist/presets/frontend/skills/media-processing/scripts/tests/test_media_convert.py +259 -0
- package/dist/presets/frontend/skills/media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/dist/presets/frontend/skills/media-processing/scripts/video_optimize.py +414 -0
- package/dist/presets/frontend/skills/planning/SKILL.md +90 -39
- package/dist/presets/frontend/skills/planning/references/codebase-understanding.md +62 -0
- package/dist/presets/frontend/skills/planning/references/output-standards.md +87 -0
- package/dist/presets/frontend/skills/planning/references/plan-organization.md +100 -0
- package/dist/presets/frontend/skills/planning/references/research-phase.md +49 -0
- package/dist/presets/frontend/skills/planning/references/solution-design.md +63 -0
- package/dist/presets/frontend/skills/problem-solving/SKILL.md +102 -37
- package/dist/presets/frontend/skills/problem-solving/references/attribution.md +69 -0
- package/dist/presets/frontend/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/dist/presets/frontend/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/dist/presets/frontend/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/dist/presets/frontend/skills/problem-solving/references/scale-game.md +95 -0
- package/dist/presets/frontend/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/dist/presets/frontend/skills/problem-solving/references/when-stuck.md +72 -0
- package/dist/presets/frontend/skills/repomix/references/configuration.md +211 -0
- package/dist/presets/frontend/skills/repomix/references/usage-patterns.md +232 -0
- package/dist/presets/frontend/skills/repomix/scripts/.coverage +0 -0
- package/dist/presets/frontend/skills/repomix/scripts/README.md +179 -0
- package/dist/presets/frontend/skills/repomix/scripts/repomix_batch.py +455 -0
- package/dist/presets/frontend/skills/repomix/scripts/repos.example.json +15 -0
- package/dist/presets/frontend/skills/repomix/scripts/requirements.txt +15 -0
- package/dist/presets/frontend/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/dist/presets/frontend/skills/sequential-thinking/.env.example +8 -0
- package/dist/presets/frontend/skills/sequential-thinking/README.md +183 -0
- package/dist/presets/frontend/skills/sequential-thinking/SKILL.md +99 -33
- package/dist/presets/frontend/skills/sequential-thinking/package.json +31 -0
- package/dist/presets/frontend/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/dist/presets/frontend/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/dist/presets/frontend/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/dist/presets/frontend/skills/sequential-thinking/references/examples-api.md +88 -0
- package/dist/presets/frontend/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/dist/presets/frontend/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/dist/presets/frontend/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/dist/presets/frontend/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/dist/presets/frontend/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/dist/presets/frontend/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/dist/presets/frontend/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/presets/frontend/skills/skill-creator/SKILL.md +258 -55
- package/dist/presets/frontend/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/presets/frontend/skills/skill-creator/scripts/package_skill.py +110 -0
- package/dist/presets/frontend/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/dist/presets/frontend/skills/threejs/SKILL.md +97 -65
- package/dist/presets/frontend/skills/threejs/references/01-getting-started.md +177 -0
- package/dist/presets/frontend/skills/threejs/references/02-loaders.md +169 -0
- package/dist/presets/frontend/skills/threejs/references/03-textures.md +170 -0
- package/dist/presets/frontend/skills/threejs/references/04-cameras.md +195 -0
- package/dist/presets/frontend/skills/threejs/references/05-lights.md +183 -0
- package/dist/presets/frontend/skills/threejs/references/06-animations.md +214 -0
- package/dist/presets/frontend/skills/threejs/references/07-math.md +260 -0
- package/dist/presets/frontend/skills/threejs/references/08-interaction.md +267 -0
- package/dist/presets/frontend/skills/threejs/references/09-postprocessing.md +240 -0
- package/dist/presets/frontend/skills/threejs/references/10-controls.md +259 -0
- package/dist/presets/frontend/skills/threejs/references/11-materials-advanced.md +270 -0
- package/dist/presets/frontend/skills/threejs/references/12-performance.md +269 -0
- package/dist/presets/frontend/skills/threejs/references/13-node-materials.md +298 -0
- package/dist/presets/frontend/skills/threejs/references/14-physics-vr.md +304 -0
- package/dist/presets/frontend/skills/threejs/references/15-specialized-loaders.md +333 -0
- package/dist/presets/frontend/skills/threejs/references/16-webgpu.md +302 -0
- package/dist/presets/frontend/skills/ui-styling/LICENSE.txt +202 -0
- package/dist/presets/frontend/skills/ui-styling/SKILL.md +328 -49
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/dist/presets/frontend/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/dist/presets/frontend/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/dist/presets/frontend/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/dist/presets/frontend/skills/ui-styling/references/shadcn-components.md +424 -0
- package/dist/presets/frontend/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/dist/presets/frontend/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/dist/presets/frontend/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/dist/presets/frontend/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/.coverage +0 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/requirements.txt +17 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/dist/presets/frontend/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/dist/presets/frontend/skills/web-frameworks/SKILL.md +331 -56
- package/dist/presets/frontend/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/dist/presets/frontend/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/dist/presets/frontend/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/dist/presets/frontend/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/dist/presets/frontend/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/dist/presets/frontend/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/dist/presets/frontend/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/dist/presets/frontend/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/.coverage +0 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/__init__.py +0 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/requirements.txt +16 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/tests/requirements.txt +3 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/dist/presets/frontend/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/dist/presets/fullstack/commands/ask.md +57 -0
- package/dist/presets/fullstack/commands/bootstrap/auto/fast.md +112 -0
- package/dist/presets/fullstack/commands/bootstrap/auto.md +116 -0
- package/dist/presets/fullstack/commands/brainstorm.md +70 -0
- package/dist/presets/fullstack/commands/code.md +94 -0
- package/dist/presets/fullstack/commands/content/cro.md +44 -0
- package/dist/presets/fullstack/commands/content/enhance.md +15 -0
- package/dist/presets/fullstack/commands/content/fast.md +14 -0
- package/dist/presets/fullstack/commands/content/good.md +17 -0
- package/dist/presets/fullstack/commands/cook/auto/fast.md +27 -0
- package/dist/presets/fullstack/commands/cook/auto.md +16 -0
- package/dist/presets/fullstack/commands/cook.md +106 -0
- package/dist/presets/fullstack/commands/debug.md +14 -0
- package/dist/presets/fullstack/commands/design/3d.md +75 -0
- package/dist/presets/fullstack/commands/design/describe.md +22 -0
- package/dist/presets/fullstack/commands/design/fast.md +23 -0
- package/dist/presets/fullstack/commands/design/good.md +27 -0
- package/dist/presets/fullstack/commands/design/screenshot.md +33 -0
- package/dist/presets/fullstack/commands/design/video.md +33 -0
- package/dist/presets/fullstack/commands/docs/init.md +15 -0
- package/dist/presets/fullstack/commands/fix/ci.md +21 -0
- package/dist/presets/fullstack/commands/fix/fast.md +20 -0
- package/dist/presets/fullstack/commands/fix/hard.md +44 -0
- package/dist/presets/fullstack/commands/fix/logs.md +21 -0
- package/dist/presets/fullstack/commands/fix/test.md +21 -0
- package/dist/presets/fullstack/commands/fix/types.md +9 -0
- package/dist/presets/fullstack/commands/fix/ui.md +36 -0
- package/dist/presets/fullstack/commands/fix.md +13 -0
- package/dist/presets/fullstack/commands/git/cm.md +5 -0
- package/dist/presets/fullstack/commands/git/cp.md +4 -0
- package/dist/presets/fullstack/commands/integrate/polar.md +29 -0
- package/dist/presets/fullstack/commands/integrate/sepay.md +29 -0
- package/dist/presets/fullstack/commands/journal.md +5 -0
- package/dist/presets/fullstack/commands/plan/ci.md +19 -0
- package/dist/presets/fullstack/commands/plan/cro.md +57 -0
- package/dist/presets/fullstack/commands/plan/fast.md +47 -0
- package/dist/presets/fullstack/commands/plan/hard.md +58 -0
- package/dist/presets/fullstack/commands/plan/two.md +31 -0
- package/dist/presets/fullstack/commands/plan.md +24 -0
- package/dist/presets/fullstack/commands/review/codebase.md +50 -0
- package/dist/presets/fullstack/commands/skill/fix-logs.md +22 -0
- package/dist/presets/fullstack/commands/use-mcp.md +35 -0
- package/dist/presets/fullstack/commands/watzup.md +8 -0
- package/dist/presets/fullstack/hooks/discord-hook-setup.md +412 -0
- package/dist/presets/fullstack/hooks/telegram-hook-setup.md +774 -0
- package/dist/presets/fullstack/manifest.json +2809 -156
- package/dist/presets/fullstack/metadata.json +15 -0
- package/dist/presets/fullstack/skills/aesthetic/SKILL.md +132 -0
- package/dist/presets/fullstack/skills/aesthetic/assets/design-guideline-template.md +163 -0
- package/dist/presets/fullstack/skills/aesthetic/assets/design-story-template.md +135 -0
- package/dist/presets/fullstack/skills/aesthetic/references/design-principles.md +62 -0
- package/dist/presets/fullstack/skills/aesthetic/references/design-resources.md +75 -0
- package/dist/presets/fullstack/skills/aesthetic/references/micro-interactions.md +53 -0
- package/dist/presets/fullstack/skills/aesthetic/references/storytelling-design.md +50 -0
- package/dist/presets/fullstack/skills/ai-multimodal/.env.example +97 -0
- package/dist/presets/fullstack/skills/ai-multimodal/SKILL.md +13 -4
- package/dist/presets/fullstack/skills/ai-multimodal/references/audio-processing.md +373 -0
- package/dist/presets/fullstack/skills/ai-multimodal/references/image-generation.md +558 -0
- package/dist/presets/fullstack/skills/ai-multimodal/references/video-analysis.md +498 -0
- package/dist/presets/fullstack/skills/ai-multimodal/references/vision-understanding.md +479 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/.coverage +0 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/document_converter.py +395 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/gemini_batch_process.py +480 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/requirements.txt +26 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/tests/.coverage +0 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/tests/test_failures.log +258 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/dist/presets/fullstack/skills/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/dist/presets/fullstack/skills/backend-development/SKILL.md +9 -4
- package/dist/presets/fullstack/skills/backend-development/references/backend-api-design.md +495 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-architecture.md +454 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-authentication.md +338 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-code-quality.md +659 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-debugging.md +904 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-devops.md +494 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-mindset.md +387 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-performance.md +397 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-security.md +290 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-technologies.md +256 -0
- package/dist/presets/fullstack/skills/backend-development/references/backend-testing.md +429 -0
- package/dist/presets/fullstack/skills/better-auth/SKILL.md +9 -4
- package/dist/presets/fullstack/skills/better-auth/references/advanced-features.md +553 -0
- package/dist/presets/fullstack/skills/better-auth/references/database-integration.md +577 -0
- package/dist/presets/fullstack/skills/better-auth/references/email-password-auth.md +416 -0
- package/dist/presets/fullstack/skills/better-auth/references/oauth-providers.md +430 -0
- package/dist/presets/fullstack/skills/better-auth/scripts/.coverage +0 -0
- package/dist/presets/fullstack/skills/better-auth/scripts/better_auth_init.py +521 -0
- package/dist/presets/fullstack/skills/better-auth/scripts/requirements.txt +15 -0
- package/dist/presets/fullstack/skills/better-auth/scripts/tests/.coverage +0 -0
- package/dist/presets/fullstack/skills/better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/dist/presets/fullstack/skills/chrome-devtools/SKILL.md +364 -0
- package/dist/presets/fullstack/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/dist/presets/fullstack/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/dist/presets/fullstack/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/README.md +213 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/click.js +79 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/console.js +75 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/evaluate.js +49 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/fill.js +72 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/install-deps.sh +181 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/install.sh +83 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/lib/browser.js +122 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/lib/selector.js +178 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/navigate.js +46 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/network.js +102 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/package.json +15 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/performance.js +145 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/screenshot.js +180 -0
- package/dist/presets/fullstack/skills/chrome-devtools/scripts/snapshot.js +131 -0
- package/dist/presets/fullstack/skills/claude-code/references/advanced-features.md +399 -0
- package/dist/presets/fullstack/skills/claude-code/references/agent-skills.md +399 -0
- package/dist/presets/fullstack/skills/claude-code/references/api-reference.md +498 -0
- package/dist/presets/fullstack/skills/claude-code/references/best-practices.md +447 -0
- package/dist/presets/fullstack/skills/claude-code/references/cicd-integration.md +428 -0
- package/dist/presets/fullstack/skills/claude-code/references/configuration.md +480 -0
- package/dist/presets/fullstack/skills/claude-code/references/enterprise-features.md +472 -0
- package/dist/presets/fullstack/skills/claude-code/references/getting-started.md +252 -0
- package/dist/presets/fullstack/skills/claude-code/references/hooks-and-plugins.md +441 -0
- package/dist/presets/fullstack/skills/claude-code/references/ide-integration.md +316 -0
- package/dist/presets/fullstack/skills/claude-code/references/mcp-integration.md +386 -0
- package/dist/presets/fullstack/skills/claude-code/references/slash-commands.md +489 -0
- package/dist/presets/fullstack/skills/claude-code/references/troubleshooting.md +456 -0
- package/dist/presets/fullstack/skills/claude-code/skill.md +194 -0
- package/dist/presets/fullstack/skills/code-review/references/code-review-reception.md +213 -0
- package/dist/presets/fullstack/skills/code-review/references/requesting-code-review.md +108 -0
- package/dist/presets/fullstack/skills/code-review/references/verification-before-completion.md +142 -0
- package/dist/presets/fullstack/skills/common/README.md +120 -0
- package/dist/presets/fullstack/skills/common/api_key_helper.py +300 -0
- package/dist/presets/fullstack/skills/databases/SKILL.md +8 -4
- package/dist/presets/fullstack/skills/databases/references/mongodb-aggregation.md +447 -0
- package/dist/presets/fullstack/skills/databases/references/mongodb-atlas.md +465 -0
- package/dist/presets/fullstack/skills/databases/references/mongodb-crud.md +408 -0
- package/dist/presets/fullstack/skills/databases/references/mongodb-indexing.md +442 -0
- package/dist/presets/fullstack/skills/databases/references/postgresql-administration.md +594 -0
- package/dist/presets/fullstack/skills/databases/references/postgresql-performance.md +527 -0
- package/dist/presets/fullstack/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/dist/presets/fullstack/skills/databases/references/postgresql-queries.md +475 -0
- package/dist/presets/fullstack/skills/databases/scripts/.coverage +0 -0
- package/dist/presets/fullstack/skills/databases/scripts/db_backup.py +502 -0
- package/dist/presets/fullstack/skills/databases/scripts/db_migrate.py +414 -0
- package/dist/presets/fullstack/skills/databases/scripts/db_performance_check.py +444 -0
- package/dist/presets/fullstack/skills/databases/scripts/requirements.txt +20 -0
- package/dist/presets/fullstack/skills/databases/scripts/tests/coverage-db.json +1 -0
- package/dist/presets/fullstack/skills/databases/scripts/tests/requirements.txt +4 -0
- package/dist/presets/fullstack/skills/databases/scripts/tests/test_db_backup.py +340 -0
- package/dist/presets/fullstack/skills/databases/scripts/tests/test_db_migrate.py +277 -0
- package/dist/presets/fullstack/skills/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/dist/presets/fullstack/skills/debugging/SKILL.md +8 -4
- package/dist/presets/fullstack/skills/debugging/references/defense-in-depth.md +124 -0
- package/dist/presets/fullstack/skills/debugging/references/root-cause-tracing.md +122 -0
- package/dist/presets/fullstack/skills/debugging/references/systematic-debugging.md +102 -0
- package/dist/presets/fullstack/skills/debugging/references/verification.md +123 -0
- package/dist/presets/fullstack/skills/debugging/scripts/find-polluter.sh +63 -0
- package/dist/presets/fullstack/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/dist/presets/fullstack/skills/devops/.env.example +76 -0
- package/dist/presets/fullstack/skills/devops/SKILL.md +9 -4
- package/dist/presets/fullstack/skills/devops/references/browser-rendering.md +305 -0
- package/dist/presets/fullstack/skills/devops/references/cloudflare-d1-kv.md +123 -0
- package/dist/presets/fullstack/skills/devops/references/cloudflare-platform.md +271 -0
- package/dist/presets/fullstack/skills/devops/references/cloudflare-r2-storage.md +280 -0
- package/dist/presets/fullstack/skills/devops/references/cloudflare-workers-advanced.md +312 -0
- package/dist/presets/fullstack/skills/devops/references/cloudflare-workers-apis.md +309 -0
- package/dist/presets/fullstack/skills/devops/references/cloudflare-workers-basics.md +418 -0
- package/dist/presets/fullstack/skills/devops/references/docker-basics.md +297 -0
- package/dist/presets/fullstack/skills/devops/references/docker-compose.md +292 -0
- package/dist/presets/fullstack/skills/devops/references/gcloud-platform.md +297 -0
- package/dist/presets/fullstack/skills/devops/references/gcloud-services.md +304 -0
- package/dist/presets/fullstack/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/dist/presets/fullstack/skills/devops/scripts/docker_optimize.py +320 -0
- package/dist/presets/fullstack/skills/devops/scripts/requirements.txt +20 -0
- package/dist/presets/fullstack/skills/devops/scripts/tests/requirements.txt +3 -0
- package/dist/presets/fullstack/skills/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/dist/presets/fullstack/skills/devops/scripts/tests/test_docker_optimize.py +436 -0
- package/dist/presets/fullstack/skills/docs-seeker/.env.example +15 -0
- package/dist/presets/fullstack/skills/docs-seeker/SKILL.md +7 -4
- package/dist/presets/fullstack/skills/docs-seeker/package.json +25 -0
- package/dist/presets/fullstack/skills/docs-seeker/references/advanced.md +79 -0
- package/dist/presets/fullstack/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/dist/presets/fullstack/skills/docs-seeker/references/errors.md +68 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/dist/presets/fullstack/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/dist/presets/fullstack/skills/docs-seeker/workflows/library-search.md +87 -0
- package/dist/presets/fullstack/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/dist/presets/fullstack/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/dist/presets/fullstack/skills/frontend-design/SKILL.md +8 -4
- package/dist/presets/fullstack/skills/frontend-design/references/animejs.md +396 -0
- package/dist/presets/fullstack/skills/mcp-builder/LICENSE.txt +202 -0
- package/dist/presets/fullstack/skills/mcp-builder/SKILL.md +8 -4
- package/dist/presets/fullstack/skills/mcp-builder/reference/evaluation.md +602 -0
- package/dist/presets/fullstack/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/dist/presets/fullstack/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/dist/presets/fullstack/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/dist/presets/fullstack/skills/mcp-builder/scripts/connections.py +151 -0
- package/dist/presets/fullstack/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/dist/presets/fullstack/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/dist/presets/fullstack/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/dist/presets/fullstack/skills/mcp-management/README.md +219 -0
- package/dist/presets/fullstack/skills/mcp-management/SKILL.md +216 -0
- package/dist/presets/fullstack/skills/mcp-management/assets/tools.json +3146 -0
- package/dist/presets/fullstack/skills/mcp-management/references/configuration.md +114 -0
- package/dist/presets/fullstack/skills/mcp-management/references/gemini-cli-integration.md +215 -0
- package/dist/presets/fullstack/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/.env.example +10 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/cli.ts +195 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/dist/cli.js +127 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/dist/mcp-client.js +115 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/mcp-client.ts +230 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/package.json +20 -0
- package/dist/presets/fullstack/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/dist/presets/fullstack/skills/media-processing/SKILL.md +367 -0
- package/dist/presets/fullstack/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/dist/presets/fullstack/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/dist/presets/fullstack/skills/media-processing/references/ffmpeg-streaming.md +403 -0
- package/dist/presets/fullstack/skills/media-processing/references/format-compatibility.md +375 -0
- package/dist/presets/fullstack/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/dist/presets/fullstack/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/batch_resize.py +342 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/media_convert.py +311 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/requirements.txt +24 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/tests/.coverage +0 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/tests/requirements.txt +2 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/tests/test_media_convert.py +259 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/dist/presets/fullstack/skills/media-processing/scripts/video_optimize.py +414 -0
- package/dist/presets/fullstack/skills/mobile-development/SKILL.md +220 -0
- package/dist/presets/fullstack/skills/mobile-development/references/mobile-android.md +604 -0
- package/dist/presets/fullstack/skills/mobile-development/references/mobile-best-practices.md +545 -0
- package/dist/presets/fullstack/skills/mobile-development/references/mobile-debugging.md +1089 -0
- package/dist/presets/fullstack/skills/mobile-development/references/mobile-frameworks.md +465 -0
- package/dist/presets/fullstack/skills/mobile-development/references/mobile-ios.md +496 -0
- package/dist/presets/fullstack/skills/mobile-development/references/mobile-mindset.md +544 -0
- package/dist/presets/fullstack/skills/payment-integration/README.md +185 -0
- package/dist/presets/fullstack/skills/payment-integration/SKILL.md +9 -4
- package/dist/presets/fullstack/skills/payment-integration/references/polar/benefits.md +396 -0
- package/dist/presets/fullstack/skills/payment-integration/references/polar/best-practices.md +482 -0
- package/dist/presets/fullstack/skills/payment-integration/references/polar/checkouts.md +266 -0
- package/dist/presets/fullstack/skills/payment-integration/references/polar/overview.md +184 -0
- package/dist/presets/fullstack/skills/payment-integration/references/polar/products.md +244 -0
- package/dist/presets/fullstack/skills/payment-integration/references/polar/sdk.md +436 -0
- package/dist/presets/fullstack/skills/payment-integration/references/polar/subscriptions.md +340 -0
- package/dist/presets/fullstack/skills/payment-integration/references/polar/webhooks.md +405 -0
- package/dist/presets/fullstack/skills/payment-integration/references/sepay/api.md +140 -0
- package/dist/presets/fullstack/skills/payment-integration/references/sepay/best-practices.md +337 -0
- package/dist/presets/fullstack/skills/payment-integration/references/sepay/overview.md +138 -0
- package/dist/presets/fullstack/skills/payment-integration/references/sepay/qr-codes.md +228 -0
- package/dist/presets/fullstack/skills/payment-integration/references/sepay/sdk.md +213 -0
- package/dist/presets/fullstack/skills/payment-integration/references/sepay/webhooks.md +208 -0
- package/dist/presets/fullstack/skills/payment-integration/scripts/.env.example +20 -0
- package/dist/presets/fullstack/skills/payment-integration/scripts/checkout-helper.js +244 -0
- package/dist/presets/fullstack/skills/payment-integration/scripts/package.json +17 -0
- package/dist/presets/fullstack/skills/payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/dist/presets/fullstack/skills/payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/dist/presets/fullstack/skills/payment-integration/scripts/test-scripts.js +237 -0
- package/dist/presets/fullstack/skills/planning/SKILL.md +8 -4
- package/dist/presets/fullstack/skills/planning/references/codebase-understanding.md +62 -0
- package/dist/presets/fullstack/skills/planning/references/output-standards.md +87 -0
- package/dist/presets/fullstack/skills/planning/references/plan-organization.md +100 -0
- package/dist/presets/fullstack/skills/planning/references/research-phase.md +49 -0
- package/dist/presets/fullstack/skills/planning/references/solution-design.md +63 -0
- package/dist/presets/fullstack/skills/problem-solving/SKILL.md +7 -4
- package/dist/presets/fullstack/skills/problem-solving/references/attribution.md +69 -0
- package/dist/presets/fullstack/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/dist/presets/fullstack/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/dist/presets/fullstack/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/dist/presets/fullstack/skills/problem-solving/references/scale-game.md +95 -0
- package/dist/presets/fullstack/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/dist/presets/fullstack/skills/problem-solving/references/when-stuck.md +72 -0
- package/dist/presets/fullstack/skills/repomix/references/configuration.md +211 -0
- package/dist/presets/fullstack/skills/repomix/references/usage-patterns.md +232 -0
- package/dist/presets/fullstack/skills/repomix/scripts/.coverage +0 -0
- package/dist/presets/fullstack/skills/repomix/scripts/README.md +179 -0
- package/dist/presets/fullstack/skills/repomix/scripts/repomix_batch.py +455 -0
- package/dist/presets/fullstack/skills/repomix/scripts/repos.example.json +15 -0
- package/dist/presets/fullstack/skills/repomix/scripts/requirements.txt +15 -0
- package/dist/presets/fullstack/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/dist/presets/fullstack/skills/sequential-thinking/.env.example +8 -0
- package/dist/presets/fullstack/skills/sequential-thinking/README.md +183 -0
- package/dist/presets/fullstack/skills/sequential-thinking/SKILL.md +8 -4
- package/dist/presets/fullstack/skills/sequential-thinking/package.json +31 -0
- package/dist/presets/fullstack/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/dist/presets/fullstack/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/dist/presets/fullstack/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/dist/presets/fullstack/skills/sequential-thinking/references/examples-api.md +88 -0
- package/dist/presets/fullstack/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/dist/presets/fullstack/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/dist/presets/fullstack/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/dist/presets/fullstack/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/dist/presets/fullstack/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/dist/presets/fullstack/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/dist/presets/fullstack/skills/shopify/README.md +66 -0
- package/dist/presets/fullstack/skills/shopify/references/app-development.md +470 -0
- package/dist/presets/fullstack/skills/shopify/references/extensions.md +493 -0
- package/dist/presets/fullstack/skills/shopify/references/themes.md +498 -0
- package/dist/presets/fullstack/skills/shopify/scripts/.coverage +0 -0
- package/dist/presets/fullstack/skills/shopify/scripts/requirements.txt +19 -0
- package/dist/presets/fullstack/skills/shopify/scripts/shopify_init.py +423 -0
- package/dist/presets/fullstack/skills/shopify/scripts/tests/.coverage +0 -0
- package/dist/presets/fullstack/skills/shopify/scripts/tests/test_shopify_init.py +385 -0
- package/dist/presets/fullstack/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/presets/fullstack/skills/skill-creator/SKILL.md +7 -4
- package/dist/presets/fullstack/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/presets/fullstack/skills/skill-creator/scripts/package_skill.py +110 -0
- package/dist/presets/fullstack/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/dist/presets/fullstack/skills/threejs/SKILL.md +97 -0
- package/dist/presets/fullstack/skills/threejs/references/01-getting-started.md +177 -0
- package/dist/presets/fullstack/skills/threejs/references/02-loaders.md +169 -0
- package/dist/presets/fullstack/skills/threejs/references/03-textures.md +170 -0
- package/dist/presets/fullstack/skills/threejs/references/04-cameras.md +195 -0
- package/dist/presets/fullstack/skills/threejs/references/05-lights.md +183 -0
- package/dist/presets/fullstack/skills/threejs/references/06-animations.md +214 -0
- package/dist/presets/fullstack/skills/threejs/references/07-math.md +260 -0
- package/dist/presets/fullstack/skills/threejs/references/08-interaction.md +267 -0
- package/dist/presets/fullstack/skills/threejs/references/09-postprocessing.md +240 -0
- package/dist/presets/fullstack/skills/threejs/references/10-controls.md +259 -0
- package/dist/presets/fullstack/skills/threejs/references/11-materials-advanced.md +270 -0
- package/dist/presets/fullstack/skills/threejs/references/12-performance.md +269 -0
- package/dist/presets/fullstack/skills/threejs/references/13-node-materials.md +298 -0
- package/dist/presets/fullstack/skills/threejs/references/14-physics-vr.md +304 -0
- package/dist/presets/fullstack/skills/threejs/references/15-specialized-loaders.md +333 -0
- package/dist/presets/fullstack/skills/threejs/references/16-webgpu.md +302 -0
- package/dist/presets/fullstack/skills/ui-styling/LICENSE.txt +202 -0
- package/dist/presets/fullstack/skills/ui-styling/SKILL.md +9 -4
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/dist/presets/fullstack/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/dist/presets/fullstack/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/dist/presets/fullstack/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/dist/presets/fullstack/skills/ui-styling/references/shadcn-components.md +424 -0
- package/dist/presets/fullstack/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/dist/presets/fullstack/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/dist/presets/fullstack/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/dist/presets/fullstack/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/.coverage +0 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/requirements.txt +17 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/dist/presets/fullstack/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/dist/presets/fullstack/skills/web-frameworks/SKILL.md +9 -4
- package/dist/presets/fullstack/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/dist/presets/fullstack/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/dist/presets/fullstack/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/dist/presets/fullstack/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/dist/presets/fullstack/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/dist/presets/fullstack/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/dist/presets/fullstack/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/dist/presets/fullstack/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/.coverage +0 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/__init__.py +0 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/requirements.txt +16 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/tests/requirements.txt +3 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/dist/presets/fullstack/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/dist/presets/mobile/commands/ask.md +57 -0
- package/dist/presets/mobile/commands/bootstrap/auto/fast.md +112 -0
- package/dist/presets/mobile/commands/bootstrap/auto.md +116 -0
- package/dist/presets/mobile/commands/brainstorm.md +70 -0
- package/dist/presets/mobile/commands/code.md +94 -0
- package/dist/presets/mobile/commands/content/cro.md +44 -0
- package/dist/presets/mobile/commands/content/enhance.md +15 -0
- package/dist/presets/mobile/commands/content/fast.md +14 -0
- package/dist/presets/mobile/commands/content/good.md +17 -0
- package/dist/presets/mobile/commands/cook/auto/fast.md +27 -0
- package/dist/presets/mobile/commands/cook/auto.md +16 -0
- package/dist/presets/mobile/commands/cook.md +106 -0
- package/dist/presets/mobile/commands/debug.md +14 -0
- package/dist/presets/mobile/commands/design/3d.md +75 -0
- package/dist/presets/mobile/commands/design/describe.md +22 -0
- package/dist/presets/mobile/commands/design/fast.md +23 -0
- package/dist/presets/mobile/commands/design/good.md +27 -0
- package/dist/presets/mobile/commands/design/screenshot.md +33 -0
- package/dist/presets/mobile/commands/design/video.md +33 -0
- package/dist/presets/mobile/commands/docs/init.md +15 -0
- package/dist/presets/mobile/commands/fix/ci.md +21 -0
- package/dist/presets/mobile/commands/fix/fast.md +20 -0
- package/dist/presets/mobile/commands/fix/hard.md +44 -0
- package/dist/presets/mobile/commands/fix/logs.md +21 -0
- package/dist/presets/mobile/commands/fix/test.md +21 -0
- package/dist/presets/mobile/commands/fix/types.md +9 -0
- package/dist/presets/mobile/commands/fix/ui.md +36 -0
- package/dist/presets/mobile/commands/fix.md +13 -0
- package/dist/presets/mobile/commands/git/cm.md +5 -0
- package/dist/presets/mobile/commands/git/cp.md +4 -0
- package/dist/presets/mobile/commands/journal.md +5 -0
- package/dist/presets/mobile/commands/plan/ci.md +19 -0
- package/dist/presets/mobile/commands/plan/cro.md +57 -0
- package/dist/presets/mobile/commands/plan/fast.md +47 -0
- package/dist/presets/mobile/commands/plan/hard.md +58 -0
- package/dist/presets/mobile/commands/plan/two.md +31 -0
- package/dist/presets/mobile/commands/plan.md +24 -0
- package/dist/presets/mobile/commands/review/codebase.md +50 -0
- package/dist/presets/mobile/commands/skill/fix-logs.md +22 -0
- package/dist/presets/mobile/commands/use-mcp.md +35 -0
- package/dist/presets/mobile/commands/watzup.md +8 -0
- package/dist/presets/mobile/hooks/discord-hook-setup.md +412 -0
- package/dist/presets/mobile/hooks/telegram-hook-setup.md +774 -0
- package/dist/presets/mobile/manifest.json +2289 -158
- package/dist/presets/mobile/metadata.json +15 -0
- package/dist/presets/mobile/skills/aesthetic/SKILL.md +132 -0
- package/dist/presets/mobile/skills/aesthetic/assets/design-guideline-template.md +163 -0
- package/dist/presets/mobile/skills/aesthetic/assets/design-story-template.md +135 -0
- package/dist/presets/mobile/skills/aesthetic/references/design-principles.md +62 -0
- package/dist/presets/mobile/skills/aesthetic/references/design-resources.md +75 -0
- package/dist/presets/mobile/skills/aesthetic/references/micro-interactions.md +53 -0
- package/dist/presets/mobile/skills/aesthetic/references/storytelling-design.md +50 -0
- package/dist/presets/mobile/skills/ai-multimodal/.env.example +97 -0
- package/dist/presets/mobile/skills/ai-multimodal/SKILL.md +13 -4
- package/dist/presets/mobile/skills/ai-multimodal/references/audio-processing.md +373 -0
- package/dist/presets/mobile/skills/ai-multimodal/references/image-generation.md +558 -0
- package/dist/presets/mobile/skills/ai-multimodal/references/video-analysis.md +498 -0
- package/dist/presets/mobile/skills/ai-multimodal/references/vision-understanding.md +479 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/.coverage +0 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/document_converter.py +395 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/gemini_batch_process.py +480 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/requirements.txt +26 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/tests/.coverage +0 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/tests/test_failures.log +258 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/dist/presets/mobile/skills/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/dist/presets/mobile/skills/chrome-devtools/SKILL.md +7 -4
- package/dist/presets/mobile/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/dist/presets/mobile/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/dist/presets/mobile/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/README.md +213 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/click.js +79 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/console.js +75 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/evaluate.js +49 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/fill.js +72 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/install-deps.sh +181 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/install.sh +83 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/lib/browser.js +122 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/lib/selector.js +178 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/navigate.js +46 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/network.js +102 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/package.json +15 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/performance.js +145 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/screenshot.js +180 -0
- package/dist/presets/mobile/skills/chrome-devtools/scripts/snapshot.js +131 -0
- package/dist/presets/mobile/skills/claude-code/references/advanced-features.md +399 -0
- package/dist/presets/mobile/skills/claude-code/references/agent-skills.md +399 -0
- package/dist/presets/mobile/skills/claude-code/references/api-reference.md +498 -0
- package/dist/presets/mobile/skills/claude-code/references/best-practices.md +447 -0
- package/dist/presets/mobile/skills/claude-code/references/cicd-integration.md +428 -0
- package/dist/presets/mobile/skills/claude-code/references/configuration.md +480 -0
- package/dist/presets/mobile/skills/claude-code/references/enterprise-features.md +472 -0
- package/dist/presets/mobile/skills/claude-code/references/getting-started.md +252 -0
- package/dist/presets/mobile/skills/claude-code/references/hooks-and-plugins.md +441 -0
- package/dist/presets/mobile/skills/claude-code/references/ide-integration.md +316 -0
- package/dist/presets/mobile/skills/claude-code/references/mcp-integration.md +386 -0
- package/dist/presets/mobile/skills/claude-code/references/slash-commands.md +489 -0
- package/dist/presets/mobile/skills/claude-code/references/troubleshooting.md +456 -0
- package/dist/presets/mobile/skills/claude-code/skill.md +194 -0
- package/dist/presets/mobile/skills/code-review/references/code-review-reception.md +213 -0
- package/dist/presets/mobile/skills/code-review/references/requesting-code-review.md +108 -0
- package/dist/presets/mobile/skills/code-review/references/verification-before-completion.md +142 -0
- package/dist/presets/mobile/skills/common/README.md +120 -0
- package/dist/presets/mobile/skills/common/api_key_helper.py +300 -0
- package/dist/presets/mobile/skills/debugging/SKILL.md +9 -4
- package/dist/presets/mobile/skills/debugging/references/defense-in-depth.md +124 -0
- package/dist/presets/mobile/skills/debugging/references/root-cause-tracing.md +122 -0
- package/dist/presets/mobile/skills/debugging/references/systematic-debugging.md +102 -0
- package/dist/presets/mobile/skills/debugging/references/verification.md +123 -0
- package/dist/presets/mobile/skills/debugging/scripts/find-polluter.sh +63 -0
- package/dist/presets/mobile/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/dist/presets/mobile/skills/docs-seeker/.env.example +15 -0
- package/dist/presets/mobile/skills/docs-seeker/SKILL.md +7 -4
- package/dist/presets/mobile/skills/docs-seeker/package.json +25 -0
- package/dist/presets/mobile/skills/docs-seeker/references/advanced.md +79 -0
- package/dist/presets/mobile/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/dist/presets/mobile/skills/docs-seeker/references/errors.md +68 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/dist/presets/mobile/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/dist/presets/mobile/skills/docs-seeker/workflows/library-search.md +87 -0
- package/dist/presets/mobile/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/dist/presets/mobile/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/dist/presets/mobile/skills/frontend-design/SKILL.md +8 -4
- package/dist/presets/mobile/skills/frontend-design/SKILL.source.md +46 -0
- package/dist/presets/mobile/skills/frontend-design/references/animejs.md +396 -0
- package/dist/presets/mobile/skills/mcp-builder/LICENSE.txt +202 -0
- package/dist/presets/mobile/skills/mcp-builder/SKILL.md +7 -4
- package/dist/presets/mobile/skills/mcp-builder/reference/evaluation.md +602 -0
- package/dist/presets/mobile/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/dist/presets/mobile/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/dist/presets/mobile/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/dist/presets/mobile/skills/mcp-builder/scripts/connections.py +151 -0
- package/dist/presets/mobile/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/dist/presets/mobile/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/dist/presets/mobile/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/dist/presets/mobile/skills/mcp-management/README.md +219 -0
- package/dist/presets/mobile/skills/mcp-management/assets/tools.json +3146 -0
- package/dist/presets/mobile/skills/mcp-management/references/configuration.md +114 -0
- package/dist/presets/mobile/skills/mcp-management/references/gemini-cli-integration.md +215 -0
- package/dist/presets/mobile/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/.env.example +10 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/cli.ts +195 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/dist/cli.js +127 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/dist/mcp-client.js +115 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/mcp-client.ts +230 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/package.json +20 -0
- package/dist/presets/mobile/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/dist/presets/mobile/skills/media-processing/SKILL.md +8 -4
- package/dist/presets/mobile/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/dist/presets/mobile/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/dist/presets/mobile/skills/media-processing/references/ffmpeg-streaming.md +403 -0
- package/dist/presets/mobile/skills/media-processing/references/format-compatibility.md +375 -0
- package/dist/presets/mobile/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/dist/presets/mobile/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/dist/presets/mobile/skills/media-processing/scripts/batch_resize.py +342 -0
- package/dist/presets/mobile/skills/media-processing/scripts/media_convert.py +311 -0
- package/dist/presets/mobile/skills/media-processing/scripts/requirements.txt +24 -0
- package/dist/presets/mobile/skills/media-processing/scripts/tests/.coverage +0 -0
- package/dist/presets/mobile/skills/media-processing/scripts/tests/requirements.txt +2 -0
- package/dist/presets/mobile/skills/media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/dist/presets/mobile/skills/media-processing/scripts/tests/test_media_convert.py +259 -0
- package/dist/presets/mobile/skills/media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/dist/presets/mobile/skills/media-processing/scripts/video_optimize.py +414 -0
- package/dist/presets/mobile/skills/mobile-development/SKILL.md +9 -4
- package/dist/presets/mobile/skills/mobile-development/references/mobile-android.md +604 -0
- package/dist/presets/mobile/skills/mobile-development/references/mobile-best-practices.md +545 -0
- package/dist/presets/mobile/skills/mobile-development/references/mobile-debugging.md +1089 -0
- package/dist/presets/mobile/skills/mobile-development/references/mobile-frameworks.md +465 -0
- package/dist/presets/mobile/skills/mobile-development/references/mobile-ios.md +496 -0
- package/dist/presets/mobile/skills/mobile-development/references/mobile-mindset.md +544 -0
- package/dist/presets/mobile/skills/planning/SKILL.md +8 -4
- package/dist/presets/mobile/skills/planning/references/codebase-understanding.md +62 -0
- package/dist/presets/mobile/skills/planning/references/output-standards.md +87 -0
- package/dist/presets/mobile/skills/planning/references/plan-organization.md +100 -0
- package/dist/presets/mobile/skills/planning/references/research-phase.md +49 -0
- package/dist/presets/mobile/skills/planning/references/solution-design.md +63 -0
- package/dist/presets/mobile/skills/problem-solving/SKILL.md +8 -4
- package/dist/presets/mobile/skills/problem-solving/references/attribution.md +69 -0
- package/dist/presets/mobile/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/dist/presets/mobile/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/dist/presets/mobile/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/dist/presets/mobile/skills/problem-solving/references/scale-game.md +95 -0
- package/dist/presets/mobile/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/dist/presets/mobile/skills/problem-solving/references/when-stuck.md +72 -0
- package/dist/presets/mobile/skills/repomix/references/configuration.md +211 -0
- package/dist/presets/mobile/skills/repomix/references/usage-patterns.md +232 -0
- package/dist/presets/mobile/skills/repomix/scripts/.coverage +0 -0
- package/dist/presets/mobile/skills/repomix/scripts/README.md +179 -0
- package/dist/presets/mobile/skills/repomix/scripts/repomix_batch.py +455 -0
- package/dist/presets/mobile/skills/repomix/scripts/repos.example.json +15 -0
- package/dist/presets/mobile/skills/repomix/scripts/requirements.txt +15 -0
- package/dist/presets/mobile/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/dist/presets/mobile/skills/sequential-thinking/.env.example +8 -0
- package/dist/presets/mobile/skills/sequential-thinking/README.md +183 -0
- package/dist/presets/mobile/skills/sequential-thinking/SKILL.md +9 -4
- package/dist/presets/mobile/skills/sequential-thinking/package.json +31 -0
- package/dist/presets/mobile/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/dist/presets/mobile/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/dist/presets/mobile/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/dist/presets/mobile/skills/sequential-thinking/references/examples-api.md +88 -0
- package/dist/presets/mobile/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/dist/presets/mobile/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/dist/presets/mobile/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/dist/presets/mobile/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/dist/presets/mobile/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/dist/presets/mobile/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/dist/presets/mobile/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/presets/mobile/skills/skill-creator/SKILL.md +7 -4
- package/dist/presets/mobile/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/presets/mobile/skills/skill-creator/scripts/package_skill.py +110 -0
- package/dist/presets/mobile/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/dist/presets/mobile/skills/ui-styling/LICENSE.txt +202 -0
- package/dist/presets/mobile/skills/ui-styling/SKILL.md +9 -4
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/dist/presets/mobile/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/dist/presets/mobile/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/dist/presets/mobile/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/dist/presets/mobile/skills/ui-styling/references/shadcn-components.md +424 -0
- package/dist/presets/mobile/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/dist/presets/mobile/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/dist/presets/mobile/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/dist/presets/mobile/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/.coverage +0 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/requirements.txt +17 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/dist/presets/mobile/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/dist/presets/mobile/skills/web-frameworks/SKILL.md +9 -4
- package/dist/presets/mobile/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/dist/presets/mobile/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/dist/presets/mobile/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/dist/presets/mobile/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/dist/presets/mobile/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/dist/presets/mobile/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/dist/presets/mobile/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/dist/presets/mobile/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/.coverage +0 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/__init__.py +0 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/requirements.txt +16 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/tests/requirements.txt +3 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/dist/presets/mobile/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/core/PresetLoader.ts","../src/core/ManifestParser.ts","../src/core/errors.ts","../src/core/ConflictResolver.ts","../src/core/BackupManager.ts","../src/core/TrackingStore.ts","../src/utils/logger.ts","../src/utils/color.ts","../src/core/MetadataWriter.ts","../src/core/StatuslineSelector.ts","../src/core/merge/mergeMCP.ts","../src/core/merge/mergeSettings.ts","../src/prompts/DiffViewer.ts","../src/utils/fs-safe.ts","../src/utils/paths.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/info.ts","../src/commands/update.ts","../src/commands/restore.ts","../src/commands/doctor.ts","../src/commands/telemetry.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { createRequire } from 'node:module';\r\nimport process from 'node:process';\r\nimport { Command } from 'commander';\r\nimport { registerInitCommand } from './commands/init.js';\r\nimport { registerAddCommand } from './commands/add.js';\r\nimport { registerListCommand } from './commands/list.js';\r\nimport { registerInfoCommand } from './commands/info.js';\r\nimport { registerUpdateCommand } from './commands/update.js';\r\nimport { registerRestoreCommand } from './commands/restore.js';\r\nimport { registerDoctorCommand } from './commands/doctor.js';\r\nimport { registerTelemetryCommand } from './commands/telemetry.js';\r\nimport { setVerbose, setQuiet } from './utils/logger.js';\r\n\r\n// Node version check\r\nconst major = parseInt(process.versions.node.split('.')[0], 10);\r\nif (major < 18) {\r\n process.stderr.write(\r\n '[KK001] kiro-kit requires Node.js >= 18. ' +\r\n `Current version: ${process.version}. ` +\r\n 'Please upgrade Node.js.\\n',\r\n );\r\n process.exit(1);\r\n}\r\n\r\nconst require = createRequire(import.meta.url);\r\nconst pkg = require('../package.json') as { version: string };\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('kiro-kit')\r\n .description('CLI tool for bootstrapping engineer-grade Kiro IDE workspaces.')\r\n .version(pkg.version, '-v, --version');\r\n\r\n// Global flags\r\nprogram.option('--verbose', 'Enable verbose output');\r\nprogram.option('--quiet', 'Suppress non-essential output');\r\nprogram.option('--no-color', 'Disable colored output');\r\n\r\n// Wire all commands\r\nregisterInitCommand(program);\r\nregisterAddCommand(program);\r\nregisterListCommand(program);\r\nregisterInfoCommand(program);\r\nregisterUpdateCommand(program);\r\nregisterRestoreCommand(program);\r\nregisterDoctorCommand(program);\r\nregisterTelemetryCommand(program);\r\n\r\n// Apply global flags before command execution\r\nprogram.hook('preAction', (thisCommand) => {\r\n const opts = thisCommand.opts();\r\n if (opts['verbose']) setVerbose(true);\r\n if (opts['quiet']) setQuiet(true);\r\n});\r\n\r\nprogram.parse(process.argv);\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport readline from 'node:readline';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, loadAll, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface InitOptions {\r\n yes?: boolean;\r\n preset?: string[];\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\n// Handle SIGINT at process level for exit 130\r\nfunction setupSigintHandler(): void {\r\n process.on('SIGINT', () => {\r\n process.exit(130);\r\n });\r\n}\r\n\r\n/**\r\n * Interactive multi-pick prompt using readline.\r\n * Space to toggle, 'a' to toggle all, Enter to confirm.\r\n */\r\nasync function multiPickPrompt(\r\n items: Array<{ name: string; description: string }>,\r\n): Promise<string[]> {\r\n const selected = new Set<number>();\r\n let cursor = 0;\r\n\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: false,\r\n });\r\n\r\n // Enable raw mode for keypress detection\r\n if (!process.stdin.isTTY) {\r\n // Non-interactive: return empty\r\n rl.close();\r\n return [];\r\n }\r\n\r\n return new Promise<string[]>((resolve, reject) => {\r\n const render = (): void => {\r\n // Move cursor up to overwrite previous render\r\n if (cursor >= 0) {\r\n process.stdout.write(`\\x1B[${items.length + 1}A`);\r\n }\r\n process.stdout.write(\r\n color.bold('? Select presets to install:') +\r\n color.dim(' (Space to select, <a> toggle all, Enter to confirm)') +\r\n '\\n',\r\n );\r\n for (let i = 0; i < items.length; i++) {\r\n const marker = cursor === i ? color.cyan('>') : ' ';\r\n const check = selected.has(i)\r\n ? color.green('[x]')\r\n : '[ ]';\r\n const name = color.bold(items[i].name.padEnd(12));\r\n const desc = color.dim(`- ${items[i].description}`);\r\n process.stdout.write(` ${marker} ${check} ${name} ${desc}\\n`);\r\n }\r\n };\r\n\r\n // Initial render\r\n process.stdout.write('\\n'.repeat(items.length + 1));\r\n render();\r\n\r\n process.stdin.setRawMode(true);\r\n process.stdin.resume();\r\n process.stdin.setEncoding('utf-8');\r\n\r\n const onData = (key: string): void => {\r\n // Ctrl+C / SIGINT\r\n if (key === '\\x03') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n return;\r\n }\r\n\r\n // Enter\r\n if (key === '\\r' || key === '\\n') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n const result = [...selected].map((i) => items[i].name);\r\n resolve(result);\r\n return;\r\n }\r\n\r\n // Space - toggle current\r\n if (key === ' ') {\r\n if (selected.has(cursor)) {\r\n selected.delete(cursor);\r\n } else {\r\n selected.add(cursor);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // 'a' - toggle all\r\n if (key === 'a' || key === 'A') {\r\n if (selected.size === items.length) {\r\n selected.clear();\r\n } else {\r\n for (let i = 0; i < items.length; i++) selected.add(i);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow up / k\r\n if (key === '\\x1B[A' || key === 'k') {\r\n cursor = (cursor - 1 + items.length) % items.length;\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow down / j\r\n if (key === '\\x1B[B' || key === 'j') {\r\n cursor = (cursor + 1) % items.length;\r\n render();\r\n return;\r\n }\r\n };\r\n\r\n process.stdin.on('data', onData);\r\n });\r\n}\r\n\r\n/**\r\n * Confirmation prompt: \"About to write X files. Continue? (Y/n)\"\r\n */\r\nasync function confirmPrompt(message: string): Promise<boolean> {\r\n if (!process.stdin.isTTY) return true;\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(`${color.bold('?')} ${message} `, (answer) => {\r\n rl.close();\r\n const normalized = answer.trim().toLowerCase();\r\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Interactive 4-option conflict prompt.\r\n */\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip'); // default to skip on unrecognized input\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Register the init command on the given program.\r\n */\r\nexport function registerInitCommand(program: Command): void {\r\n program\r\n .command('init')\r\n .description('Initialize workspace with selected presets')\r\n .option('-y, --yes', 'Skip confirmation, accept defaults')\r\n .option('--preset <name>', 'Specify preset (repeatable)', collectPreset, [])\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (opts: InitOptions) => {\r\n setupSigintHandler();\r\n try {\r\n await runInit(opts);\r\n } catch (err: unknown) {\r\n if (err instanceof Error && err.message === 'SIGINT') {\r\n process.exit(130);\r\n }\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction collectPreset(value: string, previous: string[]): string[] {\r\n return [...previous, value];\r\n}\r\n\r\nasync function runInit(opts: InitOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // 1. Determine selected presets\r\n let selectedNames: string[];\r\n\r\n if (opts.preset && opts.preset.length > 0) {\r\n // Validate preset names\r\n for (const name of opts.preset) {\r\n if (!available.includes(name)) {\r\n logger.error(\r\n `Preset \"${name}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n }\r\n selectedNames = opts.preset;\r\n } else {\r\n // Interactive multi-pick\r\n const items = available.map((name) => {\r\n try {\r\n const preset = load(name);\r\n return { name, description: preset.manifest.description };\r\n } catch {\r\n return { name, description: '' };\r\n }\r\n });\r\n\r\n selectedNames = await multiPickPrompt(items);\r\n }\r\n\r\n // Empty selection -> exit 0\r\n if (selectedNames.length === 0) {\r\n logger.info('No presets selected. Exiting.');\r\n process.exit(0);\r\n }\r\n\r\n // 2. Load selected presets\r\n const presets = loadAll(selectedNames);\r\n\r\n // 3. Plan operations - count total files\r\n let totalFiles = 0;\r\n for (const preset of presets) {\r\n totalFiles += preset.manifest.files.length;\r\n }\r\n\r\n // 4. Show summary and ask for confirmation\r\n if (!opts.yes) {\r\n const confirmed = await confirmPrompt(\r\n `About to write ${totalFiles} files into .kiro/ and workspace. Continue? (Y/n)`,\r\n );\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // 5. Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n\r\n // Track written files for tracking store\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n // 6. Process each preset\r\n for (const preset of presets) {\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type for special handling\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const mcpFiles = manifest.files.filter((f) => f.type === 'mcp');\r\n const settingsFiles = manifest.files.filter((f) => f.type === 'settings');\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n // Safety check\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n // Set executable bit if needed\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n // File already identical\r\n break;\r\n }\r\n\r\n // Track the file regardless of action (for tracking store)\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files via StatuslineSelector\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (mcpFiles.length > 0 && manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch {\r\n existingMcp = null;\r\n }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n if (settingsFiles.length > 0) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(\r\n fs.readFileSync(settingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n } catch {\r\n existingSettings = null;\r\n }\r\n }\r\n\r\n // Read preset settings\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const presetSettings = JSON.parse(\r\n fs.readFileSync(presetSettingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n\r\n // Resolve statusline command per platform\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n }\r\n\r\n // Also write .mcp.json.example if present in preset (as regular file)\r\n const mcpExampleSource = path.join(presetDir, '.mcp.json.example');\r\n if (fs.existsSync(mcpExampleSource)) {\r\n const mcpExampleTarget = path.join(workspaceRoot, '.kiro/.mcp.json.example');\r\n if (!fs.existsSync(mcpExampleTarget)) {\r\n fs.mkdirSync(path.dirname(mcpExampleTarget), { recursive: true });\r\n fs.copyFileSync(mcpExampleSource, mcpExampleTarget);\r\n }\r\n }\r\n }\r\n\r\n // 7. Write metadata.json\r\n const kitVersion = getKitVersion();\r\n const presetMetas = presets.map((p) => ({\r\n name: p.manifest.name,\r\n version: p.manifest.version,\r\n }));\r\n\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, presetMetas)\r\n : MetadataWriter.compose({\r\n kitVersion,\r\n repository: 'https://github.com/ihatesea69/kiro-kit.git',\r\n presets: presetMetas,\r\n });\r\n\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // 8. Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n\r\n for (const preset of presets) {\r\n const presetFiles = allTrackedFiles.filter(\r\n (f) => f.sourcePreset === preset.manifest.name,\r\n );\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: preset.manifest.name,\r\n version: preset.manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: presetFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n }\r\n\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // 9. Print summary\r\n logger.success(\r\n `Done! ${filesWritten} files written, ${filesSkipped} skipped.`,\r\n );\r\n logger.info(\r\n `Presets installed: ${selectedNames.join(', ')}`,\r\n );\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\nimport { parse, validate, type Manifest } from './ManifestParser.js';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\n\r\nfunction getPresetsDir(): string {\r\n // Try a couple of candidate locations so the loader works whether the\r\n // bundle places presets next to index.js or one level up.\r\n const candidates = [\r\n path.resolve(__dirname, 'presets'), // dist/presets (current bundle)\r\n path.resolve(__dirname, '../presets'), // legacy layout\r\n path.resolve(__dirname, '../../../../presets'), // dev/source checkout\r\n ];\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate;\r\n }\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n 'Cannot locate presets directory.',\r\n 'Ensure kiro-kit is installed correctly.',\r\n );\r\n}\r\n\r\nexport interface LoadedPreset {\r\n manifest: Manifest;\r\n dir: string;\r\n}\r\n\r\n/**\r\n * Load a single preset by name.\r\n */\r\nexport function load(name: string): LoadedPreset {\r\n const presetsDir = getPresetsDir();\r\n const presetDir = path.join(presetsDir, name);\r\n\r\n if (!fs.existsSync(presetDir)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n `Preset \"${name}\" not found.`,\r\n `Available presets: ${listAvailable().join(', ')}`,\r\n );\r\n }\r\n\r\n const manifestPath = path.join(presetDir, 'manifest.json');\r\n if (!fs.existsSync(manifestPath)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" is missing manifest.json.`,\r\n );\r\n }\r\n\r\n const raw = fs.readFileSync(manifestPath, 'utf-8');\r\n const result = parse(raw);\r\n\r\n if (!result.ok) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" manifest parse error: ${result.error.message}`,\r\n );\r\n }\r\n\r\n return { manifest: result.value, dir: presetDir };\r\n}\r\n\r\n/**\r\n * Load multiple presets by name.\r\n */\r\nexport function loadAll(names: string[]): LoadedPreset[] {\r\n return names.map((n) => load(n));\r\n}\r\n\r\n/**\r\n * List all available preset names from the presets directory.\r\n */\r\nexport function listAvailable(): string[] {\r\n const presetsDir = getPresetsDir();\r\n try {\r\n return fs\r\n .readdirSync(presetsDir, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .filter((d) => !d.name.startsWith('_'))\r\n .filter((d) =>\r\n fs.existsSync(path.join(presetsDir, d.name, 'manifest.json')),\r\n )\r\n .map((d) => d.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n","import { z } from 'zod';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst ArtifactTypeSchema = z.enum([\r\n 'steering', 'hook', 'mcp', 'skill', 'agent',\r\n 'command', 'workflow', 'statusline', 'metadata',\r\n 'settings', 'env', 'spec', 'docs', 'doc', 'config', 'other',\r\n]);\r\n\r\nconst PresetNameSchema = z.enum([\r\n 'frontend', 'backend', 'fullstack', 'mobile', 'devops', 'data-ai',\r\n]);\r\n\r\nconst FileEntrySchema = z.object({\r\n source: z.string().min(1),\r\n target: z.string().min(1),\r\n type: ArtifactTypeSchema,\r\n executable: z.boolean().optional(),\r\n});\r\n\r\nconst MCPServerDefSchema = z.object({\r\n command: z.string().min(1),\r\n args: z.array(z.string()).optional(),\r\n env: z.record(z.string()).optional(),\r\n});\r\n\r\nconst HookEntrySchema = z.union([\r\n z.object({\r\n matcher: z.string().optional(),\r\n command: z.string().min(1),\r\n }),\r\n z.string().min(1),\r\n]);\r\n\r\nconst ManifestSchema = z.object({\r\n name: z.string().min(1),\r\n version: z.string().min(1),\r\n description: z.string().min(1),\r\n category: PresetNameSchema,\r\n files: z.array(FileEntrySchema).min(1),\r\n dependencies: z.array(PresetNameSchema).optional(),\r\n mcpServers: z.record(MCPServerDefSchema).optional(),\r\n hooks: z.object({\r\n PreToolUse: z.array(HookEntrySchema).optional(),\r\n PostToolUse: z.array(HookEntrySchema).optional(),\r\n agentStop: z.array(HookEntrySchema).optional(),\r\n fileEdited: z.array(HookEntrySchema).optional(),\r\n }).optional(),\r\n tags: z.array(z.string()).optional(),\r\n minCounts: z.object({\r\n agents: z.number().int().nonnegative().optional(),\r\n skills: z.number().int().nonnegative().optional(),\r\n commands: z.number().int().nonnegative().optional(),\r\n hooks: z.number().int().nonnegative().optional(),\r\n workflows: z.number().int().nonnegative().optional(),\r\n }).optional(),\r\n});\r\n\r\nexport type Manifest = z.infer<typeof ManifestSchema>;\r\nexport type FileEntry = z.infer<typeof FileEntrySchema>;\r\nexport type ArtifactType = z.infer<typeof ArtifactTypeSchema>;\r\n\r\nexport interface ManifestError {\r\n code: string;\r\n message: string;\r\n}\r\n\r\nexport type Result<T, E> =\r\n | { ok: true; value: T }\r\n | { ok: false; error: E };\r\n\r\n/**\r\n * Parse raw JSON string into a validated Manifest.\r\n */\r\nexport function parse(json: string): Result<Manifest, ManifestError> {\r\n let raw: unknown;\r\n try {\r\n raw = JSON.parse(json);\r\n } catch {\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_INVALID,\r\n message: 'Manifest is not valid JSON.',\r\n },\r\n };\r\n }\r\n\r\n const result = ManifestSchema.safeParse(raw);\r\n if (!result.success) {\r\n const issues = result.error.issues\r\n .map((i) => `${i.path.join('.')}: ${i.message}`)\r\n .join('; ');\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_MISSING_FIELD,\r\n message: `Manifest schema validation failed: ${issues}`,\r\n },\r\n };\r\n }\r\n\r\n return { ok: true, value: result.data };\r\n}\r\n\r\n/**\r\n * Pretty-print a Manifest object as JSON (2-space indent).\r\n */\r\nexport function print(m: Manifest): string {\r\n return JSON.stringify(m, null, 2);\r\n}\r\n\r\n/**\r\n * Validate a parsed Manifest against its preset directory on disk.\r\n * Checks:\r\n * 1. File completeness: every file in manifest.files exists at presetDir/source\r\n * 2. No-orphan: every file in presetDir (except manifest.json, README.md) is declared in manifest.files\r\n */\r\nexport function validate(m: Manifest, presetDir: string): Result<void, ManifestError[]> {\r\n const errors: ManifestError[] = [];\r\n\r\n // 1. File completeness check\r\n for (const entry of m.files) {\r\n const fullPath = path.join(presetDir, entry.source);\r\n if (!fs.existsSync(fullPath)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_INCOMPLETE,\r\n message: `File declared in manifest not found on disk: ${entry.source}`,\r\n });\r\n }\r\n }\r\n\r\n // 2. No-orphan check\r\n const declaredSources = new Set(m.files.map((f) => f.source));\r\n const ignoredFiles = new Set(['manifest.json', 'README.md']);\r\n\r\n const walkDir = (dir: string, prefix: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n for (const entry of entries) {\r\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkDir(path.join(dir, entry.name), rel);\r\n } else if (entry.isFile()) {\r\n if (!ignoredFiles.has(rel) && !declaredSources.has(rel)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_ORPHAN_FILE,\r\n message: `File on disk not declared in manifest (orphan): ${rel}`,\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n walkDir(presetDir, '');\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, error: errors };\r\n }\r\n return { ok: true, value: undefined };\r\n}\r\n","/**\r\n * Structured error class for kiro-kit CLI.\r\n * Each error carries a unique code (KK001-KK091), a human-readable message,\r\n * and an optional suggestion for resolution.\r\n */\r\nexport class KKError extends Error {\r\n readonly code: string;\r\n readonly suggestion?: string;\r\n\r\n constructor(code: string, message: string, suggestion?: string) {\r\n super(message);\r\n this.name = 'KKError';\r\n this.code = code;\r\n this.suggestion = suggestion;\r\n Object.setPrototypeOf(this, KKError.prototype);\r\n }\r\n\r\n format(): string {\r\n let output = `[${this.code}] ${this.message}`;\r\n if (this.suggestion) {\r\n output += `\\n Suggestion: ${this.suggestion}`;\r\n }\r\n return output;\r\n }\r\n}\r\n\r\n// Common error codes\r\nexport const ErrorCodes = {\r\n NODE_VERSION: 'KK001',\r\n MANIFEST_INVALID: 'KK010',\r\n MANIFEST_MISSING_FIELD: 'KK011',\r\n MANIFEST_ORPHAN_FILE: 'KK012',\r\n MANIFEST_INCOMPLETE: 'KK013',\r\n PRESET_NOT_FOUND: 'KK020',\r\n PRESET_LOAD_FAILED: 'KK021',\r\n CONFLICT_UNRESOLVED: 'KK030',\r\n TRACKING_CORRUPT: 'KK040',\r\n TRACKING_WRITE_FAILED: 'KK041',\r\n BACKUP_NOT_FOUND: 'KK050',\r\n BACKUP_WRITE_FAILED: 'KK051',\r\n MCP_MERGE_CONFLICT: 'KK060',\r\n MCP_INVALID_JSON: 'KK061',\r\n SETTINGS_MERGE_WARN: 'KK070',\r\n FRONTMATTER_INVALID: 'KK080',\r\n FRONTMATTER_MISSING: 'KK081',\r\n DOCTOR_FAIL: 'KK090',\r\n DOCTOR_WARN: 'KK091',\r\n} as const;\r\n","import fs from 'node:fs';\r\nimport crypto from 'node:crypto';\r\n\r\nexport type ConflictAction =\r\n | 'WRITE_NEW'\r\n | 'OVERWRITE_WITH_BACKUP'\r\n | 'SKIP'\r\n | 'NO_OP';\r\n\r\nexport type ConflictMode = 'interactive' | 'force' | 'skip-existing';\r\n\r\nexport interface SessionState {\r\n overwriteAll: boolean;\r\n}\r\n\r\nexport interface ConflictPromptFn {\r\n (target: string): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'>;\r\n}\r\n\r\nexport interface DiffViewerFn {\r\n (target: string, sourceContent: Buffer): void;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Resolve file conflict based on mode and session state.\r\n */\r\nexport async function resolve(opts: {\r\n target: string;\r\n sourceContent: Buffer;\r\n mode: ConflictMode;\r\n sessionState: SessionState;\r\n prompt?: ConflictPromptFn;\r\n showDiff?: DiffViewerFn;\r\n}): Promise<ConflictAction> {\r\n const { target, sourceContent, mode, sessionState, prompt, showDiff } = opts;\r\n\r\n // File doesn't exist yet - write new\r\n if (!fs.existsSync(target)) {\r\n return 'WRITE_NEW';\r\n }\r\n\r\n // Compare hashes\r\n const currentContent = fs.readFileSync(target);\r\n const currentHash = sha256(currentContent);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Byte-equal - no operation needed\r\n if (currentHash === newHash) {\r\n return 'NO_OP';\r\n }\r\n\r\n // Force mode - always overwrite with backup\r\n if (mode === 'force') {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Skip-existing mode - never overwrite\r\n if (mode === 'skip-existing') {\r\n return 'SKIP';\r\n }\r\n\r\n // Session overwrite-all already set\r\n if (sessionState.overwriteAll) {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Interactive mode - prompt user\r\n if (!prompt) {\r\n // No prompt function provided, default to skip\r\n return 'SKIP';\r\n }\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const choice = await prompt(target);\r\n\r\n switch (choice) {\r\n case 'view-diff':\r\n if (showDiff) {\r\n showDiff(target, sourceContent);\r\n }\r\n continue;\r\n case 'overwrite':\r\n return 'OVERWRITE_WITH_BACKUP';\r\n case 'skip':\r\n return 'SKIP';\r\n case 'overwrite-all':\r\n sessionState.overwriteAll = true;\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst BACKUP_DIR = '.kiro/.backup';\r\n\r\n/**\r\n * Generate timestamp string: YYYYMMDD-HHmmss-mmm\r\n */\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\n/**\r\n * Backup a file to .kiro/.backup/<timestamp>/<relative-path>\r\n */\r\nexport function backup(\r\n workspaceRoot: string,\r\n target: string,\r\n timestamp?: string,\r\n): string {\r\n const ts = timestamp ?? generateTimestamp();\r\n const relPath = path.relative(workspaceRoot, target);\r\n const backupPath = path.join(workspaceRoot, BACKUP_DIR, ts, relPath);\r\n const backupDir = path.dirname(backupPath);\r\n\r\n fs.mkdirSync(backupDir, { recursive: true });\r\n fs.copyFileSync(target, backupPath);\r\n\r\n return ts;\r\n}\r\n\r\n/**\r\n * Restore files from a backup timestamp.\r\n * If no timestamp given, uses the most recent backup.\r\n * Returns list of restored file paths.\r\n */\r\nexport function restore(\r\n workspaceRoot: string,\r\n timestamp?: string,\r\n): string[] {\r\n const ts = timestamp ?? getLatestTimestamp(workspaceRoot);\r\n\r\n if (!ts) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n 'No backup found.',\r\n 'Run kiro-kit init or add first to create backups.',\r\n );\r\n }\r\n\r\n const backupRoot = path.join(workspaceRoot, BACKUP_DIR, ts);\r\n if (!fs.existsSync(backupRoot)) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n `Backup timestamp \"${ts}\" not found.`,\r\n `Available: ${listTimestamps(workspaceRoot).join(', ') || 'none'}`,\r\n );\r\n }\r\n\r\n const restored: string[] = [];\r\n\r\n const walkAndRestore = (dir: string, relPrefix: string): void => {\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkAndRestore(fullPath, rel);\r\n } else if (entry.isFile()) {\r\n const targetPath = path.join(workspaceRoot, rel);\r\n const targetDir = path.dirname(targetPath);\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n fs.copyFileSync(fullPath, targetPath);\r\n restored.push(rel);\r\n }\r\n }\r\n };\r\n\r\n walkAndRestore(backupRoot, '');\r\n return restored;\r\n}\r\n\r\n/**\r\n * List all backup timestamps sorted newest first.\r\n */\r\nexport function listTimestamps(workspaceRoot: string): string[] {\r\n const backupBase = path.join(workspaceRoot, BACKUP_DIR);\r\n if (!fs.existsSync(backupBase)) return [];\r\n\r\n try {\r\n return fs\r\n .readdirSync(backupBase, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .map((d) => d.name)\r\n .sort()\r\n .reverse();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nfunction getLatestTimestamp(workspaceRoot: string): string | undefined {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n return timestamps[0];\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\nimport { logger } from '../utils/logger.js';\r\n\r\nconst TRACKING_FILE = '.kiro/.kiro-kit.json';\r\n\r\nexport interface TrackedFile {\r\n target: string;\r\n sourcePreset: string;\r\n contentHash: string;\r\n installedAt: string;\r\n}\r\n\r\nexport interface TrackedPreset {\r\n name: string;\r\n version: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n files: TrackedFile[];\r\n}\r\n\r\nexport interface TrackingData {\r\n kitVersion: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n presets: TrackedPreset[];\r\n}\r\n\r\nfunction getTrackingPath(workspaceRoot: string): string {\r\n return path.join(workspaceRoot, TRACKING_FILE);\r\n}\r\n\r\n/**\r\n * Read tracking data from .kiro/.kiro-kit.json.\r\n * Returns null if file doesn't exist.\r\n * Throws KK040 if file is corrupt.\r\n */\r\nexport function read(workspaceRoot: string): TrackingData | null {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return null;\r\n }\r\n\r\n const raw = fs.readFileSync(filePath, 'utf-8');\r\n try {\r\n return JSON.parse(raw) as TrackingData;\r\n } catch {\r\n logger.warn(`Tracking file is corrupt: ${filePath}`);\r\n throw new KKError(\r\n ErrorCodes.TRACKING_CORRUPT,\r\n 'Tracking file .kiro/.kiro-kit.json is corrupt (invalid JSON).',\r\n 'Delete the file and re-run kiro-kit init to regenerate.',\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Write tracking data to .kiro/.kiro-kit.json.\r\n * Creates directory if needed.\r\n */\r\nexport function write(workspaceRoot: string, data: TrackingData): void {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Add or update a preset in tracking data.\r\n */\r\nexport function upsertPreset(\r\n data: TrackingData,\r\n preset: TrackedPreset,\r\n): TrackingData {\r\n const existing = data.presets.findIndex((p) => p.name === preset.name);\r\n if (existing >= 0) {\r\n data.presets[existing] = preset;\r\n } else {\r\n data.presets.push(preset);\r\n }\r\n data.updatedAt = new Date().toISOString();\r\n return data;\r\n}\r\n\r\n/**\r\n * Create initial tracking data.\r\n */\r\nexport function createInitial(kitVersion: string): TrackingData {\r\n return {\r\n kitVersion,\r\n installedAt: new Date().toISOString(),\r\n presets: [],\r\n };\r\n}\r\n\r\n/**\r\n * Get a preset from tracking data by name.\r\n */\r\nexport function getPreset(\r\n data: TrackingData,\r\n name: string,\r\n): TrackedPreset | undefined {\r\n return data.presets.find((p) => p.name === name);\r\n}\r\n","import process from 'node:process';\r\nimport { color } from './color.js';\r\n\r\nlet verboseEnabled = false;\r\nlet quietEnabled = false;\r\n\r\nexport function setVerbose(enabled: boolean): void {\r\n verboseEnabled = enabled;\r\n}\r\n\r\nexport function setQuiet(enabled: boolean): void {\r\n quietEnabled = enabled;\r\n}\r\n\r\nexport const logger = {\r\n info(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${msg}\\n`);\r\n }\r\n },\r\n\r\n success(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${color.green(msg)}\\n`);\r\n }\r\n },\r\n\r\n warn(msg: string): void {\r\n process.stderr.write(`${color.yellow('WARN')} ${msg}\\n`);\r\n },\r\n\r\n error(msg: string): void {\r\n process.stderr.write(`${color.red('ERROR')} ${msg}\\n`);\r\n },\r\n\r\n debug(msg: string): void {\r\n if (verboseEnabled) {\r\n process.stderr.write(`${color.dim('[debug]')} ${msg}\\n`);\r\n }\r\n },\r\n};\r\n","import pc from 'picocolors';\r\nimport process from 'node:process';\r\n\r\nconst isColorDisabled =\r\n !!process.env['NO_COLOR'] ||\r\n process.argv.includes('--no-color') ||\r\n !process.stdout.isTTY;\r\n\r\nfunction wrap(fn: (s: string) => string): (s: string) => string {\r\n return (s: string) => (isColorDisabled ? s : fn(s));\r\n}\r\n\r\nexport const color = {\r\n green: wrap(pc.green),\r\n red: wrap(pc.red),\r\n yellow: wrap(pc.yellow),\r\n blue: wrap(pc.blue),\r\n cyan: wrap(pc.cyan),\r\n gray: wrap(pc.gray),\r\n bold: wrap(pc.bold),\r\n dim: wrap(pc.dim),\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\nconst METADATA_FILE = '.kiro/metadata.json';\r\n\r\nexport interface PresetMeta {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface Metadata {\r\n version: string;\r\n name: string;\r\n description: string;\r\n buildDate: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n installedAt: string;\r\n kitVersion: string;\r\n}\r\n\r\n/**\r\n * Compose metadata from installed presets and kit info.\r\n */\r\nexport function compose(opts: {\r\n kitVersion: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n}): Metadata {\r\n return {\r\n version: '1.0.0',\r\n name: 'kiro-kit',\r\n description: 'Kiro IDE workspace bootstrapped by kiro-kit.',\r\n buildDate: new Date().toISOString(),\r\n repository: opts.repository,\r\n presets: opts.presets,\r\n installedAt: new Date().toISOString(),\r\n kitVersion: opts.kitVersion,\r\n };\r\n}\r\n\r\n/**\r\n * Write metadata.json to workspace.\r\n * When installing multiple presets, merges preset list.\r\n */\r\nexport function write(workspaceRoot: string, metadata: Metadata): void {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(metadata, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Read existing metadata, or return null if not present.\r\n */\r\nexport function read(workspaceRoot: string): Metadata | null {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n if (!fs.existsSync(filePath)) return null;\r\n try {\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as Metadata;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Merge new presets into existing metadata (dedup by name).\r\n */\r\nexport function mergePresets(existing: Metadata, newPresets: PresetMeta[]): Metadata {\r\n const merged = [...existing.presets];\r\n for (const p of newPresets) {\r\n const idx = merged.findIndex((m) => m.name === p.name);\r\n if (idx >= 0) {\r\n merged[idx] = p;\r\n } else {\r\n merged.push(p);\r\n }\r\n }\r\n return { ...existing, presets: merged, buildDate: new Date().toISOString() };\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nconst STATUSLINE_FILES = ['statusline.js', 'statusline.sh', 'statusline.ps1'];\r\n\r\n/**\r\n * Get the appropriate statusline command for the current platform.\r\n */\r\nexport function getCommand(): string {\r\n switch (process.platform) {\r\n case 'win32':\r\n return 'powershell -ExecutionPolicy Bypass -File .kiro/statusline.ps1';\r\n default:\r\n // macOS, Linux, etc.\r\n return 'node .kiro/statusline.js';\r\n }\r\n}\r\n\r\n/**\r\n * Install statusline triple (.js, .sh, .ps1) from preset to workspace.\r\n * Sets chmod +x on .sh for Unix platforms.\r\n */\r\nexport function install(\r\n presetDir: string,\r\n workspaceRoot: string,\r\n): string[] {\r\n const installed: string[] = [];\r\n const targetDir = path.join(workspaceRoot, '.kiro');\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n\r\n for (const file of STATUSLINE_FILES) {\r\n const source = path.join(presetDir, file);\r\n if (!fs.existsSync(source)) continue;\r\n\r\n const target = path.join(targetDir, file);\r\n fs.copyFileSync(source, target);\r\n installed.push(`.kiro/${file}`);\r\n\r\n // Set executable bit on Unix for .sh\r\n if (file.endsWith('.sh') && process.platform !== 'win32') {\r\n try {\r\n fs.chmodSync(target, 0o755);\r\n } catch {\r\n // Non-critical: skip if chmod fails\r\n }\r\n }\r\n }\r\n\r\n return installed;\r\n}\r\n\r\n/**\r\n * Resolve the statusLine.command field in settings based on platform.\r\n */\r\nexport function resolveSettingsCommand(settings: Record<string, unknown>): Record<string, unknown> {\r\n const statusLine = settings['statusLine'] as Record<string, unknown> | undefined;\r\n if (statusLine && statusLine['type'] === 'command') {\r\n statusLine['command'] = getCommand();\r\n }\r\n return settings;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface MCPConfig {\r\n mcpServers: Record<string, MCPServerEntry>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface MCPServerEntry {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n disabled?: boolean;\r\n autoApprove?: string[];\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset MCP servers into existing MCP config.\r\n * User-priority: existing servers are never overwritten or deleted.\r\n * Warns on cross-preset conflicts (same server name from different presets).\r\n */\r\nexport function mergeMCP(\r\n existing: MCPConfig | null,\r\n presetServers: Record<string, MCPServerEntry>,\r\n presetName?: string,\r\n): MCPConfig {\r\n const result: MCPConfig = existing\r\n ? structuredClone(existing)\r\n : { mcpServers: {} };\r\n\r\n if (!result.mcpServers) {\r\n result.mcpServers = {};\r\n }\r\n\r\n for (const [serverName, def] of Object.entries(presetServers)) {\r\n if (serverName in result.mcpServers) {\r\n logger.warn(\r\n `MCP server \"${serverName}\" already exists, keeping user definition.` +\r\n (presetName ? ` (from preset: ${presetName})` : ''),\r\n );\r\n continue;\r\n }\r\n result.mcpServers[serverName] = structuredClone(def);\r\n }\r\n\r\n return result;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface HookRef {\r\n command: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface SettingsConfig {\r\n statusLine?: { type?: string; command?: string; [key: string]: unknown };\r\n hooks?: {\r\n PreToolUse?: HookRef[];\r\n PostToolUse?: HookRef[];\r\n agentStop?: HookRef[];\r\n [key: string]: unknown;\r\n };\r\n includeCoAuthoredBy?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset settings into existing settings.\r\n * - Array fields (hooks.PreToolUse, hooks.PostToolUse, etc.): concat-dedupe by `command`\r\n * - Non-array fields: last-write-wins with warning\r\n * - Preserves user-added fields not in preset\r\n */\r\nexport function mergeSettings(\r\n existing: SettingsConfig | null,\r\n preset: SettingsConfig,\r\n): SettingsConfig {\r\n const result: SettingsConfig = existing\r\n ? structuredClone(existing)\r\n : {};\r\n\r\n // Merge hooks arrays with dedup by command\r\n if (preset.hooks) {\r\n if (!result.hooks) result.hooks = {};\r\n\r\n for (const key of ['PreToolUse', 'PostToolUse', 'agentStop'] as const) {\r\n const presetArr = preset.hooks[key];\r\n if (!presetArr || presetArr.length === 0) continue;\r\n\r\n const existingArr: HookRef[] = (result.hooks[key] as HookRef[]) ?? [];\r\n const existingCommands = new Set(existingArr.map((h) => h.command));\r\n\r\n for (const hook of presetArr) {\r\n if (!existingCommands.has(hook.command)) {\r\n existingArr.push(structuredClone(hook));\r\n }\r\n }\r\n (result.hooks as Record<string, unknown>)[key] = existingArr;\r\n }\r\n }\r\n\r\n // Merge non-array scalar fields with last-write-wins + warning\r\n if (preset.statusLine !== undefined) {\r\n if (result.statusLine !== undefined) {\r\n logger.warn('statusLine already set in settings, overwriting with preset value.');\r\n }\r\n result.statusLine = structuredClone(preset.statusLine);\r\n }\r\n\r\n if (preset.includeCoAuthoredBy !== undefined) {\r\n if (result.includeCoAuthoredBy !== undefined && result.includeCoAuthoredBy !== preset.includeCoAuthoredBy) {\r\n logger.warn('includeCoAuthoredBy already set, overwriting with preset value.');\r\n }\r\n result.includeCoAuthoredBy = preset.includeCoAuthoredBy;\r\n }\r\n\r\n return result;\r\n}\r\n","import fs from 'node:fs';\r\nimport { createTwoFilesPatch } from 'diff';\r\nimport { color } from '../utils/color.js';\r\n\r\n/**\r\n * Print a unified diff between the existing file on disk and new source content.\r\n * Highlights additions in green and deletions in red (NO_COLOR aware).\r\n */\r\nexport function showDiff(target: string, sourceContent: Buffer): void {\r\n const existing = fs.existsSync(target)\r\n ? fs.readFileSync(target, 'utf-8')\r\n : '';\r\n const incoming = sourceContent.toString('utf-8');\r\n\r\n const patch = createTwoFilesPatch(\r\n `a/${target}`,\r\n `b/${target}`,\r\n existing,\r\n incoming,\r\n 'current',\r\n 'incoming',\r\n { context: 3 },\r\n );\r\n\r\n const lines = patch.split('\\n');\r\n for (const line of lines) {\r\n if (line.startsWith('+') && !line.startsWith('+++')) {\r\n process.stdout.write(color.green(line) + '\\n');\r\n } else if (line.startsWith('-') && !line.startsWith('---')) {\r\n process.stdout.write(color.red(line) + '\\n');\r\n } else if (line.startsWith('@@')) {\r\n process.stdout.write(color.cyan(line) + '\\n');\r\n } else {\r\n process.stdout.write(line + '\\n');\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport crypto from 'node:crypto';\r\nimport os from 'node:os';\r\n\r\n/** Extensions that should always use LF line endings. */\r\nconst LF_EXTENSIONS = new Set(['.json', '.yaml', '.yml']);\r\n\r\n/**\r\n * Determine the appropriate line ending for a file based on extension.\r\n * - .json, .yaml, .yml -> LF\r\n * - Everything else -> OS default (CRLF on Windows, LF elsewhere)\r\n */\r\nfunction getLineEnding(filePath: string): string {\r\n const ext = path.extname(filePath).toLowerCase();\r\n if (LF_EXTENSIONS.has(ext)) return '\\n';\r\n return os.EOL;\r\n}\r\n\r\n/**\r\n * Normalize line endings in content based on target file extension.\r\n */\r\nfunction normalizeLineEndings(content: string, filePath: string): string {\r\n const eol = getLineEnding(filePath);\r\n // First normalize all to LF, then convert to target\r\n const normalized = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n if (eol === '\\n') return normalized;\r\n return normalized.replace(/\\n/g, eol);\r\n}\r\n\r\n/**\r\n * Atomic write: writes to a temp file in the same directory, then renames.\r\n * This ensures the target file is never in a partial state.\r\n * Also normalizes line endings based on file extension.\r\n */\r\nexport function atomicWrite(target: string, content: string | Buffer): void {\r\n const dir = path.dirname(target);\r\n fs.mkdirSync(dir, { recursive: true });\r\n\r\n const rand = crypto.randomBytes(6).toString('hex');\r\n const tmpPath = path.join(dir, `.tmp.${rand}`);\r\n\r\n let data: Buffer;\r\n if (typeof content === 'string') {\r\n const normalized = normalizeLineEndings(content, target);\r\n data = Buffer.from(normalized, 'utf-8');\r\n } else {\r\n data = content;\r\n }\r\n\r\n try {\r\n fs.writeFileSync(tmpPath, data);\r\n fs.renameSync(tmpPath, target);\r\n } catch (err) {\r\n // Clean up temp file on failure\r\n try {\r\n fs.unlinkSync(tmpPath);\r\n } catch {\r\n // ignore cleanup errors\r\n }\r\n throw err;\r\n }\r\n}\r\n","import path from 'node:path';\r\n\r\n/**\r\n * Normalize a path to use forward slashes (for consistent cross-platform display).\r\n */\r\nexport function normalize(p: string): string {\r\n return p.split(path.sep).join('/');\r\n}\r\n\r\n/**\r\n * Get relative path from workspace root, normalized with forward slashes.\r\n */\r\nexport function relativeFromWorkspace(workspaceRoot: string, target: string): string {\r\n return normalize(path.relative(workspaceRoot, target));\r\n}\r\n\r\n/**\r\n * Check that a resolved path is safely inside the workspace root.\r\n * Prevents path traversal attacks (e.g., ../../etc/passwd).\r\n */\r\nexport function safePathInside(workspaceRoot: string, target: string): boolean {\r\n const resolved = path.resolve(workspaceRoot, target);\r\n const root = path.resolve(workspaceRoot);\r\n return resolved.startsWith(root + path.sep) || resolved === root;\r\n}\r\n\r\n/**\r\n * Join paths using OS-native separator.\r\n */\r\nexport function join(...segments: string[]): string {\r\n return path.join(...segments);\r\n}\r\n\r\n/**\r\n * Resolve to absolute path.\r\n */\r\nexport function resolve(...segments: string[]): string {\r\n return path.resolve(...segments);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface AddOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerAddCommand(program: Command): void {\r\n program\r\n .command('add <preset>')\r\n .description('Add a preset to existing workspace')\r\n .option('-y, --yes', 'Skip confirmation')\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (presetName: string, opts: AddOptions) => {\r\n try {\r\n await runAdd(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runAdd(presetName: string, opts: AddOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // Validate preset name\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Auto-init: create .kiro/ if it doesn't exist\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (!fs.existsSync(kiroDir)) {\r\n fs.mkdirSync(kiroDir, { recursive: true });\r\n logger.info('Created .kiro/ directory.');\r\n }\r\n\r\n // Load preset\r\n const preset = load(presetName);\r\n\r\n // Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch { existingMcp = null; }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as SettingsConfig;\r\n } catch { existingSettings = null; }\r\n }\r\n const presetSettings = JSON.parse(fs.readFileSync(presetSettingsPath, 'utf-8')) as SettingsConfig;\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Write metadata\r\n const kitVersion = getKitVersion();\r\n const presetMeta = { name: manifest.name, version: manifest.version };\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, [presetMeta])\r\n : MetadataWriter.compose({ kitVersion, repository: 'https://github.com/ihatesea69/kiro-kit.git', presets: [presetMeta] });\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: allTrackedFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // Summary\r\n logger.success(`Done! ${filesWritten} files written, ${filesSkipped} skipped.`);\r\n logger.info(`Preset added: ${presetName}`);\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface ListOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetSummary {\r\n name: string;\r\n description: string;\r\n agents: number;\r\n skills: number;\r\n commands: number;\r\n hooks: number;\r\n workflows: number;\r\n mcp: number;\r\n}\r\n\r\nfunction countArtifacts(files: Array<{ type: string }>): Record<string, number> {\r\n const counts: Record<string, number> = {\r\n agent: 0,\r\n skill: 0,\r\n command: 0,\r\n hook: 0,\r\n workflow: 0,\r\n mcp: 0,\r\n };\r\n for (const f of files) {\r\n if (f.type in counts) {\r\n counts[f.type]++;\r\n }\r\n }\r\n return counts;\r\n}\r\n\r\nexport function registerListCommand(program: Command): void {\r\n program\r\n .command('list')\r\n .description('List available presets')\r\n .option('--json', 'Output as JSON')\r\n .action((opts: ListOptions) => {\r\n try {\r\n runList(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runList(opts: ListOptions): void {\r\n const available = listAvailable();\r\n const summaries: PresetSummary[] = [];\r\n\r\n for (const name of available) {\r\n try {\r\n const preset = load(name);\r\n const counts = countArtifacts(preset.manifest.files);\r\n summaries.push({\r\n name,\r\n description: preset.manifest.description,\r\n agents: counts['agent'],\r\n skills: counts['skill'],\r\n commands: counts['command'],\r\n hooks: counts['hook'],\r\n workflows: counts['workflow'],\r\n mcp: Object.keys(preset.manifest.mcpServers ?? {}).length,\r\n });\r\n } catch {\r\n summaries.push({\r\n name,\r\n description: '(failed to load)',\r\n agents: 0,\r\n skills: 0,\r\n commands: 0,\r\n hooks: 0,\r\n workflows: 0,\r\n mcp: 0,\r\n });\r\n }\r\n }\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(summaries, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n for (const s of summaries) {\r\n const nameStr = color.bold(s.name.padEnd(12));\r\n const descStr = color.dim(`- ${s.description}`);\r\n process.stdout.write(` ${nameStr} ${descStr}\\n`);\r\n const counts = `${s.agents} agents, ${s.skills} skills, ${s.commands} commands, ${s.hooks} hooks, ${s.workflows} workflows, ${s.mcp} MCP servers`;\r\n process.stdout.write(`${''.padEnd(14)} ${color.gray(counts)}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface InfoOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetInfo {\r\n name: string;\r\n version: string;\r\n description: string;\r\n category: string;\r\n files: Array<{ source: string; target: string; type: string }>;\r\n mcpServers: string[];\r\n hooks: string[];\r\n agents: string[];\r\n skills: string[];\r\n commands: string[];\r\n workflows: string[];\r\n}\r\n\r\nexport function registerInfoCommand(program: Command): void {\r\n program\r\n .command('info <preset>')\r\n .description('Show detailed preset information')\r\n .option('--json', 'Output as JSON')\r\n .action((presetName: string, opts: InfoOptions) => {\r\n try {\r\n runInfo(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runInfo(presetName: string, opts: InfoOptions): void {\r\n const available = listAvailable();\r\n\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const preset = load(presetName);\r\n const { manifest } = preset;\r\n\r\n const agents = manifest.files.filter((f) => f.type === 'agent').map((f) => f.source);\r\n const skills = manifest.files.filter((f) => f.type === 'skill').map((f) => f.source);\r\n const commands = manifest.files.filter((f) => f.type === 'command').map((f) => f.source);\r\n const workflows = manifest.files.filter((f) => f.type === 'workflow').map((f) => f.source);\r\n const hooks = manifest.files.filter((f) => f.type === 'hook').map((f) => f.source);\r\n const mcpServers = Object.keys(manifest.mcpServers ?? {});\r\n\r\n const info: PresetInfo = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n description: manifest.description,\r\n category: manifest.category,\r\n files: manifest.files.map((f) => ({ source: f.source, target: f.target, type: f.type })),\r\n mcpServers,\r\n hooks,\r\n agents,\r\n skills,\r\n commands,\r\n workflows,\r\n };\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(info, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n process.stdout.write(`\\n${color.bold(manifest.name)} v${manifest.version}\\n`);\r\n process.stdout.write(`${manifest.description}\\n\\n`);\r\n process.stdout.write(`${color.dim('Category:')} ${manifest.category}\\n`);\r\n process.stdout.write(`${color.dim('Total files:')} ${manifest.files.length}\\n\\n`);\r\n\r\n if (mcpServers.length > 0) {\r\n process.stdout.write(`${color.bold('MCP Servers')} (${mcpServers.length}):\\n`);\r\n for (const s of mcpServers) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (agents.length > 0) {\r\n process.stdout.write(`${color.bold('Agents')} (${agents.length}):\\n`);\r\n for (const a of agents) {\r\n process.stdout.write(` - ${a}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (skills.length > 0) {\r\n process.stdout.write(`${color.bold('Skills')} (${skills.length}):\\n`);\r\n for (const s of skills) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (commands.length > 0) {\r\n process.stdout.write(`${color.bold('Commands')} (${commands.length}):\\n`);\r\n for (const c of commands) {\r\n process.stdout.write(` - ${c}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (workflows.length > 0) {\r\n process.stdout.write(`${color.bold('Workflows')} (${workflows.length}):\\n`);\r\n for (const w of workflows) {\r\n process.stdout.write(` - ${w}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (hooks.length > 0) {\r\n process.stdout.write(`${color.bold('Hooks')} (${hooks.length}):\\n`);\r\n for (const h of hooks) {\r\n process.stdout.write(` - ${h}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n // File list with targets\r\n process.stdout.write(`${color.bold('File Targets')}:\\n`);\r\n for (const f of manifest.files) {\r\n process.stdout.write(` ${color.dim(f.type.padEnd(12))} ${f.target}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface UpdateOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} has changed in the new version.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace with new version (backup saved)\\n` +\r\n ` skip - Keep current file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace all remaining changed files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerUpdateCommand(program: Command): void {\r\n program\r\n .command('update')\r\n .description('Update installed presets to latest bundled version')\r\n .option('-y, --yes', 'Skip confirmation, auto-skip conflicts')\r\n .option('--force', 'Overwrite all changed files (with backup)')\r\n .option('--skip-existing', 'Skip all changed files')\r\n .action(async (opts: UpdateOptions) => {\r\n try {\r\n await runUpdate(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runUpdate(opts: UpdateOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n\r\n // Read tracking\r\n const tracking = TrackingStore.read(workspaceRoot);\r\n if (!tracking || tracking.presets.length === 0) {\r\n logger.info('No presets installed. Nothing to update.');\r\n process.exit(0);\r\n }\r\n\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n let totalUpdated = 0;\r\n let totalSkipped = 0;\r\n\r\n for (const trackedPreset of tracking.presets) {\r\n let bundled;\r\n try {\r\n bundled = load(trackedPreset.name);\r\n } catch {\r\n logger.warn(`Preset \"${trackedPreset.name}\" not found in bundled presets. Skipping.`);\r\n continue;\r\n }\r\n\r\n const bundledVersion = bundled.manifest.version;\r\n if (bundledVersion === trackedPreset.version) {\r\n logger.debug(`Preset \"${trackedPreset.name}\" is up to date (v${bundledVersion}).`);\r\n continue;\r\n }\r\n\r\n logger.info(\r\n `Updating ${color.bold(trackedPreset.name)}: v${trackedPreset.version} -> v${bundledVersion}`,\r\n );\r\n\r\n // Find changed files by comparing content hashes\r\n const presetDir = bundled.dir;\r\n const updatedFiles: TrackingStore.TrackedFile[] = [];\r\n\r\n for (const fileEntry of bundled.manifest.files) {\r\n if (['mcp', 'settings', 'statusline'].includes(fileEntry.type)) continue;\r\n\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) continue;\r\n if (!fs.existsSync(sourcePath)) continue;\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Check if file changed from what we installed\r\n const trackedFile = trackedPreset.files.find((f) => f.target === fileEntry.target);\r\n if (trackedFile && trackedFile.contentHash === newHash) {\r\n // Bundled file hasn't changed since last install\r\n continue;\r\n }\r\n\r\n // File has changed in the new version - resolve conflict\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'SKIP':\r\n totalSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n updatedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: bundled.manifest.name,\r\n contentHash: newHash,\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n // Bump version in tracking\r\n trackedPreset.version = bundledVersion;\r\n trackedPreset.updatedAt = new Date().toISOString();\r\n // Update file hashes for changed files\r\n for (const uf of updatedFiles) {\r\n const idx = trackedPreset.files.findIndex((f) => f.target === uf.target);\r\n if (idx >= 0) {\r\n trackedPreset.files[idx] = uf;\r\n } else {\r\n trackedPreset.files.push(uf);\r\n }\r\n }\r\n }\r\n\r\n // Write updated tracking\r\n tracking.kitVersion = getKitVersion();\r\n tracking.updatedAt = new Date().toISOString();\r\n TrackingStore.write(workspaceRoot, tracking);\r\n\r\n if (totalUpdated === 0 && totalSkipped === 0) {\r\n logger.success('All presets are up to date.');\r\n } else {\r\n logger.success(`Update complete: ${totalUpdated} files updated, ${totalSkipped} skipped.`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { restore, listTimestamps } from '../core/BackupManager.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface RestoreOptions {\r\n timestamp?: string;\r\n list?: boolean;\r\n}\r\n\r\nexport function registerRestoreCommand(program: Command): void {\r\n program\r\n .command('restore')\r\n .description('Restore files from backup')\r\n .option('--timestamp <ts>', 'Restore from specific backup timestamp')\r\n .option('--list', 'List available backup timestamps')\r\n .action((opts: RestoreOptions) => {\r\n try {\r\n runRestore(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runRestore(opts: RestoreOptions): void {\r\n const workspaceRoot = process.cwd();\r\n\r\n // --list flag: print available timestamps and exit\r\n if (opts.list) {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.info('No backups available.');\r\n process.exit(0);\r\n }\r\n process.stdout.write(`${color.bold('Available backups')}:\\n`);\r\n for (const ts of timestamps) {\r\n process.stdout.write(` ${ts}\\n`);\r\n }\r\n process.exit(0);\r\n }\r\n\r\n // Check if any backups exist\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.error('No backups found. Nothing to restore.');\r\n process.exit(1);\r\n }\r\n\r\n // Restore from specified timestamp or latest\r\n const restored = restore(workspaceRoot, opts.timestamp);\r\n\r\n if (restored.length === 0) {\r\n logger.info('No files to restore from backup.');\r\n process.exit(0);\r\n }\r\n\r\n process.stdout.write(`${color.bold('Restored files')}:\\n`);\r\n for (const file of restored) {\r\n process.stdout.write(` ${color.green('+')} ${file}\\n`);\r\n }\r\n logger.success(`Restored ${restored.length} files.`);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface DoctorOptions {\r\n fix?: boolean;\r\n}\r\n\r\ntype CheckResult = 'PASS' | 'FAIL' | 'WARN';\r\n\r\ninterface CheckReport {\r\n name: string;\r\n result: CheckResult;\r\n message: string;\r\n fixable?: boolean;\r\n fixAction?: () => void;\r\n}\r\n\r\nexport function registerDoctorCommand(program: Command): void {\r\n program\r\n .command('doctor')\r\n .description('Run workspace health checks')\r\n .option('--fix', 'Auto-fix fixable issues')\r\n .action((opts: DoctorOptions) => {\r\n try {\r\n runDoctor(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runDoctor(opts: DoctorOptions): void {\r\n const workspaceRoot = process.cwd();\r\n const checks: CheckReport[] = [];\r\n\r\n // (a) Node >= 18\r\n checks.push(checkNodeVersion());\r\n\r\n // (b) .kiro/ exists\r\n checks.push(checkKiroDir(workspaceRoot));\r\n\r\n // (c) mcp.json valid\r\n checks.push(checkMcpJson(workspaceRoot));\r\n\r\n // (d) tracking valid\r\n checks.push(checkTracking(workspaceRoot));\r\n\r\n // (e) tracked files exist\r\n checks.push(checkTrackedFiles(workspaceRoot));\r\n\r\n // (f) no trailing whitespace in steering front-matter\r\n checks.push(checkSteeringFrontMatter(workspaceRoot));\r\n\r\n // (g) metadata.json valid\r\n checks.push(checkMetadataJson(workspaceRoot));\r\n\r\n // (h) statusline exec bit (Unix)\r\n checks.push(checkStatuslineExecBit(workspaceRoot));\r\n\r\n // Print results\r\n let hasFail = false;\r\n for (const check of checks) {\r\n const tag = formatTag(check.result);\r\n process.stdout.write(`${tag} ${check.message}\\n`);\r\n\r\n if (check.result === 'FAIL') hasFail = true;\r\n\r\n // Apply fix if --fix and fixable\r\n if (opts.fix && check.fixable && check.fixAction) {\r\n check.fixAction();\r\n process.stdout.write(` ${color.green('Fixed!')}\\n`);\r\n }\r\n }\r\n\r\n process.exit(hasFail ? 1 : 0);\r\n}\r\n\r\nfunction formatTag(result: CheckResult): string {\r\n switch (result) {\r\n case 'PASS': return color.green('[PASS]');\r\n case 'FAIL': return color.red('[FAIL]');\r\n case 'WARN': return color.yellow('[WARN]');\r\n }\r\n}\r\n\r\nfunction checkNodeVersion(): CheckReport {\r\n const major = parseInt(process.versions.node.split('.')[0], 10);\r\n if (major >= 18) {\r\n return {\r\n name: 'node-version',\r\n result: 'PASS',\r\n message: `Node.js version >= 18 (${process.version})`,\r\n };\r\n }\r\n return {\r\n name: 'node-version',\r\n result: 'FAIL',\r\n message: `Node.js version >= 18 required (current: ${process.version})`,\r\n };\r\n}\r\n\r\nfunction checkKiroDir(workspaceRoot: string): CheckReport {\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (fs.existsSync(kiroDir) && fs.statSync(kiroDir).isDirectory()) {\r\n return { name: 'kiro-dir', result: 'PASS', message: '.kiro/ directory exists' };\r\n }\r\n return {\r\n name: 'kiro-dir',\r\n result: 'FAIL',\r\n message: '.kiro/ directory not found. Run `kiro-kit init` to create it.',\r\n };\r\n}\r\n\r\nfunction checkMcpJson(workspaceRoot: string): CheckReport {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n if (!fs.existsSync(mcpPath)) {\r\n return { name: 'mcp-json', result: 'WARN', message: '.kiro/settings/mcp.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(mcpPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'mcp-json', result: 'PASS', message: '.kiro/settings/mcp.json is valid JSON' };\r\n } catch {\r\n return {\r\n name: 'mcp-json',\r\n result: 'FAIL',\r\n message: '.kiro/settings/mcp.json is not valid JSON',\r\n fixable: true,\r\n fixAction: () => {\r\n const mcpPath2 = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n fs.writeFileSync(mcpPath2, '{\\n \"mcpServers\": {}\\n}\\n', 'utf-8');\r\n },\r\n };\r\n }\r\n}\r\n\r\nfunction checkTracking(workspaceRoot: string): CheckReport {\r\n const trackingPath = path.join(workspaceRoot, '.kiro/.kiro-kit.json');\r\n if (!fs.existsSync(trackingPath)) {\r\n return { name: 'tracking', result: 'WARN', message: '.kiro/.kiro-kit.json not found (no presets installed)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(trackingPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'tracking', result: 'PASS', message: '.kiro/.kiro-kit.json is valid' };\r\n } catch {\r\n return {\r\n name: 'tracking',\r\n result: 'FAIL',\r\n message: '.kiro/.kiro-kit.json is corrupt (invalid JSON)',\r\n };\r\n }\r\n}\r\n\r\nfunction checkTrackedFiles(workspaceRoot: string): CheckReport {\r\n let tracking: TrackingStore.TrackingData | null;\r\n try {\r\n tracking = TrackingStore.read(workspaceRoot);\r\n } catch {\r\n return { name: 'tracked-files', result: 'WARN', message: 'Cannot read tracking file, skipping file check' };\r\n }\r\n\r\n if (!tracking || tracking.presets.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'No tracked files to verify' };\r\n }\r\n\r\n const missing: string[] = [];\r\n for (const preset of tracking.presets) {\r\n for (const file of preset.files) {\r\n const fullPath = path.resolve(workspaceRoot, file.target);\r\n if (!fs.existsSync(fullPath)) {\r\n missing.push(file.target);\r\n }\r\n }\r\n }\r\n\r\n if (missing.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'All tracked files exist on disk' };\r\n }\r\n\r\n return {\r\n name: 'tracked-files',\r\n result: 'FAIL',\r\n message: `${missing.length} tracked file(s) missing: ${missing.slice(0, 3).join(', ')}${missing.length > 3 ? '...' : ''}`,\r\n };\r\n}\r\n\r\nfunction checkSteeringFrontMatter(workspaceRoot: string): CheckReport {\r\n const steeringDir = path.join(workspaceRoot, '.kiro/steering');\r\n if (!fs.existsSync(steeringDir)) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'No steering files to check' };\r\n }\r\n\r\n const issues: string[] = [];\r\n\r\n const walkDir = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkDir(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n checkSingleSteering(fullPath, issues);\r\n }\r\n }\r\n };\r\n\r\n walkDir(steeringDir);\r\n\r\n if (issues.length === 0) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'Steering front-matter has no trailing whitespace' };\r\n }\r\n\r\n return {\r\n name: 'steering-fm',\r\n result: 'WARN',\r\n message: `${issues.length} steering file(s) have trailing whitespace in front-matter`,\r\n fixable: true,\r\n fixAction: () => {\r\n fixSteeringWhitespace(steeringDir);\r\n },\r\n };\r\n}\r\n\r\nfunction checkSingleSteering(filePath: string, issues: string[]): void {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') return;\r\n\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) return;\r\n\r\n // Check for trailing whitespace in front-matter lines\r\n for (let i = 1; i < endIdx; i++) {\r\n if (lines[i] !== lines[i].trimEnd()) {\r\n issues.push(filePath);\r\n return;\r\n }\r\n }\r\n } catch { /* skip unreadable files */ }\r\n}\r\n\r\nfunction fixSteeringWhitespace(steeringDir: string): void {\r\n const walkAndFix = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkAndFix(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n const content = fs.readFileSync(fullPath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') continue;\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) continue;\r\n let changed = false;\r\n for (let i = 1; i < endIdx; i++) {\r\n const trimmed = lines[i].trimEnd();\r\n if (lines[i] !== trimmed) { lines[i] = trimmed; changed = true; }\r\n }\r\n if (changed) {\r\n fs.writeFileSync(fullPath, lines.join('\\n'), 'utf-8');\r\n }\r\n }\r\n }\r\n };\r\n walkAndFix(steeringDir);\r\n}\r\n\r\nfunction checkMetadataJson(workspaceRoot: string): CheckReport {\r\n const metaPath = path.join(workspaceRoot, '.kiro/metadata.json');\r\n if (!fs.existsSync(metaPath)) {\r\n return { name: 'metadata-json', result: 'WARN', message: '.kiro/metadata.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(metaPath, 'utf-8');\r\n const parsed = JSON.parse(content);\r\n if (!parsed.version || !parsed.name) {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json missing required fields (version, name)' };\r\n }\r\n return { name: 'metadata-json', result: 'PASS', message: '.kiro/metadata.json is valid' };\r\n } catch {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json is not valid JSON' };\r\n }\r\n}\r\n\r\nfunction checkStatuslineExecBit(workspaceRoot: string): CheckReport {\r\n // Only relevant on Unix\r\n if (process.platform === 'win32') {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'Statusline exec bit check (skipped on Windows)' };\r\n }\r\n\r\n const shPath = path.join(workspaceRoot, '.kiro/statusline.sh');\r\n if (!fs.existsSync(shPath)) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'No statusline.sh to check' };\r\n }\r\n\r\n try {\r\n const stat = fs.statSync(shPath);\r\n const isExecutable = (stat.mode & 0o111) !== 0;\r\n if (isExecutable) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'statusline.sh is executable' };\r\n }\r\n return {\r\n name: 'statusline-exec',\r\n result: 'WARN',\r\n message: 'statusline.sh is not executable',\r\n fixable: true,\r\n fixAction: () => {\r\n fs.chmodSync(shPath, 0o755);\r\n },\r\n };\r\n } catch {\r\n return { name: 'statusline-exec', result: 'WARN', message: 'Cannot check statusline.sh permissions' };\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport process from 'node:process';\r\n\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\nconst CONFIG_DIR = path.join(os.homedir(), '.kiro-kit');\r\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\r\n\r\ninterface TelemetryConfig {\r\n telemetry: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\nfunction readConfig(): TelemetryConfig {\r\n try {\r\n if (fs.existsSync(CONFIG_FILE)) {\r\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')) as TelemetryConfig;\r\n }\r\n } catch { /* ignore corrupt config */ }\r\n return { telemetry: false };\r\n}\r\n\r\nfunction writeConfig(config: TelemetryConfig): void {\r\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\r\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function registerTelemetryCommand(program: Command): void {\r\n const telemetry = program\r\n .command('telemetry')\r\n .description('Manage anonymous usage telemetry');\r\n\r\n telemetry\r\n .command('enable')\r\n .description('Opt in to anonymous telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = true;\r\n writeConfig(config);\r\n logger.success('Telemetry enabled. Anonymous usage data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('disable')\r\n .description('Opt out of telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = false;\r\n writeConfig(config);\r\n logger.success('Telemetry disabled. No data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('status')\r\n .description('Show current telemetry status')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n const status = config.telemetry ? color.green('enabled') : color.yellow('disabled');\r\n process.stdout.write(`Telemetry: ${status}\\n`);\r\n process.stdout.write(`Config: ${CONFIG_FILE}\\n`);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":["process","fs","path","process","crypto","fs","path","path","fs","fs","showDiff","fs","path","path","fs","fs","path","process","process","process","path","fs","fs","path","write","read","fs","path","process","fs","fs","fs","path","crypto","path","path","process","resolve","path","sha256","crypto","program","generateTimestamp","fs","read","write","pkg","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","read","write","process","program","process","process","program","process","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","process","program","process","timestamps","fs","path","process","program","process","major","path","fs","fs","path","os","process","path","os","fs","program","process","process","require"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/core/PresetLoader.ts","../src/core/ManifestParser.ts","../src/core/errors.ts","../src/core/ConflictResolver.ts","../src/core/BackupManager.ts","../src/core/TrackingStore.ts","../src/utils/logger.ts","../src/utils/color.ts","../src/core/MetadataWriter.ts","../src/core/StatuslineSelector.ts","../src/core/merge/mergeMCP.ts","../src/core/merge/mergeSettings.ts","../src/prompts/DiffViewer.ts","../src/utils/fs-safe.ts","../src/utils/paths.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/info.ts","../src/commands/update.ts","../src/commands/restore.ts","../src/commands/doctor.ts","../src/commands/telemetry.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { createRequire } from 'node:module';\r\nimport process from 'node:process';\r\nimport { Command } from 'commander';\r\nimport { registerInitCommand } from './commands/init.js';\r\nimport { registerAddCommand } from './commands/add.js';\r\nimport { registerListCommand } from './commands/list.js';\r\nimport { registerInfoCommand } from './commands/info.js';\r\nimport { registerUpdateCommand } from './commands/update.js';\r\nimport { registerRestoreCommand } from './commands/restore.js';\r\nimport { registerDoctorCommand } from './commands/doctor.js';\r\nimport { registerTelemetryCommand } from './commands/telemetry.js';\r\nimport { setVerbose, setQuiet } from './utils/logger.js';\r\n\r\n// Node version check\r\nconst major = parseInt(process.versions.node.split('.')[0], 10);\r\nif (major < 18) {\r\n process.stderr.write(\r\n '[KK001] kiro-kit requires Node.js >= 18. ' +\r\n `Current version: ${process.version}. ` +\r\n 'Please upgrade Node.js.\\n',\r\n );\r\n process.exit(1);\r\n}\r\n\r\nconst require = createRequire(import.meta.url);\r\nconst pkg = require('../package.json') as { version: string };\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('kiro-kit')\r\n .description('CLI tool for bootstrapping engineer-grade Kiro IDE workspaces.')\r\n .version(pkg.version, '-v, --version');\r\n\r\n// Global flags\r\nprogram.option('--verbose', 'Enable verbose output');\r\nprogram.option('--quiet', 'Suppress non-essential output');\r\nprogram.option('--no-color', 'Disable colored output');\r\n\r\n// Wire all commands\r\nregisterInitCommand(program);\r\nregisterAddCommand(program);\r\nregisterListCommand(program);\r\nregisterInfoCommand(program);\r\nregisterUpdateCommand(program);\r\nregisterRestoreCommand(program);\r\nregisterDoctorCommand(program);\r\nregisterTelemetryCommand(program);\r\n\r\n// Apply global flags before command execution\r\nprogram.hook('preAction', (thisCommand) => {\r\n const opts = thisCommand.opts();\r\n if (opts['verbose']) setVerbose(true);\r\n if (opts['quiet']) setQuiet(true);\r\n});\r\n\r\nprogram.parse(process.argv);\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport readline from 'node:readline';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, loadAll, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface InitOptions {\r\n yes?: boolean;\r\n preset?: string[];\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\n// Handle SIGINT at process level for exit 130\r\nfunction setupSigintHandler(): void {\r\n process.on('SIGINT', () => {\r\n process.exit(130);\r\n });\r\n}\r\n\r\n/**\r\n * Interactive multi-pick prompt using readline.\r\n * Space to toggle, 'a' to toggle all, Enter to confirm.\r\n */\r\nasync function multiPickPrompt(\r\n items: Array<{ name: string; description: string }>,\r\n): Promise<string[]> {\r\n const selected = new Set<number>();\r\n let cursor = 0;\r\n\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: false,\r\n });\r\n\r\n // Enable raw mode for keypress detection\r\n if (!process.stdin.isTTY) {\r\n // Non-interactive: return empty\r\n rl.close();\r\n return [];\r\n }\r\n\r\n return new Promise<string[]>((resolve, reject) => {\r\n let rendered = false;\r\n\r\n const render = (): void => {\r\n // Move cursor up to overwrite previous render\r\n if (rendered) {\r\n process.stdout.write(`\\x1B[${items.length + 1}A`);\r\n }\r\n rendered = true;\r\n // Clear line + write header\r\n process.stdout.write(\r\n '\\x1B[2K' +\r\n color.bold('? Select presets to install:') +\r\n color.dim(' (Space to select, <a> toggle all, Enter to confirm)') +\r\n '\\n',\r\n );\r\n for (let i = 0; i < items.length; i++) {\r\n const marker = cursor === i ? color.cyan('>') : ' ';\r\n const check = selected.has(i)\r\n ? color.green('[x]')\r\n : '[ ]';\r\n const name = color.bold(items[i].name.padEnd(12));\r\n const desc = color.dim(`- ${items[i].description}`);\r\n // Clear line before writing to prevent ghost text\r\n process.stdout.write(`\\x1B[2K ${marker} ${check} ${name} ${desc}\\n`);\r\n }\r\n };\r\n\r\n // Initial render (no need for blank lines — first render writes directly)\r\n render();\r\n\r\n process.stdin.setRawMode(true);\r\n process.stdin.resume();\r\n process.stdin.setEncoding('utf-8');\r\n\r\n let escBuffer = '';\r\n\r\n const onData = (key: string): void => {\r\n // Handle multi-byte escape sequences (arrow keys on Windows)\r\n if (escBuffer.length > 0) {\r\n escBuffer += key;\r\n if (escBuffer.length >= 3) {\r\n const seq = escBuffer;\r\n escBuffer = '';\r\n if (seq === '\\x1B[A' || seq === '\\x1BOA') {\r\n cursor = (cursor - 1 + items.length) % items.length;\r\n render();\r\n } else if (seq === '\\x1B[B' || seq === '\\x1BOB') {\r\n cursor = (cursor + 1) % items.length;\r\n render();\r\n }\r\n return;\r\n }\r\n return;\r\n }\r\n\r\n // Start of escape sequence\r\n if (key === '\\x1B') {\r\n escBuffer = key;\r\n return;\r\n }\r\n\r\n // Ctrl+C / SIGINT\r\n if (key === '\\x03') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n return;\r\n }\r\n\r\n // Enter\r\n if (key === '\\r' || key === '\\n') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.removeListener('data', onData);\r\n process.stdin.pause();\r\n rl.close();\r\n const result = [...selected].map((i) => items[i].name);\r\n resolve(result);\r\n return;\r\n }\r\n\r\n // Space - toggle current\r\n if (key === ' ') {\r\n if (selected.has(cursor)) {\r\n selected.delete(cursor);\r\n } else {\r\n selected.add(cursor);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // 'a' - toggle all\r\n if (key === 'a' || key === 'A') {\r\n if (selected.size === items.length) {\r\n selected.clear();\r\n } else {\r\n for (let i = 0; i < items.length; i++) selected.add(i);\r\n }\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow up / k\r\n if (key === 'k') {\r\n cursor = (cursor - 1 + items.length) % items.length;\r\n render();\r\n return;\r\n }\r\n\r\n // Arrow down / j\r\n if (key === 'j') {\r\n cursor = (cursor + 1) % items.length;\r\n render();\r\n return;\r\n }\r\n };\r\n\r\n process.stdin.on('data', onData);\r\n });\r\n}\r\n\r\n/**\r\n * Confirmation prompt: \"About to write X files. Continue? (Y/n)\"\r\n */\r\nasync function confirmPrompt(message: string): Promise<boolean> {\r\n if (!process.stdin.isTTY) return true;\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(`${color.bold('?')} ${message} `, (answer) => {\r\n rl.close();\r\n const normalized = answer.trim().toLowerCase();\r\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Interactive 4-option conflict prompt.\r\n */\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve, reject) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip'); // default to skip on unrecognized input\r\n });\r\n\r\n rl.on('SIGINT', () => {\r\n rl.close();\r\n reject(new Error('SIGINT'));\r\n });\r\n });\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Register the init command on the given program.\r\n */\r\nexport function registerInitCommand(program: Command): void {\r\n program\r\n .command('init')\r\n .description('Initialize workspace with selected presets')\r\n .option('-y, --yes', 'Skip confirmation, accept defaults')\r\n .option('--preset <name>', 'Specify preset (repeatable)', collectPreset, [])\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (opts: InitOptions) => {\r\n setupSigintHandler();\r\n try {\r\n await runInit(opts);\r\n } catch (err: unknown) {\r\n if (err instanceof Error && err.message === 'SIGINT') {\r\n process.exit(130);\r\n }\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction collectPreset(value: string, previous: string[]): string[] {\r\n return [...previous, value];\r\n}\r\n\r\nasync function runInit(opts: InitOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // 1. Determine selected presets\r\n let selectedNames: string[];\r\n\r\n if (opts.preset && opts.preset.length > 0) {\r\n // Validate preset names\r\n for (const name of opts.preset) {\r\n if (!available.includes(name)) {\r\n logger.error(\r\n `Preset \"${name}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n }\r\n selectedNames = opts.preset;\r\n } else {\r\n // Interactive multi-pick\r\n const items = available.map((name) => {\r\n try {\r\n const preset = load(name);\r\n return { name, description: preset.manifest.description };\r\n } catch {\r\n return { name, description: '' };\r\n }\r\n });\r\n\r\n selectedNames = await multiPickPrompt(items);\r\n }\r\n\r\n // Empty selection -> exit 0\r\n if (selectedNames.length === 0) {\r\n logger.info('No presets selected. Exiting.');\r\n process.exit(0);\r\n }\r\n\r\n // 2. Load selected presets\r\n const presets = loadAll(selectedNames);\r\n\r\n // 3. Plan operations - count total files\r\n let totalFiles = 0;\r\n for (const preset of presets) {\r\n totalFiles += preset.manifest.files.length;\r\n }\r\n\r\n // 4. Show summary and ask for confirmation\r\n if (!opts.yes) {\r\n const confirmed = await confirmPrompt(\r\n `About to write ${totalFiles} files into .kiro/ and workspace. Continue? (Y/n)`,\r\n );\r\n if (!confirmed) {\r\n logger.info('Cancelled.');\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // 5. Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n\r\n // Track written files for tracking store\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n // 6. Process each preset\r\n for (const preset of presets) {\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type for special handling\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const mcpFiles = manifest.files.filter((f) => f.type === 'mcp');\r\n const settingsFiles = manifest.files.filter((f) => f.type === 'settings');\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n // Safety check\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n // Set executable bit if needed\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n // File already identical\r\n break;\r\n }\r\n\r\n // Track the file regardless of action (for tracking store)\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files via StatuslineSelector\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (mcpFiles.length > 0 && manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch {\r\n existingMcp = null;\r\n }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n if (settingsFiles.length > 0) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(\r\n fs.readFileSync(settingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n } catch {\r\n existingSettings = null;\r\n }\r\n }\r\n\r\n // Read preset settings\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const presetSettings = JSON.parse(\r\n fs.readFileSync(presetSettingsPath, 'utf-8'),\r\n ) as SettingsConfig;\r\n\r\n // Resolve statusline command per platform\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n }\r\n\r\n // Also write .mcp.json.example if present in preset (as regular file)\r\n const mcpExampleSource = path.join(presetDir, '.mcp.json.example');\r\n if (fs.existsSync(mcpExampleSource)) {\r\n const mcpExampleTarget = path.join(workspaceRoot, '.kiro/.mcp.json.example');\r\n if (!fs.existsSync(mcpExampleTarget)) {\r\n fs.mkdirSync(path.dirname(mcpExampleTarget), { recursive: true });\r\n fs.copyFileSync(mcpExampleSource, mcpExampleTarget);\r\n }\r\n }\r\n }\r\n\r\n // 7. Write metadata.json\r\n const kitVersion = getKitVersion();\r\n const presetMetas = presets.map((p) => ({\r\n name: p.manifest.name,\r\n version: p.manifest.version,\r\n }));\r\n\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, presetMetas)\r\n : MetadataWriter.compose({\r\n kitVersion,\r\n repository: 'https://github.com/ihatesea69/kiro-kit.git',\r\n presets: presetMetas,\r\n });\r\n\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // 8. Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n\r\n for (const preset of presets) {\r\n const presetFiles = allTrackedFiles.filter(\r\n (f) => f.sourcePreset === preset.manifest.name,\r\n );\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: preset.manifest.name,\r\n version: preset.manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: presetFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n }\r\n\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // 9. Print summary\r\n logger.success(\r\n `Done! ${filesWritten} files written, ${filesSkipped} skipped.`,\r\n );\r\n logger.info(\r\n `Presets installed: ${selectedNames.join(', ')}`,\r\n );\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\nimport { parse, validate, type Manifest } from './ManifestParser.js';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\n\r\nfunction getPresetsDir(): string {\r\n // Try a couple of candidate locations so the loader works whether the\r\n // bundle places presets next to index.js or one level up.\r\n const candidates = [\r\n path.resolve(__dirname, 'presets'), // dist/presets (current bundle)\r\n path.resolve(__dirname, '../presets'), // legacy layout\r\n path.resolve(__dirname, '../../../../presets'), // dev/source checkout\r\n ];\r\n for (const candidate of candidates) {\r\n if (fs.existsSync(candidate)) return candidate;\r\n }\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n 'Cannot locate presets directory.',\r\n 'Ensure kiro-kit is installed correctly.',\r\n );\r\n}\r\n\r\nexport interface LoadedPreset {\r\n manifest: Manifest;\r\n dir: string;\r\n}\r\n\r\n/**\r\n * Load a single preset by name.\r\n */\r\nexport function load(name: string): LoadedPreset {\r\n const presetsDir = getPresetsDir();\r\n const presetDir = path.join(presetsDir, name);\r\n\r\n if (!fs.existsSync(presetDir)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_NOT_FOUND,\r\n `Preset \"${name}\" not found.`,\r\n `Available presets: ${listAvailable().join(', ')}`,\r\n );\r\n }\r\n\r\n const manifestPath = path.join(presetDir, 'manifest.json');\r\n if (!fs.existsSync(manifestPath)) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" is missing manifest.json.`,\r\n );\r\n }\r\n\r\n const raw = fs.readFileSync(manifestPath, 'utf-8');\r\n const result = parse(raw);\r\n\r\n if (!result.ok) {\r\n throw new KKError(\r\n ErrorCodes.PRESET_LOAD_FAILED,\r\n `Preset \"${name}\" manifest parse error: ${result.error.message}`,\r\n );\r\n }\r\n\r\n return { manifest: result.value, dir: presetDir };\r\n}\r\n\r\n/**\r\n * Load multiple presets by name.\r\n */\r\nexport function loadAll(names: string[]): LoadedPreset[] {\r\n return names.map((n) => load(n));\r\n}\r\n\r\n/**\r\n * List all available preset names from the presets directory.\r\n */\r\nexport function listAvailable(): string[] {\r\n const presetsDir = getPresetsDir();\r\n try {\r\n return fs\r\n .readdirSync(presetsDir, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .filter((d) => !d.name.startsWith('_'))\r\n .filter((d) =>\r\n fs.existsSync(path.join(presetsDir, d.name, 'manifest.json')),\r\n )\r\n .map((d) => d.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n","import { z } from 'zod';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst ArtifactTypeSchema = z.enum([\r\n 'steering', 'hook', 'mcp', 'skill', 'agent',\r\n 'command', 'workflow', 'statusline', 'metadata',\r\n 'settings', 'env', 'spec', 'docs', 'doc', 'config', 'other',\r\n]);\r\n\r\nconst PresetNameSchema = z.enum([\r\n 'frontend', 'backend', 'fullstack', 'mobile', 'devops', 'data-ai',\r\n]);\r\n\r\nconst FileEntrySchema = z.object({\r\n source: z.string().min(1),\r\n target: z.string().min(1),\r\n type: ArtifactTypeSchema,\r\n executable: z.boolean().optional(),\r\n});\r\n\r\nconst MCPServerDefSchema = z.object({\r\n command: z.string().min(1),\r\n args: z.array(z.string()).optional(),\r\n env: z.record(z.string()).optional(),\r\n});\r\n\r\nconst HookEntrySchema = z.union([\r\n z.object({\r\n matcher: z.string().optional(),\r\n command: z.string().min(1),\r\n }),\r\n z.string().min(1),\r\n]);\r\n\r\nconst ManifestSchema = z.object({\r\n name: z.string().min(1),\r\n version: z.string().min(1),\r\n description: z.string().min(1),\r\n category: PresetNameSchema,\r\n files: z.array(FileEntrySchema).min(1),\r\n dependencies: z.array(PresetNameSchema).optional(),\r\n mcpServers: z.record(MCPServerDefSchema).optional(),\r\n hooks: z.object({\r\n PreToolUse: z.array(HookEntrySchema).optional(),\r\n PostToolUse: z.array(HookEntrySchema).optional(),\r\n agentStop: z.array(HookEntrySchema).optional(),\r\n fileEdited: z.array(HookEntrySchema).optional(),\r\n }).optional(),\r\n tags: z.array(z.string()).optional(),\r\n minCounts: z.object({\r\n agents: z.number().int().nonnegative().optional(),\r\n skills: z.number().int().nonnegative().optional(),\r\n commands: z.number().int().nonnegative().optional(),\r\n hooks: z.number().int().nonnegative().optional(),\r\n workflows: z.number().int().nonnegative().optional(),\r\n }).optional(),\r\n});\r\n\r\nexport type Manifest = z.infer<typeof ManifestSchema>;\r\nexport type FileEntry = z.infer<typeof FileEntrySchema>;\r\nexport type ArtifactType = z.infer<typeof ArtifactTypeSchema>;\r\n\r\nexport interface ManifestError {\r\n code: string;\r\n message: string;\r\n}\r\n\r\nexport type Result<T, E> =\r\n | { ok: true; value: T }\r\n | { ok: false; error: E };\r\n\r\n/**\r\n * Parse raw JSON string into a validated Manifest.\r\n */\r\nexport function parse(json: string): Result<Manifest, ManifestError> {\r\n let raw: unknown;\r\n try {\r\n raw = JSON.parse(json);\r\n } catch {\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_INVALID,\r\n message: 'Manifest is not valid JSON.',\r\n },\r\n };\r\n }\r\n\r\n const result = ManifestSchema.safeParse(raw);\r\n if (!result.success) {\r\n const issues = result.error.issues\r\n .map((i) => `${i.path.join('.')}: ${i.message}`)\r\n .join('; ');\r\n return {\r\n ok: false,\r\n error: {\r\n code: ErrorCodes.MANIFEST_MISSING_FIELD,\r\n message: `Manifest schema validation failed: ${issues}`,\r\n },\r\n };\r\n }\r\n\r\n return { ok: true, value: result.data };\r\n}\r\n\r\n/**\r\n * Pretty-print a Manifest object as JSON (2-space indent).\r\n */\r\nexport function print(m: Manifest): string {\r\n return JSON.stringify(m, null, 2);\r\n}\r\n\r\n/**\r\n * Validate a parsed Manifest against its preset directory on disk.\r\n * Checks:\r\n * 1. File completeness: every file in manifest.files exists at presetDir/source\r\n * 2. No-orphan: every file in presetDir (except manifest.json, README.md) is declared in manifest.files\r\n */\r\nexport function validate(m: Manifest, presetDir: string): Result<void, ManifestError[]> {\r\n const errors: ManifestError[] = [];\r\n\r\n // 1. File completeness check\r\n for (const entry of m.files) {\r\n const fullPath = path.join(presetDir, entry.source);\r\n if (!fs.existsSync(fullPath)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_INCOMPLETE,\r\n message: `File declared in manifest not found on disk: ${entry.source}`,\r\n });\r\n }\r\n }\r\n\r\n // 2. No-orphan check\r\n const declaredSources = new Set(m.files.map((f) => f.source));\r\n const ignoredFiles = new Set(['manifest.json', 'README.md']);\r\n\r\n const walkDir = (dir: string, prefix: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n for (const entry of entries) {\r\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkDir(path.join(dir, entry.name), rel);\r\n } else if (entry.isFile()) {\r\n if (!ignoredFiles.has(rel) && !declaredSources.has(rel)) {\r\n errors.push({\r\n code: ErrorCodes.MANIFEST_ORPHAN_FILE,\r\n message: `File on disk not declared in manifest (orphan): ${rel}`,\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n walkDir(presetDir, '');\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, error: errors };\r\n }\r\n return { ok: true, value: undefined };\r\n}\r\n","/**\r\n * Structured error class for kiro-kit CLI.\r\n * Each error carries a unique code (KK001-KK091), a human-readable message,\r\n * and an optional suggestion for resolution.\r\n */\r\nexport class KKError extends Error {\r\n readonly code: string;\r\n readonly suggestion?: string;\r\n\r\n constructor(code: string, message: string, suggestion?: string) {\r\n super(message);\r\n this.name = 'KKError';\r\n this.code = code;\r\n this.suggestion = suggestion;\r\n Object.setPrototypeOf(this, KKError.prototype);\r\n }\r\n\r\n format(): string {\r\n let output = `[${this.code}] ${this.message}`;\r\n if (this.suggestion) {\r\n output += `\\n Suggestion: ${this.suggestion}`;\r\n }\r\n return output;\r\n }\r\n}\r\n\r\n// Common error codes\r\nexport const ErrorCodes = {\r\n NODE_VERSION: 'KK001',\r\n MANIFEST_INVALID: 'KK010',\r\n MANIFEST_MISSING_FIELD: 'KK011',\r\n MANIFEST_ORPHAN_FILE: 'KK012',\r\n MANIFEST_INCOMPLETE: 'KK013',\r\n PRESET_NOT_FOUND: 'KK020',\r\n PRESET_LOAD_FAILED: 'KK021',\r\n CONFLICT_UNRESOLVED: 'KK030',\r\n TRACKING_CORRUPT: 'KK040',\r\n TRACKING_WRITE_FAILED: 'KK041',\r\n BACKUP_NOT_FOUND: 'KK050',\r\n BACKUP_WRITE_FAILED: 'KK051',\r\n MCP_MERGE_CONFLICT: 'KK060',\r\n MCP_INVALID_JSON: 'KK061',\r\n SETTINGS_MERGE_WARN: 'KK070',\r\n FRONTMATTER_INVALID: 'KK080',\r\n FRONTMATTER_MISSING: 'KK081',\r\n DOCTOR_FAIL: 'KK090',\r\n DOCTOR_WARN: 'KK091',\r\n} as const;\r\n","import fs from 'node:fs';\r\nimport crypto from 'node:crypto';\r\n\r\nexport type ConflictAction =\r\n | 'WRITE_NEW'\r\n | 'OVERWRITE_WITH_BACKUP'\r\n | 'SKIP'\r\n | 'NO_OP';\r\n\r\nexport type ConflictMode = 'interactive' | 'force' | 'skip-existing';\r\n\r\nexport interface SessionState {\r\n overwriteAll: boolean;\r\n}\r\n\r\nexport interface ConflictPromptFn {\r\n (target: string): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'>;\r\n}\r\n\r\nexport interface DiffViewerFn {\r\n (target: string, sourceContent: Buffer): void;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\n/**\r\n * Resolve file conflict based on mode and session state.\r\n */\r\nexport async function resolve(opts: {\r\n target: string;\r\n sourceContent: Buffer;\r\n mode: ConflictMode;\r\n sessionState: SessionState;\r\n prompt?: ConflictPromptFn;\r\n showDiff?: DiffViewerFn;\r\n}): Promise<ConflictAction> {\r\n const { target, sourceContent, mode, sessionState, prompt, showDiff } = opts;\r\n\r\n // File doesn't exist yet - write new\r\n if (!fs.existsSync(target)) {\r\n return 'WRITE_NEW';\r\n }\r\n\r\n // Compare hashes\r\n const currentContent = fs.readFileSync(target);\r\n const currentHash = sha256(currentContent);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Byte-equal - no operation needed\r\n if (currentHash === newHash) {\r\n return 'NO_OP';\r\n }\r\n\r\n // Force mode - always overwrite with backup\r\n if (mode === 'force') {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Skip-existing mode - never overwrite\r\n if (mode === 'skip-existing') {\r\n return 'SKIP';\r\n }\r\n\r\n // Session overwrite-all already set\r\n if (sessionState.overwriteAll) {\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n\r\n // Interactive mode - prompt user\r\n if (!prompt) {\r\n // No prompt function provided, default to skip\r\n return 'SKIP';\r\n }\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const choice = await prompt(target);\r\n\r\n switch (choice) {\r\n case 'view-diff':\r\n if (showDiff) {\r\n showDiff(target, sourceContent);\r\n }\r\n continue;\r\n case 'overwrite':\r\n return 'OVERWRITE_WITH_BACKUP';\r\n case 'skip':\r\n return 'SKIP';\r\n case 'overwrite-all':\r\n sessionState.overwriteAll = true;\r\n return 'OVERWRITE_WITH_BACKUP';\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\n\r\nconst BACKUP_DIR = '.kiro/.backup';\r\n\r\n/**\r\n * Generate timestamp string: YYYYMMDD-HHmmss-mmm\r\n */\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\n/**\r\n * Backup a file to .kiro/.backup/<timestamp>/<relative-path>\r\n */\r\nexport function backup(\r\n workspaceRoot: string,\r\n target: string,\r\n timestamp?: string,\r\n): string {\r\n const ts = timestamp ?? generateTimestamp();\r\n const relPath = path.relative(workspaceRoot, target);\r\n const backupPath = path.join(workspaceRoot, BACKUP_DIR, ts, relPath);\r\n const backupDir = path.dirname(backupPath);\r\n\r\n fs.mkdirSync(backupDir, { recursive: true });\r\n fs.copyFileSync(target, backupPath);\r\n\r\n return ts;\r\n}\r\n\r\n/**\r\n * Restore files from a backup timestamp.\r\n * If no timestamp given, uses the most recent backup.\r\n * Returns list of restored file paths.\r\n */\r\nexport function restore(\r\n workspaceRoot: string,\r\n timestamp?: string,\r\n): string[] {\r\n const ts = timestamp ?? getLatestTimestamp(workspaceRoot);\r\n\r\n if (!ts) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n 'No backup found.',\r\n 'Run kiro-kit init or add first to create backups.',\r\n );\r\n }\r\n\r\n const backupRoot = path.join(workspaceRoot, BACKUP_DIR, ts);\r\n if (!fs.existsSync(backupRoot)) {\r\n throw new KKError(\r\n ErrorCodes.BACKUP_NOT_FOUND,\r\n `Backup timestamp \"${ts}\" not found.`,\r\n `Available: ${listTimestamps(workspaceRoot).join(', ') || 'none'}`,\r\n );\r\n }\r\n\r\n const restored: string[] = [];\r\n\r\n const walkAndRestore = (dir: string, relPrefix: string): void => {\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n const rel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;\r\n if (entry.isDirectory()) {\r\n walkAndRestore(fullPath, rel);\r\n } else if (entry.isFile()) {\r\n const targetPath = path.join(workspaceRoot, rel);\r\n const targetDir = path.dirname(targetPath);\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n fs.copyFileSync(fullPath, targetPath);\r\n restored.push(rel);\r\n }\r\n }\r\n };\r\n\r\n walkAndRestore(backupRoot, '');\r\n return restored;\r\n}\r\n\r\n/**\r\n * List all backup timestamps sorted newest first.\r\n */\r\nexport function listTimestamps(workspaceRoot: string): string[] {\r\n const backupBase = path.join(workspaceRoot, BACKUP_DIR);\r\n if (!fs.existsSync(backupBase)) return [];\r\n\r\n try {\r\n return fs\r\n .readdirSync(backupBase, { withFileTypes: true })\r\n .filter((d) => d.isDirectory())\r\n .map((d) => d.name)\r\n .sort()\r\n .reverse();\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nfunction getLatestTimestamp(workspaceRoot: string): string | undefined {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n return timestamps[0];\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { KKError, ErrorCodes } from './errors.js';\r\nimport { logger } from '../utils/logger.js';\r\n\r\nconst TRACKING_FILE = '.kiro/.kiro-kit.json';\r\n\r\nexport interface TrackedFile {\r\n target: string;\r\n sourcePreset: string;\r\n contentHash: string;\r\n installedAt: string;\r\n}\r\n\r\nexport interface TrackedPreset {\r\n name: string;\r\n version: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n files: TrackedFile[];\r\n}\r\n\r\nexport interface TrackingData {\r\n kitVersion: string;\r\n installedAt: string;\r\n updatedAt?: string;\r\n presets: TrackedPreset[];\r\n}\r\n\r\nfunction getTrackingPath(workspaceRoot: string): string {\r\n return path.join(workspaceRoot, TRACKING_FILE);\r\n}\r\n\r\n/**\r\n * Read tracking data from .kiro/.kiro-kit.json.\r\n * Returns null if file doesn't exist.\r\n * Throws KK040 if file is corrupt.\r\n */\r\nexport function read(workspaceRoot: string): TrackingData | null {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return null;\r\n }\r\n\r\n const raw = fs.readFileSync(filePath, 'utf-8');\r\n try {\r\n return JSON.parse(raw) as TrackingData;\r\n } catch {\r\n logger.warn(`Tracking file is corrupt: ${filePath}`);\r\n throw new KKError(\r\n ErrorCodes.TRACKING_CORRUPT,\r\n 'Tracking file .kiro/.kiro-kit.json is corrupt (invalid JSON).',\r\n 'Delete the file and re-run kiro-kit init to regenerate.',\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Write tracking data to .kiro/.kiro-kit.json.\r\n * Creates directory if needed.\r\n */\r\nexport function write(workspaceRoot: string, data: TrackingData): void {\r\n const filePath = getTrackingPath(workspaceRoot);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Add or update a preset in tracking data.\r\n */\r\nexport function upsertPreset(\r\n data: TrackingData,\r\n preset: TrackedPreset,\r\n): TrackingData {\r\n const existing = data.presets.findIndex((p) => p.name === preset.name);\r\n if (existing >= 0) {\r\n data.presets[existing] = preset;\r\n } else {\r\n data.presets.push(preset);\r\n }\r\n data.updatedAt = new Date().toISOString();\r\n return data;\r\n}\r\n\r\n/**\r\n * Create initial tracking data.\r\n */\r\nexport function createInitial(kitVersion: string): TrackingData {\r\n return {\r\n kitVersion,\r\n installedAt: new Date().toISOString(),\r\n presets: [],\r\n };\r\n}\r\n\r\n/**\r\n * Get a preset from tracking data by name.\r\n */\r\nexport function getPreset(\r\n data: TrackingData,\r\n name: string,\r\n): TrackedPreset | undefined {\r\n return data.presets.find((p) => p.name === name);\r\n}\r\n","import process from 'node:process';\r\nimport { color } from './color.js';\r\n\r\nlet verboseEnabled = false;\r\nlet quietEnabled = false;\r\n\r\nexport function setVerbose(enabled: boolean): void {\r\n verboseEnabled = enabled;\r\n}\r\n\r\nexport function setQuiet(enabled: boolean): void {\r\n quietEnabled = enabled;\r\n}\r\n\r\nexport const logger = {\r\n info(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${msg}\\n`);\r\n }\r\n },\r\n\r\n success(msg: string): void {\r\n if (!quietEnabled) {\r\n process.stdout.write(`${color.green(msg)}\\n`);\r\n }\r\n },\r\n\r\n warn(msg: string): void {\r\n process.stderr.write(`${color.yellow('WARN')} ${msg}\\n`);\r\n },\r\n\r\n error(msg: string): void {\r\n process.stderr.write(`${color.red('ERROR')} ${msg}\\n`);\r\n },\r\n\r\n debug(msg: string): void {\r\n if (verboseEnabled) {\r\n process.stderr.write(`${color.dim('[debug]')} ${msg}\\n`);\r\n }\r\n },\r\n};\r\n","import pc from 'picocolors';\r\nimport process from 'node:process';\r\n\r\nconst isColorDisabled =\r\n !!process.env['NO_COLOR'] ||\r\n process.argv.includes('--no-color') ||\r\n !process.stdout.isTTY;\r\n\r\nfunction wrap(fn: (s: string) => string): (s: string) => string {\r\n return (s: string) => (isColorDisabled ? s : fn(s));\r\n}\r\n\r\nexport const color = {\r\n green: wrap(pc.green),\r\n red: wrap(pc.red),\r\n yellow: wrap(pc.yellow),\r\n blue: wrap(pc.blue),\r\n cyan: wrap(pc.cyan),\r\n gray: wrap(pc.gray),\r\n bold: wrap(pc.bold),\r\n dim: wrap(pc.dim),\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\nconst METADATA_FILE = '.kiro/metadata.json';\r\n\r\nexport interface PresetMeta {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface Metadata {\r\n version: string;\r\n name: string;\r\n description: string;\r\n buildDate: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n installedAt: string;\r\n kitVersion: string;\r\n}\r\n\r\n/**\r\n * Compose metadata from installed presets and kit info.\r\n */\r\nexport function compose(opts: {\r\n kitVersion: string;\r\n repository: string;\r\n presets: PresetMeta[];\r\n}): Metadata {\r\n return {\r\n version: '1.0.0',\r\n name: 'kiro-kit',\r\n description: 'Kiro IDE workspace bootstrapped by kiro-kit.',\r\n buildDate: new Date().toISOString(),\r\n repository: opts.repository,\r\n presets: opts.presets,\r\n installedAt: new Date().toISOString(),\r\n kitVersion: opts.kitVersion,\r\n };\r\n}\r\n\r\n/**\r\n * Write metadata.json to workspace.\r\n * When installing multiple presets, merges preset list.\r\n */\r\nexport function write(workspaceRoot: string, metadata: Metadata): void {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n const dir = path.dirname(filePath);\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(filePath, JSON.stringify(metadata, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\n/**\r\n * Read existing metadata, or return null if not present.\r\n */\r\nexport function read(workspaceRoot: string): Metadata | null {\r\n const filePath = path.join(workspaceRoot, METADATA_FILE);\r\n if (!fs.existsSync(filePath)) return null;\r\n try {\r\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as Metadata;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Merge new presets into existing metadata (dedup by name).\r\n */\r\nexport function mergePresets(existing: Metadata, newPresets: PresetMeta[]): Metadata {\r\n const merged = [...existing.presets];\r\n for (const p of newPresets) {\r\n const idx = merged.findIndex((m) => m.name === p.name);\r\n if (idx >= 0) {\r\n merged[idx] = p;\r\n } else {\r\n merged.push(p);\r\n }\r\n }\r\n return { ...existing, presets: merged, buildDate: new Date().toISOString() };\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nconst STATUSLINE_FILES = ['statusline.js', 'statusline.sh', 'statusline.ps1'];\r\n\r\n/**\r\n * Get the appropriate statusline command for the current platform.\r\n */\r\nexport function getCommand(): string {\r\n switch (process.platform) {\r\n case 'win32':\r\n return 'powershell -ExecutionPolicy Bypass -File .kiro/statusline.ps1';\r\n default:\r\n // macOS, Linux, etc.\r\n return 'node .kiro/statusline.js';\r\n }\r\n}\r\n\r\n/**\r\n * Install statusline triple (.js, .sh, .ps1) from preset to workspace.\r\n * Sets chmod +x on .sh for Unix platforms.\r\n */\r\nexport function install(\r\n presetDir: string,\r\n workspaceRoot: string,\r\n): string[] {\r\n const installed: string[] = [];\r\n const targetDir = path.join(workspaceRoot, '.kiro');\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n\r\n for (const file of STATUSLINE_FILES) {\r\n const source = path.join(presetDir, file);\r\n if (!fs.existsSync(source)) continue;\r\n\r\n const target = path.join(targetDir, file);\r\n fs.copyFileSync(source, target);\r\n installed.push(`.kiro/${file}`);\r\n\r\n // Set executable bit on Unix for .sh\r\n if (file.endsWith('.sh') && process.platform !== 'win32') {\r\n try {\r\n fs.chmodSync(target, 0o755);\r\n } catch {\r\n // Non-critical: skip if chmod fails\r\n }\r\n }\r\n }\r\n\r\n return installed;\r\n}\r\n\r\n/**\r\n * Resolve the statusLine.command field in settings based on platform.\r\n */\r\nexport function resolveSettingsCommand(settings: Record<string, unknown>): Record<string, unknown> {\r\n const statusLine = settings['statusLine'] as Record<string, unknown> | undefined;\r\n if (statusLine && statusLine['type'] === 'command') {\r\n statusLine['command'] = getCommand();\r\n }\r\n return settings;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface MCPConfig {\r\n mcpServers: Record<string, MCPServerEntry>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface MCPServerEntry {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n disabled?: boolean;\r\n autoApprove?: string[];\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset MCP servers into existing MCP config.\r\n * User-priority: existing servers are never overwritten or deleted.\r\n * Warns on cross-preset conflicts (same server name from different presets).\r\n */\r\nexport function mergeMCP(\r\n existing: MCPConfig | null,\r\n presetServers: Record<string, MCPServerEntry>,\r\n presetName?: string,\r\n): MCPConfig {\r\n const result: MCPConfig = existing\r\n ? structuredClone(existing)\r\n : { mcpServers: {} };\r\n\r\n if (!result.mcpServers) {\r\n result.mcpServers = {};\r\n }\r\n\r\n for (const [serverName, def] of Object.entries(presetServers)) {\r\n if (serverName in result.mcpServers) {\r\n logger.warn(\r\n `MCP server \"${serverName}\" already exists, keeping user definition.` +\r\n (presetName ? ` (from preset: ${presetName})` : ''),\r\n );\r\n continue;\r\n }\r\n result.mcpServers[serverName] = structuredClone(def);\r\n }\r\n\r\n return result;\r\n}\r\n","import { logger } from '../../utils/logger.js';\r\n\r\nexport interface HookRef {\r\n command: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface SettingsConfig {\r\n statusLine?: { type?: string; command?: string; [key: string]: unknown };\r\n hooks?: {\r\n PreToolUse?: HookRef[];\r\n PostToolUse?: HookRef[];\r\n agentStop?: HookRef[];\r\n [key: string]: unknown;\r\n };\r\n includeCoAuthoredBy?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Merge preset settings into existing settings.\r\n * - Array fields (hooks.PreToolUse, hooks.PostToolUse, etc.): concat-dedupe by `command`\r\n * - Non-array fields: last-write-wins with warning\r\n * - Preserves user-added fields not in preset\r\n */\r\nexport function mergeSettings(\r\n existing: SettingsConfig | null,\r\n preset: SettingsConfig,\r\n): SettingsConfig {\r\n const result: SettingsConfig = existing\r\n ? structuredClone(existing)\r\n : {};\r\n\r\n // Merge hooks arrays with dedup by command\r\n if (preset.hooks) {\r\n if (!result.hooks) result.hooks = {};\r\n\r\n for (const key of ['PreToolUse', 'PostToolUse', 'agentStop'] as const) {\r\n const presetArr = preset.hooks[key];\r\n if (!presetArr || presetArr.length === 0) continue;\r\n\r\n const existingArr: HookRef[] = (result.hooks[key] as HookRef[]) ?? [];\r\n const existingCommands = new Set(existingArr.map((h) => h.command));\r\n\r\n for (const hook of presetArr) {\r\n if (!existingCommands.has(hook.command)) {\r\n existingArr.push(structuredClone(hook));\r\n }\r\n }\r\n (result.hooks as Record<string, unknown>)[key] = existingArr;\r\n }\r\n }\r\n\r\n // Merge non-array scalar fields with last-write-wins + warning\r\n if (preset.statusLine !== undefined) {\r\n if (result.statusLine !== undefined) {\r\n logger.warn('statusLine already set in settings, overwriting with preset value.');\r\n }\r\n result.statusLine = structuredClone(preset.statusLine);\r\n }\r\n\r\n if (preset.includeCoAuthoredBy !== undefined) {\r\n if (result.includeCoAuthoredBy !== undefined && result.includeCoAuthoredBy !== preset.includeCoAuthoredBy) {\r\n logger.warn('includeCoAuthoredBy already set, overwriting with preset value.');\r\n }\r\n result.includeCoAuthoredBy = preset.includeCoAuthoredBy;\r\n }\r\n\r\n return result;\r\n}\r\n","import fs from 'node:fs';\r\nimport { createTwoFilesPatch } from 'diff';\r\nimport { color } from '../utils/color.js';\r\n\r\n/**\r\n * Print a unified diff between the existing file on disk and new source content.\r\n * Highlights additions in green and deletions in red (NO_COLOR aware).\r\n */\r\nexport function showDiff(target: string, sourceContent: Buffer): void {\r\n const existing = fs.existsSync(target)\r\n ? fs.readFileSync(target, 'utf-8')\r\n : '';\r\n const incoming = sourceContent.toString('utf-8');\r\n\r\n const patch = createTwoFilesPatch(\r\n `a/${target}`,\r\n `b/${target}`,\r\n existing,\r\n incoming,\r\n 'current',\r\n 'incoming',\r\n { context: 3 },\r\n );\r\n\r\n const lines = patch.split('\\n');\r\n for (const line of lines) {\r\n if (line.startsWith('+') && !line.startsWith('+++')) {\r\n process.stdout.write(color.green(line) + '\\n');\r\n } else if (line.startsWith('-') && !line.startsWith('---')) {\r\n process.stdout.write(color.red(line) + '\\n');\r\n } else if (line.startsWith('@@')) {\r\n process.stdout.write(color.cyan(line) + '\\n');\r\n } else {\r\n process.stdout.write(line + '\\n');\r\n }\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport crypto from 'node:crypto';\r\nimport os from 'node:os';\r\n\r\n/** Extensions that should always use LF line endings. */\r\nconst LF_EXTENSIONS = new Set(['.json', '.yaml', '.yml']);\r\n\r\n/**\r\n * Determine the appropriate line ending for a file based on extension.\r\n * - .json, .yaml, .yml -> LF\r\n * - Everything else -> OS default (CRLF on Windows, LF elsewhere)\r\n */\r\nfunction getLineEnding(filePath: string): string {\r\n const ext = path.extname(filePath).toLowerCase();\r\n if (LF_EXTENSIONS.has(ext)) return '\\n';\r\n return os.EOL;\r\n}\r\n\r\n/**\r\n * Normalize line endings in content based on target file extension.\r\n */\r\nfunction normalizeLineEndings(content: string, filePath: string): string {\r\n const eol = getLineEnding(filePath);\r\n // First normalize all to LF, then convert to target\r\n const normalized = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n if (eol === '\\n') return normalized;\r\n return normalized.replace(/\\n/g, eol);\r\n}\r\n\r\n/**\r\n * Atomic write: writes to a temp file in the same directory, then renames.\r\n * This ensures the target file is never in a partial state.\r\n * Also normalizes line endings based on file extension.\r\n */\r\nexport function atomicWrite(target: string, content: string | Buffer): void {\r\n const dir = path.dirname(target);\r\n fs.mkdirSync(dir, { recursive: true });\r\n\r\n const rand = crypto.randomBytes(6).toString('hex');\r\n const tmpPath = path.join(dir, `.tmp.${rand}`);\r\n\r\n let data: Buffer;\r\n if (typeof content === 'string') {\r\n const normalized = normalizeLineEndings(content, target);\r\n data = Buffer.from(normalized, 'utf-8');\r\n } else {\r\n data = content;\r\n }\r\n\r\n try {\r\n fs.writeFileSync(tmpPath, data);\r\n fs.renameSync(tmpPath, target);\r\n } catch (err) {\r\n // Clean up temp file on failure\r\n try {\r\n fs.unlinkSync(tmpPath);\r\n } catch {\r\n // ignore cleanup errors\r\n }\r\n throw err;\r\n }\r\n}\r\n","import path from 'node:path';\r\n\r\n/**\r\n * Normalize a path to use forward slashes (for consistent cross-platform display).\r\n */\r\nexport function normalize(p: string): string {\r\n return p.split(path.sep).join('/');\r\n}\r\n\r\n/**\r\n * Get relative path from workspace root, normalized with forward slashes.\r\n */\r\nexport function relativeFromWorkspace(workspaceRoot: string, target: string): string {\r\n return normalize(path.relative(workspaceRoot, target));\r\n}\r\n\r\n/**\r\n * Check that a resolved path is safely inside the workspace root.\r\n * Prevents path traversal attacks (e.g., ../../etc/passwd).\r\n */\r\nexport function safePathInside(workspaceRoot: string, target: string): boolean {\r\n const resolved = path.resolve(workspaceRoot, target);\r\n const root = path.resolve(workspaceRoot);\r\n return resolved.startsWith(root + path.sep) || resolved === root;\r\n}\r\n\r\n/**\r\n * Join paths using OS-native separator.\r\n */\r\nexport function join(...segments: string[]): string {\r\n return path.join(...segments);\r\n}\r\n\r\n/**\r\n * Resolve to absolute path.\r\n */\r\nexport function resolve(...segments: string[]): string {\r\n return path.resolve(...segments);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport * as MetadataWriter from '../core/MetadataWriter.js';\r\nimport * as StatuslineSelector from '../core/StatuslineSelector.js';\r\nimport { mergeMCP, type MCPConfig } from '../core/merge/mergeMCP.js';\r\nimport { mergeSettings, type SettingsConfig } from '../core/merge/mergeSettings.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface AddOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n color?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} already exists with different content.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace existing file (backup will be saved)\\n` +\r\n ` skip - Keep existing file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace this and all remaining conflicting files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerAddCommand(program: Command): void {\r\n program\r\n .command('add <preset>')\r\n .description('Add a preset to existing workspace')\r\n .option('-y, --yes', 'Skip confirmation')\r\n .option('--force', 'Overwrite all files (with backup)')\r\n .option('--skip-existing', 'Skip all existing files')\r\n .option('--no-color', 'Disable ANSI colors')\r\n .action(async (presetName: string, opts: AddOptions) => {\r\n try {\r\n await runAdd(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runAdd(presetName: string, opts: AddOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n const available = listAvailable();\r\n\r\n // Validate preset name\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // Auto-init: create .kiro/ if it doesn't exist\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (!fs.existsSync(kiroDir)) {\r\n fs.mkdirSync(kiroDir, { recursive: true });\r\n logger.info('Created .kiro/ directory.');\r\n }\r\n\r\n // Load preset\r\n const preset = load(presetName);\r\n\r\n // Determine conflict mode\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n const allTrackedFiles: TrackingStore.TrackedFile[] = [];\r\n let filesWritten = 0;\r\n let filesSkipped = 0;\r\n\r\n const { manifest, dir: presetDir } = preset;\r\n\r\n // Separate files by type\r\n const regularFiles = manifest.files.filter(\r\n (f) => !['mcp', 'settings', 'statusline'].includes(f.type),\r\n );\r\n const statuslineFiles = manifest.files.filter((f) => f.type === 'statusline');\r\n\r\n // Process regular files\r\n for (const fileEntry of regularFiles) {\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) {\r\n logger.warn(`Skipping unsafe path: ${fileEntry.target}`);\r\n filesSkipped++;\r\n continue;\r\n }\r\n\r\n if (!fs.existsSync(sourcePath)) {\r\n logger.debug(`Source file missing: ${sourcePath}`);\r\n continue;\r\n }\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* non-critical */ }\r\n }\r\n filesWritten++;\r\n break;\r\n case 'SKIP':\r\n filesSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n if (action !== 'SKIP') {\r\n allTrackedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: manifest.name,\r\n contentHash: sha256(sourceContent),\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process statusline files\r\n if (statuslineFiles.length > 0) {\r\n const installed = StatuslineSelector.install(presetDir, workspaceRoot);\r\n filesWritten += installed.length;\r\n for (const f of installed) {\r\n allTrackedFiles.push({\r\n target: f,\r\n sourcePreset: manifest.name,\r\n contentHash: '',\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n }\r\n\r\n // Process MCP merge\r\n if (manifest.mcpServers) {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n let existingMcp: MCPConfig | null = null;\r\n if (fs.existsSync(mcpPath)) {\r\n try {\r\n existingMcp = JSON.parse(fs.readFileSync(mcpPath, 'utf-8')) as MCPConfig;\r\n } catch { existingMcp = null; }\r\n }\r\n const merged = mergeMCP(existingMcp, manifest.mcpServers, manifest.name);\r\n fs.mkdirSync(path.dirname(mcpPath), { recursive: true });\r\n atomicWrite(mcpPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Process settings merge\r\n const presetSettingsPath = path.join(presetDir, 'settings.json');\r\n if (fs.existsSync(presetSettingsPath)) {\r\n const settingsPath = path.join(workspaceRoot, '.kiro/settings.json');\r\n let existingSettings: SettingsConfig | null = null;\r\n if (fs.existsSync(settingsPath)) {\r\n try {\r\n existingSettings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as SettingsConfig;\r\n } catch { existingSettings = null; }\r\n }\r\n const presetSettings = JSON.parse(fs.readFileSync(presetSettingsPath, 'utf-8')) as SettingsConfig;\r\n const resolvedSettings = StatuslineSelector.resolveSettingsCommand(\r\n presetSettings as Record<string, unknown>,\r\n ) as SettingsConfig;\r\n const merged = mergeSettings(existingSettings, resolvedSettings);\r\n fs.mkdirSync(path.dirname(settingsPath), { recursive: true });\r\n atomicWrite(settingsPath, JSON.stringify(merged, null, 2) + '\\n');\r\n filesWritten++;\r\n }\r\n\r\n // Write metadata\r\n const kitVersion = getKitVersion();\r\n const presetMeta = { name: manifest.name, version: manifest.version };\r\n const existingMeta = MetadataWriter.read(workspaceRoot);\r\n const metadata = existingMeta\r\n ? MetadataWriter.mergePresets(existingMeta, [presetMeta])\r\n : MetadataWriter.compose({ kitVersion, repository: 'https://github.com/ihatesea69/kiro-kit.git', presets: [presetMeta] });\r\n MetadataWriter.write(workspaceRoot, metadata);\r\n\r\n // Write tracking file LAST\r\n let trackingData = TrackingStore.read(workspaceRoot) ?? TrackingStore.createInitial(kitVersion);\r\n const trackedPreset: TrackingStore.TrackedPreset = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n installedAt: new Date().toISOString(),\r\n files: allTrackedFiles,\r\n };\r\n trackingData = TrackingStore.upsertPreset(trackingData, trackedPreset);\r\n trackingData.kitVersion = kitVersion;\r\n TrackingStore.write(workspaceRoot, trackingData);\r\n\r\n // Summary\r\n logger.success(`Done! ${filesWritten} files written, ${filesSkipped} skipped.`);\r\n logger.info(`Preset added: ${presetName}`);\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface ListOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetSummary {\r\n name: string;\r\n description: string;\r\n agents: number;\r\n skills: number;\r\n commands: number;\r\n hooks: number;\r\n workflows: number;\r\n mcp: number;\r\n}\r\n\r\nfunction countArtifacts(files: Array<{ type: string }>): Record<string, number> {\r\n const counts: Record<string, number> = {\r\n agent: 0,\r\n skill: 0,\r\n command: 0,\r\n hook: 0,\r\n workflow: 0,\r\n mcp: 0,\r\n };\r\n for (const f of files) {\r\n if (f.type in counts) {\r\n counts[f.type]++;\r\n }\r\n }\r\n return counts;\r\n}\r\n\r\nexport function registerListCommand(program: Command): void {\r\n program\r\n .command('list')\r\n .description('List available presets')\r\n .option('--json', 'Output as JSON')\r\n .action((opts: ListOptions) => {\r\n try {\r\n runList(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runList(opts: ListOptions): void {\r\n const available = listAvailable();\r\n const summaries: PresetSummary[] = [];\r\n\r\n for (const name of available) {\r\n try {\r\n const preset = load(name);\r\n const counts = countArtifacts(preset.manifest.files);\r\n summaries.push({\r\n name,\r\n description: preset.manifest.description,\r\n agents: counts['agent'],\r\n skills: counts['skill'],\r\n commands: counts['command'],\r\n hooks: counts['hook'],\r\n workflows: counts['workflow'],\r\n mcp: Object.keys(preset.manifest.mcpServers ?? {}).length,\r\n });\r\n } catch {\r\n summaries.push({\r\n name,\r\n description: '(failed to load)',\r\n agents: 0,\r\n skills: 0,\r\n commands: 0,\r\n hooks: 0,\r\n workflows: 0,\r\n mcp: 0,\r\n });\r\n }\r\n }\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(summaries, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n for (const s of summaries) {\r\n const nameStr = color.bold(s.name.padEnd(12));\r\n const descStr = color.dim(`- ${s.description}`);\r\n process.stdout.write(` ${nameStr} ${descStr}\\n`);\r\n const counts = `${s.agents} agents, ${s.skills} skills, ${s.commands} commands, ${s.hooks} hooks, ${s.workflows} workflows, ${s.mcp} MCP servers`;\r\n process.stdout.write(`${''.padEnd(14)} ${color.gray(counts)}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { load, listAvailable } from '../core/PresetLoader.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface InfoOptions {\r\n json?: boolean;\r\n}\r\n\r\ninterface PresetInfo {\r\n name: string;\r\n version: string;\r\n description: string;\r\n category: string;\r\n files: Array<{ source: string; target: string; type: string }>;\r\n mcpServers: string[];\r\n hooks: string[];\r\n agents: string[];\r\n skills: string[];\r\n commands: string[];\r\n workflows: string[];\r\n}\r\n\r\nexport function registerInfoCommand(program: Command): void {\r\n program\r\n .command('info <preset>')\r\n .description('Show detailed preset information')\r\n .option('--json', 'Output as JSON')\r\n .action((presetName: string, opts: InfoOptions) => {\r\n try {\r\n runInfo(presetName, opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runInfo(presetName: string, opts: InfoOptions): void {\r\n const available = listAvailable();\r\n\r\n if (!available.includes(presetName)) {\r\n logger.error(\r\n `Preset \"${presetName}\" not found. Available: ${available.join(', ')}`,\r\n );\r\n process.exit(1);\r\n }\r\n\r\n const preset = load(presetName);\r\n const { manifest } = preset;\r\n\r\n const agents = manifest.files.filter((f) => f.type === 'agent').map((f) => f.source);\r\n const skills = manifest.files.filter((f) => f.type === 'skill').map((f) => f.source);\r\n const commands = manifest.files.filter((f) => f.type === 'command').map((f) => f.source);\r\n const workflows = manifest.files.filter((f) => f.type === 'workflow').map((f) => f.source);\r\n const hooks = manifest.files.filter((f) => f.type === 'hook').map((f) => f.source);\r\n const mcpServers = Object.keys(manifest.mcpServers ?? {});\r\n\r\n const info: PresetInfo = {\r\n name: manifest.name,\r\n version: manifest.version,\r\n description: manifest.description,\r\n category: manifest.category,\r\n files: manifest.files.map((f) => ({ source: f.source, target: f.target, type: f.type })),\r\n mcpServers,\r\n hooks,\r\n agents,\r\n skills,\r\n commands,\r\n workflows,\r\n };\r\n\r\n if (opts.json) {\r\n process.stdout.write(JSON.stringify(info, null, 2) + '\\n');\r\n return;\r\n }\r\n\r\n // Text output\r\n process.stdout.write(`\\n${color.bold(manifest.name)} v${manifest.version}\\n`);\r\n process.stdout.write(`${manifest.description}\\n\\n`);\r\n process.stdout.write(`${color.dim('Category:')} ${manifest.category}\\n`);\r\n process.stdout.write(`${color.dim('Total files:')} ${manifest.files.length}\\n\\n`);\r\n\r\n if (mcpServers.length > 0) {\r\n process.stdout.write(`${color.bold('MCP Servers')} (${mcpServers.length}):\\n`);\r\n for (const s of mcpServers) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (agents.length > 0) {\r\n process.stdout.write(`${color.bold('Agents')} (${agents.length}):\\n`);\r\n for (const a of agents) {\r\n process.stdout.write(` - ${a}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (skills.length > 0) {\r\n process.stdout.write(`${color.bold('Skills')} (${skills.length}):\\n`);\r\n for (const s of skills) {\r\n process.stdout.write(` - ${s}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (commands.length > 0) {\r\n process.stdout.write(`${color.bold('Commands')} (${commands.length}):\\n`);\r\n for (const c of commands) {\r\n process.stdout.write(` - ${c}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (workflows.length > 0) {\r\n process.stdout.write(`${color.bold('Workflows')} (${workflows.length}):\\n`);\r\n for (const w of workflows) {\r\n process.stdout.write(` - ${w}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n if (hooks.length > 0) {\r\n process.stdout.write(`${color.bold('Hooks')} (${hooks.length}):\\n`);\r\n for (const h of hooks) {\r\n process.stdout.write(` - ${h}\\n`);\r\n }\r\n process.stdout.write('\\n');\r\n }\r\n\r\n // File list with targets\r\n process.stdout.write(`${color.bold('File Targets')}:\\n`);\r\n for (const f of manifest.files) {\r\n process.stdout.write(` ${color.dim(f.type.padEnd(12))} ${f.target}\\n`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\nimport crypto from 'node:crypto';\r\n\r\nimport { load } from '../core/PresetLoader.js';\r\nimport { resolve as resolveConflict, type ConflictMode, type SessionState } from '../core/ConflictResolver.js';\r\nimport { backup } from '../core/BackupManager.js';\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { showDiff } from '../prompts/DiffViewer.js';\r\nimport { atomicWrite } from '../utils/fs-safe.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\nimport { safePathInside } from '../utils/paths.js';\r\n\r\ninterface UpdateOptions {\r\n yes?: boolean;\r\n force?: boolean;\r\n skipExisting?: boolean;\r\n}\r\n\r\nfunction sha256(data: Buffer): string {\r\n return crypto.createHash('sha256').update(data).digest('hex');\r\n}\r\n\r\nfunction generateTimestamp(): string {\r\n const now = new Date();\r\n const y = now.getFullYear();\r\n const mo = String(now.getMonth() + 1).padStart(2, '0');\r\n const d = String(now.getDate()).padStart(2, '0');\r\n const h = String(now.getHours()).padStart(2, '0');\r\n const mi = String(now.getMinutes()).padStart(2, '0');\r\n const s = String(now.getSeconds()).padStart(2, '0');\r\n const ms = String(now.getMilliseconds()).padStart(3, '0');\r\n return `${y}${mo}${d}-${h}${mi}${s}-${ms}`;\r\n}\r\n\r\nfunction getKitVersion(): string {\r\n try {\r\n const pkgPath = new URL('../../package.json', import.meta.url);\r\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as { version: string };\r\n return pkg.version;\r\n } catch {\r\n return '0.1.0';\r\n }\r\n}\r\n\r\nasync function conflictPrompt(\r\n target: string,\r\n): Promise<'overwrite' | 'skip' | 'view-diff' | 'overwrite-all'> {\r\n if (!process.stdin.isTTY) return 'skip';\r\n\r\n const { default: readline } = await import('node:readline');\r\n const relTarget = path.relative(process.cwd(), target);\r\n process.stdout.write(\r\n `\\n${color.yellow('?')} File ${color.bold(relTarget)} has changed in the new version.\\n` +\r\n ` ${color.cyan('>')} overwrite - Replace with new version (backup saved)\\n` +\r\n ` skip - Keep current file\\n` +\r\n ` view diff - Show unified diff and ask again\\n` +\r\n ` overwrite all - Replace all remaining changed files\\n`,\r\n );\r\n\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(` Choice (overwrite/skip/diff/all): `, (answer) => {\r\n rl.close();\r\n const a = answer.trim().toLowerCase();\r\n if (a === 'o' || a === 'overwrite') resolve('overwrite');\r\n else if (a === 's' || a === 'skip') resolve('skip');\r\n else if (a === 'd' || a === 'diff' || a === 'view diff') resolve('view-diff');\r\n else if (a === 'a' || a === 'all' || a === 'overwrite all') resolve('overwrite-all');\r\n else resolve('skip');\r\n });\r\n });\r\n}\r\n\r\nexport function registerUpdateCommand(program: Command): void {\r\n program\r\n .command('update')\r\n .description('Update installed presets to latest bundled version')\r\n .option('-y, --yes', 'Skip confirmation, auto-skip conflicts')\r\n .option('--force', 'Overwrite all changed files (with backup)')\r\n .option('--skip-existing', 'Skip all changed files')\r\n .action(async (opts: UpdateOptions) => {\r\n try {\r\n await runUpdate(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function runUpdate(opts: UpdateOptions): Promise<void> {\r\n const workspaceRoot = process.cwd();\r\n\r\n // Read tracking\r\n const tracking = TrackingStore.read(workspaceRoot);\r\n if (!tracking || tracking.presets.length === 0) {\r\n logger.info('No presets installed. Nothing to update.');\r\n process.exit(0);\r\n }\r\n\r\n let mode: ConflictMode = 'interactive';\r\n if (opts.force) mode = 'force';\r\n else if (opts.skipExisting) mode = 'skip-existing';\r\n else if (opts.yes) mode = 'skip-existing';\r\n\r\n const sessionState: SessionState = { overwriteAll: false };\r\n const timestamp = generateTimestamp();\r\n let totalUpdated = 0;\r\n let totalSkipped = 0;\r\n\r\n for (const trackedPreset of tracking.presets) {\r\n let bundled;\r\n try {\r\n bundled = load(trackedPreset.name);\r\n } catch {\r\n logger.warn(`Preset \"${trackedPreset.name}\" not found in bundled presets. Skipping.`);\r\n continue;\r\n }\r\n\r\n const bundledVersion = bundled.manifest.version;\r\n if (bundledVersion === trackedPreset.version) {\r\n logger.debug(`Preset \"${trackedPreset.name}\" is up to date (v${bundledVersion}).`);\r\n continue;\r\n }\r\n\r\n logger.info(\r\n `Updating ${color.bold(trackedPreset.name)}: v${trackedPreset.version} -> v${bundledVersion}`,\r\n );\r\n\r\n // Find changed files by comparing content hashes\r\n const presetDir = bundled.dir;\r\n const updatedFiles: TrackingStore.TrackedFile[] = [];\r\n\r\n for (const fileEntry of bundled.manifest.files) {\r\n if (['mcp', 'settings', 'statusline'].includes(fileEntry.type)) continue;\r\n\r\n const sourcePath = path.join(presetDir, fileEntry.source);\r\n const targetPath = path.resolve(workspaceRoot, fileEntry.target);\r\n\r\n if (!safePathInside(workspaceRoot, fileEntry.target)) continue;\r\n if (!fs.existsSync(sourcePath)) continue;\r\n\r\n const sourceContent = fs.readFileSync(sourcePath);\r\n const newHash = sha256(sourceContent);\r\n\r\n // Check if file changed from what we installed\r\n const trackedFile = trackedPreset.files.find((f) => f.target === fileEntry.target);\r\n if (trackedFile && trackedFile.contentHash === newHash) {\r\n // Bundled file hasn't changed since last install\r\n continue;\r\n }\r\n\r\n // File has changed in the new version - resolve conflict\r\n const action = await resolveConflict({\r\n target: targetPath,\r\n sourceContent,\r\n mode,\r\n sessionState,\r\n prompt: conflictPrompt,\r\n showDiff: (t, s) => showDiff(t, s),\r\n });\r\n\r\n switch (action) {\r\n case 'WRITE_NEW':\r\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'OVERWRITE_WITH_BACKUP':\r\n backup(workspaceRoot, targetPath, timestamp);\r\n atomicWrite(targetPath, sourceContent.toString('utf-8'));\r\n if (fileEntry.executable && process.platform !== 'win32') {\r\n try { fs.chmodSync(targetPath, 0o755); } catch { /* */ }\r\n }\r\n totalUpdated++;\r\n break;\r\n case 'SKIP':\r\n totalSkipped++;\r\n break;\r\n case 'NO_OP':\r\n break;\r\n }\r\n\r\n updatedFiles.push({\r\n target: fileEntry.target,\r\n sourcePreset: bundled.manifest.name,\r\n contentHash: newHash,\r\n installedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n // Bump version in tracking\r\n trackedPreset.version = bundledVersion;\r\n trackedPreset.updatedAt = new Date().toISOString();\r\n // Update file hashes for changed files\r\n for (const uf of updatedFiles) {\r\n const idx = trackedPreset.files.findIndex((f) => f.target === uf.target);\r\n if (idx >= 0) {\r\n trackedPreset.files[idx] = uf;\r\n } else {\r\n trackedPreset.files.push(uf);\r\n }\r\n }\r\n }\r\n\r\n // Write updated tracking\r\n tracking.kitVersion = getKitVersion();\r\n tracking.updatedAt = new Date().toISOString();\r\n TrackingStore.write(workspaceRoot, tracking);\r\n\r\n if (totalUpdated === 0 && totalSkipped === 0) {\r\n logger.success('All presets are up to date.');\r\n } else {\r\n logger.success(`Update complete: ${totalUpdated} files updated, ${totalSkipped} skipped.`);\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport process from 'node:process';\r\n\r\nimport { restore, listTimestamps } from '../core/BackupManager.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface RestoreOptions {\r\n timestamp?: string;\r\n list?: boolean;\r\n}\r\n\r\nexport function registerRestoreCommand(program: Command): void {\r\n program\r\n .command('restore')\r\n .description('Restore files from backup')\r\n .option('--timestamp <ts>', 'Restore from specific backup timestamp')\r\n .option('--list', 'List available backup timestamps')\r\n .action((opts: RestoreOptions) => {\r\n try {\r\n runRestore(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runRestore(opts: RestoreOptions): void {\r\n const workspaceRoot = process.cwd();\r\n\r\n // --list flag: print available timestamps and exit\r\n if (opts.list) {\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.info('No backups available.');\r\n process.exit(0);\r\n }\r\n process.stdout.write(`${color.bold('Available backups')}:\\n`);\r\n for (const ts of timestamps) {\r\n process.stdout.write(` ${ts}\\n`);\r\n }\r\n process.exit(0);\r\n }\r\n\r\n // Check if any backups exist\r\n const timestamps = listTimestamps(workspaceRoot);\r\n if (timestamps.length === 0) {\r\n logger.error('No backups found. Nothing to restore.');\r\n process.exit(1);\r\n }\r\n\r\n // Restore from specified timestamp or latest\r\n const restored = restore(workspaceRoot, opts.timestamp);\r\n\r\n if (restored.length === 0) {\r\n logger.info('No files to restore from backup.');\r\n process.exit(0);\r\n }\r\n\r\n process.stdout.write(`${color.bold('Restored files')}:\\n`);\r\n for (const file of restored) {\r\n process.stdout.write(` ${color.green('+')} ${file}\\n`);\r\n }\r\n logger.success(`Restored ${restored.length} files.`);\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport process from 'node:process';\r\n\r\nimport * as TrackingStore from '../core/TrackingStore.js';\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\ninterface DoctorOptions {\r\n fix?: boolean;\r\n}\r\n\r\ntype CheckResult = 'PASS' | 'FAIL' | 'WARN';\r\n\r\ninterface CheckReport {\r\n name: string;\r\n result: CheckResult;\r\n message: string;\r\n fixable?: boolean;\r\n fixAction?: () => void;\r\n}\r\n\r\nexport function registerDoctorCommand(program: Command): void {\r\n program\r\n .command('doctor')\r\n .description('Run workspace health checks')\r\n .option('--fix', 'Auto-fix fixable issues')\r\n .action((opts: DoctorOptions) => {\r\n try {\r\n runDoctor(opts);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nfunction runDoctor(opts: DoctorOptions): void {\r\n const workspaceRoot = process.cwd();\r\n const checks: CheckReport[] = [];\r\n\r\n // (a) Node >= 18\r\n checks.push(checkNodeVersion());\r\n\r\n // (b) .kiro/ exists\r\n checks.push(checkKiroDir(workspaceRoot));\r\n\r\n // (c) mcp.json valid\r\n checks.push(checkMcpJson(workspaceRoot));\r\n\r\n // (d) tracking valid\r\n checks.push(checkTracking(workspaceRoot));\r\n\r\n // (e) tracked files exist\r\n checks.push(checkTrackedFiles(workspaceRoot));\r\n\r\n // (f) no trailing whitespace in steering front-matter\r\n checks.push(checkSteeringFrontMatter(workspaceRoot));\r\n\r\n // (g) metadata.json valid\r\n checks.push(checkMetadataJson(workspaceRoot));\r\n\r\n // (h) statusline exec bit (Unix)\r\n checks.push(checkStatuslineExecBit(workspaceRoot));\r\n\r\n // Print results\r\n let hasFail = false;\r\n for (const check of checks) {\r\n const tag = formatTag(check.result);\r\n process.stdout.write(`${tag} ${check.message}\\n`);\r\n\r\n if (check.result === 'FAIL') hasFail = true;\r\n\r\n // Apply fix if --fix and fixable\r\n if (opts.fix && check.fixable && check.fixAction) {\r\n check.fixAction();\r\n process.stdout.write(` ${color.green('Fixed!')}\\n`);\r\n }\r\n }\r\n\r\n process.exit(hasFail ? 1 : 0);\r\n}\r\n\r\nfunction formatTag(result: CheckResult): string {\r\n switch (result) {\r\n case 'PASS': return color.green('[PASS]');\r\n case 'FAIL': return color.red('[FAIL]');\r\n case 'WARN': return color.yellow('[WARN]');\r\n }\r\n}\r\n\r\nfunction checkNodeVersion(): CheckReport {\r\n const major = parseInt(process.versions.node.split('.')[0], 10);\r\n if (major >= 18) {\r\n return {\r\n name: 'node-version',\r\n result: 'PASS',\r\n message: `Node.js version >= 18 (${process.version})`,\r\n };\r\n }\r\n return {\r\n name: 'node-version',\r\n result: 'FAIL',\r\n message: `Node.js version >= 18 required (current: ${process.version})`,\r\n };\r\n}\r\n\r\nfunction checkKiroDir(workspaceRoot: string): CheckReport {\r\n const kiroDir = path.join(workspaceRoot, '.kiro');\r\n if (fs.existsSync(kiroDir) && fs.statSync(kiroDir).isDirectory()) {\r\n return { name: 'kiro-dir', result: 'PASS', message: '.kiro/ directory exists' };\r\n }\r\n return {\r\n name: 'kiro-dir',\r\n result: 'FAIL',\r\n message: '.kiro/ directory not found. Run `kiro-kit init` to create it.',\r\n };\r\n}\r\n\r\nfunction checkMcpJson(workspaceRoot: string): CheckReport {\r\n const mcpPath = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n if (!fs.existsSync(mcpPath)) {\r\n return { name: 'mcp-json', result: 'WARN', message: '.kiro/settings/mcp.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(mcpPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'mcp-json', result: 'PASS', message: '.kiro/settings/mcp.json is valid JSON' };\r\n } catch {\r\n return {\r\n name: 'mcp-json',\r\n result: 'FAIL',\r\n message: '.kiro/settings/mcp.json is not valid JSON',\r\n fixable: true,\r\n fixAction: () => {\r\n const mcpPath2 = path.join(workspaceRoot, '.kiro/settings/mcp.json');\r\n fs.writeFileSync(mcpPath2, '{\\n \"mcpServers\": {}\\n}\\n', 'utf-8');\r\n },\r\n };\r\n }\r\n}\r\n\r\nfunction checkTracking(workspaceRoot: string): CheckReport {\r\n const trackingPath = path.join(workspaceRoot, '.kiro/.kiro-kit.json');\r\n if (!fs.existsSync(trackingPath)) {\r\n return { name: 'tracking', result: 'WARN', message: '.kiro/.kiro-kit.json not found (no presets installed)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(trackingPath, 'utf-8');\r\n JSON.parse(content);\r\n return { name: 'tracking', result: 'PASS', message: '.kiro/.kiro-kit.json is valid' };\r\n } catch {\r\n return {\r\n name: 'tracking',\r\n result: 'FAIL',\r\n message: '.kiro/.kiro-kit.json is corrupt (invalid JSON)',\r\n };\r\n }\r\n}\r\n\r\nfunction checkTrackedFiles(workspaceRoot: string): CheckReport {\r\n let tracking: TrackingStore.TrackingData | null;\r\n try {\r\n tracking = TrackingStore.read(workspaceRoot);\r\n } catch {\r\n return { name: 'tracked-files', result: 'WARN', message: 'Cannot read tracking file, skipping file check' };\r\n }\r\n\r\n if (!tracking || tracking.presets.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'No tracked files to verify' };\r\n }\r\n\r\n const missing: string[] = [];\r\n for (const preset of tracking.presets) {\r\n for (const file of preset.files) {\r\n const fullPath = path.resolve(workspaceRoot, file.target);\r\n if (!fs.existsSync(fullPath)) {\r\n missing.push(file.target);\r\n }\r\n }\r\n }\r\n\r\n if (missing.length === 0) {\r\n return { name: 'tracked-files', result: 'PASS', message: 'All tracked files exist on disk' };\r\n }\r\n\r\n return {\r\n name: 'tracked-files',\r\n result: 'FAIL',\r\n message: `${missing.length} tracked file(s) missing: ${missing.slice(0, 3).join(', ')}${missing.length > 3 ? '...' : ''}`,\r\n };\r\n}\r\n\r\nfunction checkSteeringFrontMatter(workspaceRoot: string): CheckReport {\r\n const steeringDir = path.join(workspaceRoot, '.kiro/steering');\r\n if (!fs.existsSync(steeringDir)) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'No steering files to check' };\r\n }\r\n\r\n const issues: string[] = [];\r\n\r\n const walkDir = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkDir(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n checkSingleSteering(fullPath, issues);\r\n }\r\n }\r\n };\r\n\r\n walkDir(steeringDir);\r\n\r\n if (issues.length === 0) {\r\n return { name: 'steering-fm', result: 'PASS', message: 'Steering front-matter has no trailing whitespace' };\r\n }\r\n\r\n return {\r\n name: 'steering-fm',\r\n result: 'WARN',\r\n message: `${issues.length} steering file(s) have trailing whitespace in front-matter`,\r\n fixable: true,\r\n fixAction: () => {\r\n fixSteeringWhitespace(steeringDir);\r\n },\r\n };\r\n}\r\n\r\nfunction checkSingleSteering(filePath: string, issues: string[]): void {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') return;\r\n\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) return;\r\n\r\n // Check for trailing whitespace in front-matter lines\r\n for (let i = 1; i < endIdx; i++) {\r\n if (lines[i] !== lines[i].trimEnd()) {\r\n issues.push(filePath);\r\n return;\r\n }\r\n }\r\n } catch { /* skip unreadable files */ }\r\n}\r\n\r\nfunction fixSteeringWhitespace(steeringDir: string): void {\r\n const walkAndFix = (dir: string): void => {\r\n let entries: fs.Dirent[];\r\n try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.isDirectory()) {\r\n walkAndFix(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\r\n const content = fs.readFileSync(fullPath, 'utf-8');\r\n const lines = content.split('\\n');\r\n if (lines[0]?.trim() !== '---') continue;\r\n let endIdx = -1;\r\n for (let i = 1; i < lines.length; i++) {\r\n if (lines[i]?.trim() === '---') { endIdx = i; break; }\r\n }\r\n if (endIdx === -1) continue;\r\n let changed = false;\r\n for (let i = 1; i < endIdx; i++) {\r\n const trimmed = lines[i].trimEnd();\r\n if (lines[i] !== trimmed) { lines[i] = trimmed; changed = true; }\r\n }\r\n if (changed) {\r\n fs.writeFileSync(fullPath, lines.join('\\n'), 'utf-8');\r\n }\r\n }\r\n }\r\n };\r\n walkAndFix(steeringDir);\r\n}\r\n\r\nfunction checkMetadataJson(workspaceRoot: string): CheckReport {\r\n const metaPath = path.join(workspaceRoot, '.kiro/metadata.json');\r\n if (!fs.existsSync(metaPath)) {\r\n return { name: 'metadata-json', result: 'WARN', message: '.kiro/metadata.json not found (optional)' };\r\n }\r\n try {\r\n const content = fs.readFileSync(metaPath, 'utf-8');\r\n const parsed = JSON.parse(content);\r\n if (!parsed.version || !parsed.name) {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json missing required fields (version, name)' };\r\n }\r\n return { name: 'metadata-json', result: 'PASS', message: '.kiro/metadata.json is valid' };\r\n } catch {\r\n return { name: 'metadata-json', result: 'FAIL', message: '.kiro/metadata.json is not valid JSON' };\r\n }\r\n}\r\n\r\nfunction checkStatuslineExecBit(workspaceRoot: string): CheckReport {\r\n // Only relevant on Unix\r\n if (process.platform === 'win32') {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'Statusline exec bit check (skipped on Windows)' };\r\n }\r\n\r\n const shPath = path.join(workspaceRoot, '.kiro/statusline.sh');\r\n if (!fs.existsSync(shPath)) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'No statusline.sh to check' };\r\n }\r\n\r\n try {\r\n const stat = fs.statSync(shPath);\r\n const isExecutable = (stat.mode & 0o111) !== 0;\r\n if (isExecutable) {\r\n return { name: 'statusline-exec', result: 'PASS', message: 'statusline.sh is executable' };\r\n }\r\n return {\r\n name: 'statusline-exec',\r\n result: 'WARN',\r\n message: 'statusline.sh is not executable',\r\n fixable: true,\r\n fixAction: () => {\r\n fs.chmodSync(shPath, 0o755);\r\n },\r\n };\r\n } catch {\r\n return { name: 'statusline-exec', result: 'WARN', message: 'Cannot check statusline.sh permissions' };\r\n }\r\n}\r\n","import { Command } from 'commander';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport process from 'node:process';\r\n\r\nimport { logger } from '../utils/logger.js';\r\nimport { color } from '../utils/color.js';\r\n\r\nconst CONFIG_DIR = path.join(os.homedir(), '.kiro-kit');\r\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\r\n\r\ninterface TelemetryConfig {\r\n telemetry: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\nfunction readConfig(): TelemetryConfig {\r\n try {\r\n if (fs.existsSync(CONFIG_FILE)) {\r\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')) as TelemetryConfig;\r\n }\r\n } catch { /* ignore corrupt config */ }\r\n return { telemetry: false };\r\n}\r\n\r\nfunction writeConfig(config: TelemetryConfig): void {\r\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\r\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function registerTelemetryCommand(program: Command): void {\r\n const telemetry = program\r\n .command('telemetry')\r\n .description('Manage anonymous usage telemetry');\r\n\r\n telemetry\r\n .command('enable')\r\n .description('Opt in to anonymous telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = true;\r\n writeConfig(config);\r\n logger.success('Telemetry enabled. Anonymous usage data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('disable')\r\n .description('Opt out of telemetry')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n config.telemetry = false;\r\n writeConfig(config);\r\n logger.success('Telemetry disabled. No data will be collected.');\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n\r\n telemetry\r\n .command('status')\r\n .description('Show current telemetry status')\r\n .action(() => {\r\n try {\r\n const config = readConfig();\r\n const status = config.telemetry ? color.green('enabled') : color.yellow('disabled');\r\n process.stdout.write(`Telemetry: ${status}\\n`);\r\n process.stdout.write(`Config: ${CONFIG_FILE}\\n`);\r\n } catch (err: unknown) {\r\n logger.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n"],"mappings":";;;AAEA,SAAS,qBAAqB;AAC9B,OAAOA,eAAa;AACpB,SAAS,eAAe;;;ACHxB,OAAOC,UAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,cAAa;AACpB,OAAO,cAAc;AACrB,OAAOC,aAAY;;;ACLnB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,qBAAqB;;;ACF9B,SAAS,SAAS;AAClB,OAAO,QAAQ;AACf,OAAO,UAAU;;;ACGV,IAAM,UAAN,MAAM,iBAAgB,MAAM;AAAA,EACxB;AAAA,EACA;AAAA,EAET,YAAY,MAAc,SAAiB,YAAqB;AAC9D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,WAAO,eAAe,MAAM,SAAQ,SAAS;AAAA,EAC/C;AAAA,EAEA,SAAiB;AACf,QAAI,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK,OAAO;AAC3C,QAAI,KAAK,YAAY;AACnB,gBAAU;AAAA,gBAAmB,KAAK,UAAU;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AACF;AAGO,IAAM,aAAa;AAAA,EACxB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,aAAa;AACf;;;AD1CA,IAAM,qBAAqB,EAAE,KAAK;AAAA,EAChC;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAS;AAAA,EACpC;AAAA,EAAW;AAAA,EAAY;AAAA,EAAc;AAAA,EACrC;AAAA,EAAY;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAU;AACtD,CAAC;AAED,IAAM,mBAAmB,EAAE,KAAK;AAAA,EAC9B;AAAA,EAAY;AAAA,EAAW;AAAA,EAAa;AAAA,EAAU;AAAA,EAAU;AAC1D,CAAC;AAED,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,MAAM;AAAA,EACN,YAAY,EAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;AAED,IAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC;AAED,IAAM,kBAAkB,EAAE,MAAM;AAAA,EAC9B,EAAE,OAAO;AAAA,IACP,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,CAAC;AAAA,EACD,EAAE,OAAO,EAAE,IAAI,CAAC;AAClB,CAAC;AAED,IAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,UAAU;AAAA,EACV,OAAO,EAAE,MAAM,eAAe,EAAE,IAAI,CAAC;AAAA,EACrC,cAAc,EAAE,MAAM,gBAAgB,EAAE,SAAS;AAAA,EACjD,YAAY,EAAE,OAAO,kBAAkB,EAAE,SAAS;AAAA,EAClD,OAAO,EAAE,OAAO;AAAA,IACd,YAAY,EAAE,MAAM,eAAe,EAAE,SAAS;AAAA,IAC9C,aAAa,EAAE,MAAM,eAAe,EAAE,SAAS;AAAA,IAC/C,WAAW,EAAE,MAAM,eAAe,EAAE,SAAS;AAAA,IAC7C,YAAY,EAAE,MAAM,eAAe,EAAE,SAAS;AAAA,EAChD,CAAC,EAAE,SAAS;AAAA,EACZ,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,WAAW,EAAE,OAAO;AAAA,IAClB,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,IAChD,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,IAChD,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,IAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,IAC/C,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,EACrD,CAAC,EAAE,SAAS;AACd,CAAC;AAkBM,SAAS,MAAM,MAA+C;AACnE,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,IAAI;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,WAAW;AAAA,QACjB,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,eAAe,UAAU,GAAG;AAC3C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SAAS,OAAO,MAAM,OACzB,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAC9C,KAAK,IAAI;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,WAAW;AAAA,QACjB,SAAS,sCAAsC,MAAM;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,OAAO,OAAO,KAAK;AACxC;;;ADnGA,IAAM,YAAYC,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAE7D,SAAS,gBAAwB;AAG/B,QAAM,aAAa;AAAA,IACjBA,MAAK,QAAQ,WAAW,SAAS;AAAA;AAAA,IACjCA,MAAK,QAAQ,WAAW,YAAY;AAAA;AAAA,IACpCA,MAAK,QAAQ,WAAW,qBAAqB;AAAA;AAAA,EAC/C;AACA,aAAW,aAAa,YAAY;AAClC,QAAIC,IAAG,WAAW,SAAS,EAAG,QAAO;AAAA,EACvC;AACA,QAAM,IAAI;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;AAUO,SAAS,KAAK,MAA4B;AAC/C,QAAM,aAAa,cAAc;AACjC,QAAM,YAAYD,MAAK,KAAK,YAAY,IAAI;AAE5C,MAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX,WAAW,IAAI;AAAA,MACf,sBAAsB,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,eAAeD,MAAK,KAAK,WAAW,eAAe;AACzD,MAAI,CAACC,IAAG,WAAW,YAAY,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX,WAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,MAAMA,IAAG,aAAa,cAAc,OAAO;AACjD,QAAM,SAAS,MAAM,GAAG;AAExB,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX,WAAW,IAAI,2BAA2B,OAAO,MAAM,OAAO;AAAA,IAChE;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,OAAO,OAAO,KAAK,UAAU;AAClD;AAKO,SAAS,QAAQ,OAAiC;AACvD,SAAO,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AACjC;AAKO,SAAS,gBAA0B;AACxC,QAAM,aAAa,cAAc;AACjC,MAAI;AACF,WAAOA,IACJ,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC,EAC/C,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC,EACrC;AAAA,MAAO,CAAC,MACPA,IAAG,WAAWD,MAAK,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAAA,IAC9D,EACC,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACtB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AG3FA,OAAOE,SAAQ;AACf,OAAO,YAAY;AAsBnB,SAAS,OAAO,MAAsB;AACpC,SAAO,OAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC9D;AAKA,eAAsB,QAAQ,MAOF;AAC1B,QAAM,EAAE,QAAQ,eAAe,MAAM,cAAc,QAAQ,UAAAC,UAAS,IAAI;AAGxE,MAAI,CAACD,IAAG,WAAW,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AAGA,QAAM,iBAAiBA,IAAG,aAAa,MAAM;AAC7C,QAAM,cAAc,OAAO,cAAc;AACzC,QAAM,UAAU,OAAO,aAAa;AAGpC,MAAI,gBAAgB,SAAS;AAC3B,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,iBAAiB;AAC5B,WAAO;AAAA,EACT;AAGA,MAAI,aAAa,cAAc;AAC7B,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,QAAQ;AAEX,WAAO;AAAA,EACT;AAGA,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,OAAO,MAAM;AAElC,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,YAAIC,WAAU;AACZ,UAAAA,UAAS,QAAQ,aAAa;AAAA,QAChC;AACA;AAAA,MACF,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,qBAAa,eAAe;AAC5B,eAAO;AAAA,IACX;AAAA,EACF;AACF;;;AC/FA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGjB,IAAM,aAAa;AAKnB,SAAS,oBAA4B;AACnC,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,IAAI,IAAI,YAAY;AAC1B,QAAM,KAAK,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,QAAM,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,QAAM,KAAK,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACnD,QAAM,IAAI,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,KAAK,OAAO,IAAI,gBAAgB,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,SAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;AAC1C;AAKO,SAAS,OACd,eACA,QACA,WACQ;AACR,QAAM,KAAK,aAAa,kBAAkB;AAC1C,QAAM,UAAUC,MAAK,SAAS,eAAe,MAAM;AACnD,QAAM,aAAaA,MAAK,KAAK,eAAe,YAAY,IAAI,OAAO;AACnE,QAAM,YAAYA,MAAK,QAAQ,UAAU;AAEzC,EAAAC,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC3C,EAAAA,IAAG,aAAa,QAAQ,UAAU;AAElC,SAAO;AACT;AAOO,SAAS,QACd,eACA,WACU;AACV,QAAM,KAAK,aAAa,mBAAmB,aAAa;AAExD,MAAI,CAAC,IAAI;AACP,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAaD,MAAK,KAAK,eAAe,YAAY,EAAE;AAC1D,MAAI,CAACC,IAAG,WAAW,UAAU,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX,qBAAqB,EAAE;AAAA,MACvB,cAAc,eAAe,aAAa,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAE5B,QAAM,iBAAiB,CAAC,KAAa,cAA4B;AAC/D,UAAM,UAAUA,IAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAC3D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWD,MAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,YAAM,MAAM,YAAY,GAAG,SAAS,IAAI,MAAM,IAAI,KAAK,MAAM;AAC7D,UAAI,MAAM,YAAY,GAAG;AACvB,uBAAe,UAAU,GAAG;AAAA,MAC9B,WAAW,MAAM,OAAO,GAAG;AACzB,cAAM,aAAaA,MAAK,KAAK,eAAe,GAAG;AAC/C,cAAM,YAAYA,MAAK,QAAQ,UAAU;AACzC,QAAAC,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC3C,QAAAA,IAAG,aAAa,UAAU,UAAU;AACpC,iBAAS,KAAK,GAAG;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,YAAY,EAAE;AAC7B,SAAO;AACT;AAKO,SAAS,eAAe,eAAiC;AAC9D,QAAM,aAAaD,MAAK,KAAK,eAAe,UAAU;AACtD,MAAI,CAACC,IAAG,WAAW,UAAU,EAAG,QAAO,CAAC;AAExC,MAAI;AACF,WAAOA,IACJ,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC,EAC/C,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EACL,QAAQ;AAAA,EACb,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,mBAAmB,eAA2C;AACrE,QAAM,aAAa,eAAe,aAAa;AAC/C,SAAO,WAAW,CAAC;AACrB;;;ACjHA,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACDjB,OAAOC,cAAa;;;ACApB,OAAO,QAAQ;AACf,OAAOC,cAAa;AAEpB,IAAM,kBACJ,CAAC,CAACA,SAAQ,IAAI,UAAU,KACxBA,SAAQ,KAAK,SAAS,YAAY,KAClC,CAACA,SAAQ,OAAO;AAElB,SAAS,KAAK,IAAkD;AAC9D,SAAO,CAAC,MAAe,kBAAkB,IAAI,GAAG,CAAC;AACnD;AAEO,IAAM,QAAQ;AAAA,EACnB,OAAO,KAAK,GAAG,KAAK;AAAA,EACpB,KAAK,KAAK,GAAG,GAAG;AAAA,EAChB,QAAQ,KAAK,GAAG,MAAM;AAAA,EACtB,MAAM,KAAK,GAAG,IAAI;AAAA,EAClB,MAAM,KAAK,GAAG,IAAI;AAAA,EAClB,MAAM,KAAK,GAAG,IAAI;AAAA,EAClB,MAAM,KAAK,GAAG,IAAI;AAAA,EAClB,KAAK,KAAK,GAAG,GAAG;AAClB;;;ADlBA,IAAI,iBAAiB;AACrB,IAAI,eAAe;AAEZ,SAAS,WAAW,SAAwB;AACjD,mBAAiB;AACnB;AAEO,SAAS,SAAS,SAAwB;AAC/C,iBAAe;AACjB;AAEO,IAAM,SAAS;AAAA,EACpB,KAAK,KAAmB;AACtB,QAAI,CAAC,cAAc;AACjB,MAAAC,SAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,CAAI;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,QAAQ,KAAmB;AACzB,QAAI,CAAC,cAAc;AACjB,MAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,MAAM,GAAG,CAAC;AAAA,CAAI;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,KAAK,KAAmB;AACtB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,OAAO,MAAM,CAAC,IAAI,GAAG;AAAA,CAAI;AAAA,EACzD;AAAA,EAEA,MAAM,KAAmB;AACvB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG;AAAA,CAAI;AAAA,EACvD;AAAA,EAEA,MAAM,KAAmB;AACvB,QAAI,gBAAgB;AAClB,MAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,IAAI,GAAG;AAAA,CAAI;AAAA,IACzD;AAAA,EACF;AACF;;;ADnCA,IAAM,gBAAgB;AAwBtB,SAAS,gBAAgB,eAA+B;AACtD,SAAOC,MAAK,KAAK,eAAe,aAAa;AAC/C;AAOO,SAAS,KAAK,eAA4C;AAC/D,QAAM,WAAW,gBAAgB,aAAa;AAE9C,MAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,MAAMA,IAAG,aAAa,UAAU,OAAO;AAC7C,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,KAAK,6BAA6B,QAAQ,EAAE;AACnD,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,MAAM,eAAuB,MAA0B;AACrE,QAAM,WAAW,gBAAgB,aAAa;AAC9C,QAAM,MAAMD,MAAK,QAAQ,QAAQ;AACjC,EAAAC,IAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACrC,EAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AAC1E;AAKO,SAAS,aACd,MACA,QACc;AACd,QAAM,WAAW,KAAK,QAAQ,UAAU,CAAC,MAAM,EAAE,SAAS,OAAO,IAAI;AACrE,MAAI,YAAY,GAAG;AACjB,SAAK,QAAQ,QAAQ,IAAI;AAAA,EAC3B,OAAO;AACL,SAAK,QAAQ,KAAK,MAAM;AAAA,EAC1B;AACA,OAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AACxC,SAAO;AACT;AAKO,SAAS,cAAc,YAAkC;AAC9D,SAAO;AAAA,IACL;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,SAAS,CAAC;AAAA,EACZ;AACF;;;AG/FA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,IAAM,gBAAgB;AAqBf,SAAS,QAAQ,MAIX;AACX,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,YAAY,KAAK;AAAA,IACjB,SAAS,KAAK;AAAA,IACd,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,YAAY,KAAK;AAAA,EACnB;AACF;AAMO,SAASC,OAAM,eAAuB,UAA0B;AACrE,QAAM,WAAWD,MAAK,KAAK,eAAe,aAAa;AACvD,QAAM,MAAMA,MAAK,QAAQ,QAAQ;AACjC,EAAAD,IAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACrC,EAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,OAAO;AAC9E;AAKO,SAASG,MAAK,eAAwC;AAC3D,QAAM,WAAWF,MAAK,KAAK,eAAe,aAAa;AACvD,MAAI,CAACD,IAAG,WAAW,QAAQ,EAAG,QAAO;AACrC,MAAI;AACF,WAAO,KAAK,MAAMA,IAAG,aAAa,UAAU,OAAO,CAAC;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,aAAa,UAAoB,YAAoC;AACnF,QAAM,SAAS,CAAC,GAAG,SAAS,OAAO;AACnC,aAAW,KAAK,YAAY;AAC1B,UAAM,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI;AACrD,QAAI,OAAO,GAAG;AACZ,aAAO,GAAG,IAAI;AAAA,IAChB,OAAO;AACL,aAAO,KAAK,CAAC;AAAA,IACf;AAAA,EACF;AACA,SAAO,EAAE,GAAG,UAAU,SAAS,QAAQ,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAC7E;;;AC/EA,OAAOI,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,cAAa;AAEpB,IAAM,mBAAmB,CAAC,iBAAiB,iBAAiB,gBAAgB;AAKrE,SAAS,aAAqB;AACnC,UAAQA,SAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO;AAAA,IACT;AAEE,aAAO;AAAA,EACX;AACF;AAMO,SAAS,QACd,WACA,eACU;AACV,QAAM,YAAsB,CAAC;AAC7B,QAAM,YAAYD,MAAK,KAAK,eAAe,OAAO;AAClD,EAAAD,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAE3C,aAAW,QAAQ,kBAAkB;AACnC,UAAM,SAASC,MAAK,KAAK,WAAW,IAAI;AACxC,QAAI,CAACD,IAAG,WAAW,MAAM,EAAG;AAE5B,UAAM,SAASC,MAAK,KAAK,WAAW,IAAI;AACxC,IAAAD,IAAG,aAAa,QAAQ,MAAM;AAC9B,cAAU,KAAK,SAAS,IAAI,EAAE;AAG9B,QAAI,KAAK,SAAS,KAAK,KAAKE,SAAQ,aAAa,SAAS;AACxD,UAAI;AACF,QAAAF,IAAG,UAAU,QAAQ,GAAK;AAAA,MAC5B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,uBAAuB,UAA4D;AACjG,QAAM,aAAa,SAAS,YAAY;AACxC,MAAI,cAAc,WAAW,MAAM,MAAM,WAAW;AAClD,eAAW,SAAS,IAAI,WAAW;AAAA,EACrC;AACA,SAAO;AACT;;;ACxCO,SAAS,SACd,UACA,eACA,YACW;AACX,QAAM,SAAoB,WACtB,gBAAgB,QAAQ,IACxB,EAAE,YAAY,CAAC,EAAE;AAErB,MAAI,CAAC,OAAO,YAAY;AACtB,WAAO,aAAa,CAAC;AAAA,EACvB;AAEA,aAAW,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC7D,QAAI,cAAc,OAAO,YAAY;AACnC,aAAO;AAAA,QACL,eAAe,UAAU,gDACtB,aAAa,kBAAkB,UAAU,MAAM;AAAA,MACpD;AACA;AAAA,IACF;AACA,WAAO,WAAW,UAAU,IAAI,gBAAgB,GAAG;AAAA,EACrD;AAEA,SAAO;AACT;;;ACrBO,SAAS,cACd,UACA,QACgB;AAChB,QAAM,SAAyB,WAC3B,gBAAgB,QAAQ,IACxB,CAAC;AAGL,MAAI,OAAO,OAAO;AAChB,QAAI,CAAC,OAAO,MAAO,QAAO,QAAQ,CAAC;AAEnC,eAAW,OAAO,CAAC,cAAc,eAAe,WAAW,GAAY;AACrE,YAAM,YAAY,OAAO,MAAM,GAAG;AAClC,UAAI,CAAC,aAAa,UAAU,WAAW,EAAG;AAE1C,YAAM,cAA0B,OAAO,MAAM,GAAG,KAAmB,CAAC;AACpE,YAAM,mBAAmB,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAElE,iBAAW,QAAQ,WAAW;AAC5B,YAAI,CAAC,iBAAiB,IAAI,KAAK,OAAO,GAAG;AACvC,sBAAY,KAAK,gBAAgB,IAAI,CAAC;AAAA,QACxC;AAAA,MACF;AACA,MAAC,OAAO,MAAkC,GAAG,IAAI;AAAA,IACnD;AAAA,EACF;AAGA,MAAI,OAAO,eAAe,QAAW;AACnC,QAAI,OAAO,eAAe,QAAW;AACnC,aAAO,KAAK,oEAAoE;AAAA,IAClF;AACA,WAAO,aAAa,gBAAgB,OAAO,UAAU;AAAA,EACvD;AAEA,MAAI,OAAO,wBAAwB,QAAW;AAC5C,QAAI,OAAO,wBAAwB,UAAa,OAAO,wBAAwB,OAAO,qBAAqB;AACzG,aAAO,KAAK,iEAAiE;AAAA,IAC/E;AACA,WAAO,sBAAsB,OAAO;AAAA,EACtC;AAEA,SAAO;AACT;;;ACrEA,OAAOG,SAAQ;AACf,SAAS,2BAA2B;AAO7B,SAAS,SAAS,QAAgB,eAA6B;AACpE,QAAM,WAAWC,IAAG,WAAW,MAAM,IACjCA,IAAG,aAAa,QAAQ,OAAO,IAC/B;AACJ,QAAM,WAAW,cAAc,SAAS,OAAO;AAE/C,QAAM,QAAQ;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,KAAK,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,SAAS,EAAE;AAAA,EACf;AAEA,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AACnD,cAAQ,OAAO,MAAM,MAAM,MAAM,IAAI,IAAI,IAAI;AAAA,IAC/C,WAAW,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AAC1D,cAAQ,OAAO,MAAM,MAAM,IAAI,IAAI,IAAI,IAAI;AAAA,IAC7C,WAAW,KAAK,WAAW,IAAI,GAAG;AAChC,cAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,IAAI,IAAI;AAAA,IAC9C,OAAO;AACL,cAAQ,OAAO,MAAM,OAAO,IAAI;AAAA,IAClC;AAAA,EACF;AACF;;;ACpCA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,aAAY;AACnB,OAAO,QAAQ;AAGf,IAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,SAAS,MAAM,CAAC;AAOxD,SAAS,cAAc,UAA0B;AAC/C,QAAM,MAAMD,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,MAAI,cAAc,IAAI,GAAG,EAAG,QAAO;AACnC,SAAO,GAAG;AACZ;AAKA,SAAS,qBAAqB,SAAiB,UAA0B;AACvE,QAAM,MAAM,cAAc,QAAQ;AAElC,QAAM,aAAa,QAAQ,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,IAAI;AACrE,MAAI,QAAQ,KAAM,QAAO;AACzB,SAAO,WAAW,QAAQ,OAAO,GAAG;AACtC;AAOO,SAAS,YAAY,QAAgB,SAAgC;AAC1E,QAAM,MAAMA,MAAK,QAAQ,MAAM;AAC/B,EAAAD,IAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAErC,QAAM,OAAOE,QAAO,YAAY,CAAC,EAAE,SAAS,KAAK;AACjD,QAAM,UAAUD,MAAK,KAAK,KAAK,QAAQ,IAAI,EAAE;AAE7C,MAAI;AACJ,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,aAAa,qBAAqB,SAAS,MAAM;AACvD,WAAO,OAAO,KAAK,YAAY,OAAO;AAAA,EACxC,OAAO;AACL,WAAO;AAAA,EACT;AAEA,MAAI;AACF,IAAAD,IAAG,cAAc,SAAS,IAAI;AAC9B,IAAAA,IAAG,WAAW,SAAS,MAAM;AAAA,EAC/B,SAAS,KAAK;AAEZ,QAAI;AACF,MAAAA,IAAG,WAAW,OAAO;AAAA,IACvB,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACR;AACF;;;AC9DA,OAAOG,WAAU;AAoBV,SAAS,eAAe,eAAuB,QAAyB;AAC7E,QAAM,WAAWC,MAAK,QAAQ,eAAe,MAAM;AACnD,QAAM,OAAOA,MAAK,QAAQ,aAAa;AACvC,SAAO,SAAS,WAAW,OAAOA,MAAK,GAAG,KAAK,aAAa;AAC9D;;;AfMA,SAAS,qBAA2B;AAClC,EAAAC,SAAQ,GAAG,UAAU,MAAM;AACzB,IAAAA,SAAQ,KAAK,GAAG;AAAA,EAClB,CAAC;AACH;AAMA,eAAe,gBACb,OACmB;AACnB,QAAM,WAAW,oBAAI,IAAY;AACjC,MAAI,SAAS;AAEb,QAAM,KAAK,SAAS,gBAAgB;AAAA,IAClC,OAAOA,SAAQ;AAAA,IACf,QAAQA,SAAQ;AAAA,IAChB,UAAU;AAAA,EACZ,CAAC;AAGD,MAAI,CAACA,SAAQ,MAAM,OAAO;AAExB,OAAG,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,IAAI,QAAkB,CAACC,UAAS,WAAW;AAChD,QAAI,WAAW;AAEf,UAAM,SAAS,MAAY;AAEzB,UAAI,UAAU;AACZ,QAAAD,SAAQ,OAAO,MAAM,QAAQ,MAAM,SAAS,CAAC,GAAG;AAAA,MAClD;AACA,iBAAW;AAEX,MAAAA,SAAQ,OAAO;AAAA,QACb,YACE,MAAM,KAAK,8BAA8B,IACzC,MAAM,IAAI,sDAAsD,IAChE;AAAA,MACJ;AACA,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,SAAS,WAAW,IAAI,MAAM,KAAK,GAAG,IAAI;AAChD,cAAM,QAAQ,SAAS,IAAI,CAAC,IACxB,MAAM,MAAM,KAAK,IACjB;AACJ,cAAM,OAAO,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;AAChD,cAAM,OAAO,MAAM,IAAI,KAAK,MAAM,CAAC,EAAE,WAAW,EAAE;AAElD,QAAAA,SAAQ,OAAO,MAAM,YAAY,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI;AAAA,CAAI;AAAA,MACtE;AAAA,IACF;AAGA,WAAO;AAEP,IAAAA,SAAQ,MAAM,WAAW,IAAI;AAC7B,IAAAA,SAAQ,MAAM,OAAO;AACrB,IAAAA,SAAQ,MAAM,YAAY,OAAO;AAEjC,QAAI,YAAY;AAEhB,UAAM,SAAS,CAAC,QAAsB;AAEpC,UAAI,UAAU,SAAS,GAAG;AACxB,qBAAa;AACb,YAAI,UAAU,UAAU,GAAG;AACzB,gBAAM,MAAM;AACZ,sBAAY;AACZ,cAAI,QAAQ,YAAY,QAAQ,UAAU;AACxC,sBAAU,SAAS,IAAI,MAAM,UAAU,MAAM;AAC7C,mBAAO;AAAA,UACT,WAAW,QAAQ,YAAY,QAAQ,UAAU;AAC/C,sBAAU,SAAS,KAAK,MAAM;AAC9B,mBAAO;AAAA,UACT;AACA;AAAA,QACF;AACA;AAAA,MACF;AAGA,UAAI,QAAQ,QAAQ;AAClB,oBAAY;AACZ;AAAA,MACF;AAGA,UAAI,QAAQ,KAAQ;AAClB,QAAAA,SAAQ,MAAM,WAAW,KAAK;AAC9B,QAAAA,SAAQ,MAAM,eAAe,QAAQ,MAAM;AAC3C,QAAAA,SAAQ,MAAM,MAAM;AACpB,WAAG,MAAM;AACT,eAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B;AAAA,MACF;AAGA,UAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,QAAAA,SAAQ,MAAM,WAAW,KAAK;AAC9B,QAAAA,SAAQ,MAAM,eAAe,QAAQ,MAAM;AAC3C,QAAAA,SAAQ,MAAM,MAAM;AACpB,WAAG,MAAM;AACT,cAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,IAAI;AACrD,QAAAC,SAAQ,MAAM;AACd;AAAA,MACF;AAGA,UAAI,QAAQ,KAAK;AACf,YAAI,SAAS,IAAI,MAAM,GAAG;AACxB,mBAAS,OAAO,MAAM;AAAA,QACxB,OAAO;AACL,mBAAS,IAAI,MAAM;AAAA,QACrB;AACA,eAAO;AACP;AAAA,MACF;AAGA,UAAI,QAAQ,OAAO,QAAQ,KAAK;AAC9B,YAAI,SAAS,SAAS,MAAM,QAAQ;AAClC,mBAAS,MAAM;AAAA,QACjB,OAAO;AACL,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,UAAS,IAAI,CAAC;AAAA,QACvD;AACA,eAAO;AACP;AAAA,MACF;AAGA,UAAI,QAAQ,KAAK;AACf,kBAAU,SAAS,IAAI,MAAM,UAAU,MAAM;AAC7C,eAAO;AACP;AAAA,MACF;AAGA,UAAI,QAAQ,KAAK;AACf,kBAAU,SAAS,KAAK,MAAM;AAC9B,eAAO;AACP;AAAA,MACF;AAAA,IACF;AAEA,IAAAD,SAAQ,MAAM,GAAG,QAAQ,MAAM;AAAA,EACjC,CAAC;AACH;AAKA,eAAe,cAAc,SAAmC;AAC9D,MAAI,CAACA,SAAQ,MAAM,MAAO,QAAO;AAEjC,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAOD,SAAQ;AAAA,MACf,QAAQA,SAAQ;AAAA,IAClB,CAAC;AAED,OAAG,SAAS,GAAG,MAAM,KAAK,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,WAAW;AACxD,SAAG,MAAM;AACT,YAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,MAAAC,SAAQ,eAAe,MAAM,eAAe,OAAO,eAAe,KAAK;AAAA,IACzE,CAAC;AAED,OAAG,GAAG,UAAU,MAAM;AACpB,SAAG,MAAM;AACT,aAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAe,eACb,QAC+D;AAC/D,MAAI,CAACD,SAAQ,MAAM,MAAO,QAAO;AAEjC,QAAM,YAAYE,MAAK,SAASF,SAAQ,IAAI,GAAG,MAAM;AACrD,EAAAA,SAAQ,OAAO;AAAA,IACb;AAAA,EAAK,MAAM,OAAO,GAAG,CAAC,SAAS,MAAM,KAAK,SAAS,CAAC;AAAA,IAC7C,MAAM,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAIxB;AAEA,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAOD,SAAQ;AAAA,MACf,QAAQA,SAAQ;AAAA,IAClB,CAAC;AAED,OAAG,SAAS,wCAAwC,CAAC,WAAW;AAC9D,SAAG,MAAM;AACT,YAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,UAAI,MAAM,OAAO,MAAM,YAAa,CAAAC,SAAQ,WAAW;AAAA,eAC9C,MAAM,OAAO,MAAM,OAAQ,CAAAA,SAAQ,MAAM;AAAA,eACzC,MAAM,OAAO,MAAM,UAAU,MAAM,YAAa,CAAAA,SAAQ,WAAW;AAAA,eACnE,MAAM,OAAO,MAAM,SAAS,MAAM,gBAAiB,CAAAA,SAAQ,eAAe;AAAA,UAC9E,CAAAA,SAAQ,MAAM;AAAA,IACrB,CAAC;AAED,OAAG,GAAG,UAAU,MAAM;AACpB,SAAG,MAAM;AACT,aAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAASE,QAAO,MAAsB;AACpC,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC9D;AAKO,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,4CAA4C,EACxD,OAAO,aAAa,oCAAoC,EACxD,OAAO,mBAAmB,+BAA+B,eAAe,CAAC,CAAC,EAC1E,OAAO,WAAW,mCAAmC,EACrD,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,cAAc,qBAAqB,EAC1C,OAAO,OAAO,SAAsB;AACnC,uBAAmB;AACnB,QAAI;AACF,YAAM,QAAQ,IAAI;AAAA,IACpB,SAAS,KAAc;AACrB,UAAI,eAAe,SAAS,IAAI,YAAY,UAAU;AACpD,QAAAL,SAAQ,KAAK,GAAG;AAAA,MAClB;AACA,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,cAAc,OAAe,UAA8B;AAClE,SAAO,CAAC,GAAG,UAAU,KAAK;AAC5B;AAEA,eAAe,QAAQ,MAAkC;AACvD,QAAM,gBAAgBA,SAAQ,IAAI;AAClC,QAAM,YAAY,cAAc;AAGhC,MAAI;AAEJ,MAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AAEzC,eAAW,QAAQ,KAAK,QAAQ;AAC9B,UAAI,CAAC,UAAU,SAAS,IAAI,GAAG;AAC7B,eAAO;AAAA,UACL,WAAW,IAAI,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,QAChE;AACA,QAAAA,SAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,oBAAgB,KAAK;AAAA,EACvB,OAAO;AAEL,UAAM,QAAQ,UAAU,IAAI,CAAC,SAAS;AACpC,UAAI;AACF,cAAM,SAAS,KAAK,IAAI;AACxB,eAAO,EAAE,MAAM,aAAa,OAAO,SAAS,YAAY;AAAA,MAC1D,QAAQ;AACN,eAAO,EAAE,MAAM,aAAa,GAAG;AAAA,MACjC;AAAA,IACF,CAAC;AAED,oBAAgB,MAAM,gBAAgB,KAAK;AAAA,EAC7C;AAGA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,KAAK,+BAA+B;AAC3C,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,UAAU,QAAQ,aAAa;AAGrC,MAAI,aAAa;AACjB,aAAW,UAAU,SAAS;AAC5B,kBAAc,OAAO,SAAS,MAAM;AAAA,EACtC;AAGA,MAAI,CAAC,KAAK,KAAK;AACb,UAAM,YAAY,MAAM;AAAA,MACtB,kBAAkB,UAAU;AAAA,IAC9B;AACA,QAAI,CAAC,WAAW;AACd,aAAO,KAAK,YAAY;AACxB,MAAAA,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,OAAqB;AACzB,MAAI,KAAK,MAAO,QAAO;AAAA,WACd,KAAK,aAAc,QAAO;AAAA,WAC1B,KAAK,IAAK,QAAO;AAE1B,QAAM,eAA6B,EAAE,cAAc,MAAM;AACzD,QAAM,YAAYM,mBAAkB;AAGpC,QAAM,kBAA+C,CAAC;AACtD,MAAI,eAAe;AACnB,MAAI,eAAe;AAGnB,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,UAAU,KAAK,UAAU,IAAI;AAGrC,UAAM,eAAe,SAAS,MAAM;AAAA,MAClC,CAAC,MAAM,CAAC,CAAC,OAAO,YAAY,YAAY,EAAE,SAAS,EAAE,IAAI;AAAA,IAC3D;AACA,UAAM,WAAW,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK;AAC9D,UAAM,gBAAgB,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AACxE,UAAM,kBAAkB,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAG5E,eAAW,aAAa,cAAc;AACpC,YAAM,aAAaJ,MAAK,KAAK,WAAW,UAAU,MAAM;AACxD,YAAM,aAAaA,MAAK,QAAQ,eAAe,UAAU,MAAM;AAG/D,UAAI,CAAC,eAAe,eAAe,UAAU,MAAM,GAAG;AACpD,eAAO,KAAK,yBAAyB,UAAU,MAAM,EAAE;AACvD;AACA;AAAA,MACF;AAEA,UAAI,CAACK,KAAG,WAAW,UAAU,GAAG;AAC9B,eAAO,MAAM,wBAAwB,UAAU,EAAE;AACjD;AAAA,MACF;AAEA,YAAM,gBAAgBA,KAAG,aAAa,UAAU;AAEhD,YAAM,SAAS,MAAM,QAAgB;AAAA,QACnC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,UAAU,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,MACnC,CAAC;AAED,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,UAAAA,KAAG,UAAUL,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,sBAAY,YAAY,cAAc,SAAS,OAAO,CAAC;AAEvD,cAAI,UAAU,cAAcF,SAAQ,aAAa,SAAS;AACxD,gBAAI;AAAE,cAAAO,KAAG,UAAU,YAAY,GAAK;AAAA,YAAG,QAAQ;AAAA,YAAqB;AAAA,UACtE;AACA;AACA;AAAA,QACF,KAAK;AACH,iBAAO,eAAe,YAAY,SAAS;AAC3C,sBAAY,YAAY,cAAc,SAAS,OAAO,CAAC;AACvD,cAAI,UAAU,cAAcP,SAAQ,aAAa,SAAS;AACxD,gBAAI;AAAE,cAAAO,KAAG,UAAU,YAAY,GAAK;AAAA,YAAG,QAAQ;AAAA,YAAqB;AAAA,UACtE;AACA;AACA;AAAA,QACF,KAAK;AACH;AACA;AAAA,QACF,KAAK;AAEH;AAAA,MACJ;AAGA,UAAI,WAAW,QAAQ;AACrB,wBAAgB,KAAK;AAAA,UACnB,QAAQ,UAAU;AAAA,UAClB,cAAc,SAAS;AAAA,UACvB,aAAaJ,QAAO,aAAa;AAAA,UACjC,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,YAA+B,QAAQ,WAAW,aAAa;AACrE,sBAAgB,UAAU;AAC1B,iBAAW,KAAK,WAAW;AACzB,wBAAgB,KAAK;AAAA,UACnB,QAAQ;AAAA,UACR,cAAc,SAAS;AAAA,UACvB,aAAa;AAAA,UACb,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,KAAK,SAAS,YAAY;AAC9C,YAAM,UAAUD,MAAK,KAAK,eAAe,yBAAyB;AAClE,UAAI,cAAgC;AACpC,UAAIK,KAAG,WAAW,OAAO,GAAG;AAC1B,YAAI;AACF,wBAAc,KAAK,MAAMA,KAAG,aAAa,SAAS,OAAO,CAAC;AAAA,QAC5D,QAAQ;AACN,wBAAc;AAAA,QAChB;AAAA,MACF;AACA,YAAM,SAAS,SAAS,aAAa,SAAS,YAAY,SAAS,IAAI;AACvE,MAAAA,KAAG,UAAUL,MAAK,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,kBAAY,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAC3D;AAAA,IACF;AAGA,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,eAAeA,MAAK,KAAK,eAAe,qBAAqB;AACnE,UAAI,mBAA0C;AAC9C,UAAIK,KAAG,WAAW,YAAY,GAAG;AAC/B,YAAI;AACF,6BAAmB,KAAK;AAAA,YACtBA,KAAG,aAAa,cAAc,OAAO;AAAA,UACvC;AAAA,QACF,QAAQ;AACN,6BAAmB;AAAA,QACrB;AAAA,MACF;AAGA,YAAM,qBAAqBL,MAAK,KAAK,WAAW,eAAe;AAC/D,UAAIK,KAAG,WAAW,kBAAkB,GAAG;AACrC,cAAM,iBAAiB,KAAK;AAAA,UAC1BA,KAAG,aAAa,oBAAoB,OAAO;AAAA,QAC7C;AAGA,cAAM,mBAAsC;AAAA,UAC1C;AAAA,QACF;AAEA,cAAM,SAAS,cAAc,kBAAkB,gBAAgB;AAC/D,QAAAA,KAAG,UAAUL,MAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,oBAAY,cAAc,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAChE;AAAA,MACF;AAAA,IACF;AAGA,UAAM,mBAAmBA,MAAK,KAAK,WAAW,mBAAmB;AACjE,QAAIK,KAAG,WAAW,gBAAgB,GAAG;AACnC,YAAM,mBAAmBL,MAAK,KAAK,eAAe,yBAAyB;AAC3E,UAAI,CAACK,KAAG,WAAW,gBAAgB,GAAG;AACpC,QAAAA,KAAG,UAAUL,MAAK,QAAQ,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,QAAAK,KAAG,aAAa,kBAAkB,gBAAgB;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,cAAc;AACjC,QAAM,cAAc,QAAQ,IAAI,CAAC,OAAO;AAAA,IACtC,MAAM,EAAE,SAAS;AAAA,IACjB,SAAS,EAAE,SAAS;AAAA,EACtB,EAAE;AAEF,QAAM,eAA8BC,MAAK,aAAa;AACtD,QAAM,WAAW,eACE,aAAa,cAAc,WAAW,IACtC,QAAQ;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,IACZ,SAAS;AAAA,EACX,CAAC;AAEL,EAAeC,OAAM,eAAe,QAAQ;AAG5C,MAAI,eAA6B,KAAK,aAAa,KAAmB,cAAc,UAAU;AAE9F,aAAW,UAAU,SAAS;AAC5B,UAAM,cAAc,gBAAgB;AAAA,MAClC,CAAC,MAAM,EAAE,iBAAiB,OAAO,SAAS;AAAA,IAC5C;AACA,UAAM,gBAA6C;AAAA,MACjD,MAAM,OAAO,SAAS;AAAA,MACtB,SAAS,OAAO,SAAS;AAAA,MACzB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,OAAO;AAAA,IACT;AACA,mBAA6B,aAAa,cAAc,aAAa;AAAA,EACvE;AAEA,eAAa,aAAa;AAC1B,EAAc,MAAM,eAAe,YAAY;AAG/C,SAAO;AAAA,IACL,SAAS,YAAY,mBAAmB,YAAY;AAAA,EACtD;AACA,SAAO;AAAA,IACL,sBAAsB,cAAc,KAAK,IAAI,CAAC;AAAA,EAChD;AACF;AAEA,SAASH,qBAA4B;AACnC,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,IAAI,IAAI,YAAY;AAC1B,QAAM,KAAK,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,QAAM,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,QAAM,KAAK,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACnD,QAAM,IAAI,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,KAAK,OAAO,IAAI,gBAAgB,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,SAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;AAC1C;AAEA,SAAS,gBAAwB;AAC/B,MAAI;AACF,UAAM,UAAU,IAAI,IAAI,mBAAmB,YAAY,GAAG;AAC1D,UAAMI,OAAM,KAAK,MAAMH,KAAG,aAAa,SAAS,OAAO,CAAC;AACxD,WAAOG,KAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AgB3jBA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,cAAa;AACpB,OAAOC,aAAY;AAuBnB,SAASC,QAAO,MAAsB;AACpC,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC9D;AAEA,SAASC,qBAA4B;AACnC,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,IAAI,IAAI,YAAY;AAC1B,QAAM,KAAK,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,QAAM,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,QAAM,KAAK,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACnD,QAAM,IAAI,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,KAAK,OAAO,IAAI,gBAAgB,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,SAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;AAC1C;AAEA,SAASC,iBAAwB;AAC/B,MAAI;AACF,UAAM,UAAU,IAAI,IAAI,sBAAsB,YAAY,GAAG;AAC7D,UAAMC,OAAM,KAAK,MAAMC,KAAG,aAAa,SAAS,OAAO,CAAC;AACxD,WAAOD,KAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeE,gBACb,QAC+D;AAC/D,MAAI,CAACC,SAAQ,MAAM,MAAO,QAAO;AAEjC,QAAM,EAAE,SAASC,UAAS,IAAI,MAAM,OAAO,UAAe;AAC1D,QAAM,YAAYC,OAAK,SAASF,SAAQ,IAAI,GAAG,MAAM;AACrD,EAAAA,SAAQ,OAAO;AAAA,IACb;AAAA,EAAK,MAAM,OAAO,GAAG,CAAC,SAAS,MAAM,KAAK,SAAS,CAAC;AAAA,IAC7C,MAAM,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAIxB;AAEA,SAAO,IAAI,QAAQ,CAACG,aAAY;AAC9B,UAAM,KAAKF,UAAS,gBAAgB,EAAE,OAAOD,SAAQ,OAAO,QAAQA,SAAQ,OAAO,CAAC;AACpF,OAAG,SAAS,wCAAwC,CAAC,WAAW;AAC9D,SAAG,MAAM;AACT,YAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,UAAI,MAAM,OAAO,MAAM,YAAa,CAAAG,SAAQ,WAAW;AAAA,eAC9C,MAAM,OAAO,MAAM,OAAQ,CAAAA,SAAQ,MAAM;AAAA,eACzC,MAAM,OAAO,MAAM,UAAU,MAAM,YAAa,CAAAA,SAAQ,WAAW;AAAA,eACnE,MAAM,OAAO,MAAM,SAAS,MAAM,gBAAiB,CAAAA,SAAQ,eAAe;AAAA,UAC9E,CAAAA,SAAQ,MAAM;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,mBAAmBC,UAAwB;AACzD,EAAAA,SACG,QAAQ,cAAc,EACtB,YAAY,oCAAoC,EAChD,OAAO,aAAa,mBAAmB,EACvC,OAAO,WAAW,mCAAmC,EACrD,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,cAAc,qBAAqB,EAC1C,OAAO,OAAO,YAAoB,SAAqB;AACtD,QAAI;AACF,YAAM,OAAO,YAAY,IAAI;AAAA,IAC/B,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAJ,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,eAAe,OAAO,YAAoB,MAAiC;AACzE,QAAM,gBAAgBA,SAAQ,IAAI;AAClC,QAAM,YAAY,cAAc;AAGhC,MAAI,CAAC,UAAU,SAAS,UAAU,GAAG;AACnC,WAAO;AAAA,MACL,WAAW,UAAU,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,IACtE;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,UAAUE,OAAK,KAAK,eAAe,OAAO;AAChD,MAAI,CAACJ,KAAG,WAAW,OAAO,GAAG;AAC3B,IAAAA,KAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,WAAO,KAAK,2BAA2B;AAAA,EACzC;AAGA,QAAM,SAAS,KAAK,UAAU;AAG9B,MAAI,OAAqB;AACzB,MAAI,KAAK,MAAO,QAAO;AAAA,WACd,KAAK,aAAc,QAAO;AAAA,WAC1B,KAAK,IAAK,QAAO;AAE1B,QAAM,eAA6B,EAAE,cAAc,MAAM;AACzD,QAAM,YAAYH,mBAAkB;AACpC,QAAM,kBAA+C,CAAC;AACtD,MAAI,eAAe;AACnB,MAAI,eAAe;AAEnB,QAAM,EAAE,UAAU,KAAK,UAAU,IAAI;AAGrC,QAAM,eAAe,SAAS,MAAM;AAAA,IAClC,CAAC,MAAM,CAAC,CAAC,OAAO,YAAY,YAAY,EAAE,SAAS,EAAE,IAAI;AAAA,EAC3D;AACA,QAAM,kBAAkB,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAG5E,aAAW,aAAa,cAAc;AACpC,UAAM,aAAaO,OAAK,KAAK,WAAW,UAAU,MAAM;AACxD,UAAM,aAAaA,OAAK,QAAQ,eAAe,UAAU,MAAM;AAE/D,QAAI,CAAC,eAAe,eAAe,UAAU,MAAM,GAAG;AACpD,aAAO,KAAK,yBAAyB,UAAU,MAAM,EAAE;AACvD;AACA;AAAA,IACF;AAEA,QAAI,CAACJ,KAAG,WAAW,UAAU,GAAG;AAC9B,aAAO,MAAM,wBAAwB,UAAU,EAAE;AACjD;AAAA,IACF;AAEA,UAAM,gBAAgBA,KAAG,aAAa,UAAU;AAEhD,UAAM,SAAS,MAAM,QAAgB;AAAA,MACnC,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQC;AAAA,MACR,UAAU,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,IACnC,CAAC;AAED,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,QAAAD,KAAG,UAAUI,OAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,oBAAY,YAAY,cAAc,SAAS,OAAO,CAAC;AACvD,YAAI,UAAU,cAAcF,SAAQ,aAAa,SAAS;AACxD,cAAI;AAAE,YAAAF,KAAG,UAAU,YAAY,GAAK;AAAA,UAAG,QAAQ;AAAA,UAAqB;AAAA,QACtE;AACA;AACA;AAAA,MACF,KAAK;AACH,eAAO,eAAe,YAAY,SAAS;AAC3C,oBAAY,YAAY,cAAc,SAAS,OAAO,CAAC;AACvD,YAAI,UAAU,cAAcE,SAAQ,aAAa,SAAS;AACxD,cAAI;AAAE,YAAAF,KAAG,UAAU,YAAY,GAAK;AAAA,UAAG,QAAQ;AAAA,UAAqB;AAAA,QACtE;AACA;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AAAA,IACJ;AAEA,QAAI,WAAW,QAAQ;AACrB,sBAAgB,KAAK;AAAA,QACnB,QAAQ,UAAU;AAAA,QAClB,cAAc,SAAS;AAAA,QACvB,aAAaL,QAAO,aAAa;AAAA,QACjC,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,YAA+B,QAAQ,WAAW,aAAa;AACrE,oBAAgB,UAAU;AAC1B,eAAW,KAAK,WAAW;AACzB,sBAAgB,KAAK;AAAA,QACnB,QAAQ;AAAA,QACR,cAAc,SAAS;AAAA,QACvB,aAAa;AAAA,QACb,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,SAAS,YAAY;AACvB,UAAM,UAAUS,OAAK,KAAK,eAAe,yBAAyB;AAClE,QAAI,cAAgC;AACpC,QAAIJ,KAAG,WAAW,OAAO,GAAG;AAC1B,UAAI;AACF,sBAAc,KAAK,MAAMA,KAAG,aAAa,SAAS,OAAO,CAAC;AAAA,MAC5D,QAAQ;AAAE,sBAAc;AAAA,MAAM;AAAA,IAChC;AACA,UAAM,SAAS,SAAS,aAAa,SAAS,YAAY,SAAS,IAAI;AACvE,IAAAA,KAAG,UAAUI,OAAK,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,gBAAY,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAC3D;AAAA,EACF;AAGA,QAAM,qBAAqBA,OAAK,KAAK,WAAW,eAAe;AAC/D,MAAIJ,KAAG,WAAW,kBAAkB,GAAG;AACrC,UAAM,eAAeI,OAAK,KAAK,eAAe,qBAAqB;AACnE,QAAI,mBAA0C;AAC9C,QAAIJ,KAAG,WAAW,YAAY,GAAG;AAC/B,UAAI;AACF,2BAAmB,KAAK,MAAMA,KAAG,aAAa,cAAc,OAAO,CAAC;AAAA,MACtE,QAAQ;AAAE,2BAAmB;AAAA,MAAM;AAAA,IACrC;AACA,UAAM,iBAAiB,KAAK,MAAMA,KAAG,aAAa,oBAAoB,OAAO,CAAC;AAC9E,UAAM,mBAAsC;AAAA,MAC1C;AAAA,IACF;AACA,UAAM,SAAS,cAAc,kBAAkB,gBAAgB;AAC/D,IAAAA,KAAG,UAAUI,OAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,gBAAY,cAAc,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAChE;AAAA,EACF;AAGA,QAAM,aAAaN,eAAc;AACjC,QAAM,aAAa,EAAE,MAAM,SAAS,MAAM,SAAS,SAAS,QAAQ;AACpE,QAAM,eAA8BS,MAAK,aAAa;AACtD,QAAM,WAAW,eACE,aAAa,cAAc,CAAC,UAAU,CAAC,IACvC,QAAQ,EAAE,YAAY,YAAY,8CAA8C,SAAS,CAAC,UAAU,EAAE,CAAC;AAC1H,EAAeC,OAAM,eAAe,QAAQ;AAG5C,MAAI,eAA6B,KAAK,aAAa,KAAmB,cAAc,UAAU;AAC9F,QAAM,gBAA6C;AAAA,IACjD,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,OAAO;AAAA,EACT;AACA,iBAA6B,aAAa,cAAc,aAAa;AACrE,eAAa,aAAa;AAC1B,EAAc,MAAM,eAAe,YAAY;AAG/C,SAAO,QAAQ,SAAS,YAAY,mBAAmB,YAAY,WAAW;AAC9E,SAAO,KAAK,iBAAiB,UAAU,EAAE;AAC3C;;;ACnRA,OAAOC,cAAa;AAqBpB,SAAS,eAAe,OAAwD;AAC9E,QAAM,SAAiC;AAAA,IACrC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,KAAK;AAAA,EACP;AACA,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,QAAQ,QAAQ;AACpB,aAAO,EAAE,IAAI;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,UAAU,gBAAgB,EACjC,OAAO,CAAC,SAAsB;AAC7B,QAAI;AACF,cAAQ,IAAI;AAAA,IACd,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAC,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,QAAQ,MAAyB;AACxC,QAAM,YAAY,cAAc;AAChC,QAAM,YAA6B,CAAC;AAEpC,aAAW,QAAQ,WAAW;AAC5B,QAAI;AACF,YAAM,SAAS,KAAK,IAAI;AACxB,YAAM,SAAS,eAAe,OAAO,SAAS,KAAK;AACnD,gBAAU,KAAK;AAAA,QACb;AAAA,QACA,aAAa,OAAO,SAAS;AAAA,QAC7B,QAAQ,OAAO,OAAO;AAAA,QACtB,QAAQ,OAAO,OAAO;AAAA,QACtB,UAAU,OAAO,SAAS;AAAA,QAC1B,OAAO,OAAO,MAAM;AAAA,QACpB,WAAW,OAAO,UAAU;AAAA,QAC5B,KAAK,OAAO,KAAK,OAAO,SAAS,cAAc,CAAC,CAAC,EAAE;AAAA,MACrD,CAAC;AAAA,IACH,QAAQ;AACN,gBAAU,KAAK;AAAA,QACb;AAAA,QACA,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,QACX,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,KAAK,MAAM;AACb,IAAAA,SAAQ,OAAO,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,IAAI,IAAI;AAC9D;AAAA,EACF;AAGA,aAAW,KAAK,WAAW;AACzB,UAAM,UAAU,MAAM,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC;AAC5C,UAAM,UAAU,MAAM,IAAI,KAAK,EAAE,WAAW,EAAE;AAC9C,IAAAA,SAAQ,OAAO,MAAM,KAAK,OAAO,IAAI,OAAO;AAAA,CAAI;AAChD,UAAM,SAAS,GAAG,EAAE,MAAM,YAAY,EAAE,MAAM,YAAY,EAAE,QAAQ,cAAc,EAAE,KAAK,WAAW,EAAE,SAAS,eAAe,EAAE,GAAG;AACnI,IAAAA,SAAQ,OAAO,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC;AAAA,CAAI;AAAA,EACjE;AACF;;;AClGA,OAAOC,cAAa;AAwBb,SAAS,oBAAoBC,UAAwB;AAC1D,EAAAA,SACG,QAAQ,eAAe,EACvB,YAAY,kCAAkC,EAC9C,OAAO,UAAU,gBAAgB,EACjC,OAAO,CAAC,YAAoB,SAAsB;AACjD,QAAI;AACF,cAAQ,YAAY,IAAI;AAAA,IAC1B,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAC,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,QAAQ,YAAoB,MAAyB;AAC5D,QAAM,YAAY,cAAc;AAEhC,MAAI,CAAC,UAAU,SAAS,UAAU,GAAG;AACnC,WAAO;AAAA,MACL,WAAW,UAAU,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,IACtE;AACA,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,EAAE,SAAS,IAAI;AAErB,QAAM,SAAS,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACnF,QAAM,SAAS,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACnF,QAAM,WAAW,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACvF,QAAM,YAAY,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACzF,QAAM,QAAQ,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACjF,QAAM,aAAa,OAAO,KAAK,SAAS,cAAc,CAAC,CAAC;AAExD,QAAM,OAAmB;AAAA,IACvB,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,aAAa,SAAS;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS,MAAM,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,QAAQ,MAAM,EAAE,KAAK,EAAE;AAAA,IACvF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,KAAK,MAAM;AACb,IAAAA,SAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AACzD;AAAA,EACF;AAGA,EAAAA,SAAQ,OAAO,MAAM;AAAA,EAAK,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,OAAO;AAAA,CAAI;AAC5E,EAAAA,SAAQ,OAAO,MAAM,GAAG,SAAS,WAAW;AAAA;AAAA,CAAM;AAClD,EAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,IAAI,WAAW,CAAC,IAAI,SAAS,QAAQ;AAAA,CAAI;AACvE,EAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,IAAI,cAAc,CAAC,IAAI,SAAS,MAAM,MAAM;AAAA;AAAA,CAAM;AAEhF,MAAI,WAAW,SAAS,GAAG;AACzB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,aAAa,CAAC,KAAK,WAAW,MAAM;AAAA,CAAM;AAC7E,eAAW,KAAK,YAAY;AAC1B,MAAAA,SAAQ,OAAO,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACnC;AACA,IAAAA,SAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,QAAQ,CAAC,KAAK,OAAO,MAAM;AAAA,CAAM;AACpE,eAAW,KAAK,QAAQ;AACtB,MAAAA,SAAQ,OAAO,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACnC;AACA,IAAAA,SAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,QAAQ,CAAC,KAAK,OAAO,MAAM;AAAA,CAAM;AACpE,eAAW,KAAK,QAAQ;AACtB,MAAAA,SAAQ,OAAO,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACnC;AACA,IAAAA,SAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,UAAU,CAAC,KAAK,SAAS,MAAM;AAAA,CAAM;AACxE,eAAW,KAAK,UAAU;AACxB,MAAAA,SAAQ,OAAO,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACnC;AACA,IAAAA,SAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,WAAW,CAAC,KAAK,UAAU,MAAM;AAAA,CAAM;AAC1E,eAAW,KAAK,WAAW;AACzB,MAAAA,SAAQ,OAAO,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACnC;AACA,IAAAA,SAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,IAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,KAAK,MAAM,MAAM;AAAA,CAAM;AAClE,eAAW,KAAK,OAAO;AACrB,MAAAA,SAAQ,OAAO,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,IACnC;AACA,IAAAA,SAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAGA,EAAAA,SAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,cAAc,CAAC;AAAA,CAAK;AACvD,aAAW,KAAK,SAAS,OAAO;AAC9B,IAAAA,SAAQ,OAAO,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM;AAAA,CAAI;AAAA,EACxE;AACF;;;ACzIA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,cAAa;AACpB,OAAOC,aAAY;AAkBnB,SAASC,QAAO,MAAsB;AACpC,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC9D;AAEA,SAASC,qBAA4B;AACnC,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,IAAI,IAAI,YAAY;AAC1B,QAAM,KAAK,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,QAAM,IAAI,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,QAAM,KAAK,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACnD,QAAM,IAAI,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,KAAK,OAAO,IAAI,gBAAgB,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,SAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;AAC1C;AAEA,SAASC,iBAAwB;AAC/B,MAAI;AACF,UAAM,UAAU,IAAI,IAAI,sBAAsB,YAAY,GAAG;AAC7D,UAAMC,OAAM,KAAK,MAAMC,KAAG,aAAa,SAAS,OAAO,CAAC;AACxD,WAAOD,KAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeE,gBACb,QAC+D;AAC/D,MAAI,CAACC,SAAQ,MAAM,MAAO,QAAO;AAEjC,QAAM,EAAE,SAASC,UAAS,IAAI,MAAM,OAAO,UAAe;AAC1D,QAAM,YAAYC,OAAK,SAASF,SAAQ,IAAI,GAAG,MAAM;AACrD,EAAAA,SAAQ,OAAO;AAAA,IACb;AAAA,EAAK,MAAM,OAAO,GAAG,CAAC,SAAS,MAAM,KAAK,SAAS,CAAC;AAAA,IAC7C,MAAM,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAIxB;AAEA,SAAO,IAAI,QAAQ,CAACG,aAAY;AAC9B,UAAM,KAAKF,UAAS,gBAAgB,EAAE,OAAOD,SAAQ,OAAO,QAAQA,SAAQ,OAAO,CAAC;AACpF,OAAG,SAAS,wCAAwC,CAAC,WAAW;AAC9D,SAAG,MAAM;AACT,YAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,UAAI,MAAM,OAAO,MAAM,YAAa,CAAAG,SAAQ,WAAW;AAAA,eAC9C,MAAM,OAAO,MAAM,OAAQ,CAAAA,SAAQ,MAAM;AAAA,eACzC,MAAM,OAAO,MAAM,UAAU,MAAM,YAAa,CAAAA,SAAQ,WAAW;AAAA,eACnE,MAAM,OAAO,MAAM,SAAS,MAAM,gBAAiB,CAAAA,SAAQ,eAAe;AAAA,UAC9E,CAAAA,SAAQ,MAAM;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,sBAAsBC,UAAwB;AAC5D,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,oDAAoD,EAChE,OAAO,aAAa,wCAAwC,EAC5D,OAAO,WAAW,2CAA2C,EAC7D,OAAO,mBAAmB,wBAAwB,EAClD,OAAO,OAAO,SAAwB;AACrC,QAAI;AACF,YAAM,UAAU,IAAI;AAAA,IACtB,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAJ,SAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,eAAe,UAAU,MAAoC;AAC3D,QAAM,gBAAgBA,SAAQ,IAAI;AAGlC,QAAM,WAAyB,KAAK,aAAa;AACjD,MAAI,CAAC,YAAY,SAAS,QAAQ,WAAW,GAAG;AAC9C,WAAO,KAAK,0CAA0C;AACtD,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,OAAqB;AACzB,MAAI,KAAK,MAAO,QAAO;AAAA,WACd,KAAK,aAAc,QAAO;AAAA,WAC1B,KAAK,IAAK,QAAO;AAE1B,QAAM,eAA6B,EAAE,cAAc,MAAM;AACzD,QAAM,YAAYL,mBAAkB;AACpC,MAAI,eAAe;AACnB,MAAI,eAAe;AAEnB,aAAW,iBAAiB,SAAS,SAAS;AAC5C,QAAI;AACJ,QAAI;AACF,gBAAU,KAAK,cAAc,IAAI;AAAA,IACnC,QAAQ;AACN,aAAO,KAAK,WAAW,cAAc,IAAI,2CAA2C;AACpF;AAAA,IACF;AAEA,UAAM,iBAAiB,QAAQ,SAAS;AACxC,QAAI,mBAAmB,cAAc,SAAS;AAC5C,aAAO,MAAM,WAAW,cAAc,IAAI,qBAAqB,cAAc,IAAI;AACjF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,YAAY,MAAM,KAAK,cAAc,IAAI,CAAC,MAAM,cAAc,OAAO,QAAQ,cAAc;AAAA,IAC7F;AAGA,UAAM,YAAY,QAAQ;AAC1B,UAAM,eAA4C,CAAC;AAEnD,eAAW,aAAa,QAAQ,SAAS,OAAO;AAC9C,UAAI,CAAC,OAAO,YAAY,YAAY,EAAE,SAAS,UAAU,IAAI,EAAG;AAEhE,YAAM,aAAaO,OAAK,KAAK,WAAW,UAAU,MAAM;AACxD,YAAM,aAAaA,OAAK,QAAQ,eAAe,UAAU,MAAM;AAE/D,UAAI,CAAC,eAAe,eAAe,UAAU,MAAM,EAAG;AACtD,UAAI,CAACJ,KAAG,WAAW,UAAU,EAAG;AAEhC,YAAM,gBAAgBA,KAAG,aAAa,UAAU;AAChD,YAAM,UAAUL,QAAO,aAAa;AAGpC,YAAM,cAAc,cAAc,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,UAAU,MAAM;AACjF,UAAI,eAAe,YAAY,gBAAgB,SAAS;AAEtD;AAAA,MACF;AAGA,YAAM,SAAS,MAAM,QAAgB;AAAA,QACnC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQM;AAAA,QACR,UAAU,CAAC,GAAG,MAAM,SAAS,GAAG,CAAC;AAAA,MACnC,CAAC;AAED,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,UAAAD,KAAG,UAAUI,OAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,sBAAY,YAAY,cAAc,SAAS,OAAO,CAAC;AACvD,cAAI,UAAU,cAAcF,SAAQ,aAAa,SAAS;AACxD,gBAAI;AAAE,cAAAF,KAAG,UAAU,YAAY,GAAK;AAAA,YAAG,QAAQ;AAAA,YAAQ;AAAA,UACzD;AACA;AACA;AAAA,QACF,KAAK;AACH,iBAAO,eAAe,YAAY,SAAS;AAC3C,sBAAY,YAAY,cAAc,SAAS,OAAO,CAAC;AACvD,cAAI,UAAU,cAAcE,SAAQ,aAAa,SAAS;AACxD,gBAAI;AAAE,cAAAF,KAAG,UAAU,YAAY,GAAK;AAAA,YAAG,QAAQ;AAAA,YAAQ;AAAA,UACzD;AACA;AACA;AAAA,QACF,KAAK;AACH;AACA;AAAA,QACF,KAAK;AACH;AAAA,MACJ;AAEA,mBAAa,KAAK;AAAA,QAChB,QAAQ,UAAU;AAAA,QAClB,cAAc,QAAQ,SAAS;AAAA,QAC/B,aAAa;AAAA,QACb,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACtC,CAAC;AAAA,IACH;AAGA,kBAAc,UAAU;AACxB,kBAAc,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEjD,eAAW,MAAM,cAAc;AAC7B,YAAM,MAAM,cAAc,MAAM,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;AACvE,UAAI,OAAO,GAAG;AACZ,sBAAc,MAAM,GAAG,IAAI;AAAA,MAC7B,OAAO;AACL,sBAAc,MAAM,KAAK,EAAE;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,WAAS,aAAaF,eAAc;AACpC,WAAS,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC5C,EAAc,MAAM,eAAe,QAAQ;AAE3C,MAAI,iBAAiB,KAAK,iBAAiB,GAAG;AAC5C,WAAO,QAAQ,6BAA6B;AAAA,EAC9C,OAAO;AACL,WAAO,QAAQ,oBAAoB,YAAY,mBAAmB,YAAY,WAAW;AAAA,EAC3F;AACF;;;AC7NA,OAAOS,eAAa;AAWb,SAAS,uBAAuBC,UAAwB;AAC7D,EAAAA,SACG,QAAQ,SAAS,EACjB,YAAY,2BAA2B,EACvC,OAAO,oBAAoB,wCAAwC,EACnE,OAAO,UAAU,kCAAkC,EACnD,OAAO,CAAC,SAAyB;AAChC,QAAI;AACF,iBAAW,IAAI;AAAA,IACjB,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAC,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,WAAW,MAA4B;AAC9C,QAAM,gBAAgBA,UAAQ,IAAI;AAGlC,MAAI,KAAK,MAAM;AACb,UAAMC,cAAa,eAAe,aAAa;AAC/C,QAAIA,YAAW,WAAW,GAAG;AAC3B,aAAO,KAAK,uBAAuB;AACnC,MAAAD,UAAQ,KAAK,CAAC;AAAA,IAChB;AACA,IAAAA,UAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,mBAAmB,CAAC;AAAA,CAAK;AAC5D,eAAW,MAAMC,aAAY;AAC3B,MAAAD,UAAQ,OAAO,MAAM,KAAK,EAAE;AAAA,CAAI;AAAA,IAClC;AACA,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,aAAa,eAAe,aAAa;AAC/C,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,MAAM,uCAAuC;AACpD,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,WAAW,QAAQ,eAAe,KAAK,SAAS;AAEtD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,KAAK,kCAAkC;AAC9C,IAAAA,UAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAAA,UAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,gBAAgB,CAAC;AAAA,CAAK;AACzD,aAAW,QAAQ,UAAU;AAC3B,IAAAA,UAAQ,OAAO,MAAM,KAAK,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI;AAAA,CAAI;AAAA,EACxD;AACA,SAAO,QAAQ,YAAY,SAAS,MAAM,SAAS;AACrD;;;AChEA,OAAOE,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,eAAa;AAoBb,SAAS,sBAAsBC,UAAwB;AAC5D,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,OAAO,SAAS,yBAAyB,EACzC,OAAO,CAAC,SAAwB;AAC/B,QAAI;AACF,gBAAU,IAAI;AAAA,IAChB,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAC,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,UAAU,MAA2B;AAC5C,QAAM,gBAAgBA,UAAQ,IAAI;AAClC,QAAM,SAAwB,CAAC;AAG/B,SAAO,KAAK,iBAAiB,CAAC;AAG9B,SAAO,KAAK,aAAa,aAAa,CAAC;AAGvC,SAAO,KAAK,aAAa,aAAa,CAAC;AAGvC,SAAO,KAAK,cAAc,aAAa,CAAC;AAGxC,SAAO,KAAK,kBAAkB,aAAa,CAAC;AAG5C,SAAO,KAAK,yBAAyB,aAAa,CAAC;AAGnD,SAAO,KAAK,kBAAkB,aAAa,CAAC;AAG5C,SAAO,KAAK,uBAAuB,aAAa,CAAC;AAGjD,MAAI,UAAU;AACd,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,UAAU,MAAM,MAAM;AAClC,IAAAA,UAAQ,OAAO,MAAM,GAAG,GAAG,IAAI,MAAM,OAAO;AAAA,CAAI;AAEhD,QAAI,MAAM,WAAW,OAAQ,WAAU;AAGvC,QAAI,KAAK,OAAO,MAAM,WAAW,MAAM,WAAW;AAChD,YAAM,UAAU;AAChB,MAAAA,UAAQ,OAAO,MAAM,UAAU,MAAM,MAAM,QAAQ,CAAC;AAAA,CAAI;AAAA,IAC1D;AAAA,EACF;AAEA,EAAAA,UAAQ,KAAK,UAAU,IAAI,CAAC;AAC9B;AAEA,SAAS,UAAU,QAA6B;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAQ,aAAO,MAAM,MAAM,QAAQ;AAAA,IACxC,KAAK;AAAQ,aAAO,MAAM,IAAI,QAAQ;AAAA,IACtC,KAAK;AAAQ,aAAO,MAAM,OAAO,QAAQ;AAAA,EAC3C;AACF;AAEA,SAAS,mBAAgC;AACvC,QAAMC,SAAQ,SAASD,UAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC9D,MAAIC,UAAS,IAAI;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,0BAA0BD,UAAQ,OAAO;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,4CAA4CA,UAAQ,OAAO;AAAA,EACtE;AACF;AAEA,SAAS,aAAa,eAAoC;AACxD,QAAM,UAAUE,OAAK,KAAK,eAAe,OAAO;AAChD,MAAIC,KAAG,WAAW,OAAO,KAAKA,KAAG,SAAS,OAAO,EAAE,YAAY,GAAG;AAChE,WAAO,EAAE,MAAM,YAAY,QAAQ,QAAQ,SAAS,0BAA0B;AAAA,EAChF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAEA,SAAS,aAAa,eAAoC;AACxD,QAAM,UAAUD,OAAK,KAAK,eAAe,yBAAyB;AAClE,MAAI,CAACC,KAAG,WAAW,OAAO,GAAG;AAC3B,WAAO,EAAE,MAAM,YAAY,QAAQ,QAAQ,SAAS,+CAA+C;AAAA,EACrG;AACA,MAAI;AACF,UAAM,UAAUA,KAAG,aAAa,SAAS,OAAO;AAChD,SAAK,MAAM,OAAO;AAClB,WAAO,EAAE,MAAM,YAAY,QAAQ,QAAQ,SAAS,wCAAwC;AAAA,EAC9F,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW,MAAM;AACf,cAAM,WAAWD,OAAK,KAAK,eAAe,yBAAyB;AACnE,QAAAC,KAAG,cAAc,UAAU,8BAA8B,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,eAAoC;AACzD,QAAM,eAAeD,OAAK,KAAK,eAAe,sBAAsB;AACpE,MAAI,CAACC,KAAG,WAAW,YAAY,GAAG;AAChC,WAAO,EAAE,MAAM,YAAY,QAAQ,QAAQ,SAAS,wDAAwD;AAAA,EAC9G;AACA,MAAI;AACF,UAAM,UAAUA,KAAG,aAAa,cAAc,OAAO;AACrD,SAAK,MAAM,OAAO;AAClB,WAAO,EAAE,MAAM,YAAY,QAAQ,QAAQ,SAAS,gCAAgC;AAAA,EACtF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,eAAoC;AAC7D,MAAI;AACJ,MAAI;AACF,eAAyB,KAAK,aAAa;AAAA,EAC7C,QAAQ;AACN,WAAO,EAAE,MAAM,iBAAiB,QAAQ,QAAQ,SAAS,iDAAiD;AAAA,EAC5G;AAEA,MAAI,CAAC,YAAY,SAAS,QAAQ,WAAW,GAAG;AAC9C,WAAO,EAAE,MAAM,iBAAiB,QAAQ,QAAQ,SAAS,6BAA6B;AAAA,EACxF;AAEA,QAAM,UAAoB,CAAC;AAC3B,aAAW,UAAU,SAAS,SAAS;AACrC,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,WAAWD,OAAK,QAAQ,eAAe,KAAK,MAAM;AACxD,UAAI,CAACC,KAAG,WAAW,QAAQ,GAAG;AAC5B,gBAAQ,KAAK,KAAK,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,MAAM,iBAAiB,QAAQ,QAAQ,SAAS,kCAAkC;AAAA,EAC7F;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,QAAQ,MAAM,6BAA6B,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,QAAQ,SAAS,IAAI,QAAQ,EAAE;AAAA,EACzH;AACF;AAEA,SAAS,yBAAyB,eAAoC;AACpE,QAAM,cAAcD,OAAK,KAAK,eAAe,gBAAgB;AAC7D,MAAI,CAACC,KAAG,WAAW,WAAW,GAAG;AAC/B,WAAO,EAAE,MAAM,eAAe,QAAQ,QAAQ,SAAS,6BAA6B;AAAA,EACtF;AAEA,QAAM,SAAmB,CAAC;AAE1B,QAAM,UAAU,CAAC,QAAsB;AACrC,QAAI;AACJ,QAAI;AACF,gBAAUA,KAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACvD,QAAQ;AAAE;AAAA,IAAQ;AAClB,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWD,OAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAI,MAAM,YAAY,GAAG;AACvB,gBAAQ,QAAQ;AAAA,MAClB,WAAW,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AACvD,4BAAoB,UAAU,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,WAAW;AAEnB,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,MAAM,eAAe,QAAQ,QAAQ,SAAS,mDAAmD;AAAA,EAC5G;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,OAAO,MAAM;AAAA,IACzB,SAAS;AAAA,IACT,WAAW,MAAM;AACf,4BAAsB,WAAW;AAAA,IACnC;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAAkB,QAAwB;AACrE,MAAI;AACF,UAAM,UAAUC,KAAG,aAAa,UAAU,OAAO;AACjD,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAI,MAAM,CAAC,GAAG,KAAK,MAAM,MAAO;AAEhC,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,MAAM,CAAC,GAAG,KAAK,MAAM,OAAO;AAAE,iBAAS;AAAG;AAAA,MAAO;AAAA,IACvD;AACA,QAAI,WAAW,GAAI;AAGnB,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,UAAI,MAAM,CAAC,MAAM,MAAM,CAAC,EAAE,QAAQ,GAAG;AACnC,eAAO,KAAK,QAAQ;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAA8B;AACxC;AAEA,SAAS,sBAAsB,aAA2B;AACxD,QAAM,aAAa,CAAC,QAAsB;AACxC,QAAI;AACJ,QAAI;AAAE,gBAAUA,KAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IAAG,QAAQ;AAAE;AAAA,IAAQ;AAChF,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWD,OAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAI,MAAM,YAAY,GAAG;AACvB,mBAAW,QAAQ;AAAA,MACrB,WAAW,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AACvD,cAAM,UAAUC,KAAG,aAAa,UAAU,OAAO;AACjD,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,YAAI,MAAM,CAAC,GAAG,KAAK,MAAM,MAAO;AAChC,YAAI,SAAS;AACb,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAI,MAAM,CAAC,GAAG,KAAK,MAAM,OAAO;AAAE,qBAAS;AAAG;AAAA,UAAO;AAAA,QACvD;AACA,YAAI,WAAW,GAAI;AACnB,YAAI,UAAU;AACd,iBAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,gBAAM,UAAU,MAAM,CAAC,EAAE,QAAQ;AACjC,cAAI,MAAM,CAAC,MAAM,SAAS;AAAE,kBAAM,CAAC,IAAI;AAAS,sBAAU;AAAA,UAAM;AAAA,QAClE;AACA,YAAI,SAAS;AACX,UAAAA,KAAG,cAAc,UAAU,MAAM,KAAK,IAAI,GAAG,OAAO;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,aAAW,WAAW;AACxB;AAEA,SAAS,kBAAkB,eAAoC;AAC7D,QAAM,WAAWD,OAAK,KAAK,eAAe,qBAAqB;AAC/D,MAAI,CAACC,KAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO,EAAE,MAAM,iBAAiB,QAAQ,QAAQ,SAAS,2CAA2C;AAAA,EACtG;AACA,MAAI;AACF,UAAM,UAAUA,KAAG,aAAa,UAAU,OAAO;AACjD,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,CAAC,OAAO,WAAW,CAAC,OAAO,MAAM;AACnC,aAAO,EAAE,MAAM,iBAAiB,QAAQ,QAAQ,SAAS,8DAA8D;AAAA,IACzH;AACA,WAAO,EAAE,MAAM,iBAAiB,QAAQ,QAAQ,SAAS,+BAA+B;AAAA,EAC1F,QAAQ;AACN,WAAO,EAAE,MAAM,iBAAiB,QAAQ,QAAQ,SAAS,wCAAwC;AAAA,EACnG;AACF;AAEA,SAAS,uBAAuB,eAAoC;AAElE,MAAIH,UAAQ,aAAa,SAAS;AAChC,WAAO,EAAE,MAAM,mBAAmB,QAAQ,QAAQ,SAAS,iDAAiD;AAAA,EAC9G;AAEA,QAAM,SAASE,OAAK,KAAK,eAAe,qBAAqB;AAC7D,MAAI,CAACC,KAAG,WAAW,MAAM,GAAG;AAC1B,WAAO,EAAE,MAAM,mBAAmB,QAAQ,QAAQ,SAAS,4BAA4B;AAAA,EACzF;AAEA,MAAI;AACF,UAAM,OAAOA,KAAG,SAAS,MAAM;AAC/B,UAAM,gBAAgB,KAAK,OAAO,QAAW;AAC7C,QAAI,cAAc;AAChB,aAAO,EAAE,MAAM,mBAAmB,QAAQ,QAAQ,SAAS,8BAA8B;AAAA,IAC3F;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW,MAAM;AACf,QAAAA,KAAG,UAAU,QAAQ,GAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,MAAM,mBAAmB,QAAQ,QAAQ,SAAS,yCAAyC;AAAA,EACtG;AACF;;;AC5UA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AACf,OAAOC,eAAa;AAKpB,IAAM,aAAaC,OAAK,KAAKC,IAAG,QAAQ,GAAG,WAAW;AACtD,IAAM,cAAcD,OAAK,KAAK,YAAY,aAAa;AAOvD,SAAS,aAA8B;AACrC,MAAI;AACF,QAAIE,KAAG,WAAW,WAAW,GAAG;AAC9B,aAAO,KAAK,MAAMA,KAAG,aAAa,aAAa,OAAO,CAAC;AAAA,IACzD;AAAA,EACF,QAAQ;AAAA,EAA8B;AACtC,SAAO,EAAE,WAAW,MAAM;AAC5B;AAEA,SAAS,YAAY,QAA+B;AAClD,EAAAA,KAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAAA,KAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC/E;AAEO,SAAS,yBAAyBC,UAAwB;AAC/D,QAAM,YAAYA,SACf,QAAQ,WAAW,EACnB,YAAY,kCAAkC;AAEjD,YACG,QAAQ,QAAQ,EAChB,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,aAAO,YAAY;AACnB,kBAAY,MAAM;AAClB,aAAO,QAAQ,4DAA4D;AAAA,IAC7E,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAC,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,YACG,QAAQ,SAAS,EACjB,YAAY,sBAAsB,EAClC,OAAO,MAAM;AACZ,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,aAAO,YAAY;AACnB,kBAAY,MAAM;AAClB,aAAO,QAAQ,gDAAgD;AAAA,IACjE,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,YACG,QAAQ,QAAQ,EAChB,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,YAAM,SAAS,OAAO,YAAY,MAAM,MAAM,SAAS,IAAI,MAAM,OAAO,UAAU;AAClF,MAAAA,UAAQ,OAAO,MAAM,cAAc,MAAM;AAAA,CAAI;AAC7C,MAAAA,UAAQ,OAAO,MAAM,WAAW,WAAW;AAAA,CAAI;AAAA,IACjD,SAAS,KAAc;AACrB,aAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,MAAAA,UAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AvBhEA,IAAM,QAAQ,SAASC,UAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC9D,IAAI,QAAQ,IAAI;AACd,EAAAA,UAAQ,OAAO;AAAA,IACb,6DACsBA,UAAQ,OAAO;AAAA;AAAA,EAEvC;AACA,EAAAA,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAErC,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,gEAAgE,EAC5E,QAAQ,IAAI,SAAS,eAAe;AAGvC,QAAQ,OAAO,aAAa,uBAAuB;AACnD,QAAQ,OAAO,WAAW,+BAA+B;AACzD,QAAQ,OAAO,cAAc,wBAAwB;AAGrD,oBAAoB,OAAO;AAC3B,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B,oBAAoB,OAAO;AAC3B,sBAAsB,OAAO;AAC7B,uBAAuB,OAAO;AAC9B,sBAAsB,OAAO;AAC7B,yBAAyB,OAAO;AAGhC,QAAQ,KAAK,aAAa,CAAC,gBAAgB;AACzC,QAAM,OAAO,YAAY,KAAK;AAC9B,MAAI,KAAK,SAAS,EAAG,YAAW,IAAI;AACpC,MAAI,KAAK,OAAO,EAAG,UAAS,IAAI;AAClC,CAAC;AAED,QAAQ,MAAMD,UAAQ,IAAI;","names":["process","fs","path","process","crypto","fs","path","path","fs","fs","showDiff","fs","path","path","fs","fs","path","process","process","process","path","fs","fs","path","write","read","fs","path","process","fs","fs","fs","path","crypto","path","path","process","resolve","path","sha256","crypto","program","generateTimestamp","fs","read","write","pkg","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","read","write","process","program","process","process","program","process","fs","path","process","crypto","sha256","crypto","generateTimestamp","getKitVersion","pkg","fs","conflictPrompt","process","readline","path","resolve","program","process","program","process","timestamps","fs","path","process","program","process","major","path","fs","fs","path","os","process","path","os","fs","program","process","process","require"]}
|