wicked-garden 12.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/archetypes.json +166 -0
- package/.claude-plugin/components.json +75 -0
- package/.claude-plugin/marketplace.json +15 -0
- package/.claude-plugin/plugin.json +174 -0
- package/.claude-plugin/specialist.json +48 -0
- package/.claude-plugin/stack-registry.json +96 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +712 -0
- package/CONTRIBUTING.md +99 -0
- package/ETHOS.md +83 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/WICKED_GARDEN_BUS_EVENTS.md +149 -0
- package/agents/agentic/architect.md +449 -0
- package/agents/agentic/performance-analyst.md +702 -0
- package/agents/agentic/safety-reviewer.md +662 -0
- package/agents/crew/implementer.md +163 -0
- package/agents/crew/researcher.md +94 -0
- package/agents/crew/reviewer.md +184 -0
- package/agents/data/data-engineer.md +227 -0
- package/agents/engineering/api-documentarian.md +440 -0
- package/agents/engineering/migration-engineer.md +301 -0
- package/agents/engineering/solution-architect.md +208 -0
- package/agents/jam/brainstorm-facilitator.md +297 -0
- package/agents/jam/council.md +322 -0
- package/agents/jam/quick-facilitator.md +85 -0
- package/agents/persona/persona-agent.md +121 -0
- package/agents/platform/compliance-officer.md +266 -0
- package/agents/platform/privacy-expert.md +496 -0
- package/agents/platform/security-engineer.md +287 -0
- package/agents/product/a11y-expert.md +323 -0
- package/agents/product/requirements-analyst.md +238 -0
- package/agents/product/ui-reviewer.md +180 -0
- package/agents/product/ux-designer.md +199 -0
- package/agents/product/value-strategist.md +269 -0
- package/agents/qe/semantic-reviewer.md +78 -0
- package/commands/agentic/audit.md +24 -0
- package/commands/agentic/design.md +24 -0
- package/commands/agentic/frameworks.md +25 -0
- package/commands/agentic/review.md +27 -0
- package/commands/archetype/build.md +12 -0
- package/commands/archetype/decide.md +12 -0
- package/commands/archetype/explore.md +12 -0
- package/commands/archetype/incident.md +12 -0
- package/commands/archetype/migrate.md +12 -0
- package/commands/archetype/modernize.md +12 -0
- package/commands/archetype/review.md +14 -0
- package/commands/archetype/ship.md +12 -0
- package/commands/archetype/specify.md +12 -0
- package/commands/archetype/triage.md +12 -0
- package/commands/compile.md +37 -0
- package/commands/data/analyze.md +18 -0
- package/commands/data/data.md +21 -0
- package/commands/data/ml.md +18 -0
- package/commands/data/ontology.md +22 -0
- package/commands/data/pipeline.md +17 -0
- package/commands/deliberate.md +181 -0
- package/commands/engineering/add-field.md +77 -0
- package/commands/engineering/apply.md +58 -0
- package/commands/engineering/arch.md +26 -0
- package/commands/engineering/debug.md +27 -0
- package/commands/engineering/docs.md +27 -0
- package/commands/engineering/new-generator.md +257 -0
- package/commands/engineering/patch-plan.md +59 -0
- package/commands/engineering/plan.md +29 -0
- package/commands/engineering/remove.md +48 -0
- package/commands/engineering/rename.md +44 -0
- package/commands/engineering/review.md +32 -0
- package/commands/help.md +128 -0
- package/commands/install.md +118 -0
- package/commands/intent.md +54 -0
- package/commands/jam/brainstorm.md +37 -0
- package/commands/jam/council.md +49 -0
- package/commands/jam/quick.md +21 -0
- package/commands/jam/revisit.md +79 -0
- package/commands/persona/as.md +136 -0
- package/commands/persona/define.md +24 -0
- package/commands/persona/list.md +118 -0
- package/commands/platform/actions.md +20 -0
- package/commands/platform/assert.md +18 -0
- package/commands/platform/audit.md +23 -0
- package/commands/platform/compliance.md +20 -0
- package/commands/platform/gh.md +22 -0
- package/commands/platform/health.md +22 -0
- package/commands/platform/incident.md +23 -0
- package/commands/platform/infra.md +24 -0
- package/commands/platform/peer-health.md +103 -0
- package/commands/platform/plugin-health.md +58 -0
- package/commands/platform/security.md +38 -0
- package/commands/platform/toolchain.md +96 -0
- package/commands/platform/traces.md +20 -0
- package/commands/product/a11y.md +19 -0
- package/commands/product/acceptance.md +19 -0
- package/commands/product/align.md +20 -0
- package/commands/product/analyze.md +23 -0
- package/commands/product/elicit.md +19 -0
- package/commands/product/listen.md +24 -0
- package/commands/product/mockup.md +20 -0
- package/commands/product/screenshot.md +19 -0
- package/commands/product/strategy.md +40 -0
- package/commands/product/synthesize.md +23 -0
- package/commands/product/ux-review.md +42 -0
- package/commands/product/ux.md +20 -0
- package/commands/product/visual-direction.md +34 -0
- package/commands/prove.md +47 -0
- package/commands/report-issue.md +243 -0
- package/commands/reset.md +144 -0
- package/commands/search/blast-radius.md +58 -0
- package/commands/search/hotspots.md +55 -0
- package/commands/search/index.md +38 -0
- package/commands/search/lineage.md +47 -0
- package/commands/search/service-map.md +79 -0
- package/commands/setup.md +363 -0
- package/commands/smaht/briefing.md +200 -0
- package/commands/smaht/events-import.md +95 -0
- package/commands/smaht/state.md +19 -0
- package/commands/where-am-i.md +58 -0
- package/docs/README.md +32 -0
- package/docs/adr/0001-code-relationship-graph-engine.md +116 -0
- package/docs/adr/0002-major-cleanup-keep-cut.md +91 -0
- package/docs/adr/0003-peers-gate-required-layers-optin.md +41 -0
- package/docs/adr/0004-code-graph-moves-to-wicked-brain.md +47 -0
- package/docs/brain-chunk-format.md +135 -0
- package/docs/compiler.md +95 -0
- package/docs/daemon-api.md +70 -0
- package/docs/domains.md +197 -0
- package/docs/getting-started.md +208 -0
- package/docs/plans/2026-06-08-wicked-loom-conduct.md +1337 -0
- package/docs/plans/2026-06-08-wicked-loom-contract.md +638 -0
- package/docs/plans/2026-06-08-wicked-loom-cutover.md +1300 -0
- package/docs/plans/2026-06-08-wicked-loom-expand-compose.md +843 -0
- package/docs/plans/2026-06-08-wicked-loom-flow-cutover.md +403 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1a-graph-core.md +838 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1b-injected-edges.md +44 -0
- package/docs/required-peers.md +60 -0
- package/docs/specs/2026-06-08-wicked-loom-extraction.md +225 -0
- package/docs/specs/2026-06-10-codegraph-to-brain-migration.md +168 -0
- package/docs/v11/archetypes.md +231 -0
- package/hooks/hooks.json +275 -0
- package/hooks/scripts/bootstrap.py +1797 -0
- package/hooks/scripts/invoke.py +62 -0
- package/hooks/scripts/notification.py +166 -0
- package/hooks/scripts/permission_request.py +223 -0
- package/hooks/scripts/post_tool.py +1374 -0
- package/hooks/scripts/pre_compact.py +272 -0
- package/hooks/scripts/pre_tool.py +1278 -0
- package/hooks/scripts/prompt_submit.py +1109 -0
- package/hooks/scripts/session_end.py +95 -0
- package/hooks/scripts/stop.py +624 -0
- package/hooks/scripts/subagent_lifecycle.py +464 -0
- package/hooks/scripts/subscribers/on_gate_decided.py +84 -0
- package/hooks/scripts/task_completed.py +322 -0
- package/hooks/scripts/worktree_guard.py +148 -0
- package/hooks/subscriptions/on_gate_decided.json +9 -0
- package/install.mjs +128 -0
- package/package.json +41 -0
- package/pyproject.toml +59 -0
- package/schemas/README.md +32 -0
- package/schemas/assert_contracts.json +37 -0
- package/schemas/health_probe.json +46 -0
- package/schemas/plugin_status.json +37 -0
- package/scripts/_adapters/__init__.py +166 -0
- package/scripts/_adapters/jira_adapter.py +18 -0
- package/scripts/_adapters/linear_adapter.py +18 -0
- package/scripts/_adapters/miro_adapter.py +18 -0
- package/scripts/_adapters/notion_adapter.py +18 -0
- package/scripts/_agents.py +357 -0
- package/scripts/_brain_ingest/__init__.py +2 -0
- package/scripts/_brain_ingest/session_fact_extractor.py +341 -0
- package/scripts/_brain_port.py +163 -0
- package/scripts/_bus.py +1081 -0
- package/scripts/_bus_catalog_gen.py +93 -0
- package/scripts/_bus_consumers.json +46 -0
- package/scripts/_bus_emit.py +43 -0
- package/scripts/_capability_registry.py +334 -0
- package/scripts/_capability_resolver.py +322 -0
- package/scripts/_domain_store.py +559 -0
- package/scripts/_event_log_reader.py +154 -0
- package/scripts/_event_schema.py +305 -0
- package/scripts/_event_store.py +397 -0
- package/scripts/_heavy_cadence.py +324 -0
- package/scripts/_integration_resolver.py +321 -0
- package/scripts/_logger.py +151 -0
- package/scripts/_loom.py +482 -0
- package/scripts/_paths.py +133 -0
- package/scripts/_python.sh +22 -0
- package/scripts/_run.py +137 -0
- package/scripts/_session.py +502 -0
- package/scripts/_validate_registry.py +1042 -0
- package/scripts/_wicked_testing_probe.py +277 -0
- package/scripts/agentic/analyze_agents.py +391 -0
- package/scripts/agentic/detect_framework.py +420 -0
- package/scripts/agentic/issue_taxonomy.py +357 -0
- package/scripts/agentic/pattern_scorer.py +434 -0
- package/scripts/classify/persist.py +169 -0
- package/scripts/compiler/compile.py +552 -0
- package/scripts/compiler/phase0/VERDICT.md +60 -0
- package/scripts/compiler/phase0/detect.py +292 -0
- package/scripts/compiler/phase0/emit.py +228 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.bindings.json +30 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/command_iq.bindings.json +45 -0
- package/scripts/compiler/phase0/evidence/command_iq.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/memos.bindings.json +28 -0
- package/scripts/compiler/phase0/evidence/memos.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/verdict.json +104 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.bindings.json +29 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/wire-vault-transcript.txt +60 -0
- package/scripts/compiler/phase0/run_probe.py +234 -0
- package/scripts/compiler/phase0/wire_vault.py +310 -0
- package/scripts/crew/__init__.py +0 -0
- package/scripts/crew/_task_audit_writer.py +243 -0
- package/scripts/crew/_task_reader.py +389 -0
- package/scripts/crew/archetypes_v11.py +348 -0
- package/scripts/crew/detectors/__init__.py +12 -0
- package/scripts/crew/flow_compiler.py +121 -0
- package/scripts/crew/phase_manager.py +703 -0
- package/scripts/crew/scope_delta.py +264 -0
- package/scripts/crew/specialist_resolver.py +218 -0
- package/scripts/crew/stack_registry.py +189 -0
- package/scripts/data/data_profiler.py +271 -0
- package/scripts/data/ontology_recommender.py +231 -0
- package/scripts/data/schema_validator.py +267 -0
- package/scripts/delivery/drift.py +739 -0
- package/scripts/delivery/telemetry.py +614 -0
- package/scripts/engineering/patch/codegraph_db.py +125 -0
- package/scripts/engineering/patch/generators/__init__.py +56 -0
- package/scripts/engineering/patch/generators/base.py +373 -0
- package/scripts/engineering/patch/generators/csharp_generator.py +494 -0
- package/scripts/engineering/patch/generators/go_generator.py +430 -0
- package/scripts/engineering/patch/generators/java_generator.py +928 -0
- package/scripts/engineering/patch/generators/jsp_generator.py +454 -0
- package/scripts/engineering/patch/generators/kotlin_generator.py +561 -0
- package/scripts/engineering/patch/generators/perl_generator.py +510 -0
- package/scripts/engineering/patch/generators/php_generator.py +644 -0
- package/scripts/engineering/patch/generators/propagation_engine.py +929 -0
- package/scripts/engineering/patch/generators/python_generator.py +487 -0
- package/scripts/engineering/patch/generators/ruby_generator.py +463 -0
- package/scripts/engineering/patch/generators/rust_generator.py +400 -0
- package/scripts/engineering/patch/generators/sql_generator.py +594 -0
- package/scripts/engineering/patch/generators/typescript_generator.py +439 -0
- package/scripts/engineering/patch/patch.py +800 -0
- package/scripts/engineering/patch/safety.py +429 -0
- package/scripts/jam/__init__.py +0 -0
- package/scripts/jam/_bus_consumers.py +271 -0
- package/scripts/jam/agentic_cli_registry.py +703 -0
- package/scripts/jam/consensus.py +737 -0
- package/scripts/jam/detect_clis.py +409 -0
- package/scripts/jam/jam.py +283 -0
- package/scripts/jam/save_transcript.py +171 -0
- package/scripts/loom/__init__.py +22 -0
- package/scripts/loom/cli.py +170 -0
- package/scripts/loom/compose.py +180 -0
- package/scripts/loom/gate.py +120 -0
- package/scripts/loom/manifest.py +140 -0
- package/scripts/loom/resolve.py +59 -0
- package/scripts/persona/__init__.py +0 -0
- package/scripts/persona/registry.py +688 -0
- package/scripts/platform/guard_pipeline.py +1214 -0
- package/scripts/platform/guard_profiles.py +216 -0
- package/scripts/platform/observability/assert_contracts.py +434 -0
- package/scripts/platform/observability/health_probe.py +915 -0
- package/scripts/platform/observability/ops_log_viewer.py +209 -0
- package/scripts/platform/prereq_doctor.py +567 -0
- package/scripts/qe/conditions_manifest.py +260 -0
- package/scripts/qe/content_sanitizer.py +160 -0
- package/scripts/qe/coverage_tracker.py +535 -0
- package/scripts/qe/discover_scenarios.py +243 -0
- package/scripts/qe/evidence_tracker.py +232 -0
- package/scripts/qe/prove.py +196 -0
- package/scripts/qe/registry_lookup.py +80 -0
- package/scripts/qe/registry_store.py +176 -0
- package/scripts/qe/semantic_review.py +1005 -0
- package/scripts/qe/vault_gate.py +382 -0
- package/scripts/qe/verdict_audit.py +175 -0
- package/scripts/qe/verdict_schema.py +335 -0
- package/scripts/reset.py +220 -0
- package/scripts/resolve_path.py +22 -0
- package/scripts/sentinel/invariants.py +402 -0
- package/scripts/sentinel/pre_push.py +73 -0
- package/scripts/setup/__init__.py +1 -0
- package/scripts/setup/detect_state.py +114 -0
- package/scripts/setup/migrate_legacy.py +67 -0
- package/scripts/setup/migrate_v6_projects.py +232 -0
- package/scripts/setup/onboarding.py +114 -0
- package/scripts/smaht/_bus_consumers.py +98 -0
- package/scripts/smaht/adapters/__init__.py +83 -0
- package/scripts/smaht/adapters/brain_adapter.py +254 -0
- package/scripts/smaht/adapters/context7_adapter.py +438 -0
- package/scripts/smaht/adapters/delegation_adapter.py +104 -0
- package/scripts/smaht/adapters/domain_adapter.py +206 -0
- package/scripts/smaht/adapters/events_adapter.py +231 -0
- package/scripts/smaht/adapters/tools_adapter.py +49 -0
- package/scripts/smaht/cheatsheet_store.py +236 -0
- package/scripts/smaht/context_package.py +386 -0
- package/scripts/smaht/knowledge_graph.py +395 -0
- package/scripts/smaht/propose_skills.py +856 -0
- package/scripts/smaht/test_cheatsheet_store.py +428 -0
- package/scripts/statusline.py +151 -0
- package/scripts/where_am_i.py +236 -0
- package/skills/agentic/agentic-patterns/SKILL.md +91 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-design.md +283 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-operational.md +216 -0
- package/skills/agentic/agentic-patterns/refs/pattern-catalog.md +329 -0
- package/skills/agentic/context-engineering/SKILL.md +142 -0
- package/skills/agentic/context-engineering/refs/caching-and-optimization.md +251 -0
- package/skills/agentic/context-engineering/refs/compression-techniques.md +171 -0
- package/skills/agentic/context-engineering/refs/cost-calculation-budget.md +250 -0
- package/skills/agentic/context-engineering/refs/cost-optimization-reporting.md +300 -0
- package/skills/agentic/context-engineering/refs/selective-loading.md +179 -0
- package/skills/agentic/frameworks/SKILL.md +191 -0
- package/skills/agentic/frameworks/refs/framework-profiles-1.md +209 -0
- package/skills/agentic/frameworks/refs/framework-profiles-2.md +214 -0
- package/skills/agentic/frameworks/refs/migration-patterns-paths.md +267 -0
- package/skills/agentic/frameworks/refs/migration-patterns-testing.md +208 -0
- package/skills/agentic/refs/audit.md +134 -0
- package/skills/agentic/refs/design.md +137 -0
- package/skills/agentic/refs/frameworks.md +102 -0
- package/skills/agentic/refs/review.md +160 -0
- package/skills/agentic/review-methodology/SKILL.md +186 -0
- package/skills/agentic/review-methodology/refs/deliverable-templates.md +246 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +277 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-reliability-safety.md +253 -0
- package/skills/agentic/trust-and-safety/SKILL.md +177 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-actions.md +246 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-input-output.md +238 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-resources.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-advanced.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-core.md +215 -0
- package/skills/archetype/SKILL.md +104 -0
- package/skills/archetype/refs/build.md +142 -0
- package/skills/archetype/refs/decide.md +117 -0
- package/skills/archetype/refs/explore.md +66 -0
- package/skills/archetype/refs/incident.md +149 -0
- package/skills/archetype/refs/migrate.md +170 -0
- package/skills/archetype/refs/modernize.md +187 -0
- package/skills/archetype/refs/review.md +145 -0
- package/skills/archetype/refs/ship.md +117 -0
- package/skills/archetype/refs/specify.md +108 -0
- package/skills/archetype/refs/triage.md +62 -0
- package/skills/classify/SKILL.md +157 -0
- package/skills/data/analysis/SKILL.md +125 -0
- package/skills/data/analysis/refs/templates.md +170 -0
- package/skills/data/data/SKILL.md +118 -0
- package/skills/data/data/refs/examples.md +235 -0
- package/skills/data/ml/SKILL.md +125 -0
- package/skills/data/ml/refs/templates.md +172 -0
- package/skills/data/pipeline/SKILL.md +136 -0
- package/skills/data/pipeline/refs/templates.md +175 -0
- package/skills/data/refs/analyze.md +123 -0
- package/skills/data/refs/data.md +95 -0
- package/skills/data/refs/ml.md +118 -0
- package/skills/data/refs/pipeline.md +92 -0
- package/skills/deliberate/SKILL.md +125 -0
- package/skills/deliberate/refs/architecture-lens.md +37 -0
- package/skills/deliberate/refs/assumptions-lens.md +43 -0
- package/skills/deliberate/refs/code-lens.md +38 -0
- package/skills/deliberate/refs/content-lens.md +37 -0
- package/skills/deliberate/refs/data-lens.md +43 -0
- package/skills/deliberate/refs/design-lens.md +37 -0
- package/skills/deliberate/refs/opportunity-patterns.md +107 -0
- package/skills/deliberate/refs/ops-lens.md +43 -0
- package/skills/deliberate/refs/product-lens.md +46 -0
- package/skills/deliberate/refs/rethink-framework.md +77 -0
- package/skills/deliberate/refs/security-lens.md +47 -0
- package/skills/deliberate/refs/testing-lens.md +45 -0
- package/skills/deliberate/refs/timing-lens.md +42 -0
- package/skills/engineering/architecture/SKILL.md +177 -0
- package/skills/engineering/architecture/refs/adr-template.md +268 -0
- package/skills/engineering/architecture/refs/architecture-template-deployment.md +176 -0
- package/skills/engineering/architecture/refs/architecture-template-design.md +300 -0
- package/skills/engineering/architecture/refs/examples-ecommerce-analytics.md +299 -0
- package/skills/engineering/architecture/refs/examples-saas-trading.md +291 -0
- package/skills/engineering/architecture/refs/patterns-advanced.md +238 -0
- package/skills/engineering/architecture/refs/patterns-structural.md +303 -0
- package/skills/engineering/backend/SKILL.md +102 -0
- package/skills/engineering/backend/refs/checklists.md +146 -0
- package/skills/engineering/backend/refs/patterns.md +181 -0
- package/skills/engineering/debugging/SKILL.md +99 -0
- package/skills/engineering/debugging/refs/patterns.md +248 -0
- package/skills/engineering/debugging/refs/process.md +203 -0
- package/skills/engineering/docs/SKILL.md +97 -0
- package/skills/engineering/engineering/SKILL.md +88 -0
- package/skills/engineering/engineering/refs/checklists.md +91 -0
- package/skills/engineering/engineering/refs/templates.md +71 -0
- package/skills/engineering/frontend/SKILL.md +92 -0
- package/skills/engineering/frontend/refs/checklists.md +96 -0
- package/skills/engineering/frontend/refs/patterns.md +167 -0
- package/skills/engineering/integration/SKILL.md +183 -0
- package/skills/engineering/integration/refs/error-handling-best-practices.md +139 -0
- package/skills/engineering/integration/refs/error-handling-error-classes-typescript.md +212 -0
- package/skills/engineering/integration/refs/error-handling-error-response-format.md +301 -0
- package/skills/engineering/integration/refs/error-handling-retry-strategies.md +190 -0
- package/skills/engineering/integration/refs/event-schemas-best-practices.md +225 -0
- package/skills/engineering/integration/refs/event-schemas-event-naming-conventions.md +303 -0
- package/skills/engineering/integration/refs/event-schemas-event-structure.md +288 -0
- package/skills/engineering/integration/refs/graphql-best-practices.md +138 -0
- package/skills/engineering/integration/refs/graphql-error-handling.md +198 -0
- package/skills/engineering/integration/refs/graphql-graphql-basics.md +197 -0
- package/skills/engineering/integration/refs/graphql-query-examples.md +226 -0
- package/skills/engineering/integration/refs/graphql-schema-design-patterns.md +280 -0
- package/skills/engineering/integration/refs/grpc-grpc-overview.md +246 -0
- package/skills/engineering/integration/refs/grpc-implementation-examples.md +269 -0
- package/skills/engineering/integration/refs/grpc-metadata-headers.md +304 -0
- package/skills/engineering/integration/refs/grpc-testing.md +49 -0
- package/skills/engineering/integration/refs/openapi-template.yaml +682 -0
- package/skills/engineering/integration/refs/resilience-best-practices.md +109 -0
- package/skills/engineering/integration/refs/resilience-circuit-breaker-pattern.md +302 -0
- package/skills/engineering/integration/refs/resilience-rate-limiting.md +245 -0
- package/skills/engineering/integration/refs/resilience-timeout-pattern.md +212 -0
- package/skills/engineering/integration/refs/rest-api-fundamentals.md +299 -0
- package/skills/engineering/integration/refs/rest-api-responses-security.md +302 -0
- package/skills/engineering/integration/refs/versioning-breaking-changes.md +237 -0
- package/skills/engineering/integration/refs/versioning-migration-strategies.md +257 -0
- package/skills/engineering/integration/refs/versioning-versioning-strategies.md +296 -0
- package/skills/engineering/large-scale-migration/SKILL.md +65 -0
- package/skills/engineering/patch/SKILL.md +184 -0
- package/skills/engineering/refs/arch.md +126 -0
- package/skills/engineering/refs/debug.md +142 -0
- package/skills/engineering/refs/docs.md +190 -0
- package/skills/engineering/refs/plan.md +109 -0
- package/skills/engineering/refs/review.md +138 -0
- package/skills/engineering/system-design/SKILL.md +154 -0
- package/skills/engineering/system-design/refs/anti-patterns-big-ball-of-mud.md +254 -0
- package/skills/engineering/system-design/refs/anti-patterns-circular-dependencies.md +241 -0
- package/skills/engineering/system-design/refs/anti-patterns-feature-envy.md +168 -0
- package/skills/engineering/system-design/refs/anti-patterns-god-object.md +247 -0
- package/skills/engineering/system-design/refs/component-template-lifecycle.md +210 -0
- package/skills/engineering/system-design/refs/component-template-maintenance.md +219 -0
- package/skills/engineering/system-design/refs/component-template-structure.md +276 -0
- package/skills/engineering/system-design/refs/dependencies-best-practices.md +260 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-principles.md +295 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-tracking.md +261 -0
- package/skills/engineering/system-design/refs/interface-template-lifecycle.md +211 -0
- package/skills/engineering/system-design/refs/interface-template-maintenance.md +212 -0
- package/skills/engineering/system-design/refs/interface-template-structure.md +269 -0
- package/skills/engineering/system-design/refs/patterns-dependency-injection.md +151 -0
- package/skills/engineering/system-design/refs/patterns-facade-pattern.md +257 -0
- package/skills/engineering/system-design/refs/patterns-layered-pattern.md +204 -0
- package/skills/engineering/system-design/refs/patterns-plugin-architecture.md +229 -0
- package/skills/engineering/unit-test-quality/SKILL.md +194 -0
- package/skills/ground/SKILL.md +130 -0
- package/skills/integration-discovery/SKILL.md +168 -0
- package/skills/integration-discovery/refs/capabilities.md +282 -0
- package/skills/integration-discovery/refs/cli-detection.md +295 -0
- package/skills/integration-discovery/refs/discovery-sources.md +233 -0
- package/skills/integration-discovery/refs/task-patterns.md +206 -0
- package/skills/jam/SKILL.md +45 -0
- package/skills/jam/refs/facilitation-patterns.md +125 -0
- package/skills/jam/refs/quick.md +64 -0
- package/skills/jam/refs/synthesis-patterns.md +114 -0
- package/skills/multi-model/SKILL.md +168 -0
- package/skills/multi-model/refs/aichat.md +119 -0
- package/skills/multi-model/refs/aider.md +100 -0
- package/skills/multi-model/refs/auditability.md +238 -0
- package/skills/multi-model/refs/codex.md +169 -0
- package/skills/multi-model/refs/context.md +306 -0
- package/skills/multi-model/refs/copilot.md +161 -0
- package/skills/multi-model/refs/examples.md +224 -0
- package/skills/multi-model/refs/gemini.md +185 -0
- package/skills/multi-model/refs/goose.md +112 -0
- package/skills/multi-model/refs/llm.md +124 -0
- package/skills/multi-model/refs/opencode.md +196 -0
- package/skills/multi-model/refs/orchestration.md +188 -0
- package/skills/multi-model/refs/pi.md +208 -0
- package/skills/persona/SKILL.md +144 -0
- package/skills/persona/refs/define.md +133 -0
- package/skills/platform/actions/refs/actions.md +114 -0
- package/skills/platform/audit/SKILL.md +174 -0
- package/skills/platform/audit/refs/audit.md +145 -0
- package/skills/platform/audit/refs/checklists-evidence-operations.md +144 -0
- package/skills/platform/audit/refs/checklists-gdpr-pci-evidence.md +213 -0
- package/skills/platform/audit/refs/checklists-soc2-hipaa.md +120 -0
- package/skills/platform/audit/refs/frameworks-gdpr-pci.md +225 -0
- package/skills/platform/audit/refs/frameworks-soc2-hipaa.md +228 -0
- package/skills/platform/compliance/SKILL.md +169 -0
- package/skills/platform/compliance/refs/checklists.md +303 -0
- package/skills/platform/compliance/refs/compliance.md +117 -0
- package/skills/platform/compliance/refs/frameworks.md +282 -0
- package/skills/platform/errors/SKILL.md +183 -0
- package/skills/platform/errors/refs/patterns.md +271 -0
- package/skills/platform/errors/refs/severity.md +264 -0
- package/skills/platform/gate-benchmark-rebaseline/SKILL.md +108 -0
- package/skills/platform/gh/refs/gh.md +105 -0
- package/skills/platform/gh-cli/SKILL.md +120 -0
- package/skills/platform/gh-cli/refs/automation.md +63 -0
- package/skills/platform/gh-cli/refs/gh-ops.md +103 -0
- package/skills/platform/gh-cli/refs/patterns.md +132 -0
- package/skills/platform/gh-cli/scripts/gh_ops.py +454 -0
- package/skills/platform/github-actions/SKILL.md +159 -0
- package/skills/platform/github-actions/refs/security.md +150 -0
- package/skills/platform/github-actions/refs/templates.md +230 -0
- package/skills/platform/github-actions/refs/troubleshooting.md +174 -0
- package/skills/platform/github-actions/scripts/workflow_gen.py +215 -0
- package/skills/platform/gitlab-ci/SKILL.md +140 -0
- package/skills/platform/gitlab-ci/refs/templates.md +223 -0
- package/skills/platform/gitlab-ci/refs/troubleshooting.md +213 -0
- package/skills/platform/glab-cli/SKILL.md +133 -0
- package/skills/platform/glab-cli/refs/ci-debugging.md +95 -0
- package/skills/platform/glab-cli/refs/glab-ops.md +78 -0
- package/skills/platform/glab-cli/refs/patterns.md +131 -0
- package/skills/platform/glab-cli/scripts/glab_ops.py +313 -0
- package/skills/platform/health/SKILL.md +177 -0
- package/skills/platform/health/refs/health.md +72 -0
- package/skills/platform/health/refs/sources.md +302 -0
- package/skills/platform/incident/refs/incident.md +136 -0
- package/skills/platform/infra/refs/infra.md +104 -0
- package/skills/platform/observability/SKILL.md +128 -0
- package/skills/platform/observability/refs/toolchain-discovery.md +243 -0
- package/skills/platform/prereq-doctor/SKILL.md +57 -0
- package/skills/platform/prereq-doctor/refs/tool-registry.md +58 -0
- package/skills/platform/traces/refs/traces.md +101 -0
- package/skills/product/acceptance-criteria/SKILL.md +193 -0
- package/skills/product/acceptance-criteria/refs/ac-anti-patterns.md +291 -0
- package/skills/product/acceptance-criteria/refs/ac-examples.md +277 -0
- package/skills/product/accessibility/SKILL.md +197 -0
- package/skills/product/accessibility/refs/aria-patterns-basics.md +250 -0
- package/skills/product/accessibility/refs/aria-patterns-dynamic.md +187 -0
- package/skills/product/accessibility/refs/aria-patterns-interactive.md +246 -0
- package/skills/product/accessibility/refs/audit-report-findings.md +248 -0
- package/skills/product/accessibility/refs/audit-report-results.md +276 -0
- package/skills/product/accessibility/refs/common-violations-html-css.md +270 -0
- package/skills/product/accessibility/refs/common-violations-interactive.md +303 -0
- package/skills/product/accessibility/refs/keyboard-testing-basics.md +222 -0
- package/skills/product/accessibility/refs/keyboard-testing-patterns.md +173 -0
- package/skills/product/accessibility/refs/screen-reader-testing-advanced.md +294 -0
- package/skills/product/accessibility/refs/screen-reader-testing-commands.md +255 -0
- package/skills/product/accessibility/refs/wcag-checklist.md +262 -0
- package/skills/product/analyze/SKILL.md +164 -0
- package/skills/product/analyze/refs/algorithms.md +238 -0
- package/skills/product/analyze/refs/sentiment-patterns.md +180 -0
- package/skills/product/imagery/SKILL.md +97 -0
- package/skills/product/imagery/alter/SKILL.md +105 -0
- package/skills/product/imagery/alter/refs/editing-reference.md +146 -0
- package/skills/product/imagery/create/SKILL.md +109 -0
- package/skills/product/imagery/create/refs/prompt-engineering.md +112 -0
- package/skills/product/imagery/create/refs/provider-reference.md +219 -0
- package/skills/product/imagery/review/SKILL.md +101 -0
- package/skills/product/imagery/review/refs/analysis-lenses.md +136 -0
- package/skills/product/imagery/review/refs/quality-gates.md +153 -0
- package/skills/product/imagery/scripts/analyze.sh +23 -0
- package/skills/product/imagery/scripts/edit.sh +14 -0
- package/skills/product/imagery/scripts/generate.sh +13 -0
- package/skills/product/imagery/scripts/provider.py +787 -0
- package/skills/product/listen/SKILL.md +175 -0
- package/skills/product/listen/refs/channels.md +220 -0
- package/skills/product/mockup/SKILL.md +106 -0
- package/skills/product/mockup/refs/templates.md +95 -0
- package/skills/product/refs/a11y.md +109 -0
- package/skills/product/refs/acceptance.md +79 -0
- package/skills/product/refs/align.md +67 -0
- package/skills/product/refs/analyze.md +77 -0
- package/skills/product/refs/elicit.md +67 -0
- package/skills/product/refs/listen.md +58 -0
- package/skills/product/refs/mockup.md +77 -0
- package/skills/product/refs/screenshot.md +59 -0
- package/skills/product/refs/strategy.md +77 -0
- package/skills/product/refs/synthesize.md +54 -0
- package/skills/product/refs/ux-review.md +68 -0
- package/skills/product/refs/ux.md +101 -0
- package/skills/product/requirements-analysis/SKILL.md +136 -0
- package/skills/product/requirements-analysis/refs/requirements-example-auth.md +264 -0
- package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +88 -0
- package/skills/product/requirements-analysis/refs/requirements-output-format-template.md +247 -0
- package/skills/product/requirements-analysis/refs/user-story-guide.md +296 -0
- package/skills/product/requirements-graph/SKILL.md +155 -0
- package/skills/product/requirements-graph/refs/examples.md +223 -0
- package/skills/product/requirements-graph/refs/schema.md +162 -0
- package/skills/product/requirements-migrate/SKILL.md +90 -0
- package/skills/product/requirements-navigate/SKILL.md +141 -0
- package/skills/product/requirements-navigate/refs/meta-templates.md +141 -0
- package/skills/product/screenshot/SKILL.md +147 -0
- package/skills/product/strategy/SKILL.md +198 -0
- package/skills/product/strategy/refs/frameworks.md +295 -0
- package/skills/product/strategy/refs/templates-competitive-market.md +299 -0
- package/skills/product/strategy/refs/templates-roi-value.md +207 -0
- package/skills/product/synthesize/SKILL.md +116 -0
- package/skills/product/synthesize/refs/journey-mapping.md +212 -0
- package/skills/product/synthesize/refs/prioritization.md +193 -0
- package/skills/product/ux-review/SKILL.md +164 -0
- package/skills/product/visual-direction/SKILL.md +137 -0
- package/skills/product/visual-review/SKILL.md +131 -0
- package/skills/runtime-exec/SKILL.md +138 -0
- package/skills/search/codebase-narrator/SKILL.md +131 -0
- package/skills/search/codebase-narrator/refs/output-template.md +100 -0
- package/skills/smaht/SKILL.md +72 -0
- package/skills/smaht/discovery/SKILL.md +65 -0
- package/skills/smaht/intent/SKILL.md +89 -0
- package/skills/smaht/propose-skills/SKILL.md +142 -0
- package/skills/smaht/refs/state.md +76 -0
- package/skills/swarm/SKILL.md +132 -0
- package/skills/swarm/refs/fan-out.md +104 -0
- package/skills/swarm/refs/independent-verification.md +86 -0
- package/skills/swarm/refs/receipts-and-evidence.md +69 -0
- package/skills/swarm/refs/recon-synthesis.md +87 -0
- package/skills/swarm/refs/ship-discipline.md +90 -0
- package/skills/wickedizer/SKILL.md +147 -0
- package/skills/wickedizer/refs/artifact-types.md +238 -0
- package/skills/wickedizer/refs/complexity.md +278 -0
- package/skills/wickedizer/refs/de-ai-pass.md +140 -0
- package/skills/wickedizer/refs/failure-modes.md +249 -0
- package/skills/wickedizer/refs/patterns.md +282 -0
- package/skills/wickedizer/refs/review.md +221 -0
- package/skills/wickedizer/refs/structure.md +282 -0
- package/skills/wickedizer/refs/voice-profile.md +125 -0
- package/skills/workflow/SKILL.md +132 -0
- package/skills/workflow/refs/archetype-adjustments.md +205 -0
- package/skills/workflow/refs/evidence.md +58 -0
- package/skills/workflow/refs/integration.md +130 -0
- package/skills/workflow/refs/risk-dimension-signals.md +260 -0
- package/skills/workflow/refs/scoring-rubric.md +49 -0
- package/skills/workflow/refs/signal-keywords.md +176 -0
- package/skills/workflow/refs/specialist-routing-rules.md +159 -0
- package/skills/worktrees/SKILL.md +87 -0
- package/skills/worktrees/refs/recipes.md +96 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# plan — implementation planning rubric
|
|
2
|
+
|
|
3
|
+
Checklist and output format for generating detailed implementation plans with file changes,
|
|
4
|
+
risk assessment, and test recommendations before writing code.
|
|
5
|
+
|
|
6
|
+
## Pre-plan exploration checklist
|
|
7
|
+
|
|
8
|
+
Before drafting a plan, explore the codebase to understand:
|
|
9
|
+
|
|
10
|
+
- [ ] Files that implement the functionality being changed
|
|
11
|
+
- [ ] Direct callers and consumers of those files (blast radius)
|
|
12
|
+
- [ ] Existing patterns and conventions (naming, error handling, module structure)
|
|
13
|
+
- [ ] Test patterns and coverage for affected areas
|
|
14
|
+
- [ ] Any feature flags or config that gates the change
|
|
15
|
+
|
|
16
|
+
Use `wicked-garden:search:blast-radius {symbol}` to find all call sites. Fall back to
|
|
17
|
+
`wicked-brain:search` or Grep when the index is unavailable.
|
|
18
|
+
|
|
19
|
+
## Risk assessment checklist
|
|
20
|
+
|
|
21
|
+
For each change, evaluate:
|
|
22
|
+
|
|
23
|
+
| Risk Category | Questions to ask |
|
|
24
|
+
|---------------|-----------------|
|
|
25
|
+
| Breaking changes | Does this change any public interface, event schema, or API contract? |
|
|
26
|
+
| Performance | Does this add I/O, a loop, or a DB query to a hot path? |
|
|
27
|
+
| Security | Does this touch auth, session, credentials, or user-supplied input? |
|
|
28
|
+
| Data integrity | Does this touch a migration, schema, or data transform? |
|
|
29
|
+
| Test gaps | Are there untested edge cases that the change could break? |
|
|
30
|
+
| Deployment | Does this require a coordinated deploy (e.g. schema before code)? |
|
|
31
|
+
|
|
32
|
+
## Implementation plan output format
|
|
33
|
+
|
|
34
|
+
```markdown
|
|
35
|
+
## Implementation Plan: {title}
|
|
36
|
+
|
|
37
|
+
### Summary
|
|
38
|
+
{1-2 sentence overview of what changes and why}
|
|
39
|
+
|
|
40
|
+
### Scope
|
|
41
|
+
- **In scope**: {what will change}
|
|
42
|
+
- **Out of scope**: {explicitly NOT changing}
|
|
43
|
+
|
|
44
|
+
### Changes Required
|
|
45
|
+
|
|
46
|
+
#### 1. {path/to/file.ext}
|
|
47
|
+
**Purpose**: {why this file changes}
|
|
48
|
+
**Changes**:
|
|
49
|
+
- {Specific change — e.g., "Add null check before accessing `.id`"}
|
|
50
|
+
- {Add / Modify / Remove — be concrete}
|
|
51
|
+
|
|
52
|
+
#### 2. {path/to/another-file.ext}
|
|
53
|
+
**Purpose**: {why}
|
|
54
|
+
**Changes**:
|
|
55
|
+
- {change}
|
|
56
|
+
|
|
57
|
+
### Risk Assessment
|
|
58
|
+
|
|
59
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
60
|
+
|------|------------|--------|------------|
|
|
61
|
+
| {risk} | Low/Med/High | Low/Med/High | {action} |
|
|
62
|
+
|
|
63
|
+
### Test Plan
|
|
64
|
+
|
|
65
|
+
- [ ] Unit: {what unit behavior to cover}
|
|
66
|
+
- [ ] Integration: {what flow to exercise end-to-end}
|
|
67
|
+
- [ ] Manual verification: {scenario to check in the running app}
|
|
68
|
+
- [ ] Regression: {existing tests to re-run}
|
|
69
|
+
|
|
70
|
+
### Rollout Considerations
|
|
71
|
+
|
|
72
|
+
{Any deployment notes: feature flags, migration order, canary, backward compatibility window}
|
|
73
|
+
|
|
74
|
+
### Open Questions
|
|
75
|
+
|
|
76
|
+
- {Question that needs resolution before implementation starts}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Planning heuristics
|
|
80
|
+
|
|
81
|
+
**Start with the test** — if you can't describe what test would fail without this change,
|
|
82
|
+
the requirement isn't specific enough yet.
|
|
83
|
+
|
|
84
|
+
**One file at a time** — each file in "Changes Required" should have its own purpose;
|
|
85
|
+
if two files have the same purpose, merge them in the plan.
|
|
86
|
+
|
|
87
|
+
**Flag unauthorized scope** — if exploration reveals the change will require touching
|
|
88
|
+
files well outside the stated scope, surface this before proceeding.
|
|
89
|
+
|
|
90
|
+
**Security checklist for any change touching auth, input, or data**:
|
|
91
|
+
- [ ] No credentials logged
|
|
92
|
+
- [ ] Input validated before use
|
|
93
|
+
- [ ] Authorization checked (not just authentication)
|
|
94
|
+
- [ ] SQL/injection-safe if DB queries change
|
|
95
|
+
- [ ] No plaintext secrets in new config
|
|
96
|
+
|
|
97
|
+
**Performance checklist for any change on a hot path**:
|
|
98
|
+
- [ ] No new synchronous I/O added to request path
|
|
99
|
+
- [ ] No N+1 query pattern introduced
|
|
100
|
+
- [ ] Timeout specified on any new external call
|
|
101
|
+
- [ ] No unbounded collection loaded into memory
|
|
102
|
+
|
|
103
|
+
## After presenting the plan
|
|
104
|
+
|
|
105
|
+
Ask:
|
|
106
|
+
> Ready to proceed with implementation, or would you like to adjust the approach?
|
|
107
|
+
|
|
108
|
+
If approved, execute using `engineering:apply` or the build archetype
|
|
109
|
+
(`/wicked-garden:archetype:build`).
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# review — senior engineering code review rubric
|
|
2
|
+
|
|
3
|
+
Bulletproof Standards (R1–R6 + T1–T6), severity guidelines, persona routing, and output format.
|
|
4
|
+
Use `engineering:review` for code-level review; use `engineering:arch` for component/system architecture review.
|
|
5
|
+
|
|
6
|
+
## Bulletproof Coding Standards — R1–R6
|
|
7
|
+
|
|
8
|
+
These are enforcement directives, not suggestions. Flag every violation. No exceptions.
|
|
9
|
+
|
|
10
|
+
- **R1: No Dead Code** — Flag unused imports, functions, variables, types, and unreachable branches.
|
|
11
|
+
Dead code decays, misleads, and costs. Delete it, or add a comment explaining why it stays.
|
|
12
|
+
|
|
13
|
+
- **R2: No Bare Panics** — Every function that can fail MUST return an error type or throw within
|
|
14
|
+
a handled context. No `panic()`, no unhandled exceptions, no `unwrap()` in production paths,
|
|
15
|
+
no `process.exit(1)` in library code. If it can fail, the signature must show it.
|
|
16
|
+
|
|
17
|
+
- **R3: No Magic Values** — All constants must be named. No bare numbers, strings, or config values
|
|
18
|
+
in logic. Examples to flag: `if retries > 3`, `timeout: 5000`, `color: '#1a1a2e'`, `z-index: 9999`.
|
|
19
|
+
Demand a named constant with a comment explaining the choice.
|
|
20
|
+
|
|
21
|
+
- **R4: No Swallowed Errors** — Every error catch must handle or propagate. Empty catch blocks,
|
|
22
|
+
`_ = err`, `pass`, and `console.log(err)` without user feedback are violations. "Log and continue"
|
|
23
|
+
counts only if the log includes the error detail and the function's contract allows partial failure.
|
|
24
|
+
|
|
25
|
+
- **R5: No Unbounded Operations** — All I/O (HTTP calls, DB queries, file reads, queue polls) MUST
|
|
26
|
+
have timeouts. No indefinite `await`, no missing `context.WithTimeout`, no fetch without
|
|
27
|
+
`AbortController` or `signal`, no infinite retries without backoff and ceiling. External calls
|
|
28
|
+
need a timeout AND a failure mode.
|
|
29
|
+
|
|
30
|
+
- **R6: No God Functions** — Functions over ~60 lines need extraction. More than 3 nesting levels
|
|
31
|
+
needs early returns or decomposition. If you can't describe what a function does in one sentence,
|
|
32
|
+
it does too much.
|
|
33
|
+
|
|
34
|
+
## Bulletproof Testing Standards — T1–T6
|
|
35
|
+
|
|
36
|
+
Apply when `--focus tests` or when reviewing test files directly.
|
|
37
|
+
|
|
38
|
+
- **T1: Determinism** — No date/time dependencies without injected clocks. No random without seed.
|
|
39
|
+
No order-dependent test suites. Same input → same result, always.
|
|
40
|
+
|
|
41
|
+
- **T2: No sleep-based sync** — No `sleep(200)` or `time.Sleep` as a synchronization mechanism.
|
|
42
|
+
Use explicit waits, callbacks, events, or polling with a timeout and an error on timeout.
|
|
43
|
+
|
|
44
|
+
- **T3: Isolation** — Each test sets up and tears down its own state. No shared mutable globals
|
|
45
|
+
between tests. No dependency on test execution order.
|
|
46
|
+
|
|
47
|
+
- **T4: Single assertion focus** — One logical assertion per test (multiple asserts on the same
|
|
48
|
+
subject is fine). Tests that assert five unrelated things make failures hard to diagnose.
|
|
49
|
+
|
|
50
|
+
- **T5: Descriptive names** — Test name should read as a sentence: `test_returns_empty_list_when_no_users`,
|
|
51
|
+
not `test_user_3`. Name should encode: subject + scenario + expected outcome.
|
|
52
|
+
|
|
53
|
+
- **T6: Provenance** — Each test should trace to a requirement, acceptance criterion, or bug ID.
|
|
54
|
+
Tests without clear purpose are maintenance debt. Note the gap as LOW severity.
|
|
55
|
+
|
|
56
|
+
## Agent overstepping — always flag
|
|
57
|
+
|
|
58
|
+
- Unrelated edits outside stated scope
|
|
59
|
+
- Commented-out code left in the diff
|
|
60
|
+
- Over-engineering / speculative generality (YAGNI violations)
|
|
61
|
+
- Scope creep: restructuring files not mentioned in the task
|
|
62
|
+
- Refactoring mixed into a bug fix (makes rollback impossible)
|
|
63
|
+
|
|
64
|
+
## Focus lanes (applied when `--focus` given)
|
|
65
|
+
|
|
66
|
+
| Flag | Deepen these areas |
|
|
67
|
+
|------|-------------------|
|
|
68
|
+
| `--focus security` | Auth/authz, input validation, SQL injection, credential handling, OWASP Top 10 |
|
|
69
|
+
| `--focus performance` | Hot paths, N+1 queries, missing indexes, unbounded ops, caching opportunities |
|
|
70
|
+
| `--focus patterns` | DRY, SOLID, naming, abstractions, module boundaries, coupling |
|
|
71
|
+
| `--focus tests` | T1–T6 standards, coverage gaps, flakiness risks, missing edge cases |
|
|
72
|
+
|
|
73
|
+
## Persona routing (`--persona <name>`)
|
|
74
|
+
|
|
75
|
+
1. Resolve the persona:
|
|
76
|
+
```bash
|
|
77
|
+
PERSONA_JSON=$(sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/_run.py" scripts/persona/registry.py --get "${persona_name}" --json 2>/dev/null)
|
|
78
|
+
```
|
|
79
|
+
2. If found: apply the review through the persona's lens — flag what that persona's frame of
|
|
80
|
+
reference would catch (e.g. a security-focused persona finds auth gaps a general review might
|
|
81
|
+
rate LOW).
|
|
82
|
+
3. If not found: warn "Persona '{name}' not found — using default review lens" and fall through.
|
|
83
|
+
|
|
84
|
+
## wicked-scenarios (`--scenarios`)
|
|
85
|
+
|
|
86
|
+
For each Critical or High finding, emit a wicked-scenarios regression block:
|
|
87
|
+
|
|
88
|
+
```yaml
|
|
89
|
+
scenario: "{title describing the bug/issue}"
|
|
90
|
+
given: "{precondition}"
|
|
91
|
+
when: "{action that triggers it}"
|
|
92
|
+
then: "{expected behavior after fix}"
|
|
93
|
+
file: "{file}:{line}"
|
|
94
|
+
severity: "Critical|High"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Standard output format
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
## Engineering Review: {scope or file}
|
|
101
|
+
|
|
102
|
+
### Strengths
|
|
103
|
+
- {good pattern with file:line evidence}
|
|
104
|
+
|
|
105
|
+
### Issues
|
|
106
|
+
|
|
107
|
+
| Severity | Rule | Issue | Location | Recommendation |
|
|
108
|
+
|----------|------|-------|----------|----------------|
|
|
109
|
+
| CRITICAL/HIGH/MEDIUM/LOW | R1–R6 or T1–T6 | {description} | `{file}:{line}` | {concrete fix} |
|
|
110
|
+
|
|
111
|
+
### Architecture Notes
|
|
112
|
+
{Any structural observations — use engineering:arch for full analysis}
|
|
113
|
+
|
|
114
|
+
### Maintainability Concerns
|
|
115
|
+
{Long-term maintenance considerations}
|
|
116
|
+
|
|
117
|
+
### Agent Overstepping
|
|
118
|
+
{Any out-of-scope edits, commented-out code, or scope creep found — cite file:line}
|
|
119
|
+
|
|
120
|
+
### Recommendations
|
|
121
|
+
1. {Highest priority with rationale}
|
|
122
|
+
2. {Secondary}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Severity guidelines
|
|
126
|
+
|
|
127
|
+
- **CRITICAL**: Will cause data loss, security breach, or production outage
|
|
128
|
+
- **HIGH**: Will cause bugs, broken patterns, or major maintainability problems
|
|
129
|
+
- **MEDIUM**: Should fix; will accumulate tech debt; non-blocking
|
|
130
|
+
- **LOW**: Nice to have; style; minor improvements; provenance gaps
|
|
131
|
+
|
|
132
|
+
## Cross-specialist referrals
|
|
133
|
+
|
|
134
|
+
- Security deep-dive → `wicked-garden:platform:security-engineer`
|
|
135
|
+
- Testing strategy → `wicked-testing:test-strategist`
|
|
136
|
+
- Architecture / structural trade-offs → `wicked-garden:engineering:solution-architect`
|
|
137
|
+
- Frontend specifics (React hooks, CSS, a11y), backend specifics (DB, API design,
|
|
138
|
+
queues): handled inline — apply the relevant checklist from this skill's refs.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: system-design
|
|
3
|
+
description: |
|
|
4
|
+
Use when decomposing a system into components with clear boundaries, module organization, and interface
|
|
5
|
+
contracts — the "how do we slice this?" question at design time.
|
|
6
|
+
NOT for reviewing an existing system's health (use the architecture skill or engineering:arch).
|
|
7
|
+
portability: portable
|
|
8
|
+
phase_relevance: ["design", "build"]
|
|
9
|
+
archetype_relevance: ["*"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# System Design Skill
|
|
13
|
+
|
|
14
|
+
Decompose systems into well-defined components with clear boundaries and interfaces.
|
|
15
|
+
|
|
16
|
+
## Purpose
|
|
17
|
+
|
|
18
|
+
Transform architecture into concrete components:
|
|
19
|
+
- Component identification and boundaries
|
|
20
|
+
- Interface definition
|
|
21
|
+
- Dependency management
|
|
22
|
+
- Module organization
|
|
23
|
+
|
|
24
|
+
## Process
|
|
25
|
+
|
|
26
|
+
### 1. Identify Components
|
|
27
|
+
|
|
28
|
+
Ask:
|
|
29
|
+
- What are major capabilities?
|
|
30
|
+
- What changes together?
|
|
31
|
+
- What has different scaling needs?
|
|
32
|
+
- What domain concepts exist?
|
|
33
|
+
|
|
34
|
+
### 2. Define Boundaries
|
|
35
|
+
|
|
36
|
+
Apply:
|
|
37
|
+
- **High Cohesion** - Related functionality together
|
|
38
|
+
- **Low Coupling** - Minimal dependencies
|
|
39
|
+
- **Single Responsibility** - One reason to change
|
|
40
|
+
- **Information Hiding** - Encapsulate internals
|
|
41
|
+
|
|
42
|
+
### 3. Design Interfaces
|
|
43
|
+
|
|
44
|
+
For each component:
|
|
45
|
+
- Public API (what it exposes)
|
|
46
|
+
- Dependencies (what it needs)
|
|
47
|
+
- Events (what it publishes/subscribes)
|
|
48
|
+
- Data contracts (I/O structures)
|
|
49
|
+
|
|
50
|
+
### 4. Document
|
|
51
|
+
|
|
52
|
+
Creates in `phases/design/`:
|
|
53
|
+
```
|
|
54
|
+
design/
|
|
55
|
+
├── components/
|
|
56
|
+
│ ├── overview.md
|
|
57
|
+
│ ├── auth-component.md
|
|
58
|
+
│ └── dependencies.mmd
|
|
59
|
+
└── interfaces/
|
|
60
|
+
└── component-api.md
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Component Patterns
|
|
64
|
+
|
|
65
|
+
**Layered** - Presentation → Application → Domain → Infrastructure
|
|
66
|
+
**Hexagonal** - Business logic with adapter ports
|
|
67
|
+
**Plugin** - Core system with pluggable extensions
|
|
68
|
+
|
|
69
|
+
See component patterns in refs/ (patterns-layered-pattern.md, patterns-facade-pattern.md).
|
|
70
|
+
|
|
71
|
+
## Dependency Management
|
|
72
|
+
|
|
73
|
+
### Rules
|
|
74
|
+
|
|
75
|
+
1. **Acyclic** - No circular dependencies
|
|
76
|
+
2. **Unidirectional** - Dependencies flow one way
|
|
77
|
+
3. **Stable** - Depend on stable abstractions
|
|
78
|
+
4. **Explicit** - Declare in constructor/config
|
|
79
|
+
|
|
80
|
+
### Common Anti-Patterns
|
|
81
|
+
|
|
82
|
+
**God Object** - One component does everything
|
|
83
|
+
**Fix**: Split by responsibility
|
|
84
|
+
|
|
85
|
+
**Feature Envy** - Component uses another's data extensively
|
|
86
|
+
**Fix**: Move functionality to data owner
|
|
87
|
+
|
|
88
|
+
**Circular Dependencies** - A depends on B, B depends on A
|
|
89
|
+
**Fix**: Extract shared logic or use events
|
|
90
|
+
|
|
91
|
+
**Leaky Abstraction** - Internal details exposed
|
|
92
|
+
**Fix**: Refine public interface
|
|
93
|
+
|
|
94
|
+
See dependency guides in refs/ (dependencies-dependency-principles.md, dependencies-best-practices.md).
|
|
95
|
+
|
|
96
|
+
## Integration
|
|
97
|
+
|
|
98
|
+
### With Architecture Skill
|
|
99
|
+
|
|
100
|
+
Implements high-level architecture:
|
|
101
|
+
- Takes architectural decisions
|
|
102
|
+
- Maps to concrete components
|
|
103
|
+
- Validates feasibility
|
|
104
|
+
|
|
105
|
+
### With Integration Skill
|
|
106
|
+
|
|
107
|
+
Provides boundaries for:
|
|
108
|
+
- API design
|
|
109
|
+
- Service contracts
|
|
110
|
+
- Event schemas
|
|
111
|
+
|
|
112
|
+
### With wicked-crew
|
|
113
|
+
|
|
114
|
+
Called during design phase after architecture.
|
|
115
|
+
|
|
116
|
+
## Events
|
|
117
|
+
|
|
118
|
+
- `[arch:components:defined:success]` - Components designed
|
|
119
|
+
- `[arch:interface:defined:success]` - Interface documented
|
|
120
|
+
- `[arch:dependency:analyzed:success]` - Dependencies validated
|
|
121
|
+
|
|
122
|
+
## Tips
|
|
123
|
+
|
|
124
|
+
1. **Start with Boundaries** - Define what's in/out first
|
|
125
|
+
2. **Think in Interfaces** - Design API before implementation
|
|
126
|
+
3. **Keep It Simple** - Don't over-decompose
|
|
127
|
+
4. **Test Boundaries** - Use contract tests
|
|
128
|
+
5. **Refactor Gradually** - Small, safe steps
|
|
129
|
+
6. **Document Dependencies** - Make them explicit
|
|
130
|
+
|
|
131
|
+
## Reference Materials
|
|
132
|
+
|
|
133
|
+
- Component Template:
|
|
134
|
+
- [Structure & API](refs/component-template-structure.md)
|
|
135
|
+
- [Lifecycle & Deployment](refs/component-template-lifecycle.md)
|
|
136
|
+
- [Maintenance & Examples](refs/component-template-maintenance.md)
|
|
137
|
+
- Interface Template:
|
|
138
|
+
- [Structure & Contracts](refs/interface-template-structure.md)
|
|
139
|
+
- [Testing & Operations](refs/interface-template-lifecycle.md)
|
|
140
|
+
- [Examples & Tips](refs/interface-template-maintenance.md)
|
|
141
|
+
- Component Patterns:
|
|
142
|
+
- [Layered](refs/patterns-layered-pattern.md)
|
|
143
|
+
- [Plugin Architecture](refs/patterns-plugin-architecture.md)
|
|
144
|
+
- [Facade](refs/patterns-facade-pattern.md)
|
|
145
|
+
- [Dependency Injection](refs/patterns-dependency-injection.md)
|
|
146
|
+
- Dependencies:
|
|
147
|
+
- [Principles](refs/dependencies-dependency-principles.md)
|
|
148
|
+
- [Tracking](refs/dependencies-dependency-tracking.md)
|
|
149
|
+
- [Best Practices](refs/dependencies-best-practices.md)
|
|
150
|
+
- Anti-Patterns:
|
|
151
|
+
- [God Object](refs/anti-patterns-god-object.md)
|
|
152
|
+
- [Big Ball of Mud](refs/anti-patterns-big-ball-of-mud.md)
|
|
153
|
+
- [Circular Dependencies](refs/anti-patterns-circular-dependencies.md)
|
|
154
|
+
- [Feature Envy](refs/anti-patterns-feature-envy.md)
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["design", "build"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Component Anti-Patterns: Big Ball of Mud
|
|
6
|
+
|
|
7
|
+
## Big Ball of Mud
|
|
8
|
+
|
|
9
|
+
### Problem
|
|
10
|
+
|
|
11
|
+
No clear architecture. Everything coupled to everything.
|
|
12
|
+
|
|
13
|
+
### Symptoms
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// Bad: No structure, everything mixed
|
|
17
|
+
// UserController.ts
|
|
18
|
+
class UserController {
|
|
19
|
+
async createUser(req, res) {
|
|
20
|
+
// Validation in controller
|
|
21
|
+
if (!req.body.email) {
|
|
22
|
+
return res.status(400).json({ error: 'Email required' });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Database access in controller
|
|
26
|
+
const existing = await db.query(
|
|
27
|
+
'SELECT * FROM users WHERE email = $1',
|
|
28
|
+
[req.body.email]
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
if (existing) {
|
|
32
|
+
return res.status(409).json({ error: 'Email exists' });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Business logic in controller
|
|
36
|
+
const hashedPassword = await bcrypt.hash(req.body.password, 10);
|
|
37
|
+
|
|
38
|
+
// More database access
|
|
39
|
+
const result = await db.query(
|
|
40
|
+
'INSERT INTO users (email, password) VALUES ($1, $2) RETURNING *',
|
|
41
|
+
[req.body.email, hashedPassword]
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
// Email sending in controller
|
|
45
|
+
await sendGrid.send({
|
|
46
|
+
to: req.body.email,
|
|
47
|
+
subject: 'Welcome',
|
|
48
|
+
html: '<h1>Welcome!</h1>'
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Direct cache access
|
|
52
|
+
await redis.set(`user:${result.id}`, JSON.stringify(result));
|
|
53
|
+
|
|
54
|
+
res.status(201).json(result);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Impact
|
|
60
|
+
|
|
61
|
+
- Impossible to test
|
|
62
|
+
- Can't swap dependencies
|
|
63
|
+
- Violates single responsibility
|
|
64
|
+
- Tightly coupled
|
|
65
|
+
- Hard to maintain
|
|
66
|
+
|
|
67
|
+
### Solution
|
|
68
|
+
|
|
69
|
+
Introduce clear layers and separation of concerns:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// Good: Layered architecture
|
|
73
|
+
// Presentation Layer
|
|
74
|
+
class UserController {
|
|
75
|
+
constructor(private userService: UserService) {}
|
|
76
|
+
|
|
77
|
+
async createUser(req: Request, res: Response) {
|
|
78
|
+
try {
|
|
79
|
+
const user = await this.userService.createUser(req.body);
|
|
80
|
+
res.status(201).json(user);
|
|
81
|
+
} catch (error) {
|
|
82
|
+
if (error instanceof ValidationError) {
|
|
83
|
+
res.status(400).json({ error: error.message });
|
|
84
|
+
} else if (error instanceof ConflictError) {
|
|
85
|
+
res.status(409).json({ error: error.message });
|
|
86
|
+
} else {
|
|
87
|
+
res.status(500).json({ error: 'Internal error' });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Application Layer
|
|
94
|
+
class UserService {
|
|
95
|
+
constructor(
|
|
96
|
+
private userRepo: UserRepository,
|
|
97
|
+
private emailService: EmailService,
|
|
98
|
+
private cache: Cache
|
|
99
|
+
) {}
|
|
100
|
+
|
|
101
|
+
async createUser(data: CreateUserDTO): Promise<User> {
|
|
102
|
+
// Validation
|
|
103
|
+
this.validate(data);
|
|
104
|
+
|
|
105
|
+
// Check for duplicates
|
|
106
|
+
const existing = await this.userRepo.findByEmail(data.email);
|
|
107
|
+
if (existing) {
|
|
108
|
+
throw new ConflictError('Email already exists');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Create user (domain logic)
|
|
112
|
+
const user = User.create(data);
|
|
113
|
+
|
|
114
|
+
// Persist
|
|
115
|
+
await this.userRepo.save(user);
|
|
116
|
+
|
|
117
|
+
// Send email
|
|
118
|
+
await this.emailService.sendWelcome(user.email);
|
|
119
|
+
|
|
120
|
+
// Cache
|
|
121
|
+
await this.cache.set(`user:${user.id}`, user);
|
|
122
|
+
|
|
123
|
+
return user;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private validate(data: CreateUserDTO): void {
|
|
127
|
+
if (!data.email) {
|
|
128
|
+
throw new ValidationError('Email required');
|
|
129
|
+
}
|
|
130
|
+
if (!data.password || data.password.length < 8) {
|
|
131
|
+
throw new ValidationError('Password must be at least 8 characters');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Domain Layer
|
|
137
|
+
class User {
|
|
138
|
+
private constructor(
|
|
139
|
+
private id: string,
|
|
140
|
+
private email: string,
|
|
141
|
+
private passwordHash: string
|
|
142
|
+
) {}
|
|
143
|
+
|
|
144
|
+
static async create(data: CreateUserDTO): Promise<User> {
|
|
145
|
+
const hashedPassword = await bcrypt.hash(data.password, 10);
|
|
146
|
+
return new User(generateId(), data.email, hashedPassword);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Infrastructure Layer
|
|
151
|
+
class PostgresUserRepository implements UserRepository {
|
|
152
|
+
async save(user: User): Promise<void> {
|
|
153
|
+
await db.query(
|
|
154
|
+
'INSERT INTO users (id, email, password_hash) VALUES ($1, $2, $3)',
|
|
155
|
+
[user.id, user.email, user.passwordHash]
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async findByEmail(email: string): Promise<User | null> {
|
|
160
|
+
const row = await db.query(
|
|
161
|
+
'SELECT * FROM users WHERE email = $1',
|
|
162
|
+
[email]
|
|
163
|
+
);
|
|
164
|
+
return row ? User.fromRow(row) : null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Leaky Abstraction
|
|
170
|
+
|
|
171
|
+
### Problem
|
|
172
|
+
|
|
173
|
+
Implementation details leak through the abstraction.
|
|
174
|
+
|
|
175
|
+
### Symptoms
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// Bad: Leaky abstraction
|
|
179
|
+
interface UserRepository {
|
|
180
|
+
// SQL query leaking through interface
|
|
181
|
+
query(sql: string, params: any[]): Promise<any>;
|
|
182
|
+
|
|
183
|
+
// Database-specific pagination
|
|
184
|
+
findAll(offset: number, limit: number): Promise<any>;
|
|
185
|
+
|
|
186
|
+
// Redis-specific method
|
|
187
|
+
flushCache(): Promise<void>;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Forces consumers to know about SQL
|
|
191
|
+
const users = await userRepo.query(
|
|
192
|
+
'SELECT * FROM users WHERE email = $1',
|
|
193
|
+
[email]
|
|
194
|
+
);
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Impact
|
|
198
|
+
|
|
199
|
+
- Can't swap implementations
|
|
200
|
+
- Tied to specific technology
|
|
201
|
+
- Breaks abstraction principle
|
|
202
|
+
- Hard to test
|
|
203
|
+
|
|
204
|
+
### Solution
|
|
205
|
+
|
|
206
|
+
Hide implementation details behind clean interface:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
// Good: Clean abstraction
|
|
210
|
+
interface UserRepository {
|
|
211
|
+
findById(id: string): Promise<User | null>;
|
|
212
|
+
findByEmail(email: string): Promise<User | null>;
|
|
213
|
+
findAll(filter?: UserFilter): Promise<User[]>;
|
|
214
|
+
save(user: User): Promise<void>;
|
|
215
|
+
delete(id: string): Promise<void>;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
interface UserFilter {
|
|
219
|
+
role?: UserRole;
|
|
220
|
+
status?: UserStatus;
|
|
221
|
+
createdAfter?: Date;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Implementation details hidden
|
|
225
|
+
class PostgresUserRepository implements UserRepository {
|
|
226
|
+
async findByEmail(email: string): Promise<User | null> {
|
|
227
|
+
const row = await this.db.query(
|
|
228
|
+
'SELECT * FROM users WHERE email = $1',
|
|
229
|
+
[email]
|
|
230
|
+
);
|
|
231
|
+
return row ? this.mapToUser(row) : null;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async findAll(filter?: UserFilter): Promise<User[]> {
|
|
235
|
+
const query = this.buildQuery(filter);
|
|
236
|
+
const rows = await this.db.query(query.sql, query.params);
|
|
237
|
+
return rows.map(row => this.mapToUser(row));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Helper methods private
|
|
241
|
+
private buildQuery(filter?: UserFilter) {
|
|
242
|
+
// SQL building logic hidden
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
private mapToUser(row: any): User {
|
|
246
|
+
// Mapping logic hidden
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Consumer doesn't know about SQL
|
|
251
|
+
const user = await userRepo.findByEmail('test@example.com');
|
|
252
|
+
const activeUsers = await userRepo.findAll({ status: 'active' });
|
|
253
|
+
```
|
|
254
|
+
|