@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,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.dart"
|
|
4
|
+
- "**/pubspec.yaml"
|
|
5
|
+
- "**/analysis_options.yaml"
|
|
6
|
+
---
|
|
7
|
+
# Dart/Flutter Coding Style
|
|
8
|
+
|
|
9
|
+
> This file extends [common/coding-style.md](../common/coding-style.md) with Dart and Flutter-specific content.
|
|
10
|
+
|
|
11
|
+
## Formatting
|
|
12
|
+
|
|
13
|
+
- **dart format** for all `.dart` files — enforced in CI (`dart format --set-exit-if-changed .`)
|
|
14
|
+
- Line length: 80 characters (dart format default)
|
|
15
|
+
- Trailing commas on multi-line argument/parameter lists to improve diffs and formatting
|
|
16
|
+
|
|
17
|
+
## Immutability
|
|
18
|
+
|
|
19
|
+
- Prefer `final` for local variables and `const` for compile-time constants
|
|
20
|
+
- Use `const` constructors wherever all fields are `final`
|
|
21
|
+
- Return unmodifiable collections from public APIs (`List.unmodifiable`, `Map.unmodifiable`)
|
|
22
|
+
- Use `copyWith()` for state mutations in immutable state classes
|
|
23
|
+
|
|
24
|
+
```dart
|
|
25
|
+
// BAD
|
|
26
|
+
var count = 0;
|
|
27
|
+
List<String> items = ['a', 'b'];
|
|
28
|
+
|
|
29
|
+
// GOOD
|
|
30
|
+
final count = 0;
|
|
31
|
+
const items = ['a', 'b'];
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Naming
|
|
35
|
+
|
|
36
|
+
Follow Dart conventions:
|
|
37
|
+
- `camelCase` for variables, parameters, and named constructors
|
|
38
|
+
- `PascalCase` for classes, enums, typedefs, and extensions
|
|
39
|
+
- `snake_case` for file names and library names
|
|
40
|
+
- `SCREAMING_SNAKE_CASE` for constants declared with `const` at top level
|
|
41
|
+
- Prefix private members with `_`
|
|
42
|
+
- Extension names describe the type they extend: `StringExtensions`, not `MyHelpers`
|
|
43
|
+
|
|
44
|
+
## Null Safety
|
|
45
|
+
|
|
46
|
+
- Avoid `!` (bang operator) — prefer `?.`, `??`, `if (x != null)`, or Dart 3 pattern matching; reserve `!` only where a null value is a programming error and crashing is the right behaviour
|
|
47
|
+
- Avoid `late` unless initialization is guaranteed before first use (prefer nullable or constructor init)
|
|
48
|
+
- Use `required` for constructor parameters that must always be provided
|
|
49
|
+
|
|
50
|
+
```dart
|
|
51
|
+
// BAD — crashes at runtime if user is null
|
|
52
|
+
final name = user!.name;
|
|
53
|
+
|
|
54
|
+
// GOOD — null-aware operators
|
|
55
|
+
final name = user?.name ?? 'Unknown';
|
|
56
|
+
|
|
57
|
+
// GOOD — Dart 3 pattern matching (exhaustive, compiler-checked)
|
|
58
|
+
final name = switch (user) {
|
|
59
|
+
User(:final name) => name,
|
|
60
|
+
null => 'Unknown',
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// GOOD — early-return null guard
|
|
64
|
+
String getUserName(User? user) {
|
|
65
|
+
if (user == null) return 'Unknown';
|
|
66
|
+
return user.name; // promoted to non-null after the guard
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Sealed Types and Pattern Matching (Dart 3+)
|
|
71
|
+
|
|
72
|
+
Use sealed classes to model closed state hierarchies:
|
|
73
|
+
|
|
74
|
+
```dart
|
|
75
|
+
sealed class AsyncState<T> {
|
|
76
|
+
const AsyncState();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
final class Loading<T> extends AsyncState<T> {
|
|
80
|
+
const Loading();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
final class Success<T> extends AsyncState<T> {
|
|
84
|
+
const Success(this.data);
|
|
85
|
+
final T data;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
final class Failure<T> extends AsyncState<T> {
|
|
89
|
+
const Failure(this.error);
|
|
90
|
+
final Object error;
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Always use exhaustive `switch` with sealed types — no default/wildcard:
|
|
95
|
+
|
|
96
|
+
```dart
|
|
97
|
+
// BAD
|
|
98
|
+
if (state is Loading) { ... }
|
|
99
|
+
|
|
100
|
+
// GOOD
|
|
101
|
+
return switch (state) {
|
|
102
|
+
Loading() => const CircularProgressIndicator(),
|
|
103
|
+
Success(:final data) => DataWidget(data),
|
|
104
|
+
Failure(:final error) => ErrorWidget(error.toString()),
|
|
105
|
+
};
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Error Handling
|
|
109
|
+
|
|
110
|
+
- Specify exception types in `on` clauses — never use bare `catch (e)`
|
|
111
|
+
- Never catch `Error` subtypes — they indicate programming bugs
|
|
112
|
+
- Use `Result`-style types or sealed classes for recoverable errors
|
|
113
|
+
- Avoid using exceptions for control flow
|
|
114
|
+
|
|
115
|
+
```dart
|
|
116
|
+
// BAD
|
|
117
|
+
try {
|
|
118
|
+
await fetchUser();
|
|
119
|
+
} catch (e) {
|
|
120
|
+
log(e.toString());
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// GOOD
|
|
124
|
+
try {
|
|
125
|
+
await fetchUser();
|
|
126
|
+
} on NetworkException catch (e) {
|
|
127
|
+
log('Network error: ${e.message}');
|
|
128
|
+
} on NotFoundException {
|
|
129
|
+
handleNotFound();
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Async / Futures
|
|
134
|
+
|
|
135
|
+
- Always `await` Futures or explicitly call `unawaited()` to signal intentional fire-and-forget
|
|
136
|
+
- Never mark a function `async` if it never `await`s anything
|
|
137
|
+
- Use `Future.wait` / `Future.any` for concurrent operations
|
|
138
|
+
- Check `context.mounted` before using `BuildContext` after any `await` (Flutter 3.7+)
|
|
139
|
+
|
|
140
|
+
```dart
|
|
141
|
+
// BAD — ignoring Future
|
|
142
|
+
fetchData(); // fire-and-forget without marking intent
|
|
143
|
+
|
|
144
|
+
// GOOD
|
|
145
|
+
unawaited(fetchData()); // explicit fire-and-forget
|
|
146
|
+
await fetchData(); // or properly awaited
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Imports
|
|
150
|
+
|
|
151
|
+
- Use `package:` imports throughout — never relative imports (`../`) for cross-feature or cross-layer code
|
|
152
|
+
- Order: `dart:` → external `package:` → internal `package:` (same package)
|
|
153
|
+
- No unused imports — `dart analyze` enforces this with `unused_import`
|
|
154
|
+
|
|
155
|
+
## Code Generation
|
|
156
|
+
|
|
157
|
+
- Generated files (`.g.dart`, `.freezed.dart`, `.gr.dart`) must be committed or gitignored consistently — pick one strategy per project
|
|
158
|
+
- Never manually edit generated files
|
|
159
|
+
- Keep generator annotations (`@JsonSerializable`, `@freezed`, `@riverpod`, etc.) on the canonical source file only
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.dart"
|
|
4
|
+
- "**/pubspec.yaml"
|
|
5
|
+
- "**/analysis_options.yaml"
|
|
6
|
+
---
|
|
7
|
+
# Dart/Flutter Hooks
|
|
8
|
+
|
|
9
|
+
> This file extends [common/hooks.md](../common/hooks.md) with Dart and Flutter-specific content.
|
|
10
|
+
|
|
11
|
+
## PostToolUse Hooks
|
|
12
|
+
|
|
13
|
+
Configure in `~/.claude/settings.json`:
|
|
14
|
+
|
|
15
|
+
- **dart format**: Auto-format `.dart` files after edit
|
|
16
|
+
- **dart analyze**: Run static analysis after editing Dart files and surface warnings
|
|
17
|
+
- **flutter test**: Optionally run affected tests after significant changes
|
|
18
|
+
|
|
19
|
+
## Recommended Hook Configuration
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"hooks": {
|
|
24
|
+
"PostToolUse": [
|
|
25
|
+
{
|
|
26
|
+
"matcher": { "tool_name": "Edit", "file_paths": ["**/*.dart"] },
|
|
27
|
+
"hooks": [
|
|
28
|
+
{ "type": "command", "command": "dart format $CLAUDE_FILE_PATHS" }
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Pre-commit Checks
|
|
37
|
+
|
|
38
|
+
Run before committing Dart/Flutter changes:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
dart format --set-exit-if-changed .
|
|
42
|
+
dart analyze --fatal-infos
|
|
43
|
+
flutter test
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Useful One-liners
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Format all Dart files
|
|
50
|
+
dart format .
|
|
51
|
+
|
|
52
|
+
# Analyze and report issues
|
|
53
|
+
dart analyze
|
|
54
|
+
|
|
55
|
+
# Run all tests with coverage
|
|
56
|
+
flutter test --coverage
|
|
57
|
+
|
|
58
|
+
# Regenerate code-gen files
|
|
59
|
+
dart run build_runner build --delete-conflicting-outputs
|
|
60
|
+
|
|
61
|
+
# Check for outdated packages
|
|
62
|
+
flutter pub outdated
|
|
63
|
+
|
|
64
|
+
# Upgrade packages within constraints
|
|
65
|
+
flutter pub upgrade
|
|
66
|
+
```
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.dart"
|
|
4
|
+
- "**/pubspec.yaml"
|
|
5
|
+
---
|
|
6
|
+
# Dart/Flutter Patterns
|
|
7
|
+
|
|
8
|
+
> This file extends [common/patterns.md](../common/patterns.md) with Dart, Flutter, and common ecosystem-specific content.
|
|
9
|
+
|
|
10
|
+
## Repository Pattern
|
|
11
|
+
|
|
12
|
+
```dart
|
|
13
|
+
abstract interface class UserRepository {
|
|
14
|
+
Future<User?> getById(String id);
|
|
15
|
+
Future<List<User>> getAll();
|
|
16
|
+
Stream<List<User>> watchAll();
|
|
17
|
+
Future<void> save(User user);
|
|
18
|
+
Future<void> delete(String id);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class UserRepositoryImpl implements UserRepository {
|
|
22
|
+
const UserRepositoryImpl(this._remote, this._local);
|
|
23
|
+
|
|
24
|
+
final UserRemoteDataSource _remote;
|
|
25
|
+
final UserLocalDataSource _local;
|
|
26
|
+
|
|
27
|
+
@override
|
|
28
|
+
Future<User?> getById(String id) async {
|
|
29
|
+
final local = await _local.getById(id);
|
|
30
|
+
if (local != null) return local;
|
|
31
|
+
final remote = await _remote.getById(id);
|
|
32
|
+
if (remote != null) await _local.save(remote);
|
|
33
|
+
return remote;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@override
|
|
37
|
+
Future<List<User>> getAll() async {
|
|
38
|
+
final remote = await _remote.getAll();
|
|
39
|
+
for (final user in remote) {
|
|
40
|
+
await _local.save(user);
|
|
41
|
+
}
|
|
42
|
+
return remote;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@override
|
|
46
|
+
Stream<List<User>> watchAll() => _local.watchAll();
|
|
47
|
+
|
|
48
|
+
@override
|
|
49
|
+
Future<void> save(User user) => _local.save(user);
|
|
50
|
+
|
|
51
|
+
@override
|
|
52
|
+
Future<void> delete(String id) async {
|
|
53
|
+
await _remote.delete(id);
|
|
54
|
+
await _local.delete(id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## State Management: BLoC/Cubit
|
|
60
|
+
|
|
61
|
+
```dart
|
|
62
|
+
// Cubit — simple state transitions
|
|
63
|
+
class CounterCubit extends Cubit<int> {
|
|
64
|
+
CounterCubit() : super(0);
|
|
65
|
+
|
|
66
|
+
void increment() => emit(state + 1);
|
|
67
|
+
void decrement() => emit(state - 1);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// BLoC — event-driven
|
|
71
|
+
@immutable
|
|
72
|
+
sealed class CartEvent {}
|
|
73
|
+
class CartItemAdded extends CartEvent { CartItemAdded(this.item); final Item item; }
|
|
74
|
+
class CartItemRemoved extends CartEvent { CartItemRemoved(this.id); final String id; }
|
|
75
|
+
class CartCleared extends CartEvent {}
|
|
76
|
+
|
|
77
|
+
@immutable
|
|
78
|
+
class CartState {
|
|
79
|
+
const CartState({this.items = const []});
|
|
80
|
+
final List<Item> items;
|
|
81
|
+
CartState copyWith({List<Item>? items}) => CartState(items: items ?? this.items);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
class CartBloc extends Bloc<CartEvent, CartState> {
|
|
85
|
+
CartBloc() : super(const CartState()) {
|
|
86
|
+
on<CartItemAdded>((event, emit) =>
|
|
87
|
+
emit(state.copyWith(items: [...state.items, event.item])));
|
|
88
|
+
on<CartItemRemoved>((event, emit) =>
|
|
89
|
+
emit(state.copyWith(items: state.items.where((i) => i.id != event.id).toList())));
|
|
90
|
+
on<CartCleared>((_, emit) => emit(const CartState()));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## State Management: Riverpod
|
|
96
|
+
|
|
97
|
+
```dart
|
|
98
|
+
// Simple provider
|
|
99
|
+
@riverpod
|
|
100
|
+
Future<List<User>> users(Ref ref) async {
|
|
101
|
+
final repo = ref.watch(userRepositoryProvider);
|
|
102
|
+
return repo.getAll();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Notifier for mutable state
|
|
106
|
+
@riverpod
|
|
107
|
+
class CartNotifier extends _$CartNotifier {
|
|
108
|
+
@override
|
|
109
|
+
List<Item> build() => [];
|
|
110
|
+
|
|
111
|
+
void add(Item item) => state = [...state, item];
|
|
112
|
+
void remove(String id) => state = state.where((i) => i.id != id).toList();
|
|
113
|
+
void clear() => state = [];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ConsumerWidget
|
|
117
|
+
class CartPage extends ConsumerWidget {
|
|
118
|
+
const CartPage({super.key});
|
|
119
|
+
|
|
120
|
+
@override
|
|
121
|
+
Widget build(BuildContext context, WidgetRef ref) {
|
|
122
|
+
final items = ref.watch(cartNotifierProvider);
|
|
123
|
+
return ListView(
|
|
124
|
+
children: items.map((item) => CartItemTile(item: item)).toList(),
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Dependency Injection
|
|
131
|
+
|
|
132
|
+
Constructor injection is preferred. Use `get_it` or Riverpod providers at composition root:
|
|
133
|
+
|
|
134
|
+
```dart
|
|
135
|
+
// get_it registration (in a setup file)
|
|
136
|
+
void setupDependencies() {
|
|
137
|
+
final di = GetIt.instance;
|
|
138
|
+
di.registerSingleton<ApiClient>(ApiClient(baseUrl: Env.apiUrl));
|
|
139
|
+
di.registerSingleton<UserRepository>(
|
|
140
|
+
UserRepositoryImpl(di<ApiClient>(), di<LocalDatabase>()),
|
|
141
|
+
);
|
|
142
|
+
di.registerFactory(() => UserListViewModel(di<UserRepository>()));
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## ViewModel Pattern (without BLoC/Riverpod)
|
|
147
|
+
|
|
148
|
+
```dart
|
|
149
|
+
class UserListViewModel extends ChangeNotifier {
|
|
150
|
+
UserListViewModel(this._repository);
|
|
151
|
+
|
|
152
|
+
final UserRepository _repository;
|
|
153
|
+
|
|
154
|
+
AsyncState<List<User>> _state = const Loading();
|
|
155
|
+
AsyncState<List<User>> get state => _state;
|
|
156
|
+
|
|
157
|
+
Future<void> load() async {
|
|
158
|
+
_state = const Loading();
|
|
159
|
+
notifyListeners();
|
|
160
|
+
try {
|
|
161
|
+
final users = await _repository.getAll();
|
|
162
|
+
_state = Success(users);
|
|
163
|
+
} on Exception catch (e) {
|
|
164
|
+
_state = Failure(e);
|
|
165
|
+
}
|
|
166
|
+
notifyListeners();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## UseCase Pattern
|
|
172
|
+
|
|
173
|
+
```dart
|
|
174
|
+
class GetUserUseCase {
|
|
175
|
+
const GetUserUseCase(this._repository);
|
|
176
|
+
final UserRepository _repository;
|
|
177
|
+
|
|
178
|
+
Future<User?> call(String id) => _repository.getById(id);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
class CreateUserUseCase {
|
|
182
|
+
const CreateUserUseCase(this._repository, this._idGenerator);
|
|
183
|
+
final UserRepository _repository;
|
|
184
|
+
final IdGenerator _idGenerator; // injected — domain layer must not depend on uuid package directly
|
|
185
|
+
|
|
186
|
+
Future<void> call(CreateUserInput input) async {
|
|
187
|
+
// Validate, apply business rules, then persist
|
|
188
|
+
final user = User(id: _idGenerator.generate(), name: input.name, email: input.email);
|
|
189
|
+
await _repository.save(user);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Immutable State with freezed
|
|
195
|
+
|
|
196
|
+
```dart
|
|
197
|
+
@freezed
|
|
198
|
+
class UserState with _$UserState {
|
|
199
|
+
const factory UserState({
|
|
200
|
+
@Default([]) List<User> users,
|
|
201
|
+
@Default(false) bool isLoading,
|
|
202
|
+
String? errorMessage,
|
|
203
|
+
}) = _UserState;
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Clean Architecture Layer Boundaries
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
lib/
|
|
211
|
+
├── domain/ # Pure Dart — no Flutter, no external packages
|
|
212
|
+
│ ├── entities/
|
|
213
|
+
│ ├── repositories/ # Abstract interfaces
|
|
214
|
+
│ └── usecases/
|
|
215
|
+
├── data/ # Implements domain interfaces
|
|
216
|
+
│ ├── datasources/
|
|
217
|
+
│ ├── models/ # DTOs with fromJson/toJson
|
|
218
|
+
│ └── repositories/
|
|
219
|
+
└── presentation/ # Flutter widgets + state management
|
|
220
|
+
├── pages/
|
|
221
|
+
├── widgets/
|
|
222
|
+
└── providers/ (or blocs/ or viewmodels/)
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- Domain must not import `package:flutter` or any data-layer package
|
|
226
|
+
- Data layer maps DTOs to domain entities at repository boundaries
|
|
227
|
+
- Presentation calls use cases, not repositories directly
|
|
228
|
+
|
|
229
|
+
## Navigation (GoRouter)
|
|
230
|
+
|
|
231
|
+
```dart
|
|
232
|
+
final router = GoRouter(
|
|
233
|
+
routes: [
|
|
234
|
+
GoRoute(
|
|
235
|
+
path: '/',
|
|
236
|
+
builder: (context, state) => const HomePage(),
|
|
237
|
+
),
|
|
238
|
+
GoRoute(
|
|
239
|
+
path: '/users/:id',
|
|
240
|
+
builder: (context, state) {
|
|
241
|
+
final id = state.pathParameters['id']!;
|
|
242
|
+
return UserDetailPage(userId: id);
|
|
243
|
+
},
|
|
244
|
+
),
|
|
245
|
+
],
|
|
246
|
+
// refreshListenable re-evaluates redirect whenever auth state changes
|
|
247
|
+
refreshListenable: GoRouterRefreshStream(authCubit.stream),
|
|
248
|
+
redirect: (context, state) {
|
|
249
|
+
final isLoggedIn = context.read<AuthCubit>().state is AuthAuthenticated;
|
|
250
|
+
if (!isLoggedIn && !state.matchedLocation.startsWith('/login')) {
|
|
251
|
+
return '/login';
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
},
|
|
255
|
+
);
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## References
|
|
259
|
+
|
|
260
|
+
See skill: `flutter-dart-code-review` for the comprehensive review checklist.
|
|
261
|
+
See skill: `compose-multiplatform-patterns` for Kotlin Multiplatform/Flutter interop patterns.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.dart"
|
|
4
|
+
- "**/pubspec.yaml"
|
|
5
|
+
- "**/AndroidManifest.xml"
|
|
6
|
+
- "**/Info.plist"
|
|
7
|
+
---
|
|
8
|
+
# Dart/Flutter Security
|
|
9
|
+
|
|
10
|
+
> This file extends [common/security.md](../common/security.md) with Dart, Flutter, and mobile-specific content.
|
|
11
|
+
|
|
12
|
+
## Secrets Management
|
|
13
|
+
|
|
14
|
+
- Never hardcode API keys, tokens, or credentials in Dart source
|
|
15
|
+
- Use `--dart-define` or `--dart-define-from-file` for compile-time config (values are not truly secret — use a backend proxy for server-side secrets)
|
|
16
|
+
- Use `flutter_dotenv` or equivalent, with `.env` files listed in `.gitignore`
|
|
17
|
+
- Store runtime secrets in platform-secure storage: `flutter_secure_storage` (Keychain on iOS, EncryptedSharedPreferences on Android)
|
|
18
|
+
|
|
19
|
+
```dart
|
|
20
|
+
// BAD
|
|
21
|
+
const apiKey = 'sk-abc123...';
|
|
22
|
+
|
|
23
|
+
// GOOD — compile-time config (not secret, just configurable)
|
|
24
|
+
const apiKey = String.fromEnvironment('API_KEY');
|
|
25
|
+
|
|
26
|
+
// GOOD — runtime secret from secure storage
|
|
27
|
+
final token = await secureStorage.read(key: 'auth_token');
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Network Security
|
|
31
|
+
|
|
32
|
+
- Enforce HTTPS — no `http://` calls in production
|
|
33
|
+
- Configure Android `network_security_config.xml` to block cleartext traffic
|
|
34
|
+
- Set `NSAppTransportSecurity` in `Info.plist` to disallow arbitrary loads
|
|
35
|
+
- Set request timeouts on all HTTP clients — never leave defaults
|
|
36
|
+
- Consider certificate pinning for high-security endpoints
|
|
37
|
+
|
|
38
|
+
```dart
|
|
39
|
+
// Dio with timeout and HTTPS enforcement
|
|
40
|
+
final dio = Dio(BaseOptions(
|
|
41
|
+
baseUrl: 'https://api.example.com',
|
|
42
|
+
connectTimeout: const Duration(seconds: 10),
|
|
43
|
+
receiveTimeout: const Duration(seconds: 30),
|
|
44
|
+
));
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Input Validation
|
|
48
|
+
|
|
49
|
+
- Validate and sanitize all user input before sending to API or storage
|
|
50
|
+
- Never pass unsanitized input to SQL queries — use parameterized queries (sqflite, drift)
|
|
51
|
+
- Sanitize deep link URLs before navigation — validate scheme, host, and path parameters
|
|
52
|
+
- Use `Uri.tryParse` and validate before navigating
|
|
53
|
+
|
|
54
|
+
```dart
|
|
55
|
+
// BAD — SQL injection
|
|
56
|
+
await db.rawQuery("SELECT * FROM users WHERE email = '$userInput'");
|
|
57
|
+
|
|
58
|
+
// GOOD — parameterized
|
|
59
|
+
await db.query('users', where: 'email = ?', whereArgs: [userInput]);
|
|
60
|
+
|
|
61
|
+
// BAD — unvalidated deep link
|
|
62
|
+
final uri = Uri.parse(incomingLink);
|
|
63
|
+
context.go(uri.path); // could navigate to any route
|
|
64
|
+
|
|
65
|
+
// GOOD — validated deep link
|
|
66
|
+
final uri = Uri.tryParse(incomingLink);
|
|
67
|
+
if (uri != null && uri.host == 'myapp.com' && _allowedPaths.contains(uri.path)) {
|
|
68
|
+
context.go(uri.path);
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Data Protection
|
|
73
|
+
|
|
74
|
+
- Store tokens, PII, and credentials only in `flutter_secure_storage`
|
|
75
|
+
- Never write sensitive data to `SharedPreferences` or local files in plaintext
|
|
76
|
+
- Clear auth state on logout: tokens, cached user data, cookies
|
|
77
|
+
- Use biometric authentication (`local_auth`) for sensitive operations
|
|
78
|
+
- Avoid logging sensitive data — no `print(token)` or `debugPrint(password)`
|
|
79
|
+
|
|
80
|
+
## Android-Specific
|
|
81
|
+
|
|
82
|
+
- Declare only required permissions in `AndroidManifest.xml`
|
|
83
|
+
- Export Android components (`Activity`, `Service`, `BroadcastReceiver`) only when necessary; add `android:exported="false"` where not needed
|
|
84
|
+
- Review intent filters — exported components with implicit intent filters are accessible by any app
|
|
85
|
+
- Use `FLAG_SECURE` for screens displaying sensitive data (prevents screenshots)
|
|
86
|
+
|
|
87
|
+
```xml
|
|
88
|
+
<!-- AndroidManifest.xml — restrict exported components -->
|
|
89
|
+
<activity android:name=".MainActivity" android:exported="true">
|
|
90
|
+
<!-- Only the launcher activity needs exported=true -->
|
|
91
|
+
</activity>
|
|
92
|
+
<activity android:name=".SensitiveActivity" android:exported="false" />
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## iOS-Specific
|
|
96
|
+
|
|
97
|
+
- Declare only required usage descriptions in `Info.plist` (`NSCameraUsageDescription`, etc.)
|
|
98
|
+
- Store secrets in Keychain — `flutter_secure_storage` uses Keychain on iOS
|
|
99
|
+
- Use App Transport Security (ATS) — disallow arbitrary loads
|
|
100
|
+
- Enable data protection entitlement for sensitive files
|
|
101
|
+
|
|
102
|
+
## WebView Security
|
|
103
|
+
|
|
104
|
+
- Use `webview_flutter` v4+ (`WebViewController` / `WebViewWidget`) — the legacy `WebView` widget is removed
|
|
105
|
+
- Disable JavaScript unless explicitly required (`JavaScriptMode.disabled`)
|
|
106
|
+
- Validate URLs before loading — never load arbitrary URLs from deep links
|
|
107
|
+
- Never expose Dart callbacks to JavaScript unless absolutely needed and carefully sandboxed
|
|
108
|
+
- Use `NavigationDelegate.onNavigationRequest` to intercept and validate navigation requests
|
|
109
|
+
|
|
110
|
+
```dart
|
|
111
|
+
// webview_flutter v4+ API (WebViewController + WebViewWidget)
|
|
112
|
+
final controller = WebViewController()
|
|
113
|
+
..setJavaScriptMode(JavaScriptMode.disabled) // disabled unless required
|
|
114
|
+
..setNavigationDelegate(
|
|
115
|
+
NavigationDelegate(
|
|
116
|
+
onNavigationRequest: (request) {
|
|
117
|
+
final uri = Uri.tryParse(request.url);
|
|
118
|
+
if (uri == null || uri.host != 'trusted.example.com') {
|
|
119
|
+
return NavigationDecision.prevent;
|
|
120
|
+
}
|
|
121
|
+
return NavigationDecision.navigate;
|
|
122
|
+
},
|
|
123
|
+
),
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
// In your widget tree:
|
|
127
|
+
WebViewWidget(controller: controller)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Obfuscation and Build Security
|
|
131
|
+
|
|
132
|
+
- Enable obfuscation in release builds: `flutter build apk --obfuscate --split-debug-info=./debug-info/`
|
|
133
|
+
- Keep `--split-debug-info` output out of version control (used for crash symbolication only)
|
|
134
|
+
- Ensure ProGuard/R8 rules don't inadvertently expose serialized classes
|
|
135
|
+
- Run `flutter analyze` and address all warnings before release
|