@tienne/gestalt 0.55.0 → 0.57.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 (41) hide show
  1. package/CLAUDE.md +2 -36
  2. package/dist/package.json +1 -1
  3. package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +1 -0
  4. package/dist/plugin/role-agents/impact-writer/AGENT.md +4 -1
  5. package/dist/plugin/role-agents/impact-writer/references/doc-playbooks.md +2 -2
  6. package/dist/plugin/role-agents/impact-writer/references/report-register.md +96 -0
  7. package/dist/plugin/role-agents/technical-writer/AGENT.md +1 -0
  8. package/dist/plugin/skills/_shared/proactive-routing.md +46 -0
  9. package/dist/plugin/skills/agent/SKILL.md +1 -11
  10. package/dist/plugin/skills/brief/SKILL.md +9 -1
  11. package/dist/plugin/skills/pr/SKILL.md +12 -1
  12. package/dist/src/cli/commands/humanize-check.d.ts.map +1 -1
  13. package/dist/src/cli/commands/humanize-check.js +1 -1
  14. package/dist/src/cli/commands/humanize-check.js.map +1 -1
  15. package/dist/src/cli/index.js +1 -1
  16. package/dist/src/cli/index.js.map +1 -1
  17. package/dist/src/humanize/check.d.ts +1 -1
  18. package/dist/src/humanize/check.d.ts.map +1 -1
  19. package/dist/src/humanize/check.js +19 -2
  20. package/dist/src/humanize/check.js.map +1 -1
  21. package/dist/src/humanize/detectors.d.ts +9 -0
  22. package/dist/src/humanize/detectors.d.ts.map +1 -1
  23. package/dist/src/humanize/detectors.js +22 -1
  24. package/dist/src/humanize/detectors.js.map +1 -1
  25. package/dist/src/humanize/index.d.ts +1 -1
  26. package/dist/src/humanize/index.d.ts.map +1 -1
  27. package/dist/src/humanize/index.js +1 -1
  28. package/dist/src/humanize/index.js.map +1 -1
  29. package/dist/src/humanize/rules.d.ts +2 -2
  30. package/dist/src/humanize/rules.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/plugin/.codex-plugin/plugin.json +1 -1
  33. package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +1 -0
  34. package/plugin/role-agents/impact-writer/AGENT.md +4 -1
  35. package/plugin/role-agents/impact-writer/references/doc-playbooks.md +2 -2
  36. package/plugin/role-agents/impact-writer/references/report-register.md +96 -0
  37. package/plugin/role-agents/technical-writer/AGENT.md +1 -0
  38. package/plugin/skills/_shared/proactive-routing.md +46 -0
  39. package/plugin/skills/agent/SKILL.md +1 -11
  40. package/plugin/skills/brief/SKILL.md +9 -1
  41. package/plugin/skills/pr/SKILL.md +12 -1
package/CLAUDE.md CHANGED
@@ -32,7 +32,7 @@ pnpm tsx bin/gestalt.ts status
32
32
  pnpm tsx bin/gestalt.ts init # gestalt.json + code graph + post-commit hook
33
33
  pnpm verify:rules # 룰북과 에이전트 문서의 룰 ID·심각도 정합 검사
34
34
  pnpm build:output-style # 룰북 → ~/.claude/output-styles/tienne-voice.md 생성
35
- pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register chat
35
+ pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register report
36
36
  ```
37
37
 
38
38
  ## MCP Tools
@@ -55,41 +55,7 @@ pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register cha
55
55
 
56
56
  ## Role Agent 자동 라우팅
57
57
 
58
- 아래 상황에서는 사용자가 명시적으로 에이전트를 지정하지 않아도 해당 에이전트를 proactively 사용한다. `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
59
-
60
- | 상황 | 에이전트 |
61
- |------|---------|
62
- | 영상/비디오 URL이 포함되거나 "요약해줘" 요청 | `video-summarizer` |
63
- | 번역투·AI 말투·어색한 한국어 교정 요청 | `humanize-monolith` (윤문 모드) |
64
- | 고치지 말고 AI 티만 짚어달라는 요청 ("이거 AI 같아?", "슬롭인지 봐줘", "패턴만 짚어줘") | `humanize-monolith` (탐지 모드 — 원문 무수정, 패턴 인용만, 저자 판정·등급 금지) |
65
- | README, API 문서, 가이드, 개발자 문서 작성 | `technical-writer` |
66
- | 발표 슬라이드 콘텐츠·문구·데이터 요약·발표 노트 작성 | `presentation-writer` |
67
- | 슬라이드 Reveal.js 구조·템플릿·비주얼 디자인 자문 | `presentation-designer` |
68
- | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 단계 → presentation-designer 디자인 → Reveal.js HTML) |
69
- | 시스템 설계, 아키텍처 리뷰, 설계 패턴 | `architect` |
70
- | 보안 취약점, 인증/인가, 시크릿 노출 검토 | `security-reviewer` |
71
- | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
72
- | 코드 가독성, SOLID, 에러 처리 리뷰 | `quality-reviewer` |
73
- | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
74
- | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
75
- | 슬랙·메신저 메시지 작성 또는 딱딱한/AI스러운 초안을 본인 말투로 다듬기 | `slack-messenger` |
76
- | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 단계 → 전송) |
77
- | 지라 티켓 본문 작성·구조화 (제목, 설명, 완료 조건, 이슈타입 추천) | `jira-writer` |
78
- | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 단계 → createJiraIssue) |
79
- | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
80
- | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
81
- | API, DB, 인증, 서버 로직 | `backend-developer` |
82
- | CI/CD, 인프라, 모니터링 | `devops-engineer` |
83
- | 요구사항 정리, 로드맵, 유저 스토리 | `product-planner` |
84
- | 성과 분석·KPI 해석·분기 성과 보고·회고 리포트 | `impact-writer` |
85
- | 제안서, RFC, 의사결정 메모 등 설득·합의용 기획 산문 | `impact-writer` |
86
- | 성과 보고서·제안서·RFC·회고 작성 요청 ("성과 보고서 써줘", "제안서 작성", "RFC 써줘") | `brief` 스킬 사용 |
87
- | 기술 분석, 벤치마크, 사례 조사 | `researcher` |
88
- | 내 PR에 달린 리뷰 코멘트 답변 본문 작성 (반영·대안·보류·질문) | `code-review-responder` |
89
- | PR·브랜치·커밋 코드 리뷰 요청 | `/review` 스킬 사용 |
90
- | 받은 리뷰 반영·답글 게시 요청 ("리뷰 반영해줘", "리뷰 코멘트에 답해줘", "받은 리뷰 처리해줘") | `review-reply` 스킬 사용 (스레드 수집 → 유형 분류 승인 → 수정·커밋 → 답글 승인 → 게시) |
91
- | PR 작성·생성 요청 ("PR 만들어줘", "PR 작성해줘", "PR 올려줘") | `gestalt:pr` 스킬 사용 |
92
- | 실행 태스크를 외부 런타임 워커로 뿌리는 요청 ("orca로 실행", "codex로 실행", "워커 띄워서 실행") | `dispatch` 스킬 사용 (런타임 감지 → 같은 워크트리에 터미널 → worker_done 대기 → ready 재계산). 런타임 없으면 execute의 기본 병렬 경로 |
58
+ 아래 상황에서는 사용자가 명시적으로 에이전트를 지정하지 않아도 해당 에이전트를 proactively 사용한다. 기준 표는 [`plugin/skills/_shared/proactive-routing.md`](./plugin/skills/_shared/proactive-routing.md)에 있다 — 이 파일은 플러그인과 함께 배포되므로 다른 레포에 설치된 세션도 같은 표를 본다. `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
93
59
 
94
60
  ## Project Structure
95
61
  ```
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.55.0",
3
+ "version": "0.57.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -62,6 +62,7 @@
62
62
  | C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 콜론 뒤를 버리고 앞부분만 남긴다. **더 좋은 부제로 바꾸지 않는다** — 부제를 갈아끼우면 패턴이 그대로 남는다. 앞부분만으로 뜻이 안 서면 평서 헤딩 한 문장으로 |
63
63
  | C-11 | 연결어미 뒤 쉼표 (-고/-며/-지만/-며서/-아서/-어서 직후 쉼표) | S1 | 쉼표 제거. 6+회=강한 신호. KatFish 4.84배 분리도 |
64
64
  | C-12 | 가운뎃점(·) 나열 남발 — 본문 산문에서 "A·B·C"로 항목 압축 | S1 | 쉼표나 구어 연결로 풀기("A, B, C" / "A랑 B하고 C"). 사람은 산문에서 가운뎃점을 거의 안 쓴다. 단 표 안 압축, 용어 목록, 굳어진 합성어("입출력")는 예외 |
65
+ | C-13 | 같은 문단에서 같은 수치를 다른 단위로 반복 표기("3%" 다음 "3할") — 참조 표현의 숫자만 바꿔 재사용하며 단위를 못 맞춘 경우 | S2 | 단위를 하나로 통일한다. 빌려 쓴 수치 예시는 값과 단위를 통째로 새로 쓴다("3%인데 3할이" → "3%인데 3%가") |
65
66
 
66
67
  ## D. AI 특유의 관용구 (Signature Phrases)
67
68
 
@@ -14,6 +14,7 @@ You are the Impact Writer role agent.
14
14
  어투, 문체 기준: `references/voice.md` — 독자별 말투(격식체/해요체)와 작성자 voice 적용 기준. **작성 전 반드시 확인한다.**
15
15
  세부 문서 유형별 구조: `references/doc-playbooks.md`
16
16
  한국어 문장, 용어 규칙: `../_shared/references/style-guide.md` (공유)
17
+ 보고서 전용 문체와 프레이밍: `references/report-register.md` — 진행현황, 성과 분석, 제안서, 의사결정 메모처럼 기록성과 정밀도가 필요한 문서에만 적용한다.
17
18
  전면 윤문은 `humanize-monolith`가 담당한다 (아래 humanize 처리 참조).
18
19
 
19
20
  ## 다른 라이터와의 경계
@@ -37,10 +38,12 @@ You are the Impact Writer role agent.
37
38
  2. **숫자는 맥락과 함께.** "전환율 98%"가 아니라 "목표 90% 대비 98%, 8%p 초과 달성". 단독 수치는 정보가 아니라 노이즈다. 기준값, 전기 대비, 목표 대비 중 하나는 반드시 붙인다.
38
39
  3. **주장에는 근거, 근거에는 출처.** 데이터의 기간, 정의, 출처를 명시한다. 추정이면 추정이라고 적고 단정하지 않는다.
39
40
  4. **so-what을 끝까지 민다.** "지표가 올랐다"에서 멈추지 않고 "그래서 무엇을 해야 하는가"까지 적는다. 성과 문서는 보고가 아니라 다음 행동을 부르는 글이다.
40
- 5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다. 그래야 신뢰가 생긴다.
41
+ 5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다. 리스크는 대응과 함께 적는다 — 대응을 적을 수 없는 리스크는 뺀다. 대응 없는 나열은 문제 제기로 읽혀 신뢰를 깎는다.
41
42
  6. **사실은 단정, 해석, 추정, 권고는 제안.** 측정된 수치는 또렷하게 단정한다. 원인 추정이나 다음 행동 권고는 "~로 보입니다 / ~하면 어떨까요?"처럼 부드럽게 연다. 추정을 단정으로 포장하지 않는 게 오히려 정직하고 설득력 있다. (voice.md 2절)
42
43
  7. **독자에 맞춰 말투 전환.** 경영진과 타팀은 격식체, 팀 내부는 해요체. `audience`에 따라 voice.md 1절의 매트릭스를 따른다.
43
44
  8. **한국어로 직접 사고.** 번역체 금지. style-guide.md의 한국어 문장 규칙을 따른다. 가운뎃점(·) 나열은 절제하고 쉼표나 "A랑 B하고 C"로 푼다 (표·용어 목록은 예외).
45
+ 9. **절 제목은 명사구로.** 서술형 제목("매출이 급증했다")은 논평처럼 읽히고 문서를 갱신할 때 낡는다. 제목은 주제를 가리키고 주장은 본문이 맡는다 — 표 항목 라벨과 자유 서술 절 제목 모두 해당한다. 발표 슬라이드 제목(주장·결론형이 맞는 자리, style-guide.md 참조)과는 반대 방향이니 섞지 않는다.
46
+ 10. **보고서 문체는 별도 패스로 다룬다.** 진행현황, 성과 분석, 제안서, 의사결정 메모는 초안 뒤 `report-register.md`로 의미역, 상태 표기, 절 프레이밍을 검토한다. 이 단계는 구조를 다룰 수 있지만 뒤이은 humanize는 표현만 다듬는다.
44
47
 
45
48
  ## 평가 관점 (문서 리뷰 시)
46
49
 
@@ -81,13 +81,13 @@
81
81
  정량(지표 개선 예측) + 정성. 보수적으로 추정하고 가정을 명시.
82
82
 
83
83
  ## 비용과 리스크
84
- 드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다.
84
+ 드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다. 리스크마다 대응을 함께 적고, 대응을 적을 수 없으면 그 리스크는 뺀다.
85
85
 
86
86
  ## 대안 비교
87
87
  검토한 다른 선택지와 왜 이 안인가. (안 함 / 부분 적용 포함)
88
88
  ```
89
89
 
90
- 원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다.
90
+ 원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다. 대응 없는 리스크 나열은 문제 제기로 읽히니 적지 않는다.
91
91
 
92
92
  ---
93
93
 
@@ -0,0 +1,96 @@
1
+ # Report Register — 보고서용 한국어 문체
2
+
3
+ 진행현황, 성과 분석, 제안서, 의사결정 메모처럼 읽는 사람이 근거를 대조하고
4
+ 결정을 내려야 하는 문서에만 적용한다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지
5
+ 않는다. 그 자리에서 보고서식 치환을 쓰면 작성자 어투가 불필요하게 딱딱해진다.
6
+
7
+ 원칙은 간단하다. **글자 수가 아니라 해석의 폭을 줄인다.** 낯선 한자어나
8
+ 외래어를 늘리는 것이 목적이 아니다. 책임, 시점, 대상의 구분이 더 또렷해질 때만
9
+ 구체적인 말을 고른다.
10
+
11
+ ## 1. 적용 범위와 어미
12
+
13
+ - 보고 본문은 평서체 `~한다/~이다`를 기본으로 한다.
14
+ - 송부 메일, 협의 요청, 대외 안내는 합니다체로 별도 작성한다.
15
+ - 문서 안에서 두 어미를 섞지 않는다. 인용문, 코드, 고유한 고객 문구는 예외다.
16
+ - `됐다/했다`처럼 구어로 줄어든 과거형은 본문에서 `되었다/하였다`로 정리한다.
17
+ 인용문과 코드 블록은 바꾸지 않는다.
18
+
19
+ 이 기본값은 독자별 voice보다 우선하지 않는다. 경영진이나 타팀에 보내는 본문을
20
+ 합니다체로 쓰기로 한 경우에는 그 선택을 문서 전체에 일관되게 적용한다. 이때도
21
+ 송부 메시지와 보고 본문은 섞지 않는다.
22
+
23
+ ## 2. 의미역을 좁히는 치환
24
+
25
+ 아래 표는 기계적 치환표가 아니다. 왼쪽 동사에 서로 다른 목적어를 넣어도 모두
26
+ 자연스러우면, 목적어가 가리키는 관계에 맞는 오른쪽 동사를 고른다.
27
+
28
+ | 넓은 표현 | 문맥별 선택 | 구분 기준 |
29
+ |---|---|---|
30
+ | 다룬다 | 한정한다, 규정한다, 정의한다 | 범위, 규칙, 개념 |
31
+ | 맞춘다 | 정합한다, 정렬한다, 보정한다 | 논리, 위치, 값 |
32
+ | 바꾼다 | 변환한다, 대체한다, 개정한다 | 형식, 대상, 문서 |
33
+ | 넘긴다 | 전달한다, 이관한다, 위임한다 | 데이터, 업무, 권한 |
34
+ | 적는다 | 명시한다, 기재한다, 기록한다 | 규정, 항목, 이력 |
35
+ | 나온다 | 도출된다, 산출된다, 확정된다 | 결과, 계산, 승인 |
36
+ | 넣는다 | 포함한다, 등재한다, 삽입한다 | 범위, 목록, 위치 |
37
+ | 고친다 | 수정한다, 보완한다, 개정한다 | 오류, 미비, 문서 |
38
+ | 잡는다 | 검출한다, 산정한다, 고정한다 | 이상, 수치, 값 |
39
+ | 늘어난다 | 향상된다, 증가한다, 연장된다 | 품질, 수량, 기간 |
40
+ | 막는다 | 차단한다, 방지한다 | 경로, 사태 |
41
+ | 생긴다 | 발생한다, 형성된다 | 사건, 구조 |
42
+
43
+ 정밀도가 늘지 않으면 바꾸지 않는다. 예를 들어 팀이 실제로 쓰는 용어나 코드의
44
+ 식별자를 더 격식 있게 보이게 하려고 바꾸지 않는다.
45
+
46
+ ## 3. 서술은 용어와 분리한다
47
+
48
+ 도메인 용어는 그대로 두고 그 용어를 설명하는 동사와 상태만 고친다. 물리 은유와
49
+ 의인화는 사실 상태로 환원한다.
50
+
51
+ | 피할 서술 | 보고서 서술 |
52
+ |---|---|
53
+ | 큐가 밀린다 | 큐에 적체가 발생한다 |
54
+ | 값이 튄다 | 값에 이상치가 발생한다 |
55
+ | 템플릿이 죽었다 | 템플릿이 비활성 상태다 |
56
+ | 로그가 쌓인다 | 로그가 누적된다 |
57
+ | 문서가 다룬다 | 문서는 범위를 한정한다, 용어를 정의한다 |
58
+
59
+ API, enum, 필드명, 제품명, 조직 내부에서 굳어진 개념어는 원문 표기를 보존한다.
60
+ 영문 표기를 한글 음차나 반대 방향으로 일괄 변환하지 않는다.
61
+
62
+ ## 4. 보고서 프레이밍
63
+
64
+ 문장만 윤문하기 전에 절 단위로 아래를 확인한다.
65
+
66
+ 1. **제목은 주제를 가리킨다.** 자유 서술 절과 표 항목은 명사구로 적고 주장은 본문에 둔다.
67
+ 2. **결과를 먼저 둔다.** 각 항목은 확인된 수치나 현재 상태를 먼저 제시하고 배경과 원인은 뒤에 둔다.
68
+ 3. **결함을 숨기지 않고 개선 경로를 드러낸다.** "무엇이 안 됐나"만 나열하지 말고
69
+ 어떤 기준이나 경로를 정비할지 함께 적는다.
70
+ 4. **리스크에는 대응을 붙인다.** 대응이 없는 리스크는 경고가 아니라 불확실성으로 분류하고
71
+ 외부 문서에서는 별도 확인이 필요하다고 표시한다.
72
+ 5. **요청 전에 판단을 낸다.** 상대에게 결정을 넘기기 전에 우리 안, 산정 근거, 조정 가능한
73
+ 범위를 먼저 제시한다.
74
+ 6. **문서 사용법을 본문에서 빼낸다.** 첫 문단은 이 문서를 왜 만들었는지가 아니라,
75
+ 독자가 알아야 할 현재 상태와 결정 사항으로 시작한다.
76
+
77
+ ## 5. 수치와 상태
78
+
79
+ 측정값, 구현 상태, 아직 확인하지 못한 값을 같은 무게로 적지 않는다. 주장 바로 옆에
80
+ 상태를 붙인다.
81
+
82
+ | 상태 | 사용할 때 |
83
+ |---|---|
84
+ | 측정됨 | 실제 관측 또는 집계가 끝난 값 |
85
+ | 구현됨 | 수단은 존재하지만 해당 조건에서 검증하지 않은 상태 |
86
+ | 미측정 | 아직 값을 확인하지 않은 상태 |
87
+
88
+ 조직의 용어가 있으면 그 용어를 쓴다. 상태 표기는 수치에 근거가 없다는 사실을
89
+ 가리는 장식이 아니라, 다음 검증 대상을 드러내는 정보다.
90
+
91
+ ## 6. 작업 순서
92
+
93
+ 1. 초안에서 사실, 수치, 근거, 요청을 확정한다.
94
+ 2. 이 레퍼런스로 의미역, 상태, 절 프레이밍을 검토한다.
95
+ 3. `humanize-monolith`으로 번역투와 AI-tell만 제거한다. 이 단계에서 절 순서와 정보는 바꾸지 않는다.
96
+ 4. 파일 기반 윤문이면 `gestalt humanize-check --register report`로 어미 혼용과 기존 S1 규칙을 확인한다.
@@ -19,6 +19,7 @@ AI-tell 패턴 윤문은 `humanize-monolith` 에이전트가 담당한다. 전
19
19
  3. **Completeness** — 전제조건, 에러 케이스, 엣지 케이스가 있는가?
20
20
  4. **Consistency** — 용어, 어미, 톤이 전체적으로 일관되는가?
21
21
  5. **Code Examples** — 실행 가능하고 맥락이 설명됐는가?
22
+ 6. **Structural Integrity** — 문서를 수정했다면 목차, 앵커 링크, 상호참조가 지우거나 바꾼 섹션을 여전히 가리키는지 확인했는가?
22
23
 
23
24
  ## 단독 사용 vs humanize-monolith와 함께
24
25
 
@@ -0,0 +1,46 @@
1
+ # Role Agent 자동 라우팅 (공유 규칙)
2
+
3
+ 이 표가 **기준 문서**다. 어느 상황에 어느 에이전트나 스킬을 사용자가 명시하지 않아도 proactively
4
+ 쓸지는 여기서만 고친다. `CLAUDE.md`와 `plugin/skills/agent/SKILL.md`는 이 파일을 가리킬 뿐 표를
5
+ 복제하지 않는다 — 복제본은 표가 늘어날 때 같이 안 고쳐져 조용히 갈라진다.
6
+
7
+ `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
8
+
9
+ | 상황 | 에이전트 |
10
+ |------|---------|
11
+ | 영상/비디오 URL이 포함되거나 "요약해줘" 요청 | `video-summarizer` |
12
+ | 번역투·AI 말투·어색한 한국어 교정 요청 | `humanize-monolith` (윤문 모드) |
13
+ | 고치지 말고 AI 티만 짚어달라는 요청 ("이거 AI 같아?", "슬롭인지 봐줘", "패턴만 짚어줘") | `humanize-monolith` (탐지 모드 — 원문 무수정, 패턴 인용만, 저자 판정·등급 금지) |
14
+ | README, API 문서, 가이드, 개발자 문서 작성 | `technical-writer` |
15
+ | 발표 슬라이드 콘텐츠·문구·데이터 요약·발표 노트 작성 | `presentation-writer` |
16
+ | 슬라이드 Reveal.js 구조·템플릿·비주얼 디자인 자문 | `presentation-designer` |
17
+ | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 단계 → presentation-designer 디자인 → Reveal.js HTML) |
18
+ | 시스템 설계, 아키텍처 리뷰, 설계 패턴 | `architect` |
19
+ | 보안 취약점, 인증/인가, 시크릿 노출 검토 | `security-reviewer` |
20
+ | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
21
+ | 코드 가독성, SOLID, 에러 처리 리뷰 | `quality-reviewer` |
22
+ | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
23
+ | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
24
+ | 슬랙·메신저 메시지 작성 또는 딱딱한/AI스러운 초안을 본인 말투로 다듬기 | `slack-messenger` |
25
+ | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 단계 → 전송) |
26
+ | 지라 티켓 본문 작성·구조화 (제목, 설명, 완료 조건, 이슈타입 추천) | `jira-writer` |
27
+ | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 단계 → createJiraIssue) |
28
+ | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
29
+ | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
30
+ | API, DB, 인증, 서버 로직 | `backend-developer` |
31
+ | CI/CD, 인프라, 모니터링 | `devops-engineer` |
32
+ | 요구사항 정리, 로드맵, 유저 스토리 | `product-planner` |
33
+ | 성과 분석·KPI 해석·분기 성과 보고·회고 리포트 | `impact-writer` |
34
+ | 제안서, RFC, 의사결정 메모 등 설득·합의용 기획 산문 | `impact-writer` |
35
+ | 성과 보고서·제안서·RFC·회고 작성 요청 ("성과 보고서 써줘", "제안서 작성", "RFC 써줘") | `brief` 스킬 사용 |
36
+ | 기술 분석, 벤치마크, 사례 조사 | `researcher` |
37
+ | 내 PR에 달린 리뷰 코멘트 답변 본문 작성 (반영·대안·보류·질문) | `code-review-responder` |
38
+ | PR·브랜치·커밋 코드 리뷰 요청 | `/review` 스킬 사용 |
39
+ | 받은 리뷰 반영·답글 게시 요청 ("리뷰 반영해줘", "리뷰 코멘트에 답해줘", "받은 리뷰 처리해줘") | `review-reply` 스킬 사용 (스레드 수집 → 유형 분류 승인 → 수정·커밋 → 답글 승인 → 게시) |
40
+ | PR 작성·생성 요청 ("PR 만들어줘", "PR 작성해줘", "PR 올려줘") | `gestalt:pr` 스킬 사용 |
41
+ | 실행 태스크를 외부 런타임 워커로 뿌리는 요청 ("orca로 실행", "codex로 실행", "워커 띄워서 실행") | `dispatch` 스킬 사용 (런타임 감지 → 같은 워크트리에 터미널 → worker_done 대기 → ready 재계산). 런타임 없으면 execute의 기본 병렬 경로 |
42
+
43
+ ## 표를 늘릴 때
44
+
45
+ 여기 한 줄 추가하면 끝이다. `CLAUDE.md`와 `agent/SKILL.md`를 따라가서 고칠 필요가 없다 — 둘 다
46
+ 이 파일을 가리키기만 하기 때문이다.
@@ -78,17 +78,7 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
78
78
 
79
79
  ## Proactive Invocation
80
80
 
81
- 이 스킬은 사용자가 `/agent`를 명시하지 않아도 아래 상황에서 자동으로 실행된다. CLAUDE.md Role Agent 자동 라우팅 규칙에 따라 적절한 에이전트를 선택해 실행한다.
82
-
83
- - 영상, 비디오 URL 포함 또는 "요약해줘" → `video-summarizer`
84
- - 번역투, AI 말투 교정 → `humanize-monolith`
85
- - 문서, README, 가이드 작성 → `technical-writer`
86
- - 발표 슬라이드 콘텐츠, 문구 작성 → `presentation-writer`
87
- - 슬라이드 Reveal.js 구조, 비주얼 디자인 → `presentation-designer`
88
- - 발표자료, 프레젠테이션 제작(콘텐츠+디자인 통합) → `presentation` 스킬
89
- - 보안 검토 → `security-reviewer`
90
- - 성능 분석 → `performance-reviewer`
91
- - 코드 리뷰 → `quality-reviewer`
81
+ 이 스킬은 사용자가 `/agent`를 명시하지 않아도 상황에 맞는 에이전트로 자동 실행된다. 어느 상황에 어느 에이전트나 스킬을 쓸지는 [`../_shared/proactive-routing.md`](../_shared/proactive-routing.md)가 기준 문서다 여기 목록을 따로 옮겨 적지 않는다. 그 파일을 읽고 상황에 맞는 항목을 고른다.
92
82
 
93
83
  에이전트 이름 없이 태스크 설명만 있는 경우: `ges_agent({ action: "list" })`로 전체 목록을 조회한 뒤 설명과 domain을 기반으로 가장 적합한 에이전트를 자동 선택한다.
94
84
 
@@ -91,12 +91,20 @@ outputs:
91
91
 
92
92
  `audience`에 따라 register를 전환합니다 — `exec`(경영진)·`cross-team`(타팀)은 격식체로 결론과 요청을 앞세우고 전문 용어를 풀어 쓰고 `internal`(팀 내부)은 해요체로 솔직하게 씁니다. 어느 쪽이든 사실, 수치는 단정하고 해석, 추정, 권고는 제안형으로 엽니다. `audience`가 불명확하면 cross-team 격식체를 기본으로 잡습니다.
93
93
 
94
- ### 5단계 — 윤문 (humanize)
94
+ ### 5단계 — 보고서 문체와 프레이밍
95
+
96
+ `report`, `proposal`, `decision memo`처럼 기록성과 해석 정밀도가 필요한 산출물은 `role-agents/impact-writer/references/report-register.md`를 먼저 적용합니다. 광의 동사는 목적어 기준으로 구체화하고 수치에는 측정 상태를 붙이고 각 절은 결과와 대응 경로를 먼저 보이게 다듬습니다.
97
+
98
+ 이 단계에서만 절 제목, 수치 상태, 정보 배치를 고칩니다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지 않습니다.
99
+
100
+ ### 6단계 — 윤문 (humanize)
95
101
 
96
102
  초안 완성 후 `ges_agent { action: "get", name: "humanize-monolith" }`로 S1 규칙을 적용해 번역투와 AI-tell을 제거합니다. 성과, 설득 문서는 한국어 자연스러움이 설득력에 직결됩니다.
97
103
 
98
104
  윤문 시 voice.md 4절의 구분을 humanize에 함께 전달합니다 — 팀 내부 문서의 해석, 권고 제안형("~하면 어떨까요?")은 보존하고 사실, 수치를 흐리는 헤징만 단정으로 교정합니다. humanize가 voice를 일괄로 평탄화하지 않게 합니다.
99
105
 
106
+ 파일 기반 윤문이면 `gestalt humanize-check --before before.md --after after.md --register report`를 실행합니다. 이 검사는 기존 S1 패턴과 보고 본문의 평서체/합니다체 혼용을 함께 확인합니다.
107
+
100
108
  ## 테스트 시나리오
101
109
 
102
110
  **정상 흐름**: `/brief report` + 지표 표 입력 → 유형 report 확정 → 전경 메시지 도출 → 핵심 지표 표 + 잘된 것/아쉬운 것 + 다음 포커스 작성 → humanize → publish-ready 리포트 반환.
@@ -119,7 +119,18 @@ git diff {target}...HEAD # 실제 diff (핵심 변경만)
119
119
  - **PR 템플릿이 있는 경우**: 템플릿 구조를 깨지 않는 선에서, 변경 요약 성격의 섹션(예: Changes, 변경 사항) 안이나 바로 아래에 흐름 변화를 배치합니다. 템플릿에 이미 유사 섹션이 있으면 그 안에 녹입니다.
120
120
  - **템플릿이 없는 경우**: `## Changes` 아래에 흐름 변화 섹션을 둡니다.
121
121
  - 흐름 변화가 없는 변경(순수 리팩터링·문서 수정 등)이면 에이전트가 남긴 `흐름 변화 없음` 표기를 그대로 반영하고 억지로 표를 만들지 않습니다.
122
- - 생성된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
122
+
123
+ ### 4.5단계: description 워싱 (humanize-monolith)
124
+
125
+ 3단계 `changeContext`는 `change-context-writer`가 이미 자체 humanize를 거친 텍스트지만 4단계에서 여기에 `출처`, `검증·리뷰`, 자가 리뷰 노트처럼 레포 템플릿이 요구하는 나머지 섹션을 새로 합성합니다. 이 부분은 별도 윤문 없이 나온 문장이라, 4단계에서 합성한 PR 제목과 본문 전체를 `humanize-monolith`로 한 번 더 다듬습니다.
126
+
127
+ `ges_agent { action: "get", name: "humanize-monolith" }`로 에이전트 시스템 프롬프트를 가져온 뒤, PR 제목과 본문 전체에 S1 규칙을 적용해 교정합니다.
128
+
129
+ - **보존 대상**: 코드 블록, 파일 경로, 커밋 해시, 수치, 체크리스트 항목의 사실 내용은 한 글자도 건드리지 않습니다. `## 흐름 변화 (AS-IS → TO-BE)` 섹션의 화살표 대비, 표, Mermaid 구조도 그대로 둡니다.
130
+ - **어투**: `../role-agents/_shared/references/author-voice.md`의 "PR 설명·변경 컨텍스트" 장르 기준을 따릅니다. 담백한 서술체를 유지하되 "~한 것 같습니다"의 부드러움은 깎지 않습니다.
131
+ - **레포 템플릿 구조는 재구성하지 않습니다.** 0단계에서 발견한 PR 템플릿의 섹션 순서, 체크박스, 헤딩은 그대로 두고 문장 표현만 다듬습니다.
132
+
133
+ 윤문된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
123
134
 
124
135
  ### 5단계: gh pr create 확인 및 실행
125
136
 
@@ -1 +1 @@
1
- {"version":3,"file":"humanize-check.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAWD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAmBxE"}
1
+ {"version":3,"file":"humanize-check.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAWD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAoBxE"}
@@ -10,7 +10,7 @@ function read(label, path) {
10
10
  return readFileSync(full, 'utf-8');
11
11
  }
12
12
  export function humanizeCheckCommand(options) {
13
- const register = options.register === 'chat' ? 'chat' : 'doc';
13
+ const register = options.register === 'chat' ? 'chat' : options.register === 'report' ? 'report' : 'doc';
14
14
  const before = read('원문', options.before);
15
15
  const after = read('윤문본', options.after);
16
16
  if (before.trim().length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"humanize-check.js","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAU5E,SAAS,IAAI,CAAC,KAAa,EAAE,IAAY;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA6B;IAChE,MAAM,QAAQ,GAAa,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"humanize-check.js","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAU5E,SAAS,IAAI,CAAC,KAAa,EAAE,IAAY;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA6B;IAChE,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
@@ -79,7 +79,7 @@ export function createCli() {
79
79
  .description('Judge a humanized draft against the rulebook (exit 0 pass / 1 warn / 2 abort)')
80
80
  .requiredOption('--before <path>', 'Original text file')
81
81
  .requiredOption('--after <path>', 'Humanized text file')
82
- .option('--register <doc|chat>', 'Register to judge against (default: doc)', 'doc')
82
+ .option('--register <doc|chat|report>', 'Register to judge against (default: doc)', 'doc')
83
83
  .option('--json', 'Emit the full report as JSON')
84
84
  .action((options) => {
85
85
  humanizeCheckCommand(options);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ export declare const THRESHOLD: {
7
7
  readonly sentenceDrop: 0.25;
8
8
  };
9
9
  export interface AxisResult {
10
- axis: 'change-rate' | 'residual-s1' | 'preservation' | 'structure';
10
+ axis: 'change-rate' | 'residual-s1' | 'preservation' | 'structure' | 'report-register';
11
11
  verdict: Verdict;
12
12
  detail: string;
13
13
  evidence?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"AASA,OAAO,EAAmC,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3F,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,MAAM,CAKzD,CAAC;AAEF,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,WAAW,CAAC;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChE,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjE;AAyHD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAoB,GAC5B,WAAW,CA0Bb;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxD"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"AAcA,OAAO,EAAmC,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3F,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,MAAM,CAKzD,CAAC;AAEF,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,WAAW,GAAG,iBAAiB,CAAC;IACvF,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChE,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjE;AA0ID,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAoB,GAC5B,WAAW,CA2Bb;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxD"}
@@ -6,7 +6,7 @@
6
6
  * 그래서 변경률, 잔존, 보존, 구조 4가지 측면에서 각각 측정하고, 판단한다.
7
7
  */
8
8
  import { changeRate } from './change-rate.js';
9
- import { countByRule, missingProtectedTokens, structureStats } from './detectors.js';
9
+ import { countByRule, missingProtectedTokens, reportRegisterStats, structureStats, } from './detectors.js';
10
10
  import { parseRuleBook, ruleLabel, s1Ids } from './rules.js';
11
11
  export const EXIT_CODE = {
12
12
  pass: 0,
@@ -112,6 +112,22 @@ function checkStructure(book, before, after, introduced) {
112
112
  evidence: problems,
113
113
  };
114
114
  }
115
+ function checkReportRegister(after) {
116
+ const { plainEndings, formalEndings } = reportRegisterStats(after);
117
+ if (plainEndings > 0 && formalEndings > 0) {
118
+ return {
119
+ axis: 'report-register',
120
+ verdict: 'warn',
121
+ detail: '보고 본문에 평서체와 합니다체가 함께 있음',
122
+ evidence: [`평서체 ${plainEndings}문장 / 합니다체 ${formalEndings}문장`],
123
+ };
124
+ }
125
+ return {
126
+ axis: 'report-register',
127
+ verdict: 'pass',
128
+ detail: '보고 본문 어미 일관',
129
+ };
130
+ }
115
131
  export function runCheck(before, after, options = {}) {
116
132
  const register = options.register ?? 'doc';
117
133
  const book = options.book ?? parseRuleBook();
@@ -122,7 +138,8 @@ export function runCheck(before, after, options = {}) {
122
138
  const preservationAxis = checkPreservation(before, after);
123
139
  const introduced = findIntroduced(before, after);
124
140
  const structureAxis = checkStructure(book, before, after, introduced);
125
- const axes = [changeAxis, s1Axis, preservationAxis, structureAxis];
141
+ const reportAxis = register === 'report' ? [checkReportRegister(after)] : [];
142
+ const axes = [changeAxis, s1Axis, preservationAxis, structureAxis, ...reportAxis];
126
143
  const verdict = worst(axes.map((a) => a.verdict));
127
144
  return {
128
145
  register,
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,15 @@ export declare function splitSentences(text: string): string[];
14
14
  export declare const DETECTABLE_RULE_IDS: string[];
15
15
  export declare function detect(text: string, ruleIds?: readonly string[]): Detection[];
16
16
  export declare function countByRule(text: string, ruleIds?: readonly string[]): Map<string, number>;
17
+ export interface ReportRegisterStats {
18
+ plainEndings: number;
19
+ formalEndings: number;
20
+ }
21
+ /**
22
+ * 보고 본문에서 평서체와 합니다체가 섞였는지만 보수적으로 센다.
23
+ * 인용문, 코드, 표는 작성자 말투가 아니므로 proseOnly에서 제외한다.
24
+ */
25
+ export declare function reportRegisterStats(text: string): ReportRegisterStats;
17
26
  /** 원문에서 한 글자도 바뀌면 안 되는 토큰을 뽑는다 */
18
27
  export declare function protectedTokens(text: string): string[];
19
28
  export declare function missingProtectedTokens(before: string, after: string): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8CD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AA4CD,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAAmC,CAAC;AAE5E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,CAgB7E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE1F;AAcD,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAStD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9E;AAID,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAS3D"}
1
+ {"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiDD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AA4CD,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAAmC,CAAC;AAE5E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,CAgB7E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE1F;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAcrE;AAcD,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAStD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9E;AAID,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAS3D"}
@@ -12,7 +12,10 @@ function proseOnly(text) {
12
12
  .replace(/```[\s\S]*?```/g, '\n')
13
13
  .replace(/`[^`\n]+`/g, ' ')
14
14
  .split('\n')
15
- .filter((line) => !line.trimStart().startsWith('|'))
15
+ .filter((line) => {
16
+ const trimmed = line.trimStart();
17
+ return !trimmed.startsWith('|') && !trimmed.startsWith('>');
18
+ })
16
19
  .join('\n');
17
20
  }
18
21
  function matcher(ruleId, re, onProse = true) {
@@ -96,6 +99,24 @@ export function detect(text, ruleIds) {
96
99
  export function countByRule(text, ruleIds) {
97
100
  return new Map(detect(text, ruleIds).map((d) => [d.ruleId, d.count]));
98
101
  }
102
+ /**
103
+ * 보고 본문에서 평서체와 합니다체가 섞였는지만 보수적으로 센다.
104
+ * 인용문, 코드, 표는 작성자 말투가 아니므로 proseOnly에서 제외한다.
105
+ */
106
+ export function reportRegisterStats(text) {
107
+ let plainEndings = 0;
108
+ let formalEndings = 0;
109
+ for (const sentence of splitSentences(proseOnly(text))) {
110
+ const trimmed = sentence.trim();
111
+ if (/[가-힣]니다[.!?…]?$/.test(trimmed)) {
112
+ formalEndings += 1;
113
+ }
114
+ else if (/[가-힣]다[.!?…]?$/.test(trimmed)) {
115
+ plainEndings += 1;
116
+ }
117
+ }
118
+ return { plainEndings, formalEndings };
119
+ }
99
120
  // --- 보존해야 하는 토큰 ---------------------------------------------------
100
121
  const PROTECTED_PATTERNS = [
101
122
  /```[\s\S]*?```/g,
@@ -1 +1 @@
1
- {"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, type Register, type Rule, type RuleBook, type Severity, } from './rules.js';
2
- export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, DETECTABLE_RULE_IDS, type Detection, type StructureStats, } from './detectors.js';
2
+ export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, reportRegisterStats, DETECTABLE_RULE_IDS, type Detection, type ReportRegisterStats, type StructureStats, } from './detectors.js';
3
3
  export { changeRate, type ChangeRateOptions } from './change-rate.js';
4
4
  export { runCheck, formatReport, EXIT_CODE, THRESHOLD, type CheckReport, type AxisResult, type Verdict, } from './check.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,GACb,MAAM,YAAY,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, } from './rules.js';
2
- export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, DETECTABLE_RULE_IDS, } from './detectors.js';
2
+ export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, reportRegisterStats, DETECTABLE_RULE_IDS, } from './detectors.js';
3
3
  export { changeRate } from './change-rate.js';
4
4
  export { runCheck, formatReport, EXIT_CODE, THRESHOLD, } from './check.js';
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,GAGpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,GAIV,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GAIpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,GAIV,MAAM,YAAY,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export type Severity = 'S1' | 'S2' | 'S3';
2
- /** 산문(칼럼·리포트·문서) 기준과 대화·리뷰 코멘트 기준을 나눠 본다 */
3
- export type Register = 'doc' | 'chat';
2
+ /** 산문, 대화·리뷰, 보고서 기준을 나눠 본다 */
3
+ export type Register = 'doc' | 'chat' | 'report';
4
4
  export interface Rule {
5
5
  id: string;
6
6
  category: string;
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/humanize/rules.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,4CAA4C;AAC5C,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEtC,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iCAAiC;IACjC,YAAY,EAAE,QAAQ,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,yBAAyB;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,eAAO,MAAM,gBAAgB,QAG5B,CAAC;AAeF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBrD;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAyB,GAAG,QAAQ,CA6CvE;AAgCD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,0BAA0B;AAC1B,wBAAgB,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAKlE"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/humanize/rules.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,+BAA+B;AAC/B,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iCAAiC;IACjC,YAAY,EAAE,QAAQ,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,yBAAyB;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,eAAO,MAAM,gBAAgB,QAG5B,CAAC;AAeF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBrD;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAyB,GAAG,QAAQ,CA6CvE;AAgCD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,0BAA0B;AAC1B,wBAAgB,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAKlE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.55.0",
3
+ "version": "0.57.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gestalt",
3
- "version": "0.55.0",
3
+ "version": "0.57.0",
4
4
  "description": "Gestalt psychology-driven AI development harness. Transforms scattered requirements into structured, validated specifications through interactive interviews.",
5
5
  "author": {
6
6
  "name": "tienne"
@@ -62,6 +62,7 @@
62
62
  | C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 콜론 뒤를 버리고 앞부분만 남긴다. **더 좋은 부제로 바꾸지 않는다** — 부제를 갈아끼우면 패턴이 그대로 남는다. 앞부분만으로 뜻이 안 서면 평서 헤딩 한 문장으로 |
63
63
  | C-11 | 연결어미 뒤 쉼표 (-고/-며/-지만/-며서/-아서/-어서 직후 쉼표) | S1 | 쉼표 제거. 6+회=강한 신호. KatFish 4.84배 분리도 |
64
64
  | C-12 | 가운뎃점(·) 나열 남발 — 본문 산문에서 "A·B·C"로 항목 압축 | S1 | 쉼표나 구어 연결로 풀기("A, B, C" / "A랑 B하고 C"). 사람은 산문에서 가운뎃점을 거의 안 쓴다. 단 표 안 압축, 용어 목록, 굳어진 합성어("입출력")는 예외 |
65
+ | C-13 | 같은 문단에서 같은 수치를 다른 단위로 반복 표기("3%" 다음 "3할") — 참조 표현의 숫자만 바꿔 재사용하며 단위를 못 맞춘 경우 | S2 | 단위를 하나로 통일한다. 빌려 쓴 수치 예시는 값과 단위를 통째로 새로 쓴다("3%인데 3할이" → "3%인데 3%가") |
65
66
 
66
67
  ## D. AI 특유의 관용구 (Signature Phrases)
67
68
 
@@ -14,6 +14,7 @@ You are the Impact Writer role agent.
14
14
  어투, 문체 기준: `references/voice.md` — 독자별 말투(격식체/해요체)와 작성자 voice 적용 기준. **작성 전 반드시 확인한다.**
15
15
  세부 문서 유형별 구조: `references/doc-playbooks.md`
16
16
  한국어 문장, 용어 규칙: `../_shared/references/style-guide.md` (공유)
17
+ 보고서 전용 문체와 프레이밍: `references/report-register.md` — 진행현황, 성과 분석, 제안서, 의사결정 메모처럼 기록성과 정밀도가 필요한 문서에만 적용한다.
17
18
  전면 윤문은 `humanize-monolith`가 담당한다 (아래 humanize 처리 참조).
18
19
 
19
20
  ## 다른 라이터와의 경계
@@ -37,10 +38,12 @@ You are the Impact Writer role agent.
37
38
  2. **숫자는 맥락과 함께.** "전환율 98%"가 아니라 "목표 90% 대비 98%, 8%p 초과 달성". 단독 수치는 정보가 아니라 노이즈다. 기준값, 전기 대비, 목표 대비 중 하나는 반드시 붙인다.
38
39
  3. **주장에는 근거, 근거에는 출처.** 데이터의 기간, 정의, 출처를 명시한다. 추정이면 추정이라고 적고 단정하지 않는다.
39
40
  4. **so-what을 끝까지 민다.** "지표가 올랐다"에서 멈추지 않고 "그래서 무엇을 해야 하는가"까지 적는다. 성과 문서는 보고가 아니라 다음 행동을 부르는 글이다.
40
- 5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다. 그래야 신뢰가 생긴다.
41
+ 5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다. 리스크는 대응과 함께 적는다 — 대응을 적을 수 없는 리스크는 뺀다. 대응 없는 나열은 문제 제기로 읽혀 신뢰를 깎는다.
41
42
  6. **사실은 단정, 해석, 추정, 권고는 제안.** 측정된 수치는 또렷하게 단정한다. 원인 추정이나 다음 행동 권고는 "~로 보입니다 / ~하면 어떨까요?"처럼 부드럽게 연다. 추정을 단정으로 포장하지 않는 게 오히려 정직하고 설득력 있다. (voice.md 2절)
42
43
  7. **독자에 맞춰 말투 전환.** 경영진과 타팀은 격식체, 팀 내부는 해요체. `audience`에 따라 voice.md 1절의 매트릭스를 따른다.
43
44
  8. **한국어로 직접 사고.** 번역체 금지. style-guide.md의 한국어 문장 규칙을 따른다. 가운뎃점(·) 나열은 절제하고 쉼표나 "A랑 B하고 C"로 푼다 (표·용어 목록은 예외).
45
+ 9. **절 제목은 명사구로.** 서술형 제목("매출이 급증했다")은 논평처럼 읽히고 문서를 갱신할 때 낡는다. 제목은 주제를 가리키고 주장은 본문이 맡는다 — 표 항목 라벨과 자유 서술 절 제목 모두 해당한다. 발표 슬라이드 제목(주장·결론형이 맞는 자리, style-guide.md 참조)과는 반대 방향이니 섞지 않는다.
46
+ 10. **보고서 문체는 별도 패스로 다룬다.** 진행현황, 성과 분석, 제안서, 의사결정 메모는 초안 뒤 `report-register.md`로 의미역, 상태 표기, 절 프레이밍을 검토한다. 이 단계는 구조를 다룰 수 있지만 뒤이은 humanize는 표현만 다듬는다.
44
47
 
45
48
  ## 평가 관점 (문서 리뷰 시)
46
49
 
@@ -81,13 +81,13 @@
81
81
  정량(지표 개선 예측) + 정성. 보수적으로 추정하고 가정을 명시.
82
82
 
83
83
  ## 비용과 리스크
84
- 드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다.
84
+ 드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다. 리스크마다 대응을 함께 적고, 대응을 적을 수 없으면 그 리스크는 뺀다.
85
85
 
86
86
  ## 대안 비교
87
87
  검토한 다른 선택지와 왜 이 안인가. (안 함 / 부분 적용 포함)
88
88
  ```
89
89
 
90
- 원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다.
90
+ 원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다. 대응 없는 리스크 나열은 문제 제기로 읽히니 적지 않는다.
91
91
 
92
92
  ---
93
93
 
@@ -0,0 +1,96 @@
1
+ # Report Register — 보고서용 한국어 문체
2
+
3
+ 진행현황, 성과 분석, 제안서, 의사결정 메모처럼 읽는 사람이 근거를 대조하고
4
+ 결정을 내려야 하는 문서에만 적용한다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지
5
+ 않는다. 그 자리에서 보고서식 치환을 쓰면 작성자 어투가 불필요하게 딱딱해진다.
6
+
7
+ 원칙은 간단하다. **글자 수가 아니라 해석의 폭을 줄인다.** 낯선 한자어나
8
+ 외래어를 늘리는 것이 목적이 아니다. 책임, 시점, 대상의 구분이 더 또렷해질 때만
9
+ 구체적인 말을 고른다.
10
+
11
+ ## 1. 적용 범위와 어미
12
+
13
+ - 보고 본문은 평서체 `~한다/~이다`를 기본으로 한다.
14
+ - 송부 메일, 협의 요청, 대외 안내는 합니다체로 별도 작성한다.
15
+ - 문서 안에서 두 어미를 섞지 않는다. 인용문, 코드, 고유한 고객 문구는 예외다.
16
+ - `됐다/했다`처럼 구어로 줄어든 과거형은 본문에서 `되었다/하였다`로 정리한다.
17
+ 인용문과 코드 블록은 바꾸지 않는다.
18
+
19
+ 이 기본값은 독자별 voice보다 우선하지 않는다. 경영진이나 타팀에 보내는 본문을
20
+ 합니다체로 쓰기로 한 경우에는 그 선택을 문서 전체에 일관되게 적용한다. 이때도
21
+ 송부 메시지와 보고 본문은 섞지 않는다.
22
+
23
+ ## 2. 의미역을 좁히는 치환
24
+
25
+ 아래 표는 기계적 치환표가 아니다. 왼쪽 동사에 서로 다른 목적어를 넣어도 모두
26
+ 자연스러우면, 목적어가 가리키는 관계에 맞는 오른쪽 동사를 고른다.
27
+
28
+ | 넓은 표현 | 문맥별 선택 | 구분 기준 |
29
+ |---|---|---|
30
+ | 다룬다 | 한정한다, 규정한다, 정의한다 | 범위, 규칙, 개념 |
31
+ | 맞춘다 | 정합한다, 정렬한다, 보정한다 | 논리, 위치, 값 |
32
+ | 바꾼다 | 변환한다, 대체한다, 개정한다 | 형식, 대상, 문서 |
33
+ | 넘긴다 | 전달한다, 이관한다, 위임한다 | 데이터, 업무, 권한 |
34
+ | 적는다 | 명시한다, 기재한다, 기록한다 | 규정, 항목, 이력 |
35
+ | 나온다 | 도출된다, 산출된다, 확정된다 | 결과, 계산, 승인 |
36
+ | 넣는다 | 포함한다, 등재한다, 삽입한다 | 범위, 목록, 위치 |
37
+ | 고친다 | 수정한다, 보완한다, 개정한다 | 오류, 미비, 문서 |
38
+ | 잡는다 | 검출한다, 산정한다, 고정한다 | 이상, 수치, 값 |
39
+ | 늘어난다 | 향상된다, 증가한다, 연장된다 | 품질, 수량, 기간 |
40
+ | 막는다 | 차단한다, 방지한다 | 경로, 사태 |
41
+ | 생긴다 | 발생한다, 형성된다 | 사건, 구조 |
42
+
43
+ 정밀도가 늘지 않으면 바꾸지 않는다. 예를 들어 팀이 실제로 쓰는 용어나 코드의
44
+ 식별자를 더 격식 있게 보이게 하려고 바꾸지 않는다.
45
+
46
+ ## 3. 서술은 용어와 분리한다
47
+
48
+ 도메인 용어는 그대로 두고 그 용어를 설명하는 동사와 상태만 고친다. 물리 은유와
49
+ 의인화는 사실 상태로 환원한다.
50
+
51
+ | 피할 서술 | 보고서 서술 |
52
+ |---|---|
53
+ | 큐가 밀린다 | 큐에 적체가 발생한다 |
54
+ | 값이 튄다 | 값에 이상치가 발생한다 |
55
+ | 템플릿이 죽었다 | 템플릿이 비활성 상태다 |
56
+ | 로그가 쌓인다 | 로그가 누적된다 |
57
+ | 문서가 다룬다 | 문서는 범위를 한정한다, 용어를 정의한다 |
58
+
59
+ API, enum, 필드명, 제품명, 조직 내부에서 굳어진 개념어는 원문 표기를 보존한다.
60
+ 영문 표기를 한글 음차나 반대 방향으로 일괄 변환하지 않는다.
61
+
62
+ ## 4. 보고서 프레이밍
63
+
64
+ 문장만 윤문하기 전에 절 단위로 아래를 확인한다.
65
+
66
+ 1. **제목은 주제를 가리킨다.** 자유 서술 절과 표 항목은 명사구로 적고 주장은 본문에 둔다.
67
+ 2. **결과를 먼저 둔다.** 각 항목은 확인된 수치나 현재 상태를 먼저 제시하고 배경과 원인은 뒤에 둔다.
68
+ 3. **결함을 숨기지 않고 개선 경로를 드러낸다.** "무엇이 안 됐나"만 나열하지 말고
69
+ 어떤 기준이나 경로를 정비할지 함께 적는다.
70
+ 4. **리스크에는 대응을 붙인다.** 대응이 없는 리스크는 경고가 아니라 불확실성으로 분류하고
71
+ 외부 문서에서는 별도 확인이 필요하다고 표시한다.
72
+ 5. **요청 전에 판단을 낸다.** 상대에게 결정을 넘기기 전에 우리 안, 산정 근거, 조정 가능한
73
+ 범위를 먼저 제시한다.
74
+ 6. **문서 사용법을 본문에서 빼낸다.** 첫 문단은 이 문서를 왜 만들었는지가 아니라,
75
+ 독자가 알아야 할 현재 상태와 결정 사항으로 시작한다.
76
+
77
+ ## 5. 수치와 상태
78
+
79
+ 측정값, 구현 상태, 아직 확인하지 못한 값을 같은 무게로 적지 않는다. 주장 바로 옆에
80
+ 상태를 붙인다.
81
+
82
+ | 상태 | 사용할 때 |
83
+ |---|---|
84
+ | 측정됨 | 실제 관측 또는 집계가 끝난 값 |
85
+ | 구현됨 | 수단은 존재하지만 해당 조건에서 검증하지 않은 상태 |
86
+ | 미측정 | 아직 값을 확인하지 않은 상태 |
87
+
88
+ 조직의 용어가 있으면 그 용어를 쓴다. 상태 표기는 수치에 근거가 없다는 사실을
89
+ 가리는 장식이 아니라, 다음 검증 대상을 드러내는 정보다.
90
+
91
+ ## 6. 작업 순서
92
+
93
+ 1. 초안에서 사실, 수치, 근거, 요청을 확정한다.
94
+ 2. 이 레퍼런스로 의미역, 상태, 절 프레이밍을 검토한다.
95
+ 3. `humanize-monolith`으로 번역투와 AI-tell만 제거한다. 이 단계에서 절 순서와 정보는 바꾸지 않는다.
96
+ 4. 파일 기반 윤문이면 `gestalt humanize-check --register report`로 어미 혼용과 기존 S1 규칙을 확인한다.
@@ -19,6 +19,7 @@ AI-tell 패턴 윤문은 `humanize-monolith` 에이전트가 담당한다. 전
19
19
  3. **Completeness** — 전제조건, 에러 케이스, 엣지 케이스가 있는가?
20
20
  4. **Consistency** — 용어, 어미, 톤이 전체적으로 일관되는가?
21
21
  5. **Code Examples** — 실행 가능하고 맥락이 설명됐는가?
22
+ 6. **Structural Integrity** — 문서를 수정했다면 목차, 앵커 링크, 상호참조가 지우거나 바꾼 섹션을 여전히 가리키는지 확인했는가?
22
23
 
23
24
  ## 단독 사용 vs humanize-monolith와 함께
24
25
 
@@ -0,0 +1,46 @@
1
+ # Role Agent 자동 라우팅 (공유 규칙)
2
+
3
+ 이 표가 **기준 문서**다. 어느 상황에 어느 에이전트나 스킬을 사용자가 명시하지 않아도 proactively
4
+ 쓸지는 여기서만 고친다. `CLAUDE.md`와 `plugin/skills/agent/SKILL.md`는 이 파일을 가리킬 뿐 표를
5
+ 복제하지 않는다 — 복제본은 표가 늘어날 때 같이 안 고쳐져 조용히 갈라진다.
6
+
7
+ `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
8
+
9
+ | 상황 | 에이전트 |
10
+ |------|---------|
11
+ | 영상/비디오 URL이 포함되거나 "요약해줘" 요청 | `video-summarizer` |
12
+ | 번역투·AI 말투·어색한 한국어 교정 요청 | `humanize-monolith` (윤문 모드) |
13
+ | 고치지 말고 AI 티만 짚어달라는 요청 ("이거 AI 같아?", "슬롭인지 봐줘", "패턴만 짚어줘") | `humanize-monolith` (탐지 모드 — 원문 무수정, 패턴 인용만, 저자 판정·등급 금지) |
14
+ | README, API 문서, 가이드, 개발자 문서 작성 | `technical-writer` |
15
+ | 발표 슬라이드 콘텐츠·문구·데이터 요약·발표 노트 작성 | `presentation-writer` |
16
+ | 슬라이드 Reveal.js 구조·템플릿·비주얼 디자인 자문 | `presentation-designer` |
17
+ | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 단계 → presentation-designer 디자인 → Reveal.js HTML) |
18
+ | 시스템 설계, 아키텍처 리뷰, 설계 패턴 | `architect` |
19
+ | 보안 취약점, 인증/인가, 시크릿 노출 검토 | `security-reviewer` |
20
+ | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
21
+ | 코드 가독성, SOLID, 에러 처리 리뷰 | `quality-reviewer` |
22
+ | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
23
+ | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
24
+ | 슬랙·메신저 메시지 작성 또는 딱딱한/AI스러운 초안을 본인 말투로 다듬기 | `slack-messenger` |
25
+ | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 단계 → 전송) |
26
+ | 지라 티켓 본문 작성·구조화 (제목, 설명, 완료 조건, 이슈타입 추천) | `jira-writer` |
27
+ | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 단계 → createJiraIssue) |
28
+ | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
29
+ | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
30
+ | API, DB, 인증, 서버 로직 | `backend-developer` |
31
+ | CI/CD, 인프라, 모니터링 | `devops-engineer` |
32
+ | 요구사항 정리, 로드맵, 유저 스토리 | `product-planner` |
33
+ | 성과 분석·KPI 해석·분기 성과 보고·회고 리포트 | `impact-writer` |
34
+ | 제안서, RFC, 의사결정 메모 등 설득·합의용 기획 산문 | `impact-writer` |
35
+ | 성과 보고서·제안서·RFC·회고 작성 요청 ("성과 보고서 써줘", "제안서 작성", "RFC 써줘") | `brief` 스킬 사용 |
36
+ | 기술 분석, 벤치마크, 사례 조사 | `researcher` |
37
+ | 내 PR에 달린 리뷰 코멘트 답변 본문 작성 (반영·대안·보류·질문) | `code-review-responder` |
38
+ | PR·브랜치·커밋 코드 리뷰 요청 | `/review` 스킬 사용 |
39
+ | 받은 리뷰 반영·답글 게시 요청 ("리뷰 반영해줘", "리뷰 코멘트에 답해줘", "받은 리뷰 처리해줘") | `review-reply` 스킬 사용 (스레드 수집 → 유형 분류 승인 → 수정·커밋 → 답글 승인 → 게시) |
40
+ | PR 작성·생성 요청 ("PR 만들어줘", "PR 작성해줘", "PR 올려줘") | `gestalt:pr` 스킬 사용 |
41
+ | 실행 태스크를 외부 런타임 워커로 뿌리는 요청 ("orca로 실행", "codex로 실행", "워커 띄워서 실행") | `dispatch` 스킬 사용 (런타임 감지 → 같은 워크트리에 터미널 → worker_done 대기 → ready 재계산). 런타임 없으면 execute의 기본 병렬 경로 |
42
+
43
+ ## 표를 늘릴 때
44
+
45
+ 여기 한 줄 추가하면 끝이다. `CLAUDE.md`와 `agent/SKILL.md`를 따라가서 고칠 필요가 없다 — 둘 다
46
+ 이 파일을 가리키기만 하기 때문이다.
@@ -78,17 +78,7 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
78
78
 
79
79
  ## Proactive Invocation
80
80
 
81
- 이 스킬은 사용자가 `/agent`를 명시하지 않아도 아래 상황에서 자동으로 실행된다. CLAUDE.md Role Agent 자동 라우팅 규칙에 따라 적절한 에이전트를 선택해 실행한다.
82
-
83
- - 영상, 비디오 URL 포함 또는 "요약해줘" → `video-summarizer`
84
- - 번역투, AI 말투 교정 → `humanize-monolith`
85
- - 문서, README, 가이드 작성 → `technical-writer`
86
- - 발표 슬라이드 콘텐츠, 문구 작성 → `presentation-writer`
87
- - 슬라이드 Reveal.js 구조, 비주얼 디자인 → `presentation-designer`
88
- - 발표자료, 프레젠테이션 제작(콘텐츠+디자인 통합) → `presentation` 스킬
89
- - 보안 검토 → `security-reviewer`
90
- - 성능 분석 → `performance-reviewer`
91
- - 코드 리뷰 → `quality-reviewer`
81
+ 이 스킬은 사용자가 `/agent`를 명시하지 않아도 상황에 맞는 에이전트로 자동 실행된다. 어느 상황에 어느 에이전트나 스킬을 쓸지는 [`../_shared/proactive-routing.md`](../_shared/proactive-routing.md)가 기준 문서다 여기 목록을 따로 옮겨 적지 않는다. 그 파일을 읽고 상황에 맞는 항목을 고른다.
92
82
 
93
83
  에이전트 이름 없이 태스크 설명만 있는 경우: `ges_agent({ action: "list" })`로 전체 목록을 조회한 뒤 설명과 domain을 기반으로 가장 적합한 에이전트를 자동 선택한다.
94
84
 
@@ -91,12 +91,20 @@ outputs:
91
91
 
92
92
  `audience`에 따라 register를 전환합니다 — `exec`(경영진)·`cross-team`(타팀)은 격식체로 결론과 요청을 앞세우고 전문 용어를 풀어 쓰고 `internal`(팀 내부)은 해요체로 솔직하게 씁니다. 어느 쪽이든 사실, 수치는 단정하고 해석, 추정, 권고는 제안형으로 엽니다. `audience`가 불명확하면 cross-team 격식체를 기본으로 잡습니다.
93
93
 
94
- ### 5단계 — 윤문 (humanize)
94
+ ### 5단계 — 보고서 문체와 프레이밍
95
+
96
+ `report`, `proposal`, `decision memo`처럼 기록성과 해석 정밀도가 필요한 산출물은 `role-agents/impact-writer/references/report-register.md`를 먼저 적용합니다. 광의 동사는 목적어 기준으로 구체화하고 수치에는 측정 상태를 붙이고 각 절은 결과와 대응 경로를 먼저 보이게 다듬습니다.
97
+
98
+ 이 단계에서만 절 제목, 수치 상태, 정보 배치를 고칩니다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지 않습니다.
99
+
100
+ ### 6단계 — 윤문 (humanize)
95
101
 
96
102
  초안 완성 후 `ges_agent { action: "get", name: "humanize-monolith" }`로 S1 규칙을 적용해 번역투와 AI-tell을 제거합니다. 성과, 설득 문서는 한국어 자연스러움이 설득력에 직결됩니다.
97
103
 
98
104
  윤문 시 voice.md 4절의 구분을 humanize에 함께 전달합니다 — 팀 내부 문서의 해석, 권고 제안형("~하면 어떨까요?")은 보존하고 사실, 수치를 흐리는 헤징만 단정으로 교정합니다. humanize가 voice를 일괄로 평탄화하지 않게 합니다.
99
105
 
106
+ 파일 기반 윤문이면 `gestalt humanize-check --before before.md --after after.md --register report`를 실행합니다. 이 검사는 기존 S1 패턴과 보고 본문의 평서체/합니다체 혼용을 함께 확인합니다.
107
+
100
108
  ## 테스트 시나리오
101
109
 
102
110
  **정상 흐름**: `/brief report` + 지표 표 입력 → 유형 report 확정 → 전경 메시지 도출 → 핵심 지표 표 + 잘된 것/아쉬운 것 + 다음 포커스 작성 → humanize → publish-ready 리포트 반환.
@@ -119,7 +119,18 @@ git diff {target}...HEAD # 실제 diff (핵심 변경만)
119
119
  - **PR 템플릿이 있는 경우**: 템플릿 구조를 깨지 않는 선에서, 변경 요약 성격의 섹션(예: Changes, 변경 사항) 안이나 바로 아래에 흐름 변화를 배치합니다. 템플릿에 이미 유사 섹션이 있으면 그 안에 녹입니다.
120
120
  - **템플릿이 없는 경우**: `## Changes` 아래에 흐름 변화 섹션을 둡니다.
121
121
  - 흐름 변화가 없는 변경(순수 리팩터링·문서 수정 등)이면 에이전트가 남긴 `흐름 변화 없음` 표기를 그대로 반영하고 억지로 표를 만들지 않습니다.
122
- - 생성된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
122
+
123
+ ### 4.5단계: description 워싱 (humanize-monolith)
124
+
125
+ 3단계 `changeContext`는 `change-context-writer`가 이미 자체 humanize를 거친 텍스트지만 4단계에서 여기에 `출처`, `검증·리뷰`, 자가 리뷰 노트처럼 레포 템플릿이 요구하는 나머지 섹션을 새로 합성합니다. 이 부분은 별도 윤문 없이 나온 문장이라, 4단계에서 합성한 PR 제목과 본문 전체를 `humanize-monolith`로 한 번 더 다듬습니다.
126
+
127
+ `ges_agent { action: "get", name: "humanize-monolith" }`로 에이전트 시스템 프롬프트를 가져온 뒤, PR 제목과 본문 전체에 S1 규칙을 적용해 교정합니다.
128
+
129
+ - **보존 대상**: 코드 블록, 파일 경로, 커밋 해시, 수치, 체크리스트 항목의 사실 내용은 한 글자도 건드리지 않습니다. `## 흐름 변화 (AS-IS → TO-BE)` 섹션의 화살표 대비, 표, Mermaid 구조도 그대로 둡니다.
130
+ - **어투**: `../role-agents/_shared/references/author-voice.md`의 "PR 설명·변경 컨텍스트" 장르 기준을 따릅니다. 담백한 서술체를 유지하되 "~한 것 같습니다"의 부드러움은 깎지 않습니다.
131
+ - **레포 템플릿 구조는 재구성하지 않습니다.** 0단계에서 발견한 PR 템플릿의 섹션 순서, 체크박스, 헤딩은 그대로 두고 문장 표현만 다듬습니다.
132
+
133
+ 윤문된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
123
134
 
124
135
  ### 5단계: gh pr create 확인 및 실행
125
136