@ccoalm/ccl-skills 0.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/LICENSE +201 -0
- package/README.md +49 -0
- package/dist/assets/marketplace/.agents/plugins/marketplace.json +12 -0
- package/dist/assets/marketplace/.claude-plugin/marketplace.json +13 -0
- package/dist/assets/marketplace/marketplace-manifest.json +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/marketplace.json +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.claude-plugin/plugin.json +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.codex-plugin/plugin.json +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/.worktree-only +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/agent-context/session-start.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/agent-context/subagent-start.md +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/AGENTS.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-delegation-owner.sh +125 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-edit-isolation.sh +102 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/guard-merge-authorization.sh +1156 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/hooks.json +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/merge-authorization-prompt.sh +142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-guard.sh +12 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/owner-dispatch-stop.sh +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/remind-post-merge-cleanup.sh +144 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-context.sh +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/session-start.sh +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/skill-extraction-gate-stop.sh +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/subagent-start.sh +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_delegation_owner.sh +329 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_edit_isolation.sh +322 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_guard_merge_authorization.sh +902 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_merge_authorization_prompt.sh +178 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_remind_post_merge_cleanup.sh +121 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_session_start.sh +170 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/AGENTS.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/ccl-skills.ts +564 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-install-skills.md +14 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-update-skills.md +44 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-verify-skills.md +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/commands/ccl-worktree-check.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/AGENTS.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/README.md +276 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.example.json +10 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/owner-dispatch.sh +1307 -0
- package/dist/assets/marketplace/plugins/ccl-skills/scripts/owner-dispatch/test.sh +941 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/SKILL.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/agents-file-coverage-gate/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +188 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/android-dev.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/flutter-dev.md +80 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/ios-dev.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/kotlin-multiplatform.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-platform-boundaries.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/source-evidence-map.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +353 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/AGENTS.md +98 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_envelope.py +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_timeout_exit.sh +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +1438 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +324 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/concern_excerpt.py +295 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/egress_schema.py +214 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/init_policy_matrix.py +642 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_packet_mcp.py +181 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +1165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +1190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_cli_review.py +946 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_opencode_review.py +474 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_probe_result.py +1899 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_review_json.py +200 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +2845 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.sh +6 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/run_claude_capture.py +71 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/runtime-surface-verification-design.md +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_classify_envelope.sh +68 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +2311 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_cli_review_wrappers.sh +1832 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_code_review_identity.sh +73 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_concern_excerpt.sh +245 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_egress_schema.sh +177 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_init_policy_matrix.sh +272 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_kimi_packet_mcp.py +195 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_concurrency.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_opencode_review_retry.sh +1005 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_opencode_review.sh +258 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_probe_result.sh +574 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_review_json.sh +349 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +434 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_order.sh +264 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +2412 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/verify_native_skill_binding.py +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +153 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/diagnosis-playbook.md +54 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/references/prevention-routing.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/SKILL.md +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/feature-risk-router/references/security-review-gate.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/SKILL.md +165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/api-security-boundaries.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +160 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/artifact-generation-architecture.md +37 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/audit-history-architecture.md +29 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/bulk-workflow-architecture.md +33 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/config-rule-routing-architecture.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/cross-cutting-concerns.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-modeling-and-migrations.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-platform-architecture.md +210 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/dependency-platform.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/developer-tooling-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/error-contract-architecture.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/event-driven-architecture.md +260 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/http-gateway-architecture.md +74 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/mq-consumer-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +275 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/notification-architecture.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/ops-checklist.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/performance-capacity-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/protobuf-contract-architecture.md +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/redis-cache-coordination.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/release-runtime-readiness.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/replay-comparison-architecture.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/runtime-observability.md +94 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/service-scaffold.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/source-evidence-map.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/workflow-state-architecture.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +159 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/artifact-generation-patterns.md +37 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/audit-history-patterns.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/bulk-import-export-patterns.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/config-rule-routing-patterns.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/data-access-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/db-schema-and-dal-patterns.md +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/dependency-client-patterns.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/developer-tooling-patterns.md +70 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/domain-feature-patterns.md +78 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/engineering-patterns.md +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/error-contract-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/feature-playbook.md +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/http-gateway-client-patterns.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/mq-consumer-patterns.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/notification-patterns.md +42 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/observability-implementation-patterns.md +101 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/performance-capacity-patterns.md +44 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/protobuf-contract-patterns.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/public-api-integration-patterns.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/quality-and-testing-patterns.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/redis-cache-lock-patterns.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/release-ops-patterns.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/reliability-patterns.md +83 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/replay-comparison-patterns.md +32 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/scaffold-and-codegen.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/source-evidence-map.md +54 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/references/state-machine-task-patterns.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/SKILL.md +80 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +117 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-approval-auto-reviewer.md +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-command-sandbox.md +441 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-context-freshness.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-credentials-auth.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-extensions-skills.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-file-edit-protocol.md +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-ide-integration.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-input-ingestion.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-instruction-composition.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-lifecycle-hooks.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-messaging.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-runtime-bootstrap.md +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-session-persistence.md +448 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-task-orchestration.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-tool-dispatch.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/agent-turn-lifecycle.md +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/inference-capacity-operations.md +162 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/llm-client-gateway.md +156 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/model-prompt-evaluation.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/references/retrieval-agent-safety.md +273 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +202 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/contracts-and-state.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/cross-stack-alignment.md +94 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/framework-choice.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/online-practice-uptake.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/platform-capabilities.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/product-page-checklist.md +40 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/qa-release.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/references/source-evidence-map.md +82 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/SKILL.md +103 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/agents/openai.yaml +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-agent-delegation/references/multi-agent-delegation-playbook.md +100 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/SKILL.md +70 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-data-acquisition.md +549 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/public-disclosure-channels.md +97 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/references/research-prompts.md +66 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/AGENTS.md +32 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/multi-perspective-research/scripts/test-public-data-acquisition-recipes.sh +379 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +244 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/alerting-and-on-call.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/framework-middleware-checklist.md +142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/infra-component-deployment.md +268 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-correlation-recipe.md +124 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/log-schema-canonical.md +208 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/metrics-conventions.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/obs-stack-architecture.md +107 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +95 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/source-register.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +303 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/canary-and-rollout-strategy.md +163 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/config-center-via-etcd.md +245 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/custom-control-plane-boundary.md +298 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-cli-concrete-recipe.md +312 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/deploy-pipeline.md +165 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/env-and-lane-matrix.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/lane-orchestration-control-plane.md +383 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/multi-region-and-cluster.md +135 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +149 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/python-package-registry-release.md +462 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/rollback-playbook.md +123 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/secret-and-config-management.md +231 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/version-authority-and-deprecation.md +21 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/SKILL.md +276 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/dual-sidecar-and-traffic-config-center.md +127 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/framework-middleware.md +143 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/grpc-authority-workaround.md +90 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/http-response-envelope-contract.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/mesh-architecture.md +127 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/multi-env-routing.md +192 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/protobuf-http-contract-signals.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/retry-timeout-circuit-breaker.md +124 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/rpc-framework-recipe.md +494 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-choice.md +113 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-migration-playbook.md +231 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/service-discovery-recipe.md +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +235 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/adr-convention.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-checklist.md +30 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-evaluation-report-template.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-execution-spec.md +108 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-sop.md +457 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/algorithm-launch-templates.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/artifact-egress-confidentiality.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/code-review-checklist.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/cross-repo-coordination.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/delivery-lifecycle.md +192 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-review-gate-mechanics.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/diagnostic-spec-match-gate.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dispatch-owner-skills.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/dormant-code-activation.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/existing-project-assessment-report.md +223 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/external-skill-augmentation.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/feature-deprecation-cascade.md +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/high-risk-resilience-gates.md +73 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-completeness-and-minimality.md +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/implementation-entry-reentry-gate.md +122 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/modular-monolith-heuristic.md +105 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/pre-final-continuation-gate.md +115 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/problem-resolution-and-learning.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-attributes.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/quality-remediation-program.md +88 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md +27 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/refactoring-discipline.md +52 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/review-reception.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/shared-gate-artifact-classification.md +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/source-evidence-map.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/status-tracker-sync.md +77 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/sync-spec-repo-contract.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/worktree-mechanics.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh +213 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +136 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/agents/openai.yaml +9 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/analytics-visualization-interactions.md +206 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +108 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/complex-creation-interactions.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +214 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +97 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +63 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +146 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +250 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +324 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-web-desktop-patterns.md +456 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/resource-management-interactions.md +113 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/scenario-community-patterns.md +133 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/trust-sensitive-ai-and-data-patterns.md +96 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +176 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +111 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +157 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/ai-service-integration-boundaries.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-contract-and-schema.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/api-security-boundaries.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/architecture-playbook.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/async-execution-model.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/background-jobs-and-scheduling.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/batch-and-pipeline-architecture.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/config-secrets-runtime.md +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-modeling-and-migrations.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-platform-architecture.md +211 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/event-driven-architecture.md +263 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +281 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/observability-and-ops.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/packaging-runtime-readiness.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/redis-cache-coordination.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/reliability-and-error-contract.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/source-evidence-map.md +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/web-framework-boundaries.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +143 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/ai-service-wiring-patterns.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/async-and-worker-patterns.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/background-job-patterns.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/batch-and-artifact-patterns.md +13 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/dependency-client-patterns.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/error-handling-patterns.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/feature-playbook.md +43 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/observability-implementation-patterns.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/project-structure-and-tooling.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/public-api-security-patterns.md +52 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/redis-cache-lock-patterns.md +78 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/schema-and-validation-patterns.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/source-evidence-map.md +56 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/sqlalchemy-and-migrations-patterns.md +99 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/testing-and-quality-patterns.md +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/web-framework-patterns.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/config-runtime-readback.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/mr-merge-authorization.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/post-release-env-reset.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-closeout-evidence.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/release-scope-confirmation.md +21 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/tag-and-prod-pipeline-gate.md +20 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/test-scope-prompt.md +24 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/references/watcher-discipline.md +14 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/SKILL.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/comment-safe-release-doc.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-evidence-workflow.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-doc-writer/references/release-testing-scope-section.md +15 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/SKILL.md +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/SKILL.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/prd-composition-contract.md +35 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/requirement-closure-contract.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/references/security-four-questions.md +38 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/SKILL.md +91 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-intent/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/SKILL.md +88 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +337 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/analysis-parse-fix-test-challenge-replay.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/attribution-verification.md +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/bootstrap-slim-c3-obligation-table.md +112 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md +162 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +507 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/evidence-card-template.md +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/example-domain-preselect.md +79 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-lifecycle-handoff.md +65 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/firing-point-placement.md +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +286 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/incident-postmortem-extraction.md +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/l0-l1-l2-routing.md +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/online-skill-review.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/parallel-stack-references-pattern.md +164 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +90 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/recurring-anti-patterns-checklist.md +320 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/resume-paused-delivery.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-feedback-mining.md +33 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-finding-standards.md +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/review-rubric.md +40 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md +118 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/skill-listing-budget.md +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +254 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +658 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/two-source-extraction-pattern.md +167 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-routing-map.md +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +180 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +1452 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-evidence-card-leak.sh +491 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-mr-target-freshness.sh +173 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-size-budget.sh +488 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-sync-pointers.sh +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-golden-trace.rb +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-health.rb +327 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb +401 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing.rb +248 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/generic-r0-leak-scan.sh +282 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/governing-chain-diff.py +321 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +964 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +708 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/skill-behavior-eval.py +540 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-lifecycle.rb +51 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/source-register-pending-status.rb +55 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ai_coding_implementation_gates.sh +829 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +1203 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_r0_status.sh +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_register_pending_exclusion.sh +137 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +173 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_route_drift.sh +377 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_size_budget.sh +833 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +491 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_source_register_lifecycle.sh +114 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_mr_target_freshness.sh +261 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_sync_pointers.sh +538 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_controlled_escalation_pins.sh +154 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_grader_diagnostics.sh +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_surface_binding.sh +178 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_prose_target.sh +86 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_generic_r0_leak_scan.sh +131 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_git_identity_predicate_gate.sh +243 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_governing_chain_diff.sh +419 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_resolution.sh +724 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +414 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_regression_runner_registration.sh +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_bank_integrity.sh +205 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_credential_cwd.sh +61 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +111 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_root_depth.sh +53 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +257 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +98 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/input-state-machines.md +36 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/streaming-rich-output.md +130 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/references/terminal-side-channels.md +96 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/SKILL.md +408 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/AGENTS.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/bitable-setup.md +573 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/README.md +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/github-actions.yml +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/gitlab-ci.yml +76 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/ci_templates/jenkins.Jenkinsfile +106 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/classical-test-design-techniques.md +279 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/gen_report.py +2807 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/makefile-template.md +200 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/report-config-schema.md +272 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/run_pytestless.py +475 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/source-to-case-workflows.md +258 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-marker-conventions.md +316 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc-review-and-prioritization.md +145 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/AGENTS.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.dart +129 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.go +197 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.py +135 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/tc_helpers/tc.ts +285 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/test_gen_report.py +2144 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/test-artifact-management/references/update-lifecycle.md +62 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +212 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/ci-fixtures-and-flake-control.md +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +50 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/data-and-workflow-testing.md +34 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/design-closed-contract-oracles.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/e2e-real-flow-testing.md +71 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/fitness-functions.md +240 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/integration-contract-testing.md +235 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/non-functional-specialized-scenarios.md +296 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/rd-testing-standard-template.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/run-killing-mutation-walk.md +43 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/scenario-testing.md +136 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/source-evidence-map.md +59 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/structured-tc-input-translation.md +67 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +392 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-data-and-determinism.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-topology-and-commands.md +92 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/unit-testing.md +46 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/vendored-contract-drift-checklist.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/verify-enforcement-mechanisms.md +18 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/AGENTS.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.py +140 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/client-terminal-ansi-check.test.sh +75 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.py +170 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-ast-check.test.sh +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.go +198 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/lang-basics-go-check.test.sh +109 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/scripts/test_mutation_backup_recipe.sh +237 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +184 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/comment-safe-feishu.md +93 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/cross-model-co-review.md +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/delivery-face-closeout.md +60 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/doc-charter-first.md +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/session-vantage-leakage.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +126 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +47 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/embedded-h5-in-host.md +87 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/react-architecture.md +194 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/source-evidence-map.md +60 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-quality-release.md +190 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/web-ui-quality.md +83 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/SKILL.md +179 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/references/shared-branch-rebase.md +25 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/AGENTS.md +23 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_status.sh +207 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/test_worktree_sweep.sh +481 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-status.sh +325 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/worktree-isolation/scripts/worktree-sweep.sh +245 -0
- package/dist/assets/release.json +2797 -0
- package/dist/claude-adapter.d.ts +9 -0
- package/dist/claude-adapter.js +240 -0
- package/dist/cli-worker.d.ts +1 -0
- package/dist/cli-worker.js +32 -0
- package/dist/cli.d.ts +22 -0
- package/dist/cli.js +214 -0
- package/dist/codex-host.d.ts +30 -0
- package/dist/codex-host.js +162 -0
- package/dist/fs-safe.d.ts +21 -0
- package/dist/fs-safe.js +241 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/manifest.d.ts +8 -0
- package/dist/manifest.js +135 -0
- package/dist/opencode-adapter.d.ts +10 -0
- package/dist/opencode-adapter.js +416 -0
- package/dist/operations.d.ts +3 -0
- package/dist/operations.js +956 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.js +4 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.js +1 -0
- package/dist/unified.d.ts +4 -0
- package/dist/unified.js +64 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +5 -0
- package/package.json +35 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agents-file-coverage-gate
|
|
3
|
+
description: 在一个仓库跑「AGENTS.md 契约覆盖」gate——扫出根目录和每个源码目录是否都有 AGENTS.md,可一键补 stub 并接 CI 卡关。确定性脚本运行器,不做交付分类。触发:"查/跑 AGENTS 覆盖"、"查/跑/补 agent 覆盖地图"、"agent 契约覆盖"、"扫一下哪些目录缺 AGENTS.md"、"每个目录都有 agent 契约了吗"、"补缺失的 AGENTS.md"、"契约覆盖 gate"、"给这个仓初始化契约覆盖"、"装 AGENTS 的 pre-commit / CI 卡关"、"check AGENTS.md coverage"、"agents coverage"、"scaffold missing AGENTS.md"、"bootstrap agents coverage"、"do all dirs have an agent contract"。Skip:问「何时/是否」该更新契约或分层策略本身 → `product-rd-workflow` 的 spec/repo-contract sync gate;只是写某一个 AGENTS.md 的内容 → 直接编辑该文件;定义 agent 工具调用/函数的输入输出 schema 或调用契约(不是 AGENTS.md 文件覆盖)→ `llm-inference-integration`。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AGENTS.md File Coverage Gate
|
|
7
|
+
|
|
8
|
+
On-demand runner for the agent-contract coverage gate: it verifies (and can scaffold) that a repo's **root and every source-code directory** carry an `AGENTS.md`. This skill RUNS the gate; the *policy* — when a delivery must update a contract, and the layering rules contracts encode — lives in `product-rd-workflow`'s spec / repo-contract sync gate. Do not re-decide policy here.
|
|
9
|
+
|
|
10
|
+
In a project health-check system, this is a deterministic check provider for repo-local contract coverage. It reports the coverage states implemented by this gate, and it becomes CI-enforceable only when the project wires the vendored script with `--enforce`; agent review still owns whether each contract's content correctly captures the directory boundary.
|
|
11
|
+
|
|
12
|
+
Contracts are **nearest-file-wins** (the closest `AGENTS.md` to the edited file applies; there is no root index). Scope is **every directory that contains a source file picked up by the scan** (tracked, or untracked-but-not-gitignored; outside a git work tree it falls back to a plain file scan), detected by extension — so Go packages like `dal`/`service`/`handler` with no manifest are covered.
|
|
13
|
+
|
|
14
|
+
The gate checks **one repository**. Before running, confirm `--repo` points at a single repo, not a **GitLab group / parent-of-repos** checkout (sibling repos cloned side by side under a parent folder, where the parent is not itself a git repo). Running it on a group parent would conflate sibling repos and report a spurious "missing root contract" — so the script now detects that case (target is not a git repo root yet contains nested repos) and **refuses with exit 2, listing the sub-repos to run per-repo**. For a group, loop the gate over each member repo.
|
|
15
|
+
|
|
16
|
+
## Run
|
|
17
|
+
|
|
18
|
+
The gate ships in this package at `product-rd-workflow/scripts/check-agent-contract-coverage.sh`. Resolve that script inside the installed ccl-skills plugin (the newest match under the plugin cache) and run it against the target repo (default `--repo .`). Never copy it into the repo just to run it; copying is only for CI.
|
|
19
|
+
|
|
20
|
+
1. **Scan** — `bash <script> --repo <dir> --check`. Lists every source directory missing a non-empty `AGENTS.md`. Exit 0 (guidance) — never blocks, safe on legacy repos.
|
|
21
|
+
2. **Scaffold** — when the user wants to close gaps: `--fix` writes a stub `AGENTS.md` in each missing directory. Additive only: it never edits or overwrites an existing file, and never follows a symlink.
|
|
22
|
+
3. **Fill** — replace each stub with the directory's real contract: role/responsibility; allowed and forbidden dependencies and layering rules (e.g. a logic layer must not access the database directly — go through the data-access layer); invariants; build/test commands; a link to the nearest parent contract. An empty stub still counts as a gap. **Edit only `AGENTS.md` files.** Keep every contract SHORT: Codex consumers (per current documented behavior — `project_doc_max_bytes`, default 32 KiB, version/config-dependent; primary source: the official Codex AGENTS.md guide at developers.openai.com/codex/guides/agents-md — verify against the installed version) build ONE instruction chain at session start from repo root down to cwd and stop appending on overflow (the guide documents the cap and the stop-adding behavior; no overflow warning is documented) — an oversized root/parent contract can therefore evict deeper overrides, and contracts outside the root→cwd path are not auto-loaded there at all (hosts implementing the agents.md convention apply nearest-file-wins per edited file — per the agents.md spec FAQ; the short-contract discipline serves both semantics).
|
|
23
|
+
4. **Enforce** — `--enforce` exits 1 on any missing / empty / symlinked contract. Wire it into `make lint`/CI once the repo is clean.
|
|
24
|
+
|
|
25
|
+
Tune scope per project/language: `--source-ext ".tf .razor"`, `--exclude "migrations gen"`, `--name <filename>`. See `bash <script> --help`.
|
|
26
|
+
|
|
27
|
+
**A clean result only covers the languages the scan recognizes.** Source dirs are detected *by file extension*; a directory whose source is a language outside the active `--source-ext` set is silently unscanned and contributes no gap — so a green `--enforce` on a repo whose source is in an unrecognized extension (e.g. `.tf` / `.razor` / `.zig`, or `Dockerfile` / `Makefile`) can be a false-negative for those dirs. (`--source-ext` *appends to* the built-in default set rather than replacing it, so common mainstream languages are already covered; the blind spot is the extensions neither in the defaults nor added.) Before trusting a clean result (or wiring `--enforce` as a blocking gate), confirm the active extension set covers every in-scope source language whose directories should count toward AGENTS coverage; widen it, or record the unscanned languages as a known coverage gap — do not read a green from a partial extension set as full contract coverage.
|
|
28
|
+
|
|
29
|
+
## Bootstrap a repo (one-time adoption)
|
|
30
|
+
|
|
31
|
+
To make coverage self-sustaining — enforced on every commit with no agent and no prompt — set a repo up once:
|
|
32
|
+
|
|
33
|
+
1. **Vendor the script** into the repo. This is the ONLY case where copying is correct: a git hook or CI runner cannot reach the plugin cache. Copy `check-agent-contract-coverage.sh` to e.g. `tools/`.
|
|
34
|
+
2. **Scaffold + fill** the current gaps — `--fix`, then fill each stub (Run step 3).
|
|
35
|
+
3. **Install the gate** as a git hook or CI step that runs `--enforce`:
|
|
36
|
+
- pre-commit / pre-push: `bash tools/check-agent-contract-coverage.sh --enforce`. To share across the team, commit a `hooks/` dir AND have a setup/init script run `git config core.hooksPath hooks` (that config is local per clone, so it must be installed, not just committed).
|
|
37
|
+
- or CI / `make lint`: the same command.
|
|
38
|
+
During rollout run `--check` (warn-only, exit 0); flip to `--enforce` once the repo is clean so it blocks.
|
|
39
|
+
|
|
40
|
+
After bootstrap, every commit/CI run enforces coverage automatically; the on-demand path above is then only for ad-hoc checks. This skill can drive the bootstrap (vendor + scaffold + install hook); the running afterwards needs neither agent nor skill — just the vendored script.
|
|
41
|
+
|
|
42
|
+
## Boundary
|
|
43
|
+
|
|
44
|
+
- This skill is the **on-demand** path (a short ask → run the gate) plus **one-time bootstrap** (vendor + hook/CI). The steady-state automatic enforcement is the vendored script in a hook/CI, not this skill.
|
|
45
|
+
- It does not decide *when* contracts must change or what layering rules to impose — route those to `product-rd-workflow`'s sync gate.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "AGENTS.md File Coverage Gate"
|
|
3
|
+
short_description: "Scaffold, verify, and enforce AGENTS.md across a repo's source directories"
|
|
4
|
+
default_prompt: "Use $agents-file-coverage-gate to check, scaffold, or enforce that the repo root and every source-code directory carry an AGENTS.md; it runs product-rd-workflow's check-agent-contract-coverage.sh (--check/--fix/--enforce) and can bootstrap a pre-commit/CI gate."
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: app-cross-platform-dev
|
|
3
|
+
description: Use when designing, implementing, reviewing, debugging, testing, or shipping mobile app client features across Flutter, React Native, native Android, and native iOS, including navigation, state, API integration, offline/cache, platform capabilities, accessibility, performance, app build/release, and rendered device verification. Product-agnostic; use miniapp-product-dev for mini-programs, web-react-dev for React web, product-ui-ux-design for UI/UX, backend skills for services, and testing-strategy for test planning. Triggers include "移动端怎么做", "Flutter / React Native / iOS / Android App 端怎么写", "RN 端", "原生 iOS / Android 页面怎么写", "重构这个 App 页面/组件(局部)", "refactor an app screen/widget".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# App Cross-Platform Dev
|
|
7
|
+
|
|
8
|
+
Use this skill for mobile app and cross-platform client engineering. It covers Flutter, React Native, native Android, and native iOS. It does not own mini-programs, React web, backend service design, product requirements, or visual design rules.
|
|
9
|
+
|
|
10
|
+
## Routing
|
|
11
|
+
|
|
12
|
+
- Use `product-rd-workflow` first when the work spans product intent, architecture, design, implementation, testing, and release.
|
|
13
|
+
- Use `product-ui-ux-design` before or alongside coding for user-facing surfaces, interaction model, visual hierarchy, density, motion, empty/error states, and accessibility acceptance.
|
|
14
|
+
- Use `miniapp-product-dev` for WeChat/Alipay/Douyin/Baidu mini-program pages, host-platform APIs, developer tools, real-device preview, review submission, and miniapp release.
|
|
15
|
+
- Use `web-react-dev` for React web and browser-specific client work.
|
|
16
|
+
- Use Go or Python backend skills for server contracts, persistence, queues, auth services, and API ownership.
|
|
17
|
+
- Use `testing-strategy` to choose the test layer; return here for Flutter, React Native, Android, or iOS implementation details.
|
|
18
|
+
- Use `test-artifact-management` when the ask is about generating structured test cases from a Feishu requirements doc or codebase and tracking them in Feishu Bitable before implementation begins.
|
|
19
|
+
- Use `defect-diagnosis` first for bugs, failed tests, flaky behavior, crashes, rendering regressions, build failures, or store/release symptoms.
|
|
20
|
+
- For money, quota, permission, tenant/user data, high-impact AI, repeated submit, async finality, or support-traceable incidents, apply `product-rd-workflow` high-risk resilience gates before treating the app flow as complete.
|
|
21
|
+
|
|
22
|
+
## Core Workflow
|
|
23
|
+
|
|
24
|
+
Before editing app code, native project files, platform configs, styles, assets, or tests, complete enough analysis and planning for the change to be reviewable. Scale the plan to risk: a simple low-risk single-screen change can use a short inline plan; multi-platform, user-visible, API-visible, native-capability, release/store, bug-fix, branch/MR, unclear-risk, or high-risk work needs explicit task split, design checkpoint, target-device matrix, acceptance checks, verification commands, rollback or stop conditions, and named handoffs to design, testing, backend, release, or diagnosis skills before edits.
|
|
25
|
+
|
|
26
|
+
Repo-local agent contracts (`AGENTS.md` at the repo root and in source directories) are part of the delivery contract: when a change moves a stable boundary, generated surface, workflow, or directory-local rule, update the nearest contract in the same MR and keep coverage in sync per `product-rd-workflow`'s spec / repo-contract sync gate.
|
|
27
|
+
|
|
28
|
+
When checking a cross-platform app against team standards, split conformance into deterministic and agent review evidence. Deterministic checks cover build flavors/schemes, package locks, generated API/IDL client usage, environment/lane config, unit/widget/instrumented/E2E commands, CI gates, signing/release config, and request/trace identifiers in central clients. Agent review checks cover screen/module boundaries, platform abstraction leakage, native bridge contracts, finite-value mapping, device evidence quality, and whether tests prove the shipped runtime paths rather than only mocked widgets. For the per-substack deterministic executor list (each analyzer is its own toolchain with thin defaults — `dart analyze`+`flutter_lints` with `analyzer>errors:` severity escalation, detekt `coroutines`/`exceptions` inactive rules, SwiftLint opt-in safety rules, RN typed-ESLint) and the shipped client conformance checkers, see `testing-strategy/references/fitness-functions.md` §4.1.3 (client language-basics; spec 006). Layering/dependency-direction has no out-of-box rule on any substack — express it as import-ban config (Konsist/ArchUnit/custom_lint/dep-cruiser).
|
|
29
|
+
|
|
30
|
+
1. Resolve the target app shape.
|
|
31
|
+
- Flutter shared app, React Native app, native Android, native iOS, or mixed native plus shared module.
|
|
32
|
+
- Target devices, OS versions, form factors, app-store constraints, and native capability needs.
|
|
33
|
+
- Whether the feature is shared across platforms or intentionally platform-specific.
|
|
34
|
+
|
|
35
|
+
2. Analyze the existing client surface.
|
|
36
|
+
- Locate the owning feature/module, route entry, state owner, API client, local storage, platform adapter, and tests before editing.
|
|
37
|
+
- Identify shared behavior versus platform-specific behavior; list which platforms must be changed and verified.
|
|
38
|
+
- Read local wrappers first: Flutter/Gradle/Xcode scripts, package managers, CI jobs, test targets, flavors/schemes, and generated files.
|
|
39
|
+
- If a design exists, map each visible state and interaction to code ownership before implementing.
|
|
40
|
+
- For any visible UI change, map the design checkpoint to code ownership: aesthetic hierarchy/density, interaction flow, behavioral feedback, user psychology, safe-area/keyboard/orientation adaptation, and device screenshot acceptance. Also record `product-ui-ux-design`'s implementation-owner checkpoint before the first edit — its field list (design/stack/test owners, entry-rule evidence, rendered/device evidence status) and copy-only path are authoritative there; load the named owner skills rather than only naming them, and treat a completion claim without `captured/verified` rendered evidence as incomplete — an explicitly accepted gap closes the slice only as `pre-runtime-test ready` / handoff, never as complete/done.
|
|
41
|
+
- For UI/UX redesign slices meeting `product-ui-ux-design`'s page-slice trigger conditions — that gate's trigger list is authoritative and must be checked, not paraphrased, whenever a screen/surface change could be a redesign, restyle, new-style declaration, structural/visual-system change, continuation, or redesigned-surface reference — apply its cross-stack page-slice gate before framework mechanics: RED-first focused assertion, IA regrouping by user intent/consequence, behavior-contract preservation, state matrix, rendered evidence, and the design verdict (`accepted` / `rejected` / `pending`; missing = `pending`, and `design-rejected` blocks complete/MR-ready/normal/draft MR per the **Rejected-surface rule**). Translate examples from other stacks into the target app runtime instead of copying Flutter-, Android-, iOS-, or Web-specific commands as the method itself.
|
|
42
|
+
|
|
43
|
+
3. Define the client boundary before coding.
|
|
44
|
+
- Screens, routes, tabs, navigation stack, deep links, and back behavior.
|
|
45
|
+
- UI state owner, domain/data state owner, and source of truth.
|
|
46
|
+
- API client contract, request cancellation, retry, auth/session behavior, and error mapping.
|
|
47
|
+
- API observability: central clients should attach or preserve request/trace/operation identifiers, measure duration, distinguish cancel from failure, classify upload or long-running requests, and map backend envelopes into typed user-facing errors.
|
|
48
|
+
- Finite-value boundary: generated API enums, backend string codes, deep-link params, local cache values, analytics dimensions, and native bridge payload codes should flow through one typed client/domain mapping module. Screens/widgets should use mapped symbols and label tables instead of scattering raw values such as `"US"`, `"CN"`, `"active"`, or `"default"` across render, storage, routing, or tracking code. If shared client-domain ownership is unclear, keep a local mapper for the slice, mark temporary duplicate/raw uses with `finite-value-debt: <task-ref> <owner> <deadline> <reason>`, and record the consolidation owner. Architecture owns the cross-stack semantic decision when the same value must align across app, web, mini-program, backend, storage, and analytics.
|
|
49
|
+
- Local persistence, offline/cache policy, invalidation, conflict handling, and sync triggers.
|
|
50
|
+
- Platform capabilities such as camera, files, notifications, background tasks, payments, share sheet, sensors, biometrics, and permissions.
|
|
51
|
+
- Observability: crash reporting, analytics events, logs, performance traces, and feature flags.
|
|
52
|
+
- High-risk submit/finality behavior: duplicate tap protection, request cancellation semantics, offline/foreground recovery, durable pending/final states, retry rules, and a visible tracking identifier when support or reconciliation may be needed.
|
|
53
|
+
|
|
54
|
+
4. Keep architecture boring and inspectable.
|
|
55
|
+
- Keep view/widget code thin; move data loading, validation, command handling, and mapping out of render code.
|
|
56
|
+
- Use unidirectional data flow where practical: user action -> intent/command -> state update -> render.
|
|
57
|
+
- Separate transient UI state from durable domain/data state.
|
|
58
|
+
- Keep typed API clients and explicit error envelopes; do not let raw transport errors leak into UI copy.
|
|
59
|
+
- Isolate platform-specific code behind adapters, plugins, protocols, or modules.
|
|
60
|
+
- Treat route/deep-link behavior as a public contract with tests or smoke verification.
|
|
61
|
+
|
|
62
|
+
5. Implement by platform.
|
|
63
|
+
- Codegen regeneration discipline (cross-stack — Flutter `build_runner`/`freezed`/`pigeon`, Android KSP/Hilt/Room/Moshi, iOS `Sourcery` and other accessor/mock generators): never hand-edit pure generator-owned files (mark them `// DO NOT EDIT`; they regenerate freely *only when their working copy is clean/committed* — a dirty or untracked generated file may hold local edits a regen would silently restore over, so it gets the same preimage snapshot/diff/approval as below) — put customization in extension points / handwritten files beside the generated code. A file that is generated once and then hand-maintained is a *different* class: mark it explicitly `FROZEN` / `HAND-MAINTAINED` (not `DO NOT EDIT`, which a reader treats as regenerate-freely), exclude it from normal regeneration, and overwrite it only on explicit request through the preimage gate below. Edit the source of truth (annotations / IDL / `.proto` / templates) first, then regenerate. Do not overwrite a hand-maintained or user-edited file on regeneration without an explicit request, and gate that overwrite on the *pre-overwrite* preimage — generate to a temp/backup path, diff against the current file, and only replace after that diff is reviewed and approved (deleting the backup only once generation succeeds). Reviewing the git diff *after* an in-place overwrite is too late, and silently loses edits in dirty/untracked files. After a generator or toolchain *upgrade* (not just an input change) the emitted shape can change, so a cache key built only on input source can silently serve stale output — force a fresh, no-cache full regeneration and review the resulting diff against expected drift (clean/no-op is a valid outcome when the upgrade is semantically neutral; the point is that the regen actually ran rather than being skipped by a stale cache). Record the regeneration evidence (the command, that it ran fresh/no-cache, and the generated diff or an explicit no-op note) when the source-of-truth or generator/toolchain changed; when a shape change is expected *or* appears in the regenerated diff, also confirm the runtime/consumer reflects the new schema and, for a generated artifact carrying a version/schema stamp, that the stamp advanced — a clean `build` alone is not proof the regeneration ran. A shape change that appears unexpectedly in the diff is a stop-for-approval signal, not something to wave through because it was not anticipated. A parallel codegen-regeneration discipline exists for backend protobuf/IDL/DI codegen — load that skill for backend work, since this app-skill bullet does not gate backend codegen: `go-microservice-dev` owns the fuller set (never hand-edit generated, edit-source-then-regenerate, guarded-backup before overwrite, fresh-regen smoke for generator-shape changes, regenerate-and-verify); `python-service-dev` owns the core (never hand-edit generated clients/protobuf, update source contract then regenerate, verify generated output is clean or intentionally reviewed).
|
|
64
|
+
- Flutter: use feature-first modules when the repo allows it; keep widgets declarative; choose state management from the existing repo pattern; isolate platform channels and plugins; test with unit, widget, golden/screenshot when available, and integration tests for critical flows.
|
|
65
|
+
- React Native: keep navigation, storage, native modules, permissions, image/media pickers, and platform branches behind repo-owned adapters. Verify both JS behavior and native module availability on the affected iOS/Android target; do not treat a Metro bundle running as proof that the native capability works.
|
|
66
|
+
- Flutter platform scaffolds: after `flutter create` or adding a new target platform, inspect generated noise before committing. Preserve existing `.metadata` platform entries, align bundle/package identifiers and display names across platforms, and keep generated/local files such as IDE module files, Flutter generated configs, ephemeral debugger files, and generated plugin registrants ignored unless the repo explicitly tracks them.
|
|
67
|
+
- Android: follow UI/data layer separation; use ViewModel or state holders for screen state; hoist Compose state; collect lifecycle-aware state; keep repositories as data boundaries; use WorkManager or platform APIs for background work when needed.
|
|
68
|
+
- iOS: use SwiftUI for new UI unless the repo is UIKit-first; keep views data-driven; use State/Binding/Observable-style ownership deliberately; isolate URLSession/client code; use async/await where it matches the repo; bridge UIKit only behind clear boundaries.
|
|
69
|
+
- iOS simulator setup: do not treat a successful platform download as proof that Xcode can build. Verify runtime registration and destination discovery with `xcrun simctl list runtimes -j`, `xcrun simctl runtime list`, `xcodebuild -showBuildSettings -destination ...`, and, when storyboard or asset compilation fails, a minimal `xcrun ibtool` reproduction. If Xcode reports that the iOS platform is not installed while `simctl runtime list` shows duplicate or unusable runtime images, remove only the unusable duplicates with `xcrun simctl runtime delete`, then run `xcrun simctl runtime scan-and-mount` and recheck before changing app code.
|
|
70
|
+
- H5/WebView or hybrid app surfaces: initialize bridge capability explicitly, gate debug tooling to development builds, model auth/session cleanup across native and web storage, and verify gestures, safe area, keyboard, orientation, image preview, and floating toolbars on the target devices.
|
|
71
|
+
- Native WebView shells need a written shell contract: initial route and launch/consent gate, injected app info, JS bridge handler names and callback semantics, native/web storage sync, permission flows, loading/error/retry surfaces, back/edge-swipe behavior, orientation lock/unlock, network-state recovery, and update/download/install states.
|
|
72
|
+
- JS bridge handlers are API contracts. Validate input payloads, keep callback ids scoped and cleaned up, return terminal success/cancel/failure states, avoid exposing broad native capabilities, and make handler availability detectable from the web side.
|
|
73
|
+
- App-hosted web surfaces need lifecycle state rules: foreground/background save and restore, TTL or expiry, sensitive-field handling, session invalidation, public/guest access modes, and recovery when the native bridge or injected app info is missing.
|
|
74
|
+
- App-hosted web surfaces should use full-screen containers by default and add max-width/device frames only for intentional preview modes. Bottom tabs, sticky actions, overlays, and toasts must respect safe-area insets from the native host when available and fall back predictably in browser or iframe contexts.
|
|
75
|
+
- App startup/auth shells need an explicit sequence: native splash or fake launch screen, first-run privacy/terms gate, web content load, login/account-opening or session restore, and deterministic handoff to the first tab. Do not initialize optional background listeners or broad native capabilities before consent and shell readiness; do not enable debug overlays or debug menus in production builds.
|
|
76
|
+
- Foundational app shells need a written app-state contract across native and web: splash timeout, consent persistence, initial route, bottom-tab ownership, guest/authenticated session, verification restore, web/native cache keys, logout/delete cleanup, privacy/legal document routes, about/version/update state, network/load retry, and production debug gating.
|
|
77
|
+
- The native shell should treat login, home, profile, privacy, and about as one launch-to-account system. It owns splash or fake-launch timing, first-run privacy gate persistence, WebView/WKWebView readiness, app-info injection before web layout depends on it, native storage get/set/remove/clear, network-error retry, back/edge-swipe behavior, update handoff, and debug/diagnostic gating; the hosted web owns auth modes, verification, home modules, profile routes, and legal document rendering.
|
|
78
|
+
- When logout, guest exit, account deletion, or identity reset succeeds, clear both hosted-web state and native shell state where present. Verify that the next launch cannot reuse stale WebView storage, stale injected account metadata, or an old first-tab route.
|
|
79
|
+
- Account-opening or binding in an app-hosted flow is conditional on the product contract. When present, the web layer owns validation, consent, verification, first-login password setup, and user-visible copy; the native shell owns app info, storage sync, privacy gate, and post-auth cache/session handoff. New-user account creation must not hide required setup or recovery states behind server side effects.
|
|
80
|
+
- Verification and password setup flows need native-container resilience: masked destination, resend countdown, paste/autofill support, focus and Backspace behavior, foreground/background restore with sensitive-field handling, expired restore cleanup, and a deterministic route after success or failure.
|
|
81
|
+
- Keyboard avoidance must distinguish visual-viewport resize, overlay mode, Android legacy behavior, and iOS native behavior. Keep the active input and submit/retry action visible; reset padding/translation on blur, orientation changes, and route exit.
|
|
82
|
+
- Orientation changes are platform capability flows, not CSS toggles. Model enter, exit, failed bridge call, iframe/postMessage fallback, browser-only instruction, state sync, cleanup on unmount, and route-level return-to-portrait behavior.
|
|
83
|
+
- Async content shells need stable loading, error, retry, empty, and children geometry. Put retry inside the failed content region, not only in a toast, so users can recover without losing route or scroll context.
|
|
84
|
+
- Mobile UI must treat safe area, keyboard, orientation, foreground/background, weak network, and app restart as first-class UX states, not late bug fixes.
|
|
85
|
+
- Mobile forms running in WebView need platform-aware input handling: paste, deletion, cursor restoration, old Android WebView fallback, iOS WebKit duplicate or delayed input behavior, focus/blur reformatting, and keyboard-safe submit reachability.
|
|
86
|
+
- Media, upload, scan, review, or annotation flows: cover permission prompts, selected asset state, upload/progress/failure, preview/zoom/pan/reset, retry/cancel, foreground/background recovery, and final status rather than only a success toast.
|
|
87
|
+
- Microphone or speech-capture flows need a native capability lifecycle, not only an input widget.
|
|
88
|
+
- Lazy-load native audio modules so app startup does not freeze or prompt for permission before intent; probe by actually opening a capture path rather than checking that a binary, bridge, or permission string exists, discard probe bytes, keep probes out of transcription/model-visible paths, and stop the probe recorder even after partial initialization failure.
|
|
89
|
+
- Distinguish unsupported remote/headless environments, no device, permission denied, silent input, connection failure, unsupported language, and speech-not-detected states.
|
|
90
|
+
- Cross-platform fallback chains must match the real start path, consume subprocess/native error streams to avoid backpressure, stop every active recorder on release, blur, cancel, retry, or unmount, and fence callbacks by session generation so stale audio or transcripts cannot update a newer input.
|
|
91
|
+
- AI media-extraction flows need a staged client state machine: capture/import, crop/preview, upload, analyze, render generated content, classify/tag, save/publish, retake, and retry. Keep final commit disabled until required generated content and metadata are valid, and isolate rich-content renderer failure from the rest of the screen.
|
|
92
|
+
- Camera/media capture launched from WebView must not assume success just because the native picker opened; model native capability, returned object key/URL, and web callback recovery as a contract.
|
|
93
|
+
- Native capture launched from hosted web should be a two-phase finality contract: native success means an asset key or URL was produced; the hosted destination route still owns metadata validation, save/publish, page-ready acknowledgement, and final user feedback.
|
|
94
|
+
- Native camera capture for document/image extraction needs preview-final parity. If the user sees a processed crop, the uploaded bytes should use the same crop coordinates, orientation correction, color-space normalization, binarization/enhancement class, and size budget. Do not show a clean preview and upload a materially different image.
|
|
95
|
+
- Media processing pipelines need guardrails, not only filters: EXIF/upright normalization, crop rect clamping in normalized coordinates, aspect-ratio alignment between preview and final output, all-black/all-white detection, output-size backoff, and logs that expose ratios/bytes/timing without leaking credentials.
|
|
96
|
+
- WebView-launched native capture should keep old and new bridge contracts isolated. Use versioned handler names or explicit capability detection, scoped callback ids, terminal `success/cancel/failure` states, parseable JSON payloads, and page-ready or transition-cover cleanup so the web layer never depends on a hidden native screen finishing silently.
|
|
97
|
+
- Capture overlays should be owned by the native shell until the hosted page confirms readiness. Add an automatic timeout as a recovery guard, but treat the page-ready callback as the normal completion path.
|
|
98
|
+
- Native camera screens need stable full-screen geometry: safe-area back, dominant preview/crop area, bottom bar reserved for secondary import, centered shutter/confirm, and device tool such as torch or rotate. Do not resize the primary image area when loading, focusing, or toggling tools.
|
|
99
|
+
- Upload configuration and token selection should be runtime-configurable behind a coordinator or adapter with a conservative fallback. Log chosen config, object key, byte size, and token shape only in redacted form; do not require an app restart for bucket, endpoint, or signing-version changes when the product expects remote switching.
|
|
100
|
+
- Camera UX must cover real device craft: tap-to-focus or focus pulse where supported, torch availability and unsupported feedback, album fallback, visible taking/uploading overlays, retake path, permission temporary versus permanent denial, unavailable hardware, settings handoff, upload/token failure, and disabled controls while capture or upload is in flight.
|
|
101
|
+
- iOS and Android may need different media hardening, but the product contract should stay aligned: upright orientation, color-space normalization where needed, crop bounds clamping, preview/final parity, size budget/backoff, redacted diagnostics, and terminal callback cleanup on both platforms.
|
|
102
|
+
- Native app update flows need visible download progress, failed-token/download/install states, install-permission handling, cancel/retry, and platform-appropriate update path. Treat "open store" and "download APK then install" as different contracts.
|
|
103
|
+
- Mobile home, list, and insight surfaces need independent state ownership per module: initial skeleton, section-level error/retry, search debounce, pull-to-refresh, infinite scroll, no-more state, pending-versus-committed filters, and keyboard-safe bottom sheets.
|
|
104
|
+
- App-hosted mobile insight/report surfaces need separate owners for report context, metadata cache, data cache, filter state, advanced settings, card state, native-shell state, and scroll state. Do not let a global store or stale cache silently override an explicit route scope.
|
|
105
|
+
- When the same insight/report is reachable from a home summary and a bottom-tab list, define one entry contract: home shortcut, tab list, detail page, drilldown, and back behavior must share the same report id, scope, filter precedence, and stale-cache rules.
|
|
106
|
+
- For report filters, merge route, stored state, metadata defaults, and permissions in that order unless the product defines a stricter source of truth. Preserve explicit all-scope sentinels; never collapse them into `undefined`.
|
|
107
|
+
- For module data refresh, merge by affected module. A shorter or permission-limited response should not overwrite fuller cached context unless the scope genuinely changed. Setting changes should show card-level loading instead of full-page reload where feasible.
|
|
108
|
+
- Dense app-hosted tables need fixed headers or context columns, dynamic grouped columns, visible sort state, horizontal scroll affordance, load-more throttling, and in-table loading/error/empty overlays.
|
|
109
|
+
- Analytics scroll restoration should wait for stable layout height, clamp to current scroll bounds, abort on user wheel/touch, handle storage failure, and clear on filter, route, or context changes.
|
|
110
|
+
- Native shells that host mobile reports need a first-class contract for launch/consent, injected app info, status-bar and safe-area values, bridge capability detection, native storage get/set/remove/clear, network/load failure retry, back-stack behavior, orientation lock/unlock, update handoff, and shell overlay return to the originating page.
|
|
111
|
+
- For app-hosted report/detail pages, H5/Flutter owns context, metadata, filters, card state, chart/table rendering, drilldown routes, and module refresh; the native shell owns WebView/load retry, safe area/status injection, native storage, back gesture, orientation lock/unlock, and overlay page-ready cleanup.
|
|
112
|
+
- For app-hosted resource or asset-library entries, distinguish the shell from the library. The native shell owns WebView load/error/retry, injected app info, safe area/status values, native storage, bridge capability detection, update/download handoff, orientation/back behavior, and page-ready overlay cleanup. The hosted web or H5 route owns resource metadata, save/share/download/preview state, and final user feedback.
|
|
113
|
+
- Do not infer a native resource manager from a hosted save-to-library or upload entry. Add native file/download/share capabilities only when the target platform code exposes a scoped handler, permission flow, callback semantics, and recovery state.
|
|
114
|
+
- Do not initialize broad listeners, background recovery, debug WebView inspection, or optional native capabilities before consent and shell readiness. Production builds must gate inspectability, verbose logs, and bridge debug output.
|
|
115
|
+
- Bridge callbacks must be terminal and scoped: validate payloads, store callback ids per handler or request, return success/cancel/failure where relevant, remove callbacks after completion, and expose a page-ready acknowledgement for native overlays that wait for web route mount.
|
|
116
|
+
- Mobile precision workspaces need explicit runtime state for retryable media, zoom/pan, selected item, task switcher, progress counters, custom numeric/keypad input, invalid value feedback, handedness or control placement, persisted settings, and portrait/landscape composition differences.
|
|
117
|
+
- Mobile precision workspaces need a written state contract before implementation: route/context ids, task-source state, selected item or selected batch, cached task batch, cached media, persisted user preferences, context preferences, item-scoped geometry/scale, timer or quality gates, shell orientation state, and exit/unlock behavior.
|
|
118
|
+
- Precision media should avoid blank swaps: prioritize current-screen preloads, limit background preload concurrency, wait for image decode or readiness before replacing the displayed artifact, keep the previous artifact visible during load, provide in-region retry after automatic retry, and remove committed artifacts from memory/cache.
|
|
119
|
+
- Pan/zoom surfaces should use refs or imperative transforms for high-frequency pointer updates when the WebView would jank under render-loop state updates. Coordinate pinch, wheel, pan, tap, and page-swipe blocking explicitly, and persist only normalized scale values that can be cleared safely on item or orientation changes.
|
|
120
|
+
- Precision submission must be idempotent and explainable: block duplicate taps, submit only changed or still-pending items when possible, handle unprocessed-item defaults through an explicit confirmation policy, validate minimum time or quality gates before commit, clean cache after success, and recover from locked, completed, expired, permission, or no-work responses without losing route context.
|
|
121
|
+
- App-hosted precision workspaces need a native-plus-H5 route contract: the H5 route owns selected item, selected batch, task-source state, cached work, media readiness, scoring/input state, settings scope, final submit, and exception dialogs; the native shell owns orientation, WebView loading/error/retry, injected app info, storage bridge, back gesture, and page-ready or overlay cleanup.
|
|
122
|
+
- Orientation for precision work is a shell contract. H5 should request orientation through capability-detected bridge calls, skip no-op iOS rotation calls when they would hang, fall back to iframe or browser guidance where needed, clear measured geometry on rotation, and return to the expected portrait/default orientation on exit after the route has saved or unlocked state.
|
|
123
|
+
- Precision work must survive slow networks and repeated entry: distinguish cache hit, loading, stale, expired, retrying, and final states; keep user-visible context while refreshing; and map transport, permission, lock, expiry, and invalid-input failures to local copy and recovery controls.
|
|
124
|
+
- Accessibility is part of the implementation contract. Verify touch target size, focus order, programmatic names for icon-only controls, screen-reader labels for compact toolbars, text scaling, contrast, reduced-motion behavior, and keyboard/safe-area reachability for primary and recovery actions. Visible icon labels are not enough when compact modes hide text.
|
|
125
|
+
- App-hosted flows that can be interrupted need foreground/background restoration rules: storage scope, TTL, sensitive-field handling, route/context validation after restore, pagehide/pageshow/focus/blur coverage, and a visible stale-or-expired recovery path.
|
|
126
|
+
- Repeated-use mobile tools should separate local device state, user-scoped preferences, context-scoped preferences, and item-scoped preferences. Restore each layer independently, validate it against current permissions and available items, and reset only the invalid layer.
|
|
127
|
+
- Dense mobile data surfaces need deliberate landscape support: orientation request and failure guidance, dynamic table/canvas scroll bounds, fixed context columns when needed, search/filter/sort ownership, load-more thresholds, and cleanup back to the prior orientation on exit.
|
|
128
|
+
- Account deletion, logout-all, identity reset, or other high-consequence account actions need explicit disclosure loading, acknowledgement or cool-down gating, second confirmation, failure feedback, session/native-cache cleanup, and deterministic return to login or onboarding.
|
|
129
|
+
- Profile/settings shells need account/security, privacy, about/version, logout, and delete-account flows to coordinate native and web storage. A successful logout or account deletion should clear both web cache and native cache where present, then return to login/onboarding without leaving a stale WebView session.
|
|
130
|
+
|
|
131
|
+
6. Debug systematically when behavior is wrong.
|
|
132
|
+
- Reproduce on the smallest affected target: device, emulator, simulator, preview, or focused test.
|
|
133
|
+
- Treat repeated device, emulator, simulator, Gradle, Xcode, CocoaPods, adb, or NDK blockers as app infrastructure defects, not fresh one-off environment gaps. If the same blocker appears again, fix or harden the setup script, readiness check, or toolchain pin before reporting the app test layer as unavailable.
|
|
134
|
+
- Classify the failure by layer: route/deep link, render/layout, state transition, API/client contract, cache/offline, platform permission/capability, build/signing, or release config.
|
|
135
|
+
- Inspect logs, crash traces, network payloads, lifecycle events, permission state, local storage, and feature flags before changing code.
|
|
136
|
+
- Prove the cause on each affected platform; do not assume a Flutter/shared fix covers native host behavior or store/runtime configuration.
|
|
137
|
+
- Add regression evidence at the lowest sufficient layer, then run broader device/build smoke based on risk.
|
|
138
|
+
|
|
139
|
+
7. Verify on rendered surfaces.
|
|
140
|
+
- Run the repo's formatter, analyzer/linter, typecheck/build, and focused tests.
|
|
141
|
+
- **TC traceability**: Flutter/Dart tests link via `tcTest(['TC-XX-NNN'], 'desc', () { ... })` wrapper (registers at registration time, so `skip:` / `skipIf:` etc. still register correctly). Helper from `test-artifact-management/references/tc_helpers/tc.dart`, installed under `test/tc.dart`. Native Android/iOS use the language-appropriate wrapper convention (write a small helper that appends to `test/results/tc-map.jsonl`). See `test-artifact-management/references/tc-marker-conventions.md`. Before adding tests, `grep -rn 'tcTest.*"TC-[A-Z]' test/` plus the sidecar to check for existing coverage — extend rather than duplicate. When a TC is marked 废弃, grep both source and sidecar for that TC ID; follow deprecation cascade in `testing-strategy`. Tests without any `tcTest(...)` / equivalent helper call: prompt user only when the underlying code is also removed.
|
|
142
|
+
- **废弃级联:业务代码是否仍在用** — 每端原生 + 跨端各有套路:
|
|
143
|
+
1. Flutter / Dart:`grep -rEn "import ['\"]package:<pkg>/<file>|import ['\"]\.+/<file>" lib/`;运行 `dart analyze` 看 unused-import warning;路由表 `MaterialApp.routes` / GoRouter 配置内未注册的页面可删
|
|
144
|
+
2. Android(Kotlin/Java):`grep -rn "import .*<class>" app/src` + `./gradlew lintDebug` 看 UnusedResource / UnusedSymbol;AndroidManifest.xml 内未注册的 Activity/Service 实际不会被启动
|
|
145
|
+
3. iOS(Swift/ObjC):`grep -rn "import <module>\|<ClassName>" ios/`;Xcode 的 dead-code-stripping 报告;Storyboard / XIB 引用 grep `.storyboard` 与 `.xib`
|
|
146
|
+
4. 边界:跨端项目(KMM / 桥接代码)每层独立判,删一层不代表另一层也死;反射 / runtime 注解(Android)/ Objective-C runtime(iOS)grep 抓不到,需运行时验证
|
|
147
|
+
- Inspect the screen in a real device, emulator, simulator, preview, or captured screenshot for any visible UI change.
|
|
148
|
+
- For UI/UX redesign evidence, include the target device/form factor, safe-area, keyboard, orientation, dynamic type/text scale, loading/empty/error/final states, and a screenshot or equivalent rendered artifact; mark each dimension covered or `N/A` with a one-line reason. `N/A` is valid only when the reason names a verifiable structural fact, explains why that fact makes the dimension unreachable or unchanged for this slice, and includes a checkable pointer such as a file path, config key, or commit that resolves at review time. Also record the design verdict (`accepted` / `rejected` / `pending`) from a user or named independent design-owner review per `product-ui-ux-design`'s page-slice gate; a missing or absent verdict counts as `pending` and blocks complete/MR-ready exactly like a missing dimension — the screenshot alone is never acceptance. Persist evidence artifacts where reviewers can access them using sanitized/test accounts and redacting tokens, PII, credentials, private paths, and raw personal data; remove temporary smoke files or scripts before commit unless the repo intentionally owns them.
|
|
149
|
+
- In approval-sensitive runtimes, do not create a new one-off smoke file for every screenshot or slice. Prefer a repo-owned smoke harness, existing integration test, debug route, fixture flag, deep link, or already-created slice harness; if a temporary harness is genuinely unavoidable, reuse one stable harness for the whole batch, mutate it minimally, and explicitly delete it before commit (a throwaway harness is evidence scaffolding, not shippable code; verify it is gone in the pre-commit diff) unless the repo intentionally owns it. Repeated edit-approval prompts from throwaway helper files are an execution defect, not normal evidence collection.
|
|
150
|
+
- Capture Android evidence as approval-friendly single commands. In environments where command-prefix approval is used, do not combine `adb` with shell pipes, `>`, `>>`, command substitution, `&&`, or local filtering in the same command; those forms are split or de-scoped by the approval layer and can re-trigger prompts even when `adb` itself is approved. Use sanitized/test fixture screens, then run three standalone commands: `adb -s <serial> shell screencap -p "/sdcard/<artifact>.png"`, `adb -s <serial> pull "/sdcard/<artifact>.png" "<repo-evidence-path>/"`, and `adb -s <serial> shell rm "/sdcard/<artifact>.png"` in cleanup even when pull fails or the run aborts. Generate `<artifact>` from a safe basename alphabet (no spaces, globs, or path separators) and quote the `/sdcard` path in every command so `rm` targets exactly the file you created, and create the destination with `mkdir -p <repo-evidence-path>` before pulling. Never write credential, PII, account, or otherwise sensitive real-user screens to `/sdcard`; redact or fixture first. If the environment explicitly pre-approves shell redirection for `adb`, `adb -s <serial> exec-out screencap -p > <repo-evidence-path>/<artifact>.png` is acceptable and avoids device-side storage, but the transcript must record that redirection is approved for that command shape. Either way, validate the captured file is a non-empty valid PNG before relying on it: a failed pull, or an empty/zero-byte `exec-out` stream, means there is no host artifact — retry rather than counting it as evidence.
|
|
151
|
+
- A mobile screenshot that proves the app rendered is not automatically design acceptance evidence. If the design owner or page-slice review rejects the captured surface for weak hierarchy, blank-feeling composition, generic patched layout, clipped safe-area/keyboard behavior, or mismatch with the design checkpoint, route back to `product-ui-ux-design`'s **Rejected-surface rule** and re-capture after redesign; the app implementation waits on that design verdict instead of self-adjudicating taste. A technically successful but visually failed smoke leaves the slice `design-rejected` — blocking complete, MR-ready, and any normal or draft MR until the re-rendered surface is accepted, not only the completion claim.
|
|
152
|
+
- For platform enablement, verify each newly added platform with a real platform build and an install/run smoke on the relevant emulator or simulator. Adding the host project or passing one platform does not complete the slice; record the platform targets, commands, and screenshot or runtime evidence.
|
|
153
|
+
- For mobile runtime changes, device/emulator/simulator smoke is a completion gate when lower layers cannot prove the behavior. This includes changes to native capabilities, WebView/native bridge callbacks, foreground/background recovery, orientation/safe-area/keyboard behavior, storage/session restore, route/deep-link behavior, upload/media flows, permissions, and rendered loading/error/final states. If the runner is missing, first attempt normal setup; if still unavailable, stop at `pre-runtime-test ready` or `blocked` and name the owner, attempted commands, residual risk, and next unblock action. `pre-runtime-test ready` is handoff-only, not merge-ready, release-ready, or complete.
|
|
154
|
+
- For emulator readiness scripts, do not trust process launch or boot log text alone. Confirm the runner sees the target device, then verify direct device state such as `adb devices -l`, `adb -s <serial> get-state`, and platform boot readiness before calling Android ready; keep the serial in the output so later E2E commands target the same device.
|
|
155
|
+
- If the app or app-hosted H5 CI only builds or deploys packages, treat that as structural release evidence, not functional proof. Interaction, permission, lifecycle, upload/media, and recovery changes still need focused assertions plus rendered device or host-container smoke.
|
|
156
|
+
- Check accessibility labels, dynamic type/text scale, focus order, screen reader reachability, contrast, and touch targets.
|
|
157
|
+
- Check startup impact, scroll/frame stability, image loading, memory, app size, and network failure behavior when relevant.
|
|
158
|
+
- For release work, verify signing/flavors/schemes, environment config, store metadata implications, crash reporting, rollback/feature flag path, and smoke path on installable builds.
|
|
159
|
+
|
|
160
|
+
## Non-Negotiable Rules
|
|
161
|
+
|
|
162
|
+
- Do not treat one platform passing as proof that all platforms pass.
|
|
163
|
+
- Do not let reorderable, insertable, or filterable lists fall back to array-index identity. React Native `FlatList`/`SectionList` derive the key from `item.key` then `item.id` and only then the array index — so provide an explicit `keyExtractor` (or a stable `item.key`/`item.id`) whenever items lack a stable id; Flutter list children need a `ValueKey`/`ObjectKey` on stable item identity. Without a stable key a reorder/insert/delete makes the framework reuse element state on the wrong row (scroll offset, `TextField`/`TextEditingController` contents, animation progress, and selection/checkbox state bleed across rows, and inline `dispose` can hit the wrong element). Same reconciliation class as the web index-key rule.
|
|
164
|
+
- Do not call a Flutter platform scaffold complete until generated/local files have been reviewed, platform identifiers are aligned, and the target platform has fresh build plus runtime evidence.
|
|
165
|
+
- Do not hide a platform-specific failure by weakening shared behavior unless product explicitly accepts the difference.
|
|
166
|
+
- Do not add live network, credentials, or store-only dependencies to default fast tests.
|
|
167
|
+
- Do not ship UI changes without rendered inspection when the change affects layout, hierarchy, interaction, or visual state.
|
|
168
|
+
- Do not manufacture rendered evidence through repeated one-off temporary smoke files when an existing route, test, debug entry, fixture, or reusable harness can reach the same screen. Batch or reuse the harness and keep evidence collection inside the least-noisy approved command path.
|
|
169
|
+
- Do not add platform permission prompts, background work, biometric/payment flows, or push/deep-link behavior without explicit user-facing state and failure handling.
|
|
170
|
+
- Do not ship app-hosted H5/WebView UI with production-visible debug consoles, unbounded keyboard/layout fallbacks, or untested safe-area/orientation behavior on the target container.
|
|
171
|
+
- Do not ship debug-only instrumentation — debug bridges, in-app state/inspection servers, dev overlays/menus, network inspectors, verbose-token/remote-debug hooks, or mock-auth/bypass surfaces — in any build that can reach real users, real auth, or real PII (App Store/Play production AND TestFlight, enterprise, dogfood, internal/closed testing, staged rollout — scope by channel + data sensitivity, not an `isProduction` enum). Exclude it from the release dependency/target (not a runtime flag), and verify on the exact signed artifact per channel/variant with a release-blocking evidence row (digest + variant matrix + check output); a symbol grep alone or a manual pre-release removal is not the guard. See `references/mobile-quality-release.md` Release Readiness.
|
|
172
|
+
- Do not rely on CSS safe-area variables alone when the host app can inject physical status-bar or bottom-inset values; normalize them by device pixel ratio and verify iOS, Android, iframe, and browser fallbacks where applicable.
|
|
173
|
+
- Do not ship high-risk app actions with only optimistic UI or generic toast/error surfaces; users must be able to tell whether the operation is pending, succeeded, failed, retryable, blocked, or needs support after weak network, app restart, or foreground recovery.
|
|
174
|
+
- Do not treat a mobile API client as done until empty response, invalid JSON, non-2xx envelope, auth expiry, network failure, cancellation, and backend error message extraction are covered at the client or screen boundary when relevant.
|
|
175
|
+
- Do not scatter backend enum/string literals through app screens, deep links, native bridge payload handling, storage, analytics, or tests. Centralize finite-value parsing, display labels, defaults, and unknown-value behavior at the API/client-domain boundary, and keep raw literals only in clearly named boundary conversion tests that cover every known external value plus unknown/default behavior. Migrate existing non-boundary test raw literals for that value in the same pull request or mark each remaining use with `finite-value-debt: <task-ref> <owner> <deadline> <reason>`, even when the current slice does not introduce a new mapper.
|
|
176
|
+
- Do not debug app failures from code inspection alone when a runnable reproduction, trace, screenshot, or device log can be collected.
|
|
177
|
+
- Do not claim a mobile client fix is complete without naming the platform targets that were verified. If required device/emulator/simulator smoke is unavailable after remediation, the status is `pre-runtime-test ready` or `blocked`, not complete.
|
|
178
|
+
|
|
179
|
+
## Reference Loading
|
|
180
|
+
|
|
181
|
+
- For source provenance, current extraction boundary, and keep/merge/discard decisions, read `references/source-evidence-map.md` when auditing or re-extracting this skill.
|
|
182
|
+
- For joint extraction from Figma design source AND the mobile app workspace (with package class mapping, design-token cross-validation, deprecation-marker detection), read `../skill-extraction-workflow/references/two-source-extraction-pattern.md`. Use when both sources are available; produces aligned design + implementation rules with cross-source token validation.
|
|
183
|
+
- For platform selection, shared-vs-native tradeoffs, and client boundaries, read `references/mobile-platform-boundaries.md`.
|
|
184
|
+
- For Flutter architecture, state, navigation, platform channels, testing, performance, and release checks, read `references/flutter-dev.md`.
|
|
185
|
+
- For native Android architecture, Compose, lifecycle, testing, quality, and release checks, read `references/android-dev.md`.
|
|
186
|
+
- For native iOS architecture, SwiftUI/UIKit boundaries, state, accessibility, testing, performance, and release checks, read `references/ios-dev.md`.
|
|
187
|
+
- For Kotlin Multiplatform (KMP) + Compose Multiplatform — adoption decision matrix, source-set hierarchy + expect/actual, iOS framework integration (direct / CocoaPods / SPM), Kotlin/Native runtime, Compose MP iOS Stable scope, code-reuse tiering, build/test matrix, platform-stability table — read `references/kotlin-multiplatform.md`. Required when evaluating shared logic across Android + iOS, or considering Compose Multiplatform iOS adoption.
|
|
188
|
+
- For mobile testing, accessibility, performance, observability, and release readiness across platforms, read `references/mobile-quality-release.md`.
|
package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/agents/openai.yaml
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "App Cross-Platform Dev"
|
|
3
|
+
short_description: "Build Flutter, React Native, Android, and iOS app client features"
|
|
4
|
+
default_prompt: "Use $app-cross-platform-dev to design, implement, test, or release a mobile app feature across Flutter, React Native, native Android, or native iOS."
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Android Dev
|
|
2
|
+
|
|
3
|
+
## Architecture
|
|
4
|
+
|
|
5
|
+
- Follow Android's common layer split: UI layer for rendering and user events, data layer for repositories/data sources, optional domain layer when use cases are reused or complex.
|
|
6
|
+
- Keep screen state in ViewModel or a repo-approved state holder. Compose functions should render state and emit events rather than own durable business state.
|
|
7
|
+
- Hoist Compose state to the lowest common owner that needs to read or write it.
|
|
8
|
+
- Collect flows lifecycle-aware. Avoid leaking work across stopped screens.
|
|
9
|
+
- Keep repositories as data boundaries for network, database, cache, and sync decisions.
|
|
10
|
+
- **MVVM / MVI naming is rebrand, not contract** — the audit looks at: single source of truth (ViewModel / state holder owns durable state, no shadow copies), unidirectional flow (UI emits Intent / event → ViewModel produces new State → UI renders), side effects (navigation, toast, snackbar) routed through a one-shot event channel rather than re-emitted state. A repo that says "MVI" but mutates state directly from `@Composable` callbacks is closer to "scattered state with extra ceremony".
|
|
11
|
+
- **Modularization is a tool, not a goal**: split into feature / API / platform-adapter Gradle modules when build-time / team-ownership / variant-isolation evidence justifies it. Module boundary's job is to prevent cross-feature direct dependency, duplicated network clients, and duplicated state holders — not to maximize module count. A monolithic `:app` is fine for small teams; a 40-module graph with two engineers is overhead.
|
|
12
|
+
- **Coroutines + Flow are the default async substrate**: scope work to `viewModelScope` / `lifecycleScope` / `repositoryScope` (custom + `SupervisorJob`) — never `GlobalScope` in app code; expose state as cold `Flow` and convert to `StateFlow` / `SharedFlow` at the boundary that needs replay / sticky value; collect with `flowWithLifecycle(...)` / `collectAsStateWithLifecycle()` in UI so collection cancels off-screen. `LiveData` remains valid for older Java/Kotlin codebases but new code defaults to `StateFlow`. RxJava is acceptable in projects with deep Rx investment, not for new code.
|
|
13
|
+
- **Compose strong skipping mode**: introduced experimental in Compose Compiler 1.5.4; non-experimental in 1.5.13; **enabled by default starting Kotlin 2.0.20**. When enabled, all restartable composables become skippable regardless of parameter stability, and lambdas are auto-`remember`-wrapped — the optimization "greatly increases the number of composables that the runtime skips during recomposition" per Android docs (docs do NOT publish a specific recomposition % win; APK size impact is +4kB on the Now In Android sample). For projects on Kotlin <2.0.20, opt in via `composeCompiler { enableStrongSkippingMode = true }`; for projects on 2.0.20+, verify lambda capture semantics did not change before assuming default-on is safe.
|
|
14
|
+
|
|
15
|
+
## Platform Capabilities
|
|
16
|
+
|
|
17
|
+
- Use platform components for background work, notifications, permissions, camera/media/files, and app links when the feature needs OS-level behavior.
|
|
18
|
+
- Model permission denied, permanently denied, unavailable hardware, interrupted background work, and app restore as explicit states.
|
|
19
|
+
- Keep build variants, flavors, signing, min/target SDK, ProGuard/R8, and manifest changes reviewable.
|
|
20
|
+
- **Android 14+ Foreground Service strictness**: every started foreground service MUST declare a `foregroundServiceType` in the manifest (missing → `MissingForegroundServiceTypeException`) AND declare the matching FGS permission in the manifest (`FOREGROUND_SERVICE_LOCATION` / `_CAMERA` / `_MICROPHONE` / `_DATA_SYNC` etc — these are NORMAL manifest permissions, auto-granted, not runtime-revocable). Per-type runtime prerequisites must ALSO be satisfied (e.g., `camera` FGS requires `CAMERA` runtime permission already granted; `location` requires `ACCESS_FINE_LOCATION` / `_COARSE`; `microphone` requires `RECORD_AUDIO`; `dataSync` has no extra runtime prerequisite). Missing prerequisites → `SecurityException`, not deprecation warning. Audit FGS start sites whenever permission, media, or sync code is touched.
|
|
21
|
+
- **Android 15 (targetSdk 35) edge-to-edge default**: apps targeting API 35 render edge-to-edge by default; insets handling (system bar / nav bar / IME) becomes mandatory for every screen — windows no longer auto-pad. Run edge-to-edge / insets visual check on every screen with status-bar / nav-bar overlap before bumping targetSdk to 35.
|
|
22
|
+
- **Baseline Profile + Macrobenchmark for startup-critical surfaces**: generate a Baseline Profile (Android Studio / `androidx.benchmark.macro` library) for launch + first-interaction paths; install it with the AAB so the included code paths are AOT-compiled at install time and avoid interpretation / JIT on first launch. Verify startup gains via Macrobenchmark, not by stopwatch.
|
|
23
|
+
- **Splash Screen API (Android 12+, `androidx.core:core-splashscreen` backport to API 23+)**: stop hand-rolling a `SplashActivity` — the system splash is constructed from the app launcher icon + `windowBackground`. Migrate any custom splash to `SplashScreen` API; the compat library provides a consistent look across all supported Android versions. Use `setKeepOnScreenCondition` for the "wait for first data" pattern instead of an extra screen.
|
|
24
|
+
- **Predictive Back enforcement timeline**: Android 14 (API 34) introduced predictive back as opt-in via manifest `android:enableOnBackInvokedCallback="true"`. Android 15 (API 35) removed the developer option — opt-in apps see system back-to-home / cross-task / cross-activity animations, but opting in remains required. **Android 16 (API 36): predictive back is default and enforced** for apps targeting API 36 — `onBackPressed()` is no longer called and `KeyEvent.KEYCODE_BACK` is no longer dispatched; migrate to `OnBackPressedDispatcher` / `OnBackPressedCallback` (View system) or `BackHandler` / `PredictiveBackHandler` (Compose). Temporary opt-out via `android:enableOnBackInvokedCallback="false"` exists but is announced to stop working at targetSdk 37.
|
|
25
|
+
|
|
26
|
+
## Data Persistence
|
|
27
|
+
|
|
28
|
+
- **DataStore (Preferences DataStore for key-value, Proto DataStore for typed schema) replaces SharedPreferences for new code**. SharedPreferences has a sync API that's unsafe to call on the UI thread, no error signal, no transactional API; DataStore is async (Coroutines + Flow), handles migration / corruption explicitly. Preferences DataStore is the SharedPreferences shape without the bugs; Proto DataStore adds schema + type safety via protobuf. For complex data with partial updates or referential integrity, use Room — DataStore is for small / simple datasets only.
|
|
29
|
+
- **Sensitive credentials use the Android Keystore directly (or existing platform crypto APIs)** — Keystore manages keys in hardware-backed secure storage when available; never store raw tokens in regular SharedPreferences / files. The Jetpack wrapper `androidx.security:security-crypto` (`EncryptedSharedPreferences` / `EncryptedFile` / `MasterKey`) deprecated all APIs in 1.1.0-beta01 on 2025-06-04 (stable 1.1.0 on 2025-07-30); official direction is platform APIs + direct Android Keystore use — no Jetpack-wrapper successor. Existing projects on `security-crypto` migrate to direct Keystore + a project-owned crypto wrapper.
|
|
30
|
+
|
|
31
|
+
## Dependencies And Toolchain
|
|
32
|
+
|
|
33
|
+
- **KSP (Kotlin Symbol Processing) over KAPT**: Kapt is in maintenance mode and incompatible with the built-in Kotlin compiler plugin; the recommendation is to migrate. KSP is up to 2x faster on Kotlin-aware processors (no Java-stub generation step); for most libraries the migration is just renaming `kapt(...)` to `ksp(...)` in dependency declarations because the processor ships in the same artifact. Hilt, Room, Moshi, and most modern Android codegen libs support KSP. Stay on KAPT only for processors that have not shipped a KSP variant.
|
|
34
|
+
- **`libs.versions.toml` (Gradle Version Catalog) for dependency declarations**: single source of truth for versions across multi-module builds; type-safe accessor generated by Gradle; dependency-update tooling reads the catalog directly. New modules should consume from the catalog, not declare versions inline.
|
|
35
|
+
- **`androidx.startup` (App Startup library) for SDK initializer order**: replace ad-hoc `Application.onCreate` blocks with explicit `Initializer<T>` classes; declare dependencies between initializers so order is explicit; CI / build can verify the graph. Critical when multiple SDKs (analytics, crash, push, feature-flag) need init order.
|
|
36
|
+
|
|
37
|
+
## Theme And Brand Color
|
|
38
|
+
|
|
39
|
+
The shared design discipline (token sourcing, multi-platform alignment, source-vs-export rules, three-layer evidence) is owned by `product-ui-ux-design/references/multi-project-token-consistency.md` and `design-system-source-of-truth.md` — consult those before writing or auditing this section's implementation rules.
|
|
40
|
+
|
|
41
|
+
Android-specific anti-patterns observed across native Compose subprojects:
|
|
42
|
+
|
|
43
|
+
- **IDE / Material You scaffold colors left as dead-code declarations in `Color.kt` / `Theme.kt`**: new Compose modules generated by Android Studio ship with `Purple40 / Purple80 / PurpleGrey40 / PurpleGrey80 / Pink40 / Pink80` plus matching `lightColorScheme(primary = Purple40, ...)` / `darkColorScheme(primary = Purple80, ...)` blocks. When the team adds a brand `primaryColor = Color(0xFF<brand>)` and routes it through a separate `generateColorScheme(primaryColor, ...)` builder, the original Purple/Pink declarations and the scaffold `ColorScheme` vals usually stay in the file unreferenced. They are inert at runtime, BUT they confuse onboarding ("which is the real brand color?") and make later regex / search-and-replace refreshes ambiguous. Delete the unreferenced scaffold declarations once the brand color is wired; do not keep them "for reference".
|
|
44
|
+
- **`AppTheme(dynamicColor: Boolean = true, ...)`-style dead parameter**: scaffold `@Composable` themes accept a `dynamicColor` flag intended to switch to `dynamicLightColorScheme(LocalContext.current)` on Android 12+. When the team overrides the body to call its own `generateColorScheme(brandColor, ...)` unconditionally and never reads the flag, the parameter becomes a footgun — callers think Material You is opt-in. Either honor the flag (branch on `Build.VERSION.SDK_INT >= S` and dispatch dynamic vs brand scheme) or remove the parameter; do not ship a no-op flag.
|
|
45
|
+
- **Vendor-default literal leak in custom theme**: a brand theme that still contains literals identifiable as Google Material defaults — `Color(0xFFD93025)` (Google red), `Color(0xFF6750A4)` (Material You purple), `Color(0xFF03DAC5)` (Material teal), `Color(0xFF1976D2)` (MUI blue), `Color(0xFFBB86FC)` (Material light purple), etc — inside `errorColor`, `secondaryColor`, fallback values, or per-component overrides. Same pattern as the cross-stack rule in `multi-project-token-consistency.md` "Vendor-default literal leaked into a custom theme": the value looks deliberate because someone typed it, so generic literal-detection passes; but brand refresh skips it. Detection: grep the theme module for the per-version Material / MUI default palette values. A hit resolves to one of three classes per the shared rule: **leak** (replace with brand token), **deliberate documented reuse** (keep with rationale comment), or **legitimate convergence** (brand role independently resolves to the same hex — keep but reference the brand token, not the literal).
|
|
46
|
+
- **Algorithmic secondary / tertiary derived from primary without designer sign-off** — applies to **custom** algorithmic derivation, NOT to standards-based Material You: patterns like `secondaryColor = Color.hsv(hue = (primaryColor.hue + 30) % 360, saturation = 0.8f, value = 0.9f)` or `SecondaryColor = primary.copy(alpha = 0.2f)` are custom derivations that skip the designer for every derived state. See the shared rule in `multi-project-token-consistency.md` Anti-Patterns. Acceptable IF the file carries a one-line provenance comment naming the algorithm and the designer sign-off date, AND brand-refresh QA includes a derived-color visual check. **Material You carve-out**: `dynamicLightColorScheme(LocalContext.current)` / `dynamicDarkColorScheme(...)` (Android 12+ wallpaper-derived) and standards-based `ColorScheme.fromSeed(seedColor = brandColor)` are acceptable as the design policy when documented with library/version, `DynamicSchemeVariant` if set, accessibility/contrast checks against the brand seed, and visual QA on canonical screens. Designer sign-off applies to the policy adoption + the seed/canonical-screen pass, NOT to every runtime-generated secondary/tertiary value (incoherent for wallpaper-derived schemes).
|
|
47
|
+
- **Per-app duplicated brand literal vs shared design-token module**: when N native Android apps in one product each declare `val PrimaryColor = Color(0xFF<brand>)` in their own `Color.kt`, a brand refresh becomes an N-place edit and apps silently fall out of sync. The fix is a shared design-token Gradle module (or published artifact) consumed by every app — same pattern as the shared theme-package rule on the web side.
|
|
48
|
+
|
|
49
|
+
### WebView-wrapper Android shells
|
|
50
|
+
|
|
51
|
+
A native Android app whose main product flows are hosted in a `WebView` plus a thin shell of native helper screens (network error, photo upload, auth bridge, splash, settings) is a **hybrid WebView shell**. The audit verdict is per-surface, not per-app: WebView-hosted product flows route their brand audit to the loaded web app; native-owned shell screens (splash, login, settings, offline / network-error fallback, permission prompts, native modal flows, status-bar / safe-area chrome, deep-link landing) are audited as native surfaces with normal three-layer evidence.
|
|
52
|
+
|
|
53
|
+
- Detection signals: small native source count relative to the app's apparent feature surface, `WebView` / `WKWebView` plus a JS bridge as the primary UI component, no Compose / View-system screens for the main product flows, vendor pods or AARs for JS bridging (`WebViewJavascriptBridge` and equivalents).
|
|
54
|
+
- Reporting rule: the verdict is **per-surface, not per-app**. WebView-hosted product flows → `native-theme: not-applicable (webview-hosted, brand audited via loaded URL)`; native-owned surfaces in the SAME app (splash, login, settings, offline / network-error fallback, permission prompts, native modal flows, status bar / safe-area chrome, deep-link landing, updater dialogs) → `audit native brand tokens normally`. A whole-app `not-applicable` verdict is wrong whenever the app ships ANY native screen with brand-relevant chrome; that wording lets auditors skip visible surfaces blindly. Confirm the loaded web URL's brand alignment separately for the WebView portion.
|
|
55
|
+
- Wrapper-specific risks that DO belong to native: WebView JS-bridge auth, file-upload / camera permissions plumbed through the WebView, status-bar / safe-area / system-back integration, deep-link handoff into the WebView URL, offline / network-error native fallback screen branding. Those still need native attention even when the visual brand lives in the web app.
|
|
56
|
+
|
|
57
|
+
## Vendor AIDL Hardware Service Binding
|
|
58
|
+
|
|
59
|
+
When the app runs on a dedicated / kiosk / vendor-supplied Android device and needs hardware capabilities exposed by a vendor-installed system service (printer driver, scanner, payment terminal, scale, RFID reader, OEM firmware control like timed power-on/off, silent install, status-bar display), the integration is via AIDL service binding to the vendor's service — not via root, not via `Runtime.exec`, not via fragile reflection on hidden APIs:
|
|
60
|
+
|
|
61
|
+
- **AIDL interface is a contract artifact owned by the vendor, copied into the app under a documented license**: the vendor publishes the `.aidl` files (or an SDK that includes them); the app copies them into `app/src/main/aidl/<vendor-package>/` preserving the vendor's package path. Before the copy lands, confirm the vendor SDK's license permits source redistribution / inclusion (some vendor SDKs ship `.aidl` under a license that allows binary linking only; copying source into the app repo can be a license violation). Record per-binding: vendor name, SDK / AIDL source version, license, the vendor doc URL that authoritatively describes the methods. Vendor SDK updates rev the AIDL file; the contract version is a per-vendor track, not the app's version.
|
|
62
|
+
- **One `ServiceConnection` per vendor service, with explicit handlers for ALL Binder lifecycle callbacks AND a circuit-breaker terminal state**: `<Iface>.Stub.asInterface(service)` runs on `onServiceConnected`. All four Binder lifecycle callbacks must be handled, each for a distinct failure mode: `onServiceDisconnected` (process killed by framework / OOM / firmware reboot) → reconnect; `onBindingDied` (the binding itself died, typical for vendor-service package update / OTA replace) → unbind + rebind, NOT just reconnect, because the dead binding never recovers without re-binding; `onNullBinding` (`bindService` returned non-null but the service returned `null` from `onBind` — the service is installed but refuses our identity, typical for signature-protected services) → fail-closed terminal "vendor service refused binding" state; explicit `false` return from `bindService` (component not present at all) → fail-closed terminal "vendor service not installed" state. Reconnect uses bounded exponential backoff AND a maximum-attempts / maximum-window circuit breaker (typical: stop after N attempts over T minutes); when the circuit opens, the binding enters a stable "vendor service unavailable" state until a package-replace broadcast (`ACTION_PACKAGE_ADDED` / `_REPLACED` for the vendor package) or explicit user action retries — silent infinite reconnect spams logs and battery without ever recovering.
|
|
63
|
+
- **Wrap every AIDL call in `RemoteException` handling**: AIDL calls cross a Binder boundary and can throw `RemoteException` (vendor service died, transaction failed, parcel too large). Bubble these as typed errors with the vendor + capability name in the message (`<vendor>.<method> failed: <cause>`) so logs identify which vendor service was unreachable. Returning `null` silently from a vendor-service wrapper is the bug class that lets the hardware feature degrade unnoticed for weeks.
|
|
64
|
+
- **Capability detection happens at binding time, not at call time**: when the binding succeeds, probe the vendor service's `getManufacturer()` / `getVersion()` / capability-discovery method once, cache the result, and expose `isAvailable(capability)` to callers. Callers gate UI affordances on `isAvailable`; they do not catch `RemoteException` per call as the availability check. Vendor services with no version probe are wrapped in a per-method capability map updated on each known-vendor revision.
|
|
65
|
+
- **AIDL service binding is a `<service>` declaration in the vendor app, not in our app**: the binding target is a `ComponentName(<vendor-package>, <vendor-service-class>)` — verify the package + class in vendor docs before shipping. A `bindService` to a non-existent component returns `false` silently; check the return value and fail closed with a "vendor service not installed" state, NOT a generic "hardware unavailable" toast.
|
|
66
|
+
- **USB-attached peripherals (printer, scanner) go through `UsbManager` + permission broadcast, not AIDL**: AIDL-bound vendor services are for OEM-firmware capabilities (timed boot, status bar, silent install). Plug-in USB hardware uses `UsbManager.requestPermission()` + a `BroadcastReceiver` for `ACTION_USB_PERMISSION` / `ACTION_USB_DEVICE_ATTACHED` / `ACTION_USB_DEVICE_DETACHED`. Mixing the two paths in one class is acceptable; conflating them in the rule is not — the auth model and the failure mode are different.
|
|
67
|
+
- **Privileged AIDL methods (silent install, reboot, shutdown) require the device's vendor signature or platform permission**: confirm the privilege model with the vendor before the feature ships; an app distributed via Play Store generally cannot exercise `installPackage` / `reboot` against vendor services from third-party APKs. Ship the privileged path only when the device is vendor-flashed with the app pre-installed under the vendor's signature.
|
|
68
|
+
|
|
69
|
+
## Shared-Device Inactivity (Compose)
|
|
70
|
+
|
|
71
|
+
When the Android app runs on a shared device (kiosk terminal, counter staff terminal, intake tablet) and needs inactivity-driven session handoff: the **full cross-platform shared-device contract** lives in `web-react-dev/references/web-ui-quality.md` (Shared Device And Inactivity Session) — full input event set, throttled reset, durable shared timestamp, cross-tab/window coordination, terminal-to-neutral, deployment-context timeout split, server-side independent session expiry. A Compose implementation MUST satisfy the full contract, not only the local-timer subset; a `LaunchedEffect` + `remember` timer that ignores the durable-timestamp / cross-process coordination rules is the source-observed shorthand, NOT the rule. Compose-specific implementation guidance for satisfying the full contract:
|
|
72
|
+
|
|
73
|
+
- The inactivity handler is a top-level `@Composable` that wraps the route content and exposes a `resetTimeout: () -> Unit` slot to children that need to register additional activity sources.
|
|
74
|
+
- The countdown loop runs inside a `LaunchedEffect` keyed on the dialog-visible state; on dialog dismissal the effect cancels via standard coroutine cancellation — no manual cleanup needed.
|
|
75
|
+
- Input event observation: pointer/touch events are observed via `Modifier.pointerInput` on the wrapping `Box`. Key events (hardware keyboard, DPAD, barcode scanner that emulates keypresses, remote control) need a focus-bearing root — `Modifier.onKeyEvent` only fires when the node or a focused descendant is focused, so the root must be `Modifier.focusRequester(focusRequester).focusable()` with a `LaunchedEffect { focusRequester.requestFocus() }` AND/OR the activity-level `dispatchKeyEvent` override forwards keys into the inactivity handler. The modifier order is significant: `focusRequester` must be applied BEFORE `focusable` in the chain — `.focusable().focusRequester(...)` reverses the wiring and `requestFocus()` silently no-ops, leaving the key-event capture broken. Without one of these, key-only activity (a user paging via DPAD on a kiosk remote) does NOT reset the timer and the app misfires the terminal action.
|
|
76
|
+
- The shared-monotonic-timestamp cross-tab rule from the web side translates on Android to a durable shared store (`DataStore` / `SharedPreferences` / Room with `lastActivityAt` / `expiresAt`), updated by activity and re-read immediately before the terminal action. `BroadcastChannel` on web maps to a `BroadcastReceiver` (cross-process) or a process-level `Flow` (in-process multi-Activity / multi-Fragment). The durable store is authoritative; broadcasts are notification only — process restart, framework recreation, or backgrounded-Activity resumption all rely on re-reading the durable store, never on in-memory state.
|
|
77
|
+
- Compose composition lifecycle differs from React unmount: a `LaunchedEffect` cancels on key change OR on the composition leaving — but Activity / Fragment lifecycle (foreground/background) and process death are separate dimensions. The terminal-to-neutral rule applies on process-resume (read durable `expiresAt`, terminate if exceeded), not only on composition recomposition.
|
|
78
|
+
|
|
79
|
+
## Tests And Verification
|
|
80
|
+
|
|
81
|
+
- Unit test state holders, use cases, repositories with fakes, mappers, validators, and error translation.
|
|
82
|
+
- Compose/UI tests should assert visible states and interactions, not just launch screens.
|
|
83
|
+
- Instrumented tests belong to flows requiring real Android framework behavior.
|
|
84
|
+
- Verify app links, notification opens, permission prompts, process death/state restore, and offline/cache behavior when touched.
|
|
85
|
+
- **Test tooling stack**: JUnit 5 (`useJUnitPlatform()` in Gradle) for new **local JVM** unit tests; instrumented (`androidTest`) tests still run on the JUnit 4 runner by default unless extra setup is added (e.g., `de.mannodermaus.junit5`). MockK for mocking (Kotlin-native, supports coroutines + extension functions / final classes that Mockito needs special config for); Robolectric for JVM-side Android-context tests (faster than instrumented but not a substitute when real Android framework behavior matters); Turbine for `Flow` / `SharedFlow` testing (manages collection lifecycle + assertion-on-emission). Screenshot regression goes through Roborazzi (JVM-based, Robolectric-style) or Paparazzi (LayoutLib-based, no emulator) — scope to design-system primitives and visually-risky surfaces, not every screen.
|
|
86
|
+
|
|
87
|
+
## Quality
|
|
88
|
+
|
|
89
|
+
- Check startup time, frame stability, list performance, memory, image loading, network failures, accessibility labels, touch targets, contrast, and font scaling.
|
|
90
|
+
- Prefer existing Gradle wrappers and CI tasks over raw commands.
|
|
91
|
+
- **StrictMode + LeakCanary as dev/staging guardrails**: enable `StrictMode.setThreadPolicy` (detect disk / network on main thread) and `setVmPolicy` (leaked closables / cursors / activities) in debug builds — Strict findings are violation-class evidence of bugs that ship unnoticed. Add LeakCanary to debug / staging variants; activity / fragment leaks surface immediately in dev rather than via support tickets in production. Both stay out of release builds.
|
|
92
|
+
- **WorkManager / CoroutineWorker for deferrable background work**: any task that should survive process death / app close / device reboot (sync, upload, scheduled refresh, deferred notification) goes through WorkManager, not raw `JobScheduler` / `AlarmManager` — WorkManager handles backoff, constraints (network / charging / idle), chained work, and Doze-mode compatibility. Use `CoroutineWorker` for Kotlin code; `RxWorker` for Rx codebases. Foreground services (per Android 14+ FGS rule above) are for actively-running visible work, not deferrable.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Flutter Dev
|
|
2
|
+
|
|
3
|
+
## Architecture
|
|
4
|
+
|
|
5
|
+
- Start from the existing repo pattern. If no pattern exists, use feature-first structure with presentation/widgets, state/controller/view model, data/repository, API client, models, and platform adapters.
|
|
6
|
+
- Keep widgets declarative and thin. Heavy mapping, validation, side effects, and command handling belong outside `build`.
|
|
7
|
+
- Pick state management deliberately. Riverpod, Bloc, Provider/ChangeNotifier, ValueNotifier, or built-in state can all be valid; do not introduce a new framework when the repo already has a consistent one.
|
|
8
|
+
- Separate ephemeral widget state from app/domain state. Durable state needs a clear owner and lifecycle.
|
|
9
|
+
- Use explicit navigation and deep-link handling. Treat route params as typed contracts and verify back behavior.
|
|
10
|
+
- **Widget mental model**: `StatelessWidget` for pure render-from-props; `StatefulWidget` only when the widget itself owns ephemeral interaction state that does not belong in a state container. For dependency injection across the tree, prefer `InheritedWidget` (broadcast change) / `InheritedModel` (selective subtree rebuild by aspect) over global singletons. App / domain state lives in the chosen state container (Riverpod / Bloc / etc.), not in `StatefulWidget`.
|
|
11
|
+
- **Hooks and DI carve-outs**: `flutter_hooks` is a legitimate alternative composition style — adopt project-wide if the team chose it, not as a sprinkle. `get_it` / `GetIt` is acceptable as a service locator at app composition root, but treat it as a controlled trade-off — global mutable locators erode testability and hide dependency graphs; prefer constructor injection or Riverpod providers for new code. Both default to "not introduced if absent" per the existing state-management rule.
|
|
12
|
+
- **Riverpod 3 migration breaks several API shapes**: automatic retry of failing providers is on by default; provider failures rethrow as `ProviderException` (not the original error); `StateProvider` / `StateNotifierProvider` / `ChangeNotifierProvider` are LEGACY and moved to `package:riverpod/legacy.dart` (new code uses `NotifierProvider` / `AsyncNotifierProvider`); `AsyncValue` is now `sealed` (enables exhaustive `switch` pattern matching); `valueOrNull` renamed to `value`. Offline persistence and mutation support are experimental. Verify before upgrading existing Riverpod 2 projects.
|
|
13
|
+
- **App lifecycle observation**: `AppLifecycleListener` (`flutter/widgets`) is the newer, preferred API over `WidgetsBindingObserver` for observing app lifecycle state — callback-based, no class inheritance required, supports `onExitRequested` for desktop close-window negotiation. `AppLifecycleState.hidden` (added Flutter 3.13) is part of the standard state set across both APIs. `WidgetsBindingObserver` remains valid for existing code and for combined observation needs (metrics + accessibility + focus + lifecycle in one observer).
|
|
14
|
+
|
|
15
|
+
## Codegen And Toolchain
|
|
16
|
+
|
|
17
|
+
- **Codegen stack**: `freezed` (immutable data classes + unions/sealed classes) + `json_serializable` (typed JSON) + `build_runner` (build orchestrator) is the canonical pattern for typed models and serialization. Generated files (`*.g.dart`, `*.freezed.dart`) are checked into the repo or regenerated in CI; do not depend on developers running `build_runner` ad-hoc. When using Riverpod, `riverpod_generator` + `riverpod_annotation` is the canonical codegen path — only adopt if the project already uses Riverpod.
|
|
18
|
+
- **Flutter SDK version pinning**: pin the Flutter SDK version per repo via FVM (`.fvmrc` / `.fvm/`) or the equivalent toolchain manager; CI uses the same pinned version. An unpinned project drifts across developer machines; build-vs-runtime mismatch is a class of bugs unique to cross-platform SDKs.
|
|
19
|
+
- **Dart Macros are indefinitely paused (Dart team Jan 2025)** — do NOT bet on macros for production code generation. The Dart team paused implementation work to focus on improving `build_runner` and shipping **augmentations** (one feature prototyped as part of macros) as a standalone language feature. `build_runner` + `freezed` + `json_serializable` remains the canonical codegen path; `freezed 3.0` and successor codegen tools target the post-macros world.
|
|
20
|
+
|
|
21
|
+
## Platform Integration
|
|
22
|
+
|
|
23
|
+
- Keep platform channels, plugins, and native SDK calls behind adapters.
|
|
24
|
+
- Represent permission and capability failures in UI state, not only logs.
|
|
25
|
+
- For add-to-app, define ownership of the host app, Flutter module, build pipeline, route handoff, and lifecycle events.
|
|
26
|
+
- **Pigeon vs MethodChannel vs FFI** — pick by surface, not preference: **Pigeon** (codegen) for typed, evolving, multi-platform contracts where long-term type safety across Flutter / Android / iOS / future targets matters — prefer Pigeon when the contract will change over time or carries structured types. **MethodChannel** (manual) for small, stable, one-off capabilities, dynamic payloads, or bridge debugging where the codegen overhead is not worth it. **FFI** for C-ABI native libraries and measured perf paths (image / crypto / parsing) — NOT for routine Kotlin/Swift business APIs (FFI does not target Kotlin/Swift directly and does not cover Web).
|
|
27
|
+
|
|
28
|
+
## Cross-Platform Target Matrix
|
|
29
|
+
|
|
30
|
+
- **Cross-platform is not "one UI fits everywhere"**: each target (mobile iOS / mobile Android / web / desktop macOS / desktop Windows / desktop Linux) has its own input model (touch / pointer + keyboard / mouse + keyboard), window model, navigation conventions, accessibility APIs, plugin support matrix, and performance profile. Maintain a platform capability matrix per project: which targets are in scope, which plugins are verified on each, which screens have target-specific layout overrides, which capabilities are stubbed / disabled on each.
|
|
31
|
+
- **Material / Cupertino / Adaptive**: Material for explicit Material-system apps; Cupertino for explicit iOS-native look; **adaptive widgets** (e.g. `Switch.adaptive`, `Slider.adaptive`, `CircularProgressIndicator.adaptive`) when the surface should follow platform conventions automatically. Mixing without a portfolio rule produces inconsistent feel; record the choice in the project's design contract.
|
|
32
|
+
- **Flutter Web renderers**: per current Flutter docs, only two renderers exist: **CanvasKit** (default for normal builds — Skia compiled to WebAssembly, ~1.5MB) and **skwasm** (selected when building with `--wasm` if the browser supports WasmGC, falls back to CanvasKit otherwise — more compact ~1.1MB, multi-threaded rendering). The **HTML renderer is no longer documented in current Flutter docs** — projects pinned to old SDK versions using HTML renderer need an explicit migration plan to CanvasKit (default) or `--wasm` / skwasm before SDK upgrade. Web targets also need SEO / document-heavy considerations Flutter does not natively address — for content-dominant pages, a static / SSR-rendered web surface alongside the Flutter app is usually the right architecture.
|
|
33
|
+
- **Web interop migration**: `dart:js_interop` (released with Dart 3.3, Feb 2024) replaces `package:js` / `dart:js`; `package:web` replaces `dart:html` and the other browser libraries. Legacy JS interop is deprecated as of Dart 3.7 (Feb 2025). New Web code uses `dart:js_interop` + `package:web`; existing Web code on `dart:html` has migration debt — required for Wasm compilation (Wasm only works with the new interop). Migration guide is at `dart.dev/interop/js-interop/package-web`.
|
|
34
|
+
- **Federated plugin architecture** for multi-platform plugins: split into platform-interface package (`<plugin>_platform_interface`) + per-platform implementation packages (`<plugin>_android`, `<plugin>_ios`, `<plugin>_web`, etc.) + app-facing package (`<plugin>`). Per Flutter docs, federated is **optional** — recommended / expected for shared multi-platform plugins where independent platform implementations or endorsed third-party additions matter, optional for single-package plugins. The structure makes per-platform contribution and version skew explicit; adopt when those concerns are real, not as ceremony.
|
|
35
|
+
- **Multi-package Flutter repo**: when a Flutter project grows into multiple packages (app + shared libs + plugins), Melos / Dart workspaces is a common monorepo orchestration choice. Deep monorepo governance routes to the team's repo / tooling owner; Flutter-side responsibility is keeping per-package `pubspec.yaml` resolvable and CI building each package.
|
|
36
|
+
|
|
37
|
+
## Theme And Brand Color
|
|
38
|
+
|
|
39
|
+
Shared design discipline lives in `product-ui-ux-design/references/multi-project-token-consistency.md`; consult it before applying the Flutter-specific implementation rules below.
|
|
40
|
+
|
|
41
|
+
- **`MaterialApp(theme: ThemeData(...))` must reference a brand theme, not the default**: an app whose entry is `MaterialApp(theme: ThemeData())` / `MaterialApp(theme: ThemeData.light())` / `MaterialApp()` with no `theme` arg renders the Material default palette. This is the Flutter equivalent of the empty framework-wrapper anti-pattern in `multi-project-token-consistency.md`. Audit signal: `MaterialApp.theme` must reach a brand `ThemeData` built from the project's design tokens (not the framework default); `CupertinoApp.theme` must reach a brand `CupertinoThemeData` (NOT `ThemeData`); a `MaterialApp` wrapping `CupertinoApp`-style screens still needs `MaterialApp.theme` populated since Material widgets read from it.
|
|
42
|
+
- **Flutter scaffold colors left as dead-code declarations**: `flutter create` ships sample colors (`Colors.blue`, `Colors.deepPurple` as the seed in `MaterialApp.theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple))`). When the team replaces the seed with a brand value but leaves the original scaffold-color constants declared elsewhere in `theme.dart` / `colors.dart`, those become onboarding noise — same shape as the Android Compose `Purple40/Pink40` dead-code anti-pattern in `android-dev.md`. Delete unreferenced scaffold colors once the brand value is wired.
|
|
43
|
+
- **Vendor-default literal leak in custom theme** (cross-stack rule): `Color(0xFFD93025)` / `Color(0xFF6750A4)` / `Colors.deepPurple` / Material 3 default tonal palette values typed into the brand layer fall under the shared anti-pattern in `multi-project-token-consistency.md`. Detection: grep `theme.dart` / `colors.dart` / `ThemeData` builder for known Material default literals. A hit resolves to one of three classes per the shared rule: **leak** (replace with brand token), **deliberate documented reuse** (keep with rationale comment), or **legitimate convergence** (brand role independently resolves to the same hex — keep but reference the brand token, not the literal).
|
|
44
|
+
- **Algorithmic secondary / tertiary derived without designer sign-off** — applies to **custom** derivation patterns; standards-based Material You has a carve-out: Flutter's `ColorScheme.fromSeed(seedColor: brandColor)` algorithmically derives the entire tonal palette from one seed. This IS the Material You design intent. Acceptable as the design policy when the project records (a) the Material You variant in use (M3 default vs `DynamicSchemeVariant.tonalSpot` / `vibrant` / `expressive` / etc.), (b) accessibility/contrast checks against the brand seed, (c) visual QA on canonical screens at the seed value. Designer sign-off applies to the policy adoption + the seed/canonical-screen pass, NOT to every runtime-generated secondary/tertiary value. Silent reliance on `fromSeed` without ANY of (a)/(b)/(c) is the failure mode. Custom HSV-shift / alpha-tint / complementary derivations have stricter sign-off requirements per the shared anti-pattern in `multi-project-token-consistency.md`.
|
|
45
|
+
- **`ThemeExtension<T>` for brand-specific additions beyond `ThemeData`'s fixed fields**: subclass `ThemeExtension<T>`, define brand-specific fields (extra colors, spacing tokens, custom typography roles), implement `copyWith` + `lerp` for smooth transitions; register via `ThemeData(extensions: [<MyExtension>(...)])`; read via `Theme.of(context).extension<MyExtension>()`. This is the official path for "Material doesn't cover this brand-specific token". Do not create a parallel `BrandTheme` `InheritedWidget` SOLELY to host Material / brand tokens that `ThemeExtension` would carry — that path breaks `Theme.of(context).extension` lookups and animation interpolation. A separate app-domain `InheritedWidget` for non-theme runtime config (feature flags, user role, environment) is still valid.
|
|
46
|
+
- **Material 3 Expressive (Google I/O 2025): watch, do not adopt as Flutter default yet**. Material 3 Expressive is currently shipping for Wear OS via dedicated Jetpack libraries (Wear Compose Material 3 + Wear ProtoLayout Material 3) and Android handheld surfaces; Flutter Material widget set has not yet adopted Expressive as a production-ready default. Track Flutter docs `docs.flutter.dev/ui/design/material` and Flutter release notes for adoption; until then, current `ColorScheme.fromSeed` + Material 3 remains the production guidance.
|
|
47
|
+
|
|
48
|
+
## Tests And Verification
|
|
49
|
+
|
|
50
|
+
- Unit test pure mapping, validators, state reducers/controllers, repository behavior, error translation, cache policy, and retry decisions.
|
|
51
|
+
- Widget test loading/empty/error/success states, gestures, forms, validation, route entry, and permission-denied UI.
|
|
52
|
+
- Use golden or screenshot tests when the repo already supports them or when the UI surface is visually risky.
|
|
53
|
+
- Integration test critical device flows, plugin paths, deep links, auth/session behavior, and offline/retry flows.
|
|
54
|
+
- Run analyzer/format/build for the changed target and inspect a rendered screen before delivery.
|
|
55
|
+
- **Mocking**: prefer `mocktail` for Flutter (null-safety friendly, no codegen / `build_runner` dependency, simpler stub API). `mockito` remains valid for projects already using it, but new code in the codegen + null-safety era leans `mocktail`.
|
|
56
|
+
- **Golden / screenshot testing** (`golden_toolkit` / `alchemist`): apply when the surface is visually high-risk (design-system primitives, financial / data-dense forms, complex layouts the design team reviews). Do NOT golden every screen — golden suites are maintenance debt, baselines drift across font / OS / renderer, and per-developer flakiness is real. Scope per-project to the screens whose visual regression cost is high.
|
|
57
|
+
|
|
58
|
+
## Errors And Diagnostics
|
|
59
|
+
|
|
60
|
+
- **Three-layer error capture for public / staged-rollout / high-risk shipping apps**: (1) `FlutterError.onError` catches errors thrown during widget build / framework callbacks; (2) `PlatformDispatcher.instance.onError` (or `runZonedGuarded` in older patterns) catches errors outside the Flutter framework — uncaught async, isolate errors, native bridge errors propagating up; (3) the `ErrorWidget.builder` controls what users see when build itself fails (default red error screen is for debug, never for production). Wire all three to the crash backend (per `mobile-quality-release.md` symbolication gate); missing any layer drops a real class of crashes from the dashboard. Internal / closed-test builds may downgrade by risk acceptance.
|
|
61
|
+
- **DevTools is non-optional for debugging non-trivial behavior**: per Flutter docs, the top-level views are Flutter Inspector (widget tree + layout boundaries) for rebuild / overflow / constraint debugging; Performance view (with Timeline Events tab inside) for jank / frame-rate investigation; CPU Profiler view for CPU-bound work analysis; Memory view (heap + leak detection) for image / cache / list memory issues; Network view for HTTP / WebSocket inspection; plus Debugger, Logging view, Debug console, App size tool. Reaching for `print` instead of DevTools is the recurring habit that masks the actual cause.
|
|
62
|
+
- **Hot reload vs hot restart**: `hot reload` re-runs `build` and preserves widget state — fast iteration on UI / business logic. `hot restart` resets the app state and re-runs `main()` — required after changing `main()`, top-level state, `const` constructors, `enum` / generic type signatures, or DI graph; reload silently keeping stale state from these classes is the recurring "but it worked locally" cause. When in doubt, hot restart.
|
|
63
|
+
- **DevTools extensions** (`package:devtools_extensions`): for products where repeated domain-debugging cost exceeds extension maintenance, ship a DevTools extension as a custom panel embedded in DevTools (iframe-based, Flutter web app). Extension consumes shared DevTools APIs (VM service connection, theming, shared widgets); user enables by adding the providing package as a `dev_dependency`. Recent integration with the Dart Tooling Daemon allows access to IDE-registered methods and a minimal file-system API. Not for every in-house framework — the threshold is "we keep instrumenting print-debugging for the same domain over and over"; if it's one-off debugging, scattered `print` + DevTools' built-in panels still win.
|
|
64
|
+
|
|
65
|
+
## Internationalization
|
|
66
|
+
|
|
67
|
+
- **`gen_l10n + intl` (official) is the default** for any Flutter app that might ship in more than one language. Configure via `l10n.yaml` + `.arb` files; `flutter gen-l10n` (or the build runner) emits typed `AppLocalizations` accessed via `BuildContext`. Hard-coded user-facing strings in `Text(...)` are migration debt the day a second language is added.
|
|
68
|
+
- Alternatives (`easy_localization`, `slang`) are acceptable if the project already uses them; do not introduce them in greenfield work without a specific reason to skip the official path. Plural / gender / select forms, locale-aware date / number formatting, RTL layout, and font fallback for non-Latin scripts are part of i18n acceptance — not a string-replace exercise.
|
|
69
|
+
|
|
70
|
+
## Performance
|
|
71
|
+
|
|
72
|
+
- Watch startup work, large rebuilds, image decoding, long lists, jank during animation/scroll, synchronous parsing, and app size.
|
|
73
|
+
- Move CPU-heavy parsing or transforms off the UI path when needed. On **native** targets, `compute()` (or `Isolate.run()`, Flutter 3.7+) runs the callback in a separate isolate so it does not block the UI isolate. On **Web**, `compute()` runs the callback on the current event loop — there is no isolate to offload to, so it does NOT prevent UI jank for CPU-bound work; Web CPU-bound work needs Web Workers via JS interop or algorithmic chunking, not `compute()`.
|
|
74
|
+
- **Repaint boundary discipline**: wrap subtrees that repaint frequently (animations, scrollable lists with their own animation, custom-painted overlays) in `RepaintBoundary` so their repaints don't invalidate the parent's raster. `CustomPainter` is the right primitive for one-off visuals that don't compose from existing widgets — pair with `shouldRepaint` returning `false` when inputs are unchanged. For long scrollable lists / grids, use `Sliver*` widgets (`SliverList`, `SliverGrid`, `CustomScrollView`) instead of nesting fixed-extent widgets in a `ListView` — Slivers participate in the scroll geometry directly, avoid forced relayouts, and support sticky / collapsing headers naturally.
|
|
75
|
+
- Prefer measured profiling for suspected performance issues; do not tune blindly.
|
|
76
|
+
- **Impeller renderer is default on iOS (since 3.10) and on Android API 29+ (since 3.27)**. Two separate verification surfaces: **iOS** — Flutter docs current state is Impeller-only on iOS, no Skia switch; verify first-frame and animation smoothness on supported iPhone floor. **Android** — Impeller is default on API 29+; the `--no-enable-impeller` debug flag still toggles to Skia for diagnosis. Verify on real low-end Android devices the project supports, watch for shader-compile-on-demand jank on rare surfaces, and confirm Skia fallback still ships acceptably for the targeted Android API floor before treating Impeller as the only path.
|
|
77
|
+
|
|
78
|
+
## Release Patterns
|
|
79
|
+
|
|
80
|
+
- **OTA / code push (Shorebird) is the production path for Flutter** when the team needs faster-than-app-store-review updates. Shorebird is in active production at scale (hundreds of millions of patches deployed in 2025 across Android / iOS / macOS / Windows / Linux per the vendor's year-in-review). **Platform constraint discipline**: Apple's App Review Guideline **2.5.2** (executable code) plus Apple Developer Program License Agreement **3.3.1(b)** (which Shorebird itself cites) constrain what can be patched without re-review — interpreter compliance, no deceptive primary-purpose change, and major / native-surface changes continue through normal store releases. Document the patch policy with legal/release-engineering before adopting, not after a patch is rejected. Android has fewer constraints but still subject to Play Store policy. OTA is niche-but-recommendable for products with: (a) high cost of waiting for review, (b) critical bug-fix windows, or (c) feature-flag governance the team will actually use; not a substitute for normal release discipline.
|