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,72 @@
|
|
|
1
|
+
"""Generate compliance specs from skill files using LLM."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import subprocess
|
|
6
|
+
import tempfile
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import yaml
|
|
10
|
+
|
|
11
|
+
from scripts.parser import ComplianceSpec, parse_spec
|
|
12
|
+
from scripts.utils import extract_yaml
|
|
13
|
+
|
|
14
|
+
PROMPTS_DIR = Path(__file__).parent.parent / "prompts"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def generate_spec(
|
|
18
|
+
skill_path: Path,
|
|
19
|
+
model: str = "haiku",
|
|
20
|
+
max_retries: int = 2,
|
|
21
|
+
) -> ComplianceSpec:
|
|
22
|
+
"""Generate a compliance spec from a skill/rule file.
|
|
23
|
+
|
|
24
|
+
Calls claude -p with the spec_generator prompt, parses YAML output.
|
|
25
|
+
Retries on YAML parse errors with error feedback.
|
|
26
|
+
"""
|
|
27
|
+
skill_content = skill_path.read_text()
|
|
28
|
+
prompt_template = (PROMPTS_DIR / "spec_generator.md").read_text()
|
|
29
|
+
base_prompt = prompt_template.replace("{skill_content}", skill_content)
|
|
30
|
+
|
|
31
|
+
last_error: Exception | None = None
|
|
32
|
+
|
|
33
|
+
for attempt in range(max_retries + 1):
|
|
34
|
+
prompt = base_prompt
|
|
35
|
+
if attempt > 0 and last_error is not None:
|
|
36
|
+
prompt += (
|
|
37
|
+
f"\n\nPREVIOUS ATTEMPT FAILED with YAML parse error:\n"
|
|
38
|
+
f"{last_error}\n\n"
|
|
39
|
+
f"Please fix the YAML. Remember to quote all string values "
|
|
40
|
+
f"that contain colons, e.g.: description: \"Use type: description format\""
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
result = subprocess.run(
|
|
44
|
+
["claude", "-p", prompt, "--model", model, "--output-format", "text"],
|
|
45
|
+
capture_output=True,
|
|
46
|
+
text=True,
|
|
47
|
+
timeout=120,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
if result.returncode != 0:
|
|
51
|
+
raise RuntimeError(f"claude -p failed: {result.stderr}")
|
|
52
|
+
|
|
53
|
+
raw_yaml = extract_yaml(result.stdout)
|
|
54
|
+
|
|
55
|
+
tmp_path = None
|
|
56
|
+
with tempfile.NamedTemporaryFile(
|
|
57
|
+
mode="w", suffix=".yaml", delete=False,
|
|
58
|
+
) as f:
|
|
59
|
+
f.write(raw_yaml)
|
|
60
|
+
tmp_path = Path(f.name)
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
return parse_spec(tmp_path)
|
|
64
|
+
except (yaml.YAMLError, KeyError, TypeError) as e:
|
|
65
|
+
last_error = e
|
|
66
|
+
if attempt == max_retries:
|
|
67
|
+
raise
|
|
68
|
+
finally:
|
|
69
|
+
if tmp_path is not None:
|
|
70
|
+
tmp_path.unlink(missing_ok=True)
|
|
71
|
+
|
|
72
|
+
raise RuntimeError("unreachable")
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Shared utilities for skill-comply scripts."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def extract_yaml(text: str) -> str:
|
|
7
|
+
"""Extract YAML from LLM output, stripping markdown fences if present."""
|
|
8
|
+
lines = text.strip().splitlines()
|
|
9
|
+
if lines and lines[0].startswith("```"):
|
|
10
|
+
lines = lines[1:]
|
|
11
|
+
if lines and lines[-1].startswith("```"):
|
|
12
|
+
lines = lines[:-1]
|
|
13
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""Tests for grader module — compliance scoring with LLM classification."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from unittest.mock import patch
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from scripts.grader import ComplianceResult, StepResult, grade
|
|
9
|
+
from scripts.parser import ComplianceSpec, Detector, ObservationEvent, Step, parse_spec, parse_trace
|
|
10
|
+
|
|
11
|
+
FIXTURES = Path(__file__).parent.parent / "fixtures"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@pytest.fixture
|
|
15
|
+
def tdd_spec():
|
|
16
|
+
return parse_spec(FIXTURES / "tdd_spec.yaml")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture
|
|
20
|
+
def compliant_trace():
|
|
21
|
+
return parse_trace(FIXTURES / "compliant_trace.jsonl")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@pytest.fixture
|
|
25
|
+
def noncompliant_trace():
|
|
26
|
+
return parse_trace(FIXTURES / "noncompliant_trace.jsonl")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _mock_compliant_classification(spec, trace, model="haiku"): # noqa: ARG001
|
|
30
|
+
"""Simulate LLM correctly classifying a compliant trace."""
|
|
31
|
+
return {
|
|
32
|
+
"write_test": [0],
|
|
33
|
+
"run_test_red": [1],
|
|
34
|
+
"write_impl": [2],
|
|
35
|
+
"run_test_green": [3],
|
|
36
|
+
"refactor": [4],
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _mock_noncompliant_classification(spec, trace, model="haiku"):
|
|
41
|
+
"""Simulate LLM classifying a noncompliant trace (impl before test)."""
|
|
42
|
+
return {
|
|
43
|
+
"write_impl": [0], # src/fib.py written first
|
|
44
|
+
"write_test": [1], # test written second
|
|
45
|
+
"run_test_green": [2], # only a passing test run
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _mock_empty_classification(spec, trace, model="haiku"):
|
|
50
|
+
return {}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class TestGradeCompliant:
|
|
54
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
55
|
+
def test_returns_compliance_result(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
56
|
+
result = grade(tdd_spec, compliant_trace)
|
|
57
|
+
assert isinstance(result, ComplianceResult)
|
|
58
|
+
|
|
59
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
60
|
+
def test_full_compliance(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
61
|
+
result = grade(tdd_spec, compliant_trace)
|
|
62
|
+
assert result.compliance_rate == 1.0
|
|
63
|
+
|
|
64
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
65
|
+
def test_all_required_steps_detected(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
66
|
+
result = grade(tdd_spec, compliant_trace)
|
|
67
|
+
required_results = [s for s in result.steps if s.step_id in
|
|
68
|
+
("write_test", "run_test_red", "write_impl", "run_test_green")]
|
|
69
|
+
assert all(s.detected for s in required_results)
|
|
70
|
+
|
|
71
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
72
|
+
def test_optional_step_detected(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
73
|
+
result = grade(tdd_spec, compliant_trace)
|
|
74
|
+
refactor = next(s for s in result.steps if s.step_id == "refactor")
|
|
75
|
+
assert refactor.detected is True
|
|
76
|
+
|
|
77
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
78
|
+
def test_no_hook_promotion_recommended(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
79
|
+
result = grade(tdd_spec, compliant_trace)
|
|
80
|
+
assert result.recommend_hook_promotion is False
|
|
81
|
+
|
|
82
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
83
|
+
def test_step_evidence_not_empty(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
84
|
+
result = grade(tdd_spec, compliant_trace)
|
|
85
|
+
for step in result.steps:
|
|
86
|
+
if step.detected:
|
|
87
|
+
assert len(step.evidence) > 0
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class TestGradeNoncompliant:
|
|
91
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
|
|
92
|
+
def test_low_compliance(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
|
|
93
|
+
result = grade(tdd_spec, noncompliant_trace)
|
|
94
|
+
assert result.compliance_rate < 1.0
|
|
95
|
+
|
|
96
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
|
|
97
|
+
def test_write_test_fails_ordering(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
|
|
98
|
+
"""write_test has before_step=write_impl, but test is written AFTER impl."""
|
|
99
|
+
result = grade(tdd_spec, noncompliant_trace)
|
|
100
|
+
write_test = next(s for s in result.steps if s.step_id == "write_test")
|
|
101
|
+
assert write_test.detected is False
|
|
102
|
+
|
|
103
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
|
|
104
|
+
def test_run_test_red_not_detected(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
|
|
105
|
+
result = grade(tdd_spec, noncompliant_trace)
|
|
106
|
+
run_red = next(s for s in result.steps if s.step_id == "run_test_red")
|
|
107
|
+
assert run_red.detected is False
|
|
108
|
+
|
|
109
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
|
|
110
|
+
def test_hook_promotion_recommended(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
|
|
111
|
+
result = grade(tdd_spec, noncompliant_trace)
|
|
112
|
+
assert result.recommend_hook_promotion is True
|
|
113
|
+
|
|
114
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
|
|
115
|
+
def test_failure_reasons_present(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
|
|
116
|
+
result = grade(tdd_spec, noncompliant_trace)
|
|
117
|
+
failed_steps = [s for s in result.steps if not s.detected and s.step_id != "refactor"]
|
|
118
|
+
for step in failed_steps:
|
|
119
|
+
assert step.failure_reason is not None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class TestGradeEdgeCases:
|
|
123
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_empty_classification)
|
|
124
|
+
def test_empty_trace(self, mock_cls, tdd_spec) -> None:
|
|
125
|
+
result = grade(tdd_spec, [])
|
|
126
|
+
assert result.compliance_rate == 0.0
|
|
127
|
+
assert result.recommend_hook_promotion is True
|
|
128
|
+
|
|
129
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
130
|
+
def test_compliance_rate_is_ratio_of_required_only(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
131
|
+
result = grade(tdd_spec, compliant_trace)
|
|
132
|
+
assert result.compliance_rate == 1.0
|
|
133
|
+
|
|
134
|
+
@patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
|
|
135
|
+
def test_spec_id_in_result(self, mock_cls, tdd_spec, compliant_trace) -> None:
|
|
136
|
+
result = grade(tdd_spec, compliant_trace)
|
|
137
|
+
assert result.spec_id == "tdd-workflow"
|
|
138
|
+
|
|
139
|
+
@patch("scripts.grader.classify_events")
|
|
140
|
+
def test_after_step_can_reference_later_declared_spec_step(self, mock_cls) -> None:
|
|
141
|
+
spec = ComplianceSpec(
|
|
142
|
+
id="out-of-order-after-step",
|
|
143
|
+
name="Out of order after_step",
|
|
144
|
+
source_rule="rules/common/testing.md",
|
|
145
|
+
version="1.0",
|
|
146
|
+
steps=(
|
|
147
|
+
Step(
|
|
148
|
+
id="step_a",
|
|
149
|
+
description="Occurs after step_b even though it is declared first",
|
|
150
|
+
required=True,
|
|
151
|
+
detector=Detector(
|
|
152
|
+
description="Event A",
|
|
153
|
+
after_step="step_b",
|
|
154
|
+
),
|
|
155
|
+
),
|
|
156
|
+
Step(
|
|
157
|
+
id="step_b",
|
|
158
|
+
description="Reference step declared later",
|
|
159
|
+
required=True,
|
|
160
|
+
detector=Detector(
|
|
161
|
+
description="Event B",
|
|
162
|
+
),
|
|
163
|
+
),
|
|
164
|
+
),
|
|
165
|
+
threshold_promote_to_hook=0.5,
|
|
166
|
+
)
|
|
167
|
+
trace = [
|
|
168
|
+
ObservationEvent(
|
|
169
|
+
timestamp="2026-03-20T10:00:01Z",
|
|
170
|
+
event="tool_complete",
|
|
171
|
+
tool="Write",
|
|
172
|
+
session="sess-order",
|
|
173
|
+
input='{"file_path":"src/b.py"}',
|
|
174
|
+
output="step b",
|
|
175
|
+
),
|
|
176
|
+
ObservationEvent(
|
|
177
|
+
timestamp="2026-03-20T10:00:02Z",
|
|
178
|
+
event="tool_complete",
|
|
179
|
+
tool="Write",
|
|
180
|
+
session="sess-order",
|
|
181
|
+
input='{"file_path":"src/a.py"}',
|
|
182
|
+
output="step a",
|
|
183
|
+
),
|
|
184
|
+
]
|
|
185
|
+
mock_cls.return_value = {
|
|
186
|
+
"step_a": [1],
|
|
187
|
+
"step_b": [0],
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
result = grade(spec, trace)
|
|
191
|
+
|
|
192
|
+
step_a = next(step for step in result.steps if step.step_id == "step_a")
|
|
193
|
+
step_b = next(step for step in result.steps if step.step_id == "step_b")
|
|
194
|
+
assert step_a.detected is True
|
|
195
|
+
assert step_a.failure_reason is None
|
|
196
|
+
assert step_b.detected is True
|
|
197
|
+
assert result.compliance_rate == 1.0
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Tests for parser module — JSONL trace and YAML spec parsing."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from scripts.parser import (
|
|
8
|
+
ComplianceSpec,
|
|
9
|
+
Detector,
|
|
10
|
+
ObservationEvent,
|
|
11
|
+
Step,
|
|
12
|
+
parse_spec,
|
|
13
|
+
parse_trace,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
FIXTURES = Path(__file__).parent.parent / "fixtures"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TestParseTrace:
|
|
20
|
+
def test_parses_compliant_trace(self) -> None:
|
|
21
|
+
events = parse_trace(FIXTURES / "compliant_trace.jsonl")
|
|
22
|
+
assert len(events) == 5
|
|
23
|
+
assert all(isinstance(e, ObservationEvent) for e in events)
|
|
24
|
+
|
|
25
|
+
def test_events_sorted_by_timestamp(self) -> None:
|
|
26
|
+
events = parse_trace(FIXTURES / "compliant_trace.jsonl")
|
|
27
|
+
timestamps = [e.timestamp for e in events]
|
|
28
|
+
assert timestamps == sorted(timestamps)
|
|
29
|
+
|
|
30
|
+
def test_event_fields(self) -> None:
|
|
31
|
+
events = parse_trace(FIXTURES / "compliant_trace.jsonl")
|
|
32
|
+
first = events[0]
|
|
33
|
+
assert first.tool == "Write"
|
|
34
|
+
assert first.session == "sess-001"
|
|
35
|
+
assert "test_fib.py" in first.input
|
|
36
|
+
assert first.output == "File created"
|
|
37
|
+
|
|
38
|
+
def test_parses_noncompliant_trace(self) -> None:
|
|
39
|
+
events = parse_trace(FIXTURES / "noncompliant_trace.jsonl")
|
|
40
|
+
assert len(events) == 3
|
|
41
|
+
assert "src/fib.py" in events[0].input
|
|
42
|
+
|
|
43
|
+
def test_empty_file_returns_empty_list(self, tmp_path: Path) -> None:
|
|
44
|
+
empty = tmp_path / "empty.jsonl"
|
|
45
|
+
empty.write_text("")
|
|
46
|
+
events = parse_trace(empty)
|
|
47
|
+
assert events == []
|
|
48
|
+
|
|
49
|
+
def test_nonexistent_file_raises(self) -> None:
|
|
50
|
+
with pytest.raises(FileNotFoundError):
|
|
51
|
+
parse_trace(Path("/nonexistent/trace.jsonl"))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class TestParseSpec:
|
|
55
|
+
def test_parses_tdd_spec(self) -> None:
|
|
56
|
+
spec = parse_spec(FIXTURES / "tdd_spec.yaml")
|
|
57
|
+
assert isinstance(spec, ComplianceSpec)
|
|
58
|
+
assert spec.id == "tdd-workflow"
|
|
59
|
+
assert len(spec.steps) == 5
|
|
60
|
+
|
|
61
|
+
def test_step_fields(self) -> None:
|
|
62
|
+
spec = parse_spec(FIXTURES / "tdd_spec.yaml")
|
|
63
|
+
first = spec.steps[0]
|
|
64
|
+
assert isinstance(first, Step)
|
|
65
|
+
assert first.id == "write_test"
|
|
66
|
+
assert first.required is True
|
|
67
|
+
assert isinstance(first.detector, Detector)
|
|
68
|
+
assert "test file" in first.detector.description
|
|
69
|
+
assert first.detector.before_step == "write_impl"
|
|
70
|
+
|
|
71
|
+
def test_optional_detector_fields(self) -> None:
|
|
72
|
+
spec = parse_spec(FIXTURES / "tdd_spec.yaml")
|
|
73
|
+
write_test = spec.steps[0]
|
|
74
|
+
assert write_test.detector.after_step is None
|
|
75
|
+
|
|
76
|
+
run_test_red = spec.steps[1]
|
|
77
|
+
assert run_test_red.detector.after_step == "write_test"
|
|
78
|
+
assert run_test_red.detector.before_step == "write_impl"
|
|
79
|
+
|
|
80
|
+
def test_scoring_threshold(self) -> None:
|
|
81
|
+
spec = parse_spec(FIXTURES / "tdd_spec.yaml")
|
|
82
|
+
assert spec.threshold_promote_to_hook == 0.6
|
|
83
|
+
|
|
84
|
+
def test_required_vs_optional_steps(self) -> None:
|
|
85
|
+
spec = parse_spec(FIXTURES / "tdd_spec.yaml")
|
|
86
|
+
required = [s for s in spec.steps if s.required]
|
|
87
|
+
optional = [s for s in spec.steps if not s.required]
|
|
88
|
+
assert len(required) == 4
|
|
89
|
+
assert len(optional) == 1
|
|
90
|
+
assert optional[0].id == "refactor"
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""Tests for runner module — scenario execution + subprocess error handling."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import subprocess
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from unittest.mock import MagicMock, patch
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
from scripts.runner import _setup_sandbox, run_scenario
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class _FakeScenario:
|
|
16
|
+
"""Minimal Scenario-like object for runner tests (avoids generator deps)."""
|
|
17
|
+
|
|
18
|
+
id: str
|
|
19
|
+
prompt: str = "do nothing"
|
|
20
|
+
setup_commands: tuple[str, ...] = ()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TestSetupSandboxSkipsShellBuiltins:
|
|
24
|
+
"""Setup commands containing shell builtins (cd/pushd/popd) must be skipped.
|
|
25
|
+
|
|
26
|
+
Regression: subprocess.run(["cd", ...]) raises FileNotFoundError because
|
|
27
|
+
cd is a shell builtin, not an external binary. Real-world scenarios often
|
|
28
|
+
include "cd subdir" in setup_commands assuming shell semantics, so the
|
|
29
|
+
runner must tolerate this rather than crashing the whole scenario.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def test_skips_cd(self, tmp_path):
|
|
33
|
+
scenario = _FakeScenario(
|
|
34
|
+
id="t1",
|
|
35
|
+
setup_commands=("cd subdir",),
|
|
36
|
+
)
|
|
37
|
+
called_args: list[list[str]] = []
|
|
38
|
+
|
|
39
|
+
def fake_run(args, **kwargs):
|
|
40
|
+
called_args.append(args)
|
|
41
|
+
return subprocess.CompletedProcess(args=args, returncode=0)
|
|
42
|
+
|
|
43
|
+
with patch("scripts.runner.subprocess.run", side_effect=fake_run):
|
|
44
|
+
_setup_sandbox(tmp_path, scenario)
|
|
45
|
+
|
|
46
|
+
# git init runs once; "cd subdir" must NOT be passed to subprocess
|
|
47
|
+
assert ["git", "init"] in called_args
|
|
48
|
+
assert ["cd", "subdir"] not in called_args
|
|
49
|
+
|
|
50
|
+
def test_skips_pushd_popd(self, tmp_path):
|
|
51
|
+
scenario = _FakeScenario(
|
|
52
|
+
id="t2",
|
|
53
|
+
setup_commands=("pushd dir", "popd"),
|
|
54
|
+
)
|
|
55
|
+
called_args: list[list[str]] = []
|
|
56
|
+
|
|
57
|
+
def fake_run(args, **kwargs):
|
|
58
|
+
called_args.append(args)
|
|
59
|
+
return subprocess.CompletedProcess(args=args, returncode=0)
|
|
60
|
+
|
|
61
|
+
with patch("scripts.runner.subprocess.run", side_effect=fake_run):
|
|
62
|
+
_setup_sandbox(tmp_path, scenario)
|
|
63
|
+
|
|
64
|
+
assert ["pushd", "dir"] not in called_args
|
|
65
|
+
assert ["popd"] not in called_args
|
|
66
|
+
|
|
67
|
+
def test_tolerates_missing_executable(self, tmp_path):
|
|
68
|
+
"""A scenario referencing an unavailable tool must not crash setup."""
|
|
69
|
+
scenario = _FakeScenario(
|
|
70
|
+
id="t3",
|
|
71
|
+
setup_commands=("nonexistent-tool-xyz arg",),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def fake_run(args, **kwargs):
|
|
75
|
+
if args[0] == "nonexistent-tool-xyz":
|
|
76
|
+
raise FileNotFoundError(2, "No such file or directory")
|
|
77
|
+
return subprocess.CompletedProcess(args=args, returncode=0)
|
|
78
|
+
|
|
79
|
+
with patch("scripts.runner.subprocess.run", side_effect=fake_run):
|
|
80
|
+
# Must NOT raise — missing tools are skipped, not fatal
|
|
81
|
+
_setup_sandbox(tmp_path, scenario)
|
|
82
|
+
|
|
83
|
+
def test_real_commands_still_run(self, tmp_path):
|
|
84
|
+
"""Skip logic must not break legitimate setup commands."""
|
|
85
|
+
scenario = _FakeScenario(
|
|
86
|
+
id="t4",
|
|
87
|
+
setup_commands=("touch file.txt", "cd ignored", "echo hi"),
|
|
88
|
+
)
|
|
89
|
+
called_args: list[list[str]] = []
|
|
90
|
+
|
|
91
|
+
def fake_run(args, **kwargs):
|
|
92
|
+
called_args.append(args)
|
|
93
|
+
return subprocess.CompletedProcess(args=args, returncode=0)
|
|
94
|
+
|
|
95
|
+
with patch("scripts.runner.subprocess.run", side_effect=fake_run):
|
|
96
|
+
_setup_sandbox(tmp_path, scenario)
|
|
97
|
+
|
|
98
|
+
# Real commands present, cd absent
|
|
99
|
+
assert ["touch", "file.txt"] in called_args
|
|
100
|
+
assert ["echo", "hi"] in called_args
|
|
101
|
+
assert ["cd", "ignored"] not in called_args
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class TestRunScenarioMaxTurnsTermination:
|
|
105
|
+
"""rc=1 with terminal_reason=max_turns is graceful termination, not failure.
|
|
106
|
+
|
|
107
|
+
claude -p returns rc=1 when --max-turns is reached, but the stream-json
|
|
108
|
+
output is still valid. Treating this as RuntimeError aborts scenarios
|
|
109
|
+
that would have produced useful observations. Detect the marker in stdout
|
|
110
|
+
and downgrade rc=1 + max_turns to non-fatal.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
def test_rc1_with_max_turns_marker_returns_normally(self, tmp_path, monkeypatch):
|
|
114
|
+
scenario = _FakeScenario(id="mt1", prompt="long task", setup_commands=())
|
|
115
|
+
|
|
116
|
+
# Skip sandbox setup side effects
|
|
117
|
+
monkeypatch.setattr("scripts.runner._setup_sandbox", lambda *a, **kw: None)
|
|
118
|
+
|
|
119
|
+
max_turns_stdout = (
|
|
120
|
+
'{"type":"system","subtype":"init","session_id":"s1"}\n'
|
|
121
|
+
'{"type":"result","terminal_reason":"max_turns"}\n'
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
fake_result = subprocess.CompletedProcess(
|
|
125
|
+
args=["claude"], returncode=1, stdout=max_turns_stdout, stderr=""
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
with patch("scripts.runner.subprocess.run", return_value=fake_result):
|
|
129
|
+
# Must NOT raise — max_turns is graceful termination
|
|
130
|
+
run_scenario(scenario, model="haiku")
|
|
131
|
+
|
|
132
|
+
def test_rc1_without_max_turns_marker_still_raises(self, tmp_path, monkeypatch):
|
|
133
|
+
"""Real failures (rc≠0 with no max_turns marker) must still raise."""
|
|
134
|
+
scenario = _FakeScenario(id="mt2", prompt="oops", setup_commands=())
|
|
135
|
+
monkeypatch.setattr("scripts.runner._setup_sandbox", lambda *a, **kw: None)
|
|
136
|
+
|
|
137
|
+
fake_result = subprocess.CompletedProcess(
|
|
138
|
+
args=["claude"], returncode=1, stdout="", stderr="auth error"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
with patch("scripts.runner.subprocess.run", return_value=fake_result):
|
|
142
|
+
with pytest.raises(RuntimeError, match="claude -p failed"):
|
|
143
|
+
run_scenario(scenario, model="haiku")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class TestRunScenarioErrorIncludesStdoutTail:
|
|
147
|
+
"""Error messages must include stdout tail, not only stderr.
|
|
148
|
+
|
|
149
|
+
When claude -p fails inside an LLM call, useful diagnostic context often
|
|
150
|
+
appears in stdout (partial stream-json events, model error JSON), not
|
|
151
|
+
stderr. Including stdout tail in the RuntimeError message dramatically
|
|
152
|
+
improves debug-ability without adding any new dependency.
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
def test_error_message_contains_stdout_tail(self, tmp_path, monkeypatch):
|
|
156
|
+
scenario = _FakeScenario(id="e1", prompt="x", setup_commands=())
|
|
157
|
+
monkeypatch.setattr("scripts.runner._setup_sandbox", lambda *a, **kw: None)
|
|
158
|
+
|
|
159
|
+
diagnostic_marker = "DIAG_STDOUT_MARKER_xyz123"
|
|
160
|
+
fake_result = subprocess.CompletedProcess(
|
|
161
|
+
args=["claude"],
|
|
162
|
+
returncode=2,
|
|
163
|
+
stdout=f"some context {diagnostic_marker} more text",
|
|
164
|
+
stderr="generic error",
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
with patch("scripts.runner.subprocess.run", return_value=fake_result):
|
|
168
|
+
with pytest.raises(RuntimeError) as excinfo:
|
|
169
|
+
run_scenario(scenario, model="haiku")
|
|
170
|
+
|
|
171
|
+
# Stdout marker MUST appear in the error message
|
|
172
|
+
assert diagnostic_marker in str(excinfo.value)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-scout
|
|
3
|
+
description: Search existing local, marketplace, GitHub, and web skill sources before creating a new skill. Use when the user wants to create, build, fork, or find a skill for a workflow.
|
|
4
|
+
origin: community
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill Scout
|
|
8
|
+
|
|
9
|
+
Use this skill before creating a new skill. The goal is to avoid duplicating
|
|
10
|
+
existing community or marketplace work, while still vetting anything external
|
|
11
|
+
before adoption.
|
|
12
|
+
|
|
13
|
+
Source: salvaged from stale community PR #1232 by `redminwang`.
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
|
|
17
|
+
- The user says "create a skill", "build a skill", "make a skill", or "new
|
|
18
|
+
skill".
|
|
19
|
+
- The user asks "is there a skill for X?" or "does a skill exist that does Y?"
|
|
20
|
+
- The user describes a workflow and you are about to suggest creating a new
|
|
21
|
+
skill.
|
|
22
|
+
- The user wants to fork or extend an existing skill.
|
|
23
|
+
|
|
24
|
+
If the user explicitly says to skip search or create from scratch, acknowledge
|
|
25
|
+
that and proceed with the requested creation workflow.
|
|
26
|
+
|
|
27
|
+
## How It Works
|
|
28
|
+
|
|
29
|
+
### Step 1 - Capture Intent
|
|
30
|
+
|
|
31
|
+
Extract:
|
|
32
|
+
|
|
33
|
+
- The task the skill should perform.
|
|
34
|
+
- The trigger conditions for using it.
|
|
35
|
+
- The domain, tools, frameworks, or data sources involved.
|
|
36
|
+
- Three to five search keywords plus useful synonyms.
|
|
37
|
+
|
|
38
|
+
### Step 2 - Search Local Sources
|
|
39
|
+
|
|
40
|
+
Search installed and marketplace skill names first. Local sources are preferred
|
|
41
|
+
because they are already part of the user's environment.
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
find ~/.claude/skills -maxdepth 2 -name SKILL.md 2>/dev/null | grep -iE "keyword|synonym"
|
|
45
|
+
find ~/.claude/plugins/marketplaces -path '*/skills/*/SKILL.md' 2>/dev/null | grep -iE "keyword|synonym"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Then search frontmatter descriptions:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
grep -RilE "keyword|synonym" ~/.claude/skills ~/.claude/plugins/marketplaces 2>/dev/null
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Step 3 - Search Remote Sources
|
|
55
|
+
|
|
56
|
+
Use available GitHub and web search tools. Prefer concise queries:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
gh search repos "claude code skill keyword" --limit 10 --sort stars
|
|
60
|
+
gh search code "name: keyword" --filename SKILL.md --limit 10
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
For web search, use at most three targeted queries such as:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
"claude code skill" keyword
|
|
67
|
+
"SKILL.md" keyword
|
|
68
|
+
"everything-claude-code" keyword
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Step 4 - Vet External Matches
|
|
72
|
+
|
|
73
|
+
Before recommending any external skill for adoption or forking:
|
|
74
|
+
|
|
75
|
+
- Read the `SKILL.md` frontmatter and instructions.
|
|
76
|
+
- Look for unexpected shell commands, file writes, network calls, credential
|
|
77
|
+
handling, or package installs.
|
|
78
|
+
- Check whether the repository appears maintained.
|
|
79
|
+
- Prefer copying into a fresh local branch and reviewing the diff over editing
|
|
80
|
+
marketplace originals.
|
|
81
|
+
|
|
82
|
+
### Step 5 - Rank Results
|
|
83
|
+
|
|
84
|
+
Rank candidates by:
|
|
85
|
+
|
|
86
|
+
1. Exact keyword match in the skill name.
|
|
87
|
+
2. Keyword or synonym match in description.
|
|
88
|
+
3. Local installed or marketplace source.
|
|
89
|
+
4. Maintained GitHub source with recent activity.
|
|
90
|
+
5. Web-only mention.
|
|
91
|
+
|
|
92
|
+
Cap the final list at 10 results.
|
|
93
|
+
|
|
94
|
+
### Step 6 - Present Decision Options
|
|
95
|
+
|
|
96
|
+
Give the user a short table:
|
|
97
|
+
|
|
98
|
+
| Option | Meaning |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| Use existing | Invoke or install a matching skill as-is. |
|
|
101
|
+
| Fork or extend | Copy the closest skill and modify it. |
|
|
102
|
+
| Create fresh | Build a new skill after confirming no close match exists. |
|
|
103
|
+
|
|
104
|
+
Only create a new skill after the user chooses that path or after the search
|
|
105
|
+
finds no close match.
|
|
106
|
+
|
|
107
|
+
## Examples
|
|
108
|
+
|
|
109
|
+
### Result Table
|
|
110
|
+
|
|
111
|
+
```markdown
|
|
112
|
+
| # | Skill | Source | Why it matches | Gap |
|
|
113
|
+
| --- | --- | --- | --- | --- |
|
|
114
|
+
| 1 | article-writing | Local ECC | Drafts articles and guides | Not focused on release notes |
|
|
115
|
+
| 2 | content-engine | Local ECC | Multi-format content workflow | Heavier than needed |
|
|
116
|
+
| 3 | blog-writer | GitHub | Blog writing skill with recent commits | Needs security review |
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### User-Facing Summary
|
|
120
|
+
|
|
121
|
+
```markdown
|
|
122
|
+
I found two close local matches and one external candidate. The closest fit is
|
|
123
|
+
`article-writing`; it covers drafting and revision, but it does not include the
|
|
124
|
+
release-note checklist you asked for. I can either use it as-is, fork it into a
|
|
125
|
+
release-note variant, or create a fresh skill.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Anti-Patterns
|
|
129
|
+
|
|
130
|
+
- Do not jump directly to new skill creation when a search is reasonable.
|
|
131
|
+
- Do not install external skills without reading them first.
|
|
132
|
+
- Do not present a long unranked list of weak matches.
|
|
133
|
+
- Do not treat web-only mentions as trusted sources.
|
|
134
|
+
- Do not edit installed marketplace originals in place.
|
|
135
|
+
|
|
136
|
+
## Related
|
|
137
|
+
|
|
138
|
+
- `search-first` - General search-before-building workflow.
|
|
139
|
+
- `skill-stocktake` - Audit installed skills for health, duplicates, and gaps.
|
|
140
|
+
- `agent-sort` - Categorize and organize existing agents and skills.
|