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