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,322 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
TaskCompleted hook — wicked-garden memory capture on task completion.
|
|
4
|
+
|
|
5
|
+
Fires when Claude Code marks a task as completed (TaskCompleted event).
|
|
6
|
+
This hook does NOT use matchers — it fires for all task completions.
|
|
7
|
+
|
|
8
|
+
Responsibilities:
|
|
9
|
+
1. Increment memory_compliance_tasks_completed in session state.
|
|
10
|
+
2. For any deliverable-producing task, emit a systemMessage directive
|
|
11
|
+
asking Claude to evaluate the completed task for storable learnings.
|
|
12
|
+
Uses stronger language when memory_compliance_required (crew project).
|
|
13
|
+
|
|
14
|
+
Always returns {"ok": true} — task completion is never blocked.
|
|
15
|
+
Wraps all logic in try/except and fails open.
|
|
16
|
+
|
|
17
|
+
Input schema (from Claude Code):
|
|
18
|
+
{"task_id": "...", "subject": "...", "status": "completed"}
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import sys
|
|
24
|
+
import time
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
|
|
27
|
+
# Add shared scripts directory to path
|
|
28
|
+
_PLUGIN_ROOT = Path(os.environ.get("CLAUDE_PLUGIN_ROOT", Path(__file__).resolve().parents[2]))
|
|
29
|
+
sys.path.insert(0, str(_PLUGIN_ROOT / "scripts"))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# ---------------------------------------------------------------------------
|
|
33
|
+
# Ops logger wrapper — fail-silent, never crashes the hook
|
|
34
|
+
# ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
# R4-suppressed by design: _logger is optional; the hook must never crash if
|
|
37
|
+
# ops logging is unavailable. We do not surface the exception because this
|
|
38
|
+
# runs on every task completion — a stderr dump would spam normal workflows.
|
|
39
|
+
def _log(domain, level, event, ok=True, ms=None, detail=None):
|
|
40
|
+
"""Ops logger — fail-silent, never crashes the hook."""
|
|
41
|
+
try:
|
|
42
|
+
from _logger import log
|
|
43
|
+
log(domain, level, event, ok=ok, ms=ms, detail=detail)
|
|
44
|
+
except Exception: # noqa: BLE001 — intentional swallow, see comment above
|
|
45
|
+
return
|
|
46
|
+
|
|
47
|
+
# Escalation threshold — after this many consecutive completed tasks without
|
|
48
|
+
# a wicked-brain:memory call, the memory directive switches to [ESCALATION]
|
|
49
|
+
# language. Named per R3 (no magic numbers); historical value = 3.
|
|
50
|
+
_ESCALATION_THRESHOLD = 3
|
|
51
|
+
|
|
52
|
+
# Keywords that suggest a deliverable-producing task
|
|
53
|
+
_DELIVERABLE_PATTERNS = (
|
|
54
|
+
"phase:",
|
|
55
|
+
"implement",
|
|
56
|
+
"write",
|
|
57
|
+
"design",
|
|
58
|
+
"build",
|
|
59
|
+
"create",
|
|
60
|
+
"develop",
|
|
61
|
+
"refactor",
|
|
62
|
+
"migrate",
|
|
63
|
+
"fix",
|
|
64
|
+
"resolve",
|
|
65
|
+
"deploy",
|
|
66
|
+
"integrate",
|
|
67
|
+
"add",
|
|
68
|
+
"update",
|
|
69
|
+
"test",
|
|
70
|
+
"review",
|
|
71
|
+
"document",
|
|
72
|
+
"configure",
|
|
73
|
+
"setup",
|
|
74
|
+
"scaffold",
|
|
75
|
+
"generate",
|
|
76
|
+
"analyze",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _is_deliverable_task(subject: str) -> bool:
|
|
81
|
+
"""Return True if the task subject suggests it produced a deliverable."""
|
|
82
|
+
subject_lower = subject.lower()
|
|
83
|
+
return any(kw in subject_lower for kw in _DELIVERABLE_PATTERNS)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _infer_mem_type(subject: str) -> str:
|
|
87
|
+
"""Infer the most appropriate wicked-brain:memory type from task subject."""
|
|
88
|
+
s = subject.lower()
|
|
89
|
+
if any(kw in s for kw in ("fix", "resolve", "bug", "defect")):
|
|
90
|
+
return "decision"
|
|
91
|
+
if any(kw in s for kw in ("phase:", "design", "architect", "strategy")):
|
|
92
|
+
return "episodic"
|
|
93
|
+
return "procedural"
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# Issue #572: event_type + verdict constants used by the re-eval debounce rule.
|
|
97
|
+
# Re-eval is meaningful ONLY on phase boundaries or rejected gates — every other
|
|
98
|
+
# completion is bus noise that wakes the facilitator for nothing.
|
|
99
|
+
EVENT_TYPE_PHASE_TRANSITION = "phase-transition"
|
|
100
|
+
EVENT_TYPE_GATE_FINDING = "gate-finding"
|
|
101
|
+
VERDICT_REJECT = "REJECT"
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _read_task_metadata(session_id: str, task_id: str) -> "dict | None":
|
|
105
|
+
"""Read ``metadata`` dict from the native task JSON file (or daemon projection).
|
|
106
|
+
|
|
107
|
+
Fail-open: returns None on any error. Routing is delegated to
|
|
108
|
+
scripts/crew/_task_reader.py per #596 v8-PR-2.
|
|
109
|
+
|
|
110
|
+
WG_DAEMON_ENABLED=false (default): direct file read, bit-identical to pre-PR-2.
|
|
111
|
+
WG_DAEMON_ENABLED=true: daemon HTTP with fallback.
|
|
112
|
+
WG_DAEMON_ENABLED=always: daemon HTTP only.
|
|
113
|
+
"""
|
|
114
|
+
if not session_id or not task_id:
|
|
115
|
+
return None
|
|
116
|
+
try:
|
|
117
|
+
from crew._task_reader import get_task_metadata # type: ignore[import]
|
|
118
|
+
return get_task_metadata(session_id, task_id)
|
|
119
|
+
except Exception:
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _should_trigger_reeval(metadata: "dict | None") -> "tuple[bool, str]":
|
|
124
|
+
"""Return (should_trigger, reason) for the facilitator re-eval signal.
|
|
125
|
+
|
|
126
|
+
Issue #572: only phase boundaries and gate rejections should wake the
|
|
127
|
+
facilitator. All other completions (shell gate ACKs, plain tasks,
|
|
128
|
+
coding-tasks, etc.) are noise that accumulated 41k+ events.
|
|
129
|
+
|
|
130
|
+
Rule:
|
|
131
|
+
event_type == phase-transition -> trigger
|
|
132
|
+
event_type == gate-finding AND verdict == REJECT -> trigger
|
|
133
|
+
anything else (including APPROVE/CONDITIONAL, plain task) -> skip
|
|
134
|
+
|
|
135
|
+
Fail-open: missing metadata returns (False, "no_metadata"). The flag is
|
|
136
|
+
NEVER set when the task file can't be read — the old "chain_id truthy =
|
|
137
|
+
trigger" behaviour is the exact bug this closes.
|
|
138
|
+
"""
|
|
139
|
+
if not metadata:
|
|
140
|
+
return (False, "no_metadata")
|
|
141
|
+
event_type = metadata.get("event_type")
|
|
142
|
+
if event_type == EVENT_TYPE_PHASE_TRANSITION:
|
|
143
|
+
return (True, "phase_transition")
|
|
144
|
+
if event_type == EVENT_TYPE_GATE_FINDING:
|
|
145
|
+
verdict = metadata.get("verdict")
|
|
146
|
+
if verdict == VERDICT_REJECT:
|
|
147
|
+
return (True, "gate_reject")
|
|
148
|
+
return (False, f"gate_verdict_{verdict or 'missing'}")
|
|
149
|
+
return (False, f"event_type_{event_type or 'missing'}")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _update_session_state(
|
|
153
|
+
*,
|
|
154
|
+
chain_id: str | None,
|
|
155
|
+
event_type: str | None,
|
|
156
|
+
should_reeval: bool,
|
|
157
|
+
reeval_reason: str,
|
|
158
|
+
) -> tuple[bool, int]:
|
|
159
|
+
"""Mutate SessionState for the completed task.
|
|
160
|
+
|
|
161
|
+
Increments memory-compliance counters, sets the debounced re-eval flag
|
|
162
|
+
(Issue #572), and sets the phase-start-gate flag on phase-transition
|
|
163
|
+
events. Returns ``(compliance_required, escalations)`` for the caller's
|
|
164
|
+
memory-directive branch.
|
|
165
|
+
|
|
166
|
+
Fail-open: any exception returns ``(False, 0)`` and logs to stderr so
|
|
167
|
+
the hook never blocks task completion.
|
|
168
|
+
"""
|
|
169
|
+
try:
|
|
170
|
+
from _session import SessionState
|
|
171
|
+
state = SessionState.load()
|
|
172
|
+
state.memory_compliance_tasks_completed = (
|
|
173
|
+
(state.memory_compliance_tasks_completed or 0) + 1
|
|
174
|
+
)
|
|
175
|
+
compliance_required = bool(state.memory_compliance_required)
|
|
176
|
+
state.memory_compliance_escalations = (
|
|
177
|
+
(state.memory_compliance_escalations or 0) + 1
|
|
178
|
+
)
|
|
179
|
+
escalations = state.memory_compliance_escalations
|
|
180
|
+
|
|
181
|
+
# v11: facilitator re-evaluation signal removed. The v6 re-eval
|
|
182
|
+
# mechanism was tied to the universal pipeline (propose-process
|
|
183
|
+
# facilitator rubric). v11 archetypes own their own re-evaluation
|
|
184
|
+
# cadence via the playbook's checkpoint phases. Telemetry-only
|
|
185
|
+
# logging preserved so we can detect if the producer fires
|
|
186
|
+
# against the now-deleted consumers.
|
|
187
|
+
_log("task", "debug", "reeval.skipped.v11", detail={
|
|
188
|
+
"reason": reeval_reason,
|
|
189
|
+
"event_type": event_type,
|
|
190
|
+
"chain_id": chain_id,
|
|
191
|
+
"would_have_reeval": bool(should_reeval and chain_id),
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
state.save()
|
|
195
|
+
return compliance_required, escalations
|
|
196
|
+
except Exception as exc:
|
|
197
|
+
print(
|
|
198
|
+
f"[wicked-garden] task_completed session state error: {exc}",
|
|
199
|
+
file=sys.stderr,
|
|
200
|
+
)
|
|
201
|
+
return False, 0
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def main():
|
|
205
|
+
_t0 = time.monotonic()
|
|
206
|
+
|
|
207
|
+
# Read task data from stdin
|
|
208
|
+
try:
|
|
209
|
+
raw = sys.stdin.read()
|
|
210
|
+
input_data = json.loads(raw) if raw.strip() else {}
|
|
211
|
+
except Exception:
|
|
212
|
+
input_data = {}
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
subject = input_data.get("subject", "")
|
|
216
|
+
task_id = input_data.get("task_id", "")
|
|
217
|
+
session_id = input_data.get("session_id", os.environ.get("CLAUDE_SESSION_ID", ""))
|
|
218
|
+
|
|
219
|
+
_log("task", "debug", "hook.start")
|
|
220
|
+
|
|
221
|
+
# Issue #572: load metadata ONCE and derive all downstream signals from
|
|
222
|
+
# it. The old code read the task file twice (chain_id, then event_type
|
|
223
|
+
# in a nested try block) and set facilitator_reeval_due on any truthy
|
|
224
|
+
# chain_id — including gate-finding shell completions the orchestrator
|
|
225
|
+
# just acked. Debounce is now: phase-transition OR (gate-finding AND
|
|
226
|
+
# verdict=REJECT).
|
|
227
|
+
metadata = _read_task_metadata(session_id, task_id) or {}
|
|
228
|
+
chain_id_val = metadata.get("chain_id") if isinstance(metadata, dict) else None
|
|
229
|
+
chain_id = chain_id_val if isinstance(chain_id_val, str) and chain_id_val.strip() else None
|
|
230
|
+
event_type = metadata.get("event_type") if isinstance(metadata, dict) else None
|
|
231
|
+
|
|
232
|
+
should_reeval, reeval_reason = _should_trigger_reeval(metadata)
|
|
233
|
+
compliance_required, escalations = _update_session_state(
|
|
234
|
+
chain_id=chain_id,
|
|
235
|
+
event_type=event_type,
|
|
236
|
+
should_reeval=should_reeval,
|
|
237
|
+
reeval_reason=reeval_reason,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# Emit a memory directive for any deliverable-producing task.
|
|
241
|
+
# Crew projects get stronger "REQUIRED" language; normal sessions
|
|
242
|
+
# get a lighter nudge so memories still get captured.
|
|
243
|
+
system_message = ""
|
|
244
|
+
if subject and _is_deliverable_task(subject):
|
|
245
|
+
mem_type = _infer_mem_type(subject)
|
|
246
|
+
task_label = f'"{subject}"' if subject else f"task {task_id}"
|
|
247
|
+
if compliance_required:
|
|
248
|
+
escalation_prefix = (
|
|
249
|
+
"[ESCALATION] " if escalations >= _ESCALATION_THRESHOLD else ""
|
|
250
|
+
)
|
|
251
|
+
system_message = (
|
|
252
|
+
f"{escalation_prefix}[Memory] Task {task_label} completed. "
|
|
253
|
+
f"REQUIRED: Call wicked-brain:memory with type={mem_type} "
|
|
254
|
+
"to capture any decision, gotcha, or pattern from this work. "
|
|
255
|
+
"If genuinely nothing is worth storing, respond with 'No memory stored: <reason>'."
|
|
256
|
+
)
|
|
257
|
+
else:
|
|
258
|
+
system_message = (
|
|
259
|
+
f"[Memory] Task {task_label} completed. "
|
|
260
|
+
"If this produced a decision, gotcha, or reusable pattern, "
|
|
261
|
+
f"store it with wicked-brain:memory (type={mem_type})."
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# Evidence nudge for crew tasks (Issue #253).
|
|
265
|
+
# Remind agents to include structured evidence in TaskUpdate descriptions.
|
|
266
|
+
if compliance_required and subject and _is_deliverable_task(subject):
|
|
267
|
+
evidence_nudge = (
|
|
268
|
+
" [Evidence] Ensure your TaskUpdate description includes structured evidence: "
|
|
269
|
+
"test results (PASS/FAIL), files modified/created, and verification steps. "
|
|
270
|
+
"Phase approval validates evidence at complexity >= 3."
|
|
271
|
+
)
|
|
272
|
+
system_message = (system_message or "") + evidence_nudge
|
|
273
|
+
|
|
274
|
+
# Claim sentinel — a completed deliverable task is the in-session "done"
|
|
275
|
+
# moment. Two invariants, both answer-tier, both observed-state (never a
|
|
276
|
+
# guess): (1) does a re-derived verdict cover HEAD? (2) is the recorded
|
|
277
|
+
# testing evidence fresher than the modified source? Fail-open.
|
|
278
|
+
if subject and _is_deliverable_task(subject):
|
|
279
|
+
try:
|
|
280
|
+
sentinel_dir = str(_PLUGIN_ROOT / "scripts" / "sentinel")
|
|
281
|
+
if sentinel_dir not in sys.path:
|
|
282
|
+
sys.path.insert(0, sentinel_dir)
|
|
283
|
+
from invariants import ( # type: ignore
|
|
284
|
+
check_evidence_freshness, log_sentinel_event, render,
|
|
285
|
+
repo_toplevel, verdict_for,
|
|
286
|
+
)
|
|
287
|
+
repo = repo_toplevel()
|
|
288
|
+
if repo is not None:
|
|
289
|
+
if verdict_for(repo) is None:
|
|
290
|
+
violation = {
|
|
291
|
+
"tier": "answer",
|
|
292
|
+
"invariant": "done-claim-verdict",
|
|
293
|
+
"evidence": (f'task "{subject}" completed with no re-derived '
|
|
294
|
+
"verdict covering HEAD"),
|
|
295
|
+
"action": ("Run `/wicked-garden:prove` to re-derive the claim, "
|
|
296
|
+
"or state the override reason — this completion is "
|
|
297
|
+
"logged either way."),
|
|
298
|
+
}
|
|
299
|
+
log_sentinel_event(repo, "unverified_task_done",
|
|
300
|
+
{"task": subject,
|
|
301
|
+
"invariant": "done-claim-verdict"})
|
|
302
|
+
system_message = ((system_message + "\n") if system_message else "") + render(violation)
|
|
303
|
+
stale = check_evidence_freshness(repo)
|
|
304
|
+
if stale:
|
|
305
|
+
system_message = ((system_message + "\n") if system_message else "") + render(stale)
|
|
306
|
+
except Exception: # noqa: BLE001 — the sentinel never breaks the hook
|
|
307
|
+
pass
|
|
308
|
+
|
|
309
|
+
output: dict = {"ok": True}
|
|
310
|
+
if system_message:
|
|
311
|
+
output["systemMessage"] = system_message
|
|
312
|
+
|
|
313
|
+
_log("task", "debug", "hook.end", ms=int((time.monotonic() - _t0) * 1000))
|
|
314
|
+
print(json.dumps(output))
|
|
315
|
+
|
|
316
|
+
except Exception as e:
|
|
317
|
+
print(f"[wicked-garden] task_completed hook error: {e}", file=sys.stderr)
|
|
318
|
+
print(json.dumps({"ok": True}))
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
if __name__ == "__main__":
|
|
322
|
+
main()
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""worktree_guard.py — prevent the agent-worktree cwd leak (issue #878).
|
|
3
|
+
|
|
4
|
+
When a subagent runs with ``isolation: worktree``, the Bash tool's persistent
|
|
5
|
+
cwd can drift back to the MAIN repo checkout between calls. Commits then land
|
|
6
|
+
on the agent's branch but in the main worktree — silently defeating isolation.
|
|
7
|
+
The only post-hoc tell is an unexpected entry in ``git worktree list``.
|
|
8
|
+
|
|
9
|
+
This guard is invoked from ``pre_tool.py``'s Bash handler. Given the command
|
|
10
|
+
and the PreToolUse payload ``cwd``, it returns one of:
|
|
11
|
+
|
|
12
|
+
* ``None`` — not a worktree agent / no-op
|
|
13
|
+
* ``{"action": "rewrite", "command": ...}`` — anchor execution in the worktree
|
|
14
|
+
* ``{"action": "deny", "reason": ...}`` — command explicitly targets main repo
|
|
15
|
+
|
|
16
|
+
The rewrite prepends ``cd <worktree-root> &&`` so persistent-cwd state cannot
|
|
17
|
+
drag a later call into the wrong directory. Claude Code honors ``updatedInput``
|
|
18
|
+
for PreToolUse Bash hooks, so the rewrite takes effect transparently.
|
|
19
|
+
|
|
20
|
+
Contract: **pure and fail-open** — stdlib only, no raises escape ``evaluate``;
|
|
21
|
+
any internal error returns ``None`` so the guard can never break an agent run.
|
|
22
|
+
Main-repo path is derived generally via ``git rev-parse --git-common-dir`` —
|
|
23
|
+
nothing about any specific repo is hardcoded.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import os
|
|
29
|
+
import re
|
|
30
|
+
import shlex
|
|
31
|
+
import subprocess
|
|
32
|
+
|
|
33
|
+
# Signature of an isolated agent worktree: <main>/.claude/worktrees/agent-<id>.
|
|
34
|
+
# Captures everything up to and including the agent-<id> segment, so a cwd that
|
|
35
|
+
# is a deeper subdirectory of the worktree still resolves to the worktree root.
|
|
36
|
+
_WORKTREE_SIG = re.compile(r"^(.*/\.claude/worktrees/agent-[^/]+)")
|
|
37
|
+
|
|
38
|
+
# `-C <path>` arguments (git, make, etc.) and a leading `cd <path>`.
|
|
39
|
+
_DASH_C = re.compile(r"(?:^|\s)-C\s+(\S+)")
|
|
40
|
+
_LEADING_CD = re.compile(r"^\s*cd\s+(\S+)")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def worktree_root(cwd: "str | None") -> "str | None":
|
|
44
|
+
"""Return the agent-worktree root if ``cwd`` is inside one, else ``None``."""
|
|
45
|
+
if not cwd:
|
|
46
|
+
return None
|
|
47
|
+
m = _WORKTREE_SIG.match(cwd)
|
|
48
|
+
return m.group(1) if m else None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _main_repo_root(cwd: str) -> "str | None":
|
|
52
|
+
"""Best-effort main-repo root via ``git rev-parse --git-common-dir``.
|
|
53
|
+
|
|
54
|
+
From inside a linked worktree the common dir is the MAIN repo's ``.git``;
|
|
55
|
+
its parent is the main repo root. Returns ``None`` on any failure — callers
|
|
56
|
+
must treat an unknown main root as "cannot prove a main-repo reference".
|
|
57
|
+
"""
|
|
58
|
+
try:
|
|
59
|
+
out = subprocess.run(
|
|
60
|
+
["git", "rev-parse", "--git-common-dir"],
|
|
61
|
+
cwd=cwd,
|
|
62
|
+
capture_output=True,
|
|
63
|
+
text=True,
|
|
64
|
+
timeout=2,
|
|
65
|
+
)
|
|
66
|
+
if out.returncode != 0:
|
|
67
|
+
return None
|
|
68
|
+
common = out.stdout.strip()
|
|
69
|
+
if not common:
|
|
70
|
+
return None
|
|
71
|
+
if not os.path.isabs(common):
|
|
72
|
+
common = os.path.abspath(os.path.join(cwd, common))
|
|
73
|
+
# common dir is typically ``<main>/.git`` — main root is its parent.
|
|
74
|
+
if os.path.basename(common) == ".git":
|
|
75
|
+
common = os.path.dirname(common)
|
|
76
|
+
return os.path.normpath(common)
|
|
77
|
+
except Exception:
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _norm(path: str, base: str) -> str:
|
|
82
|
+
"""Normalize ``path`` to an absolute path, resolving relatives against ``base``."""
|
|
83
|
+
path = path.strip().strip('"').strip("'")
|
|
84
|
+
if not os.path.isabs(path):
|
|
85
|
+
path = os.path.join(base, path)
|
|
86
|
+
return os.path.normpath(path)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _references_main_repo(command: str, main_root: "str | None", wt_root: str) -> bool:
|
|
90
|
+
"""True if ``command`` explicitly targets the main repo root (not the worktree).
|
|
91
|
+
|
|
92
|
+
Compares normalized *full paths* for equality rather than substring matching,
|
|
93
|
+
because the main repo root is a path *prefix* of the worktree root — a naive
|
|
94
|
+
substring check would flag every command.
|
|
95
|
+
"""
|
|
96
|
+
if not main_root or main_root == wt_root:
|
|
97
|
+
return False
|
|
98
|
+
candidates = list(_DASH_C.findall(command))
|
|
99
|
+
lead = _LEADING_CD.match(command)
|
|
100
|
+
if lead:
|
|
101
|
+
candidates.append(lead.group(1))
|
|
102
|
+
main_norm = os.path.normpath(main_root)
|
|
103
|
+
for c in candidates:
|
|
104
|
+
if _norm(c, wt_root) == main_norm:
|
|
105
|
+
return True
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _anchor_prefix(wt_root: str) -> str:
|
|
110
|
+
"""The ``cd <worktree> && `` prefix, with the path safely shell-quoted."""
|
|
111
|
+
return f"cd {shlex.quote(wt_root)} && "
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def evaluate(command: "str | None", cwd: "str | None") -> "dict | None":
|
|
115
|
+
"""Decide what to do with a Bash ``command`` given the PreToolUse ``cwd``.
|
|
116
|
+
|
|
117
|
+
Returns a decision dict (``rewrite`` / ``deny``) or ``None`` for a no-op.
|
|
118
|
+
Never raises — fail-open is the contract.
|
|
119
|
+
"""
|
|
120
|
+
try:
|
|
121
|
+
if not command or not command.strip():
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
wt_root = worktree_root(cwd)
|
|
125
|
+
if not wt_root or not cwd:
|
|
126
|
+
return None # normal session — the guard does not engage
|
|
127
|
+
|
|
128
|
+
main_root = _main_repo_root(cwd)
|
|
129
|
+
if _references_main_repo(command, main_root, wt_root):
|
|
130
|
+
return {
|
|
131
|
+
"action": "deny",
|
|
132
|
+
"reason": (
|
|
133
|
+
"[wicked-garden] worktree guard: this command targets the "
|
|
134
|
+
f"main repo ({main_root}) from inside an isolated worktree "
|
|
135
|
+
f"({wt_root}). Running it there would defeat worktree "
|
|
136
|
+
"isolation — changes/commits would land in the wrong "
|
|
137
|
+
"checkout. Drop the main-repo path / `-C` reference and run "
|
|
138
|
+
"against the worktree instead."
|
|
139
|
+
),
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
prefix = _anchor_prefix(wt_root)
|
|
143
|
+
if command.lstrip().startswith(prefix):
|
|
144
|
+
return None # already anchored — idempotent, do not double-prefix
|
|
145
|
+
|
|
146
|
+
return {"action": "rewrite", "command": prefix + command}
|
|
147
|
+
except Exception:
|
|
148
|
+
return None # fail open — never break an agent run
|
package/install.mjs
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* wicked-garden installer
|
|
4
|
+
* Copies plugin files to ~/.claude/plugins/wicked-garden/ and optionally syncs Python deps.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* npx wicked-garden install Install or update the plugin
|
|
8
|
+
* npx wicked-garden update Same as install
|
|
9
|
+
* npx wicked-garden status Show current install state
|
|
10
|
+
* npx wicked-garden --version Print version
|
|
11
|
+
*/
|
|
12
|
+
import { cpSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
13
|
+
import { join, dirname } from "node:path";
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
import { execSync } from "node:child_process";
|
|
17
|
+
|
|
18
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "package.json"), "utf8"));
|
|
20
|
+
|
|
21
|
+
const PLUGIN_DIRS = [".claude-plugin", "agents", "commands", "hooks", "scripts", "skills"];
|
|
22
|
+
const PLUGIN_FILES = ["ETHOS.md", "CHANGELOG.md", "README.md", "WICKED_GARDEN_BUS_EVENTS.md", "pyproject.toml"];
|
|
23
|
+
const SKIP = [/__pycache__/, /\.pyc$/, /\.pyo$/, /\.DS_Store$/];
|
|
24
|
+
// Dev-only subdirs within scripts/ — not needed at runtime
|
|
25
|
+
const SCRIPTS_DEV = ["ci", "wg"];
|
|
26
|
+
|
|
27
|
+
function skip(src) {
|
|
28
|
+
if (SKIP.some(p => p.test(src))) return true;
|
|
29
|
+
// Strip dev-only scripts/ subdirs — they exist in the npm package but serve no runtime purpose
|
|
30
|
+
const m = src.match(/[/\\]scripts[/\\]([^/\\]+)/);
|
|
31
|
+
if (m && SCRIPTS_DEV.includes(m[1])) return true;
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function findBin(name) {
|
|
36
|
+
try {
|
|
37
|
+
const out = execSync(
|
|
38
|
+
process.platform === "win32" ? `where ${name}` : `command -v ${name}`,
|
|
39
|
+
{ stdio: ["ignore", "pipe", "ignore"], timeout: 2000, encoding: "utf8" }
|
|
40
|
+
).trim().split("\n")[0];
|
|
41
|
+
return out || undefined;
|
|
42
|
+
} catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function cmdInstall() {
|
|
48
|
+
const dest = join(homedir(), ".claude", "plugins", "wicked-garden");
|
|
49
|
+
const isUpdate = existsSync(dest);
|
|
50
|
+
|
|
51
|
+
console.log(isUpdate
|
|
52
|
+
? `Updating wicked-garden v${pkg.version} at ${dest}...`
|
|
53
|
+
: `Installing wicked-garden v${pkg.version} to ${dest}...`
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
mkdirSync(dest, { recursive: true });
|
|
57
|
+
|
|
58
|
+
for (const dir of PLUGIN_DIRS) {
|
|
59
|
+
const src = join(__dirname, dir);
|
|
60
|
+
if (!existsSync(src)) continue;
|
|
61
|
+
process.stdout.write(` ${dir}/... `);
|
|
62
|
+
cpSync(src, join(dest, dir), { recursive: true, force: true, filter: (s) => !skip(s) });
|
|
63
|
+
console.log("done");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (const file of PLUGIN_FILES) {
|
|
67
|
+
const src = join(__dirname, file);
|
|
68
|
+
if (existsSync(src)) cpSync(src, join(dest, file), { force: true });
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Sync Python deps via uv if available (setup will retry if this is skipped)
|
|
72
|
+
const uv = findBin("uv");
|
|
73
|
+
if (uv) {
|
|
74
|
+
process.stdout.write(" Python deps (uv sync)... ");
|
|
75
|
+
try {
|
|
76
|
+
execSync(`"${uv}" sync --quiet`, { cwd: dest, stdio: "pipe" });
|
|
77
|
+
console.log("done");
|
|
78
|
+
} catch {
|
|
79
|
+
console.log("skipped — /wicked-garden:setup will retry");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
console.log(`\nwicked-garden v${pkg.version} ${isUpdate ? "updated" : "installed"}.`);
|
|
84
|
+
console.log("Next: run /wicked-garden:setup in Claude Code to complete configuration.");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function cmdStatus() {
|
|
88
|
+
const dest = join(homedir(), ".claude", "plugins", "wicked-garden");
|
|
89
|
+
if (!existsSync(dest)) {
|
|
90
|
+
console.log("wicked-garden: not installed");
|
|
91
|
+
console.log(` Run: npx wicked-garden@${pkg.version} install`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const installed = JSON.parse(readFileSync(join(dest, ".claude-plugin", "plugin.json"), "utf8"));
|
|
96
|
+
const upToDate = installed.version === pkg.version;
|
|
97
|
+
console.log(`wicked-garden: installed`);
|
|
98
|
+
console.log(` path: ${dest}`);
|
|
99
|
+
console.log(` version: ${installed.version}${upToDate ? "" : ` (package: ${pkg.version} — run install to update)`}`);
|
|
100
|
+
} catch {
|
|
101
|
+
console.log(`wicked-garden: installed at ${dest} (plugin.json unreadable)`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const cmd = process.argv[2];
|
|
106
|
+
switch (cmd) {
|
|
107
|
+
case "install":
|
|
108
|
+
case "update":
|
|
109
|
+
case undefined:
|
|
110
|
+
cmdInstall().catch(err => { console.error("Error:", err.message); process.exit(1); });
|
|
111
|
+
break;
|
|
112
|
+
case "status":
|
|
113
|
+
cmdStatus();
|
|
114
|
+
break;
|
|
115
|
+
case "--version":
|
|
116
|
+
case "-v":
|
|
117
|
+
console.log(pkg.version);
|
|
118
|
+
break;
|
|
119
|
+
default:
|
|
120
|
+
console.log([
|
|
121
|
+
`wicked-garden v${pkg.version}`,
|
|
122
|
+
"",
|
|
123
|
+
"Usage:",
|
|
124
|
+
" npx wicked-garden install Install or update the plugin",
|
|
125
|
+
" npx wicked-garden status Show current install state",
|
|
126
|
+
" npx wicked-garden --version Show version",
|
|
127
|
+
].join("\n"));
|
|
128
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "wicked-garden",
|
|
3
|
+
"version": "12.27.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Curated toolkit for what AI coding agents can't do alone: evidence-gated work, codegraph relationships, deterministic multi-file refactor, multi-model second opinions, and cross-session memory. Installs as a Claude Code plugin.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"ai",
|
|
8
|
+
"coding-agent",
|
|
9
|
+
"claude-code",
|
|
10
|
+
"evidence-gate",
|
|
11
|
+
"code-graph",
|
|
12
|
+
"code-intelligence",
|
|
13
|
+
"refactoring",
|
|
14
|
+
"testing",
|
|
15
|
+
"memory",
|
|
16
|
+
"multi-model",
|
|
17
|
+
"agentic",
|
|
18
|
+
"wicked-testing",
|
|
19
|
+
"wicked-bus"
|
|
20
|
+
],
|
|
21
|
+
"author": {
|
|
22
|
+
"name": "Mike Parcewski"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/mikeparcewski/wicked-garden.git"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://github.com/mikeparcewski/wicked-garden",
|
|
30
|
+
"bugs": "https://github.com/mikeparcewski/wicked-garden/issues",
|
|
31
|
+
"bin": {
|
|
32
|
+
"wicked-garden": "install.mjs"
|
|
33
|
+
},
|
|
34
|
+
"main": "install.mjs",
|
|
35
|
+
"scripts": {
|
|
36
|
+
"prepublishOnly": "node install.mjs --version"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=20.0.0"
|
|
40
|
+
}
|
|
41
|
+
}
|