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.
- 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 +1995 -38
- 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/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/bilibili/DESIGN.md +206 -374
- package/web/references/bmw/DESIGN.md +162 -276
- package/web/references/brandi/DESIGN.md +184 -325
- 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/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 +217 -330
- 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/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/gangnamunni/DESIGN.md +154 -591
- package/web/references/gaudiolab/DESIGN.md +414 -0
- package/web/references/google/DESIGN.md +290 -398
- 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/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/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/lamborghini/DESIGN.md +198 -360
- 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 +149 -349
- 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/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/nhn/DESIGN.md +169 -346
- package/web/references/nhncloud/DESIGN.md +185 -123
- 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/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/quotabook/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/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/scatterlab/DESIGN.md +412 -0
- package/web/references/selectstar/DESIGN.md +439 -0
- package/web/references/servicenow/DESIGN.md +289 -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/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/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/wanted/DESIGN.md +215 -487
- 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
package/dist/bin/oh-my-design.js
CHANGED
|
@@ -23,18 +23,21 @@ function readPackageVersion() {
|
|
|
23
23
|
return "0.0.0";
|
|
24
24
|
}
|
|
25
25
|
var program = new Command();
|
|
26
|
-
program.name("oh-my-design").description("
|
|
27
|
-
program.
|
|
26
|
+
program.name("oh-my-design").description("Install and diagnose the oh-my-design skill bundle. After setup, design work happens through natural-language prompts in your coding agent.").version(readPackageVersion()).showSuggestionAfterError(true).showHelpAfterError(true);
|
|
27
|
+
program.action(async () => {
|
|
28
|
+
const { runInstallSkills } = await import("../install-skills-ZZFNJ2II.js");
|
|
29
|
+
const code = await runInstallSkills();
|
|
30
|
+
if (code !== 0) process.exit(code);
|
|
31
|
+
});
|
|
32
|
+
program.command("install-skills").description("Install OmD skills, specialist roles, and the reference catalog into the selected coding-agent channels.").option("--dir <path>", "Project root (defaults to cwd)").option("--agent <name...>", "Restrict to specific channels (claude-code | codex | opencode | cursor)").option("--force", "Overwrite existing files even without the omd marker").option("--repair-hooks", "Refresh the managed Claude hook bundle without overwriting other unmarked files").option("--all", "Skip the interactive TUI and install every shipped skill + agent (use in CI)").option("--skills <names>", "Comma-separated skill names to install (overrides TUI)", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).option("--agents-only <names>", "Comma-separated agent names to install (overrides TUI). Use --agents-only to disambiguate from --agent (channel selector).", (v) => v.split(",").map((s) => s.trim()).filter(Boolean)).option("--skills-only", "Install only the named skill files \u2014 skip sub-agents, hooks, and settings.json (minimal single-skill install, e.g. --skills claude-design --skills-only)").option("--global", "Install to each channel's user-level discovery directory instead of this project. Writes skills + sub-agents + catalog; never touches global hooks/settings.").action(
|
|
28
33
|
async (opts) => {
|
|
29
|
-
const { runInstallSkills } = await import("../install-skills-
|
|
30
|
-
const
|
|
31
|
-
const agents = opts.agent ? opts.agent.filter(
|
|
32
|
-
(a) => validAgents.includes(a)
|
|
33
|
-
) : void 0;
|
|
34
|
+
const { runInstallSkills } = await import("../install-skills-ZZFNJ2II.js");
|
|
35
|
+
const agents = opts.agent;
|
|
34
36
|
const code = await runInstallSkills({
|
|
35
37
|
dir: opts.dir,
|
|
36
38
|
agents,
|
|
37
39
|
force: opts.force,
|
|
40
|
+
repairHooks: opts.repairHooks,
|
|
38
41
|
all: opts.all,
|
|
39
42
|
skillsFilter: opts.skills,
|
|
40
43
|
agentsFilter: opts.agentsOnly,
|
|
@@ -44,5 +47,10 @@ program.command("install-skills").description("Install omd skill files + canonic
|
|
|
44
47
|
if (code !== 0) process.exit(code);
|
|
45
48
|
}
|
|
46
49
|
);
|
|
47
|
-
program.
|
|
50
|
+
program.command("doctor").description("Check whether skills, sub-agents, references, and DESIGN.md are ready; print the exact next action.").option("--dir <path>", "Project root (defaults to cwd)").option("--global", "Check the user-level installation instead of this project").option("--json", "Print a machine-readable report").action(async (opts) => {
|
|
51
|
+
const { runDoctor } = await import("../doctor-LDWSFM3I.js");
|
|
52
|
+
const code = await runDoctor(opts);
|
|
53
|
+
if (code !== 0) process.exit(code);
|
|
54
|
+
});
|
|
55
|
+
await program.parseAsync();
|
|
48
56
|
//# sourceMappingURL=oh-my-design.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/oh-my-design.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n let cur = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const pkg = join(cur, 'package.json');\n if (existsSync(pkg)) {\n try {\n return JSON.parse(readFileSync(pkg, 'utf8')).version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n }\n const parent = dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return '0.0.0';\n}\n\nconst program = new Command();\n\nprogram\n .name('oh-my-design')\n .description('
|
|
1
|
+
{"version":3,"sources":["../../bin/oh-my-design.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n let cur = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const pkg = join(cur, 'package.json');\n if (existsSync(pkg)) {\n try {\n return JSON.parse(readFileSync(pkg, 'utf8')).version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n }\n const parent = dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return '0.0.0';\n}\n\nconst program = new Command();\n\nprogram\n .name('oh-my-design')\n .description('Install and diagnose the oh-my-design skill bundle. After setup, design work happens through natural-language prompts in your coding agent.')\n .version(readPackageVersion())\n .showSuggestionAfterError(true)\n .showHelpAfterError(true);\n\nprogram.action(async () => {\n const { runInstallSkills } = await import('../src/cli/install-skills.js');\n const code = await runInstallSkills();\n if (code !== 0) process.exit(code);\n});\n\nprogram\n .command('install-skills')\n .description('Install OmD skills, specialist roles, and the reference catalog into the selected coding-agent channels.')\n .option('--dir <path>', 'Project root (defaults to cwd)')\n .option('--agent <name...>', 'Restrict to specific channels (claude-code | codex | opencode | cursor)')\n .option('--force', 'Overwrite existing files even without the omd marker')\n .option('--repair-hooks', 'Refresh the managed Claude hook bundle without overwriting other unmarked files')\n .option('--all', 'Skip the interactive TUI and install every shipped skill + agent (use in CI)')\n .option('--skills <names>', 'Comma-separated skill names to install (overrides TUI)', (v) => v.split(',').map((s) => s.trim()).filter(Boolean))\n .option('--agents-only <names>', 'Comma-separated agent names to install (overrides TUI). Use --agents-only to disambiguate from --agent (channel selector).', (v) => v.split(',').map((s) => s.trim()).filter(Boolean))\n .option('--skills-only', 'Install only the named skill files — skip sub-agents, hooks, and settings.json (minimal single-skill install, e.g. --skills claude-design --skills-only)')\n .option('--global', 'Install to each channel\\'s user-level discovery directory instead of this project. Writes skills + sub-agents + catalog; never touches global hooks/settings.')\n .action(\n async (opts: {\n dir?: string;\n agent?: string[];\n force?: boolean;\n repairHooks?: boolean;\n all?: boolean;\n skills?: string[];\n agentsOnly?: string[];\n skillsOnly?: boolean;\n global?: boolean;\n }) => {\n const { runInstallSkills } = await import('../src/cli/install-skills.js');\n type Agent = 'claude-code' | 'codex' | 'opencode' | 'cursor';\n // Keep raw values until runInstallSkills validates them. Silently\n // filtering an invalid channel used to produce a successful 0-file install.\n const agents = opts.agent as Agent[] | undefined;\n const code = await runInstallSkills({\n dir: opts.dir,\n agents,\n force: opts.force,\n repairHooks: opts.repairHooks,\n all: opts.all,\n skillsFilter: opts.skills,\n agentsFilter: opts.agentsOnly,\n skillsOnly: opts.skillsOnly,\n global: opts.global,\n });\n if (code !== 0) process.exit(code);\n }\n );\n\nprogram\n .command('doctor')\n .description('Check whether skills, sub-agents, references, and DESIGN.md are ready; print the exact next action.')\n .option('--dir <path>', 'Project root (defaults to cwd)')\n .option('--global', 'Check the user-level installation instead of this project')\n .option('--json', 'Print a machine-readable report')\n .action(async (opts: { dir?: string; global?: boolean; json?: boolean }) => {\n const { runDoctor } = await import('../src/cli/doctor.js');\n const code = await runDoctor(opts);\n if (code !== 0) process.exit(code);\n });\n\nawait program.parseAsync();\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,cAAc,kBAAkB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,qBAA6B;AACpC,MAAI,MAAM,QAAQ,cAAc,YAAY,GAAG,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,MAAM,KAAK,KAAK,cAAc;AACpC,QAAI,WAAW,GAAG,GAAG;AACnB,UAAI;AACF,eAAO,KAAK,MAAM,aAAa,KAAK,MAAM,CAAC,EAAE,WAAW;AAAA,MAC1D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,cAAc,EACnB,YAAY,6IAA6I,EACzJ,QAAQ,mBAAmB,CAAC,EAC5B,yBAAyB,IAAI,EAC7B,mBAAmB,IAAI;AAE1B,QAAQ,OAAO,YAAY;AACzB,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,+BAA8B;AACxE,QAAM,OAAO,MAAM,iBAAiB;AACpC,MAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AACnC,CAAC;AAED,QACG,QAAQ,gBAAgB,EACxB,YAAY,0GAA0G,EACtH,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,qBAAqB,yEAAyE,EACrG,OAAO,WAAW,sDAAsD,EACxE,OAAO,kBAAkB,iFAAiF,EAC1G,OAAO,SAAS,8EAA8E,EAC9F,OAAO,oBAAoB,0DAA0D,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,EAC7I,OAAO,yBAAyB,8HAA8H,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,EACtN,OAAO,iBAAiB,+JAA0J,EAClL,OAAO,YAAY,8JAA+J,EAClL;AAAA,EACC,OAAO,SAUD;AACJ,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,+BAA8B;AAIxE,UAAM,SAAS,KAAK;AACpB,UAAM,OAAO,MAAM,iBAAiB;AAAA,MAClC,KAAK,KAAK;AAAA,MACV;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,KAAK,KAAK;AAAA,MACV,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AAAA,EACnC;AACF;AAEF,QACG,QAAQ,QAAQ,EAChB,YAAY,qGAAqG,EACjH,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,YAAY,2DAA2D,EAC9E,OAAO,UAAU,iCAAiC,EAClD,OAAO,OAAO,SAA6D;AAC1E,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,uBAAsB;AACzD,QAAM,OAAO,MAAM,UAAU,IAAI;AACjC,MAAI,SAAS,EAAG,SAAQ,KAAK,IAAI;AACnC,CAAC;AAEH,MAAM,QAAQ,WAAW;","names":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/cli/hook-contract.ts
|
|
4
|
+
import { createHash } from "crypto";
|
|
5
|
+
var CLAUDE_HOOK_PATHS = [
|
|
6
|
+
"skill-activation.cjs",
|
|
7
|
+
"session-state-loader.cjs",
|
|
8
|
+
"post-edit-watch.cjs",
|
|
9
|
+
"session-end-foldin.cjs",
|
|
10
|
+
"lib/preferences-parser.cjs",
|
|
11
|
+
"lib/preferences-writer.cjs"
|
|
12
|
+
];
|
|
13
|
+
var MARKER_RE = /^\/\/ omd:installed-hook sha256=([0-9a-f]{64})\r?$/m;
|
|
14
|
+
var LEGACY_HOOK_HASHES = {
|
|
15
|
+
"skill-activation.cjs": [
|
|
16
|
+
"2231898cfa1f187abe96dea3f1c32b1be522eefe6f13fc5cd887e8745da2aff7",
|
|
17
|
+
"3ac226a3cd7d9579d44c0d760fbb5a0b806208132e546c35c0d226dda3552338",
|
|
18
|
+
"94521f10970b5fcf408fb3aa363a896d00328b045f687aa34d3fc93783f1bb9d",
|
|
19
|
+
"e6e551bfdd46906bdd6b4ef955c3152f1b88b10010519d8d7886f39c052834a3"
|
|
20
|
+
],
|
|
21
|
+
"session-state-loader.cjs": [
|
|
22
|
+
"06f12167efb4fbd56dde586c0cc4a181f873b8e98da986aed2fe67b3eb14a9e6",
|
|
23
|
+
"757860c1ab47e3a74465b51c53438b9a1f964b63ae904699e12a28f20b0db1e2",
|
|
24
|
+
"8982eff72fc5bd4ab78ba152609560d96aaccde1add1506833ca0d47916369f6",
|
|
25
|
+
"e5c62304db69247f7deb2237b9b4c559b65e56c0b9d2a9f095f41fa6598d4f4c"
|
|
26
|
+
],
|
|
27
|
+
"post-edit-watch.cjs": [
|
|
28
|
+
"6209bd47f9403ec158cfebd66d3e9a00ec19024d62cbac590cf3a977ddf099a1",
|
|
29
|
+
"8f675e4e4b33ac648fca29a934fb2365608c8d8b738a8848e9fafa01ab99cbf5",
|
|
30
|
+
"f471b2b322fbbedf5a1a311819827a55aedcc1cd660617df2b2d130153467974",
|
|
31
|
+
"f9e2f5ba7287405505c8c9d871a10e8c15c37a403dcff4501f72e25b5c0213e2"
|
|
32
|
+
],
|
|
33
|
+
"session-end-foldin.cjs": [
|
|
34
|
+
"2bc5b9656c2e3891c68c9bb3213af770002727fd354273fbe4b3158c9dd92968",
|
|
35
|
+
"c3055666d94fd6861f8324275ab89477af1c9edce32562a18ebd36e13600db15",
|
|
36
|
+
"c53779b4806cd5d96851f28fc6db6951d3e34713f2439f38048a892c1fb182b5"
|
|
37
|
+
],
|
|
38
|
+
"lib/preferences-parser.cjs": [
|
|
39
|
+
"44ceaf346dc7238f92f127699d9b985940f77c68a461752d15f10b930ecea4ca",
|
|
40
|
+
"d11bd77a840ff1173299ae573061c3519e9dc728a53ce20c07348717091c2bf1"
|
|
41
|
+
],
|
|
42
|
+
"lib/preferences-writer.cjs": [
|
|
43
|
+
"f539948ceb96797081ba2669c7820149a7b1784659b5f950d1b08f2a9945b30e"
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
function sha256(content) {
|
|
47
|
+
return createHash("sha256").update(content).digest("hex");
|
|
48
|
+
}
|
|
49
|
+
function stripManagedHookMarker(content) {
|
|
50
|
+
return content.replace(/^\/\/ omd:installed-hook sha256=[0-9a-f]{64}\r?\n/m, "");
|
|
51
|
+
}
|
|
52
|
+
function renderManagedHook(source) {
|
|
53
|
+
const raw = stripManagedHookMarker(source);
|
|
54
|
+
const marker = `// omd:installed-hook sha256=${sha256(raw)}`;
|
|
55
|
+
const shebangEnd = raw.startsWith("#!") ? raw.indexOf("\n") : -1;
|
|
56
|
+
return shebangEnd >= 0 ? `${raw.slice(0, shebangEnd + 1)}${marker}
|
|
57
|
+
${raw.slice(shebangEnd + 1)}` : `${marker}
|
|
58
|
+
${raw}`;
|
|
59
|
+
}
|
|
60
|
+
function isCurrentManagedHook(content, source) {
|
|
61
|
+
return content === renderManagedHook(source);
|
|
62
|
+
}
|
|
63
|
+
function isSelfConsistentManagedHook(content) {
|
|
64
|
+
const declared = MARKER_RE.exec(content)?.[1];
|
|
65
|
+
return Boolean(declared && declared === sha256(stripManagedHookMarker(content)));
|
|
66
|
+
}
|
|
67
|
+
function isKnownLegacyHook(path, content) {
|
|
68
|
+
return !MARKER_RE.test(content) && LEGACY_HOOK_HASHES[path].includes(sha256(content));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/cli/install-path.ts
|
|
72
|
+
import { existsSync, lstatSync } from "fs";
|
|
73
|
+
import { isAbsolute, join, relative, resolve, sep } from "path";
|
|
74
|
+
function unsafeManagedPath(installRoot, destination) {
|
|
75
|
+
const root = resolve(installRoot);
|
|
76
|
+
const target = resolve(destination);
|
|
77
|
+
const rel = relative(root, target);
|
|
78
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
79
|
+
return "destination escapes the selected install root";
|
|
80
|
+
}
|
|
81
|
+
let current = root;
|
|
82
|
+
for (const segment of rel.split(sep).filter(Boolean)) {
|
|
83
|
+
current = join(current, segment);
|
|
84
|
+
if (existsSync(current) && lstatSync(current).isSymbolicLink()) {
|
|
85
|
+
return `symlinked managed path: ${relative(root, current)}`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
CLAUDE_HOOK_PATHS,
|
|
93
|
+
renderManagedHook,
|
|
94
|
+
isCurrentManagedHook,
|
|
95
|
+
isSelfConsistentManagedHook,
|
|
96
|
+
isKnownLegacyHook,
|
|
97
|
+
unsafeManagedPath
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=chunk-UJIHCEYF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/hook-contract.ts","../src/cli/install-path.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nexport const CLAUDE_HOOK_PATHS = [\n 'skill-activation.cjs',\n 'session-state-loader.cjs',\n 'post-edit-watch.cjs',\n 'session-end-foldin.cjs',\n 'lib/preferences-parser.cjs',\n 'lib/preferences-writer.cjs',\n] as const;\n\nconst MARKER_RE = /^\\/\\/ omd:installed-hook sha256=([0-9a-f]{64})\\r?$/m;\n\nconst LEGACY_HOOK_HASHES: Record<(typeof CLAUDE_HOOK_PATHS)[number], readonly string[]> = {\n 'skill-activation.cjs': [\n '2231898cfa1f187abe96dea3f1c32b1be522eefe6f13fc5cd887e8745da2aff7',\n '3ac226a3cd7d9579d44c0d760fbb5a0b806208132e546c35c0d226dda3552338',\n '94521f10970b5fcf408fb3aa363a896d00328b045f687aa34d3fc93783f1bb9d',\n 'e6e551bfdd46906bdd6b4ef955c3152f1b88b10010519d8d7886f39c052834a3',\n ],\n 'session-state-loader.cjs': [\n '06f12167efb4fbd56dde586c0cc4a181f873b8e98da986aed2fe67b3eb14a9e6',\n '757860c1ab47e3a74465b51c53438b9a1f964b63ae904699e12a28f20b0db1e2',\n '8982eff72fc5bd4ab78ba152609560d96aaccde1add1506833ca0d47916369f6',\n 'e5c62304db69247f7deb2237b9b4c559b65e56c0b9d2a9f095f41fa6598d4f4c',\n ],\n 'post-edit-watch.cjs': [\n '6209bd47f9403ec158cfebd66d3e9a00ec19024d62cbac590cf3a977ddf099a1',\n '8f675e4e4b33ac648fca29a934fb2365608c8d8b738a8848e9fafa01ab99cbf5',\n 'f471b2b322fbbedf5a1a311819827a55aedcc1cd660617df2b2d130153467974',\n 'f9e2f5ba7287405505c8c9d871a10e8c15c37a403dcff4501f72e25b5c0213e2',\n ],\n 'session-end-foldin.cjs': [\n '2bc5b9656c2e3891c68c9bb3213af770002727fd354273fbe4b3158c9dd92968',\n 'c3055666d94fd6861f8324275ab89477af1c9edce32562a18ebd36e13600db15',\n 'c53779b4806cd5d96851f28fc6db6951d3e34713f2439f38048a892c1fb182b5',\n ],\n 'lib/preferences-parser.cjs': [\n '44ceaf346dc7238f92f127699d9b985940f77c68a461752d15f10b930ecea4ca',\n 'd11bd77a840ff1173299ae573061c3519e9dc728a53ce20c07348717091c2bf1',\n ],\n 'lib/preferences-writer.cjs': [\n 'f539948ceb96797081ba2669c7820149a7b1784659b5f950d1b08f2a9945b30e',\n ],\n};\n\nfunction sha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function stripManagedHookMarker(content: string): string {\n return content.replace(/^\\/\\/ omd:installed-hook sha256=[0-9a-f]{64}\\r?\\n/m, '');\n}\n\nexport function renderManagedHook(source: string): string {\n const raw = stripManagedHookMarker(source);\n const marker = `// omd:installed-hook sha256=${sha256(raw)}`;\n const shebangEnd = raw.startsWith('#!') ? raw.indexOf('\\n') : -1;\n return shebangEnd >= 0\n ? `${raw.slice(0, shebangEnd + 1)}${marker}\\n${raw.slice(shebangEnd + 1)}`\n : `${marker}\\n${raw}`;\n}\n\nexport function isCurrentManagedHook(content: string, source: string): boolean {\n return content === renderManagedHook(source);\n}\n\nexport function isSelfConsistentManagedHook(content: string): boolean {\n const declared = MARKER_RE.exec(content)?.[1];\n return Boolean(declared && declared === sha256(stripManagedHookMarker(content)));\n}\n\nexport function isKnownLegacyHook(\n path: (typeof CLAUDE_HOOK_PATHS)[number],\n content: string,\n): boolean {\n return !MARKER_RE.test(content) && LEGACY_HOOK_HASHES[path].includes(sha256(content));\n}\n","import { existsSync, lstatSync } from 'node:fs';\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path';\n\n/**\n * Managed installer writes must never traverse a symlink below the user-selected\n * install root. Besides protecting project files, this prevents a repository\n * from redirecting `--force` or `--repair-hooks` writes outside its boundary.\n * The install root itself may be a symlink because users commonly open projects\n * through a symlinked workspace path.\n */\nexport function unsafeManagedPath(\n installRoot: string,\n destination: string,\n): string | null {\n const root = resolve(installRoot);\n const target = resolve(destination);\n const rel = relative(root, target);\n if (rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n return 'destination escapes the selected install root';\n }\n\n let current = root;\n for (const segment of rel.split(sep).filter(Boolean)) {\n current = join(current, segment);\n if (existsSync(current) && lstatSync(current).isSymbolicLink()) {\n return `symlinked managed path: ${relative(root, current)}`;\n }\n }\n return null;\n}\n"],"mappings":";;;AAAA,SAAS,kBAAkB;AAEpB,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,YAAY;AAElB,IAAM,qBAAoF;AAAA,EACxF,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,4BAA4B;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,8BAA8B;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAAA,EACA,8BAA8B;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,OAAO,SAAyB;AACvC,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;AAEO,SAAS,uBAAuB,SAAyB;AAC9D,SAAO,QAAQ,QAAQ,sDAAsD,EAAE;AACjF;AAEO,SAAS,kBAAkB,QAAwB;AACxD,QAAM,MAAM,uBAAuB,MAAM;AACzC,QAAM,SAAS,gCAAgC,OAAO,GAAG,CAAC;AAC1D,QAAM,aAAa,IAAI,WAAW,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;AAC9D,SAAO,cAAc,IACjB,GAAG,IAAI,MAAM,GAAG,aAAa,CAAC,CAAC,GAAG,MAAM;AAAA,EAAK,IAAI,MAAM,aAAa,CAAC,CAAC,KACtE,GAAG,MAAM;AAAA,EAAK,GAAG;AACvB;AAEO,SAAS,qBAAqB,SAAiB,QAAyB;AAC7E,SAAO,YAAY,kBAAkB,MAAM;AAC7C;AAEO,SAAS,4BAA4B,SAA0B;AACpE,QAAM,WAAW,UAAU,KAAK,OAAO,IAAI,CAAC;AAC5C,SAAO,QAAQ,YAAY,aAAa,OAAO,uBAAuB,OAAO,CAAC,CAAC;AACjF;AAEO,SAAS,kBACd,MACA,SACS;AACT,SAAO,CAAC,UAAU,KAAK,OAAO,KAAK,mBAAmB,IAAI,EAAE,SAAS,OAAO,OAAO,CAAC;AACtF;;;AC7EA,SAAS,YAAY,iBAAiB;AACtC,SAAS,YAAY,MAAM,UAAU,SAAS,WAAW;AASlD,SAAS,kBACd,aACA,aACe;AACf,QAAM,OAAO,QAAQ,WAAW;AAChC,QAAM,SAAS,QAAQ,WAAW;AAClC,QAAM,MAAM,SAAS,MAAM,MAAM;AACjC,MAAI,QAAQ,QAAQ,IAAI,WAAW,KAAK,GAAG,EAAE,KAAK,WAAW,GAAG,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACd,aAAW,WAAW,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,GAAG;AACpD,cAAU,KAAK,SAAS,OAAO;AAC/B,QAAI,WAAW,OAAO,KAAK,UAAU,OAAO,EAAE,eAAe,GAAG;AAC9D,aAAO,2BAA2B,SAAS,MAAM,OAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|