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.
- package/.claude/hooks/lib/preferences-parser.cjs +1 -0
- package/.claude/hooks/lib/preferences-writer.cjs +1 -0
- package/.claude/hooks/post-edit-watch.cjs +1 -0
- package/.claude/hooks/session-end-foldin.cjs +1 -0
- package/.claude/hooks/session-state-loader.cjs +1 -0
- package/.claude/hooks/skill-activation.cjs +1 -0
- package/.claude/settings.json +10 -1
- package/.github/assets/logo-bg.png +0 -0
- package/AGENTS.md +20 -1
- package/CHANGELOG.md +482 -0
- package/MIGRATION.md +103 -0
- package/README.ja.md +56 -19
- package/README.ko.md +47 -30
- package/README.md +48 -30
- package/README.zh-TW.md +59 -22
- package/agents/AGENT.md +8 -7
- package/agents/omd-codex-image.md +1 -1
- package/agents/omd-critic.md +6 -7
- package/agents/omd-designer-review.md +1 -1
- package/agents/omd-final-qa.md +1 -1
- package/agents/omd-humanizer.md +38 -0
- package/agents/omd-kr-writer.md +3 -4
- package/agents/omd-locale-adapter.md +12 -16
- package/agents/omd-master.md +24 -19
- package/agents/omd-microcopy.md +1 -1
- package/agents/omd-orchestrator.md +7 -8
- package/agents/omd-slop-auditor.md +31 -0
- package/agents/omd-ux-researcher.md +1 -1
- package/data/reference-fingerprints.json +2761 -85
- package/dist/bin/oh-my-design.js +16 -8
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/chunk-UJIHCEYF.js +99 -0
- package/dist/chunk-UJIHCEYF.js.map +1 -0
- package/dist/doctor-LDWSFM3I.js +763 -0
- package/dist/doctor-LDWSFM3I.js.map +1 -0
- package/dist/install-skills-ZZFNJ2II.js +1120 -0
- package/dist/install-skills-ZZFNJ2II.js.map +1 -0
- package/docs/CLI_QUICKSTART.md +157 -0
- package/package.json +25 -4
- package/scripts/postinstall.cjs +5 -4
- package/skills/claude-design/SKILL.md +38 -14
- package/skills/claude-design/references/claude-design-flow.md +11 -11
- package/skills/claude-design/references/codebase-analysis.md +5 -4
- package/skills/omd-final-qa/SKILL.md +1 -1
- package/skills/omd-harness/SKILL.md +51 -50
- package/skills/omd-humanize/SKILL.md +116 -0
- package/skills/omd-humanize/agents/openai.yaml +4 -0
- package/skills/omd-humanize/references/locale-playbooks.md +102 -0
- package/skills/omd-humanize/references/sources.md +11 -0
- package/skills/omd-init/SKILL.md +18 -12
- package/skills/omd-locale-adapter/SKILL.md +58 -91
- package/skills/omd-orchestrator/SKILL.md +11 -5
- package/skills/omd-reference-capture/SKILL.md +80 -26
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-LICENSE.txt +202 -0
- package/skills/omd-reference-capture/scripts/PLAYWRIGHT-NOTICE.txt +5 -0
- package/skills/omd-reference-capture/scripts/THIRD_PARTY_NOTICES.md +3 -0
- package/skills/omd-reference-capture/scripts/capture-reference-evidence.mjs +159906 -0
- package/skills/omd-slop-audit/SKILL.md +110 -0
- package/skills/omd-slop-audit/agents/openai.yaml +4 -0
- package/skills/omd-slop-audit/references/pattern-catalog.md +96 -0
- package/skills/omd-slop-audit/references/sources.md +24 -0
- package/web/references/104/DESIGN.md +354 -0
- package/web/references/11st/DESIGN.md +197 -316
- package/web/references/29cm/DESIGN.md +297 -393
- package/web/references/42dot/DESIGN.md +390 -0
- package/web/references/8percent/DESIGN.md +438 -0
- package/web/references/ably/DESIGN.md +267 -572
- package/web/references/acer/DESIGN.md +329 -0
- package/web/references/airbnb/DESIGN.md +219 -557
- package/web/references/airbridge/DESIGN.md +451 -0
- package/web/references/alipay/DESIGN.md +179 -420
- package/web/references/apple/DESIGN.md +224 -498
- package/web/references/asleep/DESIGN.md +402 -0
- package/web/references/au/DESIGN.md +334 -0
- package/web/references/autopedia/DESIGN.md +382 -0
- package/web/references/aws-cloudscape/DESIGN.md +241 -0
- package/web/references/baemin/DESIGN.md +332 -491
- package/web/references/banksalad/DESIGN.md +269 -180
- package/web/references/barogo/DESIGN.md +416 -0
- package/web/references/beusable/DESIGN.md +464 -0
- package/web/references/bigin/DESIGN.md +454 -0
- package/web/references/bilibili/DESIGN.md +206 -374
- package/web/references/bmw/DESIGN.md +162 -276
- package/web/references/brandi/DESIGN.md +184 -325
- package/web/references/buzzvil/DESIGN.md +457 -0
- package/web/references/cafe24/DESIGN.md +472 -0
- package/web/references/catchtable/DESIGN.md +219 -264
- package/web/references/cgv/DESIGN.md +317 -0
- package/web/references/channeltalk/DESIGN.md +210 -336
- package/web/references/china-airlines/DESIGN.md +291 -0
- package/web/references/cjonstyle/DESIGN.md +453 -0
- package/web/references/class101/DESIGN.md +168 -387
- package/web/references/classum/DESIGN.md +228 -203
- package/web/references/claude/DESIGN.md +242 -479
- package/web/references/clay/DESIGN.md +179 -377
- package/web/references/clickhouse/DESIGN.md +254 -343
- package/web/references/codeit/DESIGN.md +470 -0
- package/web/references/cohere/DESIGN.md +214 -324
- package/web/references/coinone/DESIGN.md +199 -179
- package/web/references/corca/DESIGN.md +414 -0
- package/web/references/coupang/DESIGN.md +205 -475
- package/web/references/cursor/DESIGN.md +240 -381
- package/web/references/dabang/DESIGN.md +248 -213
- package/web/references/dable/DESIGN.md +431 -0
- package/web/references/datarize/DESIGN.md +338 -0
- package/web/references/dealicious/DESIGN.md +402 -0
- package/web/references/drdiary/DESIGN.md +404 -0
- package/web/references/elastic/DESIGN.md +238 -0
- package/web/references/elevenlabs/DESIGN.md +183 -321
- package/web/references/elice/DESIGN.md +445 -0
- package/web/references/eslite/DESIGN.md +257 -0
- package/web/references/evaair/DESIGN.md +338 -0
- package/web/references/expo/DESIGN.md +238 -331
- package/web/references/familymart-tw/DESIGN.md +254 -0
- package/web/references/ferrari/DESIGN.md +160 -377
- package/web/references/figma/DESIGN.md +197 -451
- package/web/references/fitpet/DESIGN.md +445 -0
- package/web/references/flex/DESIGN.md +170 -253
- package/web/references/framer/DESIGN.md +197 -340
- package/web/references/freee/DESIGN.md +211 -533
- package/web/references/friendliai/DESIGN.md +431 -0
- package/web/references/frip/DESIGN.md +440 -0
- package/web/references/furiosaai/DESIGN.md +450 -0
- package/web/references/gangnamunni/DESIGN.md +154 -591
- package/web/references/gaudiolab/DESIGN.md +414 -0
- package/web/references/google/DESIGN.md +290 -398
- package/web/references/goorm/DESIGN.md +470 -0
- package/web/references/greencar/DESIGN.md +420 -0
- package/web/references/hackle/DESIGN.md +472 -0
- package/web/references/hashicorp/DESIGN.md +273 -318
- package/web/references/heydealer/DESIGN.md +429 -0
- package/web/references/humanscape/DESIGN.md +433 -0
- package/web/references/hwahae/DESIGN.md +453 -0
- package/web/references/hyundai/DESIGN.md +158 -368
- package/web/references/hyundaicard/DESIGN.md +171 -121
- package/web/references/ibm/DESIGN.md +227 -378
- package/web/references/idus/DESIGN.md +450 -0
- package/web/references/igaworks/DESIGN.md +437 -0
- package/web/references/inflearn/DESIGN.md +221 -366
- package/web/references/intuit/DESIGN.md +244 -0
- package/web/references/jandi/DESIGN.md +191 -291
- package/web/references/jobplanet/DESIGN.md +415 -0
- package/web/references/kakao/DESIGN.md +287 -475
- package/web/references/kakaobank/DESIGN.md +220 -521
- package/web/references/kakaogames/DESIGN.md +220 -0
- package/web/references/kakaopay/DESIGN.md +207 -526
- package/web/references/karrot/DESIGN.md +227 -251
- package/web/references/kb-kookmin/DESIGN.md +308 -0
- package/web/references/kbank/DESIGN.md +220 -175
- package/web/references/kcd/DESIGN.md +432 -0
- package/web/references/kmong/DESIGN.md +281 -356
- package/web/references/krds/DESIGN.md +245 -19
- package/web/references/kream/DESIGN.md +224 -359
- package/web/references/kurly/DESIGN.md +211 -533
- package/web/references/kyobobook/DESIGN.md +445 -0
- package/web/references/lablup/DESIGN.md +474 -0
- package/web/references/lamborghini/DESIGN.md +198 -360
- package/web/references/lemonbase/DESIGN.md +452 -0
- package/web/references/lguplus/DESIGN.md +259 -0
- package/web/references/likelion/DESIGN.md +283 -0
- package/web/references/line/DESIGN.md +396 -355
- package/web/references/linear.app/DESIGN.md +209 -562
- package/web/references/lotteon/DESIGN.md +386 -0
- package/web/references/lovable/DESIGN.md +255 -349
- package/web/references/makinarocks/DESIGN.md +242 -0
- package/web/references/maum-ai/DESIGN.md +423 -0
- package/web/references/medibloc/DESIGN.md +425 -0
- package/web/references/megabox/DESIGN.md +232 -0
- package/web/references/mercari/DESIGN.md +217 -434
- package/web/references/microsoft/DESIGN.md +234 -388
- package/web/references/mildang/DESIGN.md +411 -0
- package/web/references/millie/DESIGN.md +183 -504
- package/web/references/minimax/DESIGN.md +264 -322
- package/web/references/miricanvas/DESIGN.md +182 -355
- package/web/references/miro/DESIGN.md +234 -232
- package/web/references/mistral.ai/DESIGN.md +231 -314
- package/web/references/mixi/DESIGN.md +234 -0
- package/web/references/moin/DESIGN.md +445 -0
- package/web/references/mongodb/DESIGN.md +219 -316
- package/web/references/moreh/DESIGN.md +437 -0
- package/web/references/musinsa/DESIGN.md +184 -510
- package/web/references/mynavi/DESIGN.md +242 -0
- package/web/references/myrealtrip/DESIGN.md +169 -406
- package/web/references/naver/DESIGN.md +328 -499
- package/web/references/naverwebtoon/DESIGN.md +172 -395
- package/web/references/neosapience/DESIGN.md +441 -0
- package/web/references/nhn/DESIGN.md +169 -346
- package/web/references/nhncloud/DESIGN.md +185 -123
- package/web/references/nota/DESIGN.md +451 -0
- package/web/references/notion/DESIGN.md +271 -475
- package/web/references/nrise/DESIGN.md +417 -0
- package/web/references/ohouse/DESIGN.md +210 -549
- package/web/references/oliveyoung/DESIGN.md +217 -326
- package/web/references/ollama/DESIGN.md +241 -308
- package/web/references/onestore/DESIGN.md +248 -0
- package/web/references/palantir/DESIGN.md +256 -0
- package/web/references/panasonic/DESIGN.md +276 -0
- package/web/references/patternfly/DESIGN.md +259 -0
- package/web/references/payhere/DESIGN.md +438 -0
- package/web/references/pega/DESIGN.md +262 -0
- package/web/references/peoplefund/DESIGN.md +431 -0
- package/web/references/petfriends/DESIGN.md +428 -0
- package/web/references/pinkfong/DESIGN.md +199 -367
- package/web/references/pinterest/DESIGN.md +258 -308
- package/web/references/portone/DESIGN.md +446 -0
- package/web/references/poya/DESIGN.md +286 -0
- package/web/references/pozalabs/DESIGN.md +438 -0
- package/web/references/protopie/DESIGN.md +419 -0
- package/web/references/qraft/DESIGN.md +448 -0
- package/web/references/queenit/DESIGN.md +432 -0
- package/web/references/quotabook/DESIGN.md +449 -0
- package/web/references/rebellions/DESIGN.md +449 -0
- package/web/references/recruit/DESIGN.md +247 -0
- package/web/references/remember/DESIGN.md +202 -396
- package/web/references/resend/DESIGN.md +274 -348
- package/web/references/returnzero/DESIGN.md +460 -0
- package/web/references/sakura-internet/DESIGN.md +269 -0
- package/web/references/samsung/DESIGN.md +157 -359
- package/web/references/sandoll/DESIGN.md +445 -0
- package/web/references/sanity/DESIGN.md +241 -375
- package/web/references/saramin/DESIGN.md +465 -0
- package/web/references/scatterlab/DESIGN.md +412 -0
- package/web/references/selectstar/DESIGN.md +439 -0
- package/web/references/servicenow/DESIGN.md +289 -0
- package/web/references/shiftee/DESIGN.md +468 -0
- package/web/references/shinhanbank/DESIGN.md +161 -341
- package/web/references/shinhancard/DESIGN.md +208 -319
- package/web/references/sionic/DESIGN.md +454 -0
- package/web/references/sktelecom/DESIGN.md +310 -0
- package/web/references/socar/DESIGN.md +125 -32
- package/web/references/softbank/DESIGN.md +231 -0
- package/web/references/solapi/DESIGN.md +483 -0
- package/web/references/sony/DESIGN.md +234 -0
- package/web/references/soop/DESIGN.md +261 -0
- package/web/references/spacex/DESIGN.md +184 -323
- package/web/references/spotify/DESIGN.md +253 -394
- package/web/references/squeezebits/DESIGN.md +441 -0
- package/web/references/stayfolio/DESIGN.md +422 -0
- package/web/references/stripe/DESIGN.md +212 -491
- package/web/references/supabase/DESIGN.md +244 -316
- package/web/references/supertone/DESIGN.md +413 -0
- package/web/references/tabling/DESIGN.md +415 -0
- package/web/references/taishinbank/DESIGN.md +243 -0
- package/web/references/teamlab/DESIGN.md +240 -0
- package/web/references/teamsparta/DESIGN.md +472 -0
- package/web/references/tellingme/DESIGN.md +392 -0
- package/web/references/tesla/DESIGN.md +244 -427
- package/web/references/thsr/DESIGN.md +284 -0
- package/web/references/thumbtack/DESIGN.md +302 -0
- package/web/references/together.ai/DESIGN.md +257 -304
- package/web/references/toss/DESIGN.md +251 -593
- package/web/references/toss-securities/DESIGN.md +255 -178
- package/web/references/tossbank/DESIGN.md +195 -491
- package/web/references/toyota/DESIGN.md +238 -0
- package/web/references/tving/DESIGN.md +197 -245
- package/web/references/typed/DESIGN.md +413 -0
- package/web/references/uber/DESIGN.md +256 -333
- package/web/references/udn/DESIGN.md +250 -0
- package/web/references/upbit/DESIGN.md +145 -256
- package/web/references/upstage/DESIGN.md +211 -204
- package/web/references/uswds/DESIGN.md +287 -0
- package/web/references/vercel/DESIGN.md +236 -440
- package/web/references/vuno/DESIGN.md +413 -0
- package/web/references/wanted/DESIGN.md +215 -487
- package/web/references/weverse/DESIGN.md +437 -0
- package/web/references/wise/DESIGN.md +223 -231
- package/web/references/wisetracker/DESIGN.md +462 -0
- package/web/references/wooribank/DESIGN.md +245 -0
- package/web/references/yanolja/DESIGN.md +250 -419
- package/web/references/yeogiotte/DESIGN.md +235 -418
- package/web/references/zapier/DESIGN.md +256 -377
- package/web/references/zendesk/DESIGN.md +288 -0
- package/web/references/zigzag/DESIGN.md +200 -621
- package/dist/install-skills-7UUDOLG2.js +0 -734
- 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"]}
|