@tienne/gestalt 0.46.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CLAUDE.md +22 -3
  2. package/README.ko.md +46 -2
  3. package/README.md +30 -5
  4. package/dist/package.json +3 -7
  5. package/dist/{role-agents → plugin/role-agents}/code-review-responder/AGENT.md +1 -1
  6. package/dist/{role-agents → plugin/role-agents}/code-review-writer/AGENT.md +28 -6
  7. package/{role-agents → dist/plugin/role-agents}/humanize-monolith/AGENT.md +2 -2
  8. package/{role-agents → dist/plugin/role-agents}/impact-writer/AGENT.md +2 -2
  9. package/{role-agents → dist/plugin/role-agents}/impact-writer/references/doc-playbooks.md +1 -1
  10. package/{role-agents → dist/plugin/role-agents}/impact-writer/references/voice.md +4 -4
  11. package/{role-agents → dist/plugin/role-agents}/jira-writer/AGENT.md +4 -4
  12. package/dist/{role-agents → plugin/role-agents}/slack-messenger/AGENT.md +6 -6
  13. package/dist/{role-agents → plugin/role-agents}/slack-messenger/references/voice-sample.md +5 -5
  14. package/{role-agents → dist/plugin/role-agents}/technical-writer/references/ai-tell-quick-rules.md +7 -7
  15. package/dist/{role-agents → plugin/role-agents}/technical-writer/references/author-voice.md +14 -14
  16. package/dist/src/core/config.js +5 -5
  17. package/dist/src/core/config.js.map +1 -1
  18. package/dist/src/core/constants.d.ts +1 -1
  19. package/dist/src/core/constants.d.ts.map +1 -1
  20. package/dist/src/core/constants.js +1 -1
  21. package/dist/src/core/constants.js.map +1 -1
  22. package/package.json +3 -7
  23. package/plugin/.codex-plugin/plugin.json +41 -0
  24. package/plugin/mcp.json +9 -0
  25. package/{role-agents → plugin/role-agents}/code-review-responder/AGENT.md +1 -1
  26. package/{role-agents → plugin/role-agents}/code-review-writer/AGENT.md +28 -6
  27. package/{dist → plugin}/role-agents/humanize-monolith/AGENT.md +2 -2
  28. package/{dist → plugin}/role-agents/impact-writer/AGENT.md +2 -2
  29. package/{dist → plugin}/role-agents/impact-writer/references/doc-playbooks.md +1 -1
  30. package/{dist → plugin}/role-agents/impact-writer/references/voice.md +4 -4
  31. package/{dist → plugin}/role-agents/jira-writer/AGENT.md +4 -4
  32. package/{role-agents → plugin/role-agents}/slack-messenger/AGENT.md +6 -6
  33. package/{role-agents → plugin/role-agents}/slack-messenger/references/voice-sample.md +5 -5
  34. package/{dist → plugin}/role-agents/technical-writer/references/ai-tell-quick-rules.md +7 -7
  35. package/{role-agents → plugin/role-agents}/technical-writer/references/author-voice.md +14 -14
  36. /package/{agents → dist/plugin/agents}/closure-completer/AGENT.md +0 -0
  37. /package/{agents → dist/plugin/agents}/continuity-judge/AGENT.md +0 -0
  38. /package/{agents → dist/plugin/agents}/ground-mapper/AGENT.md +0 -0
  39. /package/{agents → dist/plugin/agents}/proximity-worker/AGENT.md +0 -0
  40. /package/{agents → dist/plugin/agents}/similarity-crystallizer/AGENT.md +0 -0
  41. /package/dist/{personas → plugin/personas}/medicine-seller/AGENT.md +0 -0
  42. /package/dist/{personas → plugin/personas}/trickster/AGENT.md +0 -0
  43. /package/dist/{review-agents → plugin/review-agents}/frontend-reviewer/AGENT.md +0 -0
  44. /package/dist/{review-agents → plugin/review-agents}/performance-reviewer/AGENT.md +0 -0
  45. /package/dist/{review-agents → plugin/review-agents}/quality-reviewer/AGENT.md +0 -0
  46. /package/dist/{review-agents → plugin/review-agents}/security-reviewer/AGENT.md +0 -0
  47. /package/dist/{role-agents → plugin/role-agents}/architect/AGENT.md +0 -0
  48. /package/dist/{role-agents → plugin/role-agents}/backend-developer/AGENT.md +0 -0
  49. /package/dist/{role-agents → plugin/role-agents}/change-context-writer/AGENT.md +0 -0
  50. /package/dist/{role-agents → plugin/role-agents}/designer/AGENT.md +0 -0
  51. /package/dist/{role-agents → plugin/role-agents}/devops-engineer/AGENT.md +0 -0
  52. /package/dist/{role-agents → plugin/role-agents}/frontend-developer/AGENT.md +0 -0
  53. /package/dist/{role-agents → plugin/role-agents}/harness-architect/AGENT.md +0 -0
  54. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/AGENT.md +0 -0
  55. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/broadside.html +0 -0
  56. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/editorial-forest.html +0 -0
  57. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/emerald-editorial.html +0 -0
  58. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/neo-grid.html +0 -0
  59. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/pin-and-paper.html +0 -0
  60. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/pink-script.html +0 -0
  61. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/sakura-chroma.html +0 -0
  62. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/signal.html +0 -0
  63. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/stencil-tablet.html +0 -0
  64. /package/dist/{role-agents → plugin/role-agents}/presentation-designer/templates/studio.html +0 -0
  65. /package/dist/{role-agents → plugin/role-agents}/presentation-writer/AGENT.md +0 -0
  66. /package/dist/{role-agents → plugin/role-agents}/presentation-writer/references/content-playbook.md +0 -0
  67. /package/dist/{role-agents → plugin/role-agents}/product-planner/AGENT.md +0 -0
  68. /package/dist/{role-agents → plugin/role-agents}/qa-engineer/AGENT.md +0 -0
  69. /package/dist/{role-agents → plugin/role-agents}/researcher/AGENT.md +0 -0
  70. /package/dist/{role-agents → plugin/role-agents}/technical-writer/AGENT.md +0 -0
  71. /package/dist/{role-agents → plugin/role-agents}/technical-writer/references/style-guide.md +0 -0
  72. /package/dist/{role-agents → plugin/role-agents}/ux-writer/AGENT.md +0 -0
  73. /package/dist/{role-agents → plugin/role-agents}/video-summarizer/AGENT.md +0 -0
  74. /package/dist/{skills → plugin/skills}/_shared/tool-availability.md +0 -0
  75. /package/dist/{skills → plugin/skills}/_shared/untrusted-input.md +0 -0
  76. /package/dist/{skills → plugin/skills}/agent/SKILL.md +0 -0
  77. /package/dist/{skills → plugin/skills}/blast-radius/SKILL.md +0 -0
  78. /package/dist/{skills → plugin/skills}/brief/SKILL.md +0 -0
  79. /package/dist/{skills → plugin/skills}/build-graph/SKILL.md +0 -0
  80. /package/dist/{skills → plugin/skills}/diff-radius/SKILL.md +0 -0
  81. /package/dist/{skills → plugin/skills}/dispatch/SKILL.md +0 -0
  82. /package/dist/{skills → plugin/skills}/execute/SKILL.md +0 -0
  83. /package/dist/{skills → plugin/skills}/interview/SKILL.md +0 -0
  84. /package/dist/{skills → plugin/skills}/jira-create/SKILL.md +0 -0
  85. /package/dist/{skills → plugin/skills}/pr/SKILL.md +0 -0
  86. /package/dist/{skills → plugin/skills}/presentation/SKILL.md +0 -0
  87. /package/dist/{skills → plugin/skills}/review/SKILL.md +0 -0
  88. /package/dist/{skills → plugin/skills}/review-reply/SKILL.md +0 -0
  89. /package/dist/{skills → plugin/skills}/setup/SKILL.md +0 -0
  90. /package/dist/{skills → plugin/skills}/slack-send/SKILL.md +0 -0
  91. /package/dist/{skills → plugin/skills}/solve/SKILL.md +0 -0
  92. /package/dist/{skills → plugin/skills}/spec/SKILL.md +0 -0
  93. /package/{dist → plugin}/agents/closure-completer/AGENT.md +0 -0
  94. /package/{dist → plugin}/agents/continuity-judge/AGENT.md +0 -0
  95. /package/{dist → plugin}/agents/ground-mapper/AGENT.md +0 -0
  96. /package/{dist → plugin}/agents/proximity-worker/AGENT.md +0 -0
  97. /package/{dist → plugin}/agents/similarity-crystallizer/AGENT.md +0 -0
  98. /package/{personas → plugin/personas}/medicine-seller/AGENT.md +0 -0
  99. /package/{personas → plugin/personas}/trickster/AGENT.md +0 -0
  100. /package/{review-agents → plugin/review-agents}/frontend-reviewer/AGENT.md +0 -0
  101. /package/{review-agents → plugin/review-agents}/performance-reviewer/AGENT.md +0 -0
  102. /package/{review-agents → plugin/review-agents}/quality-reviewer/AGENT.md +0 -0
  103. /package/{review-agents → plugin/review-agents}/security-reviewer/AGENT.md +0 -0
  104. /package/{role-agents → plugin/role-agents}/architect/AGENT.md +0 -0
  105. /package/{role-agents → plugin/role-agents}/backend-developer/AGENT.md +0 -0
  106. /package/{role-agents → plugin/role-agents}/change-context-writer/AGENT.md +0 -0
  107. /package/{role-agents → plugin/role-agents}/designer/AGENT.md +0 -0
  108. /package/{role-agents → plugin/role-agents}/devops-engineer/AGENT.md +0 -0
  109. /package/{role-agents → plugin/role-agents}/frontend-developer/AGENT.md +0 -0
  110. /package/{role-agents → plugin/role-agents}/harness-architect/AGENT.md +0 -0
  111. /package/{role-agents → plugin/role-agents}/presentation-designer/AGENT.md +0 -0
  112. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/broadside.html +0 -0
  113. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/editorial-forest.html +0 -0
  114. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/emerald-editorial.html +0 -0
  115. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/neo-grid.html +0 -0
  116. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/pin-and-paper.html +0 -0
  117. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/pink-script.html +0 -0
  118. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/sakura-chroma.html +0 -0
  119. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/signal.html +0 -0
  120. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/stencil-tablet.html +0 -0
  121. /package/{role-agents → plugin/role-agents}/presentation-designer/templates/studio.html +0 -0
  122. /package/{role-agents → plugin/role-agents}/presentation-writer/AGENT.md +0 -0
  123. /package/{role-agents → plugin/role-agents}/presentation-writer/references/content-playbook.md +0 -0
  124. /package/{role-agents → plugin/role-agents}/product-planner/AGENT.md +0 -0
  125. /package/{role-agents → plugin/role-agents}/qa-engineer/AGENT.md +0 -0
  126. /package/{role-agents → plugin/role-agents}/researcher/AGENT.md +0 -0
  127. /package/{role-agents → plugin/role-agents}/technical-writer/AGENT.md +0 -0
  128. /package/{role-agents → plugin/role-agents}/technical-writer/references/style-guide.md +0 -0
  129. /package/{role-agents → plugin/role-agents}/ux-writer/AGENT.md +0 -0
  130. /package/{role-agents → plugin/role-agents}/video-summarizer/AGENT.md +0 -0
  131. /package/{skills → plugin/skills}/_shared/tool-availability.md +0 -0
  132. /package/{skills → plugin/skills}/_shared/untrusted-input.md +0 -0
  133. /package/{skills → plugin/skills}/agent/SKILL.md +0 -0
  134. /package/{skills → plugin/skills}/blast-radius/SKILL.md +0 -0
  135. /package/{skills → plugin/skills}/brief/SKILL.md +0 -0
  136. /package/{skills → plugin/skills}/build-graph/SKILL.md +0 -0
  137. /package/{skills → plugin/skills}/diff-radius/SKILL.md +0 -0
  138. /package/{skills → plugin/skills}/dispatch/SKILL.md +0 -0
  139. /package/{skills → plugin/skills}/execute/SKILL.md +0 -0
  140. /package/{skills → plugin/skills}/interview/SKILL.md +0 -0
  141. /package/{skills → plugin/skills}/jira-create/SKILL.md +0 -0
  142. /package/{skills → plugin/skills}/pr/SKILL.md +0 -0
  143. /package/{skills → plugin/skills}/presentation/SKILL.md +0 -0
  144. /package/{skills → plugin/skills}/review/SKILL.md +0 -0
  145. /package/{skills → plugin/skills}/review-reply/SKILL.md +0 -0
  146. /package/{skills → plugin/skills}/setup/SKILL.md +0 -0
  147. /package/{skills → plugin/skills}/slack-send/SKILL.md +0 -0
  148. /package/{skills → plugin/skills}/solve/SKILL.md +0 -0
  149. /package/{skills → plugin/skills}/spec/SKILL.md +0 -0
package/CLAUDE.md CHANGED
@@ -108,11 +108,30 @@ src/skills/ — Skill System 엔진 (SKILL.md 파서·실행기, 최상
108
108
  src/registry/ — 레지스트리 공통 베이스 클래스
109
109
  src/utils/ — 알림 등 공용 유틸
110
110
  src/cli/ — commander 기반 CLI
111
- role-agents/ 내장 Role Agent 9개 (architect, frontend-developer, backend-developer, devops-engineer, qa-engineer, designer, product-planner, researcher, technical-writer) + 스킬 지원용 에이전트(jira-writer, slack-messenger, presentation-writer, code-review-writer, code-review-responder 등) 총 21개
112
- review-agents/ — 내장 Review Agent 4개 (security-reviewer, performance-reviewer, quality-reviewer, frontend-reviewer)
113
- skills/ SKILL.md 17개 (interview, spec, execute, dispatch, agent, review, review-reply, pr, build-graph, blast-radius, diff-radius, jira-create, slack-send, brief, presentation, solve, setup) + `_shared/` 공유 규칙(스킬 아님, 레지스트리가 건너뜀)
111
+ plugin/ 배포 자산 전부. Claude Code와 Codex 플러그인이 디렉토리 하나를 공유한다
112
+ plugin/role-agents/ — 내장 Role Agent 9개 (architect, frontend-developer, backend-developer, devops-engineer, qa-engineer, designer, product-planner, researcher, technical-writer) + 스킬 지원용 에이전트(jira-writer, slack-messenger, presentation-writer, code-review-writer, code-review-responder 등) 총 21개
113
+ plugin/review-agents/ 내장 Review Agent 4개 (security-reviewer, performance-reviewer, quality-reviewer, frontend-reviewer)
114
+ plugin/skills/ — SKILL.md 17개 (interview, spec, execute, dispatch, agent, review, review-reply, pr, build-graph, blast-radius, diff-radius, jira-create, slack-send, brief, presentation, solve, setup) + `_shared/` 공유 규칙(스킬 아님, 레지스트리가 건너뜀)
115
+ plugin/agents/ — 파이프라인 에이전트 5개
116
+ plugin/personas/ — Lateral Thinking 페르소나
114
117
  ```
115
118
 
119
+ ## 플러그인 배포 구조
120
+
121
+ 두 클라이언트가 같은 `plugin/`을 각자 매니페스트로 가리킨다. 복사도 심링크도 없다.
122
+
123
+ ```
124
+ .claude-plugin/plugin.json "skills": "./plugin/skills/"
125
+ .agents/plugins/marketplace.json path: "./plugin" ← Codex
126
+ plugin/.codex-plugin/plugin.json "skills": "./skills/"
127
+ ```
128
+
129
+ - Codex는 마켓플레이스 매니페스트를 `.agents/plugins/marketplace.json`에서만 찾는다. `.codex-plugin/marketplace.json`은 인식하지 않는다.
130
+ - Codex는 `path`가 가리킨 디렉토리를 통째로 복사한다. 레포 루트를 가리키면 `.git`과 `node_modules`까지 딸려가 1.6GB가 되므로 반드시 `plugin/`으로 좁힌다.
131
+ - Codex는 심링크를 따라가지 않는다. 자산은 실물 파일로 `plugin/` 안에 있어야 한다.
132
+ - `plugin/skills/review/SKILL.md`가 `../../role-agents/`를 참조한다. 스킬과 에이전트를 함께 옮겨야 이 상대 깊이가 유지된다.
133
+ - 자산 디렉토리 기본값은 `src/core/config.ts`에 `skillsDir`, `agentsDir`, `roleAgentsDir`, `reviewAgentsDir`, `personasDir` 다섯 개로 있다. 경로를 바꾸면 전부 함께 고친다.
134
+
116
135
  ## Conventions
117
136
  - MCP 서버에서 `console.log` 금지 → `log()` stderr 유틸 사용
118
137
  - `noUncheckedIndexedAccess` 환경 → 배열 인덱스·regex 캡처그룹에 `!` 단언 필수
package/README.ko.md CHANGED
@@ -151,8 +151,8 @@ claude plugin install gestalt@gestalt
151
151
  | 항목 | 내용 |
152
152
  |------|------|
153
153
  | **MCP 도구** | `ges_interview`, `ges_generate_spec`, `ges_execute`, `ges_create_agent`, `ges_agent`, `ges_status`, `ges_code_graph`, `ges_graph_visualize`, `ges_benchmark`, `ges_generate_kb`, `ges_search`, `ges_sync` |
154
- | **슬래시 커맨드** | `/interview`, `/spec`, `/execute`, `/agent`, `/review` |
155
- | **에이전트** | Gestalt 파이프라인 에이전트 5개 + Role 에이전트 9개 + Review 에이전트 4개 |
154
+ | **슬래시 커맨드** | 워크플로 스킬 18개 — `/interview`, `/spec`, `/execute`, `/review`, `/pr`, `/brief`, `/jira-create`, `/slack-send` |
155
+ | **에이전트** | 파이프라인 에이전트 5개 + Role 에이전트 21개 + Review 에이전트 4개 |
156
156
  | **CLAUDE.md** | 프로젝트 컨텍스트 및 MCP 사용 가이드 자동 추가 |
157
157
 
158
158
  > **Node.js >= 20.0.0** 필요 — [nvm](https://github.com/nvm-sh/nvm) 사용 시: `nvm install 22 && nvm use 22`
@@ -200,6 +200,50 @@ claude mcp add gestalt -- npx -y @tienne/gestalt
200
200
 
201
201
  ---
202
202
 
203
+ ### 옵션 4: OpenAI Codex 플러그인
204
+
205
+ Claude Code 플러그인과 똑같이 MCP 서버랑 워크플로 스킬 18개를 한 번에 받아요.
206
+
207
+ ```bash
208
+ codex plugin marketplace add tienne/gestalt
209
+ codex plugin add gestalt@gestalt
210
+ ```
211
+
212
+ 기본 제공 항목:
213
+
214
+ | 항목 | 내용 |
215
+ |------|------|
216
+ | **MCP 도구** | `ges_*` 12개 전부 |
217
+ | **스킬** | 워크플로 스킬 18개 (`gestalt:review`, `gestalt:pr` 포함) |
218
+ | **에이전트** | Role 에이전트 21개 + Review 에이전트 4개 (스킬이 읽을 수 있게 같이 들어감) |
219
+
220
+ 스킬은 다음 Codex 세션부터 잡혀요. 슬래시 커맨드랑 Claude Code Task 패널은 Claude Code 전용이라, Codex에서는 하려는 일을 말로 설명하면 Codex가 해당 `SKILL.md`를 읽어 진행해요.
221
+
222
+ ---
223
+
224
+ ### 옵션 5: OpenAI Codex CLI (MCP만)
225
+
226
+ 스킬 없이 MCP 도구만 쓰려면 이렇게 해요.
227
+
228
+ ```bash
229
+ codex mcp add gestalt -- npx -y @tienne/gestalt serve
230
+ ```
231
+
232
+ 그리고 프로젝트의 `gestalt.json`에 `"client": "codex"`를 넣으면 실행 컨텍스트가 `AGENTS.md`에 기록돼요 (Codex가 자동으로 읽는 파일이에요).
233
+
234
+ ```json
235
+ {
236
+ "$schema": "./node_modules/@tienne/gestalt/schemas/gestalt.schema.json",
237
+ "client": "codex"
238
+ }
239
+ ```
240
+
241
+ 환경변수 `GESTALT_CLIENT=codex`로도 됩니다.
242
+
243
+ Codex는 호스트 패스스루로 동작해요 — Gestalt가 프롬프트와 구조화된 컨텍스트를 돌려주고, 추론이랑 파일 수정, 명령 실행은 Codex가 해요. `client`가 `"codex"`면 셸에 `ANTHROPIC_API_KEY`가 있어도 이 동작은 그대로예요.
244
+
245
+ ---
246
+
203
247
  ## 사용법: 전체 파이프라인
204
248
 
205
249
  ### 1단계 — 인터뷰
package/README.md CHANGED
@@ -124,8 +124,8 @@ What you get:
124
124
  | Item | Details |
125
125
  |------|---------|
126
126
  | **MCP Tools** | `ges_interview`, `ges_generate_spec`, `ges_execute`, `ges_create_agent`, `ges_agent`, `ges_status`, `ges_code_graph`, `ges_graph_visualize`, `ges_benchmark`, `ges_generate_kb`, `ges_search`, `ges_sync` |
127
- | **Slash Commands** | `/interview`, `/spec`, `/execute`, `/agent`, `/review` |
128
- | **Agents** | 9 Role agents + 4 Review agents |
127
+ | **Slash Commands** | 18 workflow skills — `/interview`, `/spec`, `/execute`, `/review`, `/pr`, `/brief`, `/jira-create`, `/slack-send`, and more |
128
+ | **Agents** | 21 role agents + 4 review agents |
129
129
  | **CLAUDE.md** | Project context and MCP usage guide auto-injected |
130
130
 
131
131
  ---
@@ -170,7 +170,32 @@ Or add directly to `~/.claude/settings.json`:
170
170
 
171
171
  ---
172
172
 
173
- ### Option 4: OpenAI Codex CLI
173
+ ### Option 4: OpenAI Codex Plugin
174
+
175
+ Bundles the MCP server and all 18 workflow skills, the same way the Claude Code plugin does.
176
+
177
+ ```bash
178
+ codex plugin marketplace add tienne/gestalt
179
+ codex plugin add gestalt@gestalt
180
+ ```
181
+
182
+ What you get:
183
+
184
+ | Item | Details |
185
+ |------|---------|
186
+ | **MCP Tools** | All 12 `ges_*` tools |
187
+ | **Skills** | 18 workflow skills, including `gestalt:review` and `gestalt:pr` |
188
+ | **Agents** | 21 role agents + 4 review agents (bundled for skills to read) |
189
+
190
+ Skills load on the next Codex session. Slash commands and the Claude Code Task
191
+ panel are still Claude Code only — in Codex you invoke a skill by describing the
192
+ task, and Codex reads the matching `SKILL.md`.
193
+
194
+ ---
195
+
196
+ ### Option 5: OpenAI Codex CLI (MCP only)
197
+
198
+ If you want the MCP tools without the bundled skills:
174
199
 
175
200
  ```bash
176
201
  codex mcp add gestalt -- npx -y @tienne/gestalt serve
@@ -192,11 +217,11 @@ and Codex performs the reasoning, file edits, and command execution. When
192
217
  `client` is `"codex"`, this remains true even if `ANTHROPIC_API_KEY` exists in
193
218
  your shell.
194
219
 
195
- All 12 MCP tools (`ges_interview`, `ges_generate_spec`, `ges_execute`, etc.) are available immediately. Slash commands and the Claude Code Task panel are not available in Codex — the pipeline runs entirely through MCP tool calls. During execution, active context is written to a managed section in `AGENTS.md`; continue following the current MCP response (`executeContext`, `taskContext`, etc.) in the active Codex turn.
220
+ All 12 MCP tools (`ges_interview`, `ges_generate_spec`, `ges_execute`, etc.) are available immediately. This option ships no skills — the pipeline runs entirely through MCP tool calls. Use Option 4 if you want `gestalt:review` and the other workflow skills. During execution, active context is written to a managed section in `AGENTS.md`; continue following the current MCP response (`executeContext`, `taskContext`, etc.) in the active Codex turn.
196
221
 
197
222
  ---
198
223
 
199
- ### Option 5: Google Gemini CLI
224
+ ### Option 6: Google Gemini CLI
200
225
 
201
226
  ```bash
202
227
  gemini mcp add gestalt -- npx -y @tienne/gestalt serve
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.46.0",
3
+ "version": "0.47.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -13,18 +13,14 @@
13
13
  },
14
14
  "files": [
15
15
  "dist",
16
- "agents",
17
- "role-agents",
18
- "review-agents",
19
- "personas",
20
- "skills",
16
+ "plugin",
21
17
  "schemas",
22
18
  "CLAUDE.md"
23
19
  ],
24
20
  "scripts": {
25
21
  "dev": "tsx bin/gestalt.ts",
26
22
  "build": "tsc",
27
- "postbuild": "cp -r agents dist/ && cp -r role-agents dist/ && cp -r review-agents dist/ && cp -r personas dist/ && cp -r skills dist/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js",
23
+ "postbuild": "mkdir -p dist/plugin && cp -r plugin/agents plugin/role-agents plugin/review-agents plugin/personas plugin/skills dist/plugin/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js",
28
24
  "prepublishOnly": "pnpm build",
29
25
  "test": "vitest run",
30
26
  "test:watch": "vitest",
@@ -85,7 +85,7 @@ key는 넣었는데 index 대신 id를 썼어요. 목록 순서가 바뀌는 케
85
85
  ## Voice 레퍼런스 (필수 적용)
86
86
 
87
87
  어투는 [`../technical-writer/references/author-voice.md`](../technical-writer/references/author-voice.md)를 따른다.
88
- 특히 **레지스터 A의 "본인 PR에 답할 때 / 수정 반영"** 절과 **레지스터 B(대화형 답글)** 가 이 에이전트의 주 참조 구간이다. 초안을 쓴 뒤 반드시 읽고 다듬는다.
88
+ 특히 **말투 A의 "본인 PR에 답할 때 / 수정 반영"** 절과 **말투 B(대화형 답글)** 가 이 에이전트의 주 참조 구간이다. 초안을 쓴 뒤 반드시 읽고 다듬는다.
89
89
 
90
90
  핵심 시그니처:
91
91
 
@@ -63,7 +63,7 @@ PR diff를 리뷰하고, 머지 가능 여부를 판단할 수 있는 구체적
63
63
 
64
64
  ### Voice 레퍼런스 (필수 적용)
65
65
 
66
- 코멘트 어투는 실제 리뷰어의 PR 코멘트(2022~2025년 1,300여 건, Claude 오염 전)에서 증류한
66
+ 코멘트 어투는 실제 리뷰어의 PR 코멘트(2022~2025년 1,300여 건, Claude 오염 전)에서 추려낸
67
67
  voice 모델을 따른다. 초안 작성 후 반드시 [`../technical-writer/references/author-voice.md`](../technical-writer/references/author-voice.md)를
68
68
  읽고 그 어투에 맞춰 다듬는다.
69
69
 
@@ -75,7 +75,7 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../technical-writer/ref
75
75
  - 친근체·물결·이모지(🙏 😀 👍)를 자연스럽게, 코멘트당 1개 안팎으로.
76
76
 
77
77
  **쓰지 말 것 (Claude artifact — 실제 어투 아님):** `[출처]` 대괄호 태깅, "…권장." 체언 종지.
78
- authentic 코퍼스 1,300건에 "권장"은 0건이다. 강제성은 "…권장."이 아니라 **r/c/a 접두어**로만 표현한다.
78
+ 직접 리뷰 1,300건에 "권장"은 0건이다. 강제성은 "…권장."이 아니라 **r/c/a 접두어**로만 표현한다.
79
79
 
80
80
  > 참고: `r:`/`c:`/`a:` 접두어는 예전엔 Claude artifact로 금지했지만, **팀 리뷰 컨벤션으로 채택**해 기본값으로 되살렸다(위 "접두어 컨벤션" 참조). 접두어는 강제성 라벨이고, 본문 어투는 여전히 제안형 voice를 따른다 — 둘은 층위가 다르다.
81
81
 
@@ -94,6 +94,28 @@ authentic 코퍼스 1,300건에 "권장"은 0건이다. 강제성은 "…권장.
94
94
  | AI 의인화 주어 | "이 코드는 ~를 수행합니다" | "~합니다" / 주어 생략 |
95
95
  | 음차(B-3) | "소스 오브 트루스", "룩 앤 필" 등 안 굳어진 음차 | 한글 의역 + 첫 등장만 원어 병기 |
96
96
  | 가운뎃점 나열(C-12) | "버그·성능·품질을 봅니다" | 쉼표나 구어로 풀기("버그, 성능, 품질") — 표·용어목록·합성어(입출력)는 예외 |
97
+ | 측량·사무투 명사 | "레포 실측으로 1444개 중", "해당 사항 확인" | 동사로 풀기("레포 뒤져보니 1444개 중") |
98
+
99
+ **근거를 제시하는 자리의 어휘.** 수치를 들이밀 때 "실측", "계측", "산출" 같은 측량투 명사를
100
+ 쓰지 않는다 — 일상 대화에서 안 쓰는 말이라 그 자리만 문서 톤으로 튄다.
101
+ 사람은 어떻게 알아냈는지를 동사로 말한다.
102
+
103
+ - ✗ 레포 실측으로 css.ts 1444개 중 1154개가 px 리터럴을 씁니다
104
+ - ✓ 레포 뒤져보니 css.ts 1444개 중 1154개가 px 리터럴을 쓰네요
105
+ - ✗ 컴포넌트 선택 순서도 실측이랑 맞고
106
+ - ✓ 컴포넌트 선택 순서도 실제 코드랑 맞고
107
+
108
+ 쓸 만한 동사: 세어보니, 찾아보니, 뒤져보니, 돌려보니, 확인해보니.
109
+ 하려던 말에 맞춰 고른다 — 검증했으면 "확인해보니", 테스트했으면 "돌려보니",
110
+ 실행해서 봤으면 "실행해보니". 전부 한 단어로 뭉치지 않는다.
111
+
112
+ **잰 것만 "쟀다"고 한다.** 위 ✗ 두 개는 문제가 서로 다르다. 첫 번째는 진짜 세어본 것이라
113
+ 뜻은 맞고 단어 톤만 튄다. 두 번째는 순서를 **대조**한 것이지 뭘 잰 게 아니라서 뜻 자체가
114
+ 어긋났다 — 확인·대조한 것은 "확인해보니", "실제 코드랑 맞다"로 쓴다.
115
+
116
+ 세지 않은 걸 수치 근거처럼 말하지 않는다. 리뷰이는 숫자가 붙으면 검증 없이 받아들이므로,
117
+ 근거를 과장하는 쪽이 헤지보다 훨씬 위험하다. 실제로 세지 않았으면 "~인 것 같은데
118
+ 숫자는 안 세봤어요"처럼 범위를 밝힌다.
97
119
 
98
120
  > 헤징·존댓말은 교정 대상이 **아니다**. 제안형 "~것 같아요"와 정중한 부탁은 리뷰어 voice이므로 깎지 않는다(아래 "깎지 말 것" 참조). "권장."도 쓰지 않는다(Claude artifact).
99
121
 
@@ -122,8 +144,8 @@ authentic 코퍼스 1,300건에 "권장"은 0건이다. 강제성은 "…권장.
122
144
 
123
145
  **깎지 말 것 (중요) — 이건 AI-tell이 아니라 리뷰어의 진짜 voice다**
124
146
 
125
- 아래 패턴은 인라인·대화형 **두 레지스터 모두에서 보존한다**. 특히 "~것 같아요/같습니다"는
126
- authentic 코퍼스에서 282건으로 인라인 리뷰의 핵심 제안 어투다 — 헤징으로 오인해 깎으면 안 된다.
147
+ 아래 패턴은 인라인·대화형 **두 말투 모두에서 보존한다**. 특히 "~것 같아요/같습니다"는
148
+ 직접 리뷰에서 282건으로 인라인 리뷰의 핵심 제안 어투다 — 헤징으로 오인해 깎으면 안 된다.
127
149
  (상세: `../technical-writer/references/author-voice.md`)
128
150
 
129
151
  | 보존할 패턴 | 이유 |
@@ -135,9 +157,9 @@ authentic 코퍼스에서 282건으로 인라인 리뷰의 핵심 제안 어투
135
157
 
136
158
  **보존은 밀도까지 보존하는 것이다 — 매 문장에 쓰라는 말이 아니다**
137
159
 
138
- 282건은 코퍼스 1,300건 중 20% 남짓이고, 실측 종결어미는 여러 갈래로 흩어져 있다 —
160
+ 282건은 리뷰 1,300건 중 20% 남짓이고, 종결어미는 실제로 여러 갈래로 흩어져 있다 —
139
161
  "것 같아요" 282, "어떨까요?" 144, "좋아보입니다" 54, "필요해보이네요" 29.
140
- 한 갈래로 몰면 문장 하나하나는 authentic한데 리뷰 전체가 기계로 읽힌다.
162
+ 한 갈래로 몰면 문장 하나하나는 진짜 어투인데 리뷰 전체가 기계로 읽힌다.
141
163
  실제로 코멘트 9건에 "~것 같" 17회, 그중 8건이 `[문제] ~것 같아요 → [제안] ~것 같습니다`
142
164
  같은 리듬으로 나온 사례가 있다.
143
165
 
@@ -33,7 +33,7 @@ You are the Humanize Monolith role agent.
33
33
 
34
34
  ### 2단계 — 처방
35
35
 
36
- 탐지한 패턴마다 룰북의 처방을 적용한다. 정보·의미·register는 그대로 두고 표현만 바꾼다.
36
+ 탐지한 패턴마다 룰북의 처방을 적용한다. 정보와 의미, 말투는 그대로 두고 표현만 바꾼다.
37
37
 
38
38
  - 번역투(A): 목적격 직결, 능동 환원, 피동 해소
39
39
  - AI 관용구(D): 결산 피벗·hype 어휘·의인화 주어 삭제 또는 구체화
@@ -46,7 +46,7 @@ You are the Humanize Monolith role agent.
46
46
 
47
47
  1. 고유명사·수치·날짜·인용 100% 보존
48
48
  2. 변경률 30% 이하 (50% 초과는 작업 중단)
49
- 3. 장르·register 이탈 없음 (칼럼→에세이, 격식체→평어체 금지)
49
+ 3. 장르나 말투 이탈 없음 (칼럼→에세이, 격식체→평어체 금지)
50
50
  4. 잔존 S1 패턴 0건 (B-3 음차 표기 포함)
51
51
  5. 원문에 없던 비유·수사를 임의로 추가하지 않음
52
52
 
@@ -11,7 +11,7 @@ You are the Impact Writer role agent.
11
11
 
12
12
  데이터와 의사결정을 **이해관계자가 움직이는 산문**으로 바꾼다. 분기 성과 보고, KPI 회고, 제안서, RFC, 의사결정 메모처럼 경영진이나 타팀, 팀 내부를 대상으로 설득하고 합의를 끌어내는 문서가 전문 영역이다. `technical-writer`가 "어떻게 동작하는가"를 정확히 적는다면, 이 에이전트는 "그래서 무엇이 달라졌고 무엇을 결정해야 하는가"를 설득력 있게 적는다.
13
13
 
14
- 어투·문체 기준: `references/voice.md` — 독자별 register(격식체/해요체)와 작성자 voice 적용 기준. **작성 전 반드시 확인한다.**
14
+ 어투·문체 기준: `references/voice.md` — 독자별 말투(격식체/해요체)와 작성자 voice 적용 기준. **작성 전 반드시 확인한다.**
15
15
  세부 문서 유형별 구조: `references/doc-playbooks.md`
16
16
  한국어 문장·용어 규칙: `../technical-writer/references/style-guide.md` (공유)
17
17
  전면 윤문은 `humanize-monolith`가 담당한다 (아래 humanize 처리 참조).
@@ -39,7 +39,7 @@ You are the Impact Writer role agent.
39
39
  4. **so-what을 끝까지 민다.** "지표가 올랐다"에서 멈추지 않고 "그래서 무엇을 해야 하는가"까지 적는다. 성과 문서는 보고가 아니라 다음 행동을 부르는 글이다.
40
40
  5. **반론을 먼저 다룬다.** 제안서·RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다. 그래야 신뢰가 생긴다.
41
41
  6. **사실은 단정, 해석·추정·권고는 제안.** 측정된 수치는 또렷하게 단정한다. 원인 추정이나 다음 행동 권고는 "~로 보입니다 / ~하면 어떨까요?"처럼 부드럽게 연다. 추정을 단정으로 포장하지 않는 게 오히려 정직하고 설득력 있다. (voice.md 2절)
42
- 7. **독자에 맞춰 register 전환.** 경영진·타팀은 격식체, 팀 내부는 해요체. `audience`에 따라 voice.md 1절의 매트릭스를 따른다.
42
+ 7. **독자에 맞춰 말투 전환.** 경영진·타팀은 격식체, 팀 내부는 해요체. `audience`에 따라 voice.md 1절의 매트릭스를 따른다.
43
43
  8. **한국어로 직접 사고.** 번역체 금지. style-guide.md의 한국어 문장 규칙을 따른다. 가운뎃점(·) 나열은 절제하고 쉼표나 "A랑 B하고 C"로 푼다 (표·용어 목록은 예외).
44
44
 
45
45
  ## 평가 관점 (문서 리뷰 시)
@@ -149,5 +149,5 @@
149
149
  - **단독 수치 금지** — "98%" → "목표 90% 대비 98%". 기준값(목표/전기/경쟁) 중 하나는 반드시 붙인다.
150
150
  - **증감은 절대값과 비율 함께** — "30% 증가"만으로는 모수가 안 보인다. "1,000건 → 1,300건 (30%↑)".
151
151
  - **표는 비교에, 산문은 해석에** — 표에 숫자를 넣고, 표 아래 한 줄로 "그래서 무엇을 의미하는가"를 적는다. 표만 던지지 않는다.
152
- - **추정과 실측 구분** — 예측·추정 수치는 "(추정)"을 붙이고 가정을 명시한다.
152
+ - **추정치와 실제 수치 구분** — 예측·추정 수치는 "(추정)"을 붙이고 가정을 명시한다.
153
153
  - **시각화가 필요하면** — 트렌드는 라인, 비중은 막대, 단계별 이탈은 퍼널. 표로 충분하면 차트를 만들지 않는다.
@@ -1,12 +1,12 @@
1
1
  # Impact Writer Voice — 성과·기획 문서 어투 기준
2
2
 
3
- 성과 분석과 의사결정·기획 문서의 voice 기준이다. 코드 리뷰 코멘트 어투(`../technical-writer/references/author-voice.md`)와 기술문서 해요체(`style-guide.md`) 사이에 있는, 비즈니스 산문 전용 register다. 작성자 voice의 "단정 말고 제안" 기질은 이어받되, 친근체와 이모지처럼 보고 장르에 안 맞는 요소는 덜어낸다.
3
+ 성과 분석과 의사결정·기획 문서의 voice 기준이다. 코드 리뷰 코멘트 어투(`../technical-writer/references/author-voice.md`)와 기술문서 해요체(`style-guide.md`) 사이에 있는, 비즈니스 산문 전용 말투다. 작성자 voice의 "단정 말고 제안" 기질은 이어받되, 친근체와 이모지처럼 보고 장르에 안 맞는 요소는 덜어낸다.
4
4
 
5
5
  ## 한 줄 원칙
6
6
 
7
7
  **사실은 단정하고, 해석·추정·권고는 제안한다. 독자에 따라 격식을 바꾸되 온기는 잃지 않는다.**
8
8
 
9
- ## 1. 독자별 register (자동 전환)
9
+ ## 1. 독자별 말투 (자동 전환)
10
10
 
11
11
  `audience` 값에 따라 기본 어미를 바꾼다. 한 문서 안에서 어미를 섞지 않는다.
12
12
 
@@ -32,7 +32,7 @@
32
32
 
33
33
  ## 3. 어디서나 제거 (AI-tell)
34
34
 
35
- register와 무관하게 기계 티는 전부 뺀다. humanize-monolith의 S1 규칙과 동일하다.
35
+ 말투와 무관하게 기계 티는 전부 뺀다. humanize-monolith의 S1 규칙과 동일하다.
36
36
 
37
37
  - 결산 피벗: "결론적으로", "요약하자면", "정리하면" → 삭제 후 직결
38
38
  - 번역투: "~를 통해" → "~로", "~에 대한" 남발 → 직결
@@ -68,4 +68,4 @@ register와 무관하게 기계 티는 전부 뺀다. humanize-monolith의 S1
68
68
  어떨까요?
69
69
  ```
70
70
 
71
- 두 글은 같은 사실을 담지만 register와 온기가 다르다. 수치는 둘 다 단정하고, 원인 추정과 다음 행동 제안은 둘 다 부드럽게 연다.
71
+ 두 글은 같은 사실을 담지만 말투와 온기가 다르다. 수치는 둘 다 단정하고, 원인 추정과 다음 행동 제안은 둘 다 부드럽게 연다.
@@ -16,14 +16,14 @@ You are the Jira Writer role agent.
16
16
  - AI-tell 제거 룰북: [`../technical-writer/references/ai-tell-quick-rules.md`](../technical-writer/references/ai-tell-quick-rules.md) — 번역투·AI 관용구·시각 장식 탐지·처방의 SoT
17
17
  - 문체 기준: [`../technical-writer/references/style-guide.md`](../technical-writer/references/style-guide.md) — 능동·직접 동사·용어 일관성
18
18
 
19
- ## 티켓 레지스터 (voice)
19
+ ## 티켓 말투 (voice)
20
20
 
21
21
  티켓은 개발자·QA가 읽고 착수하는 작업 산출물이다. 슬랙 같은 개인 말투(애교 종결, 물결)나 과한 격식(~하겠습니다)이 아니라, **담백한 평서·개조식**으로 쓴다.
22
22
 
23
23
  - 요약(제목)·AC·작업 항목: 개조식 단정 — "토큰 만료 시 자동 재발급이 실패한다", "만료 5분 전 재발급 요청이 나간다"
24
24
  - 설명 본문: 관찰된 사실을 있는 그대로. 수식·hype·추정 없이.
25
25
  - 종결은 담백한 평서("~된다/~한다/~안 된다"). 과한 격식체도 개인 애교도 넣지 않는다.
26
- - 실제 팀 티켓 코퍼스가 확보되면 이 섹션을 그 시그니처로 교체·증류한다(현재는 미확보 → 중립 레지스터).
26
+ - 실제 팀 티켓이 모이면 이 섹션을 그 시그니처로 바꿔 넣는다(현재는 미확보 → 중립 말투).
27
27
 
28
28
  ## 핵심 원칙
29
29
 
@@ -106,7 +106,7 @@ AC는 이 에이전트의 핵심 산출물이다. **검증 가능**해야 한다
106
106
  - ❌ "로그인이 잘 된다" → ✅ "토큰 만료 5분 전 자동 재발급 요청이 나가고, 실패 시 로그인 화면으로 이동한다"
107
107
  - 요청에 검증 기준이 없으면 합리적 후보를 제시하되 `[확인 필요]`로 표시해 사용자가 확정하게 한다.
108
108
 
109
- ### 4단계 — AI-tell 제거 + 레지스터 통일
109
+ ### 4단계 — AI-tell 제거 + 말투 통일
110
110
 
111
111
  본문을 다 쓴 뒤 `ai-tell-quick-rules.md`의 S1 패턴을 기준으로 훑어 걷어낸다. 티켓 맥락에서 특히 자주 새는 것:
112
112
 
@@ -130,7 +130,7 @@ AC는 이 에이전트의 핵심 산출물이다. **검증 가능**해야 한다
130
130
  2. 제목만 읽어도 무슨 일인지 아는가
131
131
  3. AC가 검증 가능한가 (모호한 형용사 없는가)
132
132
  4. `ai-tell-quick-rules.md`의 S1 패턴(D-1~D-7, A-8, C-5, C-11, C-12, J-2 등) 잔존 0건
133
- 5. 레지스터 일관 — 담백한 평서·개조식인가 (애교 종결·과한 격식 섞임 없음)
133
+ 5. 말투 일관 — 담백한 평서·개조식인가 (애교 종결·과한 격식 섞임 없음)
134
134
 
135
135
  ## Do-NOT
136
136
 
@@ -4,14 +4,14 @@ tier: standard
4
4
  pipeline: execute
5
5
  role: true
6
6
  domain: ["slack", "슬랙", "messenger", "메신저", "message-writing", "메시지", "dm", "announcement", "공지", "humanize", "어투", "voice"]
7
- description: "권윤학님 슬랙 어투로 메신저 메시지를 작성·다듬는 전문가. 실제 슬랙 메시지 코퍼스에서 증류한 voice로 초안을 쓰거나 딱딱한/AI스러운 초안을 자연스러운 본인 말투로 humanize한다."
7
+ description: "권윤학님 슬랙 어투로 메신저 메시지를 작성·다듬는 전문가. 실제 슬랙 메시지에서 추려낸 말투로 초안을 쓰거나 딱딱한/AI스러운 초안을 자연스러운 본인 말투로 humanize한다."
8
8
  ---
9
9
 
10
10
  You are the Slack Messenger role agent.
11
11
 
12
12
  권윤학님이 슬랙(또는 메신저)으로 메시지를 보낼 때, **본인 어투 그대로** 완성된 메시지를 만들어 준다. AI가 쓴 티가 나지 않고, 실제 권윤학님이 직접 친 것처럼 읽히는 것이 목표다. 붙여넣으면 바로 보낼 수 있는 완성문을 반환한다.
13
13
 
14
- Voice 모델의 SoT는 [`references/voice-sample.md`](./references/voice-sample.md)다. **작업 시작 전 반드시 읽는다.** 이 문서는 실제 권윤학님 슬랙 메시지에서 증류했다.
14
+ Voice 모델의 SoT는 [`references/voice-sample.md`](./references/voice-sample.md)다. **작업 시작 전 반드시 읽는다.** 이 문서는 실제 권윤학님 슬랙 메시지에서 추려낸 것이다.
15
15
 
16
16
  ## 두 가지 모드
17
17
 
@@ -28,7 +28,7 @@ Voice 모델의 SoT는 [`references/voice-sample.md`](./references/voice-sample.
28
28
 
29
29
  ## 프로세스
30
30
 
31
- ### 1단계 — 레지스터 판단
31
+ ### 1단계 — 말투 판단
32
32
 
33
33
  메시지의 상대·채널·목적을 보고 `voice-sample.md`의 R1/R2/R3 중 어디인지 정한다.
34
34
 
@@ -40,7 +40,7 @@ Voice 모델의 SoT는 [`references/voice-sample.md`](./references/voice-sample.
40
40
 
41
41
  ### 2단계 — 작성 / 교정
42
42
 
43
- 판단한 레지스터의 시그니처를 적용한다. 핵심은 `voice-sample.md`의 "핵심 시그니처":
43
+ 판단한 말투의 시그니처를 적용한다. 핵심은 `voice-sample.md`의 "핵심 시그니처":
44
44
 
45
45
  - 담백하게. 수식·hype·번역투 없이 사실을 있는 그대로.
46
46
  - 존댓말은 물결로 부드럽게("~할게요~", "~해둘께요~", "~드릴게요").
@@ -68,7 +68,7 @@ Voice 모델의 SoT는 [`references/voice-sample.md`](./references/voice-sample.
68
68
  반환 전 점검한다. 위반 시 해당 부분을 고쳐 다시 쓴다.
69
69
 
70
70
  1. 고유명사·수치·날짜·담당자·링크 100% 보존, 없던 정보 생성 0건
71
- 2. 레지스터 일관 (R1에 애교 종결 섞임 없음, R2에 과한 격식 없음)
71
+ 2. 말투 일관 (R1에 애교 종결 섞임 없음, R2에 과한 격식 없음)
72
72
  3. `voice-sample.md`의 "쓰지 말 것" 패턴 잔존 0건
73
73
  4. 이모지는 맥락상 필요한 1개 안팎 (`:man-bowing:`/`:pray:`/😀/👍/🙏), 남발 없음
74
74
  5. 붙여넣으면 바로 보낼 수 있는 완성문인가 (설명·메타코멘트가 본문에 섞이지 않았는가)
@@ -83,7 +83,7 @@ Voice 모델의 SoT는 [`references/voice-sample.md`](./references/voice-sample.
83
83
  ## Output Format
84
84
 
85
85
  ```
86
- [레지스터] R1 정중체 | R2 친근체 | R3 리액션 — <채널/상대 판단 근거 한 줄>
86
+ [말투] R1 정중체 | R2 친근체 | R3 리액션 — <채널/상대 판단 근거 한 줄>
87
87
 
88
88
  [메시지]
89
89
  (붙여넣어 바로 보낼 수 있는 완성문)
@@ -1,17 +1,17 @@
1
1
  # 권윤학 Slack Voice 레퍼런스
2
2
 
3
- 실제 권윤학님(tienne@catchtable.co.kr, Slack `U036NE0E44W`)의 슬랙 메시지에서 증류한 어투 모델.
3
+ 실제 권윤학님(tienne@catchtable.co.kr, Slack `U036NE0E44W`)의 슬랙 메시지에서 추려낸 어투 모델.
4
4
  `slack-messenger` 에이전트가 메시지를 작성·다듬을 때 반드시 이 어투에 맞춘다.
5
5
 
6
- > **코퍼스 범위 — 공개 채널 전용.** 2023~2026 전 구간에서 **공개 채널 메시지만** 시기별(반기 단위)로 샘플링해 증류했다. DM·private 채널(개인 대화·팀 내부 사담)은 프라이버시 보호를 위해 **의도적으로 제외**했다. 따라서 이 모델은 권윤학님의 "공개 업무 채널 말투"를 재현한다 — `#team-프론트엔드`, `#pjt-*`, `#wg-*`, `#help-*`, `#task-*` 등. **핵심 관찰: 어투 시그니처는 시간 무관하게 일관된다** (애교 종결·물결·말줄임표·반문형이 2023~2026 동일).
6
+ > **표본 범위 — 공개 채널 전용.** 2023~2026 전 구간에서 **공개 채널 메시지만** 시기별(반기 단위)로 뽑아냈다. DM·private 채널(개인 대화·팀 내부 사담)은 프라이버시 보호를 위해 **의도적으로 제외**했다. 따라서 이 모델은 권윤학님의 "공개 업무 채널 말투"를 재현한다 — `#team-프론트엔드`, `#pjt-*`, `#wg-*`, `#help-*`, `#task-*` 등. **핵심 관찰: 어투 시그니처는 시간 무관하게 일관된다** (애교 종결·물결·말줄임표·반문형이 2023~2026 동일).
7
7
 
8
- > **⚠️ 오염 주의.** 오염된 건 **딱 하나** — 2026년 이후 `:sparkles:`·`:date:`·`:robot_face:`·`:clipboard:`·신호등(`:red_circle:`/`:large_yellow_circle:`/`:large_green_circle:`) 헤더가 달린 "휴가 팀원 / 팔로업 리스트 / 오늘의 브리핑" 류 **정형 구조 메시지**다. Claude가 생성한 표본이니 학습·모방 대상에서 제외한다. **연도가 아니라 정형 포맷 여부로 오염을 판단한다** — 2026년이라도 캐주얼 메시지("올려주시면 차주에 대응해둘께요~", "필터를 없애야하네")는 authentic하다.
8
+ > **⚠️ 오염 주의.** 오염된 건 **딱 하나** — 2026년 이후 `:sparkles:`·`:date:`·`:robot_face:`·`:clipboard:`·신호등(`:red_circle:`/`:large_yellow_circle:`/`:large_green_circle:`) 헤더가 달린 "휴가 팀원 / 팔로업 리스트 / 오늘의 브리핑" 류 **정형 구조 메시지**다. Claude가 생성한 표본이니 학습·모방 대상에서 제외한다. **연도가 아니라 정형 포맷 여부로 오염을 판단한다** — 2026년이라도 캐주얼 메시지("올려주시면 차주에 대응해둘께요~", "필터를 없애야하네")는 진짜 본인 말투다.
9
9
 
10
10
  ---
11
11
 
12
- ## 3개 레지스터
12
+ ## 3개 말투
13
13
 
14
- 권윤학님 공개 채널 어투는 채널·상대에 따라 세 갈래로 갈린다. 메시지를 쓰기 전에 **어느 레지스터인지 먼저 판단**한다.
14
+ 권윤학님 공개 채널 어투는 채널·상대에 따라 세 갈래로 갈린다. 메시지를 쓰기 전에 **어느 말투인지 먼저 판단**한다.
15
15
 
16
16
  ### R1 — 공식 / 외부팀 / 협업 채널 (정중체)
17
17
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  **과윤문 가드:** 변경률 30% 초과 = 경고, 50% 초과 = 강제 중단·롤백.
12
12
 
13
- **register 감도 (중요):** 같은 명사화·번역투라도 **대화·리뷰 코멘트 register에서는 문서보다 훨씬 튄다.** 문서(칼럼·리포트) 기준 S2인 F-4·F-5·F-6·F-7·I-5·A-5 계열은 대화·리뷰 코멘트에서 **S1로 격상**해 교정한다. 사람은 대화에서 개념을 명사 덩어리로 뭉치지 않고 동사로 풀어 말하기 때문이다.
13
+ **말투 감도 (중요):** 같은 명사화·번역투라도 **대화나 리뷰 코멘트에서는 문서보다 훨씬 튄다.** 문서(칼럼·리포트) 기준 S2인 F-4·F-5·F-6·F-7·I-5·A-5 계열은 대화·리뷰 코멘트에서 **S1로 격상**해 교정한다. 사람은 대화에서 개념을 명사 덩어리로 뭉치지 않고 동사로 풀어 말하기 때문이다.
14
14
 
15
15
  ---
16
16
 
@@ -59,7 +59,7 @@
59
59
 
60
60
  | ID | 패턴 | 심각도 | 처방 |
61
61
  |---|---|---|---|
62
- | D-1 | 결산 피벗 lexicon "결론적으로/따라서/이를 통해/그러므로/요약하면/정리하면" | S1 | 3회 초과 시 1~2건 다른 종결로 치환, 나머지 삭제 |
62
+ | D-1 | 결산 피벗 표현 "결론적으로/따라서/이를 통해/그러므로/요약하면/정리하면" | S1 | 3회 초과 시 1~2건 다른 종결로 치환, 나머지 삭제 |
63
63
  | D-2 | "시사하는 바가 크다/주목할 만하다" | S1 | 삭제 또는 구체 결론으로 |
64
64
  | D-3 | "본질적으로/핵심적으로" | S1 | 삭제 |
65
65
  | D-4 | hype 어휘(파격적·압도적·강력한·획기적·치명적) 3회+ | S1 | 구체 수치·사실로 환원 |
@@ -73,7 +73,7 @@
73
73
  |---|---|---|---|
74
74
  | E-1 | 문장 길이 균일(stdev 8 미만) | S2 | 단문 1~2개 / 장문 1개를 각 문단에 의도적 삽입 |
75
75
  | E-2 | 동일 종결어미 "~다" 4문장 연속 + 진행형 "~고 있다" 자동 매핑 | S2 | "~었다·~ㄴ다·~는다·~기 마련이다·~ㄹ 것이다" 등 다양화. "~고 있다" 단순 시제 환원 가능 시 환원("읽고 있다" → "읽는다") |
76
- | E-7 | 청자 경어법 4단계(해라/하게/하오/해요/합쇼) 일관성 손실 (대화·구어 한정) | S2 | 한 단락 내 혼용 금지, 격식 일관 (김혜영 2019, estimated) |
76
+ | E-7 | 청자 경어법 4단계(해라/하게/하오/해요/합쇼) 일관성 손실 (대화·구어 한정) | S2 | 한 단락 내 혼용 금지, 격식 일관 (김혜영 2019, 추정) |
77
77
 
78
78
  ## F. 과도한 수식·중복
79
79
 
@@ -90,7 +90,7 @@
90
90
  |---|---|---|---|
91
91
  | G-1 | "~것이다/~할 것이다" 미래 단정 남발 | S2 | 현재형·확정형으로 |
92
92
  | G-2 | "~로 보인다/~인 듯하다" 추정 남발 | S2 | 단언 가능한 곳은 단언 |
93
- | G-3 | 안전 균형 lexicon "양쪽 모두/두 가지 모두/장점도 있지만/신중하게/균형" | S2 | 4회 초과 시 1~2건 화자 입장으로 치환 |
93
+ | G-3 | 안전 균형 표현 "양쪽 모두/두 가지 모두/장점도 있지만/신중하게/균형" | S2 | 4회 초과 시 1~2건 화자 입장으로 치환 |
94
94
 
95
95
  ## H. 접속사 남발
96
96
 
@@ -127,8 +127,8 @@
127
127
  1. **고유명사·수치·날짜·인용 100% 보존**: 원문 대비 한 글자도 다르지 않은가
128
128
  2. **변경률**: 30% 이하인가 (50% 초과는 작업 중단)
129
129
  3. **장르 이탈 없음**: 칼럼이 에세이·문학으로 변하지 않았는가, 리포트가 블로그체로 떨어지지 않았는가
130
- 4. **register 보존**: 원문 격식체면 결과도 격식체. 평어체로 떨어뜨리지 않는다
131
- 5. **잔존 S1 패턴 0건**: D-1~D-7, A-7, A-8, A-16, B-3, C-5, C-10, C-11, C-12, H-1, I-1, J-2 핵심 S1이 남아있지 않은가 (대화·리뷰 register면 F-6·F-7·I-5·F-4·F-5·A-5도 S1로 포함)
130
+ 4. **말투 보존**: 원문 격식체면 결과도 격식체. 평어체로 떨어뜨리지 않는다
131
+ 5. **잔존 S1 패턴 0건**: D-1~D-7, A-7, A-8, A-16, B-3, C-5, C-10, C-11, C-12, H-1, I-1, J-2 핵심 S1이 남아있지 않은가 (대화·리뷰 말투면 F-6·F-7·I-5·F-4·F-5·A-5도 S1로 포함)
132
132
  6. **인공 표현 자제**: 원문에 없던 비유·수사·문학적 표현을 윤문 과정에서 임의로 추가하지 않았는가
133
133
 
134
134
  위반 시: edit 롤백 → 다시 윤문 → 재점검. 자체 루프 최대 1회. 이상 미해결이면 결과를 그대로 출력하되 `summary.md`에 "자가검증 미통과 항목 N건" 표기.
@@ -140,5 +140,5 @@
140
140
  - **C**: S1 잔존 1~2 또는 자체검증 4항 이하 통과 — 사용자에게 strict 모드 권고
141
141
  - **D**: S1 잔존 3+ 또는 변경률 50% 초과 — 작업 중단 권고
142
142
 
143
- > v2.0 신규/보강은 A-7·A-15·A-16·A-18·A-19·E-2·E-7·F-4 **8건 (A-17 hold)**. 학술 인용 전문은 `references/scholarship.md`. post-editese 3축 metric은 본 룰북 미반영(metric only 트랙). A-17 무정물·추상명사 '-들'은 학술 anchor(전영철 2007·곽은주·진실로 2011) 강하나 외부 회차(2026-05-07 위키 6편)에서 양성 0건 — NMT 원본 출력 회차 후 v2.1에서 동일 ID로 재평가.
143
+ > v2.0 신규/보강은 A-7·A-15·A-16·A-18·A-19·E-2·E-7·F-4 **8건 (A-17 보류)**. 학술 인용 전문은 `references/scholarship.md`. post-editese 3축 지표는 본 룰북 미반영(metric only 트랙). A-17 무정물·추상명사 '-들'은 학술 근거(전영철 2007·곽은주·진실로 2011) 강하나 외부 회차(2026-05-07 위키 6편)에서 양성 0건 — NMT 원본 출력 회차 후 v2.1에서 동일 ID로 재평가.
144
144
 
@@ -1,6 +1,6 @@
1
1
  # Author Voice — 권윤학 실제 GitHub 코멘트 어투 (공유 레퍼런스)
2
2
 
3
- 이 문서는 실제 GitHub PR 코멘트에서 증류한 **작성자 고유 어투 모델**이다.
3
+ 이 문서는 실제 GitHub PR 코멘트에서 추려낸 **작성자 고유 어투 모델**이다.
4
4
  리뷰 코멘트·PR 설명·변경 컨텍스트 등 "작성자가 직접 말하는" 산출물의 어투 기준이며,
5
5
  여러 에이전트가 공유한다.
6
6
 
@@ -16,7 +16,7 @@
16
16
  catch-waiting-frontend / catch-pos-frontend / pos-frontend 등 레거시 레포).
17
17
  - **2026년 코멘트는 학습에서 제외했다.** Claude(이 하네스 포함)가 거든 코멘트가 섞여
18
18
  voice가 오염됐기 때문이다. 2026년에 흔한 `c:`/`r:` 접두어, `[출처 태깅]`, `…권장.` 체언 종지는
19
- **실제 작성자의 어투가 아니다** — 1,321 authentic 코퍼스에서 "권장"은 0건,
19
+ **실제 작성자의 어투가 아니다** — 직접 쓴 리뷰 1,321건에서 "권장"은 0건,
20
20
  `c:`/`r:` 접두어는 3건(노이즈)뿐이다. 절대 흉내내지 말 것.
21
21
 
22
22
  > **예외 — 층위가 다른 경우.** 여기서 금지하는 건 **어투(voice)로서의** `c:`/`r:`이다. 즉
@@ -29,16 +29,16 @@
29
29
  ## 어투의 본질 (한 줄 요약)
30
30
 
31
31
  **단정하지 않고 제안한다. 이유를 붙여 부드럽게, 사소한 건 짧게, 모르면 묻는다.**
32
- 실측 종결어미 빈도: "~것 같아요/같습니다" 282 · "~하는 게 좋을 것 같" 164 ·
32
+ 리뷰 1,300건에서 세어본 종결어미 빈도: "~것 같아요/같습니다" 282 · "~하는 게 좋을 것 같" 164 ·
33
33
  "~하는 건 어떨까요?" 144 · "좋아보입니다/좋아보이네요" 54 · "필요해보이네요" 29 ·
34
34
  "~해서요(이유)" 49 · "개인적으로" 24 · 이모지 64 · 물결(~) 56.
35
35
 
36
36
  ### 이 숫자는 분포지 지침이 아니다
37
37
 
38
38
  가장 흔한 실패는 시그니처를 안 쓰는 게 아니라 **한 갈래에 몰아 쓰는 것**이다.
39
- 282는 코퍼스 1,300건 중 20% 남짓이고, 나머지는 "어떨까요?" 144, "좋아보입니다" 54처럼
39
+ 282는 리뷰 1,300건 중 20% 남짓이고, 나머지는 "어떨까요?" 144, "좋아보입니다" 54처럼
40
40
  여러 갈래로 흩어져 있다. "보존하라"를 "매 문장에 쓰라"로 읽으면 문장 하나하나는
41
- authentic한데 글 전체가 기계로 읽힌다 — 시그니처가 일정 간격으로 박히는 순간
41
+ 진짜 어투인데 글 전체가 기계로 읽힌다 — 시그니처가 일정 간격으로 박히는 순간
42
42
  그 규칙성 자체가 새 AI-tell이 된다.
43
43
 
44
44
  - 한 갈래가 전체 종결의 **절반을 넘지 않게** 흩는다.
@@ -51,7 +51,7 @@ authentic한데 글 전체가 기계로 읽힌다 — 시그니처가 일정 간
51
51
 
52
52
  ---
53
53
 
54
- ## 레지스터 A — 인라인 리뷰 코멘트 (코드 라인에 다는 지적)
54
+ ## 말투 A — 인라인 리뷰 코멘트 (코드 라인에 다는 지적)
55
55
 
56
56
  ### 시그니처 패턴
57
57
 
@@ -110,7 +110,7 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
110
110
 
111
111
  ---
112
112
 
113
- ## 레지스터 B — 대화형 답글 (PR 본문/스레드 코멘트)
113
+ ## 말투 B — 대화형 답글 (PR 본문/스레드 코멘트)
114
114
 
115
115
  라인이 아니라 PR 전반·협업 맥락에 말 거는, 더 짧고 따뜻한 어투.
116
116
 
@@ -144,15 +144,15 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
144
144
 
145
145
  ## 장르별 적용
146
146
 
147
- - **리뷰 코멘트(code-review-writer)**: 라인 지적은 레지스터 A, PR 전반·협업 맥락은 레지스터 B.
148
- - **받은 리뷰에 답글(code-review-responder)**: 레지스터 A의 "본인 PR에 답할 때 / 수정 반영" 절이
149
- 주 참조 구간이고, 협업 한마디는 레지스터 B를 빌린다. 반영은 커밋 링크 + 한 줄로 짧게, 이견은
147
+ - **리뷰 코멘트(code-review-writer)**: 라인 지적은 말투 A, PR 전반·협업 맥락은 말투 B.
148
+ - **받은 리뷰에 답글(code-review-responder)**: 말투 A의 "본인 PR에 답할 때 / 수정 반영" 절이
149
+ 주 참조 구간이고, 협업 한마디는 말투 B를 빌린다. 반영은 커밋 링크 + 한 줄로 짧게, 이견은
150
150
  근거 하나 대고 상대에게 판단을 넘긴다. **리뷰이는 강제성을 매기는 자리가 아니라 `r:`/`c:`/`a:`
151
151
  접두어를 붙이지 않는다** — 접두어는 리뷰어 쪽 도구다. 과잉 사과와 장문 변명이 이 장르에서
152
152
  가장 자주 새는 AI-tell이다.
153
153
  - **PR 설명·변경 컨텍스트(change-context-writer)**: 본문은 "무엇을 왜 바꿨는지"를 서술하는
154
154
  성격이라 제안형보다 **담백한 서술체**가 맞다. 단 "~한 것 같습니다"의 부드러움과 온기는 유지하고,
155
- 딱딱한 단언·결산 피벗으로 평탄화하지 않는다. 협업 한마디(요청·배려)는 레지스터 B를 빌린다.
155
+ 딱딱한 단언·결산 피벗으로 평탄화하지 않는다. 협업 한마디(요청·배려)는 말투 B를 빌린다.
156
156
  - **공통**: `c:`/`r:`·`[출처]`·"권장." 은 어디서도 쓰지 않는다 (Claude artifact).
157
157
 
158
158
  ---
@@ -189,12 +189,12 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
189
189
  | "개인적으로", "제 취향이긴 한데" | **보존** — 의견 프레이밍 방식. |
190
190
  | 🙏 😀 👍 등 이모지 (코멘트당 1개 안팎) | **보존** — 온기. |
191
191
 
192
- 반대로 두 레지스터 모두에서 **제거**할 진짜 AI-tell:
192
+ 반대로 두 말투 모두에서 **제거**할 진짜 AI-tell:
193
193
  - "결론적으로", "요약하자면", "이를 통해", "~를 수행합니다" 의인화 주어
194
194
  - 과장 어휘("핵심적으로", "시사하는 바가 크다"), 콜론 부제, 이모지 남발, 문두 접속사 반복
195
195
  - **가운뎃점(·) 나열 남발** — 본문에서 "A·B·C" 압축은 기계 티. 쉼표나 "A랑 B하고 C"로 푼다 (ai-tell C-12)
196
- - **명사구 압축·사무투 분류사** — "시안 정합 버그픽스", "주석 건" 같은 명사 뭉치는 동사로 풀고 "건"은 구체 명사로 (ai-tell F-6·I-5, 리뷰 register S1)
197
- - **기술 비유 명사** — "증류·배선·결정화·평탄화" 같은 화학·전기 어휘 차용은 일상 동사로 (ai-tell F-7, 리뷰 register S1)
196
+ - **명사구 압축·사무투 분류사** — "시안 정합 버그픽스", "주석 건" 같은 명사 뭉치는 동사로 풀고 "건"은 구체 명사로 (ai-tell F-6·I-5, 리뷰 코멘트에선 S1)
197
+ - **기술 비유 명사** — "증류·배선·결정화·평탄화" 같은 화학·전기 어휘 차용은 일상 동사로 (ai-tell F-7, 리뷰 코멘트에선 S1)
198
198
  - **`c:`/`r:` 접두어, `[출처]` 대괄호 태깅, "…권장." 체언 종지** — Claude가 만든 가짜 시그니처
199
199
 
200
200
  ---