devlyn-cli 0.5.8 → 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.
Files changed (19) hide show
  1. package/bin/devlyn.js +25 -51
  2. package/package.json +1 -2
  3. /package/config/{commands/devlyn.clean.md → skills/devlyn-clean/SKILL.md} +0 -0
  4. /package/config/{commands/devlyn.design-system.md → skills/devlyn-design-system/SKILL.md} +0 -0
  5. /package/config/{commands/devlyn.design-ui.md → skills/devlyn-design-ui/SKILL.md} +0 -0
  6. /package/config/{commands/devlyn.discover-product.md → skills/devlyn-discover-product/SKILL.md} +0 -0
  7. /package/config/{commands/devlyn.evaluate.md → skills/devlyn-evaluate/SKILL.md} +0 -0
  8. /package/config/{commands/devlyn.feature-spec.md → skills/devlyn-feature-spec/SKILL.md} +0 -0
  9. /package/config/{commands/devlyn.implement-ui.md → skills/devlyn-implement-ui/SKILL.md} +0 -0
  10. /package/config/{commands/devlyn.product-spec.md → skills/devlyn-product-spec/SKILL.md} +0 -0
  11. /package/config/{commands/devlyn.recommend-features.md → skills/devlyn-recommend-features/SKILL.md} +0 -0
  12. /package/config/{commands/devlyn.resolve.md → skills/devlyn-resolve/SKILL.md} +0 -0
  13. /package/config/{commands/devlyn.review.md → skills/devlyn-review/SKILL.md} +0 -0
  14. /package/config/{commands/devlyn.team-design-ui.md → skills/devlyn-team-design-ui/SKILL.md} +0 -0
  15. /package/config/{commands/devlyn.team-resolve.md → skills/devlyn-team-resolve/SKILL.md} +0 -0
  16. /package/config/{commands/devlyn.team-review.md → skills/devlyn-team-review/SKILL.md} +0 -0
  17. /package/config/{commands/devlyn.update-docs.md → skills/devlyn-update-docs/SKILL.md} +0 -0
  18. /package/{optional-commands/devlyn.pencil-sync/devlyn.pencil-pull.md → optional-skills/devlyn-pencil-pull/SKILL.md} +0 -0
  19. /package/{optional-commands/devlyn.pencil-sync/devlyn.pencil-push.md → optional-skills/devlyn-pencil-push/SKILL.md} +0 -0
package/bin/devlyn.js CHANGED
@@ -8,7 +8,6 @@ const { execSync } = require('child_process');
8
8
  const CONFIG_SOURCE = path.join(__dirname, '..', 'config');
9
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
- // Local optional commands (copied to .claude/commands/)
111
- { name: 'devlyn.pencil-sync', desc: 'Sync designs between codebase and Pencil (.pen files) via MCP', type: 'command' },
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 === 'command' ? 'cmd' : addon.type === 'local' ? 'skill' : 'pack';
215
- const tagColor = addon.type === 'command' ? COLORS.green : addon.type === 'local' ? COLORS.magenta : COLORS.cyan;
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 === 'command' ? 'cmd' : item.type === 'local' ? 'skill' : 'pack';
279
- const tagColor = item.type === 'command' ? COLORS.green : item.type === 'local' ? COLORS.magenta : COLORS.cyan;
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' || addon.type === 'command') {
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 commands & templates');
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.5.8",
3
+ "version": "0.6.0",
4
4
  "description": "Claude Code configuration toolkit for teams",
5
5
  "bin": {
6
6
  "devlyn": "bin/devlyn.js"
@@ -9,7 +9,6 @@
9
9
  "bin",
10
10
  "config",
11
11
  "agents-config",
12
- "optional-commands",
13
12
  "optional-skills",
14
13
  "CLAUDE.md"
15
14
  ],