MCP HubMCP Hub
스킬 목록으로 돌아가기

scaffold-cli-command

pjt222
업데이트됨 Yesterday
6 조회
17
2
17
GitHub에서 보기
테스팅testingdesign

정보

이 스킬은 새로운 Commander.js CLI 명령어를 완전한 구조로 구성합니다. 옵션 처리, 세 가지 출력 모드(가독성 높은 형태, JSON, 무음 모드) 및 오류 관리를 포함하며, 기존 CLI에 명령어를 추가하거나 새 도구를 처음부터 구축하거나 다중 명령어 애플리케이션 간 패턴을 표준화하는 데 적합합니다. 생성된 코드는 명명 규칙, 공유 컨텍스트, 액션 핸들러 및 통합 테스트를 다룹니다.

빠른 설치

Claude Code

추천
기본
npx skills add pjt222/agent-almanac -a claude-code
플러그인 명령대체
/plugin add https://github.com/pjt222/agent-almanac
Git 클론대체
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/scaffold-cli-command

Claude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서

CLI-Befehl scaffolden

Einen neuen Befehl zu einer Commander.js-CLI-Anwendung mit konsistenter Options-Behandlung, drei Ausgabe-Modi und Integrations-Tests hinzufuegen.

Wann verwenden

  • Hinzufuegen eines neuen Befehls zu einer existierenden Commander.js-CLI
  • Entwerfen eines Multi-Befehl-CLI-Tools von Grund auf
  • Standardisieren der Befehls-Struktur damit alle Befehle denselben Mustern folgen
  • Hinzufuegen einer "Zeremonie"-Variante die Maschinen-Ausgabe mit warmer, narrativer Ausgabe ersetzt

Eingaben

  • Erforderlich: Befehlsname und -verb (z.B. gather, audit, sync)
  • Erforderlich: Was der Befehl tut (ein Satz)
  • Erforderlich: Pfad zum CLI-Eintrittspunkt (z.B. cli/index.js)
  • Optional: Ob der Befehl eine Zeremonie-Variante braucht (warme narrative Ausgabe)
  • Optional: Custom-Optionen ueber das Standard-Set hinaus
  • Optional: Subbefehl-Argumente (positionelle Args wie <name> oder [names...])

Vorgehensweise

Schritt 1: Befehlsname und Kategorie waehlen

Ein Verb auswaehlen das die Aktion des Befehls kommuniziert. Befehle in Kategorien gruppieren:

KategorieVerbenMuster
CRUDinstall, uninstall, list, searchOperiert auf Inhalt
Lifecycleinit, sync, auditVerwaltet Projekt-State
Zeremoniegather, scatter, tend, campfireWarme narrative Ausgabe

Namens-Konventionen:

  • Ein einzelnes Verb verwenden (nicht install-skill — Optionen spezifizieren lassen was)
  • Kleinbuchstaben verwenden, keine Bindestriche im Befehlsnamen selbst
  • Positionelle Args: <required> oder [optional] oder [variadic...]
program
  .command('gather <name>')
  .description('Gather a team around the campfire')

Erwartet: Ein Befehlsname, eine Beschreibung und positionelle Args definiert.

Bei Fehler: Wenn das Verb mit einem existierenden Befehl ueberlappt, sie entweder komponieren (eine Option zum existierenden Befehl hinzufuegen) oder klar in der Beschreibung differenzieren.

Schritt 2: Optionen definieren

Jeder Befehl sollte ein Standard-Set geteilter Optionen plus befehl-spezifische unterstuetzen.

Standard-Optionen (nach Bedarf einbeziehen):

  .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')

Befehl-spezifische Optionen — nur hinzufuegen was der Befehl braucht:

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

Design-Regeln:

  • Kurze Flags (-n) fuer haeufig genutzte Optionen
  • Lange Flags (--dry-run) fuer Klarheit
  • Default-Werte als drittes Argument wo angemessen
  • Boolesche Flags (kein Argument) fuer Toggles

Erwartet: Eine vollstaendige Options-Kette mit beiden Standard- und Custom-Optionen.

Bei Fehler: Wenn zu viele Optionen akkumulieren (>8), in Erwaegung ziehen in Subbefehle aufzuteilen oder verwandte Optionen zu gruppieren.

Schritt 3: Den Action-Handler implementieren

Der Action-Handler folgt einem konsistenten Muster:

.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);
  }
})

Der getContext()-Shared-Helper zentralisiert:

  • Root-Verzeichnis-Detection
  • Registry-Laden
  • Framework-Detection oder explizite Auswahl
  • Scope-Aufloesung

Erwartet: Ein Action-Handler der dem 5-Schritte-Muster folgt: Kontext → Aufloesen → Vorschau → Ausfuehren → Ausgabe.

Bei Fehler: Wenn der Befehl nicht in das Resolve-then-Execute-Muster passt (z.B. er ist rein informationell wie detect), vereinfachen zu: Kontext → Berechnen → Ausgabe.

Schritt 4: Die drei Ausgabe-Modi hinzufuegen

Jeder Befehl sollte drei Ausgabe-Modi unterstuetzen:

Default (menschlich lesbar):

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-Ausgabe — praegnante Zeilen mit Status-Icons (+, -, =, !), keine Zeremonie, keine Dekoration.

JSON (--json):

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

Implementations-Muster:

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);

Erwartet: Alle drei Modi produzieren nuetzliche Ausgabe. JSON ist parsebar. Quiet ist praegnant. Default ist informativ.

Bei Fehler: Wenn der Befehl keine bedeutungsvolle JSON-Repraesentation hat (z.B. detect), den JSON-Modus ueberspringen und dokumentieren warum.

Schritt 5: Zeremonie-Variante hinzufuegen (Optional)

Fuer Befehle die von warmer, narrativer Ausgabe statt transaktionalem Reporting profitieren:

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,
  });
}

Zeremonie-Ausgabe folgt Stimm-Regeln:

  1. Praesens, Aktiv ("mystic arrives", nicht "mystic was installed")
  2. Keine Ausrufezeichen
  3. Metapher ersetzt Jargon ("practices" nicht "dependencies")
  4. Versagen sind ehrlich, nicht katastrophal ("a spark was lost")
  5. Schlusszeile reflektiert Zustand ("The fire burns.")
  6. Keine Emojis — Unicode-Glyphen verwenden (✦ ◉ ◎ ○ ✗)
  7. Jedes Wort muss Information tragen

Siehe den design-cli-output-Skill fuer detaillierte Terminal-Ausgabe-Muster.

Erwartet: Zeremonie-Ausgabe die alle Stimm-Regeln befolgt und warme, informative Narrativen produziert.

Bei Fehler: Wenn die Zeremonie-Ausgabe sich erzwungen anfuehlt oder keine Information ueber die Standard-Ausgabe hinaus hinzufuegt, sie ueberspringen. Nicht jeder Befehl braucht eine Zeremonie-Variante.

Schritt 6: Fehler und Grenzfaelle behandeln

// 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);
}

Fehler-Design-Prinzipien:

  • Fehlermeldungen schlagen die Korrekturmassnahme vor
  • process.exit(1) fuer nicht behebbare Fehler
  • Bestaetigungs-Prompts fuer destruktive Operationen (umgehen mit --yes)
  • Dry-run ist immer erfolgreich (blockiert nie auf Bestaetigung)

Erwartet: Alle Fehler-Pfade produzieren hilfreiche Nachrichten. Destruktive Operationen erfordern Bestaetigung.

Bei Fehler: Wenn Bestaetigungs-Prompts mit Skripting interferieren, sicherstellen dass --yes und --quiet beide sie umgehen.

Schritt 7: Integrations-Tests schreiben

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/);
  });
});

Siehe den test-cli-application-Skill fuer umfassende CLI-Test-Muster.

Erwartet: Mindestens 3 Tests: Dry-Run, JSON-Ausgabe, Fehler-Fall. Mehr fuer komplexe Befehle.

Bei Fehler: Wenn execSync Timeout erreicht, das Timeout erhoehen oder auf interaktive Prompts pruefen die den Befehl blockieren.

Validierung

  • Befehl ist im CLI-Eintrittspunkt registriert und erscheint in --help
  • Standard-Optionen (--dry-run, --quiet, --json) funktionieren korrekt
  • Default-Ausgabe ist menschlich lesbar und informativ
  • JSON-Ausgabe ist gueltig und parsebar
  • Fehlermeldungen schlagen Korrekturmassnahmen vor
  • Destruktive Operationen erfordern Bestaetigung (umgangen durch --yes)
  • Mindestens 3 Integrations-Tests bestehen
  • Befehl folgt dem getContext → Aufloesen → Ausfuehren → Ausgabe-Muster

Haeufige Stolperfallen

  • Den JSON-Modus vergessen: Maschinen-Konsumenten (Skripte, CI) haengen von strukturierter Ausgabe ab. Immer --json implementieren auch wenn der Befehl interaktiv-only erscheint.
  • Bestaetigungs-Prompts blockieren Skripte: Jeder Befehl der nach Eingabe fragt wird in nicht-interaktiven Kontexten haengen. Immer --yes fuer destruktive Befehle bereitstellen und sicherstellen dass --quiet Prompts unterdrueckt.
  • Inkonsistente Fehler-Exit-Codes: process.exit(1) fuer alle Fehler verwenden. Tools die CLI-Ausgabe parsen pruefen Exit-Codes zuerst.
  • Optionen ohne Defaults: Optionen wie --scope sollten sinnvolle Defaults haben damit Benutzer sie nicht jedes Mal spezifizieren muessen.
  • Zeremonie in Quiet-Modus lecken: Das --quiet-Flag bedeutet "minimale Ausgabe fuer Maschinen". Wenn Zeremonie-Text in Quiet-Modus leckt, werden Skripte an unerwarteter Ausgabe brechen.

Verwandte Skills

  • build-cli-plugin — den Adapter/das Plugin bauen auf dem Befehle operieren
  • test-cli-application — umfassende CLI-Test-Muster ueber die Basics in Schritt 7 hinaus
  • design-cli-output — Terminal-Ausgabe-Design fuer alle Verbosity-Stufen
  • install-almanac-content — Beispiel eines gut strukturierten CLI-Befehls-Skills

GitHub 저장소

pjt222/agent-almanac
경로: i18n/de/skills/scaffold-cli-command
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

연관 스킬

evaluating-llms-harness

테스팅

이 Claude Skill은 MMLU, GSM8K를 포함한 60개 이상의 표준화된 학술 과제에서 LLM 성능을 벤치마크하기 위해 lm-evaluation-harness를 실행합니다. 개발자들이 모델 품질을 비교하고, 학습 진행 상황을 추적하거나 학술 결과를 보고할 수 있도록 설계되었습니다. 이 도구는 HuggingFace와 vLLM 모델을 포함한 다양한 백엔드를 지원합니다.

스킬 보기

cloudflare-cron-triggers

테스팅

이 스킬은 cron 표현식을 사용하여 Worker를 스케줄링하기 위한 Cloudflare Cron Triggers 구현에 관한 포괄적인 지식을 제공합니다. 주기적 작업, 유지보수 작업, 자동화된 워크플로우 설정 방법을 다루며, 잘못된 cron 표현식이나 시간대 문제 같은 일반적인 이슈들을 해결하는 방법을 포함합니다. 개발자들은 이를 통해 스케줄된 핸들러 구성, cron 트리거 테스트, Workflows 및 Green Compute와의 연동 작업을 수행할 수 있습니다.

스킬 보기

webapp-testing

테스팅

이 Claude Skill은 Python 스크립트를 통해 로컬 웹 애플리케이션을 테스트하기 위한 Playwright 기반 툴킷을 제공합니다. 프론트엔드 검증, UI 디버깅, 스크린샷 캡처, 로그 확인 기능을 지원하며 서버 라이프사이클을 관리합니다. 브라우저 자동화 작업에 사용하되 컨텍스트 오염을 방지하기 위해 소스 코드를 읽지 않고 스크립트를 직접 실행하세요.

스킬 보기

finishing-a-development-branch

테스팅

이 스킬은 테스트 통과를 확인한 후 체계적인 통합 옵션을 제시하여 개발자가 완성된 작업을 마무리하도록 돕습니다. 구현이 완료된 후 머지, PR 생성, 브랜치 정리와 같은 워크플로우를 안내합니다. 코드가 준비되고 테스트가 완료되었을 때 개발 프로세스를 체계적으로 마무리하기 위해 사용하세요.

스킬 보기