@tienne/gestalt 0.80.0 → 0.81.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.
- package/dist/package.json +1 -1
- package/dist/plugin/role-agents/code-review-writer/AGENT.md +6 -0
- package/dist/plugin/role-agents/humanize-monolith/AGENT.md +8 -0
- package/dist/plugin/skills/review/SKILL.md +79 -25
- package/dist/src/cli/commands/humanize-scan.d.ts +11 -1
- package/dist/src/cli/commands/humanize-scan.d.ts.map +1 -1
- package/dist/src/cli/commands/humanize-scan.js +72 -15
- package/dist/src/cli/commands/humanize-scan.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +6 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/humanize/index.d.ts +1 -1
- package/dist/src/humanize/index.d.ts.map +1 -1
- package/dist/src/humanize/index.js +1 -1
- package/dist/src/humanize/index.js.map +1 -1
- package/dist/src/humanize/scan.d.ts +19 -0
- package/dist/src/humanize/scan.d.ts.map +1 -1
- package/dist/src/humanize/scan.js +15 -0
- package/dist/src/humanize/scan.js.map +1 -1
- package/package.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/role-agents/code-review-writer/AGENT.md +6 -0
- package/plugin/role-agents/humanize-monolith/AGENT.md +8 -0
- package/plugin/skills/review/SKILL.md +79 -25
package/dist/package.json
CHANGED
|
@@ -92,6 +92,12 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
|
|
|
92
92
|
[`../_shared/references/ai-tell-quick-rules.md`](../_shared/references/ai-tell-quick-rules.md)이며
|
|
93
93
|
인라인 코멘트엔 특히 다음을 적용한다.
|
|
94
94
|
|
|
95
|
+
**아래 표가 인라인 코멘트에 걸리는 자리를 추려 담고 있으니 첫 판에 그 파일을 통째로 열지
|
|
96
|
+
않는다.** 부르는 쪽이 어투 검사 결과를 프롬프트에 실어 재작성을 시켰으면 그때도 마찬가지다 —
|
|
97
|
+
걸린 룰의 처방이 그 출력에 이미 들어 있어서 44KB를 다시 읽어도 같은 내용이다. 확인해야 할
|
|
98
|
+
ID가 따로 있으면 그 행만 찾아 읽는다. `author-voice.md`는 다르다 — 코멘트를 쓰는 기준이라
|
|
99
|
+
초안을 쓰기 전에 읽는다.
|
|
100
|
+
|
|
95
101
|
**제거할 패턴 (S1 — 반드시 교정)**
|
|
96
102
|
|
|
97
103
|
| 패턴 | 예시 | 교정 |
|
|
@@ -84,6 +84,8 @@ gestalt humanize-scan --file <원문> --register <doc|chat|report>
|
|
|
84
84
|
종료 코드로도 답한다. 걸린 게 있으면 0, 어투는 깨끗한데 맞춤법만 걸리면 11, 탐지기가 가리는 범위에서 0건이면 10이다. 11이면 어투는 그대로 두고 맞춤법 절만 고쳐서 낸다.
|
|
85
85
|
파일이 없으면 3이다. 셸에서 분기할 때 stdout 을 파싱하지 않아도 된다.
|
|
86
86
|
|
|
87
|
+
`--file`은 여러 번 줄 수 있다. 초안이 여러 개면 한 번에 넘겨 한 프로세스에서 각각 독립적으로 스캔한다.
|
|
88
|
+
|
|
87
89
|
스캔이 내놓는 것만 본다.
|
|
88
90
|
|
|
89
91
|
- **걸린 룰**: ID, 건수, 실제 표현, 처방이 함께 나온다. 이번 윤문의 작업 목록이다
|
|
@@ -100,6 +102,12 @@ gestalt humanize-scan --file <원문> --register <doc|chat|report>
|
|
|
100
102
|
인라인 텍스트만 받아 스캔을 못 돌리는 경우에만 룰북을 직접 읽는다. 이때도 말투에 해당하는
|
|
101
103
|
S1부터 본다. 전 카테고리를 훑지 않는다.
|
|
102
104
|
|
|
105
|
+
**부르는 쪽이 스캔 결과를 프롬프트에 실어 보냈으면 `ai-tell-quick-rules.md`를 다시 열지
|
|
106
|
+
않는다.** 걸린 룰의 처방이 그 출력에 이미 들어 있어서 같은 내용을 44KB 더 읽는 셈이 된다.
|
|
107
|
+
`author-voice.md`는 다르다 — 보존 기준은 스캔이 내놓는 값이 아니라 필요하면 그대로 읽는다.
|
|
108
|
+
다만 '탐지기가 못 가리는 S1' 줄은 ID만 오고 처방이 안 딸려 온다. 그 ID를 확인해야 하면
|
|
109
|
+
`ai-tell-quick-rules.md`에서 해당 행만 찾아 읽고 파일 전체를 읽지 않는다.
|
|
110
|
+
|
|
103
111
|
### 1단계 — 탐지
|
|
104
112
|
|
|
105
113
|
스캔 결과에 탐지기가 못 가리는 S1을 더해 이번 작업 목록을 확정한다.
|
|
@@ -364,6 +364,8 @@ Agent {
|
|
|
364
364
|
|
|
365
365
|
1단계에서 수집한 변경 파일을 바탕으로 변경의 기획적 의도와 동작 변화를 분석한다.
|
|
366
366
|
|
|
367
|
+
**이 호출은 따로 내보내지 않고 3단계의 병렬 메시지에 함께 담아 띄운다.** 아래 프롬프트가 받는 입력은 diff와 PR 제목/본문뿐이고 리뷰어의 판정(`mergedIssues` 등)은 받지 않으므로 리뷰어를 먼저 기다릴 이유가 없다. 실행 순서만 앞당겨질 뿐 **표시 순서는 그대로다** — 어투 검사는 파도가 다 돌아온 뒤에 하고 문서도 리뷰 결과보다 먼저 사용자에게 보여준다(결과 표시 절 참고).
|
|
368
|
+
|
|
367
369
|
**서브에이전트에 위임한다.** 메인 세션에서 `ges_agent get`을 하지 않는다.
|
|
368
370
|
|
|
369
371
|
```
|
|
@@ -400,7 +402,7 @@ Agent {
|
|
|
400
402
|
|
|
401
403
|
#### 기획 컨텍스트 어투 검사 (필수)
|
|
402
404
|
|
|
403
|
-
사용자에게 표시하기 전에 스캔한다. `change-context-writer`가 자체 humanize를 거쳐도 별도 검증 없이 그대로 나가면, 리포트(4.5단계)보다 먼저 보이는 이 문서가 유일하게 어투 검사를 안 거친 자리로 남는다.
|
|
405
|
+
사용자에게 표시하기 전에 스캔한다. `change-context-writer`가 자체 humanize를 거쳐도 별도 검증 없이 그대로 나가면, 리포트(4.5단계)보다 먼저 보이는 이 문서가 유일하게 어투 검사를 안 거친 자리로 남는다. **이 검사는 3단계 파도가 전부 돌아온 뒤에 한다** — 병렬로 띄운 호출이라고 검사까지 다른 결과와 뒤섞어 하지 않는다.
|
|
404
406
|
|
|
405
407
|
```bash
|
|
406
408
|
scanTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-review/<PR 식별자 또는 target>/$$"
|
|
@@ -451,7 +453,9 @@ ges_execute {
|
|
|
451
453
|
|
|
452
454
|
### 3단계: 에이전트별 리뷰 제출 (review_submit × N)
|
|
453
455
|
|
|
454
|
-
**에이전트마다 서브에이전트를 하나씩 띄웁니다.** 리뷰어끼리 서로 볼 이유가 없으므로 **한 메시지에 전부 담아 병렬로 돌립니다.** 메인 세션에서 `ges_agent get`을 하지 않습니다.
|
|
456
|
+
**에이전트마다 서브에이전트를 하나씩 띄웁니다.** 리뷰어끼리 서로 볼 이유가 없으므로 **한 메시지에 전부 담아 병렬로 돌립니다.** 이 메시지에는 리뷰어들뿐 아니라 **1.5단계 change-context-writer 호출과 3.5단계 continuity-judge 호출도 함께 담습니다.** 셋 다 입력으로 받는 건 diff와 PR 제목/본문, 스펙 제약 정도이고 서로의 산출물(리뷰어의 `issues`, continuity-judge의 `continuityVerdict` 등)은 아무도 받지 않으므로 순서를 나눌 이유가 없습니다. 셋을 한 파도로 띄우고 각자 결과를 받습니다. 메인 세션에서 `ges_agent get`을 하지 않습니다.
|
|
457
|
+
|
|
458
|
+
코드 그래프의 영향 범위(`diff_radius`, `co_change`)를 이 프롬프트에 얹는 안은 한 번 재보고 접었습니다 — 리뷰어가 그 목록을 열지 않았고 토큰만 늘었습니다. 근거는 `docs/experiments/review-impact-radius.md`에 있습니다.
|
|
455
459
|
|
|
456
460
|
```
|
|
457
461
|
Agent {
|
|
@@ -528,9 +532,13 @@ ges_execute {
|
|
|
528
532
|
|
|
529
533
|
### 3.5단계: 정합 심급 판단 (continuity-judge)
|
|
530
534
|
|
|
531
|
-
`review_consensus`를 호출하기 **전에** 정합 심급을 먼저 판단합니다.
|
|
535
|
+
`review_consensus`를 호출하기 **전에** 정합 심급을 먼저 판단합니다. 이 문장이 가리키는 건 **결과를 넘기는 순서**이지 **호출을 내보내는 순서**가 아닙니다 — 아래 프롬프트는 3단계의 병렬 메시지에 함께 담아 리뷰어들과 같은 파도로 띄웁니다. `continuity-judge`는 diff와 목표, PR 제목/본문, 스펙 제약만 보고 리뷰어의 `issues`를 보지 않으므로 리뷰어 결과를 기다릴 이유가 없습니다. 순서가 남는 자리는 **소비 시점**뿐입니다 — `continuityVerdict`는 파도가 다 돌아온 뒤 3단계 리뷰 결과와 나란히 4단계 `review_consensus`로 넘깁니다.
|
|
536
|
+
|
|
537
|
+
결함 심급(3단계 리뷰 에이전트)이 "부분에 결함이 있나"를 봤다면, 정합 심급은 "부분의 합이 목표를 이루나"를 봅니다 — 국소 결함으로는 안 잡히는 **목표 이탈(drift)과 전체 일관성**입니다.
|
|
532
538
|
|
|
533
|
-
|
|
539
|
+
**`continuity-judge`는 3단계 리뷰어의 `issues`를 입력으로 받지 않습니다** — 보는 자료는 diff 전체와 목표, PR 제목과 본문, 스펙 제약뿐입니다. 그래서 리뷰어 판정을 기다리지 않고 같은 파도에 태울 수 있습니다. 이 프롬프트에 `issues`나 `review_submit` 산출물을 끼워 넣는 변경은 이 전제와 정면으로 부딪힙니다.
|
|
540
|
+
|
|
541
|
+
**서브에이전트에 위임합니다.** `continuity-judge`는 tier가 `frontier`라 모델도 그에 맞춰 넘깁니다(`agent-model.md`). 이 호출도 3단계, 1.5단계와 같은 메시지에 담습니다.
|
|
534
542
|
|
|
535
543
|
```
|
|
536
544
|
Agent {
|
|
@@ -629,7 +637,35 @@ ges_execute {
|
|
|
629
637
|
|
|
630
638
|
`review_consensus`가 반환한 마크다운 리포트를 `humanize-monolith` 에이전트로 전달해 AI 말투, 번역투를 제거합니다.
|
|
631
639
|
|
|
632
|
-
**서브에이전트에 위임합니다.** humanize-monolith는 룰북 두 개(`author-voice.md`
|
|
640
|
+
**서브에이전트에 위임합니다.** humanize-monolith는 룰북 두 개(`author-voice.md` 23KB, `ai-tell-quick-rules.md` 44KB)를 딸고 오므로, 메인 세션에서 가져오면 이 단계 하나로 67KB가 실립니다.
|
|
641
|
+
|
|
642
|
+
**그 67KB를 통째로 딸려 보내지도 않습니다.** 윤문에 넘기기 전에 먼저 스캔을 돌려 이번 리포트에서 실제로 걸린 룰만 처방과 함께 프롬프트에 싣습니다. 걸린 게 서너 개인데 예순 개가 넘는 룰북을 라운드마다 펼치면 모델이 나눠 쓰는 주의가 안 걸린 룰까지 흩어집니다. `ship`이 이 파이프라인을 라운드로 돌리는 자리라 그 낭비가 라운드마다 되풀이됩니다.
|
|
643
|
+
|
|
644
|
+
#### 사전 스캔 (필수)
|
|
645
|
+
|
|
646
|
+
`review_consensus`가 돌려준 리포트를 윤문에 넘기기 전에 먼저 스캔합니다. 이 스캔의 출력이 아래 윤문 프롬프트의 입력이 됩니다.
|
|
647
|
+
|
|
648
|
+
**셸로 넘기지 않고 파일 쓰기 도구를 씁니다.** 리포트에는 한글과 백틱, 코드펜스가 섞입니다.
|
|
649
|
+
|
|
650
|
+
```bash
|
|
651
|
+
# --git-common-dir 는 워크트리 여럿이 같은 자리를 가리킵니다. 대상으로 칸을 나누고
|
|
652
|
+
# 그 아래 실행 단위로 한 겹 더 나눕니다 — 같은 대상을 두 세션이 동시에 리뷰할 수 있습니다
|
|
653
|
+
scanTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-review/<PR 식별자 또는 target>/$$"
|
|
654
|
+
mkdir -p "$scanTmp"
|
|
655
|
+
echo "$scanTmp"
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
윤문 전 리포트 전문을 `"$scanTmp/consensus.md"`에 쓰고 스캔합니다.
|
|
659
|
+
|
|
660
|
+
```bash
|
|
661
|
+
pnpm tsx bin/gestalt.ts humanize-scan --file "$scanTmp/consensus.md" --register report
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
출력 전문을 그대로 아래 윤문 프롬프트의 `사전 스캔` 자리에 싣습니다. 종료 코드로 걸러 내지 않습니다 — 0건일 때의 출력도 "무엇을 직접 확인해야 하는가"를 담고 있어서 윤문하는 쪽이 읽을 값이 있습니다.
|
|
665
|
+
|
|
666
|
+
**이 스캔은 판정하는 자리가 아닙니다.** 판정은 윤문이 끝난 뒤 아래 `리포트 어투 검사`가 합니다. 여기서 0건이 나와도 윤문은 그대로 돌립니다. 탐지기가 가리는 범위는 룰북 전체와 같지 않습니다. voice를 맞추는 일은 애초에 스캔이 재는 대상이 아닙니다.
|
|
667
|
+
|
|
668
|
+
#### 윤문 위임
|
|
633
669
|
|
|
634
670
|
```
|
|
635
671
|
Agent {
|
|
@@ -642,8 +678,16 @@ Agent {
|
|
|
642
678
|
읽기와 보고만 한다. 파일 수정, 커밋, 외부 전송은 하지 않는다.
|
|
643
679
|
|
|
644
680
|
ges_agent { action: \"get\", name: \"humanize-monolith\" } 로 시스템 프롬프트를 가져와
|
|
645
|
-
본문이 참조하는
|
|
646
|
-
|
|
681
|
+
본문이 참조하는 author-voice.md 를 읽고 아래 리포트를 윤문한다.
|
|
682
|
+
|
|
683
|
+
ai-tell-quick-rules.md 는 통째로 열지 않는다. 아래 사전 스캔이 이번 리포트에서
|
|
684
|
+
걸린 룰을 처방까지 붙여 주므로 그 목록이 이번에 걷어낼 전부다. 스캔이 0건이면
|
|
685
|
+
그 파일은 아예 열 이유가 없다.
|
|
686
|
+
다만 '탐지기가 못 가리는 S1' 줄의 ID 들은 처방이 안 딸려 온다. 그것들을 확인해야
|
|
687
|
+
하면 ai-tell-quick-rules.md 에서 해당 행만 찾아 읽고 파일 전체를 읽지 않는다.
|
|
688
|
+
|
|
689
|
+
사전 스캔:
|
|
690
|
+
<humanize-scan --register report 출력 전문>
|
|
647
691
|
|
|
648
692
|
보존 규칙:
|
|
649
693
|
- 이슈 내용(severity, file, line, message)은 수정하지 않는다. 설명 문장의 어투만 다듬는다.
|
|
@@ -668,13 +712,9 @@ Agent {
|
|
|
668
712
|
|
|
669
713
|
**셸로 넘기지 않고 파일 쓰기 도구를 씁니다.** 리포트에는 한글과 백틱, 코드펜스가 섞입니다.
|
|
670
714
|
|
|
671
|
-
|
|
672
|
-
scanTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-review/<PR 식별자 또는 target>/$$"
|
|
673
|
-
mkdir -p "$scanTmp"
|
|
674
|
-
echo "$scanTmp"
|
|
675
|
-
```
|
|
715
|
+
사전 스캔에서 만든 그 칸을 그대로 씁니다. `mkdir`을 다시 돌리지 않습니다 — `$$`는 Bash 호출마다 달라서 다시 만들면 앞의 `consensus.md`와 다른 자리가 됩니다.
|
|
676
716
|
|
|
677
|
-
윤문된 리포트 전문을 `
|
|
717
|
+
윤문된 리포트 전문을 사전 스캔이 출력한 경로 아래 `report.md`에 씁니다.
|
|
678
718
|
|
|
679
719
|
```bash
|
|
680
720
|
pnpm tsx bin/gestalt.ts humanize-scan --file "$scanTmp/report.md" --register report
|
|
@@ -744,7 +784,9 @@ pnpm tsx bin/gestalt.ts pr --json show <id> 2>/dev/null
|
|
|
744
784
|
|
|
745
785
|
#### 코멘트 본문 작성 (code-review-writer)
|
|
746
786
|
|
|
747
|
-
**서브에이전트에 위임합니다.** 이 에이전트는 본문 18.8KB에 `author-voice.md`
|
|
787
|
+
**서브에이전트에 위임합니다.** 이 에이전트는 본문 18.8KB에 `author-voice.md` 23KB를 딸고 오는, 이 스킬에서 제일 무거운 자리입니다.
|
|
788
|
+
|
|
789
|
+
**`author-voice.md`는 읽고 `ai-tell-quick-rules.md`는 첫 판에 안 엽니다.** 앞의 것은 코멘트를 쓰는 기준이라 없으면 쓰기 자체가 안 됩니다. 뒤의 것은 다 쓴 뒤에 무엇이 걸렸는지 보는 기준입니다. 그 답은 아래 `어투 검사`가 걸린 룰의 처방까지 붙여 돌려줍니다. 44KB를 미리 펼쳐 놓고 그중 서너 줄을 쓰는 대신, 걸린 자리의 처방만 재작성 판에 실어 보냅니다.
|
|
748
790
|
|
|
749
791
|
```
|
|
750
792
|
Agent {
|
|
@@ -760,9 +802,14 @@ Agent {
|
|
|
760
802
|
읽기와 보고만 한다. 파일 수정, 커밋, 외부 전송은 하지 않는다.
|
|
761
803
|
|
|
762
804
|
ges_agent { action: \"get\", name: \"code-review-writer\" } 로 시스템 프롬프트를 가져와
|
|
763
|
-
본문이 참조하는
|
|
805
|
+
본문이 참조하는 author-voice.md 를 읽고 그 관점으로 아래 이슈들의 코멘트 본문을 쓴다.
|
|
764
806
|
레포 자체 리뷰 컨벤션은 AGENT.md의 '레포 규칙 우선 탐색'에 따라 직접 확인한다.
|
|
765
807
|
|
|
808
|
+
ai-tell-quick-rules.md 는 이 판에서 통째로 열지 않는다. AGENT.md 의 Humanize 절이
|
|
809
|
+
인라인 코멘트에 걸리는 패턴을 이미 추려 담고 있다. 그걸로 안 걸러진 자리는 뒤따르는
|
|
810
|
+
어투 검사가 걸린 룰과 처방을 함께 돌려준다. 그때 그 처방만 받아 다시 쓴다.
|
|
811
|
+
지금 확인해야 할 ID 가 따로 있으면 그 행만 찾아 읽고 파일 전체를 읽지 않는다.
|
|
812
|
+
|
|
766
813
|
audience: <peer | junior — 0.5단계에서 잡고 1.05단계가 확정한 값>
|
|
767
814
|
AGENT.md의 '대상 눈높이 (audience)' 절을 그 값으로 적용한다. 그 절이 자기 완결이다 —
|
|
768
815
|
junior 기준을 찾겠다고 다른 파일을 열지 않는다. 특히 작업 디렉토리(= 리뷰 대상 레포)에서
|
|
@@ -784,7 +831,7 @@ Agent {
|
|
|
784
831
|
|
|
785
832
|
아래 규칙은 `code-review-writer` AGENT.md에 있어서 서브에이전트가 읽습니다. 여기 적어두는 건 사람이 읽을 계약이고 두 곳이 갈라지면 AGENT.md가 기준입니다. (바로 위 `path`·`line`·`side` 규칙은 반대로 **스킬 쪽에만** 있습니다 — 메인 세션이 하는 일이라 AGENT.md에 없습니다.)
|
|
786
833
|
|
|
787
|
-
- code-review-writer는 `author-voice.md`(제안형·온기·물결·이모지)
|
|
834
|
+
- code-review-writer는 `author-voice.md`(제안형·온기·물결·이모지)를 읽고 음차 교정 규칙은 AGENT.md의 Humanize 절에 추려 들고 있으므로 **리포트처럼 humanize-monolith로 통째로 윤문하지는 않습니다.** 대신 위의 `humanize-scan` 검사를 거칩니다 — 내장이 자가점검을 시키는 것이고 검사는 그게 실제로 됐는지 보는 것이라 층이 다릅니다.
|
|
788
835
|
- 에이전트 룰에 따라 `[출처]` 태깅, "…권장." 체언 종지는 쓰지 않습니다. 이건 Claude artifact이지 실제 리뷰어 어투가 아닙니다.
|
|
789
836
|
- **출처를 밝히는 태그는 형태를 가리지 않고 쓰지 않습니다.** `[게슈탈트 리뷰]`, `[Gestalt]`, `[AI 리뷰]`, 🤖 처럼 도구가 썼다는 표시를 붙이지 않습니다. 리뷰는 계정 주인이 남기는 것입니다. **내부 리뷰 에이전트 이름(QA, Architect, security-reviewer 등)도 본문에 드러내지 않습니다** — 관점이 여럿이어도 코멘트는 리뷰어 한 사람이 남긴 것처럼 씁니다.
|
|
790
837
|
- **강제성은 `r:`/`c:`/`a:` 접두어로 표기합니다** (레포에 자체 리뷰 컨벤션이 없을 때의 기본값). 코멘트 본문 맨 앞에 severity에 따라 붙입니다 — `r:` 꼭 반영(critical/high), `c:` 웬만하면 반영(warning), `a:` 사소한 의견(suggestion). 접두어는 강제성 라벨이고 본문 어투는 그대로 제안형입니다. **접두어 앞에는 아무것도 오지 않습니다** — 출처 태그나 굵은 제목 줄이 접두어를 밀어내면 리뷰이가 강제성을 한눈에 못 봅니다. (리뷰 이벤트 판정은 접두어가 아니라 `severity`로 하므로 그쪽은 영향받지 않습니다.)
|
|
@@ -818,24 +865,31 @@ echo "$scanTmp"
|
|
|
818
865
|
found=$(find "$scanTmp" -maxdepth 1 -name '*.md' | wc -l | tr -d ' ')
|
|
819
866
|
echo "파일 $found 개"
|
|
820
867
|
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
868
|
+
# 파일마다 프로세스를 새로 띄우지 않고 한 번의 호출에 전부 실어 보냅니다.
|
|
869
|
+
# humanize-scan 은 넘겨받은 파일 각각을 읽고 스캔을 따로 돌리므로 결과는 파일별로 갈립니다.
|
|
870
|
+
find "$scanTmp" -maxdepth 1 -name '*.md' | sort | sed 's/^/--file /' \
|
|
871
|
+
| xargs pnpm tsx bin/gestalt.ts humanize-scan --register chat
|
|
825
872
|
```
|
|
826
873
|
|
|
827
874
|
`found` 가 코멘트 수와 다르면 **검사 실패입니다.** 그 자리에서 멈추고 무엇이 어긋났는지 알립니다. 파일 쓰기가 어긋났는데 조용히 넘어가면 이 검사가 막으려던 상황이 그대로 재현됩니다.
|
|
828
875
|
|
|
829
|
-
|
|
876
|
+
이 호출이 답하는 질문은 두 층입니다.
|
|
877
|
+
|
|
878
|
+
- **프로세스 종료 코드**는 파일 전체를 합친 값입니다 — 하나라도 0이면 0, 아니면 하나라도 12면 12, 아니면 하나라도 11이면 11, 나머지는 10입니다. "게시를 미뤄야 하는가"는 이 값 하나로 답이 납니다.
|
|
879
|
+
- **어느 코멘트를 다시 써야 하는가**는 출력에 파일마다 찍히는 `== <경로> EXIT=<코드>` 줄로 답이 납니다. 파일별로 스캔을 따로 돌린 결과라 이 코드는 코멘트 단위 그대로입니다.
|
|
830
880
|
|
|
831
|
-
|
|
881
|
+
각 줄의 EXIT 값이 뜻하는 바는 다음과 같습니다.
|
|
882
|
+
|
|
883
|
+
- **0** — 걸렸습니다. 스캔 결과(걸린 룰, 사례, 처방)를 **그대로 `code-review-writer`에 돌려주고 그 코멘트만 다시 쓰게 합니다.** 안 걸린 코멘트는 건드리지 않습니다. 걸린 룰의 처방이 그 출력에 이미 들어 있으니 재작성 판에서도 `ai-tell-quick-rules.md`를 통째로 열 이유가 없습니다.
|
|
832
884
|
- **10** — 걸린 게 없습니다.
|
|
833
885
|
- **11** — 어투는 깨끗하고 맞춤법만 걸렸습니다. 그것만 고칩니다.
|
|
834
886
|
- **12** — **검사할 산문이 없습니다.** 코멘트가 인용줄뿐이라 검사가 안 된 것이지 통과가 아닙니다. 자기 문장을 인용 밖에 두고 다시 쓰게 합니다.
|
|
835
887
|
- 재작성은 **한 번만** 돕니다. 두 번째도 걸리면 무엇이 남았는지 사용자에게 알리고 게시할지 묻습니다.
|
|
836
|
-
-
|
|
888
|
+
- 프로세스 종료 코드가 10이나 11이면 게시합니다. 게시가 끝나면 `rm -rf "$scanTmp"`로 그 실행 칸만 치웁니다 — 상위 `gestalt-review`나 PR 칸을 통째로 지우면 다른 세션이 쓰는 중인 파일까지 날아갑니다.
|
|
889
|
+
|
|
890
|
+
**코멘트 여러 개를 파일 하나에 모아 담으면 이 검사가 무력화됩니다.** 인용 판정이 그 파일 전체를 한 덩어리로 보기 때문에 코멘트 하나를 통째로 인용으로 감싸도 같은 파일 안 다른 코멘트의 산문에 묻혀 안 걸립니다. 파일 하나에 코멘트 하나가 이 검사가 서는 조건입니다. 이 조건은 지금도 바뀌지 않았습니다.
|
|
837
891
|
|
|
838
|
-
|
|
892
|
+
파일 여러 개를 한 프로세스 호출에 실어 보내는 것은 다른 이야기입니다. `humanize-scan`은 넘겨받은 파일마다 읽기와 스캔을 독립적으로 돌려 인용 판정이 파일 경계를 넘지 않게 막습니다. 그래서 위 호출처럼 파일을 한 번에 묶어 넘겨도 코멘트별 판정은 그대로 섭니다.
|
|
839
893
|
|
|
840
894
|
표 셀 검사는 끌 수 없습니다. 룰 문서인지는 `humanize-scan` 이 경로로 스스로 판정하고 그걸 바꾸는 옵션을 안 받습니다 — 검사를 끄는 스위치가 밖에 있으면 리뷰 대상 텍스트가 그걸 붙이라고 시키는 자리가 열립니다.
|
|
841
895
|
|
|
@@ -944,7 +998,7 @@ ges_execute {
|
|
|
944
998
|
|
|
945
999
|
`prContext`가 `"(없음)"`이면 PR 본문 줄만 뺍니다. 리뷰 의도와 PR 본문이 어긋났으면 그 줄 아래에 무엇이 어긋났는지 한 줄 더 적습니다 (1.15단계).
|
|
946
1000
|
|
|
947
|
-
|
|
1001
|
+
**실행은 병렬이고 표시만 순서를 지킵니다.** 1.5단계 호출은 3단계 파도에 실어 리뷰어들, 3.5단계와 동시에 내보냈지만 그건 실행 순서일 뿐입니다. 사용자에게 보여줄 때는 기획 컨텍스트 문서(1.5단계)를 리뷰 리포트 앞에 먼저 표시한 뒤, 코드 리뷰 결과를 표시합니다.
|
|
948
1002
|
|
|
949
1003
|
```
|
|
950
1004
|
{1.5단계 기획 컨텍스트 마크다운}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type ScanReport } from '../../humanize/index.js';
|
|
1
2
|
export interface HumanizeScanOptions {
|
|
2
|
-
file: string;
|
|
3
|
+
file: string | string[];
|
|
3
4
|
register?: string;
|
|
4
5
|
json?: boolean;
|
|
5
6
|
}
|
|
@@ -28,5 +29,14 @@ export declare const SCAN_EXIT: {
|
|
|
28
29
|
*/
|
|
29
30
|
readonly allQuoted: 12;
|
|
30
31
|
};
|
|
32
|
+
/** 파일 한 건의 스캔 결과. 읽기 실패면 report 가 없고 error 에 메시지가 담긴다 */
|
|
33
|
+
export interface FileScanResult {
|
|
34
|
+
file: string;
|
|
35
|
+
report: ScanReport | null;
|
|
36
|
+
exitCode: number;
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
/** 파일 목록을 각각 독립적으로 스캔한다. task-1 의 배치 포맷터가 이 배열을 그대로 받는다 */
|
|
40
|
+
export declare function scanFiles(files: string[], register?: string): FileScanResult[];
|
|
31
41
|
export declare function humanizeScanCommand(options: HumanizeScanOptions): void;
|
|
32
42
|
//# sourceMappingURL=humanize-scan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"humanize-scan.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-scan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"humanize-scan.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS;IACpB,0BAA0B;;IAE1B,4CAA4C;;IAE5C,kDAAkD;;IAElD;;;;;OAKG;;CAEK,CAAC;AAEX,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmCD,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAE9E;AAeD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAiCtE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EXIT_CODE, formatScan, isRulebookPath, parseRegister, scan, } from '../../humanize/index.js';
|
|
1
|
+
import { EXIT_CODE, formatScan, formatScanBatch, isRulebookPath, parseRegister, scan, } from '../../humanize/index.js';
|
|
2
2
|
import { isReadFailure, readInput } from '../../humanize/read-input.js';
|
|
3
3
|
/**
|
|
4
4
|
* 스캔 결과의 종료 코드.
|
|
@@ -25,26 +25,83 @@ export const SCAN_EXIT = {
|
|
|
25
25
|
*/
|
|
26
26
|
allQuoted: 12,
|
|
27
27
|
};
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
/**
|
|
29
|
+
* 파일 하나를 독립적으로 읽고 스캔한다.
|
|
30
|
+
*
|
|
31
|
+
* 여러 파일을 이어붙이면 인용 판정(allQuoted)이 파일 경계를 넘어 섞인다 — 한 파일이
|
|
32
|
+
* 통째로 인용이고 다른 파일이 산문이어도 합치면 "볼 산문이 있다"로 읽힌다. 그래서
|
|
33
|
+
* 파일마다 readInput 과 scan 을 따로 돌린다.
|
|
34
|
+
*/
|
|
35
|
+
function scanOneFile(file, register) {
|
|
36
|
+
const input = readInput(file);
|
|
30
37
|
if (isReadFailure(input)) {
|
|
31
|
-
|
|
32
|
-
process.exit(EXIT_CODE.unknown);
|
|
38
|
+
return { file, report: null, exitCode: EXIT_CODE.unknown, error: input.message };
|
|
33
39
|
}
|
|
34
|
-
const text = input;
|
|
35
40
|
// 표 스캔을 끌지는 경로로 정한다. 플래그로 받으면 검사를 끄는 스위치가 밖에 생겨
|
|
36
41
|
// 리뷰 대상 텍스트가 그걸 붙이라고 시키는 자리가 열린다
|
|
37
|
-
const report = scan(
|
|
38
|
-
register: parseRegister(
|
|
39
|
-
skipTables: isRulebookPath(
|
|
42
|
+
const report = scan(input, {
|
|
43
|
+
register: parseRegister(register),
|
|
44
|
+
skipTables: isRulebookPath(file),
|
|
40
45
|
});
|
|
41
|
-
console.log(options.json ? JSON.stringify(report, null, 2) : formatScan(report));
|
|
42
46
|
// 맞춤법만 걸린 원고를 clean 으로 닫으면 "윤문하지 않는다"로 읽혀 그대로 나간다.
|
|
43
47
|
// 어투 0건과 맞춤법만 있는 상태는 다음 할 일이 달라서 코드를 가른다
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
const exitCode = report.worthHumanizing
|
|
49
|
+
? SCAN_EXIT.found
|
|
50
|
+
: report.allQuoted
|
|
51
|
+
? SCAN_EXIT.allQuoted
|
|
52
|
+
: report.spacing.length > 0
|
|
53
|
+
? SCAN_EXIT.spacingOnly
|
|
54
|
+
: SCAN_EXIT.clean;
|
|
55
|
+
return { file, report, exitCode };
|
|
56
|
+
}
|
|
57
|
+
/** 파일 목록을 각각 독립적으로 스캔한다. task-1 의 배치 포맷터가 이 배열을 그대로 받는다 */
|
|
58
|
+
export function scanFiles(files, register) {
|
|
59
|
+
return files.map((file) => scanOneFile(file, register));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 파일별 종료 코드를 하나로 합친다.
|
|
63
|
+
*
|
|
64
|
+
* 우선순위는 단일 파일 판정과 같은 순서다 — found > allQuoted > spacingOnly > clean.
|
|
65
|
+
* 여러 파일 중 하나라도 걸리면 배치 전체를 "윤문할 자리가 있다"로 본다.
|
|
66
|
+
*/
|
|
67
|
+
function aggregateExitCode(codes) {
|
|
68
|
+
if (codes.includes(SCAN_EXIT.found))
|
|
69
|
+
return SCAN_EXIT.found;
|
|
70
|
+
if (codes.includes(SCAN_EXIT.allQuoted))
|
|
71
|
+
return SCAN_EXIT.allQuoted;
|
|
72
|
+
if (codes.includes(SCAN_EXIT.spacingOnly))
|
|
73
|
+
return SCAN_EXIT.spacingOnly;
|
|
74
|
+
return SCAN_EXIT.clean;
|
|
75
|
+
}
|
|
76
|
+
export function humanizeScanCommand(options) {
|
|
77
|
+
const files = Array.isArray(options.file) ? options.file : [options.file];
|
|
78
|
+
// 단일 파일은 오늘의 출력과 종료 코드가 바이트 단위로 같아야 한다 — 배치 경로를
|
|
79
|
+
// 태우면 미묘하게 갈릴 여지가 생겨 이 분기를 그대로 남긴다
|
|
80
|
+
if (files.length === 1) {
|
|
81
|
+
const result = scanOneFile(files[0], options.register);
|
|
82
|
+
if (result.error) {
|
|
83
|
+
console.error(result.error);
|
|
84
|
+
process.exit(EXIT_CODE.unknown);
|
|
85
|
+
}
|
|
86
|
+
console.log(options.json ? JSON.stringify(result.report, null, 2) : formatScan(result.report));
|
|
87
|
+
process.exit(result.exitCode);
|
|
88
|
+
}
|
|
89
|
+
const results = scanFiles(files, options.register);
|
|
90
|
+
const exitCode = aggregateExitCode(results.map((result) => result.exitCode));
|
|
91
|
+
if (options.json) {
|
|
92
|
+
const payload = {
|
|
93
|
+
files: results.map(({ file, exitCode: fileExitCode, report }) => ({
|
|
94
|
+
file,
|
|
95
|
+
exitCode: fileExitCode,
|
|
96
|
+
report,
|
|
97
|
+
})),
|
|
98
|
+
exitCode,
|
|
99
|
+
};
|
|
100
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(formatScanBatch(results));
|
|
104
|
+
}
|
|
105
|
+
process.exit(exitCode);
|
|
49
106
|
}
|
|
50
107
|
//# sourceMappingURL=humanize-scan.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"humanize-scan.js","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-scan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,cAAc,EACd,aAAa,EACb,IAAI,
|
|
1
|
+
{"version":3,"file":"humanize-scan.js","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC,wBAAgB,SAAS,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC,wBAAgB,SAAS,IAAI,OAAO,CAiTnC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -191,11 +191,15 @@ export function createCli() {
|
|
|
191
191
|
.action((target, o) => reviewLoopParseCommand({ target, ...o }));
|
|
192
192
|
program
|
|
193
193
|
.command('humanize-scan')
|
|
194
|
-
.description('원문에서 실제로 걸린 S1 룰만 처방과 함께 추린다 (exit 0 걸림 / 10
|
|
195
|
-
.
|
|
194
|
+
.description('원문에서 실제로 걸린 S1 룰만 처방과 함께 추린다 (exit 0 걸림 / 10 없음, 파일 여럿이면 우선순위로 하나로 합친다)')
|
|
195
|
+
.option('--file <path>', '스캔할 텍스트 파일 (여러 번 지정 가능)', (value, previous) => [...previous, value], [])
|
|
196
196
|
.option('--register <doc|chat|report>', '어느 말투 기준으로 볼지 (기본 doc)', 'doc')
|
|
197
197
|
.option('--json', '스캔 결과를 JSON으로')
|
|
198
198
|
.action((options) => {
|
|
199
|
+
if (options.file.length === 0) {
|
|
200
|
+
console.error("required option '--file <path>' not specified");
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}
|
|
199
203
|
humanizeScanCommand(options);
|
|
200
204
|
});
|
|
201
205
|
program
|
|
@@ -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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"}
|
|
@@ -2,5 +2,5 @@ export { parseRuleBook, parseRegister, ruleLabel, s1Ids, type RuleScanOptions, c
|
|
|
2
2
|
export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, reportRegisterStats, spacingIssues, scanProse, DETECTABLE_RULE_IDS, type Detection, type ReportRegisterStats, type SpacingIssue, type StructureStats, } from './detectors.js';
|
|
3
3
|
export { changeRate, type ChangeRateOptions } from './change-rate.js';
|
|
4
4
|
export { runCheck, prescan, decide, formatReport, EXIT_CODE, THRESHOLD, MAX_ATTEMPTS, type CheckReport, type PrescanReport, type Decision, type NextAction, type RunCheckOptions, type RunCheckWithPrescan, type AxisResult, type Verdict, } from './check.js';
|
|
5
|
-
export { scan, formatScan, isRulebookPath, type ScanReport, type ScanHit, type ScanOptions, } from './scan.js';
|
|
5
|
+
export { scan, formatScan, formatScanBatch, isRulebookPath, type ScanReport, type ScanHit, type ScanOptions, type ScanBatchEntry, } from './scan.js';
|
|
6
6
|
//# 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,aAAa,EACb,SAAS,EACT,KAAK,EACL,KAAK,eAAe,EACpB,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,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,OAAO,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,IAAI,EACJ,UAAU,EACV,cAAc,EACd,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,aAAa,EACb,SAAS,EACT,KAAK,EACL,KAAK,eAAe,EACpB,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,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,OAAO,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,IAAI,EACJ,UAAU,EACV,eAAe,EACf,cAAc,EACd,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC"}
|
|
@@ -2,5 +2,5 @@ export { parseRuleBook, parseRegister, ruleLabel, s1Ids, citedRuleIds, expandIdR
|
|
|
2
2
|
export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, reportRegisterStats, spacingIssues, scanProse, DETECTABLE_RULE_IDS, } from './detectors.js';
|
|
3
3
|
export { changeRate } from './change-rate.js';
|
|
4
4
|
export { runCheck, prescan, decide, formatReport, EXIT_CODE, THRESHOLD, MAX_ATTEMPTS, } from './check.js';
|
|
5
|
-
export { scan, formatScan, isRulebookPath, } from './scan.js';
|
|
5
|
+
export { scan, formatScan, formatScanBatch, isRulebookPath, } from './scan.js';
|
|
6
6
|
//# 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,aAAa,EACb,SAAS,EACT,KAAK,EAEL,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,aAAa,EACb,SAAS,EACT,mBAAmB,GAKpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,GASb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,IAAI,EACJ,UAAU,EACV,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,aAAa,EACb,SAAS,EACT,KAAK,EAEL,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,aAAa,EACb,SAAS,EACT,mBAAmB,GAKpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,GASb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,IAAI,EACJ,UAAU,EACV,eAAe,EACf,cAAc,GAKf,MAAM,WAAW,CAAC"}
|
|
@@ -40,5 +40,24 @@ export type ScanOptions = RuleScanOptions;
|
|
|
40
40
|
*/
|
|
41
41
|
export declare function isRulebookPath(file: string): boolean;
|
|
42
42
|
export declare function scan(text: string, options?: RuleScanOptions): ScanReport;
|
|
43
|
+
/**
|
|
44
|
+
* 배치 스캔 결과 한 건.
|
|
45
|
+
*
|
|
46
|
+
* cli 쪽 FileScanResult 와 필드가 같다. humanize 레이어가 cli 를 참조하면 방향이
|
|
47
|
+
* 거꾸로 되므로 형태만 여기 따로 두고 구조적 타이핑으로 맞춘다.
|
|
48
|
+
*/
|
|
49
|
+
export interface ScanBatchEntry {
|
|
50
|
+
file: string;
|
|
51
|
+
report: ScanReport | null;
|
|
52
|
+
exitCode: number;
|
|
53
|
+
error?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 여러 파일의 스캔 결과를 파일별 헤더와 함께 이어 붙인다.
|
|
57
|
+
*
|
|
58
|
+
* 리뷰 스킬이 셸에서 `basename "$f" .md` 와 `EXIT=$?` 로 만들던 걸 여기서 대신
|
|
59
|
+
* 낸다. 헤더는 고정 접두사, 경로, `EXIT=<n>` 순으로 두어 파싱 가능하게 한다.
|
|
60
|
+
*/
|
|
61
|
+
export declare function formatScanBatch(entries: ScanBatchEntry[]): string;
|
|
43
62
|
export declare function formatScan(report: ScanReport): string;
|
|
44
63
|
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/humanize/scan.ts"],"names":[],"mappings":"AAWA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAmC,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElG,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,mCAAmC;IACnC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,yBAAyB;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,uEAAuE;AACvE,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,UAAU,CAkC5E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA6DrD"}
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/humanize/scan.ts"],"names":[],"mappings":"AAWA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAmC,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElG,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,mCAAmC;IACnC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,yBAAyB;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,uEAAuE;AACvE,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,UAAU,CAkC5E;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAQjE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA6DrD"}
|
|
@@ -54,6 +54,21 @@ export function scan(text, options = {}) {
|
|
|
54
54
|
allQuoted,
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* 여러 파일의 스캔 결과를 파일별 헤더와 함께 이어 붙인다.
|
|
59
|
+
*
|
|
60
|
+
* 리뷰 스킬이 셸에서 `basename "$f" .md` 와 `EXIT=$?` 로 만들던 걸 여기서 대신
|
|
61
|
+
* 낸다. 헤더는 고정 접두사, 경로, `EXIT=<n>` 순으로 두어 파싱 가능하게 한다.
|
|
62
|
+
*/
|
|
63
|
+
export function formatScanBatch(entries) {
|
|
64
|
+
return entries
|
|
65
|
+
.map((entry) => {
|
|
66
|
+
const header = `== ${entry.file} EXIT=${entry.exitCode}`;
|
|
67
|
+
const body = entry.report ? formatScan(entry.report) : (entry.error ?? '읽기 실패');
|
|
68
|
+
return `${header}\n${body}`;
|
|
69
|
+
})
|
|
70
|
+
.join('\n\n');
|
|
71
|
+
}
|
|
57
72
|
export function formatScan(report) {
|
|
58
73
|
const spacing = report.spacing.flatMap((issue) => [
|
|
59
74
|
`- ${issue.label} ${issue.count}건`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/humanize/scan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/humanize/scan.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gestalt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.81.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"
|
package/plugin/.mcp.json
CHANGED
package/plugin/mcp.json
CHANGED
|
@@ -92,6 +92,12 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
|
|
|
92
92
|
[`../_shared/references/ai-tell-quick-rules.md`](../_shared/references/ai-tell-quick-rules.md)이며
|
|
93
93
|
인라인 코멘트엔 특히 다음을 적용한다.
|
|
94
94
|
|
|
95
|
+
**아래 표가 인라인 코멘트에 걸리는 자리를 추려 담고 있으니 첫 판에 그 파일을 통째로 열지
|
|
96
|
+
않는다.** 부르는 쪽이 어투 검사 결과를 프롬프트에 실어 재작성을 시켰으면 그때도 마찬가지다 —
|
|
97
|
+
걸린 룰의 처방이 그 출력에 이미 들어 있어서 44KB를 다시 읽어도 같은 내용이다. 확인해야 할
|
|
98
|
+
ID가 따로 있으면 그 행만 찾아 읽는다. `author-voice.md`는 다르다 — 코멘트를 쓰는 기준이라
|
|
99
|
+
초안을 쓰기 전에 읽는다.
|
|
100
|
+
|
|
95
101
|
**제거할 패턴 (S1 — 반드시 교정)**
|
|
96
102
|
|
|
97
103
|
| 패턴 | 예시 | 교정 |
|
|
@@ -84,6 +84,8 @@ gestalt humanize-scan --file <원문> --register <doc|chat|report>
|
|
|
84
84
|
종료 코드로도 답한다. 걸린 게 있으면 0, 어투는 깨끗한데 맞춤법만 걸리면 11, 탐지기가 가리는 범위에서 0건이면 10이다. 11이면 어투는 그대로 두고 맞춤법 절만 고쳐서 낸다.
|
|
85
85
|
파일이 없으면 3이다. 셸에서 분기할 때 stdout 을 파싱하지 않아도 된다.
|
|
86
86
|
|
|
87
|
+
`--file`은 여러 번 줄 수 있다. 초안이 여러 개면 한 번에 넘겨 한 프로세스에서 각각 독립적으로 스캔한다.
|
|
88
|
+
|
|
87
89
|
스캔이 내놓는 것만 본다.
|
|
88
90
|
|
|
89
91
|
- **걸린 룰**: ID, 건수, 실제 표현, 처방이 함께 나온다. 이번 윤문의 작업 목록이다
|
|
@@ -100,6 +102,12 @@ gestalt humanize-scan --file <원문> --register <doc|chat|report>
|
|
|
100
102
|
인라인 텍스트만 받아 스캔을 못 돌리는 경우에만 룰북을 직접 읽는다. 이때도 말투에 해당하는
|
|
101
103
|
S1부터 본다. 전 카테고리를 훑지 않는다.
|
|
102
104
|
|
|
105
|
+
**부르는 쪽이 스캔 결과를 프롬프트에 실어 보냈으면 `ai-tell-quick-rules.md`를 다시 열지
|
|
106
|
+
않는다.** 걸린 룰의 처방이 그 출력에 이미 들어 있어서 같은 내용을 44KB 더 읽는 셈이 된다.
|
|
107
|
+
`author-voice.md`는 다르다 — 보존 기준은 스캔이 내놓는 값이 아니라 필요하면 그대로 읽는다.
|
|
108
|
+
다만 '탐지기가 못 가리는 S1' 줄은 ID만 오고 처방이 안 딸려 온다. 그 ID를 확인해야 하면
|
|
109
|
+
`ai-tell-quick-rules.md`에서 해당 행만 찾아 읽고 파일 전체를 읽지 않는다.
|
|
110
|
+
|
|
103
111
|
### 1단계 — 탐지
|
|
104
112
|
|
|
105
113
|
스캔 결과에 탐지기가 못 가리는 S1을 더해 이번 작업 목록을 확정한다.
|
|
@@ -364,6 +364,8 @@ Agent {
|
|
|
364
364
|
|
|
365
365
|
1단계에서 수집한 변경 파일을 바탕으로 변경의 기획적 의도와 동작 변화를 분석한다.
|
|
366
366
|
|
|
367
|
+
**이 호출은 따로 내보내지 않고 3단계의 병렬 메시지에 함께 담아 띄운다.** 아래 프롬프트가 받는 입력은 diff와 PR 제목/본문뿐이고 리뷰어의 판정(`mergedIssues` 등)은 받지 않으므로 리뷰어를 먼저 기다릴 이유가 없다. 실행 순서만 앞당겨질 뿐 **표시 순서는 그대로다** — 어투 검사는 파도가 다 돌아온 뒤에 하고 문서도 리뷰 결과보다 먼저 사용자에게 보여준다(결과 표시 절 참고).
|
|
368
|
+
|
|
367
369
|
**서브에이전트에 위임한다.** 메인 세션에서 `ges_agent get`을 하지 않는다.
|
|
368
370
|
|
|
369
371
|
```
|
|
@@ -400,7 +402,7 @@ Agent {
|
|
|
400
402
|
|
|
401
403
|
#### 기획 컨텍스트 어투 검사 (필수)
|
|
402
404
|
|
|
403
|
-
사용자에게 표시하기 전에 스캔한다. `change-context-writer`가 자체 humanize를 거쳐도 별도 검증 없이 그대로 나가면, 리포트(4.5단계)보다 먼저 보이는 이 문서가 유일하게 어투 검사를 안 거친 자리로 남는다.
|
|
405
|
+
사용자에게 표시하기 전에 스캔한다. `change-context-writer`가 자체 humanize를 거쳐도 별도 검증 없이 그대로 나가면, 리포트(4.5단계)보다 먼저 보이는 이 문서가 유일하게 어투 검사를 안 거친 자리로 남는다. **이 검사는 3단계 파도가 전부 돌아온 뒤에 한다** — 병렬로 띄운 호출이라고 검사까지 다른 결과와 뒤섞어 하지 않는다.
|
|
404
406
|
|
|
405
407
|
```bash
|
|
406
408
|
scanTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-review/<PR 식별자 또는 target>/$$"
|
|
@@ -451,7 +453,9 @@ ges_execute {
|
|
|
451
453
|
|
|
452
454
|
### 3단계: 에이전트별 리뷰 제출 (review_submit × N)
|
|
453
455
|
|
|
454
|
-
**에이전트마다 서브에이전트를 하나씩 띄웁니다.** 리뷰어끼리 서로 볼 이유가 없으므로 **한 메시지에 전부 담아 병렬로 돌립니다.** 메인 세션에서 `ges_agent get`을 하지 않습니다.
|
|
456
|
+
**에이전트마다 서브에이전트를 하나씩 띄웁니다.** 리뷰어끼리 서로 볼 이유가 없으므로 **한 메시지에 전부 담아 병렬로 돌립니다.** 이 메시지에는 리뷰어들뿐 아니라 **1.5단계 change-context-writer 호출과 3.5단계 continuity-judge 호출도 함께 담습니다.** 셋 다 입력으로 받는 건 diff와 PR 제목/본문, 스펙 제약 정도이고 서로의 산출물(리뷰어의 `issues`, continuity-judge의 `continuityVerdict` 등)은 아무도 받지 않으므로 순서를 나눌 이유가 없습니다. 셋을 한 파도로 띄우고 각자 결과를 받습니다. 메인 세션에서 `ges_agent get`을 하지 않습니다.
|
|
457
|
+
|
|
458
|
+
코드 그래프의 영향 범위(`diff_radius`, `co_change`)를 이 프롬프트에 얹는 안은 한 번 재보고 접었습니다 — 리뷰어가 그 목록을 열지 않았고 토큰만 늘었습니다. 근거는 `docs/experiments/review-impact-radius.md`에 있습니다.
|
|
455
459
|
|
|
456
460
|
```
|
|
457
461
|
Agent {
|
|
@@ -528,9 +532,13 @@ ges_execute {
|
|
|
528
532
|
|
|
529
533
|
### 3.5단계: 정합 심급 판단 (continuity-judge)
|
|
530
534
|
|
|
531
|
-
`review_consensus`를 호출하기 **전에** 정합 심급을 먼저 판단합니다.
|
|
535
|
+
`review_consensus`를 호출하기 **전에** 정합 심급을 먼저 판단합니다. 이 문장이 가리키는 건 **결과를 넘기는 순서**이지 **호출을 내보내는 순서**가 아닙니다 — 아래 프롬프트는 3단계의 병렬 메시지에 함께 담아 리뷰어들과 같은 파도로 띄웁니다. `continuity-judge`는 diff와 목표, PR 제목/본문, 스펙 제약만 보고 리뷰어의 `issues`를 보지 않으므로 리뷰어 결과를 기다릴 이유가 없습니다. 순서가 남는 자리는 **소비 시점**뿐입니다 — `continuityVerdict`는 파도가 다 돌아온 뒤 3단계 리뷰 결과와 나란히 4단계 `review_consensus`로 넘깁니다.
|
|
536
|
+
|
|
537
|
+
결함 심급(3단계 리뷰 에이전트)이 "부분에 결함이 있나"를 봤다면, 정합 심급은 "부분의 합이 목표를 이루나"를 봅니다 — 국소 결함으로는 안 잡히는 **목표 이탈(drift)과 전체 일관성**입니다.
|
|
532
538
|
|
|
533
|
-
|
|
539
|
+
**`continuity-judge`는 3단계 리뷰어의 `issues`를 입력으로 받지 않습니다** — 보는 자료는 diff 전체와 목표, PR 제목과 본문, 스펙 제약뿐입니다. 그래서 리뷰어 판정을 기다리지 않고 같은 파도에 태울 수 있습니다. 이 프롬프트에 `issues`나 `review_submit` 산출물을 끼워 넣는 변경은 이 전제와 정면으로 부딪힙니다.
|
|
540
|
+
|
|
541
|
+
**서브에이전트에 위임합니다.** `continuity-judge`는 tier가 `frontier`라 모델도 그에 맞춰 넘깁니다(`agent-model.md`). 이 호출도 3단계, 1.5단계와 같은 메시지에 담습니다.
|
|
534
542
|
|
|
535
543
|
```
|
|
536
544
|
Agent {
|
|
@@ -629,7 +637,35 @@ ges_execute {
|
|
|
629
637
|
|
|
630
638
|
`review_consensus`가 반환한 마크다운 리포트를 `humanize-monolith` 에이전트로 전달해 AI 말투, 번역투를 제거합니다.
|
|
631
639
|
|
|
632
|
-
**서브에이전트에 위임합니다.** humanize-monolith는 룰북 두 개(`author-voice.md`
|
|
640
|
+
**서브에이전트에 위임합니다.** humanize-monolith는 룰북 두 개(`author-voice.md` 23KB, `ai-tell-quick-rules.md` 44KB)를 딸고 오므로, 메인 세션에서 가져오면 이 단계 하나로 67KB가 실립니다.
|
|
641
|
+
|
|
642
|
+
**그 67KB를 통째로 딸려 보내지도 않습니다.** 윤문에 넘기기 전에 먼저 스캔을 돌려 이번 리포트에서 실제로 걸린 룰만 처방과 함께 프롬프트에 싣습니다. 걸린 게 서너 개인데 예순 개가 넘는 룰북을 라운드마다 펼치면 모델이 나눠 쓰는 주의가 안 걸린 룰까지 흩어집니다. `ship`이 이 파이프라인을 라운드로 돌리는 자리라 그 낭비가 라운드마다 되풀이됩니다.
|
|
643
|
+
|
|
644
|
+
#### 사전 스캔 (필수)
|
|
645
|
+
|
|
646
|
+
`review_consensus`가 돌려준 리포트를 윤문에 넘기기 전에 먼저 스캔합니다. 이 스캔의 출력이 아래 윤문 프롬프트의 입력이 됩니다.
|
|
647
|
+
|
|
648
|
+
**셸로 넘기지 않고 파일 쓰기 도구를 씁니다.** 리포트에는 한글과 백틱, 코드펜스가 섞입니다.
|
|
649
|
+
|
|
650
|
+
```bash
|
|
651
|
+
# --git-common-dir 는 워크트리 여럿이 같은 자리를 가리킵니다. 대상으로 칸을 나누고
|
|
652
|
+
# 그 아래 실행 단위로 한 겹 더 나눕니다 — 같은 대상을 두 세션이 동시에 리뷰할 수 있습니다
|
|
653
|
+
scanTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-review/<PR 식별자 또는 target>/$$"
|
|
654
|
+
mkdir -p "$scanTmp"
|
|
655
|
+
echo "$scanTmp"
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
윤문 전 리포트 전문을 `"$scanTmp/consensus.md"`에 쓰고 스캔합니다.
|
|
659
|
+
|
|
660
|
+
```bash
|
|
661
|
+
pnpm tsx bin/gestalt.ts humanize-scan --file "$scanTmp/consensus.md" --register report
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
출력 전문을 그대로 아래 윤문 프롬프트의 `사전 스캔` 자리에 싣습니다. 종료 코드로 걸러 내지 않습니다 — 0건일 때의 출력도 "무엇을 직접 확인해야 하는가"를 담고 있어서 윤문하는 쪽이 읽을 값이 있습니다.
|
|
665
|
+
|
|
666
|
+
**이 스캔은 판정하는 자리가 아닙니다.** 판정은 윤문이 끝난 뒤 아래 `리포트 어투 검사`가 합니다. 여기서 0건이 나와도 윤문은 그대로 돌립니다. 탐지기가 가리는 범위는 룰북 전체와 같지 않습니다. voice를 맞추는 일은 애초에 스캔이 재는 대상이 아닙니다.
|
|
667
|
+
|
|
668
|
+
#### 윤문 위임
|
|
633
669
|
|
|
634
670
|
```
|
|
635
671
|
Agent {
|
|
@@ -642,8 +678,16 @@ Agent {
|
|
|
642
678
|
읽기와 보고만 한다. 파일 수정, 커밋, 외부 전송은 하지 않는다.
|
|
643
679
|
|
|
644
680
|
ges_agent { action: \"get\", name: \"humanize-monolith\" } 로 시스템 프롬프트를 가져와
|
|
645
|
-
본문이 참조하는
|
|
646
|
-
|
|
681
|
+
본문이 참조하는 author-voice.md 를 읽고 아래 리포트를 윤문한다.
|
|
682
|
+
|
|
683
|
+
ai-tell-quick-rules.md 는 통째로 열지 않는다. 아래 사전 스캔이 이번 리포트에서
|
|
684
|
+
걸린 룰을 처방까지 붙여 주므로 그 목록이 이번에 걷어낼 전부다. 스캔이 0건이면
|
|
685
|
+
그 파일은 아예 열 이유가 없다.
|
|
686
|
+
다만 '탐지기가 못 가리는 S1' 줄의 ID 들은 처방이 안 딸려 온다. 그것들을 확인해야
|
|
687
|
+
하면 ai-tell-quick-rules.md 에서 해당 행만 찾아 읽고 파일 전체를 읽지 않는다.
|
|
688
|
+
|
|
689
|
+
사전 스캔:
|
|
690
|
+
<humanize-scan --register report 출력 전문>
|
|
647
691
|
|
|
648
692
|
보존 규칙:
|
|
649
693
|
- 이슈 내용(severity, file, line, message)은 수정하지 않는다. 설명 문장의 어투만 다듬는다.
|
|
@@ -668,13 +712,9 @@ Agent {
|
|
|
668
712
|
|
|
669
713
|
**셸로 넘기지 않고 파일 쓰기 도구를 씁니다.** 리포트에는 한글과 백틱, 코드펜스가 섞입니다.
|
|
670
714
|
|
|
671
|
-
|
|
672
|
-
scanTmp="$(cd "$(git rev-parse --git-common-dir)" && pwd)/gestalt-review/<PR 식별자 또는 target>/$$"
|
|
673
|
-
mkdir -p "$scanTmp"
|
|
674
|
-
echo "$scanTmp"
|
|
675
|
-
```
|
|
715
|
+
사전 스캔에서 만든 그 칸을 그대로 씁니다. `mkdir`을 다시 돌리지 않습니다 — `$$`는 Bash 호출마다 달라서 다시 만들면 앞의 `consensus.md`와 다른 자리가 됩니다.
|
|
676
716
|
|
|
677
|
-
윤문된 리포트 전문을 `
|
|
717
|
+
윤문된 리포트 전문을 사전 스캔이 출력한 경로 아래 `report.md`에 씁니다.
|
|
678
718
|
|
|
679
719
|
```bash
|
|
680
720
|
pnpm tsx bin/gestalt.ts humanize-scan --file "$scanTmp/report.md" --register report
|
|
@@ -744,7 +784,9 @@ pnpm tsx bin/gestalt.ts pr --json show <id> 2>/dev/null
|
|
|
744
784
|
|
|
745
785
|
#### 코멘트 본문 작성 (code-review-writer)
|
|
746
786
|
|
|
747
|
-
**서브에이전트에 위임합니다.** 이 에이전트는 본문 18.8KB에 `author-voice.md`
|
|
787
|
+
**서브에이전트에 위임합니다.** 이 에이전트는 본문 18.8KB에 `author-voice.md` 23KB를 딸고 오는, 이 스킬에서 제일 무거운 자리입니다.
|
|
788
|
+
|
|
789
|
+
**`author-voice.md`는 읽고 `ai-tell-quick-rules.md`는 첫 판에 안 엽니다.** 앞의 것은 코멘트를 쓰는 기준이라 없으면 쓰기 자체가 안 됩니다. 뒤의 것은 다 쓴 뒤에 무엇이 걸렸는지 보는 기준입니다. 그 답은 아래 `어투 검사`가 걸린 룰의 처방까지 붙여 돌려줍니다. 44KB를 미리 펼쳐 놓고 그중 서너 줄을 쓰는 대신, 걸린 자리의 처방만 재작성 판에 실어 보냅니다.
|
|
748
790
|
|
|
749
791
|
```
|
|
750
792
|
Agent {
|
|
@@ -760,9 +802,14 @@ Agent {
|
|
|
760
802
|
읽기와 보고만 한다. 파일 수정, 커밋, 외부 전송은 하지 않는다.
|
|
761
803
|
|
|
762
804
|
ges_agent { action: \"get\", name: \"code-review-writer\" } 로 시스템 프롬프트를 가져와
|
|
763
|
-
본문이 참조하는
|
|
805
|
+
본문이 참조하는 author-voice.md 를 읽고 그 관점으로 아래 이슈들의 코멘트 본문을 쓴다.
|
|
764
806
|
레포 자체 리뷰 컨벤션은 AGENT.md의 '레포 규칙 우선 탐색'에 따라 직접 확인한다.
|
|
765
807
|
|
|
808
|
+
ai-tell-quick-rules.md 는 이 판에서 통째로 열지 않는다. AGENT.md 의 Humanize 절이
|
|
809
|
+
인라인 코멘트에 걸리는 패턴을 이미 추려 담고 있다. 그걸로 안 걸러진 자리는 뒤따르는
|
|
810
|
+
어투 검사가 걸린 룰과 처방을 함께 돌려준다. 그때 그 처방만 받아 다시 쓴다.
|
|
811
|
+
지금 확인해야 할 ID 가 따로 있으면 그 행만 찾아 읽고 파일 전체를 읽지 않는다.
|
|
812
|
+
|
|
766
813
|
audience: <peer | junior — 0.5단계에서 잡고 1.05단계가 확정한 값>
|
|
767
814
|
AGENT.md의 '대상 눈높이 (audience)' 절을 그 값으로 적용한다. 그 절이 자기 완결이다 —
|
|
768
815
|
junior 기준을 찾겠다고 다른 파일을 열지 않는다. 특히 작업 디렉토리(= 리뷰 대상 레포)에서
|
|
@@ -784,7 +831,7 @@ Agent {
|
|
|
784
831
|
|
|
785
832
|
아래 규칙은 `code-review-writer` AGENT.md에 있어서 서브에이전트가 읽습니다. 여기 적어두는 건 사람이 읽을 계약이고 두 곳이 갈라지면 AGENT.md가 기준입니다. (바로 위 `path`·`line`·`side` 규칙은 반대로 **스킬 쪽에만** 있습니다 — 메인 세션이 하는 일이라 AGENT.md에 없습니다.)
|
|
786
833
|
|
|
787
|
-
- code-review-writer는 `author-voice.md`(제안형·온기·물결·이모지)
|
|
834
|
+
- code-review-writer는 `author-voice.md`(제안형·온기·물결·이모지)를 읽고 음차 교정 규칙은 AGENT.md의 Humanize 절에 추려 들고 있으므로 **리포트처럼 humanize-monolith로 통째로 윤문하지는 않습니다.** 대신 위의 `humanize-scan` 검사를 거칩니다 — 내장이 자가점검을 시키는 것이고 검사는 그게 실제로 됐는지 보는 것이라 층이 다릅니다.
|
|
788
835
|
- 에이전트 룰에 따라 `[출처]` 태깅, "…권장." 체언 종지는 쓰지 않습니다. 이건 Claude artifact이지 실제 리뷰어 어투가 아닙니다.
|
|
789
836
|
- **출처를 밝히는 태그는 형태를 가리지 않고 쓰지 않습니다.** `[게슈탈트 리뷰]`, `[Gestalt]`, `[AI 리뷰]`, 🤖 처럼 도구가 썼다는 표시를 붙이지 않습니다. 리뷰는 계정 주인이 남기는 것입니다. **내부 리뷰 에이전트 이름(QA, Architect, security-reviewer 등)도 본문에 드러내지 않습니다** — 관점이 여럿이어도 코멘트는 리뷰어 한 사람이 남긴 것처럼 씁니다.
|
|
790
837
|
- **강제성은 `r:`/`c:`/`a:` 접두어로 표기합니다** (레포에 자체 리뷰 컨벤션이 없을 때의 기본값). 코멘트 본문 맨 앞에 severity에 따라 붙입니다 — `r:` 꼭 반영(critical/high), `c:` 웬만하면 반영(warning), `a:` 사소한 의견(suggestion). 접두어는 강제성 라벨이고 본문 어투는 그대로 제안형입니다. **접두어 앞에는 아무것도 오지 않습니다** — 출처 태그나 굵은 제목 줄이 접두어를 밀어내면 리뷰이가 강제성을 한눈에 못 봅니다. (리뷰 이벤트 판정은 접두어가 아니라 `severity`로 하므로 그쪽은 영향받지 않습니다.)
|
|
@@ -818,24 +865,31 @@ echo "$scanTmp"
|
|
|
818
865
|
found=$(find "$scanTmp" -maxdepth 1 -name '*.md' | wc -l | tr -d ' ')
|
|
819
866
|
echo "파일 $found 개"
|
|
820
867
|
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
868
|
+
# 파일마다 프로세스를 새로 띄우지 않고 한 번의 호출에 전부 실어 보냅니다.
|
|
869
|
+
# humanize-scan 은 넘겨받은 파일 각각을 읽고 스캔을 따로 돌리므로 결과는 파일별로 갈립니다.
|
|
870
|
+
find "$scanTmp" -maxdepth 1 -name '*.md' | sort | sed 's/^/--file /' \
|
|
871
|
+
| xargs pnpm tsx bin/gestalt.ts humanize-scan --register chat
|
|
825
872
|
```
|
|
826
873
|
|
|
827
874
|
`found` 가 코멘트 수와 다르면 **검사 실패입니다.** 그 자리에서 멈추고 무엇이 어긋났는지 알립니다. 파일 쓰기가 어긋났는데 조용히 넘어가면 이 검사가 막으려던 상황이 그대로 재현됩니다.
|
|
828
875
|
|
|
829
|
-
|
|
876
|
+
이 호출이 답하는 질문은 두 층입니다.
|
|
877
|
+
|
|
878
|
+
- **프로세스 종료 코드**는 파일 전체를 합친 값입니다 — 하나라도 0이면 0, 아니면 하나라도 12면 12, 아니면 하나라도 11이면 11, 나머지는 10입니다. "게시를 미뤄야 하는가"는 이 값 하나로 답이 납니다.
|
|
879
|
+
- **어느 코멘트를 다시 써야 하는가**는 출력에 파일마다 찍히는 `== <경로> EXIT=<코드>` 줄로 답이 납니다. 파일별로 스캔을 따로 돌린 결과라 이 코드는 코멘트 단위 그대로입니다.
|
|
830
880
|
|
|
831
|
-
|
|
881
|
+
각 줄의 EXIT 값이 뜻하는 바는 다음과 같습니다.
|
|
882
|
+
|
|
883
|
+
- **0** — 걸렸습니다. 스캔 결과(걸린 룰, 사례, 처방)를 **그대로 `code-review-writer`에 돌려주고 그 코멘트만 다시 쓰게 합니다.** 안 걸린 코멘트는 건드리지 않습니다. 걸린 룰의 처방이 그 출력에 이미 들어 있으니 재작성 판에서도 `ai-tell-quick-rules.md`를 통째로 열 이유가 없습니다.
|
|
832
884
|
- **10** — 걸린 게 없습니다.
|
|
833
885
|
- **11** — 어투는 깨끗하고 맞춤법만 걸렸습니다. 그것만 고칩니다.
|
|
834
886
|
- **12** — **검사할 산문이 없습니다.** 코멘트가 인용줄뿐이라 검사가 안 된 것이지 통과가 아닙니다. 자기 문장을 인용 밖에 두고 다시 쓰게 합니다.
|
|
835
887
|
- 재작성은 **한 번만** 돕니다. 두 번째도 걸리면 무엇이 남았는지 사용자에게 알리고 게시할지 묻습니다.
|
|
836
|
-
-
|
|
888
|
+
- 프로세스 종료 코드가 10이나 11이면 게시합니다. 게시가 끝나면 `rm -rf "$scanTmp"`로 그 실행 칸만 치웁니다 — 상위 `gestalt-review`나 PR 칸을 통째로 지우면 다른 세션이 쓰는 중인 파일까지 날아갑니다.
|
|
889
|
+
|
|
890
|
+
**코멘트 여러 개를 파일 하나에 모아 담으면 이 검사가 무력화됩니다.** 인용 판정이 그 파일 전체를 한 덩어리로 보기 때문에 코멘트 하나를 통째로 인용으로 감싸도 같은 파일 안 다른 코멘트의 산문에 묻혀 안 걸립니다. 파일 하나에 코멘트 하나가 이 검사가 서는 조건입니다. 이 조건은 지금도 바뀌지 않았습니다.
|
|
837
891
|
|
|
838
|
-
|
|
892
|
+
파일 여러 개를 한 프로세스 호출에 실어 보내는 것은 다른 이야기입니다. `humanize-scan`은 넘겨받은 파일마다 읽기와 스캔을 독립적으로 돌려 인용 판정이 파일 경계를 넘지 않게 막습니다. 그래서 위 호출처럼 파일을 한 번에 묶어 넘겨도 코멘트별 판정은 그대로 섭니다.
|
|
839
893
|
|
|
840
894
|
표 셀 검사는 끌 수 없습니다. 룰 문서인지는 `humanize-scan` 이 경로로 스스로 판정하고 그걸 바꾸는 옵션을 안 받습니다 — 검사를 끄는 스위치가 밖에 있으면 리뷰 대상 텍스트가 그걸 붙이라고 시키는 자리가 열립니다.
|
|
841
895
|
|
|
@@ -944,7 +998,7 @@ ges_execute {
|
|
|
944
998
|
|
|
945
999
|
`prContext`가 `"(없음)"`이면 PR 본문 줄만 뺍니다. 리뷰 의도와 PR 본문이 어긋났으면 그 줄 아래에 무엇이 어긋났는지 한 줄 더 적습니다 (1.15단계).
|
|
946
1000
|
|
|
947
|
-
|
|
1001
|
+
**실행은 병렬이고 표시만 순서를 지킵니다.** 1.5단계 호출은 3단계 파도에 실어 리뷰어들, 3.5단계와 동시에 내보냈지만 그건 실행 순서일 뿐입니다. 사용자에게 보여줄 때는 기획 컨텍스트 문서(1.5단계)를 리뷰 리포트 앞에 먼저 표시한 뒤, 코드 리뷰 결과를 표시합니다.
|
|
948
1002
|
|
|
949
1003
|
```
|
|
950
1004
|
{1.5단계 기획 컨텍스트 마크다운}
|