compact-agent 1.10.1 → 1.11.1
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/config.js +9 -1
- package/dist/config.js.map +1 -1
- 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/dist/query.js +26 -0
- package/dist/query.js.map +1 -1
- package/dist/theme.js +6 -2
- package/dist/theme.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,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
---
|
|
6
|
+
# Kotlin Coding Style
|
|
7
|
+
|
|
8
|
+
> This file extends [common/coding-style.md](../common/coding-style.md) with Kotlin-specific content.
|
|
9
|
+
|
|
10
|
+
## Formatting
|
|
11
|
+
|
|
12
|
+
- **ktlint** or **Detekt** for style enforcement
|
|
13
|
+
- Official Kotlin code style (`kotlin.code.style=official` in `gradle.properties`)
|
|
14
|
+
|
|
15
|
+
## Immutability
|
|
16
|
+
|
|
17
|
+
- Prefer `val` over `var` — default to `val` and only use `var` when mutation is required
|
|
18
|
+
- Use `data class` for value types; use immutable collections (`List`, `Map`, `Set`) in public APIs
|
|
19
|
+
- Copy-on-write for state updates: `state.copy(field = newValue)`
|
|
20
|
+
|
|
21
|
+
## Naming
|
|
22
|
+
|
|
23
|
+
Follow Kotlin conventions:
|
|
24
|
+
- `camelCase` for functions and properties
|
|
25
|
+
- `PascalCase` for classes, interfaces, objects, and type aliases
|
|
26
|
+
- `SCREAMING_SNAKE_CASE` for constants (`const val` or `@JvmStatic`)
|
|
27
|
+
- Prefix interfaces with behavior, not `I`: `Clickable` not `IClickable`
|
|
28
|
+
|
|
29
|
+
## Null Safety
|
|
30
|
+
|
|
31
|
+
- Never use `!!` — prefer `?.`, `?:`, `requireNotNull()`, or `checkNotNull()`
|
|
32
|
+
- Use `?.let {}` for scoped null-safe operations
|
|
33
|
+
- Return nullable types from functions that can legitimately have no result
|
|
34
|
+
|
|
35
|
+
```kotlin
|
|
36
|
+
// BAD
|
|
37
|
+
val name = user!!.name
|
|
38
|
+
|
|
39
|
+
// GOOD
|
|
40
|
+
val name = user?.name ?: "Unknown"
|
|
41
|
+
val name = requireNotNull(user) { "User must be set before accessing name" }.name
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Sealed Types
|
|
45
|
+
|
|
46
|
+
Use sealed classes/interfaces to model closed state hierarchies:
|
|
47
|
+
|
|
48
|
+
```kotlin
|
|
49
|
+
sealed interface UiState<out T> {
|
|
50
|
+
data object Loading : UiState<Nothing>
|
|
51
|
+
data class Success<T>(val data: T) : UiState<T>
|
|
52
|
+
data class Error(val message: String) : UiState<Nothing>
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Always use exhaustive `when` with sealed types — no `else` branch.
|
|
57
|
+
|
|
58
|
+
## Extension Functions
|
|
59
|
+
|
|
60
|
+
Use extension functions for utility operations, but keep them discoverable:
|
|
61
|
+
- Place in a file named after the receiver type (`StringExt.kt`, `FlowExt.kt`)
|
|
62
|
+
- Keep scope limited — don't add extensions to `Any` or overly generic types
|
|
63
|
+
|
|
64
|
+
## Scope Functions
|
|
65
|
+
|
|
66
|
+
Use the right scope function:
|
|
67
|
+
- `let` — null check + transform: `user?.let { greet(it) }`
|
|
68
|
+
- `run` — compute a result using receiver: `service.run { fetch(config) }`
|
|
69
|
+
- `apply` — configure an object: `builder.apply { timeout = 30 }`
|
|
70
|
+
- `also` — side effects: `result.also { log(it) }`
|
|
71
|
+
- Avoid deep nesting of scope functions (max 2 levels)
|
|
72
|
+
|
|
73
|
+
## Error Handling
|
|
74
|
+
|
|
75
|
+
- Use `Result<T>` or custom sealed types
|
|
76
|
+
- Use `runCatching {}` for wrapping throwable code
|
|
77
|
+
- Never catch `CancellationException` — always rethrow it
|
|
78
|
+
- Avoid `try-catch` for control flow
|
|
79
|
+
|
|
80
|
+
```kotlin
|
|
81
|
+
// BAD — using exceptions for control flow
|
|
82
|
+
val user = try { repository.getUser(id) } catch (e: NotFoundException) { null }
|
|
83
|
+
|
|
84
|
+
// GOOD — nullable return
|
|
85
|
+
val user: User? = repository.findUser(id)
|
|
86
|
+
```
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
- "**/build.gradle.kts"
|
|
5
6
|
---
|
|
6
7
|
# Kotlin Hooks
|
|
7
8
|
|
|
8
|
-
> This file extends
|
|
9
|
+
> This file extends [common/hooks.md](../common/hooks.md) with Kotlin-specific content.
|
|
9
10
|
|
|
10
11
|
## PostToolUse Hooks
|
|
11
12
|
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
---
|
|
6
|
+
# Kotlin Patterns
|
|
7
|
+
|
|
8
|
+
> This file extends [common/patterns.md](../common/patterns.md) with Kotlin and Android/KMP-specific content.
|
|
9
|
+
|
|
10
|
+
## Dependency Injection
|
|
11
|
+
|
|
12
|
+
Prefer constructor injection. Use Koin (KMP) or Hilt (Android-only):
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Koin — declare modules
|
|
16
|
+
val dataModule = module {
|
|
17
|
+
single<ItemRepository> { ItemRepositoryImpl(get(), get()) }
|
|
18
|
+
factory { GetItemsUseCase(get()) }
|
|
19
|
+
viewModelOf(::ItemListViewModel)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Hilt — annotations
|
|
23
|
+
@HiltViewModel
|
|
24
|
+
class ItemListViewModel @Inject constructor(
|
|
25
|
+
private val getItems: GetItemsUseCase
|
|
26
|
+
) : ViewModel()
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## ViewModel Pattern
|
|
30
|
+
|
|
31
|
+
Single state object, event sink, one-way data flow:
|
|
32
|
+
|
|
33
|
+
```kotlin
|
|
34
|
+
data class ScreenState(
|
|
35
|
+
val items: List<Item> = emptyList(),
|
|
36
|
+
val isLoading: Boolean = false
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
class ScreenViewModel(private val useCase: GetItemsUseCase) : ViewModel() {
|
|
40
|
+
private val _state = MutableStateFlow(ScreenState())
|
|
41
|
+
val state = _state.asStateFlow()
|
|
42
|
+
|
|
43
|
+
fun onEvent(event: ScreenEvent) {
|
|
44
|
+
when (event) {
|
|
45
|
+
is ScreenEvent.Load -> load()
|
|
46
|
+
is ScreenEvent.Delete -> delete(event.id)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Repository Pattern
|
|
53
|
+
|
|
54
|
+
- `suspend` functions return `Result<T>` or custom error type
|
|
55
|
+
- `Flow` for reactive streams
|
|
56
|
+
- Coordinate local + remote data sources
|
|
57
|
+
|
|
58
|
+
```kotlin
|
|
59
|
+
interface ItemRepository {
|
|
60
|
+
suspend fun getById(id: String): Result<Item>
|
|
61
|
+
suspend fun getAll(): Result<List<Item>>
|
|
62
|
+
fun observeAll(): Flow<List<Item>>
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## UseCase Pattern
|
|
67
|
+
|
|
68
|
+
Single responsibility, `operator fun invoke`:
|
|
69
|
+
|
|
70
|
+
```kotlin
|
|
71
|
+
class GetItemUseCase(private val repository: ItemRepository) {
|
|
72
|
+
suspend operator fun invoke(id: String): Result<Item> {
|
|
73
|
+
return repository.getById(id)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
class GetItemsUseCase(private val repository: ItemRepository) {
|
|
78
|
+
suspend operator fun invoke(): Result<List<Item>> {
|
|
79
|
+
return repository.getAll()
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## expect/actual (KMP)
|
|
85
|
+
|
|
86
|
+
Use for platform-specific implementations:
|
|
87
|
+
|
|
88
|
+
```kotlin
|
|
89
|
+
// commonMain
|
|
90
|
+
expect fun platformName(): String
|
|
91
|
+
expect class SecureStorage {
|
|
92
|
+
fun save(key: String, value: String)
|
|
93
|
+
fun get(key: String): String?
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// androidMain
|
|
97
|
+
actual fun platformName(): String = "Android"
|
|
98
|
+
actual class SecureStorage {
|
|
99
|
+
actual fun save(key: String, value: String) { /* EncryptedSharedPreferences */ }
|
|
100
|
+
actual fun get(key: String): String? = null /* ... */
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// iosMain
|
|
104
|
+
actual fun platformName(): String = "iOS"
|
|
105
|
+
actual class SecureStorage {
|
|
106
|
+
actual fun save(key: String, value: String) { /* Keychain */ }
|
|
107
|
+
actual fun get(key: String): String? = null /* ... */
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Coroutine Patterns
|
|
112
|
+
|
|
113
|
+
- Use `viewModelScope` in ViewModels, `coroutineScope` for structured child work
|
|
114
|
+
- Use `stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), initialValue)` for StateFlow from cold Flows
|
|
115
|
+
- Use `supervisorScope` when child failures should be independent
|
|
116
|
+
|
|
117
|
+
## Builder Pattern with DSL
|
|
118
|
+
|
|
119
|
+
```kotlin
|
|
120
|
+
class HttpClientConfig {
|
|
121
|
+
var baseUrl: String = ""
|
|
122
|
+
var timeout: Long = 30_000
|
|
123
|
+
private val interceptors = mutableListOf<Interceptor>()
|
|
124
|
+
|
|
125
|
+
fun interceptor(block: () -> Interceptor) {
|
|
126
|
+
interceptors.add(block())
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
fun httpClient(block: HttpClientConfig.() -> Unit): HttpClient {
|
|
131
|
+
val config = HttpClientConfig().apply(block)
|
|
132
|
+
return HttpClient(config)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Usage
|
|
136
|
+
val client = httpClient {
|
|
137
|
+
baseUrl = "https://api.example.com"
|
|
138
|
+
timeout = 15_000
|
|
139
|
+
interceptor { AuthInterceptor(tokenProvider) }
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## References
|
|
144
|
+
|
|
145
|
+
See skill: `kotlin-coroutines-flows` for detailed coroutine patterns.
|
|
146
|
+
See skill: `android-clean-architecture` for module and layer patterns.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
---
|
|
6
|
+
# Kotlin Security
|
|
7
|
+
|
|
8
|
+
> This file extends [common/security.md](../common/security.md) with Kotlin and Android/KMP-specific content.
|
|
9
|
+
|
|
10
|
+
## Secrets Management
|
|
11
|
+
|
|
12
|
+
- Never hardcode API keys, tokens, or credentials in source code
|
|
13
|
+
- Use `local.properties` (git-ignored) for local development secrets
|
|
14
|
+
- Use `BuildConfig` fields generated from CI secrets for release builds
|
|
15
|
+
- Use `EncryptedSharedPreferences` (Android) or Keychain (iOS) for runtime secret storage
|
|
16
|
+
|
|
17
|
+
```kotlin
|
|
18
|
+
// BAD
|
|
19
|
+
val apiKey = "sk-abc123..."
|
|
20
|
+
|
|
21
|
+
// GOOD — from BuildConfig (generated at build time)
|
|
22
|
+
val apiKey = BuildConfig.API_KEY
|
|
23
|
+
|
|
24
|
+
// GOOD — from secure storage at runtime
|
|
25
|
+
val token = secureStorage.get("auth_token")
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Network Security
|
|
29
|
+
|
|
30
|
+
- Use HTTPS exclusively — configure `network_security_config.xml` to block cleartext
|
|
31
|
+
- Pin certificates for sensitive endpoints using OkHttp `CertificatePinner` or Ktor equivalent
|
|
32
|
+
- Set timeouts on all HTTP clients — never leave defaults (which may be infinite)
|
|
33
|
+
- Validate and sanitize all server responses before use
|
|
34
|
+
|
|
35
|
+
```xml
|
|
36
|
+
<!-- res/xml/network_security_config.xml -->
|
|
37
|
+
<network-security-config>
|
|
38
|
+
<base-config cleartextTrafficPermitted="false" />
|
|
39
|
+
</network-security-config>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Input Validation
|
|
43
|
+
|
|
44
|
+
- Validate all user input before processing or sending to API
|
|
45
|
+
- Use parameterized queries for Room/SQLDelight — never concatenate user input into SQL
|
|
46
|
+
- Sanitize file paths from user input to prevent path traversal
|
|
47
|
+
|
|
48
|
+
```kotlin
|
|
49
|
+
// BAD — SQL injection
|
|
50
|
+
@Query("SELECT * FROM items WHERE name = '$input'")
|
|
51
|
+
|
|
52
|
+
// GOOD — parameterized
|
|
53
|
+
@Query("SELECT * FROM items WHERE name = :input")
|
|
54
|
+
fun findByName(input: String): List<ItemEntity>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Data Protection
|
|
58
|
+
|
|
59
|
+
- Use `EncryptedSharedPreferences` for sensitive key-value data on Android
|
|
60
|
+
- Use `@Serializable` with explicit field names — don't leak internal property names
|
|
61
|
+
- Clear sensitive data from memory when no longer needed
|
|
62
|
+
- Use `@Keep` or ProGuard rules for serialized classes to prevent name mangling
|
|
63
|
+
|
|
64
|
+
## Authentication
|
|
65
|
+
|
|
66
|
+
- Store tokens in secure storage, not in plain SharedPreferences
|
|
67
|
+
- Implement token refresh with proper 401/403 handling
|
|
68
|
+
- Clear all auth state on logout (tokens, cached user data, cookies)
|
|
69
|
+
- Use biometric authentication (`BiometricPrompt`) for sensitive operations
|
|
70
|
+
|
|
71
|
+
## ProGuard / R8
|
|
72
|
+
|
|
73
|
+
- Keep rules for all serialized models (`@Serializable`, Gson, Moshi)
|
|
74
|
+
- Keep rules for reflection-based libraries (Koin, Retrofit)
|
|
75
|
+
- Test release builds — obfuscation can break serialization silently
|
|
76
|
+
|
|
77
|
+
## WebView Security
|
|
78
|
+
|
|
79
|
+
- Disable JavaScript unless explicitly needed: `settings.javaScriptEnabled = false`
|
|
80
|
+
- Validate URLs before loading in WebView
|
|
81
|
+
- Never expose `@JavascriptInterface` methods that access sensitive data
|
|
82
|
+
- Use `WebViewClient.shouldOverrideUrlLoading()` to control navigation
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.kt"
|
|
4
|
+
- "**/*.kts"
|
|
5
|
+
---
|
|
6
|
+
# Kotlin Testing
|
|
7
|
+
|
|
8
|
+
> This file extends [common/testing.md](../common/testing.md) with Kotlin and Android/KMP-specific content.
|
|
9
|
+
|
|
10
|
+
## Test Framework
|
|
11
|
+
|
|
12
|
+
- **kotlin.test** for multiplatform (KMP) — `@Test`, `assertEquals`, `assertTrue`
|
|
13
|
+
- **JUnit 4/5** for Android-specific tests
|
|
14
|
+
- **Turbine** for testing Flows and StateFlow
|
|
15
|
+
- **kotlinx-coroutines-test** for coroutine testing (`runTest`, `TestDispatcher`)
|
|
16
|
+
|
|
17
|
+
## ViewModel Testing with Turbine
|
|
18
|
+
|
|
19
|
+
```kotlin
|
|
20
|
+
@Test
|
|
21
|
+
fun `loading state emitted then data`() = runTest {
|
|
22
|
+
val repo = FakeItemRepository()
|
|
23
|
+
repo.addItem(testItem)
|
|
24
|
+
val viewModel = ItemListViewModel(GetItemsUseCase(repo))
|
|
25
|
+
|
|
26
|
+
viewModel.state.test {
|
|
27
|
+
assertEquals(ItemListState(), awaitItem()) // initial state
|
|
28
|
+
viewModel.onEvent(ItemListEvent.Load)
|
|
29
|
+
assertTrue(awaitItem().isLoading) // loading
|
|
30
|
+
assertEquals(listOf(testItem), awaitItem().items) // loaded
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Fakes Over Mocks
|
|
36
|
+
|
|
37
|
+
Prefer hand-written fakes over mocking frameworks:
|
|
38
|
+
|
|
39
|
+
```kotlin
|
|
40
|
+
class FakeItemRepository : ItemRepository {
|
|
41
|
+
private val items = mutableListOf<Item>()
|
|
42
|
+
var fetchError: Throwable? = null
|
|
43
|
+
|
|
44
|
+
override suspend fun getAll(): Result<List<Item>> {
|
|
45
|
+
fetchError?.let { return Result.failure(it) }
|
|
46
|
+
return Result.success(items.toList())
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
override fun observeAll(): Flow<List<Item>> = flowOf(items.toList())
|
|
50
|
+
|
|
51
|
+
fun addItem(item: Item) { items.add(item) }
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Coroutine Testing
|
|
56
|
+
|
|
57
|
+
```kotlin
|
|
58
|
+
@Test
|
|
59
|
+
fun `parallel operations complete`() = runTest {
|
|
60
|
+
val repo = FakeRepository()
|
|
61
|
+
val result = loadDashboard(repo)
|
|
62
|
+
advanceUntilIdle()
|
|
63
|
+
assertNotNull(result.items)
|
|
64
|
+
assertNotNull(result.stats)
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Use `runTest` — it auto-advances virtual time and provides `TestScope`.
|
|
69
|
+
|
|
70
|
+
## Ktor MockEngine
|
|
71
|
+
|
|
72
|
+
```kotlin
|
|
73
|
+
val mockEngine = MockEngine { request ->
|
|
74
|
+
when (request.url.encodedPath) {
|
|
75
|
+
"/api/items" -> respond(
|
|
76
|
+
content = Json.encodeToString(testItems),
|
|
77
|
+
headers = headersOf(HttpHeaders.ContentType, ContentType.Application.Json.toString())
|
|
78
|
+
)
|
|
79
|
+
else -> respondError(HttpStatusCode.NotFound)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
val client = HttpClient(mockEngine) {
|
|
84
|
+
install(ContentNegotiation) { json() }
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Room/SQLDelight Testing
|
|
89
|
+
|
|
90
|
+
- Room: Use `Room.inMemoryDatabaseBuilder()` for in-memory testing
|
|
91
|
+
- SQLDelight: Use `JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)` for JVM tests
|
|
92
|
+
|
|
93
|
+
```kotlin
|
|
94
|
+
@Test
|
|
95
|
+
fun `insert and query items`() = runTest {
|
|
96
|
+
val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)
|
|
97
|
+
Database.Schema.create(driver)
|
|
98
|
+
val db = Database(driver)
|
|
99
|
+
|
|
100
|
+
db.itemQueries.insert("1", "Sample Item", "description")
|
|
101
|
+
val items = db.itemQueries.getAll().executeAsList()
|
|
102
|
+
assertEquals(1, items.size)
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Test Naming
|
|
107
|
+
|
|
108
|
+
Use backtick-quoted descriptive names:
|
|
109
|
+
|
|
110
|
+
```kotlin
|
|
111
|
+
@Test
|
|
112
|
+
fun `search with empty query returns all items`() = runTest { }
|
|
113
|
+
|
|
114
|
+
@Test
|
|
115
|
+
fun `delete item emits updated list without deleted item`() = runTest { }
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Test Organization
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
src/
|
|
122
|
+
├── commonTest/kotlin/ # Shared tests (ViewModel, UseCase, Repository)
|
|
123
|
+
├── androidUnitTest/kotlin/ # Android unit tests (JUnit)
|
|
124
|
+
├── androidInstrumentedTest/kotlin/ # Instrumented tests (Room, UI)
|
|
125
|
+
└── iosTest/kotlin/ # iOS-specific tests
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Minimum test coverage: ViewModel + UseCase for every feature.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.pl"
|
|
4
|
+
- "**/*.pm"
|
|
5
|
+
- "**/*.t"
|
|
6
|
+
- "**/*.psgi"
|
|
7
|
+
- "**/*.cgi"
|
|
8
|
+
---
|
|
9
|
+
# Perl Coding Style
|
|
10
|
+
|
|
11
|
+
> This file extends [common/coding-style.md](../common/coding-style.md) with Perl-specific content.
|
|
12
|
+
|
|
13
|
+
## Standards
|
|
14
|
+
|
|
15
|
+
- Always `use v5.36` (enables `strict`, `warnings`, `say`, subroutine signatures)
|
|
16
|
+
- Use subroutine signatures — never unpack `@_` manually
|
|
17
|
+
- Prefer `say` over `print` with explicit newlines
|
|
18
|
+
|
|
19
|
+
## Immutability
|
|
20
|
+
|
|
21
|
+
- Use **Moo** with `is => 'ro'` and `Types::Standard` for all attributes
|
|
22
|
+
- Never use blessed hashrefs directly — always use Moo/Moose accessors
|
|
23
|
+
- **OO override note**: Moo `has` attributes with `builder` or `default` are acceptable for computed read-only values
|
|
24
|
+
|
|
25
|
+
## Formatting
|
|
26
|
+
|
|
27
|
+
Use **perltidy** with these settings:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
-i=4 # 4-space indent
|
|
31
|
+
-l=100 # 100 char line length
|
|
32
|
+
-ce # cuddled else
|
|
33
|
+
-bar # opening brace always right
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Linting
|
|
37
|
+
|
|
38
|
+
Use **perlcritic** at severity 3 with themes: `core`, `pbp`, `security`.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
perlcritic --severity 3 --theme 'core || pbp || security' lib/
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Reference
|
|
45
|
+
|
|
46
|
+
See skill: `perl-patterns` for comprehensive modern Perl idioms and best practices.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.pl"
|
|
4
|
+
- "**/*.pm"
|
|
5
|
+
- "**/*.t"
|
|
6
|
+
- "**/*.psgi"
|
|
7
|
+
- "**/*.cgi"
|
|
8
|
+
---
|
|
9
|
+
# Perl Hooks
|
|
10
|
+
|
|
11
|
+
> This file extends [common/hooks.md](../common/hooks.md) with Perl-specific content.
|
|
12
|
+
|
|
13
|
+
## PostToolUse Hooks
|
|
14
|
+
|
|
15
|
+
Configure in `~/.claude/settings.json`:
|
|
16
|
+
|
|
17
|
+
- **perltidy**: Auto-format `.pl` and `.pm` files after edit
|
|
18
|
+
- **perlcritic**: Run lint check after editing `.pm` files
|
|
19
|
+
|
|
20
|
+
## Warnings
|
|
21
|
+
|
|
22
|
+
- Warn about `print` in non-script `.pm` files — use `say` or a logging module (e.g., `Log::Any`)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.pl"
|
|
4
|
+
- "**/*.pm"
|
|
5
|
+
- "**/*.t"
|
|
6
|
+
- "**/*.psgi"
|
|
7
|
+
- "**/*.cgi"
|
|
8
|
+
---
|
|
9
|
+
# Perl Patterns
|
|
10
|
+
|
|
11
|
+
> This file extends [common/patterns.md](../common/patterns.md) with Perl-specific content.
|
|
12
|
+
|
|
13
|
+
## Repository Pattern
|
|
14
|
+
|
|
15
|
+
Use **DBI** or **DBIx::Class** behind an interface:
|
|
16
|
+
|
|
17
|
+
```perl
|
|
18
|
+
package MyApp::Repo::User;
|
|
19
|
+
use Moo;
|
|
20
|
+
|
|
21
|
+
has dbh => (is => 'ro', required => 1);
|
|
22
|
+
|
|
23
|
+
sub find_by_id ($self, $id) {
|
|
24
|
+
my $sth = $self->dbh->prepare('SELECT * FROM users WHERE id = ?');
|
|
25
|
+
$sth->execute($id);
|
|
26
|
+
return $sth->fetchrow_hashref;
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## DTOs / Value Objects
|
|
31
|
+
|
|
32
|
+
Use **Moo** classes with **Types::Standard** (equivalent to Python dataclasses):
|
|
33
|
+
|
|
34
|
+
```perl
|
|
35
|
+
package MyApp::DTO::User;
|
|
36
|
+
use Moo;
|
|
37
|
+
use Types::Standard qw(Str Int);
|
|
38
|
+
|
|
39
|
+
has name => (is => 'ro', isa => Str, required => 1);
|
|
40
|
+
has email => (is => 'ro', isa => Str, required => 1);
|
|
41
|
+
has age => (is => 'ro', isa => Int);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Resource Management
|
|
45
|
+
|
|
46
|
+
- Always use **three-arg open** with `autodie`
|
|
47
|
+
- Use **Path::Tiny** for file operations
|
|
48
|
+
|
|
49
|
+
```perl
|
|
50
|
+
use autodie;
|
|
51
|
+
use Path::Tiny;
|
|
52
|
+
|
|
53
|
+
my $content = path('config.json')->slurp_utf8;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Module Interface
|
|
57
|
+
|
|
58
|
+
Use `Exporter 'import'` with `@EXPORT_OK` — never `@EXPORT`:
|
|
59
|
+
|
|
60
|
+
```perl
|
|
61
|
+
use Exporter 'import';
|
|
62
|
+
our @EXPORT_OK = qw(parse_config validate_input);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Dependency Management
|
|
66
|
+
|
|
67
|
+
Use **cpanfile** + **carton** for reproducible installs:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
carton install
|
|
71
|
+
carton exec prove -lr t/
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Reference
|
|
75
|
+
|
|
76
|
+
See skill: `perl-patterns` for comprehensive modern Perl patterns and idioms.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.pl"
|
|
4
|
+
- "**/*.pm"
|
|
5
|
+
- "**/*.t"
|
|
6
|
+
- "**/*.psgi"
|
|
7
|
+
- "**/*.cgi"
|
|
8
|
+
---
|
|
9
|
+
# Perl Security
|
|
10
|
+
|
|
11
|
+
> This file extends [common/security.md](../common/security.md) with Perl-specific content.
|
|
12
|
+
|
|
13
|
+
## Taint Mode
|
|
14
|
+
|
|
15
|
+
- Use `-T` flag on all CGI/web-facing scripts
|
|
16
|
+
- Sanitize `%ENV` (`$ENV{PATH}`, `$ENV{CDPATH}`, etc.) before any external command
|
|
17
|
+
|
|
18
|
+
## Input Validation
|
|
19
|
+
|
|
20
|
+
- Use allowlist regex for untainting — never `/(.*)/s`
|
|
21
|
+
- Validate all user input with explicit patterns:
|
|
22
|
+
|
|
23
|
+
```perl
|
|
24
|
+
if ($input =~ /\A([a-zA-Z0-9_-]+)\z/) {
|
|
25
|
+
my $clean = $1;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## File I/O
|
|
30
|
+
|
|
31
|
+
- **Three-arg open only** — never two-arg open
|
|
32
|
+
- Prevent path traversal with `Cwd::realpath`:
|
|
33
|
+
|
|
34
|
+
```perl
|
|
35
|
+
use Cwd 'realpath';
|
|
36
|
+
my $safe_path = realpath($user_path);
|
|
37
|
+
die "Path traversal" unless $safe_path =~ m{\A/allowed/directory/};
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Process Execution
|
|
41
|
+
|
|
42
|
+
- Use **list-form `system()`** — never single-string form
|
|
43
|
+
- Use **IPC::Run3** for capturing output
|
|
44
|
+
- Never use backticks with variable interpolation
|
|
45
|
+
|
|
46
|
+
```perl
|
|
47
|
+
system('grep', '-r', $pattern, $directory); # safe
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## SQL Injection Prevention
|
|
51
|
+
|
|
52
|
+
Always use DBI placeholders — never interpolate into SQL:
|
|
53
|
+
|
|
54
|
+
```perl
|
|
55
|
+
my $sth = $dbh->prepare('SELECT * FROM users WHERE email = ?');
|
|
56
|
+
$sth->execute($email);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Security Scanning
|
|
60
|
+
|
|
61
|
+
Run **perlcritic** with the security theme at severity 4+:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
perlcritic --severity 4 --theme security lib/
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Reference
|
|
68
|
+
|
|
69
|
+
See skill: `perl-security` for comprehensive Perl security patterns, taint mode, and safe I/O.
|