compact-agent 1.10.1 → 1.11.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/bin/ecc-hooks.cjs +110 -0
- package/dist/ecc.d.ts +11 -0
- package/dist/ecc.js +142 -27
- package/dist/ecc.js.map +1 -1
- package/dist/index.js +47 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/resources/ecc/agents/a11y-architect.md +149 -0
- package/resources/ecc/agents/architect.md +11 -3
- package/resources/ecc/agents/build-error-resolver.md +11 -4
- package/resources/ecc/agents/chief-of-staff.md +11 -4
- package/resources/ecc/agents/code-architect.md +80 -0
- package/resources/ecc/agents/code-explorer.md +78 -0
- package/resources/ecc/agents/code-reviewer.md +89 -4
- package/resources/ecc/agents/code-simplifier.md +56 -0
- package/resources/ecc/agents/comment-analyzer.md +54 -0
- package/resources/ecc/agents/conversation-analyzer.md +61 -0
- package/resources/ecc/agents/cpp-build-resolver.md +99 -0
- package/resources/ecc/agents/cpp-reviewer.md +81 -0
- package/resources/ecc/agents/csharp-reviewer.md +110 -0
- package/resources/ecc/agents/dart-build-resolver.md +210 -0
- package/resources/ecc/agents/database-reviewer.md +11 -3
- package/resources/ecc/agents/django-build-resolver.md +252 -0
- package/resources/ecc/agents/django-reviewer.md +169 -0
- package/resources/ecc/agents/doc-updater.md +11 -3
- package/resources/ecc/agents/docs-lookup.md +77 -0
- package/resources/ecc/agents/e2e-runner.md +11 -4
- package/resources/ecc/agents/fastapi-reviewer.md +79 -0
- package/resources/ecc/agents/flutter-reviewer.md +252 -0
- package/resources/ecc/agents/fsharp-reviewer.md +109 -0
- package/resources/ecc/agents/gan-evaluator.md +218 -0
- package/resources/ecc/agents/gan-generator.md +140 -0
- package/resources/ecc/agents/gan-planner.md +108 -0
- package/resources/ecc/agents/go-build-resolver.md +11 -4
- package/resources/ecc/agents/go-reviewer.md +11 -3
- package/resources/ecc/agents/harmonyos-app-resolver.md +182 -0
- package/resources/ecc/agents/harness-optimizer.md +12 -2
- package/resources/ecc/agents/healthcare-reviewer.md +92 -0
- package/resources/ecc/agents/homelab-architect.md +107 -0
- package/resources/ecc/agents/java-build-resolver.md +275 -0
- package/resources/ecc/agents/java-reviewer.md +190 -0
- package/resources/ecc/agents/kotlin-build-resolver.md +127 -0
- package/resources/ecc/agents/kotlin-reviewer.md +168 -0
- package/resources/ecc/agents/loop-operator.md +12 -3
- package/resources/ecc/agents/mle-reviewer.md +162 -0
- package/resources/ecc/agents/network-architect.md +106 -0
- package/resources/ecc/agents/network-config-reviewer.md +106 -0
- package/resources/ecc/agents/network-troubleshooter.md +128 -0
- package/resources/ecc/agents/opensource-forker.md +207 -0
- package/resources/ecc/agents/opensource-packager.md +258 -0
- package/resources/ecc/agents/opensource-sanitizer.md +197 -0
- package/resources/ecc/agents/performance-optimizer.md +455 -0
- package/resources/ecc/agents/planner.md +11 -2
- package/resources/ecc/agents/pr-test-analyzer.md +54 -0
- package/resources/ecc/agents/python-reviewer.md +11 -3
- package/resources/ecc/agents/pytorch-build-resolver.md +129 -0
- package/resources/ecc/agents/refactor-cleaner.md +11 -4
- package/resources/ecc/agents/rust-build-resolver.md +157 -0
- package/resources/ecc/agents/rust-reviewer.md +103 -0
- package/resources/ecc/agents/security-reviewer.md +11 -3
- package/resources/ecc/agents/seo-specialist.md +71 -0
- package/resources/ecc/agents/silent-failure-hunter.md +59 -0
- package/resources/ecc/agents/swift-build-resolver.md +170 -0
- package/resources/ecc/agents/swift-reviewer.md +116 -0
- package/resources/ecc/agents/tdd-guide.md +11 -4
- package/resources/ecc/agents/type-design-analyzer.md +50 -0
- package/resources/ecc/agents/typescript-reviewer.md +121 -0
- package/resources/ecc/commands/aside.md +164 -0
- package/resources/ecc/commands/auto-update.md +28 -0
- package/resources/ecc/commands/build-fix.md +66 -0
- package/resources/ecc/commands/checkpoint.md +78 -0
- package/resources/ecc/commands/code-review.md +289 -0
- package/resources/ecc/commands/cost-report.md +107 -0
- package/resources/ecc/commands/cpp-build.md +173 -0
- package/resources/ecc/commands/cpp-review.md +132 -0
- package/resources/ecc/commands/cpp-test.md +251 -0
- package/resources/ecc/commands/ecc-guide.md +93 -0
- package/resources/ecc/commands/evolve.md +178 -0
- package/resources/ecc/commands/fastapi-review.md +39 -0
- package/resources/ecc/commands/feature-dev.md +49 -0
- package/resources/ecc/commands/flutter-build.md +164 -0
- package/resources/ecc/commands/flutter-review.md +116 -0
- package/resources/ecc/commands/flutter-test.md +144 -0
- package/resources/ecc/commands/gan-build.md +103 -0
- package/resources/ecc/commands/gan-design.md +39 -0
- package/resources/ecc/commands/go-build.md +183 -0
- package/resources/ecc/commands/go-review.md +148 -0
- package/resources/ecc/commands/go-test.md +268 -0
- package/resources/ecc/commands/gradle-build.md +70 -0
- package/resources/ecc/commands/harness-audit.md +77 -0
- package/resources/ecc/commands/hookify-configure.md +14 -0
- package/resources/ecc/commands/hookify-help.md +46 -0
- package/resources/ecc/commands/hookify-list.md +21 -0
- package/resources/ecc/commands/hookify.md +50 -0
- package/resources/ecc/commands/instinct-export.md +66 -0
- package/resources/ecc/commands/instinct-import.md +114 -0
- package/resources/ecc/commands/instinct-status.md +59 -0
- package/resources/ecc/commands/jira.md +106 -0
- package/resources/ecc/commands/kotlin-build.md +174 -0
- package/resources/ecc/commands/kotlin-review.md +140 -0
- package/resources/ecc/commands/kotlin-test.md +312 -0
- package/resources/ecc/commands/learn-eval.md +116 -0
- package/resources/ecc/commands/learn.md +74 -0
- package/resources/ecc/commands/loop-start.md +36 -0
- package/resources/ecc/commands/loop-status.md +77 -0
- package/resources/ecc/commands/model-route.md +30 -0
- package/resources/ecc/commands/multi-backend.md +162 -0
- package/resources/ecc/commands/multi-execute.md +319 -0
- package/resources/ecc/commands/multi-frontend.md +162 -0
- package/resources/ecc/commands/multi-plan.md +272 -0
- package/resources/ecc/commands/multi-workflow.md +195 -0
- package/resources/ecc/commands/plan-prd.md +160 -0
- package/resources/ecc/commands/plan.md +200 -0
- package/resources/ecc/commands/pm2.md +276 -0
- package/resources/ecc/commands/pr.md +184 -0
- package/resources/ecc/commands/project-init.md +86 -0
- package/resources/ecc/commands/projects.md +39 -0
- package/resources/ecc/commands/promote.md +41 -0
- package/resources/ecc/commands/prp-commit.md +112 -0
- package/resources/ecc/commands/prp-implement.md +385 -0
- package/resources/ecc/commands/prp-plan.md +502 -0
- package/resources/ecc/commands/prp-pr.md +184 -0
- package/resources/ecc/commands/prp-prd.md +447 -0
- package/resources/ecc/commands/prune.md +31 -0
- package/resources/ecc/commands/python-review.md +297 -0
- package/resources/ecc/commands/quality-gate.md +33 -0
- package/resources/ecc/commands/refactor-clean.md +84 -0
- package/resources/ecc/commands/resume-session.md +156 -0
- package/resources/ecc/commands/review-pr.md +37 -0
- package/resources/ecc/commands/rust-build.md +187 -0
- package/resources/ecc/commands/rust-review.md +142 -0
- package/resources/ecc/commands/rust-test.md +308 -0
- package/resources/ecc/commands/santa-loop.md +175 -0
- package/resources/ecc/commands/save-session.md +275 -0
- package/resources/ecc/commands/security-scan.md +92 -0
- package/resources/ecc/commands/sessions.md +339 -0
- package/resources/ecc/commands/setup-pm.md +80 -0
- package/resources/ecc/commands/skill-create.md +174 -0
- package/resources/ecc/commands/skill-health.md +54 -0
- package/resources/ecc/commands/test-coverage.md +73 -0
- package/resources/ecc/commands/update-codemaps.md +76 -0
- package/resources/ecc/commands/update-docs.md +88 -0
- package/resources/ecc/rules/README.md +120 -0
- package/resources/ecc/rules/angular/coding-style.md +182 -0
- package/resources/ecc/rules/angular/hooks.md +25 -0
- package/resources/ecc/rules/angular/patterns.md +249 -0
- package/resources/ecc/rules/angular/security.md +87 -0
- package/resources/ecc/rules/angular/testing.md +164 -0
- package/resources/ecc/rules/arkts/coding-style.md +153 -0
- package/resources/ecc/rules/arkts/hooks.md +135 -0
- package/resources/ecc/rules/arkts/patterns.md +236 -0
- package/resources/ecc/rules/arkts/security.md +141 -0
- package/resources/ecc/rules/arkts/testing.md +126 -0
- package/resources/ecc/rules/{common-agents.md → common/agents.md} +2 -4
- package/resources/ecc/rules/common/code-review.md +124 -0
- package/resources/ecc/rules/{common-coding-style.md → common/coding-style.md} +42 -4
- package/resources/ecc/rules/common/development-workflow.md +44 -0
- package/resources/ecc/rules/{common-git-workflow.md → common/git-workflow.md} +1 -5
- package/resources/ecc/rules/{common-hooks.md → common/hooks.md} +0 -4
- package/resources/ecc/rules/{common-patterns.md → common/patterns.md} +0 -4
- package/resources/ecc/rules/{common-performance.md → common/performance.md} +0 -4
- package/resources/ecc/rules/{common-security.md → common/security.md} +0 -4
- package/resources/ecc/rules/{common-testing.md → common/testing.md} +28 -4
- package/resources/ecc/rules/cpp/coding-style.md +44 -0
- package/resources/ecc/rules/cpp/hooks.md +39 -0
- package/resources/ecc/rules/cpp/patterns.md +51 -0
- package/resources/ecc/rules/cpp/security.md +51 -0
- package/resources/ecc/rules/cpp/testing.md +44 -0
- package/resources/ecc/rules/csharp/coding-style.md +72 -0
- package/resources/ecc/rules/csharp/hooks.md +25 -0
- package/resources/ecc/rules/csharp/patterns.md +50 -0
- package/resources/ecc/rules/csharp/security.md +58 -0
- package/resources/ecc/rules/csharp/testing.md +46 -0
- package/resources/ecc/rules/dart/coding-style.md +159 -0
- package/resources/ecc/rules/dart/hooks.md +66 -0
- package/resources/ecc/rules/dart/patterns.md +261 -0
- package/resources/ecc/rules/dart/security.md +135 -0
- package/resources/ecc/rules/dart/testing.md +215 -0
- package/resources/ecc/rules/fsharp/coding-style.md +112 -0
- package/resources/ecc/rules/fsharp/hooks.md +26 -0
- package/resources/ecc/rules/fsharp/patterns.md +111 -0
- package/resources/ecc/rules/fsharp/security.md +76 -0
- package/resources/ecc/rules/fsharp/testing.md +62 -0
- package/resources/ecc/rules/{golang-coding-style.md → golang/coding-style.md} +6 -5
- package/resources/ecc/rules/{golang-hooks.md → golang/hooks.md} +5 -4
- package/resources/ecc/rules/{golang-patterns.md → golang/patterns.md} +5 -4
- package/resources/ecc/rules/{golang-security.md → golang/security.md} +5 -4
- package/resources/ecc/rules/{golang-testing.md → golang/testing.md} +5 -4
- package/resources/ecc/rules/java/coding-style.md +114 -0
- package/resources/ecc/rules/java/hooks.md +18 -0
- package/resources/ecc/rules/java/patterns.md +147 -0
- package/resources/ecc/rules/java/security.md +101 -0
- package/resources/ecc/rules/java/testing.md +133 -0
- package/resources/ecc/rules/kotlin/coding-style.md +86 -0
- package/resources/ecc/rules/{kotlin-hooks.md → kotlin/hooks.md} +5 -4
- package/resources/ecc/rules/kotlin/patterns.md +146 -0
- package/resources/ecc/rules/kotlin/security.md +82 -0
- package/resources/ecc/rules/kotlin/testing.md +128 -0
- package/resources/ecc/rules/perl/coding-style.md +46 -0
- package/resources/ecc/rules/perl/hooks.md +22 -0
- package/resources/ecc/rules/perl/patterns.md +76 -0
- package/resources/ecc/rules/perl/security.md +69 -0
- package/resources/ecc/rules/perl/testing.md +54 -0
- package/resources/ecc/rules/php/coding-style.md +40 -0
- package/resources/ecc/rules/{php-hooks.md → php/hooks.md} +7 -4
- package/resources/ecc/rules/php/patterns.md +33 -0
- package/resources/ecc/rules/php/security.md +37 -0
- package/resources/ecc/rules/php/testing.md +39 -0
- package/resources/ecc/rules/{python-coding-style.md → python/coding-style.md} +4 -4
- package/resources/ecc/rules/python/fastapi.md +58 -0
- package/resources/ecc/rules/{python-hooks.md → python/hooks.md} +4 -4
- package/resources/ecc/rules/{python-patterns.md → python/patterns.md} +4 -4
- package/resources/ecc/rules/{python-security.md → python/security.md} +4 -4
- package/resources/ecc/rules/{python-testing.md → python/testing.md} +4 -4
- package/resources/ecc/rules/ruby/coding-style.md +46 -0
- package/resources/ecc/rules/ruby/hooks.md +37 -0
- package/resources/ecc/rules/ruby/patterns.md +44 -0
- package/resources/ecc/rules/ruby/security.md +51 -0
- package/resources/ecc/rules/ruby/testing.md +51 -0
- package/resources/ecc/rules/rust/coding-style.md +151 -0
- package/resources/ecc/rules/rust/hooks.md +16 -0
- package/resources/ecc/rules/rust/patterns.md +168 -0
- package/resources/ecc/rules/rust/security.md +141 -0
- package/resources/ecc/rules/rust/testing.md +154 -0
- package/resources/ecc/rules/{swift-coding-style.md → swift/coding-style.md} +6 -6
- package/resources/ecc/rules/swift/hooks.md +20 -0
- package/resources/ecc/rules/{swift-patterns.md → swift/patterns.md} +5 -5
- package/resources/ecc/rules/{swift-security.md → swift/security.md} +7 -7
- package/resources/ecc/rules/{swift-testing.md → swift/testing.md} +5 -5
- package/resources/ecc/rules/typescript/coding-style.md +199 -0
- package/resources/ecc/rules/{typescript-hooks.md → typescript/hooks.md} +6 -4
- package/resources/ecc/rules/{typescript-patterns.md → typescript/patterns.md} +6 -4
- package/resources/ecc/rules/{typescript-security.md → typescript/security.md} +6 -4
- package/resources/ecc/rules/typescript/testing.md +18 -0
- package/resources/ecc/rules/web/coding-style.md +96 -0
- package/resources/ecc/rules/web/design-quality.md +63 -0
- package/resources/ecc/rules/web/hooks.md +129 -0
- package/resources/ecc/rules/web/patterns.md +79 -0
- package/resources/ecc/rules/web/performance.md +64 -0
- package/resources/ecc/rules/web/security.md +57 -0
- package/resources/ecc/rules/web/testing.md +55 -0
- package/resources/ecc/rules/zh/README.md +108 -0
- package/resources/ecc/rules/zh/agents.md +50 -0
- package/resources/ecc/rules/zh/code-review.md +124 -0
- package/resources/ecc/rules/zh/coding-style.md +48 -0
- package/resources/ecc/rules/zh/development-workflow.md +44 -0
- package/resources/ecc/rules/zh/git-workflow.md +24 -0
- package/resources/ecc/rules/zh/hooks.md +30 -0
- package/resources/ecc/rules/zh/patterns.md +31 -0
- package/resources/ecc/rules/zh/performance.md +55 -0
- package/resources/ecc/rules/zh/security.md +29 -0
- package/resources/ecc/rules/zh/testing.md +29 -0
- package/resources/ecc/skills/accessibility/SKILL.md +146 -0
- package/resources/ecc/skills/agent-architecture-audit/SKILL.md +256 -0
- package/resources/ecc/skills/agent-eval/SKILL.md +145 -0
- package/resources/ecc/skills/agent-harness-construction/SKILL.md +73 -0
- package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +1 -0
- package/resources/ecc/skills/agent-payment-x402/SKILL.md +224 -0
- package/resources/ecc/skills/agent-sort/SKILL.md +1 -0
- package/resources/ecc/skills/agentic-engineering/SKILL.md +63 -0
- package/resources/ecc/skills/agentic-os/SKILL.md +387 -0
- package/resources/ecc/skills/ai-first-engineering/SKILL.md +51 -0
- package/resources/ecc/skills/ai-regression-testing/SKILL.md +385 -0
- package/resources/ecc/skills/android-clean-architecture/SKILL.md +339 -0
- package/resources/ecc/skills/angular-developer/SKILL.md +154 -0
- package/resources/ecc/skills/angular-developer/references/angular-animations.md +160 -0
- package/resources/ecc/skills/angular-developer/references/angular-aria.md +410 -0
- package/resources/ecc/skills/angular-developer/references/cli.md +86 -0
- package/resources/ecc/skills/angular-developer/references/component-harnesses.md +59 -0
- package/resources/ecc/skills/angular-developer/references/component-styling.md +91 -0
- package/resources/ecc/skills/angular-developer/references/components.md +117 -0
- package/resources/ecc/skills/angular-developer/references/creating-services.md +97 -0
- package/resources/ecc/skills/angular-developer/references/data-resolvers.md +69 -0
- package/resources/ecc/skills/angular-developer/references/define-routes.md +67 -0
- package/resources/ecc/skills/angular-developer/references/defining-providers.md +72 -0
- package/resources/ecc/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/resources/ecc/skills/angular-developer/references/e2e-testing.md +56 -0
- package/resources/ecc/skills/angular-developer/references/effects.md +83 -0
- package/resources/ecc/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/resources/ecc/skills/angular-developer/references/host-elements.md +80 -0
- package/resources/ecc/skills/angular-developer/references/injection-context.md +63 -0
- package/resources/ecc/skills/angular-developer/references/inputs.md +101 -0
- package/resources/ecc/skills/angular-developer/references/linked-signal.md +59 -0
- package/resources/ecc/skills/angular-developer/references/loading-strategies.md +61 -0
- package/resources/ecc/skills/angular-developer/references/mcp.md +108 -0
- package/resources/ecc/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/resources/ecc/skills/angular-developer/references/outputs.md +86 -0
- package/resources/ecc/skills/angular-developer/references/reactive-forms.md +122 -0
- package/resources/ecc/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/resources/ecc/skills/angular-developer/references/resource.md +77 -0
- package/resources/ecc/skills/angular-developer/references/route-animations.md +56 -0
- package/resources/ecc/skills/angular-developer/references/route-guards.md +52 -0
- package/resources/ecc/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/resources/ecc/skills/angular-developer/references/router-testing.md +87 -0
- package/resources/ecc/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/resources/ecc/skills/angular-developer/references/signal-forms.md +795 -0
- package/resources/ecc/skills/angular-developer/references/signals-overview.md +94 -0
- package/resources/ecc/skills/angular-developer/references/tailwind-css.md +69 -0
- package/resources/ecc/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/resources/ecc/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/resources/ecc/skills/api-connector-builder/SKILL.md +120 -0
- package/resources/ecc/skills/api-design/SKILL.md +1 -0
- package/resources/ecc/skills/architecture-decision-records/SKILL.md +179 -0
- package/resources/ecc/skills/article-writing/SKILL.md +1 -0
- package/resources/ecc/skills/automation-audit-ops/SKILL.md +142 -0
- package/resources/ecc/skills/autonomous-agent-harness/SKILL.md +273 -0
- package/resources/ecc/skills/autonomous-loops/SKILL.md +610 -0
- package/resources/ecc/skills/backend-patterns/SKILL.md +8 -44
- package/resources/ecc/skills/benchmark/SKILL.md +93 -0
- package/resources/ecc/skills/blueprint/SKILL.md +105 -0
- package/resources/ecc/skills/brand-voice/SKILL.md +1 -0
- package/resources/ecc/skills/browser-qa/SKILL.md +87 -0
- package/resources/ecc/skills/bun-runtime/SKILL.md +1 -0
- package/resources/ecc/skills/canary-watch/SKILL.md +99 -0
- package/resources/ecc/skills/carrier-relationship-management/SKILL.md +212 -0
- package/resources/ecc/skills/cisco-ios-patterns/SKILL.md +163 -0
- package/resources/ecc/skills/ck/SKILL.md +147 -0
- package/resources/ecc/skills/ck/commands/forget.mjs +44 -0
- package/resources/ecc/skills/ck/commands/info.mjs +24 -0
- package/resources/ecc/skills/ck/commands/init.mjs +143 -0
- package/resources/ecc/skills/ck/commands/list.mjs +40 -0
- package/resources/ecc/skills/ck/commands/migrate.mjs +202 -0
- package/resources/ecc/skills/ck/commands/resume.mjs +36 -0
- package/resources/ecc/skills/ck/commands/save.mjs +210 -0
- package/resources/ecc/skills/ck/commands/shared.mjs +387 -0
- package/resources/ecc/skills/ck/hooks/session-start.mjs +224 -0
- package/resources/ecc/skills/claude-devfleet/SKILL.md +103 -0
- package/resources/ecc/skills/click-path-audit/SKILL.md +244 -0
- package/resources/ecc/skills/clickhouse-io/SKILL.md +439 -0
- package/resources/ecc/skills/code-tour/SKILL.md +236 -0
- package/resources/ecc/skills/codebase-onboarding/SKILL.md +233 -0
- package/resources/ecc/skills/coding-standards/SKILL.md +1 -0
- package/resources/ecc/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/resources/ecc/skills/configure-ecc/SKILL.md +384 -0
- package/resources/ecc/skills/connections-optimizer/SKILL.md +189 -0
- package/resources/ecc/skills/content-engine/SKILL.md +1 -0
- package/resources/ecc/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/resources/ecc/skills/context-budget/SKILL.md +135 -0
- package/resources/ecc/skills/continuous-agent-loop/SKILL.md +45 -0
- package/resources/ecc/skills/continuous-learning/SKILL.md +131 -0
- package/resources/ecc/skills/continuous-learning/config.json +18 -0
- package/resources/ecc/skills/continuous-learning/evaluate-session.sh +69 -0
- package/resources/ecc/skills/continuous-learning-v2/SKILL.md +360 -0
- package/resources/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
- package/resources/ecc/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/resources/ecc/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/resources/ecc/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
- package/resources/ecc/skills/continuous-learning-v2/config.json +8 -0
- package/resources/ecc/skills/continuous-learning-v2/hooks/observe.sh +476 -0
- package/resources/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
- package/resources/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
- package/resources/ecc/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/resources/ecc/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
- package/resources/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
- package/resources/ecc/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/resources/ecc/skills/cost-tracking/SKILL.md +147 -0
- package/resources/ecc/skills/council/SKILL.md +203 -0
- package/resources/ecc/skills/cpp-coding-standards/SKILL.md +723 -0
- package/resources/ecc/skills/cpp-testing/SKILL.md +324 -0
- package/resources/ecc/skills/crosspost/SKILL.md +1 -0
- package/resources/ecc/skills/csharp-testing/SKILL.md +321 -0
- package/resources/ecc/skills/customer-billing-ops/SKILL.md +140 -0
- package/resources/ecc/skills/customs-trade-compliance/SKILL.md +263 -0
- package/resources/ecc/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/resources/ecc/skills/dashboard-builder/SKILL.md +108 -0
- package/resources/ecc/skills/data-scraper-agent/SKILL.md +764 -0
- package/resources/ecc/skills/database-migrations/SKILL.md +429 -0
- package/resources/ecc/skills/deep-research/SKILL.md +5 -0
- package/resources/ecc/skills/defi-amm-security/SKILL.md +166 -0
- package/resources/ecc/skills/deployment-patterns/SKILL.md +427 -0
- package/resources/ecc/skills/design-system/SKILL.md +82 -0
- package/resources/ecc/skills/django-celery/SKILL.md +457 -0
- package/resources/ecc/skills/django-patterns/SKILL.md +734 -0
- package/resources/ecc/skills/django-security/SKILL.md +593 -0
- package/resources/ecc/skills/django-tdd/SKILL.md +729 -0
- package/resources/ecc/skills/django-verification/SKILL.md +469 -0
- package/resources/ecc/skills/dmux-workflows/SKILL.md +52 -4
- package/resources/ecc/skills/docker-patterns/SKILL.md +364 -0
- package/resources/ecc/skills/documentation-lookup/SKILL.md +1 -0
- package/resources/ecc/skills/dotnet-patterns/SKILL.md +321 -0
- package/resources/ecc/skills/e2e-testing/SKILL.md +1 -0
- package/resources/ecc/skills/ecc-guide/SKILL.md +189 -0
- package/resources/ecc/skills/ecc-tools-cost-audit/SKILL.md +160 -0
- package/resources/ecc/skills/email-ops/SKILL.md +121 -0
- package/resources/ecc/skills/energy-procurement/SKILL.md +228 -0
- package/resources/ecc/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/resources/ecc/skills/error-handling/SKILL.md +376 -0
- package/resources/ecc/skills/eval-harness/SKILL.md +36 -1
- package/resources/ecc/skills/evm-token-decimals/SKILL.md +130 -0
- package/resources/ecc/skills/exa-search/SKILL.md +18 -80
- package/resources/ecc/skills/fal-ai-media/SKILL.md +32 -20
- package/resources/ecc/skills/fastapi-patterns/SKILL.md +327 -0
- package/resources/ecc/skills/finance-billing-ops/SKILL.md +127 -0
- package/resources/ecc/skills/flox-environments/SKILL.md +496 -0
- package/resources/ecc/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/resources/ecc/skills/foundation-models-on-device/SKILL.md +243 -0
- package/resources/ecc/skills/frontend-design-direction/SKILL.md +92 -0
- package/resources/ecc/skills/frontend-patterns/SKILL.md +1 -6
- package/resources/ecc/skills/frontend-slides/SKILL.md +2 -1
- package/resources/ecc/skills/frontend-slides/animation-patterns.md +122 -0
- package/resources/ecc/skills/frontend-slides/html-template.md +419 -0
- package/resources/ecc/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/resources/ecc/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/resources/ecc/skills/frontend-slides/viewport-base.css +153 -0
- package/resources/ecc/skills/fsharp-testing/SKILL.md +280 -0
- package/resources/ecc/skills/gan-style-harness/SKILL.md +278 -0
- package/resources/ecc/skills/gateguard/SKILL.md +125 -0
- package/resources/ecc/skills/git-workflow/SKILL.md +715 -0
- package/resources/ecc/skills/github-ops/SKILL.md +144 -0
- package/resources/ecc/skills/golang-patterns/SKILL.md +674 -0
- package/resources/ecc/skills/golang-testing/SKILL.md +720 -0
- package/resources/ecc/skills/google-workspace-ops/SKILL.md +95 -0
- package/resources/ecc/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/resources/ecc/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/resources/ecc/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/resources/ecc/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/resources/ecc/skills/hermes-imports/SKILL.md +88 -0
- package/resources/ecc/skills/hexagonal-architecture/SKILL.md +276 -0
- package/resources/ecc/skills/hipaa-compliance/SKILL.md +78 -0
- package/resources/ecc/skills/homelab-network-readiness/SKILL.md +169 -0
- package/resources/ecc/skills/homelab-network-setup/SKILL.md +129 -0
- package/resources/ecc/skills/homelab-pihole-dns/SKILL.md +274 -0
- package/resources/ecc/skills/homelab-vlan-segmentation/SKILL.md +311 -0
- package/resources/ecc/skills/homelab-wireguard-vpn/SKILL.md +305 -0
- package/resources/ecc/skills/hookify-rules/SKILL.md +128 -0
- package/resources/ecc/skills/inventory-demand-planning/SKILL.md +247 -0
- package/resources/ecc/skills/investor-materials/SKILL.md +1 -0
- package/resources/ecc/skills/investor-outreach/SKILL.md +1 -0
- package/resources/ecc/skills/ios-icon-gen/SKILL.md +157 -0
- package/resources/ecc/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/resources/ecc/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/resources/ecc/skills/iterative-retrieval/SKILL.md +211 -0
- package/resources/ecc/skills/java-coding-standards/SKILL.md +383 -0
- package/resources/ecc/skills/jira-integration/SKILL.md +293 -0
- package/resources/ecc/skills/jpa-patterns/SKILL.md +151 -0
- package/resources/ecc/skills/knowledge-ops/SKILL.md +154 -0
- package/resources/ecc/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/resources/ecc/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/resources/ecc/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/resources/ecc/skills/kotlin-patterns/SKILL.md +711 -0
- package/resources/ecc/skills/kotlin-testing/SKILL.md +824 -0
- package/resources/ecc/skills/laravel-patterns/SKILL.md +415 -0
- package/resources/ecc/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/resources/ecc/skills/laravel-security/SKILL.md +285 -0
- package/resources/ecc/skills/laravel-tdd/SKILL.md +283 -0
- package/resources/ecc/skills/laravel-verification/SKILL.md +179 -0
- package/resources/ecc/skills/lead-intelligence/SKILL.md +321 -0
- package/resources/ecc/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/resources/ecc/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/resources/ecc/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/resources/ecc/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/resources/ecc/skills/liquid-glass-design/SKILL.md +279 -0
- package/resources/ecc/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/resources/ecc/skills/logistics-exception-management/SKILL.md +222 -0
- package/resources/ecc/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/resources/ecc/skills/manim-video/SKILL.md +89 -0
- package/resources/ecc/skills/manim-video/assets/network_graph_scene.py +52 -0
- package/resources/ecc/skills/market-research/SKILL.md +1 -0
- package/resources/ecc/skills/mcp-server-patterns/SKILL.md +3 -0
- package/resources/ecc/skills/messages-ops/SKILL.md +104 -0
- package/resources/ecc/skills/mle-workflow/SKILL.md +1 -1
- package/resources/ecc/skills/motion-advanced/SKILL.md +596 -0
- package/resources/ecc/skills/motion-foundations/SKILL.md +299 -0
- package/resources/ecc/skills/motion-patterns/SKILL.md +435 -0
- package/resources/ecc/skills/motion-ui/SKILL.md +575 -0
- package/resources/ecc/skills/mysql-patterns/SKILL.md +412 -0
- package/resources/ecc/skills/nanoclaw-repl/SKILL.md +33 -0
- package/resources/ecc/skills/nestjs-patterns/SKILL.md +230 -0
- package/resources/ecc/skills/netmiko-ssh-automation/SKILL.md +173 -0
- package/resources/ecc/skills/network-bgp-diagnostics/SKILL.md +167 -0
- package/resources/ecc/skills/network-config-validation/SKILL.md +210 -0
- package/resources/ecc/skills/network-interface-health/SKILL.md +152 -0
- package/resources/ecc/skills/nextjs-turbopack/SKILL.md +1 -0
- package/resources/ecc/skills/nodejs-keccak256/SKILL.md +102 -0
- package/resources/ecc/skills/nutrient-document-processing/SKILL.md +167 -0
- package/resources/ecc/skills/nuxt4-patterns/SKILL.md +100 -0
- package/resources/ecc/skills/openclaw-persona-forge/SKILL.md +288 -0
- package/resources/ecc/skills/openclaw-persona-forge/gacha.py +224 -0
- package/resources/ecc/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/resources/ecc/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/resources/ecc/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/resources/ecc/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/resources/ecc/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/resources/ecc/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/resources/ecc/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/resources/ecc/skills/opensource-pipeline/SKILL.md +255 -0
- package/resources/ecc/skills/perl-patterns/SKILL.md +504 -0
- package/resources/ecc/skills/perl-security/SKILL.md +503 -0
- package/resources/ecc/skills/perl-testing/SKILL.md +475 -0
- package/resources/ecc/skills/plan-orchestrate/SKILL.md +262 -0
- package/resources/ecc/skills/plankton-code-quality/SKILL.md +236 -0
- package/resources/ecc/skills/postgres-patterns/SKILL.md +147 -0
- package/resources/ecc/skills/product-capability/SKILL.md +1 -0
- package/resources/ecc/skills/product-lens/SKILL.md +92 -0
- package/resources/ecc/skills/production-audit/SKILL.md +206 -0
- package/resources/ecc/skills/production-scheduling/SKILL.md +238 -0
- package/resources/ecc/skills/project-flow-ops/SKILL.md +111 -0
- package/resources/ecc/skills/prompt-optimizer/SKILL.md +398 -0
- package/resources/ecc/skills/python-patterns/SKILL.md +750 -0
- package/resources/ecc/skills/python-testing/SKILL.md +816 -0
- package/resources/ecc/skills/pytorch-patterns/SKILL.md +396 -0
- package/resources/ecc/skills/quality-nonconformance/SKILL.md +260 -0
- package/resources/ecc/skills/quarkus-patterns/SKILL.md +722 -0
- package/resources/ecc/skills/quarkus-security/SKILL.md +467 -0
- package/resources/ecc/skills/quarkus-tdd/SKILL.md +811 -0
- package/resources/ecc/skills/quarkus-verification/SKILL.md +479 -0
- package/resources/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/resources/ecc/skills/redis-patterns/SKILL.md +403 -0
- package/resources/ecc/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
- package/resources/ecc/skills/remotion-video-creation/SKILL.md +43 -0
- package/resources/ecc/skills/remotion-video-creation/rules/3d.md +86 -0
- package/resources/ecc/skills/remotion-video-creation/rules/animations.md +29 -0
- package/resources/ecc/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/resources/ecc/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/resources/ecc/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/resources/ecc/skills/remotion-video-creation/rules/assets.md +78 -0
- package/resources/ecc/skills/remotion-video-creation/rules/audio.md +172 -0
- package/resources/ecc/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/resources/ecc/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/resources/ecc/skills/remotion-video-creation/rules/charts.md +58 -0
- package/resources/ecc/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/resources/ecc/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/resources/ecc/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/resources/ecc/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/resources/ecc/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/resources/ecc/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/resources/ecc/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/resources/ecc/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/resources/ecc/skills/remotion-video-creation/rules/images.md +130 -0
- package/resources/ecc/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/resources/ecc/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/resources/ecc/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/resources/ecc/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/resources/ecc/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/resources/ecc/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/resources/ecc/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/resources/ecc/skills/remotion-video-creation/rules/timing.md +179 -0
- package/resources/ecc/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/resources/ecc/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/resources/ecc/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/resources/ecc/skills/remotion-video-creation/rules/videos.md +171 -0
- package/resources/ecc/skills/repo-scan/SKILL.md +78 -0
- package/resources/ecc/skills/research-ops/SKILL.md +112 -0
- package/resources/ecc/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/resources/ecc/skills/rules-distill/SKILL.md +264 -0
- package/resources/ecc/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/resources/ecc/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/resources/ecc/skills/rust-patterns/SKILL.md +499 -0
- package/resources/ecc/skills/rust-testing/SKILL.md +500 -0
- package/resources/ecc/skills/safety-guard/SKILL.md +75 -0
- package/resources/ecc/skills/santa-method/SKILL.md +306 -0
- package/resources/ecc/skills/scientific-db-pubmed-database/SKILL.md +175 -0
- package/resources/ecc/skills/scientific-db-uspto-database/SKILL.md +177 -0
- package/resources/ecc/skills/scientific-pkg-gget/SKILL.md +166 -0
- package/resources/ecc/skills/scientific-thinking-literature-review/SKILL.md +192 -0
- package/resources/ecc/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
- package/resources/ecc/skills/search-first/SKILL.md +182 -0
- package/resources/ecc/skills/security-bounty-hunter/SKILL.md +99 -0
- package/resources/ecc/skills/security-review/SKILL.md +11 -2
- package/resources/ecc/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/resources/ecc/skills/security-scan/SKILL.md +165 -0
- package/resources/ecc/skills/seo/SKILL.md +154 -0
- package/resources/ecc/skills/skill-comply/SKILL.md +58 -0
- package/resources/ecc/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/resources/ecc/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/resources/ecc/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/resources/ecc/skills/skill-comply/prompts/classifier.md +24 -0
- package/resources/ecc/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/resources/ecc/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/resources/ecc/skills/skill-comply/pyproject.toml +15 -0
- package/resources/ecc/skills/skill-comply/scripts/__init__.py +0 -0
- package/resources/ecc/skills/skill-comply/scripts/classifier.py +85 -0
- package/resources/ecc/skills/skill-comply/scripts/grader.py +124 -0
- package/resources/ecc/skills/skill-comply/scripts/parser.py +107 -0
- package/resources/ecc/skills/skill-comply/scripts/report.py +170 -0
- package/resources/ecc/skills/skill-comply/scripts/run.py +127 -0
- package/resources/ecc/skills/skill-comply/scripts/runner.py +186 -0
- package/resources/ecc/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/resources/ecc/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/resources/ecc/skills/skill-comply/scripts/utils.py +13 -0
- package/resources/ecc/skills/skill-comply/tests/test_grader.py +197 -0
- package/resources/ecc/skills/skill-comply/tests/test_parser.py +90 -0
- package/resources/ecc/skills/skill-comply/tests/test_runner.py +172 -0
- package/resources/ecc/skills/skill-scout/SKILL.md +140 -0
- package/resources/ecc/skills/skill-stocktake/SKILL.md +194 -0
- package/resources/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/resources/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/resources/ecc/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/resources/ecc/skills/social-graph-ranker/SKILL.md +154 -0
- package/resources/ecc/skills/springboot-patterns/SKILL.md +314 -0
- package/resources/ecc/skills/springboot-security/SKILL.md +272 -0
- package/resources/ecc/skills/springboot-tdd/SKILL.md +158 -0
- package/resources/ecc/skills/springboot-verification/SKILL.md +231 -0
- package/resources/ecc/skills/strategic-compact/SKILL.md +31 -2
- package/resources/ecc/skills/strategic-compact/suggest-compact.sh +54 -0
- package/resources/ecc/skills/swift-actor-persistence/SKILL.md +143 -0
- package/resources/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/resources/ecc/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/resources/ecc/skills/swiftui-patterns/SKILL.md +259 -0
- package/resources/ecc/skills/tdd-workflow/SKILL.md +54 -0
- package/resources/ecc/skills/team-builder/SKILL.md +168 -0
- package/resources/ecc/skills/terminal-ops/SKILL.md +109 -0
- package/resources/ecc/skills/tinystruct-patterns/SKILL.md +131 -0
- package/resources/ecc/skills/tinystruct-patterns/references/architecture.md +77 -0
- package/resources/ecc/skills/tinystruct-patterns/references/data-handling.md +35 -0
- package/resources/ecc/skills/tinystruct-patterns/references/routing.md +57 -0
- package/resources/ecc/skills/tinystruct-patterns/references/system-usage.md +74 -0
- package/resources/ecc/skills/tinystruct-patterns/references/testing.md +59 -0
- package/resources/ecc/skills/token-budget-advisor/SKILL.md +133 -0
- package/resources/ecc/skills/ui-demo/SKILL.md +465 -0
- package/resources/ecc/skills/ui-to-vue/SKILL.md +134 -0
- package/resources/ecc/skills/unified-notifications-ops/SKILL.md +187 -0
- package/resources/ecc/skills/verification-loop/SKILL.md +1 -0
- package/resources/ecc/skills/video-editing/SKILL.md +4 -1
- package/resources/ecc/skills/videodb/SKILL.md +374 -0
- package/resources/ecc/skills/videodb/reference/api-reference.md +550 -0
- package/resources/ecc/skills/videodb/reference/capture-reference.md +407 -0
- package/resources/ecc/skills/videodb/reference/capture.md +101 -0
- package/resources/ecc/skills/videodb/reference/editor.md +443 -0
- package/resources/ecc/skills/videodb/reference/generative.md +331 -0
- package/resources/ecc/skills/videodb/reference/rtstream-reference.md +564 -0
- package/resources/ecc/skills/videodb/reference/rtstream.md +65 -0
- package/resources/ecc/skills/videodb/reference/search.md +230 -0
- package/resources/ecc/skills/videodb/reference/streaming.md +406 -0
- package/resources/ecc/skills/videodb/reference/use-cases.md +118 -0
- package/resources/ecc/skills/videodb/scripts/ws_listener.py +282 -0
- package/resources/ecc/skills/visa-doc-translate/README.md +86 -0
- package/resources/ecc/skills/visa-doc-translate/SKILL.md +117 -0
- package/resources/ecc/skills/vite-patterns/SKILL.md +449 -0
- package/resources/ecc/skills/windows-desktop-e2e/SKILL.md +788 -0
- package/resources/ecc/skills/workspace-surface-audit/SKILL.md +125 -0
- package/resources/ecc/skills/x-api/SKILL.md +5 -0
- package/resources/ecc/agents/architect.json +0 -16
- package/resources/ecc/agents/build-error-resolver.json +0 -17
- package/resources/ecc/agents/chief-of-staff.json +0 -17
- package/resources/ecc/agents/code-reviewer.json +0 -16
- package/resources/ecc/agents/database-reviewer.json +0 -16
- package/resources/ecc/agents/doc-updater.json +0 -16
- package/resources/ecc/agents/e2e-runner.json +0 -17
- package/resources/ecc/agents/go-build-resolver.json +0 -17
- package/resources/ecc/agents/go-reviewer.json +0 -16
- package/resources/ecc/agents/harness-optimizer.json +0 -15
- package/resources/ecc/agents/loop-operator.json +0 -16
- package/resources/ecc/agents/planner.json +0 -15
- package/resources/ecc/agents/python-reviewer.json +0 -16
- package/resources/ecc/agents/refactor-cleaner.json +0 -17
- package/resources/ecc/agents/security-reviewer.json +0 -16
- package/resources/ecc/agents/tdd-guide.json +0 -17
- package/resources/ecc/commands/add-language-rules.md +0 -39
- package/resources/ecc/commands/database-migration.md +0 -36
- package/resources/ecc/commands/feature-development.md +0 -38
- package/resources/ecc/rules/common-development-workflow.md +0 -33
- package/resources/ecc/rules/kotlin-coding-style.md +0 -39
- package/resources/ecc/rules/kotlin-patterns.md +0 -50
- package/resources/ecc/rules/kotlin-security.md +0 -58
- package/resources/ecc/rules/kotlin-testing.md +0 -38
- package/resources/ecc/rules/php-coding-style.md +0 -25
- package/resources/ecc/rules/php-patterns.md +0 -23
- package/resources/ecc/rules/php-security.md +0 -24
- package/resources/ecc/rules/php-testing.md +0 -26
- package/resources/ecc/rules/swift-hooks.md +0 -20
- package/resources/ecc/rules/typescript-coding-style.md +0 -63
- package/resources/ecc/rules/typescript-testing.md +0 -16
- package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +0 -7
- package/resources/ecc/skills/agent-sort/agents/openai.yaml +0 -7
- package/resources/ecc/skills/api-design/agents/openai.yaml +0 -7
- package/resources/ecc/skills/article-writing/agents/openai.yaml +0 -7
- package/resources/ecc/skills/backend-patterns/agents/openai.yaml +0 -7
- package/resources/ecc/skills/brand-voice/agents/openai.yaml +0 -7
- package/resources/ecc/skills/bun-runtime/agents/openai.yaml +0 -7
- package/resources/ecc/skills/coding-standards/agents/openai.yaml +0 -7
- package/resources/ecc/skills/content-engine/agents/openai.yaml +0 -7
- package/resources/ecc/skills/crosspost/agents/openai.yaml +0 -7
- package/resources/ecc/skills/deep-research/agents/openai.yaml +0 -7
- package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +0 -7
- package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +0 -7
- package/resources/ecc/skills/e2e-testing/agents/openai.yaml +0 -7
- package/resources/ecc/skills/eval-harness/agents/openai.yaml +0 -7
- package/resources/ecc/skills/everything-claude-code/SKILL.md +0 -442
- package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +0 -7
- package/resources/ecc/skills/exa-search/agents/openai.yaml +0 -7
- package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +0 -7
- package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +0 -7
- package/resources/ecc/skills/frontend-slides/agents/openai.yaml +0 -7
- package/resources/ecc/skills/investor-materials/agents/openai.yaml +0 -7
- package/resources/ecc/skills/investor-outreach/agents/openai.yaml +0 -7
- package/resources/ecc/skills/market-research/agents/openai.yaml +0 -7
- package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +0 -7
- package/resources/ecc/skills/mle-workflow/agents/openai.yaml +0 -7
- package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +0 -7
- package/resources/ecc/skills/product-capability/agents/openai.yaml +0 -7
- package/resources/ecc/skills/security-review/agents/openai.yaml +0 -7
- package/resources/ecc/skills/strategic-compact/agents/openai.yaml +0 -7
- package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +0 -7
- package/resources/ecc/skills/verification-loop/agents/openai.yaml +0 -7
- package/resources/ecc/skills/video-editing/agents/openai.yaml +0 -7
- package/resources/ecc/skills/x-api/agents/openai.yaml +0 -7
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.component.ts"
|
|
4
|
+
- "**/*.component.html"
|
|
5
|
+
- "**/*.service.ts"
|
|
6
|
+
- "**/*.store.ts"
|
|
7
|
+
- "**/*.routes.ts"
|
|
8
|
+
---
|
|
9
|
+
# Angular Patterns
|
|
10
|
+
|
|
11
|
+
> This file extends [common/patterns.md](../common/patterns.md) with Angular specific content.
|
|
12
|
+
|
|
13
|
+
## Smart / Dumb Component Split
|
|
14
|
+
|
|
15
|
+
Smart (container) components own data fetching and state. Dumb (presentational) components receive inputs and emit outputs only — no service injection.
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// Smart — owns data
|
|
19
|
+
@Component({ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush })
|
|
20
|
+
export class UserPageComponent {
|
|
21
|
+
private userService = inject(UserService);
|
|
22
|
+
user = toSignal(this.userService.getUser(this.userId));
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<!-- Dumb — pure presentation -->
|
|
28
|
+
<app-user-card [user]="user()" (select)="onSelect($event)" />
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Service Layer
|
|
32
|
+
|
|
33
|
+
Services own all data access and business logic. Components delegate — no `HttpClient` in components.
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
@Injectable({ providedIn: 'root' })
|
|
37
|
+
export class UserService {
|
|
38
|
+
private http = inject(HttpClient);
|
|
39
|
+
|
|
40
|
+
getUsers(): Observable<User[]> {
|
|
41
|
+
return this.http.get<User[]>('/api/users');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Async Data with `resource`
|
|
47
|
+
|
|
48
|
+
Use `resource()` for reactive async fetching. Prefer over manual RxJS pipelines for simple data loading:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
export class UserDetailComponent {
|
|
52
|
+
userId = input.required<string>();
|
|
53
|
+
|
|
54
|
+
userResource = resource({
|
|
55
|
+
request: () => ({ id: this.userId() }),
|
|
56
|
+
loader: ({ request }) =>
|
|
57
|
+
firstValueFrom(inject(UserService).getUser(request.id)),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Access state: `userResource.value()`, `userResource.isLoading()`, `userResource.error()`, `userResource.reload()`.
|
|
63
|
+
|
|
64
|
+
## Signal State Patterns
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// Local mutable state
|
|
68
|
+
count = signal(0);
|
|
69
|
+
|
|
70
|
+
// Derived (never duplicated)
|
|
71
|
+
doubled = computed(() => this.count() * 2);
|
|
72
|
+
|
|
73
|
+
// Writable derived state that resets with source
|
|
74
|
+
selectedItem = linkedSignal(() => this.items()[0]);
|
|
75
|
+
|
|
76
|
+
// Bridge Observable to signal
|
|
77
|
+
users = toSignal(this.userService.getUsers(), { initialValue: [] });
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Never store derived values in separate signals — use `computed`. Never use `effect` to sync signals — use `computed` or `linkedSignal`.
|
|
81
|
+
|
|
82
|
+
## Subscription Cleanup
|
|
83
|
+
|
|
84
|
+
Use `takeUntilDestroyed()` for all manual subscriptions. Never use manual `ngOnDestroy` + `Subject` + `takeUntil` on new code.
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
export class UserComponent {
|
|
88
|
+
private destroyRef = inject(DestroyRef);
|
|
89
|
+
|
|
90
|
+
ngOnInit() {
|
|
91
|
+
this.userService.updates$
|
|
92
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
93
|
+
.subscribe(update => this.handleUpdate(update));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Routing
|
|
99
|
+
|
|
100
|
+
### Route Definition
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// app.routes.ts
|
|
104
|
+
export const routes: Routes = [
|
|
105
|
+
{ path: '', component: HomeComponent },
|
|
106
|
+
{
|
|
107
|
+
path: 'admin',
|
|
108
|
+
canMatch: [authGuard], // CanMatch prevents loading the chunk at all
|
|
109
|
+
loadChildren: () => import('./admin/admin.routes').then(m => m.ADMIN_ROUTES),
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
path: 'users/:id',
|
|
113
|
+
resolve: { user: userResolver },
|
|
114
|
+
component: UserDetailComponent,
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- Use `canMatch` over `canActivate` when the route module should not load for unauthorized users
|
|
120
|
+
- Lazy-load all feature modules with `loadChildren`
|
|
121
|
+
- Pre-fetch data with `resolve` to avoid loading states in components
|
|
122
|
+
|
|
123
|
+
### Functional Guards
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
export const authGuard: CanActivateFn = () => {
|
|
127
|
+
const auth = inject(AuthService);
|
|
128
|
+
return auth.isAuthenticated()
|
|
129
|
+
? true
|
|
130
|
+
: inject(Router).createUrlTree(['/login']);
|
|
131
|
+
};
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Data Resolvers
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
export const userResolver: ResolveFn<User> = (route) => {
|
|
138
|
+
return inject(UserService).getUser(route.paramMap.get('id')!);
|
|
139
|
+
};
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### View Transitions
|
|
143
|
+
|
|
144
|
+
Enable smooth route transitions with the View Transitions API:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// app.config.ts
|
|
148
|
+
provideRouter(routes, withViewTransitions())
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Dependency Injection Patterns
|
|
152
|
+
|
|
153
|
+
### Scoped Providers
|
|
154
|
+
|
|
155
|
+
Provide services at component or route level when they should not be singletons:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
@Component({
|
|
159
|
+
providers: [UserEditService], // scoped to this component subtree
|
|
160
|
+
})
|
|
161
|
+
export class UserEditComponent {}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### `InjectionToken`
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
export const CONFIG = new InjectionToken<AppConfig>('APP_CONFIG');
|
|
168
|
+
|
|
169
|
+
// In providers:
|
|
170
|
+
{ provide: CONFIG, useValue: appConfig }
|
|
171
|
+
{ provide: CONFIG, useFactory: () => loadConfig(), deps: [] }
|
|
172
|
+
|
|
173
|
+
// Consume:
|
|
174
|
+
private config = inject(CONFIG);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### `viewProviders` vs `providers`
|
|
178
|
+
|
|
179
|
+
- `providers`: Available to the component and all its content children
|
|
180
|
+
- `viewProviders`: Available only to the component's own view (not projected content)
|
|
181
|
+
|
|
182
|
+
## HTTP Interceptors
|
|
183
|
+
|
|
184
|
+
Use functional interceptors (v15+) for auth, error handling, and retries:
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
export const authInterceptor: HttpInterceptorFn = (req, next) => {
|
|
188
|
+
const token = inject(AuthService).token();
|
|
189
|
+
if (!token) return next(req);
|
|
190
|
+
return next(req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }));
|
|
191
|
+
};
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Register in `app.config.ts`:
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
provideHttpClient(withInterceptors([authInterceptor, errorInterceptor]))
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## RxJS Operators
|
|
201
|
+
|
|
202
|
+
- `switchMap` — search, navigation (cancels previous)
|
|
203
|
+
- `mergeMap` — independent parallel requests
|
|
204
|
+
- `exhaustMap` — form submissions (ignores until complete)
|
|
205
|
+
- Always handle errors with `catchError` — never let streams die silently
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
search$ = this.query$.pipe(
|
|
209
|
+
debounceTime(300),
|
|
210
|
+
distinctUntilChanged(),
|
|
211
|
+
switchMap(q => this.service.search(q).pipe(catchError(() => of([])))),
|
|
212
|
+
);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Forms
|
|
216
|
+
|
|
217
|
+
Match the project's existing form strategy. For new v21+ apps, prefer signal forms.
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// Reactive Forms — standard for complex forms
|
|
221
|
+
export class UserFormComponent {
|
|
222
|
+
private fb = inject(FormBuilder);
|
|
223
|
+
|
|
224
|
+
form = this.fb.group({
|
|
225
|
+
name: ['', Validators.required],
|
|
226
|
+
email: ['', [Validators.required, Validators.email]],
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Rendering Strategies
|
|
232
|
+
|
|
233
|
+
- **CSR** (default): Standard SPA
|
|
234
|
+
- **SSR + Hydration**: `ng add @angular/ssr` — improves FCP and SEO
|
|
235
|
+
- **SSG (Prerendering)**: Static pages at build time for content-heavy routes
|
|
236
|
+
|
|
237
|
+
When using SSR, avoid `window`, `document`, `localStorage` directly — use `isPlatformBrowser` or `DOCUMENT` token.
|
|
238
|
+
|
|
239
|
+
## Accessibility
|
|
240
|
+
|
|
241
|
+
Use Angular CDK for headless, accessible components (Accordion, Listbox, Combobox, Menu, Tabs, Toolbar, Tree, Grid). Style ARIA attributes rather than managing them manually:
|
|
242
|
+
|
|
243
|
+
```css
|
|
244
|
+
[aria-selected="true"] { background: var(--color-selected); }
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Skill Reference
|
|
248
|
+
|
|
249
|
+
See skill: `angular-developer` for deep guidance on signals, forms, routing, DI, SSR, and accessibility patterns.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.component.ts"
|
|
4
|
+
- "**/*.component.html"
|
|
5
|
+
- "**/*.service.ts"
|
|
6
|
+
- "**/*.interceptor.ts"
|
|
7
|
+
---
|
|
8
|
+
# Angular Security
|
|
9
|
+
|
|
10
|
+
> This file extends [common/security.md](../common/security.md) with Angular specific content.
|
|
11
|
+
|
|
12
|
+
## XSS Prevention
|
|
13
|
+
|
|
14
|
+
Angular auto-sanitizes bound values. Never bypass the sanitizer on user-controlled input.
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
// WRONG: Bypasses sanitization — XSS risk
|
|
18
|
+
this.safeHtml = this.sanitizer.bypassSecurityTrustHtml(userInput);
|
|
19
|
+
|
|
20
|
+
// CORRECT: Sanitize explicitly before trusting
|
|
21
|
+
this.safeHtml = this.sanitizer.sanitize(SecurityContext.HTML, userInput);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- Never use `bypassSecurityTrust*` methods without a documented, reviewed reason
|
|
25
|
+
- Avoid `[innerHTML]` with untrusted content — use `innerText` or a sanitizing pipe
|
|
26
|
+
- Never bind `[href]` to user input — Angular does not block `javascript:` URLs in all contexts
|
|
27
|
+
- Never construct template strings from user data
|
|
28
|
+
|
|
29
|
+
## HTTP Security
|
|
30
|
+
|
|
31
|
+
Use `HttpClient` exclusively — never raw `fetch()` or `XHR` unless no alternative exists.
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
// WRONG: Bypasses interceptors (auth headers, error handling, logging)
|
|
35
|
+
const res = await fetch('/api/users');
|
|
36
|
+
|
|
37
|
+
// CORRECT
|
|
38
|
+
users$ = this.http.get<User[]>('/api/users');
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- Attach auth tokens via interceptors — never hardcode in individual service calls
|
|
42
|
+
- Type and validate API responses — treat external data as `unknown` at the boundary
|
|
43
|
+
- Never log HTTP responses that may contain tokens, PII, or credentials
|
|
44
|
+
|
|
45
|
+
## Secret Management
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// WRONG: Hardcoded secret in source
|
|
49
|
+
const apiKey = 'sk-live-xxxx';
|
|
50
|
+
|
|
51
|
+
// CORRECT: Injected via environment
|
|
52
|
+
import { environment } from '../environments/environment';
|
|
53
|
+
const apiKey = environment.apiKey;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- Treat `environment.ts` as a config shape — never store real secrets in source-controlled environment files
|
|
57
|
+
- Inject production secrets via CI/CD (environment variables, secret managers)
|
|
58
|
+
|
|
59
|
+
## Route Guards
|
|
60
|
+
|
|
61
|
+
Every authenticated or role-restricted route must have a guard. Never rely on hiding UI elements alone.
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
{
|
|
65
|
+
path: 'admin',
|
|
66
|
+
canMatch: [authGuard, roleGuard('admin')],
|
|
67
|
+
loadChildren: () => import('./admin/admin.routes'),
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Use `canMatch` for sensitive routes — it prevents the route module from loading at all for unauthorized users.
|
|
72
|
+
|
|
73
|
+
## SSR Security
|
|
74
|
+
|
|
75
|
+
When using Angular SSR:
|
|
76
|
+
|
|
77
|
+
- Never expose server-side environment variables to the client via `TransferState` unless they are intentionally public
|
|
78
|
+
- Sanitize all inputs before server-side rendering — DOM-based XSS can occur server-side too
|
|
79
|
+
- Avoid `window`, `document`, `localStorage` on the server — gate with `isPlatformBrowser` or inject via `DOCUMENT` token
|
|
80
|
+
|
|
81
|
+
## Content Security Policy
|
|
82
|
+
|
|
83
|
+
Configure CSP headers server-side. Avoid `unsafe-inline` in `script-src`. When using SSR with inline scripts, use nonces via Angular's CSP support.
|
|
84
|
+
|
|
85
|
+
## Agent Support
|
|
86
|
+
|
|
87
|
+
- Use **security-reviewer** skill for comprehensive security audits
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.spec.ts"
|
|
4
|
+
- "**/*.test.ts"
|
|
5
|
+
---
|
|
6
|
+
# Angular Testing
|
|
7
|
+
|
|
8
|
+
> This file extends [common/testing.md](../common/testing.md) with Angular specific content.
|
|
9
|
+
|
|
10
|
+
## Test Runner
|
|
11
|
+
|
|
12
|
+
Use the test runner configured by the project. Check `angular.json` and `package.json`; Angular projects commonly use Vitest, Jest, or Jasmine + Karma.
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
ng test # watch mode
|
|
16
|
+
ng test --no-watch # CI mode
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## TestBed Setup
|
|
20
|
+
|
|
21
|
+
For standalone components, import the component directly. Call `compileComponents()` for components with external templates.
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
describe('UserCardComponent', () => {
|
|
25
|
+
let fixture: ComponentFixture<UserCardComponent>;
|
|
26
|
+
|
|
27
|
+
beforeEach(async () => {
|
|
28
|
+
await TestBed.configureTestingModule({
|
|
29
|
+
imports: [UserCardComponent],
|
|
30
|
+
}).compileComponents();
|
|
31
|
+
|
|
32
|
+
fixture = TestBed.createComponent(UserCardComponent);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Signal Inputs
|
|
38
|
+
|
|
39
|
+
Set signal-based inputs via `fixture.componentRef.setInput()`:
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
fixture.componentRef.setInput('user', mockUser);
|
|
43
|
+
fixture.detectChanges();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Component Harnesses
|
|
47
|
+
|
|
48
|
+
Prefer Angular CDK component harnesses over direct DOM queries for UI interaction. Harnesses are more resilient to markup changes.
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { HarnessLoader } from '@angular/cdk/testing';
|
|
52
|
+
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
|
|
53
|
+
import { MatButtonHarness } from '@angular/material/button/testing';
|
|
54
|
+
|
|
55
|
+
let loader: HarnessLoader;
|
|
56
|
+
|
|
57
|
+
beforeEach(() => {
|
|
58
|
+
loader = TestbedHarnessEnvironment.loader(fixture);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('triggers save on button click', async () => {
|
|
62
|
+
const button = await loader.getHarness(MatButtonHarness.with({ text: 'Save' }));
|
|
63
|
+
await button.click();
|
|
64
|
+
expect(saveSpy).toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Router Testing
|
|
69
|
+
|
|
70
|
+
Use `RouterTestingHarness` for components that depend on the router:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import { RouterTestingHarness } from '@angular/router/testing';
|
|
74
|
+
|
|
75
|
+
it('renders user on navigation', async () => {
|
|
76
|
+
const harness = await RouterTestingHarness.create();
|
|
77
|
+
const component = await harness.navigateByUrl('/users/1', UserDetailComponent);
|
|
78
|
+
expect(component.userId()).toBe('1');
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Async Testing
|
|
83
|
+
|
|
84
|
+
Use `fakeAsync` + `tick` for controlled async. Use `waitForAsync` for real async with `fixture.whenStable()`.
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
it('loads user after delay', fakeAsync(() => {
|
|
88
|
+
const service = TestBed.inject(UserService);
|
|
89
|
+
vi.spyOn(service, 'getUser').mockReturnValue(of(mockUser));
|
|
90
|
+
|
|
91
|
+
fixture.detectChanges();
|
|
92
|
+
tick();
|
|
93
|
+
fixture.detectChanges();
|
|
94
|
+
|
|
95
|
+
expect(fixture.nativeElement.querySelector('.name').textContent).toBe(mockUser.name);
|
|
96
|
+
}));
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## HTTP Testing
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
|
103
|
+
import { HttpTestingController } from '@angular/common/http/testing';
|
|
104
|
+
|
|
105
|
+
beforeEach(() => {
|
|
106
|
+
TestBed.configureTestingModule({
|
|
107
|
+
providers: [provideHttpClient(), provideHttpClientTesting()],
|
|
108
|
+
});
|
|
109
|
+
httpMock = TestBed.inject(HttpTestingController);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
afterEach(() => httpMock.verify());
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Service Testing
|
|
116
|
+
|
|
117
|
+
Inject services directly without a component fixture:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
describe('UserService', () => {
|
|
121
|
+
let service: UserService;
|
|
122
|
+
|
|
123
|
+
beforeEach(() => {
|
|
124
|
+
TestBed.configureTestingModule({
|
|
125
|
+
providers: [provideHttpClient(), provideHttpClientTesting()],
|
|
126
|
+
});
|
|
127
|
+
service = TestBed.inject(UserService);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## What to Test
|
|
133
|
+
|
|
134
|
+
- **Services**: All public methods, error paths, HTTP interactions
|
|
135
|
+
- **Components**: Input/output bindings, rendered output for key states, user interactions via harnesses
|
|
136
|
+
- **Pipes**: Pure transformation — plain unit tests, no TestBed needed
|
|
137
|
+
- **Guards/Resolvers**: Return values for allowed and denied states using `RouterTestingHarness`
|
|
138
|
+
|
|
139
|
+
## E2E Testing
|
|
140
|
+
|
|
141
|
+
Use the project's configured E2E framework, such as Cypress or Playwright, for critical user flows.
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
describe('Login flow', () => {
|
|
145
|
+
it('redirects to dashboard on valid credentials', () => {
|
|
146
|
+
cy.visit('/login');
|
|
147
|
+
cy.get('[data-cy=email]').type('user@example.com');
|
|
148
|
+
cy.get('[data-cy=password]').type('password123');
|
|
149
|
+
cy.get('[data-cy=submit]').click();
|
|
150
|
+
cy.url().should('include', '/dashboard');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- Add `data-cy` attributes to interactive elements for stable selectors
|
|
156
|
+
- Do not rely on CSS classes or text content for selectors in E2E tests
|
|
157
|
+
|
|
158
|
+
## Coverage
|
|
159
|
+
|
|
160
|
+
Target ≥80% for services and pipes. Components: test behaviour, not implementation details.
|
|
161
|
+
|
|
162
|
+
## Skill Reference
|
|
163
|
+
|
|
164
|
+
See skill: `angular-developer` for comprehensive testing patterns, harness usage, and async best practices.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.ets"
|
|
4
|
+
- "**/*.ts"
|
|
5
|
+
- "**/module.json5"
|
|
6
|
+
- "**/oh-package.json5"
|
|
7
|
+
- "**/build-profile.json5"
|
|
8
|
+
---
|
|
9
|
+
# HarmonyOS / ArkTS Coding Style
|
|
10
|
+
|
|
11
|
+
> This file extends [common/coding-style.md](../common/coding-style.md) with HarmonyOS and ArkTS-specific content.
|
|
12
|
+
|
|
13
|
+
## ArkTS Language Constraints
|
|
14
|
+
|
|
15
|
+
ArkTS is a strict, statically-typed subset of TypeScript. Violating these constraints causes **compilation failures**.
|
|
16
|
+
|
|
17
|
+
### Type System
|
|
18
|
+
|
|
19
|
+
- No `any` or `unknown` types - always use explicit types
|
|
20
|
+
- No index access types - use type names directly
|
|
21
|
+
- No conditional type aliases or `infer` keyword
|
|
22
|
+
- No intersection types - use inheritance
|
|
23
|
+
- No mapped types - use classes and regular idioms
|
|
24
|
+
- No `typeof` for type annotations - use explicit type declarations
|
|
25
|
+
- No `as const` assertions - use explicit type annotations
|
|
26
|
+
- No structural typing - use inheritance, interfaces, or type aliases
|
|
27
|
+
- No TypeScript utility types except `Partial`, `Required`, `Readonly`, `Record`
|
|
28
|
+
- For `Record<K, V>`, index expression type is `V | undefined`
|
|
29
|
+
- Omit type annotations in `catch` clauses (ArkTS does not support `any`/`unknown`)
|
|
30
|
+
|
|
31
|
+
### Functions & Classes
|
|
32
|
+
|
|
33
|
+
- No function expressions - use arrow functions
|
|
34
|
+
- No nested functions - use lambdas
|
|
35
|
+
- No generator functions - use `async`/`await` for multitasking
|
|
36
|
+
- No `Function.apply`, `Function.call`, `Function.bind` - follow traditional OOP for `this`
|
|
37
|
+
- No constructor type expressions - use lambdas
|
|
38
|
+
- No constructor signatures in interfaces or object types - use methods or classes
|
|
39
|
+
- No declaring class fields in constructors - declare in class body
|
|
40
|
+
- No `this` in standalone functions or static methods - only in instance methods
|
|
41
|
+
- No `new.target`
|
|
42
|
+
- No definite assignment assertions (`let v!: T`) - use initialized declarations
|
|
43
|
+
- No class literals - introduce named class types
|
|
44
|
+
- No using classes as objects (assigning to variables) - class declarations introduce types, not values
|
|
45
|
+
- Only one static block per class - merge all static statements
|
|
46
|
+
|
|
47
|
+
### Object & Property Access
|
|
48
|
+
|
|
49
|
+
- No dynamic field declaration or `obj["field"]` access - use `obj.field` syntax
|
|
50
|
+
- No `delete` operator - use nullable type with `null` to mark absence
|
|
51
|
+
- No prototype assignment - use classes and interfaces
|
|
52
|
+
- No `in` operator - use `instanceof`
|
|
53
|
+
- No reassigning object methods - use wrapper functions or inheritance
|
|
54
|
+
- No `Symbol()` API (except `Symbol.iterator`)
|
|
55
|
+
- No `globalThis` or global scope - use explicit module exports/imports
|
|
56
|
+
- No namespaces as objects - use classes or modules
|
|
57
|
+
- No statements inside namespaces - use functions
|
|
58
|
+
|
|
59
|
+
### Destructuring & Spread
|
|
60
|
+
|
|
61
|
+
- No destructuring assignments or variable declarations - use intermediate objects and field-by-field access
|
|
62
|
+
- No destructuring parameter declarations - pass parameters directly, assign local names manually
|
|
63
|
+
- Spread operator only for expanding arrays (or array-derived classes) into rest parameters or array literals
|
|
64
|
+
|
|
65
|
+
### Modules & Imports
|
|
66
|
+
|
|
67
|
+
- No `require()` - use regular `import` syntax
|
|
68
|
+
- No `export = ...` - use normal export/import
|
|
69
|
+
- No import assertions - imports are compile-time in ArkTS
|
|
70
|
+
- No UMD modules
|
|
71
|
+
- No wildcards in module names
|
|
72
|
+
- All `import` statements must appear before all other statements
|
|
73
|
+
- TypeScript codebases must not depend on ArkTS codebases via import (reverse is supported)
|
|
74
|
+
|
|
75
|
+
### Other Restrictions
|
|
76
|
+
|
|
77
|
+
- No `var` - use `let`
|
|
78
|
+
- No `for...in` loops - use regular `for` loops for arrays
|
|
79
|
+
- No `with` statements
|
|
80
|
+
- No JSX expressions
|
|
81
|
+
- No `#` private identifiers - use `private` keyword
|
|
82
|
+
- No declaration merging (classes, interfaces, enums) - keep definitions compact
|
|
83
|
+
- No index signatures - use arrays
|
|
84
|
+
- Comma operator only in `for` loops
|
|
85
|
+
- Unary operators `+`, `-`, `~` only for numeric types (no implicit string conversion)
|
|
86
|
+
- Enum members: only same-type compile-time expressions for explicit initializers
|
|
87
|
+
- Function return type inference is limited - specify return types explicitly when calling functions with omitted return types
|
|
88
|
+
|
|
89
|
+
### Object Literals
|
|
90
|
+
|
|
91
|
+
- Supported only when compiler can infer the corresponding class or interface
|
|
92
|
+
- NOT supported for: `any`/`Object`/`object` types, classes/interfaces with methods, classes with parameterized constructors, classes with `readonly` fields
|
|
93
|
+
|
|
94
|
+
## Naming Conventions
|
|
95
|
+
|
|
96
|
+
- Variables / functions: `camelCase` (e.g., `getUserInfo`, `goodsList`)
|
|
97
|
+
- Classes / interfaces: `PascalCase` (e.g., `UserViewModel`, `IGoodsModel`)
|
|
98
|
+
- Constants: `UPPER_SNAKE_CASE` (e.g., `MAX_PAGE_SIZE`, `COLOR_PRIMARY`)
|
|
99
|
+
- File names: `PascalCase` for components (e.g., `HomePage.ets`), `camelCase` for utilities
|
|
100
|
+
|
|
101
|
+
## Formatting
|
|
102
|
+
|
|
103
|
+
- Prefer double quotes for strings
|
|
104
|
+
- Semicolons at end of statements
|
|
105
|
+
- Never use `var` - prefer `const`, then `let`
|
|
106
|
+
- All methods, parameters, return values must have complete type annotations
|
|
107
|
+
|
|
108
|
+
## File Organization
|
|
109
|
+
|
|
110
|
+
- Component files (`.ets`): one `@ComponentV2` per file
|
|
111
|
+
- ViewModel files: one ViewModel class per file
|
|
112
|
+
- Model files: related data models may share a file
|
|
113
|
+
- Keep files under 400 lines; extract helpers for files approaching 800 lines
|
|
114
|
+
|
|
115
|
+
## Comments
|
|
116
|
+
|
|
117
|
+
- File header: `@file` (file purpose) + `@author` (developer), if the project already uses file headers
|
|
118
|
+
- Public methods: JSDoc with `@param`, `@returns`; add `@example` for complex methods
|
|
119
|
+
- Match the project's existing documentation language; use English unless the repository has already standardized on Chinese comments
|
|
120
|
+
|
|
121
|
+
## Error Handling
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// Use try/catch with proper error handling
|
|
125
|
+
try {
|
|
126
|
+
const result = await riskyOperation()
|
|
127
|
+
return result
|
|
128
|
+
} catch (error) {
|
|
129
|
+
hilog.error(0x0000, 'TAG', 'Operation failed: %{public}s', error)
|
|
130
|
+
throw new Error('User-friendly error message')
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Immutability
|
|
135
|
+
|
|
136
|
+
Follow the common immutability principles - create new objects instead of mutating:
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// BAD: mutation
|
|
140
|
+
function updateUser(user: UserModel, name: string): UserModel {
|
|
141
|
+
user.name = name // direct mutation
|
|
142
|
+
return user
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// GOOD: immutable - create new instance
|
|
146
|
+
function updateUser(user: UserModel, name: string): UserModel {
|
|
147
|
+
const updated = new UserModel()
|
|
148
|
+
updated.id = user.id
|
|
149
|
+
updated.name = name
|
|
150
|
+
updated.email = user.email
|
|
151
|
+
return updated
|
|
152
|
+
}
|
|
153
|
+
```
|