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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/doctor.ts"],"sourcesContent":["import * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport {\n existsSync,\n readFileSync,\n readdirSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, relative } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n CLAUDE_HOOK_PATHS,\n isCurrentManagedHook,\n} from './hook-contract.js';\nimport { unsafeManagedPath } from './install-path.js';\n\nexport interface DoctorOptions {\n dir?: string;\n global?: boolean;\n json?: boolean;\n}\n\nexport interface DoctorChannel {\n id: 'claude-code' | 'codex' | 'opencode' | 'cursor';\n installed: boolean;\n ready: boolean;\n skills: number;\n agents: number;\n references: number;\n issues: string[];\n}\n\nexport interface DoctorReport {\n root: string;\n scope: 'project' | 'global';\n state: 'not-installed' | 'incomplete' | 'needs-design-md' | 'ready';\n designMd: boolean;\n channels: DoctorChannel[];\n nextCommand: string;\n nextPrompt: string;\n manualAction: string;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nexport const REQUIRED_PRODUCT_SKILLS = [\n 'claude-design',\n 'omd-apply',\n 'omd-asset-fetch',\n 'omd-codex-image',\n 'omd-designer-review',\n 'omd-experiment-gallery',\n 'omd-feel',\n 'omd-final-qa',\n 'omd-harness',\n 'omd-humanize',\n 'omd-init',\n 'omd-kr-writer',\n 'omd-learn',\n 'omd-locale-adapter',\n 'omd-orchestrator',\n 'omd-reference-capture',\n 'omd-remember',\n 'omd-slop-audit',\n 'omd-sync',\n 'omd-taste',\n] as const;\nexport const REQUIRED_AGENT_IDS = [\n 'omd-a11y-auditor',\n 'omd-asset-curator',\n 'omd-codex-image',\n 'omd-critic',\n 'omd-designer-review',\n 'omd-final-qa',\n 'omd-humanizer',\n 'omd-kr-writer',\n 'omd-locale-adapter',\n 'omd-master',\n 'omd-microcopy',\n 'omd-orchestrator',\n 'omd-persona-tester',\n 'omd-slop-auditor',\n 'omd-ui-junior',\n 'omd-ux-engineer',\n 'omd-ux-researcher',\n 'omd-ux-writer',\n] as const;\nconst REQUIRED_DATA_FILES = [\n 'reference-fingerprints.json',\n 'reference-tags.md',\n 'vocabulary.json',\n] as const;\nconst REQUIRED_CLAUDE_HOOKS = [\n 'skill-activation.cjs',\n 'session-state-loader.cjs',\n 'post-edit-watch.cjs',\n 'session-end-foldin.cjs',\n] as const;\n\ntype SkillChannelId = 'claude-code' | 'codex' | 'opencode';\n\nfunction missingProductSkills(skillsRoot: string): string[] {\n return REQUIRED_PRODUCT_SKILLS.filter(\n (skill) => !existsSync(join(skillsRoot, skill, 'SKILL.md')),\n );\n}\n\nfunction missingDataFiles(dataRoot: string): string[] {\n return REQUIRED_DATA_FILES.filter((file) => !existsSync(join(dataRoot, file)));\n}\n\nfunction expectedSkillName(skill: string, channel: SkillChannelId): string {\n if (channel === 'opencode' || skill === 'claude-design') return skill;\n return skill.replace(/^omd-/, 'omd:');\n}\n\nfunction skillContractIssues(\n installRoot: string,\n skillsRoot: string,\n channel: SkillChannelId,\n): string[] {\n const malformed: string[] = [];\n const unsafe: string[] = [];\n for (const skill of REQUIRED_PRODUCT_SKILLS) {\n const path = join(skillsRoot, skill, 'SKILL.md');\n if (!existsSync(path)) continue;\n if (unsafeManagedPath(installRoot, path)) {\n unsafe.push(skill);\n continue;\n }\n const content = readFileSync(path, 'utf8');\n const parsed = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]+)$/.exec(content);\n const rawName = parsed\n ? /^name:\\s*([^\\r\\n]+)\\s*$/m.exec(parsed[1])?.[1]?.trim().replace(/^['\"]|['\"]$/g, '')\n : undefined;\n const hasDescription = parsed\n ? /^description:\\s*(?:\\|[+-]?|>[-+]?|\\S.+)\\s*$/m.test(parsed[1])\n : false;\n if (\n !parsed ||\n rawName !== expectedSkillName(skill, channel) ||\n (channel === 'opencode' && !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(rawName ?? '')) ||\n !hasDescription ||\n !parsed[2].trim() ||\n !content.includes('omd:installed-skill')\n ) {\n malformed.push(skill);\n }\n }\n return [\n ...(unsafe.length > 0\n ? [`unsafe symlinked ${channel} skill paths: ${unsafe.join(', ')}`]\n : []),\n ...(malformed.length > 0\n ? [`invalid ${channel} skill definitions: ${malformed.join(', ')}`]\n : []),\n ];\n}\n\nfunction coreIssues(\n installRoot: string,\n skillsRoot: string,\n dataRoot: string,\n referenceIds: Set<string>,\n channel: SkillChannelId,\n): string[] {\n const issues: string[] = [];\n const unsafeDataPaths = [\n ...REQUIRED_DATA_FILES.map((file) => join(dataRoot, file)),\n join(dataRoot, 'references'),\n ].filter((path) => existsSync(path) && unsafeManagedPath(installRoot, path));\n if (unsafeDataPaths.length > 0) {\n issues.push(\n `unsafe symlinked ${channel} data paths: ${unsafeDataPaths\n .map((path) => relative(installRoot, path))\n .join(', ')}`,\n );\n }\n const missingSkills = missingProductSkills(skillsRoot);\n const missingData = missingDataFiles(dataRoot);\n if (missingSkills.length > 0) {\n issues.push(`missing product skills: ${missingSkills.join(', ')}`);\n }\n issues.push(...skillContractIssues(installRoot, skillsRoot, channel));\n if (missingData.length > 0) issues.push(`missing catalog data: ${missingData.join(', ')}`);\n if (referenceIds.size === 0) issues.push('reference catalog is empty');\n const fingerprintsPath = join(dataRoot, 'reference-fingerprints.json');\n if (existsSync(fingerprintsPath)) {\n try {\n const fingerprints: unknown = JSON.parse(readFileSync(fingerprintsPath, 'utf8'));\n if (\n typeof fingerprints !== 'object' ||\n fingerprints === null ||\n typeof (fingerprints as { count?: unknown }).count !== 'number'\n ) {\n issues.push('reference-fingerprints.json has no numeric count');\n } else {\n const { count, items } = fingerprints as { count: number; items?: unknown };\n if (!Array.isArray(items)) {\n issues.push('reference-fingerprints.json has no items array');\n } else {\n const invalidItems = items.filter(\n (item) =>\n typeof item !== 'object' ||\n item === null ||\n typeof (item as { id?: unknown }).id !== 'string' ||\n (item as { id: string }).id.length === 0,\n );\n const fingerprintIds = items\n .filter((item): item is { id: string } => !invalidItems.includes(item))\n .map((item) => item.id);\n const uniqueFingerprintIds = new Set(fingerprintIds);\n if (invalidItems.length > 0) {\n issues.push(`reference-fingerprints.json has ${invalidItems.length} item(s) without an id`);\n }\n if (count !== items.length) {\n issues.push(\n `catalog mismatch: declared ${count} fingerprints but items contains ${items.length}`,\n );\n }\n if (uniqueFingerprintIds.size !== fingerprintIds.length) {\n issues.push('reference-fingerprints.json contains duplicate ids');\n }\n const missingReferences = [...uniqueFingerprintIds].filter(\n (id) => !referenceIds.has(id),\n );\n if (missingReferences.length > 0) {\n const preview = missingReferences.slice(0, 5).join(', ');\n const remainder = missingReferences.length > 5\n ? ` (+${missingReferences.length - 5} more)`\n : '';\n issues.push(`missing catalog references: ${preview}${remainder}`);\n }\n const managedReferenceIds = managedReferenceIdsAt(dataRoot);\n if (managedReferenceIds) {\n const missingFingerprints = [...managedReferenceIds].filter(\n (id) => !uniqueFingerprintIds.has(id),\n );\n if (missingFingerprints.length > 0) {\n const preview = missingFingerprints.slice(0, 5).join(', ');\n const remainder = missingFingerprints.length > 5\n ? ` (+${missingFingerprints.length - 5} more)`\n : '';\n issues.push(`catalog fingerprints missing for managed references: ${preview}${remainder}`);\n }\n } else if (referenceIds.size > 0 && uniqueFingerprintIds.size === 0) {\n issues.push('reference-fingerprints.json is empty while references are installed');\n }\n }\n if (count < 0 || !Number.isInteger(count)) {\n issues.push(\n 'reference-fingerprints.json count must be a non-negative integer',\n );\n }\n }\n } catch {\n issues.push('reference-fingerprints.json is not valid JSON');\n }\n }\n return issues;\n}\n\nfunction managedReferenceIdsAt(dataRoot: string): Set<string> | null {\n const manifestPath = join(dataRoot, 'references', '.omd-managed.json');\n if (!existsSync(manifestPath)) return null;\n try {\n const parsed: unknown = JSON.parse(readFileSync(manifestPath, 'utf8'));\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n Array.isArray((parsed as { managedIds?: unknown }).managedIds) &&\n (parsed as { managedIds: unknown[] }).managedIds.every(\n (id) => typeof id === 'string' && id.length > 0,\n )\n ) {\n return new Set((parsed as { managedIds: string[] }).managedIds);\n }\n } catch {\n // The manifest has its own installer recovery path. Fall back to the\n // conservative non-empty check so private references never false-red.\n }\n return null;\n}\n\nfunction referenceIdsAt(dataRoot: string): Set<string> {\n const root = join(dataRoot, 'references');\n if (!existsSync(root)) return new Set();\n return new Set(\n readdirSync(root, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && existsSync(join(root, entry.name, 'DESIGN.md')))\n .map((entry) => entry.name),\n );\n}\n\nfunction countRequiredSkills(skillsRoot: string): number {\n return REQUIRED_PRODUCT_SKILLS.filter(\n (skill) => existsSync(join(skillsRoot, skill, 'SKILL.md')),\n ).length;\n}\n\nfunction missingAgentIds(root: string, extension: '.md' | '.toml'): string[] {\n return REQUIRED_AGENT_IDS.filter(\n (agent) => !existsSync(join(root, `${agent}${extension}`)),\n );\n}\n\nfunction countRequiredAgents(root: string, extension: '.md' | '.toml'): number {\n return REQUIRED_AGENT_IDS.length - missingAgentIds(root, extension).length;\n}\n\nfunction claudeAgentIssues(root: string): string[] {\n const agentsRoot = join(root, '.claude', 'agents');\n const missingAgents = missingAgentIds(agentsRoot, '.md');\n const issues: string[] = [];\n if (missingAgents.length > 0) {\n issues.push(`missing Claude sub-agents: ${missingAgents.join(', ')}`);\n }\n const malformedAgents: string[] = [];\n const unsafeAgents: string[] = [];\n for (const agent of REQUIRED_AGENT_IDS) {\n const path = join(agentsRoot, `${agent}.md`);\n if (!existsSync(path)) continue;\n if (unsafeManagedPath(root, path)) {\n unsafeAgents.push(agent);\n continue;\n }\n const content = readFileSync(path, 'utf8');\n const frontmatter = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]+)$/.exec(content);\n if (!frontmatter) {\n malformedAgents.push(agent);\n continue;\n }\n const name = /^name:\\s*(\"(?:\\\\.|[^\"\\\\])*\")\\s*$/m.exec(frontmatter[1])?.[1];\n const description = /^description:\\s*(\"(?:\\\\.|[^\"\\\\])*\")\\s*$/m.exec(frontmatter[1])?.[1];\n const tools = /^tools:\\s*(\\[[^\\n]*\\])\\s*$/m.exec(frontmatter[1])?.[1];\n const model = /^model:\\s*(\"(?:\\\\.|[^\"\\\\])*\")\\s*$/m.exec(frontmatter[1])?.[1];\n try {\n if (\n !name || JSON.parse(name) !== agent ||\n !description || typeof JSON.parse(description) !== 'string' || !JSON.parse(description) ||\n !tools || !Array.isArray(JSON.parse(tools)) ||\n !model || typeof JSON.parse(model) !== 'string' ||\n !/^omd_managed:\\s*true\\s*$/m.test(frontmatter[1]) ||\n !frontmatter[2].trim()\n ) {\n malformedAgents.push(agent);\n }\n } catch {\n malformedAgents.push(agent);\n }\n }\n if (malformedAgents.length > 0) {\n issues.push(`invalid Claude sub-agent frontmatter: ${malformedAgents.join(', ')}`);\n }\n if (unsafeAgents.length > 0) {\n issues.push(`unsafe symlinked Claude sub-agent paths: ${unsafeAgents.join(', ')}`);\n }\n return issues;\n}\n\ntype JsonObject = Record<string, unknown>;\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nconst CLAUDE_HOOK_EVENTS: Record<(typeof REQUIRED_CLAUDE_HOOKS)[number], string> = {\n 'skill-activation.cjs': 'UserPromptSubmit',\n 'session-state-loader.cjs': 'SessionStart',\n 'post-edit-watch.cjs': 'PostToolUse',\n 'session-end-foldin.cjs': 'Stop',\n};\n\nfunction readClaudeSettings(root: string): JsonObject | null {\n const settingsPath = join(root, '.claude', 'settings.json');\n if (!existsSync(settingsPath)) return null;\n try {\n const parsed: unknown = JSON.parse(readFileSync(settingsPath, 'utf8'));\n return isJsonObject(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction hasExactClaudeHook(\n settings: JsonObject,\n event: string,\n hook: string,\n): boolean {\n if (!isJsonObject(settings.hooks)) return false;\n const groups = settings.hooks[event];\n if (!Array.isArray(groups)) return false;\n const expected = `node \\${CLAUDE_PROJECT_DIR}/.claude/hooks/${hook}`;\n return groups.some(\n (group) =>\n isJsonObject(group) &&\n Array.isArray(group.hooks) &&\n group.hooks.some(\n (entry) =>\n isJsonObject(entry) &&\n entry.type === 'command' &&\n entry.command === expected,\n ),\n );\n}\n\nfunction hasClaudeOmdActivation(root: string): boolean {\n const settings = readClaudeSettings(root);\n return Boolean(\n settings && REQUIRED_CLAUDE_HOOKS.some(\n (hook) => hasExactClaudeHook(settings, CLAUDE_HOOK_EVENTS[hook], hook),\n ),\n );\n}\n\nfunction findBundleRoot(): string | null {\n let current = dirname(fileURLToPath(import.meta.url));\n for (let depth = 0; depth < 8; depth += 1) {\n const packageJson = join(current, 'package.json');\n try {\n const parsed: unknown = JSON.parse(readFileSync(packageJson, 'utf8'));\n if (\n isJsonObject(parsed) &&\n parsed.name === 'oh-my-design-cli' &&\n existsSync(join(current, 'skills')) &&\n existsSync(join(current, '.claude', 'hooks'))\n ) {\n return current;\n }\n } catch {\n // Keep walking toward the package root.\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n\nfunction bundledClaudeHookSource(hook: (typeof CLAUDE_HOOK_PATHS)[number]): string | null {\n const bundleRoot = findBundleRoot();\n if (!bundleRoot) return null;\n const candidate = join(bundleRoot, '.claude', 'hooks', hook);\n return existsSync(candidate) ? readFileSync(candidate, 'utf8') : null;\n}\n\nfunction claudeActivationIssues(root: string): string[] {\n const issues: string[] = [];\n const settingsPath = join(root, '.claude', 'settings.json');\n if (!existsSync(settingsPath)) return ['Claude hook settings are missing'];\n\n const settings = readClaudeSettings(root);\n if (!settings) {\n return ['Claude hook settings are not valid JSON'];\n }\n\n for (const hook of CLAUDE_HOOK_PATHS) {\n const installedPath = join(root, '.claude', 'hooks', hook);\n if (!existsSync(installedPath)) {\n issues.push(`missing Claude hook file: ${hook}`);\n continue;\n }\n const unsafe = unsafeManagedPath(root, installedPath);\n if (unsafe) {\n issues.push(`unsafe Claude hook path: ${hook} (${unsafe})`);\n continue;\n }\n const source = bundledClaudeHookSource(hook);\n if (!source) {\n issues.push(`bundled Claude hook source is missing: ${hook}`);\n } else if (!isCurrentManagedHook(readFileSync(installedPath, 'utf8'), source)) {\n issues.push(`stale or modified Claude hook file: ${hook}`);\n }\n if (\n !hook.startsWith('lib/') &&\n !hasExactClaudeHook(\n settings,\n CLAUDE_HOOK_EVENTS[hook as keyof typeof CLAUDE_HOOK_EVENTS],\n hook,\n )\n ) {\n issues.push(`Claude hook is not activated in settings: ${hook}`);\n }\n }\n const settingsText = readFileSync(settingsPath, 'utf8');\n if (settingsText.includes('scripts/context_restore.sh') && !existsSync(join(root, 'scripts', 'context_restore.sh'))) {\n issues.push('settings still invoke the unshipped scripts/context_restore.sh hook');\n }\n return issues;\n}\n\nfunction codexAgentIssues(root: string): string[] {\n const agentsRoot = join(root, '.codex', 'agents');\n const missingAgents = missingAgentIds(agentsRoot, '.toml');\n const issues: string[] = [];\n if (missingAgents.length > 0) {\n issues.push(`missing Codex sub-agents: ${missingAgents.join(', ')}`);\n }\n const malformedAgents: string[] = [];\n const foreignSkillPathAgents: string[] = [];\n const missingRuntimeDependencyAgents: string[] = [];\n const unsafeAgents: string[] = [];\n for (const agent of REQUIRED_AGENT_IDS) {\n const path = join(agentsRoot, `${agent}.toml`);\n if (!existsSync(path)) continue;\n if (unsafeManagedPath(root, path)) {\n unsafeAgents.push(agent);\n continue;\n }\n const content = readFileSync(path, 'utf8');\n const name = /^name\\s*=\\s*\"([^\"\\n]+)\"\\s*$/m.exec(content)?.[1]?.trim();\n const description = /^description\\s*=\\s*\"([^\"\\n]+)\"\\s*$/m.exec(content)?.[1]?.trim();\n const instructionsMatch = /^developer_instructions\\s*=\\s*(?:'''([\\s\\S]*?)'''|\"\"\"([\\s\\S]*?)\"\"\")/m.exec(content);\n const developerInstructions = (instructionsMatch?.[1] ?? instructionsMatch?.[2])?.trim();\n if (\n /^\\s*\\[agent\\]\\s*$/m.test(content) ||\n name !== agent ||\n !description ||\n !developerInstructions\n ) {\n malformedAgents.push(agent);\n }\n if (/\\.(?:claude|opencode)\\/skills\\//.test(content)) {\n foreignSkillPathAgents.push(agent);\n }\n if (/\\bdata\\/research\\//.test(content)) {\n missingRuntimeDependencyAgents.push(agent);\n }\n }\n if (malformedAgents.length > 0) {\n issues.push(\n `invalid Codex sub-agent definitions (expected top-level name, description, developer_instructions): ${malformedAgents.join(', ')}`,\n );\n }\n if (foreignSkillPathAgents.length > 0) {\n issues.push(\n `Codex sub-agents reference another channel's skill root: ${foreignSkillPathAgents.join(', ')}`,\n );\n }\n if (missingRuntimeDependencyAgents.length > 0) {\n issues.push(\n `Codex sub-agents require unshipped development research files: ${missingRuntimeDependencyAgents.join(', ')}`,\n );\n }\n if (unsafeAgents.length > 0) {\n issues.push(`unsafe symlinked Codex sub-agent paths: ${unsafeAgents.join(', ')}`);\n }\n\n const masterPath = join(agentsRoot, 'omd-master.toml');\n if (!existsSync(masterPath)) return issues;\n const master = readFileSync(masterPath, 'utf8');\n if (!master.includes('# omd-master — Conversational Design Partner')) {\n issues.push('Codex omd-master does not embed the canonical role body');\n }\n if (/^model\\s*=/m.test(master)) {\n issues.push('Codex omd-master pins a stale model instead of inheriting the session model');\n }\n if (/\\bomd (?:init prepare|remember)\\b/.test(master)) {\n issues.push('Codex omd-master still invokes removed CLI helpers');\n }\n const legacySkillsRoot = join(root, '.codex', 'skills');\n if (existsSync(legacySkillsRoot)) {\n const legacySkills = readdirSync(legacySkillsRoot, { withFileTypes: true })\n .filter(\n (entry) =>\n entry.isDirectory() &&\n existsSync(join(legacySkillsRoot, entry.name, 'SKILL.md')),\n )\n .map((entry) => entry.name)\n .sort();\n const unmanagedLegacySkills = legacySkills.filter((skill) => {\n const content = readFileSync(join(legacySkillsRoot, skill, 'SKILL.md'), 'utf8');\n return !content.includes('omd:installed-skill');\n });\n const managedLegacySkills = legacySkills.filter(\n (skill) => !unmanagedLegacySkills.includes(skill),\n );\n if (managedLegacySkills.length > 0) {\n issues.push(`legacy Codex skill path must be migrated from .codex/skills: ${managedLegacySkills.join(', ')}`);\n }\n if (unmanagedLegacySkills.length > 0) {\n issues.push(`unmanaged legacy Codex skill paths require manual review: ${unmanagedLegacySkills.join(', ')}`);\n }\n }\n return issues;\n}\n\nfunction openCodeAgentIssues(root: string, agentsRoot: string): string[] {\n const missingAgents = missingAgentIds(agentsRoot, '.md');\n const issues: string[] = [];\n if (missingAgents.length > 0) {\n issues.push(`missing OpenCode sub-agents: ${missingAgents.join(', ')}`);\n }\n const malformed: string[] = [];\n const foreignSkillPathAgents: string[] = [];\n const missingRuntimeDependencyAgents: string[] = [];\n const colonSkillReferenceAgents: string[] = [];\n const unsafeAgents: string[] = [];\n for (const agent of REQUIRED_AGENT_IDS) {\n const path = join(agentsRoot, `${agent}.md`);\n if (!existsSync(path)) continue;\n if (unsafeManagedPath(root, path)) {\n unsafeAgents.push(agent);\n continue;\n }\n const content = readFileSync(path, 'utf8');\n const frontmatter = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]+)$/.exec(content);\n const description = frontmatter\n ? /^description:\\s*(\"(?:\\\\.|[^\"\\\\])*\")\\s*$/m.exec(frontmatter[1])?.[1]\n : undefined;\n try {\n if (\n !frontmatter ||\n !description ||\n !JSON.parse(description) ||\n !/^mode:\\s*subagent\\s*$/m.test(frontmatter[1]) ||\n !frontmatter[2].trim() ||\n !content.includes('omd:installed-agent')\n ) {\n malformed.push(agent);\n }\n } catch {\n malformed.push(agent);\n }\n if (/\\.(?:claude|agents)\\/skills\\//.test(content)) {\n foreignSkillPathAgents.push(agent);\n }\n if (/\\bdata\\/research\\//.test(content)) {\n missingRuntimeDependencyAgents.push(agent);\n }\n if (\n REQUIRED_PRODUCT_SKILLS.some(\n (skill) => skill.startsWith('omd-') && content.includes(`omd:${skill.slice(4)}`),\n )\n ) {\n colonSkillReferenceAgents.push(agent);\n }\n }\n if (malformed.length > 0) {\n issues.push(`invalid OpenCode sub-agent definitions: ${malformed.join(', ')}`);\n }\n if (foreignSkillPathAgents.length > 0) {\n issues.push(\n `OpenCode sub-agents reference another channel's skill root: ${foreignSkillPathAgents.join(', ')}`,\n );\n }\n if (missingRuntimeDependencyAgents.length > 0) {\n issues.push(\n `OpenCode sub-agents require unshipped development research files: ${missingRuntimeDependencyAgents.join(', ')}`,\n );\n }\n if (colonSkillReferenceAgents.length > 0) {\n issues.push(\n `OpenCode sub-agents reference non-native colon-form skills: ${colonSkillReferenceAgents.join(', ')}`,\n );\n }\n if (unsafeAgents.length > 0) {\n issues.push(`unsafe symlinked OpenCode sub-agent paths: ${unsafeAgents.join(', ')}`);\n }\n return issues;\n}\n\nfunction cursorRuleIssues(root: string): string[] {\n const path = join(root, '.cursor', 'rules', 'omd-design.mdc');\n if (!existsSync(path)) return [];\n const unsafe = unsafeManagedPath(root, path);\n if (unsafe) return [`unsafe Cursor rule path (${unsafe})`];\n const content = readFileSync(path, 'utf8');\n if (\n !content.startsWith('---\\n') ||\n !content.includes('description: Authoritative brand & UI design system.') ||\n !/<!-- omd:start v=1 hash=[a-f0-9]{12} -->/.test(content) ||\n !content.includes('The authoritative design spec lives at `@DESIGN.md` (repo root). Open and read before generating/modifying UI.') ||\n !content.includes('<!-- omd:end -->')\n ) {\n return ['Cursor rule is not an OmD-managed design-system shim'];\n }\n return [];\n}\n\nexport function collectDoctorReport(opts: DoctorOptions = {}): DoctorReport {\n const projectRoot = opts.dir ?? process.cwd();\n const root = opts.global ? homedir() : projectRoot;\n const claudeSkillsRoot = join(root, '.claude', 'skills');\n const codexSkillsRoot = join(root, '.agents', 'skills');\n const opencodeRoot = opts.global\n ? join(root, '.config', 'opencode')\n : join(root, '.opencode');\n const opencodeSkillsRoot = join(opencodeRoot, 'skills');\n const claudeAgentsRoot = join(root, '.claude', 'agents');\n const codexAgentsRoot = join(root, '.codex', 'agents');\n const opencodeAgentsRoot = join(opencodeRoot, 'agents');\n const claudeDataRoot = join(root, '.claude', 'data');\n const codexDataRoot = join(root, '.codex', 'data');\n const opencodeDataRoot = join(opencodeRoot, 'data');\n const claudeSkills = countRequiredSkills(claudeSkillsRoot);\n const codexSkills = countRequiredSkills(codexSkillsRoot);\n const opencodeSkills = countRequiredSkills(opencodeSkillsRoot);\n const claudeAgents = countRequiredAgents(claudeAgentsRoot, '.md');\n const codexAgents = countRequiredAgents(codexAgentsRoot, '.toml');\n const opencodeAgents = countRequiredAgents(opencodeAgentsRoot, '.md');\n const sourceRepository = (() => {\n try {\n const parsed: unknown = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));\n return isJsonObject(parsed) && parsed.name === 'oh-my-design-cli' && existsSync(join(root, 'web', 'references'));\n } catch {\n return false;\n }\n })();\n const installedClaudeReferenceIds = referenceIdsAt(claudeDataRoot);\n const claudeReferenceIds = sourceRepository && installedClaudeReferenceIds.size === 0\n ? referenceIdsAt(join(root, 'web'))\n : installedClaudeReferenceIds;\n const codexReferenceIds = referenceIdsAt(codexDataRoot);\n const opencodeReferenceIds = referenceIdsAt(opencodeDataRoot);\n const claudeReferences = claudeReferenceIds.size;\n const codexReferences = codexReferenceIds.size;\n const opencodeReferences = opencodeReferenceIds.size;\n\n const claudeInstalled = claudeSkills > 0 || claudeAgents > 0 || hasClaudeOmdActivation(root);\n const codexInstalled = codexSkills > 0 || codexAgents > 0 ||\n existsSync(join(codexDataRoot, 'reference-fingerprints.json'));\n const opencodeInstalled = opencodeSkills > 0 || opencodeAgents > 0 ||\n existsSync(join(opencodeDataRoot, 'reference-fingerprints.json'));\n const cursorInstalled = !opts.global && existsSync(join(root, '.cursor', 'rules', 'omd-design.mdc'));\n\n const claudeIssues = claudeInstalled\n ? [\n ...coreIssues(\n root,\n claudeSkillsRoot,\n claudeDataRoot,\n claudeReferenceIds,\n 'claude-code',\n ),\n ...claudeAgentIssues(root),\n ...(opts.global ? [] : claudeActivationIssues(root)),\n ]\n : [];\n const codexIssues = codexInstalled\n ? [\n ...coreIssues(\n root,\n codexSkillsRoot,\n codexDataRoot,\n codexReferenceIds,\n 'codex',\n ),\n ...codexAgentIssues(root),\n ]\n : [];\n const opencodeIssues = opencodeInstalled\n ? [\n ...coreIssues(\n root,\n opencodeSkillsRoot,\n opencodeDataRoot,\n opencodeReferenceIds,\n 'opencode',\n ),\n ...openCodeAgentIssues(root, opencodeAgentsRoot),\n ]\n : [];\n const cursorIssues = cursorInstalled\n ? coreIssues(\n root,\n join(root, '.cursor', '__no_skills__'),\n claudeDataRoot,\n claudeReferenceIds,\n 'claude-code',\n ).filter((issue) => !issue.startsWith('missing product skills:'))\n .filter((issue) => !issue.startsWith('invalid claude-code skill definitions:'))\n .concat(cursorRuleIssues(root))\n : [];\n\n const channels: DoctorChannel[] = [\n {\n id: 'claude-code',\n installed: claudeInstalled,\n ready: claudeInstalled && claudeIssues.length === 0,\n skills: claudeSkills,\n agents: claudeAgents,\n references: claudeReferences,\n issues: claudeIssues,\n },\n {\n id: 'codex',\n installed: codexInstalled,\n ready: codexInstalled && codexIssues.length === 0,\n skills: codexSkills,\n agents: codexAgents,\n references: codexReferences,\n issues: codexIssues,\n },\n {\n id: 'opencode',\n installed: opencodeInstalled,\n ready: opencodeInstalled && opencodeIssues.length === 0,\n skills: opencodeSkills,\n agents: opencodeAgents,\n references: opencodeReferences,\n issues: opencodeIssues,\n },\n {\n id: 'cursor',\n installed: cursorInstalled,\n ready: cursorInstalled && cursorIssues.length === 0,\n skills: 0,\n agents: 0,\n references: claudeReferences,\n issues: cursorIssues,\n },\n ];\n\n const installedChannels = channels.filter((channel) => channel.installed);\n const cursorOnly = installedChannels.length === 1 && installedChannels[0].id === 'cursor';\n const hasInstall = installedChannels.length > 0;\n const hasIncompleteChannel = installedChannels.some((channel) => !channel.ready);\n const designMd = !opts.global && existsSync(join(projectRoot, 'DESIGN.md'));\n const state = !hasInstall\n ? 'not-installed'\n : hasIncompleteChannel\n ? 'incomplete'\n : designMd || opts.global\n ? 'ready'\n : 'needs-design-md';\n const nextPrompt = state === 'ready' && designMd\n ? cursorOnly\n ? 'Improve the home screen using our DESIGN.md. Preserve behavior, then verify the real route and accessibility.'\n : 'Improve the home screen using our DESIGN.md. Audit the result with omd:feel.'\n : state === 'needs-design-md' || (state === 'ready' && opts.global)\n ? 'Set up our design system — Toss-style, for a family meal-tracking app.'\n : '';\n const repairTargets = installedChannels\n .filter((channel) => !channel.ready)\n .map((channel) => channel.id)\n .join(' ');\n const dirSuffix = opts.dir && !opts.global\n ? ` --dir ${shellQuote(projectRoot)}`\n : '';\n const needsHookRepair = installedChannels.some(\n (channel) =>\n channel.id === 'claude-code' &&\n channel.issues.some((issue) =>\n issue.startsWith('stale or modified Claude hook file:'),\n ),\n );\n const allIssues = installedChannels.flatMap((channel) => channel.issues);\n const needsForceRepair = allIssues.some((issue) =>\n issue.startsWith('invalid ') ||\n issue === 'Claude hook settings are not valid JSON' ||\n issue === 'Cursor rule is not an OmD-managed design-system shim',\n );\n const needsManualReview = allIssues.some((issue) =>\n issue.startsWith('unsafe ') ||\n issue.startsWith('unmanaged legacy Codex skill paths require manual review:') ||\n issue.startsWith('bundled Claude hook source is missing:'),\n );\n const repairCommand = `npx oh-my-design-cli@latest install-skills --agent ${repairTargets} --all${needsHookRepair ? ' --repair-hooks' : ''}${needsForceRepair ? ' --force' : ''}${opts.global ? ' --global' : ''}${dirSuffix}`;\n\n return {\n root,\n scope: opts.global ? 'global' : 'project',\n state,\n designMd,\n channels,\n nextCommand: state === 'not-installed'\n ? dirSuffix\n ? `npx oh-my-design-cli@latest install-skills --all${dirSuffix}`\n : 'npx oh-my-design-cli@latest'\n : state === 'incomplete'\n ? needsManualReview ? '' : repairCommand\n : '',\n nextPrompt,\n manualAction: needsManualReview\n ? allIssues.some((issue) => issue.startsWith('bundled Claude hook source is missing:'))\n ? 'Reinstall the latest oh-my-design package; its bundled Claude hook sources are incomplete, so automatic repair is disabled.'\n : 'Replace symlinked OmD paths with real project-local files and review unmanaged legacy Codex entries, then run doctor again.'\n : '',\n };\n}\n\nconst CHANNEL_LABELS: Record<DoctorChannel['id'], string> = {\n 'claude-code': 'Claude Code',\n codex: 'Codex',\n opencode: 'OpenCode',\n cursor: 'Cursor',\n};\n\nexport async function runDoctor(opts: DoctorOptions = {}): Promise<number> {\n const report = collectDoctorReport(opts);\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return report.state === 'not-installed' || report.state === 'incomplete' ? 1 : 0;\n }\n\n p.intro(\n pc.bold('omd doctor') +\n pc.dim(` (${relative(process.cwd(), report.root) || '.'})`),\n );\n\n const installed = report.channels.filter((channel) => channel.installed);\n if (installed.length === 0) {\n p.log.error('No oh-my-design agent channel found in this scope.');\n p.note(\n `${pc.bold('Install the bundle:')}\\n\\n ${pc.cyan(report.nextCommand)}`,\n 'Next',\n );\n p.outro(pc.red('Action required.'));\n return 1;\n }\n\n for (const channel of installed) {\n const details = [\n channel.skills > 0 ? `${channel.skills} skills` : null,\n channel.agents > 0 ? `${channel.agents} sub-agents` : null,\n channel.references > 0 ? `${channel.references} references` : null,\n ].filter(Boolean);\n if (channel.ready) {\n p.log.success(`${CHANNEL_LABELS[channel.id]} ${pc.dim(details.join(' · '))}`);\n } else {\n p.log.warn(`${CHANNEL_LABELS[channel.id]} ${pc.dim(details.join(' · '))}`);\n for (const issue of channel.issues) p.log.message(` ${pc.yellow('–')} ${issue}`);\n }\n }\n\n if (report.state === 'incomplete') {\n const repairResetsHooks = report.nextCommand.includes('--repair-hooks');\n const repairForcesReservedPaths = report.nextCommand.includes('--force');\n const preservationNote = repairResetsHooks || repairForcesReservedPaths\n ? [\n repairResetsHooks ? 'The six OmD Claude hook paths will be reset to the packaged versions.' : null,\n repairForcesReservedPaths ? 'Conflicting files at OmD-reserved paths will be replaced; unrelated user files are preserved.' : null,\n ].filter(Boolean).join(' ')\n : 'User-authored files outside OmD ownership are preserved by the installer.';\n p.note(\n report.nextCommand\n ? `${pc.bold('Repair the managed bundle:')}\\n\\n ${pc.cyan(report.nextCommand)}\\n\\n` +\n pc.dim(`Run npx oh-my-design-cli@latest doctor again afterward. ${preservationNote}`)\n : `${pc.bold('Manual safety review required:')}\\n\\n ${pc.yellow(report.manualAction)}\\n\\n` +\n pc.dim('The installer will not follow symlinks or remove unmanaged legacy entries.'),\n 'Next',\n );\n p.outro(pc.red('Install found, but required runtime assets are incomplete.'));\n return 1;\n }\n\n if (report.scope === 'global') {\n p.log.success('Global bundle is discoverable from every project.');\n } else if (report.designMd) {\n p.log.success('DESIGN.md found — brand context is active.');\n } else {\n p.log.warn('Bundle installed, but this project has no DESIGN.md yet.');\n }\n\n const note = [\n report.designMd ? pc.bold('Build with the system:') : pc.bold('Activate this project:'),\n '',\n ` ${pc.cyan('EN')} ${pc.dim(report.nextPrompt)}`,\n report.designMd\n ? ` ${pc.cyan('KR')} ${pc.dim(\n report.channels.filter((channel) => channel.installed).length === 1 &&\n report.channels.find((channel) => channel.installed)?.id === 'cursor'\n ? 'DESIGN.md를 적용해 홈 화면을 개선하고 실제 경로와 접근성을 검증해줘'\n : 'DESIGN.md를 적용해 홈 화면을 개선하고 omd:feel로 검수해줘',\n )}`\n : ` ${pc.cyan('KR')} ${pc.dim('토스 스타일로 가족 식단 공유 앱 디자인 시스템 잡아줘')}`,\n '',\n pc.dim('Start a new agent session after install or upgrade so skills are reloaded.'),\n ...(report.channels.some((channel) => channel.id === 'codex' && channel.installed)\n ? [pc.dim('Codex also requires the project to be trusted before project-local roles are loaded.')]\n : []),\n ].join('\\n');\n p.note(note, 'Next');\n p.outro(\n report.state === 'ready'\n ? pc.green('Ready. Your next prompt is the product surface.')\n : pc.yellow('One prompt away from activation.'),\n );\n return 0;\n}\n"],"mappings":"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","names":["note"]}