@lovehlmmm/primekit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +165 -0
- package/README.md +66 -0
- package/cli/dist/adapters/index.d.ts +5 -0
- package/cli/dist/adapters/index.js +55 -0
- package/cli/dist/commands/doctor.d.ts +1 -0
- package/cli/dist/commands/doctor.js +69 -0
- package/cli/dist/commands/import.d.ts +6 -0
- package/cli/dist/commands/import.js +81 -0
- package/cli/dist/commands/init.d.ts +8 -0
- package/cli/dist/commands/init.js +88 -0
- package/cli/dist/commands/list.d.ts +1 -0
- package/cli/dist/commands/list.js +39 -0
- package/cli/dist/commands/uninstall.d.ts +4 -0
- package/cli/dist/commands/uninstall.js +47 -0
- package/cli/dist/commands/update.d.ts +5 -0
- package/cli/dist/commands/update.js +15 -0
- package/cli/dist/index.d.ts +2 -0
- package/cli/dist/index.js +73 -0
- package/cli/dist/utils/backup.d.ts +2 -0
- package/cli/dist/utils/backup.js +22 -0
- package/cli/dist/utils/manifest.d.ts +16 -0
- package/cli/dist/utils/manifest.js +41 -0
- package/docs/ARCHITECTURE.md +34 -0
- package/docs/USAGE.md +60 -0
- package/package.json +48 -0
- package/skills/advise/SKILL.md +230 -0
- package/skills/agent-browser/SKILL.md +107 -0
- package/skills/agent-browser/references/.gitkeep +0 -0
- package/skills/agent-browser/references/agent-browser-vs-chrome-devtools.md +71 -0
- package/skills/agent-browser/references/browserbase-cloud-setup.md +161 -0
- package/skills/agentize/SKILL.md +312 -0
- package/skills/agentize/references/agent-centric-design.md +134 -0
- package/skills/agentize/references/auth-resolution-chain.md +95 -0
- package/skills/agentize/references/challenge-framework.md +68 -0
- package/skills/agentize/references/code-mode.md +106 -0
- package/skills/agentize/references/deployment-guide.md +94 -0
- package/skills/agentize/references/mcp-transports.md +139 -0
- package/skills/agentize/references/monorepo-layout.md +164 -0
- package/skills/agentize/references/oauth-streamable-http.md +110 -0
- package/skills/agentkit/SKILL.md +200 -0
- package/skills/agentkit/references/chaining-patterns.md +126 -0
- package/skills/agentkit/references/subagent-timing.md +107 -0
- package/skills/agentkit/references/task-taxonomy.md +63 -0
- package/skills/ai-artist/SKILL.md +132 -0
- package/skills/ai-artist/data/awesome-prompts.csv +3592 -0
- package/skills/ai-artist/data/platforms.csv +11 -0
- package/skills/ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ai-artist/references/domain-code.md +66 -0
- package/skills/ai-artist/references/domain-data.md +72 -0
- package/skills/ai-artist/references/domain-marketing.md +66 -0
- package/skills/ai-artist/references/domain-patterns.md +33 -0
- package/skills/ai-artist/references/domain-writing.md +68 -0
- package/skills/ai-artist/references/image-prompting.md +141 -0
- package/skills/ai-artist/references/llm-prompting.md +165 -0
- package/skills/ai-artist/references/nano-banana.md +136 -0
- package/skills/ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ai-artist/scripts/core.py +197 -0
- package/skills/ai-artist/scripts/generate.py +350 -0
- package/skills/ai-artist/scripts/search.py +147 -0
- package/skills/ai-multimodal/.env.example +13 -0
- package/skills/ai-multimodal/SKILL.md +234 -0
- package/skills/ai-multimodal/references/audio-processing.md +32 -0
- package/skills/ai-multimodal/references/image-generation.md +38 -0
- package/skills/ai-multimodal/references/minimax-generation.md +22 -0
- package/skills/ai-multimodal/references/music-generation.md +25 -0
- package/skills/ai-multimodal/references/video-analysis.md +27 -0
- package/skills/ai-multimodal/references/video-generation.md +28 -0
- package/skills/ai-multimodal/references/vision-understanding.md +27 -0
- package/skills/ai-multimodal/skill.yaml +3 -0
- package/skills/ak/SKILL.md +203 -0
- package/skills/ak/references/command-reference.md +189 -0
- package/skills/ask/SKILL.md +54 -0
- package/skills/autoresearch/SKILL.md +61 -0
- package/skills/backend-development/SKILL.md +102 -0
- package/skills/backend-development/references/backend-api-design.md +495 -0
- package/skills/backend-development/references/backend-architecture.md +454 -0
- package/skills/backend-development/references/backend-authentication.md +338 -0
- package/skills/backend-development/references/backend-code-quality.md +659 -0
- package/skills/backend-development/references/backend-debugging.md +904 -0
- package/skills/backend-development/references/backend-devops.md +494 -0
- package/skills/backend-development/references/backend-mindset.md +387 -0
- package/skills/backend-development/references/backend-performance.md +397 -0
- package/skills/backend-development/references/backend-security.md +290 -0
- package/skills/backend-development/references/backend-technologies.md +256 -0
- package/skills/backend-development/references/backend-testing.md +429 -0
- package/skills/better-auth/SKILL.md +220 -0
- package/skills/better-auth/references/advanced-features.md +553 -0
- package/skills/better-auth/references/database-integration.md +577 -0
- package/skills/better-auth/references/email-password-auth.md +416 -0
- package/skills/better-auth/references/oauth-providers.md +430 -0
- package/skills/better-auth/scripts/better_auth_init.py +521 -0
- package/skills/better-auth/scripts/requirements.txt +15 -0
- package/skills/better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/skills/bootstrap/SKILL.md +168 -0
- package/skills/bootstrap/references/shared-phases.md +56 -0
- package/skills/bootstrap/references/workflow-auto.md +55 -0
- package/skills/bootstrap/references/workflow-fast.md +53 -0
- package/skills/bootstrap/references/workflow-full.md +63 -0
- package/skills/bootstrap/references/workflow-parallel.md +63 -0
- package/skills/brainstorm/SKILL.md +249 -0
- package/skills/brainstorm/references/advisory-supervision.md +80 -0
- package/skills/brainstorm/references/ultra-verifier-mode.md +167 -0
- package/skills/bro/SKILL.md +32 -0
- package/skills/chrome-profile/LICENSE +22 -0
- package/skills/chrome-profile/SKILL.md +226 -0
- package/skills/chrome-profile/profiles.example.json +7 -0
- package/skills/chrome-profile/references/architecture.md +86 -0
- package/skills/chrome-profile/references/mcp-config-recipes.md +209 -0
- package/skills/chrome-profile/references/troubleshooting.md +85 -0
- package/skills/chrome-profile/scripts/chrome_profile_cli.py +876 -0
- package/skills/chrome-profile/scripts/install.cmd +52 -0
- package/skills/chrome-profile/scripts/install.sh +42 -0
- package/skills/chrome-profile/scripts/test_chrome_profile.py +397 -0
- package/skills/chrome-profile/scripts/uninstall.cmd +53 -0
- package/skills/chrome-profile/scripts/uninstall.sh +57 -0
- package/skills/clarify/SKILL.md +38 -0
- package/skills/code-review/SKILL.md +252 -0
- package/skills/code-review/references/checklist-workflow.md +100 -0
- package/skills/code-review/references/checklists/api.md +52 -0
- package/skills/code-review/references/checklists/base.md +100 -0
- package/skills/code-review/references/checklists/web-app.md +54 -0
- package/skills/code-review/references/code-review-reception.md +115 -0
- package/skills/code-review/references/codebase-scan-workflow.md +30 -0
- package/skills/code-review/references/edge-case-scouting.md +119 -0
- package/skills/code-review/references/input-mode-resolution.md +135 -0
- package/skills/code-review/references/parallel-review-workflow.md +77 -0
- package/skills/code-review/references/requesting-code-review.md +116 -0
- package/skills/code-review/references/spec-compliance-review.md +43 -0
- package/skills/code-review/references/task-management-reviews.md +51 -0
- package/skills/code-review/references/verification-before-completion.md +139 -0
- package/skills/codex-goal/SKILL.md +76 -0
- package/skills/coding-level/SKILL.md +78 -0
- package/skills/common/README.md +110 -0
- package/skills/common/SKILL.md +11 -0
- package/skills/context-engineering/SKILL.md +114 -0
- package/skills/context-engineering/references/context-compression.md +84 -0
- package/skills/context-engineering/references/context-degradation.md +93 -0
- package/skills/context-engineering/references/context-fundamentals.md +75 -0
- package/skills/context-engineering/references/context-optimization.md +82 -0
- package/skills/context-engineering/references/evaluation.md +89 -0
- package/skills/context-engineering/references/memory-systems.md +88 -0
- package/skills/context-engineering/references/multi-agent-patterns.md +90 -0
- package/skills/context-engineering/references/project-development.md +97 -0
- package/skills/context-engineering/references/runtime-awareness.md +202 -0
- package/skills/context-engineering/references/tool-design.md +86 -0
- package/skills/context-engineering/scripts/compression_evaluator.py +349 -0
- package/skills/context-engineering/scripts/context_analyzer.py +317 -0
- package/skills/context-engineering/scripts/tests/test_edge_cases.py +246 -0
- package/skills/cook/README.md +15 -0
- package/skills/cook/SKILL.md +306 -0
- package/skills/cook/references/intent-detection.md +109 -0
- package/skills/cook/references/plan-state-files-first.md +182 -0
- package/skills/cook/references/review-cycle.md +75 -0
- package/skills/cook/references/subagent-patterns.md +87 -0
- package/skills/cook/references/workflow-routing.md +53 -0
- package/skills/cook/references/workflow-steps.md +261 -0
- package/skills/copywriting/SKILL.md +96 -0
- package/skills/copywriting/references/copy-formulas.md +150 -0
- package/skills/copywriting/references/cta-patterns.md +168 -0
- package/skills/copywriting/references/email-copy.md +193 -0
- package/skills/copywriting/references/headline-templates.md +140 -0
- package/skills/copywriting/references/landing-page-copy.md +175 -0
- package/skills/copywriting/references/power-words.md +189 -0
- package/skills/copywriting/references/social-media-copy.md +222 -0
- package/skills/copywriting/references/writing-styles.md +247 -0
- package/skills/copywriting/scripts/extract-writing-styles.py +304 -0
- package/skills/copywriting/templates/copy-brief.md +49 -0
- package/skills/cti-expert/LICENSE +62 -0
- package/skills/cti-expert/README.md +1318 -0
- package/skills/cti-expert/SKILL.md +927 -0
- package/skills/cti-expert/analysis/archive-explorer.md +370 -0
- package/skills/cti-expert/analysis/auto-branch-rules.md +198 -0
- package/skills/cti-expert/analysis/cross-reference-engine.md +194 -0
- package/skills/cti-expert/analysis/deviation-detector.md +187 -0
- package/skills/cti-expert/analysis/drift-monitor.md +198 -0
- package/skills/cti-expert/analysis/exposure-model.md +195 -0
- package/skills/cti-expert/analysis/pattern-library.md +217 -0
- package/skills/cti-expert/analysis/risk-trend-tracker.md +169 -0
- package/skills/cti-expert/analysis/signature-catalog.md +195 -0
- package/skills/cti-expert/analysis/weight-engine.md +198 -0
- package/skills/cti-expert/connectors/maltego-export.md +565 -0
- package/skills/cti-expert/connectors/notion-schema.md +517 -0
- package/skills/cti-expert/connectors/obsidian-setup.md +718 -0
- package/skills/cti-expert/engine/case-schema.json +535 -0
- package/skills/cti-expert/engine/conflict-resolver.md +445 -0
- package/skills/cti-expert/engine/finding-framework.md +386 -0
- package/skills/cti-expert/engine/subject-registry.md +640 -0
- package/skills/cti-expert/engine/workspace-format.md +447 -0
- package/skills/cti-expert/engine/workspace-manager.md +595 -0
- package/skills/cti-expert/experience/accessibility/accessible-mode.md +306 -0
- package/skills/cti-expert/experience/accessibility/glossary.md +242 -0
- package/skills/cti-expert/experience/case-progress.md +190 -0
- package/skills/cti-expert/experience/case-templates/tpl-background-check.md +499 -0
- package/skills/cti-expert/experience/case-templates/tpl-due-diligence.md +205 -0
- package/skills/cti-expert/experience/case-templates/tpl-index.md +195 -0
- package/skills/cti-expert/experience/case-templates/tpl-security-review.md +272 -0
- package/skills/cti-expert/experience/feedback-system.md +176 -0
- package/skills/cti-expert/experience/guidance-system.md +234 -0
- package/skills/cti-expert/experience/guided-flows/flow-domain-sweep.md +275 -0
- package/skills/cti-expert/experience/guided-flows/flow-image-check.md +306 -0
- package/skills/cti-expert/experience/guided-flows/flow-person-lookup.md +286 -0
- package/skills/cti-expert/experience/layered-detail.md +205 -0
- package/skills/cti-expert/experience/skill-tiers.md +164 -0
- package/skills/cti-expert/experience/tutorial.md +198 -0
- package/skills/cti-expert/guides/walkthroughs/walkthrough-domain-sweep.md +131 -0
- package/skills/cti-expert/guides/walkthroughs/walkthrough-person-lookup.md +124 -0
- package/skills/cti-expert/guides/walkthroughs/walkthrough-username-trace.md +130 -0
- package/skills/cti-expert/handbook/discovery-paths.md +534 -0
- package/skills/cti-expert/handbook/operator-queries.md +337 -0
- package/skills/cti-expert/handbook/quick-report.md +96 -0
- package/skills/cti-expert/handbook/report-template.md +129 -0
- package/skills/cti-expert/handbook/tool-cascade-reference.md +249 -0
- package/skills/cti-expert/output/reports/citation-guide.md +145 -0
- package/skills/cti-expert/output/reports/export-specs.md +213 -0
- package/skills/cti-expert/output/reports/format-catalog.md +161 -0
- package/skills/cti-expert/output/reports/leadership-brief-template.md +531 -0
- package/skills/cti-expert/output/visuals/attack-path-diagram.md +178 -0
- package/skills/cti-expert/output/visuals/attack-surface-map.md +152 -0
- package/skills/cti-expert/output/visuals/case-dashboard.md +96 -0
- package/skills/cti-expert/output/visuals/chart-templates.md +1001 -0
- package/skills/cti-expert/output/visuals/render-engine.md +188 -0
- package/skills/cti-expert/output/visuals/ui-components.md +763 -0
- package/skills/cti-expert/scripts/cti_docx_charts.py +289 -0
- package/skills/cti-expert/scripts/cti_docx_diagrams.py +230 -0
- package/skills/cti-expert/scripts/cti_docx_postprocess.py +451 -0
- package/skills/cti-expert/scripts/cti_docx_sections.py +319 -0
- package/skills/cti-expert/scripts/cti_docx_styles.py +253 -0
- package/skills/cti-expert/scripts/generate-cti-docx-hybrid.py +178 -0
- package/skills/cti-expert/scripts/generate-cti-docx.py +210 -0
- package/skills/cti-expert/scripts/install.sh +322 -0
- package/skills/cti-expert/scripts/requirements.txt +6 -0
- package/skills/cti-expert/scripts/sample-cti-report-data.json +251 -0
- package/skills/cti-expert/techniques/advanced-geolocation-techniques.md +314 -0
- package/skills/cti-expert/techniques/agentflow-enrichment.md +150 -0
- package/skills/cti-expert/techniques/blockchain-investigation.md +247 -0
- package/skills/cti-expert/techniques/cloud-audit.md +175 -0
- package/skills/cti-expert/techniques/darknet-investigation.md +397 -0
- package/skills/cti-expert/techniques/dependency-audit.md +253 -0
- package/skills/cti-expert/techniques/disk-forensics.md +209 -0
- package/skills/cti-expert/techniques/domain-advanced.md +250 -0
- package/skills/cti-expert/techniques/email-osint.md +482 -0
- package/skills/cti-expert/techniques/fx-breach-discovery.md +142 -0
- package/skills/cti-expert/techniques/fx-dns-cert-history.md +257 -0
- package/skills/cti-expert/techniques/fx-document-forensics.md +64 -0
- package/skills/cti-expert/techniques/fx-document-leak-hunt.md +121 -0
- package/skills/cti-expert/techniques/fx-dork-sweep.md +157 -0
- package/skills/cti-expert/techniques/fx-email-header-analysis.md +91 -0
- package/skills/cti-expert/techniques/fx-geolocation.md +70 -0
- package/skills/cti-expert/techniques/fx-http-fingerprint.md +91 -0
- package/skills/cti-expert/techniques/fx-image-verification.md +87 -0
- package/skills/cti-expert/techniques/fx-leak-monitoring.md +84 -0
- package/skills/cti-expert/techniques/fx-metadata-parsing.md +96 -0
- package/skills/cti-expert/techniques/fx-network-mapping.md +95 -0
- package/skills/cti-expert/techniques/fx-social-topology.md +90 -0
- package/skills/cti-expert/techniques/fx-visitor-intelligence.md +413 -0
- package/skills/cti-expert/techniques/image-forensics-and-face-search.md +224 -0
- package/skills/cti-expert/techniques/incident-triage.md +197 -0
- package/skills/cti-expert/techniques/ioc-export.md +176 -0
- package/skills/cti-expert/techniques/microsoft-tenant-recon.md +86 -0
- package/skills/cti-expert/techniques/owasp-audit.md +178 -0
- package/skills/cti-expert/techniques/phone-osint.md +316 -0
- package/skills/cti-expert/techniques/prompt-injection-audit.md +236 -0
- package/skills/cti-expert/techniques/scam-check.md +217 -0
- package/skills/cti-expert/techniques/secret-scanning.md +195 -0
- package/skills/cti-expert/techniques/social-media-platforms.md +514 -0
- package/skills/cti-expert/techniques/threat-intel.md +315 -0
- package/skills/cti-expert/techniques/transport-tracking.md +353 -0
- package/skills/cti-expert/techniques/username-osint.md +227 -0
- package/skills/cti-expert/techniques/web-collection-scrapling.md +164 -0
- package/skills/cti-expert/techniques/web-dns-forensics.md +293 -0
- package/skills/cti-expert/techniques/web-traffic-analysis.md +180 -0
- package/skills/cti-expert/techniques/whois-universal.md +217 -0
- package/skills/cti-expert/techniques/wifi-ssid-osint.md +221 -0
- package/skills/cti-expert/validation/coverage-matrix.md +196 -0
- package/skills/cti-expert/validation/quality-scoring.md +114 -0
- package/skills/cti-expert/validation/verification-checklist.md +191 -0
- package/skills/cti-expert/workflows/wf-hr-screening.md +124 -0
- package/skills/cti-expert/workflows/wf-journalist.md +94 -0
- package/skills/cti-expert/workflows/wf-private-investigator.md +133 -0
- package/skills/cti-expert/workflows/wf-threat-analyst.md +126 -0
- package/skills/databases/SKILL.md +91 -0
- package/skills/databases/references/db-design.md +50 -0
- package/skills/databases/references/mongodb-aggregation.md +447 -0
- package/skills/databases/references/mongodb-atlas.md +465 -0
- package/skills/databases/references/mongodb-crud.md +408 -0
- package/skills/databases/references/mongodb-indexing.md +442 -0
- package/skills/databases/references/postgresql-administration.md +594 -0
- package/skills/databases/references/postgresql-performance.md +527 -0
- package/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/skills/databases/references/postgresql-queries.md +475 -0
- package/skills/databases/scripts/db_backup.py +502 -0
- package/skills/databases/scripts/db_migrate.py +426 -0
- package/skills/databases/scripts/db_performance_check.py +457 -0
- package/skills/databases/scripts/requirements.txt +20 -0
- package/skills/databases/scripts/tests/coverage-db.json +1 -0
- package/skills/databases/scripts/tests/requirements.txt +4 -0
- package/skills/databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/debug/SKILL.md +161 -0
- package/skills/debug/references/defense-in-depth.md +124 -0
- package/skills/debug/references/frontend-verification.md +104 -0
- package/skills/debug/references/investigation-methodology.md +102 -0
- package/skills/debug/references/log-and-ci-analysis.md +97 -0
- package/skills/debug/references/performance-diagnostics.md +113 -0
- package/skills/debug/references/reporting-standards.md +122 -0
- package/skills/debug/references/root-cause-tracing.md +122 -0
- package/skills/debug/references/systematic-debugging.md +102 -0
- package/skills/debug/references/task-management-debugging.md +44 -0
- package/skills/debug/references/verification.md +123 -0
- package/skills/debug/scripts/find-polluter.sh +63 -0
- package/skills/debug/scripts/find-polluter.test.md +102 -0
- package/skills/deep-swe/LICENSE.txt +21 -0
- package/skills/deep-swe/SKILL.md +82 -0
- package/skills/deploy/SKILL.md +161 -0
- package/skills/deploy/references/platform-config-templates.md +35 -0
- package/skills/deploy/references/platforms/aws.md +58 -0
- package/skills/deploy/references/platforms/cloudflare.md +41 -0
- package/skills/deploy/references/platforms/coolify.md +32 -0
- package/skills/deploy/references/platforms/digitalocean.md +45 -0
- package/skills/deploy/references/platforms/dokploy.md +29 -0
- package/skills/deploy/references/platforms/flyio.md +54 -0
- package/skills/deploy/references/platforms/gcp.md +45 -0
- package/skills/deploy/references/platforms/github-pages.md +56 -0
- package/skills/deploy/references/platforms/heroku.md +31 -0
- package/skills/deploy/references/platforms/netlify.md +39 -0
- package/skills/deploy/references/platforms/railway.md +38 -0
- package/skills/deploy/references/platforms/render.md +39 -0
- package/skills/deploy/references/platforms/tose.md +35 -0
- package/skills/deploy/references/platforms/vercel.md +37 -0
- package/skills/deploy/references/platforms/vultr.md +27 -0
- package/skills/design/SKILL.md +368 -0
- package/skills/design/data/cip/deliverables.csv +51 -0
- package/skills/design/data/cip/industries.csv +21 -0
- package/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/skills/design/data/cip/styles.csv +21 -0
- package/skills/design/data/icon/styles.csv +16 -0
- package/skills/design/data/logo/colors.csv +56 -0
- package/skills/design/data/logo/industries.csv +56 -0
- package/skills/design/data/logo/styles.csv +56 -0
- package/skills/design/data/poster/analysis/clusters.json +460 -0
- package/skills/design/data/poster/analysis/raw/03830de3c6fa0bec270ba0d7fc0e7846.json +41 -0
- package/skills/design/data/poster/analysis/raw/0720a64949fc9de76f4ef558c4a2a255.json +44 -0
- package/skills/design/data/poster/analysis/raw/0d2b819566c50e78e085d92cfc86d027.json +44 -0
- package/skills/design/data/poster/analysis/raw/11a3b9453165c20f093ba2b23dd88d12.json +43 -0
- package/skills/design/data/poster/analysis/raw/1327e16933d7c1a9f29e0b7427088724.json +45 -0
- package/skills/design/data/poster/analysis/raw/19b3f41ac3316417b7b3c05b6f259f78.json +45 -0
- package/skills/design/data/poster/analysis/raw/1d3081c243a0158eef6ac3f75fc9b210.json +44 -0
- package/skills/design/data/poster/analysis/raw/1e087bf80f15859a8c25f64c1f60eb05.json +46 -0
- package/skills/design/data/poster/analysis/raw/206bbb22ad70bdf9424a352c53885ded.json +44 -0
- package/skills/design/data/poster/analysis/raw/208f93c9e0e26a587c675482bb6159c0.json +46 -0
- package/skills/design/data/poster/analysis/raw/20a8613560d7b6950b3bb60f3b305ee9.json +46 -0
- package/skills/design/data/poster/analysis/raw/23b7c4cf67425a4586f52b5ab3193485.json +45 -0
- package/skills/design/data/poster/analysis/raw/29a4c5c51006e4e614a5d4e5f9a0cf38.json +42 -0
- package/skills/design/data/poster/analysis/raw/2ebb49c2e9cee470cfbf140ff55908db.json +45 -0
- package/skills/design/data/poster/analysis/raw/2f3b297a6f24872fb8e6b4df1b952ee7.json +43 -0
- package/skills/design/data/poster/analysis/raw/2f674e0079d3b0072bc464befc013291.json +44 -0
- package/skills/design/data/poster/analysis/raw/310540d28ae16e6c2e287e2848a70d59.json +42 -0
- package/skills/design/data/poster/analysis/raw/329159bd006090d76c9f17723b03266e.json +47 -0
- package/skills/design/data/poster/analysis/raw/32ce1f4f0710079bfcad7e9cd8b9ac23.json +46 -0
- package/skills/design/data/poster/analysis/raw/35021de3de00711b2253f3998a676ac7.json +43 -0
- package/skills/design/data/poster/analysis/raw/352817058d62df6c2a2187529ebc0811.json +44 -0
- package/skills/design/data/poster/analysis/raw/36097cd2af4616c9352ceef92e5b743e.json +44 -0
- package/skills/design/data/poster/analysis/raw/36f617c7bd8eb399694be84da430c4fe.json +42 -0
- package/skills/design/data/poster/analysis/raw/3931212aa88036d9380735e577f301c5.json +43 -0
- package/skills/design/data/poster/analysis/raw/39dbb26b8a479d276329d352fe530540.json +45 -0
- package/skills/design/data/poster/analysis/raw/3dc3adf1e1542239db8acbe7233ef6d3.json +44 -0
- package/skills/design/data/poster/analysis/raw/3f168ed33e3a90bca52d731b43b7f8ff.json +46 -0
- package/skills/design/data/poster/analysis/raw/43e8f9dec2c7b2b090ec370bd0948920.json +48 -0
- package/skills/design/data/poster/analysis/raw/451205c93b056ccbc22cbe473afacf2c.json +45 -0
- package/skills/design/data/poster/analysis/raw/451a8579b449a332a95f0b8f1022ce97.json +44 -0
- package/skills/design/data/poster/analysis/raw/463e4a2b40d25116c7fb6edc4f62a237.json +43 -0
- package/skills/design/data/poster/analysis/raw/4700136bbc2d6987577c3c16f4e187b3.json +43 -0
- package/skills/design/data/poster/analysis/raw/49d16faee41a2b99901fca62dc41fcbd.json +45 -0
- package/skills/design/data/poster/analysis/raw/4b25a302c481d7aa8913bcd5d5053688.json +43 -0
- package/skills/design/data/poster/analysis/raw/4e84eb4cb51d17fdaa195243e9271c0c.json +44 -0
- package/skills/design/data/poster/analysis/raw/4f616e824a5d2b3b596b4b07128cd2e2.json +45 -0
- package/skills/design/data/poster/analysis/raw/4f7e7f95ec46254afbcb4ed0f2f3556a.json +43 -0
- package/skills/design/data/poster/analysis/raw/52df1b896ff6d0d0de31f9e1e38cddc9.json +46 -0
- package/skills/design/data/poster/analysis/raw/5364e461254c715eb4302b5daafd8ce1.json +44 -0
- package/skills/design/data/poster/analysis/raw/558fa3a048e27a9558d0d568c15b7cf0.json +44 -0
- package/skills/design/data/poster/analysis/raw/5737d7fd13c865fff12218cd86d4a176.json +43 -0
- package/skills/design/data/poster/analysis/raw/59dda9c5466b0ca79913f3874efa36a1.json +44 -0
- package/skills/design/data/poster/analysis/raw/59ea108d8959586d359980808dc84fc3.json +44 -0
- package/skills/design/data/poster/analysis/raw/5c9277ead15d4e599740c7d6e698c3fa.json +44 -0
- package/skills/design/data/poster/analysis/raw/629edf88f617724399b5b5ee70c9fde9.json +45 -0
- package/skills/design/data/poster/analysis/raw/65326a5cf732897196f0fe5d81e1d7b5.json +44 -0
- package/skills/design/data/poster/analysis/raw/6ec5149c0f8046824346106d4ccaa9b7.json +44 -0
- package/skills/design/data/poster/analysis/raw/6fa6fe57aebc755736959ad860b806fd.json +45 -0
- package/skills/design/data/poster/analysis/raw/72f7066f8bfd58ae11cba72b7e986c67.json +45 -0
- package/skills/design/data/poster/analysis/raw/74a1e3bb73287a3e587d670074d3e09c.json +45 -0
- package/skills/design/data/poster/analysis/raw/75b9a7dbfc4f5298f6092a3dbbda9c80.json +44 -0
- package/skills/design/data/poster/analysis/raw/763a0cf095244d0ae0244a89d1863890.json +43 -0
- package/skills/design/data/poster/analysis/raw/780f94a12f778c2f2b5514597c6fef4a.json +48 -0
- package/skills/design/data/poster/analysis/raw/79bba33787bae383c829457dd6d90c02.json +44 -0
- package/skills/design/data/poster/analysis/raw/7a1e91d4e6c39f5d278ab4c833616ebf.json +44 -0
- package/skills/design/data/poster/analysis/raw/7a3e1681626bc52e3888dba109a072ba.json +44 -0
- package/skills/design/data/poster/analysis/raw/7b4120d6690f603ac417c9395a9b0aa7.json +44 -0
- package/skills/design/data/poster/analysis/raw/7bd18b2d9f4c813402f7bc5a4beb5022.json +44 -0
- package/skills/design/data/poster/analysis/raw/7e14dd460280476a871db304cd5b266b.json +45 -0
- package/skills/design/data/poster/analysis/raw/804ab63a723f046ed504683e5ff029ac.json +44 -0
- package/skills/design/data/poster/analysis/raw/80f5c85b6886175b4d4cdb009c33bd4b.json +46 -0
- package/skills/design/data/poster/analysis/raw/84f8e5e99ecc1448694574af98c9b261.json +43 -0
- package/skills/design/data/poster/analysis/raw/889907f1db801ccf18426d7111f37ad5.json +42 -0
- package/skills/design/data/poster/analysis/raw/8a800a072bcb22af6a8851b2d9274af4.json +46 -0
- package/skills/design/data/poster/analysis/raw/8ab3a73073a3d2be0f50605265264aa8.json +45 -0
- package/skills/design/data/poster/analysis/raw/8e9ab36670f8abb6e30ea8ee0936e76a.json +43 -0
- package/skills/design/data/poster/analysis/raw/961cdae977416844899cdf6d27f68c17.json +44 -0
- package/skills/design/data/poster/analysis/raw/9befb4c704b8f90d7988ca53b27bbaf8.json +46 -0
- package/skills/design/data/poster/analysis/raw/9cd149253f974524620fc7e626e7ab8b.json +45 -0
- package/skills/design/data/poster/analysis/raw/9e8eb8cd216c308eb955be98c8b5469c.json +43 -0
- package/skills/design/data/poster/analysis/raw/a00214fa42e14653b71e7e19750b2dd1.json +44 -0
- package/skills/design/data/poster/analysis/raw/a559e4c0235989ea746a1580a7a5fd67.json +46 -0
- package/skills/design/data/poster/analysis/raw/a820e920a16841be386901670b719cf8.json +45 -0
- package/skills/design/data/poster/analysis/raw/a886ff142548b39c4502de58a2c84015.json +44 -0
- package/skills/design/data/poster/analysis/raw/aaae7f36ab82d74cd378422e615e0c6b.json +47 -0
- package/skills/design/data/poster/analysis/raw/ad954edcb87747e9098689cbe4baa5ef.json +44 -0
- package/skills/design/data/poster/analysis/raw/ae121a7d8e2061230c1e894400c8a373.json +44 -0
- package/skills/design/data/poster/analysis/raw/ae8e1437e0cc1aaded8f58f5009e019d.json +46 -0
- package/skills/design/data/poster/analysis/raw/afdad5e00f97585a463bcc08b03f57a9.json +44 -0
- package/skills/design/data/poster/analysis/raw/b070823f2005d717d491ba63ceb79335.json +43 -0
- package/skills/design/data/poster/analysis/raw/b3f19b9d48b6bd983a43358cca317e8f.json +44 -0
- package/skills/design/data/poster/analysis/raw/b512b0981a30a0b48f8b0a8c20fbad39.json +44 -0
- package/skills/design/data/poster/analysis/raw/b545932bc5c82b7bb13a2f340f0eb38d.json +44 -0
- package/skills/design/data/poster/analysis/raw/b63f0dd0ab98a335966e47f29795f9c2.json +42 -0
- package/skills/design/data/poster/analysis/raw/bdc469042c5e3dc7e6e3748b431ae2a6.json +45 -0
- package/skills/design/data/poster/analysis/raw/c19c048627cb33e313b02b020789ce71.json +46 -0
- package/skills/design/data/poster/analysis/raw/c30fb63c7960e6bad555c859b4001111.json +47 -0
- package/skills/design/data/poster/analysis/raw/cbe2866e0e348558718f7e77168f0be7.json +46 -0
- package/skills/design/data/poster/analysis/raw/cd3600a62153c51f0a82aace1c49e56a.json +45 -0
- package/skills/design/data/poster/analysis/raw/d1f6cc3afc6b1ec24165658ec52495a0.json +46 -0
- package/skills/design/data/poster/analysis/raw/d28930761f38f870bd181a91bc20d283.json +47 -0
- package/skills/design/data/poster/analysis/raw/d4b8f9a965ada05816219f382658885b.json +44 -0
- package/skills/design/data/poster/analysis/raw/d526846fb5a303411a18ffb41c93995d.json +45 -0
- package/skills/design/data/poster/analysis/raw/d52d0671f8a0d52c5d1343020b8f3e8e.json +45 -0
- package/skills/design/data/poster/analysis/raw/d5c9c14b21ac3a63d3029c736af62814.json +45 -0
- package/skills/design/data/poster/analysis/raw/d8209a3ab55acb51fc51a77807842349.json +46 -0
- package/skills/design/data/poster/analysis/raw/da140c13475db4beeaf53a923139e6a6.json +45 -0
- package/skills/design/data/poster/analysis/raw/daf8de499d7734e187779e1400361420.json +45 -0
- package/skills/design/data/poster/analysis/raw/db7b1e073e80bee4fec31bfaabe06565.json +44 -0
- package/skills/design/data/poster/analysis/raw/dcba357e7239c0f3b7eddf412558e68c.json +42 -0
- package/skills/design/data/poster/analysis/raw/dcc5bc4453e379070d8dac1f8a50704d.json +46 -0
- package/skills/design/data/poster/analysis/raw/download.json +46 -0
- package/skills/design/data/poster/analysis/raw/e148e8bcff846b7c872c7c1d50452fd4.json +44 -0
- package/skills/design/data/poster/analysis/raw/e690c2a063b2e91da0612d818ac8f2f4.json +44 -0
- package/skills/design/data/poster/analysis/raw/e697e58f5a500c4b7ba0fb5c02a5506e.json +45 -0
- package/skills/design/data/poster/analysis/raw/ecb624bec81a0d5b229dc2fe4ed585fd.json +47 -0
- package/skills/design/data/poster/analysis/raw/eed5317c07fd8b093f039a0848e801d8.json +44 -0
- package/skills/design/data/poster/analysis/raw/f1853524781a04e99e9279cd6526e447.json +44 -0
- package/skills/design/data/poster/analysis/raw/f1a3249b2798d37edb956bfe1ea9d44b.json +44 -0
- package/skills/design/data/poster/analysis/raw/f3a81ad0c4189fd3ef83122e4c3f1d18.json +43 -0
- package/skills/design/data/poster/analysis/raw/f3e0358f167e6471f7dd6636529a9fc6.json +46 -0
- package/skills/design/data/poster/analysis/raw/f99f4bfc2eb5f0b11f8069aab956231b.json +47 -0
- package/skills/design/data/poster/analysis/raw/fc92743155daf8ccafe80dad8f7b1907.json +46 -0
- package/skills/design/data/poster/poster-layouts.csv +15 -0
- package/skills/design/data/poster/poster-palettes.csv +17 -0
- package/skills/design/data/poster/poster-styles.csv +23 -0
- package/skills/design/data/poster/poster-textures.csv +9 -0
- package/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/skills/design/references/brand-asset-protocol.md +226 -0
- package/skills/design/references/cip-deliverable-guide.md +95 -0
- package/skills/design/references/cip-design.md +121 -0
- package/skills/design/references/cip-prompt-engineering.md +84 -0
- package/skills/design/references/cip-style-guide.md +68 -0
- package/skills/design/references/design-critique-guide.md +246 -0
- package/skills/design/references/design-routing.md +209 -0
- package/skills/design/references/design-workflow.md +194 -0
- package/skills/design/references/handoff-gate.md +56 -0
- package/skills/design/references/icon-design.md +122 -0
- package/skills/design/references/logo-color-psychology.md +101 -0
- package/skills/design/references/logo-design.md +92 -0
- package/skills/design/references/logo-prompt-engineering.md +158 -0
- package/skills/design/references/logo-style-guide.md +109 -0
- package/skills/design/references/poster-design.md +86 -0
- package/skills/design/references/poster-prompt-engineering.md +69 -0
- package/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/skills/design/references/slides-create.md +4 -0
- package/skills/design/references/slides-html-template.md +295 -0
- package/skills/design/references/slides-layout-patterns.md +137 -0
- package/skills/design/references/slides-strategies.md +94 -0
- package/skills/design/references/slides.md +42 -0
- package/skills/design/references/social-photos-design.md +329 -0
- package/skills/design/scripts/cip/core.py +215 -0
- package/skills/design/scripts/cip/generate.py +484 -0
- package/skills/design/scripts/cip/render-html.py +424 -0
- package/skills/design/scripts/cip/search.py +127 -0
- package/skills/design/scripts/icon/generate.py +487 -0
- package/skills/design/scripts/logo/core.py +175 -0
- package/skills/design/scripts/logo/generate.py +362 -0
- package/skills/design/scripts/logo/search.py +114 -0
- package/skills/design/scripts/poster/analyze.py +124 -0
- package/skills/design/scripts/poster/cluster.py +432 -0
- package/skills/design/scripts/poster/core.py +124 -0
- package/skills/design/scripts/poster/generate.py +176 -0
- package/skills/design/scripts/poster/search.py +132 -0
- package/skills/devops/.env.example +76 -0
- package/skills/devops/SKILL.md +98 -0
- package/skills/devops/references/browser-rendering.md +305 -0
- package/skills/devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/devops/references/cloudflare-platform.md +271 -0
- package/skills/devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/devops/references/docker-basics.md +297 -0
- package/skills/devops/references/docker-compose.md +292 -0
- package/skills/devops/references/gcloud-platform.md +297 -0
- package/skills/devops/references/gcloud-services.md +304 -0
- package/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/devops/scripts/docker_optimize.py +332 -0
- package/skills/devops/scripts/requirements.txt +20 -0
- package/skills/devops/scripts/tests/requirements.txt +3 -0
- package/skills/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/diagram/SKILL.md +186 -0
- package/skills/diagram/agents/openai.yaml +4 -0
- package/skills/diagram/assets/connector-effects.css +122 -0
- package/skills/diagram/assets/effects-demo.html +125 -0
- package/skills/diagram/assets/mermaid.min.js +2314 -0
- package/skills/diagram/assets/templates/architecture/dark.html +190 -0
- package/skills/diagram/assets/templates/architecture/full.html +202 -0
- package/skills/diagram/assets/templates/architecture/light.html +191 -0
- package/skills/diagram/assets/templates/bar/dark.html +137 -0
- package/skills/diagram/assets/templates/bar/full.html +113 -0
- package/skills/diagram/assets/templates/bar/light.html +137 -0
- package/skills/diagram/assets/templates/data-flow/dark.html +151 -0
- package/skills/diagram/assets/templates/data-flow/full.html +193 -0
- package/skills/diagram/assets/templates/data-flow/light.html +151 -0
- package/skills/diagram/assets/templates/dp-integration/dark.html +88 -0
- package/skills/diagram/assets/templates/dp-integration/full.html +98 -0
- package/skills/diagram/assets/templates/dp-integration/light.html +88 -0
- package/skills/diagram/assets/templates/dp-security-matrix/dark.html +39 -0
- package/skills/diagram/assets/templates/dp-security-matrix/full.html +40 -0
- package/skills/diagram/assets/templates/dp-security-matrix/light.html +96 -0
- package/skills/diagram/assets/templates/flowchart/dark.html +164 -0
- package/skills/diagram/assets/templates/flowchart/full.html +167 -0
- package/skills/diagram/assets/templates/flowchart/light.html +164 -0
- package/skills/diagram/assets/templates/gantt/dark.html +145 -0
- package/skills/diagram/assets/templates/gantt/full.html +135 -0
- package/skills/diagram/assets/templates/gantt/light.html +145 -0
- package/skills/diagram/assets/templates/high-level/dark.html +259 -0
- package/skills/diagram/assets/templates/high-level/full.html +255 -0
- package/skills/diagram/assets/templates/high-level/light.html +309 -0
- package/skills/diagram/assets/templates/it-state/dark.html +98 -0
- package/skills/diagram/assets/templates/it-state/full.html +77 -0
- package/skills/diagram/assets/templates/it-state/light.html +136 -0
- package/skills/diagram/assets/templates/layers/dark.html +131 -0
- package/skills/diagram/assets/templates/layers/full.html +134 -0
- package/skills/diagram/assets/templates/layers/light.html +131 -0
- package/skills/diagram/assets/templates/line/dark.html +119 -0
- package/skills/diagram/assets/templates/line/full.html +113 -0
- package/skills/diagram/assets/templates/line/light.html +119 -0
- package/skills/diagram/assets/templates/loop/dark.html +108 -0
- package/skills/diagram/assets/templates/loop/full.html +145 -0
- package/skills/diagram/assets/templates/loop/light.html +108 -0
- package/skills/diagram/assets/templates/medallion/dark.html +167 -0
- package/skills/diagram/assets/templates/medallion/full.html +209 -0
- package/skills/diagram/assets/templates/medallion/light.html +167 -0
- package/skills/diagram/assets/templates/nested/dark.html +140 -0
- package/skills/diagram/assets/templates/nested/full.html +143 -0
- package/skills/diagram/assets/templates/nested/light.html +144 -0
- package/skills/diagram/assets/templates/org-chart/dark.html +53 -0
- package/skills/diagram/assets/templates/org-chart/full.html +53 -0
- package/skills/diagram/assets/templates/org-chart/light.html +53 -0
- package/skills/diagram/assets/templates/process/dark.html +72 -0
- package/skills/diagram/assets/templates/process/full.html +82 -0
- package/skills/diagram/assets/templates/process/light.html +72 -0
- package/skills/diagram/assets/templates/pyramid/dark.html +127 -0
- package/skills/diagram/assets/templates/pyramid/full.html +130 -0
- package/skills/diagram/assets/templates/pyramid/light.html +127 -0
- package/skills/diagram/assets/templates/quadrant/dark.html +143 -0
- package/skills/diagram/assets/templates/quadrant/full.html +146 -0
- package/skills/diagram/assets/templates/quadrant/light.html +143 -0
- package/skills/diagram/assets/templates/radar/dark.html +147 -0
- package/skills/diagram/assets/templates/radar/full.html +143 -0
- package/skills/diagram/assets/templates/radar/light.html +147 -0
- package/skills/diagram/assets/templates/scatter/dark.html +149 -0
- package/skills/diagram/assets/templates/scatter/full.html +124 -0
- package/skills/diagram/assets/templates/scatter/light.html +149 -0
- package/skills/diagram/assets/templates/sequence/dark.html +230 -0
- package/skills/diagram/assets/templates/sequence/full.html +396 -0
- package/skills/diagram/assets/templates/sequence/light.html +230 -0
- package/skills/diagram/assets/templates/state/dark.html +155 -0
- package/skills/diagram/assets/templates/state/full.html +158 -0
- package/skills/diagram/assets/templates/state/light.html +155 -0
- package/skills/diagram/assets/templates/swimlane/dark.html +180 -0
- package/skills/diagram/assets/templates/swimlane/full.html +183 -0
- package/skills/diagram/assets/templates/swimlane/light.html +180 -0
- package/skills/diagram/assets/templates/timeline/dark.html +143 -0
- package/skills/diagram/assets/templates/timeline/full.html +146 -0
- package/skills/diagram/assets/templates/timeline/light.html +143 -0
- package/skills/diagram/assets/tokens.css +116 -0
- package/skills/diagram/references/animation-effects.md +142 -0
- package/skills/diagram/references/mermaid-input.md +62 -0
- package/skills/diagram/references/per-type-schemas/README.md +60 -0
- package/skills/diagram/references/per-type-schemas/architecture.json +50 -0
- package/skills/diagram/references/per-type-schemas/bar.json +44 -0
- package/skills/diagram/references/per-type-schemas/data-flow.json +71 -0
- package/skills/diagram/references/per-type-schemas/dp-integration.json +47 -0
- package/skills/diagram/references/per-type-schemas/dp-security-matrix.json +51 -0
- package/skills/diagram/references/per-type-schemas/high-level.json +47 -0
- package/skills/diagram/references/per-type-schemas/it-state.json +51 -0
- package/skills/diagram/references/per-type-schemas/layers.json +41 -0
- package/skills/diagram/references/per-type-schemas/line.json +65 -0
- package/skills/diagram/references/per-type-schemas/loop.json +19 -0
- package/skills/diagram/references/per-type-schemas/medallion.json +48 -0
- package/skills/diagram/references/per-type-schemas/nested.json +45 -0
- package/skills/diagram/references/per-type-schemas/org-chart.json +48 -0
- package/skills/diagram/references/per-type-schemas/process.json +35 -0
- package/skills/diagram/references/per-type-schemas/pyramid.json +37 -0
- package/skills/diagram/references/per-type-schemas/quadrant.json +78 -0
- package/skills/diagram/references/per-type-schemas/radar.json +57 -0
- package/skills/diagram/references/per-type-schemas/scatter.json +58 -0
- package/skills/diagram/references/per-type-schemas/swimlane.json +50 -0
- package/skills/diagram/references/per-type-schemas/timeline.json +50 -0
- package/skills/diagram/references/snapshot-hashes.yaml +73 -0
- package/skills/diagram/references/snapshot-requirements.txt +2 -0
- package/skills/diagram/references/vendoring-metadata.yaml +379 -0
- package/skills/diagram/scripts/doctor.py +153 -0
- package/skills/diagram/scripts/record.py +151 -0
- package/skills/diagram/scripts/render.py +276 -0
- package/skills/diagram/scripts/snapshot_test.py +200 -0
- package/skills/diagram/scripts/vendor_from_upstream.py +201 -0
- package/skills/docs/SKILL.md +123 -0
- package/skills/docs/references/agent-context-rules.md +103 -0
- package/skills/docs/references/agents-workflow.md +268 -0
- package/skills/docs/references/doc-content-rules.md +77 -0
- package/skills/docs/references/documentation-management.md +51 -0
- package/skills/docs/references/init-workflow.md +60 -0
- package/skills/docs/references/llms.md +151 -0
- package/skills/docs/references/practical-principles-for-setting-up-and-running-tests.md +85 -0
- package/skills/docs/references/summarize-workflow.md +16 -0
- package/skills/docs/references/update-workflow.md +58 -0
- package/skills/docs-seeker/.env.example +15 -0
- package/skills/docs-seeker/SKILL.md +104 -0
- package/skills/docs-seeker/package.json +25 -0
- package/skills/docs-seeker/references/advanced.md +79 -0
- package/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/skills/docs-seeker/references/errors.md +68 -0
- package/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/docs-seeker/workflows/library-search.md +87 -0
- package/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/skills/document-skills/SKILL.md +10 -0
- package/skills/document-skills/ak-docx/LICENSE.txt +30 -0
- package/skills/document-skills/ak-docx/SKILL.md +204 -0
- package/skills/document-skills/ak-docx/docx-js.md +350 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/document-skills/ak-docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/pack.py +159 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/unpack.py +29 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/validate.py +69 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/document-skills/ak-docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/document-skills/ak-docx/ooxml.md +610 -0
- package/skills/document-skills/ak-docx/scripts/__init__.py +1 -0
- package/skills/document-skills/ak-docx/scripts/document.py +1276 -0
- package/skills/document-skills/ak-docx/scripts/templates/comments.xml +3 -0
- package/skills/document-skills/ak-docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/document-skills/ak-docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/document-skills/ak-docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/document-skills/ak-docx/scripts/templates/people.xml +3 -0
- package/skills/document-skills/ak-docx/scripts/utilities.py +374 -0
- package/skills/document-skills/ak-pdf/LICENSE.txt +30 -0
- package/skills/document-skills/ak-pdf/SKILL.md +301 -0
- package/skills/document-skills/ak-pdf/forms.md +205 -0
- package/skills/document-skills/ak-pdf/reference.md +612 -0
- package/skills/document-skills/ak-pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/document-skills/ak-pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/document-skills/ak-pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/document-skills/ak-pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/document-skills/ak-pdf/scripts/create_validation_image.py +41 -0
- package/skills/document-skills/ak-pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/document-skills/ak-pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/document-skills/ak-pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/document-skills/ak-pptx/LICENSE.txt +30 -0
- package/skills/document-skills/ak-pptx/SKILL.md +491 -0
- package/skills/document-skills/ak-pptx/html2pptx.md +625 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/document-skills/ak-pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/pack.py +159 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/unpack.py +29 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/validate.py +69 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/validation/base.py +951 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/document-skills/ak-pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/document-skills/ak-pptx/ooxml.md +427 -0
- package/skills/document-skills/ak-pptx/scripts/html2pptx.js +979 -0
- package/skills/document-skills/ak-pptx/scripts/inventory.py +1020 -0
- package/skills/document-skills/ak-pptx/scripts/rearrange.py +231 -0
- package/skills/document-skills/ak-pptx/scripts/replace.py +385 -0
- package/skills/document-skills/ak-pptx/scripts/thumbnail.py +450 -0
- package/skills/document-skills/ak-xlsx/LICENSE.txt +30 -0
- package/skills/document-skills/ak-xlsx/SKILL.md +296 -0
- package/skills/document-skills/ak-xlsx/recalc.py +191 -0
- package/skills/excalidraw/SKILL.md +210 -0
- package/skills/excalidraw/references/auto-diagram-guide.md +150 -0
- package/skills/excalidraw/references/color-palette.md +128 -0
- package/skills/excalidraw/references/design-methodology.md +129 -0
- package/skills/excalidraw/references/element-templates.md +182 -0
- package/skills/excalidraw/references/file-workflow.md +105 -0
- package/skills/excalidraw/references/json-schema.md +85 -0
- package/skills/excalidraw/references/mcp-workflow.md +194 -0
- package/skills/excalidraw/references/pyproject.toml +7 -0
- package/skills/excalidraw/references/render_excalidraw.py +187 -0
- package/skills/excalidraw/references/render_template.html +57 -0
- package/skills/excalidraw/references/uv.lock +106 -0
- package/skills/explore/SKILL.md +44 -0
- package/skills/fable-thinking/SKILL.md +399 -0
- package/skills/fable-thinking/references/content-taste.md +178 -0
- package/skills/fable-thinking/references/design-taste.md +182 -0
- package/skills/fable-thinking/references/worked-examples.md +228 -0
- package/skills/find-skills/SKILL.md +147 -0
- package/skills/find-skills/references/domain-routing.md +108 -0
- package/skills/fix/SKILL.md +354 -0
- package/skills/fix/references/complexity-assessment.md +73 -0
- package/skills/fix/references/mode-selection.md +46 -0
- package/skills/fix/references/parallel-exploration.md +87 -0
- package/skills/fix/references/review-cycle.md +77 -0
- package/skills/fix/references/skill-activation-matrix.md +100 -0
- package/skills/fix/references/workflow-ci.md +28 -0
- package/skills/fix/references/workflow-deep.md +165 -0
- package/skills/fix/references/workflow-logs.md +59 -0
- package/skills/fix/references/workflow-quick.md +99 -0
- package/skills/fix/references/workflow-standard.md +127 -0
- package/skills/fix/references/workflow-test.md +57 -0
- package/skills/fix/references/workflow-types.md +33 -0
- package/skills/fix/references/workflow-ui.md +59 -0
- package/skills/folder-context/LICENSE.txt +21 -0
- package/skills/folder-context/SKILL.md +55 -0
- package/skills/frontend-design/SKILL.md +276 -0
- package/skills/frontend-design/references/ai-multimodal-overview.md +162 -0
- package/skills/frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/frontend-design/references/analysis-prompts.md +141 -0
- package/skills/frontend-design/references/analysis-techniques.md +112 -0
- package/skills/frontend-design/references/animejs.md +396 -0
- package/skills/frontend-design/references/asset-generation.md +326 -0
- package/skills/frontend-design/references/design-extraction-overview.md +67 -0
- package/skills/frontend-design/references/design-quality-preflight.md +36 -0
- package/skills/frontend-design/references/extraction-best-practices.md +138 -0
- package/skills/frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/frontend-design/references/extraction-prompts.md +127 -0
- package/skills/frontend-design/references/motion-craft.md +166 -0
- package/skills/frontend-design/references/technical-accessibility.md +118 -0
- package/skills/frontend-design/references/technical-best-practices.md +97 -0
- package/skills/frontend-design/references/technical-optimization.md +44 -0
- package/skills/frontend-design/references/technical-overview.md +88 -0
- package/skills/frontend-design/references/technical-workflows.md +137 -0
- package/skills/frontend-design/references/visual-analysis-overview.md +100 -0
- package/skills/frontend-design/references/workflow-3d.md +102 -0
- package/skills/frontend-design/references/workflow-describe.md +87 -0
- package/skills/frontend-design/references/workflow-immersive.md +87 -0
- package/skills/frontend-design/references/workflow-quick.md +57 -0
- package/skills/frontend-design/references/workflow-screenshot.md +63 -0
- package/skills/frontend-design/references/workflow-video.md +74 -0
- package/skills/frontend-development/SKILL.md +407 -0
- package/skills/frontend-development/resources/common-patterns.md +331 -0
- package/skills/frontend-development/resources/complete-examples.md +872 -0
- package/skills/frontend-development/resources/component-patterns.md +502 -0
- package/skills/frontend-development/resources/data-fetching.md +767 -0
- package/skills/frontend-development/resources/file-organization.md +502 -0
- package/skills/frontend-development/resources/loading-and-error-states.md +501 -0
- package/skills/frontend-development/resources/performance.md +406 -0
- package/skills/frontend-development/resources/routing-guide.md +364 -0
- package/skills/frontend-development/resources/styling-guide.md +428 -0
- package/skills/frontend-development/resources/typescript-standards.md +418 -0
- package/skills/git/SKILL.md +133 -0
- package/skills/git/references/branch-management.md +88 -0
- package/skills/git/references/commit-standards.md +46 -0
- package/skills/git/references/gh-cli-guide.md +109 -0
- package/skills/git/references/safety-protocols.md +69 -0
- package/skills/git/references/workflow-commit.md +58 -0
- package/skills/git/references/workflow-merge-pr.md +198 -0
- package/skills/git/references/workflow-merge.md +48 -0
- package/skills/git/references/workflow-pr.md +58 -0
- package/skills/git/references/workflow-push.md +52 -0
- package/skills/git/references/workflow-stacked-prs.md +110 -0
- package/skills/github/SKILL.md +162 -0
- package/skills/github/assets/templates/issue-bug.md +46 -0
- package/skills/github/assets/templates/issue-docs.md +29 -0
- package/skills/github/assets/templates/issue-enhancement.md +31 -0
- package/skills/github/assets/templates/issue-feature.md +49 -0
- package/skills/github/assets/templates/pr-body.md +35 -0
- package/skills/github/references/admin-operations.md +107 -0
- package/skills/github/references/issue-workflows.md +151 -0
- package/skills/github/references/pr-workflows.md +89 -0
- package/skills/github/references/projects-actions.md +92 -0
- package/skills/gkg/SKILL.md +98 -0
- package/skills/gkg/references/cli-commands.md +106 -0
- package/skills/gkg/references/http-api.md +102 -0
- package/skills/gkg/references/language-support.md +57 -0
- package/skills/gkg/references/mcp-tools.md +99 -0
- package/skills/goal-warmup/SKILL.md +217 -0
- package/skills/goal-warmup/fixtures/blocked-missing-credential.md +32 -0
- package/skills/goal-warmup/fixtures/blocked-third-party.md +28 -0
- package/skills/goal-warmup/fixtures/decision-required.md +28 -0
- package/skills/goal-warmup/fixtures/fast-refused-external.md +22 -0
- package/skills/goal-warmup/fixtures/ready-local.md +39 -0
- package/skills/goal-warmup/fixtures/redteam-scope-change.md +26 -0
- package/skills/goal-warmup/references/contract-preserving-review.md +61 -0
- package/skills/goal-warmup/references/decisions.md +21 -0
- package/skills/goal-warmup/references/fast-path.md +41 -0
- package/skills/goal-warmup/references/handoff-packet.md +80 -0
- package/skills/goal-warmup/references/outcome-contract.md +50 -0
- package/skills/goal-warmup/references/preflight-matrix.md +42 -0
- package/skills/google-adk-python/SKILL.md +139 -0
- package/skills/google-adk-python/references/agent-types-and-architecture.md +128 -0
- package/skills/google-adk-python/references/callbacks-plugins-observability.md +117 -0
- package/skills/google-adk-python/references/deployment-cloud-run-vertex-gke.md +138 -0
- package/skills/google-adk-python/references/evaluation-testing-cli.md +112 -0
- package/skills/google-adk-python/references/multi-agent-and-a2a-protocol.md +145 -0
- package/skills/google-adk-python/references/sessions-state-memory-artifacts.md +131 -0
- package/skills/google-adk-python/references/tools-and-mcp-integration.md +148 -0
- package/skills/graphify/SKILL.md +160 -0
- package/skills/handoff/LICENSE.txt +21 -0
- package/skills/handoff/SKILL.md +258 -0
- package/skills/handoff/references/artifact-schema.md +147 -0
- package/skills/handoff/references/redaction-patterns.md +80 -0
- package/skills/handover/SKILL.md +274 -0
- package/skills/handover/references/job-spec-template.md +155 -0
- package/skills/handover/references/runtime-catalog.md +102 -0
- package/skills/help/SKILL.md +21 -0
- package/skills/html-video/SKILL.md +185 -0
- package/skills/hyperframes/SKILL.md +129 -0
- package/skills/hyperframes/references/composition-basics.md +77 -0
- package/skills/hyperframes/references/env-and-deps.md +55 -0
- package/skills/hyperframes/references/heygen-skills.md +36 -0
- package/skills/hyperframes/references/render-workflow.md +88 -0
- package/skills/hyperframes/scripts/verify-prereqs.mjs +148 -0
- package/skills/hyperframes/scripts/verify-prereqs.test.cjs +60 -0
- package/skills/implement/SKILL.md +38 -0
- package/skills/interview-docs/LICENSE.txt +21 -0
- package/skills/interview-docs/SKILL.md +58 -0
- package/skills/issue-to-plan/SKILL.md +249 -0
- package/skills/journal/SKILL.md +147 -0
- package/skills/journal/assets/journal.yaml.example +33 -0
- package/skills/journal/references/channels-config.md +107 -0
- package/skills/journal/references/config-schema.md +95 -0
- package/skills/journal/references/env-cascade.md +61 -0
- package/skills/journal/references/media-flags.md +118 -0
- package/skills/journal/references/writing-styles-resolver.md +56 -0
- package/skills/journal/references/zernio-integration.md +143 -0
- package/skills/journal/scripts/env-loader.cjs +150 -0
- package/skills/journal/scripts/env-loader.test.cjs +131 -0
- package/skills/journal/scripts/generate-image.cjs +195 -0
- package/skills/journal/scripts/generate-image.test.cjs +171 -0
- package/skills/journal/scripts/generate-video.cjs +288 -0
- package/skills/journal/scripts/generate-video.test.cjs +186 -0
- package/skills/journal/scripts/media-utils.cjs +153 -0
- package/skills/journal/scripts/mini-yaml-parser.cjs +234 -0
- package/skills/journal/scripts/post-social.cjs +549 -0
- package/skills/journal/scripts/post-social.test.cjs +479 -0
- package/skills/journal/scripts/resolve-config.cjs +182 -0
- package/skills/journal/scripts/resolve-config.test.cjs +248 -0
- package/skills/journal/scripts/split-thread.cjs +254 -0
- package/skills/journal/scripts/split-thread.test.cjs +138 -0
- package/skills/llms/SKILL.md +124 -0
- package/skills/llms/references/llms-txt-specification.md +87 -0
- package/skills/llms/scripts/generate-llms-txt.py +350 -0
- package/skills/loop/SKILL.md +189 -0
- package/skills/loop/references/autonomous-loop-protocol.md +193 -0
- package/skills/loop/references/git-memory-pattern.md +109 -0
- package/skills/loop/references/guard-and-noise.md +140 -0
- package/skills/loop/references/metric-library.md +200 -0
- package/skills/loop/references/results-logging.md +74 -0
- package/skills/markdown-novel-viewer/SKILL.md +319 -0
- package/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/skills/markdown-novel-viewer/assets/favicon.png +0 -0
- package/skills/markdown-novel-viewer/assets/novel-theme.css +16 -0
- package/skills/markdown-novel-viewer/assets/reader.js +850 -0
- package/skills/markdown-novel-viewer/assets/template.html +149 -0
- package/skills/markdown-novel-viewer/package.json +15 -0
- package/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
- package/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +205 -0
- package/skills/markdown-novel-viewer/scripts/lib/plan-table-parser.cjs +231 -0
- package/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/skills/markdown-novel-viewer/scripts/server.cjs +411 -0
- package/skills/markdown-novel-viewer/scripts/tests/server.test.cjs +327 -0
- package/skills/markdown-novel-viewer/tests/http-server.test.cjs +271 -0
- package/skills/markdown-novel-viewer/tests/run-tests.cjs +49 -0
- package/skills/markdown-novel-viewer/tests/test-framework.cjs +154 -0
- package/skills/mcp-builder/LICENSE.txt +202 -0
- package/skills/mcp-builder/SKILL.md +336 -0
- package/skills/mcp-builder/reference/evaluation.md +584 -0
- package/skills/mcp-builder/reference/mcp-best-practices.md +915 -0
- package/skills/mcp-builder/reference/node-mcp-server.md +918 -0
- package/skills/mcp-builder/reference/python-mcp-server.md +752 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +381 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/media-processing/SKILL.md +101 -0
- package/skills/media-processing/references/common-workflows.md +132 -0
- package/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/skills/media-processing/references/ffmpeg-streaming.md +403 -0
- package/skills/media-processing/references/format-compatibility.md +375 -0
- package/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/skills/media-processing/references/rmbg-background-removal.md +66 -0
- package/skills/media-processing/references/troubleshooting.md +109 -0
- package/skills/media-processing/scripts/README.md +111 -0
- package/skills/media-processing/scripts/batch-remove-background.sh +124 -0
- package/skills/media-processing/scripts/batch_resize.py +342 -0
- package/skills/media-processing/scripts/media_convert.py +311 -0
- package/skills/media-processing/scripts/remove-background.sh +96 -0
- package/skills/media-processing/scripts/remove-bg-node.js +158 -0
- package/skills/media-processing/scripts/requirements.txt +24 -0
- package/skills/media-processing/scripts/tests/requirements.txt +2 -0
- package/skills/media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/skills/media-processing/scripts/tests/test_media_convert.py +259 -0
- package/skills/media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/skills/media-processing/scripts/video_optimize.py +414 -0
- package/skills/mermaidjs-v11/SKILL.md +125 -0
- package/skills/mermaidjs-v11/references/cli-usage.md +228 -0
- package/skills/mermaidjs-v11/references/configuration.md +232 -0
- package/skills/mermaidjs-v11/references/diagram-types.md +315 -0
- package/skills/mermaidjs-v11/references/examples.md +344 -0
- package/skills/mermaidjs-v11/references/integration.md +310 -0
- package/skills/mintlify/SKILL.md +127 -0
- package/skills/mintlify/references/ai-features-and-integrations-reference.md +756 -0
- package/skills/mintlify/references/api-documentation-components-reference.md +873 -0
- package/skills/mintlify/references/deployment-and-continuous-integration-reference.md +674 -0
- package/skills/mintlify/references/docs-json-configuration-reference.md +724 -0
- package/skills/mintlify/references/mdx-components-reference.md +551 -0
- package/skills/mintlify/references/navigation-structure-and-organization-reference.md +775 -0
- package/skills/mobile-development/SKILL.md +219 -0
- package/skills/mobile-development/references/mobile-android.md +604 -0
- package/skills/mobile-development/references/mobile-best-practices.md +545 -0
- package/skills/mobile-development/references/mobile-debugging.md +1089 -0
- package/skills/mobile-development/references/mobile-frameworks.md +465 -0
- package/skills/mobile-development/references/mobile-ios.md +496 -0
- package/skills/mobile-development/references/mobile-mindset.md +544 -0
- package/skills/orchestrate/SKILL.md +366 -0
- package/skills/orchestrate/references/harness-profiles.md +148 -0
- package/skills/orchestrate/references/internal-routing.md +154 -0
- package/skills/orchestrate/references/job-spec.md +251 -0
- package/skills/orchestrate/references/model-routing.md +199 -0
- package/skills/orchestrate/references/runtime-matrix.md +199 -0
- package/skills/payment-integration/README.md +217 -0
- package/skills/payment-integration/SKILL.md +81 -0
- package/skills/payment-integration/references/multi-provider-order-management-patterns.md +821 -0
- package/skills/payment-integration/references/polar/benefits.md +396 -0
- package/skills/payment-integration/references/polar/best-practices.md +902 -0
- package/skills/payment-integration/references/polar/checkouts.md +266 -0
- package/skills/payment-integration/references/polar/overview.md +184 -0
- package/skills/payment-integration/references/polar/products.md +244 -0
- package/skills/payment-integration/references/polar/sdk.md +436 -0
- package/skills/payment-integration/references/polar/subscriptions.md +340 -0
- package/skills/payment-integration/references/polar/webhooks.md +405 -0
- package/skills/payment-integration/references/sepay/api.md +140 -0
- package/skills/payment-integration/references/sepay/best-practices.md +939 -0
- package/skills/payment-integration/references/sepay/overview.md +138 -0
- package/skills/payment-integration/references/sepay/qr-codes.md +228 -0
- package/skills/payment-integration/references/sepay/sdk.md +213 -0
- package/skills/payment-integration/references/sepay/webhooks.md +208 -0
- package/skills/payment-integration/references/stripe/stripe-best-practices.md +32 -0
- package/skills/payment-integration/references/stripe/stripe-cli.md +148 -0
- package/skills/payment-integration/references/stripe/stripe-js.md +116 -0
- package/skills/payment-integration/references/stripe/stripe-sdks.md +84 -0
- package/skills/payment-integration/references/stripe/stripe-upgrade.md +175 -0
- package/skills/payment-integration/scripts/.env.example +20 -0
- package/skills/payment-integration/scripts/checkout-helper.js +244 -0
- package/skills/payment-integration/scripts/package.json +17 -0
- package/skills/payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/skills/payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/skills/payment-integration/scripts/test-scripts.js +237 -0
- package/skills/plan/SKILL.md +676 -0
- package/skills/plan/references/archive-workflow.md +81 -0
- package/skills/plan/references/codebase-understanding.md +48 -0
- package/skills/plan/references/output-standards.md +225 -0
- package/skills/plan/references/plan-organization.md +267 -0
- package/skills/plan/references/red-team-personas.md +101 -0
- package/skills/plan/references/red-team-workflow.md +97 -0
- package/skills/plan/references/research-phase.md +49 -0
- package/skills/plan/references/scope-challenge.md +104 -0
- package/skills/plan/references/solution-design.md +83 -0
- package/skills/plan/references/task-management.md +52 -0
- package/skills/plan/references/validate-question-framework.md +80 -0
- package/skills/plan/references/validate-workflow.md +107 -0
- package/skills/plan/references/verification-roles.md +150 -0
- package/skills/plan/references/workflow-modes.md +424 -0
- package/skills/plans-kanban/SKILL.md +110 -0
- package/skills/plans-kanban/package.json +9 -0
- package/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +494 -0
- package/skills/plans-kanban/scripts/lib/plan-parser.cjs +175 -0
- package/skills/plans-kanban/scripts/lib/plan-scanner.cjs +272 -0
- package/skills/plans-kanban/scripts/lib/plan-table-parser.cjs +231 -0
- package/skills/plans-kanban/scripts/open-dashboard.cjs +220 -0
- package/skills/predict/SKILL.md +150 -0
- package/skills/preview/SKILL.md +173 -0
- package/skills/preview/references/generation-modes.md +210 -0
- package/skills/preview/references/html-antv-infographic.md +140 -0
- package/skills/preview/references/html-css-patterns.md +1717 -0
- package/skills/preview/references/html-design-guidelines.md +393 -0
- package/skills/preview/references/html-diagram-design.md +156 -0
- package/skills/preview/references/html-libraries.md +604 -0
- package/skills/preview/references/html-responsive-nav.md +212 -0
- package/skills/preview/references/html-slide-patterns.md +1401 -0
- package/skills/preview/references/vendor/diagram-design-scripts/PROVENANCE.md +27 -0
- package/skills/preview/references/vendor/diagram-design-scripts/UPSTREAM-LICENSE +21 -0
- package/skills/preview/references/vendor/diagram-design-scripts/run-validators.sh +25 -0
- package/skills/preview/references/vendor/diagram-design-scripts/self_check.py +389 -0
- package/skills/preview/references/vendor/diagram-design-scripts/verify-geometry.py +166 -0
- package/skills/preview/references/vendor/diagram-design-scripts/verify-motion.py +525 -0
- package/skills/preview/references/view-mode.md +42 -0
- package/skills/preview/references/visual-explanation-routing.md +39 -0
- package/skills/preview/templates/architecture.html +650 -0
- package/skills/preview/templates/data-table.html +590 -0
- package/skills/preview/templates/mermaid-flowchart.html +768 -0
- package/skills/preview/templates/slide-deck.html +968 -0
- package/skills/problem-solving/SKILL.md +126 -0
- package/skills/problem-solving/references/attribution.md +69 -0
- package/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/skills/problem-solving/references/scale-game.md +95 -0
- package/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/skills/problem-solving/references/when-stuck.md +72 -0
- package/skills/project-management/SKILL.md +137 -0
- package/skills/project-management/references/documentation-triggers.md +33 -0
- package/skills/project-management/references/hydration-workflow.md +45 -0
- package/skills/project-management/references/progress-tracking.md +110 -0
- package/skills/project-management/references/reporting-patterns.md +94 -0
- package/skills/project-management/references/task-operations.md +35 -0
- package/skills/project-organization/SKILL.md +232 -0
- package/skills/project-organization/references/directory-patterns.md +175 -0
- package/skills/project-organization/references/markdown-body-templates.md +314 -0
- package/skills/project-organization/references/naming-conventions.md +140 -0
- package/skills/react-best-practices/AGENTS.md +2249 -0
- package/skills/react-best-practices/README.md +123 -0
- package/skills/react-best-practices/SKILL.md +129 -0
- package/skills/react-best-practices/metadata.json +17 -0
- package/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/react-best-practices/rules/sections.md +46 -0
- package/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/react-best-practices/rules/server-cache-react.md +26 -0
- package/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
- package/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/skills/react-best-practices/rules/template.md +28 -0
- package/skills/remotion/SKILL.md +58 -0
- package/skills/remotion/rules/3d.md +86 -0
- package/skills/remotion/rules/animations.md +29 -0
- package/skills/remotion/rules/assets/charts-bar-chart.tsx +173 -0
- package/skills/remotion/rules/assets/text-animations-typewriter.tsx +100 -0
- package/skills/remotion/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/skills/remotion/rules/assets.md +78 -0
- package/skills/remotion/rules/audio.md +172 -0
- package/skills/remotion/rules/calculate-metadata.md +104 -0
- package/skills/remotion/rules/can-decode.md +75 -0
- package/skills/remotion/rules/charts.md +58 -0
- package/skills/remotion/rules/compositions.md +146 -0
- package/skills/remotion/rules/display-captions.md +126 -0
- package/skills/remotion/rules/effects.md +22 -0
- package/skills/remotion/rules/extract-frames.md +229 -0
- package/skills/remotion/rules/fonts.md +152 -0
- package/skills/remotion/rules/get-audio-duration.md +58 -0
- package/skills/remotion/rules/get-video-dimensions.md +68 -0
- package/skills/remotion/rules/get-video-duration.md +58 -0
- package/skills/remotion/rules/gifs.md +138 -0
- package/skills/remotion/rules/images.md +130 -0
- package/skills/remotion/rules/import-srt-captions.md +67 -0
- package/skills/remotion/rules/lottie.md +68 -0
- package/skills/remotion/rules/measuring-dom-nodes.md +35 -0
- package/skills/remotion/rules/measuring-text.md +143 -0
- package/skills/remotion/rules/sequencing.md +106 -0
- package/skills/remotion/rules/tailwind.md +11 -0
- package/skills/remotion/rules/text-animations.md +20 -0
- package/skills/remotion/rules/timing.md +179 -0
- package/skills/remotion/rules/transcribe-captions.md +19 -0
- package/skills/remotion/rules/transitions.md +122 -0
- package/skills/remotion/rules/trimming.md +53 -0
- package/skills/remotion/rules/videos.md +171 -0
- package/skills/repomix/SKILL.md +257 -0
- package/skills/repomix/references/configuration.md +211 -0
- package/skills/repomix/references/usage-patterns.md +232 -0
- package/skills/repomix/scripts/README.md +179 -0
- package/skills/repomix/scripts/repomix_batch.py +455 -0
- package/skills/repomix/scripts/repos.example.json +15 -0
- package/skills/repomix/scripts/requirements.txt +15 -0
- package/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/research/SKILL.md +201 -0
- package/skills/research-prompt/LICENSE.txt +21 -0
- package/skills/research-prompt/SKILL.md +57 -0
- package/skills/retro/SKILL.md +150 -0
- package/skills/retro/references/metrics-guide.md +133 -0
- package/skills/retro/references/report-template.md +110 -0
- package/skills/review/SKILL.md +41 -0
- package/skills/review-pr/SKILL.md +567 -0
- package/skills/review-pr/references/anti-ai-slop.md +235 -0
- package/skills/review-pr/references/gh-api-helpers.sh +185 -0
- package/skills/review-pr/references/pr-body-contract.md +53 -0
- package/skills/review-pr/references/project-rules-example.md +101 -0
- package/skills/review-pr/references/writing-language.md +58 -0
- package/skills/scenario/SKILL.md +229 -0
- package/skills/scout/SKILL.md +147 -0
- package/skills/scout/references/external-scouting.md +85 -0
- package/skills/scout/references/internal-scouting.md +148 -0
- package/skills/security/SKILL.md +196 -0
- package/skills/security/references/red-team-personas.md +188 -0
- package/skills/security/references/stride-owasp-checklist.md +128 -0
- package/skills/security-scan/SKILL.md +145 -0
- package/skills/security-scan/references/secret-patterns.md +77 -0
- package/skills/security-scan/references/vulnerability-patterns.md +105 -0
- package/skills/sequential-thinking/.env.example +8 -0
- package/skills/sequential-thinking/README.md +183 -0
- package/skills/sequential-thinking/SKILL.md +101 -0
- package/skills/sequential-thinking/package.json +31 -0
- package/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/skills/sequential-thinking/references/examples-api.md +88 -0
- package/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/shader/SKILL.md +119 -0
- package/skills/shader/references/glsl-cellular-voronoi-worley-noise-patterns.md +142 -0
- package/skills/shader/references/glsl-colors-rgb-hsb-gradients-mixing-color-spaces.md +143 -0
- package/skills/shader/references/glsl-fbm-fractional-brownian-motion-turbulence-octaves.md +146 -0
- package/skills/shader/references/glsl-fundamentals-data-types-vectors-precision-coordinates.md +104 -0
- package/skills/shader/references/glsl-noise-random-perlin-simplex-cellular-voronoi.md +115 -0
- package/skills/shader/references/glsl-pattern-symmetry-truchet-domain-warping.md +134 -0
- package/skills/shader/references/glsl-patterns-tiling-fract-matrices-transformations.md +133 -0
- package/skills/shader/references/glsl-procedural-textures-clouds-marble-wood-terrain.md +144 -0
- package/skills/shader/references/glsl-shader-builtin-functions-complete-api-reference.md +112 -0
- package/skills/shader/references/glsl-shapes-polygon-star-polar-sdf-combinations.md +124 -0
- package/skills/shader/references/glsl-shapes-sdf-circles-rectangles-polar-distance-fields.md +106 -0
- package/skills/shader/references/glsl-shaping-functions-step-smoothstep-curves-interpolation.md +141 -0
- package/skills/ship/SKILL.md +244 -0
- package/skills/ship/references/auto-detect.md +103 -0
- package/skills/ship/references/dual-stage-workflow.md +86 -0
- package/skills/ship/references/pr-template.md +87 -0
- package/skills/ship/references/release-and-social-workflow.md +117 -0
- package/skills/ship/references/review-and-merge-workflow.md +31 -0
- package/skills/ship/references/ship-workflow.md +294 -0
- package/skills/ship/scripts/compose-build-in-public.cjs +257 -0
- package/skills/ship/scripts/compose-build-in-public.test.cjs +125 -0
- package/skills/shopify/README.md +66 -0
- package/skills/shopify/SKILL.md +327 -0
- package/skills/shopify/references/app-development.md +470 -0
- package/skills/shopify/references/extensions.md +493 -0
- package/skills/shopify/references/themes.md +498 -0
- package/skills/shopify/scripts/requirements.txt +19 -0
- package/skills/shopify/scripts/shopify_init.py +423 -0
- package/skills/shopify/scripts/tests/test_shopify_init.py +385 -0
- package/skills/show-off/SKILL.md +244 -0
- package/skills/show-off/scripts/capture-sections.js +310 -0
- package/skills/show-off/scripts/package.json +16 -0
- package/skills/show-off/scripts/preferences.js +228 -0
- package/skills/show-off/scripts/preferences.test.js +94 -0
- package/skills/skill-creator/LICENSE-MIT.txt +21 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +156 -0
- package/skills/skill-creator/references/benchmark-optimization-guide.md +86 -0
- package/skills/skill-creator/references/cross-marketplace-distribution.md +262 -0
- package/skills/skill-creator/references/distribution-guide.md +79 -0
- package/skills/skill-creator/references/mcp-skills-integration.md +71 -0
- package/skills/skill-creator/references/metadata-quality-criteria.md +94 -0
- package/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -0
- package/skills/skill-creator/references/plugin-marketplace-overview.md +90 -0
- package/skills/skill-creator/references/plugin-marketplace-schema.md +93 -0
- package/skills/skill-creator/references/plugin-marketplace-sources.md +103 -0
- package/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -0
- package/skills/skill-creator/references/script-dependency-strategy.md +141 -0
- package/skills/skill-creator/references/script-quality-criteria.md +151 -0
- package/skills/skill-creator/references/skill-anatomy-and-requirements.md +77 -0
- package/skills/skill-creator/references/skill-creation-workflow.md +160 -0
- package/skills/skill-creator/references/skill-design-patterns.md +75 -0
- package/skills/skill-creator/references/skill-ecosystem-portability-and-safety.md +60 -0
- package/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -0
- package/skills/skill-creator/references/structure-organization-criteria.md +114 -0
- package/skills/skill-creator/references/testing-and-iteration.md +78 -0
- package/skills/skill-creator/references/token-efficiency-criteria.md +74 -0
- package/skills/skill-creator/references/troubleshooting-guide.md +81 -0
- package/skills/skill-creator/references/validation-checklist.md +83 -0
- package/skills/skill-creator/references/writing-effective-instructions.md +88 -0
- package/skills/skill-creator/references/yaml-frontmatter-reference.md +92 -0
- package/skills/skill-creator/scripts/encoding_utils.py +36 -0
- package/skills/skill-creator/scripts/init_skill.py +371 -0
- package/skills/skill-creator/scripts/package_skill.py +161 -0
- package/skills/skill-creator/scripts/quick_validate.py +110 -0
- package/skills/sowat/SKILL.md +41 -0
- package/skills/stitch/SKILL.md +193 -0
- package/skills/stitch/data/mcp-config-snippet.json +11 -0
- package/skills/stitch/references/design-to-code-pipeline.md +128 -0
- package/skills/stitch/references/quota-management.md +64 -0
- package/skills/stitch/references/stitch-mcp-setup.md +95 -0
- package/skills/stitch/references/stitch-sdk-api.md +136 -0
- package/skills/stitch/scripts/package.json +17 -0
- package/skills/stitch/scripts/stitch-export.ts +241 -0
- package/skills/stitch/scripts/stitch-generate.ts +242 -0
- package/skills/stitch/scripts/stitch-quota.ts +123 -0
- package/skills/sumup/SKILL.md +48 -0
- package/skills/tanstack/SKILL.md +148 -0
- package/skills/tanstack/references/tanstack-ai.md +97 -0
- package/skills/tanstack/references/tanstack-form.md +125 -0
- package/skills/tanstack/references/tanstack-start.md +100 -0
- package/skills/team/SKILL.md +226 -0
- package/skills/team/references/agent-teams-controls-and-modes.md +53 -0
- package/skills/team/references/agent-teams-examples-and-best-practices.md +145 -0
- package/skills/team/references/agent-teams-official-docs.md +67 -0
- package/skills/team/references/team-coordination-rules.md +92 -0
- package/skills/tech-graph/LICENSE +21 -0
- package/skills/tech-graph/README.md +524 -0
- package/skills/tech-graph/SKILL.md +445 -0
- package/skills/tech-graph/agents/openai.yaml +4 -0
- package/skills/tech-graph/fixtures/agent-memory-types-style4.json +181 -0
- package/skills/tech-graph/fixtures/api-flow-style7.json +40 -0
- package/skills/tech-graph/fixtures/mem0-style1.json +297 -0
- package/skills/tech-graph/fixtures/microservices-style3.json +64 -0
- package/skills/tech-graph/fixtures/multi-agent-style5.json +45 -0
- package/skills/tech-graph/fixtures/system-architecture-style6.json +48 -0
- package/skills/tech-graph/fixtures/tool-call-style2.json +182 -0
- package/skills/tech-graph/references/icons.md +406 -0
- package/skills/tech-graph/references/style-1-flat-icon.md +108 -0
- package/skills/tech-graph/references/style-2-dark-terminal.md +107 -0
- package/skills/tech-graph/references/style-3-blueprint.md +113 -0
- package/skills/tech-graph/references/style-4-notion-clean.md +95 -0
- package/skills/tech-graph/references/style-5-glassmorphism.md +125 -0
- package/skills/tech-graph/references/style-6-claude-official.md +209 -0
- package/skills/tech-graph/references/style-7-openai.md +215 -0
- package/skills/tech-graph/references/style-diagram-matrix.md +135 -0
- package/skills/tech-graph/references/svg-layout-best-practices.md +100 -0
- package/skills/tech-graph/scripts/README.md +244 -0
- package/skills/tech-graph/scripts/generate-diagram.sh +157 -0
- package/skills/tech-graph/scripts/generate-from-template.py +1556 -0
- package/skills/tech-graph/scripts/test-all-styles.sh +135 -0
- package/skills/tech-graph/scripts/validate-svg.sh +292 -0
- package/skills/tech-graph/templates/agent-architecture.svg +28 -0
- package/skills/tech-graph/templates/architecture.svg +23 -0
- package/skills/tech-graph/templates/comparison-matrix.svg +14 -0
- package/skills/tech-graph/templates/data-flow.svg +28 -0
- package/skills/tech-graph/templates/er-diagram.svg +21 -0
- package/skills/tech-graph/templates/flowchart.svg +21 -0
- package/skills/tech-graph/templates/sequence.svg +20 -0
- package/skills/tech-graph/templates/state-machine.svg +20 -0
- package/skills/tech-graph/templates/timeline.svg +19 -0
- package/skills/tech-graph/templates/use-case.svg +21 -0
- package/skills/test/SKILL.md +200 -0
- package/skills/test/references/audit-suite-workflow.md +70 -0
- package/skills/test/references/create-suite-workflow.md +60 -0
- package/skills/test/references/optimize-suite-workflow.md +61 -0
- package/skills/test/references/report-format.md +58 -0
- package/skills/test/references/test-execution-workflow.md +103 -0
- package/skills/test/references/ui-testing-workflow.md +64 -0
- package/skills/threejs/SKILL.md +148 -0
- package/skills/threejs/data/api-reference.csv +61 -0
- package/skills/threejs/data/categories.csv +14 -0
- package/skills/threejs/data/examples-all.csv +557 -0
- package/skills/threejs/data/use-cases.csv +21 -0
- package/skills/threejs/references/00-fundamentals.md +487 -0
- package/skills/threejs/references/01-getting-started.md +177 -0
- package/skills/threejs/references/02-loaders.md +169 -0
- package/skills/threejs/references/03-textures.md +170 -0
- package/skills/threejs/references/04-cameras.md +195 -0
- package/skills/threejs/references/05-lights.md +183 -0
- package/skills/threejs/references/06-animations.md +214 -0
- package/skills/threejs/references/07-math.md +260 -0
- package/skills/threejs/references/08-interaction.md +267 -0
- package/skills/threejs/references/09-postprocessing.md +240 -0
- package/skills/threejs/references/10-controls.md +259 -0
- package/skills/threejs/references/11-materials-advanced.md +270 -0
- package/skills/threejs/references/11-materials.md +519 -0
- package/skills/threejs/references/12-performance.md +269 -0
- package/skills/threejs/references/13-node-materials.md +298 -0
- package/skills/threejs/references/14-physics-vr.md +304 -0
- package/skills/threejs/references/15-specialized-loaders.md +333 -0
- package/skills/threejs/references/16-webgpu.md +302 -0
- package/skills/threejs/references/17-shader.md +641 -0
- package/skills/threejs/references/18-geometry.md +547 -0
- package/skills/threejs/scripts/core.py +236 -0
- package/skills/threejs/scripts/extract_examples.py +688 -0
- package/skills/threejs/scripts/generate_csv_from_json.py +135 -0
- package/skills/threejs/scripts/search.py +77 -0
- package/skills/ui-styling/LICENSE.txt +202 -0
- package/skills/ui-styling/SKILL.md +328 -0
- package/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ui-styling/references/shadcn-components.md +424 -0
- package/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ui-styling/scripts/requirements.txt +17 -0
- package/skills/ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ui-ux-pro-max/SKILL.md +666 -0
- package/skills/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +162 -0
- package/skills/ui-ux-pro-max/data/design.csv +1776 -0
- package/skills/ui-ux-pro-max/data/draft.csv +1779 -0
- package/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/skills/ui-ux-pro-max/data/products.csv +162 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/styles.csv +85 -0
- package/skills/ui-ux-pro-max/data/typography.csv +74 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/scripts/core.py +247 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/use-mcp/SKILL.md +82 -0
- package/skills/use-mcp/assets/tools.json +3146 -0
- package/skills/use-mcp/references/configuration.md +115 -0
- package/skills/use-mcp/references/gemini-cli-integration.md +24 -0
- package/skills/use-mcp/references/mcp-protocol.md +116 -0
- package/skills/use-mcp/scripts/.env.example +10 -0
- package/skills/use-mcp/scripts/cli.ts +195 -0
- package/skills/use-mcp/scripts/mcp-client.ts +230 -0
- package/skills/use-mcp/scripts/package.json +20 -0
- package/skills/use-mcp/scripts/smoke-test.sh +82 -0
- package/skills/use-mcp/scripts/tsconfig.json +15 -0
- package/skills/vibe/SKILL.md +287 -0
- package/skills/watzup/SKILL.md +80 -0
- package/skills/watzup/scripts/lib/checkboxes.cjs +69 -0
- package/skills/watzup/scripts/lib/priority.cjs +149 -0
- package/skills/watzup/scripts/lib/roadmap.cjs +102 -0
- package/skills/watzup/scripts/watzup-scan.cjs +534 -0
- package/skills/watzup/scripts/watzup-scan.test.cjs +392 -0
- package/skills/web-design-guidelines/SKILL.md +43 -0
- package/skills/web-frameworks/SKILL.md +332 -0
- package/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/skills/web-frameworks/scripts/__init__.py +0 -0
- package/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/skills/web-frameworks/scripts/requirements.txt +16 -0
- package/skills/web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/skills/web-frameworks/scripts/tests/requirements.txt +3 -0
- package/skills/web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/skills/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/skills/web-testing/SKILL.md +103 -0
- package/skills/web-testing/references/accessibility-testing.md +84 -0
- package/skills/web-testing/references/api-testing.md +78 -0
- package/skills/web-testing/references/ci-cd-testing-workflows.md +121 -0
- package/skills/web-testing/references/component-testing.md +94 -0
- package/skills/web-testing/references/contract-testing.md +146 -0
- package/skills/web-testing/references/cross-browser-checklist.md +72 -0
- package/skills/web-testing/references/database-testing.md +139 -0
- package/skills/web-testing/references/e2e-testing-playwright.md +119 -0
- package/skills/web-testing/references/functional-testing-checklist.md +88 -0
- package/skills/web-testing/references/interactive-testing-patterns.md +89 -0
- package/skills/web-testing/references/load-testing-k6.md +93 -0
- package/skills/web-testing/references/mobile-gesture-testing.md +85 -0
- package/skills/web-testing/references/performance-core-web-vitals.md +124 -0
- package/skills/web-testing/references/playwright-component-testing.md +115 -0
- package/skills/web-testing/references/pre-release-checklist.md +75 -0
- package/skills/web-testing/references/security-checklists.md +81 -0
- package/skills/web-testing/references/security-testing-overview.md +92 -0
- package/skills/web-testing/references/shadow-dom-testing.md +70 -0
- package/skills/web-testing/references/test-data-management.md +131 -0
- package/skills/web-testing/references/test-flakiness-mitigation.md +86 -0
- package/skills/web-testing/references/testing-pyramid-strategy.md +76 -0
- package/skills/web-testing/references/unit-integration-testing.md +138 -0
- package/skills/web-testing/references/visual-regression.md +92 -0
- package/skills/web-testing/references/vulnerability-payloads.md +93 -0
- package/skills/web-testing/scripts/analyze-test-results.js +280 -0
- package/skills/web-testing/scripts/init-playwright.js +233 -0
- package/skills/web-testing/skill.yaml +17 -0
- package/skills/worktree/SKILL.md +174 -0
- package/skills/worktree/scripts/mini-yaml-parser.cjs +232 -0
- package/skills/worktree/scripts/resolve-worktree-root.cjs +266 -0
- package/skills/worktree/scripts/resolve-worktree-root.test.cjs +257 -0
- package/skills/worktree/scripts/worktree.cjs +1337 -0
- package/skills/worktree/scripts/worktree.test.cjs +1127 -0
- package/skills/xia/SKILL.md +197 -0
- package/skills/xia/intro.html +487 -0
- package/skills/xia/references/challenge-framework.md +40 -0
|
@@ -0,0 +1,1127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Test suite for worktree.cjs
|
|
4
|
+
* Run: node .claude/skills/ak-worktree/scripts/worktree.test.cjs
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { execSync } = require('child_process');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const os = require('os');
|
|
11
|
+
|
|
12
|
+
const SCRIPT_PATH = path.join(__dirname, 'worktree.cjs');
|
|
13
|
+
const STANDALONE_DIR = path.dirname(path.dirname(__dirname)); // worktree dir
|
|
14
|
+
const MONOREPO_DIR = process.env.MONOREPO_DIR || '/path/to/claudekit';
|
|
15
|
+
const CURRENT_GIT_ROOT = execSync('git rev-parse --show-toplevel', {
|
|
16
|
+
encoding: 'utf-8',
|
|
17
|
+
cwd: STANDALONE_DIR,
|
|
18
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
19
|
+
}).trim();
|
|
20
|
+
|
|
21
|
+
let passed = 0;
|
|
22
|
+
let failed = 0;
|
|
23
|
+
const results = [];
|
|
24
|
+
|
|
25
|
+
// Test helper
|
|
26
|
+
function run(args, options = {}) {
|
|
27
|
+
const cwd = options.cwd || STANDALONE_DIR;
|
|
28
|
+
try {
|
|
29
|
+
const output = execSync(`node "${SCRIPT_PATH}" ${args}`, {
|
|
30
|
+
encoding: 'utf-8',
|
|
31
|
+
cwd,
|
|
32
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
33
|
+
});
|
|
34
|
+
return { success: true, output: output.trim(), exitCode: 0 };
|
|
35
|
+
} catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
output: error.stdout?.toString().trim() || '',
|
|
39
|
+
stderr: error.stderr?.toString().trim() || '',
|
|
40
|
+
exitCode: error.status || 1
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function test(name, fn) {
|
|
46
|
+
try {
|
|
47
|
+
fn();
|
|
48
|
+
passed++;
|
|
49
|
+
results.push({ name, status: 'PASS' });
|
|
50
|
+
console.log(` ✓ ${name}`);
|
|
51
|
+
} catch (error) {
|
|
52
|
+
failed++;
|
|
53
|
+
results.push({ name, status: 'FAIL', error: error.message });
|
|
54
|
+
console.log(` ✗ ${name}`);
|
|
55
|
+
console.log(` Error: ${error.message}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function assert(condition, message) {
|
|
60
|
+
if (!condition) throw new Error(message || 'Assertion failed');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function assertJSON(str) {
|
|
64
|
+
try {
|
|
65
|
+
return JSON.parse(str);
|
|
66
|
+
} catch {
|
|
67
|
+
throw new Error(`Invalid JSON: ${str.slice(0, 100)}...`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Isolated fixtures for worktree.root config precedence tests: a throwaway
|
|
72
|
+
// git repo (never the real agentkit repo) plus a throwaway HOME, so these
|
|
73
|
+
// tests can freely write .agentkit/config.yaml without touching real state.
|
|
74
|
+
function mkTempGitRepo() {
|
|
75
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ak-wt-test-repo-'));
|
|
76
|
+
execSync('git init -q', { cwd: dir, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
77
|
+
return dir;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function mkTempHome() {
|
|
81
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), 'ak-wt-test-home-'));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function writeWorktreeRootConfig(dir, root) {
|
|
85
|
+
fs.mkdirSync(path.join(dir, '.agentkit'), { recursive: true });
|
|
86
|
+
fs.writeFileSync(path.join(dir, '.agentkit', 'config.yaml'), `worktree:\n root: ${root}\n`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function runInRepo(repoDir, homeDir, args) {
|
|
90
|
+
try {
|
|
91
|
+
const output = execSync(`node "${SCRIPT_PATH}" ${args}`, {
|
|
92
|
+
encoding: 'utf-8',
|
|
93
|
+
cwd: repoDir,
|
|
94
|
+
env: { ...process.env, HOME: homeDir, USERPROFILE: homeDir },
|
|
95
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
96
|
+
});
|
|
97
|
+
return { success: true, output: output.trim() };
|
|
98
|
+
} catch (error) {
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
output: error.stdout?.toString().trim() || '',
|
|
102
|
+
stderr: error.stderr?.toString().trim() || ''
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ============================================
|
|
108
|
+
// INFO COMMAND TESTS
|
|
109
|
+
// ============================================
|
|
110
|
+
console.log('\n📋 INFO Command Tests');
|
|
111
|
+
|
|
112
|
+
test('info returns valid JSON', () => {
|
|
113
|
+
const result = run('info --json');
|
|
114
|
+
assert(result.success, 'Command should succeed');
|
|
115
|
+
const json = assertJSON(result.output);
|
|
116
|
+
assert(json.info === true, 'Should have info: true');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('info detects repo type', () => {
|
|
120
|
+
const result = run('info --json');
|
|
121
|
+
const json = assertJSON(result.output);
|
|
122
|
+
assert(['standalone', 'monorepo'].includes(json.repoType), 'Should detect repo type');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('info detects base branch', () => {
|
|
126
|
+
const result = run('info --json');
|
|
127
|
+
const json = assertJSON(result.output);
|
|
128
|
+
assert(json.baseBranch, 'Should detect base branch');
|
|
129
|
+
assert(['dev', 'develop', 'main', 'master'].includes(json.baseBranch), 'Should be valid branch');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('info finds env files', () => {
|
|
133
|
+
const result = run('info --json');
|
|
134
|
+
const json = assertJSON(result.output);
|
|
135
|
+
assert(Array.isArray(json.envFiles), 'Should have envFiles array');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test('info detects dirty state', () => {
|
|
139
|
+
const result = run('info --json');
|
|
140
|
+
const json = assertJSON(result.output);
|
|
141
|
+
assert(typeof json.dirtyState === 'boolean', 'Should have dirtyState boolean');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('info detects monorepo from monorepo root', () => {
|
|
145
|
+
if (!fs.existsSync(MONOREPO_DIR)) return; // Skip if not available
|
|
146
|
+
const result = run('info --json', { cwd: MONOREPO_DIR });
|
|
147
|
+
const json = assertJSON(result.output);
|
|
148
|
+
assert(json.repoType === 'monorepo', 'Should detect monorepo');
|
|
149
|
+
assert(json.projects.length > 0, 'Should have projects');
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('monorepo uses internal worktrees directory', () => {
|
|
153
|
+
if (!fs.existsSync(MONOREPO_DIR)) return; // Skip if not available
|
|
154
|
+
const result = run('info --json', { cwd: MONOREPO_DIR });
|
|
155
|
+
const json = assertJSON(result.output);
|
|
156
|
+
// Monorepo should use worktrees/ inside the repo, not sibling
|
|
157
|
+
assert(json.worktreeRoot === path.join(MONOREPO_DIR, 'worktrees'),
|
|
158
|
+
`Expected ${path.join(MONOREPO_DIR, 'worktrees')}, got ${json.worktreeRoot}`);
|
|
159
|
+
assert(json.worktreeRootSource === 'monorepo internal',
|
|
160
|
+
`Expected 'monorepo internal', got ${json.worktreeRootSource}`);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('info returns text output without --json', () => {
|
|
164
|
+
const result = run('info');
|
|
165
|
+
assert(result.success, 'Command should succeed');
|
|
166
|
+
assert(result.output.includes('Repository Info'), 'Should have text output');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// ============================================
|
|
170
|
+
// LIST COMMAND TESTS
|
|
171
|
+
// ============================================
|
|
172
|
+
console.log('\n📂 LIST Command Tests');
|
|
173
|
+
|
|
174
|
+
test('list returns valid JSON', () => {
|
|
175
|
+
const result = run('list --json');
|
|
176
|
+
assert(result.success, 'Command should succeed');
|
|
177
|
+
const json = assertJSON(result.output);
|
|
178
|
+
assert(json.success === true, 'Should have success: true');
|
|
179
|
+
assert(Array.isArray(json.worktrees), 'Should have worktrees array');
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
test('list worktrees have required fields', () => {
|
|
183
|
+
const result = run('list --json');
|
|
184
|
+
const json = assertJSON(result.output);
|
|
185
|
+
if (json.worktrees.length > 0) {
|
|
186
|
+
const wt = json.worktrees[0];
|
|
187
|
+
assert(wt.path, 'Worktree should have path');
|
|
188
|
+
assert(wt.commit, 'Worktree should have commit');
|
|
189
|
+
assert(wt.branch, 'Worktree should have branch');
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test('list returns text output without --json', () => {
|
|
194
|
+
const result = run('list');
|
|
195
|
+
assert(result.success, 'Command should succeed');
|
|
196
|
+
assert(result.output.includes('worktrees'), 'Should have text output');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// ============================================
|
|
200
|
+
// STATUS COMMAND TESTS
|
|
201
|
+
// ============================================
|
|
202
|
+
console.log('\n🩺 STATUS Command Tests');
|
|
203
|
+
|
|
204
|
+
test('status returns valid JSON', () => {
|
|
205
|
+
const result = run('status --json');
|
|
206
|
+
assert(result.success, 'Command should succeed');
|
|
207
|
+
const json = assertJSON(result.output);
|
|
208
|
+
assert(json.success === true, 'Should have success: true');
|
|
209
|
+
assert(json.currentWorktree, 'Should include currentWorktree');
|
|
210
|
+
assert(Array.isArray(json.worktrees), 'Should include worktrees array');
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('status reports current worktree health fields', () => {
|
|
214
|
+
const result = run('status --json');
|
|
215
|
+
const json = assertJSON(result.output);
|
|
216
|
+
const current = json.currentWorktree;
|
|
217
|
+
assert(current.path === CURRENT_GIT_ROOT, `Should normalize current path to ${CURRENT_GIT_ROOT}`);
|
|
218
|
+
assert(typeof current.isCurrentWorktree === 'boolean', 'Should flag current worktree');
|
|
219
|
+
assert(typeof current.isMainWorktree === 'boolean', 'Should flag main worktree');
|
|
220
|
+
assert(typeof current.branchExists === 'boolean', 'Should report branch existence');
|
|
221
|
+
assert(typeof current.dirtyState === 'boolean', 'Should report dirty state');
|
|
222
|
+
assert(typeof current.ahead === 'number', 'Should report ahead count');
|
|
223
|
+
assert(typeof current.behind === 'number', 'Should report behind count');
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test('status includes normalized path entry for current worktree', () => {
|
|
227
|
+
const result = run('status --json');
|
|
228
|
+
const json = assertJSON(result.output);
|
|
229
|
+
assert(json.worktrees.some(w => w.path === CURRENT_GIT_ROOT), 'Should include normalized current worktree path');
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test('status returns text output without --json', () => {
|
|
233
|
+
const result = run('status');
|
|
234
|
+
assert(result.success, 'Command should succeed');
|
|
235
|
+
assert(result.output.includes('Worktree Status'), 'Should have text output');
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
// ============================================
|
|
239
|
+
// CREATE COMMAND TESTS
|
|
240
|
+
// ============================================
|
|
241
|
+
console.log('\n🆕 CREATE Command Tests');
|
|
242
|
+
|
|
243
|
+
test('create requires feature name', () => {
|
|
244
|
+
const result = run('create --json');
|
|
245
|
+
assert(!result.success, 'Should fail without feature');
|
|
246
|
+
const json = assertJSON(result.output);
|
|
247
|
+
assert(json.error.code === 'MISSING_FEATURE', 'Should have MISSING_FEATURE error');
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test('create dry-run does not create worktree', () => {
|
|
251
|
+
const result = run('create test-dry-run --prefix feat --dry-run --json');
|
|
252
|
+
assert(result.success, 'Dry-run should succeed');
|
|
253
|
+
const json = assertJSON(result.output);
|
|
254
|
+
assert(json.dryRun === true, 'Should have dryRun: true');
|
|
255
|
+
assert(json.wouldCreate, 'Should have wouldCreate object');
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
test('create dry-run shows correct branch name', () => {
|
|
259
|
+
const result = run('create my-feature --prefix fix --dry-run --json');
|
|
260
|
+
const json = assertJSON(result.output);
|
|
261
|
+
assert(json.wouldCreate.branch === 'fix/my-feature', 'Branch should be fix/my-feature');
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test('create sanitizes feature name - spaces', () => {
|
|
265
|
+
const result = run('create "my cool feature" --dry-run --json');
|
|
266
|
+
const json = assertJSON(result.output);
|
|
267
|
+
assert(json.wouldCreate.branch.includes('my-cool-feature'), 'Should sanitize spaces');
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test('create sanitizes feature name - uppercase', () => {
|
|
271
|
+
const result = run('create "MyFeature" --dry-run --json');
|
|
272
|
+
const json = assertJSON(result.output);
|
|
273
|
+
assert(json.wouldCreate.branch.includes('myfeature'), 'Should lowercase');
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test('create sanitizes feature name - special chars', () => {
|
|
277
|
+
const result = run('create "feat@#$test" --dry-run --json');
|
|
278
|
+
const json = assertJSON(result.output);
|
|
279
|
+
assert(!json.wouldCreate.branch.includes('@'), 'Should remove special chars');
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
test('create respects --prefix flag', () => {
|
|
283
|
+
const prefixes = ['feat', 'fix', 'docs', 'refactor', 'test', 'chore', 'perf'];
|
|
284
|
+
for (const prefix of prefixes) {
|
|
285
|
+
const result = run(`create test-${prefix} --prefix ${prefix} --dry-run --json`);
|
|
286
|
+
const json = assertJSON(result.output);
|
|
287
|
+
assert(json.wouldCreate.branch.startsWith(`${prefix}/`), `Should use ${prefix} prefix`);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
test('create shows base branch', () => {
|
|
292
|
+
const result = run('create test-base --dry-run --json');
|
|
293
|
+
const json = assertJSON(result.output);
|
|
294
|
+
assert(json.wouldCreate.baseBranch, 'Should show base branch');
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
test('create shows worktree path', () => {
|
|
298
|
+
const result = run('create test-path --dry-run --json');
|
|
299
|
+
const json = assertJSON(result.output);
|
|
300
|
+
assert(json.wouldCreate.worktreePath, 'Should show worktree path');
|
|
301
|
+
assert(json.wouldCreate.worktreePath.includes('worktrees'), 'Path should include worktrees dir');
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
test('create dry-run surfaces checkout-submodules flag', () => {
|
|
305
|
+
const result = run('create test-submodules --dry-run --json --checkout-submodules');
|
|
306
|
+
assert(result.success, 'Should succeed');
|
|
307
|
+
const json = assertJSON(result.output);
|
|
308
|
+
assert(json.wouldCreate.checkoutSubmodules === true, 'Should show checkoutSubmodules flag');
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
test('create dry-run shows explicit base branch source', () => {
|
|
312
|
+
const result = run('create test-explicit-base --dry-run --json --base dev');
|
|
313
|
+
assert(result.success, 'Should succeed with explicit base');
|
|
314
|
+
const json = assertJSON(result.output);
|
|
315
|
+
assert(json.wouldCreate.baseBranch === 'dev', 'Should use explicit base branch');
|
|
316
|
+
assert(json.wouldCreate.baseBranchSource === 'explicit', 'Should mark baseBranchSource as explicit');
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
test('create rejects invalid explicit base branch input', () => {
|
|
320
|
+
const result = run('create test-invalid-base --json --base "--oops"');
|
|
321
|
+
assert(!result.success, 'Should fail with invalid base branch');
|
|
322
|
+
const json = assertJSON(result.output);
|
|
323
|
+
assert(json.error.code === 'INVALID_BASE_BRANCH', 'Should report INVALID_BASE_BRANCH');
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
test('create rejects nonexistent explicit base branch', () => {
|
|
327
|
+
const result = run('create test-missing-base --json --base branch-that-should-not-exist-xyz');
|
|
328
|
+
assert(!result.success, 'Should fail with nonexistent base branch');
|
|
329
|
+
const json = assertJSON(result.output);
|
|
330
|
+
assert(json.error.code === 'BASE_BRANCH_NOT_FOUND', 'Should report BASE_BRANCH_NOT_FOUND');
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
test('create in monorepo requires project', () => {
|
|
334
|
+
if (!fs.existsSync(MONOREPO_DIR)) return;
|
|
335
|
+
const result = run('create --json', { cwd: MONOREPO_DIR });
|
|
336
|
+
assert(!result.success, 'Should fail without project in monorepo');
|
|
337
|
+
const json = assertJSON(result.output);
|
|
338
|
+
assert(json.error.code === 'MISSING_ARGS', 'Should have MISSING_ARGS error');
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
test('create in monorepo with project works', () => {
|
|
342
|
+
if (!fs.existsSync(MONOREPO_DIR)) return;
|
|
343
|
+
const result = run('create engineer test-mono --prefix feat --dry-run --json', { cwd: MONOREPO_DIR });
|
|
344
|
+
assert(result.success, 'Should succeed with project');
|
|
345
|
+
const json = assertJSON(result.output);
|
|
346
|
+
assert(json.wouldCreate.project === 'claudekit-engineer', 'Should detect project');
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
test('create detects invalid project', () => {
|
|
350
|
+
if (!fs.existsSync(MONOREPO_DIR)) return;
|
|
351
|
+
const result = run('create nonexistent test-invalid --json', { cwd: MONOREPO_DIR });
|
|
352
|
+
assert(!result.success, 'Should fail with invalid project');
|
|
353
|
+
const json = assertJSON(result.output);
|
|
354
|
+
assert(json.error.code === 'PROJECT_NOT_FOUND', 'Should have PROJECT_NOT_FOUND error');
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// ============================================
|
|
358
|
+
// REMOVE COMMAND TESTS
|
|
359
|
+
// ============================================
|
|
360
|
+
console.log('\n🗑️ REMOVE Command Tests');
|
|
361
|
+
|
|
362
|
+
test('remove requires worktree name', () => {
|
|
363
|
+
const result = run('remove --json');
|
|
364
|
+
assert(!result.success, 'Should fail without name');
|
|
365
|
+
const json = assertJSON(result.output);
|
|
366
|
+
assert(json.error.code === 'MISSING_WORKTREE', 'Should have MISSING_WORKTREE error');
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
test('remove dry-run does not remove worktree', () => {
|
|
370
|
+
// First get a worktree name from list
|
|
371
|
+
const listResult = run('list --json');
|
|
372
|
+
const listJson = assertJSON(listResult.output);
|
|
373
|
+
const removable = listJson.worktrees.find(w => !w.isMainWorktree);
|
|
374
|
+
|
|
375
|
+
if (removable) {
|
|
376
|
+
const name = path.basename(removable.path);
|
|
377
|
+
const result = run(`remove "${name}" --dry-run --json`);
|
|
378
|
+
assert(result.success, 'Dry-run should succeed');
|
|
379
|
+
const json = assertJSON(result.output);
|
|
380
|
+
assert(json.dryRun === true, 'Should have dryRun: true');
|
|
381
|
+
assert(json.wouldRemove, 'Should have wouldRemove object');
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
test('remove handles not found', () => {
|
|
386
|
+
const result = run('remove nonexistent-worktree-xyz --json');
|
|
387
|
+
assert(!result.success, 'Should fail for nonexistent');
|
|
388
|
+
const json = assertJSON(result.output);
|
|
389
|
+
assert(json.error.code === 'WORKTREE_NOT_FOUND', 'Should have WORKTREE_NOT_FOUND error');
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
test('remove error includes available worktrees', () => {
|
|
393
|
+
const result = run('remove nonexistent-worktree-xyz --json');
|
|
394
|
+
const json = assertJSON(result.output);
|
|
395
|
+
assert(Array.isArray(json.error.availableWorktrees), 'Should list available worktrees');
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
// ============================================
|
|
399
|
+
// PRUNE COMMAND TESTS
|
|
400
|
+
// ============================================
|
|
401
|
+
console.log('\n🧹 PRUNE Command Tests');
|
|
402
|
+
|
|
403
|
+
test('prune dry-run returns valid JSON', () => {
|
|
404
|
+
const result = run('prune --dry-run --json');
|
|
405
|
+
assert(result.success, 'Dry-run should succeed');
|
|
406
|
+
const json = assertJSON(result.output);
|
|
407
|
+
assert(json.success === true, 'Should have success: true');
|
|
408
|
+
assert(json.dryRun === true, 'Should have dryRun: true');
|
|
409
|
+
assert(Array.isArray(json.entries), 'Should include entries array');
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
test('prune text output is readable', () => {
|
|
413
|
+
const result = run('prune --dry-run');
|
|
414
|
+
assert(result.success, 'Dry-run should succeed');
|
|
415
|
+
assert(result.output.includes('Prune'), 'Should have readable prune output');
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
// ============================================
|
|
419
|
+
// AUTO-FEATURES TESTS (env templates)
|
|
420
|
+
// ============================================
|
|
421
|
+
console.log('\n🤖 Auto-Features Tests');
|
|
422
|
+
|
|
423
|
+
test('create dry-run succeeds', () => {
|
|
424
|
+
const result = run('create test-env-feature --prefix feat --dry-run --json');
|
|
425
|
+
assert(result.success, 'Dry-run should succeed');
|
|
426
|
+
const json = assertJSON(result.output);
|
|
427
|
+
assert(json.dryRun === true, 'Should have dryRun: true');
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
test('create ignores unsafe --env traversal entries', () => {
|
|
431
|
+
const result = run('create env-guard --prefix feat --dry-run --json --env "../.env,secrets/.env,.env.local"');
|
|
432
|
+
assert(result.success, 'Dry-run should succeed');
|
|
433
|
+
const json = assertJSON(result.output);
|
|
434
|
+
assert(Array.isArray(json.warnings), 'Should include warnings');
|
|
435
|
+
assert(json.warnings.some(w => w.includes('unsafe env file')), 'Should warn for unsafe env entries');
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
// ============================================
|
|
439
|
+
// WORKTREE ROOT DETECTION TESTS
|
|
440
|
+
// ============================================
|
|
441
|
+
console.log('\n📍 Worktree Root Detection Tests');
|
|
442
|
+
|
|
443
|
+
test('info shows worktreeRoot and worktreeRootSource', () => {
|
|
444
|
+
const result = run('info --json');
|
|
445
|
+
const json = assertJSON(result.output);
|
|
446
|
+
assert(json.worktreeRoot, 'Should have worktreeRoot');
|
|
447
|
+
assert(json.worktreeRootSource, 'Should have worktreeRootSource');
|
|
448
|
+
assert(typeof json.worktreeRoot === 'string', 'worktreeRoot should be string');
|
|
449
|
+
assert(json.worktreeRoot.includes('worktrees'), 'worktreeRoot should include worktrees');
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
test('create --worktree-root overrides default location', () => {
|
|
453
|
+
const customRoot = '/tmp/test-worktrees';
|
|
454
|
+
const result = run(`create test-custom-root --prefix feat --dry-run --json --worktree-root "${customRoot}"`);
|
|
455
|
+
assert(result.success, 'Should succeed with custom root');
|
|
456
|
+
const json = assertJSON(result.output);
|
|
457
|
+
assert(json.wouldCreate.worktreePath.startsWith(customRoot), 'Path should use custom root');
|
|
458
|
+
assert(json.wouldCreate.worktreeRootSource === '--worktree-root flag', 'Source should be flag');
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
test('create --worktree-root with relative path resolves to absolute', () => {
|
|
462
|
+
const result = run('create test-relative --prefix feat --dry-run --json --worktree-root "./custom-worktrees"');
|
|
463
|
+
assert(result.success, 'Should succeed');
|
|
464
|
+
const json = assertJSON(result.output);
|
|
465
|
+
assert(path.isAbsolute(json.wouldCreate.worktreePath), 'Path should be absolute');
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
test('create dry-run shows worktreeRootSource', () => {
|
|
469
|
+
const result = run('create test-source --prefix feat --dry-run --json');
|
|
470
|
+
assert(result.success, 'Should succeed');
|
|
471
|
+
const json = assertJSON(result.output);
|
|
472
|
+
assert(json.wouldCreate.worktreeRootSource, 'Should show worktreeRootSource');
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
test('superproject detection in submodule', () => {
|
|
476
|
+
// Test from claudekit-engineer submodule
|
|
477
|
+
const submodulePath = path.join(MONOREPO_DIR, 'claudekit-engineer');
|
|
478
|
+
if (!fs.existsSync(submodulePath)) return;
|
|
479
|
+
const result = run('info --json', { cwd: submodulePath });
|
|
480
|
+
const json = assertJSON(result.output);
|
|
481
|
+
// Should detect parent monorepo as superproject
|
|
482
|
+
assert(json.worktreeRootSource.includes('superproject') || json.worktreeRootSource === 'monorepo root',
|
|
483
|
+
'Should detect superproject or monorepo root');
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
test('WORKTREE_ROOT env var overrides detection', () => {
|
|
487
|
+
const envRoot = '/tmp/env-worktrees';
|
|
488
|
+
try {
|
|
489
|
+
const output = execSync(`WORKTREE_ROOT="${envRoot}" node "${SCRIPT_PATH}" create test-env --prefix feat --dry-run --json`, {
|
|
490
|
+
encoding: 'utf-8',
|
|
491
|
+
cwd: STANDALONE_DIR,
|
|
492
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
493
|
+
});
|
|
494
|
+
const json = JSON.parse(output.trim());
|
|
495
|
+
assert(json.wouldCreate.worktreePath.startsWith(envRoot), 'Should use env var root');
|
|
496
|
+
assert(json.wouldCreate.worktreeRootSource === 'WORKTREE_ROOT env', 'Source should be env');
|
|
497
|
+
} catch (error) {
|
|
498
|
+
// May fail if script path issue - skip
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
test('invalid WORKTREE_ROOT env var fails safely', () => {
|
|
503
|
+
const invalidRoot = '/etc/passwd';
|
|
504
|
+
try {
|
|
505
|
+
execSync(`WORKTREE_ROOT="${invalidRoot}" node "${SCRIPT_PATH}" info --json`, {
|
|
506
|
+
encoding: 'utf-8',
|
|
507
|
+
cwd: STANDALONE_DIR,
|
|
508
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
509
|
+
});
|
|
510
|
+
assert(false, 'Should fail with invalid WORKTREE_ROOT');
|
|
511
|
+
} catch (error) {
|
|
512
|
+
const json = assertJSON(error.stdout.toString());
|
|
513
|
+
assert(json.error.code === 'INVALID_WORKTREE_ROOT', 'Should have INVALID_WORKTREE_ROOT');
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
test('create --worktree-root validates path existence', () => {
|
|
518
|
+
// Use a deeply nested non-existent path that can't be created
|
|
519
|
+
const invalidRoot = '/nonexistent/deeply/nested/path/that/does/not/exist';
|
|
520
|
+
const result = run(`create test-invalid-root --prefix feat --json --worktree-root "${invalidRoot}"`);
|
|
521
|
+
assert(!result.success, 'Should fail with invalid path');
|
|
522
|
+
const json = assertJSON(result.output);
|
|
523
|
+
assert(json.error.code === 'INVALID_WORKTREE_ROOT', 'Should have INVALID_WORKTREE_ROOT error');
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
test('info reports agentkit project config as worktreeRootSource', () => {
|
|
527
|
+
const repo = mkTempGitRepo();
|
|
528
|
+
const home = mkTempHome();
|
|
529
|
+
writeWorktreeRootConfig(repo, '../project-worktrees');
|
|
530
|
+
const result = runInRepo(repo, home, 'info --json');
|
|
531
|
+
assert(result.success, 'info should succeed');
|
|
532
|
+
const json = assertJSON(result.output);
|
|
533
|
+
assert(json.worktreeRootSource === 'agentkit project config', `unexpected source: ${json.worktreeRootSource}`);
|
|
534
|
+
assert(json.worktreeRoot === path.resolve(repo, '../project-worktrees'), `unexpected root: ${json.worktreeRoot}`);
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
test('info reports agentkit user config as worktreeRootSource', () => {
|
|
538
|
+
const repo = mkTempGitRepo();
|
|
539
|
+
const home = mkTempHome();
|
|
540
|
+
const userRoot = path.join(os.tmpdir(), 'ak-wt-portable-drive');
|
|
541
|
+
writeWorktreeRootConfig(home, userRoot);
|
|
542
|
+
const result = runInRepo(repo, home, 'info --json');
|
|
543
|
+
assert(result.success, 'info should succeed');
|
|
544
|
+
const json = assertJSON(result.output);
|
|
545
|
+
assert(json.worktreeRootSource === 'agentkit user config', `unexpected source: ${json.worktreeRootSource}`);
|
|
546
|
+
assert(json.worktreeRoot === userRoot, `unexpected root: ${json.worktreeRoot}`);
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
test('AGENTKIT_HOME overrides where user worktree.root config is read from', () => {
|
|
550
|
+
// When AGENTKIT_HOME is set, the AgentKit home is that directory itself
|
|
551
|
+
// (config.yaml lives directly under it), not `$HOME/.agentkit`. A user
|
|
552
|
+
// worktree.root written to the real $HOME/.agentkit/config.yaml must be
|
|
553
|
+
// ignored in favor of $AGENTKIT_HOME/config.yaml.
|
|
554
|
+
const repo = mkTempGitRepo();
|
|
555
|
+
const home = mkTempHome();
|
|
556
|
+
const agentkitHome = fs.mkdtempSync(path.join(os.tmpdir(), 'ak-wt-test-akhome-'));
|
|
557
|
+
const decoyRoot = path.join(os.tmpdir(), 'ak-wt-decoy-should-not-win');
|
|
558
|
+
writeWorktreeRootConfig(home, decoyRoot); // would resolve as $HOME/.agentkit/config.yaml
|
|
559
|
+
fs.writeFileSync(path.join(agentkitHome, 'config.yaml'), 'worktree:\n root: ' + path.join(os.tmpdir(), 'ak-wt-real-akhome-root') + '\n');
|
|
560
|
+
const output = execSync(`node "${SCRIPT_PATH}" info --json`, {
|
|
561
|
+
encoding: 'utf-8',
|
|
562
|
+
cwd: repo,
|
|
563
|
+
env: { ...process.env, HOME: home, USERPROFILE: home, AGENTKIT_HOME: agentkitHome },
|
|
564
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
565
|
+
});
|
|
566
|
+
const json = assertJSON(output.trim());
|
|
567
|
+
assert(json.worktreeRootSource === 'agentkit user config', `unexpected source: ${json.worktreeRootSource}`);
|
|
568
|
+
assert(
|
|
569
|
+
json.worktreeRoot === path.join(os.tmpdir(), 'ak-wt-real-akhome-root'),
|
|
570
|
+
`expected AGENTKIT_HOME config to win, got ${json.worktreeRoot}`
|
|
571
|
+
);
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
test('project worktree.root config overrides user worktree.root config', () => {
|
|
575
|
+
const repo = mkTempGitRepo();
|
|
576
|
+
const home = mkTempHome();
|
|
577
|
+
writeWorktreeRootConfig(repo, '../project-wins-worktrees');
|
|
578
|
+
writeWorktreeRootConfig(home, path.join(os.tmpdir(), 'ak-wt-user-loses'));
|
|
579
|
+
const result = runInRepo(repo, home, 'info --json');
|
|
580
|
+
const json = assertJSON(result.output);
|
|
581
|
+
assert(json.worktreeRootSource === 'agentkit project config', `expected project to win, got ${json.worktreeRootSource}`);
|
|
582
|
+
assert(json.worktreeRoot === path.resolve(repo, '../project-wins-worktrees'), `unexpected root: ${json.worktreeRoot}`);
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
test('absolute worktree.root at project scope is skipped with a warning', () => {
|
|
586
|
+
const repo = mkTempGitRepo();
|
|
587
|
+
const home = mkTempHome();
|
|
588
|
+
writeWorktreeRootConfig(repo, path.join(os.tmpdir(), 'ak-wt-untrusted-absolute'));
|
|
589
|
+
const result = runInRepo(repo, home, 'info --json');
|
|
590
|
+
assert(result.success, 'info should still succeed (warning, not a hard error)');
|
|
591
|
+
const json = assertJSON(result.output);
|
|
592
|
+
assert(json.worktreeRootSource !== 'agentkit project config', 'absolute project-scope value must not win');
|
|
593
|
+
assert(Array.isArray(json.warnings) && json.warnings.length > 0, 'should surface a warning');
|
|
594
|
+
assert(/project scope only honors a relative path/.test(json.warnings[0]), 'warning should explain the rejection');
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
test('--worktree-root flag overrides worktree.root config', () => {
|
|
598
|
+
const repo = mkTempGitRepo();
|
|
599
|
+
const home = mkTempHome();
|
|
600
|
+
writeWorktreeRootConfig(repo, '../config-worktrees');
|
|
601
|
+
const flagRoot = os.tmpdir();
|
|
602
|
+
const result = runInRepo(repo, home, `create test-flag-wins --prefix feat --dry-run --json --worktree-root "${flagRoot}"`);
|
|
603
|
+
const json = assertJSON(result.output);
|
|
604
|
+
assert(json.wouldCreate.worktreeRootSource === '--worktree-root flag', `unexpected source: ${json.wouldCreate.worktreeRootSource}`);
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
test('worktree.root config outranks WORKTREE_ROOT env var', () => {
|
|
608
|
+
// Precedence is flag > project config > user config > WORKTREE_ROOT env >
|
|
609
|
+
// built-in chain, so a set config value must win over the env var here.
|
|
610
|
+
const repo = mkTempGitRepo();
|
|
611
|
+
const home = mkTempHome();
|
|
612
|
+
writeWorktreeRootConfig(repo, '../config-worktrees');
|
|
613
|
+
const envRoot = os.tmpdir();
|
|
614
|
+
try {
|
|
615
|
+
const output = execSync(`node "${SCRIPT_PATH}" create test-config-outranks-env --prefix feat --dry-run --json`, {
|
|
616
|
+
encoding: 'utf-8',
|
|
617
|
+
cwd: repo,
|
|
618
|
+
env: { ...process.env, HOME: home, USERPROFILE: home, WORKTREE_ROOT: envRoot },
|
|
619
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
620
|
+
});
|
|
621
|
+
const json = JSON.parse(output.trim());
|
|
622
|
+
assert(json.wouldCreate.worktreeRootSource === 'agentkit project config', `unexpected source: ${json.wouldCreate.worktreeRootSource}`);
|
|
623
|
+
} catch (error) {
|
|
624
|
+
assert(false, `command should succeed: ${error.stderr || error.message}`);
|
|
625
|
+
}
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
test('WORKTREE_ROOT env var still wins when no worktree.root config is set', () => {
|
|
629
|
+
const repo = mkTempGitRepo();
|
|
630
|
+
const home = mkTempHome();
|
|
631
|
+
const envRoot = os.tmpdir();
|
|
632
|
+
try {
|
|
633
|
+
const output = execSync(`node "${SCRIPT_PATH}" create test-env-wins-no-config --prefix feat --dry-run --json`, {
|
|
634
|
+
encoding: 'utf-8',
|
|
635
|
+
cwd: repo,
|
|
636
|
+
env: { ...process.env, HOME: home, USERPROFILE: home, WORKTREE_ROOT: envRoot },
|
|
637
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
638
|
+
});
|
|
639
|
+
const json = JSON.parse(output.trim());
|
|
640
|
+
assert(json.wouldCreate.worktreeRootSource === 'WORKTREE_ROOT env', `unexpected source: ${json.wouldCreate.worktreeRootSource}`);
|
|
641
|
+
} catch (error) {
|
|
642
|
+
assert(false, `command should succeed: ${error.stderr || error.message}`);
|
|
643
|
+
}
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
test('a worktree.root value with shell metacharacters cannot execute code (real create, not dry-run)', () => {
|
|
647
|
+
// A project's committed .agentkit/config.yaml is untrusted input (it can
|
|
648
|
+
// arrive from a cloned repo). worktreeRoot must never reach a shell -
|
|
649
|
+
// otherwise a value like this one plants an arbitrary file the moment
|
|
650
|
+
// someone runs `create` in the clone. This exercises the real (non
|
|
651
|
+
// --dry-run) create path so the actual `git worktree add` invocation runs.
|
|
652
|
+
const repo = mkTempGitRepo();
|
|
653
|
+
execSync('git config user.email test@example.com', { cwd: repo, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
654
|
+
execSync('git config user.name test', { cwd: repo, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
655
|
+
execSync('git commit -q --allow-empty -m init', { cwd: repo, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
656
|
+
const home = mkTempHome();
|
|
657
|
+
const parentDir = path.dirname(repo);
|
|
658
|
+
writeWorktreeRootConfig(repo, '../wt";touch PWNED-RCE;echo "');
|
|
659
|
+
runInRepo(repo, home, 'create pocfeat --prefix feat --json');
|
|
660
|
+
const canaryLocations = [repo, parentDir, home, os.tmpdir()].map((dir) => path.join(dir, 'PWNED-RCE'));
|
|
661
|
+
for (const canary of canaryLocations) {
|
|
662
|
+
assert(!fs.existsSync(canary), `shell metacharacters in worktree.root must not execute a command (found ${canary})`);
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
// ============================================
|
|
667
|
+
// ERROR HANDLING TESTS
|
|
668
|
+
// ============================================
|
|
669
|
+
console.log('\n⚠️ Error Handling Tests');
|
|
670
|
+
|
|
671
|
+
test('unknown command returns error', () => {
|
|
672
|
+
const result = run('unknowncommand --json');
|
|
673
|
+
assert(!result.success, 'Should fail');
|
|
674
|
+
const json = assertJSON(result.output);
|
|
675
|
+
assert(json.error.code === 'UNKNOWN_COMMAND', 'Should have UNKNOWN_COMMAND error');
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
test('no command returns error', () => {
|
|
679
|
+
const result = run('--json');
|
|
680
|
+
assert(!result.success, 'Should fail');
|
|
681
|
+
const json = assertJSON(result.output);
|
|
682
|
+
assert(json.error.code === 'UNKNOWN_COMMAND', 'Should have UNKNOWN_COMMAND error');
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
test('errors have suggestion field', () => {
|
|
686
|
+
const result = run('create --json');
|
|
687
|
+
const json = assertJSON(result.output);
|
|
688
|
+
assert(json.error.suggestion, 'Error should have suggestion');
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
test('success commands return exit code 0', () => {
|
|
692
|
+
const result = run('info --json');
|
|
693
|
+
assert(result.exitCode === 0, 'Exit code should be 0');
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
test('error commands return exit code 1', () => {
|
|
697
|
+
const result = run('create --json');
|
|
698
|
+
assert(result.exitCode === 1, 'Exit code should be 1');
|
|
699
|
+
});
|
|
700
|
+
|
|
701
|
+
test('non-git directory returns error', () => {
|
|
702
|
+
const result = run('info --json', { cwd: '/tmp' });
|
|
703
|
+
assert(!result.success, 'Should fail in non-git dir');
|
|
704
|
+
const json = assertJSON(result.output);
|
|
705
|
+
assert(json.error.code === 'NOT_GIT_REPO', 'Should have NOT_GIT_REPO error');
|
|
706
|
+
});
|
|
707
|
+
|
|
708
|
+
// ============================================
|
|
709
|
+
// EDGE CASE: FEATURE NAME HANDLING
|
|
710
|
+
// ============================================
|
|
711
|
+
console.log('\n🔤 Feature Name Edge Cases');
|
|
712
|
+
|
|
713
|
+
test('create handles empty string feature', () => {
|
|
714
|
+
const result = run('create "" --json');
|
|
715
|
+
assert(!result.success, 'Should fail with empty feature');
|
|
716
|
+
const json = assertJSON(result.output);
|
|
717
|
+
assert(json.error.code === 'MISSING_FEATURE', 'Should have MISSING_FEATURE error');
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
test('create handles very long feature name (truncates to 50 chars)', () => {
|
|
721
|
+
const longName = 'a'.repeat(100);
|
|
722
|
+
const result = run(`create "${longName}" --dry-run --json`);
|
|
723
|
+
assert(result.success, 'Should succeed');
|
|
724
|
+
const json = assertJSON(result.output);
|
|
725
|
+
const branchPart = json.wouldCreate.branch.split('/')[1];
|
|
726
|
+
assert(branchPart.length <= 50, 'Feature part should be max 50 chars');
|
|
727
|
+
});
|
|
728
|
+
|
|
729
|
+
test('create handles unicode characters', () => {
|
|
730
|
+
const result = run('create "测试功能-тест" --dry-run --json');
|
|
731
|
+
assert(result.success, 'Should succeed');
|
|
732
|
+
const json = assertJSON(result.output);
|
|
733
|
+
// Unicode gets converted to dashes
|
|
734
|
+
assert(!json.wouldCreate.branch.includes('测'), 'Should not contain unicode');
|
|
735
|
+
});
|
|
736
|
+
|
|
737
|
+
test('create handles leading/trailing dashes', () => {
|
|
738
|
+
const result = run('create "---feature---" --dry-run --json');
|
|
739
|
+
assert(result.success, 'Should succeed');
|
|
740
|
+
const json = assertJSON(result.output);
|
|
741
|
+
assert(!json.wouldCreate.branch.endsWith('/-'), 'Should not end with dash');
|
|
742
|
+
assert(!json.wouldCreate.branch.includes('//'), 'Should not have double slashes');
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
test('create handles only special characters', () => {
|
|
746
|
+
const result = run('create "@#$%^&*()" --dry-run --json');
|
|
747
|
+
assert(!result.success, 'Should fail when sanitized feature is empty');
|
|
748
|
+
const json = assertJSON(result.output);
|
|
749
|
+
assert(json.error.code === 'INVALID_FEATURE_NAME', 'Should report invalid feature name');
|
|
750
|
+
});
|
|
751
|
+
|
|
752
|
+
test('create handles numbers only', () => {
|
|
753
|
+
const result = run('create "12345" --dry-run --json');
|
|
754
|
+
assert(result.success, 'Should succeed');
|
|
755
|
+
const json = assertJSON(result.output);
|
|
756
|
+
assert(json.wouldCreate.branch.includes('12345'), 'Should keep numbers');
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
test('create handles mixed case camelCase', () => {
|
|
760
|
+
const result = run('create "myNewFeature" --dry-run --json');
|
|
761
|
+
assert(result.success, 'Should succeed');
|
|
762
|
+
const json = assertJSON(result.output);
|
|
763
|
+
assert(json.wouldCreate.branch.includes('mynewfeature'), 'Should be lowercase');
|
|
764
|
+
});
|
|
765
|
+
|
|
766
|
+
// ============================================
|
|
767
|
+
// --no-prefix: MULTI-SEGMENT BRANCH NAMES
|
|
768
|
+
// ============================================
|
|
769
|
+
console.log('\n🔀 --no-prefix Multi-Segment Branch Names');
|
|
770
|
+
|
|
771
|
+
test('--no-prefix preserves forward slashes in branch name', () => {
|
|
772
|
+
const result = run('create "dev/feat/999-test-slash-preserve" --no-prefix --dry-run --json');
|
|
773
|
+
assert(result.success, 'Should succeed');
|
|
774
|
+
const json = assertJSON(result.output);
|
|
775
|
+
assert(json.wouldCreate.branch === 'dev/feat/999-test-slash-preserve', `Should preserve slashes, got: ${json.wouldCreate.branch}`);
|
|
776
|
+
});
|
|
777
|
+
|
|
778
|
+
test('--no-prefix preserves case with slashes', () => {
|
|
779
|
+
const result = run('create "User/Fix/MyBug" --no-prefix --dry-run --json');
|
|
780
|
+
assert(result.success, 'Should succeed');
|
|
781
|
+
const json = assertJSON(result.output);
|
|
782
|
+
assert(json.wouldCreate.branch === 'User/Fix/MyBug', `Should preserve case and slashes, got: ${json.wouldCreate.branch}`);
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
test('--no-prefix flattens slashes in worktree directory name', () => {
|
|
786
|
+
const result = run('create "kai/feat/my-feature" --no-prefix --dry-run --json');
|
|
787
|
+
assert(result.success, 'Should succeed');
|
|
788
|
+
const json = assertJSON(result.output);
|
|
789
|
+
// Worktree path should NOT contain nested directories from branch slashes
|
|
790
|
+
const worktreeName = json.wouldCreate.worktreePath.split('/').pop();
|
|
791
|
+
assert(!worktreeName.includes('/'), 'Worktree dir name should not contain slashes');
|
|
792
|
+
assert(worktreeName.includes('kai-feat-my-feature'), `Should flatten slashes to dashes, got: ${worktreeName}`);
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
test('--no-prefix collapses consecutive slashes', () => {
|
|
796
|
+
const result = run('create "kai///feat//my-feature" --no-prefix --dry-run --json');
|
|
797
|
+
assert(result.success, 'Should succeed');
|
|
798
|
+
const json = assertJSON(result.output);
|
|
799
|
+
assert(!json.wouldCreate.branch.includes('//'), `Should not have consecutive slashes, got: ${json.wouldCreate.branch}`);
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
test('--no-prefix trims leading/trailing slashes', () => {
|
|
803
|
+
const result = run('create "/kai/feat/my-feature/" --no-prefix --dry-run --json');
|
|
804
|
+
assert(result.success, 'Should succeed');
|
|
805
|
+
const json = assertJSON(result.output);
|
|
806
|
+
assert(!json.wouldCreate.branch.startsWith('/'), 'Should not start with slash');
|
|
807
|
+
assert(!json.wouldCreate.branch.endsWith('/'), 'Should not end with slash');
|
|
808
|
+
});
|
|
809
|
+
|
|
810
|
+
test('--no-prefix rejects path traversal (..)', () => {
|
|
811
|
+
const result = run('create "kai/../../../etc/passwd" --no-prefix --dry-run --json');
|
|
812
|
+
assert(!result.success, 'Should fail with path traversal');
|
|
813
|
+
const json = assertJSON(result.output);
|
|
814
|
+
assert(json.error.code === 'INVALID_FEATURE_NAME', 'Should report invalid feature name');
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
test('--no-prefix still works for simple names (no slashes)', () => {
|
|
818
|
+
const result = run('create "ND-1377-cleanup-docs" --no-prefix --dry-run --json');
|
|
819
|
+
assert(result.success, 'Should succeed');
|
|
820
|
+
const json = assertJSON(result.output);
|
|
821
|
+
assert(json.wouldCreate.branch === 'ND-1377-cleanup-docs', `Should work without slashes, got: ${json.wouldCreate.branch}`);
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
test('--no-prefix preserves dots in branch names', () => {
|
|
825
|
+
const result = run('create "release/v1.2.3" --no-prefix --dry-run --json');
|
|
826
|
+
assert(result.success, 'Should succeed');
|
|
827
|
+
const json = assertJSON(result.output);
|
|
828
|
+
assert(json.wouldCreate.branch === 'release/v1.2.3', `Should preserve dots, got: ${json.wouldCreate.branch}`);
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
// ============================================
|
|
832
|
+
// EDGE CASE: PATH HANDLING
|
|
833
|
+
// ============================================
|
|
834
|
+
console.log('\n📁 Path Handling Edge Cases');
|
|
835
|
+
|
|
836
|
+
test('create handles path with spaces via --worktree-root', () => {
|
|
837
|
+
const pathWithSpaces = '/tmp/my worktree dir';
|
|
838
|
+
const result = run(`create test-spaces --prefix feat --dry-run --json --worktree-root "${pathWithSpaces}"`);
|
|
839
|
+
assert(result.success, 'Should succeed with quoted path');
|
|
840
|
+
const json = assertJSON(result.output);
|
|
841
|
+
assert(json.wouldCreate.worktreePath.includes('my worktree dir'), 'Should preserve spaces');
|
|
842
|
+
});
|
|
843
|
+
|
|
844
|
+
test('create handles home directory expansion', () => {
|
|
845
|
+
// Script uses path.resolve which doesn't expand ~, so this tests current behavior
|
|
846
|
+
const result = run('create test-home --prefix feat --dry-run --json --worktree-root "~/test-worktrees"');
|
|
847
|
+
assert(result.success, 'Should succeed');
|
|
848
|
+
const json = assertJSON(result.output);
|
|
849
|
+
// ~/test-worktrees should be resolved relative to cwd, not expanded
|
|
850
|
+
assert(json.wouldCreate.worktreePath, 'Should have worktree path');
|
|
851
|
+
});
|
|
852
|
+
|
|
853
|
+
test('create validates file path as worktree root', () => {
|
|
854
|
+
// /etc/passwd exists but is a file, not directory
|
|
855
|
+
const result = run('create test-file --prefix feat --json --worktree-root "/etc/passwd"');
|
|
856
|
+
assert(!result.success, 'Should fail when path is file');
|
|
857
|
+
const json = assertJSON(result.output);
|
|
858
|
+
assert(json.error.code === 'INVALID_WORKTREE_ROOT', 'Should have INVALID_WORKTREE_ROOT');
|
|
859
|
+
assert(json.error.message.includes('not a directory'), 'Should mention not a directory');
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
test('create handles current directory as worktree root', () => {
|
|
863
|
+
const result = run('create test-current --prefix feat --dry-run --json --worktree-root "."');
|
|
864
|
+
assert(result.success, 'Should succeed');
|
|
865
|
+
const json = assertJSON(result.output);
|
|
866
|
+
assert(path.isAbsolute(json.wouldCreate.worktreePath), 'Should resolve to absolute');
|
|
867
|
+
});
|
|
868
|
+
|
|
869
|
+
// ============================================
|
|
870
|
+
// EDGE CASE: BRANCH PREFIX HANDLING
|
|
871
|
+
// ============================================
|
|
872
|
+
console.log('\n🏷️ Branch Prefix Edge Cases');
|
|
873
|
+
|
|
874
|
+
test('create uses default prefix when --prefix missing value', () => {
|
|
875
|
+
// --prefix without value should use 'feat' default
|
|
876
|
+
const result = run('create test-default-prefix --dry-run --json');
|
|
877
|
+
assert(result.success, 'Should succeed');
|
|
878
|
+
const json = assertJSON(result.output);
|
|
879
|
+
assert(json.wouldCreate.branch.startsWith('feat/'), 'Should default to feat');
|
|
880
|
+
});
|
|
881
|
+
|
|
882
|
+
test('create handles invalid prefix gracefully', () => {
|
|
883
|
+
// Prefix is sanitized before use.
|
|
884
|
+
const result = run('create test-custom-prefix --prefix custom --dry-run --json');
|
|
885
|
+
assert(result.success, 'Should succeed');
|
|
886
|
+
const json = assertJSON(result.output);
|
|
887
|
+
assert(json.wouldCreate.branch.startsWith('custom/'), 'Should use custom prefix');
|
|
888
|
+
});
|
|
889
|
+
|
|
890
|
+
// ============================================
|
|
891
|
+
// EDGE CASE: MONOREPO SCENARIOS
|
|
892
|
+
// ============================================
|
|
893
|
+
console.log('\n📦 Monorepo Edge Cases');
|
|
894
|
+
|
|
895
|
+
test('create with partial project match in monorepo', () => {
|
|
896
|
+
if (!fs.existsSync(MONOREPO_DIR)) return;
|
|
897
|
+
// 'cli' should match 'claudekit-cli'
|
|
898
|
+
const result = run('create cli test-partial --prefix feat --dry-run --json', { cwd: MONOREPO_DIR });
|
|
899
|
+
assert(result.success, 'Should succeed with partial match');
|
|
900
|
+
const json = assertJSON(result.output);
|
|
901
|
+
assert(json.wouldCreate.project === 'claudekit-cli', 'Should find claudekit-cli');
|
|
902
|
+
});
|
|
903
|
+
|
|
904
|
+
test('create detects multiple project matches', () => {
|
|
905
|
+
if (!fs.existsSync(MONOREPO_DIR)) return;
|
|
906
|
+
// 'claudekit' matches multiple projects
|
|
907
|
+
const result = run('create claudekit test-multi --prefix feat --json', { cwd: MONOREPO_DIR });
|
|
908
|
+
assert(!result.success, 'Should fail with multiple matches');
|
|
909
|
+
const json = assertJSON(result.output);
|
|
910
|
+
assert(json.error.code === 'MULTIPLE_PROJECTS_MATCH', 'Should have MULTIPLE_PROJECTS_MATCH error');
|
|
911
|
+
assert(json.error.matchingProjects.length > 1, 'Should list multiple matches');
|
|
912
|
+
});
|
|
913
|
+
|
|
914
|
+
test('info shows project env files in monorepo', () => {
|
|
915
|
+
if (!fs.existsSync(MONOREPO_DIR)) return;
|
|
916
|
+
const result = run('info --json', { cwd: MONOREPO_DIR });
|
|
917
|
+
const json = assertJSON(result.output);
|
|
918
|
+
assert(json.projectEnvFiles !== undefined, 'Should have projectEnvFiles');
|
|
919
|
+
});
|
|
920
|
+
|
|
921
|
+
// ============================================
|
|
922
|
+
// EDGE CASE: WORKTREE REMOVAL
|
|
923
|
+
// ============================================
|
|
924
|
+
console.log('\n🗑️ Remove Edge Cases');
|
|
925
|
+
|
|
926
|
+
test('remove matches by full path', () => {
|
|
927
|
+
const listResult = run('list --json');
|
|
928
|
+
const listJson = assertJSON(listResult.output);
|
|
929
|
+
const removable = listJson.worktrees.find(w => !w.isMainWorktree);
|
|
930
|
+
|
|
931
|
+
if (removable) {
|
|
932
|
+
const result = run(`remove "${removable.path}" --dry-run --json`);
|
|
933
|
+
assert(result.success, 'Should match by full path');
|
|
934
|
+
const json = assertJSON(result.output);
|
|
935
|
+
assert(json.wouldRemove.worktreePath === removable.path, 'Should match exact path');
|
|
936
|
+
}
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
test('remove matches by branch name', () => {
|
|
940
|
+
const listResult = run('list --json');
|
|
941
|
+
const listJson = assertJSON(listResult.output);
|
|
942
|
+
const removable = listJson.worktrees.find(w => w.branch && !w.isMainWorktree);
|
|
943
|
+
|
|
944
|
+
if (removable && removable.branch !== 'detached') {
|
|
945
|
+
const branchPart = removable.branch.split('/').pop(); // Get last part of branch
|
|
946
|
+
const result = run(`remove "${branchPart}" --dry-run --json`);
|
|
947
|
+
// May match or have multiple matches - both are valid behaviors
|
|
948
|
+
assert(result.output, 'Should have output');
|
|
949
|
+
}
|
|
950
|
+
});
|
|
951
|
+
|
|
952
|
+
test('remove is case insensitive', () => {
|
|
953
|
+
const result = run('remove NONEXISTENT-WORKTREE-XYZ --json');
|
|
954
|
+
assert(!result.success, 'Should fail');
|
|
955
|
+
const json = assertJSON(result.output);
|
|
956
|
+
assert(json.error.code === 'WORKTREE_NOT_FOUND', 'Should search case-insensitively');
|
|
957
|
+
});
|
|
958
|
+
|
|
959
|
+
// ============================================
|
|
960
|
+
// EDGE CASE: DIRTY STATE HANDLING
|
|
961
|
+
// ============================================
|
|
962
|
+
console.log('\n📝 Dirty State Edge Cases');
|
|
963
|
+
|
|
964
|
+
test('info provides dirty state details', () => {
|
|
965
|
+
const result = run('info --json');
|
|
966
|
+
const json = assertJSON(result.output);
|
|
967
|
+
assert(typeof json.dirtyState === 'boolean', 'Should have dirtyState');
|
|
968
|
+
if (json.dirtyState) {
|
|
969
|
+
assert(json.dirtyDetails, 'Should have dirtyDetails when dirty');
|
|
970
|
+
assert(typeof json.dirtyDetails.modified === 'number', 'Should have modified count');
|
|
971
|
+
assert(typeof json.dirtyDetails.staged === 'number', 'Should have staged count');
|
|
972
|
+
assert(typeof json.dirtyDetails.untracked === 'number', 'Should have untracked count');
|
|
973
|
+
}
|
|
974
|
+
});
|
|
975
|
+
|
|
976
|
+
test('create includes warning for dirty state', () => {
|
|
977
|
+
// This test depends on repo state - if clean, warning won't appear
|
|
978
|
+
const result = run('create test-dirty-check --dry-run --json');
|
|
979
|
+
assert(result.success, 'Should succeed');
|
|
980
|
+
const json = assertJSON(result.output);
|
|
981
|
+
// warnings may or may not exist depending on repo state
|
|
982
|
+
if (json.warnings) {
|
|
983
|
+
assert(Array.isArray(json.warnings), 'warnings should be array');
|
|
984
|
+
}
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
// ============================================
|
|
988
|
+
// EDGE CASE: JSON VS TEXT OUTPUT
|
|
989
|
+
// ============================================
|
|
990
|
+
console.log('\n📤 Output Format Edge Cases');
|
|
991
|
+
|
|
992
|
+
test('info text output includes all sections', () => {
|
|
993
|
+
const result = run('info');
|
|
994
|
+
assert(result.success, 'Should succeed');
|
|
995
|
+
assert(result.output.includes('Repository Info'), 'Should have repo info');
|
|
996
|
+
assert(result.output.includes('Type:'), 'Should have type');
|
|
997
|
+
assert(result.output.includes('Base branch:'), 'Should have base branch');
|
|
998
|
+
assert(result.output.includes('Worktree location:'), 'Should have worktree location');
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
test('list text output is readable', () => {
|
|
1002
|
+
const result = run('list');
|
|
1003
|
+
assert(result.success, 'Should succeed');
|
|
1004
|
+
assert(result.output.includes('worktrees'), 'Should mention worktrees');
|
|
1005
|
+
});
|
|
1006
|
+
|
|
1007
|
+
test('error text output is readable', () => {
|
|
1008
|
+
const result = run('create');
|
|
1009
|
+
assert(!result.success, 'Should fail');
|
|
1010
|
+
assert(result.stderr.includes('Error') || result.output.includes('Error'), 'Should have error text');
|
|
1011
|
+
});
|
|
1012
|
+
|
|
1013
|
+
// ============================================
|
|
1014
|
+
// EDGE CASE: EXISTING BRANCH SCENARIOS
|
|
1015
|
+
// ============================================
|
|
1016
|
+
console.log('\n🌿 Branch Existence Edge Cases');
|
|
1017
|
+
|
|
1018
|
+
test('create dry-run shows if branch exists', () => {
|
|
1019
|
+
const result = run('create test-branch-exist --prefix feat --dry-run --json');
|
|
1020
|
+
assert(result.success, 'Should succeed');
|
|
1021
|
+
const json = assertJSON(result.output);
|
|
1022
|
+
assert(typeof json.wouldCreate.branchExists === 'boolean', 'Should indicate branch existence');
|
|
1023
|
+
});
|
|
1024
|
+
|
|
1025
|
+
// ============================================
|
|
1026
|
+
// EDGE CASE: CONCURRENT/RACE CONDITIONS
|
|
1027
|
+
// ============================================
|
|
1028
|
+
console.log('\n⚡ Concurrent Access Tests');
|
|
1029
|
+
|
|
1030
|
+
test('multiple info calls return consistent data', () => {
|
|
1031
|
+
const result1 = run('info --json');
|
|
1032
|
+
const result2 = run('info --json');
|
|
1033
|
+
assert(result1.success && result2.success, 'Both should succeed');
|
|
1034
|
+
const json1 = assertJSON(result1.output);
|
|
1035
|
+
const json2 = assertJSON(result2.output);
|
|
1036
|
+
assert(json1.repoType === json2.repoType, 'Repo type should be consistent');
|
|
1037
|
+
assert(json1.baseBranch === json2.baseBranch, 'Base branch should be consistent');
|
|
1038
|
+
assert(json1.worktreeRoot === json2.worktreeRoot, 'Worktree root should be consistent');
|
|
1039
|
+
});
|
|
1040
|
+
|
|
1041
|
+
test('list returns consistent worktree count', () => {
|
|
1042
|
+
const result1 = run('list --json');
|
|
1043
|
+
const result2 = run('list --json');
|
|
1044
|
+
assert(result1.success && result2.success, 'Both should succeed');
|
|
1045
|
+
const json1 = assertJSON(result1.output);
|
|
1046
|
+
const json2 = assertJSON(result2.output);
|
|
1047
|
+
assert(json1.worktrees.length === json2.worktrees.length, 'Worktree count should be consistent');
|
|
1048
|
+
});
|
|
1049
|
+
|
|
1050
|
+
// ============================================
|
|
1051
|
+
// USER SCENARIO: REAL-WORLD WORKFLOWS
|
|
1052
|
+
// ============================================
|
|
1053
|
+
console.log('\n👤 User Scenario Tests');
|
|
1054
|
+
|
|
1055
|
+
test('scenario: new user creates first worktree', () => {
|
|
1056
|
+
// Step 1: Check info
|
|
1057
|
+
const infoResult = run('info --json');
|
|
1058
|
+
assert(infoResult.success, 'Info should succeed');
|
|
1059
|
+
const info = assertJSON(infoResult.output);
|
|
1060
|
+
|
|
1061
|
+
// Step 2: Dry-run create
|
|
1062
|
+
const createResult = run('create add-login-feature --prefix feat --dry-run --json');
|
|
1063
|
+
assert(createResult.success, 'Create dry-run should succeed');
|
|
1064
|
+
const create = assertJSON(createResult.output);
|
|
1065
|
+
assert(create.wouldCreate.branch === 'feat/add-login-feature', 'Branch should be correctly named');
|
|
1066
|
+
assert(create.wouldCreate.baseBranch === info.baseBranch, 'Should use detected base branch');
|
|
1067
|
+
});
|
|
1068
|
+
|
|
1069
|
+
test('scenario: user fixes bug in submodule', () => {
|
|
1070
|
+
const submodulePath = path.join(MONOREPO_DIR, 'claudekit-engineer');
|
|
1071
|
+
if (!fs.existsSync(submodulePath)) return;
|
|
1072
|
+
|
|
1073
|
+
// From submodule, create a fix branch
|
|
1074
|
+
const result = run('create fix-auth-bug --prefix fix --dry-run --json', { cwd: submodulePath });
|
|
1075
|
+
assert(result.success, 'Should succeed from submodule');
|
|
1076
|
+
const json = assertJSON(result.output);
|
|
1077
|
+
assert(json.wouldCreate.branch.startsWith('fix/'), 'Should have fix prefix');
|
|
1078
|
+
// Worktree should go to superproject
|
|
1079
|
+
assert(json.wouldCreate.worktreeRootSource.includes('superproject') ||
|
|
1080
|
+
json.wouldCreate.worktreeRootSource.includes('monorepo'),
|
|
1081
|
+
'Should use superproject worktrees dir');
|
|
1082
|
+
});
|
|
1083
|
+
|
|
1084
|
+
test('scenario: user cleans up old worktrees', () => {
|
|
1085
|
+
// List worktrees first
|
|
1086
|
+
const listResult = run('list --json');
|
|
1087
|
+
assert(listResult.success, 'List should succeed');
|
|
1088
|
+
const list = assertJSON(listResult.output);
|
|
1089
|
+
|
|
1090
|
+
// Try to remove a nonexistent worktree (simulating cleanup)
|
|
1091
|
+
const removeResult = run('remove old-feature-xyz --json');
|
|
1092
|
+
assert(!removeResult.success, 'Should fail for nonexistent');
|
|
1093
|
+
const remove = assertJSON(removeResult.output);
|
|
1094
|
+
assert(remove.error.availableWorktrees, 'Should show available worktrees for cleanup');
|
|
1095
|
+
});
|
|
1096
|
+
|
|
1097
|
+
test('scenario: user with WORKTREE_ROOT env var', () => {
|
|
1098
|
+
const customRoot = '/tmp/custom-worktrees';
|
|
1099
|
+
try {
|
|
1100
|
+
const output = execSync(
|
|
1101
|
+
`WORKTREE_ROOT="${customRoot}" node "${SCRIPT_PATH}" info --json`,
|
|
1102
|
+
{ encoding: 'utf-8', cwd: STANDALONE_DIR, stdio: ['pipe', 'pipe', 'pipe'] }
|
|
1103
|
+
);
|
|
1104
|
+
const json = JSON.parse(output.trim());
|
|
1105
|
+
assert(json.worktreeRoot === customRoot, 'Should use env var');
|
|
1106
|
+
assert(json.worktreeRootSource === 'WORKTREE_ROOT env', 'Should indicate env source');
|
|
1107
|
+
} catch (error) {
|
|
1108
|
+
// Skip if env var handling fails
|
|
1109
|
+
}
|
|
1110
|
+
});
|
|
1111
|
+
|
|
1112
|
+
// ============================================
|
|
1113
|
+
// SUMMARY
|
|
1114
|
+
// ============================================
|
|
1115
|
+
console.log('\n' + '='.repeat(50));
|
|
1116
|
+
console.log(`\n📊 Test Results: ${passed} passed, ${failed} failed\n`);
|
|
1117
|
+
|
|
1118
|
+
if (failed > 0) {
|
|
1119
|
+
console.log('Failed tests:');
|
|
1120
|
+
results.filter(r => r.status === 'FAIL').forEach(r => {
|
|
1121
|
+
console.log(` - ${r.name}: ${r.error}`);
|
|
1122
|
+
});
|
|
1123
|
+
process.exit(1);
|
|
1124
|
+
} else {
|
|
1125
|
+
console.log('✅ All tests passed!\n');
|
|
1126
|
+
process.exit(0);
|
|
1127
|
+
}
|