oh-my-design-cli 1.8.7 → 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 (247) 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 +1995 -38
  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/alipay/DESIGN.md +179 -420
  71. package/web/references/apple/DESIGN.md +224 -498
  72. package/web/references/asleep/DESIGN.md +402 -0
  73. package/web/references/au/DESIGN.md +334 -0
  74. package/web/references/autopedia/DESIGN.md +382 -0
  75. package/web/references/aws-cloudscape/DESIGN.md +241 -0
  76. package/web/references/baemin/DESIGN.md +332 -491
  77. package/web/references/banksalad/DESIGN.md +269 -180
  78. package/web/references/barogo/DESIGN.md +416 -0
  79. package/web/references/beusable/DESIGN.md +464 -0
  80. package/web/references/bilibili/DESIGN.md +206 -374
  81. package/web/references/bmw/DESIGN.md +162 -276
  82. package/web/references/brandi/DESIGN.md +184 -325
  83. package/web/references/catchtable/DESIGN.md +219 -264
  84. package/web/references/cgv/DESIGN.md +317 -0
  85. package/web/references/channeltalk/DESIGN.md +210 -336
  86. package/web/references/china-airlines/DESIGN.md +291 -0
  87. package/web/references/cjonstyle/DESIGN.md +453 -0
  88. package/web/references/class101/DESIGN.md +168 -387
  89. package/web/references/classum/DESIGN.md +228 -203
  90. package/web/references/claude/DESIGN.md +242 -479
  91. package/web/references/clay/DESIGN.md +179 -377
  92. package/web/references/clickhouse/DESIGN.md +254 -343
  93. package/web/references/cohere/DESIGN.md +214 -324
  94. package/web/references/coinone/DESIGN.md +199 -179
  95. package/web/references/corca/DESIGN.md +414 -0
  96. package/web/references/coupang/DESIGN.md +205 -475
  97. package/web/references/cursor/DESIGN.md +240 -381
  98. package/web/references/dabang/DESIGN.md +248 -213
  99. package/web/references/dable/DESIGN.md +431 -0
  100. package/web/references/datarize/DESIGN.md +217 -330
  101. package/web/references/dealicious/DESIGN.md +402 -0
  102. package/web/references/drdiary/DESIGN.md +404 -0
  103. package/web/references/elastic/DESIGN.md +238 -0
  104. package/web/references/elevenlabs/DESIGN.md +183 -321
  105. package/web/references/eslite/DESIGN.md +257 -0
  106. package/web/references/evaair/DESIGN.md +338 -0
  107. package/web/references/expo/DESIGN.md +238 -331
  108. package/web/references/familymart-tw/DESIGN.md +254 -0
  109. package/web/references/ferrari/DESIGN.md +160 -377
  110. package/web/references/figma/DESIGN.md +197 -451
  111. package/web/references/fitpet/DESIGN.md +445 -0
  112. package/web/references/flex/DESIGN.md +170 -253
  113. package/web/references/framer/DESIGN.md +197 -340
  114. package/web/references/freee/DESIGN.md +211 -533
  115. package/web/references/friendliai/DESIGN.md +431 -0
  116. package/web/references/frip/DESIGN.md +440 -0
  117. package/web/references/gangnamunni/DESIGN.md +154 -591
  118. package/web/references/gaudiolab/DESIGN.md +414 -0
  119. package/web/references/google/DESIGN.md +290 -398
  120. package/web/references/hashicorp/DESIGN.md +273 -318
  121. package/web/references/heydealer/DESIGN.md +429 -0
  122. package/web/references/humanscape/DESIGN.md +433 -0
  123. package/web/references/hyundai/DESIGN.md +158 -368
  124. package/web/references/hyundaicard/DESIGN.md +171 -121
  125. package/web/references/ibm/DESIGN.md +227 -378
  126. package/web/references/idus/DESIGN.md +450 -0
  127. package/web/references/igaworks/DESIGN.md +437 -0
  128. package/web/references/inflearn/DESIGN.md +221 -366
  129. package/web/references/intuit/DESIGN.md +244 -0
  130. package/web/references/jandi/DESIGN.md +191 -291
  131. package/web/references/jobplanet/DESIGN.md +415 -0
  132. package/web/references/kakao/DESIGN.md +287 -475
  133. package/web/references/kakaobank/DESIGN.md +220 -521
  134. package/web/references/kakaogames/DESIGN.md +220 -0
  135. package/web/references/kakaopay/DESIGN.md +207 -526
  136. package/web/references/karrot/DESIGN.md +227 -251
  137. package/web/references/kb-kookmin/DESIGN.md +308 -0
  138. package/web/references/kbank/DESIGN.md +220 -175
  139. package/web/references/kmong/DESIGN.md +281 -356
  140. package/web/references/krds/DESIGN.md +245 -19
  141. package/web/references/kream/DESIGN.md +224 -359
  142. package/web/references/kurly/DESIGN.md +211 -533
  143. package/web/references/lamborghini/DESIGN.md +198 -360
  144. package/web/references/lguplus/DESIGN.md +259 -0
  145. package/web/references/likelion/DESIGN.md +283 -0
  146. package/web/references/line/DESIGN.md +396 -355
  147. package/web/references/linear.app/DESIGN.md +209 -562
  148. package/web/references/lotteon/DESIGN.md +386 -0
  149. package/web/references/lovable/DESIGN.md +255 -349
  150. package/web/references/makinarocks/DESIGN.md +149 -349
  151. package/web/references/maum-ai/DESIGN.md +423 -0
  152. package/web/references/medibloc/DESIGN.md +425 -0
  153. package/web/references/megabox/DESIGN.md +232 -0
  154. package/web/references/mercari/DESIGN.md +217 -434
  155. package/web/references/microsoft/DESIGN.md +234 -388
  156. package/web/references/mildang/DESIGN.md +411 -0
  157. package/web/references/millie/DESIGN.md +183 -504
  158. package/web/references/minimax/DESIGN.md +264 -322
  159. package/web/references/miricanvas/DESIGN.md +182 -355
  160. package/web/references/miro/DESIGN.md +234 -232
  161. package/web/references/mistral.ai/DESIGN.md +231 -314
  162. package/web/references/mixi/DESIGN.md +234 -0
  163. package/web/references/moin/DESIGN.md +445 -0
  164. package/web/references/mongodb/DESIGN.md +219 -316
  165. package/web/references/musinsa/DESIGN.md +184 -510
  166. package/web/references/mynavi/DESIGN.md +242 -0
  167. package/web/references/myrealtrip/DESIGN.md +169 -406
  168. package/web/references/naver/DESIGN.md +328 -499
  169. package/web/references/naverwebtoon/DESIGN.md +172 -395
  170. package/web/references/nhn/DESIGN.md +169 -346
  171. package/web/references/nhncloud/DESIGN.md +185 -123
  172. package/web/references/notion/DESIGN.md +271 -475
  173. package/web/references/nrise/DESIGN.md +417 -0
  174. package/web/references/ohouse/DESIGN.md +210 -549
  175. package/web/references/oliveyoung/DESIGN.md +217 -326
  176. package/web/references/ollama/DESIGN.md +241 -308
  177. package/web/references/onestore/DESIGN.md +248 -0
  178. package/web/references/palantir/DESIGN.md +256 -0
  179. package/web/references/panasonic/DESIGN.md +276 -0
  180. package/web/references/patternfly/DESIGN.md +259 -0
  181. package/web/references/payhere/DESIGN.md +438 -0
  182. package/web/references/pega/DESIGN.md +262 -0
  183. package/web/references/peoplefund/DESIGN.md +431 -0
  184. package/web/references/petfriends/DESIGN.md +428 -0
  185. package/web/references/pinkfong/DESIGN.md +199 -367
  186. package/web/references/pinterest/DESIGN.md +258 -308
  187. package/web/references/poya/DESIGN.md +286 -0
  188. package/web/references/pozalabs/DESIGN.md +438 -0
  189. package/web/references/protopie/DESIGN.md +419 -0
  190. package/web/references/qraft/DESIGN.md +448 -0
  191. package/web/references/quotabook/DESIGN.md +449 -0
  192. package/web/references/recruit/DESIGN.md +247 -0
  193. package/web/references/remember/DESIGN.md +202 -396
  194. package/web/references/resend/DESIGN.md +274 -348
  195. package/web/references/sakura-internet/DESIGN.md +269 -0
  196. package/web/references/samsung/DESIGN.md +157 -359
  197. package/web/references/sandoll/DESIGN.md +445 -0
  198. package/web/references/sanity/DESIGN.md +241 -375
  199. package/web/references/scatterlab/DESIGN.md +412 -0
  200. package/web/references/selectstar/DESIGN.md +439 -0
  201. package/web/references/servicenow/DESIGN.md +289 -0
  202. package/web/references/shinhanbank/DESIGN.md +161 -341
  203. package/web/references/shinhancard/DESIGN.md +208 -319
  204. package/web/references/sionic/DESIGN.md +454 -0
  205. package/web/references/sktelecom/DESIGN.md +310 -0
  206. package/web/references/socar/DESIGN.md +125 -32
  207. package/web/references/softbank/DESIGN.md +231 -0
  208. package/web/references/sony/DESIGN.md +234 -0
  209. package/web/references/soop/DESIGN.md +261 -0
  210. package/web/references/spacex/DESIGN.md +184 -323
  211. package/web/references/spotify/DESIGN.md +253 -394
  212. package/web/references/squeezebits/DESIGN.md +441 -0
  213. package/web/references/stayfolio/DESIGN.md +422 -0
  214. package/web/references/stripe/DESIGN.md +212 -491
  215. package/web/references/supabase/DESIGN.md +244 -316
  216. package/web/references/tabling/DESIGN.md +415 -0
  217. package/web/references/taishinbank/DESIGN.md +243 -0
  218. package/web/references/teamlab/DESIGN.md +240 -0
  219. package/web/references/teamsparta/DESIGN.md +472 -0
  220. package/web/references/tellingme/DESIGN.md +392 -0
  221. package/web/references/tesla/DESIGN.md +244 -427
  222. package/web/references/thsr/DESIGN.md +284 -0
  223. package/web/references/thumbtack/DESIGN.md +302 -0
  224. package/web/references/together.ai/DESIGN.md +257 -304
  225. package/web/references/toss/DESIGN.md +251 -593
  226. package/web/references/toss-securities/DESIGN.md +255 -178
  227. package/web/references/tossbank/DESIGN.md +195 -491
  228. package/web/references/toyota/DESIGN.md +238 -0
  229. package/web/references/tving/DESIGN.md +197 -245
  230. package/web/references/typed/DESIGN.md +413 -0
  231. package/web/references/uber/DESIGN.md +256 -333
  232. package/web/references/udn/DESIGN.md +250 -0
  233. package/web/references/upbit/DESIGN.md +145 -256
  234. package/web/references/upstage/DESIGN.md +211 -204
  235. package/web/references/uswds/DESIGN.md +287 -0
  236. package/web/references/vercel/DESIGN.md +236 -440
  237. package/web/references/wanted/DESIGN.md +215 -487
  238. package/web/references/wise/DESIGN.md +223 -231
  239. package/web/references/wisetracker/DESIGN.md +462 -0
  240. package/web/references/wooribank/DESIGN.md +245 -0
  241. package/web/references/yanolja/DESIGN.md +250 -419
  242. package/web/references/yeogiotte/DESIGN.md +235 -418
  243. package/web/references/zapier/DESIGN.md +256 -377
  244. package/web/references/zendesk/DESIGN.md +288 -0
  245. package/web/references/zigzag/DESIGN.md +200 -621
  246. package/dist/install-skills-7UUDOLG2.js +0 -734
  247. 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":[]}