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