Skip to content
Merged
12 changes: 12 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,18 @@
"authentication": "ON_INSTALL"
},
"category": "productivity"
},
{
"name": "voice-prompt",
"source": {
"source": "local",
"path": "./plugins/voice-prompt"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "content"
}
]
}
11 changes: 9 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
"name": "YoungjaeDev"
},
"metadata": {
"description": "Personal Claude Code plugin collection with 23 specialized plugins. Codex 0.135 + Hermes Agent native — generated `.agents/plugins/marketplace.json` + per-plugin `.codex-plugin/plugin.json` (`scripts/sync-codex-manifests.mjs`) and Hermes `plugin.yaml` + `__init__.py` adapters (`scripts/sync-hermes-manifests.mjs`).",
"version": "2.9.0"
"description": "Personal Claude Code plugin collection with 24 specialized plugins. Codex 0.135 + Hermes Agent native — generated `.agents/plugins/marketplace.json` + per-plugin `.codex-plugin/plugin.json` (`scripts/sync-codex-manifests.mjs`) and Hermes `plugin.yaml` + `__init__.py` adapters (`scripts/sync-hermes-manifests.mjs`).",
"version": "2.10.0"
},
"plugins": [
{
Expand Down Expand Up @@ -168,6 +168,13 @@
"description": "Review and correct PLAUD voice-recorder notes (Whisper transcript + separate LLM summary). Fixes STT misrecognition (Korean+English code-switching, proper nouns, numbers) against a project term dictionary, grill-me interviews to resolve ambiguities, and writes a transcript-grounded *.corrected.md back to .llmwiki/raw/transcripts without touching the originals.",
"version": "0.1.0",
"category": "productivity"
},
{
"name": "voice-prompt",
"source": "./plugins/voice-prompt",
"description": "Normalize Korean voice-mode STT input before acting on it. Strips speech fillers, fixes orthography and Korean-to-English code-switching, resolves garbled identifiers (file, function, branch, skill names) against the actual repo instead of guessing, and never rewrites numbers or dates. Echoes one line of what it understood, then proceeds; gates only irreversible actions. Sibling of plaud-note-taking, which corrects archival transcripts instead of live commands.",
"version": "0.1.0",
"category": "content"
}
]
}
3 changes: 2 additions & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
"./plugins/brightdata-guide",
"./plugins/gws-sync",
"./plugins/mem0-ops",
"./plugins/plaud-note-taking"
"./plugins/plaud-note-taking",
"./plugins/voice-prompt"
]
}
}
265 changes: 265 additions & 0 deletions .claude/spec/2026-07-30-voice-prompt.md

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

플러그인 트리 하나를 Claude Code, Codex 0.135(`scripts/sync-codex-manifests.mjs`), Hermes Agent(`scripts/sync-hermes-manifests.mjs`)가 함께 읽습니다 — one source, three runtimes.

## Plugins (23)
## Plugins (24)

### Core
| Plugin | Description |
Expand Down Expand Up @@ -58,6 +58,7 @@
| `translator` | Web article translation to Korean |
| `tcrei-prompt` | Rewrite prompts using Google's TCREI structure for next-session reuse |
| `tally-form` | Checklist markdown to Tally questionnaire/survey form — deterministic urllib builder, theme presets, section dividers, per-question choices (required/checkbox) + short-answer inputs (text/number/email/phone/link), native scheduling (matrix/date/time), form images (logo/cover/IMAGE) + redirect, idempotent publish, humanize routing. Dev-survey + lecture-consultation presets |
| `voice-prompt` | 한국어 보이스 모드 STT 입력을 실행 전에 정규화. 3단 분류 — 자동 수정(말버릇 부류·맞춤법·코드스위칭·발화 내 자기수정) / 질문(후보 0건·다건, 두 해석이 다른 행동을 유발) / 손대지 않음(숫자·날짜·버전·PR 번호). 식별자는 추측하지 않고 `git ls-files`·브랜치 목록·설치된 스킬 목록에 대조해 단일 후보만 확정. 이해한 내용을 1줄 에코한 뒤 즉시 실행하고, 되돌리기 어려운 작업만 명시 확인. 명시 호출 후 해제까지 유지. 개인 사례는 `.claude/voice-prompt/speech-profile.md`, 일반 한국어 말버릇은 번들 레퍼런스 |

### Planning
| Plugin | Description |
Expand Down Expand Up @@ -218,7 +219,7 @@ node scripts/sync-codex-manifests.mjs --check # CI drift guard
```

- Claude 와 Codex 0.135 가 **동일한** `plugins/<name>/` 트리를 직접 읽습니다. 별도 mirror / body transform 없음 (구 `codex-bridge` 플러그인은 1.40.0 에서 제거). Skill 본문은 in-place 로 읽히므로 transform 이 없고, frontmatter 유효성만 남습니다.
- 생성물은 `.agents/plugins/marketplace.json` + 플러그인별 `.codex-plugin/plugin.json`, eligible 21개 대상. `.agents/` 와 `plugins/<name>/.codex-plugin/` 하위 파일은 손으로 편집하지 마세요 — `scripts/sync-codex-manifests.mjs` 가 진실의 원천입니다.
- 생성물은 `.agents/plugins/marketplace.json` + 플러그인별 `.codex-plugin/plugin.json`, eligible 22개 대상. `.agents/` 와 `plugins/<name>/.codex-plugin/` 하위 파일은 손으로 편집하지 마세요 — `scripts/sync-codex-manifests.mjs` 가 진실의 원천입니다.
- 새 플러그인 추가 / 기존 플러그인의 `version` / `description` / `category` 변경 시 반드시 `node scripts/sync-codex-manifests.mjs` 를 실행해 매니페스트를 재생성하세요. `--check` 는 플러그인 제거 후 남은 orphan 매니페스트도 감지합니다.
- Skill `description` frontmatter 는 1024자 미만으로 유지하세요. Codex 0.135 는 1024자 초과 description 을 가진 skill 을 **silent 하게 skip** 합니다 (Claude Code 는 제한이 없어 위반이 안 보임). `--check` 가 drift 외에 description 길이도 검증하고, 공유 `.githooks/pre-commit` 이 매 커밋마다 실행합니다 — clone 당 한 번 `git config core.hooksPath .githooks` 로 활성화하세요. 전체 trigger 목록 / per-tool rationale 는 description 이 아니라 skill 본문에 두세요.
- Skill `description` frontmatter 에 콜론+공백(`: `) 이 들어가면 반드시 따옴표로 감싸세요 (또는 `>-` block scalar). 안 하면 YAML frontmatter 가 nested mapping 으로 파싱돼 `mapping values are not allowed here` 로 실패하고 skill 이 양쪽 런타임에서 silent 하게 로드 안 됩니다. `plugin.json` / `marketplace.json` 은 JSON 이라 무관; lenient 매니페스트 생성기와 `--check` 는 못 잡습니다.
Expand Down Expand Up @@ -264,7 +265,7 @@ macOS CI 레그(`validate-codex.yml` 의 `macos` job)는 BSD 폴백이 실제로

```bash
codex plugin marketplace add ~/.claude/plugins/marketplaces/my-claude-plugins
codex plugin list --marketplace my-claude-plugins # 21 entries
codex plugin list --marketplace my-claude-plugins # 22 entries
codex plugin marketplace remove my-claude-plugins # 검증 후 정리
```

Expand Down
32 changes: 28 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

# my-claude-plugins

Claude Code를 위한 23개 플러그인 모음 - GitHub 워크플로우부터 AI 이미지 생성까지. Codex 0.135 와 Hermes Agent 도 동일한 소스 트리를 네이티브로 로드합니다 (shared source).
Claude Code를 위한 24개 플러그인 모음 - GitHub 워크플로우부터 AI 이미지 생성까지. Codex 0.135 와 Hermes Agent 도 동일한 소스 트리를 네이티브로 로드합니다 (shared source).

[![Plugins](https://img.shields.io/badge/plugins-23-blue.svg)](https://github.com/YoungjaeDev/my-claude-plugins)
[![Plugins](https://img.shields.io/badge/plugins-24-blue.svg)](https://github.com/YoungjaeDev/my-claude-plugins)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![Claude Code](https://img.shields.io/badge/Claude%20Code-compatible-purple.svg)](https://docs.anthropic.com/claude-code)

Expand Down Expand Up @@ -97,6 +97,7 @@ rm -rf ~/.claude/plugins/cache/my-claude-plugins/
| **Content** | `translator` | 웹 아티클 한국어 번역 |
| | `tcrei-prompt` | Google TCREI 구조로 프롬프트 재작성 |
| | `tally-form` | 체크리스트 md → Tally 설문/상담 폼 빌드·게시 (테마 프리셋, 구분선, 문항별 보기·필수·복수선택·단답, matrix/date/time 일정 조율, 이미지·redirect, idempotent) |
| | `voice-prompt` | 한국어 보이스 모드 STT 입력 정규화 — 말버릇·맞춤법·코드스위칭 자동 수정, 식별자는 `git ls-files`·스킬 목록 대조로 해소, 숫자·PR 번호는 손대지 않음. 1줄 에코 후 즉시 실행, 되돌리기 어려운 작업만 확인 |
| **Planning** | `interview` | 구조화된 요구사항 수집 |
| | `project-init` | Day-1 프로젝트 부트스트랩 (.claude/ + CLAUDE.md + AGENTS.md w/ Codex review guidelines + gh repo create) |
| **Docs** | `docs-forge` | README/CHANGELOG 생성 (CRO 최적화) + 배포 문서 템플릿 + MOC 인덱스 |
Expand Down Expand Up @@ -624,6 +625,28 @@ PLAUD 음성 녹음기가 만든 노트를 검토·정정합니다. PLAUD는 녹

</details>

<details>
<summary><strong>voice-prompt</strong> - 보이스 모드 STT 입력 정규화</summary>

한국어 보이스 모드가 넘겨준 음성 인식 결과를 실행 **전에** 명령으로 되돌립니다. `/voice-prompt` 를 한 번 타이핑하면 해제할 때까지 모든 입력에 적용됩니다 (자동 감지 없음).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Advertise the namespaced skill command

For a marketplace or local plugin install, this skill is exposed under the plugin namespace, consistent with the repository's existing /github-dev:resolve-issue example, so /voice-prompt does not identify the added skill. Because automatic activation is explicitly disabled, users following this primary instruction cannot enable the feature; document /voice-prompt:voice-prompt consistently here, in the skill description, and in the plugin guide.

Useful? React with 👍 / 👎.


**이건 텍스트 청소기가 아닙니다.** 말버릇 제거는 모델이 이미 잘 하는 일이라 값이 낮습니다. 실제 값은 **모델이 추측으로 넘어가던 자리에 확인 절차를 끼워넣는 것**입니다 — "로더 파일"을 들으면 모델은 파일명을 지어내는데, `loader.py` 가 실재하는지 찾아보지 않으면 알 수 없습니다. 독해 실패가 아니라 행동 누락입니다.

**3단 분류:**
- **자동 수정** — 말버릇 부류, 맞춤법, 저장소 단일 후보, 스킬 목록 단일 후보, 발화 내 자기수정
- **질문** — 후보 0건 또는 다건, 두 해석이 서로 다른 행동을 유발, 되돌리기 어려운 작업 대상 (한 라운드로 묶어서)
- **손대지 않음** — 숫자·날짜·버전·PR/이슈 번호·금액·경로 리터럴. `PR 189` 가 `PR 180` 으로 들리면 조용히 잘못된 PR 을 건드리므로, 문맥이 아무리 그럴듯해도 추측 금지

**말버릇은 목록이 아니라 기능 검사로 지웁니다.** "그냥 지워"의 "그냥"은 "다른 건 하지 말고"이고 "일단 커밋해"의 "일단"은 순서 지시입니다. 그 단어를 지웠을 때 행동이 달라지면 말버릇이 아니고, 애매하면 보존합니다. 자기수정 표지("아 아니")는 삭제 대상이 아니라 정정 근거로, 그 뒤의 발화가 이깁니다.

**에코 → 실행:** `→ src/loader.py 초기화 부분 고쳐 (로더 파일→loader.py, 필러 3어 삭제)` 처럼 한 줄 보고 후 즉시 진행. 푸시·머지·삭제 등 되돌리기 어려운 작업만 대상을 명시해 확인받습니다.

**개인화:** 일반 한국어 말버릇은 번들 레퍼런스에, 개인 발음 습관과 도메인 용어는 `.claude/voice-prompt/speech-profile.md` 에 분리합니다. 사용자 확인 없이 프로필에 쓰지 않습니다.

**한계:** 스킬은 입력을 가로채지 않습니다 — 지침 준수 기반이라 긴 세션에서 흐려질 수 있고, 에코가 사라지면 재호출하라는 신호입니다.

</details>

## Configuration

### settings.json
Expand Down Expand Up @@ -667,7 +690,7 @@ codex plugin marketplace add ~/.claude/plugins/marketplaces/my-claude-plugins
codex plugin add llm-wiki@my-claude-plugins
```

Codex 에서 제외되는 플러그인은 `codex-image` 와 `council` 둘입니다 (`codex-image` 는 Claude->Codex 브리지라 Codex 로 sync 하면 순환, `council` 은 codex 를 의석으로 앉히므로 Codex 에서 돌리면 자기 자신을 소환하는 순환이고 Claude 의석이 Agent 도구를 필요로 함). `core-config` 는 skill 이 없지만 번들 Codex hooks (`hooks/codex-hooks.json`) 를 실어 hooks-only 매니페스트로 Codex 에 sync 됩니다 (native `UserPromptSubmit` 훅). 즉 21 / 23 플러그인이 Codex 로 sync 되며 (core-config 는 hooks-only, 나머지는 skill 단위), `deepwiki` 와 `project-init` 은 1.41.0 부터 Claude 에서는 command + skill 양쪽으로, Codex 에서는 skill 로만 동작합니다 (Codex 는 command surface 를 로드하지 않음).
Codex 에서 제외되는 플러그인은 `codex-image` 와 `council` 둘입니다 (`codex-image` 는 Claude->Codex 브리지라 Codex 로 sync 하면 순환, `council` 은 codex 를 의석으로 앉히므로 Codex 에서 돌리면 자기 자신을 소환하는 순환이고 Claude 의석이 Agent 도구를 필요로 함). `core-config` 는 skill 이 없지만 번들 Codex hooks (`hooks/codex-hooks.json`) 를 실어 hooks-only 매니페스트로 Codex 에 sync 됩니다 (native `UserPromptSubmit` 훅). 즉 22 / 24 플러그인이 Codex 로 sync 되며 (core-config 는 hooks-only, 나머지는 skill 단위), `deepwiki` 와 `project-init` 은 1.41.0 부터 Claude 에서는 command + skill 양쪽으로, Codex 에서는 skill 로만 동작합니다 (Codex 는 command surface 를 로드하지 않음).

Codex 0.135 manifest top-level은 `skills` / `hooks` / `mcpServers` / `apps` 만 지원하므로, command-bearing 플러그인(`docs-forge`, `deepwiki` 등)도 Codex 측에는 skill만 노출됩니다 — Claude 측 commands 는 그대로 동작합니다. `github-dev` 는 모든 워크플로가 skill 로 전환돼 command surface 가 없으므로 Claude·Codex 양쪽에서 동일하게 동작합니다.

Expand Down Expand Up @@ -720,7 +743,7 @@ shared-source 배선은 6개 가드가 매 PR 과 매 커밋(`.githooks/pre-comm

- `sync-codex-manifests.mjs --check` — Codex 매니페스트 drift + skill `description` 1024자 초과(Codex silent skip) + 번들 hook 디스크립터 shape·참조 스크립트 존재·orphan.
- `sync-hermes-manifests.mjs --check` — Hermes 어댑터 drift + orphan.
- `check-doc-consistency.mjs` — 플러그인 트리·표·카운트(총 23 / Codex-eligible 21 / Hermes 5)가 `manifest-eligibility.mjs` SoT 와 일치.
- `check-doc-consistency.mjs` — 플러그인 트리·표·카운트(총 24 / Codex-eligible 22 / Hermes 5)가 `manifest-eligibility.mjs` SoT 와 일치.
- `check-skill-tool-portability.mjs --check` — 공유 스킬 본문의 `AskUserQuestion` 사용이 파일럿 표준 매핑 또는 baseline 에 등록됐는지(미등록 크로스런타임 상호작용 경로 차단).
- `check-shell-portability.mjs` — GNU 전용 셸 구문(`md5sum`·`sed -i`·`grep -P`·`date -d`·`stat -c`·`timeout`·`${VAR,,}`·`mapfile`·`declare -A` 등)이 **폴백도 capability probe 도 없이** 쓰인 경우 차단. 정상 폴백 쌍(`stat -c … || stat -f …`)과 probe 분기는 통과하고, 증거는 코드만 인정합니다(대체재를 언급하는 주석은 폴백이 아님). 예외는 `# portability-ok: <사유>`.
- `check-skill-prose.mjs` — 500줄 초과·깊은 참조 경로에 대한 정보성 경고(비차단, 항상 exit 0).
Expand Down Expand Up @@ -790,6 +813,7 @@ node scripts/install-skills.mjs # 또는 hermes plugins install
│ ├── project-init/ # Day-1 프로젝트 부트스트랩 (인터뷰 + .claude/ + AGENTS.md + gh repo)
│ ├── gws-sync/ # 로컬 → Google Drive 단방향 제안형 동기화 (gws CLI 기반)
│ ├── plaud-note-taking/ # PLAUD 노트(Whisper 전사록+LLM 요약) STT·용어 정정
│ ├── voice-prompt/ # 보이스 모드 STT 입력 정규화 (3단 분류 + 저장소 대조)
│ └── mem0-ops/ # 플릿 레벨 mem0 진단·정리 (fleet-scan/doctor/cleanup)
├── AGENTS.md # 세 런타임 공통 최상위 지침 (정본)
├── CLAUDE.md # @AGENTS.md import
Expand Down
5 changes: 5 additions & 0 deletions plugins/voice-prompt/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "voice-prompt",
"version": "0.1.0",
"description": "Normalize Korean voice-mode STT input before acting on it. Strips speech fillers, fixes orthography and Korean-to-English code-switching, resolves garbled identifiers (file, function, branch, skill names) against the actual repo instead of guessing, and never rewrites numbers or dates. Echoes one line of what it understood, then proceeds; gates only irreversible actions. Sibling of plaud-note-taking, which corrects archival transcripts instead of live commands."
}
10 changes: 10 additions & 0 deletions plugins/voice-prompt/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "voice-prompt",
"version": "0.1.0",
"description": "Normalize Korean voice-mode STT input before acting on it. Strips speech fillers, fixes orthography and Korean-to-English code-switching, resolves garbled identifiers (file, function, branch, skill names) against the actual repo instead of guessing, and never rewrites numbers or dates. Echoes one line of what it understood, then proceeds; gates only irreversible actions. Sibling of plaud-note-taking, which corrects archival transcripts instead of live commands.",
"author": {
"name": "YoungjaeDev"
},
"license": "MIT",
"skills": "./skills/"
}
63 changes: 63 additions & 0 deletions plugins/voice-prompt/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# voice-prompt

One skill, `voice-prompt`, that normalizes Korean voice-mode STT input before the session acts
on it. Typed once, it stays active until released.

Comment on lines +1 to +5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

CLAUDE.md@AGENTS.md 포인터 전용으로 유지하세요.

영향: Claude 지침이 CLAUDE.mdAGENTS.md로 분산되어 중복·충돌될 수 있습니다. 근거: 이 파일의 변경 구간에 활성화와 speech-profile 동작 설명이 직접 추가되었습니다. 수정 방향: 해당 설명은 SKILL.md에만 두고 CLAUDE.md에는 @AGENTS.md만 남기세요.

As per coding guidelines, **/CLAUDE.md@AGENTS.md 포인터 외의 별도 내용을 갖지 않아야 합니다.

Also applies to: 59-68

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/voice-prompt/CLAUDE.md` around lines 1 - 5, CLAUDE.md의 모든 음성 프롬프트 설명과
동작 지침을 제거하고 파일을 `@AGENTS.md` 포인터만 포함하도록 유지하세요. 제거한 활성화 및 speech-profile 관련 내용은
SKILL.md에만 남기며, CLAUDE.md에는 다른 지침이나 중복 설명을 추가하지 마세요.

Source: Coding guidelines

## Why this exists

Korean voice mode breaks in three ways: orthography misrecognition, failed Korean-to-English
code-switching (an English identifier spoken with Korean pronunciation comes back as Korean
syllables — "로더 파일"), and speech habits landing inside the command ("어쨌든", "그냥", "뭐").

Two of the three barely need a plugin. A model already ignores fillers and reads through
misspellings, so making that explicit buys consistency, not new capability. The third one is
different in kind: hearing "로더 파일", a model **guesses** a filename. It cannot know whether
`loader.py` exists without looking. That is not a comprehension failure, it is a missing action —
and a missing action is exactly what instructions can add.

So this plugin is not a text cleaner. It is a threshold changer. Everything it really
contributes is a decision rather than a transform:

| What it adds | Kind |
|---|---|
| Resolve identifiers against the repo instead of guessing | action added |
| Never rewrite numbers, dates, versions, PR/issue numbers | action forbidden |
| Echo one line of what was understood before acting | observability |
| Confirm before an irreversible action | gate |

## Shape

```
plugins/voice-prompt/
├── CLAUDE.md
├── .claude-plugin/plugin.json
└── skills/voice-prompt/
├── SKILL.md # the body
├── references/stt-error-classes.md # error taxonomy, live-command stance
├── references/korean-filler.md # filler classes + function-residue test
└── templates/speech-profile.md # seeded to .claude/voice-prompt/speech-profile.md
```

## Boundary with plaud-note-taking

Both correct STT output, and the error distribution is the same, so the taxonomy is shared in
spirit. The discipline is not. `plaud-note-taking` treats its transcript as immutable evidence
and preserves every filler because the filler is part of the record; this skill treats its input
as a disposable command and deletes the filler because the filler is noise. Their term
dictionaries do not overlap either — one holds meeting attendees and company names, the other
holds one speaker's pronunciation habits.

Two plugins, not one skill with a mode flag: a body carrying both stances would need a
conditional on every rule.

## Known limit

This is instruction-following, not interception. Nothing sits between STT and the model — a
skill cannot rewrite the incoming message, and `UserPromptSubmit` hook output arrives as
appended `additionalContext` rather than a replacement. So the normalization happens in the
model's own reasoning and carries the same reliability as any other skill: it can fade in a long
session.

The echo line is the tell. If it stops appearing, the skill has drifted out — re-invoke
`/voice-prompt`. That self-signal is why the echo is mandatory rather than optional, and why
this plugin ships no marker file or re-injection hook to enforce stickiness.
Loading
Loading