devlyn-cli 1.1.2 → 1.2.1

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 (2) hide show
  1. package/bin/devlyn.js +34 -8
  2. package/package.json +1 -1
package/bin/devlyn.js CHANGED
@@ -152,6 +152,8 @@ const OPTIONAL_ADDONS = [
152
152
  { name: 'coreyhaines31/marketingskills', desc: 'Marketing automation and content skills', type: 'external' },
153
153
  { name: 'anthropics/skills', desc: 'Official Anthropic skill-creator with eval framework and description optimizer', type: 'external' },
154
154
  { name: 'Leonxlnx/taste-skill', desc: 'Premium frontend design skills — modern layouts, animations, and visual refinement', type: 'external' },
155
+ // MCP servers (installed via claude mcp add)
156
+ { name: 'codex-cli', desc: 'Codex MCP server for cross-model evaluation via OpenAI Codex', type: 'mcp', command: 'npx -y codex-mcp-server' },
155
157
  ];
156
158
 
157
159
  function log(msg, color = 'reset') {
@@ -233,8 +235,8 @@ function listContents() {
233
235
  // List optional addons
234
236
  log('\nšŸ“¦ Optional Addons:', 'blue');
235
237
  OPTIONAL_ADDONS.forEach((addon) => {
236
- const tagLabel = addon.type === 'local' ? 'skill' : 'pack';
237
- const tagColor = addon.type === 'local' ? COLORS.magenta : COLORS.cyan;
238
+ const tagLabel = addon.type === 'mcp' ? 'mcp' : addon.type === 'local' ? 'skill' : 'pack';
239
+ const tagColor = addon.type === 'mcp' ? COLORS.green : addon.type === 'local' ? COLORS.magenta : COLORS.cyan;
238
240
  const tag = `${tagColor}${tagLabel}${COLORS.reset}`;
239
241
  log(` ${COLORS.green}${addon.name}${COLORS.reset} ${COLORS.dim}[${tag}${COLORS.dim}]${COLORS.reset}`);
240
242
  log(` ${COLORS.dim}${addon.desc}${COLORS.reset}`);
@@ -305,8 +307,8 @@ function multiSelect(items) {
305
307
  const checkbox = selected.has(i) ? `${COLORS.green}ā—‰${COLORS.reset}` : `${COLORS.dim}ā—‹${COLORS.reset}`;
306
308
  const pointer = i === cursor ? `${COLORS.cyan}āÆ${COLORS.reset}` : ' ';
307
309
  const name = i === cursor ? `${COLORS.cyan}${item.name}${COLORS.reset}` : item.name;
308
- const tagLabel = item.type === 'local' ? 'skill' : 'pack';
309
- const tagColor = item.type === 'local' ? COLORS.magenta : COLORS.cyan;
310
+ const tagLabel = item.type === 'mcp' ? 'mcp' : item.type === 'local' ? 'skill' : 'pack';
311
+ const tagColor = item.type === 'mcp' ? COLORS.green : item.type === 'local' ? COLORS.magenta : COLORS.cyan;
310
312
  const tag = `${tagColor}${tagLabel}${COLORS.reset}`;
311
313
  console.log(`${pointer} ${checkbox} ${name} ${COLORS.dim}[${tag}${COLORS.dim}]${COLORS.reset}`);
312
314
  console.log(` ${COLORS.dim}${item.desc}${COLORS.reset}`);
@@ -393,6 +395,18 @@ function installLocalSkill(skillName) {
393
395
  return true;
394
396
  }
395
397
 
398
+ function installMcpServer(name, command) {
399
+ try {
400
+ log(`\nšŸ”Œ Installing MCP server: ${name}...`, 'cyan');
401
+ execSync(`claude mcp add ${name} -- ${command}`, { stdio: 'inherit' });
402
+ return true;
403
+ } catch (error) {
404
+ log(` āš ļø Failed to install MCP server "${name}"`, 'yellow');
405
+ log(` Run manually: claude mcp add ${name} -- ${command}`, 'dim');
406
+ return false;
407
+ }
408
+ }
409
+
396
410
  function installSkillPack(packName) {
397
411
  try {
398
412
  log(`\nšŸ“¦ Installing ${packName}...`, 'cyan');
@@ -408,6 +422,9 @@ function installAddon(addon) {
408
422
  if (addon.type === 'local') {
409
423
  return installLocalSkill(addon.name);
410
424
  }
425
+ if (addon.type === 'mcp') {
426
+ return installMcpServer(addon.name, addon.command);
427
+ }
411
428
  return installSkillPack(addon.name);
412
429
  }
413
430
 
@@ -525,10 +542,15 @@ async function init(skipPrompts = false) {
525
542
  if (!settings.permissions) settings.permissions = {};
526
543
  if (!settings.permissions.allow) settings.permissions.allow = [];
527
544
  const pipelinePermissions = [
528
- 'Write:.claude/done-criteria.md',
529
- 'Write:.claude/EVAL-FINDINGS.md',
530
- 'Edit:.claude/done-criteria.md',
531
- 'Edit:.claude/EVAL-FINDINGS.md',
545
+ 'Write(.claude/done-criteria.md)',
546
+ 'Write(.claude/EVAL-FINDINGS.md)',
547
+ 'Edit(.claude/done-criteria.md)',
548
+ 'Edit(.claude/EVAL-FINDINGS.md)',
549
+ 'Bash(git add *)',
550
+ 'Bash(git commit *)',
551
+ 'Bash(git diff *)',
552
+ 'Bash(git status *)',
553
+ 'Bash(git log *)',
532
554
  ];
533
555
  let settingsChanged = false;
534
556
  for (const perm of pipelinePermissions) {
@@ -607,6 +629,10 @@ function showHelp() {
607
629
  OPTIONAL_ADDONS.filter((a) => a.type === 'external').forEach((pack) => {
608
630
  log(` npx skills add ${pack.name}`);
609
631
  });
632
+ log('\nMCP servers:', 'green');
633
+ OPTIONAL_ADDONS.filter((a) => a.type === 'mcp').forEach((mcp) => {
634
+ log(` claude mcp add ${mcp.name} -- ${mcp.command} ${COLORS.dim}${mcp.desc}${COLORS.reset}`);
635
+ });
610
636
  log('\nSupported CLIs for agent installation:', 'green');
611
637
  for (const [key, cli] of Object.entries(CLI_TARGETS)) {
612
638
  log(` ${key.padEnd(10)} ${cli.name}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devlyn-cli",
3
- "version": "1.1.2",
3
+ "version": "1.2.1",
4
4
  "description": "Claude Code configuration toolkit for teams",
5
5
  "bin": {
6
6
  "devlyn": "bin/devlyn.js"