ux-toolkit 0.4.0 → 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/.claude-plugin/marketplace.json +11 -0
- package/.claude-plugin/plugin.json +23 -0
- package/dist/cli.js +739 -116
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +353 -101
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +117 -6
- package/dist/index.d.ts +117 -6
- package/dist/index.js +342 -102
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
|
|
20
30
|
// src/index.ts
|
|
@@ -24,24 +34,60 @@ __export(index_exports, {
|
|
|
24
34
|
COMMANDS: () => COMMANDS,
|
|
25
35
|
SKILLS: () => SKILLS,
|
|
26
36
|
getAgentPath: () => getAgentPath,
|
|
37
|
+
getClaudeConfigDir: () => getClaudeConfigDir,
|
|
27
38
|
getCommandPath: () => getCommandPath,
|
|
39
|
+
getDestinationPaths: () => getDestinationPaths,
|
|
40
|
+
getGlobalConfigDir: () => getGlobalConfigDir,
|
|
41
|
+
getPlatformInfo: () => getPlatformInfo,
|
|
42
|
+
getProjectConfigDir: () => getProjectConfigDir,
|
|
28
43
|
getSkillPath: () => getSkillPath,
|
|
29
|
-
|
|
44
|
+
getStatus: () => getStatus,
|
|
45
|
+
install: () => install,
|
|
46
|
+
isClaudeInstalled: () => isClaudeInstalled,
|
|
47
|
+
isOpenCodeInstalled: () => isOpenCodeInstalled,
|
|
48
|
+
uninstall: () => uninstall
|
|
30
49
|
});
|
|
31
50
|
module.exports = __toCommonJS(index_exports);
|
|
32
51
|
|
|
33
52
|
// src/installer.ts
|
|
34
|
-
var
|
|
53
|
+
var import_node_fs2 = require("fs");
|
|
35
54
|
var import_node_path2 = require("path");
|
|
36
55
|
|
|
37
56
|
// src/paths.ts
|
|
38
57
|
var import_node_os = require("os");
|
|
39
58
|
var import_node_path = require("path");
|
|
40
59
|
var import_node_url = require("url");
|
|
60
|
+
var import_node_fs = require("fs");
|
|
41
61
|
var import_meta = {};
|
|
42
|
-
|
|
62
|
+
function getCurrentDirname() {
|
|
63
|
+
try {
|
|
64
|
+
if (import_meta?.url) {
|
|
65
|
+
return (0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(import_meta.url));
|
|
66
|
+
}
|
|
67
|
+
} catch {
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const packageJsonPath = require.resolve("ux-toolkit/package.json");
|
|
71
|
+
return (0, import_node_path.join)((0, import_node_path.dirname)(packageJsonPath), "dist");
|
|
72
|
+
} catch {
|
|
73
|
+
}
|
|
74
|
+
const cwd = process.cwd();
|
|
75
|
+
try {
|
|
76
|
+
const fs = require("fs");
|
|
77
|
+
const pkgPath = (0, import_node_path.resolve)(cwd, "package.json");
|
|
78
|
+
if (fs.existsSync(pkgPath)) {
|
|
79
|
+
const pkg = require(pkgPath);
|
|
80
|
+
if (pkg.name === "ux-toolkit") {
|
|
81
|
+
return (0, import_node_path.resolve)(cwd, "dist");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
}
|
|
86
|
+
return (0, import_node_path.resolve)(cwd, "dist");
|
|
87
|
+
}
|
|
88
|
+
var currentDirname = getCurrentDirname();
|
|
43
89
|
function getPackageRoot() {
|
|
44
|
-
return (0, import_node_path.join)(
|
|
90
|
+
return (0, import_node_path.join)(currentDirname, "..");
|
|
45
91
|
}
|
|
46
92
|
function getSkillPath(skillName) {
|
|
47
93
|
return (0, import_node_path.join)(getPackageRoot(), "skills", skillName, "SKILL.md");
|
|
@@ -53,13 +99,57 @@ function getCommandPath(commandName) {
|
|
|
53
99
|
return (0, import_node_path.join)(getPackageRoot(), "commands", `${commandName}.md`);
|
|
54
100
|
}
|
|
55
101
|
function getGlobalConfigDir() {
|
|
56
|
-
|
|
102
|
+
if (process.env.UX_TOOLKIT_CONFIG_DIR) {
|
|
103
|
+
return (0, import_node_path.resolve)(process.env.UX_TOOLKIT_CONFIG_DIR);
|
|
104
|
+
}
|
|
105
|
+
if (process.env.OPENCODE_CONFIG_DIR) {
|
|
106
|
+
return (0, import_node_path.resolve)(process.env.OPENCODE_CONFIG_DIR);
|
|
107
|
+
}
|
|
108
|
+
const home = (0, import_node_os.homedir)();
|
|
109
|
+
const currentPlatform = (0, import_node_os.platform)();
|
|
110
|
+
if (currentPlatform === "linux" && process.env.XDG_CONFIG_HOME) {
|
|
111
|
+
return (0, import_node_path.join)(process.env.XDG_CONFIG_HOME, "opencode");
|
|
112
|
+
}
|
|
113
|
+
return (0, import_node_path.join)(home, ".config", "opencode");
|
|
114
|
+
}
|
|
115
|
+
function isOpenCodeInstalled() {
|
|
116
|
+
return (0, import_node_fs.existsSync)(getGlobalConfigDir());
|
|
57
117
|
}
|
|
58
|
-
function
|
|
59
|
-
|
|
118
|
+
function getClaudeConfigDir() {
|
|
119
|
+
if (process.env.CLAUDE_CONFIG_DIR) {
|
|
120
|
+
return (0, import_node_path.resolve)(process.env.CLAUDE_CONFIG_DIR);
|
|
121
|
+
}
|
|
122
|
+
return (0, import_node_path.join)((0, import_node_os.homedir)(), ".claude");
|
|
60
123
|
}
|
|
61
|
-
function
|
|
62
|
-
|
|
124
|
+
function isClaudeInstalled() {
|
|
125
|
+
return (0, import_node_fs.existsSync)(getClaudeConfigDir());
|
|
126
|
+
}
|
|
127
|
+
function getPlatformInfo() {
|
|
128
|
+
const opencodeDir = getGlobalConfigDir();
|
|
129
|
+
const claudeDir = getClaudeConfigDir();
|
|
130
|
+
return {
|
|
131
|
+
platform: (0, import_node_os.platform)(),
|
|
132
|
+
opencode: {
|
|
133
|
+
configDir: opencodeDir,
|
|
134
|
+
exists: (0, import_node_fs.existsSync)(opencodeDir)
|
|
135
|
+
},
|
|
136
|
+
claude: {
|
|
137
|
+
configDir: claudeDir,
|
|
138
|
+
exists: (0, import_node_fs.existsSync)(claudeDir)
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function getProjectConfigDir(projectRoot = process.cwd(), target = "opencode") {
|
|
143
|
+
const dirName = target === "claude" ? ".claude" : ".opencode";
|
|
144
|
+
return (0, import_node_path.join)(projectRoot, dirName);
|
|
145
|
+
}
|
|
146
|
+
function getDestinationPaths(global, projectRoot, target = "opencode") {
|
|
147
|
+
let baseDir;
|
|
148
|
+
if (global) {
|
|
149
|
+
baseDir = target === "claude" ? getClaudeConfigDir() : getGlobalConfigDir();
|
|
150
|
+
} else {
|
|
151
|
+
baseDir = getProjectConfigDir(projectRoot, target);
|
|
152
|
+
}
|
|
63
153
|
return {
|
|
64
154
|
skills: (0, import_node_path.join)(baseDir, "skills"),
|
|
65
155
|
agents: (0, import_node_path.join)(baseDir, "agents"),
|
|
@@ -67,97 +157,6 @@ function getDestinationPaths(global, projectRoot) {
|
|
|
67
157
|
};
|
|
68
158
|
}
|
|
69
159
|
|
|
70
|
-
// src/installer.ts
|
|
71
|
-
async function install(options = {}) {
|
|
72
|
-
const {
|
|
73
|
-
global: isGlobal = false,
|
|
74
|
-
projectRoot = process.cwd(),
|
|
75
|
-
categories = ["skills", "agents", "commands"],
|
|
76
|
-
force = false,
|
|
77
|
-
verbose = false
|
|
78
|
-
} = options;
|
|
79
|
-
const result = {
|
|
80
|
-
installed: [],
|
|
81
|
-
skipped: [],
|
|
82
|
-
errors: []
|
|
83
|
-
};
|
|
84
|
-
const packageRoot = getPackageRoot();
|
|
85
|
-
const destinations = getDestinationPaths(isGlobal, projectRoot);
|
|
86
|
-
const log = (msg) => {
|
|
87
|
-
if (verbose) console.log(msg);
|
|
88
|
-
};
|
|
89
|
-
if (categories.includes("skills")) {
|
|
90
|
-
const skillsDir = (0, import_node_path2.join)(packageRoot, "skills");
|
|
91
|
-
if ((0, import_node_fs.existsSync)(skillsDir)) {
|
|
92
|
-
const skills = (0, import_node_fs.readdirSync)(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
93
|
-
for (const skill of skills) {
|
|
94
|
-
const src = (0, import_node_path2.join)(skillsDir, skill);
|
|
95
|
-
const dest = (0, import_node_path2.join)(destinations.skills, skill);
|
|
96
|
-
try {
|
|
97
|
-
if ((0, import_node_fs.existsSync)(dest) && !force) {
|
|
98
|
-
result.skipped.push(`skill:${skill}`);
|
|
99
|
-
log(`Skipped skill/${skill} (already exists)`);
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
(0, import_node_fs.mkdirSync)((0, import_node_path2.dirname)(dest), { recursive: true });
|
|
103
|
-
(0, import_node_fs.cpSync)(src, dest, { recursive: true });
|
|
104
|
-
result.installed.push(`skill:${skill}`);
|
|
105
|
-
log(`Installed skill/${skill}`);
|
|
106
|
-
} catch (err) {
|
|
107
|
-
result.errors.push(`skill:${skill}: ${err}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (categories.includes("agents")) {
|
|
113
|
-
const agentsDir = (0, import_node_path2.join)(packageRoot, "agents");
|
|
114
|
-
if ((0, import_node_fs.existsSync)(agentsDir)) {
|
|
115
|
-
const agents = (0, import_node_fs.readdirSync)(agentsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
|
|
116
|
-
for (const agent of agents) {
|
|
117
|
-
const src = (0, import_node_path2.join)(agentsDir, `${agent}.md`);
|
|
118
|
-
const dest = (0, import_node_path2.join)(destinations.agents, `${agent}.md`);
|
|
119
|
-
try {
|
|
120
|
-
if ((0, import_node_fs.existsSync)(dest) && !force) {
|
|
121
|
-
result.skipped.push(`agent:${agent}`);
|
|
122
|
-
log(`Skipped agents/${agent}.md (already exists)`);
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
(0, import_node_fs.mkdirSync)((0, import_node_path2.dirname)(dest), { recursive: true });
|
|
126
|
-
(0, import_node_fs.cpSync)(src, dest);
|
|
127
|
-
result.installed.push(`agent:${agent}`);
|
|
128
|
-
log(`Installed agents/${agent}.md`);
|
|
129
|
-
} catch (err) {
|
|
130
|
-
result.errors.push(`agent:${agent}: ${err}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (categories.includes("commands")) {
|
|
136
|
-
const commandsDir = (0, import_node_path2.join)(packageRoot, "commands");
|
|
137
|
-
if ((0, import_node_fs.existsSync)(commandsDir)) {
|
|
138
|
-
const commands = (0, import_node_fs.readdirSync)(commandsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
|
|
139
|
-
for (const command of commands) {
|
|
140
|
-
const src = (0, import_node_path2.join)(commandsDir, `${command}.md`);
|
|
141
|
-
const dest = (0, import_node_path2.join)(destinations.commands, `${command}.md`);
|
|
142
|
-
try {
|
|
143
|
-
if ((0, import_node_fs.existsSync)(dest) && !force) {
|
|
144
|
-
result.skipped.push(`command:${command}`);
|
|
145
|
-
log(`Skipped commands/${command}.md (already exists)`);
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
(0, import_node_fs.mkdirSync)((0, import_node_path2.dirname)(dest), { recursive: true });
|
|
149
|
-
(0, import_node_fs.cpSync)(src, dest);
|
|
150
|
-
result.installed.push(`command:${command}`);
|
|
151
|
-
log(`Installed commands/${command}.md`);
|
|
152
|
-
} catch (err) {
|
|
153
|
-
result.errors.push(`command:${command}: ${err}`);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return result;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
160
|
// src/manifest.ts
|
|
162
161
|
var SKILLS = [
|
|
163
162
|
// Core UX Skills
|
|
@@ -408,14 +407,267 @@ var COMMANDS = [
|
|
|
408
407
|
description: "Visual review from screenshot"
|
|
409
408
|
}
|
|
410
409
|
];
|
|
410
|
+
|
|
411
|
+
// src/installer.ts
|
|
412
|
+
async function install(options = {}) {
|
|
413
|
+
const {
|
|
414
|
+
global: isGlobal = false,
|
|
415
|
+
projectRoot = process.cwd(),
|
|
416
|
+
target = "opencode",
|
|
417
|
+
categories = ["skills", "agents", "commands"],
|
|
418
|
+
skills: specificSkills,
|
|
419
|
+
agents: specificAgents,
|
|
420
|
+
commands: specificCommands,
|
|
421
|
+
force = false,
|
|
422
|
+
verbose = false
|
|
423
|
+
} = options;
|
|
424
|
+
const hasSpecificComponents = specificSkills?.length || specificAgents?.length || specificCommands?.length;
|
|
425
|
+
const effectiveCategories = hasSpecificComponents ? categories.filter((cat) => {
|
|
426
|
+
if (cat === "skills" && specificSkills?.length) return true;
|
|
427
|
+
if (cat === "agents" && specificAgents?.length) return true;
|
|
428
|
+
if (cat === "commands" && specificCommands?.length) return true;
|
|
429
|
+
return false;
|
|
430
|
+
}) : categories;
|
|
431
|
+
const result = {
|
|
432
|
+
installed: [],
|
|
433
|
+
skipped: [],
|
|
434
|
+
errors: []
|
|
435
|
+
};
|
|
436
|
+
const packageRoot = getPackageRoot();
|
|
437
|
+
const destinations = getDestinationPaths(isGlobal, projectRoot, target);
|
|
438
|
+
const log = (msg) => {
|
|
439
|
+
if (verbose) console.log(msg);
|
|
440
|
+
};
|
|
441
|
+
if (effectiveCategories.includes("skills")) {
|
|
442
|
+
const skillsDir = (0, import_node_path2.join)(packageRoot, "skills");
|
|
443
|
+
if ((0, import_node_fs2.existsSync)(skillsDir)) {
|
|
444
|
+
let skills = (0, import_node_fs2.readdirSync)(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
445
|
+
if (specificSkills?.length) {
|
|
446
|
+
const requested = new Set(specificSkills.map((s) => s.toLowerCase()));
|
|
447
|
+
skills = skills.filter((s) => requested.has(s.toLowerCase()));
|
|
448
|
+
}
|
|
449
|
+
for (const skill of skills) {
|
|
450
|
+
const src = (0, import_node_path2.join)(skillsDir, skill);
|
|
451
|
+
const dest = (0, import_node_path2.join)(destinations.skills, skill);
|
|
452
|
+
try {
|
|
453
|
+
if ((0, import_node_fs2.existsSync)(dest) && !force) {
|
|
454
|
+
result.skipped.push(`skill:${skill}`);
|
|
455
|
+
log(`Skipped skill/${skill} (already exists)`);
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
(0, import_node_fs2.mkdirSync)((0, import_node_path2.dirname)(dest), { recursive: true });
|
|
459
|
+
(0, import_node_fs2.cpSync)(src, dest, { recursive: true });
|
|
460
|
+
result.installed.push(`skill:${skill}`);
|
|
461
|
+
log(`Installed skill/${skill}`);
|
|
462
|
+
} catch (err) {
|
|
463
|
+
result.errors.push(`skill:${skill}: ${err}`);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
if (effectiveCategories.includes("agents")) {
|
|
469
|
+
const agentsDir = (0, import_node_path2.join)(packageRoot, "agents");
|
|
470
|
+
if ((0, import_node_fs2.existsSync)(agentsDir)) {
|
|
471
|
+
let agents = (0, import_node_fs2.readdirSync)(agentsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
|
|
472
|
+
if (specificAgents?.length) {
|
|
473
|
+
const requested = new Set(specificAgents.map((a) => a.toLowerCase()));
|
|
474
|
+
agents = agents.filter((a) => requested.has(a.toLowerCase()));
|
|
475
|
+
}
|
|
476
|
+
for (const agent of agents) {
|
|
477
|
+
const src = (0, import_node_path2.join)(agentsDir, `${agent}.md`);
|
|
478
|
+
const dest = (0, import_node_path2.join)(destinations.agents, `${agent}.md`);
|
|
479
|
+
try {
|
|
480
|
+
if ((0, import_node_fs2.existsSync)(dest) && !force) {
|
|
481
|
+
result.skipped.push(`agent:${agent}`);
|
|
482
|
+
log(`Skipped agents/${agent}.md (already exists)`);
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
(0, import_node_fs2.mkdirSync)((0, import_node_path2.dirname)(dest), { recursive: true });
|
|
486
|
+
(0, import_node_fs2.cpSync)(src, dest);
|
|
487
|
+
result.installed.push(`agent:${agent}`);
|
|
488
|
+
log(`Installed agents/${agent}.md`);
|
|
489
|
+
} catch (err) {
|
|
490
|
+
result.errors.push(`agent:${agent}: ${err}`);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (effectiveCategories.includes("commands")) {
|
|
496
|
+
const commandsDir = (0, import_node_path2.join)(packageRoot, "commands");
|
|
497
|
+
if ((0, import_node_fs2.existsSync)(commandsDir)) {
|
|
498
|
+
let commands = (0, import_node_fs2.readdirSync)(commandsDir).filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
|
|
499
|
+
if (specificCommands?.length) {
|
|
500
|
+
const requested = new Set(specificCommands.map((c) => c.toLowerCase()));
|
|
501
|
+
commands = commands.filter((c) => requested.has(c.toLowerCase()));
|
|
502
|
+
}
|
|
503
|
+
for (const command of commands) {
|
|
504
|
+
const src = (0, import_node_path2.join)(commandsDir, `${command}.md`);
|
|
505
|
+
const dest = (0, import_node_path2.join)(destinations.commands, `${command}.md`);
|
|
506
|
+
try {
|
|
507
|
+
if ((0, import_node_fs2.existsSync)(dest) && !force) {
|
|
508
|
+
result.skipped.push(`command:${command}`);
|
|
509
|
+
log(`Skipped commands/${command}.md (already exists)`);
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
(0, import_node_fs2.mkdirSync)((0, import_node_path2.dirname)(dest), { recursive: true });
|
|
513
|
+
(0, import_node_fs2.cpSync)(src, dest);
|
|
514
|
+
result.installed.push(`command:${command}`);
|
|
515
|
+
log(`Installed commands/${command}.md`);
|
|
516
|
+
} catch (err) {
|
|
517
|
+
result.errors.push(`command:${command}: ${err}`);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return result;
|
|
523
|
+
}
|
|
524
|
+
function checkComponentStatus(componentPath, name) {
|
|
525
|
+
const installed = (0, import_node_fs2.existsSync)(componentPath);
|
|
526
|
+
if (!installed) {
|
|
527
|
+
return { name, installed: false };
|
|
528
|
+
}
|
|
529
|
+
try {
|
|
530
|
+
const stats = (0, import_node_fs2.statSync)(componentPath);
|
|
531
|
+
return {
|
|
532
|
+
name,
|
|
533
|
+
installed: true,
|
|
534
|
+
path: componentPath,
|
|
535
|
+
modifiedAt: stats.mtime
|
|
536
|
+
};
|
|
537
|
+
} catch {
|
|
538
|
+
return { name, installed: true, path: componentPath };
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
function getTargetStatus(target, isGlobal, projectRoot) {
|
|
542
|
+
const available = target === "opencode" ? isOpenCodeInstalled() : isClaudeInstalled();
|
|
543
|
+
const destinations = getDestinationPaths(isGlobal, projectRoot, target);
|
|
544
|
+
const skillStatuses = SKILLS.map(
|
|
545
|
+
(s) => checkComponentStatus((0, import_node_path2.join)(destinations.skills, s.name), s.name)
|
|
546
|
+
);
|
|
547
|
+
const agentStatuses = AGENTS.map(
|
|
548
|
+
(a) => checkComponentStatus((0, import_node_path2.join)(destinations.agents, `${a.name}.md`), a.name)
|
|
549
|
+
);
|
|
550
|
+
const commandStatuses = COMMANDS.map(
|
|
551
|
+
(c) => checkComponentStatus((0, import_node_path2.join)(destinations.commands, `${c.name}.md`), c.name)
|
|
552
|
+
);
|
|
553
|
+
return {
|
|
554
|
+
target,
|
|
555
|
+
available,
|
|
556
|
+
configDir: target === "opencode" ? isGlobal ? destinations.skills.replace(/[/\\]skills$/, "") : destinations.skills.replace(/[/\\]skills$/, "") : isGlobal ? destinations.skills.replace(/[/\\]skills$/, "") : destinations.skills.replace(/[/\\]skills$/, ""),
|
|
557
|
+
skills: {
|
|
558
|
+
installed: skillStatuses.filter((s) => s.installed).length,
|
|
559
|
+
total: SKILLS.length,
|
|
560
|
+
components: skillStatuses
|
|
561
|
+
},
|
|
562
|
+
agents: {
|
|
563
|
+
installed: agentStatuses.filter((a) => a.installed).length,
|
|
564
|
+
total: AGENTS.length,
|
|
565
|
+
components: agentStatuses
|
|
566
|
+
},
|
|
567
|
+
commands: {
|
|
568
|
+
installed: commandStatuses.filter((c) => c.installed).length,
|
|
569
|
+
total: COMMANDS.length,
|
|
570
|
+
components: commandStatuses
|
|
571
|
+
}
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
async function getStatus(options = {}) {
|
|
575
|
+
const { global: isGlobal = true, projectRoot = process.cwd() } = options;
|
|
576
|
+
return {
|
|
577
|
+
opencode: getTargetStatus("opencode", isGlobal, projectRoot),
|
|
578
|
+
claude: getTargetStatus("claude", isGlobal, projectRoot)
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
async function uninstall(options = {}) {
|
|
582
|
+
const {
|
|
583
|
+
global: isGlobal = false,
|
|
584
|
+
projectRoot = process.cwd(),
|
|
585
|
+
target = "opencode",
|
|
586
|
+
categories = ["skills", "agents", "commands"],
|
|
587
|
+
verbose = false
|
|
588
|
+
} = options;
|
|
589
|
+
const result = {
|
|
590
|
+
removed: [],
|
|
591
|
+
notFound: [],
|
|
592
|
+
errors: []
|
|
593
|
+
};
|
|
594
|
+
const destinations = getDestinationPaths(isGlobal, projectRoot, target);
|
|
595
|
+
const log = (msg) => {
|
|
596
|
+
if (verbose) console.log(msg);
|
|
597
|
+
};
|
|
598
|
+
const ourSkills = SKILLS.map((s) => s.name);
|
|
599
|
+
const ourAgents = AGENTS.map((a) => a.name);
|
|
600
|
+
const ourCommands = COMMANDS.map((c) => c.name);
|
|
601
|
+
if (categories.includes("skills")) {
|
|
602
|
+
for (const skill of ourSkills) {
|
|
603
|
+
const dest = (0, import_node_path2.join)(destinations.skills, skill);
|
|
604
|
+
try {
|
|
605
|
+
if (!(0, import_node_fs2.existsSync)(dest)) {
|
|
606
|
+
result.notFound.push(`skill:${skill}`);
|
|
607
|
+
log(`Not found: skill/${skill}`);
|
|
608
|
+
continue;
|
|
609
|
+
}
|
|
610
|
+
(0, import_node_fs2.rmSync)(dest, { recursive: true, force: true });
|
|
611
|
+
result.removed.push(`skill:${skill}`);
|
|
612
|
+
log(`Removed skill/${skill}`);
|
|
613
|
+
} catch (err) {
|
|
614
|
+
result.errors.push(`skill:${skill}: ${err}`);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
if (categories.includes("agents")) {
|
|
619
|
+
for (const agent of ourAgents) {
|
|
620
|
+
const dest = (0, import_node_path2.join)(destinations.agents, `${agent}.md`);
|
|
621
|
+
try {
|
|
622
|
+
if (!(0, import_node_fs2.existsSync)(dest)) {
|
|
623
|
+
result.notFound.push(`agent:${agent}`);
|
|
624
|
+
log(`Not found: agents/${agent}.md`);
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
(0, import_node_fs2.rmSync)(dest, { force: true });
|
|
628
|
+
result.removed.push(`agent:${agent}`);
|
|
629
|
+
log(`Removed agents/${agent}.md`);
|
|
630
|
+
} catch (err) {
|
|
631
|
+
result.errors.push(`agent:${agent}: ${err}`);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
if (categories.includes("commands")) {
|
|
636
|
+
for (const command of ourCommands) {
|
|
637
|
+
const dest = (0, import_node_path2.join)(destinations.commands, `${command}.md`);
|
|
638
|
+
try {
|
|
639
|
+
if (!(0, import_node_fs2.existsSync)(dest)) {
|
|
640
|
+
result.notFound.push(`command:${command}`);
|
|
641
|
+
log(`Not found: commands/${command}.md`);
|
|
642
|
+
continue;
|
|
643
|
+
}
|
|
644
|
+
(0, import_node_fs2.rmSync)(dest, { force: true });
|
|
645
|
+
result.removed.push(`command:${command}`);
|
|
646
|
+
log(`Removed commands/${command}.md`);
|
|
647
|
+
} catch (err) {
|
|
648
|
+
result.errors.push(`command:${command}: ${err}`);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
return result;
|
|
653
|
+
}
|
|
411
654
|
// Annotate the CommonJS export names for ESM import in node:
|
|
412
655
|
0 && (module.exports = {
|
|
413
656
|
AGENTS,
|
|
414
657
|
COMMANDS,
|
|
415
658
|
SKILLS,
|
|
416
659
|
getAgentPath,
|
|
660
|
+
getClaudeConfigDir,
|
|
417
661
|
getCommandPath,
|
|
662
|
+
getDestinationPaths,
|
|
663
|
+
getGlobalConfigDir,
|
|
664
|
+
getPlatformInfo,
|
|
665
|
+
getProjectConfigDir,
|
|
418
666
|
getSkillPath,
|
|
419
|
-
|
|
667
|
+
getStatus,
|
|
668
|
+
install,
|
|
669
|
+
isClaudeInstalled,
|
|
670
|
+
isOpenCodeInstalled,
|
|
671
|
+
uninstall
|
|
420
672
|
});
|
|
421
673
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/installer.ts","../src/paths.ts","../src/manifest.ts"],"sourcesContent":["export { install } from './installer.js';\nexport type { InstallOptions } from './installer.js';\nexport { getSkillPath, getAgentPath, getCommandPath } from './paths.js';\nexport { SKILLS, AGENTS, COMMANDS } from './manifest.js';\n","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":["import_node_path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/installer.ts","../src/paths.ts","../src/manifest.ts"],"sourcesContent":["export { install, uninstall, getStatus } from './installer.js';\nexport type { \n InstallOptions, \n UninstallOptions, \n InstallResult, \n UninstallResult,\n StatusOptions,\n StatusResult,\n TargetStatus,\n CategoryStatus,\n ComponentStatus,\n} from './installer.js';\nexport { \n getSkillPath, \n getAgentPath, \n getCommandPath,\n getGlobalConfigDir,\n getClaudeConfigDir,\n getProjectConfigDir,\n getDestinationPaths,\n isOpenCodeInstalled,\n isClaudeInstalled,\n getPlatformInfo,\n} from './paths.js';\nexport type { InstallTarget, DestinationPathsOptions } from './paths.js';\nexport { SKILLS, AGENTS, COMMANDS } from './manifest.js';\n","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":["import_node_fs","import_node_path"]}
|