scaffold-cli-command
О программе
Этот навык создает новый командный интерфейс Commander.js с единообразным дизайном опций, обработчиком действий и тремя режимами вывода (человекочитаемый, тихий, JSON). Он помогает разработчикам добавлять команды в существующий CLI, проектировать новый многокомандный CLI с нуля или стандартизировать структуру команд в проекте. Также включена поддержка обработки ошибок, общего контекста, интеграционных тестов и дополнительного церемониального варианта вывода.
Быстрая установка
Claude Code
Рекомендуетсяnpx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/scaffold-cli-commandСкопируйте и вставьте эту команду в Claude Code для установки этого навыка
Документация
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:
| Category | Verbs | Pattern |
|---|---|---|
| CRUD | install, uninstall, list, search | Operates on content |
| Lifecycle | init, sync, audit | Manages project state |
| Ceremony | gather, scatter, tend, campfire | Warm 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:
- Present tense, active ("mystic arrives", not "was installed")
- No exclamation
- Metaphor → jargon ("practices" not "deps")
- Failures honest, not catastrophic ("a spark was lost")
- Closing reflects state ("The fire burns.")
- No emoji — Unicode glyphs (✦ ◉ ◎ ○ ✗)
- 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
--yesfor destructive +--quietsuppresses. - Inconsistent exit codes: Use
process.exit(1)all errs. Tools check exit first. - Opts no defaults:
--scopeetc → 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 ontest-cli-application— comprehensive testing beyond Step 7design-cli-output— terminal design all verbosityinstall-almanac-content— well-structured CLI cmd example
GitHub репозиторий
Frequently asked questions
What is the scaffold-cli-command skill?
scaffold-cli-command is a Claude Skill by pjt222. Skills package instructions and resources that Claude loads on demand, so Claude can perform scaffold-cli-command-related tasks without extra prompting.
How do I install scaffold-cli-command?
Use the install commands on this page: add scaffold-cli-command to Claude Code as a plugin, or clone its repository into your skills directory, then restart Claude so it picks up the skill.
What category does scaffold-cli-command belong to?
scaffold-cli-command is in the Testing category, tagged testing and design.
Is scaffold-cli-command free to use?
Yes. scaffold-cli-command is listed on AIMCP and free to install. It runs inside Claude, so no separate service account is required to use the skill itself.
Похожие навыки
Этот навык Claude запускает lm-evaluation-harness для тестирования LLM на более чем 60 стандартизированных академических задачах, таких как MMLU и GSM8K. Он предназначен для разработчиков, чтобы сравнивать качество моделей, отслеживать прогресс обучения или сообщать академические результаты. Инструмент поддерживает различные бэкенды, включая модели HuggingFace и vLLM.
Этот навык предоставляет обширные знания по реализации Cloudflare Cron Triggers для планирования запуска Workers с помощью cron-выражений. Он охватывает настройку периодических задач, заданий технического обслуживания и автоматизированных рабочих процессов, а также решение распространенных проблем, таких как неверные cron-выражения и ошибки часовых поясов. Разработчики могут использовать его для настройки планировщиков обработчиков, тестирования cron-триггеров и интеграции с Workflows и Green Compute.
Этот навык Claude предоставляет инструментарий на базе Playwright для тестирования локальных веб-приложений с помощью Python-скриптов. Он позволяет проводить проверку фронтенда, отладку интерфейса, создание скриншотов и просмотр логов, одновременно управляя жизненным циклом сервера. Используйте его для задач автоматизации браузера, но запускайте скрипты напрямую, вместо чтения их исходного кода, чтобы избежать загрязнения контекста.
Этот навык помогает разработчикам завершать готовую работу, проверяя прохождение тестов и предлагая структурированные варианты интеграции. Он направляет рабочий процесс по слиянию, созданию пул-реквестов или очистке веток после завершения реализации. Используйте его, когда ваш код готов и протестирован, чтобы систематически завершать процесс разработки.
