moicle 1.6.0 → 2.0.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/README.md +82 -32
- package/assets/skills/docs/content/SKILL.md +269 -0
- package/assets/skills/{logo-design → docs/logo}/SKILL.md +31 -16
- package/assets/skills/{sync-docs → docs/sync}/SKILL.md +31 -1
- package/assets/skills/{video-content → docs/video}/SKILL.md +32 -17
- package/assets/skills/docs/write/SKILL.md +371 -0
- package/assets/skills/feature/api/SKILL.md +277 -0
- package/assets/skills/feature/deprecate/SKILL.md +276 -0
- package/assets/skills/{new-feature → feature/new}/SKILL.md +28 -12
- package/assets/skills/{refactor → feature/refactor}/SKILL.md +24 -12
- package/assets/skills/{hotfix → fix/hotfix}/SKILL.md +32 -30
- package/assets/skills/fix/incident/SKILL.md +272 -0
- package/assets/skills/{fix-pr-comment → fix/pr-comment}/SKILL.md +30 -1
- package/assets/skills/fix/root-cause/SKILL.md +219 -0
- package/assets/skills/{onboarding → research/onboarding}/SKILL.md +32 -31
- package/assets/skills/{spike → research/spike}/SKILL.md +33 -32
- package/assets/skills/research/web/SKILL.md +163 -0
- package/assets/skills/{architect-review → review/architect}/SKILL.md +37 -7
- package/assets/skills/{review-changes → review/branch}/SKILL.md +27 -7
- package/assets/skills/{pr-review → review/pr}/SKILL.md +31 -30
- package/assets/skills/review/tdd/SKILL.md +206 -0
- package/bin/cli.js +12 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +219 -38
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +42 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/postinstall.d.ts.map +1 -1
- package/dist/commands/postinstall.js +2 -0
- package/dist/commands/postinstall.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +31 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +93 -38
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/upgrade.d.ts +7 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +165 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/symlink.d.ts +8 -0
- package/dist/utils/symlink.d.ts.map +1 -1
- package/dist/utils/symlink.js +100 -0
- package/dist/utils/symlink.js.map +1 -1
- package/package.json +3 -1
- package/assets/skills/api-integration/SKILL.md +0 -883
- package/assets/skills/content-writer/SKILL.md +0 -721
- package/assets/skills/deep-debug/SKILL.md +0 -114
- package/assets/skills/deprecation/SKILL.md +0 -923
- package/assets/skills/documentation/SKILL.md +0 -1333
- package/assets/skills/incident-response/SKILL.md +0 -946
- package/assets/skills/research/SKILL.md +0 -124
- package/assets/skills/tdd/SKILL.md +0 -828
|
@@ -3,8 +3,8 @@ import inquirer from 'inquirer';
|
|
|
3
3
|
import ora from 'ora';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import fs from 'fs';
|
|
6
|
-
import { ASSETS_DIR, removeItem, listItems, getAgentsDir, getCommandsDir, getSkillsDir, getEditorDir, getEditorConfig, } from '../utils/symlink.js';
|
|
7
|
-
import { removeTarget } from '../utils/config.js';
|
|
6
|
+
import { ASSETS_DIR, EDITOR_CONFIGS, removeItem, listItems, getAgentsDir, getCommandsDir, getSkillsDir, getEditorDir, getEditorConfig, } from '../utils/symlink.js';
|
|
7
|
+
import { getTargets, removeTarget } from '../utils/config.js';
|
|
8
8
|
const printHeader = () => {
|
|
9
9
|
console.log('');
|
|
10
10
|
console.log(chalk.cyan('════════════════════════════════════════'));
|
|
@@ -65,6 +65,52 @@ const uninstallScope = async (scope) => {
|
|
|
65
65
|
console.log('');
|
|
66
66
|
console.log(chalk.green(`✓ ${label} uninstall complete!`));
|
|
67
67
|
};
|
|
68
|
+
const getCodexManagedNames = () => {
|
|
69
|
+
const architecture = [];
|
|
70
|
+
const skills = [];
|
|
71
|
+
const archDir = path.join(ASSETS_DIR, 'architecture');
|
|
72
|
+
if (fs.existsSync(archDir)) {
|
|
73
|
+
fs.readdirSync(archDir).forEach((name) => architecture.push(name));
|
|
74
|
+
}
|
|
75
|
+
const skillsDir = path.join(ASSETS_DIR, 'skills');
|
|
76
|
+
if (fs.existsSync(skillsDir)) {
|
|
77
|
+
fs.readdirSync(skillsDir).forEach((name) => skills.push(name));
|
|
78
|
+
}
|
|
79
|
+
const commandsDir = path.join(ASSETS_DIR, 'commands');
|
|
80
|
+
if (fs.existsSync(commandsDir)) {
|
|
81
|
+
fs.readdirSync(commandsDir).forEach((name) => skills.push(name.replace(/\.md$/, '')));
|
|
82
|
+
}
|
|
83
|
+
for (const dirName of ['developers', 'utilities']) {
|
|
84
|
+
const agentsDir = path.join(ASSETS_DIR, 'agents', dirName);
|
|
85
|
+
if (fs.existsSync(agentsDir)) {
|
|
86
|
+
fs.readdirSync(agentsDir).forEach((name) => skills.push(name.replace(/\.md$/, '')));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { architecture, skills };
|
|
90
|
+
};
|
|
91
|
+
const uninstallCodexScope = async (scope) => {
|
|
92
|
+
const label = scope === 'global' ? 'Global' : 'Project';
|
|
93
|
+
const targetDir = getEditorDir('codex', scope);
|
|
94
|
+
const spinner = ora(`Uninstalling Codex assets from ${label.toLowerCase()} scope...`).start();
|
|
95
|
+
const managed = getCodexManagedNames();
|
|
96
|
+
let removed = 0;
|
|
97
|
+
const archDir = path.join(targetDir, 'architecture');
|
|
98
|
+
for (const name of managed.architecture) {
|
|
99
|
+
const result = removeItem(path.join(archDir, name));
|
|
100
|
+
if (result.status === 'removed') {
|
|
101
|
+
removed++;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const skillsDir = path.join(targetDir, 'skills');
|
|
105
|
+
for (const name of managed.skills) {
|
|
106
|
+
const result = removeItem(path.join(skillsDir, name));
|
|
107
|
+
if (result.status === 'removed') {
|
|
108
|
+
removed++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
spinner.succeed(`Removed ${removed} Codex items from ${label.toLowerCase()} scope`);
|
|
112
|
+
console.log(chalk.green(`✓ ${label} Codex uninstall complete!`));
|
|
113
|
+
};
|
|
68
114
|
const uninstallForOtherEditor = async (target) => {
|
|
69
115
|
const config = getEditorConfig(target);
|
|
70
116
|
const spinner = ora(`Uninstalling from ${config.name}...`).start();
|
|
@@ -86,38 +132,33 @@ const uninstallForOtherEditor = async (target) => {
|
|
|
86
132
|
}
|
|
87
133
|
removeTarget(target);
|
|
88
134
|
};
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
// ]);
|
|
109
|
-
//
|
|
110
|
-
// return targets;
|
|
111
|
-
// };
|
|
112
|
-
const showInteractiveMenu = async () => {
|
|
135
|
+
const showTargetMenu = async () => {
|
|
136
|
+
const installedTargets = getTargets();
|
|
137
|
+
const availableTargets = installedTargets.length > 0 ? installedTargets : ['claude', 'codex'];
|
|
138
|
+
const { target } = await inquirer.prompt([
|
|
139
|
+
{
|
|
140
|
+
type: 'list',
|
|
141
|
+
name: 'target',
|
|
142
|
+
message: 'Select target editor to uninstall:',
|
|
143
|
+
choices: availableTargets.map((value) => ({
|
|
144
|
+
name: EDITOR_CONFIGS[value].name,
|
|
145
|
+
value,
|
|
146
|
+
})),
|
|
147
|
+
},
|
|
148
|
+
]);
|
|
149
|
+
return target;
|
|
150
|
+
};
|
|
151
|
+
const showInteractiveMenu = async (target) => {
|
|
152
|
+
const globalPath = target === 'claude' ? '~/.claude/' : '~/.codex/';
|
|
153
|
+
const projectPath = target === 'claude' ? './.claude/' : './.codex/';
|
|
113
154
|
const { uninstallType } = await inquirer.prompt([
|
|
114
155
|
{
|
|
115
156
|
type: 'list',
|
|
116
157
|
name: 'uninstallType',
|
|
117
158
|
message: 'Where would you like to uninstall from?',
|
|
118
159
|
choices: [
|
|
119
|
-
{ name:
|
|
120
|
-
{ name:
|
|
160
|
+
{ name: `Global (${globalPath})`, value: 'global' },
|
|
161
|
+
{ name: `Project (${projectPath})`, value: 'project' },
|
|
121
162
|
{ name: 'Both', value: 'all' },
|
|
122
163
|
],
|
|
123
164
|
},
|
|
@@ -138,11 +179,9 @@ const showInteractiveMenu = async () => {
|
|
|
138
179
|
};
|
|
139
180
|
export const uninstallCommand = async (options) => {
|
|
140
181
|
printHeader();
|
|
141
|
-
|
|
142
|
-
const targets = ['claude'];
|
|
143
|
-
// const targets = await showTargetMenu();
|
|
182
|
+
const targets = options.target ? [options.target] : [await showTargetMenu()];
|
|
144
183
|
for (const target of targets) {
|
|
145
|
-
if (target === 'claude') {
|
|
184
|
+
if (target === 'claude' || target === 'codex') {
|
|
146
185
|
let uninstallType;
|
|
147
186
|
if (options.global) {
|
|
148
187
|
uninstallType = 'global';
|
|
@@ -154,21 +193,37 @@ export const uninstallCommand = async (options) => {
|
|
|
154
193
|
uninstallType = 'all';
|
|
155
194
|
}
|
|
156
195
|
else {
|
|
157
|
-
uninstallType = await showInteractiveMenu();
|
|
196
|
+
uninstallType = await showInteractiveMenu(target);
|
|
158
197
|
}
|
|
159
198
|
switch (uninstallType) {
|
|
160
199
|
case 'global':
|
|
161
|
-
|
|
200
|
+
if (target === 'claude') {
|
|
201
|
+
await uninstallScope('global');
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
await uninstallCodexScope('global');
|
|
205
|
+
}
|
|
162
206
|
break;
|
|
163
207
|
case 'project':
|
|
164
|
-
|
|
208
|
+
if (target === 'claude') {
|
|
209
|
+
await uninstallScope('project');
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
await uninstallCodexScope('project');
|
|
213
|
+
}
|
|
165
214
|
break;
|
|
166
215
|
case 'all':
|
|
167
|
-
|
|
168
|
-
|
|
216
|
+
if (target === 'claude') {
|
|
217
|
+
await uninstallScope('global');
|
|
218
|
+
await uninstallScope('project');
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
await uninstallCodexScope('global');
|
|
222
|
+
await uninstallCodexScope('project');
|
|
223
|
+
}
|
|
169
224
|
break;
|
|
170
225
|
}
|
|
171
|
-
removeTarget(
|
|
226
|
+
removeTarget(target);
|
|
172
227
|
}
|
|
173
228
|
else {
|
|
174
229
|
await uninstallForOtherEditor(target);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EACL,UAAU,
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAWA,UAAU,cAAc;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAwHD,eAAO,MAAM,cAAc,GAAU,UAAS,cAAmB,KAAG,OAAO,CAAC,IAAI,CAmE/E,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { execSync, spawnSync } from 'child_process';
|
|
5
|
+
import { createRequire } from 'module';
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const pkg = require('../../package.json');
|
|
8
|
+
const PACKAGE_NAME = 'moicle';
|
|
9
|
+
const printHeader = () => {
|
|
10
|
+
console.log('');
|
|
11
|
+
console.log(chalk.cyan('════════════════════════════════════════'));
|
|
12
|
+
console.log(chalk.cyan(' MoiCle - Upgrade'));
|
|
13
|
+
console.log(chalk.cyan('════════════════════════════════════════'));
|
|
14
|
+
console.log('');
|
|
15
|
+
};
|
|
16
|
+
const parseSemver = (version) => {
|
|
17
|
+
const clean = version.trim().replace(/^v/, '').split('-')[0];
|
|
18
|
+
const parts = clean.split('.').map((n) => Number.parseInt(n, 10));
|
|
19
|
+
const [major = 0, minor = 0, patch = 0] = parts;
|
|
20
|
+
return [major, minor, patch];
|
|
21
|
+
};
|
|
22
|
+
const compareVersions = (a, b) => {
|
|
23
|
+
const [aMaj, aMin, aPatch] = parseSemver(a);
|
|
24
|
+
const [bMaj, bMin, bPatch] = parseSemver(b);
|
|
25
|
+
if (aMaj !== bMaj)
|
|
26
|
+
return aMaj - bMaj;
|
|
27
|
+
if (aMin !== bMin)
|
|
28
|
+
return aMin - bMin;
|
|
29
|
+
return aPatch - bPatch;
|
|
30
|
+
};
|
|
31
|
+
const fetchLatestVersion = () => {
|
|
32
|
+
const result = spawnSync('npm', ['view', PACKAGE_NAME, 'version'], {
|
|
33
|
+
encoding: 'utf-8',
|
|
34
|
+
});
|
|
35
|
+
if (result.status !== 0) {
|
|
36
|
+
const stderr = result.stderr?.toString().trim() || 'unknown error';
|
|
37
|
+
throw new Error(`Failed to fetch latest version from npm registry: ${stderr}`);
|
|
38
|
+
}
|
|
39
|
+
const version = result.stdout.toString().trim();
|
|
40
|
+
if (!version) {
|
|
41
|
+
throw new Error('npm returned empty version string');
|
|
42
|
+
}
|
|
43
|
+
return version;
|
|
44
|
+
};
|
|
45
|
+
const detectPackageManager = () => {
|
|
46
|
+
const userAgent = process.env.npm_config_user_agent || '';
|
|
47
|
+
if (userAgent.startsWith('bun'))
|
|
48
|
+
return 'bun';
|
|
49
|
+
if (userAgent.startsWith('pnpm'))
|
|
50
|
+
return 'pnpm';
|
|
51
|
+
if (userAgent.startsWith('yarn'))
|
|
52
|
+
return 'yarn';
|
|
53
|
+
const hasBin = (bin) => {
|
|
54
|
+
const result = spawnSync('which', [bin], { encoding: 'utf-8' });
|
|
55
|
+
return result.status === 0;
|
|
56
|
+
};
|
|
57
|
+
if (hasBin('bun'))
|
|
58
|
+
return 'bun';
|
|
59
|
+
return 'npm';
|
|
60
|
+
};
|
|
61
|
+
const buildUpgradeCommand = (pm) => {
|
|
62
|
+
const target = `${PACKAGE_NAME}@latest`;
|
|
63
|
+
switch (pm) {
|
|
64
|
+
case 'bun':
|
|
65
|
+
return ['bun', ['add', '-g', target]];
|
|
66
|
+
case 'pnpm':
|
|
67
|
+
return ['pnpm', ['add', '-g', target]];
|
|
68
|
+
case 'yarn':
|
|
69
|
+
return ['yarn', ['global', 'add', target]];
|
|
70
|
+
case 'npm':
|
|
71
|
+
default:
|
|
72
|
+
return ['npm', ['install', '-g', target]];
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const runUpgrade = (pm) => {
|
|
76
|
+
const [cmd, args] = buildUpgradeCommand(pm);
|
|
77
|
+
console.log(chalk.gray(` Running: ${cmd} ${args.join(' ')}`));
|
|
78
|
+
console.log('');
|
|
79
|
+
const result = spawnSync(cmd, args, { stdio: 'inherit' });
|
|
80
|
+
if (result.status !== 0) {
|
|
81
|
+
throw new Error(`Upgrade command failed with exit code ${result.status}. Try running manually: ${cmd} ${args.join(' ')}`);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const confirmUpgrade = async (current, latest) => {
|
|
85
|
+
const { proceed } = await inquirer.prompt([
|
|
86
|
+
{
|
|
87
|
+
type: 'confirm',
|
|
88
|
+
name: 'proceed',
|
|
89
|
+
message: `Upgrade from ${chalk.yellow(current)} to ${chalk.green(latest)}?`,
|
|
90
|
+
default: true,
|
|
91
|
+
},
|
|
92
|
+
]);
|
|
93
|
+
return proceed;
|
|
94
|
+
};
|
|
95
|
+
const confirmReinstall = async () => {
|
|
96
|
+
const { proceed } = await inquirer.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: 'confirm',
|
|
99
|
+
name: 'proceed',
|
|
100
|
+
message: 'Re-run "moicle install" to refresh assets?',
|
|
101
|
+
default: true,
|
|
102
|
+
},
|
|
103
|
+
]);
|
|
104
|
+
return proceed;
|
|
105
|
+
};
|
|
106
|
+
const runReinstall = () => {
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log(chalk.cyan('>>> Refreshing assets'));
|
|
109
|
+
console.log('');
|
|
110
|
+
execSync(`${PACKAGE_NAME} install`, { stdio: 'inherit' });
|
|
111
|
+
};
|
|
112
|
+
export const upgradeCommand = async (options = {}) => {
|
|
113
|
+
printHeader();
|
|
114
|
+
const current = pkg.version;
|
|
115
|
+
console.log(chalk.gray(` Current version: ${chalk.white(current)}`));
|
|
116
|
+
const spinner = ora('Checking latest version on npm...').start();
|
|
117
|
+
let latest;
|
|
118
|
+
try {
|
|
119
|
+
latest = fetchLatestVersion();
|
|
120
|
+
spinner.succeed(`Latest version: ${chalk.green(latest)}`);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
spinner.fail('Failed to check latest version');
|
|
124
|
+
throw err;
|
|
125
|
+
}
|
|
126
|
+
const diff = compareVersions(latest, current);
|
|
127
|
+
if (diff === 0) {
|
|
128
|
+
console.log('');
|
|
129
|
+
console.log(chalk.green(`✓ Already up to date (${current})`));
|
|
130
|
+
console.log('');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (diff < 0) {
|
|
134
|
+
console.log('');
|
|
135
|
+
console.log(chalk.yellow(` Installed version (${current}) is newer than npm registry (${latest}). Nothing to upgrade.`));
|
|
136
|
+
console.log('');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
console.log('');
|
|
140
|
+
console.log(` ${chalk.yellow(current)} ${chalk.gray('→')} ${chalk.green(latest)} ${chalk.gray('available')}`);
|
|
141
|
+
console.log('');
|
|
142
|
+
const proceed = options.yes ?? (await confirmUpgrade(current, latest));
|
|
143
|
+
if (!proceed) {
|
|
144
|
+
console.log(chalk.gray(' Upgrade cancelled.'));
|
|
145
|
+
console.log('');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const pm = detectPackageManager();
|
|
149
|
+
console.log(chalk.gray(` Package manager: ${pm}`));
|
|
150
|
+
console.log('');
|
|
151
|
+
runUpgrade(pm);
|
|
152
|
+
console.log('');
|
|
153
|
+
console.log(chalk.green(`✓ Upgraded to ${latest}`));
|
|
154
|
+
console.log('');
|
|
155
|
+
const shouldReinstall = options.reinstall ?? (await confirmReinstall());
|
|
156
|
+
if (shouldReinstall) {
|
|
157
|
+
runReinstall();
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log(chalk.gray(' Skipped asset refresh.'));
|
|
161
|
+
console.log(chalk.gray(' Run "moicle install" later to pick up new agents/skills/commands.'));
|
|
162
|
+
console.log('');
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type Scope = 'global' | 'project';
|
|
2
2
|
export type ItemType = 'agents' | 'commands' | 'skills';
|
|
3
|
-
export type EditorTarget = 'claude' | 'cursor' | 'windsurf' | 'antigravity';
|
|
3
|
+
export type EditorTarget = 'claude' | 'codex' | 'cursor' | 'windsurf' | 'antigravity';
|
|
4
4
|
export interface EditorConfig {
|
|
5
5
|
name: string;
|
|
6
6
|
globalDir: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;AAEtF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACzF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB"}
|
package/dist/utils/symlink.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare const getEditorAgentsDir: (target: EditorTarget, scope?: Scope) =
|
|
|
9
9
|
export declare const getEditorCommandsDir: (target: EditorTarget, scope?: Scope) => string;
|
|
10
10
|
export declare const getEditorSkillsDir: (target: EditorTarget, scope?: Scope) => string;
|
|
11
11
|
export declare const getClaudeDir: (scope?: Scope) => string;
|
|
12
|
+
export declare const getCodexDir: (scope?: Scope) => string;
|
|
12
13
|
export declare const getAgentsDir: (scope?: Scope) => string;
|
|
13
14
|
export declare const getCommandsDir: (scope?: Scope) => string;
|
|
14
15
|
export declare const getSkillsDir: (scope?: Scope) => string;
|
|
@@ -19,6 +20,13 @@ export declare const copyFile: (source: string, target: string) => FileResult;
|
|
|
19
20
|
export declare const copyDir: (source: string, target: string) => FileResult;
|
|
20
21
|
export declare const removeItem: (target: string) => FileResult;
|
|
21
22
|
export declare const listItems: (dir: string) => ListItem[];
|
|
23
|
+
/**
|
|
24
|
+
* List skills in nested namespace form. For a directory laid out as
|
|
25
|
+
* <dir>/<group>/<action>/SKILL.md
|
|
26
|
+
* returns one item per <group>/<action> with name = "<group>:<action>".
|
|
27
|
+
* Top-level files or single-level folders are returned as-is for back-compat.
|
|
28
|
+
*/
|
|
29
|
+
export declare const listSkillsNested: (dir: string) => ListItem[];
|
|
22
30
|
export declare const getFiles: (dir: string, depth?: number) => string[];
|
|
23
31
|
export declare const getDirs: (dir: string) => string[];
|
|
24
32
|
export declare const mergeAgentsToFile: (targetFile: string, target: EditorTarget) => FileResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symlink.d.ts","sourceRoot":"","sources":["../../src/utils/symlink.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAK3F,eAAO,MAAM,YAAY,QAAsC,CAAC;AAChE,eAAO,MAAM,UAAU,QAAoC,CAAC;AAE5D,eAAO,MAAM,kBAAkB,QAAO,OAAuC,CAAC;AAE9E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"symlink.d.ts","sourceRoot":"","sources":["../../src/utils/symlink.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAK3F,eAAO,MAAM,YAAY,QAAsC,CAAC;AAChE,eAAO,MAAM,UAAU,QAAoC,CAAC;AAE5D,eAAO,MAAM,kBAAkB,QAAO,OAAuC,CAAC;AAE9E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,CAsD7D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,YAAY,KAAG,YAEtD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,YAAY,EAAE,QAAO,KAAgB,KAAG,MAkB5E,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,YAAY,EAAE,QAAO,KAAgB,KAAG,MAIlF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,YAAY,EAAE,QAAO,KAAgB,KAAG,MAIpF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,YAAY,EAAE,QAAO,KAAgB,KAAG,MAIlF,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAO,KAAgB,KAAG,MAEtD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAO,KAAgB,KAAG,MAErD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAO,KAAgB,KAAG,MACb,CAAC;AAE3C,eAAO,MAAM,cAAc,GAAI,QAAO,KAAgB,KAAG,MACb,CAAC;AAE7C,eAAO,MAAM,YAAY,GAAI,QAAO,KAAgB,KAAG,MACb,CAAC;AAE3C,eAAO,MAAM,kBAAkB,GAAI,QAAO,KAAgB,KAAG,MACb,CAAC;AAEjD,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,KAAG,OAMvC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,UA6B9D,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,UAoBzD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,UAwBxD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,UAoB3C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,KAAG,QAAQ,EAyB/C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,QAAQ,EA2DtD,CAAC;AA0BF,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,EAAE,cAAS,KAAG,MAAM,EAqBvD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,KAAG,MAAM,EAmB3C,CAAC;AAiBF,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,EAAE,QAAQ,YAAY,KAAG,UAsD5E,CAAC"}
|
package/dist/utils/symlink.js
CHANGED
|
@@ -18,6 +18,16 @@ export const EDITOR_CONFIGS = {
|
|
|
18
18
|
supportsCommands: true,
|
|
19
19
|
supportsSkills: true,
|
|
20
20
|
},
|
|
21
|
+
codex: {
|
|
22
|
+
name: 'Codex CLI',
|
|
23
|
+
globalDir: path.join(os.homedir(), '.codex'),
|
|
24
|
+
agentsDir: 'skills',
|
|
25
|
+
commandsDir: 'skills',
|
|
26
|
+
skillsDir: 'skills',
|
|
27
|
+
supportsAgents: true,
|
|
28
|
+
supportsCommands: true,
|
|
29
|
+
supportsSkills: true,
|
|
30
|
+
},
|
|
21
31
|
cursor: {
|
|
22
32
|
name: 'Cursor',
|
|
23
33
|
globalDir: path.join(os.homedir(), '.cursor'),
|
|
@@ -63,6 +73,9 @@ export const getEditorDir = (target, scope = 'global') => {
|
|
|
63
73
|
if (target === 'claude') {
|
|
64
74
|
return path.join(process.cwd(), '.claude');
|
|
65
75
|
}
|
|
76
|
+
if (target === 'codex') {
|
|
77
|
+
return path.join(process.cwd(), '.codex');
|
|
78
|
+
}
|
|
66
79
|
if (target === 'cursor') {
|
|
67
80
|
return path.join(process.cwd(), '.cursor');
|
|
68
81
|
}
|
|
@@ -89,6 +102,9 @@ export const getEditorSkillsDir = (target, scope = 'global') => {
|
|
|
89
102
|
export const getClaudeDir = (scope = 'global') => {
|
|
90
103
|
return getEditorDir('claude', scope);
|
|
91
104
|
};
|
|
105
|
+
export const getCodexDir = (scope = 'global') => {
|
|
106
|
+
return getEditorDir('codex', scope);
|
|
107
|
+
};
|
|
92
108
|
export const getAgentsDir = (scope = 'global') => path.join(getClaudeDir(scope), 'agents');
|
|
93
109
|
export const getCommandsDir = (scope = 'global') => path.join(getClaudeDir(scope), 'commands');
|
|
94
110
|
export const getSkillsDir = (scope = 'global') => path.join(getClaudeDir(scope), 'skills');
|
|
@@ -220,6 +236,88 @@ export const listItems = (dir) => {
|
|
|
220
236
|
return [];
|
|
221
237
|
}
|
|
222
238
|
};
|
|
239
|
+
/**
|
|
240
|
+
* List skills in nested namespace form. For a directory laid out as
|
|
241
|
+
* <dir>/<group>/<action>/SKILL.md
|
|
242
|
+
* returns one item per <group>/<action> with name = "<group>:<action>".
|
|
243
|
+
* Top-level files or single-level folders are returned as-is for back-compat.
|
|
244
|
+
*/
|
|
245
|
+
export const listSkillsNested = (dir) => {
|
|
246
|
+
try {
|
|
247
|
+
if (!fs.existsSync(dir)) {
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
250
|
+
const items = [];
|
|
251
|
+
const topLevel = fs.readdirSync(dir);
|
|
252
|
+
for (const entry of topLevel) {
|
|
253
|
+
const entryPath = path.join(dir, entry);
|
|
254
|
+
let stat;
|
|
255
|
+
try {
|
|
256
|
+
stat = fs.lstatSync(entryPath);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const isSymlink = stat.isSymbolicLink();
|
|
262
|
+
const target = isSymlink ? safeReadlink(entryPath) : null;
|
|
263
|
+
const realStat = isSymlink ? safeStat(entryPath) : stat;
|
|
264
|
+
if (realStat?.isDirectory()) {
|
|
265
|
+
// Look one level deeper for nested skills (group/action/SKILL.md)
|
|
266
|
+
const groupDir = isSymlink ? fs.realpathSync(entryPath) : entryPath;
|
|
267
|
+
const inner = safeReaddir(groupDir);
|
|
268
|
+
const hasNestedSkills = inner.some((sub) => {
|
|
269
|
+
const subPath = path.join(groupDir, sub);
|
|
270
|
+
return (safeStat(subPath)?.isDirectory() &&
|
|
271
|
+
fs.existsSync(path.join(subPath, 'SKILL.md')));
|
|
272
|
+
});
|
|
273
|
+
if (hasNestedSkills) {
|
|
274
|
+
for (const action of inner) {
|
|
275
|
+
const actionPath = path.join(groupDir, action);
|
|
276
|
+
if (safeStat(actionPath)?.isDirectory() &&
|
|
277
|
+
fs.existsSync(path.join(actionPath, 'SKILL.md'))) {
|
|
278
|
+
items.push({
|
|
279
|
+
name: `${entry}:${action}`,
|
|
280
|
+
path: path.join(entryPath, action),
|
|
281
|
+
isSymlink,
|
|
282
|
+
target: target ? `${target}/${action}` : null,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
items.push({ name: entry, path: entryPath, isSymlink, target });
|
|
290
|
+
}
|
|
291
|
+
return items;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return [];
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
const safeStat = (p) => {
|
|
298
|
+
try {
|
|
299
|
+
return fs.statSync(p);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
const safeReadlink = (p) => {
|
|
306
|
+
try {
|
|
307
|
+
return fs.readlinkSync(p);
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
const safeReaddir = (p) => {
|
|
314
|
+
try {
|
|
315
|
+
return fs.readdirSync(p);
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return [];
|
|
319
|
+
}
|
|
320
|
+
};
|
|
223
321
|
export const getFiles = (dir, depth = 1) => {
|
|
224
322
|
const files = [];
|
|
225
323
|
if (!fs.existsSync(dir)) {
|
|
@@ -257,6 +355,8 @@ const getEditorPaths = (target) => {
|
|
|
257
355
|
switch (target) {
|
|
258
356
|
case 'cursor':
|
|
259
357
|
return { globalPath: '~/.cursor', projectPath: '.cursor' };
|
|
358
|
+
case 'codex':
|
|
359
|
+
return { globalPath: '~/.codex', projectPath: '.codex' };
|
|
260
360
|
case 'windsurf':
|
|
261
361
|
return { globalPath: '~/.codeium/windsurf/memories', projectPath: '.windsurf/rules' };
|
|
262
362
|
case 'antigravity':
|