@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
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rust-testing
|
|
3
|
+
description: Rust testing patterns including unit tests, integration tests, async testing, property-based testing, mocking, and coverage. Follows TDD methodology.
|
|
4
|
+
origin: ECC
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Rust Testing Patterns
|
|
8
|
+
|
|
9
|
+
Comprehensive Rust testing patterns for writing reliable, maintainable tests following TDD methodology.
|
|
10
|
+
|
|
11
|
+
## When to Use
|
|
12
|
+
|
|
13
|
+
- Writing new Rust functions, methods, or traits
|
|
14
|
+
- Adding test coverage to existing code
|
|
15
|
+
- Creating benchmarks for performance-critical code
|
|
16
|
+
- Implementing property-based tests for input validation
|
|
17
|
+
- Following TDD workflow in Rust projects
|
|
18
|
+
|
|
19
|
+
## How It Works
|
|
20
|
+
|
|
21
|
+
1. **Identify target code** — Find the function, trait, or module to test
|
|
22
|
+
2. **Write a test** — Use `#[test]` in a `#[cfg(test)]` module, rstest for parameterized tests, or proptest for property-based tests
|
|
23
|
+
3. **Mock dependencies** — Use mockall to isolate the unit under test
|
|
24
|
+
4. **Run tests (RED)** — Verify the test fails with the expected error
|
|
25
|
+
5. **Implement (GREEN)** — Write minimal code to pass
|
|
26
|
+
6. **Refactor** — Improve while keeping tests green
|
|
27
|
+
7. **Check coverage** — Use cargo-llvm-cov, target 80%+
|
|
28
|
+
|
|
29
|
+
## TDD Workflow for Rust
|
|
30
|
+
|
|
31
|
+
### The RED-GREEN-REFACTOR Cycle
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
RED → Write a failing test first
|
|
35
|
+
GREEN → Write minimal code to pass the test
|
|
36
|
+
REFACTOR → Improve code while keeping tests green
|
|
37
|
+
REPEAT → Continue with next requirement
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Step-by-Step TDD in Rust
|
|
41
|
+
|
|
42
|
+
```rust
|
|
43
|
+
// RED: Write test first, use todo!() as placeholder
|
|
44
|
+
pub fn add(a: i32, b: i32) -> i32 { todo!() }
|
|
45
|
+
|
|
46
|
+
#[cfg(test)]
|
|
47
|
+
mod tests {
|
|
48
|
+
use super::*;
|
|
49
|
+
#[test]
|
|
50
|
+
fn test_add() { assert_eq!(add(2, 3), 5); }
|
|
51
|
+
}
|
|
52
|
+
// cargo test → panics at 'not yet implemented'
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```rust
|
|
56
|
+
// GREEN: Replace todo!() with minimal implementation
|
|
57
|
+
pub fn add(a: i32, b: i32) -> i32 { a + b }
|
|
58
|
+
// cargo test → PASS, then REFACTOR while keeping tests green
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Unit Tests
|
|
62
|
+
|
|
63
|
+
### Module-Level Test Organization
|
|
64
|
+
|
|
65
|
+
```rust
|
|
66
|
+
// src/user.rs
|
|
67
|
+
pub struct User {
|
|
68
|
+
pub name: String,
|
|
69
|
+
pub email: String,
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
impl User {
|
|
73
|
+
pub fn new(name: impl Into<String>, email: impl Into<String>) -> Result<Self, String> {
|
|
74
|
+
let email = email.into();
|
|
75
|
+
if !email.contains('@') {
|
|
76
|
+
return Err(format!("invalid email: {email}"));
|
|
77
|
+
}
|
|
78
|
+
Ok(Self { name: name.into(), email })
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
pub fn display_name(&self) -> &str {
|
|
82
|
+
&self.name
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#[cfg(test)]
|
|
87
|
+
mod tests {
|
|
88
|
+
use super::*;
|
|
89
|
+
|
|
90
|
+
#[test]
|
|
91
|
+
fn creates_user_with_valid_email() {
|
|
92
|
+
let user = User::new("Alice", "alice@example.com").unwrap();
|
|
93
|
+
assert_eq!(user.display_name(), "Alice");
|
|
94
|
+
assert_eq!(user.email, "alice@example.com");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#[test]
|
|
98
|
+
fn rejects_invalid_email() {
|
|
99
|
+
let result = User::new("Bob", "not-an-email");
|
|
100
|
+
assert!(result.is_err());
|
|
101
|
+
assert!(result.unwrap_err().contains("invalid email"));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Assertion Macros
|
|
107
|
+
|
|
108
|
+
```rust
|
|
109
|
+
assert_eq!(2 + 2, 4); // Equality
|
|
110
|
+
assert_ne!(2 + 2, 5); // Inequality
|
|
111
|
+
assert!(vec![1, 2, 3].contains(&2)); // Boolean
|
|
112
|
+
assert_eq!(value, 42, "expected 42 but got {value}"); // Custom message
|
|
113
|
+
assert!((0.1_f64 + 0.2 - 0.3).abs() < f64::EPSILON); // Float comparison
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Error and Panic Testing
|
|
117
|
+
|
|
118
|
+
### Testing `Result` Returns
|
|
119
|
+
|
|
120
|
+
```rust
|
|
121
|
+
#[test]
|
|
122
|
+
fn parse_returns_error_for_invalid_input() {
|
|
123
|
+
let result = parse_config("}{invalid");
|
|
124
|
+
assert!(result.is_err());
|
|
125
|
+
|
|
126
|
+
// Assert specific error variant
|
|
127
|
+
let err = result.unwrap_err();
|
|
128
|
+
assert!(matches!(err, ConfigError::ParseError(_)));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
#[test]
|
|
132
|
+
fn parse_succeeds_for_valid_input() -> Result<(), Box<dyn std::error::Error>> {
|
|
133
|
+
let config = parse_config(r#"{"port": 8080}"#)?;
|
|
134
|
+
assert_eq!(config.port, 8080);
|
|
135
|
+
Ok(()) // Test fails if any ? returns Err
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Testing Panics
|
|
140
|
+
|
|
141
|
+
```rust
|
|
142
|
+
#[test]
|
|
143
|
+
#[should_panic]
|
|
144
|
+
fn panics_on_empty_input() {
|
|
145
|
+
process(&[]);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
#[test]
|
|
149
|
+
#[should_panic(expected = "index out of bounds")]
|
|
150
|
+
fn panics_with_specific_message() {
|
|
151
|
+
let v: Vec<i32> = vec![];
|
|
152
|
+
let _ = v[0];
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Integration Tests
|
|
157
|
+
|
|
158
|
+
### File Structure
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
my_crate/
|
|
162
|
+
├── src/
|
|
163
|
+
│ └── lib.rs
|
|
164
|
+
├── tests/ # Integration tests
|
|
165
|
+
│ ├── api_test.rs # Each file is a separate test binary
|
|
166
|
+
│ ├── db_test.rs
|
|
167
|
+
│ └── common/ # Shared test utilities
|
|
168
|
+
│ └── mod.rs
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Writing Integration Tests
|
|
172
|
+
|
|
173
|
+
```rust
|
|
174
|
+
// tests/api_test.rs
|
|
175
|
+
use my_crate::{App, Config};
|
|
176
|
+
|
|
177
|
+
#[test]
|
|
178
|
+
fn full_request_lifecycle() {
|
|
179
|
+
let config = Config::test_default();
|
|
180
|
+
let app = App::new(config);
|
|
181
|
+
|
|
182
|
+
let response = app.handle_request("/health");
|
|
183
|
+
assert_eq!(response.status, 200);
|
|
184
|
+
assert_eq!(response.body, "OK");
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Async Tests
|
|
189
|
+
|
|
190
|
+
### With Tokio
|
|
191
|
+
|
|
192
|
+
```rust
|
|
193
|
+
#[tokio::test]
|
|
194
|
+
async fn fetches_data_successfully() {
|
|
195
|
+
let client = TestClient::new().await;
|
|
196
|
+
let result = client.get("/data").await;
|
|
197
|
+
assert!(result.is_ok());
|
|
198
|
+
assert_eq!(result.unwrap().items.len(), 3);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
#[tokio::test]
|
|
202
|
+
async fn handles_timeout() {
|
|
203
|
+
use std::time::Duration;
|
|
204
|
+
let result = tokio::time::timeout(
|
|
205
|
+
Duration::from_millis(100),
|
|
206
|
+
slow_operation(),
|
|
207
|
+
).await;
|
|
208
|
+
|
|
209
|
+
assert!(result.is_err(), "should have timed out");
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Test Organization Patterns
|
|
214
|
+
|
|
215
|
+
### Parameterized Tests with `rstest`
|
|
216
|
+
|
|
217
|
+
```rust
|
|
218
|
+
use rstest::{rstest, fixture};
|
|
219
|
+
|
|
220
|
+
#[rstest]
|
|
221
|
+
#[case("hello", 5)]
|
|
222
|
+
#[case("", 0)]
|
|
223
|
+
#[case("rust", 4)]
|
|
224
|
+
fn test_string_length(#[case] input: &str, #[case] expected: usize) {
|
|
225
|
+
assert_eq!(input.len(), expected);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Fixtures
|
|
229
|
+
#[fixture]
|
|
230
|
+
fn test_db() -> TestDb {
|
|
231
|
+
TestDb::new_in_memory()
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
#[rstest]
|
|
235
|
+
fn test_insert(test_db: TestDb) {
|
|
236
|
+
test_db.insert("key", "value");
|
|
237
|
+
assert_eq!(test_db.get("key"), Some("value".into()));
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Test Helpers
|
|
242
|
+
|
|
243
|
+
```rust
|
|
244
|
+
#[cfg(test)]
|
|
245
|
+
mod tests {
|
|
246
|
+
use super::*;
|
|
247
|
+
|
|
248
|
+
/// Creates a test user with sensible defaults.
|
|
249
|
+
fn make_user(name: &str) -> User {
|
|
250
|
+
User::new(name, &format!("{name}@test.com")).unwrap()
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
#[test]
|
|
254
|
+
fn user_display() {
|
|
255
|
+
let user = make_user("alice");
|
|
256
|
+
assert_eq!(user.display_name(), "alice");
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Property-Based Testing with `proptest`
|
|
262
|
+
|
|
263
|
+
### Basic Property Tests
|
|
264
|
+
|
|
265
|
+
```rust
|
|
266
|
+
use proptest::prelude::*;
|
|
267
|
+
|
|
268
|
+
proptest! {
|
|
269
|
+
#[test]
|
|
270
|
+
fn encode_decode_roundtrip(input in ".*") {
|
|
271
|
+
let encoded = encode(&input);
|
|
272
|
+
let decoded = decode(&encoded).unwrap();
|
|
273
|
+
assert_eq!(input, decoded);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
#[test]
|
|
277
|
+
fn sort_preserves_length(mut vec in prop::collection::vec(any::<i32>(), 0..100)) {
|
|
278
|
+
let original_len = vec.len();
|
|
279
|
+
vec.sort();
|
|
280
|
+
assert_eq!(vec.len(), original_len);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
#[test]
|
|
284
|
+
fn sort_produces_ordered_output(mut vec in prop::collection::vec(any::<i32>(), 0..100)) {
|
|
285
|
+
vec.sort();
|
|
286
|
+
for window in vec.windows(2) {
|
|
287
|
+
assert!(window[0] <= window[1]);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Custom Strategies
|
|
294
|
+
|
|
295
|
+
```rust
|
|
296
|
+
use proptest::prelude::*;
|
|
297
|
+
|
|
298
|
+
fn valid_email() -> impl Strategy<Value = String> {
|
|
299
|
+
("[a-z]{1,10}", "[a-z]{1,5}")
|
|
300
|
+
.prop_map(|(user, domain)| format!("{user}@{domain}.com"))
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
proptest! {
|
|
304
|
+
#[test]
|
|
305
|
+
fn accepts_valid_emails(email in valid_email()) {
|
|
306
|
+
assert!(User::new("Test", &email).is_ok());
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Mocking with `mockall`
|
|
312
|
+
|
|
313
|
+
### Trait-Based Mocking
|
|
314
|
+
|
|
315
|
+
```rust
|
|
316
|
+
use mockall::{automock, predicate::eq};
|
|
317
|
+
|
|
318
|
+
#[automock]
|
|
319
|
+
trait UserRepository {
|
|
320
|
+
fn find_by_id(&self, id: u64) -> Option<User>;
|
|
321
|
+
fn save(&self, user: &User) -> Result<(), StorageError>;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
#[test]
|
|
325
|
+
fn service_returns_user_when_found() {
|
|
326
|
+
let mut mock = MockUserRepository::new();
|
|
327
|
+
mock.expect_find_by_id()
|
|
328
|
+
.with(eq(42))
|
|
329
|
+
.times(1)
|
|
330
|
+
.returning(|_| Some(User { id: 42, name: "Alice".into() }));
|
|
331
|
+
|
|
332
|
+
let service = UserService::new(Box::new(mock));
|
|
333
|
+
let user = service.get_user(42).unwrap();
|
|
334
|
+
assert_eq!(user.name, "Alice");
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
#[test]
|
|
338
|
+
fn service_returns_none_when_not_found() {
|
|
339
|
+
let mut mock = MockUserRepository::new();
|
|
340
|
+
mock.expect_find_by_id()
|
|
341
|
+
.returning(|_| None);
|
|
342
|
+
|
|
343
|
+
let service = UserService::new(Box::new(mock));
|
|
344
|
+
assert!(service.get_user(99).is_none());
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## Doc Tests
|
|
349
|
+
|
|
350
|
+
### Executable Documentation
|
|
351
|
+
|
|
352
|
+
```rust
|
|
353
|
+
/// Adds two numbers together.
|
|
354
|
+
///
|
|
355
|
+
/// # Examples
|
|
356
|
+
///
|
|
357
|
+
/// ```
|
|
358
|
+
/// use my_crate::add;
|
|
359
|
+
///
|
|
360
|
+
/// assert_eq!(add(2, 3), 5);
|
|
361
|
+
/// assert_eq!(add(-1, 1), 0);
|
|
362
|
+
/// ```
|
|
363
|
+
pub fn add(a: i32, b: i32) -> i32 {
|
|
364
|
+
a + b
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/// Parses a config string.
|
|
368
|
+
///
|
|
369
|
+
/// # Errors
|
|
370
|
+
///
|
|
371
|
+
/// Returns `Err` if the input is not valid TOML.
|
|
372
|
+
///
|
|
373
|
+
/// ```no_run
|
|
374
|
+
/// use my_crate::parse_config;
|
|
375
|
+
///
|
|
376
|
+
/// let config = parse_config(r#"port = 8080"#).unwrap();
|
|
377
|
+
/// assert_eq!(config.port, 8080);
|
|
378
|
+
/// ```
|
|
379
|
+
///
|
|
380
|
+
/// ```no_run
|
|
381
|
+
/// use my_crate::parse_config;
|
|
382
|
+
///
|
|
383
|
+
/// assert!(parse_config("}{invalid").is_err());
|
|
384
|
+
/// ```
|
|
385
|
+
pub fn parse_config(input: &str) -> Result<Config, ParseError> {
|
|
386
|
+
todo!()
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Benchmarking with Criterion
|
|
391
|
+
|
|
392
|
+
```toml
|
|
393
|
+
# Cargo.toml
|
|
394
|
+
[dev-dependencies]
|
|
395
|
+
criterion = { version = "0.5", features = ["html_reports"] }
|
|
396
|
+
|
|
397
|
+
[[bench]]
|
|
398
|
+
name = "benchmark"
|
|
399
|
+
harness = false
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
```rust
|
|
403
|
+
// benches/benchmark.rs
|
|
404
|
+
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
|
405
|
+
|
|
406
|
+
fn fibonacci(n: u64) -> u64 {
|
|
407
|
+
match n {
|
|
408
|
+
0 | 1 => n,
|
|
409
|
+
_ => fibonacci(n - 1) + fibonacci(n - 2),
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
fn bench_fibonacci(c: &mut Criterion) {
|
|
414
|
+
c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
criterion_group!(benches, bench_fibonacci);
|
|
418
|
+
criterion_main!(benches);
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
## Test Coverage
|
|
422
|
+
|
|
423
|
+
### Running Coverage
|
|
424
|
+
|
|
425
|
+
```bash
|
|
426
|
+
# Install: cargo install cargo-llvm-cov (or use taiki-e/install-action in CI)
|
|
427
|
+
cargo llvm-cov # Summary
|
|
428
|
+
cargo llvm-cov --html # HTML report
|
|
429
|
+
cargo llvm-cov --lcov > lcov.info # LCOV format for CI
|
|
430
|
+
cargo llvm-cov --fail-under-lines 80 # Fail if below threshold
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Coverage Targets
|
|
434
|
+
|
|
435
|
+
| Code Type | Target |
|
|
436
|
+
|-----------|--------|
|
|
437
|
+
| Critical business logic | 100% |
|
|
438
|
+
| Public API | 90%+ |
|
|
439
|
+
| General code | 80%+ |
|
|
440
|
+
| Generated / FFI bindings | Exclude |
|
|
441
|
+
|
|
442
|
+
## Testing Commands
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
cargo test # Run all tests
|
|
446
|
+
cargo test -- --nocapture # Show println output
|
|
447
|
+
cargo test test_name # Run tests matching pattern
|
|
448
|
+
cargo test --lib # Unit tests only
|
|
449
|
+
cargo test --test api_test # Integration tests only
|
|
450
|
+
cargo test --doc # Doc tests only
|
|
451
|
+
cargo test --no-fail-fast # Don't stop on first failure
|
|
452
|
+
cargo test -- --ignored # Run ignored tests
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
## Best Practices
|
|
456
|
+
|
|
457
|
+
**DO:**
|
|
458
|
+
- Write tests FIRST (TDD)
|
|
459
|
+
- Use `#[cfg(test)]` modules for unit tests
|
|
460
|
+
- Test behavior, not implementation
|
|
461
|
+
- Use descriptive test names that explain the scenario
|
|
462
|
+
- Prefer `assert_eq!` over `assert!` for better error messages
|
|
463
|
+
- Use `?` in tests that return `Result` for cleaner error output
|
|
464
|
+
- Keep tests independent — no shared mutable state
|
|
465
|
+
|
|
466
|
+
**DON'T:**
|
|
467
|
+
- Use `#[should_panic]` when you can test `Result::is_err()` instead
|
|
468
|
+
- Mock everything — prefer integration tests when feasible
|
|
469
|
+
- Ignore flaky tests — fix or quarantine them
|
|
470
|
+
- Use `sleep()` in tests — use channels, barriers, or `tokio::time::pause()`
|
|
471
|
+
- Skip error path testing
|
|
472
|
+
|
|
473
|
+
## CI Integration
|
|
474
|
+
|
|
475
|
+
```yaml
|
|
476
|
+
# GitHub Actions
|
|
477
|
+
test:
|
|
478
|
+
runs-on: ubuntu-latest
|
|
479
|
+
steps:
|
|
480
|
+
- uses: actions/checkout@v4
|
|
481
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
482
|
+
with:
|
|
483
|
+
components: clippy, rustfmt
|
|
484
|
+
|
|
485
|
+
- name: Check formatting
|
|
486
|
+
run: cargo fmt --check
|
|
487
|
+
|
|
488
|
+
- name: Clippy
|
|
489
|
+
run: cargo clippy -- -D warnings
|
|
490
|
+
|
|
491
|
+
- name: Run tests
|
|
492
|
+
run: cargo test
|
|
493
|
+
|
|
494
|
+
- uses: taiki-e/install-action@cargo-llvm-cov
|
|
495
|
+
|
|
496
|
+
- name: Coverage
|
|
497
|
+
run: cargo llvm-cov --fail-under-lines 80
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
**Remember**: Tests are documentation. They show how your code is meant to be used. Write them clearly and keep them up to date.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: safety-guard
|
|
3
|
+
description: Use this skill to prevent destructive operations when working on production systems or running agents autonomously.
|
|
4
|
+
origin: ECC
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Safety Guard — Prevent Destructive Operations
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
- When working on production systems
|
|
12
|
+
- When agents are running autonomously (full-auto mode)
|
|
13
|
+
- When you want to restrict edits to a specific directory
|
|
14
|
+
- During sensitive operations (migrations, deploys, data changes)
|
|
15
|
+
|
|
16
|
+
## How It Works
|
|
17
|
+
|
|
18
|
+
Three modes of protection:
|
|
19
|
+
|
|
20
|
+
### Mode 1: Careful Mode
|
|
21
|
+
|
|
22
|
+
Intercepts destructive commands before execution and warns:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Watched patterns:
|
|
26
|
+
- rm -rf (especially /, ~, or project root)
|
|
27
|
+
- git push --force
|
|
28
|
+
- git reset --hard
|
|
29
|
+
- git checkout . (discard all changes)
|
|
30
|
+
- DROP TABLE / DROP DATABASE
|
|
31
|
+
- docker system prune
|
|
32
|
+
- kubectl delete
|
|
33
|
+
- chmod 777
|
|
34
|
+
- sudo rm
|
|
35
|
+
- npm publish (accidental publishes)
|
|
36
|
+
- Any command with --no-verify
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
When detected: shows what the command does, asks for confirmation, suggests safer alternative.
|
|
40
|
+
|
|
41
|
+
### Mode 2: Freeze Mode
|
|
42
|
+
|
|
43
|
+
Locks file edits to a specific directory tree:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
/safety-guard freeze src/components/
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Any Write/Edit outside `src/components/` is blocked with an explanation. Useful when you want an agent to focus on one area without touching unrelated code.
|
|
50
|
+
|
|
51
|
+
### Mode 3: Guard Mode (Careful + Freeze combined)
|
|
52
|
+
|
|
53
|
+
Both protections active. Maximum safety for autonomous agents.
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
/safety-guard guard --dir src/api/ --allow-read-all
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Agents can read anything but only write to `src/api/`. Destructive commands are blocked everywhere.
|
|
60
|
+
|
|
61
|
+
### Unlock
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
/safety-guard off
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Implementation
|
|
68
|
+
|
|
69
|
+
Uses PreToolUse hooks to intercept Bash, Write, Edit, and MultiEdit tool calls. Checks the command/path against the active rules before allowing execution.
|
|
70
|
+
|
|
71
|
+
## Integration
|
|
72
|
+
|
|
73
|
+
- Enable by default for `codex -a never` sessions
|
|
74
|
+
- Pair with observability risk scoring in ECC 2.0
|
|
75
|
+
- Logs all blocked actions to `~/.claude/safety-guard.log`
|