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,382 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""vault_gate.py — the garden's produces-gate, backed by wicked-vault.
|
|
3
|
+
|
|
4
|
+
This is the load-bearing replacement for ``evidence_tracker``'s
|
|
5
|
+
*satisfied-when-claimed* model. The tracker records what an archetype
|
|
6
|
+
*claims* to have produced and never re-derives it; that lets a build's
|
|
7
|
+
review gate pass on a self-asserted "tests pass". ``wicked-vault``
|
|
8
|
+
instead re-derives — it recomputes the envelope hash and re-runs the
|
|
9
|
+
pure verifier every time, never trusting a cached status — and answers
|
|
10
|
+
``cross-check`` with a mechanical PASS / REJECT / ERROR.
|
|
11
|
+
|
|
12
|
+
So the gate becomes: *is the claim actually backed by evidence that
|
|
13
|
+
clears its declared contract?* — not *did someone say it was done?*
|
|
14
|
+
|
|
15
|
+
**Required peer, fail-closed by default.** wicked-vault is a required
|
|
16
|
+
sibling (like wicked-bus / wicked-brain / wicked-testing). When it is
|
|
17
|
+
genuinely unresolvable, ``gate_satisfied`` (``require=True`` default)
|
|
18
|
+
**fails closed** — it never self-asserts a PASS. ``require=False`` is an
|
|
19
|
+
explicit opt-out to the doctrine-light ``evidence_tracker`` claim-only
|
|
20
|
+
path for throwaway/low-rigor work.
|
|
21
|
+
|
|
22
|
+
**Loom is authoritative (contract phase).** The re-derivation engine is
|
|
23
|
+
now ``wicked-loom``: ``cross_check`` shells ``loom gate`` and ``resolve_vault``
|
|
24
|
+
(default ``allow_npx=True``) shells ``loom resolve vault``. The in-process
|
|
25
|
+
vault re-derivation + npx resolution ladder were removed once loom became
|
|
26
|
+
load-bearing. Resolution splits into two paths (see ``resolve_vault``):
|
|
27
|
+
- ``allow_npx=True`` — loom authoritative; loom-unresolvable/disabled/
|
|
28
|
+
erroring → None (no in-process fallback; the gate then fails closed).
|
|
29
|
+
- ``allow_npx=False`` — the ``vault_available`` concrete-install probe:
|
|
30
|
+
an in-process ladder (``WICKED_VAULT_BIN`` env, with set-but-empty as
|
|
31
|
+
the kill-switch → config → PATH → ``node_modules/.bin``; **no npx, no
|
|
32
|
+
loom** — npx/loom would report the last-resort as resolvable and corrupt
|
|
33
|
+
the "is a concrete vault installed?" signal). Unchanged from pre-contract.
|
|
34
|
+
|
|
35
|
+
Stdlib-only. Cross-platform (argv lists, ``shutil.which``, no shell).
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from __future__ import annotations
|
|
39
|
+
|
|
40
|
+
import json
|
|
41
|
+
import os
|
|
42
|
+
import shutil
|
|
43
|
+
import sys
|
|
44
|
+
from pathlib import Path
|
|
45
|
+
from typing import Any, Dict, List, Optional
|
|
46
|
+
|
|
47
|
+
_CONFIG_PATH = Path.home() / ".something-wicked" / "wicked-garden" / "config.json"
|
|
48
|
+
_DEFAULT_TIMEOUT = 120
|
|
49
|
+
|
|
50
|
+
# wicked-loom is the authoritative runtime for the resolve + gate surfaces
|
|
51
|
+
# (contract phase: the in-process re-derivation + npx ladder were removed).
|
|
52
|
+
# When the loom shim is absent the shimmed surfaces are unavailable and the
|
|
53
|
+
# gate fails closed — there is no in-process fallback.
|
|
54
|
+
# ``_loom`` is a sibling module in scripts/. When this runs as a CLI
|
|
55
|
+
# (`python3 scripts/qe/vault_gate.py …`, incl. via _python.sh) only scripts/qe
|
|
56
|
+
# is on sys.path, so add scripts/ — otherwise the import fails, the loom shim
|
|
57
|
+
# is None, and EVERY gate silently fails closed ("unavailable") even with loom
|
|
58
|
+
# + vault installed. Module-level imports (hooks, conftest) already have
|
|
59
|
+
# scripts/ on the path; this makes the CLI path behave the same. phase_manager
|
|
60
|
+
# does the same insert. (Regression introduced by the loom cutover, #891.)
|
|
61
|
+
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
|
62
|
+
try:
|
|
63
|
+
import _loom
|
|
64
|
+
except ImportError: # pragma: no cover — loom shim absent => surfaces unavailable
|
|
65
|
+
_loom = None # type: ignore
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# ---------------------------------------------------------------------------
|
|
69
|
+
# Resolution
|
|
70
|
+
# ---------------------------------------------------------------------------
|
|
71
|
+
|
|
72
|
+
def _argv_for(target: str) -> List[str]:
|
|
73
|
+
"""Turn a resolved vault location into an argv prefix.
|
|
74
|
+
|
|
75
|
+
A ``.mjs``/``.js`` file is a script → invoke via ``node``. Anything
|
|
76
|
+
else (an executable name or a shim) is run directly.
|
|
77
|
+
"""
|
|
78
|
+
if target.endswith((".mjs", ".js")):
|
|
79
|
+
return ["node", target]
|
|
80
|
+
return [target]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def resolve_vault(*, allow_npx: bool = True,
|
|
84
|
+
project_dir: Optional[Path] = None) -> Optional[List[str]]:
|
|
85
|
+
"""Return the argv prefix that invokes wicked-vault, or None.
|
|
86
|
+
|
|
87
|
+
Two distinct callers, two paths (contract phase):
|
|
88
|
+
|
|
89
|
+
- ``allow_npx=True`` (default; the run-the-vault path): **loom is
|
|
90
|
+
authoritative.** Garden asks ``wicked-loom resolve vault`` and returns
|
|
91
|
+
its ``command`` array (None when loom reports the vault unresolvable /
|
|
92
|
+
kill-switched). loom unresolvable, disabled (``WICKED_LOOM_CUTOVER=off``),
|
|
93
|
+
or erroring → None. There is no in-process npx ladder here anymore (the
|
|
94
|
+
contract removed it); a missing loom means a missing resolver, and the
|
|
95
|
+
gate downstream fails closed (I2).
|
|
96
|
+
|
|
97
|
+
- ``allow_npx=False`` (the ``vault_available`` concrete-install probe):
|
|
98
|
+
the in-process ladder (``WICKED_VAULT_BIN`` env → config → PATH →
|
|
99
|
+
``node_modules/.bin``; **no npx, no loom**). loom is deliberately NOT
|
|
100
|
+
consulted: it would report the npx last-resort as resolvable and corrupt
|
|
101
|
+
the "is a concrete vault actually installed?" signal. This path is
|
|
102
|
+
unchanged from before the contract. ``WICKED_VAULT_BIN=""`` (set-but-
|
|
103
|
+
empty) is the deliberate kill-switch → None.
|
|
104
|
+
"""
|
|
105
|
+
if allow_npx:
|
|
106
|
+
# Run-the-vault path: loom authoritative, no in-process fallback.
|
|
107
|
+
if _loom is None or not _loom.use_loom(project_dir=project_dir):
|
|
108
|
+
return None # loom disabled / unresolvable -> no resolver
|
|
109
|
+
out = _loom.run_json(["resolve", "vault"], project_dir=project_dir)
|
|
110
|
+
if out["error"] is not None or not isinstance(out.get("json"), dict):
|
|
111
|
+
return None # loom errored -> fail-closed (no in-process fallback)
|
|
112
|
+
return out["json"].get("command") # list[str] or None
|
|
113
|
+
|
|
114
|
+
# Concrete-install probe (allow_npx=False): in-process ladder, no loom/npx.
|
|
115
|
+
if "WICKED_VAULT_BIN" in os.environ:
|
|
116
|
+
env = os.environ["WICKED_VAULT_BIN"].strip()
|
|
117
|
+
return _argv_for(env) if env else None # empty == kill-switch
|
|
118
|
+
|
|
119
|
+
pref = _read_config_preference("wicked-vault")
|
|
120
|
+
if pref:
|
|
121
|
+
return _argv_for(pref)
|
|
122
|
+
|
|
123
|
+
found = shutil.which("wicked-vault")
|
|
124
|
+
if found:
|
|
125
|
+
return [found]
|
|
126
|
+
|
|
127
|
+
base = Path(project_dir) if project_dir else Path.cwd()
|
|
128
|
+
local = base / "node_modules" / ".bin" / "wicked-vault"
|
|
129
|
+
if local.exists():
|
|
130
|
+
return [str(local)]
|
|
131
|
+
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def vault_available(project_dir: Optional[Path] = None) -> bool:
|
|
136
|
+
"""True iff a **concrete** vault install is resolvable (env, config,
|
|
137
|
+
PATH, or node_modules) — not the npx last-resort. This is the signal
|
|
138
|
+
setup and the SessionStart bootstrap use to decide whether the
|
|
139
|
+
required peer is actually installed."""
|
|
140
|
+
return resolve_vault(allow_npx=False, project_dir=project_dir) is not None
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _read_config_preference(key: str) -> Optional[str]:
|
|
144
|
+
"""Read ``tool_preferences.{key}`` from config.json; None on any error."""
|
|
145
|
+
try:
|
|
146
|
+
if not _CONFIG_PATH.exists():
|
|
147
|
+
return None
|
|
148
|
+
data = json.loads(_CONFIG_PATH.read_text(encoding="utf-8"))
|
|
149
|
+
prefs = data.get("tool_preferences")
|
|
150
|
+
if isinstance(prefs, dict):
|
|
151
|
+
value = prefs.get(key)
|
|
152
|
+
if isinstance(value, str) and value.strip():
|
|
153
|
+
return value.strip()
|
|
154
|
+
return None
|
|
155
|
+
except (json.JSONDecodeError, OSError):
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
# ---------------------------------------------------------------------------
|
|
160
|
+
# Invocation
|
|
161
|
+
# ---------------------------------------------------------------------------
|
|
162
|
+
|
|
163
|
+
def cross_check(
|
|
164
|
+
scope: str,
|
|
165
|
+
phase: str,
|
|
166
|
+
*,
|
|
167
|
+
project_dir: Optional[Path] = None,
|
|
168
|
+
with_attestations: bool = False,
|
|
169
|
+
timeout: int = _DEFAULT_TIMEOUT,
|
|
170
|
+
) -> Dict[str, Any]:
|
|
171
|
+
"""Run the produces re-derivation via ``wicked-loom gate`` and return its
|
|
172
|
+
mechanical verdict.
|
|
173
|
+
|
|
174
|
+
loom is the **sole** re-derivation engine (the in-process vault path was
|
|
175
|
+
removed in the contract phase). loom re-hashes the recorded evidence and
|
|
176
|
+
re-runs the verifier, mapping the result onto ``{available, overall,
|
|
177
|
+
claims, mode, contract_version, detail, raw}``.
|
|
178
|
+
|
|
179
|
+
**Fail-closed (I2).** When loom is unresolvable, disabled
|
|
180
|
+
(``WICKED_LOOM_CUTOVER=off``), errors, returns non-JSON, or reports the
|
|
181
|
+
vault unavailable behind it, ``available`` is False and ``overall`` is
|
|
182
|
+
ERROR — we never invent a PASS. There is no in-process fallback; a missing
|
|
183
|
+
loom is a missing gate, and a missing gate fails closed.
|
|
184
|
+
"""
|
|
185
|
+
if _loom is None or not _loom.use_loom(project_dir=project_dir):
|
|
186
|
+
# loom shim absent, or WICKED_LOOM_CUTOVER=off / auto-unresolvable.
|
|
187
|
+
# No in-process re-derivation remains -> the gate is unavailable.
|
|
188
|
+
return {"available": False, "overall": "ERROR",
|
|
189
|
+
"error": "wicked-loom not in use (disabled or unresolvable)",
|
|
190
|
+
"exit_code": None}
|
|
191
|
+
|
|
192
|
+
loom_args = ["gate", phase, "--scope", scope]
|
|
193
|
+
if with_attestations:
|
|
194
|
+
loom_args.append("--with-attestations")
|
|
195
|
+
out = _loom.run_json(loom_args, project_dir=project_dir, timeout=timeout)
|
|
196
|
+
if out["error"] is not None or not isinstance(out.get("json"), dict):
|
|
197
|
+
# loom unresolvable / timed out / non-JSON -> fail closed (I2).
|
|
198
|
+
return {"available": False, "overall": "ERROR",
|
|
199
|
+
"error": out.get("error") or "loom returned no usable verdict",
|
|
200
|
+
"exit_code": out.get("exit_code")}
|
|
201
|
+
|
|
202
|
+
verdict = out["json"].get("gate") or {}
|
|
203
|
+
if verdict.get("gate") == "unavailable":
|
|
204
|
+
# loom reached but the vault is unresolvable behind it -> fail closed.
|
|
205
|
+
return {"available": False, "overall": "ERROR",
|
|
206
|
+
"error": verdict.get("error", "vault unavailable via loom"),
|
|
207
|
+
"exit_code": out.get("exit_code")}
|
|
208
|
+
return {
|
|
209
|
+
"available": True,
|
|
210
|
+
"overall": verdict.get("overall", "ERROR"),
|
|
211
|
+
"exit_code": out.get("exit_code"),
|
|
212
|
+
"claims": verdict.get("claims", []),
|
|
213
|
+
"mode": verdict.get("mode"),
|
|
214
|
+
"contract_version": verdict.get("contract_version"),
|
|
215
|
+
"detail": verdict.get("detail"),
|
|
216
|
+
"raw": verdict,
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
# ---------------------------------------------------------------------------
|
|
221
|
+
# The gate
|
|
222
|
+
# ---------------------------------------------------------------------------
|
|
223
|
+
|
|
224
|
+
def _sentinel_stamp(project_dir: Path, result: Dict[str, Any],
|
|
225
|
+
scope: str, phase: str) -> None:
|
|
226
|
+
"""Stamp this verdict into the claim-sentinel ledger (fail-open).
|
|
227
|
+
|
|
228
|
+
gate_satisfied is the single front door for re-derivation, so stamping here
|
|
229
|
+
means every prove/gate run — from any command, any cwd — leaves the record
|
|
230
|
+
the sentinel's claim-time invariants (ref-watch, TaskCompleted) check against."""
|
|
231
|
+
try:
|
|
232
|
+
from pathlib import Path as _P
|
|
233
|
+
import sys as _sys
|
|
234
|
+
sentinel_dir = _P(__file__).resolve().parents[1] / "sentinel"
|
|
235
|
+
if str(sentinel_dir) not in _sys.path:
|
|
236
|
+
_sys.path.insert(0, str(sentinel_dir))
|
|
237
|
+
from invariants import stamp_verdict # type: ignore
|
|
238
|
+
stamp_verdict(_P(project_dir),
|
|
239
|
+
overall=str(result.get("overall", "ERROR")),
|
|
240
|
+
satisfied=bool(result.get("satisfied")),
|
|
241
|
+
re_derived=bool(result.get("re_derived")),
|
|
242
|
+
scope=scope, phase=phase)
|
|
243
|
+
except Exception: # noqa: BLE001 — the sentinel must never break the gate
|
|
244
|
+
return
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def gate_satisfied(
|
|
248
|
+
project_dir: Path,
|
|
249
|
+
scope: str,
|
|
250
|
+
phase: str,
|
|
251
|
+
*,
|
|
252
|
+
with_attestations: bool = False,
|
|
253
|
+
require: bool = True,
|
|
254
|
+
) -> Dict[str, Any]:
|
|
255
|
+
"""The produces-gate. The vault is a **required** evidence backend
|
|
256
|
+
(installed by ``/wicked-garden:setup``), so the default is to re-derive
|
|
257
|
+
or **fail closed** — never to self-assert a PASS.
|
|
258
|
+
|
|
259
|
+
Returns ``{satisfied, re_derived, gate, ...}``. ``re_derived`` is the
|
|
260
|
+
honesty flag: True means the verdict was recomputed from frozen
|
|
261
|
+
evidence; False means either a fail-closed "unavailable" verdict or the
|
|
262
|
+
explicitly opted-out claim-only path.
|
|
263
|
+
|
|
264
|
+
- vault resolvable → run cross-check, ``re_derived: true``.
|
|
265
|
+
- vault unresolvable, ``require=True`` (default) → fail closed:
|
|
266
|
+
``satisfied: false``, ``gate: "unavailable"`` with remediation.
|
|
267
|
+
- vault unresolvable, ``require=False`` → legacy claim-only path
|
|
268
|
+
(opt-out for throwaway/low-rigor work; treat "done" with suspicion).
|
|
269
|
+
"""
|
|
270
|
+
if resolve_vault(project_dir=Path(project_dir)) is not None:
|
|
271
|
+
cc = cross_check(scope, phase, project_dir=Path(project_dir),
|
|
272
|
+
with_attestations=with_attestations)
|
|
273
|
+
if cc.get("available"):
|
|
274
|
+
result = {
|
|
275
|
+
"satisfied": cc.get("overall") == "PASS",
|
|
276
|
+
"re_derived": True,
|
|
277
|
+
"gate": "vault-cross-check",
|
|
278
|
+
"overall": cc.get("overall"),
|
|
279
|
+
"claims": cc.get("claims", []),
|
|
280
|
+
"contract_version": cc.get("contract_version"),
|
|
281
|
+
"detail": cc.get("detail"),
|
|
282
|
+
"error": cc.get("error"),
|
|
283
|
+
}
|
|
284
|
+
_sentinel_stamp(Path(project_dir), result, scope, phase)
|
|
285
|
+
return result
|
|
286
|
+
# Resolver pointed at a vault but it could not be run (offline npx,
|
|
287
|
+
# missing executable). Fail closed — do not invent a PASS.
|
|
288
|
+
if require:
|
|
289
|
+
return {
|
|
290
|
+
"satisfied": False, "re_derived": False, "gate": "unavailable",
|
|
291
|
+
"error": cc.get("error", "vault resolvable but not runnable"),
|
|
292
|
+
"reason": "wicked-vault could not be executed; gate fails closed.",
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if require:
|
|
296
|
+
return {
|
|
297
|
+
"satisfied": False,
|
|
298
|
+
"re_derived": False,
|
|
299
|
+
"gate": "unavailable",
|
|
300
|
+
"reason": (
|
|
301
|
+
"wicked-vault is a required evidence backend but is not "
|
|
302
|
+
"resolvable. Install it (`npm i -g wicked-vault` or "
|
|
303
|
+
"`npx wicked-vault-install`) and re-run /wicked-garden:setup. "
|
|
304
|
+
"Gate fails closed — 'done' cannot be self-asserted."
|
|
305
|
+
),
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
# Explicit opt-out (require=False): the doctrine-light tracker.
|
|
309
|
+
_here = str(Path(__file__).resolve().parent)
|
|
310
|
+
if _here not in sys.path:
|
|
311
|
+
sys.path.insert(0, _here)
|
|
312
|
+
import evidence_tracker as et # noqa: E402
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
"satisfied": et.produces_satisfied(Path(project_dir)),
|
|
316
|
+
"re_derived": False,
|
|
317
|
+
"gate": "claim-only",
|
|
318
|
+
"reason": (
|
|
319
|
+
"vault opt-out (require=False) — gate is doctrine-light "
|
|
320
|
+
"(satisfied-when-claimed, not re-derived)."
|
|
321
|
+
),
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
__all__ = ["resolve_vault", "vault_available", "cross_check", "gate_satisfied"]
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
# ---------------------------------------------------------------------------
|
|
329
|
+
# CLI — so markdown playbooks can call the gate from Bash.
|
|
330
|
+
# exit 0 == satisfied (gate / cross-check both gate on exit code)
|
|
331
|
+
# ---------------------------------------------------------------------------
|
|
332
|
+
|
|
333
|
+
if __name__ == "__main__":
|
|
334
|
+
import argparse
|
|
335
|
+
|
|
336
|
+
parser = argparse.ArgumentParser(description="wicked-vault-backed produces gate.")
|
|
337
|
+
sub = parser.add_subparsers(dest="action", required=True)
|
|
338
|
+
|
|
339
|
+
res = sub.add_parser("resolve", help="show how the vault CLI resolves")
|
|
340
|
+
|
|
341
|
+
cc = sub.add_parser("cross-check", help="run vault cross-check for a phase")
|
|
342
|
+
cc.add_argument("project_dir")
|
|
343
|
+
cc.add_argument("--scope", required=True)
|
|
344
|
+
cc.add_argument("--phase", required=True)
|
|
345
|
+
cc.add_argument("--with-attestations", action="store_true")
|
|
346
|
+
|
|
347
|
+
g = sub.add_parser("gate", help="gate verdict (vault required; fail-closed)")
|
|
348
|
+
g.add_argument("project_dir")
|
|
349
|
+
g.add_argument("--scope", required=True)
|
|
350
|
+
g.add_argument("--phase", required=True)
|
|
351
|
+
g.add_argument("--with-attestations", action="store_true")
|
|
352
|
+
g.add_argument("--no-require", action="store_true",
|
|
353
|
+
help="opt out of the requirement (low-rigor claim-only fallback)")
|
|
354
|
+
|
|
355
|
+
a = parser.parse_args()
|
|
356
|
+
|
|
357
|
+
if a.action == "resolve":
|
|
358
|
+
prefix = resolve_vault()
|
|
359
|
+
print(json.dumps({
|
|
360
|
+
"resolvable": prefix is not None,
|
|
361
|
+
"installed": vault_available(), # concrete install (not npx)
|
|
362
|
+
"argv_prefix": prefix,
|
|
363
|
+
# Honesty signal: did the loom shim import succeed? If False, the
|
|
364
|
+
# gate fails closed regardless of whether loom/vault are installed
|
|
365
|
+
# (the CLI sys.path bug). Lets callers/tests distinguish "loom shim
|
|
366
|
+
# broken" from "vault genuinely absent".
|
|
367
|
+
"loom_shim_loaded": _loom is not None,
|
|
368
|
+
}))
|
|
369
|
+
sys.exit(0)
|
|
370
|
+
|
|
371
|
+
if a.action == "cross-check":
|
|
372
|
+
out = cross_check(a.scope, a.phase, project_dir=Path(a.project_dir),
|
|
373
|
+
with_attestations=a.with_attestations)
|
|
374
|
+
print(json.dumps(out, indent=2))
|
|
375
|
+
sys.exit(0 if out.get("overall") == "PASS" else 1)
|
|
376
|
+
|
|
377
|
+
if a.action == "gate":
|
|
378
|
+
out = gate_satisfied(Path(a.project_dir), a.scope, a.phase,
|
|
379
|
+
with_attestations=a.with_attestations,
|
|
380
|
+
require=not a.no_require)
|
|
381
|
+
print(json.dumps(out, indent=2))
|
|
382
|
+
sys.exit(0 if out.get("satisfied") else 1)
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""verdict_audit.py — Append-only audit log of review-archetype verdicts.
|
|
3
|
+
|
|
4
|
+
Every verdict the ``review`` archetype emits gets a one-line JSONL
|
|
5
|
+
record in ``{project_dir}/audit/verdicts.jsonl``. The log is the
|
|
6
|
+
forensic record of who said what, when. No HMAC, no orphan detection
|
|
7
|
+
— this is steering-not-blocking territory. The log is for *replay*,
|
|
8
|
+
not for refusing advancement.
|
|
9
|
+
|
|
10
|
+
Restored in v11 from the deleted v6 ``gate_ingest_audit.py`` +
|
|
11
|
+
``dispatch_log.py``, slimmed (~600 LOC → ~140 LOC). HMAC signing was
|
|
12
|
+
the v6 dispatch-log's defense against rogue reviewer self-authorisation
|
|
13
|
+
in the universal pipeline. v11's review archetype has its own banned-
|
|
14
|
+
reviewer enforcement at the validation layer (verdict_schema.py); the
|
|
15
|
+
audit log just records what happened.
|
|
16
|
+
|
|
17
|
+
Stdlib-only.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import json
|
|
23
|
+
import os
|
|
24
|
+
from datetime import datetime, timezone
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Any, Dict, Optional
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
# Append-only log writer
|
|
31
|
+
# ---------------------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
def _utc_now() -> str:
|
|
34
|
+
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _audit_log_path(project_dir: Path) -> Path:
|
|
38
|
+
"""{project_dir}/audit/verdicts.jsonl"""
|
|
39
|
+
return Path(project_dir) / "audit" / "verdicts.jsonl"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def append_verdict(
|
|
43
|
+
project_dir: Path,
|
|
44
|
+
*,
|
|
45
|
+
verdict: Dict[str, Any],
|
|
46
|
+
archetype: Optional[str] = None,
|
|
47
|
+
phase: Optional[str] = None,
|
|
48
|
+
source_path: Optional[str] = None,
|
|
49
|
+
) -> Path:
|
|
50
|
+
"""Append a verdict record to the audit log.
|
|
51
|
+
|
|
52
|
+
The record carries:
|
|
53
|
+
- recorded_at (ISO-8601 UTC, when the audit was written)
|
|
54
|
+
- archetype (e.g. 'review', 'build', 'migrate')
|
|
55
|
+
- phase (the archetype phase that produced the verdict)
|
|
56
|
+
- source_path (path to the verdict.json this audits, if any)
|
|
57
|
+
- verdict_field, reviewer, score (canonical fields from the verdict)
|
|
58
|
+
- raw (the entire verdict dict, for replay fidelity)
|
|
59
|
+
|
|
60
|
+
Returns the path to the audit log file.
|
|
61
|
+
Fail-open: on any I/O error, prints to stderr and returns the path
|
|
62
|
+
that was *attempted* but does not raise.
|
|
63
|
+
"""
|
|
64
|
+
project_dir = Path(project_dir)
|
|
65
|
+
log_path = _audit_log_path(project_dir)
|
|
66
|
+
log_path.parent.mkdir(parents=True, exist_ok=True)
|
|
67
|
+
|
|
68
|
+
record = {
|
|
69
|
+
"recorded_at": _utc_now(),
|
|
70
|
+
"archetype": archetype,
|
|
71
|
+
"phase": phase,
|
|
72
|
+
"source_path": source_path,
|
|
73
|
+
"verdict": verdict.get("verdict"),
|
|
74
|
+
"reviewer": verdict.get("reviewer"),
|
|
75
|
+
"score": verdict.get("score"),
|
|
76
|
+
"raw": verdict,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
line = json.dumps(record, sort_keys=True, ensure_ascii=False, default=str)
|
|
80
|
+
try:
|
|
81
|
+
# Atomic append: open in text-append mode with line buffering.
|
|
82
|
+
with log_path.open("a", encoding="utf-8") as fh:
|
|
83
|
+
fh.write(line + "\n")
|
|
84
|
+
except OSError as exc:
|
|
85
|
+
import sys
|
|
86
|
+
print(
|
|
87
|
+
f"[verdict-audit] WARN: append failed for {log_path}: {exc}",
|
|
88
|
+
file=sys.stderr,
|
|
89
|
+
)
|
|
90
|
+
return log_path
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# ---------------------------------------------------------------------------
|
|
94
|
+
# Read-side helpers
|
|
95
|
+
# ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
def read_verdicts(
|
|
98
|
+
project_dir: Path,
|
|
99
|
+
*,
|
|
100
|
+
archetype: Optional[str] = None,
|
|
101
|
+
phase: Optional[str] = None,
|
|
102
|
+
verdict_filter: Optional[str] = None,
|
|
103
|
+
) -> list:
|
|
104
|
+
"""Load all audit records, optionally filtered by archetype / phase /
|
|
105
|
+
verdict. Returns [] when the log is missing or unreadable."""
|
|
106
|
+
project_dir = Path(project_dir)
|
|
107
|
+
log_path = _audit_log_path(project_dir)
|
|
108
|
+
if not log_path.exists():
|
|
109
|
+
return []
|
|
110
|
+
out = []
|
|
111
|
+
try:
|
|
112
|
+
for line in log_path.read_text(encoding="utf-8").splitlines():
|
|
113
|
+
if not line.strip():
|
|
114
|
+
continue
|
|
115
|
+
try:
|
|
116
|
+
rec = json.loads(line)
|
|
117
|
+
except json.JSONDecodeError:
|
|
118
|
+
continue
|
|
119
|
+
if archetype and rec.get("archetype") != archetype:
|
|
120
|
+
continue
|
|
121
|
+
if phase and rec.get("phase") != phase:
|
|
122
|
+
continue
|
|
123
|
+
if verdict_filter and rec.get("verdict") != verdict_filter:
|
|
124
|
+
continue
|
|
125
|
+
out.append(rec)
|
|
126
|
+
except OSError:
|
|
127
|
+
return out
|
|
128
|
+
return out
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
__all__ = ["append_verdict", "read_verdicts"]
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
# ---------------------------------------------------------------------------
|
|
135
|
+
# CLI
|
|
136
|
+
# ---------------------------------------------------------------------------
|
|
137
|
+
|
|
138
|
+
if __name__ == "__main__":
|
|
139
|
+
import argparse, sys
|
|
140
|
+
parser = argparse.ArgumentParser(description="v11 verdict audit log tool.")
|
|
141
|
+
sub = parser.add_subparsers(dest="action", required=True)
|
|
142
|
+
|
|
143
|
+
a = sub.add_parser("append", help="Append a verdict from a JSON file.")
|
|
144
|
+
a.add_argument("project_dir")
|
|
145
|
+
a.add_argument("--verdict-file", required=True)
|
|
146
|
+
a.add_argument("--archetype", default=None)
|
|
147
|
+
a.add_argument("--phase", default=None)
|
|
148
|
+
|
|
149
|
+
r = sub.add_parser("read", help="Read all audit records (JSON output).")
|
|
150
|
+
r.add_argument("project_dir")
|
|
151
|
+
r.add_argument("--archetype", default=None)
|
|
152
|
+
r.add_argument("--phase", default=None)
|
|
153
|
+
r.add_argument("--verdict", default=None)
|
|
154
|
+
|
|
155
|
+
args = parser.parse_args()
|
|
156
|
+
|
|
157
|
+
if args.action == "append":
|
|
158
|
+
with open(args.verdict_file, "r", encoding="utf-8") as fh:
|
|
159
|
+
verdict = json.load(fh)
|
|
160
|
+
path = append_verdict(
|
|
161
|
+
Path(args.project_dir),
|
|
162
|
+
verdict=verdict,
|
|
163
|
+
archetype=args.archetype,
|
|
164
|
+
phase=args.phase,
|
|
165
|
+
source_path=args.verdict_file,
|
|
166
|
+
)
|
|
167
|
+
print(json.dumps({"ok": True, "path": str(path)}))
|
|
168
|
+
elif args.action == "read":
|
|
169
|
+
records = read_verdicts(
|
|
170
|
+
Path(args.project_dir),
|
|
171
|
+
archetype=args.archetype,
|
|
172
|
+
phase=args.phase,
|
|
173
|
+
verdict_filter=args.verdict,
|
|
174
|
+
)
|
|
175
|
+
print(json.dumps(records, indent=2, default=str))
|