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,502 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
_session.py — Session state shared across hook script invocations.
|
|
4
|
+
|
|
5
|
+
Hook scripts run as separate processes, so they cannot share in-memory state.
|
|
6
|
+
This module persists a lightweight JSON state file keyed by CLAUDE_SESSION_ID
|
|
7
|
+
so all hooks within a session read/write a consistent view.
|
|
8
|
+
|
|
9
|
+
State file location:
|
|
10
|
+
{tempfile.gettempdir()}/wicked-garden-session-{SESSION_ID}.json
|
|
11
|
+
|
|
12
|
+
Atomic writes: write to .tmp, then os.replace — prevents partial reads.
|
|
13
|
+
|
|
14
|
+
Usage (hook scripts):
|
|
15
|
+
from _session import SessionState
|
|
16
|
+
|
|
17
|
+
state = SessionState.load()
|
|
18
|
+
state.turn_count += 1
|
|
19
|
+
state.save()
|
|
20
|
+
|
|
21
|
+
# Or update multiple fields at once:
|
|
22
|
+
state.update(setup_complete=True)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
import os
|
|
27
|
+
import sys
|
|
28
|
+
import tempfile
|
|
29
|
+
from dataclasses import asdict, dataclass, field
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
from typing import Any
|
|
32
|
+
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
# Session ID resolution
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
|
|
37
|
+
_SESSION_ID_ENV = "CLAUDE_SESSION_ID"
|
|
38
|
+
_FALLBACK_SESSION_ID = "default"
|
|
39
|
+
|
|
40
|
+
# Characters that could be used for path traversal — strip them from session IDs
|
|
41
|
+
_SAFE_ID_RE = None # initialized lazily
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _get_session_id() -> str:
|
|
45
|
+
"""Read and sanitize the Claude session ID from the environment.
|
|
46
|
+
|
|
47
|
+
Returns a safe string usable as a filename component.
|
|
48
|
+
"""
|
|
49
|
+
import re
|
|
50
|
+
|
|
51
|
+
raw = os.environ.get(_SESSION_ID_ENV, _FALLBACK_SESSION_ID)
|
|
52
|
+
# Strip any path traversal or shell-special characters — keep only
|
|
53
|
+
# alphanumerics, hyphens, and underscores.
|
|
54
|
+
safe = re.sub(r"[^a-zA-Z0-9\-_]", "_", raw)
|
|
55
|
+
return safe or _FALLBACK_SESSION_ID
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _state_file_path() -> Path:
|
|
59
|
+
"""Return the path to the session state JSON file for the current session."""
|
|
60
|
+
tmpdir = os.environ.get("TMPDIR") or tempfile.gettempdir()
|
|
61
|
+
session_id = _get_session_id()
|
|
62
|
+
filename = f"wicked-garden-session-{session_id}.json"
|
|
63
|
+
return Path(tmpdir) / filename
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# ---------------------------------------------------------------------------
|
|
67
|
+
# SessionState dataclass
|
|
68
|
+
# ---------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass
|
|
72
|
+
class SessionState:
|
|
73
|
+
"""Lightweight session state persisted across hook script invocations.
|
|
74
|
+
|
|
75
|
+
All fields have safe defaults so a missing or partial state file never
|
|
76
|
+
causes a hook to crash.
|
|
77
|
+
|
|
78
|
+
Fields:
|
|
79
|
+
setup_complete: True when config.json has setup_complete == true.
|
|
80
|
+
active_project: Dict summary of the active crew project, or None.
|
|
81
|
+
agents_loaded: Number of agents loaded at bootstrap.
|
|
82
|
+
turn_count: Number of user prompts in this session (incremented by
|
|
83
|
+
prompt_submit.py on each UserPromptSubmit hook).
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
setup_complete: bool = False
|
|
87
|
+
active_project: dict | None = None
|
|
88
|
+
agents_loaded: int = 0
|
|
89
|
+
turn_count: int = 0
|
|
90
|
+
session_ended: bool = False
|
|
91
|
+
|
|
92
|
+
# One-time nudge flags (reset per session)
|
|
93
|
+
task_suggest_shown: bool = False
|
|
94
|
+
|
|
95
|
+
# Stale files accumulated this session (flushed to SM on demand)
|
|
96
|
+
stale_files: list | None = None
|
|
97
|
+
|
|
98
|
+
# QE change tracking nudge flag
|
|
99
|
+
qe_nudged: bool = False
|
|
100
|
+
|
|
101
|
+
# Set by bootstrap.py when onboarding is incomplete; checked by prompt_submit gate
|
|
102
|
+
needs_onboarding: bool = False
|
|
103
|
+
|
|
104
|
+
# Set by prompt_submit gate when /wicked-garden:setup passes through;
|
|
105
|
+
# allows subsequent user answers (AskUserQuestion responses) through the gate
|
|
106
|
+
setup_in_progress: bool = False
|
|
107
|
+
|
|
108
|
+
# True when Claude Code is running in dangerous mode (skipDangerousModePermissionPrompt).
|
|
109
|
+
# AskUserQuestion is broken in this mode — commands must use plain text questions instead.
|
|
110
|
+
dangerous_mode: bool = False
|
|
111
|
+
|
|
112
|
+
# Failure counts per tool (for issue reporter threshold)
|
|
113
|
+
failure_counts: dict | None = None
|
|
114
|
+
|
|
115
|
+
# Queued issue records (pending_issues + mismatches)
|
|
116
|
+
pending_issues: list | None = None
|
|
117
|
+
|
|
118
|
+
# Subagent dispatch log (post_tool.py Task handler)
|
|
119
|
+
subagent_dispatches: list | None = None
|
|
120
|
+
|
|
121
|
+
# Detected agentic frameworks (post_tool.py Read handler)
|
|
122
|
+
detected_frameworks: list | None = None
|
|
123
|
+
|
|
124
|
+
# Bash command counter (post_tool.py Bash handler)
|
|
125
|
+
bash_count: int = 0
|
|
126
|
+
|
|
127
|
+
# Memory compliance tracking (set by bootstrap + incremented by task_completed.py)
|
|
128
|
+
# memory_compliance_required: True when a crew project is active (enables directives)
|
|
129
|
+
# memory_compliance_tasks_completed: count of TaskCompleted events this session
|
|
130
|
+
memory_compliance_required: bool = False
|
|
131
|
+
memory_compliance_tasks_completed: int = 0
|
|
132
|
+
|
|
133
|
+
# Crew recommendation heuristic — shown at most once per session on SLOW path
|
|
134
|
+
# when complexity >= 2 and no active crew project exists.
|
|
135
|
+
crew_hint_shown: bool = False
|
|
136
|
+
|
|
137
|
+
# Context dedup hash — tracks the last session state hash to skip redundant
|
|
138
|
+
# re-injection on HOT path when state hasn't changed between turns.
|
|
139
|
+
context_hash: str = ""
|
|
140
|
+
|
|
141
|
+
# Escalation counter: incremented by task_completed.py on each deliverable completion.
|
|
142
|
+
# Reset by post_tool.py when a wicked-brain:memory Skill call succeeds.
|
|
143
|
+
memory_compliance_escalations: int = 0
|
|
144
|
+
|
|
145
|
+
# Written by bootstrap.py when onboarding is confirmed complete (both memories and index).
|
|
146
|
+
# prompt_submit.py reads this as the primary signal, bypassing per-turn re-check.
|
|
147
|
+
onboarding_complete: bool = False
|
|
148
|
+
|
|
149
|
+
# Separate from cp_project_id (which is a CP UUID reference).
|
|
150
|
+
# active_project_id is the LOCAL project name (slug) for a project that is currently
|
|
151
|
+
# in an active (non-complete) phase in this workspace. None when no active project.
|
|
152
|
+
active_project_id: str | None = None
|
|
153
|
+
|
|
154
|
+
# One-per-session gate for jam suggestion (reset each session).
|
|
155
|
+
jam_hint_shown: bool = False
|
|
156
|
+
|
|
157
|
+
# Operational log verbosity level for this session.
|
|
158
|
+
# "" means "not set" — the logger defaults to "normal".
|
|
159
|
+
# Valid values: "normal", "verbose", "debug"
|
|
160
|
+
# Written by /wicked-garden:platform:debug; read by _logger._resolve_level().
|
|
161
|
+
log_level: str = ""
|
|
162
|
+
|
|
163
|
+
# Cached integration-discovery results for this session.
|
|
164
|
+
# Maps domain name to selected tool name ("linear", "jira", "notion") or "local".
|
|
165
|
+
# None means discovery has not run yet this session.
|
|
166
|
+
integration_tools: dict | None = None
|
|
167
|
+
|
|
168
|
+
# Resolved tool lists from capability-based routing.
|
|
169
|
+
# Maps agent_name -> list of resolved tool names.
|
|
170
|
+
# None means resolution has not run yet this session.
|
|
171
|
+
resolved_capabilities: dict | None = None
|
|
172
|
+
|
|
173
|
+
# wicked-brain dependency check (set by bootstrap.py at SessionStart).
|
|
174
|
+
# True — wicked-brain plugin is installed (found in enabledPlugins).
|
|
175
|
+
# False — not installed; bootstrap emits an install hint to the briefing.
|
|
176
|
+
# None — check has not run yet this session (e.g., early-exit before setup).
|
|
177
|
+
brain_available: bool | None = None
|
|
178
|
+
|
|
179
|
+
# Fast-path sentinel: set by bootstrap.py when config.json setup_complete=True.
|
|
180
|
+
# Allows prompt_submit.py guard to skip config.json file read on every turn.
|
|
181
|
+
# Once True for a session, it never goes back to False.
|
|
182
|
+
setup_confirmed: bool = False
|
|
183
|
+
|
|
184
|
+
# Onboarding mode selected during this session's wizard run.
|
|
185
|
+
# Written by setup.md Step 5. Values: None | "full" | "quick" | "skip"
|
|
186
|
+
onboarding_mode: str | None = None
|
|
187
|
+
|
|
188
|
+
# Dedup guard for PreCompact hook — ISO timestamp of last compaction.
|
|
189
|
+
# If compaction happened <60s ago, skip redundant WIP save.
|
|
190
|
+
last_compact_ts: str = ""
|
|
191
|
+
|
|
192
|
+
# Cumulative bytes read via the Read tool this session (post_tool.py).
|
|
193
|
+
# Used for escalating context-window warnings.
|
|
194
|
+
read_bytes_total: int = 0
|
|
195
|
+
|
|
196
|
+
# Number of large-file-read warnings emitted this session.
|
|
197
|
+
# Escalation tiers: first warning is informational, repeated warnings
|
|
198
|
+
# become more urgent.
|
|
199
|
+
read_large_warn_count: int = 0
|
|
200
|
+
|
|
201
|
+
# Subagent permission failure counter (post_tool.py Task handler).
|
|
202
|
+
# Incremented when a subagent completes without doing work due to
|
|
203
|
+
# Bash permission issues or tool-access failures (Issue #318).
|
|
204
|
+
subagent_permission_failures: int = 0
|
|
205
|
+
|
|
206
|
+
# Discovery hints shown this session — tracks which "did you know?" hints
|
|
207
|
+
# have been emitted so each is shown at most once (Issue #322).
|
|
208
|
+
# List of hint IDs like ["grep_search", "manual_review", "debugging"].
|
|
209
|
+
hints_shown: list | None = None
|
|
210
|
+
|
|
211
|
+
# Claim sentinel (scripts/sentinel/invariants.py::claim_tick) — Stop-hook
|
|
212
|
+
# debounce. The answer tier nudges at most once per unproven HEAD sha per
|
|
213
|
+
# session when a done/passing claim is made without a re-derived verdict;
|
|
214
|
+
# this records the sha already nudged so the same unproven state never
|
|
215
|
+
# re-fires within a session. MUST be a declared field — update() drops
|
|
216
|
+
# unknown keys, so a transient attr would never persist across Stop calls.
|
|
217
|
+
sentinel_claim_sha: str = ""
|
|
218
|
+
|
|
219
|
+
# OneDrive / spaces-in-paths resolution (Issue #321).
|
|
220
|
+
# Stores the resolved canonical base path when cwd is under a OneDrive
|
|
221
|
+
# or CloudStorage directory (macOS ~/Library/CloudStorage/OneDrive - .../...).
|
|
222
|
+
# Empty string means not applicable (cwd is not under OneDrive).
|
|
223
|
+
onedrive_base_path: str = ""
|
|
224
|
+
|
|
225
|
+
# Turn progress visibility (Issue #323).
|
|
226
|
+
# turn_start_ts: ISO timestamp when the current turn began (set by prompt_submit).
|
|
227
|
+
# turn_tool_count: number of tool calls in the current turn (incremented by post_tool).
|
|
228
|
+
turn_start_ts: str = ""
|
|
229
|
+
turn_tool_count: int = 0
|
|
230
|
+
|
|
231
|
+
# v10 Phase 1 (#813) — intent variable, the keystone for steer-not-block.
|
|
232
|
+
# One explicit, queryable value replaces five overlapping classifiers
|
|
233
|
+
# in prompt_submit.py (HOT fast-exit, near-HOT guard, complexity scorer,
|
|
234
|
+
# _should_emit_context_assembly, _resolve_pull_phase).
|
|
235
|
+
#
|
|
236
|
+
# Vocabulary (locked, do not extend without a brainstorm):
|
|
237
|
+
# simple-edit | feature | rigor | research
|
|
238
|
+
#
|
|
239
|
+
# Lifecycle:
|
|
240
|
+
# - None : not yet detected (turn 1 before _detect_intent runs)
|
|
241
|
+
# - <value> : auto-detected on turn 1-2 OR explicitly set by skill
|
|
242
|
+
#
|
|
243
|
+
# `intent_explicit` is True only when /wicked-garden:intent set the
|
|
244
|
+
# value (or a command self-declared via that skill). Used to decide
|
|
245
|
+
# whether to echo the bare `<wg intent="X" t=N />` label in the
|
|
246
|
+
# system-reminder — auto-detected values stay invisible to prevent
|
|
247
|
+
# confirmation-bias drift.
|
|
248
|
+
#
|
|
249
|
+
# Sticky for the session. SessionEnd hook (stop.py) resets via delete().
|
|
250
|
+
# Design record: brainstorms/v10-session-01-intent-and-hook-gating.md
|
|
251
|
+
intent: str | None = None
|
|
252
|
+
intent_explicit: bool = False
|
|
253
|
+
|
|
254
|
+
# v11: LLM-classified work-shape archetype + signals.
|
|
255
|
+
# Populated by the wicked-garden:classify skill. When set, the
|
|
256
|
+
# prompt_submit hook prefers this over the regex detector.
|
|
257
|
+
# archetypes_v11: list of {name, score, evidence} dicts (top-3).
|
|
258
|
+
# signals_v11: dict of boolean signal flags (blast_radius_high, etc.).
|
|
259
|
+
# classified_at: ISO timestamp; None means not classified yet.
|
|
260
|
+
archetypes_v11: list | None = None
|
|
261
|
+
signals_v11: dict | None = None
|
|
262
|
+
classified_at: str | None = None
|
|
263
|
+
|
|
264
|
+
# PostToolUse hook latency profiling (Issue #312).
|
|
265
|
+
# Cumulative milliseconds spent in the post_tool.py main() function.
|
|
266
|
+
post_tool_total_ms: int = 0
|
|
267
|
+
# Total number of PostToolUse hook invocations this session.
|
|
268
|
+
post_tool_call_count: int = 0
|
|
269
|
+
# Per-handler cumulative milliseconds: {"Read": 42, "Write|Edit": 15, ...}
|
|
270
|
+
post_tool_handler_ms: dict | None = None
|
|
271
|
+
|
|
272
|
+
# v6 facilitator re-evaluation (Gate 3, epic #428).
|
|
273
|
+
# task_completed.py sets these when a task with metadata.chain_id completes.
|
|
274
|
+
# prompt_submit.py reads on the next turn, emits a re-eval directive, then clears.
|
|
275
|
+
facilitator_reeval_due: bool = False
|
|
276
|
+
facilitator_reeval_chain: str | None = None # chain_id needing re-eval
|
|
277
|
+
|
|
278
|
+
# v6 phase-start heuristic gate (AC-11). task_completed.py sets this when
|
|
279
|
+
# a completed task is the last in a phase; prompt_submit.py dispatches
|
|
280
|
+
# phase_start_gate.py::check() on next turn and emits the directive.
|
|
281
|
+
# MUST be a declared dataclass field — asdict() only serializes declared
|
|
282
|
+
# attributes, so setting it as a transient attr won't persist. (Caught by
|
|
283
|
+
# senior-engineer review of this very project — meta bug fix.)
|
|
284
|
+
phase_start_gate_due: bool = False
|
|
285
|
+
|
|
286
|
+
# Name of the last phase the user approved this session (#462).
|
|
287
|
+
# Written by scripts/crew/phase_manager.py::approve_phase() after a
|
|
288
|
+
# successful approval. Read by stop.py to decide whether to promote
|
|
289
|
+
# the guard pipeline profile (scalpel → standard) when build just closed.
|
|
290
|
+
# None when no approval has happened yet this session.
|
|
291
|
+
last_phase_approved: str | None = None
|
|
292
|
+
|
|
293
|
+
# Telemetry producers (#459). Read optimistically by
|
|
294
|
+
# scripts/delivery/telemetry.py::_extract_session_extras at session-close.
|
|
295
|
+
# - skip_reeval_count: count of --skip-reeval approvals in this session.
|
|
296
|
+
# Incremented by scripts/crew/phase_manager.py::approve_phase when the
|
|
297
|
+
# addendum-freshness bypass path is taken.
|
|
298
|
+
# - complexity_at_session_open: ProjectState.complexity_score as observed
|
|
299
|
+
# at session-start (bootstrap) when an active crew project exists, or on
|
|
300
|
+
# the first approve_phase of the session. Used by telemetry to compute
|
|
301
|
+
# complexity_delta = complexity_close - complexity_open.
|
|
302
|
+
# - complexity_score: current ProjectState.complexity_score mirror, kept
|
|
303
|
+
# on the session for telemetry close-out.
|
|
304
|
+
skip_reeval_count: int = 0
|
|
305
|
+
complexity_at_session_open: int | None = None
|
|
306
|
+
complexity_score: int = 0
|
|
307
|
+
|
|
308
|
+
# #500 — HMAC-signed dispatch-log secret. Session-scoped; lazily
|
|
309
|
+
# generated on first use via ``secrets.token_hex(32)``. Promotes the
|
|
310
|
+
# dispatch-log orphan check to authentication: an attacker who forges
|
|
311
|
+
# both a gate-result and a dispatch entry still cannot produce a
|
|
312
|
+
# correct HMAC without the in-session secret.
|
|
313
|
+
#
|
|
314
|
+
# Storage intent:
|
|
315
|
+
# - NEVER logged, NEVER included in audit records (see
|
|
316
|
+
# ``scripts/crew/gate_ingest_audit.py``).
|
|
317
|
+
# - Persisted inside the session-state JSON, which already lives
|
|
318
|
+
# in a per-session temp file. Cross-session lookup is explicitly
|
|
319
|
+
# NOT supported — legacy (pre-HMAC) entries fall back to
|
|
320
|
+
# orphan-detection only with a stderr WARN.
|
|
321
|
+
dispatch_log_hmac_secret: str = ""
|
|
322
|
+
|
|
323
|
+
# #506 — pre-flip monitoring: latch the post-cutover INFO banner so
|
|
324
|
+
# it fires at most once per session even across multiple SessionStart
|
|
325
|
+
# callbacks in the same session.
|
|
326
|
+
strict_mode_active_announced: bool = False
|
|
327
|
+
|
|
328
|
+
# #544 — wicked-testing peer-plugin gate (SessionStart hard-block).
|
|
329
|
+
# Set by bootstrap.py after running _wicked_testing_probe.probe().
|
|
330
|
+
# True — probe returned status != "ok"; crew commands are blocked.
|
|
331
|
+
# False — probe returned "ok" (or escape hatch active); crew may proceed.
|
|
332
|
+
# None — probe has not run yet this session (early-exit before setup).
|
|
333
|
+
wicked_testing_missing: bool | None = None
|
|
334
|
+
|
|
335
|
+
# Cached probe result dict from _wicked_testing_probe.probe().
|
|
336
|
+
# Persisted as part of session extras for crew_command_gate() reads.
|
|
337
|
+
# Lives in extras["wicked_testing_probe"] per the design spec.
|
|
338
|
+
# extras is a general-purpose dict for probe / diagnostic results that
|
|
339
|
+
# don't warrant individual dataclass fields.
|
|
340
|
+
extras: dict | None = None
|
|
341
|
+
|
|
342
|
+
# Hook-reminder latches (v9.2.2 — per-session noise suppression).
|
|
343
|
+
# SessionState.update silently drops unknown keys, so prior to v9.2.2
|
|
344
|
+
# the latches below were write-only — the hooks SET them but the values
|
|
345
|
+
# never persisted, causing the reminders they were meant to gate to fire
|
|
346
|
+
# every time. Declaring the fields here turns the writes into reads on
|
|
347
|
+
# the next Stop / PostToolUse and the latches actually take.
|
|
348
|
+
#
|
|
349
|
+
# instruction_sync_fired: list of filenames (CLAUDE.md / AGENTS.md) for
|
|
350
|
+
# which the [Sync] reminder has already fired this session.
|
|
351
|
+
# memory_reminder_shown: True when stop.py's [Memory] reminder has
|
|
352
|
+
# already fired once this session — replaces the prior every-turn fire.
|
|
353
|
+
instruction_sync_fired: list | None = None
|
|
354
|
+
memory_reminder_shown: bool = False
|
|
355
|
+
|
|
356
|
+
# v9.2.3 — fields previously USED via getattr/state.update but NEVER
|
|
357
|
+
# declared. Each was silently failing because update() drops unknown keys.
|
|
358
|
+
# Audit ran 2026-05-06 against all `state.update(X=...)` and
|
|
359
|
+
# `getattr(state, "X", ...)` call sites in hooks/ and scripts/.
|
|
360
|
+
#
|
|
361
|
+
# active_chain_id: string identifier of the active crew chain (e.g.
|
|
362
|
+
# "{slug}.root" or "{slug}.{phase}"). Read by smaht events_adapter for
|
|
363
|
+
# chain-aware scoring (CLAUDE.md "Chain-aware smaht scoring"). Producer
|
|
364
|
+
# was never wired — the smaht scoring has been silently degraded. The
|
|
365
|
+
# field declaration here makes the read return None cleanly until a
|
|
366
|
+
# producer is added.
|
|
367
|
+
# crew_project: REMOVED in v9.2.5. The single read site in post_tool.py
|
|
368
|
+
# was a phantom — nothing ever wrote the field. Replaced the read with
|
|
369
|
+
# `getattr(state, "active_project_id", None)` which is the same intent
|
|
370
|
+
# ("is a crew project active?") and has a real producer in bootstrap.
|
|
371
|
+
# last_reeval_ts / last_reeval_task_count: read by prompt_submit when
|
|
372
|
+
# building re-evaluation context. Currently read-only; declared so the
|
|
373
|
+
# read returns the documented default rather than via getattr fallback.
|
|
374
|
+
# legacy_reeval_entries_detected: written by bootstrap.py:1215 when a
|
|
375
|
+
# project has pre-v6 re-eval entries needing migration. Was a write-
|
|
376
|
+
# only orphan; declaration makes it persistable.
|
|
377
|
+
# unready_plugins: written by bootstrap.py:1279 with names of plugins
|
|
378
|
+
# whose readiness probe failed. Was a write-only orphan; declaration
|
|
379
|
+
# makes it persistable.
|
|
380
|
+
active_chain_id: str | None = None
|
|
381
|
+
last_reeval_ts: str = ""
|
|
382
|
+
last_reeval_task_count: int = 0
|
|
383
|
+
legacy_reeval_entries_detected: bool = False
|
|
384
|
+
unready_plugins: list | None = None
|
|
385
|
+
|
|
386
|
+
# v9.2.12 — per-turn / change-gated latches for hook-emission anti-patterns
|
|
387
|
+
# surfaced by the v9.2.11 audit. Each field gates a banner that previously
|
|
388
|
+
# re-fired on every PostToolUse / Stop without checking actual state.
|
|
389
|
+
#
|
|
390
|
+
# last_status_turn: turn_count value when the [Status] long-turn banner
|
|
391
|
+
# was last shown. post_tool.py only emits if turn_count > last_status_turn,
|
|
392
|
+
# so each long-running turn surfaces exactly one [Status] line instead of
|
|
393
|
+
# one per tool call past the threshold.
|
|
394
|
+
# last_outcome_pending_count / last_outcome_mismatch_count: counts at last
|
|
395
|
+
# [Issue Reporter] banner emission. stop.py only re-emits when the count
|
|
396
|
+
# has CHANGED — silent when nothing new accumulates, surfacing only when
|
|
397
|
+
# the queue actually grows.
|
|
398
|
+
last_status_turn: int = 0
|
|
399
|
+
last_outcome_pending_count: int = 0
|
|
400
|
+
last_outcome_mismatch_count: int = 0
|
|
401
|
+
|
|
402
|
+
# ------------------------------------------------------------------
|
|
403
|
+
# Persistence
|
|
404
|
+
# ------------------------------------------------------------------
|
|
405
|
+
|
|
406
|
+
@classmethod
|
|
407
|
+
def load(cls) -> "SessionState":
|
|
408
|
+
"""Load state from the session file.
|
|
409
|
+
|
|
410
|
+
Returns a fresh default-valued SessionState if the file does not exist
|
|
411
|
+
or contains invalid JSON — ensures hooks never crash on missing state.
|
|
412
|
+
"""
|
|
413
|
+
path = _state_file_path()
|
|
414
|
+
|
|
415
|
+
if not path.exists():
|
|
416
|
+
return cls()
|
|
417
|
+
|
|
418
|
+
try:
|
|
419
|
+
raw = path.read_text(encoding="utf-8")
|
|
420
|
+
data = json.loads(raw)
|
|
421
|
+
except (json.JSONDecodeError, OSError):
|
|
422
|
+
# Corrupted or unreadable state — return clean defaults
|
|
423
|
+
return cls()
|
|
424
|
+
|
|
425
|
+
# Build from dict; unknown keys are silently ignored so older state
|
|
426
|
+
# files remain compatible with newer code that adds fields.
|
|
427
|
+
return cls._from_dict(data)
|
|
428
|
+
|
|
429
|
+
def save(self) -> None:
|
|
430
|
+
"""Atomically persist the current state to the session file."""
|
|
431
|
+
path = _state_file_path()
|
|
432
|
+
tmp_path = path.with_suffix(".tmp")
|
|
433
|
+
|
|
434
|
+
data = asdict(self)
|
|
435
|
+
|
|
436
|
+
try:
|
|
437
|
+
tmp_path.write_text(json.dumps(data, indent=2), encoding="utf-8")
|
|
438
|
+
os.replace(tmp_path, path)
|
|
439
|
+
except OSError as exc:
|
|
440
|
+
print(
|
|
441
|
+
f"[wicked-garden] Failed to save session state: {exc}",
|
|
442
|
+
file=sys.stderr,
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
def update(self, **kwargs: Any) -> None:
|
|
446
|
+
"""Update one or more fields and immediately save to disk.
|
|
447
|
+
|
|
448
|
+
Only recognised field names are applied; unknown keys are silently
|
|
449
|
+
dropped so callers cannot accidentally corrupt the state schema.
|
|
450
|
+
|
|
451
|
+
Args:
|
|
452
|
+
**kwargs: Field name -> new value pairs.
|
|
453
|
+
"""
|
|
454
|
+
valid_fields = {f for f in self.__dataclass_fields__}
|
|
455
|
+
for key, value in kwargs.items():
|
|
456
|
+
if key in valid_fields:
|
|
457
|
+
object.__setattr__(self, key, value)
|
|
458
|
+
else:
|
|
459
|
+
print(
|
|
460
|
+
f"[wicked-garden] SessionState.update: unknown field {key!r} ignored",
|
|
461
|
+
file=sys.stderr,
|
|
462
|
+
)
|
|
463
|
+
self.save()
|
|
464
|
+
|
|
465
|
+
# ------------------------------------------------------------------
|
|
466
|
+
# Helpers
|
|
467
|
+
# ------------------------------------------------------------------
|
|
468
|
+
|
|
469
|
+
@classmethod
|
|
470
|
+
def _from_dict(cls, data: dict) -> "SessionState":
|
|
471
|
+
"""Construct a SessionState from a dict, ignoring unknown keys."""
|
|
472
|
+
valid_fields = {f for f in cls.__dataclass_fields__}
|
|
473
|
+
filtered = {k: v for k, v in data.items() if k in valid_fields}
|
|
474
|
+
return cls(**filtered)
|
|
475
|
+
|
|
476
|
+
def to_dict(self) -> dict:
|
|
477
|
+
"""Return a plain dict representation (JSON-safe)."""
|
|
478
|
+
return asdict(self)
|
|
479
|
+
|
|
480
|
+
def increment_turn(self) -> int:
|
|
481
|
+
"""Increment turn_count, persist, and return the new value."""
|
|
482
|
+
self.turn_count += 1
|
|
483
|
+
self.save()
|
|
484
|
+
return self.turn_count
|
|
485
|
+
|
|
486
|
+
# ------------------------------------------------------------------
|
|
487
|
+
# Session file cleanup (called by stop.py)
|
|
488
|
+
# ------------------------------------------------------------------
|
|
489
|
+
|
|
490
|
+
def delete(self) -> None:
|
|
491
|
+
"""Remove the session state file at session end.
|
|
492
|
+
|
|
493
|
+
Silently succeeds if the file does not exist.
|
|
494
|
+
"""
|
|
495
|
+
path = _state_file_path()
|
|
496
|
+
try:
|
|
497
|
+
path.unlink(missing_ok=True)
|
|
498
|
+
except OSError as exc:
|
|
499
|
+
print(
|
|
500
|
+
f"[wicked-garden] Failed to delete session state file: {exc}",
|
|
501
|
+
file=sys.stderr,
|
|
502
|
+
)
|