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,236 @@
1
+ #!/usr/bin/env python3
2
+ """Cheatsheet store — CLI wrapper for DomainStore cheatsheet operations.
3
+
4
+ Usage:
5
+ python3 cheatsheet_store.py store --library react --data '{"key_apis": [...], ...}'
6
+ python3 cheatsheet_store.py list [--search query]
7
+ python3 cheatsheet_store.py get --library react
8
+ python3 cheatsheet_store.py remove --library react
9
+ python3 cheatsheet_store.py update-all
10
+ """
11
+
12
+ import argparse
13
+ import json
14
+ import sys
15
+ import uuid
16
+ from datetime import datetime, timezone
17
+ from pathlib import Path
18
+
19
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
20
+ from _domain_store import DomainStore
21
+
22
+ _sm = DomainStore("wicked-smaht")
23
+
24
+
25
+ def _find_existing(library):
26
+ """Find the most recent cheatsheet for a library. Returns (record, all_matches)."""
27
+ records = _sm.list("cheatsheets") or []
28
+ matches = [
29
+ r for r in records
30
+ if r.get("library", "").lower() == library.lower()
31
+ ]
32
+ if matches:
33
+ matches.sort(key=lambda r: r.get("timestamp", ""), reverse=True)
34
+ return matches[0], matches
35
+ return None, []
36
+
37
+
38
+ def _diff_cheatsheets(old, new):
39
+ """Compute a human-readable diff between two cheatsheet records.
40
+
41
+ Returns a dict with changed sections and a boolean indicating whether
42
+ anything meaningful changed.
43
+ """
44
+ changes = {}
45
+
46
+ # Compare key_apis by name
47
+ old_apis = {a["name"]: a for a in old.get("key_apis", [])}
48
+ new_apis = {a["name"]: a for a in new.get("key_apis", [])}
49
+ added_apis = sorted(set(new_apis) - set(old_apis))
50
+ removed_apis = sorted(set(old_apis) - set(new_apis))
51
+ if added_apis or removed_apis:
52
+ changes["key_apis"] = {}
53
+ if added_apis:
54
+ changes["key_apis"]["added"] = added_apis
55
+ if removed_apis:
56
+ changes["key_apis"]["removed"] = removed_apis
57
+
58
+ # Compare common_patterns by name
59
+ old_pats = {p["name"]: p for p in old.get("common_patterns", [])}
60
+ new_pats = {p["name"]: p for p in new.get("common_patterns", [])}
61
+ added_pats = sorted(set(new_pats) - set(old_pats))
62
+ removed_pats = sorted(set(old_pats) - set(new_pats))
63
+ if added_pats or removed_pats:
64
+ changes["common_patterns"] = {}
65
+ if added_pats:
66
+ changes["common_patterns"]["added"] = added_pats
67
+ if removed_pats:
68
+ changes["common_patterns"]["removed"] = removed_pats
69
+
70
+ # Compare gotchas
71
+ old_gotchas = set(old.get("gotchas", []))
72
+ new_gotchas = set(new.get("gotchas", []))
73
+ added_g = sorted(new_gotchas - old_gotchas)
74
+ removed_g = sorted(old_gotchas - new_gotchas)
75
+ if added_g or removed_g:
76
+ changes["gotchas"] = {}
77
+ if added_g:
78
+ changes["gotchas"]["added"] = added_g
79
+ if removed_g:
80
+ changes["gotchas"]["removed"] = removed_g
81
+
82
+ has_changes = len(changes) > 0
83
+ return changes, has_changes
84
+
85
+
86
+ def cmd_store(args):
87
+ """Store a cheatsheet. Detects updates to existing entries and reports diffs."""
88
+ try:
89
+ data = json.loads(args.data)
90
+ except json.JSONDecodeError as e:
91
+ print(json.dumps({"success": False, "error": f"Invalid JSON: {e}"}))
92
+ sys.exit(1)
93
+
94
+ now = datetime.now(timezone.utc).isoformat()
95
+ existing, all_matches = _find_existing(args.library)
96
+
97
+ data.setdefault("id", str(uuid.uuid4()))
98
+ data.setdefault("library", args.library)
99
+ data.setdefault("timestamp", now)
100
+ data["fetched_at"] = now
101
+ if existing:
102
+ data["last_updated"] = now
103
+ data["previous_fetched_at"] = existing.get("fetched_at", existing.get("timestamp"))
104
+ if args.version_hint:
105
+ data.setdefault("version_hint", args.version_hint)
106
+
107
+ # Compute diff if updating an existing cheatsheet
108
+ diff_result = None
109
+ if existing:
110
+ changes, has_changes = _diff_cheatsheets(existing, data)
111
+ diff_result = {"has_changes": has_changes, "changes": changes}
112
+ # Remove old entries for this library so we don't accumulate duplicates
113
+ for old_rec in all_matches:
114
+ old_id = old_rec.get("id")
115
+ if old_id:
116
+ try:
117
+ _sm.delete("cheatsheets", old_id)
118
+ except Exception:
119
+ pass # best-effort cleanup
120
+
121
+ result = _sm.create("cheatsheets", data)
122
+ output = {"id": data["id"], "success": result is not None}
123
+ if result is None:
124
+ output["error"] = "DomainStore returned None"
125
+ if existing:
126
+ output["updated"] = True
127
+ output["diff"] = diff_result
128
+ else:
129
+ output["updated"] = False
130
+
131
+ print(json.dumps(output))
132
+
133
+
134
+ def cmd_list(args):
135
+ """List stored cheatsheets."""
136
+ records = _sm.list("cheatsheets") or []
137
+ if args.search:
138
+ q = args.search.lower()
139
+ records = [
140
+ r for r in records
141
+ if q in r.get("library", "").lower()
142
+ ]
143
+ # Deduplicate: keep only the most recent per library
144
+ seen = {}
145
+ for r in sorted(records, key=lambda x: x.get("timestamp", ""), reverse=True):
146
+ lib = r.get("library", "").lower()
147
+ if lib not in seen:
148
+ seen[lib] = r
149
+ deduped = sorted(seen.values(), key=lambda x: x.get("timestamp", ""), reverse=True)
150
+ print(json.dumps(deduped, indent=2))
151
+
152
+
153
+ def cmd_get(args):
154
+ """Get cheatsheet by library name (most recent)."""
155
+ existing, _ = _find_existing(args.library)
156
+ if existing:
157
+ print(json.dumps(existing))
158
+ else:
159
+ print(json.dumps({"found": False}))
160
+
161
+
162
+ def cmd_remove(args):
163
+ """Remove all cheatsheet entries for a library."""
164
+ existing, all_matches = _find_existing(args.library)
165
+ if not existing:
166
+ print(json.dumps({"success": False, "error": f"No cheatsheet found for '{args.library}'"}))
167
+ sys.exit(1)
168
+
169
+ removed = 0
170
+ for rec in all_matches:
171
+ rec_id = rec.get("id")
172
+ if rec_id:
173
+ try:
174
+ _sm.delete("cheatsheets", rec_id)
175
+ removed += 1
176
+ except Exception:
177
+ pass # fail open
178
+ print(json.dumps({"success": True, "library": args.library, "removed": removed}))
179
+
180
+
181
+ def cmd_update_all(args):
182
+ """List all unique libraries that have cached cheatsheets (for re-fetch orchestration)."""
183
+ records = _sm.list("cheatsheets") or []
184
+ seen = {}
185
+ for r in sorted(records, key=lambda x: x.get("timestamp", ""), reverse=True):
186
+ lib = r.get("library", "").lower()
187
+ if lib not in seen:
188
+ seen[lib] = {
189
+ "library": r.get("library"),
190
+ "version_hint": r.get("version_hint"),
191
+ "fetched_at": r.get("fetched_at", r.get("timestamp")),
192
+ }
193
+ libraries = sorted(seen.values(), key=lambda x: x.get("fetched_at", ""))
194
+ print(json.dumps({"libraries": libraries, "count": len(libraries)}))
195
+
196
+
197
+ def main():
198
+ parser = argparse.ArgumentParser(
199
+ description="Cheatsheet store — CRUD operations via DomainStore"
200
+ )
201
+ subparsers = parser.add_subparsers(dest="command", required=True)
202
+
203
+ # store subcommand
204
+ store_p = subparsers.add_parser("store", help="Store a cheatsheet")
205
+ store_p.add_argument("--library", required=True, help="Library name (e.g. react, fastapi)")
206
+ store_p.add_argument("--data", required=True, help="JSON cheatsheet payload")
207
+ store_p.add_argument("--version-hint", dest="version_hint", default=None,
208
+ help="Optional version string (e.g. 18.x)")
209
+ store_p.set_defaults(func=cmd_store)
210
+
211
+ # list subcommand
212
+ list_p = subparsers.add_parser("list", help="List stored cheatsheets")
213
+ list_p.add_argument("--search", default=None, help="Filter by library name substring")
214
+ list_p.set_defaults(func=cmd_list)
215
+
216
+ # get subcommand
217
+ get_p = subparsers.add_parser("get", help="Get most recent cheatsheet for a library")
218
+ get_p.add_argument("--library", required=True, help="Library name")
219
+ get_p.set_defaults(func=cmd_get)
220
+
221
+ # remove subcommand
222
+ remove_p = subparsers.add_parser("remove", help="Remove cheatsheet for a library")
223
+ remove_p.add_argument("--library", required=True, help="Library name to remove")
224
+ remove_p.set_defaults(func=cmd_remove)
225
+
226
+ # update-all subcommand
227
+ update_all_p = subparsers.add_parser("update-all",
228
+ help="List all cached libraries for re-fetch")
229
+ update_all_p.set_defaults(func=cmd_update_all)
230
+
231
+ args = parser.parse_args()
232
+ args.func(args)
233
+
234
+
235
+ if __name__ == "__main__":
236
+ main()
@@ -0,0 +1,386 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Context Package Builder for subagent dispatches.
4
+
5
+ Builds structured context packages for subagents instead of prose dumps.
6
+ Called by other plugins (wicked-crew, etc.) via direct import or subprocess.
7
+
8
+ Usage:
9
+ context_package.py build --task "Review auth implementation" [--project myproject] [--files src/auth/]
10
+ context_package.py build --task "..." --json
11
+ context_package.py build --task "..." --dispatch # includes ecosystem orientation for subagents
12
+
13
+ Output: A structured JSON context package with typed fields:
14
+ {
15
+ "task": "Review auth implementation",
16
+ "constraints": ["Must use JWT", "No session storage"],
17
+ "decisions": ["Chose JWT for stateless auth"],
18
+ "files": ["src/auth/handler.py", "src/auth/middleware.py"],
19
+ "tools": ["Read", "Grep", "Glob"],
20
+ "project_state": {"phase": "build", "complexity": 4},
21
+ "memories": [{"title": "...", "summary": "..."}],
22
+ "ecosystem": {"installed_plugins": [...], "key_skills": [...]}
23
+ }
24
+
25
+ The --dispatch flag adds ecosystem orientation: which plugins are installed,
26
+ what skills/tools are available, and conciseness guidance. This supplements
27
+ the SubagentStart hook with richer context for dispatched subagents.
28
+ """
29
+
30
+ import argparse
31
+ import asyncio
32
+ import json
33
+ import os
34
+ import sys
35
+ from pathlib import Path
36
+
37
+ # All domain scripts live under plugins/wicked-garden/scripts/
38
+ # context_package.py is at scripts/smaht/, so parents[1] = scripts/
39
+ _SCRIPTS_ROOT = Path(__file__).resolve().parents[1]
40
+ if str(_SCRIPTS_ROOT) not in sys.path:
41
+ sys.path.insert(0, str(_SCRIPTS_ROOT))
42
+
43
+ from _domain_store import DomainStore
44
+
45
+ # Add smaht sub-paths for adapter/v2 imports
46
+ _smaht_dir = Path(__file__).resolve().parent
47
+ if str(_smaht_dir) not in sys.path:
48
+ sys.path.insert(0, str(_smaht_dir))
49
+ if str(_smaht_dir / "v2") not in sys.path:
50
+ sys.path.insert(0, str(_smaht_dir / "v2"))
51
+
52
+
53
+ # Maps installed plugins → their most useful skills/tools for subagents.
54
+ # This is the static reference that replaces SubagentStart hook's pointer injection.
55
+ PLUGIN_SKILL_MAP = {
56
+ "mem": [
57
+ "wicked-brain:memory (recall mode) — retrieve past decisions, constraints, patterns",
58
+ "wicked-brain:memory (store mode) — persist a decision or learning for future sessions",
59
+ ],
60
+ "search": [
61
+ "wicked-brain:search — find code symbols (functions, classes, methods)",
62
+ "/wicked-garden:search:refs — find where a symbol is referenced",
63
+ "/wicked-garden:search:blast-radius — analyze what changing a symbol affects",
64
+ "wicked-brain:search — search documents (PDF, markdown, Office)",
65
+ ],
66
+ "tasks": [
67
+ "TaskCreate/TaskUpdate/TaskList/TaskGet — native Claude Code task tools; metadata validated by PreToolUse",
68
+ ],
69
+ "testing": [
70
+ "/wicked-testing:authoring — generate test scenarios with edge cases",
71
+ "/wicked-testing:plan — generate comprehensive test plan",
72
+ ],
73
+ "engineering": [
74
+ "/wicked-garden:engineering:review — code review with senior engineering perspective",
75
+ ],
76
+ "platform": [
77
+ "/wicked-garden:platform:security — security review and vulnerability assessment",
78
+ ],
79
+ "wicked-garden": [
80
+ "context7 MCP tools — query up-to-date library documentation",
81
+ ],
82
+ }
83
+
84
+
85
+ def discover_installed_plugins() -> list:
86
+ """Discover which wicked-garden domain modules are available.
87
+
88
+ Since all plugins are consolidated into scripts/{domain}/, we check
89
+ which domain directories exist under _SCRIPTS_ROOT.
90
+ """
91
+ installed = []
92
+
93
+ # Check co-located domain directories
94
+ for entry in _SCRIPTS_ROOT.iterdir():
95
+ if entry.is_dir() and not entry.name.startswith("_") and not entry.name.startswith("."):
96
+ installed.append(entry.name)
97
+
98
+ return sorted(set(installed))
99
+
100
+
101
+ def build_ecosystem_orientation(installed_plugins: list = None) -> dict:
102
+ """Build ecosystem orientation metadata for subagent prompts.
103
+
104
+ Returns dict with:
105
+ - installed_plugins: list of installed wicked-garden plugins
106
+ - key_skills: list of skill references relevant to subagents
107
+ - built_in_tools: list of Claude's built-in tools
108
+ """
109
+ if installed_plugins is None:
110
+ installed_plugins = discover_installed_plugins()
111
+
112
+ # Collect skill references for installed plugins
113
+ key_skills = []
114
+ for plugin in installed_plugins:
115
+ if plugin in PLUGIN_SKILL_MAP:
116
+ key_skills.extend(PLUGIN_SKILL_MAP[plugin])
117
+
118
+ return {
119
+ "installed_plugins": installed_plugins,
120
+ "key_skills": key_skills,
121
+ "built_in_tools": [
122
+ "Read, Grep, Glob — file reading and search",
123
+ "Edit, Write — file modification",
124
+ "Bash — shell commands",
125
+ "TaskCreate/TaskUpdate/TaskList/TaskGet — task management",
126
+ "WebSearch, WebFetch — web research",
127
+ ],
128
+ }
129
+
130
+
131
+ async def gather_memories(task: str, limit: int = 3) -> list:
132
+ """Query wicked-brain for task-relevant memories.
133
+
134
+ Uses brain_adapter directly — brain_adapter.query() returns ContextItems
135
+ with source="brain". The previous domain_adapter.query() only returned
136
+ items with source="crew" or source="jam", so the `source == "brain"`
137
+ filter always dropped every item, making this function silently return [].
138
+ Fix: route directly to brain_adapter, which queries the wicked-brain FTS5
139
+ index. Returns [] gracefully when brain is unavailable.
140
+ """
141
+ try:
142
+ from adapters import brain_adapter
143
+ items = await brain_adapter.query(task)
144
+ results = []
145
+ for item in items:
146
+ results.append({
147
+ "title": getattr(item, "title", ""),
148
+ "summary": getattr(item, "summary", "")[:200],
149
+ "type": getattr(item, "metadata", {}).get("type", "unknown"),
150
+ })
151
+ if len(results) >= limit:
152
+ break
153
+ return results
154
+ except Exception:
155
+ return []
156
+
157
+
158
+ async def gather_code_context(task: str, files: list = None, limit: int = 5) -> list:
159
+ """Query domain adapter for relevant code context.
160
+
161
+ Source-agnostic: returns items from any adapter (brain, domain, etc.).
162
+ The former source=="search" filter was removed because no adapter emits
163
+ source="search" — items come from brain/domain adapters instead.
164
+ """
165
+ try:
166
+ from adapters import domain_adapter
167
+ items = await domain_adapter.query(task)
168
+ results = []
169
+ for item in items:
170
+ results.append({
171
+ "title": getattr(item, "title", ""),
172
+ "file": getattr(item, "metadata", {}).get("file", ""),
173
+ "summary": getattr(item, "summary", "")[:200],
174
+ })
175
+ if len(results) >= limit:
176
+ break
177
+ return results
178
+ except Exception:
179
+ return []
180
+
181
+
182
+ def get_session_state() -> dict:
183
+ """Get current session state from SessionState (v6).
184
+
185
+ Replaces the v5 HistoryCondenser.get_session_state() read. The v5 condenser
186
+ maintained a "ticket rail" (current_task, topics, decisions, constraints,
187
+ file_scope, open_questions) that is no longer tracked — v6 relies on the
188
+ facilitator's process-plan.md for the durable plan view, and SessionState
189
+ for per-session flags.
190
+
191
+ Returns whatever SessionState exposes as a dict, or {} on failure. Callers
192
+ that expected the v5 ticket-rail keys should treat missing keys as "".
193
+ """
194
+ try:
195
+ # scripts/smaht/context_package.py — scripts/ is parents[1]
196
+ import sys
197
+ from pathlib import Path
198
+ _SCRIPTS_DIR = Path(__file__).resolve().parents[1]
199
+ if str(_SCRIPTS_DIR) not in sys.path:
200
+ sys.path.insert(0, str(_SCRIPTS_DIR))
201
+ from _session import SessionState
202
+ state = SessionState.load()
203
+ if hasattr(state, "to_dict"):
204
+ return state.to_dict()
205
+ # Fallback: best-effort dataclass/attr snapshot
206
+ return {k: v for k, v in vars(state).items() if not k.startswith("_")}
207
+ except Exception:
208
+ return {}
209
+
210
+
211
+ async def build_package(task: str, project: str = None, files: list = None,
212
+ include_ecosystem: bool = False) -> dict:
213
+ """Build a structured context package for a subagent.
214
+
215
+ This is the core function — assembles task-scoped context from
216
+ wicked-brain (decisions, constraints) and wicked-garden:search (code context),
217
+ plus session state from the history condenser.
218
+
219
+ Args:
220
+ task: Task description for the subagent
221
+ project: Crew project name (optional)
222
+ files: Explicit file scope (optional)
223
+ include_ecosystem: Include ecosystem orientation (tools, skills, plugins)
224
+ """
225
+ # Gather from multiple sources in parallel
226
+ mem_task = gather_memories(task)
227
+ code_task = gather_code_context(task, files)
228
+
229
+ memories, code_context = await asyncio.gather(mem_task, code_task)
230
+
231
+ # Get session state (sync)
232
+ session = get_session_state()
233
+
234
+ # Extract typed fields from session state
235
+ constraints = session.get("active_constraints", [])
236
+ decisions = session.get("decisions", [])
237
+ file_scope = files or session.get("file_scope", [])
238
+ current_task = session.get("current_task", "")
239
+
240
+ # Get project state if available (via DomainStore)
241
+ project_state = {}
242
+ if project:
243
+ try:
244
+ sm = DomainStore("wicked-crew")
245
+ data = sm.get("projects", project)
246
+ if data:
247
+ project_state = {
248
+ "phase": data.get("current_phase", ""),
249
+ "complexity": data.get("complexity_score", 0),
250
+ "signals": data.get("signals_detected", []),
251
+ }
252
+ except Exception:
253
+ pass # fail open: crew data optional
254
+
255
+ package = {
256
+ "task": task,
257
+ "current_task": current_task,
258
+ "constraints": constraints,
259
+ "decisions": decisions,
260
+ "files": file_scope,
261
+ "code_context": code_context,
262
+ "memories": memories,
263
+ "project_state": project_state,
264
+ "session_topics": session.get("topics", []),
265
+ }
266
+
267
+ # Add ecosystem orientation for dispatch mode
268
+ if include_ecosystem:
269
+ package["ecosystem"] = build_ecosystem_orientation()
270
+
271
+ return package
272
+
273
+
274
+ def format_as_prompt(package: dict) -> str:
275
+ """Format a context package as a prompt section for subagent injection.
276
+
277
+ This converts the structured JSON into a readable prompt block that
278
+ can be included in Task() dispatches.
279
+ """
280
+ lines = ["## Context Package", ""]
281
+
282
+ if package.get("task"):
283
+ lines.append(f"**Task**: {package['task']}")
284
+ if package.get("current_task"):
285
+ lines.append(f"**Session task**: {package['current_task']}")
286
+ lines.append("")
287
+
288
+ # Ecosystem orientation (dispatch mode) — goes first so subagent
289
+ # knows what tools are available before reading the task context
290
+ eco = package.get("ecosystem")
291
+ if eco:
292
+ lines.append("### Available Tools & Skills")
293
+ if eco.get("built_in_tools"):
294
+ for tool in eco["built_in_tools"]:
295
+ lines.append(f"- {tool}")
296
+ if eco.get("key_skills"):
297
+ lines.append("")
298
+ lines.append("**Ecosystem skills** (from installed plugins):")
299
+ for skill in eco["key_skills"]:
300
+ lines.append(f"- {skill}")
301
+ lines.append("")
302
+
303
+ if package.get("decisions"):
304
+ lines.append("### Decisions Made")
305
+ for d in package["decisions"]:
306
+ lines.append(f"- {d}")
307
+ lines.append("")
308
+
309
+ if package.get("constraints"):
310
+ lines.append("### Active Constraints")
311
+ for c in package["constraints"]:
312
+ lines.append(f"- {c}")
313
+ lines.append("")
314
+
315
+ if package.get("files"):
316
+ lines.append("### File Scope")
317
+ for f in package["files"][:10]:
318
+ lines.append(f"- `{f}`")
319
+ lines.append("")
320
+
321
+ if package.get("code_context"):
322
+ lines.append("### Relevant Code")
323
+ for c in package["code_context"]:
324
+ title = c.get("title", "")
325
+ file = c.get("file", "")
326
+ summary = c.get("summary", "")
327
+ lines.append(f"- **{title}** (`{file}`): {summary}")
328
+ lines.append("")
329
+
330
+ if package.get("memories"):
331
+ lines.append("### Relevant Memories")
332
+ for m in package["memories"]:
333
+ lines.append(f"- [{m.get('type', '')}] **{m.get('title', '')}**: {m.get('summary', '')}")
334
+ lines.append("")
335
+
336
+ if package.get("project_state"):
337
+ ps = package["project_state"]
338
+ if ps.get("phase"):
339
+ lines.append("### Project State")
340
+ lines.append(f"- Phase: {ps['phase']}")
341
+ if ps.get("complexity"):
342
+ lines.append(f"- Complexity: {ps['complexity']}/7")
343
+ if ps.get("signals"):
344
+ lines.append(f"- Signals: {', '.join(ps['signals'])}")
345
+ lines.append("")
346
+
347
+ # Conciseness guidance for subagents (replaces PreToolUse pressure gate)
348
+ if eco:
349
+ lines.append("### Output Guidance")
350
+ lines.append("Keep responses focused and concise. Return structured data (JSON) "
351
+ "when possible. For CLI outputs or evidence artifacts, summarize "
352
+ "rather than including verbatim. The parent orchestrator manages "
353
+ "context pressure — help by keeping your output lean.")
354
+ lines.append("")
355
+
356
+ return "\n".join(lines)
357
+
358
+
359
+ def main():
360
+ parser = argparse.ArgumentParser(description="Build structured context packages for subagents")
361
+ parser.add_argument("command", choices=["build", "format"], help="Command to run")
362
+ parser.add_argument("--task", required=True, help="Task description for the subagent")
363
+ parser.add_argument("--project", help="Crew project name (optional)")
364
+ parser.add_argument("--files", nargs="*", help="Explicit file scope (optional)")
365
+ parser.add_argument("--json", action="store_true", help="Output as JSON")
366
+ parser.add_argument("--prompt", action="store_true", help="Output as formatted prompt section")
367
+ parser.add_argument("--dispatch", action="store_true",
368
+ help="Include ecosystem orientation (tools, skills, plugins) for subagent dispatch")
369
+
370
+ args = parser.parse_args()
371
+
372
+ include_ecosystem = args.dispatch
373
+ package = asyncio.run(build_package(args.task, args.project, args.files,
374
+ include_ecosystem=include_ecosystem))
375
+
376
+ if args.command == "format" or args.prompt:
377
+ print(format_as_prompt(package))
378
+ elif args.json:
379
+ print(json.dumps(package, indent=2))
380
+ else:
381
+ # Default: formatted prompt
382
+ print(format_as_prompt(package))
383
+
384
+
385
+ if __name__ == "__main__":
386
+ main()