MCP HubMCP Hub
Volver a habilidades

scaffold-cli-command

pjt222
Actualizado Yesterday
1 vistas
17
2
17
Ver en GitHub
Pruebastestingdesign

Acerca de

Esta habilidad estructura un nuevo comando CLI de Commander.js con un diseño de opciones consistente, un manejador de acciones y tres modos de salida (humano, silencioso, JSON). Ayuda a los desarrolladores a agregar comandos a una CLI existente, diseñar una nueva CLI multicomando desde cero o estandarizar la estructura de comandos en un proyecto. También incluye soporte para manejo de errores, contexto compartido, pruebas de integración y una variante opcional de salida ceremonial.

Instalación rápida

Claude Code

Recomendado
Principal
npx skills add pjt222/agent-almanac -a claude-code
Comando PluginAlternativo
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternativo
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/scaffold-cli-command

Copia y pega este comando en Claude Code para instalar esta habilidad

Documentación

Scaffold a CLI Command

Add cmd → Commander.js CLI w/ consistent opts, 3 output modes, integ tests.

Use When

  • Add cmd to existing Commander.js CLI
  • Design multi-cmd CLI from scratch
  • Standardize cmd structure → all same patterns
  • Add ceremony variant → warm narrative output

In

  • Required: Cmd name + verb (gather, audit, sync)
  • Required: What cmd does (1 sentence)
  • Required: CLI entry path (cli/index.js)
  • Optional: Ceremony variant needed?
  • Optional: Custom opts beyond standard
  • Optional: Subcmd args (<name>|[names...])

Do

Step 1: Cmd Name + Category

Verb communicates action. Group:

CategoryVerbsPattern
CRUDinstall, uninstall, list, searchOperates on content
Lifecycleinit, sync, auditManages project state
Ceremonygather, scatter, tend, campfireWarm narrative output

Conventions:

  • Single verb (not install-skill — opts specify what)
  • Lowercase, no hyphens in cmd name
  • Positional: <required>|[optional]|[variadic...]
program
  .command('gather <name>')
  .description('Gather a team around the campfire')

→ Cmd name, desc, positional args defined.

If err: verb overlaps existing → compose (add opt to existing) or differentiate in desc.

Step 2: Opts

Standard set + cmd-specific.

Standard (as needed):

  .option('-n, --dry-run', 'Preview without making changes')
  .option('-q, --quiet', 'Suppress human-readable output')
  .option('--json', 'Output as JSON')
  .option('-f, --framework <id>', 'Target specific framework')
  .option('-g, --global', 'Use global scope')
  .option('--scope <scope>', 'Scope: project, workspace, global', 'project')
  .option('--source <path>', 'Path to tool root directory')

Cmd-specific — only what needed:

  .option('--ceremonial', 'Show each item arriving individually')
  .option('--only <items>', 'Comma-separated subset to include')
  .option('-y, --yes', 'Skip confirmation prompts')

Rules:

  • Short flags (-n) for frequent
  • Long (--dry-run) for clarity
  • Default vals as 3rd arg
  • Booleans for toggles

→ Complete opt chain w/ standard + custom.

If err: too many opts (>8) → split into subcmds or group related.

Step 3: Action Handler

Consistent pattern:

.action(async (name, options) => {
  // 1. Get shared context (registries, adapters, paths)
  const ctx = getContext(options);

  // 2. Resolve what to operate on
  const items = resolveItems(ctx, name, options);
  if (!items || items.length === 0) {
    reporter.error('Nothing found.');
    process.exit(1);
  }

  // 3. Preview if dry-run
  if (options.dryRun) reporter.printDryRun();

  // 4. Execute the operation
  const results = await executeOperation(items, ctx, options);

  // 5. Output results (3 modes)
  if (options.json) {
    console.log(JSON.stringify(results, null, 2));
  } else if (options.quiet) {
    reporter.printResults(results);
  } else {
    printHumanOutput(results, options);
  }
})

getContext() shared helper centralizes:

  • Root dir detection
  • Registry loading
  • Framework detection|explicit
  • Scope resolution

→ Handler follows 5-step: ctx → resolve → preview → exec → output.

If err: cmd doesn't fit resolve-then-exec (purely informational like detect) → simplify: ctx → compute → output.

Step 4: 3 Output Modes

Default (human):

Installing 3 item(s) to Claude Code...

  + create-skill [claude-code] .claude/skills/create-skill
  + write-tests  [claude-code] .claude/skills/write-tests
  = commit-changes [claude-code] (skipped)

  2 installed, 1 skipped

Quiet (--quiet): Standard reporter — concise lines w/ status icons (+, -, =, !), no ceremony, no decoration.

JSON (--json):

{
  "command": "install",
  "items": 3,
  "installed": 2,
  "skipped": 1,
  "failed": 0
}

Pattern:

if (options.json) {
  console.log(JSON.stringify(data, null, 2));
  return;
}
if (options.quiet) {
  reporter.printResults(results);
  return;
}
// Default: human-readable output
printHumanReadable(results, options);

→ All 3 modes useful. JSON parseable. Quiet concise. Default informative.

If err: no meaningful JSON (detect) → skip + document why.

Step 5: Ceremony Variant (Optional)

For cmds benefiting from warm narrative:

if (options.json) {
  ceremonyReporter.printJson(data);
} else if (options.quiet) {
  reporter.printResults(results);
} else {
  ceremonyReporter.printArrival({
    teamId: name,
    agents,
    results: { installed, skipped, failed },
    ceremonial: options.ceremonial || false,
  });
}

Voice rules:

  1. Present tense, active ("mystic arrives", not "was installed")
  2. No exclamation
  3. Metaphor → jargon ("practices" not "deps")
  4. Failures honest, not catastrophic ("a spark was lost")
  5. Closing reflects state ("The fire burns.")
  6. No emoji — Unicode glyphs (✦ ◉ ◎ ○ ✗)
  7. Every word carries info

See design-cli-output skill for terminal patterns.

→ Ceremony follows voice rules → warm informative narratives.

If err: ceremony forced or doesn't add info → skip. Not every cmd needs.

Step 6: Errs + Edge Cases

// Unknown item
if (!item) {
  reporter.error(`Unknown: ${name}. Use 'tool list' to browse.`);
  process.exit(1);
}

// Confirmation for destructive actions
if (!options.yes && !options.quiet && !options.dryRun) {
  const answer = await askYesNo('Proceed?');
  if (!answer) {
    console.log('  Cancelled.');
    return;
  }
}

// State validation
if (!state.fires[name]) {
  reporter.error(`Not active. Nothing to remove.`);
  process.exit(1);
}

Err design:

  • Msgs suggest corrective action
  • process.exit(1) for unrecoverable
  • Confirm for destructive (bypass --yes)
  • Dry-run always succeeds (no confirm block)

→ All err paths helpful. Destructive needs confirm.

If err: confirm prompts break scripting → ensure --yes + --quiet bypass both.

Step 7: Integ Tests

import { describe, it, after } from 'node:test';
import assert from 'node:assert/strict';
import { execSync } from 'child_process';

const CLI = 'node cli/index.js';
function run(args) {
  return execSync(`${CLI} ${args}`, { encoding: 'utf8', timeout: 10000 });
}

describe('new-command', () => {
  after(() => { /* cleanup created files/state */ });

  it('dry-run shows preview', () => {
    const out = run('new-command arg --dry-run');
    assert.match(out, /DRY RUN/);
  });

  it('--json outputs valid JSON', () => {
    const out = run('new-command arg --json');
    const start = out.indexOf('{');
    const data = JSON.parse(out.slice(start));
    assert.equal(data.command, 'new-command');
  });

  it('rejects unknown input', () => {
    assert.throws(() => run('new-command nonexistent'), /Unknown/);
  });
});

See test-cli-application for comprehensive patterns.

→ ≥3 tests: dry-run, JSON, err. More for complex.

If err: execSync timeout → ↑timeout or check for interactive prompts blocking.

Check

  • Cmd registered in entry + --help
  • Standard opts (--dry-run, --quiet, --json) work
  • Default human + informative
  • JSON valid + parseable
  • Err msgs suggest fix
  • Destructive needs confirm (bypass --yes)
  • ≥3 integ tests pass
  • Cmd follows getContext → resolve → exec → output

Traps

  • Forget JSON: Machine consumers (scripts, CI) need structured. Always impl --json.
  • Confirm blocks scripts: Any prompt hangs non-interactive. Always provide --yes for destructive + --quiet suppresses.
  • Inconsistent exit codes: Use process.exit(1) all errs. Tools check exit first.
  • Opts no defaults: --scope etc → sensible defaults so users don't specify each time.
  • Ceremony in quiet mode: --quiet = "min output for machines". Ceremony leak → scripts break.

  • build-cli-plugin — build adapter/plugin cmds operate on
  • test-cli-application — comprehensive testing beyond Step 7
  • design-cli-output — terminal design all verbosity
  • install-almanac-content — well-structured CLI cmd example

Repositorio GitHub

pjt222/agent-almanac
Ruta: i18n/caveman-ultra/skills/scaffold-cli-command
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Habilidades relacionadas

evaluating-llms-harness

Pruebas

Esta Skill de Claude ejecuta el benchmark lm-evaluation-harness para evaluar modelos de lenguaje en más de 60 tareas académicas estandarizadas como MMLU y GSM8K. Está diseñada para que los desarrolladores comparen la calidad de los modelos, realicen seguimiento del progreso del entrenamiento o reporten resultados académicos. La herramienta admite varios backends, incluidos modelos de HuggingFace y vLLM.

Ver habilidad

cloudflare-cron-triggers

Pruebas

Esta habilidad proporciona conocimiento integral para implementar Cron Triggers de Cloudflare y programar Workers mediante expresiones cron. Cubre la configuración de tareas periódicas, trabajos de mantenimiento y flujos de trabajo automatizados, manejando problemas comunes como expresiones cron inválidas y inconvenientes de zonas horarias. Los desarrolladores pueden utilizarla para configurar manejadores programados, probar activadores cron e integrar con Workflows y Green Compute.

Ver habilidad

webapp-testing

Pruebas

Esta habilidad de Claude proporciona un kit de herramientas basado en Playwright para probar aplicaciones web locales mediante scripts de Python. Permite verificación de frontend, depuración de interfaz de usuario, captura de pantallas y visualización de registros, mientras gestiona los ciclos de vida del servidor. Úsela para tareas de automatización de navegadores, pero ejecute los scripts directamente en lugar de leer su código fuente para evitar contaminación del contexto.

Ver habilidad

finishing-a-development-branch

Pruebas

Esta habilidad ayuda a los desarrolladores a completar el trabajo terminado verificando que las pruebas pasen y luego presentando opciones estructuradas de integración. Guía el flujo de trabajo para fusionar, crear PRs o limpiar ramas después de que se completa la implementación. Úsala cuando tu código esté listo y probado para finalizar sistemáticamente el proceso de desarrollo.

Ver habilidad