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,348 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""archetypes_v11.py — Work-shape archetype detection + steering engine.
|
|
3
|
+
|
|
4
|
+
v11 reframes the crew workflow: instead of a fixed
|
|
5
|
+
clarify->design->build->test->review pipeline with a "rigor tier" dial,
|
|
6
|
+
each prompt is classified into one or more **work-shape archetypes**
|
|
7
|
+
(triage / explore / specify / decide / ship / review / incident /
|
|
8
|
+
build / migrate). Each archetype owns its own phase shape, produces,
|
|
9
|
+
HITL discipline, and cost band. Steering directives fire per archetype,
|
|
10
|
+
not per fixed-pipeline phase.
|
|
11
|
+
|
|
12
|
+
This is the v6.3 archetype-detect's spiritual successor — but v6.3
|
|
13
|
+
classified the *target kind* (code-repo / docs-only / config-infra /
|
|
14
|
+
multi-repo / etc.) and used it to pick gate thresholds. v11 classifies
|
|
15
|
+
the *work shape* and uses it to pick the entire workflow.
|
|
16
|
+
|
|
17
|
+
The two coexist during transition:
|
|
18
|
+
* scripts/crew/archetype_detect.py — v6.3 target-kind classifier,
|
|
19
|
+
consumed by gate-adjudicator.
|
|
20
|
+
* scripts/crew/archetypes_v11.py — v11 work-shape classifier,
|
|
21
|
+
consumed by steering-aware skills.
|
|
22
|
+
|
|
23
|
+
Stdlib-only. CLI shim at bottom of file.
|
|
24
|
+
|
|
25
|
+
Usage (library):
|
|
26
|
+
from archetypes_v11 import detect_archetypes, steering_directives
|
|
27
|
+
|
|
28
|
+
matches = detect_archetypes(
|
|
29
|
+
prompt="add caching to the dashboard",
|
|
30
|
+
signals={"complexity": 3, "blast_radius": "low"},
|
|
31
|
+
)
|
|
32
|
+
# matches -> [("build", 0.85, ["phrase: add"])]
|
|
33
|
+
|
|
34
|
+
directives = steering_directives(matches, signals)
|
|
35
|
+
# directives -> [{"archetype": "build", "phases": [...], "next_action": ...}]
|
|
36
|
+
|
|
37
|
+
Usage (CLI):
|
|
38
|
+
sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" \\
|
|
39
|
+
"${CLAUDE_PLUGIN_ROOT}/scripts/crew/archetypes_v11.py" \\
|
|
40
|
+
detect --prompt "add caching to the dashboard"
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
import argparse
|
|
46
|
+
import json
|
|
47
|
+
import re
|
|
48
|
+
import sys
|
|
49
|
+
from pathlib import Path
|
|
50
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
_THIS_DIR = Path(__file__).resolve().parent
|
|
54
|
+
_PLUGIN_ROOT = _THIS_DIR.parents[1]
|
|
55
|
+
_CATALOG_PATH = _PLUGIN_ROOT / ".claude-plugin" / "archetypes.json"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# Confidence thresholds — kept as named constants so callers can grep
|
|
59
|
+
# for the doctrine and tests can lock them.
|
|
60
|
+
HIGH_CONFIDENCE = 0.7
|
|
61
|
+
MEDIUM_CONFIDENCE = 0.5
|
|
62
|
+
LOW_CONFIDENCE = 0.3
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def load_catalog(path: Optional[Path] = None) -> Dict[str, Any]:
|
|
66
|
+
"""Return the archetype catalog dict. Raises FileNotFoundError when
|
|
67
|
+
the catalog isn't present — callers should not silently fall back."""
|
|
68
|
+
catalog_path = path or _CATALOG_PATH
|
|
69
|
+
return json.loads(catalog_path.read_text(encoding="utf-8"))
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _phrase_score(prompt_lower: str, phrases: List[str]) -> Tuple[float, List[str]]:
|
|
73
|
+
"""Score how strongly the prompt matches a phrase list.
|
|
74
|
+
|
|
75
|
+
First match scores 0.55 (above MEDIUM_CONFIDENCE so a single strong
|
|
76
|
+
keyword trips a directive). Each additional match adds 0.2 up to a
|
|
77
|
+
0.9 cap. Returns (score, hits) so the steering directive can name
|
|
78
|
+
the matched phrases.
|
|
79
|
+
|
|
80
|
+
Calibration rationale: archetype phrases are *category words* like
|
|
81
|
+
'implement' / 'outage' / 'migrate' — they are intentionally
|
|
82
|
+
high-signal. One should be enough to fire 'suggest' strength; two
|
|
83
|
+
should escalate to 'recommend'.
|
|
84
|
+
"""
|
|
85
|
+
hits: List[str] = []
|
|
86
|
+
for phrase in phrases:
|
|
87
|
+
# Word-boundary match for short phrases; substring for multi-word
|
|
88
|
+
# (multi-word phrases are inherently boundary-safe).
|
|
89
|
+
if " " in phrase:
|
|
90
|
+
if phrase in prompt_lower:
|
|
91
|
+
hits.append(phrase)
|
|
92
|
+
else:
|
|
93
|
+
pattern = re.compile(rf"\b{re.escape(phrase)}\b", re.IGNORECASE)
|
|
94
|
+
if pattern.search(prompt_lower):
|
|
95
|
+
hits.append(phrase)
|
|
96
|
+
if not hits:
|
|
97
|
+
return 0.0, []
|
|
98
|
+
score = 0.55 + 0.2 * (len(hits) - 1)
|
|
99
|
+
return min(score, 0.9), hits
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _signal_score(
|
|
103
|
+
archetype_signals: Dict[str, Any],
|
|
104
|
+
signals: Dict[str, Any],
|
|
105
|
+
) -> Tuple[float, List[str]]:
|
|
106
|
+
"""Score how the caller-provided signals agree with the archetype's
|
|
107
|
+
declared signals. Each agreement adds 0.3 capped at 0.9.
|
|
108
|
+
|
|
109
|
+
Recognized boolean signal flags (any subset is fine):
|
|
110
|
+
- novelty_high, blast_radius_high, ambiguity_high,
|
|
111
|
+
spec_ambiguity_high, scope_unclear, multiple_viable_options,
|
|
112
|
+
reversibility_medium_or_low, reversibility_low,
|
|
113
|
+
state_complexity_high, post_build, code_change,
|
|
114
|
+
production_impact, independent_assessment_needed.
|
|
115
|
+
|
|
116
|
+
Boolean True in the archetype declaration is a *requirement* —
|
|
117
|
+
if the caller didn't pass that signal it scores 0.
|
|
118
|
+
"""
|
|
119
|
+
hits: List[str] = []
|
|
120
|
+
score = 0.0
|
|
121
|
+
for key, declared in archetype_signals.items():
|
|
122
|
+
if key in ("phrases", "always_on"):
|
|
123
|
+
continue
|
|
124
|
+
if declared is True and signals.get(key) is True:
|
|
125
|
+
score += 0.3
|
|
126
|
+
hits.append(f"signal: {key}")
|
|
127
|
+
return min(score, 0.9), hits
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _detect_one_archetype(
|
|
131
|
+
name: str,
|
|
132
|
+
archetype: Dict[str, Any],
|
|
133
|
+
prompt_lower: str,
|
|
134
|
+
signals: Dict[str, Any],
|
|
135
|
+
) -> Tuple[float, List[str]]:
|
|
136
|
+
"""Score a single archetype against the prompt + signals.
|
|
137
|
+
|
|
138
|
+
Returns (combined_score, evidence). Combined score is the max of
|
|
139
|
+
phrase score and signal score plus 0.1 if both are non-zero
|
|
140
|
+
(concordance bonus), capped at 1.0.
|
|
141
|
+
"""
|
|
142
|
+
arch_signals = archetype.get("signals") or {}
|
|
143
|
+
if arch_signals.get("always_on"):
|
|
144
|
+
return 1.0, ["always_on"]
|
|
145
|
+
|
|
146
|
+
phrase_list = list(arch_signals.get("phrases") or [])
|
|
147
|
+
p_score, p_hits = _phrase_score(prompt_lower, phrase_list)
|
|
148
|
+
s_score, s_hits = _signal_score(arch_signals, signals)
|
|
149
|
+
|
|
150
|
+
if p_score == 0 and s_score == 0:
|
|
151
|
+
return 0.0, []
|
|
152
|
+
|
|
153
|
+
combined = max(p_score, s_score)
|
|
154
|
+
if p_score > 0 and s_score > 0:
|
|
155
|
+
combined = min(combined + 0.1, 1.0)
|
|
156
|
+
return combined, p_hits + s_hits
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def detect_archetypes(
|
|
160
|
+
prompt: str,
|
|
161
|
+
signals: Optional[Dict[str, Any]] = None,
|
|
162
|
+
*,
|
|
163
|
+
catalog: Optional[Dict[str, Any]] = None,
|
|
164
|
+
threshold: float = MEDIUM_CONFIDENCE,
|
|
165
|
+
) -> List[Tuple[str, float, List[str]]]:
|
|
166
|
+
"""Classify a prompt into one or more work-shape archetypes.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
prompt: User prompt or task description.
|
|
170
|
+
signals: Optional dict with the boolean signal flags listed in
|
|
171
|
+
``_signal_score``. Typically populated from the
|
|
172
|
+
propose-process 9-factor scoring or from runtime hooks.
|
|
173
|
+
catalog: Override catalog (testing).
|
|
174
|
+
threshold: Drop archetypes scoring below this. Default
|
|
175
|
+
MEDIUM_CONFIDENCE (0.5).
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
List of ``(archetype_name, score, evidence)`` tuples sorted by
|
|
179
|
+
score descending. Always includes ``triage`` at the end as the
|
|
180
|
+
fallback when no other archetype scores >= threshold.
|
|
181
|
+
|
|
182
|
+
The triage archetype is special: it is always present in the result
|
|
183
|
+
so callers always have a routing target. When triage is the only
|
|
184
|
+
item returned, the caller should ask a clarifying question rather
|
|
185
|
+
than dispatch.
|
|
186
|
+
"""
|
|
187
|
+
catalog = catalog or load_catalog()
|
|
188
|
+
archetypes = catalog.get("archetypes", {})
|
|
189
|
+
prompt_lower = (prompt or "").lower()
|
|
190
|
+
signals = signals or {}
|
|
191
|
+
|
|
192
|
+
matches: List[Tuple[str, float, List[str]]] = []
|
|
193
|
+
for name, archetype in archetypes.items():
|
|
194
|
+
if name == "triage":
|
|
195
|
+
continue # always-on; appended last
|
|
196
|
+
score, evidence = _detect_one_archetype(
|
|
197
|
+
name, archetype, prompt_lower, signals,
|
|
198
|
+
)
|
|
199
|
+
if score >= threshold:
|
|
200
|
+
matches.append((name, round(score, 3), evidence))
|
|
201
|
+
|
|
202
|
+
matches.sort(key=lambda m: m[1], reverse=True)
|
|
203
|
+
|
|
204
|
+
if not matches:
|
|
205
|
+
# No clear shape — return triage so caller knows to clarify
|
|
206
|
+
return [("triage", 1.0, ["no_other_archetype_above_threshold"])]
|
|
207
|
+
|
|
208
|
+
matches.append(("triage", 1.0, ["always_on"]))
|
|
209
|
+
return matches
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def steering_directives(
|
|
213
|
+
matches: List[Tuple[str, float, List[str]]],
|
|
214
|
+
signals: Optional[Dict[str, Any]] = None,
|
|
215
|
+
*,
|
|
216
|
+
catalog: Optional[Dict[str, Any]] = None,
|
|
217
|
+
) -> List[Dict[str, Any]]:
|
|
218
|
+
"""Turn a match list into actionable steering directives.
|
|
219
|
+
|
|
220
|
+
Each directive is a dict the caller emits as a system reminder,
|
|
221
|
+
a TaskCreate, or a hook output. Shape:
|
|
222
|
+
|
|
223
|
+
{
|
|
224
|
+
"archetype": "build",
|
|
225
|
+
"score": 0.85,
|
|
226
|
+
"evidence": ["phrase: add", "signal: code_change"],
|
|
227
|
+
"phases": ["plan", "implement", "test", "review"],
|
|
228
|
+
"produces": ["shipped-code", "test-report"],
|
|
229
|
+
"hitl": "discrete:review-gate",
|
|
230
|
+
"cost_band": "high",
|
|
231
|
+
"maturity": "research",
|
|
232
|
+
"next_action": "Run `wicked-garden:engineering:implement` ...",
|
|
233
|
+
"strength": "recommend" # suggest | recommend | require
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
Strength escalates with score:
|
|
237
|
+
score >= HIGH_CONFIDENCE -> "recommend"
|
|
238
|
+
score >= MEDIUM_CONFIDENCE -> "suggest"
|
|
239
|
+
else -> "suggest" (informational)
|
|
240
|
+
|
|
241
|
+
triage at the bottom of the match list adds an informational
|
|
242
|
+
directive only if it is the *sole* match (no clear shape detected).
|
|
243
|
+
"""
|
|
244
|
+
catalog = catalog or load_catalog()
|
|
245
|
+
archetypes = catalog.get("archetypes", {})
|
|
246
|
+
signals = signals or {}
|
|
247
|
+
sole_match = len(matches) == 1 and matches[0][0] == "triage"
|
|
248
|
+
|
|
249
|
+
directives: List[Dict[str, Any]] = []
|
|
250
|
+
for name, score, evidence in matches:
|
|
251
|
+
if name == "triage" and not sole_match:
|
|
252
|
+
continue
|
|
253
|
+
archetype = archetypes.get(name, {})
|
|
254
|
+
if score >= HIGH_CONFIDENCE:
|
|
255
|
+
strength = "recommend"
|
|
256
|
+
else:
|
|
257
|
+
strength = "suggest"
|
|
258
|
+
directives.append({
|
|
259
|
+
"archetype": name,
|
|
260
|
+
"score": score,
|
|
261
|
+
"evidence": evidence,
|
|
262
|
+
"phases": list(archetype.get("phases", [])),
|
|
263
|
+
"produces": list(archetype.get("produces", [])),
|
|
264
|
+
"hitl": archetype.get("hitl"),
|
|
265
|
+
"cost_band": archetype.get("cost_band"),
|
|
266
|
+
"maturity": archetype.get("maturity"),
|
|
267
|
+
"next_action": _next_action_for(name, archetype, signals),
|
|
268
|
+
"strength": strength,
|
|
269
|
+
})
|
|
270
|
+
return directives
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def _next_action_for(
|
|
274
|
+
name: str,
|
|
275
|
+
archetype: Dict[str, Any],
|
|
276
|
+
signals: Dict[str, Any],
|
|
277
|
+
) -> str:
|
|
278
|
+
"""Render the recommended next-action string for an archetype.
|
|
279
|
+
|
|
280
|
+
Kept centralized here so the wording is consistent across system
|
|
281
|
+
reminders, hook output, and CLI display.
|
|
282
|
+
"""
|
|
283
|
+
first_phase = (archetype.get("phases") or ["?"])[0]
|
|
284
|
+
return (
|
|
285
|
+
f"Enter '{name}' archetype at phase '{first_phase}'. "
|
|
286
|
+
f"Phases: {' -> '.join(archetype.get('phases', []))}. "
|
|
287
|
+
f"Produces: {', '.join(archetype.get('produces', []))}. "
|
|
288
|
+
f"HITL: {archetype.get('hitl', 'none')}."
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
# ---------------------------------------------------------------------------
|
|
293
|
+
# CLI
|
|
294
|
+
# ---------------------------------------------------------------------------
|
|
295
|
+
|
|
296
|
+
def _cli() -> None:
|
|
297
|
+
parser = argparse.ArgumentParser(
|
|
298
|
+
description="v11 work-shape archetype detector + steering engine."
|
|
299
|
+
)
|
|
300
|
+
sub = parser.add_subparsers(dest="action", required=True)
|
|
301
|
+
|
|
302
|
+
detect = sub.add_parser("detect", help="Detect archetypes from prompt + signals.")
|
|
303
|
+
detect.add_argument("--prompt", required=True)
|
|
304
|
+
detect.add_argument("--signals", default=None,
|
|
305
|
+
help="JSON object of boolean signal flags.")
|
|
306
|
+
detect.add_argument("--threshold", type=float, default=MEDIUM_CONFIDENCE)
|
|
307
|
+
detect.add_argument("--steering", action="store_true",
|
|
308
|
+
help="Also emit the per-archetype steering directives.")
|
|
309
|
+
|
|
310
|
+
catalog_cmd = sub.add_parser("catalog",
|
|
311
|
+
help="Print the archetype catalog as JSON.")
|
|
312
|
+
catalog_cmd.add_argument("--name", default=None,
|
|
313
|
+
help="Print only one archetype by name.")
|
|
314
|
+
|
|
315
|
+
args = parser.parse_args()
|
|
316
|
+
|
|
317
|
+
if args.action == "detect":
|
|
318
|
+
signals = json.loads(args.signals) if args.signals else {}
|
|
319
|
+
matches = detect_archetypes(args.prompt, signals,
|
|
320
|
+
threshold=args.threshold)
|
|
321
|
+
result: Dict[str, Any] = {
|
|
322
|
+
"matches": [
|
|
323
|
+
{"archetype": n, "score": s, "evidence": e}
|
|
324
|
+
for n, s, e in matches
|
|
325
|
+
]
|
|
326
|
+
}
|
|
327
|
+
if args.steering:
|
|
328
|
+
result["directives"] = steering_directives(matches, signals)
|
|
329
|
+
json.dump(result, sys.stdout, indent=2, default=str)
|
|
330
|
+
sys.stdout.write("\n")
|
|
331
|
+
return
|
|
332
|
+
|
|
333
|
+
if args.action == "catalog":
|
|
334
|
+
catalog = load_catalog()
|
|
335
|
+
if args.name:
|
|
336
|
+
archetype = catalog.get("archetypes", {}).get(args.name)
|
|
337
|
+
if archetype is None:
|
|
338
|
+
print(f"Unknown archetype: {args.name}", file=sys.stderr)
|
|
339
|
+
sys.exit(1)
|
|
340
|
+
json.dump({args.name: archetype}, sys.stdout, indent=2)
|
|
341
|
+
else:
|
|
342
|
+
json.dump(catalog, sys.stdout, indent=2)
|
|
343
|
+
sys.stdout.write("\n")
|
|
344
|
+
return
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
if __name__ == "__main__":
|
|
348
|
+
_cli()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""crew.detectors — steering detector registry.
|
|
2
|
+
|
|
3
|
+
PR-2 of the steering detector epic (#679) ships the first real detector:
|
|
4
|
+
``sensitive_path``. Each detector is a pure stdlib module that:
|
|
5
|
+
|
|
6
|
+
1. Takes some observed input (changed paths, gate verdicts, test results, ...)
|
|
7
|
+
2. Returns a list of payloads that conform to ``crew.steering_event_schema``
|
|
8
|
+
3. Optionally provides an emitter helper to push those payloads onto wicked-bus
|
|
9
|
+
|
|
10
|
+
Detectors and emitters are kept SEPARATE so that tests can validate payload
|
|
11
|
+
shape without touching the bus.
|
|
12
|
+
"""
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""flow_compiler.py — compile a garden archetype into a flow definition.
|
|
3
|
+
|
|
4
|
+
The §3.1 seam: garden owns the archetype catalog and emits a flow-definition
|
|
5
|
+
JSON that wicked-crew consumes. This module is the thin handoff contract —
|
|
6
|
+
it reads .claude-plugin/archetypes.json (phases, produces, hitl) plus the
|
|
7
|
+
hard-gate phase map and produces the flow-definition dict.
|
|
8
|
+
|
|
9
|
+
NOTE: `loom flow run` is RETIRED (ECOSYSTEM-RATIONALIZATION.md §5a Phase B).
|
|
10
|
+
Flow execution is now handled by wicked-crew. The flow-definition schema is
|
|
11
|
+
preserved so wicked-crew can consume it directly without a format migration.
|
|
12
|
+
|
|
13
|
+
Pure + deterministic: catalog in, dict out. The only I/O is reading the catalog.
|
|
14
|
+
|
|
15
|
+
Flow-definition shape (consumed by wicked-crew):
|
|
16
|
+
{
|
|
17
|
+
"flow_id": str,
|
|
18
|
+
"phases": [{ "name", "gate": "produces:<id>"|null, "hitl": str, "produces": [...] }],
|
|
19
|
+
"peers_required": [str],
|
|
20
|
+
"verifier_spec_ref": str|null,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
Translation rules (see the cutover plan's Ambiguities section):
|
|
24
|
+
- The catalog's `hitl` is archetype-level; the flow def needs it per-phase.
|
|
25
|
+
Every phase defaults to "none"; the archetype's gate discipline is attached
|
|
26
|
+
to its gate phase — the hard-gate phase from _HARD_GATE_PHASES when present,
|
|
27
|
+
else the last phase — verbatim (so "hard:cutover-gate" lands on "cutover").
|
|
28
|
+
- The last phase of a GATING archetype carries gate="produces:<first-produces>";
|
|
29
|
+
gateless archetypes (triage/explore) carry gate=null on every phase.
|
|
30
|
+
- peers_required = ["vault","testing"] iff produces includes "test-report",
|
|
31
|
+
else ["vault"]. verifier_spec_ref is null (wired later, spec §9 / #887).
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
import json
|
|
37
|
+
import os
|
|
38
|
+
import re
|
|
39
|
+
import sys
|
|
40
|
+
from pathlib import Path
|
|
41
|
+
from typing import Any, Dict, List, Optional
|
|
42
|
+
|
|
43
|
+
# scripts/crew/ is on sys.path; import the authoritative hard-gate map so the
|
|
44
|
+
# compiler and phase_manager agree by construction (the parity contract).
|
|
45
|
+
from phase_manager import _HARD_GATE_PHASES # noqa: E402
|
|
46
|
+
|
|
47
|
+
_FLOW_ID_RE = re.compile(r"^[A-Za-z0-9_-]{1,64}$")
|
|
48
|
+
# Archetypes whose `hitl` is "continuous"/"none" do not produce a re-derivable
|
|
49
|
+
# gated artifact -> the flow is gateless (no per-phase produces gate).
|
|
50
|
+
_GATELESS_HITL = ("none", "continuous")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _catalog_path() -> Path:
|
|
54
|
+
"""Resolve .claude-plugin/archetypes.json relative to the repo root."""
|
|
55
|
+
root = Path(os.environ["CLAUDE_PLUGIN_ROOT"]) if os.environ.get("CLAUDE_PLUGIN_ROOT") \
|
|
56
|
+
else Path(__file__).resolve().parents[2]
|
|
57
|
+
return root / ".claude-plugin" / "archetypes.json"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _load_catalog() -> Dict[str, Any]:
|
|
61
|
+
return json.loads(_catalog_path().read_text(encoding="utf-8")).get("archetypes", {})
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _hard_phase_for(archetype: str) -> Optional[str]:
|
|
65
|
+
"""The single hard-gate phase for an archetype, or None."""
|
|
66
|
+
pair = _HARD_GATE_PHASES.get(archetype, ())
|
|
67
|
+
return pair[0] if pair else None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def compile_flow(archetype: str, *, flow_id: str,
|
|
71
|
+
catalog: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
72
|
+
"""Compile one archetype into a loom flow definition (a JSON-able dict)."""
|
|
73
|
+
if not isinstance(flow_id, str) or not _FLOW_ID_RE.match(flow_id):
|
|
74
|
+
raise ValueError(f"unsafe flow_id: {flow_id!r} (kebab/snake/alnum, max 64)")
|
|
75
|
+
|
|
76
|
+
cat = catalog if catalog is not None else _load_catalog()
|
|
77
|
+
arch = cat.get(archetype)
|
|
78
|
+
if not arch:
|
|
79
|
+
raise ValueError(f"unknown archetype: {archetype!r} (known: {sorted(cat)})")
|
|
80
|
+
|
|
81
|
+
phase_names: List[str] = list(arch.get("phases", []))
|
|
82
|
+
produces: List[str] = list(arch.get("produces", []))
|
|
83
|
+
hitl: str = arch.get("hitl", "none")
|
|
84
|
+
gateless = hitl in _GATELESS_HITL or not phase_names
|
|
85
|
+
|
|
86
|
+
hard_phase = _hard_phase_for(archetype)
|
|
87
|
+
# The gate phase: the hard-gate phase if declared, else the last phase.
|
|
88
|
+
gate_phase = hard_phase if hard_phase in phase_names else (
|
|
89
|
+
phase_names[-1] if phase_names else None)
|
|
90
|
+
|
|
91
|
+
first_produces = produces[0] if produces else None
|
|
92
|
+
|
|
93
|
+
phases: List[Dict[str, Any]] = []
|
|
94
|
+
for name in phase_names:
|
|
95
|
+
is_gate_phase = (name == gate_phase) and not gateless
|
|
96
|
+
phases.append({
|
|
97
|
+
"name": name,
|
|
98
|
+
"gate": f"produces:{first_produces}" if (is_gate_phase and first_produces) else None,
|
|
99
|
+
"hitl": hitl if (name == gate_phase and not gateless) else "none",
|
|
100
|
+
"produces": list(produces) if is_gate_phase else [],
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
peers = ["vault", "testing"] if "test-report" in produces else ["vault"]
|
|
104
|
+
return {
|
|
105
|
+
"flow_id": flow_id,
|
|
106
|
+
"phases": phases,
|
|
107
|
+
"peers_required": peers,
|
|
108
|
+
"verifier_spec_ref": None,
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
__all__ = ["compile_flow"]
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
if __name__ == "__main__":
|
|
116
|
+
import argparse
|
|
117
|
+
parser = argparse.ArgumentParser(description="Compile an archetype to a loom flow definition.")
|
|
118
|
+
parser.add_argument("archetype")
|
|
119
|
+
parser.add_argument("--flow-id", required=True)
|
|
120
|
+
a = parser.parse_args()
|
|
121
|
+
print(json.dumps(compile_flow(a.archetype, flow_id=a.flow_id), indent=2))
|