@heyai-rules/pilo-masterkit 1.2.2 → 3.1.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/.agent/agents/architect.md +211 -211
- package/.agent/agents/build-error-resolver.md +114 -114
- package/.agent/agents/chief-of-staff.md +151 -151
- package/.agent/agents/code-reviewer.md +237 -237
- package/.agent/agents/cpp-build-resolver.md +90 -90
- package/.agent/agents/cpp-reviewer.md +72 -72
- package/.agent/agents/csharp-reviewer.md +101 -0
- package/.agent/agents/dart-build-resolver.md +201 -0
- package/.agent/agents/database-reviewer.md +91 -91
- package/.agent/agents/doc-updater.md +107 -107
- package/.agent/agents/docs-lookup.md +68 -68
- package/.agent/agents/e2e-runner.md +107 -107
- package/.agent/agents/flutter-reviewer.md +243 -243
- package/.agent/agents/gan-evaluator.md +209 -0
- package/.agent/agents/gan-generator.md +131 -0
- package/.agent/agents/gan-planner.md +99 -0
- package/.agent/agents/go-build-resolver.md +94 -94
- package/.agent/agents/go-reviewer.md +76 -76
- package/.agent/agents/harness-optimizer.md +35 -35
- package/.agent/agents/healthcare-reviewer.md +83 -0
- package/.agent/agents/java-build-resolver.md +153 -153
- package/.agent/agents/java-reviewer.md +92 -92
- package/.agent/agents/kotlin-build-resolver.md +118 -118
- package/.agent/agents/kotlin-reviewer.md +159 -159
- package/.agent/agents/loop-operator.md +36 -36
- package/.agent/agents/opensource-forker.md +198 -0
- package/.agent/agents/opensource-packager.md +249 -0
- package/.agent/agents/opensource-sanitizer.md +188 -0
- package/.agent/agents/performance-optimizer.md +392 -133
- package/.agent/agents/personas/athena-agent/agent.json +10 -0
- package/.agent/agents/personas/athena-agent/athena-backend-logic-architecture-profile.md +189 -0
- package/.agent/agents/personas/athena-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/athena-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/athena-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/athena-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/athena-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/athena-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/da-vinci-agent/agent.json +10 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/da-vinci-agent/da-vinci-frontend-ui-ux-design-profile.md +189 -0
- package/.agent/agents/personas/da-vinci-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/da-vinci-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/duong-tang-agent/agent.json +10 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/duong-tang-agent/tang-monk-quality-testing-documentation-profile.md +189 -0
- package/.agent/agents/personas/duong-tang-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/duong-tang-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/gia-cat-luong-agent/agent.json +10 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/gia-cat-luong-agent/kongming-research-strategy-analysis-profile.md +189 -0
- package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/mihata-agent/agent.json +10 -0
- package/.agent/agents/personas/mihata-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/mihata-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/mihata-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/mihata-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/mihata-agent/mihata-multi-agent-orchestration-profile.md +189 -0
- package/.agent/agents/personas/mihata-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/mihata-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/tesla-agent/agent.json +10 -0
- package/.agent/agents/personas/tesla-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/tesla-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/tesla-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/tesla-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/tesla-agent/tesla-fullstack-system-optimization-profile.md +189 -0
- package/.agent/agents/personas/tesla-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/tesla-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/tu-ma-y-agent/agent.json +10 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/tu-ma-y-agent/simayi-feasibility-risk-control-profile.md +189 -0
- package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/venti-agent/agent.json +10 -0
- package/.agent/agents/personas/venti-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/venti-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/venti-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/venti-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/venti-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/venti-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/venti-agent/venti-learning-communication-mentoring-profile.md +189 -0
- package/.agent/agents/planner.md +212 -212
- package/.agent/agents/python-reviewer.md +98 -98
- package/.agent/agents/pytorch-build-resolver.md +120 -120
- package/.agent/agents/refactor-cleaner.md +85 -85
- package/.agent/agents/rust-build-resolver.md +148 -148
- package/.agent/agents/rust-reviewer.md +94 -94
- package/.agent/agents/security-reviewer.md +108 -108
- package/.agent/agents/tdd-guide.md +91 -91
- package/.agent/agents/typescript-reviewer.md +112 -112
- package/.agent/contexts/dev.md +20 -0
- package/.agent/contexts/research.md +26 -0
- package/.agent/contexts/review.md +22 -0
- package/.agent/hooks/hooks.json +395 -0
- package/.agent/hooks/readme.md +222 -0
- package/.agent/mcp-configs/mcp-servers.json +181 -0
- package/.agent/rules/common/agents.md +50 -0
- package/.agent/rules/common/code-review.md +124 -0
- package/.agent/rules/common/coding-style.md +48 -0
- package/.agent/rules/common/development-workflow.md +44 -0
- package/.agent/rules/common/git-workflow.md +24 -0
- package/.agent/rules/common/hooks.md +30 -0
- package/.agent/rules/common/patterns.md +31 -0
- package/.agent/rules/common/performance.md +55 -0
- package/.agent/rules/common/security.md +29 -0
- package/.agent/rules/common/testing.md +29 -0
- package/.agent/rules/cpp/coding-style.md +44 -0
- package/.agent/rules/cpp/hooks.md +39 -0
- package/.agent/rules/cpp/patterns.md +51 -0
- package/.agent/rules/cpp/security.md +51 -0
- package/.agent/rules/cpp/testing.md +44 -0
- package/.agent/rules/csharp/coding-style.md +72 -0
- package/.agent/rules/csharp/hooks.md +25 -0
- package/.agent/rules/csharp/patterns.md +50 -0
- package/.agent/rules/csharp/security.md +58 -0
- package/.agent/rules/csharp/testing.md +46 -0
- package/.agent/rules/dart/coding-style.md +159 -0
- package/.agent/rules/dart/hooks.md +66 -0
- package/.agent/rules/dart/patterns.md +261 -0
- package/.agent/rules/dart/security.md +135 -0
- package/.agent/rules/dart/testing.md +215 -0
- package/.agent/rules/golang/coding-style.md +32 -0
- package/.agent/rules/golang/hooks.md +17 -0
- package/.agent/rules/golang/patterns.md +45 -0
- package/.agent/rules/golang/security.md +34 -0
- package/.agent/rules/golang/testing.md +31 -0
- package/.agent/rules/java/coding-style.md +114 -0
- package/.agent/rules/java/hooks.md +18 -0
- package/.agent/rules/java/patterns.md +146 -0
- package/.agent/rules/java/security.md +100 -0
- package/.agent/rules/java/testing.md +131 -0
- package/.agent/rules/kotlin/coding-style.md +86 -0
- package/.agent/rules/kotlin/hooks.md +17 -0
- package/.agent/rules/kotlin/patterns.md +146 -0
- package/.agent/rules/kotlin/security.md +82 -0
- package/.agent/rules/kotlin/testing.md +128 -0
- package/.agent/rules/perl/coding-style.md +46 -0
- package/.agent/rules/perl/hooks.md +22 -0
- package/.agent/rules/perl/patterns.md +76 -0
- package/.agent/rules/perl/security.md +69 -0
- package/.agent/rules/perl/testing.md +54 -0
- package/.agent/rules/php/coding-style.md +40 -0
- package/.agent/rules/php/hooks.md +24 -0
- package/.agent/rules/php/patterns.md +33 -0
- package/.agent/rules/php/security.md +37 -0
- package/.agent/rules/php/testing.md +39 -0
- package/.agent/rules/python/coding-style.md +42 -0
- package/.agent/rules/python/hooks.md +19 -0
- package/.agent/rules/python/patterns.md +39 -0
- package/.agent/rules/python/security.md +30 -0
- package/.agent/rules/python/testing.md +38 -0
- package/.agent/rules/readme.md +111 -0
- package/.agent/rules/rust/coding-style.md +151 -0
- package/.agent/rules/rust/hooks.md +16 -0
- package/.agent/rules/rust/patterns.md +168 -0
- package/.agent/rules/rust/security.md +141 -0
- package/.agent/rules/rust/testing.md +154 -0
- package/.agent/rules/swift/coding-style.md +47 -0
- package/.agent/rules/swift/hooks.md +20 -0
- package/.agent/rules/swift/patterns.md +66 -0
- package/.agent/rules/swift/security.md +33 -0
- package/.agent/rules/swift/testing.md +45 -0
- package/.agent/rules/typescript/coding-style.md +199 -0
- package/.agent/rules/typescript/hooks.md +22 -0
- package/.agent/rules/typescript/patterns.md +52 -0
- package/.agent/rules/typescript/security.md +28 -0
- package/.agent/rules/typescript/testing.md +18 -0
- package/.agent/rules/web/coding-style.md +96 -0
- package/.agent/rules/web/design-quality.md +63 -0
- package/.agent/rules/web/hooks.md +120 -0
- package/.agent/rules/web/patterns.md +79 -0
- package/.agent/rules/web/performance.md +64 -0
- package/.agent/rules/web/security.md +57 -0
- package/.agent/rules/web/testing.md +55 -0
- package/.agent/rules/zh/agents.md +50 -0
- package/.agent/rules/zh/code-review.md +124 -0
- package/.agent/rules/zh/coding-style.md +48 -0
- package/.agent/rules/zh/development-workflow.md +44 -0
- package/.agent/rules/zh/git-workflow.md +24 -0
- package/.agent/rules/zh/hooks.md +30 -0
- package/.agent/rules/zh/patterns.md +31 -0
- package/.agent/rules/zh/performance.md +55 -0
- package/.agent/rules/zh/readme.md +108 -0
- package/.agent/rules/zh/security.md +29 -0
- package/.agent/rules/zh/testing.md +29 -0
- package/.agent/skills/agent-eval/SKILL.md +145 -0
- package/.agent/skills/agent-harness-construction/SKILL.md +73 -0
- package/.agent/skills/agent-payment-x402/SKILL.md +178 -0
- package/.agent/skills/agentic-engineering/SKILL.md +63 -0
- package/.agent/skills/ai-first-engineering/SKILL.md +51 -0
- package/.agent/skills/ai-regression-testing/SKILL.md +385 -0
- package/.agent/skills/android-clean-architecture/SKILL.md +339 -0
- package/.agent/skills/api-design/SKILL.md +523 -0
- package/.agent/skills/architecture-decision-records/SKILL.md +179 -0
- package/.agent/skills/article-writing/SKILL.md +79 -0
- package/.agent/skills/autonomous-agent-harness/SKILL.md +267 -0
- package/.agent/skills/autonomous-loops/SKILL.md +610 -0
- package/.agent/skills/backend-patterns/SKILL.md +598 -0
- package/.agent/skills/benchmark/SKILL.md +93 -0
- package/.agent/skills/blueprint/SKILL.md +105 -0
- package/.agent/skills/brand-voice/SKILL.md +97 -0
- package/.agent/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/.agent/skills/browser-qa/SKILL.md +87 -0
- package/.agent/skills/bun-runtime/SKILL.md +84 -0
- package/.agent/skills/canary-watch/SKILL.md +99 -0
- package/.agent/skills/carrier-relationship-management/SKILL.md +212 -0
- package/.agent/skills/ck/SKILL.md +147 -0
- package/.agent/skills/ck/commands/forget.mjs +44 -0
- package/.agent/skills/ck/commands/info.mjs +24 -0
- package/.agent/skills/ck/commands/init.mjs +143 -0
- package/.agent/skills/ck/commands/list.mjs +40 -0
- package/.agent/skills/ck/commands/migrate.mjs +202 -0
- package/.agent/skills/ck/commands/resume.mjs +36 -0
- package/.agent/skills/ck/commands/save.mjs +210 -0
- package/.agent/skills/ck/commands/shared.mjs +387 -0
- package/.agent/skills/ck/hooks/session-start.mjs +224 -0
- package/.agent/skills/claude-api/SKILL.md +337 -0
- package/.agent/skills/claude-devfleet/SKILL.md +103 -0
- package/.agent/skills/click-path-audit/SKILL.md +244 -0
- package/.agent/skills/clickhouse-io/SKILL.md +439 -0
- package/.agent/skills/codebase-onboarding/SKILL.md +233 -0
- package/.agent/skills/coding-standards/SKILL.md +530 -0
- package/.agent/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/.agent/skills/configure-ecc/SKILL.md +367 -0
- package/.agent/skills/connections-optimizer/SKILL.md +189 -0
- package/.agent/skills/content-engine/SKILL.md +131 -0
- package/.agent/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/.agent/skills/context-budget/SKILL.md +135 -0
- package/.agent/skills/continuous-agent-loop/SKILL.md +45 -0
- package/.agent/skills/continuous-learning/SKILL.md +119 -0
- package/.agent/skills/continuous-learning/config.json +18 -0
- package/.agent/skills/continuous-learning/evaluate-session.sh +69 -0
- package/.agent/skills/continuous-learning-v2/SKILL.md +365 -0
- package/.agent/skills/continuous-learning-v2/agents/observer-loop.sh +271 -0
- package/.agent/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/.agent/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/.agent/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
- package/.agent/skills/continuous-learning-v2/config.json +8 -0
- package/.agent/skills/continuous-learning-v2/hooks/observe.sh +428 -0
- package/.agent/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
- package/.agent/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
- package/.agent/skills/continuous-learning-v2/scripts/test-parse-instinct.py +984 -0
- package/.agent/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/.agent/skills/cpp-coding-standards/SKILL.md +723 -0
- package/.agent/skills/cpp-testing/SKILL.md +324 -0
- package/.agent/skills/crosspost/SKILL.md +111 -0
- package/.agent/skills/csharp-testing/SKILL.md +321 -0
- package/.agent/skills/customer-billing-ops/SKILL.md +140 -0
- package/.agent/skills/customs-trade-compliance/SKILL.md +263 -0
- package/.agent/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/.agent/skills/data-scraper-agent/SKILL.md +764 -0
- package/.agent/skills/database-migrations/SKILL.md +429 -0
- package/.agent/skills/deep-research/SKILL.md +155 -0
- package/.agent/skills/deployment-patterns/SKILL.md +427 -0
- package/.agent/skills/design-system/SKILL.md +82 -0
- package/.agent/skills/django-patterns/SKILL.md +734 -0
- package/.agent/skills/django-security/SKILL.md +593 -0
- package/.agent/skills/django-tdd/SKILL.md +729 -0
- package/.agent/skills/django-verification/SKILL.md +469 -0
- package/.agent/skills/dmux-workflows/SKILL.md +191 -0
- package/.agent/skills/docker-patterns/SKILL.md +364 -0
- package/.agent/skills/documentation-lookup/SKILL.md +90 -0
- package/.agent/skills/dotnet-patterns/SKILL.md +321 -0
- package/.agent/skills/e2e-testing/SKILL.md +326 -0
- package/.agent/skills/energy-procurement/SKILL.md +228 -0
- package/.agent/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/.agent/skills/eval-harness/SKILL.md +270 -0
- package/.agent/skills/exa-search/SKILL.md +103 -0
- package/.agent/skills/fal-ai-media/SKILL.md +284 -0
- package/.agent/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/.agent/skills/foundation-models-on-device/SKILL.md +243 -0
- package/.agent/skills/frontend-patterns/SKILL.md +642 -0
- package/.agent/skills/frontend-slides/SKILL.md +184 -0
- package/.agent/skills/frontend-slides/style-presets.md +330 -0
- package/.agent/skills/gan-style-harness/SKILL.md +278 -0
- package/.agent/skills/git-workflow/SKILL.md +715 -0
- package/.agent/skills/golang-patterns/SKILL.md +674 -0
- package/.agent/skills/golang-testing/SKILL.md +720 -0
- package/.agent/skills/google-workspace-ops/SKILL.md +95 -0
- package/.agent/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/.agent/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/.agent/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/.agent/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/.agent/skills/hexagonal-architecture/SKILL.md +276 -0
- package/.agent/skills/inventory-demand-planning/SKILL.md +247 -0
- package/.agent/skills/investor-materials/SKILL.md +96 -0
- package/.agent/skills/investor-outreach/SKILL.md +91 -0
- package/.agent/skills/iterative-retrieval/SKILL.md +211 -0
- package/.agent/skills/java-coding-standards/SKILL.md +147 -0
- package/.agent/skills/jira-integration/SKILL.md +293 -0
- package/.agent/skills/jpa-patterns/SKILL.md +151 -0
- package/.agent/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/.agent/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/.agent/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/.agent/skills/kotlin-patterns/SKILL.md +711 -0
- package/.agent/skills/kotlin-testing/SKILL.md +824 -0
- package/.agent/skills/laravel-patterns/SKILL.md +415 -0
- package/.agent/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/.agent/skills/laravel-security/SKILL.md +285 -0
- package/.agent/skills/laravel-tdd/SKILL.md +283 -0
- package/.agent/skills/laravel-verification/SKILL.md +179 -0
- package/.agent/skills/lead-intelligence/SKILL.md +321 -0
- package/.agent/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/.agent/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/.agent/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/.agent/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/.agent/skills/liquid-glass-design/SKILL.md +279 -0
- package/.agent/skills/logistics-exception-management/SKILL.md +222 -0
- package/.agent/skills/manim-video/SKILL.md +89 -0
- package/.agent/skills/manim-video/assets/network-graph-scene.py +52 -0
- package/.agent/skills/market-research/SKILL.md +75 -0
- package/.agent/skills/mcp-builder/SKILL.md +173 -113
- package/.agent/skills/mcp-builder/license.txt +202 -0
- package/.agent/skills/mcp-builder/reference/evaluation.md +602 -0
- package/.agent/skills/mcp-builder/reference/mcp-best-practices.md +249 -0
- package/.agent/skills/mcp-builder/reference/node-mcp-server.md +970 -0
- package/.agent/skills/mcp-builder/reference/python-mcp-server.md +719 -0
- package/.agent/skills/mcp-builder/scripts/connections.py +151 -0
- package/.agent/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/.agent/skills/mcp-builder/scripts/example-evaluation.xml +22 -0
- package/.agent/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/.agent/skills/mcp-server-patterns/SKILL.md +67 -0
- package/.agent/skills/nanoclaw-repl/SKILL.md +33 -0
- package/.agent/skills/nestjs-patterns/SKILL.md +230 -0
- package/.agent/skills/nextjs-turbopack/SKILL.md +44 -0
- package/.agent/skills/nutrient-document-processing/SKILL.md +167 -0
- package/.agent/skills/nuxt4-patterns/SKILL.md +100 -0
- package/.agent/skills/openclaw-persona-forge/SKILL.md +296 -0
- package/.agent/skills/openclaw-persona-forge/gacha.py +224 -0
- package/.agent/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/.agent/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/.agent/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/.agent/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/.agent/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/.agent/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/.agent/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/.agent/skills/opensource-pipeline/SKILL.md +255 -0
- package/.agent/skills/perl-patterns/SKILL.md +504 -0
- package/.agent/skills/perl-security/SKILL.md +503 -0
- package/.agent/skills/perl-testing/SKILL.md +475 -0
- package/.agent/skills/plankton-code-quality/SKILL.md +236 -0
- package/.agent/skills/postgres-patterns/SKILL.md +147 -0
- package/.agent/skills/product-lens/SKILL.md +85 -0
- package/.agent/skills/production-scheduling/SKILL.md +238 -0
- package/.agent/skills/project-flow-ops/SKILL.md +111 -0
- package/.agent/skills/project-guidelines-example/SKILL.md +349 -0
- package/.agent/skills/prompt-optimizer/SKILL.md +397 -0
- package/.agent/skills/python-patterns/SKILL.md +622 -313
- package/.agent/skills/python-testing/SKILL.md +816 -0
- package/.agent/skills/pytorch-patterns/SKILL.md +396 -0
- package/.agent/skills/quality-nonconformance/SKILL.md +260 -0
- package/.agent/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/.agent/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
- package/.agent/skills/remotion-video-creation/SKILL.md +43 -0
- package/.agent/skills/remotion-video-creation/rules/3d.md +86 -0
- package/.agent/skills/remotion-video-creation/rules/animations.md +29 -0
- package/.agent/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/.agent/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/.agent/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/.agent/skills/remotion-video-creation/rules/assets.md +78 -0
- package/.agent/skills/remotion-video-creation/rules/audio.md +172 -0
- package/.agent/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/.agent/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/.agent/skills/remotion-video-creation/rules/charts.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/.agent/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/.agent/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/.agent/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/.agent/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/.agent/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/.agent/skills/remotion-video-creation/rules/images.md +130 -0
- package/.agent/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/.agent/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/.agent/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/.agent/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/.agent/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/.agent/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/.agent/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/.agent/skills/remotion-video-creation/rules/timing.md +179 -0
- package/.agent/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/.agent/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/.agent/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/.agent/skills/remotion-video-creation/rules/videos.md +171 -0
- package/.agent/skills/repo-scan/SKILL.md +78 -0
- package/.agent/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/.agent/skills/rules-distill/SKILL.md +264 -0
- package/.agent/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/.agent/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/.agent/skills/rust-patterns/SKILL.md +499 -0
- package/.agent/skills/rust-testing/SKILL.md +500 -0
- package/.agent/skills/safety-guard/SKILL.md +75 -0
- package/.agent/skills/santa-method/SKILL.md +306 -0
- package/.agent/skills/search-first/SKILL.md +161 -0
- package/.agent/skills/security-review/SKILL.md +495 -0
- package/.agent/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/.agent/skills/security-scan/SKILL.md +165 -0
- package/.agent/skills/skill-comply/SKILL.md +58 -0
- package/.agent/skills/skill-comply/fixtures/compliant-trace.jsonl +5 -0
- package/.agent/skills/skill-comply/fixtures/noncompliant-trace.jsonl +3 -0
- package/.agent/skills/skill-comply/fixtures/tdd-spec.yaml +44 -0
- package/.agent/skills/skill-comply/prompts/classifier.md +24 -0
- package/.agent/skills/skill-comply/prompts/scenario-generator.md +62 -0
- package/.agent/skills/skill-comply/prompts/spec-generator.md +42 -0
- package/.agent/skills/skill-comply/pyproject.toml +15 -0
- package/.agent/skills/skill-comply/scripts/classifier.py +85 -0
- package/.agent/skills/skill-comply/scripts/grader.py +122 -0
- package/.agent/skills/skill-comply/scripts/init.py +0 -0
- package/.agent/skills/skill-comply/scripts/parser.py +107 -0
- package/.agent/skills/skill-comply/scripts/report.py +170 -0
- package/.agent/skills/skill-comply/scripts/run.py +127 -0
- package/.agent/skills/skill-comply/scripts/runner.py +161 -0
- package/.agent/skills/skill-comply/scripts/scenario-generator.py +70 -0
- package/.agent/skills/skill-comply/scripts/spec-generator.py +72 -0
- package/.agent/skills/skill-comply/scripts/utils.py +13 -0
- package/.agent/skills/skill-comply/tests/test-grader.py +137 -0
- package/.agent/skills/skill-comply/tests/test-parser.py +90 -0
- package/.agent/skills/skill-creator/SKILL.md +485 -0
- package/.agent/skills/skill-creator/agents/analyzer.md +274 -0
- package/.agent/skills/skill-creator/agents/comparator.md +202 -0
- package/.agent/skills/skill-creator/agents/grader.md +223 -0
- package/.agent/skills/skill-creator/assets/eval-review.html +146 -0
- package/.agent/skills/skill-creator/eval-viewer/generate-review.py +471 -0
- package/.agent/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.agent/skills/skill-creator/license.txt +202 -0
- package/.agent/skills/skill-creator/references/schemas.md +430 -0
- package/.agent/skills/skill-creator/scripts/aggregate-benchmark.py +401 -0
- package/.agent/skills/skill-creator/scripts/generate-report.py +326 -0
- package/.agent/skills/skill-creator/scripts/improve-description.py +247 -0
- package/.agent/skills/skill-creator/scripts/init.py +0 -0
- package/.agent/skills/skill-creator/scripts/package-skill.py +136 -0
- package/.agent/skills/skill-creator/scripts/quick-validate.py +103 -0
- package/.agent/skills/skill-creator/scripts/run-eval.py +310 -0
- package/.agent/skills/skill-creator/scripts/run-loop.py +328 -0
- package/.agent/skills/skill-creator/scripts/utils.py +47 -0
- package/.agent/skills/skill-stocktake/SKILL.md +193 -0
- package/.agent/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/.agent/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/.agent/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/.agent/skills/social-graph-ranker/SKILL.md +154 -0
- package/.agent/skills/springboot-patterns/SKILL.md +314 -0
- package/.agent/skills/springboot-security/SKILL.md +272 -0
- package/.agent/skills/springboot-tdd/SKILL.md +158 -0
- package/.agent/skills/springboot-verification/SKILL.md +231 -0
- package/.agent/skills/strategic-compact/SKILL.md +131 -0
- package/.agent/skills/strategic-compact/suggest-compact.sh +54 -0
- package/.agent/skills/swift-actor-persistence/SKILL.md +143 -0
- package/.agent/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/.agent/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/.agent/skills/swiftui-patterns/SKILL.md +259 -0
- package/.agent/skills/tdd-workflow/SKILL.md +412 -98
- package/.agent/skills/team-builder/SKILL.md +168 -0
- package/.agent/skills/token-budget-advisor/SKILL.md +133 -0
- package/.agent/skills/ui-demo/SKILL.md +465 -0
- package/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/.agent/skills/ui-ux-pro-max/data/landing.csv +28 -28
- package/.agent/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/.agent/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/.agent/skills/ui-ux-pro-max/scripts/search.py +114 -114
- package/.agent/skills/verification-loop/SKILL.md +126 -0
- package/.agent/skills/video-editing/SKILL.md +310 -0
- package/.agent/skills/videodb/SKILL.md +374 -0
- package/.agent/skills/videodb/reference/api-reference.md +550 -0
- package/.agent/skills/videodb/reference/capture-reference.md +407 -0
- package/.agent/skills/videodb/reference/capture.md +101 -0
- package/.agent/skills/videodb/reference/editor.md +443 -0
- package/.agent/skills/videodb/reference/generative.md +331 -0
- package/.agent/skills/videodb/reference/rtstream-reference.md +564 -0
- package/.agent/skills/videodb/reference/rtstream.md +65 -0
- package/.agent/skills/videodb/reference/search.md +230 -0
- package/.agent/skills/videodb/reference/streaming.md +406 -0
- package/.agent/skills/videodb/reference/use-cases.md +118 -0
- package/.agent/skills/videodb/scripts/ws-listener.py +282 -0
- package/.agent/skills/visa-doc-translate/SKILL.md +117 -0
- package/.agent/skills/visa-doc-translate/readme.md +86 -0
- package/.agent/skills/workspace-surface-audit/SKILL.md +125 -0
- package/.agent/skills/x-api/SKILL.md +230 -0
- package/.agent/tasks/two-track-merge-contract.md +29 -0
- package/.agent/workflows/aside.md +164 -164
- package/.agent/workflows/build-fix.md +62 -62
- package/.agent/workflows/checkpoint.md +74 -74
- package/.agent/workflows/claw.md +23 -51
- package/.agent/workflows/clean-memory.md +34 -0
- package/.agent/workflows/code-review.md +289 -40
- package/.agent/workflows/context-budget.md +23 -29
- package/.agent/workflows/cpp-build.md +173 -173
- package/.agent/workflows/cpp-review.md +132 -132
- package/.agent/workflows/cpp-test.md +251 -251
- package/.agent/workflows/devfleet.md +23 -92
- package/.agent/workflows/docs.md +23 -31
- package/.agent/workflows/e2e.md +268 -365
- package/.agent/workflows/eval.md +23 -120
- package/.agent/workflows/evolve.md +178 -178
- package/.agent/workflows/flutter-build.md +164 -0
- package/.agent/workflows/flutter-review.md +116 -0
- package/.agent/workflows/flutter-test.md +144 -0
- package/.agent/workflows/gan-build.md +99 -0
- package/.agent/workflows/gan-design.md +35 -0
- package/.agent/workflows/go-build.md +183 -183
- package/.agent/workflows/go-review.md +148 -148
- package/.agent/workflows/go-test.md +268 -268
- package/.agent/workflows/gradle-build.md +70 -70
- package/.agent/workflows/harness-audit.md +73 -71
- package/.agent/workflows/instinct-export.md +66 -66
- package/.agent/workflows/instinct-import.md +114 -114
- package/.agent/workflows/instinct-status.md +59 -59
- package/.agent/workflows/jira.md +106 -0
- package/.agent/workflows/kotlin-build.md +174 -174
- package/.agent/workflows/kotlin-review.md +140 -140
- package/.agent/workflows/kotlin-test.md +312 -312
- package/.agent/workflows/learn-eval.md +116 -116
- package/.agent/workflows/learn.md +70 -70
- package/.agent/workflows/loop-start.md +32 -32
- package/.agent/workflows/loop-status.md +24 -24
- package/.agent/workflows/model-route.md +26 -26
- package/.agent/workflows/multi-backend.md +158 -158
- package/.agent/workflows/multi-execute.md +315 -315
- package/.agent/workflows/multi-frontend.md +158 -158
- package/.agent/workflows/multi-plan.md +268 -268
- package/.agent/workflows/multi-workflow.md +191 -191
- package/.agent/workflows/orchestrate.md +135 -231
- package/.agent/workflows/plan.md +117 -115
- package/.agent/workflows/pm2.md +272 -272
- package/.agent/workflows/projects.md +39 -39
- package/.agent/workflows/promote.md +41 -41
- package/.agent/workflows/prompt-optimize.md +23 -38
- package/.agent/workflows/prp-commit.md +112 -0
- package/.agent/workflows/prp-implement.md +385 -0
- package/.agent/workflows/prp-plan.md +502 -0
- package/.agent/workflows/prp-pr.md +184 -0
- package/.agent/workflows/prp-prd.md +447 -0
- package/.agent/workflows/prune.md +31 -31
- package/.agent/workflows/python-review.md +297 -297
- package/.agent/workflows/quality-gate.md +29 -29
- package/.agent/workflows/refactor-clean.md +80 -80
- package/.agent/workflows/resume-session.md +156 -156
- package/.agent/workflows/rules-distill.md +20 -11
- package/.agent/workflows/rust-build.md +187 -187
- package/.agent/workflows/rust-review.md +142 -142
- package/.agent/workflows/rust-test.md +308 -308
- package/.agent/workflows/santa-loop.md +175 -0
- package/.agent/workflows/save-session.md +275 -275
- package/.agent/workflows/sessions.md +333 -333
- package/.agent/workflows/setup-pm.md +80 -80
- package/.agent/workflows/skill-create.md +174 -174
- package/.agent/workflows/skill-health.md +54 -54
- package/.agent/workflows/tdd.md +231 -328
- package/.agent/workflows/test-coverage.md +69 -69
- package/.agent/workflows/update-codemaps.md +72 -72
- package/.agent/workflows/update-docs.md +84 -84
- package/.agent/workflows/verify.md +23 -59
- package/LICENSE +176 -176
- package/README.md +28 -20
- package/RELEASE.md +32 -36
- package/package.json +87 -79
- package/scripts/release-check.js +55 -55
- package/src/bin/cli.js +399 -53
- package/src/lib/installer.js +360 -114
- package/src/lib/manifests/stacks.js +122 -0
- package/src/lib/slash-commands.js +28 -0
- package/src/templates/claude/CLAUDE.en.md +42 -0
- package/src/templates/claude/CLAUDE.md +42 -0
- package/src/templates/claude/CLAUDE.vi.md +42 -0
- package/src/templates/codex/AGENTS.en.md +40 -0
- package/src/templates/codex/AGENTS.md +40 -0
- package/src/templates/codex/AGENTS.vi.md +40 -0
- package/src/templates/cursor/pilo-masterkit.mdc +20 -0
- package/src/templates/gemini/GEMINI.en.md +56 -0
- package/src/templates/gemini/GEMINI.md +56 -0
- package/src/templates/gemini/GEMINI.vi.md +56 -0
- package/src/templates/github/copilot-instructions.md +16 -0
|
@@ -1,312 +1,312 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce TDD workflow for Kotlin. Write Kotest tests first, then implement. Verify 80%+ coverage with Kover.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Kotlin TDD Command
|
|
6
|
-
|
|
7
|
-
This command enforces test-driven development methodology for Kotlin code using Kotest, MockK, and Kover.
|
|
8
|
-
|
|
9
|
-
## What This Command Does
|
|
10
|
-
|
|
11
|
-
1. **Define Types/Interfaces**: Scaffold function signatures first
|
|
12
|
-
2. **Write Kotest Tests**: Create comprehensive test specs (RED)
|
|
13
|
-
3. **Run Tests**: Verify tests fail for the right reason
|
|
14
|
-
4. **Implement Code**: Write minimal code to pass (GREEN)
|
|
15
|
-
5. **Refactor**: Improve while keeping tests green
|
|
16
|
-
6. **Check Coverage**: Ensure 80%+ coverage with Kover
|
|
17
|
-
|
|
18
|
-
## When to Use
|
|
19
|
-
|
|
20
|
-
Use `/kotlin-test` when:
|
|
21
|
-
- Implementing new Kotlin functions or classes
|
|
22
|
-
- Adding test coverage to existing Kotlin code
|
|
23
|
-
- Fixing bugs (write failing test first)
|
|
24
|
-
- Building critical business logic
|
|
25
|
-
- Learning TDD workflow in Kotlin
|
|
26
|
-
|
|
27
|
-
## TDD Cycle
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
RED -> Write failing Kotest test
|
|
31
|
-
GREEN -> Implement minimal code to pass
|
|
32
|
-
REFACTOR -> Improve code, tests stay green
|
|
33
|
-
REPEAT -> Next test case
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Example Session
|
|
37
|
-
|
|
38
|
-
````text
|
|
39
|
-
User: /kotlin-test I need a function to validate user registration requests
|
|
40
|
-
|
|
41
|
-
Agent:
|
|
42
|
-
# TDD Session: Registration Validator
|
|
43
|
-
|
|
44
|
-
## Step 1: Define Interface
|
|
45
|
-
|
|
46
|
-
```kotlin
|
|
47
|
-
// validator/RegistrationValidator.kt
|
|
48
|
-
package com.example.validator
|
|
49
|
-
|
|
50
|
-
data class RegistrationRequest(
|
|
51
|
-
val name: String,
|
|
52
|
-
val email: String,
|
|
53
|
-
val password: String,
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
sealed class ValidationResult {
|
|
57
|
-
data object Valid : ValidationResult()
|
|
58
|
-
data class Invalid(val errors: List<String>) : ValidationResult()
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
fun validateRegistration(request: RegistrationRequest): ValidationResult {
|
|
62
|
-
TODO("not implemented")
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Step 2: Write Kotest Tests (RED)
|
|
67
|
-
|
|
68
|
-
```kotlin
|
|
69
|
-
// validator/RegistrationValidatorTest.kt
|
|
70
|
-
package com.example.validator
|
|
71
|
-
|
|
72
|
-
import io.kotest.core.spec.style.FunSpec
|
|
73
|
-
import io.kotest.matchers.shouldBe
|
|
74
|
-
import io.kotest.matchers.types.shouldBeInstanceOf
|
|
75
|
-
|
|
76
|
-
class RegistrationValidatorTest : FunSpec({
|
|
77
|
-
test("valid registration returns Valid") {
|
|
78
|
-
val request = RegistrationRequest(
|
|
79
|
-
name = "Alice",
|
|
80
|
-
email = "alice@example.com",
|
|
81
|
-
password = "SecureP@ss1",
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
val result = validateRegistration(request)
|
|
85
|
-
|
|
86
|
-
result.shouldBeInstanceOf<ValidationResult.Valid>()
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
test("blank name returns Invalid") {
|
|
90
|
-
val request = RegistrationRequest(
|
|
91
|
-
name = "",
|
|
92
|
-
email = "alice@example.com",
|
|
93
|
-
password = "SecureP@ss1",
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
val result = validateRegistration(request)
|
|
97
|
-
|
|
98
|
-
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
99
|
-
invalid.errors shouldBe listOf("Name is required")
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
test("invalid email returns Invalid") {
|
|
103
|
-
val request = RegistrationRequest(
|
|
104
|
-
name = "Alice",
|
|
105
|
-
email = "not-an-email",
|
|
106
|
-
password = "SecureP@ss1",
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
val result = validateRegistration(request)
|
|
110
|
-
|
|
111
|
-
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
112
|
-
invalid.errors shouldBe listOf("Invalid email format")
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
test("short password returns Invalid") {
|
|
116
|
-
val request = RegistrationRequest(
|
|
117
|
-
name = "Alice",
|
|
118
|
-
email = "alice@example.com",
|
|
119
|
-
password = "short",
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
val result = validateRegistration(request)
|
|
123
|
-
|
|
124
|
-
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
125
|
-
invalid.errors shouldBe listOf("Password must be at least 8 characters")
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
test("multiple errors returns all errors") {
|
|
129
|
-
val request = RegistrationRequest(
|
|
130
|
-
name = "",
|
|
131
|
-
email = "bad",
|
|
132
|
-
password = "short",
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
val result = validateRegistration(request)
|
|
136
|
-
|
|
137
|
-
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
138
|
-
invalid.errors.size shouldBe 3
|
|
139
|
-
}
|
|
140
|
-
})
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
## Step 3: Run Tests - Verify FAIL
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
$ ./gradlew test
|
|
147
|
-
|
|
148
|
-
RegistrationValidatorTest > valid registration returns Valid FAILED
|
|
149
|
-
kotlin.NotImplementedError: An operation is not implemented
|
|
150
|
-
|
|
151
|
-
FAILED (5 tests, 0 passed, 5 failed)
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
✓ Tests fail as expected (NotImplementedError).
|
|
155
|
-
|
|
156
|
-
## Step 4: Implement Minimal Code (GREEN)
|
|
157
|
-
|
|
158
|
-
```kotlin
|
|
159
|
-
// validator/RegistrationValidator.kt
|
|
160
|
-
package com.example.validator
|
|
161
|
-
|
|
162
|
-
private val EMAIL_REGEX = Regex("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")
|
|
163
|
-
private const val MIN_PASSWORD_LENGTH = 8
|
|
164
|
-
|
|
165
|
-
fun validateRegistration(request: RegistrationRequest): ValidationResult {
|
|
166
|
-
val errors = buildList {
|
|
167
|
-
if (request.name.isBlank()) add("Name is required")
|
|
168
|
-
if (!EMAIL_REGEX.matches(request.email)) add("Invalid email format")
|
|
169
|
-
if (request.password.length < MIN_PASSWORD_LENGTH) add("Password must be at least $MIN_PASSWORD_LENGTH characters")
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return if (errors.isEmpty()) ValidationResult.Valid
|
|
173
|
-
else ValidationResult.Invalid(errors)
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
## Step 5: Run Tests - Verify PASS
|
|
178
|
-
|
|
179
|
-
```bash
|
|
180
|
-
$ ./gradlew test
|
|
181
|
-
|
|
182
|
-
RegistrationValidatorTest > valid registration returns Valid PASSED
|
|
183
|
-
RegistrationValidatorTest > blank name returns Invalid PASSED
|
|
184
|
-
RegistrationValidatorTest > invalid email returns Invalid PASSED
|
|
185
|
-
RegistrationValidatorTest > short password returns Invalid PASSED
|
|
186
|
-
RegistrationValidatorTest > multiple errors returns all errors PASSED
|
|
187
|
-
|
|
188
|
-
PASSED (5 tests, 5 passed, 0 failed)
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
✓ All tests passing!
|
|
192
|
-
|
|
193
|
-
## Step 6: Check Coverage
|
|
194
|
-
|
|
195
|
-
```bash
|
|
196
|
-
$ ./gradlew koverHtmlReport
|
|
197
|
-
|
|
198
|
-
Coverage: 100.0% of statements
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
✓ Coverage: 100%
|
|
202
|
-
|
|
203
|
-
## TDD Complete!
|
|
204
|
-
````
|
|
205
|
-
|
|
206
|
-
## Test Patterns
|
|
207
|
-
|
|
208
|
-
### StringSpec (Simplest)
|
|
209
|
-
|
|
210
|
-
```kotlin
|
|
211
|
-
class CalculatorTest : StringSpec({
|
|
212
|
-
"add two positive numbers" {
|
|
213
|
-
Calculator.add(2, 3) shouldBe 5
|
|
214
|
-
}
|
|
215
|
-
})
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### BehaviorSpec (BDD)
|
|
219
|
-
|
|
220
|
-
```kotlin
|
|
221
|
-
class OrderServiceTest : BehaviorSpec({
|
|
222
|
-
Given("a valid order") {
|
|
223
|
-
When("placed") {
|
|
224
|
-
Then("should be confirmed") { /* ... */ }
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
})
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### Data-Driven Tests
|
|
231
|
-
|
|
232
|
-
```kotlin
|
|
233
|
-
class ParserTest : FunSpec({
|
|
234
|
-
context("valid inputs") {
|
|
235
|
-
withData("2026-01-15", "2026-12-31", "2000-01-01") { input ->
|
|
236
|
-
parseDate(input).shouldNotBeNull()
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
})
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
### Coroutine Testing
|
|
243
|
-
|
|
244
|
-
```kotlin
|
|
245
|
-
class AsyncServiceTest : FunSpec({
|
|
246
|
-
test("concurrent fetch completes") {
|
|
247
|
-
runTest {
|
|
248
|
-
val result = service.fetchAll()
|
|
249
|
-
result.shouldNotBeEmpty()
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
})
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
## Coverage Commands
|
|
256
|
-
|
|
257
|
-
```bash
|
|
258
|
-
# Run tests with coverage
|
|
259
|
-
./gradlew koverHtmlReport
|
|
260
|
-
|
|
261
|
-
# Verify coverage thresholds
|
|
262
|
-
./gradlew koverVerify
|
|
263
|
-
|
|
264
|
-
# XML report for CI
|
|
265
|
-
./gradlew koverXmlReport
|
|
266
|
-
|
|
267
|
-
# Open HTML report
|
|
268
|
-
open build/reports/kover/html/index.html
|
|
269
|
-
|
|
270
|
-
# Run specific test class
|
|
271
|
-
./gradlew test --tests "com.example.UserServiceTest"
|
|
272
|
-
|
|
273
|
-
# Run with verbose output
|
|
274
|
-
./gradlew test --info
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
## Coverage Targets
|
|
278
|
-
|
|
279
|
-
| Code Type | Target |
|
|
280
|
-
|-----------|--------|
|
|
281
|
-
| Critical business logic | 100% |
|
|
282
|
-
| Public APIs | 90%+ |
|
|
283
|
-
| General code | 80%+ |
|
|
284
|
-
| Generated code | Exclude |
|
|
285
|
-
|
|
286
|
-
## TDD Best Practices
|
|
287
|
-
|
|
288
|
-
**DO:**
|
|
289
|
-
- Write test FIRST, before any implementation
|
|
290
|
-
- Run tests after each change
|
|
291
|
-
- Use Kotest matchers for expressive assertions
|
|
292
|
-
- Use MockK's `coEvery`/`coVerify` for suspend functions
|
|
293
|
-
- Test behavior, not implementation details
|
|
294
|
-
- Include edge cases (empty, null, max values)
|
|
295
|
-
|
|
296
|
-
**DON'T:**
|
|
297
|
-
- Write implementation before tests
|
|
298
|
-
- Skip the RED phase
|
|
299
|
-
- Test private functions directly
|
|
300
|
-
- Use `Thread.sleep()` in coroutine tests
|
|
301
|
-
- Ignore flaky tests
|
|
302
|
-
|
|
303
|
-
## Related Commands
|
|
304
|
-
|
|
305
|
-
- `/kotlin-build` - Fix build errors
|
|
306
|
-
- `/kotlin-review` - Review code after implementation
|
|
307
|
-
- `/verify` - Run full verification loop
|
|
308
|
-
|
|
309
|
-
## Related
|
|
310
|
-
|
|
311
|
-
- Skill: `skills/kotlin-testing/`
|
|
312
|
-
- Skill: `skills/tdd-workflow/`
|
|
1
|
+
---
|
|
2
|
+
description: Enforce TDD workflow for Kotlin. Write Kotest tests first, then implement. Verify 80%+ coverage with Kover.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Kotlin TDD Command
|
|
6
|
+
|
|
7
|
+
This command enforces test-driven development methodology for Kotlin code using Kotest, MockK, and Kover.
|
|
8
|
+
|
|
9
|
+
## What This Command Does
|
|
10
|
+
|
|
11
|
+
1. **Define Types/Interfaces**: Scaffold function signatures first
|
|
12
|
+
2. **Write Kotest Tests**: Create comprehensive test specs (RED)
|
|
13
|
+
3. **Run Tests**: Verify tests fail for the right reason
|
|
14
|
+
4. **Implement Code**: Write minimal code to pass (GREEN)
|
|
15
|
+
5. **Refactor**: Improve while keeping tests green
|
|
16
|
+
6. **Check Coverage**: Ensure 80%+ coverage with Kover
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
Use `/kotlin-test` when:
|
|
21
|
+
- Implementing new Kotlin functions or classes
|
|
22
|
+
- Adding test coverage to existing Kotlin code
|
|
23
|
+
- Fixing bugs (write failing test first)
|
|
24
|
+
- Building critical business logic
|
|
25
|
+
- Learning TDD workflow in Kotlin
|
|
26
|
+
|
|
27
|
+
## TDD Cycle
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
RED -> Write failing Kotest test
|
|
31
|
+
GREEN -> Implement minimal code to pass
|
|
32
|
+
REFACTOR -> Improve code, tests stay green
|
|
33
|
+
REPEAT -> Next test case
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Example Session
|
|
37
|
+
|
|
38
|
+
````text
|
|
39
|
+
User: /kotlin-test I need a function to validate user registration requests
|
|
40
|
+
|
|
41
|
+
Agent:
|
|
42
|
+
# TDD Session: Registration Validator
|
|
43
|
+
|
|
44
|
+
## Step 1: Define Interface
|
|
45
|
+
|
|
46
|
+
```kotlin
|
|
47
|
+
// validator/RegistrationValidator.kt
|
|
48
|
+
package com.example.validator
|
|
49
|
+
|
|
50
|
+
data class RegistrationRequest(
|
|
51
|
+
val name: String,
|
|
52
|
+
val email: String,
|
|
53
|
+
val password: String,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
sealed class ValidationResult {
|
|
57
|
+
data object Valid : ValidationResult()
|
|
58
|
+
data class Invalid(val errors: List<String>) : ValidationResult()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
fun validateRegistration(request: RegistrationRequest): ValidationResult {
|
|
62
|
+
TODO("not implemented")
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Step 2: Write Kotest Tests (RED)
|
|
67
|
+
|
|
68
|
+
```kotlin
|
|
69
|
+
// validator/RegistrationValidatorTest.kt
|
|
70
|
+
package com.example.validator
|
|
71
|
+
|
|
72
|
+
import io.kotest.core.spec.style.FunSpec
|
|
73
|
+
import io.kotest.matchers.shouldBe
|
|
74
|
+
import io.kotest.matchers.types.shouldBeInstanceOf
|
|
75
|
+
|
|
76
|
+
class RegistrationValidatorTest : FunSpec({
|
|
77
|
+
test("valid registration returns Valid") {
|
|
78
|
+
val request = RegistrationRequest(
|
|
79
|
+
name = "Alice",
|
|
80
|
+
email = "alice@example.com",
|
|
81
|
+
password = "SecureP@ss1",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
val result = validateRegistration(request)
|
|
85
|
+
|
|
86
|
+
result.shouldBeInstanceOf<ValidationResult.Valid>()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
test("blank name returns Invalid") {
|
|
90
|
+
val request = RegistrationRequest(
|
|
91
|
+
name = "",
|
|
92
|
+
email = "alice@example.com",
|
|
93
|
+
password = "SecureP@ss1",
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
val result = validateRegistration(request)
|
|
97
|
+
|
|
98
|
+
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
99
|
+
invalid.errors shouldBe listOf("Name is required")
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
test("invalid email returns Invalid") {
|
|
103
|
+
val request = RegistrationRequest(
|
|
104
|
+
name = "Alice",
|
|
105
|
+
email = "not-an-email",
|
|
106
|
+
password = "SecureP@ss1",
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
val result = validateRegistration(request)
|
|
110
|
+
|
|
111
|
+
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
112
|
+
invalid.errors shouldBe listOf("Invalid email format")
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
test("short password returns Invalid") {
|
|
116
|
+
val request = RegistrationRequest(
|
|
117
|
+
name = "Alice",
|
|
118
|
+
email = "alice@example.com",
|
|
119
|
+
password = "short",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
val result = validateRegistration(request)
|
|
123
|
+
|
|
124
|
+
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
125
|
+
invalid.errors shouldBe listOf("Password must be at least 8 characters")
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
test("multiple errors returns all errors") {
|
|
129
|
+
val request = RegistrationRequest(
|
|
130
|
+
name = "",
|
|
131
|
+
email = "bad",
|
|
132
|
+
password = "short",
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
val result = validateRegistration(request)
|
|
136
|
+
|
|
137
|
+
val invalid = result.shouldBeInstanceOf<ValidationResult.Invalid>()
|
|
138
|
+
invalid.errors.size shouldBe 3
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Step 3: Run Tests - Verify FAIL
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
$ ./gradlew test
|
|
147
|
+
|
|
148
|
+
RegistrationValidatorTest > valid registration returns Valid FAILED
|
|
149
|
+
kotlin.NotImplementedError: An operation is not implemented
|
|
150
|
+
|
|
151
|
+
FAILED (5 tests, 0 passed, 5 failed)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
✓ Tests fail as expected (NotImplementedError).
|
|
155
|
+
|
|
156
|
+
## Step 4: Implement Minimal Code (GREEN)
|
|
157
|
+
|
|
158
|
+
```kotlin
|
|
159
|
+
// validator/RegistrationValidator.kt
|
|
160
|
+
package com.example.validator
|
|
161
|
+
|
|
162
|
+
private val EMAIL_REGEX = Regex("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")
|
|
163
|
+
private const val MIN_PASSWORD_LENGTH = 8
|
|
164
|
+
|
|
165
|
+
fun validateRegistration(request: RegistrationRequest): ValidationResult {
|
|
166
|
+
val errors = buildList {
|
|
167
|
+
if (request.name.isBlank()) add("Name is required")
|
|
168
|
+
if (!EMAIL_REGEX.matches(request.email)) add("Invalid email format")
|
|
169
|
+
if (request.password.length < MIN_PASSWORD_LENGTH) add("Password must be at least $MIN_PASSWORD_LENGTH characters")
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return if (errors.isEmpty()) ValidationResult.Valid
|
|
173
|
+
else ValidationResult.Invalid(errors)
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Step 5: Run Tests - Verify PASS
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
$ ./gradlew test
|
|
181
|
+
|
|
182
|
+
RegistrationValidatorTest > valid registration returns Valid PASSED
|
|
183
|
+
RegistrationValidatorTest > blank name returns Invalid PASSED
|
|
184
|
+
RegistrationValidatorTest > invalid email returns Invalid PASSED
|
|
185
|
+
RegistrationValidatorTest > short password returns Invalid PASSED
|
|
186
|
+
RegistrationValidatorTest > multiple errors returns all errors PASSED
|
|
187
|
+
|
|
188
|
+
PASSED (5 tests, 5 passed, 0 failed)
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
✓ All tests passing!
|
|
192
|
+
|
|
193
|
+
## Step 6: Check Coverage
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
$ ./gradlew koverHtmlReport
|
|
197
|
+
|
|
198
|
+
Coverage: 100.0% of statements
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
✓ Coverage: 100%
|
|
202
|
+
|
|
203
|
+
## TDD Complete!
|
|
204
|
+
````
|
|
205
|
+
|
|
206
|
+
## Test Patterns
|
|
207
|
+
|
|
208
|
+
### StringSpec (Simplest)
|
|
209
|
+
|
|
210
|
+
```kotlin
|
|
211
|
+
class CalculatorTest : StringSpec({
|
|
212
|
+
"add two positive numbers" {
|
|
213
|
+
Calculator.add(2, 3) shouldBe 5
|
|
214
|
+
}
|
|
215
|
+
})
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### BehaviorSpec (BDD)
|
|
219
|
+
|
|
220
|
+
```kotlin
|
|
221
|
+
class OrderServiceTest : BehaviorSpec({
|
|
222
|
+
Given("a valid order") {
|
|
223
|
+
When("placed") {
|
|
224
|
+
Then("should be confirmed") { /* ... */ }
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Data-Driven Tests
|
|
231
|
+
|
|
232
|
+
```kotlin
|
|
233
|
+
class ParserTest : FunSpec({
|
|
234
|
+
context("valid inputs") {
|
|
235
|
+
withData("2026-01-15", "2026-12-31", "2000-01-01") { input ->
|
|
236
|
+
parseDate(input).shouldNotBeNull()
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Coroutine Testing
|
|
243
|
+
|
|
244
|
+
```kotlin
|
|
245
|
+
class AsyncServiceTest : FunSpec({
|
|
246
|
+
test("concurrent fetch completes") {
|
|
247
|
+
runTest {
|
|
248
|
+
val result = service.fetchAll()
|
|
249
|
+
result.shouldNotBeEmpty()
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
})
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Coverage Commands
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
# Run tests with coverage
|
|
259
|
+
./gradlew koverHtmlReport
|
|
260
|
+
|
|
261
|
+
# Verify coverage thresholds
|
|
262
|
+
./gradlew koverVerify
|
|
263
|
+
|
|
264
|
+
# XML report for CI
|
|
265
|
+
./gradlew koverXmlReport
|
|
266
|
+
|
|
267
|
+
# Open HTML report
|
|
268
|
+
open build/reports/kover/html/index.html
|
|
269
|
+
|
|
270
|
+
# Run specific test class
|
|
271
|
+
./gradlew test --tests "com.example.UserServiceTest"
|
|
272
|
+
|
|
273
|
+
# Run with verbose output
|
|
274
|
+
./gradlew test --info
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Coverage Targets
|
|
278
|
+
|
|
279
|
+
| Code Type | Target |
|
|
280
|
+
|-----------|--------|
|
|
281
|
+
| Critical business logic | 100% |
|
|
282
|
+
| Public APIs | 90%+ |
|
|
283
|
+
| General code | 80%+ |
|
|
284
|
+
| Generated code | Exclude |
|
|
285
|
+
|
|
286
|
+
## TDD Best Practices
|
|
287
|
+
|
|
288
|
+
**DO:**
|
|
289
|
+
- Write test FIRST, before any implementation
|
|
290
|
+
- Run tests after each change
|
|
291
|
+
- Use Kotest matchers for expressive assertions
|
|
292
|
+
- Use MockK's `coEvery`/`coVerify` for suspend functions
|
|
293
|
+
- Test behavior, not implementation details
|
|
294
|
+
- Include edge cases (empty, null, max values)
|
|
295
|
+
|
|
296
|
+
**DON'T:**
|
|
297
|
+
- Write implementation before tests
|
|
298
|
+
- Skip the RED phase
|
|
299
|
+
- Test private functions directly
|
|
300
|
+
- Use `Thread.sleep()` in coroutine tests
|
|
301
|
+
- Ignore flaky tests
|
|
302
|
+
|
|
303
|
+
## Related Commands
|
|
304
|
+
|
|
305
|
+
- `/kotlin-build` - Fix build errors
|
|
306
|
+
- `/kotlin-review` - Review code after implementation
|
|
307
|
+
- `/verify` - Run full verification loop
|
|
308
|
+
|
|
309
|
+
## Related
|
|
310
|
+
|
|
311
|
+
- Skill: `skills/kotlin-testing/`
|
|
312
|
+
- Skill: `skills/tdd-workflow/`
|