ux-toolkit 0.4.1 → 0.5.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/dist/index.js CHANGED
@@ -1,14 +1,48 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
1
8
  // src/installer.ts
2
- import { existsSync, mkdirSync, cpSync, readdirSync } from "fs";
9
+ import { existsSync as existsSync2, mkdirSync, cpSync, readdirSync, rmSync, statSync } from "fs";
3
10
  import { join as join2, dirname as dirname2 } from "path";
4
11
 
5
12
  // src/paths.ts
6
- import { homedir } from "os";
7
- import { join, dirname } from "path";
13
+ import { homedir, platform } from "os";
14
+ import { join, dirname, resolve } from "path";
8
15
  import { fileURLToPath } from "url";
9
- var __dirname = dirname(fileURLToPath(import.meta.url));
16
+ import { existsSync } from "fs";
17
+ function getCurrentDirname() {
18
+ try {
19
+ if (import.meta?.url) {
20
+ return dirname(fileURLToPath(import.meta.url));
21
+ }
22
+ } catch {
23
+ }
24
+ try {
25
+ const packageJsonPath = __require.resolve("ux-toolkit/package.json");
26
+ return join(dirname(packageJsonPath), "dist");
27
+ } catch {
28
+ }
29
+ const cwd = process.cwd();
30
+ try {
31
+ const fs = __require("fs");
32
+ const pkgPath = resolve(cwd, "package.json");
33
+ if (fs.existsSync(pkgPath)) {
34
+ const pkg = __require(pkgPath);
35
+ if (pkg.name === "ux-toolkit") {
36
+ return resolve(cwd, "dist");
37
+ }
38
+ }
39
+ } catch {
40
+ }
41
+ return resolve(cwd, "dist");
42
+ }
43
+ var currentDirname = getCurrentDirname();
10
44
  function getPackageRoot() {
11
- return join(__dirname, "..");
45
+ return join(currentDirname, "..");
12
46
  }
13
47
  function getSkillPath(skillName) {
14
48
  return join(getPackageRoot(), "skills", skillName, "SKILL.md");
@@ -20,13 +54,57 @@ function getCommandPath(commandName) {
20
54
  return join(getPackageRoot(), "commands", `${commandName}.md`);
21
55
  }
22
56
  function getGlobalConfigDir() {
23
- return join(homedir(), ".config", "opencode");
57
+ if (process.env.UX_TOOLKIT_CONFIG_DIR) {
58
+ return resolve(process.env.UX_TOOLKIT_CONFIG_DIR);
59
+ }
60
+ if (process.env.OPENCODE_CONFIG_DIR) {
61
+ return resolve(process.env.OPENCODE_CONFIG_DIR);
62
+ }
63
+ const home = homedir();
64
+ const currentPlatform = platform();
65
+ if (currentPlatform === "linux" && process.env.XDG_CONFIG_HOME) {
66
+ return join(process.env.XDG_CONFIG_HOME, "opencode");
67
+ }
68
+ return join(home, ".config", "opencode");
69
+ }
70
+ function isOpenCodeInstalled() {
71
+ return existsSync(getGlobalConfigDir());
72
+ }
73
+ function getClaudeConfigDir() {
74
+ if (process.env.CLAUDE_CONFIG_DIR) {
75
+ return resolve(process.env.CLAUDE_CONFIG_DIR);
76
+ }
77
+ return join(homedir(), ".claude");
24
78
  }
25
- function getProjectConfigDir(projectRoot = process.cwd()) {
26
- return join(projectRoot, ".opencode");
79
+ function isClaudeInstalled() {
80
+ return existsSync(getClaudeConfigDir());
27
81
  }
28
- function getDestinationPaths(global, projectRoot) {
29
- const baseDir = global ? getGlobalConfigDir() : getProjectConfigDir(projectRoot);
82
+ function getPlatformInfo() {
83
+ const opencodeDir = getGlobalConfigDir();
84
+ const claudeDir = getClaudeConfigDir();
85
+ return {
86
+ platform: platform(),
87
+ opencode: {
88
+ configDir: opencodeDir,
89
+ exists: existsSync(opencodeDir)
90
+ },
91
+ claude: {
92
+ configDir: claudeDir,
93
+ exists: existsSync(claudeDir)
94
+ }
95
+ };
96
+ }
97
+ function getProjectConfigDir(projectRoot = process.cwd(), target = "opencode") {
98
+ const dirName = target === "claude" ? ".claude" : ".opencode";
99
+ return join(projectRoot, dirName);
100
+ }
101
+ function getDestinationPaths(global, projectRoot, target = "opencode") {
102
+ let baseDir;
103
+ if (global) {
104
+ baseDir = target === "claude" ? getClaudeConfigDir() : getGlobalConfigDir();
105
+ } else {
106
+ baseDir = getProjectConfigDir(projectRoot, target);
107
+ }
30
108
  return {
31
109
  skills: join(baseDir, "skills"),
32
110
  agents: join(baseDir, "agents"),
@@ -34,97 +112,6 @@ function getDestinationPaths(global, projectRoot) {
34
112
  };
35
113
  }
36
114
 
37
- // src/installer.ts
38
- async function install(options = {}) {
39
- const {
40
- global: isGlobal = false,
41
- projectRoot = process.cwd(),
42
- categories = ["skills", "agents", "commands"],
43
- force = false,
44
- verbose = false
45
- } = options;
46
- const result = {
47
- installed: [],
48
- skipped: [],
49
- errors: []
50
- };
51
- const packageRoot = getPackageRoot();
52
- const destinations = getDestinationPaths(isGlobal, projectRoot);
53
- const log = (msg) => {
54
- if (verbose) console.log(msg);
55
- };
56
- if (categories.includes("skills")) {
57
- const skillsDir = join2(packageRoot, "skills");
58
- if (existsSync(skillsDir)) {
59
- const skills = readdirSync(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
60
- for (const skill of skills) {
61
- const src = join2(skillsDir, skill);
62
- const dest = join2(destinations.skills, skill);
63
- try {
64
- if (existsSync(dest) && !force) {
65
- result.skipped.push(`skill:${skill}`);
66
- log(`Skipped skill/${skill} (already exists)`);
67
- continue;
68
- }
69
- mkdirSync(dirname2(dest), { recursive: true });
70
- cpSync(src, dest, { recursive: true });
71
- result.installed.push(`skill:${skill}`);
72
- log(`Installed skill/${skill}`);
73
- } catch (err) {
74
- result.errors.push(`skill:${skill}: ${err}`);
75
- }
76
- }
77
- }
78
- }
79
- if (categories.includes("agents")) {
80
- const agentsDir = join2(packageRoot, "agents");
81
- if (existsSync(agentsDir)) {
82
- const agents = readdirSync(agentsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
83
- for (const agent of agents) {
84
- const src = join2(agentsDir, `${agent}.md`);
85
- const dest = join2(destinations.agents, `${agent}.md`);
86
- try {
87
- if (existsSync(dest) && !force) {
88
- result.skipped.push(`agent:${agent}`);
89
- log(`Skipped agents/${agent}.md (already exists)`);
90
- continue;
91
- }
92
- mkdirSync(dirname2(dest), { recursive: true });
93
- cpSync(src, dest);
94
- result.installed.push(`agent:${agent}`);
95
- log(`Installed agents/${agent}.md`);
96
- } catch (err) {
97
- result.errors.push(`agent:${agent}: ${err}`);
98
- }
99
- }
100
- }
101
- }
102
- if (categories.includes("commands")) {
103
- const commandsDir = join2(packageRoot, "commands");
104
- if (existsSync(commandsDir)) {
105
- const commands = readdirSync(commandsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
106
- for (const command of commands) {
107
- const src = join2(commandsDir, `${command}.md`);
108
- const dest = join2(destinations.commands, `${command}.md`);
109
- try {
110
- if (existsSync(dest) && !force) {
111
- result.skipped.push(`command:${command}`);
112
- log(`Skipped commands/${command}.md (already exists)`);
113
- continue;
114
- }
115
- mkdirSync(dirname2(dest), { recursive: true });
116
- cpSync(src, dest);
117
- result.installed.push(`command:${command}`);
118
- log(`Installed commands/${command}.md`);
119
- } catch (err) {
120
- result.errors.push(`command:${command}: ${err}`);
121
- }
122
- }
123
- }
124
- }
125
- return result;
126
- }
127
-
128
115
  // src/manifest.ts
129
116
  var SKILLS = [
130
117
  // Core UX Skills
@@ -375,13 +362,266 @@ var COMMANDS = [
375
362
  description: "Visual review from screenshot"
376
363
  }
377
364
  ];
365
+
366
+ // src/installer.ts
367
+ async function install(options = {}) {
368
+ const {
369
+ global: isGlobal = false,
370
+ projectRoot = process.cwd(),
371
+ target = "opencode",
372
+ categories = ["skills", "agents", "commands"],
373
+ skills: specificSkills,
374
+ agents: specificAgents,
375
+ commands: specificCommands,
376
+ force = false,
377
+ verbose = false
378
+ } = options;
379
+ const hasSpecificComponents = specificSkills?.length || specificAgents?.length || specificCommands?.length;
380
+ const effectiveCategories = hasSpecificComponents ? categories.filter((cat) => {
381
+ if (cat === "skills" && specificSkills?.length) return true;
382
+ if (cat === "agents" && specificAgents?.length) return true;
383
+ if (cat === "commands" && specificCommands?.length) return true;
384
+ return false;
385
+ }) : categories;
386
+ const result = {
387
+ installed: [],
388
+ skipped: [],
389
+ errors: []
390
+ };
391
+ const packageRoot = getPackageRoot();
392
+ const destinations = getDestinationPaths(isGlobal, projectRoot, target);
393
+ const log = (msg) => {
394
+ if (verbose) console.log(msg);
395
+ };
396
+ if (effectiveCategories.includes("skills")) {
397
+ const skillsDir = join2(packageRoot, "skills");
398
+ if (existsSync2(skillsDir)) {
399
+ let skills = readdirSync(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
400
+ if (specificSkills?.length) {
401
+ const requested = new Set(specificSkills.map((s) => s.toLowerCase()));
402
+ skills = skills.filter((s) => requested.has(s.toLowerCase()));
403
+ }
404
+ for (const skill of skills) {
405
+ const src = join2(skillsDir, skill);
406
+ const dest = join2(destinations.skills, skill);
407
+ try {
408
+ if (existsSync2(dest) && !force) {
409
+ result.skipped.push(`skill:${skill}`);
410
+ log(`Skipped skill/${skill} (already exists)`);
411
+ continue;
412
+ }
413
+ mkdirSync(dirname2(dest), { recursive: true });
414
+ cpSync(src, dest, { recursive: true });
415
+ result.installed.push(`skill:${skill}`);
416
+ log(`Installed skill/${skill}`);
417
+ } catch (err) {
418
+ result.errors.push(`skill:${skill}: ${err}`);
419
+ }
420
+ }
421
+ }
422
+ }
423
+ if (effectiveCategories.includes("agents")) {
424
+ const agentsDir = join2(packageRoot, "agents");
425
+ if (existsSync2(agentsDir)) {
426
+ let agents = readdirSync(agentsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
427
+ if (specificAgents?.length) {
428
+ const requested = new Set(specificAgents.map((a) => a.toLowerCase()));
429
+ agents = agents.filter((a) => requested.has(a.toLowerCase()));
430
+ }
431
+ for (const agent of agents) {
432
+ const src = join2(agentsDir, `${agent}.md`);
433
+ const dest = join2(destinations.agents, `${agent}.md`);
434
+ try {
435
+ if (existsSync2(dest) && !force) {
436
+ result.skipped.push(`agent:${agent}`);
437
+ log(`Skipped agents/${agent}.md (already exists)`);
438
+ continue;
439
+ }
440
+ mkdirSync(dirname2(dest), { recursive: true });
441
+ cpSync(src, dest);
442
+ result.installed.push(`agent:${agent}`);
443
+ log(`Installed agents/${agent}.md`);
444
+ } catch (err) {
445
+ result.errors.push(`agent:${agent}: ${err}`);
446
+ }
447
+ }
448
+ }
449
+ }
450
+ if (effectiveCategories.includes("commands")) {
451
+ const commandsDir = join2(packageRoot, "commands");
452
+ if (existsSync2(commandsDir)) {
453
+ let commands = readdirSync(commandsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
454
+ if (specificCommands?.length) {
455
+ const requested = new Set(specificCommands.map((c) => c.toLowerCase()));
456
+ commands = commands.filter((c) => requested.has(c.toLowerCase()));
457
+ }
458
+ for (const command of commands) {
459
+ const src = join2(commandsDir, `${command}.md`);
460
+ const dest = join2(destinations.commands, `${command}.md`);
461
+ try {
462
+ if (existsSync2(dest) && !force) {
463
+ result.skipped.push(`command:${command}`);
464
+ log(`Skipped commands/${command}.md (already exists)`);
465
+ continue;
466
+ }
467
+ mkdirSync(dirname2(dest), { recursive: true });
468
+ cpSync(src, dest);
469
+ result.installed.push(`command:${command}`);
470
+ log(`Installed commands/${command}.md`);
471
+ } catch (err) {
472
+ result.errors.push(`command:${command}: ${err}`);
473
+ }
474
+ }
475
+ }
476
+ }
477
+ return result;
478
+ }
479
+ function checkComponentStatus(componentPath, name) {
480
+ const installed = existsSync2(componentPath);
481
+ if (!installed) {
482
+ return { name, installed: false };
483
+ }
484
+ try {
485
+ const stats = statSync(componentPath);
486
+ return {
487
+ name,
488
+ installed: true,
489
+ path: componentPath,
490
+ modifiedAt: stats.mtime
491
+ };
492
+ } catch {
493
+ return { name, installed: true, path: componentPath };
494
+ }
495
+ }
496
+ function getTargetStatus(target, isGlobal, projectRoot) {
497
+ const available = target === "opencode" ? isOpenCodeInstalled() : isClaudeInstalled();
498
+ const destinations = getDestinationPaths(isGlobal, projectRoot, target);
499
+ const skillStatuses = SKILLS.map(
500
+ (s) => checkComponentStatus(join2(destinations.skills, s.name), s.name)
501
+ );
502
+ const agentStatuses = AGENTS.map(
503
+ (a) => checkComponentStatus(join2(destinations.agents, `${a.name}.md`), a.name)
504
+ );
505
+ const commandStatuses = COMMANDS.map(
506
+ (c) => checkComponentStatus(join2(destinations.commands, `${c.name}.md`), c.name)
507
+ );
508
+ return {
509
+ target,
510
+ available,
511
+ configDir: target === "opencode" ? isGlobal ? destinations.skills.replace(/[/\\]skills$/, "") : destinations.skills.replace(/[/\\]skills$/, "") : isGlobal ? destinations.skills.replace(/[/\\]skills$/, "") : destinations.skills.replace(/[/\\]skills$/, ""),
512
+ skills: {
513
+ installed: skillStatuses.filter((s) => s.installed).length,
514
+ total: SKILLS.length,
515
+ components: skillStatuses
516
+ },
517
+ agents: {
518
+ installed: agentStatuses.filter((a) => a.installed).length,
519
+ total: AGENTS.length,
520
+ components: agentStatuses
521
+ },
522
+ commands: {
523
+ installed: commandStatuses.filter((c) => c.installed).length,
524
+ total: COMMANDS.length,
525
+ components: commandStatuses
526
+ }
527
+ };
528
+ }
529
+ async function getStatus(options = {}) {
530
+ const { global: isGlobal = true, projectRoot = process.cwd() } = options;
531
+ return {
532
+ opencode: getTargetStatus("opencode", isGlobal, projectRoot),
533
+ claude: getTargetStatus("claude", isGlobal, projectRoot)
534
+ };
535
+ }
536
+ async function uninstall(options = {}) {
537
+ const {
538
+ global: isGlobal = false,
539
+ projectRoot = process.cwd(),
540
+ target = "opencode",
541
+ categories = ["skills", "agents", "commands"],
542
+ verbose = false
543
+ } = options;
544
+ const result = {
545
+ removed: [],
546
+ notFound: [],
547
+ errors: []
548
+ };
549
+ const destinations = getDestinationPaths(isGlobal, projectRoot, target);
550
+ const log = (msg) => {
551
+ if (verbose) console.log(msg);
552
+ };
553
+ const ourSkills = SKILLS.map((s) => s.name);
554
+ const ourAgents = AGENTS.map((a) => a.name);
555
+ const ourCommands = COMMANDS.map((c) => c.name);
556
+ if (categories.includes("skills")) {
557
+ for (const skill of ourSkills) {
558
+ const dest = join2(destinations.skills, skill);
559
+ try {
560
+ if (!existsSync2(dest)) {
561
+ result.notFound.push(`skill:${skill}`);
562
+ log(`Not found: skill/${skill}`);
563
+ continue;
564
+ }
565
+ rmSync(dest, { recursive: true, force: true });
566
+ result.removed.push(`skill:${skill}`);
567
+ log(`Removed skill/${skill}`);
568
+ } catch (err) {
569
+ result.errors.push(`skill:${skill}: ${err}`);
570
+ }
571
+ }
572
+ }
573
+ if (categories.includes("agents")) {
574
+ for (const agent of ourAgents) {
575
+ const dest = join2(destinations.agents, `${agent}.md`);
576
+ try {
577
+ if (!existsSync2(dest)) {
578
+ result.notFound.push(`agent:${agent}`);
579
+ log(`Not found: agents/${agent}.md`);
580
+ continue;
581
+ }
582
+ rmSync(dest, { force: true });
583
+ result.removed.push(`agent:${agent}`);
584
+ log(`Removed agents/${agent}.md`);
585
+ } catch (err) {
586
+ result.errors.push(`agent:${agent}: ${err}`);
587
+ }
588
+ }
589
+ }
590
+ if (categories.includes("commands")) {
591
+ for (const command of ourCommands) {
592
+ const dest = join2(destinations.commands, `${command}.md`);
593
+ try {
594
+ if (!existsSync2(dest)) {
595
+ result.notFound.push(`command:${command}`);
596
+ log(`Not found: commands/${command}.md`);
597
+ continue;
598
+ }
599
+ rmSync(dest, { force: true });
600
+ result.removed.push(`command:${command}`);
601
+ log(`Removed commands/${command}.md`);
602
+ } catch (err) {
603
+ result.errors.push(`command:${command}: ${err}`);
604
+ }
605
+ }
606
+ }
607
+ return result;
608
+ }
378
609
  export {
379
610
  AGENTS,
380
611
  COMMANDS,
381
612
  SKILLS,
382
613
  getAgentPath,
614
+ getClaudeConfigDir,
383
615
  getCommandPath,
616
+ getDestinationPaths,
617
+ getGlobalConfigDir,
618
+ getPlatformInfo,
619
+ getProjectConfigDir,
384
620
  getSkillPath,
385
- install
621
+ getStatus,
622
+ install,
623
+ isClaudeInstalled,
624
+ isOpenCodeInstalled,
625
+ uninstall
386
626
  };
387
627
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/installer.ts","../src/paths.ts","../src/manifest.ts"],"sourcesContent":["import { existsSync, mkdirSync, cpSync, readdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { getPackageRoot, getDestinationPaths } from './paths.js';\n\nexport interface InstallOptions {\n /** Install globally to ~/.config/opencode */\n global?: boolean;\n /** Project root for local installation */\n projectRoot?: string;\n /** Only install specific categories */\n categories?: ('skills' | 'agents' | 'commands')[];\n /** Overwrite existing files */\n force?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface InstallResult {\n installed: string[];\n skipped: string[];\n errors: string[];\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const {\n global: isGlobal = false,\n projectRoot = process.cwd(),\n categories = ['skills', 'agents', 'commands'],\n force = false,\n verbose = false,\n } = options;\n\n const result: InstallResult = {\n installed: [],\n skipped: [],\n errors: [],\n };\n\n const packageRoot = getPackageRoot();\n const destinations = getDestinationPaths(isGlobal, projectRoot);\n\n const log = (msg: string) => {\n if (verbose) console.log(msg);\n };\n\n if (categories.includes('skills')) {\n const skillsDir = join(packageRoot, 'skills');\n if (existsSync(skillsDir)) {\n const skills = readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n\n for (const skill of skills) {\n const src = join(skillsDir, skill);\n const dest = join(destinations.skills, skill);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`skill:${skill}`);\n log(`Skipped skill/${skill} (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest, { recursive: true });\n result.installed.push(`skill:${skill}`);\n log(`Installed skill/${skill}`);\n } catch (err) {\n result.errors.push(`skill:${skill}: ${err}`);\n }\n }\n }\n }\n\n if (categories.includes('agents')) {\n const agentsDir = join(packageRoot, 'agents');\n if (existsSync(agentsDir)) {\n const agents = readdirSync(agentsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n\n for (const agent of agents) {\n const src = join(agentsDir, `${agent}.md`);\n const dest = join(destinations.agents, `${agent}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`agent:${agent}`);\n log(`Skipped agents/${agent}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`agent:${agent}`);\n log(`Installed agents/${agent}.md`);\n } catch (err) {\n result.errors.push(`agent:${agent}: ${err}`);\n }\n }\n }\n }\n\n if (categories.includes('commands')) {\n const commandsDir = join(packageRoot, 'commands');\n if (existsSync(commandsDir)) {\n const commands = readdirSync(commandsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n\n for (const command of commands) {\n const src = join(commandsDir, `${command}.md`);\n const dest = join(destinations.commands, `${command}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`command:${command}`);\n log(`Skipped commands/${command}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`command:${command}`);\n log(`Installed commands/${command}.md`);\n } catch (err) {\n result.errors.push(`command:${command}: ${err}`);\n }\n }\n }\n }\n\n return result;\n}\n","import { homedir } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport function getPackageRoot(): string {\n return join(__dirname, '..');\n}\n\nexport function getSkillPath(skillName: string): string {\n return join(getPackageRoot(), 'skills', skillName, 'SKILL.md');\n}\n\nexport function getAgentPath(agentName: string): string {\n return join(getPackageRoot(), 'agents', `${agentName}.md`);\n}\n\nexport function getCommandPath(commandName: string): string {\n return join(getPackageRoot(), 'commands', `${commandName}.md`);\n}\n\nexport function getGlobalConfigDir(): string {\n return join(homedir(), '.config', 'opencode');\n}\n\nexport function getProjectConfigDir(projectRoot: string = process.cwd()): string {\n return join(projectRoot, '.opencode');\n}\n\nexport function getDestinationPaths(global: boolean, projectRoot?: string) {\n const baseDir = global ? getGlobalConfigDir() : getProjectConfigDir(projectRoot);\n\n return {\n skills: join(baseDir, 'skills'),\n agents: join(baseDir, 'agents'),\n commands: join(baseDir, 'commands'),\n };\n}\n","export const SKILLS = [\n // Core UX Skills\n {\n name: 'ux-heuristics',\n description: \"Nielsen's 10 usability heuristics with evaluation methodology\",\n category: 'core',\n },\n {\n name: 'wcag-accessibility',\n description: 'WCAG 2.2 compliance checklist and ARIA patterns',\n category: 'core',\n },\n {\n name: 'visual-design-system',\n description: 'Layout, typography, color theory, spacing systems',\n category: 'core',\n },\n {\n name: 'interaction-patterns',\n description: 'Micro-interactions, loading states, feedback mechanisms',\n category: 'core',\n },\n {\n name: 'mobile-responsive-ux',\n description: 'Touch targets, gestures, responsive patterns',\n category: 'core',\n },\n\n // Page Structure Skills\n {\n name: 'page-structure-patterns',\n description: 'Base requirements for page states, layout, and structure',\n category: 'structure',\n },\n {\n name: 'list-page-patterns',\n description: 'Filters, sorting, pagination, and grid/table displays',\n category: 'structure',\n },\n {\n name: 'detail-page-patterns',\n description: 'Headers, tabs, multi-column layouts, related data',\n category: 'structure',\n },\n {\n name: 'navigation-patterns',\n description: 'Sidebar, mobile drawer, breadcrumbs, app shell',\n category: 'structure',\n },\n\n // Component Skills\n {\n name: 'modal-patterns',\n description: 'Confirmation, edit, selector, and wizard modals',\n category: 'component',\n },\n {\n name: 'form-patterns',\n description: 'Validation, field layouts, multi-step wizards',\n category: 'component',\n },\n {\n name: 'data-density-patterns',\n description: 'Dense layouts, z-index, overflow, readability',\n category: 'component',\n },\n {\n name: 'toast-notification-patterns',\n description: 'Toast notifications, alerts, and system feedback',\n category: 'component',\n },\n\n // Interaction Skills\n {\n name: 'keyboard-shortcuts-patterns',\n description: 'Keyboard shortcuts, command palette (Cmd+K), power user navigation',\n category: 'interaction',\n },\n {\n name: 'drag-drop-patterns',\n description: 'Drag and drop interactions, visual feedback, drop zones',\n category: 'interaction',\n },\n\n // Editor/Workspace Skills\n {\n name: 'editor-workspace-patterns',\n description: 'Multi-tab editors, dirty state, real-time validation, workspaces',\n category: 'editor',\n },\n {\n name: 'comparison-patterns',\n description: 'Side-by-side comparison, diff highlighting, multi-item comparison',\n category: 'editor',\n },\n {\n name: 'split-panel-patterns',\n description: 'Resizable panels, dividers, collapsible sidebars, synchronized views',\n category: 'editor',\n },\n\n // Game/Interactive Skills\n {\n name: 'canvas-grid-patterns',\n description: 'Hex grids, tactical maps, pan/zoom, tokens, coordinate systems',\n category: 'game',\n },\n {\n name: 'turn-based-ui-patterns',\n description: 'Phase banners, turn indicators, action bars, game state feedback',\n category: 'game',\n },\n {\n name: 'playback-replay-patterns',\n description: 'VCR controls, timeline scrubbing, speed selection, replay viewers',\n category: 'game',\n },\n {\n name: 'status-visualization-patterns',\n description: 'Health bars, progress meters, heat gauges, pip displays, stat blocks',\n category: 'game',\n },\n\n // Data Display Skills\n {\n name: 'info-card-patterns',\n description: 'Compact/standard/expanded cards, stat blocks, badges, entity displays',\n category: 'data',\n },\n {\n name: 'event-timeline-patterns',\n description: 'Activity feeds, audit logs, chronological events, filtering, infinite scroll',\n category: 'data',\n },\n\n // Framework Skills\n {\n name: 'react-ux-patterns',\n description: 'React/Next.js specific UX patterns',\n category: 'framework',\n },\n] as const;\n\nexport const AGENTS = [\n // General Purpose Agents\n {\n name: 'ux-auditor',\n description: 'Full UX audit against heuristics (read-only)',\n mode: 'analysis',\n },\n {\n name: 'ux-engineer',\n description: 'UX analysis + implements fixes',\n mode: 'fix',\n },\n {\n name: 'accessibility-auditor',\n description: 'WCAG 2.2 compliance review (read-only)',\n mode: 'analysis',\n },\n {\n name: 'accessibility-engineer',\n description: 'Accessibility fixes',\n mode: 'fix',\n },\n {\n name: 'visual-reviewer',\n description: 'Design system consistency check',\n mode: 'analysis',\n },\n {\n name: 'interaction-reviewer',\n description: 'Micro-interactions and feedback review',\n mode: 'analysis',\n },\n\n // Specialized Page Reviewers\n {\n name: 'list-page-reviewer',\n description: 'List/browse page UX review',\n mode: 'analysis',\n },\n {\n name: 'detail-page-reviewer',\n description: 'Detail/entity page UX review',\n mode: 'analysis',\n },\n {\n name: 'navigation-reviewer',\n description: 'Navigation and routing review',\n mode: 'analysis',\n },\n {\n name: 'form-reviewer',\n description: 'Form and input UX review',\n mode: 'analysis',\n },\n {\n name: 'density-reviewer',\n description: 'Data density and layout review',\n mode: 'analysis',\n },\n\n // Advanced Specialized Reviewers\n {\n name: 'editor-reviewer',\n description: 'Editor/workspace UI with multi-tab, drag-drop, validation',\n mode: 'analysis',\n },\n {\n name: 'comparison-reviewer',\n description: 'Side-by-side comparison and diff UIs',\n mode: 'analysis',\n },\n {\n name: 'settings-reviewer',\n description: 'Settings, preferences, and configuration pages',\n mode: 'analysis',\n },\n\n // Game & Interactive Reviewers\n {\n name: 'game-ui-reviewer',\n description: 'Tactical maps, turn-based combat, status displays, hex grids',\n mode: 'analysis',\n },\n {\n name: 'replay-reviewer',\n description: 'Playback controls, timeline scrubbing, event feeds',\n mode: 'analysis',\n },\n {\n name: 'card-reviewer',\n description: 'Info cards, stat blocks, entity displays with density levels',\n mode: 'analysis',\n },\n {\n name: 'panel-reviewer',\n description: 'Resizable panels, collapsible sidebars, split views',\n mode: 'analysis',\n },\n] as const;\n\nexport const COMMANDS = [\n {\n name: 'ux-audit',\n description: 'Comprehensive UX audit',\n },\n {\n name: 'a11y-check',\n description: 'Quick accessibility scan',\n },\n {\n name: 'design-review',\n description: 'Visual consistency check',\n },\n {\n name: 'screenshot-review',\n description: 'Visual review from screenshot',\n },\n] as const;\n\nexport type SkillName = (typeof SKILLS)[number]['name'];\nexport type AgentName = (typeof AGENTS)[number]['name'];\nexport type CommandName = (typeof COMMANDS)[number]['name'];\n"],"mappings":"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","names":["join","dirname","join","dirname"]}
1
+ {"version":3,"sources":["../src/installer.ts","../src/paths.ts","../src/manifest.ts"],"sourcesContent":["import { existsSync, mkdirSync, cpSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { getPackageRoot, getDestinationPaths, isOpenCodeInstalled, isClaudeInstalled, type InstallTarget } from './paths.js';\nimport { SKILLS, AGENTS, COMMANDS } from './manifest.js';\n\nexport interface InstallOptions {\n /** Install globally to config directory */\n global?: boolean;\n /** Project root for local installation */\n projectRoot?: string;\n /** Target platform: 'opencode' or 'claude' */\n target?: InstallTarget;\n /** Only install specific categories */\n categories?: ('skills' | 'agents' | 'commands')[];\n /** Specific skills to install (by name) */\n skills?: string[];\n /** Specific agents to install (by name) */\n agents?: string[];\n /** Specific commands to install (by name) */\n commands?: string[];\n /** Overwrite existing files */\n force?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface InstallResult {\n installed: string[];\n skipped: string[];\n errors: string[];\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const {\n global: isGlobal = false,\n projectRoot = process.cwd(),\n target = 'opencode',\n categories = ['skills', 'agents', 'commands'],\n skills: specificSkills,\n agents: specificAgents,\n commands: specificCommands,\n force = false,\n verbose = false,\n } = options;\n \n // If specific components are requested, filter to only those categories\n const hasSpecificComponents = specificSkills?.length || specificAgents?.length || specificCommands?.length;\n const effectiveCategories = hasSpecificComponents \n ? categories.filter(cat => {\n if (cat === 'skills' && specificSkills?.length) return true;\n if (cat === 'agents' && specificAgents?.length) return true;\n if (cat === 'commands' && specificCommands?.length) return true;\n return false;\n })\n : categories;\n\n const result: InstallResult = {\n installed: [],\n skipped: [],\n errors: [],\n };\n\n const packageRoot = getPackageRoot();\n const destinations = getDestinationPaths(isGlobal, projectRoot, target);\n\n const log = (msg: string) => {\n if (verbose) console.log(msg);\n };\n\n if (effectiveCategories.includes('skills')) {\n const skillsDir = join(packageRoot, 'skills');\n if (existsSync(skillsDir)) {\n let skills = readdirSync(skillsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n \n // Filter to specific skills if requested\n if (specificSkills?.length) {\n const requested = new Set(specificSkills.map(s => s.toLowerCase()));\n skills = skills.filter(s => requested.has(s.toLowerCase()));\n }\n\n for (const skill of skills) {\n const src = join(skillsDir, skill);\n const dest = join(destinations.skills, skill);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`skill:${skill}`);\n log(`Skipped skill/${skill} (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest, { recursive: true });\n result.installed.push(`skill:${skill}`);\n log(`Installed skill/${skill}`);\n } catch (err) {\n result.errors.push(`skill:${skill}: ${err}`);\n }\n }\n }\n }\n\n if (effectiveCategories.includes('agents')) {\n const agentsDir = join(packageRoot, 'agents');\n if (existsSync(agentsDir)) {\n let agents = readdirSync(agentsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n \n // Filter to specific agents if requested\n if (specificAgents?.length) {\n const requested = new Set(specificAgents.map(a => a.toLowerCase()));\n agents = agents.filter(a => requested.has(a.toLowerCase()));\n }\n\n for (const agent of agents) {\n const src = join(agentsDir, `${agent}.md`);\n const dest = join(destinations.agents, `${agent}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`agent:${agent}`);\n log(`Skipped agents/${agent}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`agent:${agent}`);\n log(`Installed agents/${agent}.md`);\n } catch (err) {\n result.errors.push(`agent:${agent}: ${err}`);\n }\n }\n }\n }\n\n if (effectiveCategories.includes('commands')) {\n const commandsDir = join(packageRoot, 'commands');\n if (existsSync(commandsDir)) {\n let commands = readdirSync(commandsDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.replace('.md', ''));\n \n // Filter to specific commands if requested\n if (specificCommands?.length) {\n const requested = new Set(specificCommands.map(c => c.toLowerCase()));\n commands = commands.filter(c => requested.has(c.toLowerCase()));\n }\n\n for (const command of commands) {\n const src = join(commandsDir, `${command}.md`);\n const dest = join(destinations.commands, `${command}.md`);\n\n try {\n if (existsSync(dest) && !force) {\n result.skipped.push(`command:${command}`);\n log(`Skipped commands/${command}.md (already exists)`);\n continue;\n }\n\n mkdirSync(dirname(dest), { recursive: true });\n cpSync(src, dest);\n result.installed.push(`command:${command}`);\n log(`Installed commands/${command}.md`);\n } catch (err) {\n result.errors.push(`command:${command}: ${err}`);\n }\n }\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Status checking\n// ============================================================================\n\nexport interface ComponentStatus {\n name: string;\n installed: boolean;\n path?: string;\n modifiedAt?: Date;\n}\n\nexport interface CategoryStatus {\n installed: number;\n total: number;\n components: ComponentStatus[];\n}\n\nexport interface TargetStatus {\n target: InstallTarget;\n available: boolean;\n configDir: string;\n skills: CategoryStatus;\n agents: CategoryStatus;\n commands: CategoryStatus;\n}\n\nexport interface StatusOptions {\n /** Check global installation */\n global?: boolean;\n /** Project root for local check */\n projectRoot?: string;\n}\n\nexport interface StatusResult {\n opencode: TargetStatus;\n claude: TargetStatus;\n}\n\nfunction checkComponentStatus(\n componentPath: string,\n name: string\n): ComponentStatus {\n const installed = existsSync(componentPath);\n if (!installed) {\n return { name, installed: false };\n }\n \n try {\n const stats = statSync(componentPath);\n return {\n name,\n installed: true,\n path: componentPath,\n modifiedAt: stats.mtime,\n };\n } catch {\n return { name, installed: true, path: componentPath };\n }\n}\n\nfunction getTargetStatus(\n target: InstallTarget,\n isGlobal: boolean,\n projectRoot?: string\n): TargetStatus {\n const available = target === 'opencode' ? isOpenCodeInstalled() : isClaudeInstalled();\n const destinations = getDestinationPaths(isGlobal, projectRoot, target);\n \n // Check skills\n const skillStatuses = SKILLS.map((s) => \n checkComponentStatus(join(destinations.skills, s.name), s.name)\n );\n \n // Check agents\n const agentStatuses = AGENTS.map((a) =>\n checkComponentStatus(join(destinations.agents, `${a.name}.md`), a.name)\n );\n \n // Check commands\n const commandStatuses = COMMANDS.map((c) =>\n checkComponentStatus(join(destinations.commands, `${c.name}.md`), c.name)\n );\n \n return {\n target,\n available,\n configDir: target === 'opencode' \n ? (isGlobal ? destinations.skills.replace(/[/\\\\]skills$/, '') : destinations.skills.replace(/[/\\\\]skills$/, ''))\n : (isGlobal ? destinations.skills.replace(/[/\\\\]skills$/, '') : destinations.skills.replace(/[/\\\\]skills$/, '')),\n skills: {\n installed: skillStatuses.filter((s) => s.installed).length,\n total: SKILLS.length,\n components: skillStatuses,\n },\n agents: {\n installed: agentStatuses.filter((a) => a.installed).length,\n total: AGENTS.length,\n components: agentStatuses,\n },\n commands: {\n installed: commandStatuses.filter((c) => c.installed).length,\n total: COMMANDS.length,\n components: commandStatuses,\n },\n };\n}\n\nexport async function getStatus(options: StatusOptions = {}): Promise<StatusResult> {\n const { global: isGlobal = true, projectRoot = process.cwd() } = options;\n \n return {\n opencode: getTargetStatus('opencode', isGlobal, projectRoot),\n claude: getTargetStatus('claude', isGlobal, projectRoot),\n };\n}\n\n// ============================================================================\n// Uninstall\n// ============================================================================\n\nexport interface UninstallOptions {\n /** Uninstall from global config directory */\n global?: boolean;\n /** Project root for local uninstallation */\n projectRoot?: string;\n /** Target platform: 'opencode' or 'claude' */\n target?: InstallTarget;\n /** Only uninstall specific categories */\n categories?: ('skills' | 'agents' | 'commands')[];\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface UninstallResult {\n removed: string[];\n notFound: string[];\n errors: string[];\n}\n\nexport async function uninstall(options: UninstallOptions = {}): Promise<UninstallResult> {\n const {\n global: isGlobal = false,\n projectRoot = process.cwd(),\n target = 'opencode',\n categories = ['skills', 'agents', 'commands'],\n verbose = false,\n } = options;\n\n const result: UninstallResult = {\n removed: [],\n notFound: [],\n errors: [],\n };\n\n const destinations = getDestinationPaths(isGlobal, projectRoot, target);\n\n const log = (msg: string) => {\n if (verbose) console.log(msg);\n };\n\n // Get list of our components from manifest\n const ourSkills = SKILLS.map((s) => s.name);\n const ourAgents = AGENTS.map((a) => a.name);\n const ourCommands = COMMANDS.map((c) => c.name);\n\n if (categories.includes('skills')) {\n for (const skill of ourSkills) {\n const dest = join(destinations.skills, skill);\n\n try {\n if (!existsSync(dest)) {\n result.notFound.push(`skill:${skill}`);\n log(`Not found: skill/${skill}`);\n continue;\n }\n\n rmSync(dest, { recursive: true, force: true });\n result.removed.push(`skill:${skill}`);\n log(`Removed skill/${skill}`);\n } catch (err) {\n result.errors.push(`skill:${skill}: ${err}`);\n }\n }\n }\n\n if (categories.includes('agents')) {\n for (const agent of ourAgents) {\n const dest = join(destinations.agents, `${agent}.md`);\n\n try {\n if (!existsSync(dest)) {\n result.notFound.push(`agent:${agent}`);\n log(`Not found: agents/${agent}.md`);\n continue;\n }\n\n rmSync(dest, { force: true });\n result.removed.push(`agent:${agent}`);\n log(`Removed agents/${agent}.md`);\n } catch (err) {\n result.errors.push(`agent:${agent}: ${err}`);\n }\n }\n }\n\n if (categories.includes('commands')) {\n for (const command of ourCommands) {\n const dest = join(destinations.commands, `${command}.md`);\n\n try {\n if (!existsSync(dest)) {\n result.notFound.push(`command:${command}`);\n log(`Not found: commands/${command}.md`);\n continue;\n }\n\n rmSync(dest, { force: true });\n result.removed.push(`command:${command}`);\n log(`Removed commands/${command}.md`);\n } catch (err) {\n result.errors.push(`command:${command}: ${err}`);\n }\n }\n }\n\n return result;\n}\n","import { homedir, platform } from 'node:os';\nimport { join, dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { existsSync } from 'node:fs';\n\n// Get the directory of the current module\n// Works in both ESM and CJS contexts\nfunction getCurrentDirname(): string {\n // Try ESM approach first (import.meta.url)\n try {\n if (import.meta?.url) {\n return dirname(fileURLToPath(import.meta.url));\n }\n } catch {\n // ESM approach failed\n }\n \n // CJS approach: resolve the package from node_modules\n // When bundled, we can find the package root by looking up\n // the package.json location using require.resolve\n try {\n // This works because package.json is always at the package root\n const packageJsonPath = require.resolve('ux-toolkit/package.json');\n // Return the dist directory (to match ESM behavior where import.meta.url points to dist/)\n return join(dirname(packageJsonPath), 'dist');\n } catch {\n // Package not found in node_modules\n }\n \n // Fallback: Use process.cwd() and check if we're in the package directory\n // This handles the case when running from the package source directory\n const cwd = process.cwd();\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require('node:fs');\n const pkgPath = resolve(cwd, 'package.json');\n if (fs.existsSync(pkgPath)) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkg = require(pkgPath);\n if (pkg.name === 'ux-toolkit') {\n return resolve(cwd, 'dist');\n }\n }\n } catch {\n // Failed to read package.json\n }\n \n // Last resort: assume we're running from dist folder in cwd\n return resolve(cwd, 'dist');\n}\n\nconst currentDirname = getCurrentDirname();\n\nexport function getPackageRoot(): string {\n return join(currentDirname, '..');\n}\n\nexport function getSkillPath(skillName: string): string {\n return join(getPackageRoot(), 'skills', skillName, 'SKILL.md');\n}\n\nexport function getAgentPath(agentName: string): string {\n return join(getPackageRoot(), 'agents', `${agentName}.md`);\n}\n\nexport function getCommandPath(commandName: string): string {\n return join(getPackageRoot(), 'commands', `${commandName}.md`);\n}\n\n/**\n * Get the global OpenCode config directory.\n * \n * Priority:\n * 1. UX_TOOLKIT_CONFIG_DIR env var (explicit override)\n * 2. OPENCODE_CONFIG_DIR env var (OpenCode convention)\n * 3. Platform-specific defaults:\n * - Linux: $XDG_CONFIG_HOME/opencode or ~/.config/opencode\n * - macOS: ~/.config/opencode\n * - Windows: ~/.config/opencode (matches OpenCode behavior)\n */\nexport function getGlobalConfigDir(): string {\n // Allow explicit override\n if (process.env.UX_TOOLKIT_CONFIG_DIR) {\n return resolve(process.env.UX_TOOLKIT_CONFIG_DIR);\n }\n \n // OpenCode's own config dir override\n if (process.env.OPENCODE_CONFIG_DIR) {\n return resolve(process.env.OPENCODE_CONFIG_DIR);\n }\n \n const home = homedir();\n const currentPlatform = platform();\n \n // Linux: Respect XDG Base Directory spec\n if (currentPlatform === 'linux' && process.env.XDG_CONFIG_HOME) {\n return join(process.env.XDG_CONFIG_HOME, 'opencode');\n }\n \n // All platforms default to ~/.config/opencode (matches OpenCode behavior)\n return join(home, '.config', 'opencode');\n}\n\n/**\n * Check if the OpenCode config directory exists.\n * Useful for pre-flight checks before installation.\n */\nexport function isOpenCodeInstalled(): boolean {\n return existsSync(getGlobalConfigDir());\n}\n\n/**\n * Get the Claude Code config directory.\n * Claude Code always uses ~/.claude/ on all platforms.\n */\nexport function getClaudeConfigDir(): string {\n // Allow explicit override\n if (process.env.CLAUDE_CONFIG_DIR) {\n return resolve(process.env.CLAUDE_CONFIG_DIR);\n }\n \n return join(homedir(), '.claude');\n}\n\n/**\n * Check if Claude Code is installed.\n */\nexport function isClaudeInstalled(): boolean {\n return existsSync(getClaudeConfigDir());\n}\n\n/**\n * Supported installation targets\n */\nexport type InstallTarget = 'opencode' | 'claude';\n\n/**\n * Get platform information for diagnostics\n */\nexport function getPlatformInfo(): { \n platform: string; \n opencode: { configDir: string; exists: boolean };\n claude: { configDir: string; exists: boolean };\n} {\n const opencodeDir = getGlobalConfigDir();\n const claudeDir = getClaudeConfigDir();\n return {\n platform: platform(),\n opencode: {\n configDir: opencodeDir,\n exists: existsSync(opencodeDir),\n },\n claude: {\n configDir: claudeDir,\n exists: existsSync(claudeDir),\n },\n };\n}\n\nexport function getProjectConfigDir(projectRoot: string = process.cwd(), target: InstallTarget = 'opencode'): string {\n // Claude Code doesn't have project-level plugins in the same way\n // but we can support .claude/ directory for consistency\n const dirName = target === 'claude' ? '.claude' : '.opencode';\n return join(projectRoot, dirName);\n}\n\nexport interface DestinationPathsOptions {\n global?: boolean;\n projectRoot?: string;\n target?: InstallTarget;\n}\n\nexport function getDestinationPaths(global: boolean, projectRoot?: string, target: InstallTarget = 'opencode') {\n let baseDir: string;\n \n if (global) {\n baseDir = target === 'claude' ? getClaudeConfigDir() : getGlobalConfigDir();\n } else {\n baseDir = getProjectConfigDir(projectRoot, target);\n }\n\n return {\n skills: join(baseDir, 'skills'),\n agents: join(baseDir, 'agents'),\n commands: join(baseDir, 'commands'),\n };\n}\n","export const SKILLS = [\n // Core UX Skills\n {\n name: 'ux-heuristics',\n description: \"Nielsen's 10 usability heuristics with evaluation methodology\",\n category: 'core',\n },\n {\n name: 'wcag-accessibility',\n description: 'WCAG 2.2 compliance checklist and ARIA patterns',\n category: 'core',\n },\n {\n name: 'visual-design-system',\n description: 'Layout, typography, color theory, spacing systems',\n category: 'core',\n },\n {\n name: 'interaction-patterns',\n description: 'Micro-interactions, loading states, feedback mechanisms',\n category: 'core',\n },\n {\n name: 'mobile-responsive-ux',\n description: 'Touch targets, gestures, responsive patterns',\n category: 'core',\n },\n\n // Page Structure Skills\n {\n name: 'page-structure-patterns',\n description: 'Base requirements for page states, layout, and structure',\n category: 'structure',\n },\n {\n name: 'list-page-patterns',\n description: 'Filters, sorting, pagination, and grid/table displays',\n category: 'structure',\n },\n {\n name: 'detail-page-patterns',\n description: 'Headers, tabs, multi-column layouts, related data',\n category: 'structure',\n },\n {\n name: 'navigation-patterns',\n description: 'Sidebar, mobile drawer, breadcrumbs, app shell',\n category: 'structure',\n },\n\n // Component Skills\n {\n name: 'modal-patterns',\n description: 'Confirmation, edit, selector, and wizard modals',\n category: 'component',\n },\n {\n name: 'form-patterns',\n description: 'Validation, field layouts, multi-step wizards',\n category: 'component',\n },\n {\n name: 'data-density-patterns',\n description: 'Dense layouts, z-index, overflow, readability',\n category: 'component',\n },\n {\n name: 'toast-notification-patterns',\n description: 'Toast notifications, alerts, and system feedback',\n category: 'component',\n },\n\n // Interaction Skills\n {\n name: 'keyboard-shortcuts-patterns',\n description: 'Keyboard shortcuts, command palette (Cmd+K), power user navigation',\n category: 'interaction',\n },\n {\n name: 'drag-drop-patterns',\n description: 'Drag and drop interactions, visual feedback, drop zones',\n category: 'interaction',\n },\n\n // Editor/Workspace Skills\n {\n name: 'editor-workspace-patterns',\n description: 'Multi-tab editors, dirty state, real-time validation, workspaces',\n category: 'editor',\n },\n {\n name: 'comparison-patterns',\n description: 'Side-by-side comparison, diff highlighting, multi-item comparison',\n category: 'editor',\n },\n {\n name: 'split-panel-patterns',\n description: 'Resizable panels, dividers, collapsible sidebars, synchronized views',\n category: 'editor',\n },\n\n // Game/Interactive Skills\n {\n name: 'canvas-grid-patterns',\n description: 'Hex grids, tactical maps, pan/zoom, tokens, coordinate systems',\n category: 'game',\n },\n {\n name: 'turn-based-ui-patterns',\n description: 'Phase banners, turn indicators, action bars, game state feedback',\n category: 'game',\n },\n {\n name: 'playback-replay-patterns',\n description: 'VCR controls, timeline scrubbing, speed selection, replay viewers',\n category: 'game',\n },\n {\n name: 'status-visualization-patterns',\n description: 'Health bars, progress meters, heat gauges, pip displays, stat blocks',\n category: 'game',\n },\n\n // Data Display Skills\n {\n name: 'info-card-patterns',\n description: 'Compact/standard/expanded cards, stat blocks, badges, entity displays',\n category: 'data',\n },\n {\n name: 'event-timeline-patterns',\n description: 'Activity feeds, audit logs, chronological events, filtering, infinite scroll',\n category: 'data',\n },\n\n // Framework Skills\n {\n name: 'react-ux-patterns',\n description: 'React/Next.js specific UX patterns',\n category: 'framework',\n },\n] as const;\n\nexport const AGENTS = [\n // General Purpose Agents\n {\n name: 'ux-auditor',\n description: 'Full UX audit against heuristics (read-only)',\n mode: 'analysis',\n },\n {\n name: 'ux-engineer',\n description: 'UX analysis + implements fixes',\n mode: 'fix',\n },\n {\n name: 'accessibility-auditor',\n description: 'WCAG 2.2 compliance review (read-only)',\n mode: 'analysis',\n },\n {\n name: 'accessibility-engineer',\n description: 'Accessibility fixes',\n mode: 'fix',\n },\n {\n name: 'visual-reviewer',\n description: 'Design system consistency check',\n mode: 'analysis',\n },\n {\n name: 'interaction-reviewer',\n description: 'Micro-interactions and feedback review',\n mode: 'analysis',\n },\n\n // Specialized Page Reviewers\n {\n name: 'list-page-reviewer',\n description: 'List/browse page UX review',\n mode: 'analysis',\n },\n {\n name: 'detail-page-reviewer',\n description: 'Detail/entity page UX review',\n mode: 'analysis',\n },\n {\n name: 'navigation-reviewer',\n description: 'Navigation and routing review',\n mode: 'analysis',\n },\n {\n name: 'form-reviewer',\n description: 'Form and input UX review',\n mode: 'analysis',\n },\n {\n name: 'density-reviewer',\n description: 'Data density and layout review',\n mode: 'analysis',\n },\n\n // Advanced Specialized Reviewers\n {\n name: 'editor-reviewer',\n description: 'Editor/workspace UI with multi-tab, drag-drop, validation',\n mode: 'analysis',\n },\n {\n name: 'comparison-reviewer',\n description: 'Side-by-side comparison and diff UIs',\n mode: 'analysis',\n },\n {\n name: 'settings-reviewer',\n description: 'Settings, preferences, and configuration pages',\n mode: 'analysis',\n },\n\n // Game & Interactive Reviewers\n {\n name: 'game-ui-reviewer',\n description: 'Tactical maps, turn-based combat, status displays, hex grids',\n mode: 'analysis',\n },\n {\n name: 'replay-reviewer',\n description: 'Playback controls, timeline scrubbing, event feeds',\n mode: 'analysis',\n },\n {\n name: 'card-reviewer',\n description: 'Info cards, stat blocks, entity displays with density levels',\n mode: 'analysis',\n },\n {\n name: 'panel-reviewer',\n description: 'Resizable panels, collapsible sidebars, split views',\n mode: 'analysis',\n },\n] as const;\n\nexport const COMMANDS = [\n {\n name: 'ux-audit',\n description: 'Comprehensive UX audit',\n },\n {\n name: 'a11y-check',\n description: 'Quick accessibility scan',\n },\n {\n name: 'design-review',\n description: 'Visual consistency check',\n },\n {\n name: 'screenshot-review',\n description: 'Visual review from screenshot',\n },\n] as const;\n\nexport type SkillName = (typeof SKILLS)[number]['name'];\nexport type AgentName = (typeof AGENTS)[number]['name'];\nexport type CommandName = (typeof COMMANDS)[number]['name'];\n"],"mappings":"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","names":["existsSync","join","dirname","join","existsSync","dirname"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ux-toolkit",
3
- "version": "0.4.1",
4
- "description": "AI-powered UI/UX review toolkit with skills, agents, and commands for OpenCode and other AI coding assistants",
3
+ "version": "0.5.0",
4
+ "description": "AI-powered UI/UX review toolkit with skills, agents, and commands for OpenCode, Claude Code, and other AI coding assistants",
5
5
  "keywords": [
6
6
  "ux",
7
7
  "ui",
@@ -11,6 +11,7 @@
11
11
  "heuristics",
12
12
  "design-system",
13
13
  "opencode",
14
+ "claude-code",
14
15
  "ai-agents",
15
16
  "mcp"
16
17
  ],
@@ -30,6 +31,7 @@
30
31
  "import": "./dist/index.js",
31
32
  "require": "./dist/index.cjs"
32
33
  },
34
+ "./package.json": "./package.json",
33
35
  "./skills/*": "./skills/*",
34
36
  "./agents/*": "./agents/*",
35
37
  "./commands/*": "./commands/*"
@@ -45,6 +47,7 @@
45
47
  "skills",
46
48
  "agents",
47
49
  "commands",
50
+ ".claude-plugin",
48
51
  "README.md"
49
52
  ],
50
53
  "scripts": {