devlyn-cli 1.1.1 → 1.2.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 (2) hide show
  1. package/bin/devlyn.js +45 -5
  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
 
@@ -521,10 +538,29 @@ async function init(skipPrompts = false) {
521
538
  }
522
539
  }
523
540
  if (!settings.env) settings.env = {};
541
+ // Auto-allow pipeline files so auto-resolve doesn't prompt for permission
542
+ if (!settings.permissions) settings.permissions = {};
543
+ if (!settings.permissions.allow) settings.permissions.allow = [];
544
+ const pipelinePermissions = [
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
+ ];
550
+ let settingsChanged = false;
551
+ for (const perm of pipelinePermissions) {
552
+ if (!settings.permissions.allow.includes(perm)) {
553
+ settings.permissions.allow.push(perm);
554
+ settingsChanged = true;
555
+ }
556
+ }
524
557
  if (!settings.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS) {
525
558
  settings.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = '1';
559
+ settingsChanged = true;
560
+ }
561
+ if (settingsChanged) {
526
562
  fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
527
- log(' → settings.json (agent teams enabled)', 'dim');
563
+ log(' → settings.json (agent teams + pipeline permissions)', 'dim');
528
564
  }
529
565
 
530
566
  // Install agents for other detected CLIs
@@ -588,6 +624,10 @@ function showHelp() {
588
624
  OPTIONAL_ADDONS.filter((a) => a.type === 'external').forEach((pack) => {
589
625
  log(` npx skills add ${pack.name}`);
590
626
  });
627
+ log('\nMCP servers:', 'green');
628
+ OPTIONAL_ADDONS.filter((a) => a.type === 'mcp').forEach((mcp) => {
629
+ log(` claude mcp add ${mcp.name} -- ${mcp.command} ${COLORS.dim}${mcp.desc}${COLORS.reset}`);
630
+ });
591
631
  log('\nSupported CLIs for agent installation:', 'green');
592
632
  for (const [key, cli] of Object.entries(CLI_TARGETS)) {
593
633
  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.1",
3
+ "version": "1.2.0",
4
4
  "description": "Claude Code configuration toolkit for teams",
5
5
  "bin": {
6
6
  "devlyn": "bin/devlyn.js"