aw-ecc 1.4.21
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/.agents/skills/api-design/SKILL.md +523 -0
- package/.agents/skills/api-design/agents/openai.yaml +7 -0
- package/.agents/skills/article-writing/SKILL.md +85 -0
- package/.agents/skills/article-writing/agents/openai.yaml +7 -0
- package/.agents/skills/backend-patterns/SKILL.md +598 -0
- package/.agents/skills/backend-patterns/agents/openai.yaml +7 -0
- package/.agents/skills/bun-runtime/SKILL.md +84 -0
- package/.agents/skills/bun-runtime/agents/openai.yaml +7 -0
- package/.agents/skills/claude-api/SKILL.md +337 -0
- package/.agents/skills/claude-api/agents/openai.yaml +7 -0
- package/.agents/skills/coding-standards/SKILL.md +530 -0
- package/.agents/skills/coding-standards/agents/openai.yaml +7 -0
- package/.agents/skills/content-engine/SKILL.md +88 -0
- package/.agents/skills/content-engine/agents/openai.yaml +7 -0
- package/.agents/skills/crosspost/SKILL.md +188 -0
- package/.agents/skills/crosspost/agents/openai.yaml +7 -0
- package/.agents/skills/deep-research/SKILL.md +155 -0
- package/.agents/skills/deep-research/agents/openai.yaml +7 -0
- package/.agents/skills/dmux-workflows/SKILL.md +144 -0
- package/.agents/skills/dmux-workflows/agents/openai.yaml +7 -0
- package/.agents/skills/documentation-lookup/SKILL.md +90 -0
- package/.agents/skills/documentation-lookup/agents/openai.yaml +7 -0
- package/.agents/skills/e2e-testing/SKILL.md +326 -0
- package/.agents/skills/e2e-testing/agents/openai.yaml +7 -0
- package/.agents/skills/eval-harness/SKILL.md +236 -0
- package/.agents/skills/eval-harness/agents/openai.yaml +7 -0
- package/.agents/skills/everything-claude-code/SKILL.md +442 -0
- package/.agents/skills/everything-claude-code/agents/openai.yaml +6 -0
- package/.agents/skills/exa-search/SKILL.md +170 -0
- package/.agents/skills/exa-search/agents/openai.yaml +7 -0
- package/.agents/skills/fal-ai-media/SKILL.md +277 -0
- package/.agents/skills/fal-ai-media/agents/openai.yaml +7 -0
- package/.agents/skills/frontend-patterns/SKILL.md +642 -0
- package/.agents/skills/frontend-patterns/agents/openai.yaml +7 -0
- package/.agents/skills/frontend-slides/SKILL.md +184 -0
- package/.agents/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/.agents/skills/frontend-slides/agents/openai.yaml +7 -0
- package/.agents/skills/investor-materials/SKILL.md +96 -0
- package/.agents/skills/investor-materials/agents/openai.yaml +7 -0
- package/.agents/skills/investor-outreach/SKILL.md +76 -0
- package/.agents/skills/investor-outreach/agents/openai.yaml +7 -0
- package/.agents/skills/market-research/SKILL.md +75 -0
- package/.agents/skills/market-research/agents/openai.yaml +7 -0
- package/.agents/skills/mcp-server-patterns/SKILL.md +67 -0
- package/.agents/skills/nextjs-turbopack/SKILL.md +44 -0
- package/.agents/skills/nextjs-turbopack/agents/openai.yaml +7 -0
- package/.agents/skills/security-review/SKILL.md +495 -0
- package/.agents/skills/security-review/agents/openai.yaml +7 -0
- package/.agents/skills/strategic-compact/SKILL.md +103 -0
- package/.agents/skills/strategic-compact/agents/openai.yaml +7 -0
- package/.agents/skills/tdd-workflow/SKILL.md +410 -0
- package/.agents/skills/tdd-workflow/agents/openai.yaml +7 -0
- package/.agents/skills/verification-loop/SKILL.md +126 -0
- package/.agents/skills/verification-loop/agents/openai.yaml +7 -0
- package/.agents/skills/video-editing/SKILL.md +308 -0
- package/.agents/skills/video-editing/agents/openai.yaml +7 -0
- package/.agents/skills/x-api/SKILL.md +214 -0
- package/.agents/skills/x-api/agents/openai.yaml +7 -0
- package/.claude-plugin/README.md +17 -0
- package/.claude-plugin/plugin.json +24 -0
- package/.codex/AGENTS.md +93 -0
- package/.codex/INSTALL.md +64 -0
- package/.codex/agents/docs-researcher.toml +9 -0
- package/.codex/agents/explorer.toml +9 -0
- package/.codex/agents/reviewer.toml +9 -0
- package/.codex/config.toml +108 -0
- package/.codex/hooks/aw-post-tool-use.sh +5 -0
- package/.codex/hooks/aw-pre-tool-use.sh +5 -0
- package/.codex/hooks/aw-session-start.sh +21 -0
- package/.codex/hooks/aw-stop.sh +5 -0
- package/.codex/hooks/aw-user-prompt-submit.sh +9 -0
- package/.codex/hooks.json +62 -0
- package/.cursor/INSTALL.md +40 -0
- package/.cursor/hooks/adapter.js +120 -0
- package/.cursor/hooks/after-file-edit.js +11 -0
- package/.cursor/hooks/after-mcp-execution.js +11 -0
- package/.cursor/hooks/after-shell-execution.js +11 -0
- package/.cursor/hooks/after-tab-file-edit.js +12 -0
- package/.cursor/hooks/aw-phase-adapter.js +43 -0
- package/.cursor/hooks/before-mcp-execution.js +11 -0
- package/.cursor/hooks/before-read-file.js +13 -0
- package/.cursor/hooks/before-shell-execution.js +11 -0
- package/.cursor/hooks/before-submit-prompt.js +41 -0
- package/.cursor/hooks/before-tab-file-read.js +13 -0
- package/.cursor/hooks/pre-compact.js +11 -0
- package/.cursor/hooks/session-end.js +11 -0
- package/.cursor/hooks/session-start.js +11 -0
- package/.cursor/hooks/shared/aw-phase-definitions.js +190 -0
- package/.cursor/hooks/shared/aw-phase-runner.js +61 -0
- package/.cursor/hooks/shared/session-start.sh +20 -0
- package/.cursor/hooks/shared/user-prompt-submit.sh +155 -0
- package/.cursor/hooks/stop.js +11 -0
- package/.cursor/hooks/subagent-start.js +10 -0
- package/.cursor/hooks/subagent-stop.js +10 -0
- package/.cursor/hooks.json +115 -0
- package/.cursor/rules/common-agents.md +53 -0
- package/.cursor/rules/common-coding-style.md +52 -0
- package/.cursor/rules/common-development-workflow.md +33 -0
- package/.cursor/rules/common-git-workflow.md +28 -0
- package/.cursor/rules/common-hooks.md +34 -0
- package/.cursor/rules/common-patterns.md +35 -0
- package/.cursor/rules/common-performance.md +59 -0
- package/.cursor/rules/common-security.md +33 -0
- package/.cursor/rules/common-testing.md +33 -0
- package/.cursor/rules/golang-coding-style.md +31 -0
- package/.cursor/rules/golang-hooks.md +16 -0
- package/.cursor/rules/golang-patterns.md +44 -0
- package/.cursor/rules/golang-security.md +33 -0
- package/.cursor/rules/golang-testing.md +30 -0
- package/.cursor/rules/kotlin-coding-style.md +39 -0
- package/.cursor/rules/kotlin-hooks.md +16 -0
- package/.cursor/rules/kotlin-patterns.md +50 -0
- package/.cursor/rules/kotlin-security.md +58 -0
- package/.cursor/rules/kotlin-testing.md +38 -0
- package/.cursor/rules/php-coding-style.md +25 -0
- package/.cursor/rules/php-hooks.md +21 -0
- package/.cursor/rules/php-patterns.md +23 -0
- package/.cursor/rules/php-security.md +24 -0
- package/.cursor/rules/php-testing.md +26 -0
- package/.cursor/rules/python-coding-style.md +42 -0
- package/.cursor/rules/python-hooks.md +19 -0
- package/.cursor/rules/python-patterns.md +39 -0
- package/.cursor/rules/python-security.md +30 -0
- package/.cursor/rules/python-testing.md +38 -0
- package/.cursor/rules/swift-coding-style.md +47 -0
- package/.cursor/rules/swift-hooks.md +20 -0
- package/.cursor/rules/swift-patterns.md +66 -0
- package/.cursor/rules/swift-security.md +33 -0
- package/.cursor/rules/swift-testing.md +45 -0
- package/.cursor/rules/typescript-coding-style.md +63 -0
- package/.cursor/rules/typescript-hooks.md +20 -0
- package/.cursor/rules/typescript-patterns.md +50 -0
- package/.cursor/rules/typescript-security.md +26 -0
- package/.cursor/rules/typescript-testing.md +16 -0
- package/.cursor/skills/article-writing/SKILL.md +85 -0
- package/.cursor/skills/bun-runtime/SKILL.md +84 -0
- package/.cursor/skills/content-engine/SKILL.md +88 -0
- package/.cursor/skills/documentation-lookup/SKILL.md +90 -0
- package/.cursor/skills/frontend-slides/SKILL.md +184 -0
- package/.cursor/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/.cursor/skills/investor-materials/SKILL.md +96 -0
- package/.cursor/skills/investor-outreach/SKILL.md +76 -0
- package/.cursor/skills/market-research/SKILL.md +75 -0
- package/.cursor/skills/mcp-server-patterns/SKILL.md +67 -0
- package/.cursor/skills/nextjs-turbopack/SKILL.md +44 -0
- package/.opencode/MIGRATION.md +368 -0
- package/.opencode/README.md +204 -0
- package/.opencode/commands/build-fix.md +56 -0
- package/.opencode/commands/checkpoint.md +67 -0
- package/.opencode/commands/code-review.md +68 -0
- package/.opencode/commands/e2e.md +105 -0
- package/.opencode/commands/eval.md +88 -0
- package/.opencode/commands/evolve.md +36 -0
- package/.opencode/commands/go-build.md +87 -0
- package/.opencode/commands/go-review.md +71 -0
- package/.opencode/commands/go-test.md +131 -0
- package/.opencode/commands/harness-audit.md +71 -0
- package/.opencode/commands/instinct-export.md +93 -0
- package/.opencode/commands/instinct-import.md +88 -0
- package/.opencode/commands/instinct-status.md +29 -0
- package/.opencode/commands/learn.md +61 -0
- package/.opencode/commands/loop-start.md +32 -0
- package/.opencode/commands/loop-status.md +24 -0
- package/.opencode/commands/model-route.md +26 -0
- package/.opencode/commands/orchestrate.md +88 -0
- package/.opencode/commands/plan.md +49 -0
- package/.opencode/commands/projects.md +23 -0
- package/.opencode/commands/promote.md +23 -0
- package/.opencode/commands/quality-gate.md +29 -0
- package/.opencode/commands/refactor-clean.md +102 -0
- package/.opencode/commands/rust-build.md +78 -0
- package/.opencode/commands/rust-review.md +65 -0
- package/.opencode/commands/rust-test.md +104 -0
- package/.opencode/commands/security.md +89 -0
- package/.opencode/commands/setup-pm.md +67 -0
- package/.opencode/commands/skill-create.md +117 -0
- package/.opencode/commands/tdd.md +66 -0
- package/.opencode/commands/test-coverage.md +80 -0
- package/.opencode/commands/update-codemaps.md +81 -0
- package/.opencode/commands/update-docs.md +67 -0
- package/.opencode/commands/verify.md +67 -0
- package/.opencode/index.ts +79 -0
- package/.opencode/instructions/INSTRUCTIONS.md +337 -0
- package/.opencode/opencode.json +319 -0
- package/.opencode/package.json +70 -0
- package/.opencode/plugins/ecc-hooks.ts +455 -0
- package/.opencode/plugins/index.ts +12 -0
- package/.opencode/prompts/agents/architect.txt +175 -0
- package/.opencode/prompts/agents/build-error-resolver.txt +233 -0
- package/.opencode/prompts/agents/code-reviewer.txt +103 -0
- package/.opencode/prompts/agents/database-reviewer.txt +247 -0
- package/.opencode/prompts/agents/doc-updater.txt +192 -0
- package/.opencode/prompts/agents/e2e-runner.txt +305 -0
- package/.opencode/prompts/agents/go-build-resolver.txt +325 -0
- package/.opencode/prompts/agents/go-reviewer.txt +241 -0
- package/.opencode/prompts/agents/planner.txt +112 -0
- package/.opencode/prompts/agents/refactor-cleaner.txt +241 -0
- package/.opencode/prompts/agents/rust-build-resolver.txt +93 -0
- package/.opencode/prompts/agents/rust-reviewer.txt +61 -0
- package/.opencode/prompts/agents/security-reviewer.txt +207 -0
- package/.opencode/prompts/agents/tdd-guide.txt +211 -0
- package/.opencode/tools/check-coverage.ts +170 -0
- package/.opencode/tools/format-code.ts +68 -0
- package/.opencode/tools/git-summary.ts +54 -0
- package/.opencode/tools/index.ts +13 -0
- package/.opencode/tools/lint-check.ts +85 -0
- package/.opencode/tools/run-tests.ts +139 -0
- package/.opencode/tools/security-audit.ts +277 -0
- package/.opencode/tsconfig.json +29 -0
- package/AGENTS.md +124 -0
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/README.zh-CN.md +552 -0
- package/agents/architect.md +211 -0
- package/agents/build-error-resolver.md +114 -0
- package/agents/chief-of-staff.md +151 -0
- package/agents/code-reviewer.md +237 -0
- package/agents/cpp-build-resolver.md +90 -0
- package/agents/cpp-reviewer.md +72 -0
- package/agents/database-reviewer.md +91 -0
- package/agents/doc-updater.md +107 -0
- package/agents/docs-lookup.md +68 -0
- package/agents/e2e-runner.md +107 -0
- package/agents/evals/code-reviewer-scenarios.json +23 -0
- package/agents/flutter-reviewer.md +243 -0
- package/agents/go-build-resolver.md +94 -0
- package/agents/go-reviewer.md +76 -0
- package/agents/harness-optimizer.md +35 -0
- package/agents/java-build-resolver.md +153 -0
- package/agents/java-reviewer.md +92 -0
- package/agents/kotlin-build-resolver.md +118 -0
- package/agents/kotlin-reviewer.md +159 -0
- package/agents/loop-operator.md +36 -0
- package/agents/planner.md +212 -0
- package/agents/python-reviewer.md +98 -0
- package/agents/pytorch-build-resolver.md +120 -0
- package/agents/refactor-cleaner.md +85 -0
- package/agents/rust-build-resolver.md +148 -0
- package/agents/rust-reviewer.md +94 -0
- package/agents/security-reviewer.md +108 -0
- package/agents/tdd-guide.md +91 -0
- package/agents/typescript-reviewer.md +112 -0
- package/commands/aside.md +164 -0
- package/commands/brainstorm.md +16 -0
- package/commands/build-fix.md +70 -0
- package/commands/build.md +91 -0
- package/commands/checkpoint.md +74 -0
- package/commands/claw.md +51 -0
- package/commands/code-review.md +24 -0
- package/commands/context-budget.md +29 -0
- package/commands/cpp-build.md +174 -0
- package/commands/cpp-review.md +132 -0
- package/commands/cpp-test.md +252 -0
- package/commands/deploy.md +75 -0
- package/commands/devfleet.md +92 -0
- package/commands/docs.md +31 -0
- package/commands/e2e.md +373 -0
- package/commands/eval.md +120 -0
- package/commands/evolve.md +178 -0
- package/commands/execute.md +51 -0
- package/commands/finish.md +22 -0
- package/commands/go-build.md +184 -0
- package/commands/go-review.md +148 -0
- package/commands/go-test.md +269 -0
- package/commands/gradle-build.md +70 -0
- package/commands/harness-audit.md +71 -0
- package/commands/instinct-export.md +66 -0
- package/commands/instinct-import.md +114 -0
- package/commands/instinct-status.md +59 -0
- package/commands/investigate.md +63 -0
- package/commands/kotlin-build.md +175 -0
- package/commands/kotlin-review.md +140 -0
- package/commands/kotlin-test.md +313 -0
- package/commands/learn-eval.md +116 -0
- package/commands/learn.md +70 -0
- package/commands/loop-start.md +32 -0
- package/commands/loop-status.md +24 -0
- package/commands/model-route.md +26 -0
- package/commands/multi-backend.md +166 -0
- package/commands/multi-execute.md +324 -0
- package/commands/multi-frontend.md +165 -0
- package/commands/multi-plan.md +277 -0
- package/commands/multi-workflow.md +200 -0
- package/commands/orchestrate.md +240 -0
- package/commands/plan.md +130 -0
- package/commands/pm2.md +272 -0
- package/commands/projects.md +39 -0
- package/commands/promote.md +41 -0
- package/commands/prompt-optimize.md +38 -0
- package/commands/prune.md +31 -0
- package/commands/python-review.md +297 -0
- package/commands/quality-gate.md +29 -0
- package/commands/refactor-clean.md +89 -0
- package/commands/resume-session.md +155 -0
- package/commands/review.md +64 -0
- package/commands/rules-distill.md +11 -0
- package/commands/rust-build.md +188 -0
- package/commands/rust-review.md +142 -0
- package/commands/rust-test.md +309 -0
- package/commands/save-session.md +275 -0
- package/commands/sessions.md +333 -0
- package/commands/setup-pm.md +80 -0
- package/commands/ship.md +77 -0
- package/commands/skill-create.md +174 -0
- package/commands/skill-health.md +54 -0
- package/commands/tdd.md +20 -0
- package/commands/test-coverage.md +77 -0
- package/commands/test.md +64 -0
- package/commands/update-codemaps.md +72 -0
- package/commands/update-docs.md +84 -0
- package/commands/verify.md +55 -0
- package/contexts/dev.md +20 -0
- package/contexts/research.md +26 -0
- package/contexts/review.md +22 -0
- package/examples/CLAUDE.md +100 -0
- package/examples/statusline.json +19 -0
- package/examples/user-CLAUDE.md +109 -0
- package/hooks/README.md +219 -0
- package/hooks/hooks.json +320 -0
- package/hooks/run-hook.cmd +31 -0
- package/hooks/session-start +6 -0
- package/install.ps1 +38 -0
- package/install.sh +17 -0
- package/manifests/install-components.json +415 -0
- package/manifests/install-modules.json +500 -0
- package/manifests/install-profiles.json +80 -0
- package/mcp-configs/mcp-servers.json +153 -0
- package/package.json +131 -0
- package/plugins/README.md +85 -0
- package/rules/README.md +106 -0
- package/rules/common/agents.md +50 -0
- package/rules/common/coding-style.md +48 -0
- package/rules/common/development-workflow.md +38 -0
- package/rules/common/git-workflow.md +24 -0
- package/rules/common/hooks.md +30 -0
- package/rules/common/patterns.md +31 -0
- package/rules/common/performance.md +55 -0
- package/rules/common/security.md +29 -0
- package/rules/common/testing.md +29 -0
- package/rules/cpp/coding-style.md +44 -0
- package/rules/cpp/hooks.md +39 -0
- package/rules/cpp/patterns.md +51 -0
- package/rules/cpp/security.md +51 -0
- package/rules/cpp/testing.md +44 -0
- package/rules/csharp/coding-style.md +72 -0
- package/rules/csharp/hooks.md +25 -0
- package/rules/csharp/patterns.md +50 -0
- package/rules/csharp/security.md +58 -0
- package/rules/csharp/testing.md +46 -0
- package/rules/golang/coding-style.md +32 -0
- package/rules/golang/hooks.md +17 -0
- package/rules/golang/patterns.md +45 -0
- package/rules/golang/security.md +34 -0
- package/rules/golang/testing.md +31 -0
- package/rules/java/coding-style.md +114 -0
- package/rules/java/hooks.md +18 -0
- package/rules/java/patterns.md +146 -0
- package/rules/java/security.md +100 -0
- package/rules/java/testing.md +131 -0
- package/rules/kotlin/coding-style.md +86 -0
- package/rules/kotlin/hooks.md +17 -0
- package/rules/kotlin/patterns.md +146 -0
- package/rules/kotlin/security.md +82 -0
- package/rules/kotlin/testing.md +128 -0
- package/rules/perl/coding-style.md +46 -0
- package/rules/perl/hooks.md +22 -0
- package/rules/perl/patterns.md +76 -0
- package/rules/perl/security.md +69 -0
- package/rules/perl/testing.md +54 -0
- package/rules/php/coding-style.md +40 -0
- package/rules/php/hooks.md +24 -0
- package/rules/php/patterns.md +33 -0
- package/rules/php/security.md +37 -0
- package/rules/php/testing.md +39 -0
- package/rules/python/coding-style.md +42 -0
- package/rules/python/hooks.md +19 -0
- package/rules/python/patterns.md +39 -0
- package/rules/python/security.md +30 -0
- package/rules/python/testing.md +38 -0
- package/rules/rust/coding-style.md +151 -0
- package/rules/rust/hooks.md +16 -0
- package/rules/rust/patterns.md +168 -0
- package/rules/rust/security.md +141 -0
- package/rules/rust/testing.md +154 -0
- package/rules/swift/coding-style.md +47 -0
- package/rules/swift/hooks.md +20 -0
- package/rules/swift/patterns.md +66 -0
- package/rules/swift/security.md +33 -0
- package/rules/swift/testing.md +45 -0
- package/rules/typescript/coding-style.md +199 -0
- package/rules/typescript/hooks.md +22 -0
- package/rules/typescript/patterns.md +52 -0
- package/rules/typescript/security.md +28 -0
- package/rules/typescript/testing.md +18 -0
- package/schemas/ecc-install-config.schema.json +58 -0
- package/schemas/hooks.schema.json +197 -0
- package/schemas/install-components.schema.json +58 -0
- package/schemas/install-modules.schema.json +105 -0
- package/schemas/install-profiles.schema.json +45 -0
- package/schemas/install-state.schema.json +210 -0
- package/schemas/package-manager.schema.json +23 -0
- package/schemas/plugin.schema.json +58 -0
- package/schemas/provenance.schema.json +31 -0
- package/schemas/state-store.schema.json +316 -0
- package/scripts/ci/catalog.js +245 -0
- package/scripts/ci/validate-agents.js +81 -0
- package/scripts/ci/validate-commands.js +136 -0
- package/scripts/ci/validate-hooks.js +239 -0
- package/scripts/ci/validate-install-manifests.js +214 -0
- package/scripts/ci/validate-no-personal-paths.js +63 -0
- package/scripts/ci/validate-rules.js +81 -0
- package/scripts/ci/validate-skills.js +56 -0
- package/scripts/claw.js +473 -0
- package/scripts/codex/merge-mcp-config.js +304 -0
- package/scripts/cursor-aw-home/hooks.json +115 -0
- package/scripts/cursor-aw-hooks/adapter.js +120 -0
- package/scripts/cursor-aw-hooks/after-file-edit.js +11 -0
- package/scripts/cursor-aw-hooks/after-mcp-execution.js +11 -0
- package/scripts/cursor-aw-hooks/after-shell-execution.js +11 -0
- package/scripts/cursor-aw-hooks/aw-phase-adapter.js +43 -0
- package/scripts/cursor-aw-hooks/before-mcp-execution.js +11 -0
- package/scripts/cursor-aw-hooks/before-shell-execution.js +11 -0
- package/scripts/cursor-aw-hooks/before-submit-prompt.js +41 -0
- package/scripts/cursor-aw-hooks/pre-compact.js +11 -0
- package/scripts/cursor-aw-hooks/session-end.js +11 -0
- package/scripts/cursor-aw-hooks/session-start.js +11 -0
- package/scripts/cursor-aw-hooks/stop.js +11 -0
- package/scripts/doctor.js +110 -0
- package/scripts/ecc.js +208 -0
- package/scripts/generate-aw-hooks.js +110 -0
- package/scripts/harness-audit.js +512 -0
- package/scripts/hooks/auto-tmux-dev.js +88 -0
- package/scripts/hooks/check-console-log.js +71 -0
- package/scripts/hooks/check-hook-enabled.js +12 -0
- package/scripts/hooks/config-protection.js +125 -0
- package/scripts/hooks/cost-tracker.js +78 -0
- package/scripts/hooks/doc-file-warning.js +63 -0
- package/scripts/hooks/evaluate-session.js +100 -0
- package/scripts/hooks/governance-capture.js +280 -0
- package/scripts/hooks/insaits-security-monitor.py +269 -0
- package/scripts/hooks/insaits-security-wrapper.js +88 -0
- package/scripts/hooks/mcp-health-check.js +588 -0
- package/scripts/hooks/post-bash-build-complete.js +27 -0
- package/scripts/hooks/post-bash-pr-created.js +37 -0
- package/scripts/hooks/post-edit-console-warn.js +54 -0
- package/scripts/hooks/post-edit-format.js +109 -0
- package/scripts/hooks/post-edit-typecheck.js +96 -0
- package/scripts/hooks/post-mcp-log.js +27 -0
- package/scripts/hooks/pre-bash-dev-server-block.js +187 -0
- package/scripts/hooks/pre-bash-git-push-reminder.js +28 -0
- package/scripts/hooks/pre-bash-tmux-reminder.js +33 -0
- package/scripts/hooks/pre-compact.js +48 -0
- package/scripts/hooks/pre-mcp-log.js +26 -0
- package/scripts/hooks/pre-write-doc-warn.js +9 -0
- package/scripts/hooks/quality-gate.js +168 -0
- package/scripts/hooks/run-with-flags-shell.sh +32 -0
- package/scripts/hooks/run-with-flags.js +120 -0
- package/scripts/hooks/session-end-marker.js +29 -0
- package/scripts/hooks/session-end.js +301 -0
- package/scripts/hooks/session-start-rules-context.sh +5 -0
- package/scripts/hooks/session-start.js +98 -0
- package/scripts/hooks/shared/aw-phase-definitions.js +190 -0
- package/scripts/hooks/shared/aw-phase-runner.js +61 -0
- package/scripts/hooks/shared/session-start.sh +20 -0
- package/scripts/hooks/shared/user-prompt-submit.sh +155 -0
- package/scripts/hooks/suggest-compact.js +80 -0
- package/scripts/install-apply.js +140 -0
- package/scripts/install-plan.js +254 -0
- package/scripts/lib/agent-compress.js +244 -0
- package/scripts/lib/aw-harness-registry.js +122 -0
- package/scripts/lib/aw-hook-contract.js +86 -0
- package/scripts/lib/claude-aw-hook-files.js +28 -0
- package/scripts/lib/claude-hook-config.js +76 -0
- package/scripts/lib/codex-aw-hook-files.js +38 -0
- package/scripts/lib/codex-hook-config.js +88 -0
- package/scripts/lib/cursor-aw-hook-files.js +62 -0
- package/scripts/lib/cursor-hook-config.js +148 -0
- package/scripts/lib/hook-flags.js +74 -0
- package/scripts/lib/inspection.js +212 -0
- package/scripts/lib/install/apply.js +23 -0
- package/scripts/lib/install/config.js +82 -0
- package/scripts/lib/install/request.js +120 -0
- package/scripts/lib/install/runtime.js +54 -0
- package/scripts/lib/install-executor.js +778 -0
- package/scripts/lib/install-lifecycle.js +1311 -0
- package/scripts/lib/install-manifests.js +448 -0
- package/scripts/lib/install-state.js +313 -0
- package/scripts/lib/install-targets/antigravity-project.js +69 -0
- package/scripts/lib/install-targets/claude-home.js +54 -0
- package/scripts/lib/install-targets/codex-home.js +62 -0
- package/scripts/lib/install-targets/cursor-project.js +80 -0
- package/scripts/lib/install-targets/helpers.js +307 -0
- package/scripts/lib/install-targets/opencode-home.js +10 -0
- package/scripts/lib/install-targets/registry.js +66 -0
- package/scripts/lib/orchestration-session.js +299 -0
- package/scripts/lib/package-manager.d.ts +119 -0
- package/scripts/lib/package-manager.js +431 -0
- package/scripts/lib/project-detect.js +428 -0
- package/scripts/lib/resolve-ecc-root.js +89 -0
- package/scripts/lib/resolve-formatter.js +185 -0
- package/scripts/lib/session-adapters/canonical-session.js +531 -0
- package/scripts/lib/session-adapters/claude-history.js +160 -0
- package/scripts/lib/session-adapters/dmux-tmux.js +90 -0
- package/scripts/lib/session-adapters/registry.js +127 -0
- package/scripts/lib/session-aliases.d.ts +136 -0
- package/scripts/lib/session-aliases.js +481 -0
- package/scripts/lib/session-manager.d.ts +131 -0
- package/scripts/lib/session-manager.js +464 -0
- package/scripts/lib/shell-split.js +86 -0
- package/scripts/lib/skill-evolution/dashboard.js +401 -0
- package/scripts/lib/skill-evolution/health.js +263 -0
- package/scripts/lib/skill-evolution/index.js +20 -0
- package/scripts/lib/skill-evolution/provenance.js +187 -0
- package/scripts/lib/skill-evolution/tracker.js +146 -0
- package/scripts/lib/skill-evolution/versioning.js +237 -0
- package/scripts/lib/skill-improvement/amendify.js +89 -0
- package/scripts/lib/skill-improvement/evaluate.js +59 -0
- package/scripts/lib/skill-improvement/health.js +118 -0
- package/scripts/lib/skill-improvement/observations.js +108 -0
- package/scripts/lib/state-store/index.js +191 -0
- package/scripts/lib/state-store/migrations.js +178 -0
- package/scripts/lib/state-store/queries.js +697 -0
- package/scripts/lib/state-store/schema.js +92 -0
- package/scripts/lib/tmux-worktree-orchestrator.js +475 -0
- package/scripts/lib/utils.d.ts +183 -0
- package/scripts/lib/utils.js +564 -0
- package/scripts/list-installed.js +90 -0
- package/scripts/orchestrate-codex-worker.sh +107 -0
- package/scripts/orchestrate-worktrees.js +40 -0
- package/scripts/orchestration-status.js +82 -0
- package/scripts/repair.js +97 -0
- package/scripts/session-inspect.js +150 -0
- package/scripts/sessions-cli.js +177 -0
- package/scripts/setup-package-manager.js +204 -0
- package/scripts/skill-create-output.js +244 -0
- package/scripts/status.js +176 -0
- package/scripts/uninstall.js +96 -0
- package/skills/agent-eval/SKILL.md +145 -0
- package/skills/agent-harness-construction/SKILL.md +73 -0
- package/skills/agentic-engineering/SKILL.md +63 -0
- package/skills/ai-first-engineering/SKILL.md +51 -0
- package/skills/ai-regression-testing/SKILL.md +385 -0
- package/skills/android-clean-architecture/SKILL.md +339 -0
- package/skills/api-and-interface-design/SKILL.md +75 -0
- package/skills/api-design/SKILL.md +523 -0
- package/skills/architecture-decision-records/SKILL.md +179 -0
- package/skills/article-writing/SKILL.md +85 -0
- package/skills/autonomous-loops/SKILL.md +610 -0
- package/skills/aw-brainstorm/SKILL.md +115 -0
- package/skills/aw-build/SKILL.md +189 -0
- package/skills/aw-build/evals/build-stage-cases.json +28 -0
- package/skills/aw-debug/SKILL.md +49 -0
- package/skills/aw-deploy/SKILL.md +101 -0
- package/skills/aw-deploy/evals/deploy-stage-cases.json +32 -0
- package/skills/aw-execute/SKILL.md +47 -0
- package/skills/aw-execute/references/mode-code.md +47 -0
- package/skills/aw-execute/references/mode-docs.md +28 -0
- package/skills/aw-execute/references/mode-infra.md +44 -0
- package/skills/aw-execute/references/mode-migration.md +58 -0
- package/skills/aw-execute/references/worker-implementer.md +26 -0
- package/skills/aw-execute/references/worker-parallel-worker.md +23 -0
- package/skills/aw-execute/references/worker-quality-reviewer.md +23 -0
- package/skills/aw-execute/references/worker-spec-reviewer.md +23 -0
- package/skills/aw-execute/scripts/build-worker-bundle.js +229 -0
- package/skills/aw-finish/SKILL.md +111 -0
- package/skills/aw-investigate/SKILL.md +109 -0
- package/skills/aw-plan/SKILL.md +399 -0
- package/skills/aw-prepare/SKILL.md +118 -0
- package/skills/aw-review/SKILL.md +123 -0
- package/skills/aw-rules/SKILL.md +129 -0
- package/skills/aw-rules/references/known-hallucinations.md +43 -0
- package/skills/aw-rules/references/verification-sources.md +50 -0
- package/skills/aw-ship/SKILL.md +115 -0
- package/skills/aw-spec/SKILL.md +128 -0
- package/skills/aw-tasks/SKILL.md +155 -0
- package/skills/aw-test/SKILL.md +118 -0
- package/skills/aw-verify/SKILL.md +51 -0
- package/skills/aw-yolo/SKILL.md +111 -0
- package/skills/backend-patterns/SKILL.md +598 -0
- package/skills/benchmark/SKILL.md +87 -0
- package/skills/blueprint/SKILL.md +105 -0
- package/skills/browser-qa/SKILL.md +81 -0
- package/skills/browser-testing-with-devtools/SKILL.md +81 -0
- package/skills/bun-runtime/SKILL.md +84 -0
- package/skills/canary-watch/SKILL.md +93 -0
- package/skills/carrier-relationship-management/SKILL.md +212 -0
- package/skills/ci-cd-and-automation/SKILL.md +71 -0
- package/skills/claude-api/SKILL.md +337 -0
- package/skills/claude-devfleet/SKILL.md +103 -0
- package/skills/click-path-audit/SKILL.md +244 -0
- package/skills/clickhouse-io/SKILL.md +439 -0
- package/skills/code-simplification/SKILL.md +74 -0
- package/skills/codebase-onboarding/SKILL.md +233 -0
- package/skills/coding-standards/SKILL.md +530 -0
- package/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/skills/configure-ecc/SKILL.md +367 -0
- package/skills/content-engine/SKILL.md +88 -0
- package/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/skills/context-budget/SKILL.md +135 -0
- package/skills/context-engineering/SKILL.md +74 -0
- package/skills/continuous-agent-loop/SKILL.md +45 -0
- package/skills/continuous-learning/SKILL.md +119 -0
- package/skills/continuous-learning/config.json +18 -0
- package/skills/continuous-learning/evaluate-session.sh +69 -0
- package/skills/continuous-learning-v2/SKILL.md +365 -0
- package/skills/continuous-learning-v2/agents/observer-loop.sh +191 -0
- package/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/skills/continuous-learning-v2/agents/start-observer.sh +240 -0
- package/skills/continuous-learning-v2/config.json +8 -0
- package/skills/continuous-learning-v2/hooks/observe.sh +412 -0
- package/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
- package/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
- package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +984 -0
- package/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/cpp-coding-standards/SKILL.md +723 -0
- package/skills/cpp-testing/SKILL.md +324 -0
- package/skills/crosspost/SKILL.md +190 -0
- package/skills/customs-trade-compliance/SKILL.md +263 -0
- package/skills/data-scraper-agent/SKILL.md +764 -0
- package/skills/database-migrations/SKILL.md +429 -0
- package/skills/deep-research/SKILL.md +155 -0
- package/skills/deployment-patterns/SKILL.md +427 -0
- package/skills/deprecation-and-migration/SKILL.md +75 -0
- package/skills/design-system/SKILL.md +76 -0
- package/skills/django-patterns/SKILL.md +734 -0
- package/skills/django-security/SKILL.md +593 -0
- package/skills/django-tdd/SKILL.md +729 -0
- package/skills/django-verification/SKILL.md +469 -0
- package/skills/dmux-workflows/SKILL.md +191 -0
- package/skills/docker-patterns/SKILL.md +364 -0
- package/skills/documentation-and-adrs/SKILL.md +75 -0
- package/skills/documentation-lookup/SKILL.md +90 -0
- package/skills/e2e-testing/SKILL.md +326 -0
- package/skills/energy-procurement/SKILL.md +228 -0
- package/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/skills/eval-harness/SKILL.md +270 -0
- package/skills/exa-search/SKILL.md +103 -0
- package/skills/fal-ai-media/SKILL.md +284 -0
- package/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/skills/foundation-models-on-device/SKILL.md +243 -0
- package/skills/frontend-patterns/SKILL.md +642 -0
- package/skills/frontend-slides/SKILL.md +184 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/skills/frontend-ui-engineering/SKILL.md +68 -0
- package/skills/git-workflow-and-versioning/SKILL.md +75 -0
- package/skills/golang-patterns/SKILL.md +674 -0
- package/skills/golang-testing/SKILL.md +720 -0
- package/skills/idea-refine/SKILL.md +84 -0
- package/skills/incremental-implementation/SKILL.md +86 -0
- package/skills/inventory-demand-planning/SKILL.md +247 -0
- package/skills/investor-materials/SKILL.md +96 -0
- package/skills/investor-outreach/SKILL.md +76 -0
- package/skills/iterative-retrieval/SKILL.md +211 -0
- package/skills/java-coding-standards/SKILL.md +147 -0
- package/skills/jpa-patterns/SKILL.md +151 -0
- package/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/skills/kotlin-patterns/SKILL.md +711 -0
- package/skills/kotlin-testing/SKILL.md +824 -0
- package/skills/laravel-patterns/SKILL.md +415 -0
- package/skills/laravel-security/SKILL.md +285 -0
- package/skills/laravel-tdd/SKILL.md +283 -0
- package/skills/laravel-verification/SKILL.md +179 -0
- package/skills/liquid-glass-design/SKILL.md +279 -0
- package/skills/logistics-exception-management/SKILL.md +222 -0
- package/skills/market-research/SKILL.md +75 -0
- package/skills/mcp-server-patterns/SKILL.md +67 -0
- package/skills/nanoclaw-repl/SKILL.md +33 -0
- package/skills/nextjs-turbopack/SKILL.md +44 -0
- package/skills/nutrient-document-processing/SKILL.md +167 -0
- package/skills/nuxt4-patterns/SKILL.md +100 -0
- package/skills/performance-optimization/SKILL.md +77 -0
- package/skills/perl-patterns/SKILL.md +504 -0
- package/skills/perl-security/SKILL.md +503 -0
- package/skills/perl-testing/SKILL.md +475 -0
- package/skills/plankton-code-quality/SKILL.md +236 -0
- package/skills/postgres-patterns/SKILL.md +147 -0
- package/skills/product-lens/SKILL.md +79 -0
- package/skills/production-scheduling/SKILL.md +238 -0
- package/skills/project-guidelines-example/SKILL.md +349 -0
- package/skills/prompt-optimizer/SKILL.md +397 -0
- package/skills/python-patterns/SKILL.md +750 -0
- package/skills/python-testing/SKILL.md +816 -0
- package/skills/pytorch-patterns/SKILL.md +396 -0
- package/skills/quality-nonconformance/SKILL.md +260 -0
- package/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
- package/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/skills/rules-distill/SKILL.md +264 -0
- package/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/skills/rust-patterns/SKILL.md +499 -0
- package/skills/rust-testing/SKILL.md +500 -0
- package/skills/safety-guard/SKILL.md +69 -0
- package/skills/santa-method/SKILL.md +306 -0
- package/skills/search-first/SKILL.md +161 -0
- package/skills/security-and-hardening/SKILL.md +70 -0
- package/skills/security-review/SKILL.md +495 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/security-scan/SKILL.md +165 -0
- package/skills/skill-comply/SKILL.md +58 -0
- package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/skills/skill-comply/prompts/classifier.md +24 -0
- package/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/skills/skill-comply/pyproject.toml +15 -0
- package/skills/skill-comply/scripts/__init__.py +0 -0
- package/skills/skill-comply/scripts/classifier.py +85 -0
- package/skills/skill-comply/scripts/grader.py +122 -0
- package/skills/skill-comply/scripts/parser.py +107 -0
- package/skills/skill-comply/scripts/report.py +170 -0
- package/skills/skill-comply/scripts/run.py +127 -0
- package/skills/skill-comply/scripts/runner.py +161 -0
- package/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/skills/skill-comply/scripts/utils.py +13 -0
- package/skills/skill-comply/tests/test_grader.py +137 -0
- package/skills/skill-comply/tests/test_parser.py +90 -0
- package/skills/skill-quality-review/SKILL.md +102 -0
- package/skills/skill-quality-review/references/review-rubric.md +112 -0
- package/skills/skill-stocktake/SKILL.md +197 -0
- package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/skills/springboot-patterns/SKILL.md +314 -0
- package/skills/springboot-security/SKILL.md +272 -0
- package/skills/springboot-tdd/SKILL.md +158 -0
- package/skills/springboot-verification/SKILL.md +231 -0
- package/skills/strategic-compact/SKILL.md +131 -0
- package/skills/strategic-compact/suggest-compact.sh +54 -0
- package/skills/swift-actor-persistence/SKILL.md +143 -0
- package/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/skills/swiftui-patterns/SKILL.md +259 -0
- package/skills/tdd-workflow/SKILL.md +145 -0
- package/skills/team-builder/SKILL.md +161 -0
- package/skills/using-aw-skills/SKILL.md +290 -0
- package/skills/using-aw-skills/evals/skill-trigger-cases.tsv +25 -0
- package/skills/using-aw-skills/evals/test-skill-triggers.sh +171 -0
- package/skills/using-aw-skills/hooks/hooks.json +9 -0
- package/skills/using-aw-skills/hooks/session-start.sh +188 -0
- package/skills/using-platform-skills/SKILL.md +163 -0
- package/skills/using-platform-skills/evals/platform-selection-cases.json +52 -0
- package/skills/verification-loop/SKILL.md +126 -0
- package/skills/video-editing/SKILL.md +310 -0
- package/skills/videodb/SKILL.md +374 -0
- package/skills/videodb/reference/api-reference.md +550 -0
- package/skills/videodb/reference/capture-reference.md +407 -0
- package/skills/videodb/reference/capture.md +101 -0
- package/skills/videodb/reference/editor.md +443 -0
- package/skills/videodb/reference/generative.md +331 -0
- package/skills/videodb/reference/rtstream-reference.md +564 -0
- package/skills/videodb/reference/rtstream.md +65 -0
- package/skills/videodb/reference/search.md +230 -0
- package/skills/videodb/reference/streaming.md +406 -0
- package/skills/videodb/reference/use-cases.md +118 -0
- package/skills/videodb/scripts/ws_listener.py +282 -0
- package/skills/visa-doc-translate/README.md +86 -0
- package/skills/visa-doc-translate/SKILL.md +117 -0
- package/skills/x-api/SKILL.md +208 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything Claude Code (ECC) Plugin Hooks for OpenCode
|
|
3
|
+
*
|
|
4
|
+
* This plugin translates Claude Code hooks to OpenCode's plugin system.
|
|
5
|
+
* OpenCode's plugin system is MORE sophisticated than Claude Code with 20+ events
|
|
6
|
+
* compared to Claude Code's 3 phases (PreToolUse, PostToolUse, Stop).
|
|
7
|
+
*
|
|
8
|
+
* Hook Event Mapping:
|
|
9
|
+
* - PreToolUse → tool.execute.before
|
|
10
|
+
* - PostToolUse → tool.execute.after
|
|
11
|
+
* - Stop → session.idle / session.status
|
|
12
|
+
* - SessionStart → session.created
|
|
13
|
+
* - SessionEnd → session.deleted
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { PluginInput } from "@opencode-ai/plugin"
|
|
17
|
+
|
|
18
|
+
export const ECCHooksPlugin = async ({
|
|
19
|
+
client,
|
|
20
|
+
$,
|
|
21
|
+
directory,
|
|
22
|
+
worktree,
|
|
23
|
+
}: PluginInput) => {
|
|
24
|
+
type HookProfile = "minimal" | "standard" | "strict"
|
|
25
|
+
|
|
26
|
+
// Track files edited in current session for console.log audit
|
|
27
|
+
const editedFiles = new Set<string>()
|
|
28
|
+
|
|
29
|
+
// Helper to call the SDK's log API with correct signature
|
|
30
|
+
const log = (level: "debug" | "info" | "warn" | "error", message: string) =>
|
|
31
|
+
client.app.log({ body: { service: "ecc", level, message } })
|
|
32
|
+
|
|
33
|
+
const normalizeProfile = (value: string | undefined): HookProfile => {
|
|
34
|
+
if (value === "minimal" || value === "strict") return value
|
|
35
|
+
return "standard"
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const currentProfile = normalizeProfile(process.env.ECC_HOOK_PROFILE)
|
|
39
|
+
const disabledHooks = new Set(
|
|
40
|
+
(process.env.ECC_DISABLED_HOOKS || "")
|
|
41
|
+
.split(",")
|
|
42
|
+
.map((item) => item.trim())
|
|
43
|
+
.filter(Boolean)
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
const profileOrder: Record<HookProfile, number> = {
|
|
47
|
+
minimal: 0,
|
|
48
|
+
standard: 1,
|
|
49
|
+
strict: 2,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const profileAllowed = (required: HookProfile | HookProfile[]): boolean => {
|
|
53
|
+
if (Array.isArray(required)) {
|
|
54
|
+
return required.some((entry) => profileOrder[currentProfile] >= profileOrder[entry])
|
|
55
|
+
}
|
|
56
|
+
return profileOrder[currentProfile] >= profileOrder[required]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const hookEnabled = (
|
|
60
|
+
hookId: string,
|
|
61
|
+
requiredProfile: HookProfile | HookProfile[] = "standard"
|
|
62
|
+
): boolean => {
|
|
63
|
+
if (disabledHooks.has(hookId)) return false
|
|
64
|
+
return profileAllowed(requiredProfile)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
/**
|
|
69
|
+
* Prettier Auto-Format Hook
|
|
70
|
+
* Equivalent to Claude Code PostToolUse hook for prettier
|
|
71
|
+
*
|
|
72
|
+
* Triggers: After any JS/TS/JSX/TSX file is edited
|
|
73
|
+
* Action: Runs prettier --write on the file
|
|
74
|
+
*/
|
|
75
|
+
"file.edited": async (event: { path: string }) => {
|
|
76
|
+
// Track edited files for console.log audit
|
|
77
|
+
editedFiles.add(event.path)
|
|
78
|
+
|
|
79
|
+
// Auto-format JS/TS files
|
|
80
|
+
if (hookEnabled("post:edit:format", ["strict"]) && event.path.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
81
|
+
try {
|
|
82
|
+
await $`prettier --write ${event.path} 2>/dev/null`
|
|
83
|
+
log("info", `[ECC] Formatted: ${event.path}`)
|
|
84
|
+
} catch {
|
|
85
|
+
// Prettier not installed or failed - silently continue
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Console.log warning check
|
|
90
|
+
if (hookEnabled("post:edit:console-warn", ["standard", "strict"]) && event.path.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
91
|
+
try {
|
|
92
|
+
const result = await $`grep -n "console\\.log" ${event.path} 2>/dev/null`.text()
|
|
93
|
+
if (result.trim()) {
|
|
94
|
+
const lines = result.trim().split("\n").length
|
|
95
|
+
log(
|
|
96
|
+
"warn",
|
|
97
|
+
`[ECC] console.log found in ${event.path} (${lines} occurrence${lines > 1 ? "s" : ""})`
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
} catch {
|
|
101
|
+
// No console.log found (grep returns non-zero) - this is good
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* TypeScript Check Hook
|
|
108
|
+
* Equivalent to Claude Code PostToolUse hook for tsc
|
|
109
|
+
*
|
|
110
|
+
* Triggers: After edit tool completes on .ts/.tsx files
|
|
111
|
+
* Action: Runs tsc --noEmit to check for type errors
|
|
112
|
+
*/
|
|
113
|
+
"tool.execute.after": async (
|
|
114
|
+
input: { tool: string; args?: { filePath?: string } },
|
|
115
|
+
output: unknown
|
|
116
|
+
) => {
|
|
117
|
+
// Check if a TypeScript file was edited
|
|
118
|
+
if (
|
|
119
|
+
hookEnabled("post:edit:typecheck", ["strict"]) &&
|
|
120
|
+
input.tool === "edit" &&
|
|
121
|
+
input.args?.filePath?.match(/\.tsx?$/)
|
|
122
|
+
) {
|
|
123
|
+
try {
|
|
124
|
+
await $`npx tsc --noEmit 2>&1`
|
|
125
|
+
log("info", "[ECC] TypeScript check passed")
|
|
126
|
+
} catch (error: unknown) {
|
|
127
|
+
const err = error as { stdout?: string }
|
|
128
|
+
log("warn", "[ECC] TypeScript errors detected:")
|
|
129
|
+
if (err.stdout) {
|
|
130
|
+
// Log first few errors
|
|
131
|
+
const errors = err.stdout.split("\n").slice(0, 5)
|
|
132
|
+
errors.forEach((line: string) => log("warn", ` ${line}`))
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// PR creation logging
|
|
138
|
+
if (
|
|
139
|
+
hookEnabled("post:bash:pr-created", ["standard", "strict"]) &&
|
|
140
|
+
input.tool === "bash" &&
|
|
141
|
+
input.args?.toString().includes("gh pr create")
|
|
142
|
+
) {
|
|
143
|
+
log("info", "[ECC] PR created - check GitHub Actions status")
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Pre-Tool Security Check
|
|
149
|
+
* Equivalent to Claude Code PreToolUse hook
|
|
150
|
+
*
|
|
151
|
+
* Triggers: Before tool execution
|
|
152
|
+
* Action: Warns about potential security issues
|
|
153
|
+
*/
|
|
154
|
+
"tool.execute.before": async (
|
|
155
|
+
input: { tool: string; args?: Record<string, unknown> }
|
|
156
|
+
) => {
|
|
157
|
+
// Git push review reminder
|
|
158
|
+
if (
|
|
159
|
+
hookEnabled("pre:bash:git-push-reminder", "strict") &&
|
|
160
|
+
input.tool === "bash" &&
|
|
161
|
+
input.args?.toString().includes("git push")
|
|
162
|
+
) {
|
|
163
|
+
log(
|
|
164
|
+
"info",
|
|
165
|
+
"[ECC] Remember to review changes before pushing: git diff origin/main...HEAD"
|
|
166
|
+
)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Block creation of unnecessary documentation files
|
|
170
|
+
if (
|
|
171
|
+
hookEnabled("pre:write:doc-file-warning", ["standard", "strict"]) &&
|
|
172
|
+
input.tool === "write" &&
|
|
173
|
+
input.args?.filePath &&
|
|
174
|
+
typeof input.args.filePath === "string"
|
|
175
|
+
) {
|
|
176
|
+
const filePath = input.args.filePath
|
|
177
|
+
if (
|
|
178
|
+
filePath.match(/\.(md|txt)$/i) &&
|
|
179
|
+
!filePath.includes("README") &&
|
|
180
|
+
!filePath.includes("CHANGELOG") &&
|
|
181
|
+
!filePath.includes("LICENSE") &&
|
|
182
|
+
!filePath.includes("CONTRIBUTING")
|
|
183
|
+
) {
|
|
184
|
+
log(
|
|
185
|
+
"warn",
|
|
186
|
+
`[ECC] Creating ${filePath} - consider if this documentation is necessary`
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Long-running command reminder
|
|
192
|
+
if (hookEnabled("pre:bash:tmux-reminder", "strict") && input.tool === "bash") {
|
|
193
|
+
const cmd = String(input.args?.command || input.args || "")
|
|
194
|
+
if (
|
|
195
|
+
cmd.match(/^(npm|pnpm|yarn|bun)\s+(install|build|test|run)/) ||
|
|
196
|
+
cmd.match(/^cargo\s+(build|test|run)/) ||
|
|
197
|
+
cmd.match(/^go\s+(build|test|run)/)
|
|
198
|
+
) {
|
|
199
|
+
log(
|
|
200
|
+
"info",
|
|
201
|
+
"[ECC] Long-running command detected - consider using background execution"
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Session Created Hook
|
|
209
|
+
* Equivalent to Claude Code SessionStart hook
|
|
210
|
+
*
|
|
211
|
+
* Triggers: When a new session starts
|
|
212
|
+
* Action: Loads context and displays welcome message
|
|
213
|
+
*/
|
|
214
|
+
"session.created": async () => {
|
|
215
|
+
if (!hookEnabled("session:start", ["minimal", "standard", "strict"])) return
|
|
216
|
+
|
|
217
|
+
log("info", `[ECC] Session started - profile=${currentProfile}`)
|
|
218
|
+
|
|
219
|
+
// Check for project-specific context files
|
|
220
|
+
try {
|
|
221
|
+
const hasClaudeMd = await $`test -f ${worktree}/CLAUDE.md && echo "yes"`.text()
|
|
222
|
+
if (hasClaudeMd.trim() === "yes") {
|
|
223
|
+
log("info", "[ECC] Found CLAUDE.md - loading project context")
|
|
224
|
+
}
|
|
225
|
+
} catch {
|
|
226
|
+
// No CLAUDE.md found
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Session Idle Hook
|
|
232
|
+
* Equivalent to Claude Code Stop hook
|
|
233
|
+
*
|
|
234
|
+
* Triggers: When session becomes idle (task completed)
|
|
235
|
+
* Action: Runs console.log audit on all edited files
|
|
236
|
+
*/
|
|
237
|
+
"session.idle": async () => {
|
|
238
|
+
if (!hookEnabled("stop:check-console-log", ["minimal", "standard", "strict"])) return
|
|
239
|
+
if (editedFiles.size === 0) return
|
|
240
|
+
|
|
241
|
+
log("info", "[ECC] Session idle - running console.log audit")
|
|
242
|
+
|
|
243
|
+
let totalConsoleLogCount = 0
|
|
244
|
+
const filesWithConsoleLogs: string[] = []
|
|
245
|
+
|
|
246
|
+
for (const file of editedFiles) {
|
|
247
|
+
if (!file.match(/\.(ts|tsx|js|jsx)$/)) continue
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
const result = await $`grep -c "console\\.log" ${file} 2>/dev/null`.text()
|
|
251
|
+
const count = parseInt(result.trim(), 10)
|
|
252
|
+
if (count > 0) {
|
|
253
|
+
totalConsoleLogCount += count
|
|
254
|
+
filesWithConsoleLogs.push(file)
|
|
255
|
+
}
|
|
256
|
+
} catch {
|
|
257
|
+
// No console.log found
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (totalConsoleLogCount > 0) {
|
|
262
|
+
log(
|
|
263
|
+
"warn",
|
|
264
|
+
`[ECC] Audit: ${totalConsoleLogCount} console.log statement(s) in ${filesWithConsoleLogs.length} file(s)`
|
|
265
|
+
)
|
|
266
|
+
filesWithConsoleLogs.forEach((f) =>
|
|
267
|
+
log("warn", ` - ${f}`)
|
|
268
|
+
)
|
|
269
|
+
log("warn", "[ECC] Remove console.log statements before committing")
|
|
270
|
+
} else {
|
|
271
|
+
log("info", "[ECC] Audit passed: No console.log statements found")
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Desktop notification (macOS)
|
|
275
|
+
try {
|
|
276
|
+
await $`osascript -e 'display notification "Task completed!" with title "OpenCode ECC"' 2>/dev/null`
|
|
277
|
+
} catch {
|
|
278
|
+
// Notification not supported or failed
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Clear tracked files for next task
|
|
282
|
+
editedFiles.clear()
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Session Deleted Hook
|
|
287
|
+
* Equivalent to Claude Code SessionEnd hook
|
|
288
|
+
*
|
|
289
|
+
* Triggers: When session ends
|
|
290
|
+
* Action: Final cleanup and state saving
|
|
291
|
+
*/
|
|
292
|
+
"session.deleted": async () => {
|
|
293
|
+
if (!hookEnabled("session:end-marker", ["minimal", "standard", "strict"])) return
|
|
294
|
+
log("info", "[ECC] Session ended - cleaning up")
|
|
295
|
+
editedFiles.clear()
|
|
296
|
+
},
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* File Watcher Hook
|
|
300
|
+
* OpenCode-only feature
|
|
301
|
+
*
|
|
302
|
+
* Triggers: When file system changes are detected
|
|
303
|
+
* Action: Updates tracking
|
|
304
|
+
*/
|
|
305
|
+
"file.watcher.updated": async (event: { path: string; type: string }) => {
|
|
306
|
+
if (event.type === "change" && event.path.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
307
|
+
editedFiles.add(event.path)
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Todo Updated Hook
|
|
313
|
+
* OpenCode-only feature
|
|
314
|
+
*
|
|
315
|
+
* Triggers: When todo list is updated
|
|
316
|
+
* Action: Logs progress
|
|
317
|
+
*/
|
|
318
|
+
"todo.updated": async (event: { todos: Array<{ text: string; done: boolean }> }) => {
|
|
319
|
+
const completed = event.todos.filter((t) => t.done).length
|
|
320
|
+
const total = event.todos.length
|
|
321
|
+
if (total > 0) {
|
|
322
|
+
log("info", `[ECC] Progress: ${completed}/${total} tasks completed`)
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Shell Environment Hook
|
|
328
|
+
* OpenCode-specific: Inject environment variables into shell commands
|
|
329
|
+
*
|
|
330
|
+
* Triggers: Before shell command execution
|
|
331
|
+
* Action: Sets PROJECT_ROOT, PACKAGE_MANAGER, DETECTED_LANGUAGES, ECC_VERSION
|
|
332
|
+
*/
|
|
333
|
+
"shell.env": async () => {
|
|
334
|
+
const env: Record<string, string> = {
|
|
335
|
+
ECC_VERSION: "1.8.0",
|
|
336
|
+
ECC_PLUGIN: "true",
|
|
337
|
+
ECC_HOOK_PROFILE: currentProfile,
|
|
338
|
+
ECC_DISABLED_HOOKS: process.env.ECC_DISABLED_HOOKS || "",
|
|
339
|
+
PROJECT_ROOT: worktree || directory,
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Detect package manager
|
|
343
|
+
const lockfiles: Record<string, string> = {
|
|
344
|
+
"bun.lockb": "bun",
|
|
345
|
+
"pnpm-lock.yaml": "pnpm",
|
|
346
|
+
"yarn.lock": "yarn",
|
|
347
|
+
"package-lock.json": "npm",
|
|
348
|
+
}
|
|
349
|
+
for (const [lockfile, pm] of Object.entries(lockfiles)) {
|
|
350
|
+
try {
|
|
351
|
+
await $`test -f ${worktree}/${lockfile}`
|
|
352
|
+
env.PACKAGE_MANAGER = pm
|
|
353
|
+
break
|
|
354
|
+
} catch {
|
|
355
|
+
// Not found, try next
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Detect languages
|
|
360
|
+
const langDetectors: Record<string, string> = {
|
|
361
|
+
"tsconfig.json": "typescript",
|
|
362
|
+
"go.mod": "go",
|
|
363
|
+
"pyproject.toml": "python",
|
|
364
|
+
"Cargo.toml": "rust",
|
|
365
|
+
"Package.swift": "swift",
|
|
366
|
+
}
|
|
367
|
+
const detected: string[] = []
|
|
368
|
+
for (const [file, lang] of Object.entries(langDetectors)) {
|
|
369
|
+
try {
|
|
370
|
+
await $`test -f ${worktree}/${file}`
|
|
371
|
+
detected.push(lang)
|
|
372
|
+
} catch {
|
|
373
|
+
// Not found
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (detected.length > 0) {
|
|
377
|
+
env.DETECTED_LANGUAGES = detected.join(",")
|
|
378
|
+
env.PRIMARY_LANGUAGE = detected[0]
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
return env
|
|
382
|
+
},
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Session Compacting Hook
|
|
386
|
+
* OpenCode-specific: Control context compaction behavior
|
|
387
|
+
*
|
|
388
|
+
* Triggers: Before context compaction
|
|
389
|
+
* Action: Push ECC context block and custom compaction prompt
|
|
390
|
+
*/
|
|
391
|
+
"experimental.session.compacting": async () => {
|
|
392
|
+
const contextBlock = [
|
|
393
|
+
"# ECC Context (preserve across compaction)",
|
|
394
|
+
"",
|
|
395
|
+
"## Active Plugin: Everything Claude Code v1.8.0",
|
|
396
|
+
"- Hooks: file.edited, tool.execute.before/after, session.created/idle/deleted, shell.env, compacting, permission.ask",
|
|
397
|
+
"- Tools: run-tests, check-coverage, security-audit, format-code, lint-check, git-summary",
|
|
398
|
+
"- Agents: 13 specialized (planner, architect, tdd-guide, code-reviewer, security-reviewer, build-error-resolver, e2e-runner, refactor-cleaner, doc-updater, go-reviewer, go-build-resolver, database-reviewer, python-reviewer)",
|
|
399
|
+
"",
|
|
400
|
+
"## Key Principles",
|
|
401
|
+
"- TDD: write tests first, 80%+ coverage",
|
|
402
|
+
"- Immutability: never mutate, always return new copies",
|
|
403
|
+
"- Security: validate inputs, no hardcoded secrets",
|
|
404
|
+
"",
|
|
405
|
+
]
|
|
406
|
+
|
|
407
|
+
// Include recently edited files
|
|
408
|
+
if (editedFiles.size > 0) {
|
|
409
|
+
contextBlock.push("## Recently Edited Files")
|
|
410
|
+
for (const f of editedFiles) {
|
|
411
|
+
contextBlock.push(`- ${f}`)
|
|
412
|
+
}
|
|
413
|
+
contextBlock.push("")
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
return {
|
|
417
|
+
context: contextBlock.join("\n"),
|
|
418
|
+
compaction_prompt: "Focus on preserving: 1) Current task status and progress, 2) Key decisions made, 3) Files created/modified, 4) Remaining work items, 5) Any security concerns flagged. Discard: verbose tool outputs, intermediate exploration, redundant file listings.",
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Permission Auto-Approve Hook
|
|
424
|
+
* OpenCode-specific: Auto-approve safe operations
|
|
425
|
+
*
|
|
426
|
+
* Triggers: When permission is requested
|
|
427
|
+
* Action: Auto-approve reads, formatters, and test commands; log all for audit
|
|
428
|
+
*/
|
|
429
|
+
"permission.ask": async (event: { tool: string; args: unknown }) => {
|
|
430
|
+
log("info", `[ECC] Permission requested for: ${event.tool}`)
|
|
431
|
+
|
|
432
|
+
const cmd = String((event.args as Record<string, unknown>)?.command || event.args || "")
|
|
433
|
+
|
|
434
|
+
// Auto-approve: read/search tools
|
|
435
|
+
if (["read", "glob", "grep", "search", "list"].includes(event.tool)) {
|
|
436
|
+
return { approved: true, reason: "Read-only operation" }
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Auto-approve: formatters
|
|
440
|
+
if (event.tool === "bash" && /^(npx )?(prettier|biome|black|gofmt|rustfmt|swift-format)/.test(cmd)) {
|
|
441
|
+
return { approved: true, reason: "Formatter execution" }
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// Auto-approve: test execution
|
|
445
|
+
if (event.tool === "bash" && /^(npm test|npx vitest|npx jest|pytest|go test|cargo test)/.test(cmd)) {
|
|
446
|
+
return { approved: true, reason: "Test execution" }
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Everything else: let user decide
|
|
450
|
+
return { approved: undefined }
|
|
451
|
+
},
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
export default ECCHooksPlugin
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything Claude Code (ECC) Plugins for OpenCode
|
|
3
|
+
*
|
|
4
|
+
* This module exports all ECC plugins for OpenCode integration.
|
|
5
|
+
* Plugins provide hook-based automation that mirrors Claude Code's hook system
|
|
6
|
+
* while taking advantage of OpenCode's more sophisticated 20+ event types.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export { ECCHooksPlugin, default } from "./ecc-hooks.js"
|
|
10
|
+
|
|
11
|
+
// Re-export for named imports
|
|
12
|
+
export * from "./ecc-hooks.js"
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
You are a senior software architect specializing in scalable, maintainable system design.
|
|
2
|
+
|
|
3
|
+
## Your Role
|
|
4
|
+
|
|
5
|
+
- Design system architecture for new features
|
|
6
|
+
- Evaluate technical trade-offs
|
|
7
|
+
- Recommend patterns and best practices
|
|
8
|
+
- Identify scalability bottlenecks
|
|
9
|
+
- Plan for future growth
|
|
10
|
+
- Ensure consistency across codebase
|
|
11
|
+
|
|
12
|
+
## Architecture Review Process
|
|
13
|
+
|
|
14
|
+
### 1. Current State Analysis
|
|
15
|
+
- Review existing architecture
|
|
16
|
+
- Identify patterns and conventions
|
|
17
|
+
- Document technical debt
|
|
18
|
+
- Assess scalability limitations
|
|
19
|
+
|
|
20
|
+
### 2. Requirements Gathering
|
|
21
|
+
- Functional requirements
|
|
22
|
+
- Non-functional requirements (performance, security, scalability)
|
|
23
|
+
- Integration points
|
|
24
|
+
- Data flow requirements
|
|
25
|
+
|
|
26
|
+
### 3. Design Proposal
|
|
27
|
+
- High-level architecture diagram
|
|
28
|
+
- Component responsibilities
|
|
29
|
+
- Data models
|
|
30
|
+
- API contracts
|
|
31
|
+
- Integration patterns
|
|
32
|
+
|
|
33
|
+
### 4. Trade-Off Analysis
|
|
34
|
+
For each design decision, document:
|
|
35
|
+
- **Pros**: Benefits and advantages
|
|
36
|
+
- **Cons**: Drawbacks and limitations
|
|
37
|
+
- **Alternatives**: Other options considered
|
|
38
|
+
- **Decision**: Final choice and rationale
|
|
39
|
+
|
|
40
|
+
## Architectural Principles
|
|
41
|
+
|
|
42
|
+
### 1. Modularity & Separation of Concerns
|
|
43
|
+
- Single Responsibility Principle
|
|
44
|
+
- High cohesion, low coupling
|
|
45
|
+
- Clear interfaces between components
|
|
46
|
+
- Independent deployability
|
|
47
|
+
|
|
48
|
+
### 2. Scalability
|
|
49
|
+
- Horizontal scaling capability
|
|
50
|
+
- Stateless design where possible
|
|
51
|
+
- Efficient database queries
|
|
52
|
+
- Caching strategies
|
|
53
|
+
- Load balancing considerations
|
|
54
|
+
|
|
55
|
+
### 3. Maintainability
|
|
56
|
+
- Clear code organization
|
|
57
|
+
- Consistent patterns
|
|
58
|
+
- Comprehensive documentation
|
|
59
|
+
- Easy to test
|
|
60
|
+
- Simple to understand
|
|
61
|
+
|
|
62
|
+
### 4. Security
|
|
63
|
+
- Defense in depth
|
|
64
|
+
- Principle of least privilege
|
|
65
|
+
- Input validation at boundaries
|
|
66
|
+
- Secure by default
|
|
67
|
+
- Audit trail
|
|
68
|
+
|
|
69
|
+
### 5. Performance
|
|
70
|
+
- Efficient algorithms
|
|
71
|
+
- Minimal network requests
|
|
72
|
+
- Optimized database queries
|
|
73
|
+
- Appropriate caching
|
|
74
|
+
- Lazy loading
|
|
75
|
+
|
|
76
|
+
## Common Patterns
|
|
77
|
+
|
|
78
|
+
### Frontend Patterns
|
|
79
|
+
- **Component Composition**: Build complex UI from simple components
|
|
80
|
+
- **Container/Presenter**: Separate data logic from presentation
|
|
81
|
+
- **Custom Hooks**: Reusable stateful logic
|
|
82
|
+
- **Context for Global State**: Avoid prop drilling
|
|
83
|
+
- **Code Splitting**: Lazy load routes and heavy components
|
|
84
|
+
|
|
85
|
+
### Backend Patterns
|
|
86
|
+
- **Repository Pattern**: Abstract data access
|
|
87
|
+
- **Service Layer**: Business logic separation
|
|
88
|
+
- **Middleware Pattern**: Request/response processing
|
|
89
|
+
- **Event-Driven Architecture**: Async operations
|
|
90
|
+
- **CQRS**: Separate read and write operations
|
|
91
|
+
|
|
92
|
+
### Data Patterns
|
|
93
|
+
- **Normalized Database**: Reduce redundancy
|
|
94
|
+
- **Denormalized for Read Performance**: Optimize queries
|
|
95
|
+
- **Event Sourcing**: Audit trail and replayability
|
|
96
|
+
- **Caching Layers**: Redis, CDN
|
|
97
|
+
- **Eventual Consistency**: For distributed systems
|
|
98
|
+
|
|
99
|
+
## Architecture Decision Records (ADRs)
|
|
100
|
+
|
|
101
|
+
For significant architectural decisions, create ADRs:
|
|
102
|
+
|
|
103
|
+
```markdown
|
|
104
|
+
# ADR-001: [Decision Title]
|
|
105
|
+
|
|
106
|
+
## Context
|
|
107
|
+
[What situation requires a decision]
|
|
108
|
+
|
|
109
|
+
## Decision
|
|
110
|
+
[The decision made]
|
|
111
|
+
|
|
112
|
+
## Consequences
|
|
113
|
+
|
|
114
|
+
### Positive
|
|
115
|
+
- [Benefit 1]
|
|
116
|
+
- [Benefit 2]
|
|
117
|
+
|
|
118
|
+
### Negative
|
|
119
|
+
- [Drawback 1]
|
|
120
|
+
- [Drawback 2]
|
|
121
|
+
|
|
122
|
+
### Alternatives Considered
|
|
123
|
+
- **[Alternative 1]**: [Description and why rejected]
|
|
124
|
+
- **[Alternative 2]**: [Description and why rejected]
|
|
125
|
+
|
|
126
|
+
## Status
|
|
127
|
+
Accepted/Proposed/Deprecated
|
|
128
|
+
|
|
129
|
+
## Date
|
|
130
|
+
YYYY-MM-DD
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## System Design Checklist
|
|
134
|
+
|
|
135
|
+
When designing a new system or feature:
|
|
136
|
+
|
|
137
|
+
### Functional Requirements
|
|
138
|
+
- [ ] User stories documented
|
|
139
|
+
- [ ] API contracts defined
|
|
140
|
+
- [ ] Data models specified
|
|
141
|
+
- [ ] UI/UX flows mapped
|
|
142
|
+
|
|
143
|
+
### Non-Functional Requirements
|
|
144
|
+
- [ ] Performance targets defined (latency, throughput)
|
|
145
|
+
- [ ] Scalability requirements specified
|
|
146
|
+
- [ ] Security requirements identified
|
|
147
|
+
- [ ] Availability targets set (uptime %)
|
|
148
|
+
|
|
149
|
+
### Technical Design
|
|
150
|
+
- [ ] Architecture diagram created
|
|
151
|
+
- [ ] Component responsibilities defined
|
|
152
|
+
- [ ] Data flow documented
|
|
153
|
+
- [ ] Integration points identified
|
|
154
|
+
- [ ] Error handling strategy defined
|
|
155
|
+
- [ ] Testing strategy planned
|
|
156
|
+
|
|
157
|
+
### Operations
|
|
158
|
+
- [ ] Deployment strategy defined
|
|
159
|
+
- [ ] Monitoring and alerting planned
|
|
160
|
+
- [ ] Backup and recovery strategy
|
|
161
|
+
- [ ] Rollback plan documented
|
|
162
|
+
|
|
163
|
+
## Red Flags
|
|
164
|
+
|
|
165
|
+
Watch for these architectural anti-patterns:
|
|
166
|
+
- **Big Ball of Mud**: No clear structure
|
|
167
|
+
- **Golden Hammer**: Using same solution for everything
|
|
168
|
+
- **Premature Optimization**: Optimizing too early
|
|
169
|
+
- **Not Invented Here**: Rejecting existing solutions
|
|
170
|
+
- **Analysis Paralysis**: Over-planning, under-building
|
|
171
|
+
- **Magic**: Unclear, undocumented behavior
|
|
172
|
+
- **Tight Coupling**: Components too dependent
|
|
173
|
+
- **God Object**: One class/component does everything
|
|
174
|
+
|
|
175
|
+
**Remember**: Good architecture enables rapid development, easy maintenance, and confident scaling. The best architecture is simple, clear, and follows established patterns.
|