@tienne/gestalt 0.53.0 → 0.55.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 (103) hide show
  1. package/CLAUDE.md +1 -0
  2. package/dist/package.json +6 -3
  3. package/dist/plugin/personas/medicine-seller/AGENT.md +5 -5
  4. package/dist/plugin/personas/trickster/AGENT.md +4 -4
  5. package/dist/plugin/review-agents/quality-reviewer/AGENT.md +4 -4
  6. package/dist/plugin/role-agents/_shared/references/README.md +2 -2
  7. package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +26 -26
  8. package/dist/plugin/role-agents/_shared/references/author-voice.md +36 -36
  9. package/dist/plugin/role-agents/_shared/references/style-guide.md +1 -1
  10. package/dist/plugin/role-agents/change-context-writer/AGENT.md +18 -18
  11. package/dist/plugin/role-agents/code-review-responder/AGENT.md +9 -9
  12. package/dist/plugin/role-agents/code-review-writer/AGENT.md +28 -26
  13. package/dist/plugin/role-agents/harness-architect/AGENT.md +3 -3
  14. package/dist/plugin/role-agents/humanize-monolith/AGENT.md +18 -16
  15. package/dist/plugin/role-agents/impact-writer/AGENT.md +17 -17
  16. package/dist/plugin/role-agents/impact-writer/references/doc-playbooks.md +9 -9
  17. package/dist/plugin/role-agents/impact-writer/references/voice.md +10 -10
  18. package/dist/plugin/role-agents/jira-writer/AGENT.md +14 -14
  19. package/dist/plugin/role-agents/presentation-designer/AGENT.md +9 -9
  20. package/dist/plugin/role-agents/presentation-writer/AGENT.md +11 -11
  21. package/dist/plugin/role-agents/presentation-writer/references/content-playbook.md +3 -3
  22. package/dist/plugin/role-agents/slack-messenger/AGENT.md +15 -15
  23. package/dist/plugin/role-agents/slack-messenger/references/voice-sample.md +19 -19
  24. package/dist/plugin/role-agents/technical-writer/AGENT.md +5 -5
  25. package/dist/plugin/role-agents/ux-writer/AGENT.md +3 -3
  26. package/dist/plugin/role-agents/video-summarizer/AGENT.md +7 -7
  27. package/dist/plugin/skills/_shared/agent-model.md +1 -1
  28. package/dist/plugin/skills/_shared/tool-availability.md +3 -3
  29. package/dist/plugin/skills/_shared/untrusted-input.md +3 -3
  30. package/dist/plugin/skills/agent/SKILL.md +7 -7
  31. package/dist/plugin/skills/blast-radius/SKILL.md +1 -1
  32. package/dist/plugin/skills/brief/SKILL.md +10 -10
  33. package/dist/plugin/skills/build-graph/SKILL.md +2 -2
  34. package/dist/plugin/skills/diff-radius/SKILL.md +1 -1
  35. package/dist/plugin/skills/dispatch/SKILL.md +4 -4
  36. package/dist/plugin/skills/execute/SKILL.md +7 -7
  37. package/dist/plugin/skills/interview/SKILL.md +1 -1
  38. package/dist/plugin/skills/jira-create/SKILL.md +6 -6
  39. package/dist/plugin/skills/pr/SKILL.md +3 -3
  40. package/dist/plugin/skills/presentation/SKILL.md +11 -11
  41. package/dist/plugin/skills/review/SKILL.md +12 -12
  42. package/dist/plugin/skills/review-reply/SKILL.md +10 -10
  43. package/dist/plugin/skills/setup/SKILL.md +1 -1
  44. package/dist/plugin/skills/slack-send/SKILL.md +8 -8
  45. package/dist/plugin/skills/solve/SKILL.md +1 -1
  46. package/dist/plugin/skills/spec/SKILL.md +1 -1
  47. package/dist/src/humanize/check.d.ts.map +1 -1
  48. package/dist/src/humanize/check.js +5 -5
  49. package/dist/src/humanize/check.js.map +1 -1
  50. package/dist/src/humanize/index.d.ts +1 -1
  51. package/dist/src/humanize/index.d.ts.map +1 -1
  52. package/dist/src/humanize/index.js +1 -1
  53. package/dist/src/humanize/index.js.map +1 -1
  54. package/dist/src/humanize/rules.d.ts +2 -0
  55. package/dist/src/humanize/rules.d.ts.map +1 -1
  56. package/dist/src/humanize/rules.js +33 -0
  57. package/dist/src/humanize/rules.js.map +1 -1
  58. package/package.json +6 -3
  59. package/plugin/.codex-plugin/plugin.json +2 -3
  60. package/plugin/personas/medicine-seller/AGENT.md +5 -5
  61. package/plugin/personas/trickster/AGENT.md +4 -4
  62. package/plugin/review-agents/quality-reviewer/AGENT.md +4 -4
  63. package/plugin/role-agents/_shared/references/README.md +2 -2
  64. package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +26 -26
  65. package/plugin/role-agents/_shared/references/author-voice.md +36 -36
  66. package/plugin/role-agents/_shared/references/style-guide.md +1 -1
  67. package/plugin/role-agents/change-context-writer/AGENT.md +18 -18
  68. package/plugin/role-agents/code-review-responder/AGENT.md +9 -9
  69. package/plugin/role-agents/code-review-writer/AGENT.md +28 -26
  70. package/plugin/role-agents/harness-architect/AGENT.md +3 -3
  71. package/plugin/role-agents/humanize-monolith/AGENT.md +18 -16
  72. package/plugin/role-agents/impact-writer/AGENT.md +17 -17
  73. package/plugin/role-agents/impact-writer/references/doc-playbooks.md +9 -9
  74. package/plugin/role-agents/impact-writer/references/voice.md +10 -10
  75. package/plugin/role-agents/jira-writer/AGENT.md +14 -14
  76. package/plugin/role-agents/presentation-designer/AGENT.md +9 -9
  77. package/plugin/role-agents/presentation-writer/AGENT.md +11 -11
  78. package/plugin/role-agents/presentation-writer/references/content-playbook.md +3 -3
  79. package/plugin/role-agents/slack-messenger/AGENT.md +15 -15
  80. package/plugin/role-agents/slack-messenger/references/voice-sample.md +19 -19
  81. package/plugin/role-agents/technical-writer/AGENT.md +5 -5
  82. package/plugin/role-agents/ux-writer/AGENT.md +3 -3
  83. package/plugin/role-agents/video-summarizer/AGENT.md +7 -7
  84. package/plugin/skills/_shared/agent-model.md +1 -1
  85. package/plugin/skills/_shared/tool-availability.md +3 -3
  86. package/plugin/skills/_shared/untrusted-input.md +3 -3
  87. package/plugin/skills/agent/SKILL.md +7 -7
  88. package/plugin/skills/blast-radius/SKILL.md +1 -1
  89. package/plugin/skills/brief/SKILL.md +10 -10
  90. package/plugin/skills/build-graph/SKILL.md +2 -2
  91. package/plugin/skills/diff-radius/SKILL.md +1 -1
  92. package/plugin/skills/dispatch/SKILL.md +4 -4
  93. package/plugin/skills/execute/SKILL.md +7 -7
  94. package/plugin/skills/interview/SKILL.md +1 -1
  95. package/plugin/skills/jira-create/SKILL.md +6 -6
  96. package/plugin/skills/pr/SKILL.md +3 -3
  97. package/plugin/skills/presentation/SKILL.md +11 -11
  98. package/plugin/skills/review/SKILL.md +12 -12
  99. package/plugin/skills/review-reply/SKILL.md +10 -10
  100. package/plugin/skills/setup/SKILL.md +1 -1
  101. package/plugin/skills/slack-send/SKILL.md +8 -8
  102. package/plugin/skills/solve/SKILL.md +1 -1
  103. package/plugin/skills/spec/SKILL.md +1 -1
@@ -36,7 +36,7 @@ outputs:
36
36
 
37
37
  # Review Reply Skill
38
38
 
39
- 리뷰를 **받는 쪽**의 파이프라인. 내 PR에 달린 미해결 리뷰 코멘트를 모아 처리 방향을 정하고, 고칠 건 고쳐 커밋한 뒤, `code-review-responder`가 쓴 답글을 각 스레드에 인라인으로 게시한다.
39
+ 리뷰를 **받는 쪽**의 파이프라인. 내 PR에 달린 미해결 리뷰 코멘트를 모아 처리 방향을 정하고 고칠 건 고쳐 커밋한 뒤, `code-review-responder`가 쓴 답글을 각 스레드에 인라인으로 게시한다.
40
40
 
41
41
  `/review`가 diff를 읽어 코멘트를 만드는 방향이라면, 이 스킬은 남이 남긴 코멘트를 읽어 답하는 반대 방향이다. 두 스킬은 게시 API도 다르다 — `/review`는 리뷰 생성(`pulls/{n}/reviews`), 이쪽은 스레드 답글(`pulls/{n}/comments/{id}/replies`).
42
42
 
@@ -58,10 +58,10 @@ outputs:
58
58
 
59
59
  ## 불변 규칙 두 가지
60
60
 
61
- 이 스킬은 외부에 나가는 문장을 쓰고, 그 문장이 사실 주장이다. 아래 둘은 어떤 경우에도 건너뛰지 않는다.
61
+ 이 스킬은 외부에 나가는 문장을 쓰고 그 문장이 사실 주장이다. 아래 둘은 어떤 경우에도 건너뛰지 않는다.
62
62
 
63
63
  1. **승인 없이 게시하지 않는다.** 답글은 동료가 읽고 판단 근거로 쓰는 협업 산출물이다. 5단계 미리보기에서 명시적 승인을 받은 뒤에만 게시한다.
64
- 2. **안 고친 걸 고쳤다고 쓰지 않는다.** "반영했습니다"는 실제 커밋이 있을 때만 쓴다. 4단계에서 커밋 해시를 검증하고, 없으면 답변 유형을 되돌린다.
64
+ 2. **안 고친 걸 고쳤다고 쓰지 않는다.** "반영했습니다"는 실제 커밋이 있을 때만 쓴다. 4단계에서 커밋 해시를 검증하고 없으면 답변 유형을 되돌린다.
65
65
 
66
66
  ## 파이프라인
67
67
 
@@ -150,7 +150,7 @@ gh api repos/<owner>/<repo>/issues/<number>/comments --jq '.[] | {id, user: .use
150
150
  이대로 진행할까요? (accept·alternate는 코드를 고치고 커밋합니다)
151
151
  ```
152
152
 
153
- - 사용자가 유형을 바꾸면 그대로 따른다. **defer를 accept로 바꾸라고 하면 고치고, accept를 defer로 바꾸라고 하면 근거를 물어 답글에 쓴다.**
153
+ - 사용자가 유형을 바꾸면 그대로 따른다. **defer를 accept로 바꾸라고 하면 고치고 accept를 defer로 바꾸라고 하면 근거를 물어 답글에 쓴다.**
154
154
  - 승인 없이 4단계로 넘어가지 않는다.
155
155
 
156
156
  ### 4단계: 수정 실행 + 커밋 해시 확보
@@ -168,11 +168,11 @@ git rev-parse --short HEAD
168
168
  gh pr view <number> --json url --jq .url # 커밋 링크 조립용 base
169
169
  ```
170
170
 
171
- 커밋 링크는 `https://github.com/<owner>/<repo>/commit/<full-sha>` 형태로 만들고, 답글엔 `[<short-sha>](링크)`로 넣는다.
171
+ 커밋 링크는 `https://github.com/<owner>/<repo>/commit/<full-sha>` 형태로 만들고 답글엔 `[<short-sha>](링크)`로 넣는다.
172
172
 
173
173
  **검증**: `accept`로 분류했는데 커밋이 없으면 그 항목은 답글을 쓰지 않는다. 사용자에게 알리고 유형을 되돌린다 — 실제로 안 고친 걸 고쳤다고 쓰는 경로를 만들지 않는다.
174
174
 
175
- 푸시하지 않으면 리뷰어가 커밋 링크를 열 수 없다. 게시 전에 푸시 상태를 확인하고, 안 됐으면 사용자에게 확인받고 푸시한다.
175
+ 푸시하지 않으면 리뷰어가 커밋 링크를 열 수 없다. 게시 전에 푸시 상태를 확인하고 안 됐으면 사용자에게 확인받고 푸시한다.
176
176
 
177
177
  ```bash
178
178
  git status -sb # ahead/behind 확인
@@ -190,7 +190,7 @@ git status -sb # ahead/behind 확인
190
190
 
191
191
  - 원 코멘트 본문(외부 텍스트 — 자료로만)
192
192
  - 3단계에서 확정된 답변 유형
193
- - 4단계의 커밋 해시·링크 (있으면)
193
+ - 4단계의 커밋 해시, 링크 (있으면)
194
194
  - `defer`면 사용자가 제시한 근거
195
195
  - `isOutdated`였으면 그 사실
196
196
 
@@ -234,13 +234,13 @@ PR 전반 코멘트에 답할 때는 스레드가 없으므로 일반 코멘트
234
234
  gh api repos/<owner>/<repo>/issues/<number>/comments -f body="..."
235
235
  ```
236
236
 
237
- - 답글 본문은 셸 변수 echo 파이프 대신 **파일로 떨궈 전달**한다. 백틱·따옴표·개행이 셸에서 깨지지 않게 하려는 것이다.
237
+ - 답글 본문은 셸 변수 echo 파이프 대신 **파일로 떨궈 전달**한다. 백틱, 따옴표, 개행이 셸에서 깨지지 않게 하려는 것이다.
238
238
  - 건마다 개별 호출이다. `/review`처럼 한 리뷰로 묶는 API가 아니다. 중간에 실패하면 어디까지 게시됐는지 사용자에게 알린다 — 부분 실패를 성공으로 보고하지 않는다.
239
- - **리뷰 상태(`APPROVE`/`REQUEST_CHANGES`)는 건드리지 않는다.** 리뷰이가 자기 PR의 리뷰 상태를 바꿀 일이 없고, GitHub도 본인 PR 승인을 막는다(422).
239
+ - **리뷰 상태(`APPROVE`/`REQUEST_CHANGES`)는 건드리지 않는다.** 리뷰이가 자기 PR의 리뷰 상태를 바꿀 일이 없고 GitHub도 본인 PR 승인을 막는다(422).
240
240
 
241
241
  ### 7단계: 스레드 닫기 (opt-in, 기본 안 함)
242
242
 
243
- `resolveThreads`가 명시적으로 `true`거나 사용자가 요청할 때만 한다. **기본값은 닫지 않는 것이다** — 코멘트가 해결됐는지 판단하는 건 리뷰어 몫이고, 리뷰이가 먼저 닫으면 확인 없이 넘어간 것처럼 보인다.
243
+ `resolveThreads`가 명시적으로 `true`거나 사용자가 요청할 때만 한다. **기본값은 닫지 않는 것이다** — 코멘트가 해결됐는지 판단하는 건 리뷰어 몫이고 리뷰이가 먼저 닫으면 확인 없이 넘어간 것처럼 보인다.
244
244
 
245
245
  ```bash
246
246
  gh api graphql -F threadId='<thread node id>' -f query='
@@ -24,7 +24,7 @@ outputs:
24
24
  `gestalt init` 명령어와 동일한 초기화 작업을 Claude Code 스킬로 실행한다.
25
25
 
26
26
  > **도구가 없을 때** → [`../_shared/tool-availability.md`](../_shared/tool-availability.md)
27
- > `ges_*` 도구가 없거나 호출이 실패하면 직접 흉내내 진행하지 않고, 무엇이 왜 안 되는지 말하고 멈춥니다.
27
+ > `ges_*` 도구가 없거나 호출이 실패하면 직접 흉내내 진행하지 않고 무엇이 왜 안 되는지 말하고 멈춥니다.
28
28
 
29
29
  ## 실행 단계
30
30
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: slack-send
3
3
  version: "1.0.0"
4
- description: "슬랙 메시지를 권윤학님 어투로 다듬어 승인 단계를 거친 뒤 전송하거나 예약한다. 메시지를 '보내달라/전달해달라/공지해달라/예약 발송해달라'는 요청 시 자동 발동. slack-messenger로 초안 → 채널과 발송 시각 확인 → 미리보기 승인 → slack_send_message/slack_schedule_message. 전송까지 하는 스킬이다. 문구만 다듬고 보내지는 않으려면 slack-messenger를 호출한다."
4
+ description: "슬랙 메시지를 작성자 어투로 다듬어 승인 단계를 거친 뒤 전송하거나 예약한다. 메시지를 '보내달라/전달해달라/공지해달라/예약 발송해달라'는 요청 시 자동 발동. slack-messenger로 초안 → 채널과 발송 시각 확인 → 미리보기 승인 → slack_send_message/slack_schedule_message. 전송까지 하는 스킬이다. 문구만 다듬고 보내지는 않으려면 slack-messenger를 호출한다."
5
5
  triggers:
6
6
  # 전송 의도
7
7
  - "슬랙 보내"
@@ -28,7 +28,7 @@ inputs:
28
28
  target:
29
29
  type: string
30
30
  required: false
31
- description: "대상 채널명(#team-프론트엔드) 또는 DM 상대"
31
+ description: "대상 채널명(#example-channel) 또는 DM 상대"
32
32
  when:
33
33
  type: string
34
34
  required: false
@@ -40,10 +40,10 @@ outputs:
40
40
  # Slack Send Skill
41
41
 
42
42
  > **에이전트 tier로 모델 고르기** → [`../_shared/agent-model.md`](../_shared/agent-model.md)
43
- 슬랙 메시지를 **권윤학님 어투로 다듬어 → 승인받고 → 전송/예약**하는 파이프라인.
43
+ 슬랙 메시지를 **작성자 어투로 다듬어 → 승인받고 → 전송/예약**하는 파이프라인.
44
44
  `slack-messenger` role agent(작성·다듬기)와 Slack MCP(전송)를 잇는다.
45
45
 
46
- > **불변 규칙: 승인 없이는 절대 전송하지 않는다.** 미리보기를 보여주고 사용자의 명시적 "OK"를 받은 뒤에만 `slack_send_message`/`slack_schedule_message`를 호출한다. 이건 이 스킬의 존재 이유다 — 잘못된 채널·오탈자·오발송 방지.
46
+ > **불변 규칙: 승인 없이는 절대 전송하지 않는다.** 미리보기를 보여주고 사용자의 명시적 "OK"를 받은 뒤에만 `slack_send_message`/`slack_schedule_message`를 호출한다. 이건 이 스킬의 존재 이유다 — 잘못된 채널, 오탈자, 오발송 방지.
47
47
 
48
48
  ## 파이프라인
49
49
 
@@ -72,14 +72,14 @@ outputs:
72
72
 
73
73
  - 채널: `slack_search_channels`로 이름 → `channel_id` 확인. 검색 결과가 여러 개면 **어느 채널인지 사용자에게 확인**한다(오발송 1순위 원인).
74
74
  - DM: `slack_search_users`로 상대 → `user_id`(그대로 channel_id로 사용).
75
- - 확정한 채널명·ID를 사용자에게 노출해 **대상이 맞는지 확인**한다.
75
+ - 확정한 채널명, ID를 사용자에게 노출해 **대상이 맞는지 확인**한다.
76
76
 
77
77
  ### 4. 미리보기 + 승인 단계 (필수)
78
78
 
79
79
  아래를 한 화면에 모아 보여주고 명시적 승인을 받는다.
80
80
 
81
81
  ```
82
- [보낼 곳] #team-프론트엔드 (C0XXXX)
82
+ [보낼 곳] #example-channel (C0XXXX)
83
83
  [시각] 즉시 전송 / 또는 2026-07-20(월) 09:00 KST 예약
84
84
  [내용]
85
85
  <다듬어진 최종 메시지 전문>
@@ -101,7 +101,7 @@ outputs:
101
101
 
102
102
  ### 6. 완료 보고
103
103
 
104
- 전송/예약 결과와 메시지 링크(permalink)를 사용자에게 돌려준다. 예약이면 "예약됨 + 발송 예정 시각"을 명시하고, 취소는 Slack UI의 "Drafts & sent"에서 가능함을 안내한다.
104
+ 전송/예약 결과와 메시지 링크(permalink)를 사용자에게 돌려준다. 예약이면 "예약됨 + 발송 예정 시각"을 명시하고 취소는 Slack UI의 "Drafts & sent"에서 가능함을 안내한다.
105
105
 
106
106
  ## Do-NOT
107
107
 
@@ -110,7 +110,7 @@ outputs:
110
110
  - **대상 불명확 시 전송 금지.** 채널이 하나로 특정되지 않으면 물어본다.
111
111
  - 사용자가 주지 않은 사실(수치·링크·담당자)을 지어내 채우지 않는다(`[???]`로 남기고 확인).
112
112
  - Slack Connect(외부 공유) 채널에는 전송/예약 불가 — 걸리면 사용자에게 알린다.
113
- - 대량 채널 동시 발송·반복 발송은 하지 않는다(요청이 명확해도 채널별로 확인).
113
+ - 대량 채널 동시 발송, 반복 발송은 하지 않는다(요청이 명확해도 채널별로 확인).
114
114
 
115
115
  ## 에러 처리
116
116
 
@@ -22,7 +22,7 @@ outputs:
22
22
  제품 문제를 입력받아 **인터뷰 → 스펙 → 실행 루프**를 하나의 흐름으로 자율 드라이빙한다.
23
23
 
24
24
  > **도구가 없을 때** → [`../_shared/tool-availability.md`](../_shared/tool-availability.md)
25
- > `ges_*` 도구가 없거나 호출이 실패하면 직접 흉내내 진행하지 않고, 무엇이 왜 안 되는지 말하고 멈춥니다.
25
+ > `ges_*` 도구가 없거나 호출이 실패하면 직접 흉내내 진행하지 않고 무엇이 왜 안 되는지 말하고 멈춥니다.
26
26
 
27
27
  - **인터뷰**: 사람이 직접 답변 (큰 관점 정리 포함, 자동화하지 않음)
28
28
  - **스펙 생성 이후**: AI가 자율로 드라이빙 — 사람 개입 없이 루프를 돌린다
@@ -100,7 +100,7 @@ Spec 생성은 인터뷰 조각들을 하나의 완전한 구조로 결정화하
100
100
  ges_status() → { reasoningModel: "fable", reasoningModelFallback: "opus", ... }
101
101
  ```
102
102
 
103
- **스폰.** Agent 도구로 서브에이전트를 띄우되 `model` 파라미터에 `reasoningModel` 값을 넘긴다. 서브에이전트에는 1단계에서 받은 `systemPrompt`, `specPrompt`, `allRounds[]`를 그대로 전달하고, 위 Spec 검증 스키마에 맞는 Spec JSON을 산출하게 한다. 서브에이전트 결과를 2단계 `ges_generate_spec({ sessionId, spec })`로 제출한다.
103
+ **스폰.** Agent 도구로 서브에이전트를 띄우되 `model` 파라미터에 `reasoningModel` 값을 넘긴다. 서브에이전트에는 1단계에서 받은 `systemPrompt`, `specPrompt`, `allRounds[]`를 그대로 전달하고 위 Spec 검증 스키마에 맞는 Spec JSON을 산출하게 한다. 서브에이전트 결과를 2단계 `ges_generate_spec({ sessionId, spec })`로 제출한다.
104
104
 
105
105
  **폴백은 스킬 런타임에서 발동한다.** 서버는 폴백 대상(`reasoningModelFallback`)만 알려줄 뿐, 모델 가용성을 감지하거나 재시도하지 않는다. Agent 도구가 `reasoningModel`(예: `fable`)을 지원하지 않아 스폰이 거부/실패하면, 그때 스킬이 직접 `model`을 `reasoningModelFallback`(예: `opus`)로 바꿔 1회 재시도한다. 폴백 판단과 재시도는 전적으로 이 스킬 런타임의 책임이다.
106
106
 
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"AASA,OAAO,EAAwB,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhF,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;AAsHD,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":"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"}
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { changeRate } from './change-rate.js';
9
9
  import { countByRule, missingProtectedTokens, structureStats } from './detectors.js';
10
- import { parseRuleBook, s1Ids } from './rules.js';
10
+ import { parseRuleBook, ruleLabel, s1Ids } from './rules.js';
11
11
  export const EXIT_CODE = {
12
12
  pass: 0,
13
13
  warn: 1,
@@ -53,7 +53,7 @@ function checkResidualS1(book, register, before, after) {
53
53
  residual,
54
54
  };
55
55
  }
56
- const evidence = residual.map((row) => `${row.ruleId}: ${row.before} → ${row.after}`);
56
+ const evidence = residual.map((row) => `${ruleLabel(book, row.ruleId)}: ${row.before} → ${row.after}`);
57
57
  return {
58
58
  axis: {
59
59
  axis: 'residual-s1',
@@ -85,7 +85,7 @@ function checkPreservation(before, after) {
85
85
  evidence: missing.slice(0, 10),
86
86
  };
87
87
  }
88
- function checkStructure(before, after, introduced) {
88
+ function checkStructure(book, before, after, introduced) {
89
89
  const a = structureStats(before);
90
90
  const b = structureStats(after);
91
91
  const problems = [];
@@ -100,7 +100,7 @@ function checkStructure(before, after, introduced) {
100
100
  problems.push(`링크 ${a.links} → ${b.links}`);
101
101
  }
102
102
  for (const row of introduced.slice(0, 5)) {
103
- problems.push(`${row.ruleId} 신규 유입 ${row.before} → ${row.after}`);
103
+ problems.push(`${ruleLabel(book, row.ruleId)} 신규 유입 ${row.before} → ${row.after}`);
104
104
  }
105
105
  if (problems.length === 0) {
106
106
  return { axis: 'structure', verdict: 'pass', detail: '구조·정보량 보존' };
@@ -121,7 +121,7 @@ export function runCheck(before, after, options = {}) {
121
121
  const { axis: s1Axis, residual } = checkResidualS1(book, register, before, after);
122
122
  const preservationAxis = checkPreservation(before, after);
123
123
  const introduced = findIntroduced(before, after);
124
- const structureAxis = checkStructure(before, after, introduced);
124
+ const structureAxis = checkStructure(book, before, after, introduced);
125
125
  const axes = [changeAxis, s1Axis, preservationAxis, structureAxis];
126
126
  const verdict = worst(axes.map((a) => a.verdict));
127
127
  return {
@@ -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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"}
@@ -1,4 +1,4 @@
1
- export { parseRuleBook, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, type Register, type Rule, type RuleBook, type Severity, } from './rules.js';
1
+ export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, type Register, type Rule, type RuleBook, type Severity, } from './rules.js';
2
2
  export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, DETECTABLE_RULE_IDS, type Detection, 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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,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,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,4 +1,4 @@
1
- export { parseRuleBook, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, } from './rules.js';
1
+ export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, } from './rules.js';
2
2
  export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, 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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,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,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"}
@@ -29,6 +29,8 @@ export declare function expandIdRanges(text: string): string[];
29
29
  /** 마크다운 본문에서 인용된 모든 룰 ID를 뽑는다 (범위 표기 포함) */
30
30
  export declare function citedRuleIds(markdown: string): string[];
31
31
  export declare function parseRuleBook(path?: string): RuleBook;
32
+ /** CLI가 찍는 이름. 룰북이 기준이라 문서와 따로 놀지 않는다 */
33
+ export declare function ruleLabel(book: RuleBook, id: string): string;
32
34
  /** 해당 말투 기준으로 S1인 룰 ID */
33
35
  export declare function s1Ids(book: RuleBook, register: Register): string[];
34
36
  //# sourceMappingURL=rules.d.ts.map
@@ -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;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,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"}
@@ -85,6 +85,39 @@ export function parseRuleBook(path = QUICK_RULES_PATH) {
85
85
  selfCheckChatS1: expandIdRanges(chatPart),
86
86
  };
87
87
  }
88
+ const LABEL_MAX = 24;
89
+ /** 패턴 칸은 조건·예시까지 담고 있어 그대로 쓰면 한 줄을 넘는다. 이름만 남긴다 */
90
+ function washLabel(pattern) {
91
+ let text = pattern.replace(/\*\*/g, ' ').replace(/`/g, '');
92
+ // 부연은 대시 뒤에 붙는다
93
+ text = text.split(' — ')[0].trim();
94
+ // 괄호 안이 길면 예시다. 예시는 뒤에 붙으니 거기서 끊는다.
95
+ // "(·)", "(서)" 처럼 짧은 건 이름의 일부라 남긴다
96
+ const paren = text.search(/\s*\([^)]{4,}/);
97
+ if (paren >= 0)
98
+ text = text.slice(0, paren);
99
+ // 띄어 쓴 슬래시 뒤는 같은 패턴의 다른 표기다
100
+ text = text.split(' / ')[0].trim();
101
+ // 앞에 이름이 있으면 뒤따르는 인용은 예시다. 짧은 인용은 그 자체가 이름이라 남긴다
102
+ const quoted = text.match(/^(.+?)\s+"([^"]+)"/);
103
+ if (quoted && quoted[2].length > 10)
104
+ text = quoted[1].trim();
105
+ // 빈도 조건은 이름이 아니다
106
+ text = text.replace(/\s*(한 글에\s*)?\d+회\s*(이상|\+)?(\s*반복)?$/, '');
107
+ text = text.replace(/\s*단락\s*[≥>]=?\s*\d+회.*$/, '');
108
+ text = text.replace(/\s{2,}/g, ' ').trim();
109
+ if (text.length > LABEL_MAX)
110
+ text = `${text.slice(0, LABEL_MAX)}…`;
111
+ return text;
112
+ }
113
+ /** CLI가 찍는 이름. 룰북이 기준이라 문서와 따로 놀지 않는다 */
114
+ export function ruleLabel(book, id) {
115
+ const pattern = book.rules.get(id)?.pattern;
116
+ if (!pattern)
117
+ return id;
118
+ const label = washLabel(pattern);
119
+ return label ? `${id} ${label}` : id;
120
+ }
88
121
  /** 해당 말투 기준으로 S1인 룰 ID */
89
122
  export function s1Ids(book, register) {
90
123
  return [...book.rules.values()]
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/humanize/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/humanize/rules.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.53.0",
3
+ "version": "0.55.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "dev": "tsx bin/gestalt.ts",
22
22
  "build": "tsc",
23
- "postbuild": "rm -rf dist/plugin && 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 && pnpm run verify:plugin && pnpm run verify:rules",
23
+ "postbuild": "rm -rf dist/plugin && 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 && pnpm run verify:plugin && pnpm run verify:rules && pnpm run verify:output-style",
24
24
  "verify:plugin": "tsx scripts/verify-plugin-assets.ts",
25
25
  "prepublishOnly": "pnpm build",
26
26
  "test": "vitest run",
@@ -34,7 +34,10 @@
34
34
  "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
35
35
  "version:sync": "tsx scripts/sync-version.ts",
36
36
  "postversion": "pnpm run version:sync",
37
- "verify:rules": "tsx scripts/verify-rule-refs.ts"
37
+ "verify:rules": "tsx scripts/verify-rule-refs.ts",
38
+ "humanize:baseline": "tsx scripts/humanize-baseline.ts",
39
+ "build:output-style": "tsx scripts/build-output-style.ts",
40
+ "verify:output-style": "tsx scripts/build-output-style.ts --dry-run"
38
41
  },
39
42
  "dependencies": {
40
43
  "@anthropic-ai/sdk": "^0.39.0",
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "gestalt",
3
- "version": "0.53.0",
3
+ "version": "0.55.0",
4
4
  "description": "Gestalt psychology-driven AI development harness. Transforms scattered requirements into structured, validated specifications through interactive interviews.",
5
5
  "author": {
6
- "name": "tienne",
7
- "email": "tienne89@gmail.com"
6
+ "name": "tienne"
8
7
  },
9
8
  "homepage": "https://github.com/tienne/gestalt",
10
9
  "repository": "https://github.com/tienne/gestalt",
@@ -21,7 +21,7 @@ You are the Medicine Seller persona — 시장 한복판에서 약을 파는 전
21
21
 
22
22
  ### 텍스트 변환
23
23
  - 원문의 핵심 정보는 그대로 유지하면서 말투만 세일즈맨으로 바꾼다.
24
- - 정보의 의미·수치·사실 관계를 절대 바꾸지 않는다. 포장만 화려하게 한다.
24
+ - 정보의 의미, 수치, 사실 관계를 절대 바꾸지 않는다. 포장만 화려하게 한다.
25
25
 
26
26
  ### 새 글 생성
27
27
  - 캐릭터 관점에서 직접 작성한다.
@@ -30,8 +30,8 @@ You are the Medicine Seller persona — 시장 한복판에서 약을 파는 전
30
30
  ## 금지 사항
31
31
 
32
32
  - 실제 허위 정보 추가 금지.
33
- - 사실 왜곡 금지 — 말투만 과장하고, 내용은 원문을 보존한다.
34
- - 없는 효능·없는 수치·없는 보증을 지어내지 않는다.
33
+ - 사실 왜곡 금지 — 말투만 과장하고 내용은 원문을 보존한다.
34
+ - 없는 효능, 없는 수치, 없는 보증을 지어내지 않는다.
35
35
 
36
36
  ## Humanize 처리 — humanize-monolith 위임
37
37
 
@@ -39,8 +39,8 @@ You are the Medicine Seller persona — 시장 한복판에서 약을 파는 전
39
39
 
40
40
  단, 아래 표현은 캐릭터 의도이므로 보존한다:
41
41
  - "결론적으로!" — 세일즈 클로징 표현
42
- - 과장된 감탄·긴박감 문구 — 캐릭터 핵심 목소리
43
- - 수치·제품명·사실 정보 원문
42
+ - 과장된 감탄, 긴박감 문구 — 캐릭터 핵심 목소리
43
+ - 수치, 제품명, 사실 정보 원문
44
44
 
45
45
  ## Output Format
46
46
 
@@ -21,7 +21,7 @@ You are the Trickster persona — 장난끼 가득한 트릭스터다.
21
21
 
22
22
  ### 텍스트 변환
23
23
  - 진지한 내용을 가볍게 비틀되, 핵심 정보는 그대로 유지한다.
24
- - 의미·사실 관계를 바꾸지 않는다. 분위기만 장난스럽게 만든다.
24
+ - 의미, 사실 관계를 바꾸지 않는다. 분위기만 장난스럽게 만든다.
25
25
 
26
26
  ### 새 글 생성
27
27
  - 트릭스터 관점에서 직접 작성한다.
@@ -30,7 +30,7 @@ You are the Trickster persona — 장난끼 가득한 트릭스터다.
30
30
  ## 금지 사항
31
31
 
32
32
  - 과도한 비하나 공격성 없이 유쾌하게.
33
- - 특정 인물·집단을 모욕하거나 상처 주지 않는다.
33
+ - 특정 인물, 집단을 모욕하거나 상처 주지 않는다.
34
34
  - 사실 왜곡 없이, 장난은 톤에만 적용한다.
35
35
 
36
36
  ## Humanize 처리 — humanize-monolith 위임
@@ -38,9 +38,9 @@ You are the Trickster persona — 장난끼 가득한 트릭스터다.
38
38
  캐릭터 말투를 입힌 초안이 완성되면, `ges_agent { action: "get", name: "humanize-monolith" }`를 호출해 에이전트의 시스템 프롬프트를 가져온다. 그 프롬프트의 S1 규칙을 초안에 적용해 AI-tell 패턴을 제거한다.
39
39
 
40
40
  단, 아래 표현은 캐릭터 의도이므로 보존한다:
41
- - 엉뚱한 비유·반전 코멘트 — 캐릭터 핵심 목소리
41
+ - 엉뚱한 비유, 반전 코멘트 — 캐릭터 핵심 목소리
42
42
  - 의도적으로 독자를 놀리는 어투 — 헤징이 아닌 트릭
43
- - 수치·사실 정보 원문
43
+ - 수치, 사실 정보 원문
44
44
 
45
45
  ## Output Format
46
46
 
@@ -24,12 +24,12 @@ When reviewing code, check for:
24
24
 
25
25
  ## Comment Hygiene
26
26
 
27
- 주석은 기본적으로 없는 게 낫습니다. 코드를 읽거나 `git log`/`git blame`으로 확인되는 내용이면 주석으로 남길 이유가 없고, 코드가 바뀔 때 같이 안 고쳐져서 거짓말이 됩니다. 변경된 코드에 아래 주석이 보이면 **반드시 이슈로 남깁니다.**
27
+ 주석은 기본적으로 없는 게 낫습니다. 코드를 읽거나 `git log`/`git blame`으로 확인되는 내용이면 주석으로 남길 이유가 없고 코드가 바뀔 때 같이 안 고쳐져서 거짓말이 됩니다. 변경된 코드에 아래 주석이 보이면 **반드시 이슈로 남깁니다.**
28
28
 
29
29
  **지적할 주석**
30
30
 
31
31
  - 코드를 그대로 옮겨 적은 것 — `// 카운트를 1 증가` 위의 `count += 1`, 시그니처만 반복하는 내부 함수 JSDoc
32
- - 변경 이력·작업 메모 — `// 2026-03-12 수정`, `// 기존 로직 제거함`, `// 리뷰 반영`. 커밋 메시지가 이미 담고 있습니다
32
+ - 변경 이력, 작업 메모 — `// 2026-03-12 수정`, `// 기존 로직 제거함`, `// 리뷰 반영`. 커밋 메시지가 이미 담고 있습니다
33
33
  - 주석 처리된 죽은 코드 — 되살릴 일 있으면 히스토리에서 꺼냅니다
34
34
  - 코드와 이미 어긋난 주석 — 설명하는 동작이 지금 코드에 없는 것
35
35
  - 섹션 배너 — `// ===== helpers =====` 같은 것. 파일이나 함수를 나누라는 신호입니다
@@ -39,9 +39,9 @@ When reviewing code, check for:
39
39
 
40
40
  - 왜 이 방식을 골랐는지, 왜 뻔한 쪽으로 안 갔는지 — 외부 API 버그 우회, 성능 제약, 스펙 요구사항
41
41
  - 겉보기에 틀린 것처럼 보이는 코드가 의도된 것이라는 근거
42
- - 공개 API·공용 유틸의 JSDoc (내부 전용 함수는 제외)
42
+ - 공개 API, 공용 유틸의 JSDoc (내부 전용 함수는 제외)
43
43
 
44
- **주석 대신 코드나 문서로.** 주석을 지우자고만 하지 말고 대체 표현까지 제안합니다 — 이름을 풀어쓰거나, 블록을 함수로 빼거나, 매직 넘버를 이름 붙은 상수로 올리거나, 배경 설명이 길면 README·ADR로 옮기고 링크만 남기는 식입니다.
44
+ **주석 대신 코드나 문서로.** 주석을 지우자고만 하지 말고 대체 표현까지 제안합니다 — 이름을 풀어쓰거나, 블록을 함수로 빼거나, 매직 넘버를 이름 붙은 상수로 올리거나, 배경 설명이 길면 READMEADR로 옮기고 링크만 남기는 식입니다.
45
45
 
46
46
  **severity 기준**
47
47
 
@@ -1,6 +1,6 @@
1
1
  # 공유 레퍼런스
2
2
 
3
- 여러 에이전트가 함께 쓰는 어투·문체 룰북이다. 특정 에이전트 소유가 아니라서 `_shared/` 아래 둔다.
3
+ 여러 에이전트가 함께 쓰는 어투, 문체 룰북이다. 특정 에이전트 소유가 아니라서 `_shared/` 아래 둔다.
4
4
  `_shared`에는 `AGENT.md`가 없으므로 `RoleAgentRegistry`가 에이전트로 로드하지 않는다
5
5
  (`plugin/skills/_shared/`와 같은 규칙).
6
6
 
@@ -18,7 +18,7 @@
18
18
  pnpm verify:rules
19
19
  ```
20
20
 
21
- 에이전트 문서 14곳이 룰 ID와 금지 어휘를 손으로 옮겨 적고 있어서, 룰북에서 ID를 지우거나
21
+ 에이전트 문서 14곳이 룰 ID와 금지 어휘를 손으로 옮겨 적고 있어서 룰북에서 ID를 지우거나
22
22
  심각도를 바꾸면 그 사본들이 조용히 어긋난다. 이 검사가 네 가지를 본다 — 없는 ID를 인용하는
23
23
  문서, 자체검증 목록에서 빠진 S1, 표와 목록의 심각도 불일치, 룰 문서 본문의 금지어 사용.
24
24
  `pnpm test`와 `pnpm build`에도 걸려 있다.