oh-my-design-cli 1.8.6 → 1.9.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 (275) hide show
  1. package/.claude/hooks/lib/preferences-parser.cjs +1 -0
  2. package/.claude/hooks/lib/preferences-writer.cjs +1 -0
  3. package/.claude/hooks/post-edit-watch.cjs +1 -0
  4. package/.claude/hooks/session-end-foldin.cjs +1 -0
  5. package/.claude/hooks/session-state-loader.cjs +1 -0
  6. package/.claude/hooks/skill-activation.cjs +1 -0
  7. package/.claude/settings.json +10 -1
  8. package/.github/assets/logo-bg.png +0 -0
  9. package/AGENTS.md +20 -1
  10. package/CHANGELOG.md +482 -0
  11. package/MIGRATION.md +103 -0
  12. package/README.ja.md +56 -19
  13. package/README.ko.md +47 -30
  14. package/README.md +48 -30
  15. package/README.zh-TW.md +59 -22
  16. package/agents/AGENT.md +8 -7
  17. package/agents/omd-codex-image.md +1 -1
  18. package/agents/omd-critic.md +6 -7
  19. package/agents/omd-designer-review.md +1 -1
  20. package/agents/omd-final-qa.md +1 -1
  21. package/agents/omd-humanizer.md +38 -0
  22. package/agents/omd-kr-writer.md +3 -4
  23. package/agents/omd-locale-adapter.md +12 -16
  24. package/agents/omd-master.md +24 -19
  25. package/agents/omd-microcopy.md +1 -1
  26. package/agents/omd-orchestrator.md +7 -8
  27. package/agents/omd-slop-auditor.md +31 -0
  28. package/agents/omd-ux-researcher.md +1 -1
  29. package/data/reference-fingerprints.json +2761 -85
  30. package/dist/bin/oh-my-design.js +16 -8
  31. package/dist/bin/oh-my-design.js.map +1 -1
  32. package/dist/chunk-UJIHCEYF.js +99 -0
  33. package/dist/chunk-UJIHCEYF.js.map +1 -0
  34. package/dist/doctor-LDWSFM3I.js +763 -0
  35. package/dist/doctor-LDWSFM3I.js.map +1 -0
  36. package/dist/install-skills-ZZFNJ2II.js +1120 -0
  37. package/dist/install-skills-ZZFNJ2II.js.map +1 -0
  38. package/docs/CLI_QUICKSTART.md +157 -0
  39. package/package.json +25 -4
  40. package/scripts/postinstall.cjs +5 -4
  41. package/skills/claude-design/SKILL.md +38 -14
  42. package/skills/claude-design/references/claude-design-flow.md +11 -11
  43. package/skills/claude-design/references/codebase-analysis.md +5 -4
  44. package/skills/omd-final-qa/SKILL.md +1 -1
  45. package/skills/omd-harness/SKILL.md +51 -50
  46. package/skills/omd-humanize/SKILL.md +116 -0
  47. package/skills/omd-humanize/agents/openai.yaml +4 -0
  48. package/skills/omd-humanize/references/locale-playbooks.md +102 -0
  49. package/skills/omd-humanize/references/sources.md +11 -0
  50. package/skills/omd-init/SKILL.md +18 -12
  51. package/skills/omd-locale-adapter/SKILL.md +58 -91
  52. package/skills/omd-orchestrator/SKILL.md +11 -5
  53. package/skills/omd-reference-capture/SKILL.md +80 -26
  54. package/skills/omd-reference-capture/scripts/PLAYWRIGHT-LICENSE.txt +202 -0
  55. package/skills/omd-reference-capture/scripts/PLAYWRIGHT-NOTICE.txt +5 -0
  56. package/skills/omd-reference-capture/scripts/THIRD_PARTY_NOTICES.md +3 -0
  57. package/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs +159906 -0
  58. package/skills/omd-slop-audit/SKILL.md +110 -0
  59. package/skills/omd-slop-audit/agents/openai.yaml +4 -0
  60. package/skills/omd-slop-audit/references/pattern-catalog.md +96 -0
  61. package/skills/omd-slop-audit/references/sources.md +24 -0
  62. package/web/references/104/DESIGN.md +354 -0
  63. package/web/references/11st/DESIGN.md +197 -316
  64. package/web/references/29cm/DESIGN.md +297 -393
  65. package/web/references/42dot/DESIGN.md +390 -0
  66. package/web/references/8percent/DESIGN.md +438 -0
  67. package/web/references/ably/DESIGN.md +267 -572
  68. package/web/references/acer/DESIGN.md +329 -0
  69. package/web/references/airbnb/DESIGN.md +219 -557
  70. package/web/references/airbridge/DESIGN.md +451 -0
  71. package/web/references/alipay/DESIGN.md +179 -420
  72. package/web/references/apple/DESIGN.md +224 -498
  73. package/web/references/asleep/DESIGN.md +402 -0
  74. package/web/references/au/DESIGN.md +334 -0
  75. package/web/references/autopedia/DESIGN.md +382 -0
  76. package/web/references/aws-cloudscape/DESIGN.md +241 -0
  77. package/web/references/baemin/DESIGN.md +332 -491
  78. package/web/references/banksalad/DESIGN.md +269 -180
  79. package/web/references/barogo/DESIGN.md +416 -0
  80. package/web/references/beusable/DESIGN.md +464 -0
  81. package/web/references/bigin/DESIGN.md +454 -0
  82. package/web/references/bilibili/DESIGN.md +206 -374
  83. package/web/references/bmw/DESIGN.md +162 -276
  84. package/web/references/brandi/DESIGN.md +184 -325
  85. package/web/references/buzzvil/DESIGN.md +457 -0
  86. package/web/references/cafe24/DESIGN.md +472 -0
  87. package/web/references/catchtable/DESIGN.md +219 -264
  88. package/web/references/cgv/DESIGN.md +317 -0
  89. package/web/references/channeltalk/DESIGN.md +210 -336
  90. package/web/references/china-airlines/DESIGN.md +291 -0
  91. package/web/references/cjonstyle/DESIGN.md +453 -0
  92. package/web/references/class101/DESIGN.md +168 -387
  93. package/web/references/classum/DESIGN.md +228 -203
  94. package/web/references/claude/DESIGN.md +242 -479
  95. package/web/references/clay/DESIGN.md +179 -377
  96. package/web/references/clickhouse/DESIGN.md +254 -343
  97. package/web/references/codeit/DESIGN.md +470 -0
  98. package/web/references/cohere/DESIGN.md +214 -324
  99. package/web/references/coinone/DESIGN.md +199 -179
  100. package/web/references/corca/DESIGN.md +414 -0
  101. package/web/references/coupang/DESIGN.md +205 -475
  102. package/web/references/cursor/DESIGN.md +240 -381
  103. package/web/references/dabang/DESIGN.md +248 -213
  104. package/web/references/dable/DESIGN.md +431 -0
  105. package/web/references/datarize/DESIGN.md +338 -0
  106. package/web/references/dealicious/DESIGN.md +402 -0
  107. package/web/references/drdiary/DESIGN.md +404 -0
  108. package/web/references/elastic/DESIGN.md +238 -0
  109. package/web/references/elevenlabs/DESIGN.md +183 -321
  110. package/web/references/elice/DESIGN.md +445 -0
  111. package/web/references/eslite/DESIGN.md +257 -0
  112. package/web/references/evaair/DESIGN.md +338 -0
  113. package/web/references/expo/DESIGN.md +238 -331
  114. package/web/references/familymart-tw/DESIGN.md +254 -0
  115. package/web/references/ferrari/DESIGN.md +160 -377
  116. package/web/references/figma/DESIGN.md +197 -451
  117. package/web/references/fitpet/DESIGN.md +445 -0
  118. package/web/references/flex/DESIGN.md +170 -253
  119. package/web/references/framer/DESIGN.md +197 -340
  120. package/web/references/freee/DESIGN.md +211 -533
  121. package/web/references/friendliai/DESIGN.md +431 -0
  122. package/web/references/frip/DESIGN.md +440 -0
  123. package/web/references/furiosaai/DESIGN.md +450 -0
  124. package/web/references/gangnamunni/DESIGN.md +154 -591
  125. package/web/references/gaudiolab/DESIGN.md +414 -0
  126. package/web/references/google/DESIGN.md +290 -398
  127. package/web/references/goorm/DESIGN.md +470 -0
  128. package/web/references/greencar/DESIGN.md +420 -0
  129. package/web/references/hackle/DESIGN.md +472 -0
  130. package/web/references/hashicorp/DESIGN.md +273 -318
  131. package/web/references/heydealer/DESIGN.md +429 -0
  132. package/web/references/humanscape/DESIGN.md +433 -0
  133. package/web/references/hwahae/DESIGN.md +453 -0
  134. package/web/references/hyundai/DESIGN.md +158 -368
  135. package/web/references/hyundaicard/DESIGN.md +171 -121
  136. package/web/references/ibm/DESIGN.md +227 -378
  137. package/web/references/idus/DESIGN.md +450 -0
  138. package/web/references/igaworks/DESIGN.md +437 -0
  139. package/web/references/inflearn/DESIGN.md +221 -366
  140. package/web/references/intuit/DESIGN.md +244 -0
  141. package/web/references/jandi/DESIGN.md +191 -291
  142. package/web/references/jobplanet/DESIGN.md +415 -0
  143. package/web/references/kakao/DESIGN.md +287 -475
  144. package/web/references/kakaobank/DESIGN.md +220 -521
  145. package/web/references/kakaogames/DESIGN.md +220 -0
  146. package/web/references/kakaopay/DESIGN.md +207 -526
  147. package/web/references/karrot/DESIGN.md +227 -251
  148. package/web/references/kb-kookmin/DESIGN.md +308 -0
  149. package/web/references/kbank/DESIGN.md +220 -175
  150. package/web/references/kcd/DESIGN.md +432 -0
  151. package/web/references/kmong/DESIGN.md +281 -356
  152. package/web/references/krds/DESIGN.md +245 -19
  153. package/web/references/kream/DESIGN.md +224 -359
  154. package/web/references/kurly/DESIGN.md +211 -533
  155. package/web/references/kyobobook/DESIGN.md +445 -0
  156. package/web/references/lablup/DESIGN.md +474 -0
  157. package/web/references/lamborghini/DESIGN.md +198 -360
  158. package/web/references/lemonbase/DESIGN.md +452 -0
  159. package/web/references/lguplus/DESIGN.md +259 -0
  160. package/web/references/likelion/DESIGN.md +283 -0
  161. package/web/references/line/DESIGN.md +396 -355
  162. package/web/references/linear.app/DESIGN.md +209 -562
  163. package/web/references/lotteon/DESIGN.md +386 -0
  164. package/web/references/lovable/DESIGN.md +255 -349
  165. package/web/references/makinarocks/DESIGN.md +242 -0
  166. package/web/references/maum-ai/DESIGN.md +423 -0
  167. package/web/references/medibloc/DESIGN.md +425 -0
  168. package/web/references/megabox/DESIGN.md +232 -0
  169. package/web/references/mercari/DESIGN.md +217 -434
  170. package/web/references/microsoft/DESIGN.md +234 -388
  171. package/web/references/mildang/DESIGN.md +411 -0
  172. package/web/references/millie/DESIGN.md +183 -504
  173. package/web/references/minimax/DESIGN.md +264 -322
  174. package/web/references/miricanvas/DESIGN.md +182 -355
  175. package/web/references/miro/DESIGN.md +234 -232
  176. package/web/references/mistral.ai/DESIGN.md +231 -314
  177. package/web/references/mixi/DESIGN.md +234 -0
  178. package/web/references/moin/DESIGN.md +445 -0
  179. package/web/references/mongodb/DESIGN.md +219 -316
  180. package/web/references/moreh/DESIGN.md +437 -0
  181. package/web/references/musinsa/DESIGN.md +184 -510
  182. package/web/references/mynavi/DESIGN.md +242 -0
  183. package/web/references/myrealtrip/DESIGN.md +169 -406
  184. package/web/references/naver/DESIGN.md +328 -499
  185. package/web/references/naverwebtoon/DESIGN.md +172 -395
  186. package/web/references/neosapience/DESIGN.md +441 -0
  187. package/web/references/nhn/DESIGN.md +169 -346
  188. package/web/references/nhncloud/DESIGN.md +185 -123
  189. package/web/references/nota/DESIGN.md +451 -0
  190. package/web/references/notion/DESIGN.md +271 -475
  191. package/web/references/nrise/DESIGN.md +417 -0
  192. package/web/references/ohouse/DESIGN.md +210 -549
  193. package/web/references/oliveyoung/DESIGN.md +217 -326
  194. package/web/references/ollama/DESIGN.md +241 -308
  195. package/web/references/onestore/DESIGN.md +248 -0
  196. package/web/references/palantir/DESIGN.md +256 -0
  197. package/web/references/panasonic/DESIGN.md +276 -0
  198. package/web/references/patternfly/DESIGN.md +259 -0
  199. package/web/references/payhere/DESIGN.md +438 -0
  200. package/web/references/pega/DESIGN.md +262 -0
  201. package/web/references/peoplefund/DESIGN.md +431 -0
  202. package/web/references/petfriends/DESIGN.md +428 -0
  203. package/web/references/pinkfong/DESIGN.md +199 -367
  204. package/web/references/pinterest/DESIGN.md +258 -308
  205. package/web/references/portone/DESIGN.md +446 -0
  206. package/web/references/poya/DESIGN.md +286 -0
  207. package/web/references/pozalabs/DESIGN.md +438 -0
  208. package/web/references/protopie/DESIGN.md +419 -0
  209. package/web/references/qraft/DESIGN.md +448 -0
  210. package/web/references/queenit/DESIGN.md +432 -0
  211. package/web/references/quotabook/DESIGN.md +449 -0
  212. package/web/references/rebellions/DESIGN.md +449 -0
  213. package/web/references/recruit/DESIGN.md +247 -0
  214. package/web/references/remember/DESIGN.md +202 -396
  215. package/web/references/resend/DESIGN.md +274 -348
  216. package/web/references/returnzero/DESIGN.md +460 -0
  217. package/web/references/sakura-internet/DESIGN.md +269 -0
  218. package/web/references/samsung/DESIGN.md +157 -359
  219. package/web/references/sandoll/DESIGN.md +445 -0
  220. package/web/references/sanity/DESIGN.md +241 -375
  221. package/web/references/saramin/DESIGN.md +465 -0
  222. package/web/references/scatterlab/DESIGN.md +412 -0
  223. package/web/references/selectstar/DESIGN.md +439 -0
  224. package/web/references/servicenow/DESIGN.md +289 -0
  225. package/web/references/shiftee/DESIGN.md +468 -0
  226. package/web/references/shinhanbank/DESIGN.md +161 -341
  227. package/web/references/shinhancard/DESIGN.md +208 -319
  228. package/web/references/sionic/DESIGN.md +454 -0
  229. package/web/references/sktelecom/DESIGN.md +310 -0
  230. package/web/references/socar/DESIGN.md +125 -32
  231. package/web/references/softbank/DESIGN.md +231 -0
  232. package/web/references/solapi/DESIGN.md +483 -0
  233. package/web/references/sony/DESIGN.md +234 -0
  234. package/web/references/soop/DESIGN.md +261 -0
  235. package/web/references/spacex/DESIGN.md +184 -323
  236. package/web/references/spotify/DESIGN.md +253 -394
  237. package/web/references/squeezebits/DESIGN.md +441 -0
  238. package/web/references/stayfolio/DESIGN.md +422 -0
  239. package/web/references/stripe/DESIGN.md +212 -491
  240. package/web/references/supabase/DESIGN.md +244 -316
  241. package/web/references/supertone/DESIGN.md +413 -0
  242. package/web/references/tabling/DESIGN.md +415 -0
  243. package/web/references/taishinbank/DESIGN.md +243 -0
  244. package/web/references/teamlab/DESIGN.md +240 -0
  245. package/web/references/teamsparta/DESIGN.md +472 -0
  246. package/web/references/tellingme/DESIGN.md +392 -0
  247. package/web/references/tesla/DESIGN.md +244 -427
  248. package/web/references/thsr/DESIGN.md +284 -0
  249. package/web/references/thumbtack/DESIGN.md +302 -0
  250. package/web/references/together.ai/DESIGN.md +257 -304
  251. package/web/references/toss/DESIGN.md +251 -593
  252. package/web/references/toss-securities/DESIGN.md +255 -178
  253. package/web/references/tossbank/DESIGN.md +195 -491
  254. package/web/references/toyota/DESIGN.md +238 -0
  255. package/web/references/tving/DESIGN.md +197 -245
  256. package/web/references/typed/DESIGN.md +413 -0
  257. package/web/references/uber/DESIGN.md +256 -333
  258. package/web/references/udn/DESIGN.md +250 -0
  259. package/web/references/upbit/DESIGN.md +145 -256
  260. package/web/references/upstage/DESIGN.md +211 -204
  261. package/web/references/uswds/DESIGN.md +287 -0
  262. package/web/references/vercel/DESIGN.md +236 -440
  263. package/web/references/vuno/DESIGN.md +413 -0
  264. package/web/references/wanted/DESIGN.md +215 -487
  265. package/web/references/weverse/DESIGN.md +437 -0
  266. package/web/references/wise/DESIGN.md +223 -231
  267. package/web/references/wisetracker/DESIGN.md +462 -0
  268. package/web/references/wooribank/DESIGN.md +245 -0
  269. package/web/references/yanolja/DESIGN.md +250 -419
  270. package/web/references/yeogiotte/DESIGN.md +235 -418
  271. package/web/references/zapier/DESIGN.md +256 -377
  272. package/web/references/zendesk/DESIGN.md +288 -0
  273. package/web/references/zigzag/DESIGN.md +200 -621
  274. package/dist/install-skills-7UUDOLG2.js +0 -734
  275. package/dist/install-skills-7UUDOLG2.js.map +0 -1
@@ -23,18 +23,21 @@ function readPackageVersion() {
23
23
  return "0.0.0";
24
24
  }
25
25
  var program = new Command();
26
- program.name("oh-my-design").description("Bootstrap oh-my-design skills + agents into your project. After install, talk to your agent in natural language \u2014 no other CLI commands.").version(readPackageVersion()).showSuggestionAfterError(true).showHelpAfterError(true);
27
- program.command("install-skills").description("Install omd skill files + canonical agents into agent directories (.claude/, .codex/, .opencode/). Interactive multiselect TUI by default \u2014 picks which skills + sub-agents to install.").option("--dir <path>", "Project root (defaults to cwd)").option("--agent <name...>", "Restrict to specific channels (claude-code | codex | opencode | cursor)").option("--force", "Overwrite existing files even without the omd marker").option("--all", "Skip the interactive TUI and install every shipped skill + agent (use in CI)").option("--skills <names>", "Comma-separated skill names to install (overrides TUI)", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).option("--agents-only <names>", "Comma-separated agent names to install (overrides TUI). Use --agents-only to disambiguate from --agent (channel selector).", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).option("--skills-only", "Install only the named skill files \u2014 skip sub-agents, hooks, and settings.json (minimal single-skill install, e.g. --skills claude-design --skills-only)").option("--global", "Install to the user-level dir (~/.claude/skills, available in every project) instead of this project. Writes skills + sub-agents; never touches global hooks/settings.").action(
26
+ program.name("oh-my-design").description("Install and diagnose the oh-my-design skill bundle. After setup, design work happens through natural-language prompts in your coding agent.").version(readPackageVersion()).showSuggestionAfterError(true).showHelpAfterError(true);
27
+ program.action(async () => {
28
+ const { runInstallSkills } = await import("../install-skills-ZZFNJ2II.js");
29
+ const code = await runInstallSkills();
30
+ if (code !== 0) process.exit(code);
31
+ });
32
+ program.command("install-skills").description("Install OmD skills, specialist roles, and the reference catalog into the selected coding-agent channels.").option("--dir <path>", "Project root (defaults to cwd)").option("--agent <name...>", "Restrict to specific channels (claude-code | codex | opencode | cursor)").option("--force", "Overwrite existing files even without the omd marker").option("--repair-hooks", "Refresh the managed Claude hook bundle without overwriting other unmarked files").option("--all", "Skip the interactive TUI and install every shipped skill + agent (use in CI)").option("--skills <names>", "Comma-separated skill names to install (overrides TUI)", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).option("--agents-only <names>", "Comma-separated agent names to install (overrides TUI). Use --agents-only to disambiguate from --agent (channel selector).", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).option("--skills-only", "Install only the named skill files \u2014 skip sub-agents, hooks, and settings.json (minimal single-skill install, e.g. --skills claude-design --skills-only)").option("--global", "Install to each channel's user-level discovery directory instead of this project. Writes skills + sub-agents + catalog; never touches global hooks/settings.").action(
28
33
  async (opts) => {
29
- const { runInstallSkills } = await import("../install-skills-7UUDOLG2.js");
30
- const validAgents = ["claude-code", "codex", "opencode", "cursor"];
31
- const agents = opts.agent ? opts.agent.filter(
32
- (a) => validAgents.includes(a)
33
- ) : void 0;
34
+ const { runInstallSkills } = await import("../install-skills-ZZFNJ2II.js");
35
+ const agents = opts.agent;
34
36
  const code = await runInstallSkills({
35
37
  dir: opts.dir,
36
38
  agents,
37
39
  force: opts.force,
40
+ repairHooks: opts.repairHooks,
38
41
  all: opts.all,
39
42
  skillsFilter: opts.skills,
40
43
  agentsFilter: opts.agentsOnly,
@@ -44,5 +47,10 @@ program.command("install-skills").description("Install omd skill files + canonic
44
47
  if (code !== 0) process.exit(code);
45
48
  }
46
49
  );
47
- program.parse();
50
+ program.command("doctor").description("Check whether skills, sub-agents, references, and DESIGN.md are ready; print the exact next action.").option("--dir <path>", "Project root (defaults to cwd)").option("--global", "Check the user-level installation instead of this project").option("--json", "Print a machine-readable report").action(async (opts) => {
51
+ const { runDoctor } = await import("../doctor-LDWSFM3I.js");
52
+ const code = await runDoctor(opts);
53
+ if (code !== 0) process.exit(code);
54
+ });
55
+ await program.parseAsync();
48
56
  //# sourceMappingURL=oh-my-design.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../bin/oh-my-design.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n let cur = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const pkg = join(cur, 'package.json');\n if (existsSync(pkg)) {\n try {\n return JSON.parse(readFileSync(pkg, 'utf8')).version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n }\n const parent = dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return '0.0.0';\n}\n\nconst program = new Command();\n\nprogram\n .name('oh-my-design')\n .description('Bootstrap oh-my-design skills + agents into your project. After install, talk to your agent in natural language no other CLI commands.')\n .version(readPackageVersion())\n .showSuggestionAfterError(true)\n .showHelpAfterError(true);\n\nprogram\n .command('install-skills')\n .description('Install omd skill files + canonical agents into agent directories (.claude/, .codex/, .opencode/). Interactive multiselect TUI by default picks which skills + sub-agents to install.')\n .option('--dir <path>', 'Project root (defaults to cwd)')\n .option('--agent <name...>', 'Restrict to specific channels (claude-code | codex | opencode | cursor)')\n .option('--force', 'Overwrite existing files even without the omd marker')\n .option('--all', 'Skip the interactive TUI and install every shipped skill + agent (use in CI)')\n .option('--skills <names>', 'Comma-separated skill names to install (overrides TUI)', (v) => v.split(',').map((s) => s.trim()).filter(Boolean))\n .option('--agents-only <names>', 'Comma-separated agent names to install (overrides TUI). Use --agents-only to disambiguate from --agent (channel selector).', (v) => v.split(',').map((s) => s.trim()).filter(Boolean))\n .option('--skills-only', 'Install only the named skill files — skip sub-agents, hooks, and settings.json (minimal single-skill install, e.g. --skills claude-design --skills-only)')\n .option('--global', 'Install to the user-level dir (~/.claude/skills, available in every project) instead of this project. Writes skills + sub-agents; never touches global hooks/settings.')\n .action(\n async (opts: {\n dir?: string;\n agent?: string[];\n force?: boolean;\n all?: boolean;\n skills?: string[];\n agentsOnly?: string[];\n skillsOnly?: boolean;\n global?: boolean;\n }) => {\n const { runInstallSkills } = await import('../src/cli/install-skills.js');\n const validAgents = ['claude-code', 'codex', 'opencode', 'cursor'] as const;\n type Agent = (typeof validAgents)[number];\n const agents = opts.agent\n ? (opts.agent.filter((a): a is Agent =>\n (validAgents as readonly string[]).includes(a)\n ) as Agent[])\n : undefined;\n const code = await runInstallSkills({\n dir: opts.dir,\n agents,\n force: opts.force,\n all: opts.all,\n skillsFilter: opts.skills,\n agentsFilter: opts.agentsOnly,\n skillsOnly: opts.skillsOnly,\n global: opts.global,\n });\n if (code !== 0) process.exit(code);\n }\n );\n\nprogram.parse();\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,cAAc,kBAAkB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,qBAA6B;AACpC,MAAI,MAAM,QAAQ,cAAc,YAAY,GAAG,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,MAAM,KAAK,KAAK,cAAc;AACpC,QAAI,WAAW,GAAG,GAAG;AACnB,UAAI;AACF,eAAO,KAAK,MAAM,aAAa,KAAK,MAAM,CAAC,EAAE,WAAW;AAAA,MAC1D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,cAAc,EACnB,YAAY,+IAA0I,EACtJ,QAAQ,mBAAmB,CAAC,EAC5B,yBAAyB,IAAI,EAC7B,mBAAmB,IAAI;AAE1B,QACG,QAAQ,gBAAgB,EACxB,YAAY,8LAAyL,EACrM,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,qBAAqB,yEAAyE,EACrG,OAAO,WAAW,sDAAsD,EACxE,OAAO,SAAS,8EAA8E,EAC9F,OAAO,oBAAoB,0DAA0D,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,EAC7I,OAAO,yBAAyB,8HAA8H,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,EACtN,OAAO,iBAAiB,+JAA0J,EAClL,OAAO,YAAY,wKAAwK,EAC3L;AAAA,EACC,OAAO,SASD;AACJ,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,+BAA8B;AACxE,UAAM,cAAc,CAAC,eAAe,SAAS,YAAY,QAAQ;AAEjE,UAAM,SAAS,KAAK,QACf,KAAK,MAAM;AAAA,MAAO,CAAC,MACjB,YAAkC,SAAS,CAAC;AAAA,IAC/C,IACA;AACJ,UAAM,OAAO,MAAM,iBAAiB;AAAA,MAClC,KAAK,KAAK;AAAA,MACV;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AAAA,EACnC;AACF;AAEF,QAAQ,MAAM;","names":[]}
1
+ {"version":3,"sources":["../../bin/oh-my-design.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n let cur = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const pkg = join(cur, 'package.json');\n if (existsSync(pkg)) {\n try {\n return JSON.parse(readFileSync(pkg, 'utf8')).version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n }\n const parent = dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return '0.0.0';\n}\n\nconst program = new Command();\n\nprogram\n .name('oh-my-design')\n .description('Install and diagnose the oh-my-design skill bundle. After setup, design work happens through natural-language prompts in your coding agent.')\n .version(readPackageVersion())\n .showSuggestionAfterError(true)\n .showHelpAfterError(true);\n\nprogram.action(async () => {\n const { runInstallSkills } = await import('../src/cli/install-skills.js');\n const code = await runInstallSkills();\n if (code !== 0) process.exit(code);\n});\n\nprogram\n .command('install-skills')\n .description('Install OmD skills, specialist roles, and the reference catalog into the selected coding-agent channels.')\n .option('--dir <path>', 'Project root (defaults to cwd)')\n .option('--agent <name...>', 'Restrict to specific channels (claude-code | codex | opencode | cursor)')\n .option('--force', 'Overwrite existing files even without the omd marker')\n .option('--repair-hooks', 'Refresh the managed Claude hook bundle without overwriting other unmarked files')\n .option('--all', 'Skip the interactive TUI and install every shipped skill + agent (use in CI)')\n .option('--skills <names>', 'Comma-separated skill names to install (overrides TUI)', (v) => v.split(',').map((s) => s.trim()).filter(Boolean))\n .option('--agents-only <names>', 'Comma-separated agent names to install (overrides TUI). Use --agents-only to disambiguate from --agent (channel selector).', (v) => v.split(',').map((s) => s.trim()).filter(Boolean))\n .option('--skills-only', 'Install only the named skill files — skip sub-agents, hooks, and settings.json (minimal single-skill install, e.g. --skills claude-design --skills-only)')\n .option('--global', 'Install to each channel\\'s user-level discovery directory instead of this project. Writes skills + sub-agents + catalog; never touches global hooks/settings.')\n .action(\n async (opts: {\n dir?: string;\n agent?: string[];\n force?: boolean;\n repairHooks?: boolean;\n all?: boolean;\n skills?: string[];\n agentsOnly?: string[];\n skillsOnly?: boolean;\n global?: boolean;\n }) => {\n const { runInstallSkills } = await import('../src/cli/install-skills.js');\n type Agent = 'claude-code' | 'codex' | 'opencode' | 'cursor';\n // Keep raw values until runInstallSkills validates them. Silently\n // filtering an invalid channel used to produce a successful 0-file install.\n const agents = opts.agent as Agent[] | undefined;\n const code = await runInstallSkills({\n dir: opts.dir,\n agents,\n force: opts.force,\n repairHooks: opts.repairHooks,\n all: opts.all,\n skillsFilter: opts.skills,\n agentsFilter: opts.agentsOnly,\n skillsOnly: opts.skillsOnly,\n global: opts.global,\n });\n if (code !== 0) process.exit(code);\n }\n );\n\nprogram\n .command('doctor')\n .description('Check whether skills, sub-agents, references, and DESIGN.md are ready; print the exact next action.')\n .option('--dir <path>', 'Project root (defaults to cwd)')\n .option('--global', 'Check the user-level installation instead of this project')\n .option('--json', 'Print a machine-readable report')\n .action(async (opts: { dir?: string; global?: boolean; json?: boolean }) => {\n const { runDoctor } = await import('../src/cli/doctor.js');\n const code = await runDoctor(opts);\n if (code !== 0) process.exit(code);\n });\n\nawait program.parseAsync();\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,cAAc,kBAAkB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,qBAA6B;AACpC,MAAI,MAAM,QAAQ,cAAc,YAAY,GAAG,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,MAAM,KAAK,KAAK,cAAc;AACpC,QAAI,WAAW,GAAG,GAAG;AACnB,UAAI;AACF,eAAO,KAAK,MAAM,aAAa,KAAK,MAAM,CAAC,EAAE,WAAW;AAAA,MAC1D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,cAAc,EACnB,YAAY,6IAA6I,EACzJ,QAAQ,mBAAmB,CAAC,EAC5B,yBAAyB,IAAI,EAC7B,mBAAmB,IAAI;AAE1B,QAAQ,OAAO,YAAY;AACzB,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,+BAA8B;AACxE,QAAM,OAAO,MAAM,iBAAiB;AACpC,MAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AACnC,CAAC;AAED,QACG,QAAQ,gBAAgB,EACxB,YAAY,0GAA0G,EACtH,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,qBAAqB,yEAAyE,EACrG,OAAO,WAAW,sDAAsD,EACxE,OAAO,kBAAkB,iFAAiF,EAC1G,OAAO,SAAS,8EAA8E,EAC9F,OAAO,oBAAoB,0DAA0D,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,EAC7I,OAAO,yBAAyB,8HAA8H,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,EACtN,OAAO,iBAAiB,+JAA0J,EAClL,OAAO,YAAY,8JAA+J,EAClL;AAAA,EACC,OAAO,SAUD;AACJ,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,+BAA8B;AAIxE,UAAM,SAAS,KAAK;AACpB,UAAM,OAAO,MAAM,iBAAiB;AAAA,MAClC,KAAK,KAAK;AAAA,MACV;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,KAAK,KAAK;AAAA,MACV,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AAAA,EACnC;AACF;AAEF,QACG,QAAQ,QAAQ,EAChB,YAAY,qGAAqG,EACjH,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,YAAY,2DAA2D,EAC9E,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,SAA6D;AAC1E,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,uBAAsB;AACzD,QAAM,OAAO,MAAM,UAAU,IAAI;AACjC,MAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AACnC,CAAC;AAEH,MAAM,QAAQ,WAAW;","names":[]}
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli/hook-contract.ts
4
+ import { createHash } from "crypto";
5
+ var CLAUDE_HOOK_PATHS = [
6
+ "skill-activation.cjs",
7
+ "session-state-loader.cjs",
8
+ "post-edit-watch.cjs",
9
+ "session-end-foldin.cjs",
10
+ "lib/preferences-parser.cjs",
11
+ "lib/preferences-writer.cjs"
12
+ ];
13
+ var MARKER_RE = /^\/\/ omd:installed-hook sha256=([0-9a-f]{64})\r?$/m;
14
+ var LEGACY_HOOK_HASHES = {
15
+ "skill-activation.cjs": [
16
+ "2231898cfa1f187abe96dea3f1c32b1be522eefe6f13fc5cd887e8745da2aff7",
17
+ "3ac226a3cd7d9579d44c0d760fbb5a0b806208132e546c35c0d226dda3552338",
18
+ "94521f10970b5fcf408fb3aa363a896d00328b045f687aa34d3fc93783f1bb9d",
19
+ "e6e551bfdd46906bdd6b4ef955c3152f1b88b10010519d8d7886f39c052834a3"
20
+ ],
21
+ "session-state-loader.cjs": [
22
+ "06f12167efb4fbd56dde586c0cc4a181f873b8e98da986aed2fe67b3eb14a9e6",
23
+ "757860c1ab47e3a74465b51c53438b9a1f964b63ae904699e12a28f20b0db1e2",
24
+ "8982eff72fc5bd4ab78ba152609560d96aaccde1add1506833ca0d47916369f6",
25
+ "e5c62304db69247f7deb2237b9b4c559b65e56c0b9d2a9f095f41fa6598d4f4c"
26
+ ],
27
+ "post-edit-watch.cjs": [
28
+ "6209bd47f9403ec158cfebd66d3e9a00ec19024d62cbac590cf3a977ddf099a1",
29
+ "8f675e4e4b33ac648fca29a934fb2365608c8d8b738a8848e9fafa01ab99cbf5",
30
+ "f471b2b322fbbedf5a1a311819827a55aedcc1cd660617df2b2d130153467974",
31
+ "f9e2f5ba7287405505c8c9d871a10e8c15c37a403dcff4501f72e25b5c0213e2"
32
+ ],
33
+ "session-end-foldin.cjs": [
34
+ "2bc5b9656c2e3891c68c9bb3213af770002727fd354273fbe4b3158c9dd92968",
35
+ "c3055666d94fd6861f8324275ab89477af1c9edce32562a18ebd36e13600db15",
36
+ "c53779b4806cd5d96851f28fc6db6951d3e34713f2439f38048a892c1fb182b5"
37
+ ],
38
+ "lib/preferences-parser.cjs": [
39
+ "44ceaf346dc7238f92f127699d9b985940f77c68a461752d15f10b930ecea4ca",
40
+ "d11bd77a840ff1173299ae573061c3519e9dc728a53ce20c07348717091c2bf1"
41
+ ],
42
+ "lib/preferences-writer.cjs": [
43
+ "f539948ceb96797081ba2669c7820149a7b1784659b5f950d1b08f2a9945b30e"
44
+ ]
45
+ };
46
+ function sha256(content) {
47
+ return createHash("sha256").update(content).digest("hex");
48
+ }
49
+ function stripManagedHookMarker(content) {
50
+ return content.replace(/^\/\/ omd:installed-hook sha256=[0-9a-f]{64}\r?\n/m, "");
51
+ }
52
+ function renderManagedHook(source) {
53
+ const raw = stripManagedHookMarker(source);
54
+ const marker = `// omd:installed-hook sha256=${sha256(raw)}`;
55
+ const shebangEnd = raw.startsWith("#!") ? raw.indexOf("\n") : -1;
56
+ return shebangEnd >= 0 ? `${raw.slice(0, shebangEnd + 1)}${marker}
57
+ ${raw.slice(shebangEnd + 1)}` : `${marker}
58
+ ${raw}`;
59
+ }
60
+ function isCurrentManagedHook(content, source) {
61
+ return content === renderManagedHook(source);
62
+ }
63
+ function isSelfConsistentManagedHook(content) {
64
+ const declared = MARKER_RE.exec(content)?.[1];
65
+ return Boolean(declared && declared === sha256(stripManagedHookMarker(content)));
66
+ }
67
+ function isKnownLegacyHook(path, content) {
68
+ return !MARKER_RE.test(content) && LEGACY_HOOK_HASHES[path].includes(sha256(content));
69
+ }
70
+
71
+ // src/cli/install-path.ts
72
+ import { existsSync, lstatSync } from "fs";
73
+ import { isAbsolute, join, relative, resolve, sep } from "path";
74
+ function unsafeManagedPath(installRoot, destination) {
75
+ const root = resolve(installRoot);
76
+ const target = resolve(destination);
77
+ const rel = relative(root, target);
78
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
79
+ return "destination escapes the selected install root";
80
+ }
81
+ let current = root;
82
+ for (const segment of rel.split(sep).filter(Boolean)) {
83
+ current = join(current, segment);
84
+ if (existsSync(current) && lstatSync(current).isSymbolicLink()) {
85
+ return `symlinked managed path: ${relative(root, current)}`;
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+
91
+ export {
92
+ CLAUDE_HOOK_PATHS,
93
+ renderManagedHook,
94
+ isCurrentManagedHook,
95
+ isSelfConsistentManagedHook,
96
+ isKnownLegacyHook,
97
+ unsafeManagedPath
98
+ };
99
+ //# sourceMappingURL=chunk-UJIHCEYF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/hook-contract.ts","../src/cli/install-path.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nexport const CLAUDE_HOOK_PATHS = [\n 'skill-activation.cjs',\n 'session-state-loader.cjs',\n 'post-edit-watch.cjs',\n 'session-end-foldin.cjs',\n 'lib/preferences-parser.cjs',\n 'lib/preferences-writer.cjs',\n] as const;\n\nconst MARKER_RE = /^\\/\\/ omd:installed-hook sha256=([0-9a-f]{64})\\r?$/m;\n\nconst LEGACY_HOOK_HASHES: Record<(typeof CLAUDE_HOOK_PATHS)[number], readonly string[]> = {\n 'skill-activation.cjs': [\n '2231898cfa1f187abe96dea3f1c32b1be522eefe6f13fc5cd887e8745da2aff7',\n '3ac226a3cd7d9579d44c0d760fbb5a0b806208132e546c35c0d226dda3552338',\n '94521f10970b5fcf408fb3aa363a896d00328b045f687aa34d3fc93783f1bb9d',\n 'e6e551bfdd46906bdd6b4ef955c3152f1b88b10010519d8d7886f39c052834a3',\n ],\n 'session-state-loader.cjs': [\n '06f12167efb4fbd56dde586c0cc4a181f873b8e98da986aed2fe67b3eb14a9e6',\n '757860c1ab47e3a74465b51c53438b9a1f964b63ae904699e12a28f20b0db1e2',\n '8982eff72fc5bd4ab78ba152609560d96aaccde1add1506833ca0d47916369f6',\n 'e5c62304db69247f7deb2237b9b4c559b65e56c0b9d2a9f095f41fa6598d4f4c',\n ],\n 'post-edit-watch.cjs': [\n '6209bd47f9403ec158cfebd66d3e9a00ec19024d62cbac590cf3a977ddf099a1',\n '8f675e4e4b33ac648fca29a934fb2365608c8d8b738a8848e9fafa01ab99cbf5',\n 'f471b2b322fbbedf5a1a311819827a55aedcc1cd660617df2b2d130153467974',\n 'f9e2f5ba7287405505c8c9d871a10e8c15c37a403dcff4501f72e25b5c0213e2',\n ],\n 'session-end-foldin.cjs': [\n '2bc5b9656c2e3891c68c9bb3213af770002727fd354273fbe4b3158c9dd92968',\n 'c3055666d94fd6861f8324275ab89477af1c9edce32562a18ebd36e13600db15',\n 'c53779b4806cd5d96851f28fc6db6951d3e34713f2439f38048a892c1fb182b5',\n ],\n 'lib/preferences-parser.cjs': [\n '44ceaf346dc7238f92f127699d9b985940f77c68a461752d15f10b930ecea4ca',\n 'd11bd77a840ff1173299ae573061c3519e9dc728a53ce20c07348717091c2bf1',\n ],\n 'lib/preferences-writer.cjs': [\n 'f539948ceb96797081ba2669c7820149a7b1784659b5f950d1b08f2a9945b30e',\n ],\n};\n\nfunction sha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function stripManagedHookMarker(content: string): string {\n return content.replace(/^\\/\\/ omd:installed-hook sha256=[0-9a-f]{64}\\r?\\n/m, '');\n}\n\nexport function renderManagedHook(source: string): string {\n const raw = stripManagedHookMarker(source);\n const marker = `// omd:installed-hook sha256=${sha256(raw)}`;\n const shebangEnd = raw.startsWith('#!') ? raw.indexOf('\\n') : -1;\n return shebangEnd >= 0\n ? `${raw.slice(0, shebangEnd + 1)}${marker}\\n${raw.slice(shebangEnd + 1)}`\n : `${marker}\\n${raw}`;\n}\n\nexport function isCurrentManagedHook(content: string, source: string): boolean {\n return content === renderManagedHook(source);\n}\n\nexport function isSelfConsistentManagedHook(content: string): boolean {\n const declared = MARKER_RE.exec(content)?.[1];\n return Boolean(declared && declared === sha256(stripManagedHookMarker(content)));\n}\n\nexport function isKnownLegacyHook(\n path: (typeof CLAUDE_HOOK_PATHS)[number],\n content: string,\n): boolean {\n return !MARKER_RE.test(content) && LEGACY_HOOK_HASHES[path].includes(sha256(content));\n}\n","import { existsSync, lstatSync } from 'node:fs';\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path';\n\n/**\n * Managed installer writes must never traverse a symlink below the user-selected\n * install root. Besides protecting project files, this prevents a repository\n * from redirecting `--force` or `--repair-hooks` writes outside its boundary.\n * The install root itself may be a symlink because users commonly open projects\n * through a symlinked workspace path.\n */\nexport function unsafeManagedPath(\n installRoot: string,\n destination: string,\n): string | null {\n const root = resolve(installRoot);\n const target = resolve(destination);\n const rel = relative(root, target);\n if (rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n return 'destination escapes the selected install root';\n }\n\n let current = root;\n for (const segment of rel.split(sep).filter(Boolean)) {\n current = join(current, segment);\n if (existsSync(current) && lstatSync(current).isSymbolicLink()) {\n return `symlinked managed path: ${relative(root, current)}`;\n }\n }\n return null;\n}\n"],"mappings":";;;AAAA,SAAS,kBAAkB;AAEpB,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,YAAY;AAElB,IAAM,qBAAoF;AAAA,EACxF,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,4BAA4B;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,8BAA8B;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAAA,EACA,8BAA8B;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,OAAO,SAAyB;AACvC,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;AAEO,SAAS,uBAAuB,SAAyB;AAC9D,SAAO,QAAQ,QAAQ,sDAAsD,EAAE;AACjF;AAEO,SAAS,kBAAkB,QAAwB;AACxD,QAAM,MAAM,uBAAuB,MAAM;AACzC,QAAM,SAAS,gCAAgC,OAAO,GAAG,CAAC;AAC1D,QAAM,aAAa,IAAI,WAAW,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;AAC9D,SAAO,cAAc,IACjB,GAAG,IAAI,MAAM,GAAG,aAAa,CAAC,CAAC,GAAG,MAAM;AAAA,EAAK,IAAI,MAAM,aAAa,CAAC,CAAC,KACtE,GAAG,MAAM;AAAA,EAAK,GAAG;AACvB;AAEO,SAAS,qBAAqB,SAAiB,QAAyB;AAC7E,SAAO,YAAY,kBAAkB,MAAM;AAC7C;AAEO,SAAS,4BAA4B,SAA0B;AACpE,QAAM,WAAW,UAAU,KAAK,OAAO,IAAI,CAAC;AAC5C,SAAO,QAAQ,YAAY,aAAa,OAAO,uBAAuB,OAAO,CAAC,CAAC;AACjF;AAEO,SAAS,kBACd,MACA,SACS;AACT,SAAO,CAAC,UAAU,KAAK,OAAO,KAAK,mBAAmB,IAAI,EAAE,SAAS,OAAO,OAAO,CAAC;AACtF;;;AC7EA,SAAS,YAAY,iBAAiB;AACtC,SAAS,YAAY,MAAM,UAAU,SAAS,WAAW;AASlD,SAAS,kBACd,aACA,aACe;AACf,QAAM,OAAO,QAAQ,WAAW;AAChC,QAAM,SAAS,QAAQ,WAAW;AAClC,QAAM,MAAM,SAAS,MAAM,MAAM;AACjC,MAAI,QAAQ,QAAQ,IAAI,WAAW,KAAK,GAAG,EAAE,KAAK,WAAW,GAAG,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACd,aAAW,WAAW,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,GAAG;AACpD,cAAU,KAAK,SAAS,OAAO;AAC/B,QAAI,WAAW,OAAO,KAAK,UAAU,OAAO,EAAE,eAAe,GAAG;AAC9D,aAAO,2BAA2B,SAAS,MAAM,OAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;","names":[]}