devlyn-cli 0.5.7 → 0.6.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/bin/devlyn.js +26 -52
- package/package.json +2 -2
- /package/{config/agents → agents-config}/evaluator.md +0 -0
- /package/config/{commands/devlyn.clean.md → skills/devlyn-clean/SKILL.md} +0 -0
- /package/config/{commands/devlyn.design-system.md → skills/devlyn-design-system/SKILL.md} +0 -0
- /package/config/{commands/devlyn.design-ui.md → skills/devlyn-design-ui/SKILL.md} +0 -0
- /package/config/{commands/devlyn.discover-product.md → skills/devlyn-discover-product/SKILL.md} +0 -0
- /package/config/{commands/devlyn.evaluate.md → skills/devlyn-evaluate/SKILL.md} +0 -0
- /package/config/{commands/devlyn.feature-spec.md → skills/devlyn-feature-spec/SKILL.md} +0 -0
- /package/config/{commands/devlyn.implement-ui.md → skills/devlyn-implement-ui/SKILL.md} +0 -0
- /package/config/{commands/devlyn.product-spec.md → skills/devlyn-product-spec/SKILL.md} +0 -0
- /package/config/{commands/devlyn.recommend-features.md → skills/devlyn-recommend-features/SKILL.md} +0 -0
- /package/config/{commands/devlyn.resolve.md → skills/devlyn-resolve/SKILL.md} +0 -0
- /package/config/{commands/devlyn.review.md → skills/devlyn-review/SKILL.md} +0 -0
- /package/config/{commands/devlyn.team-design-ui.md → skills/devlyn-team-design-ui/SKILL.md} +0 -0
- /package/config/{commands/devlyn.team-resolve.md → skills/devlyn-team-resolve/SKILL.md} +0 -0
- /package/config/{commands/devlyn.team-review.md → skills/devlyn-team-review/SKILL.md} +0 -0
- /package/config/{commands/devlyn.update-docs.md → skills/devlyn-update-docs/SKILL.md} +0 -0
- /package/{optional-commands/devlyn.pencil-sync/devlyn.pencil-pull.md → optional-skills/devlyn-pencil-pull/SKILL.md} +0 -0
- /package/{optional-commands/devlyn.pencil-sync/devlyn.pencil-push.md → optional-skills/devlyn-pencil-push/SKILL.md} +0 -0
package/bin/devlyn.js
CHANGED
|
@@ -6,9 +6,8 @@ const readline = require('readline');
|
|
|
6
6
|
const { execSync } = require('child_process');
|
|
7
7
|
|
|
8
8
|
const CONFIG_SOURCE = path.join(__dirname, '..', 'config');
|
|
9
|
-
const AGENTS_SOURCE = path.join(__dirname, '..', 'config'
|
|
9
|
+
const AGENTS_SOURCE = path.join(__dirname, '..', 'agents-config');
|
|
10
10
|
const OPTIONAL_SKILLS_SOURCE = path.join(__dirname, '..', 'optional-skills');
|
|
11
|
-
const OPTIONAL_COMMANDS_SOURCE = path.join(__dirname, '..', 'optional-commands');
|
|
12
11
|
const PKG = require('../package.json');
|
|
13
12
|
|
|
14
13
|
// Cross-CLI agent installation targets
|
|
@@ -49,6 +48,23 @@ const CLI_TARGETS = {
|
|
|
49
48
|
// Files removed in previous versions that should be cleaned up on upgrade
|
|
50
49
|
const DEPRECATED_FILES = [
|
|
51
50
|
'commands/devlyn.handoff.md', // removed in v0.2.0
|
|
51
|
+
'commands/devlyn.clean.md', // migrated to skills in v0.6.0
|
|
52
|
+
'commands/devlyn.design-system.md',
|
|
53
|
+
'commands/devlyn.design-ui.md',
|
|
54
|
+
'commands/devlyn.discover-product.md',
|
|
55
|
+
'commands/devlyn.evaluate.md',
|
|
56
|
+
'commands/devlyn.feature-spec.md',
|
|
57
|
+
'commands/devlyn.implement-ui.md',
|
|
58
|
+
'commands/devlyn.product-spec.md',
|
|
59
|
+
'commands/devlyn.recommend-features.md',
|
|
60
|
+
'commands/devlyn.resolve.md',
|
|
61
|
+
'commands/devlyn.review.md',
|
|
62
|
+
'commands/devlyn.team-design-ui.md',
|
|
63
|
+
'commands/devlyn.team-resolve.md',
|
|
64
|
+
'commands/devlyn.team-review.md',
|
|
65
|
+
'commands/devlyn.update-docs.md',
|
|
66
|
+
'commands/devlyn.pencil-pull.md', // migrated to skills/devlyn-pencil-pull
|
|
67
|
+
'commands/devlyn.pencil-push.md', // migrated to skills/devlyn-pencil-push
|
|
52
68
|
];
|
|
53
69
|
|
|
54
70
|
function getTargetDir() {
|
|
@@ -107,8 +123,8 @@ const OPTIONAL_ADDONS = [
|
|
|
107
123
|
{ name: 'better-auth-setup', desc: 'Production-ready Better Auth + Hono + Drizzle + PostgreSQL auth setup', type: 'local' },
|
|
108
124
|
{ name: 'pyx-scan', desc: 'Check whether an AI agent skill is safe before installing', type: 'local' },
|
|
109
125
|
{ name: 'dokkit', desc: 'Document template filling for DOCX/HWPX — ingest, fill, review, export', type: 'local' },
|
|
110
|
-
|
|
111
|
-
{ name: 'devlyn
|
|
126
|
+
{ name: 'devlyn-pencil-pull', desc: 'Pull Pencil designs into code with exact visual fidelity', type: 'local' },
|
|
127
|
+
{ name: 'devlyn-pencil-push', desc: 'Push codebase UI to Pencil canvas for design sync', type: 'local' },
|
|
112
128
|
// External skill packs (installed via npx skills add)
|
|
113
129
|
{ name: 'vercel-labs/agent-skills', desc: 'React, Next.js, React Native best practices', type: 'external' },
|
|
114
130
|
{ name: 'supabase/agent-skills', desc: 'Supabase integration patterns', type: 'external' },
|
|
@@ -160,24 +176,9 @@ function listContents() {
|
|
|
160
176
|
showLogo();
|
|
161
177
|
log('─'.repeat(44), 'dim');
|
|
162
178
|
|
|
163
|
-
const commandsDir = path.join(CONFIG_SOURCE, 'commands');
|
|
164
179
|
const templatesDir = path.join(CONFIG_SOURCE, 'templates');
|
|
165
180
|
const skillsDir = path.join(CONFIG_SOURCE, 'skills');
|
|
166
181
|
|
|
167
|
-
// List commands
|
|
168
|
-
if (fs.existsSync(commandsDir)) {
|
|
169
|
-
const commands = fs.readdirSync(commandsDir).filter((f) => f.endsWith('.md'));
|
|
170
|
-
if (commands.length > 0) {
|
|
171
|
-
log('\n📋 Commands:', 'cyan');
|
|
172
|
-
commands.forEach((file) => {
|
|
173
|
-
const name = file.replace('.md', '').replace('devlyn.', '/');
|
|
174
|
-
const desc = getDescription(path.join(commandsDir, file));
|
|
175
|
-
log(` ${COLORS.green}${name}${COLORS.reset}`);
|
|
176
|
-
if (desc) log(` ${COLORS.dim}${desc}${COLORS.reset}`);
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
182
|
// List templates
|
|
182
183
|
if (fs.existsSync(templatesDir)) {
|
|
183
184
|
const templates = fs.readdirSync(templatesDir).filter((f) => f.endsWith('.md'));
|
|
@@ -211,8 +212,8 @@ function listContents() {
|
|
|
211
212
|
// List optional addons
|
|
212
213
|
log('\n📦 Optional Addons:', 'blue');
|
|
213
214
|
OPTIONAL_ADDONS.forEach((addon) => {
|
|
214
|
-
const tagLabel = addon.type === '
|
|
215
|
-
const tagColor = addon.type === '
|
|
215
|
+
const tagLabel = addon.type === 'local' ? 'skill' : 'pack';
|
|
216
|
+
const tagColor = addon.type === 'local' ? COLORS.magenta : COLORS.cyan;
|
|
216
217
|
const tag = `${tagColor}${tagLabel}${COLORS.reset}`;
|
|
217
218
|
log(` ${COLORS.green}${addon.name}${COLORS.reset} ${COLORS.dim}[${tag}${COLORS.dim}]${COLORS.reset}`);
|
|
218
219
|
log(` ${COLORS.dim}${addon.desc}${COLORS.reset}`);
|
|
@@ -275,8 +276,8 @@ function multiSelect(items) {
|
|
|
275
276
|
const checkbox = selected.has(i) ? `${COLORS.green}◉${COLORS.reset}` : `${COLORS.dim}○${COLORS.reset}`;
|
|
276
277
|
const pointer = i === cursor ? `${COLORS.cyan}❯${COLORS.reset}` : ' ';
|
|
277
278
|
const name = i === cursor ? `${COLORS.cyan}${item.name}${COLORS.reset}` : item.name;
|
|
278
|
-
const tagLabel = item.type === '
|
|
279
|
-
const tagColor = item.type === '
|
|
279
|
+
const tagLabel = item.type === 'local' ? 'skill' : 'pack';
|
|
280
|
+
const tagColor = item.type === 'local' ? COLORS.magenta : COLORS.cyan;
|
|
280
281
|
const tag = `${tagColor}${tagLabel}${COLORS.reset}`;
|
|
281
282
|
console.log(`${pointer} ${checkbox} ${name} ${COLORS.dim}[${tag}${COLORS.dim}]${COLORS.reset}`);
|
|
282
283
|
console.log(` ${COLORS.dim}${item.desc}${COLORS.reset}`);
|
|
@@ -363,30 +364,6 @@ function installLocalSkill(skillName) {
|
|
|
363
364
|
return true;
|
|
364
365
|
}
|
|
365
366
|
|
|
366
|
-
function installLocalCommand(commandName) {
|
|
367
|
-
const src = path.join(OPTIONAL_COMMANDS_SOURCE, commandName);
|
|
368
|
-
const targetDir = getTargetDir();
|
|
369
|
-
const destDir = path.join(targetDir, 'commands');
|
|
370
|
-
|
|
371
|
-
if (!fs.existsSync(src)) {
|
|
372
|
-
log(` ⚠️ Command pack "${commandName}" not found`, 'yellow');
|
|
373
|
-
return false;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
log(`\n📋 Installing ${commandName} commands...`, 'cyan');
|
|
377
|
-
|
|
378
|
-
if (!fs.existsSync(destDir)) {
|
|
379
|
-
fs.mkdirSync(destDir, { recursive: true });
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
const files = fs.readdirSync(src).filter((f) => f.endsWith('.md'));
|
|
383
|
-
for (const file of files) {
|
|
384
|
-
fs.copyFileSync(path.join(src, file), path.join(destDir, file));
|
|
385
|
-
log(` → commands/${file}`, 'dim');
|
|
386
|
-
}
|
|
387
|
-
return true;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
367
|
function installSkillPack(packName) {
|
|
391
368
|
try {
|
|
392
369
|
log(`\n📦 Installing ${packName}...`, 'cyan');
|
|
@@ -402,9 +379,6 @@ function installAddon(addon) {
|
|
|
402
379
|
if (addon.type === 'local') {
|
|
403
380
|
return installLocalSkill(addon.name);
|
|
404
381
|
}
|
|
405
|
-
if (addon.type === 'command') {
|
|
406
|
-
return installLocalCommand(addon.name);
|
|
407
|
-
}
|
|
408
382
|
return installSkillPack(addon.name);
|
|
409
383
|
}
|
|
410
384
|
|
|
@@ -540,7 +514,7 @@ async function init(skipPrompts = false) {
|
|
|
540
514
|
if (skipPrompts || !process.stdin.isTTY) {
|
|
541
515
|
log('\n💡 Add optional addons later:', 'dim');
|
|
542
516
|
OPTIONAL_ADDONS.forEach((addon) => {
|
|
543
|
-
if (addon.type === 'local'
|
|
517
|
+
if (addon.type === 'local') {
|
|
544
518
|
log(` npx devlyn-cli (select "${addon.name}" during install)`, 'dim');
|
|
545
519
|
} else {
|
|
546
520
|
log(` npx skills add ${addon.name}`, 'dim');
|
|
@@ -572,7 +546,7 @@ function showHelp() {
|
|
|
572
546
|
showLogo();
|
|
573
547
|
log('Usage:', 'green');
|
|
574
548
|
log(' npx devlyn-cli Install/update .claude config');
|
|
575
|
-
log(' npx devlyn-cli list List available
|
|
549
|
+
log(' npx devlyn-cli list List available skills & templates');
|
|
576
550
|
log(' npx devlyn-cli -y Install without prompts');
|
|
577
551
|
log(' npx devlyn-cli agents Install agents for detected CLIs');
|
|
578
552
|
log(' npx devlyn-cli agents all Install agents for all supported CLIs');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devlyn-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Claude Code configuration toolkit for teams",
|
|
5
5
|
"bin": {
|
|
6
6
|
"devlyn": "bin/devlyn.js"
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"files": [
|
|
9
9
|
"bin",
|
|
10
10
|
"config",
|
|
11
|
-
"
|
|
11
|
+
"agents-config",
|
|
12
12
|
"optional-skills",
|
|
13
13
|
"CLAUDE.md"
|
|
14
14
|
],
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/config/{commands/devlyn.discover-product.md → skills/devlyn-discover-product/SKILL.md}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/config/{commands/devlyn.recommend-features.md → skills/devlyn-recommend-features/SKILL.md}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|