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,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["design", "build"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Component Design Patterns: Layered Pattern
|
|
6
|
+
|
|
7
|
+
## Layered Pattern
|
|
8
|
+
|
|
9
|
+
### Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────┐
|
|
13
|
+
│ Presentation Layer │ Controllers, Views, API
|
|
14
|
+
├─────────────────────────┤
|
|
15
|
+
│ Application Layer │ Use Cases, Workflows
|
|
16
|
+
├─────────────────────────┤
|
|
17
|
+
│ Domain Layer │ Business Logic, Entities
|
|
18
|
+
├─────────────────────────┤
|
|
19
|
+
│ Infrastructure Layer │ Database, External Services
|
|
20
|
+
└─────────────────────────┘
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Example
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// Presentation Layer (API Controller)
|
|
27
|
+
class UserController {
|
|
28
|
+
constructor(private userService: UserService) {}
|
|
29
|
+
|
|
30
|
+
async createUser(req: Request, res: Response) {
|
|
31
|
+
const result = await this.userService.createUser(req.body);
|
|
32
|
+
res.status(201).json(result);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Application Layer (Service)
|
|
37
|
+
class UserService {
|
|
38
|
+
constructor(
|
|
39
|
+
private userRepo: UserRepository,
|
|
40
|
+
private emailService: EmailService
|
|
41
|
+
) {}
|
|
42
|
+
|
|
43
|
+
async createUser(data: CreateUserDTO): Promise<User> {
|
|
44
|
+
// Application logic
|
|
45
|
+
const user = User.create(data);
|
|
46
|
+
await this.userRepo.save(user);
|
|
47
|
+
await this.emailService.sendWelcome(user.email);
|
|
48
|
+
return user;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Domain Layer (Entity)
|
|
53
|
+
class User {
|
|
54
|
+
constructor(
|
|
55
|
+
public id: string,
|
|
56
|
+
public email: string,
|
|
57
|
+
public name: string
|
|
58
|
+
) {
|
|
59
|
+
this.validate();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private validate() {
|
|
63
|
+
if (!this.email.includes('@')) {
|
|
64
|
+
throw new Error('Invalid email');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static create(data: { email: string; name: string }): User {
|
|
69
|
+
return new User(generateId(), data.email, data.name);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Infrastructure Layer (Repository)
|
|
74
|
+
class PostgresUserRepository implements UserRepository {
|
|
75
|
+
async save(user: User): Promise<void> {
|
|
76
|
+
await db.query(
|
|
77
|
+
'INSERT INTO users (id, email, name) VALUES ($1, $2, $3)',
|
|
78
|
+
[user.id, user.email, user.name]
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### When to Use
|
|
85
|
+
|
|
86
|
+
- Traditional web applications
|
|
87
|
+
- Need clear separation of concerns
|
|
88
|
+
- Team familiar with MVC
|
|
89
|
+
- Moderate complexity
|
|
90
|
+
|
|
91
|
+
### Trade-offs
|
|
92
|
+
|
|
93
|
+
**Pros**: Easy to understand, well-known pattern
|
|
94
|
+
**Cons**: Can become rigid, may lead to anemic models
|
|
95
|
+
|
|
96
|
+
## Hexagonal (Ports & Adapters)
|
|
97
|
+
|
|
98
|
+
### Structure
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
┌──────────────┐
|
|
102
|
+
│ REST API │ (Adapter)
|
|
103
|
+
└──────┬───────┘
|
|
104
|
+
│
|
|
105
|
+
┌──────────▼──────────┐
|
|
106
|
+
│ Port (Interface) │
|
|
107
|
+
├─────────────────────┤
|
|
108
|
+
│ │
|
|
109
|
+
│ Business Logic │
|
|
110
|
+
│ (Core Domain) │
|
|
111
|
+
│ │
|
|
112
|
+
├─────────────────────┤
|
|
113
|
+
│ Port (Interface) │
|
|
114
|
+
└──────────┬──────────┘
|
|
115
|
+
│
|
|
116
|
+
┌──────────┼──────────┐
|
|
117
|
+
│ │ │
|
|
118
|
+
┌────▼───┐ ┌───▼────┐ ┌──▼────┐
|
|
119
|
+
│Postgres│ │ Redis │ │ S3 │ (Adapters)
|
|
120
|
+
└────────┘ └────────┘ └───────┘
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Example
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
// Port (Interface)
|
|
127
|
+
interface UserRepository {
|
|
128
|
+
save(user: User): Promise<void>;
|
|
129
|
+
findById(id: string): Promise<User | null>;
|
|
130
|
+
findByEmail(email: string): Promise<User | null>;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Core Domain (Business Logic)
|
|
134
|
+
class UserService {
|
|
135
|
+
constructor(
|
|
136
|
+
private userRepo: UserRepository, // Depends on port, not adapter
|
|
137
|
+
private emailGateway: EmailGateway
|
|
138
|
+
) {}
|
|
139
|
+
|
|
140
|
+
async registerUser(email: string, name: string): Promise<User> {
|
|
141
|
+
// Pure business logic
|
|
142
|
+
const existing = await this.userRepo.findByEmail(email);
|
|
143
|
+
if (existing) {
|
|
144
|
+
throw new Error('Email already registered');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const user = User.create(email, name);
|
|
148
|
+
await this.userRepo.save(user);
|
|
149
|
+
await this.emailGateway.sendWelcome(user.email);
|
|
150
|
+
|
|
151
|
+
return user;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Adapter (Implementation)
|
|
156
|
+
class PostgresUserRepository implements UserRepository {
|
|
157
|
+
async save(user: User): Promise<void> {
|
|
158
|
+
await db.query('INSERT INTO users ...');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async findById(id: string): Promise<User | null> {
|
|
162
|
+
const row = await db.query('SELECT * FROM users WHERE id = $1', [id]);
|
|
163
|
+
return row ? User.fromRow(row) : null;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async findByEmail(email: string): Promise<User | null> {
|
|
167
|
+
const row = await db.query('SELECT * FROM users WHERE email = $1', [email]);
|
|
168
|
+
return row ? User.fromRow(row) : null;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Another Adapter (for testing)
|
|
173
|
+
class InMemoryUserRepository implements UserRepository {
|
|
174
|
+
private users = new Map<string, User>();
|
|
175
|
+
|
|
176
|
+
async save(user: User): Promise<void> {
|
|
177
|
+
this.users.set(user.id, user);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async findById(id: string): Promise<User | null> {
|
|
181
|
+
return this.users.get(id) || null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
async findByEmail(email: string): Promise<User | null> {
|
|
185
|
+
for (const user of this.users.values()) {
|
|
186
|
+
if (user.email === email) return user;
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### When to Use
|
|
194
|
+
|
|
195
|
+
- Need to isolate business logic
|
|
196
|
+
- Frequent technology changes
|
|
197
|
+
- Testing is critical
|
|
198
|
+
- Multiple interfaces (API, CLI, Worker)
|
|
199
|
+
|
|
200
|
+
### Trade-offs
|
|
201
|
+
|
|
202
|
+
**Pros**: Highly testable, technology-agnostic core
|
|
203
|
+
**Cons**: More abstraction, may be overkill for simple apps
|
|
204
|
+
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["design", "build"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Component Design Patterns: Plugin Architecture
|
|
6
|
+
|
|
7
|
+
## Plugin Architecture
|
|
8
|
+
|
|
9
|
+
### Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌────────────────────────────┐
|
|
13
|
+
│ Core System │
|
|
14
|
+
│ (Minimal, Stable) │
|
|
15
|
+
└────────┬───────────────────┘
|
|
16
|
+
│
|
|
17
|
+
│ Plugin Interface
|
|
18
|
+
│
|
|
19
|
+
┌────┼────┬────────┬──────┐
|
|
20
|
+
│ │ │ │ │
|
|
21
|
+
┌───▼┐ ┌─▼──┐ ┌▼────┐ ┌▼────┐
|
|
22
|
+
│P1 │ │ P2 │ │ P3 │ │ P4 │
|
|
23
|
+
└────┘ └────┘ └─────┘ └─────┘
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Example
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Core System
|
|
30
|
+
interface Plugin {
|
|
31
|
+
name: string;
|
|
32
|
+
version: string;
|
|
33
|
+
init(app: Application): Promise<void>;
|
|
34
|
+
shutdown(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class PluginManager {
|
|
38
|
+
private plugins: Map<string, Plugin> = new Map();
|
|
39
|
+
|
|
40
|
+
async register(plugin: Plugin): Promise<void> {
|
|
41
|
+
if (this.plugins.has(plugin.name)) {
|
|
42
|
+
throw new Error(`Plugin ${plugin.name} already registered`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
await plugin.init(this.app);
|
|
46
|
+
this.plugins.set(plugin.name, plugin);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async unregister(name: string): Promise<void> {
|
|
50
|
+
const plugin = this.plugins.get(name);
|
|
51
|
+
if (!plugin) return;
|
|
52
|
+
|
|
53
|
+
await plugin.shutdown();
|
|
54
|
+
this.plugins.delete(name);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
getPlugin(name: string): Plugin | undefined {
|
|
58
|
+
return this.plugins.get(name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Plugin Implementation
|
|
63
|
+
class AuthPlugin implements Plugin {
|
|
64
|
+
name = 'auth';
|
|
65
|
+
version = '1.0.0';
|
|
66
|
+
|
|
67
|
+
async init(app: Application): Promise<void> {
|
|
68
|
+
// Register routes
|
|
69
|
+
app.post('/auth/login', this.handleLogin);
|
|
70
|
+
app.post('/auth/logout', this.handleLogout);
|
|
71
|
+
|
|
72
|
+
// Register middleware
|
|
73
|
+
app.use(this.authMiddleware);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async shutdown(): Promise<void> {
|
|
77
|
+
// Cleanup
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private handleLogin = async (req, res) => {
|
|
81
|
+
// Login logic
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
private handleLogout = async (req, res) => {
|
|
85
|
+
// Logout logic
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
private authMiddleware = async (req, res, next) => {
|
|
89
|
+
// Auth checking
|
|
90
|
+
next();
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Usage
|
|
95
|
+
const pluginManager = new PluginManager(app);
|
|
96
|
+
await pluginManager.register(new AuthPlugin());
|
|
97
|
+
await pluginManager.register(new PaymentPlugin());
|
|
98
|
+
await pluginManager.register(new NotificationPlugin());
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### When to Use
|
|
102
|
+
|
|
103
|
+
- Extensibility is a key requirement
|
|
104
|
+
- Third-party extensions needed
|
|
105
|
+
- Feature sets vary by deployment
|
|
106
|
+
- Plugin marketplace desired
|
|
107
|
+
|
|
108
|
+
### Trade-offs
|
|
109
|
+
|
|
110
|
+
**Pros**: Highly extensible, loose coupling
|
|
111
|
+
**Cons**: Plugin compatibility, security concerns
|
|
112
|
+
|
|
113
|
+
## Repository Pattern
|
|
114
|
+
|
|
115
|
+
### Structure
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
┌─────────────┐
|
|
119
|
+
│ Service │
|
|
120
|
+
└──────┬──────┘
|
|
121
|
+
│
|
|
122
|
+
│ Interface
|
|
123
|
+
│
|
|
124
|
+
┌──────▼──────┐
|
|
125
|
+
│ Repository │ (Abstraction)
|
|
126
|
+
└──────┬──────┘
|
|
127
|
+
│
|
|
128
|
+
│ Implementation
|
|
129
|
+
│
|
|
130
|
+
┌──────▼──────┐
|
|
131
|
+
│ Database │
|
|
132
|
+
└─────────────┘
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Example
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Repository Interface
|
|
139
|
+
interface UserRepository {
|
|
140
|
+
findById(id: string): Promise<User | null>;
|
|
141
|
+
findAll(filter?: UserFilter): Promise<User[]>;
|
|
142
|
+
save(user: User): Promise<void>;
|
|
143
|
+
delete(id: string): Promise<void>;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Domain Entity
|
|
147
|
+
class User {
|
|
148
|
+
constructor(
|
|
149
|
+
public id: string,
|
|
150
|
+
public email: string,
|
|
151
|
+
public name: string,
|
|
152
|
+
public status: 'active' | 'inactive'
|
|
153
|
+
) {}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Repository Implementation
|
|
157
|
+
class PostgresUserRepository implements UserRepository {
|
|
158
|
+
constructor(private db: Database) {}
|
|
159
|
+
|
|
160
|
+
async findById(id: string): Promise<User | null> {
|
|
161
|
+
const row = await this.db.queryOne(
|
|
162
|
+
'SELECT * FROM users WHERE id = $1',
|
|
163
|
+
[id]
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
return row ? this.mapToEntity(row) : null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async findAll(filter?: UserFilter): Promise<User[]> {
|
|
170
|
+
const query = this.buildQuery(filter);
|
|
171
|
+
const rows = await this.db.query(query.sql, query.params);
|
|
172
|
+
return rows.map(row => this.mapToEntity(row));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async save(user: User): Promise<void> {
|
|
176
|
+
await this.db.query(
|
|
177
|
+
`INSERT INTO users (id, email, name, status)
|
|
178
|
+
VALUES ($1, $2, $3, $4)
|
|
179
|
+
ON CONFLICT (id) DO UPDATE
|
|
180
|
+
SET email = $2, name = $3, status = $4`,
|
|
181
|
+
[user.id, user.email, user.name, user.status]
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async delete(id: string): Promise<void> {
|
|
186
|
+
await this.db.query('DELETE FROM users WHERE id = $1', [id]);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private mapToEntity(row: any): User {
|
|
190
|
+
return new User(row.id, row.email, row.name, row.status);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private buildQuery(filter?: UserFilter) {
|
|
194
|
+
// Query building logic
|
|
195
|
+
return { sql: '...', params: [] };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Service using repository
|
|
200
|
+
class UserService {
|
|
201
|
+
constructor(private userRepo: UserRepository) {}
|
|
202
|
+
|
|
203
|
+
async getActiveUsers(): Promise<User[]> {
|
|
204
|
+
const users = await this.userRepo.findAll({ status: 'active' });
|
|
205
|
+
return users;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async activateUser(id: string): Promise<void> {
|
|
209
|
+
const user = await this.userRepo.findById(id);
|
|
210
|
+
if (!user) throw new Error('User not found');
|
|
211
|
+
|
|
212
|
+
user.status = 'active';
|
|
213
|
+
await this.userRepo.save(user);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### When to Use
|
|
219
|
+
|
|
220
|
+
- Need to abstract data access
|
|
221
|
+
- Multiple data sources possible
|
|
222
|
+
- Domain-driven design
|
|
223
|
+
- Testing with mock data
|
|
224
|
+
|
|
225
|
+
### Trade-offs
|
|
226
|
+
|
|
227
|
+
**Pros**: Decouples business logic from data access
|
|
228
|
+
**Cons**: Additional abstraction layer
|
|
229
|
+
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unit-test-quality
|
|
3
|
+
description: |
|
|
4
|
+
Language- and framework-neutral guard against useless unit tests — the kind
|
|
5
|
+
that pass forever, never catch regressions, and inflate coverage without
|
|
6
|
+
protecting behavior. Provides two complementary thought-experiment filters
|
|
7
|
+
(execution + behavior), a pre-write self-check, a taxonomy of seven recurring
|
|
8
|
+
anti-patterns (tautological, assertion-free, implementation mirror, framework
|
|
9
|
+
retest, constant verification, sleep-coupled, exception-swallowing), and a
|
|
10
|
+
one-line decision rule per pattern.
|
|
11
|
+
|
|
12
|
+
Use when: writing or reviewing a unit test, auditing a suite with high
|
|
13
|
+
coverage but low confidence, or pairing a regression test with a bug fix.
|
|
14
|
+
status: stable
|
|
15
|
+
portability: portable
|
|
16
|
+
phase_relevance: ["design", "build"]
|
|
17
|
+
archetype_relevance: ["*"]
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Unit Test Quality
|
|
21
|
+
|
|
22
|
+
A test you cannot break by changing the system under test (SUT) is not a test —
|
|
23
|
+
it is dead weight. This skill exists because suites grow faster than they shrink,
|
|
24
|
+
and "100% coverage" is no defense against a suite that asserts the wrong things.
|
|
25
|
+
|
|
26
|
+
## Two complementary filters
|
|
27
|
+
|
|
28
|
+
No single mechanical filter catches every useless test — each anti-pattern
|
|
29
|
+
below has its own diagnostic. But two thought experiments catch the most common
|
|
30
|
+
cases and are language-neutral. Apply them in order; if either says "cut," you
|
|
31
|
+
are looking at a test that does not earn its keep.
|
|
32
|
+
|
|
33
|
+
### Filter A — execution check
|
|
34
|
+
|
|
35
|
+
> **If I replace the body of the SUT with a force-fail (`throw` / `raise` / `panic` / equivalent), does the test still pass?**
|
|
36
|
+
|
|
37
|
+
- **Still passes** → the test never exercised the SUT at all. Cut it (it is pure coverage theater, see #2 assertion-free, #4 framework retest).
|
|
38
|
+
- **Now fails** → the test at least *invokes* the SUT. Move to Filter B.
|
|
39
|
+
|
|
40
|
+
### Filter B — behavior check
|
|
41
|
+
|
|
42
|
+
> **If I replace the body of the SUT with a no-op stub returning sensible defaults (zero, null/None, empty collection, default-constructed value), does the test still pass?**
|
|
43
|
+
|
|
44
|
+
- **Still passes** → the test asserts nothing the SUT actually computes; the assertion would hold against an empty stub. Cut it (typically #5 constant verification or #4 framework retest).
|
|
45
|
+
- **Now fails** → the test depends on SUT-derived behavior. Likely worth keeping, but still apply the per-pattern rules below.
|
|
46
|
+
|
|
47
|
+
The filters are first-cut diagnostics — both can pass on #1 tautological (assertion mirrors mock input), #3 implementation mirror (assertion locks structure, not behavior), #6 sleep-coupled (timing flake is orthogonal), and #7 exception-swallowing (assertion-count guards are required regardless). Use the per-pattern decision rules below for those.
|
|
48
|
+
|
|
49
|
+
## The seven useless-test anti-patterns
|
|
50
|
+
|
|
51
|
+
### 1. Tautological — asserts what the mock was told to return
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
when(repo.find(1)).thenReturn(user);
|
|
55
|
+
result = service.fetch(1);
|
|
56
|
+
assert(result == user); // Tests that the mock was wired correctly. The
|
|
57
|
+
// production fetch() could be `return repo.find(id)`
|
|
58
|
+
// OR `return repo.find(id).asJson().broken()` — this
|
|
59
|
+
// test cannot distinguish.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Decision rule:** if the assertion is about a value you handed to a mock, the
|
|
63
|
+
test asserts mock plumbing, not behavior. Replace with a contract assertion
|
|
64
|
+
(state changed, side-effect emitted, derived value computed).
|
|
65
|
+
|
|
66
|
+
### 2. Assertion-free — "no exception thrown" is the only signal
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
test("processes order", () => {
|
|
70
|
+
service.process(order); // No assertion. Coverage counter ticks.
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Decision rule:** every test must contain a positive assertion against an
|
|
75
|
+
observable outcome. If the only thing the test proves is "this line executed",
|
|
76
|
+
delete it — coverage tools already prove that.
|
|
77
|
+
|
|
78
|
+
Variants to catch: `expect(x).toBeDefined()`, `expect(x).not.toBeNull()`,
|
|
79
|
+
`assert x is not None`, `assertNotNull(x)`. These are coverage assertions, not
|
|
80
|
+
behavior assertions.
|
|
81
|
+
|
|
82
|
+
### 3. Implementation mirror — asserts the structure of the code, not its outcome
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
expect(component.props).toEqual({a: 1, b: 2, c: 3, d: 4, e: 5});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Decision rule:** snapshot tests and full-object equals tests rot — they catch
|
|
89
|
+
*every* change, including refactors that preserve behavior. Assert the
|
|
90
|
+
*minimum* set of fields that prove the contract. If the test must update every
|
|
91
|
+
time the SUT is touched, the test is locking in implementation, not behavior.
|
|
92
|
+
|
|
93
|
+
### 4. Framework retest — asserts that the framework still works
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
test("ORM saves user", () => {
|
|
97
|
+
user = User.create({name: "x"});
|
|
98
|
+
assert(User.find(user.id).name == "x"); // Tests Rails / Django / Hibernate.
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Decision rule:** the framework's test suite covers this. If your test would
|
|
103
|
+
also pass against an empty stub of *your* code, it is a framework test. Move
|
|
104
|
+
it to integration tests if the wiring is non-trivial; otherwise delete it.
|
|
105
|
+
|
|
106
|
+
### 5. Constant verification — tests with no logic
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
test("getter returns name", () => {
|
|
110
|
+
user = new User("alice");
|
|
111
|
+
expect(user.name).toBe("alice");
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Decision rule:** if the SUT contains no branches, no transformations, no
|
|
116
|
+
side-effects, and no derivations, there is nothing to test. Generated getters,
|
|
117
|
+
data-class field access, and one-line returns of constants do not need unit
|
|
118
|
+
tests.
|
|
119
|
+
|
|
120
|
+
### 6. Sleep-coupled — uses `sleep`, `setTimeout`, or wall-clock waits to "stabilize"
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
service.startBackground();
|
|
124
|
+
sleep(500); // Hopes the background work finished.
|
|
125
|
+
expect(state).toBe("done");
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Decision rule:** any test using a hardcoded delay is non-deterministic. Either
|
|
129
|
+
the test sometimes finishes before the SUT (false fail), sometimes finishes
|
|
130
|
+
exactly on the boundary (flake), or runs unnecessarily slowly (waste). Replace
|
|
131
|
+
with: a deterministic clock, an explicit completion signal, or a poll-with-timeout
|
|
132
|
+
over a real condition (not a sleep).
|
|
133
|
+
|
|
134
|
+
### 7. Exception-swallowing — try/catch hides the failure
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
test("handles bad input", () => {
|
|
138
|
+
try { service.process(null); } catch (e) { /* expected */ }
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Decision rule:** assertions that depend on a `catch` block being entered must
|
|
143
|
+
*also* assert the catch was entered (`expect.assertions(N)` in Jest, `try…else` in
|
|
144
|
+
Python with a fail-the-test in `else`). A bare `catch` that swallows everything
|
|
145
|
+
makes the test pass even when the SUT fails to throw at all.
|
|
146
|
+
|
|
147
|
+
## Pre-write self-check (use before adding a new test)
|
|
148
|
+
|
|
149
|
+
Run through these in order. Stop at the first "no" — that is the work to do
|
|
150
|
+
before writing the test.
|
|
151
|
+
|
|
152
|
+
1. **What contract am I asserting?** State it in one sentence: input → expected
|
|
153
|
+
observable outcome. If you cannot, you are not yet ready to write the test.
|
|
154
|
+
2. **Could this test pass against a broken SUT?** Mentally apply Filter A
|
|
155
|
+
(replace SUT body with a force-fail) and Filter B (replace SUT body with a
|
|
156
|
+
no-op default-returning stub). If the test passes either filter, stop and
|
|
157
|
+
reconsider what you are asserting.
|
|
158
|
+
3. **Is the assertion about behavior or about plumbing?** Behavior: state
|
|
159
|
+
changed, value derived, event emitted, error raised with specific shape.
|
|
160
|
+
Plumbing: mock was called, function exists, framework worked.
|
|
161
|
+
4. **Is there exactly one logical assertion?** Multiple assertions about the
|
|
162
|
+
same outcome are fine; multiple unrelated outcomes mean multiple tests.
|
|
163
|
+
5. **Is the test deterministic without sleeps?** If it depends on timing,
|
|
164
|
+
reach for a fake clock or a completion signal, not a delay.
|
|
165
|
+
6. **Will I have to update this test on every refactor?** If yes, it is asserting
|
|
166
|
+
implementation, not behavior. Narrow the assertion.
|
|
167
|
+
7. **Does the test name describe the behavior?** "test_user_creation" is a
|
|
168
|
+
coverage label. "rejects user creation when email is missing" is a contract.
|
|
169
|
+
|
|
170
|
+
## Reviewer rubric (use during PR review of new tests)
|
|
171
|
+
|
|
172
|
+
For each new test in the diff:
|
|
173
|
+
|
|
174
|
+
- Read the test name. Does it state a contract or a code path? Contract → continue. Code path → flag.
|
|
175
|
+
- Read the assertion(s). Are they against observable outcomes the SUT controls? Yes → continue. No → flag.
|
|
176
|
+
- Apply Filter A mentally. Would the test fail if the SUT body became a force-fail (throw/raise/panic)? Yes → continue. No → flag (#2 assertion-free or #4 framework retest).
|
|
177
|
+
- Apply Filter B mentally. Would the test fail if the SUT body became a no-op stub returning defaults? Yes → likely keep. No → flag (#5 constant verification or #4 framework retest).
|
|
178
|
+
- If the test uses a mock: does the assertion verify *interaction the SUT chose to make*, not *value the test handed in*? Verifies SUT decision → keep. Echoes test input → flag (#1 tautological — neither filter catches this; structural inspection only).
|
|
179
|
+
- If the test contains `sleep`, `setTimeout(..., N)`, `Thread.sleep`, `time.sleep`, `await delay`, or any wall-clock-based wait: flag (#6 sleep-coupled). Replace with fake timers / virtual clock, an explicit completion signal/promise, or a poll-with-timeout over a real condition — never with `setTimeout(..., 0)` (which is a macrotask, not deterministic).
|
|
180
|
+
|
|
181
|
+
## What this skill does not cover
|
|
182
|
+
|
|
183
|
+
- **Integration / E2E tests** — different rules (real dependencies, slower feedback, broader contracts). Use the `integration` skill.
|
|
184
|
+
- **Property / fuzz testing** — requires its own taxonomy (shrinking, generators, invariants). Out of scope here.
|
|
185
|
+
- **Mutation testing** — verifies the *suite* catches bugs by mutating the SUT. Use the `mutation-test-engineer` agent for that audit; this skill prevents the bad tests in the first place.
|
|
186
|
+
- **Test runner / CI ergonomics** — flake quarantine, retry policy, parallel isolation. See the `flaky-test-hunter` agent.
|
|
187
|
+
|
|
188
|
+
## Why this is one skill across all languages
|
|
189
|
+
|
|
190
|
+
The seven anti-patterns above show up in pytest, Jest, Vitest, JUnit, RSpec,
|
|
191
|
+
xUnit, Go's `testing`, Rust's `#[test]`, and every framework that has ever
|
|
192
|
+
shipped. The syntax differs; the failure mode is identical. Keeping the rules
|
|
193
|
+
language-neutral is what makes this skill durable — any new framework inherits
|
|
194
|
+
the same filters the day it is adopted.
|