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,241 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["design", "build"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Component Anti-Patterns: Circular Dependencies
|
|
6
|
+
|
|
7
|
+
## Circular Dependencies
|
|
8
|
+
|
|
9
|
+
### Problem
|
|
10
|
+
|
|
11
|
+
Component A depends on B, and B depends on A.
|
|
12
|
+
|
|
13
|
+
### Symptoms
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// Bad: Circular dependency
|
|
17
|
+
// UserService.ts
|
|
18
|
+
class UserService {
|
|
19
|
+
constructor(private orderService: OrderService) {}
|
|
20
|
+
|
|
21
|
+
async deleteUser(id: string) {
|
|
22
|
+
// Check if user has orders
|
|
23
|
+
const orders = await this.orderService.getUserOrders(id);
|
|
24
|
+
if (orders.length > 0) {
|
|
25
|
+
throw new Error('Cannot delete user with orders');
|
|
26
|
+
}
|
|
27
|
+
await this.userRepo.delete(id);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// OrderService.ts
|
|
32
|
+
class OrderService {
|
|
33
|
+
constructor(private userService: UserService) {}
|
|
34
|
+
|
|
35
|
+
async createOrder(data: OrderData) {
|
|
36
|
+
// Get user details
|
|
37
|
+
const user = await this.userService.getUser(data.userId);
|
|
38
|
+
if (!user) {
|
|
39
|
+
throw new Error('User not found');
|
|
40
|
+
}
|
|
41
|
+
await this.orderRepo.save(order);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async getUserOrders(userId: string) {
|
|
45
|
+
return await this.orderRepo.findByUserId(userId);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Impact
|
|
51
|
+
|
|
52
|
+
- Initialization problems
|
|
53
|
+
- Hard to understand
|
|
54
|
+
- Tight coupling
|
|
55
|
+
- Can't test independently
|
|
56
|
+
|
|
57
|
+
### Solution
|
|
58
|
+
|
|
59
|
+
Break cycle with events, shared interface, or extract common logic:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// Solution 1: Use events
|
|
63
|
+
class UserService {
|
|
64
|
+
constructor(
|
|
65
|
+
private userRepo: UserRepository,
|
|
66
|
+
private eventBus: EventBus
|
|
67
|
+
) {}
|
|
68
|
+
|
|
69
|
+
async deleteUser(id: string) {
|
|
70
|
+
// Publish event instead of calling OrderService
|
|
71
|
+
const canDelete = await this.eventBus.query('user.can-delete', { userId: id });
|
|
72
|
+
|
|
73
|
+
if (!canDelete) {
|
|
74
|
+
throw new Error('Cannot delete user');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
await this.userRepo.delete(id);
|
|
78
|
+
await this.eventBus.publish('user.deleted', { userId: id });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
class OrderService {
|
|
83
|
+
constructor(
|
|
84
|
+
private orderRepo: OrderRepository,
|
|
85
|
+
private eventBus: EventBus
|
|
86
|
+
) {
|
|
87
|
+
// Subscribe to events
|
|
88
|
+
this.eventBus.on('user.can-delete', this.handleCanDeleteUser);
|
|
89
|
+
this.eventBus.on('user.deleted', this.handleUserDeleted);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private handleCanDeleteUser = async (event: any) => {
|
|
93
|
+
const orders = await this.orderRepo.findByUserId(event.userId);
|
|
94
|
+
return orders.length === 0;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
private handleUserDeleted = async (event: any) => {
|
|
98
|
+
// Clean up user's orders
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Solution 2: Extract shared logic
|
|
103
|
+
interface UserReader {
|
|
104
|
+
findById(id: string): Promise<User | null>;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
class UserService implements UserReader {
|
|
108
|
+
async findById(id: string): Promise<User | null> {
|
|
109
|
+
return await this.userRepo.findById(id);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
class OrderService {
|
|
114
|
+
// Depend on interface, not concrete UserService
|
|
115
|
+
constructor(
|
|
116
|
+
private userReader: UserReader,
|
|
117
|
+
private orderRepo: OrderRepository
|
|
118
|
+
) {}
|
|
119
|
+
|
|
120
|
+
async createOrder(data: OrderData) {
|
|
121
|
+
const user = await this.userReader.findById(data.userId);
|
|
122
|
+
if (!user) {
|
|
123
|
+
throw new Error('User not found');
|
|
124
|
+
}
|
|
125
|
+
await this.orderRepo.save(order);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Shotgun Surgery
|
|
131
|
+
|
|
132
|
+
### Problem
|
|
133
|
+
|
|
134
|
+
One change requires modifying many components.
|
|
135
|
+
|
|
136
|
+
### Symptoms
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// Bad: Adding new user status requires changes in many places
|
|
140
|
+
|
|
141
|
+
// UserService.ts
|
|
142
|
+
async updateStatus(id: string, status: string) {
|
|
143
|
+
if (status !== 'active' && status !== 'inactive' && status !== 'suspended') {
|
|
144
|
+
throw new Error('Invalid status');
|
|
145
|
+
}
|
|
146
|
+
// ...
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// UserController.ts
|
|
150
|
+
validateStatus(status: string) {
|
|
151
|
+
const valid = ['active', 'inactive', 'suspended'];
|
|
152
|
+
return valid.includes(status);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// UserRepository.ts
|
|
156
|
+
findByStatus(status: string) {
|
|
157
|
+
if (!['active', 'inactive', 'suspended'].includes(status)) {
|
|
158
|
+
throw new Error('Invalid status');
|
|
159
|
+
}
|
|
160
|
+
// ...
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// UserDTO.ts
|
|
164
|
+
class UserDTO {
|
|
165
|
+
status: 'active' | 'inactive' | 'suspended';
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// database/migrations/001_create_users.sql
|
|
169
|
+
CREATE TABLE users (
|
|
170
|
+
status VARCHAR(20) CHECK (status IN ('active', 'inactive', 'suspended'))
|
|
171
|
+
);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Impact
|
|
175
|
+
|
|
176
|
+
- High change cost
|
|
177
|
+
- Easy to miss updates
|
|
178
|
+
- Inconsistencies
|
|
179
|
+
- Brittle code
|
|
180
|
+
|
|
181
|
+
### Solution
|
|
182
|
+
|
|
183
|
+
Centralize related logic:
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
// Good: Centralized status management
|
|
187
|
+
|
|
188
|
+
// domain/UserStatus.ts
|
|
189
|
+
export enum UserStatus {
|
|
190
|
+
ACTIVE = 'active',
|
|
191
|
+
INACTIVE = 'inactive',
|
|
192
|
+
SUSPENDED = 'suspended'
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export class UserStatusManager {
|
|
196
|
+
private static readonly ALL_STATUSES = Object.values(UserStatus);
|
|
197
|
+
|
|
198
|
+
static isValid(status: string): boolean {
|
|
199
|
+
return this.ALL_STATUSES.includes(status as UserStatus);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
static getAllStatuses(): UserStatus[] {
|
|
203
|
+
return this.ALL_STATUSES;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
static canTransition(from: UserStatus, to: UserStatus): boolean {
|
|
207
|
+
const transitions = {
|
|
208
|
+
[UserStatus.ACTIVE]: [UserStatus.INACTIVE, UserStatus.SUSPENDED],
|
|
209
|
+
[UserStatus.INACTIVE]: [UserStatus.ACTIVE],
|
|
210
|
+
[UserStatus.SUSPENDED]: []
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
return transitions[from]?.includes(to) || false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Now components use centralized logic
|
|
218
|
+
// UserService.ts
|
|
219
|
+
async updateStatus(id: string, status: UserStatus) {
|
|
220
|
+
if (!UserStatusManager.isValid(status)) {
|
|
221
|
+
throw new Error('Invalid status');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const user = await this.userRepo.findById(id);
|
|
225
|
+
if (!UserStatusManager.canTransition(user.status, status)) {
|
|
226
|
+
throw new Error('Invalid status transition');
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
user.status = status;
|
|
230
|
+
await this.userRepo.save(user);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// UserController.ts
|
|
234
|
+
@Get('/statuses')
|
|
235
|
+
getStatuses() {
|
|
236
|
+
return UserStatusManager.getAllStatuses();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Adding new status: Change in ONE place (UserStatus enum)
|
|
240
|
+
```
|
|
241
|
+
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["design", "build"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Component Anti-Patterns: Feature Envy
|
|
6
|
+
|
|
7
|
+
## Feature Envy
|
|
8
|
+
|
|
9
|
+
### Problem
|
|
10
|
+
|
|
11
|
+
Method uses more features of another class than its own.
|
|
12
|
+
|
|
13
|
+
### Symptoms
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// Bad: OrderService envies Order data
|
|
17
|
+
class OrderService {
|
|
18
|
+
calculateShipping(order: Order): number {
|
|
19
|
+
let weight = 0;
|
|
20
|
+
for (const item of order.getItems()) {
|
|
21
|
+
weight += item.getWeight() * item.getQuantity();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const distance = this.calculateDistance(
|
|
25
|
+
order.getShippingAddress(),
|
|
26
|
+
order.getWarehouseAddress()
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
return weight * distance * 0.1;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
validateOrder(order: Order): boolean {
|
|
33
|
+
if (order.getItems().length === 0) return false;
|
|
34
|
+
|
|
35
|
+
for (const item of order.getItems()) {
|
|
36
|
+
if (item.getQuantity() <= 0) return false;
|
|
37
|
+
if (item.getPrice() < 0) return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (!order.getShippingAddress()) return false;
|
|
41
|
+
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Impact
|
|
48
|
+
|
|
49
|
+
- Logic in wrong place
|
|
50
|
+
- Tight coupling
|
|
51
|
+
- Duplicated logic
|
|
52
|
+
- Poor encapsulation
|
|
53
|
+
|
|
54
|
+
### Solution
|
|
55
|
+
|
|
56
|
+
Move logic to the class that owns the data:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// Good: Move logic to Order
|
|
60
|
+
class Order {
|
|
61
|
+
calculateShipping(): number {
|
|
62
|
+
const weight = this.calculateTotalWeight();
|
|
63
|
+
const distance = this.calculateShippingDistance();
|
|
64
|
+
return weight * distance * 0.1;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private calculateTotalWeight(): number {
|
|
68
|
+
return this.items.reduce(
|
|
69
|
+
(total, item) => total + (item.weight * item.quantity),
|
|
70
|
+
0
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private calculateShippingDistance(): number {
|
|
75
|
+
return this.calculateDistance(
|
|
76
|
+
this.shippingAddress,
|
|
77
|
+
this.warehouseAddress
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
validate(): boolean {
|
|
82
|
+
if (this.items.length === 0) return false;
|
|
83
|
+
|
|
84
|
+
for (const item of this.items) {
|
|
85
|
+
if (!item.isValid()) return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!this.shippingAddress) return false;
|
|
89
|
+
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
class OrderItem {
|
|
95
|
+
isValid(): boolean {
|
|
96
|
+
return this.quantity > 0 && this.price >= 0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Service is now thin
|
|
101
|
+
class OrderService {
|
|
102
|
+
async createOrder(data: OrderData): Promise<Order> {
|
|
103
|
+
const order = Order.create(data);
|
|
104
|
+
|
|
105
|
+
if (!order.validate()) {
|
|
106
|
+
throw new Error('Invalid order');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const shipping = order.calculateShipping();
|
|
110
|
+
|
|
111
|
+
await this.orderRepo.save(order);
|
|
112
|
+
return order;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Best Practices to Avoid Anti-Patterns
|
|
118
|
+
|
|
119
|
+
### 1. Single Responsibility Principle
|
|
120
|
+
|
|
121
|
+
Each component should have one reason to change.
|
|
122
|
+
|
|
123
|
+
### 2. Keep Components Small
|
|
124
|
+
|
|
125
|
+
If a class has more than 200-300 lines, consider splitting it.
|
|
126
|
+
|
|
127
|
+
### 3. Prefer Composition
|
|
128
|
+
|
|
129
|
+
Build complex behavior from simple, focused components.
|
|
130
|
+
|
|
131
|
+
### 4. Test Driven Development
|
|
132
|
+
|
|
133
|
+
Tests expose design problems early.
|
|
134
|
+
|
|
135
|
+
### 5. Code Reviews
|
|
136
|
+
|
|
137
|
+
Another set of eyes catches anti-patterns.
|
|
138
|
+
|
|
139
|
+
### 6. Refactor Regularly
|
|
140
|
+
|
|
141
|
+
Don't let anti-patterns accumulate.
|
|
142
|
+
|
|
143
|
+
### 7. Use Static Analysis
|
|
144
|
+
|
|
145
|
+
Tools can detect many anti-patterns automatically:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# TypeScript
|
|
149
|
+
npx ts-unused-exports
|
|
150
|
+
|
|
151
|
+
# Circular dependencies
|
|
152
|
+
npx madge --circular src/
|
|
153
|
+
|
|
154
|
+
# Complexity
|
|
155
|
+
npx complexity-report
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 8. Document Architectural Decisions
|
|
159
|
+
|
|
160
|
+
Make design principles explicit in ADRs.
|
|
161
|
+
|
|
162
|
+
### 9. Pair Programming
|
|
163
|
+
|
|
164
|
+
Share knowledge and catch issues early.
|
|
165
|
+
|
|
166
|
+
### 10. Continuous Learning
|
|
167
|
+
|
|
168
|
+
Stay updated on design patterns and best practices.
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["design", "build"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Component Anti-Patterns: God Object
|
|
6
|
+
|
|
7
|
+
## God Object
|
|
8
|
+
|
|
9
|
+
### Problem
|
|
10
|
+
|
|
11
|
+
One object does too much, knows too much, or has too many responsibilities.
|
|
12
|
+
|
|
13
|
+
### Symptoms
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// Bad: God object
|
|
17
|
+
class ApplicationManager {
|
|
18
|
+
// Database operations
|
|
19
|
+
async saveUser(user: User) {}
|
|
20
|
+
async getUser(id: string) {}
|
|
21
|
+
|
|
22
|
+
// Payment processing
|
|
23
|
+
async processPayment(payment: Payment) {}
|
|
24
|
+
async refundPayment(id: string) {}
|
|
25
|
+
|
|
26
|
+
// Email sending
|
|
27
|
+
async sendWelcomeEmail(email: string) {}
|
|
28
|
+
async sendPasswordReset(email: string) {}
|
|
29
|
+
|
|
30
|
+
// Authentication
|
|
31
|
+
async login(email: string, password: string) {}
|
|
32
|
+
async logout(token: string) {}
|
|
33
|
+
|
|
34
|
+
// Logging
|
|
35
|
+
log(message: string) {}
|
|
36
|
+
logError(error: Error) {}
|
|
37
|
+
|
|
38
|
+
// Configuration
|
|
39
|
+
getConfig(key: string) {}
|
|
40
|
+
setConfig(key: string, value: any) {}
|
|
41
|
+
|
|
42
|
+
// File operations
|
|
43
|
+
uploadFile(file: File) {}
|
|
44
|
+
downloadFile(id: string) {}
|
|
45
|
+
|
|
46
|
+
// ... 50 more methods
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Impact
|
|
51
|
+
|
|
52
|
+
- Difficult to test
|
|
53
|
+
- Hard to maintain
|
|
54
|
+
- Impossible to understand
|
|
55
|
+
- High coupling
|
|
56
|
+
- Brittle (changes break everything)
|
|
57
|
+
|
|
58
|
+
### Solution
|
|
59
|
+
|
|
60
|
+
Split into focused, single-responsibility components:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// Good: Focused components
|
|
64
|
+
class UserRepository {
|
|
65
|
+
async save(user: User) {}
|
|
66
|
+
async findById(id: string) {}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
class PaymentService {
|
|
70
|
+
async process(payment: Payment) {}
|
|
71
|
+
async refund(id: string) {}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
class EmailService {
|
|
75
|
+
async sendWelcome(email: string) {}
|
|
76
|
+
async sendPasswordReset(email: string) {}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
class AuthService {
|
|
80
|
+
async login(email: string, password: string) {}
|
|
81
|
+
async logout(token: string) {}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
class Logger {
|
|
85
|
+
log(message: string) {}
|
|
86
|
+
error(error: Error) {}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
class ConfigService {
|
|
90
|
+
get(key: string) {}
|
|
91
|
+
set(key: string, value: any) {}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
class FileService {
|
|
95
|
+
async upload(file: File) {}
|
|
96
|
+
async download(id: string) {}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Anemic Domain Model
|
|
101
|
+
|
|
102
|
+
### Problem
|
|
103
|
+
|
|
104
|
+
Domain objects with no behavior, just getters and setters. All logic in services.
|
|
105
|
+
|
|
106
|
+
### Symptoms
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// Bad: Anemic model
|
|
110
|
+
class Order {
|
|
111
|
+
id: string;
|
|
112
|
+
items: OrderItem[];
|
|
113
|
+
status: string;
|
|
114
|
+
total: number;
|
|
115
|
+
|
|
116
|
+
// Only getters/setters, no behavior
|
|
117
|
+
getId(): string { return this.id; }
|
|
118
|
+
setId(id: string) { this.id = id; }
|
|
119
|
+
getItems(): OrderItem[] { return this.items; }
|
|
120
|
+
setItems(items: OrderItem[]) { this.items = items; }
|
|
121
|
+
// ... more getters/setters
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// All logic in service
|
|
125
|
+
class OrderService {
|
|
126
|
+
calculateTotal(order: Order): number {
|
|
127
|
+
let total = 0;
|
|
128
|
+
for (const item of order.getItems()) {
|
|
129
|
+
total += item.getPrice() * item.getQuantity();
|
|
130
|
+
}
|
|
131
|
+
order.setTotal(total);
|
|
132
|
+
return total;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
validateOrder(order: Order): boolean {
|
|
136
|
+
if (order.getItems().length === 0) return false;
|
|
137
|
+
if (order.getTotal() < 0) return false;
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
canCancel(order: Order): boolean {
|
|
142
|
+
return order.getStatus() === 'pending' ||
|
|
143
|
+
order.getStatus() === 'processing';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Impact
|
|
149
|
+
|
|
150
|
+
- Business logic scattered across services
|
|
151
|
+
- Difficult to maintain invariants
|
|
152
|
+
- Not object-oriented
|
|
153
|
+
- Hard to reason about
|
|
154
|
+
|
|
155
|
+
### Solution
|
|
156
|
+
|
|
157
|
+
Put behavior in domain objects:
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// Good: Rich domain model
|
|
161
|
+
class Order {
|
|
162
|
+
private constructor(
|
|
163
|
+
private id: string,
|
|
164
|
+
private items: OrderItem[],
|
|
165
|
+
private status: OrderStatus,
|
|
166
|
+
private total: number
|
|
167
|
+
) {
|
|
168
|
+
this.validateInvariants();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static create(items: OrderItem[]): Order {
|
|
172
|
+
if (items.length === 0) {
|
|
173
|
+
throw new Error('Order must have at least one item');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const total = items.reduce((sum, item) => sum + item.subtotal(), 0);
|
|
177
|
+
|
|
178
|
+
return new Order(
|
|
179
|
+
generateId(),
|
|
180
|
+
items,
|
|
181
|
+
OrderStatus.PENDING,
|
|
182
|
+
total
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Business logic in domain object
|
|
187
|
+
calculateTotal(): number {
|
|
188
|
+
return this.items.reduce((sum, item) => sum + item.subtotal(), 0);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
cancel(): void {
|
|
192
|
+
if (!this.canCancel()) {
|
|
193
|
+
throw new Error(`Cannot cancel order in ${this.status} status`);
|
|
194
|
+
}
|
|
195
|
+
this.status = OrderStatus.CANCELLED;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private canCancel(): boolean {
|
|
199
|
+
return this.status === OrderStatus.PENDING ||
|
|
200
|
+
this.status === OrderStatus.PROCESSING;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
addItem(item: OrderItem): void {
|
|
204
|
+
this.items.push(item);
|
|
205
|
+
this.total = this.calculateTotal();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private validateInvariants(): void {
|
|
209
|
+
if (this.items.length === 0) {
|
|
210
|
+
throw new Error('Order must have items');
|
|
211
|
+
}
|
|
212
|
+
if (this.total < 0) {
|
|
213
|
+
throw new Error('Order total cannot be negative');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Getters only, no setters
|
|
218
|
+
getId(): string { return this.id; }
|
|
219
|
+
getItems(): readonly OrderItem[] { return this.items; }
|
|
220
|
+
getStatus(): OrderStatus { return this.status; }
|
|
221
|
+
getTotal(): number { return this.total; }
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
enum OrderStatus {
|
|
225
|
+
PENDING = 'pending',
|
|
226
|
+
PROCESSING = 'processing',
|
|
227
|
+
SHIPPED = 'shipped',
|
|
228
|
+
DELIVERED = 'delivered',
|
|
229
|
+
CANCELLED = 'cancelled'
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Service is thin, delegates to domain
|
|
233
|
+
class OrderService {
|
|
234
|
+
async createOrder(items: OrderItem[]): Promise<Order> {
|
|
235
|
+
const order = Order.create(items); // Domain logic
|
|
236
|
+
await this.orderRepo.save(order);
|
|
237
|
+
return order;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async cancelOrder(orderId: string): Promise<void> {
|
|
241
|
+
const order = await this.orderRepo.findById(orderId);
|
|
242
|
+
order.cancel(); // Domain logic
|
|
243
|
+
await this.orderRepo.save(order);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|