From dding-dong
Create custom sound pack with interactive wizard. Generates boilerplate, copies sound files, validates, and applies. 커스텀 사운드 팩 생성 마법사. Use when the user says '팩 만들기', '커스텀 사운드', 'create sound pack', 'custom pack', '사운드 팩 생성'.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dding-dong:dd-pack-createThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
사용자의 WAV 파일로 커스텀 사운드 팩을 생성합니다.
사용자의 WAV 파일로 커스텀 사운드 팩을 생성합니다.
설계 노트:
disable-model-invocation은 의도적으로 생략되었습니다. 이 스킬은 사용자가 입력하는 파일 경로의 해석과 검증, manifest.json의 동적 구성에 모델 추론이 필수적입니다.
매니페스트 스키마, 디렉토리 구조, WAV 사양 상세는 references/manifest-spec.md 참조.
핵심 규칙:
{ "files": ["filename.wav"] } 형식events에서 키를 생략 (null 아님)$ARGUMENTS에서 플래그를 확인합니다:
--help: 아래 사용법을 출력하고 종료합니다.
커스텀 사운드 팩 생성 마법사
사용법: /dding-dong:dd-pack-create [옵션]
옵션:
--from <팩이름> 기존 팩을 복제하여 새 팩 생성
--help 이 도움말 표시
예시:
/dding-dong:dd-pack-create
/dding-dong:dd-pack-create --from retro
--from <팩이름>: 복제 모드로 바로 진입합니다 (1단계 건너뜀). 지정된 팩이름을 복제 원본으로 사용합니다.
--from 플래그가 있으면 이 단계를 건너뛰고, 해당 팩을 복제 원본으로 하여 2단계로 진행합니다.
AskUserQuestion으로 질문합니다:
"커스텀 사운드 팩을 어떻게 만드시겠습니까?"
선택지:
"기존 팩 복제"를 선택한 경우:
설치된 팩 목록을 조회합니다:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" discover
조회된 팩 목록을 사용자에게 표시하고 AskUserQuestion으로 어떤 팩을 복제할지 선택하게 합니다. 각 팩을 선택지로 표시합니다 (예: "기본 효과음 (default)", "레트로 게임 (retro)").
선택된 팩의 이름과 경로를 기억하여 2단계에서 사용합니다.
AskUserQuestion으로 질문합니다:
"새 사운드 팩의 이름을 입력해주세요. (영문 소문자, 숫자, 하이픈만 사용 가능)"
선택지:
사용자가 선택지를 선택하거나 Other로 직접 입력합니다.
이름 형식 검증:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" validate-name 'PACK_NAME'
valid: true 시: 중복 검사로 진행valid: false 시: errors 배열의 각 항목을 사용자에게 표시하고 다시 이름 입력을 요청합니다.이름 중복 검사:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" check-exists 'PACK_NAME'
PACK_NAME을 사용자 입력값으로 대체합니다.
AskUserQuestion으로 질문합니다:
"사운드 팩의 표시 이름을 입력해주세요. (한글/영문, 사용자에게 보여지는 이름)"
선택지:
AskUserQuestion으로 질문합니다:
"사운드 팩의 설명을 입력해주세요."
선택지:
"건너뛰기" 선택 시 description을 빈 문자열로 설정합니다.
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" detect-author
version: 항상 "1.0.0"author: git config user.name → 실패 시 os.userInfo().username새로 만들기 모드:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" create 'PACK_NAME' 'DISPLAY_NAME' 'AUTHOR' 'DESCRIPTION' --project --cwd "$(pwd)"
PACK_NAME, DISPLAY_NAME, AUTHOR, DESCRIPTION을 수집된 값으로 대체합니다.
복제 모드:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" clone 'SOURCE_DIR' 'PACK_NAME' 'DISPLAY_NAME' 'AUTHOR' 'DESCRIPTION' --project --cwd "$(pwd)"
SOURCE_DIR은 1단계에서 선택한 복제 원본 팩의 디렉토리 경로, 나머지는 수집된 값으로 대체합니다.
생성 결과를 사용자에게 안내합니다:
팩 디렉토리가 생성되었습니다: .dding-dong/packs/PACK_NAME/
5개 이벤트 타입에 대해 순서대로 사운드 파일을 등록합니다.
먼저 권장 사양을 안내합니다:
WAV 파일 권장 사양:
- 형식: WAV (PCM)
- 샘플레이트: 44100Hz
- 비트 깊이: 16-bit
- 채널: mono
- 길이: 1~3초
다음 5개 이벤트를 순서대로 처리합니다:
| 순서 | 이벤트 타입 | 설명 | 기본 파일명 |
|---|---|---|---|
| 1 | task.complete | 작업 완료 | complete.wav |
| 2 | task.error | 오류 발생 | error.wav |
| 3 | input.required | 입력 필요 | input-required.wav |
| 4 | session.start | 세션 시작 | session-start.wav |
| 5 | session.end | 세션 종료 | session-end.wav |
각 이벤트마다 AskUserQuestion으로 질문합니다:
"[이벤트 설명] (EVENT_TYPE) 사운드 파일을 등록하시겠습니까?"
선택지:
"파일 경로 입력"을 선택하면 사용자에게 파일 경로를 요청합니다. 사용자가 경로를 제공하면 즉시 검증합니다.
각 이벤트마다 AskUserQuestion으로 질문합니다:
"[이벤트 설명] (EVENT_TYPE) — 현재 파일: CURRENT_FILE"
선택지:
"파일 교체"를 선택하면 사용자에게 새 파일 경로를 요청합니다. 원본 팩에 해당 이벤트가 없으면 (키 자체가 없으면) "현재 파일: (없음)"으로 표시하고 선택지에서 "그대로 유지"와 "제거" 대신 "건너뛰기"를 표시합니다.
사용자가 파일 경로를 제공할 때마다 아래 검증을 실행합니다:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" validate-file 'FILE_PATH'
FILE_PATH를 사용자 입력 경로로 대체합니다.
검증 통과 후 즉시 실행합니다:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" copy-sound 'SRC_PATH' 'PACK_NAME' 'EVENT_TYPE' 'DEST_FILENAME' --project --cwd "$(pwd)"
SRC_PATH는 사용자 파일 경로, PACK_NAME은 팩 이름, EVENT_TYPE은 이벤트 타입, DEST_FILENAME은 기본 파일명(위 표 참조)으로 대체합니다.
"제거"를 선택한 경우:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" remove-event 'PACK_NAME' 'EVENT_TYPE' --cwd "$(pwd)"
모든 이벤트 등록이 완료되면 먼저 매니페스트 구조를 검증합니다:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" validate-manifest 'PACK_NAME' --cwd "$(pwd)"
valid: true 시: 다음 단계(파일 검증)로 진행valid: false 시: errors 배열의 각 항목을 표시하고, 수정이 필요하다고 안내
(이 시점에서 manifest가 손상되었다면 pack-wizard의 create/clone이 정상 작동하지 않은 것이므로, 직접 manifest.json을 Read하여 문제를 확인)매니페스트 검증을 통과하면 WAV 파일 검증을 실행합니다:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" validate 'PACK_NAME' --cwd "$(pwd)"
결과를 아래 형식으로 사용자에게 표시합니다:
커스텀 사운드 팩이 생성되었습니다!
이름: PACK_NAME
표시 이름: DISPLAY_NAME
작성자: AUTHOR
위치: .dding-dong/packs/PACK_NAME/
이벤트 파일 상태
─────────────────────────────────────────
task.complete complete.wav ✓
task.error error.wav ✓
input.required (없음) -
session.start session-start.wav ✓
session.end session-end.wav ✓
등록된 이벤트: 4/5
상태 표시:
ok → ✓skipped → - (파일 열에 "(없음)" 표시)missing → ✗ 파일 없음invalid_format → ✗ WAV 아님missing 또는 invalid_format이 있으면 경고를 표시합니다:
"일부 파일에 문제가 있습니다. 팩이 정상 동작하지 않을 수 있습니다."
AskUserQuestion으로 질문합니다:
"이 팩을 지금 바로 적용하시겠습니까?"
선택지:
/dding-dong:dd-sounds use PACK_NAME으로 적용할 수 있습니다.""바로 적용" 선택 시:
기존 설정을 로드하고 sound.pack만 변경하여 저장합니다:
node "${CLAUDE_PLUGIN_ROOT}/scripts/pack-wizard.mjs" apply 'PACK_NAME' --cwd "$(pwd)"
적용 성공 시: "사운드 팩이 'PACK_NAME'으로 변경되었습니다." 안내
"나중에 적용" 선택 시:
팩이 생성되었습니다. 아래 명령어로 나중에 적용할 수 있습니다:
/dding-dong:dd-sounds use PACK_NAME
5단계로 진행합니다.
4-b에서 "바로 적용"을 선택한 경우에만 미리듣기를 제안합니다.
AskUserQuestion으로 질문합니다:
"사운드를 미리 들어보시겠습니까?"
선택지:
"예" 선택 시:
DDING_DONG_PACK='PACK_NAME' node "${CLAUDE_PLUGIN_ROOT}/scripts/notify.mjs" test task.complete
PACK_NAME을 팩 이름으로 대체합니다.
재생 실패 시: "미리듣기에 실패했습니다. /dding-dong:dd-test로 다시 시도해보세요." 안내
완료 메시지:
사운드 팩 생성이 완료되었습니다!
관련 명령어:
사운드 팩 관리 → /dding-dong:dd-sounds list
팩 미리듣기 → /dding-dong:dd-sounds preview PACK_NAME
팩 변경 → /dding-dong:dd-sounds use PACK_NAME
설정 확인 → /dding-dong:dd-config show
npx claudepluginhub caesiumy/dding-dong --plugin dding-dongManage Claude Code sound feedback — select, enable/disable sound packs, adjust volume, mute/unmute, play test sounds, and view status.
Guides creating professional sample packs with naming conventions, metadata tagging, format specs, and QC for DAW-ready sample libraries.
Generates short SFX one-shots (footsteps, weapon swings, UI clicks, hit impacts) and wires them as AudioStreamPlayer nodes that auto-free on finish. Use when needing a concrete sound effect prompt.