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.
Files changed (640) hide show
  1. package/.claude-plugin/archetypes.json +166 -0
  2. package/.claude-plugin/components.json +75 -0
  3. package/.claude-plugin/marketplace.json +15 -0
  4. package/.claude-plugin/plugin.json +174 -0
  5. package/.claude-plugin/specialist.json +48 -0
  6. package/.claude-plugin/stack-registry.json +96 -0
  7. package/AGENTS.md +13 -0
  8. package/CHANGELOG.md +712 -0
  9. package/CONTRIBUTING.md +99 -0
  10. package/ETHOS.md +83 -0
  11. package/LICENSE +21 -0
  12. package/README.md +115 -0
  13. package/WICKED_GARDEN_BUS_EVENTS.md +149 -0
  14. package/agents/agentic/architect.md +449 -0
  15. package/agents/agentic/performance-analyst.md +702 -0
  16. package/agents/agentic/safety-reviewer.md +662 -0
  17. package/agents/crew/implementer.md +163 -0
  18. package/agents/crew/researcher.md +94 -0
  19. package/agents/crew/reviewer.md +184 -0
  20. package/agents/data/data-engineer.md +227 -0
  21. package/agents/engineering/api-documentarian.md +440 -0
  22. package/agents/engineering/migration-engineer.md +301 -0
  23. package/agents/engineering/solution-architect.md +208 -0
  24. package/agents/jam/brainstorm-facilitator.md +297 -0
  25. package/agents/jam/council.md +322 -0
  26. package/agents/jam/quick-facilitator.md +85 -0
  27. package/agents/persona/persona-agent.md +121 -0
  28. package/agents/platform/compliance-officer.md +266 -0
  29. package/agents/platform/privacy-expert.md +496 -0
  30. package/agents/platform/security-engineer.md +287 -0
  31. package/agents/product/a11y-expert.md +323 -0
  32. package/agents/product/requirements-analyst.md +238 -0
  33. package/agents/product/ui-reviewer.md +180 -0
  34. package/agents/product/ux-designer.md +199 -0
  35. package/agents/product/value-strategist.md +269 -0
  36. package/agents/qe/semantic-reviewer.md +78 -0
  37. package/commands/agentic/audit.md +24 -0
  38. package/commands/agentic/design.md +24 -0
  39. package/commands/agentic/frameworks.md +25 -0
  40. package/commands/agentic/review.md +27 -0
  41. package/commands/archetype/build.md +12 -0
  42. package/commands/archetype/decide.md +12 -0
  43. package/commands/archetype/explore.md +12 -0
  44. package/commands/archetype/incident.md +12 -0
  45. package/commands/archetype/migrate.md +12 -0
  46. package/commands/archetype/modernize.md +12 -0
  47. package/commands/archetype/review.md +14 -0
  48. package/commands/archetype/ship.md +12 -0
  49. package/commands/archetype/specify.md +12 -0
  50. package/commands/archetype/triage.md +12 -0
  51. package/commands/compile.md +37 -0
  52. package/commands/data/analyze.md +18 -0
  53. package/commands/data/data.md +21 -0
  54. package/commands/data/ml.md +18 -0
  55. package/commands/data/ontology.md +22 -0
  56. package/commands/data/pipeline.md +17 -0
  57. package/commands/deliberate.md +181 -0
  58. package/commands/engineering/add-field.md +77 -0
  59. package/commands/engineering/apply.md +58 -0
  60. package/commands/engineering/arch.md +26 -0
  61. package/commands/engineering/debug.md +27 -0
  62. package/commands/engineering/docs.md +27 -0
  63. package/commands/engineering/new-generator.md +257 -0
  64. package/commands/engineering/patch-plan.md +59 -0
  65. package/commands/engineering/plan.md +29 -0
  66. package/commands/engineering/remove.md +48 -0
  67. package/commands/engineering/rename.md +44 -0
  68. package/commands/engineering/review.md +32 -0
  69. package/commands/help.md +128 -0
  70. package/commands/install.md +118 -0
  71. package/commands/intent.md +54 -0
  72. package/commands/jam/brainstorm.md +37 -0
  73. package/commands/jam/council.md +49 -0
  74. package/commands/jam/quick.md +21 -0
  75. package/commands/jam/revisit.md +79 -0
  76. package/commands/persona/as.md +136 -0
  77. package/commands/persona/define.md +24 -0
  78. package/commands/persona/list.md +118 -0
  79. package/commands/platform/actions.md +20 -0
  80. package/commands/platform/assert.md +18 -0
  81. package/commands/platform/audit.md +23 -0
  82. package/commands/platform/compliance.md +20 -0
  83. package/commands/platform/gh.md +22 -0
  84. package/commands/platform/health.md +22 -0
  85. package/commands/platform/incident.md +23 -0
  86. package/commands/platform/infra.md +24 -0
  87. package/commands/platform/peer-health.md +103 -0
  88. package/commands/platform/plugin-health.md +58 -0
  89. package/commands/platform/security.md +38 -0
  90. package/commands/platform/toolchain.md +96 -0
  91. package/commands/platform/traces.md +20 -0
  92. package/commands/product/a11y.md +19 -0
  93. package/commands/product/acceptance.md +19 -0
  94. package/commands/product/align.md +20 -0
  95. package/commands/product/analyze.md +23 -0
  96. package/commands/product/elicit.md +19 -0
  97. package/commands/product/listen.md +24 -0
  98. package/commands/product/mockup.md +20 -0
  99. package/commands/product/screenshot.md +19 -0
  100. package/commands/product/strategy.md +40 -0
  101. package/commands/product/synthesize.md +23 -0
  102. package/commands/product/ux-review.md +42 -0
  103. package/commands/product/ux.md +20 -0
  104. package/commands/product/visual-direction.md +34 -0
  105. package/commands/prove.md +47 -0
  106. package/commands/report-issue.md +243 -0
  107. package/commands/reset.md +144 -0
  108. package/commands/search/blast-radius.md +58 -0
  109. package/commands/search/hotspots.md +55 -0
  110. package/commands/search/index.md +38 -0
  111. package/commands/search/lineage.md +47 -0
  112. package/commands/search/service-map.md +79 -0
  113. package/commands/setup.md +363 -0
  114. package/commands/smaht/briefing.md +200 -0
  115. package/commands/smaht/events-import.md +95 -0
  116. package/commands/smaht/state.md +19 -0
  117. package/commands/where-am-i.md +58 -0
  118. package/docs/README.md +32 -0
  119. package/docs/adr/0001-code-relationship-graph-engine.md +116 -0
  120. package/docs/adr/0002-major-cleanup-keep-cut.md +91 -0
  121. package/docs/adr/0003-peers-gate-required-layers-optin.md +41 -0
  122. package/docs/adr/0004-code-graph-moves-to-wicked-brain.md +47 -0
  123. package/docs/brain-chunk-format.md +135 -0
  124. package/docs/compiler.md +95 -0
  125. package/docs/daemon-api.md +70 -0
  126. package/docs/domains.md +197 -0
  127. package/docs/getting-started.md +208 -0
  128. package/docs/plans/2026-06-08-wicked-loom-conduct.md +1337 -0
  129. package/docs/plans/2026-06-08-wicked-loom-contract.md +638 -0
  130. package/docs/plans/2026-06-08-wicked-loom-cutover.md +1300 -0
  131. package/docs/plans/2026-06-08-wicked-loom-expand-compose.md +843 -0
  132. package/docs/plans/2026-06-08-wicked-loom-flow-cutover.md +403 -0
  133. package/docs/plans/2026-06-10-codegraph-to-brain-phase1a-graph-core.md +838 -0
  134. package/docs/plans/2026-06-10-codegraph-to-brain-phase1b-injected-edges.md +44 -0
  135. package/docs/required-peers.md +60 -0
  136. package/docs/specs/2026-06-08-wicked-loom-extraction.md +225 -0
  137. package/docs/specs/2026-06-10-codegraph-to-brain-migration.md +168 -0
  138. package/docs/v11/archetypes.md +231 -0
  139. package/hooks/hooks.json +275 -0
  140. package/hooks/scripts/bootstrap.py +1797 -0
  141. package/hooks/scripts/invoke.py +62 -0
  142. package/hooks/scripts/notification.py +166 -0
  143. package/hooks/scripts/permission_request.py +223 -0
  144. package/hooks/scripts/post_tool.py +1374 -0
  145. package/hooks/scripts/pre_compact.py +272 -0
  146. package/hooks/scripts/pre_tool.py +1278 -0
  147. package/hooks/scripts/prompt_submit.py +1109 -0
  148. package/hooks/scripts/session_end.py +95 -0
  149. package/hooks/scripts/stop.py +624 -0
  150. package/hooks/scripts/subagent_lifecycle.py +464 -0
  151. package/hooks/scripts/subscribers/on_gate_decided.py +84 -0
  152. package/hooks/scripts/task_completed.py +322 -0
  153. package/hooks/scripts/worktree_guard.py +148 -0
  154. package/hooks/subscriptions/on_gate_decided.json +9 -0
  155. package/install.mjs +128 -0
  156. package/package.json +41 -0
  157. package/pyproject.toml +59 -0
  158. package/schemas/README.md +32 -0
  159. package/schemas/assert_contracts.json +37 -0
  160. package/schemas/health_probe.json +46 -0
  161. package/schemas/plugin_status.json +37 -0
  162. package/scripts/_adapters/__init__.py +166 -0
  163. package/scripts/_adapters/jira_adapter.py +18 -0
  164. package/scripts/_adapters/linear_adapter.py +18 -0
  165. package/scripts/_adapters/miro_adapter.py +18 -0
  166. package/scripts/_adapters/notion_adapter.py +18 -0
  167. package/scripts/_agents.py +357 -0
  168. package/scripts/_brain_ingest/__init__.py +2 -0
  169. package/scripts/_brain_ingest/session_fact_extractor.py +341 -0
  170. package/scripts/_brain_port.py +163 -0
  171. package/scripts/_bus.py +1081 -0
  172. package/scripts/_bus_catalog_gen.py +93 -0
  173. package/scripts/_bus_consumers.json +46 -0
  174. package/scripts/_bus_emit.py +43 -0
  175. package/scripts/_capability_registry.py +334 -0
  176. package/scripts/_capability_resolver.py +322 -0
  177. package/scripts/_domain_store.py +559 -0
  178. package/scripts/_event_log_reader.py +154 -0
  179. package/scripts/_event_schema.py +305 -0
  180. package/scripts/_event_store.py +397 -0
  181. package/scripts/_heavy_cadence.py +324 -0
  182. package/scripts/_integration_resolver.py +321 -0
  183. package/scripts/_logger.py +151 -0
  184. package/scripts/_loom.py +482 -0
  185. package/scripts/_paths.py +133 -0
  186. package/scripts/_python.sh +22 -0
  187. package/scripts/_run.py +137 -0
  188. package/scripts/_session.py +502 -0
  189. package/scripts/_validate_registry.py +1042 -0
  190. package/scripts/_wicked_testing_probe.py +277 -0
  191. package/scripts/agentic/analyze_agents.py +391 -0
  192. package/scripts/agentic/detect_framework.py +420 -0
  193. package/scripts/agentic/issue_taxonomy.py +357 -0
  194. package/scripts/agentic/pattern_scorer.py +434 -0
  195. package/scripts/classify/persist.py +169 -0
  196. package/scripts/compiler/compile.py +552 -0
  197. package/scripts/compiler/phase0/VERDICT.md +60 -0
  198. package/scripts/compiler/phase0/detect.py +292 -0
  199. package/scripts/compiler/phase0/emit.py +228 -0
  200. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.bindings.json +30 -0
  201. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.lint-output.txt +17 -0
  202. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/failing-tests.txt +4 -0
  203. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/honest-tests.txt +2 -0
  204. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-fail.build.md +8 -0
  205. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-missing.build.md +8 -0
  206. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/honest.build.md +8 -0
  207. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/wg_check_claims.py +174 -0
  208. package/scripts/compiler/phase0/evidence/command_iq.bindings.json +45 -0
  209. package/scripts/compiler/phase0/evidence/command_iq.lint-output.txt +17 -0
  210. package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/failing-tests.txt +4 -0
  211. package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/honest-tests.txt +3 -0
  212. package/scripts/compiler/phase0/evidence/command_iq.stage/fab-fail.build.md +8 -0
  213. package/scripts/compiler/phase0/evidence/command_iq.stage/fab-missing.build.md +8 -0
  214. package/scripts/compiler/phase0/evidence/command_iq.stage/honest.build.md +8 -0
  215. package/scripts/compiler/phase0/evidence/command_iq.stage/wg_check_claims.py +174 -0
  216. package/scripts/compiler/phase0/evidence/memos.bindings.json +28 -0
  217. package/scripts/compiler/phase0/evidence/memos.lint-output.txt +17 -0
  218. package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/failing-tests.txt +4 -0
  219. package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/honest-tests.txt +2 -0
  220. package/scripts/compiler/phase0/evidence/memos.stage/fab-fail.build.md +8 -0
  221. package/scripts/compiler/phase0/evidence/memos.stage/fab-missing.build.md +8 -0
  222. package/scripts/compiler/phase0/evidence/memos.stage/honest.build.md +8 -0
  223. package/scripts/compiler/phase0/evidence/memos.stage/wg_check_claims.py +174 -0
  224. package/scripts/compiler/phase0/evidence/verdict.json +104 -0
  225. package/scripts/compiler/phase0/evidence/wicked-bus.bindings.json +29 -0
  226. package/scripts/compiler/phase0/evidence/wicked-bus.lint-output.txt +17 -0
  227. package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/failing-tests.txt +4 -0
  228. package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/honest-tests.txt +3 -0
  229. package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-fail.build.md +8 -0
  230. package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-missing.build.md +8 -0
  231. package/scripts/compiler/phase0/evidence/wicked-bus.stage/honest.build.md +8 -0
  232. package/scripts/compiler/phase0/evidence/wicked-bus.stage/wg_check_claims.py +174 -0
  233. package/scripts/compiler/phase0/evidence/wire-vault-transcript.txt +60 -0
  234. package/scripts/compiler/phase0/run_probe.py +234 -0
  235. package/scripts/compiler/phase0/wire_vault.py +310 -0
  236. package/scripts/crew/__init__.py +0 -0
  237. package/scripts/crew/_task_audit_writer.py +243 -0
  238. package/scripts/crew/_task_reader.py +389 -0
  239. package/scripts/crew/archetypes_v11.py +348 -0
  240. package/scripts/crew/detectors/__init__.py +12 -0
  241. package/scripts/crew/flow_compiler.py +121 -0
  242. package/scripts/crew/phase_manager.py +703 -0
  243. package/scripts/crew/scope_delta.py +264 -0
  244. package/scripts/crew/specialist_resolver.py +218 -0
  245. package/scripts/crew/stack_registry.py +189 -0
  246. package/scripts/data/data_profiler.py +271 -0
  247. package/scripts/data/ontology_recommender.py +231 -0
  248. package/scripts/data/schema_validator.py +267 -0
  249. package/scripts/delivery/drift.py +739 -0
  250. package/scripts/delivery/telemetry.py +614 -0
  251. package/scripts/engineering/patch/codegraph_db.py +125 -0
  252. package/scripts/engineering/patch/generators/__init__.py +56 -0
  253. package/scripts/engineering/patch/generators/base.py +373 -0
  254. package/scripts/engineering/patch/generators/csharp_generator.py +494 -0
  255. package/scripts/engineering/patch/generators/go_generator.py +430 -0
  256. package/scripts/engineering/patch/generators/java_generator.py +928 -0
  257. package/scripts/engineering/patch/generators/jsp_generator.py +454 -0
  258. package/scripts/engineering/patch/generators/kotlin_generator.py +561 -0
  259. package/scripts/engineering/patch/generators/perl_generator.py +510 -0
  260. package/scripts/engineering/patch/generators/php_generator.py +644 -0
  261. package/scripts/engineering/patch/generators/propagation_engine.py +929 -0
  262. package/scripts/engineering/patch/generators/python_generator.py +487 -0
  263. package/scripts/engineering/patch/generators/ruby_generator.py +463 -0
  264. package/scripts/engineering/patch/generators/rust_generator.py +400 -0
  265. package/scripts/engineering/patch/generators/sql_generator.py +594 -0
  266. package/scripts/engineering/patch/generators/typescript_generator.py +439 -0
  267. package/scripts/engineering/patch/patch.py +800 -0
  268. package/scripts/engineering/patch/safety.py +429 -0
  269. package/scripts/jam/__init__.py +0 -0
  270. package/scripts/jam/_bus_consumers.py +271 -0
  271. package/scripts/jam/agentic_cli_registry.py +703 -0
  272. package/scripts/jam/consensus.py +737 -0
  273. package/scripts/jam/detect_clis.py +409 -0
  274. package/scripts/jam/jam.py +283 -0
  275. package/scripts/jam/save_transcript.py +171 -0
  276. package/scripts/loom/__init__.py +22 -0
  277. package/scripts/loom/cli.py +170 -0
  278. package/scripts/loom/compose.py +180 -0
  279. package/scripts/loom/gate.py +120 -0
  280. package/scripts/loom/manifest.py +140 -0
  281. package/scripts/loom/resolve.py +59 -0
  282. package/scripts/persona/__init__.py +0 -0
  283. package/scripts/persona/registry.py +688 -0
  284. package/scripts/platform/guard_pipeline.py +1214 -0
  285. package/scripts/platform/guard_profiles.py +216 -0
  286. package/scripts/platform/observability/assert_contracts.py +434 -0
  287. package/scripts/platform/observability/health_probe.py +915 -0
  288. package/scripts/platform/observability/ops_log_viewer.py +209 -0
  289. package/scripts/platform/prereq_doctor.py +567 -0
  290. package/scripts/qe/conditions_manifest.py +260 -0
  291. package/scripts/qe/content_sanitizer.py +160 -0
  292. package/scripts/qe/coverage_tracker.py +535 -0
  293. package/scripts/qe/discover_scenarios.py +243 -0
  294. package/scripts/qe/evidence_tracker.py +232 -0
  295. package/scripts/qe/prove.py +196 -0
  296. package/scripts/qe/registry_lookup.py +80 -0
  297. package/scripts/qe/registry_store.py +176 -0
  298. package/scripts/qe/semantic_review.py +1005 -0
  299. package/scripts/qe/vault_gate.py +382 -0
  300. package/scripts/qe/verdict_audit.py +175 -0
  301. package/scripts/qe/verdict_schema.py +335 -0
  302. package/scripts/reset.py +220 -0
  303. package/scripts/resolve_path.py +22 -0
  304. package/scripts/sentinel/invariants.py +402 -0
  305. package/scripts/sentinel/pre_push.py +73 -0
  306. package/scripts/setup/__init__.py +1 -0
  307. package/scripts/setup/detect_state.py +114 -0
  308. package/scripts/setup/migrate_legacy.py +67 -0
  309. package/scripts/setup/migrate_v6_projects.py +232 -0
  310. package/scripts/setup/onboarding.py +114 -0
  311. package/scripts/smaht/_bus_consumers.py +98 -0
  312. package/scripts/smaht/adapters/__init__.py +83 -0
  313. package/scripts/smaht/adapters/brain_adapter.py +254 -0
  314. package/scripts/smaht/adapters/context7_adapter.py +438 -0
  315. package/scripts/smaht/adapters/delegation_adapter.py +104 -0
  316. package/scripts/smaht/adapters/domain_adapter.py +206 -0
  317. package/scripts/smaht/adapters/events_adapter.py +231 -0
  318. package/scripts/smaht/adapters/tools_adapter.py +49 -0
  319. package/scripts/smaht/cheatsheet_store.py +236 -0
  320. package/scripts/smaht/context_package.py +386 -0
  321. package/scripts/smaht/knowledge_graph.py +395 -0
  322. package/scripts/smaht/propose_skills.py +856 -0
  323. package/scripts/smaht/test_cheatsheet_store.py +428 -0
  324. package/scripts/statusline.py +151 -0
  325. package/scripts/where_am_i.py +236 -0
  326. package/skills/agentic/agentic-patterns/SKILL.md +91 -0
  327. package/skills/agentic/agentic-patterns/refs/anti-patterns-design.md +283 -0
  328. package/skills/agentic/agentic-patterns/refs/anti-patterns-operational.md +216 -0
  329. package/skills/agentic/agentic-patterns/refs/pattern-catalog.md +329 -0
  330. package/skills/agentic/context-engineering/SKILL.md +142 -0
  331. package/skills/agentic/context-engineering/refs/caching-and-optimization.md +251 -0
  332. package/skills/agentic/context-engineering/refs/compression-techniques.md +171 -0
  333. package/skills/agentic/context-engineering/refs/cost-calculation-budget.md +250 -0
  334. package/skills/agentic/context-engineering/refs/cost-optimization-reporting.md +300 -0
  335. package/skills/agentic/context-engineering/refs/selective-loading.md +179 -0
  336. package/skills/agentic/frameworks/SKILL.md +191 -0
  337. package/skills/agentic/frameworks/refs/framework-profiles-1.md +209 -0
  338. package/skills/agentic/frameworks/refs/framework-profiles-2.md +214 -0
  339. package/skills/agentic/frameworks/refs/migration-patterns-paths.md +267 -0
  340. package/skills/agentic/frameworks/refs/migration-patterns-testing.md +208 -0
  341. package/skills/agentic/refs/audit.md +134 -0
  342. package/skills/agentic/refs/design.md +137 -0
  343. package/skills/agentic/refs/frameworks.md +102 -0
  344. package/skills/agentic/refs/review.md +160 -0
  345. package/skills/agentic/review-methodology/SKILL.md +186 -0
  346. package/skills/agentic/review-methodology/refs/deliverable-templates.md +246 -0
  347. package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +277 -0
  348. package/skills/agentic/review-methodology/refs/issue-taxonomy-reliability-safety.md +253 -0
  349. package/skills/agentic/trust-and-safety/SKILL.md +177 -0
  350. package/skills/agentic/trust-and-safety/refs/guardrails-actions.md +246 -0
  351. package/skills/agentic/trust-and-safety/refs/guardrails-input-output.md +238 -0
  352. package/skills/agentic/trust-and-safety/refs/guardrails-resources.md +209 -0
  353. package/skills/agentic/trust-and-safety/refs/safety-checklist-advanced.md +209 -0
  354. package/skills/agentic/trust-and-safety/refs/safety-checklist-core.md +215 -0
  355. package/skills/archetype/SKILL.md +104 -0
  356. package/skills/archetype/refs/build.md +142 -0
  357. package/skills/archetype/refs/decide.md +117 -0
  358. package/skills/archetype/refs/explore.md +66 -0
  359. package/skills/archetype/refs/incident.md +149 -0
  360. package/skills/archetype/refs/migrate.md +170 -0
  361. package/skills/archetype/refs/modernize.md +187 -0
  362. package/skills/archetype/refs/review.md +145 -0
  363. package/skills/archetype/refs/ship.md +117 -0
  364. package/skills/archetype/refs/specify.md +108 -0
  365. package/skills/archetype/refs/triage.md +62 -0
  366. package/skills/classify/SKILL.md +157 -0
  367. package/skills/data/analysis/SKILL.md +125 -0
  368. package/skills/data/analysis/refs/templates.md +170 -0
  369. package/skills/data/data/SKILL.md +118 -0
  370. package/skills/data/data/refs/examples.md +235 -0
  371. package/skills/data/ml/SKILL.md +125 -0
  372. package/skills/data/ml/refs/templates.md +172 -0
  373. package/skills/data/pipeline/SKILL.md +136 -0
  374. package/skills/data/pipeline/refs/templates.md +175 -0
  375. package/skills/data/refs/analyze.md +123 -0
  376. package/skills/data/refs/data.md +95 -0
  377. package/skills/data/refs/ml.md +118 -0
  378. package/skills/data/refs/pipeline.md +92 -0
  379. package/skills/deliberate/SKILL.md +125 -0
  380. package/skills/deliberate/refs/architecture-lens.md +37 -0
  381. package/skills/deliberate/refs/assumptions-lens.md +43 -0
  382. package/skills/deliberate/refs/code-lens.md +38 -0
  383. package/skills/deliberate/refs/content-lens.md +37 -0
  384. package/skills/deliberate/refs/data-lens.md +43 -0
  385. package/skills/deliberate/refs/design-lens.md +37 -0
  386. package/skills/deliberate/refs/opportunity-patterns.md +107 -0
  387. package/skills/deliberate/refs/ops-lens.md +43 -0
  388. package/skills/deliberate/refs/product-lens.md +46 -0
  389. package/skills/deliberate/refs/rethink-framework.md +77 -0
  390. package/skills/deliberate/refs/security-lens.md +47 -0
  391. package/skills/deliberate/refs/testing-lens.md +45 -0
  392. package/skills/deliberate/refs/timing-lens.md +42 -0
  393. package/skills/engineering/architecture/SKILL.md +177 -0
  394. package/skills/engineering/architecture/refs/adr-template.md +268 -0
  395. package/skills/engineering/architecture/refs/architecture-template-deployment.md +176 -0
  396. package/skills/engineering/architecture/refs/architecture-template-design.md +300 -0
  397. package/skills/engineering/architecture/refs/examples-ecommerce-analytics.md +299 -0
  398. package/skills/engineering/architecture/refs/examples-saas-trading.md +291 -0
  399. package/skills/engineering/architecture/refs/patterns-advanced.md +238 -0
  400. package/skills/engineering/architecture/refs/patterns-structural.md +303 -0
  401. package/skills/engineering/backend/SKILL.md +102 -0
  402. package/skills/engineering/backend/refs/checklists.md +146 -0
  403. package/skills/engineering/backend/refs/patterns.md +181 -0
  404. package/skills/engineering/debugging/SKILL.md +99 -0
  405. package/skills/engineering/debugging/refs/patterns.md +248 -0
  406. package/skills/engineering/debugging/refs/process.md +203 -0
  407. package/skills/engineering/docs/SKILL.md +97 -0
  408. package/skills/engineering/engineering/SKILL.md +88 -0
  409. package/skills/engineering/engineering/refs/checklists.md +91 -0
  410. package/skills/engineering/engineering/refs/templates.md +71 -0
  411. package/skills/engineering/frontend/SKILL.md +92 -0
  412. package/skills/engineering/frontend/refs/checklists.md +96 -0
  413. package/skills/engineering/frontend/refs/patterns.md +167 -0
  414. package/skills/engineering/integration/SKILL.md +183 -0
  415. package/skills/engineering/integration/refs/error-handling-best-practices.md +139 -0
  416. package/skills/engineering/integration/refs/error-handling-error-classes-typescript.md +212 -0
  417. package/skills/engineering/integration/refs/error-handling-error-response-format.md +301 -0
  418. package/skills/engineering/integration/refs/error-handling-retry-strategies.md +190 -0
  419. package/skills/engineering/integration/refs/event-schemas-best-practices.md +225 -0
  420. package/skills/engineering/integration/refs/event-schemas-event-naming-conventions.md +303 -0
  421. package/skills/engineering/integration/refs/event-schemas-event-structure.md +288 -0
  422. package/skills/engineering/integration/refs/graphql-best-practices.md +138 -0
  423. package/skills/engineering/integration/refs/graphql-error-handling.md +198 -0
  424. package/skills/engineering/integration/refs/graphql-graphql-basics.md +197 -0
  425. package/skills/engineering/integration/refs/graphql-query-examples.md +226 -0
  426. package/skills/engineering/integration/refs/graphql-schema-design-patterns.md +280 -0
  427. package/skills/engineering/integration/refs/grpc-grpc-overview.md +246 -0
  428. package/skills/engineering/integration/refs/grpc-implementation-examples.md +269 -0
  429. package/skills/engineering/integration/refs/grpc-metadata-headers.md +304 -0
  430. package/skills/engineering/integration/refs/grpc-testing.md +49 -0
  431. package/skills/engineering/integration/refs/openapi-template.yaml +682 -0
  432. package/skills/engineering/integration/refs/resilience-best-practices.md +109 -0
  433. package/skills/engineering/integration/refs/resilience-circuit-breaker-pattern.md +302 -0
  434. package/skills/engineering/integration/refs/resilience-rate-limiting.md +245 -0
  435. package/skills/engineering/integration/refs/resilience-timeout-pattern.md +212 -0
  436. package/skills/engineering/integration/refs/rest-api-fundamentals.md +299 -0
  437. package/skills/engineering/integration/refs/rest-api-responses-security.md +302 -0
  438. package/skills/engineering/integration/refs/versioning-breaking-changes.md +237 -0
  439. package/skills/engineering/integration/refs/versioning-migration-strategies.md +257 -0
  440. package/skills/engineering/integration/refs/versioning-versioning-strategies.md +296 -0
  441. package/skills/engineering/large-scale-migration/SKILL.md +65 -0
  442. package/skills/engineering/patch/SKILL.md +184 -0
  443. package/skills/engineering/refs/arch.md +126 -0
  444. package/skills/engineering/refs/debug.md +142 -0
  445. package/skills/engineering/refs/docs.md +190 -0
  446. package/skills/engineering/refs/plan.md +109 -0
  447. package/skills/engineering/refs/review.md +138 -0
  448. package/skills/engineering/system-design/SKILL.md +154 -0
  449. package/skills/engineering/system-design/refs/anti-patterns-big-ball-of-mud.md +254 -0
  450. package/skills/engineering/system-design/refs/anti-patterns-circular-dependencies.md +241 -0
  451. package/skills/engineering/system-design/refs/anti-patterns-feature-envy.md +168 -0
  452. package/skills/engineering/system-design/refs/anti-patterns-god-object.md +247 -0
  453. package/skills/engineering/system-design/refs/component-template-lifecycle.md +210 -0
  454. package/skills/engineering/system-design/refs/component-template-maintenance.md +219 -0
  455. package/skills/engineering/system-design/refs/component-template-structure.md +276 -0
  456. package/skills/engineering/system-design/refs/dependencies-best-practices.md +260 -0
  457. package/skills/engineering/system-design/refs/dependencies-dependency-principles.md +295 -0
  458. package/skills/engineering/system-design/refs/dependencies-dependency-tracking.md +261 -0
  459. package/skills/engineering/system-design/refs/interface-template-lifecycle.md +211 -0
  460. package/skills/engineering/system-design/refs/interface-template-maintenance.md +212 -0
  461. package/skills/engineering/system-design/refs/interface-template-structure.md +269 -0
  462. package/skills/engineering/system-design/refs/patterns-dependency-injection.md +151 -0
  463. package/skills/engineering/system-design/refs/patterns-facade-pattern.md +257 -0
  464. package/skills/engineering/system-design/refs/patterns-layered-pattern.md +204 -0
  465. package/skills/engineering/system-design/refs/patterns-plugin-architecture.md +229 -0
  466. package/skills/engineering/unit-test-quality/SKILL.md +194 -0
  467. package/skills/ground/SKILL.md +130 -0
  468. package/skills/integration-discovery/SKILL.md +168 -0
  469. package/skills/integration-discovery/refs/capabilities.md +282 -0
  470. package/skills/integration-discovery/refs/cli-detection.md +295 -0
  471. package/skills/integration-discovery/refs/discovery-sources.md +233 -0
  472. package/skills/integration-discovery/refs/task-patterns.md +206 -0
  473. package/skills/jam/SKILL.md +45 -0
  474. package/skills/jam/refs/facilitation-patterns.md +125 -0
  475. package/skills/jam/refs/quick.md +64 -0
  476. package/skills/jam/refs/synthesis-patterns.md +114 -0
  477. package/skills/multi-model/SKILL.md +168 -0
  478. package/skills/multi-model/refs/aichat.md +119 -0
  479. package/skills/multi-model/refs/aider.md +100 -0
  480. package/skills/multi-model/refs/auditability.md +238 -0
  481. package/skills/multi-model/refs/codex.md +169 -0
  482. package/skills/multi-model/refs/context.md +306 -0
  483. package/skills/multi-model/refs/copilot.md +161 -0
  484. package/skills/multi-model/refs/examples.md +224 -0
  485. package/skills/multi-model/refs/gemini.md +185 -0
  486. package/skills/multi-model/refs/goose.md +112 -0
  487. package/skills/multi-model/refs/llm.md +124 -0
  488. package/skills/multi-model/refs/opencode.md +196 -0
  489. package/skills/multi-model/refs/orchestration.md +188 -0
  490. package/skills/multi-model/refs/pi.md +208 -0
  491. package/skills/persona/SKILL.md +144 -0
  492. package/skills/persona/refs/define.md +133 -0
  493. package/skills/platform/actions/refs/actions.md +114 -0
  494. package/skills/platform/audit/SKILL.md +174 -0
  495. package/skills/platform/audit/refs/audit.md +145 -0
  496. package/skills/platform/audit/refs/checklists-evidence-operations.md +144 -0
  497. package/skills/platform/audit/refs/checklists-gdpr-pci-evidence.md +213 -0
  498. package/skills/platform/audit/refs/checklists-soc2-hipaa.md +120 -0
  499. package/skills/platform/audit/refs/frameworks-gdpr-pci.md +225 -0
  500. package/skills/platform/audit/refs/frameworks-soc2-hipaa.md +228 -0
  501. package/skills/platform/compliance/SKILL.md +169 -0
  502. package/skills/platform/compliance/refs/checklists.md +303 -0
  503. package/skills/platform/compliance/refs/compliance.md +117 -0
  504. package/skills/platform/compliance/refs/frameworks.md +282 -0
  505. package/skills/platform/errors/SKILL.md +183 -0
  506. package/skills/platform/errors/refs/patterns.md +271 -0
  507. package/skills/platform/errors/refs/severity.md +264 -0
  508. package/skills/platform/gate-benchmark-rebaseline/SKILL.md +108 -0
  509. package/skills/platform/gh/refs/gh.md +105 -0
  510. package/skills/platform/gh-cli/SKILL.md +120 -0
  511. package/skills/platform/gh-cli/refs/automation.md +63 -0
  512. package/skills/platform/gh-cli/refs/gh-ops.md +103 -0
  513. package/skills/platform/gh-cli/refs/patterns.md +132 -0
  514. package/skills/platform/gh-cli/scripts/gh_ops.py +454 -0
  515. package/skills/platform/github-actions/SKILL.md +159 -0
  516. package/skills/platform/github-actions/refs/security.md +150 -0
  517. package/skills/platform/github-actions/refs/templates.md +230 -0
  518. package/skills/platform/github-actions/refs/troubleshooting.md +174 -0
  519. package/skills/platform/github-actions/scripts/workflow_gen.py +215 -0
  520. package/skills/platform/gitlab-ci/SKILL.md +140 -0
  521. package/skills/platform/gitlab-ci/refs/templates.md +223 -0
  522. package/skills/platform/gitlab-ci/refs/troubleshooting.md +213 -0
  523. package/skills/platform/glab-cli/SKILL.md +133 -0
  524. package/skills/platform/glab-cli/refs/ci-debugging.md +95 -0
  525. package/skills/platform/glab-cli/refs/glab-ops.md +78 -0
  526. package/skills/platform/glab-cli/refs/patterns.md +131 -0
  527. package/skills/platform/glab-cli/scripts/glab_ops.py +313 -0
  528. package/skills/platform/health/SKILL.md +177 -0
  529. package/skills/platform/health/refs/health.md +72 -0
  530. package/skills/platform/health/refs/sources.md +302 -0
  531. package/skills/platform/incident/refs/incident.md +136 -0
  532. package/skills/platform/infra/refs/infra.md +104 -0
  533. package/skills/platform/observability/SKILL.md +128 -0
  534. package/skills/platform/observability/refs/toolchain-discovery.md +243 -0
  535. package/skills/platform/prereq-doctor/SKILL.md +57 -0
  536. package/skills/platform/prereq-doctor/refs/tool-registry.md +58 -0
  537. package/skills/platform/traces/refs/traces.md +101 -0
  538. package/skills/product/acceptance-criteria/SKILL.md +193 -0
  539. package/skills/product/acceptance-criteria/refs/ac-anti-patterns.md +291 -0
  540. package/skills/product/acceptance-criteria/refs/ac-examples.md +277 -0
  541. package/skills/product/accessibility/SKILL.md +197 -0
  542. package/skills/product/accessibility/refs/aria-patterns-basics.md +250 -0
  543. package/skills/product/accessibility/refs/aria-patterns-dynamic.md +187 -0
  544. package/skills/product/accessibility/refs/aria-patterns-interactive.md +246 -0
  545. package/skills/product/accessibility/refs/audit-report-findings.md +248 -0
  546. package/skills/product/accessibility/refs/audit-report-results.md +276 -0
  547. package/skills/product/accessibility/refs/common-violations-html-css.md +270 -0
  548. package/skills/product/accessibility/refs/common-violations-interactive.md +303 -0
  549. package/skills/product/accessibility/refs/keyboard-testing-basics.md +222 -0
  550. package/skills/product/accessibility/refs/keyboard-testing-patterns.md +173 -0
  551. package/skills/product/accessibility/refs/screen-reader-testing-advanced.md +294 -0
  552. package/skills/product/accessibility/refs/screen-reader-testing-commands.md +255 -0
  553. package/skills/product/accessibility/refs/wcag-checklist.md +262 -0
  554. package/skills/product/analyze/SKILL.md +164 -0
  555. package/skills/product/analyze/refs/algorithms.md +238 -0
  556. package/skills/product/analyze/refs/sentiment-patterns.md +180 -0
  557. package/skills/product/imagery/SKILL.md +97 -0
  558. package/skills/product/imagery/alter/SKILL.md +105 -0
  559. package/skills/product/imagery/alter/refs/editing-reference.md +146 -0
  560. package/skills/product/imagery/create/SKILL.md +109 -0
  561. package/skills/product/imagery/create/refs/prompt-engineering.md +112 -0
  562. package/skills/product/imagery/create/refs/provider-reference.md +219 -0
  563. package/skills/product/imagery/review/SKILL.md +101 -0
  564. package/skills/product/imagery/review/refs/analysis-lenses.md +136 -0
  565. package/skills/product/imagery/review/refs/quality-gates.md +153 -0
  566. package/skills/product/imagery/scripts/analyze.sh +23 -0
  567. package/skills/product/imagery/scripts/edit.sh +14 -0
  568. package/skills/product/imagery/scripts/generate.sh +13 -0
  569. package/skills/product/imagery/scripts/provider.py +787 -0
  570. package/skills/product/listen/SKILL.md +175 -0
  571. package/skills/product/listen/refs/channels.md +220 -0
  572. package/skills/product/mockup/SKILL.md +106 -0
  573. package/skills/product/mockup/refs/templates.md +95 -0
  574. package/skills/product/refs/a11y.md +109 -0
  575. package/skills/product/refs/acceptance.md +79 -0
  576. package/skills/product/refs/align.md +67 -0
  577. package/skills/product/refs/analyze.md +77 -0
  578. package/skills/product/refs/elicit.md +67 -0
  579. package/skills/product/refs/listen.md +58 -0
  580. package/skills/product/refs/mockup.md +77 -0
  581. package/skills/product/refs/screenshot.md +59 -0
  582. package/skills/product/refs/strategy.md +77 -0
  583. package/skills/product/refs/synthesize.md +54 -0
  584. package/skills/product/refs/ux-review.md +68 -0
  585. package/skills/product/refs/ux.md +101 -0
  586. package/skills/product/requirements-analysis/SKILL.md +136 -0
  587. package/skills/product/requirements-analysis/refs/requirements-example-auth.md +264 -0
  588. package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +88 -0
  589. package/skills/product/requirements-analysis/refs/requirements-output-format-template.md +247 -0
  590. package/skills/product/requirements-analysis/refs/user-story-guide.md +296 -0
  591. package/skills/product/requirements-graph/SKILL.md +155 -0
  592. package/skills/product/requirements-graph/refs/examples.md +223 -0
  593. package/skills/product/requirements-graph/refs/schema.md +162 -0
  594. package/skills/product/requirements-migrate/SKILL.md +90 -0
  595. package/skills/product/requirements-navigate/SKILL.md +141 -0
  596. package/skills/product/requirements-navigate/refs/meta-templates.md +141 -0
  597. package/skills/product/screenshot/SKILL.md +147 -0
  598. package/skills/product/strategy/SKILL.md +198 -0
  599. package/skills/product/strategy/refs/frameworks.md +295 -0
  600. package/skills/product/strategy/refs/templates-competitive-market.md +299 -0
  601. package/skills/product/strategy/refs/templates-roi-value.md +207 -0
  602. package/skills/product/synthesize/SKILL.md +116 -0
  603. package/skills/product/synthesize/refs/journey-mapping.md +212 -0
  604. package/skills/product/synthesize/refs/prioritization.md +193 -0
  605. package/skills/product/ux-review/SKILL.md +164 -0
  606. package/skills/product/visual-direction/SKILL.md +137 -0
  607. package/skills/product/visual-review/SKILL.md +131 -0
  608. package/skills/runtime-exec/SKILL.md +138 -0
  609. package/skills/search/codebase-narrator/SKILL.md +131 -0
  610. package/skills/search/codebase-narrator/refs/output-template.md +100 -0
  611. package/skills/smaht/SKILL.md +72 -0
  612. package/skills/smaht/discovery/SKILL.md +65 -0
  613. package/skills/smaht/intent/SKILL.md +89 -0
  614. package/skills/smaht/propose-skills/SKILL.md +142 -0
  615. package/skills/smaht/refs/state.md +76 -0
  616. package/skills/swarm/SKILL.md +132 -0
  617. package/skills/swarm/refs/fan-out.md +104 -0
  618. package/skills/swarm/refs/independent-verification.md +86 -0
  619. package/skills/swarm/refs/receipts-and-evidence.md +69 -0
  620. package/skills/swarm/refs/recon-synthesis.md +87 -0
  621. package/skills/swarm/refs/ship-discipline.md +90 -0
  622. package/skills/wickedizer/SKILL.md +147 -0
  623. package/skills/wickedizer/refs/artifact-types.md +238 -0
  624. package/skills/wickedizer/refs/complexity.md +278 -0
  625. package/skills/wickedizer/refs/de-ai-pass.md +140 -0
  626. package/skills/wickedizer/refs/failure-modes.md +249 -0
  627. package/skills/wickedizer/refs/patterns.md +282 -0
  628. package/skills/wickedizer/refs/review.md +221 -0
  629. package/skills/wickedizer/refs/structure.md +282 -0
  630. package/skills/wickedizer/refs/voice-profile.md +125 -0
  631. package/skills/workflow/SKILL.md +132 -0
  632. package/skills/workflow/refs/archetype-adjustments.md +205 -0
  633. package/skills/workflow/refs/evidence.md +58 -0
  634. package/skills/workflow/refs/integration.md +130 -0
  635. package/skills/workflow/refs/risk-dimension-signals.md +260 -0
  636. package/skills/workflow/refs/scoring-rubric.md +49 -0
  637. package/skills/workflow/refs/signal-keywords.md +176 -0
  638. package/skills/workflow/refs/specialist-routing-rules.md +159 -0
  639. package/skills/worktrees/SKILL.md +87 -0
  640. package/skills/worktrees/refs/recipes.md +96 -0
@@ -0,0 +1,335 @@
1
+ #!/usr/bin/env python3
2
+ """verdict_schema.py — Validate review-archetype verdict artifacts.
3
+
4
+ The v11 ``review`` archetype produces a verdict artifact:
5
+ APPROVE / CONDITIONAL / REJECT plus a remediation list. Reviewers
6
+ write it as JSON. This module validates the shape so downstream
7
+ consumers (build archetype hand-off, audit log replay, dashboards)
8
+ can trust the structure.
9
+
10
+ This is NOT a runtime gate. The review archetype's playbook decides
11
+ when to validate. Typical use:
12
+
13
+ from verdict_schema import validate_verdict, VerdictSchemaError
14
+
15
+ try:
16
+ validate_verdict(parsed_dict)
17
+ except VerdictSchemaError as exc:
18
+ # Surface to the reviewer; they fix and re-emit.
19
+ ...
20
+
21
+ Restored in v11 from the deleted v6 ``gate_result_schema.py``, slimmed
22
+ down (~700 LOC → ~250 LOC) with the v6 pipeline-specific cruft removed:
23
+ no rigor-tier × gate matrix, no gate-policy.json hooks, no env-var
24
+ opt-out, no banned-prefix consolidation. The validator answers one
25
+ question: *is this a structurally valid review verdict?*
26
+
27
+ Stdlib-only.
28
+ """
29
+
30
+ from __future__ import annotations
31
+
32
+ import json
33
+ import re
34
+ from datetime import datetime
35
+ from typing import Any, Dict, List, Optional
36
+
37
+
38
+ # ---------------------------------------------------------------------------
39
+ # Caps + enums
40
+ # ---------------------------------------------------------------------------
41
+
42
+ VALID_VERDICTS = frozenset({"APPROVE", "CONDITIONAL", "REJECT"})
43
+
44
+ MAX_REVIEWER_NAME_CHARS = 200
45
+ MAX_REASON_BYTES = 4_000
46
+ MAX_FINDING_BYTES = 2_000
47
+ MAX_FINDINGS_COUNT = 100
48
+ MAX_CONDITIONS_COUNT = 50
49
+ MAX_CONDITION_BYTES = 2_000
50
+ MAX_SUMMARY_BYTES = 4_000
51
+
52
+ # Names that may NEVER appear as the reviewer field. Banned-reviewer
53
+ # enforcement migrated to v11 as a per-archetype check rather than a
54
+ # global gate; the review archetype's playbook is the canonical
55
+ # enforcement surface.
56
+ BANNED_REVIEWER_NAMES = frozenset({
57
+ "auto-approve", "auto-approved", "fast-pass",
58
+ "just-finish-auto", "yolo", "auto",
59
+ })
60
+ BANNED_REVIEWER_PREFIXES = ("auto-approve-", "fast-pass-", "yolo-")
61
+
62
+ _FIELD_ALIASES: Dict[str, str] = {
63
+ # Issue #850 aliases preserved — older reviewer tooling emits
64
+ # ``timestamp`` and ``decision``; both alias to the canonical
65
+ # names. Coercion emits a one-line stderr deprecation.
66
+ "timestamp": "recorded_at",
67
+ "decision": "verdict",
68
+ }
69
+
70
+
71
+ class VerdictSchemaError(ValueError):
72
+ """Raised when a verdict artifact fails validation."""
73
+
74
+ def __init__(
75
+ self,
76
+ reason: str,
77
+ *,
78
+ offending_field: Optional[str] = None,
79
+ offending_value_excerpt: Optional[str] = None,
80
+ ):
81
+ super().__init__(reason)
82
+ self.reason = reason
83
+ self.offending_field = offending_field
84
+ self.offending_value_excerpt = offending_value_excerpt
85
+
86
+
87
+ # ---------------------------------------------------------------------------
88
+ # Helpers
89
+ # ---------------------------------------------------------------------------
90
+
91
+ _ISO8601_RE = re.compile(
92
+ r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})$"
93
+ )
94
+
95
+
96
+ def _is_iso8601(value: Any) -> bool:
97
+ if not isinstance(value, str):
98
+ return False
99
+ if not _ISO8601_RE.match(value):
100
+ return False
101
+ try:
102
+ # Python 3.11+ accepts the trailing Z directly; older versions need
103
+ # a substitution. Both supported here.
104
+ normalized = value.replace("Z", "+00:00")
105
+ datetime.fromisoformat(normalized)
106
+ return True
107
+ except ValueError:
108
+ return False
109
+
110
+
111
+ def _excerpt(value: Any, max_chars: int = 64) -> str:
112
+ s = str(value)
113
+ return s[:max_chars] + ("..." if len(s) > max_chars else "")
114
+
115
+
116
+ def _coerce_aliases(data: Dict[str, Any]) -> None:
117
+ """Mutate data: copy alias -> canonical when canonical is absent.
118
+ Stderr deprecation per coercion."""
119
+ import sys
120
+ for alias, canonical in _FIELD_ALIASES.items():
121
+ if alias in data and canonical not in data:
122
+ data[canonical] = data[alias]
123
+ print(
124
+ f"[verdict-schema] DEPRECATED: '{alias}' is an alias for "
125
+ f"'{canonical}' — please update reviewer output.",
126
+ file=sys.stderr,
127
+ )
128
+
129
+
130
+ # ---------------------------------------------------------------------------
131
+ # Public API
132
+ # ---------------------------------------------------------------------------
133
+
134
+ def validate_verdict(data: Any) -> None:
135
+ """Validate a parsed verdict dict. Raises VerdictSchemaError on any
136
+ structural violation.
137
+
138
+ Required fields:
139
+ - verdict (or its alias 'decision'): one of APPROVE/CONDITIONAL/REJECT.
140
+ - reviewer: non-empty string within char cap, not in banned list.
141
+ - recorded_at (or its alias 'timestamp'): ISO-8601 timestamp.
142
+ - score: numeric in [0.0, 1.0].
143
+
144
+ Soft caps:
145
+ - reason / summary / findings / conditions byte caps.
146
+ - findings list ≤ MAX_FINDINGS_COUNT, conditions ≤ MAX_CONDITIONS_COUNT.
147
+
148
+ Invariants (logical):
149
+ - APPROVE -> empty conditions list AND score >= 0.70.
150
+ - CONDITIONAL -> non-empty conditions list.
151
+ - REJECT -> non-empty findings list.
152
+ """
153
+ if not isinstance(data, dict):
154
+ raise VerdictSchemaError(
155
+ f"wrong-type:<root>:expected-dict:got-{type(data).__name__}",
156
+ offending_field="<root>",
157
+ )
158
+
159
+ _coerce_aliases(data)
160
+
161
+ # Required scalar fields
162
+ for required in ("verdict", "reviewer", "recorded_at", "score"):
163
+ if data.get(required) in (None, ""):
164
+ raise VerdictSchemaError(
165
+ f"missing-required-field:{required}",
166
+ offending_field=required,
167
+ )
168
+
169
+ # verdict enum
170
+ verdict = data["verdict"]
171
+ if verdict not in VALID_VERDICTS:
172
+ raise VerdictSchemaError(
173
+ f"invalid-verdict-enum:{_excerpt(verdict)}",
174
+ offending_field="verdict",
175
+ offending_value_excerpt=_excerpt(verdict),
176
+ )
177
+
178
+ # reviewer
179
+ reviewer = data["reviewer"]
180
+ if not isinstance(reviewer, str):
181
+ raise VerdictSchemaError(
182
+ f"wrong-type:reviewer:expected-str:got-{type(reviewer).__name__}",
183
+ offending_field="reviewer",
184
+ )
185
+ if len(reviewer) > MAX_REVIEWER_NAME_CHARS:
186
+ raise VerdictSchemaError(
187
+ f"field-oversize:reviewer:{len(reviewer)}>{MAX_REVIEWER_NAME_CHARS}",
188
+ offending_field="reviewer",
189
+ )
190
+ reviewer_lower = reviewer.lower().strip()
191
+ if reviewer_lower in BANNED_REVIEWER_NAMES:
192
+ raise VerdictSchemaError(
193
+ f"banned-reviewer:{reviewer}",
194
+ offending_field="reviewer",
195
+ offending_value_excerpt=_excerpt(reviewer),
196
+ )
197
+ for prefix in BANNED_REVIEWER_PREFIXES:
198
+ if reviewer_lower.startswith(prefix):
199
+ raise VerdictSchemaError(
200
+ f"banned-reviewer-prefix:{reviewer}",
201
+ offending_field="reviewer",
202
+ offending_value_excerpt=_excerpt(reviewer),
203
+ )
204
+
205
+ # recorded_at
206
+ if not _is_iso8601(data["recorded_at"]):
207
+ raise VerdictSchemaError(
208
+ "invalid-timestamp:recorded_at",
209
+ offending_field="recorded_at",
210
+ offending_value_excerpt=_excerpt(data["recorded_at"]),
211
+ )
212
+
213
+ # score
214
+ score = data["score"]
215
+ if not isinstance(score, (int, float)) or isinstance(score, bool):
216
+ raise VerdictSchemaError(
217
+ f"wrong-type:score:expected-number:got-{type(score).__name__}",
218
+ offending_field="score",
219
+ )
220
+ if not 0.0 <= float(score) <= 1.0:
221
+ raise VerdictSchemaError(
222
+ f"score-out-of-range:{score}",
223
+ offending_field="score",
224
+ offending_value_excerpt=_excerpt(score),
225
+ )
226
+
227
+ # Soft caps
228
+ for key, cap in (("reason", MAX_REASON_BYTES),
229
+ ("summary", MAX_SUMMARY_BYTES)):
230
+ if key in data and isinstance(data[key], str):
231
+ if len(data[key].encode("utf-8")) > cap:
232
+ raise VerdictSchemaError(
233
+ f"field-oversize:{key}:>{cap}",
234
+ offending_field=key,
235
+ )
236
+
237
+ # findings list
238
+ findings = data.get("findings") or []
239
+ if not isinstance(findings, list):
240
+ raise VerdictSchemaError(
241
+ f"wrong-type:findings:expected-list:got-{type(findings).__name__}",
242
+ offending_field="findings",
243
+ )
244
+ if len(findings) > MAX_FINDINGS_COUNT:
245
+ raise VerdictSchemaError(
246
+ f"too-many-findings:{len(findings)}>{MAX_FINDINGS_COUNT}",
247
+ offending_field="findings",
248
+ )
249
+ for i, f in enumerate(findings):
250
+ if isinstance(f, str) and len(f.encode("utf-8")) > MAX_FINDING_BYTES:
251
+ raise VerdictSchemaError(
252
+ f"field-oversize:findings[{i}]:>{MAX_FINDING_BYTES}",
253
+ offending_field=f"findings[{i}]",
254
+ )
255
+
256
+ # conditions list
257
+ conditions = data.get("conditions") or []
258
+ if not isinstance(conditions, list):
259
+ raise VerdictSchemaError(
260
+ f"wrong-type:conditions:expected-list:got-{type(conditions).__name__}",
261
+ offending_field="conditions",
262
+ )
263
+ if len(conditions) > MAX_CONDITIONS_COUNT:
264
+ raise VerdictSchemaError(
265
+ f"too-many-conditions:{len(conditions)}>{MAX_CONDITIONS_COUNT}",
266
+ offending_field="conditions",
267
+ )
268
+
269
+ # Logical invariants
270
+ if verdict == "APPROVE":
271
+ if conditions:
272
+ raise VerdictSchemaError(
273
+ "invariant-violation:APPROVE-with-conditions",
274
+ offending_field="conditions",
275
+ )
276
+ if float(score) < 0.70:
277
+ raise VerdictSchemaError(
278
+ f"invariant-violation:APPROVE-with-low-score:{score}<0.70",
279
+ offending_field="score",
280
+ )
281
+ elif verdict == "CONDITIONAL":
282
+ if not conditions:
283
+ raise VerdictSchemaError(
284
+ "invariant-violation:CONDITIONAL-without-conditions",
285
+ offending_field="conditions",
286
+ )
287
+ elif verdict == "REJECT":
288
+ if not findings:
289
+ raise VerdictSchemaError(
290
+ "invariant-violation:REJECT-without-findings",
291
+ offending_field="findings",
292
+ )
293
+
294
+
295
+ def validate_verdict_file(path) -> Dict[str, Any]:
296
+ """Read + validate a verdict JSON file. Raises VerdictSchemaError."""
297
+ from pathlib import Path
298
+ p = Path(path)
299
+ raw = p.read_text(encoding="utf-8")
300
+ try:
301
+ data = json.loads(raw)
302
+ except json.JSONDecodeError as exc:
303
+ raise VerdictSchemaError(
304
+ f"malformed-json:{str(exc)[:60]}",
305
+ offending_field="<root>",
306
+ ) from exc
307
+ validate_verdict(data)
308
+ return data
309
+
310
+
311
+ __all__ = [
312
+ "VerdictSchemaError",
313
+ "VALID_VERDICTS",
314
+ "BANNED_REVIEWER_NAMES",
315
+ "BANNED_REVIEWER_PREFIXES",
316
+ "validate_verdict",
317
+ "validate_verdict_file",
318
+ ]
319
+
320
+
321
+ if __name__ == "__main__":
322
+ import argparse, sys
323
+ parser = argparse.ArgumentParser(description="Validate a v11 verdict JSON file.")
324
+ parser.add_argument("path", help="Path to verdict JSON.")
325
+ args = parser.parse_args()
326
+ try:
327
+ validate_verdict_file(args.path)
328
+ print(json.dumps({"ok": True, "path": args.path}))
329
+ except VerdictSchemaError as exc:
330
+ print(json.dumps({
331
+ "ok": False, "reason": exc.reason,
332
+ "field": exc.offending_field,
333
+ "excerpt": exc.offending_value_excerpt,
334
+ }), file=sys.stderr)
335
+ sys.exit(1)
@@ -0,0 +1,220 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ reset.py — Clear wicked-garden local state for a fresh start.
4
+
5
+ Project-scoped: operates on the current project's data by default.
6
+ Use --all-projects to see/clear data across all projects.
7
+
8
+ Usage:
9
+ python3 scripts/reset.py --json # scan current project
10
+ python3 scripts/reset.py --confirm --all --json # clear everything (current project)
11
+ python3 scripts/reset.py --confirm --only smaht crew # clear specific domains
12
+ python3 scripts/reset.py --confirm --all --keep mem # clear all except memories
13
+ python3 scripts/reset.py --list-projects --json # list all projects
14
+ python3 scripts/reset.py --confirm --all --all-projects # clear ALL projects
15
+
16
+ Always stdlib-only (runs from hook/command context).
17
+ """
18
+
19
+ import argparse
20
+ import json
21
+ import shutil
22
+ import sys
23
+ from pathlib import Path
24
+
25
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
26
+ from _paths import get_project_root, get_project_slug, list_projects
27
+
28
+ _WG_ROOT = Path.home() / ".something-wicked" / "wicked-garden"
29
+
30
+ # All known domain state locations (relative to project root)
31
+ _DOMAIN_NAMES = {
32
+ "config": "Setup configuration",
33
+ "smaht": "Session history and context cache",
34
+ "crew": "Crew project data",
35
+ "mem": "Memory store (v7 local-JSON; v8.0.0 cut the surface commands — entry retained for data cleanup)",
36
+ "search": "Search index (SQLite)",
37
+ "delivery": "Delivery metrics and config",
38
+ "jam": "Brainstorm session history",
39
+ }
40
+
41
+ # Map domain names to their directory names under the project root
42
+ _DOMAIN_DIRS = {
43
+ "config": None, # special: global config.json
44
+ "smaht": "wicked-smaht",
45
+ "crew": "wicked-crew",
46
+ "mem": "wicked-garden:mem",
47
+ "search": "wicked-garden:search",
48
+ "delivery": "wicked-delivery",
49
+ "jam": "wicked-jam",
50
+ }
51
+
52
+
53
+ def _dir_size(path: Path) -> int:
54
+ """Total size in bytes of a file or directory tree."""
55
+ if path.is_file():
56
+ return path.stat().st_size
57
+ if not path.exists():
58
+ return 0
59
+ return sum(f.stat().st_size for f in path.rglob("*") if f.is_file())
60
+
61
+
62
+ def _get_domain_path(domain: str, project_root: Path) -> Path:
63
+ """Get the storage path for a domain within a project root."""
64
+ if domain == "config":
65
+ return _WG_ROOT / "config.json"
66
+ return project_root / _DOMAIN_DIRS[domain]
67
+
68
+
69
+ def _scan(project_root: Path):
70
+ """Scan for existing state in a project root."""
71
+ results = []
72
+ for domain, description in _DOMAIN_NAMES.items():
73
+ path = _get_domain_path(domain, project_root)
74
+ exists = path.exists()
75
+ size = _dir_size(path) if exists else 0
76
+ results.append({
77
+ "domain": domain,
78
+ "description": description,
79
+ "paths": [str(path)],
80
+ "exists": exists,
81
+ "size_bytes": size,
82
+ })
83
+ return results
84
+
85
+
86
+ def _clear(targets: list[str], project_root: Path) -> dict:
87
+ """Clear specified domains in a project root."""
88
+ cleared = []
89
+ skipped = []
90
+ errors = []
91
+
92
+ for domain in _DOMAIN_NAMES:
93
+ if domain not in targets:
94
+ skipped.append(domain)
95
+ continue
96
+ path = _get_domain_path(domain, project_root)
97
+ if not path.exists():
98
+ continue
99
+ try:
100
+ if path.is_file():
101
+ path.unlink()
102
+ else:
103
+ shutil.rmtree(path)
104
+ cleared.append(domain)
105
+ except Exception as e:
106
+ errors.append({"domain": domain, "path": str(path), "error": str(e)})
107
+
108
+ return {"cleared": cleared, "skipped": skipped, "errors": errors}
109
+
110
+
111
+ def _resolve_targets(only: list[str], keep: list[str], clear_all: bool) -> list[str]:
112
+ """Resolve which domains to clear based on flags."""
113
+ all_domains = list(_DOMAIN_NAMES.keys())
114
+ if only:
115
+ return [d for d in only if d in all_domains]
116
+ if clear_all:
117
+ return [d for d in all_domains if d not in keep]
118
+ return []
119
+
120
+
121
+ def main():
122
+ parser = argparse.ArgumentParser()
123
+ parser.add_argument("--json", action="store_true")
124
+ parser.add_argument("--confirm", action="store_true", help="Actually delete (without this, dry-run only)")
125
+ parser.add_argument("--only", nargs="*", default=[], help="Specific domains to clear")
126
+ parser.add_argument("--keep", nargs="*", default=[], help="Domains to preserve when using --all")
127
+ parser.add_argument("--all", dest="clear_all", action="store_true", help="Clear all domains")
128
+ parser.add_argument("--list-projects", action="store_true", help="List all projects with state")
129
+ parser.add_argument("--all-projects", action="store_true", help="Operate on all projects, not just current")
130
+ args = parser.parse_args()
131
+
132
+ project_root = get_project_root()
133
+ project_slug = get_project_slug()
134
+
135
+ if args.list_projects:
136
+ projects = list_projects()
137
+ if args.json:
138
+ print(json.dumps({"projects": projects, "current": project_slug}, indent=2))
139
+ else:
140
+ if not projects:
141
+ print("No projects found.")
142
+ else:
143
+ for p in projects:
144
+ marker = " (current)" if p["is_current"] else ""
145
+ size_kb = p["size_bytes"] / 1024
146
+ print(f" {p['slug']}{marker}: {len(p['domains'])} domains, {size_kb:.1f} KB")
147
+ return
148
+
149
+ if args.all_projects and args.confirm:
150
+ # Clear all projects
151
+ projects = list_projects()
152
+ targets = _resolve_targets(args.only, args.keep, args.clear_all)
153
+ all_results = []
154
+ for p in projects:
155
+ p_root = Path(p["path"])
156
+ result = _clear(targets, p_root)
157
+ result["project"] = p["slug"]
158
+ all_results.append(result)
159
+ # If all domains cleared, remove the project dir too
160
+ if p_root.exists() and not any(p_root.iterdir()):
161
+ p_root.rmdir()
162
+ if args.json:
163
+ print(json.dumps({"mode": "cleared", "projects": all_results}, indent=2))
164
+ else:
165
+ for r in all_results:
166
+ print(f"{r['project']}: cleared {', '.join(r['cleared']) or 'nothing'}")
167
+ return
168
+
169
+ scan = _scan(project_root)
170
+ found = [s for s in scan if s["exists"]]
171
+ targets = _resolve_targets(args.only, args.keep, args.clear_all)
172
+
173
+ if not args.confirm:
174
+ output = {
175
+ "mode": "dry_run",
176
+ "project": project_slug,
177
+ "project_root": str(project_root),
178
+ "domains": scan,
179
+ "found_count": len(found),
180
+ "total_size_bytes": sum(s["size_bytes"] for s in found),
181
+ "targets": targets,
182
+ "would_clear": [d for d in targets if any(s["exists"] for s in scan if s["domain"] == d)],
183
+ "would_keep": [s["domain"] for s in scan if s["domain"] not in targets],
184
+ }
185
+ else:
186
+ if not targets:
187
+ output = {"mode": "cleared", "project": project_slug,
188
+ "cleared": [], "skipped": list(_DOMAIN_NAMES.keys()), "errors": [],
189
+ "message": "No domains specified. Use --only or --all."}
190
+ else:
191
+ result = _clear(targets, project_root)
192
+ output = {"mode": "cleared", "project": project_slug, **result}
193
+
194
+ if args.json:
195
+ print(json.dumps(output, indent=2))
196
+ else:
197
+ if not args.confirm:
198
+ print(f"Project: {project_slug}")
199
+ print(f"Scan: {len(found)} domain(s) with state found")
200
+ for s in found:
201
+ tag = " [CLEAR]" if s["domain"] in targets else ""
202
+ print(f" {s['domain']}: {s['description']} ({s['size_bytes']} bytes){tag}")
203
+ if targets:
204
+ print(f"\nWould clear: {', '.join(targets)}")
205
+ print("\nRun with --confirm to clear.")
206
+ else:
207
+ if not targets:
208
+ print("No domains specified. Use --only or --all.")
209
+ else:
210
+ print(f"Project: {project_slug}")
211
+ print(f"Cleared: {', '.join(result['cleared']) or 'nothing'}")
212
+ if result["skipped"]:
213
+ print(f"Kept: {', '.join(result['skipped'])}")
214
+ if result["errors"]:
215
+ for e in result["errors"]:
216
+ print(f"Error: {e['domain']} — {e['error']}", file=sys.stderr)
217
+
218
+
219
+ if __name__ == "__main__":
220
+ main()
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env python3
2
+ """Resolve local storage path for a domain.
3
+
4
+ Used by command prompts to avoid hardcoded ~/.something-wicked/ paths.
5
+ Prints the resolved path to stdout.
6
+
7
+ Usage:
8
+ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/resolve_path.py" wicked-delivery
9
+ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/resolve_path.py" wicked-garden:search extracted
10
+ """
11
+
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
16
+ from _domain_store import get_local_path
17
+
18
+ if len(sys.argv) < 2:
19
+ print("Usage: resolve_path.py <domain> [subpath...]", file=sys.stderr)
20
+ sys.exit(1)
21
+
22
+ print(get_local_path(*sys.argv[1:]))