@tienne/gestalt 0.76.1 → 0.77.1
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/CLAUDE.md +5 -3
- package/dist/package.json +4 -4
- package/dist/plugin/role-agents/_shared/references/README.md +13 -1
- package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +2 -2
- package/dist/plugin/role-agents/code-review-responder/AGENT.md +1 -1
- package/dist/plugin/role-agents/code-review-writer/AGENT.md +3 -2
- package/dist/plugin/role-agents/explainer/AGENT.md +1 -1
- package/dist/plugin/role-agents/explainer/references/audience.md +1 -1
- package/dist/plugin/skills/blast-radius/SKILL.md +58 -9
- package/dist/plugin/skills/build-graph/SKILL.md +28 -3
- package/dist/plugin/skills/diff-radius/SKILL.md +44 -6
- package/dist/src/code-graph/blast-radius.d.ts +3 -3
- package/dist/src/code-graph/blast-radius.d.ts.map +1 -1
- package/dist/src/code-graph/blast-radius.js +111 -6
- package/dist/src/code-graph/blast-radius.js.map +1 -1
- package/dist/src/code-graph/cochange.d.ts +117 -0
- package/dist/src/code-graph/cochange.d.ts.map +1 -0
- package/dist/src/code-graph/cochange.js +444 -0
- package/dist/src/code-graph/cochange.js.map +1 -0
- package/dist/src/code-graph/engine.d.ts +13 -1
- package/dist/src/code-graph/engine.d.ts.map +1 -1
- package/dist/src/code-graph/engine.js +58 -4
- package/dist/src/code-graph/engine.js.map +1 -1
- package/dist/src/code-graph/index.d.ts +5 -2
- package/dist/src/code-graph/index.d.ts.map +1 -1
- package/dist/src/code-graph/index.js +2 -1
- package/dist/src/code-graph/index.js.map +1 -1
- package/dist/src/code-graph/storage.d.ts +93 -1
- package/dist/src/code-graph/storage.d.ts.map +1 -1
- package/dist/src/code-graph/storage.js +213 -0
- package/dist/src/code-graph/storage.js.map +1 -1
- package/dist/src/code-graph/types.d.ts +141 -0
- package/dist/src/code-graph/types.d.ts.map +1 -1
- package/dist/src/mcp/schemas.d.ts +12 -3
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +26 -3
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +10 -4
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/code-graph-passthrough.d.ts +4 -1
- package/dist/src/mcp/tools/code-graph-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/code-graph-passthrough.js +23 -0
- package/dist/src/mcp/tools/code-graph-passthrough.js.map +1 -1
- package/package.json +4 -4
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/role-agents/_shared/references/README.md +13 -1
- package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +2 -2
- package/plugin/role-agents/code-review-responder/AGENT.md +1 -1
- package/plugin/role-agents/code-review-writer/AGENT.md +3 -2
- package/plugin/role-agents/explainer/AGENT.md +1 -1
- package/plugin/role-agents/explainer/references/audience.md +1 -1
- package/plugin/skills/blast-radius/SKILL.md +58 -9
- package/plugin/skills/build-graph/SKILL.md +28 -3
- package/plugin/skills/diff-radius/SKILL.md +44 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-graph-passthrough.js","sourceRoot":"","sources":["../../../../src/mcp/tools/code-graph-passthrough.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"code-graph-passthrough.js","sourceRoot":"","sources":["../../../../src/mcp/tools/code-graph-passthrough.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.
|
|
3
|
+
"version": "0.77.1",
|
|
4
4
|
"description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
],
|
|
28
28
|
"scripts": {
|
|
29
29
|
"dev": "tsx bin/gestalt.ts",
|
|
30
|
-
"build": "tsc",
|
|
30
|
+
"build": "tsc -p tsconfig.build.json",
|
|
31
31
|
"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",
|
|
32
32
|
"verify:plugin": "tsx scripts/verify-plugin-assets.ts",
|
|
33
33
|
"prepublishOnly": "pnpm build",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"resolution-bench": "tsx benchmarks/run-resolution-benchmark.ts",
|
|
39
39
|
"lint": "eslint .",
|
|
40
40
|
"typecheck": "tsc --noEmit",
|
|
41
|
-
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
42
|
-
"format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
41
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"scripts/**/*.ts\"",
|
|
42
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\" \"scripts/**/*.ts\"",
|
|
43
43
|
"version:sync": "tsx scripts/sync-version.ts",
|
|
44
44
|
"postversion": "pnpm run version:sync && pnpm run build:output-style",
|
|
45
45
|
"verify:rules": "tsx scripts/verify-rule-refs.ts",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gestalt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.77.1",
|
|
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
|
@@ -20,13 +20,25 @@
|
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
pnpm verify:rules
|
|
23
|
+
pnpm verify:output-style
|
|
24
|
+
pnpm build:output-style
|
|
23
25
|
```
|
|
24
26
|
|
|
25
|
-
에이전트 문서 14곳이 룰 ID와 금지 어휘를 손으로 옮겨 적고 있어서 룰북에서 ID를 지우거나
|
|
27
|
+
**첫째 줄은 룰 ID 사본을 본다.** 에이전트 문서 14곳이 룰 ID와 금지 어휘를 손으로 옮겨 적고 있어서 룰북에서 ID를 지우거나
|
|
26
28
|
심각도를 바꾸면 그 사본들이 조용히 어긋난다. 이 검사가 네 가지를 본다 — 없는 ID를 인용하는
|
|
27
29
|
문서, 자체검증 목록에서 빠진 S1, 표와 목록의 심각도 불일치, 룰 문서 본문의 금지어 사용.
|
|
28
30
|
`pnpm test`와 `pnpm build`에도 걸려 있다.
|
|
29
31
|
|
|
32
|
+
**둘째 줄은 output style 생성기가 보는 것이다.** 두 가지를 본다 — 금지 목록과 자가점검이
|
|
33
|
+
인용한 룰 ID가 룰북에 살아있고 대화 기준 S1인지, 그리고 `scripts/build-output-style.ts`의
|
|
34
|
+
`HOIST`가 조각 문자열로 가리키는 처방 문장이 그대로인지. `verify:rules`는 둘 다 모른다.
|
|
35
|
+
`HOIST`에 적힌 룰마다 그 조각을 본다. 이것도 `pnpm test`와 `pnpm build`(postbuild)에
|
|
36
|
+
걸려 있다. `pnpm gate`를 돌리면 따로 부를 일이 없다.
|
|
37
|
+
|
|
38
|
+
**셋째 줄은 홈의 산출 파일을 다시 뽑는다.** 룰 문구나 심각도를 고쳐도
|
|
39
|
+
`~/.claude/output-styles/tienne-voice.md`는 저절로 안 바뀐다. 위 둘은 그 파일을 안 보므로
|
|
40
|
+
이걸 안 돌리면 룰북과 실제로 켜져 있는 어투 지시가 갈라진 채로 남는다.
|
|
41
|
+
|
|
30
42
|
- **룰을 추가하면 그 문서가 스스로 그 룰을 지키는지 먼저 확인한다.** 룰 문서가 금지 어휘를
|
|
31
43
|
본문에 쓰면 산출물로 샌다. 금지어를 넣었으면 같은 문서를 grep한다.
|
|
32
44
|
- 어투 규칙은 **S1으로 올려야 실제로 강제된다.** S2는 모델이 우선순위를 알아서 정하면서 빠져나간다.
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
**한자어를 피하는 게 목적이 아니다 (F-4·F-5 오적용 주의):** 겨냥하는 건 개념을 뭉친 **명사화**(-성/-적/-화)이지 한자어 동사가 아니다. "측정하다"를 "재다"로, "판단하다"를 "따지다"로 바꾸면 정확도만 잃는다. 그 자리의 정확한 말이 한자어면 한자어를 쓴다. 반대 방향 실수도 같다 — 한자어를 피하려고 비유 명사(축·증류)나 물리 동사(재다)로 도망가면 F-7에 걸린다. 셋 다 겪은 실례: `네 축을 따로 재고 판정한다` → `4가지 측면에서 각각 측정하고 판단한다`.
|
|
22
22
|
|
|
23
|
-
**은유를 다 지우라는 게 아니다 (F-9 오적용 주의):** 겨냥하는 건 결함이나 코드 상태, 그 결함의 원인 관계를 뭉개 부른 말이다. 그 자리에서 지어낸 별칭이든 이미 있는 비유든 같다. "널 포인터"를 "널 값을 가리키는 포인터"로, "데드락"을 "서로 기다리다 멈춘 상태"로 풀어 쓰면 길이만 늘고 무엇을 말하는지는 오히려 흐려진다. **가르는 기준은 그 자리에서 무엇을 가리키는지가 말에 남아 있느냐 하나뿐이다.** 남이 정의해 둔 이름을 그 뜻 그대로 쓰면 그 기준을 통과한다. 그게 대표 사례다.
|
|
23
|
+
**은유를 다 지우라는 게 아니다 (F-9 오적용 주의):** 겨냥하는 건 결함이나 코드 상태, 그 결함의 원인 관계를 뭉개 부른 말이다. 그 자리에서 지어낸 별칭이든 이미 있는 비유든 같다. "널 포인터"를 "널 값을 가리키는 포인터"로, "데드락"을 "서로 기다리다 멈춘 상태"로 풀어 쓰면 길이만 늘고 무엇을 말하는지는 오히려 흐려진다. **가르는 기준은 그 자리에서 무엇을 가리키는지가 말에 남아 있느냐 하나뿐이다.** 남이 정의해 둔 이름을 그 뜻 그대로 쓰면 그 기준을 통과한다. 그게 대표 사례다. **"뿌리"는 root 한 단어가 그 대상 이름인 자리에서만 남긴다** — 이를테면 트리와 스레드의 root, 디렉토리와 프로젝트와 git ref의 root다. **root cause처럼 root가 다른 명사를 수식하는 자리는 대상이다** — 원인이면 "원인", 출처면 "출처"로 쓴다. **이 기준이 아래 일반 예외보다 앞선다** — root cause analysis가 문헌에 뜻이 박힌 말이어도 "뿌리"로 옮기면 걸린다. **사전에 비유 뜻풀이가 실렸다는 것만으로는 정의해 둔 이름이 아니다** — "뿌리가 하나다"는 사전에 근본 뜻이 실려도 무엇이 같은지가 안 남는다. 명세나 교과서에 뜻이 박혀 있으면 가리킬 데가 있으니 그대로 둔다. 팀에서 몇 번 쓰였다는 것으로는 예외가 되지 않는다 — 아래 [측정 근거](#측정-근거) 문단과 B-4가 "팀에서 굳은 말"을 지키는 것과는 다른 자리다. B-4는 팀이 쓰기 시작하면 예외로 인정하는데 F-9는 그걸 예외로 안 본다. B-4가 막는 건 어색함이라 팀이 받아쓰면 풀리고 F-9가 막는 건 굳는 것 자체라 팀이 받아쓰면 그게 피해다.
|
|
24
24
|
|
|
25
25
|
**근거가 붙은 룰 (→ 아래 [측정 근거](#측정-근거)):** A-2, I-1, C-8은 대조 코퍼스 측정으로 심각도를 조정했고 B-4는 팀이 실제로 쓰는 말이라 예시에서 뺐다. 원어민이 오히려 더 쓰는 표현이나 팀에서 이미 굳은 말을 지우면 사람 글을 AI 글로 만든다.
|
|
26
26
|
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
| F-6 | 복합명사 압축 — 명사구를 조사·동사 없이 이어붙여 개념을 뭉침 ("시안 정합 버그픽스", "유지보수성 개선 작업", "권한 체크 로직") | S2 / **대화·리뷰 S1** | 동사·조사로 풀어 서술 ("디자인 시안과 다르게 렌더링되던 문제", "나중에 유지보수하기 편하게"). 사람은 압축 명사구 대신 무엇을 왜 했는지 풀어 말한다 |
|
|
144
144
|
| F-7 | 기술·이공계 비유 명사를 일상 대화에 그대로 (증류·배선·결정화·평탄화·오케스트레이션·파이프라인화·축 등, 화학·전기·수학 어휘의 비유 차용) | S2 / **대화·리뷰 S1** | 일상 동사·명사로 환원 (증류 → "추려내다/뽑아내다", 배선 → "연결하다/걸어두다", 결정화 → "정리하다", 평탄화 → "밋밋하게 만들다", **축 → "측면"**·"기준"). 문법은 멀쩡해 룰 매칭이 안 되지만 사람은 대화에서 안 쓴다. "네 축을 잰다"가 아니라 "4가지 측면에서 측정한다". **예외는 그 프로젝트가 개념에 붙인 이름일 때만이고, 그 개념을 다루는 자리에서만이다** — 게슈탈트의 "스펙 결정화"는 `similarity-crystallizer` 에이전트 이름이자 인터뷰→Spec 변환의 정의라서 두지만, 같은 말을 지라 티켓 작성처럼 무관한 자리에 끌어다 쓰면 F-7이다. 코드의 "파이프라인" 자체, 그래프의 x축도 같은 기준. 테스트를 자물쇠에 빗댄 "잠그다"는 방향이 반대라 F-10이 본다 |
|
|
145
145
|
| F-8 | 추상명사에 물리 측량 동사("근거를 재봤는데", "판단을 재보고 있다", "근거를 재본 결과", "의견을 달아봤는데") | S2 / **대화·리뷰 S1** | 저울에 올린 게 아니라 검토한 것이다. 사람이 하는 행위 동사로 되돌린다("근거를 확인해봤는데", "의견을 검토해봤는데"). F-7 물리 동사 도피의 사촌이라 목적어가 근거, 의견, 판단, 영향, 의미, 가치, 리스크인 자리만 본다 — "온도를 재봤는데"는 대상이 아니다 |
|
|
146
|
-
| F-9 | 결함이나 코드 상태, 그 결함의 원인 관계를 비유 명사로 뭉개 부름 ("맨몸 호출", "벌거벗은 API", "뿌리가 하나다") | S2 / **대화·리뷰 S1** | 무엇이 빠졌고 무엇이 틀렸는지 그대로 쓴다 ("맨몸 호출" → "접두 객체 없이 함수 이름만 적혀 있다"). 별칭은 검색이 안 되고 처음 읽는 사람이 못 알아보고 답글에서 재생산돼 팀 어휘로 굳는다. **예외는 남이 정의해 둔 이름을 그 뜻 그대로 쓸 때다** — "널 포인터", "데드락", "고아 노드"처럼 명세나 교과서에 뜻이 박힌 말이고 F-6으로도 안 넘긴다. 다른 결함에 비유로 얹으면 예외가 아니고 팀에서 몇 번 쓰였다는 것도 아니다 — 그렇게 열면 답글에 한 번 재생산된 별칭이 곧바로 빠져나간다. **F-7과 방향이 반대다** — F-7은 기술 비유를 일상 말로 되돌리고 F-9는 일상 비유를 기술 대상에 씌운 쪽을 본다. **원인 관계를 부르는 비유도 같은 자리다** — "뿌리가 하나다"는 원인이 같다는 말을 뿌리에 얹은 것이라 무엇이 같은지가 안 읽힌다. "원인이 같다"로 쓴다. 지어낸 별칭이든 이미 있는 비유든 가르는 건 하나다 — 그 자리에서 무엇을 가리키는지가 말에 남아 있느냐다.
|
|
146
|
+
| F-9 | 결함이나 코드 상태, 그 결함의 원인 관계를 비유 명사로 뭉개 부름 ("맨몸 호출", "벌거벗은 API", "뿌리가 하나다") | S2 / **대화·리뷰 S1** | 무엇이 빠졌고 무엇이 틀렸는지 그대로 쓴다 ("맨몸 호출" → "접두 객체 없이 함수 이름만 적혀 있다"). 별칭은 검색이 안 되고 처음 읽는 사람이 못 알아보고 답글에서 재생산돼 팀 어휘로 굳는다. **예외는 남이 정의해 둔 이름을 그 뜻 그대로 쓸 때다** — "널 포인터", "데드락", "고아 노드"처럼 명세나 교과서에 뜻이 박힌 말이고 F-6으로도 안 넘긴다. 다른 결함에 비유로 얹으면 예외가 아니고 팀에서 몇 번 쓰였다는 것도 아니다 — 그렇게 열면 답글에 한 번 재생산된 별칭이 곧바로 빠져나간다. **F-7과 방향이 반대다** — F-7은 기술 비유를 일상 말로 되돌리고 F-9는 일상 비유를 기술 대상에 씌운 쪽을 본다. **원인 관계를 부르는 비유도 같은 자리다** — "뿌리가 하나다"는 원인이 같다는 말을 뿌리에 얹은 것이라 무엇이 같은지가 안 읽힌다. "원인이 같다"로 쓴다. 지어낸 별칭이든 이미 있는 비유든 가르는 건 하나다 — 그 자리에서 무엇을 가리키는지가 말에 남아 있느냐다. **"뿌리"는 root 한 단어가 그 대상 이름인 자리에서만 쓴다** — root cause처럼 수식하는 자리는 대상이다. 기준과 예시는 위 `F-9 오적용 주의` 문단에 있고 상세는 그 한 자리에만 둔다. F-9에 걸린 별칭이 스스로 움직이면 D-5, 조사 없이 뭉치면 F-6도 함께 걸린다. **별칭과 원인 쪽 경계는 뜻이라 탐지기가 없다.** "뿌리"는 말 하나라 F-10의 "못 박" 탐지기처럼 형태로 걸 수 있지만 안 붙였다 — 레포에 root를 가리키는 정상 용례가 서른 자리 넘게 있어 걸린 자리를 사람이 다시 보는 양이 검사로 얻는 것보다 크다 |
|
|
147
147
|
| F-10 | 일상 관용구의 물리 동작 동사를 코드나 문서 대상에 씌움 ("타입을 못 박다", "규칙을 못박는다", "테스트로 잠갔다") | S2 / **대화·리뷰 S1** | 그 자리에서 실제로 무엇이 되는지를 동사로 쓴다 ("타입을 선언한다", "규칙을 정한다", "관련 테스트가 있다"). 관용구는 원래 사람 사이 합의에 걸리는 말이라 목적어가 타입이나 규칙이 되면 누구에게 못을 박는다는 건지 가리킬 데가 없다. **가르는 것은 누가 정하는 자리냐다.** 문서나 코드가 스스로 정하면 대상이고("이 지시를 1번으로 못박는다", "타입을 못 박다"), 사람들이 협의해 정하면 예외다("팀이 일정을 못 박았다"). 한국어는 주어를 자주 생략하므로 **주어가 드러나면 그걸 보고, 없으면 목적어로 본다** — 타입, 값, 규칙, 지시, 기준은 문서나 코드가 정하는 쪽이고 일정과 조건처럼 사람들이 서로 약속하는 대상은 협의하는 쪽이다. 같은 "범위"라도 문서가 제 적용 범위를 정하는 자리는 대상이고 팀이 일의 범위를 합의하는 자리는 예외다. **나머지 예외는 셋이다.** 목적어가 리터럴 값이라 하드코딩을 뜻하는 "박아두다"("이 값 그냥 박아두죠"), 명사로 굳은 "잠금", 자물쇠나 문처럼 실제 물체를 잠그는 자리("문을 잠갔다"). **탐지기는 "못 박" 어간과 자물쇠 활용형을 전부 건다** — 주어가 사람인지 문서인지 못 가르므로 걸린 자리는 사람이 위 축으로 다시 본다 (I-5와 같은 방식이다). 형태로 빠지는 예외는 앞에 "못"이 없는 "박아두다"와 명사 "잠금"뿐이다. **F-7과 방향이 반대다** — F-7은 기술 비유를 일상 말로 되돌리고 F-10은 일상 비유를 코드 대상에 씌운 쪽을 본다. **F-9와는 품사로 갈린다** — F-9는 결함이나 그 원인 관계를 명사로 부르는 쪽이고(지어낸 별칭이든 이미 있는 비유든) F-10은 행위를 부르는 동사 쪽이다. **F-8과는 안 겹친다** — F-8은 물리 "측량" 동사만 보므로 "판단을 못 박았다"도 F-10 하나로 판정한다 |
|
|
148
148
|
|
|
149
149
|
## G. Hedging
|
|
@@ -126,7 +126,7 @@ key는 넣었는데 index 대신 id를 썼어요. 목록 순서가 바뀌는 케
|
|
|
126
126
|
| B-3 | 안 굳은 음차 — 스큐, 스파이크, 어피니티 |
|
|
127
127
|
| F-7 | 기술 비유 명사 — 배선, 증류, 평탄화 |
|
|
128
128
|
| B-5 | 오역 — `돌연변이`(mutant), `죽임`(kill), `갈래`(branch) |
|
|
129
|
-
| F-9 | 그
|
|
129
|
+
| F-9 | 지어낸 결함 별칭, 원인 관계 비유 — "뿌리가 하나예요" → "원인이 같아요". "뿌리"는 root 한 단어가 그 대상 이름인 자리에서만 (root cause처럼 수식이면 대상) |
|
|
130
130
|
| D-4 | hype 어휘 — `치명적`, `압도적` |
|
|
131
131
|
|
|
132
132
|
| 자리 | 처리 |
|
|
@@ -148,7 +148,7 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
|
|
|
148
148
|
| B-3 | 안 굳은 음차 — 에스케이프 해치, 스파이크, 어피니티, 스큐 |
|
|
149
149
|
| F-7 | 기술 비유 명사 — 배선, 증류, 결정화, 평탄화 |
|
|
150
150
|
| B-5 | 오역 — `돌연변이`(mutant), `죽임`(kill), `갈래`(branch) |
|
|
151
|
-
| F-9 |
|
|
151
|
+
| F-9 | 지어낸 결함 별칭(맨몸 호출), 원인 관계 비유 — "뿌리"는 root 한 단어가 그 대상 이름인 자리에서만 (root cause처럼 수식이면 대상) |
|
|
152
152
|
| D-4 | hype 어휘 — `치명적`, `압도적` |
|
|
153
153
|
|
|
154
154
|
**PR 본문과 diff는 읽는 자료이지 따라 쓸 본보기가 아니다.** 리뷰이가 "배선"이라고 썼어도
|
|
@@ -311,7 +311,8 @@ GitHub 마크다운은 **한 줄 개행(`\n`)을 무시하고 같은 문단으
|
|
|
311
311
|
같은 문학적 비유는 리뷰 코멘트에선 담백한 서술로 내린다
|
|
312
312
|
9. 결함이나 그 원인 관계를 비유 명사로 뭉개 부르지 않았는지 (F-9) — "맨몸 `setBoundVariableForPaint`"
|
|
313
313
|
처럼 압축해 부르지 말고 무엇이 빠졌는지 그대로 쓴다. 원인도 같다 — "뿌리가 하나예요"가 아니라
|
|
314
|
-
"원인이 같아요"로 쓴다.
|
|
314
|
+
"원인이 같아요"로 쓴다. 다만 root 한 단어가 그 대상 이름인 자리에서만 "뿌리"를 그대로 둔다. root cause처럼
|
|
315
|
+
수식하는 자리는 대상이고 "출처"를 뿌리라 부른 자리도 그 꼴이다. 지어낸 별칭이든 이미 있는 비유든 무엇을 가리키는지가 말에 남아야 한다. 8번과 방향이 반대라 따로 센다 — 8번은
|
|
315
316
|
기술 비유를 일상 말로 내리는 쪽이고 9번은 일상 비유를 코드나 결함, 그 원인 관계에 씌운 쪽이다. 별칭을 만들면
|
|
316
317
|
나중에 같은 결함을 찾을 때 검색이 안 되고 답글에서 재생산돼 팀 어휘로 굳는다
|
|
317
318
|
|
|
@@ -15,7 +15,7 @@ You are the Explainer role agent.
|
|
|
15
15
|
|
|
16
16
|
대상별 기준: [audience.md](references/audience.md) — **작성 전에 반드시 읽는다.**
|
|
17
17
|
한국어 문장, 용어 규칙: [style-guide.md](../_shared/references/style-guide.md) (공유)
|
|
18
|
-
어투의
|
|
18
|
+
어투의 출처: [author-voice.md](../_shared/references/author-voice.md) (공유)
|
|
19
19
|
전면 윤문은 `humanize-monolith`가 맡는다.
|
|
20
20
|
|
|
21
21
|
**한국어로 직접 사고한다.** 영어로 생각한 뒤 옮기지 않는다.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: blast-radius
|
|
3
|
-
version: "1.
|
|
3
|
+
version: "1.2.0"
|
|
4
4
|
description: "코드 변경 전 영향 범위를 파악해 읽어야 할 파일만 컨텍스트에 제공한다. 변경 범위가 불확실하거나 사이드 이펙트가 걱정될 때 자동 발동한다. 아직 고치지 않은 코드가 대상이다. 이미 고쳐서 미커밋이나 스테이징 상태인 변경의 영향범위는 diff-radius를 쓴다."
|
|
5
5
|
triggers:
|
|
6
6
|
# 영향범위 확인 의도
|
|
@@ -45,9 +45,27 @@ inputs:
|
|
|
45
45
|
type: number
|
|
46
46
|
required: false
|
|
47
47
|
description: "BFS traversal depth (default: 2)"
|
|
48
|
+
limit:
|
|
49
|
+
type: number
|
|
50
|
+
required: false
|
|
51
|
+
description: "Max co-change neighbors pulled from git history, 0-500 (default: 30)"
|
|
52
|
+
minPairCount:
|
|
53
|
+
type: number
|
|
54
|
+
required: false
|
|
55
|
+
description: "Drop co-change pairs seen together fewer times than this (default: 3)"
|
|
56
|
+
minConfidence:
|
|
57
|
+
type: number
|
|
58
|
+
required: false
|
|
59
|
+
description: "Drop co-change pairs below this confidence, 0-1 (default: 0.3)"
|
|
48
60
|
outputs:
|
|
49
61
|
- changedFiles
|
|
50
62
|
- impactedFiles
|
|
63
|
+
- rankedFiles
|
|
64
|
+
- coChangeAvailable
|
|
65
|
+
- coChangeReason
|
|
66
|
+
- coChangeTruncated
|
|
67
|
+
- coChangeMatchedCapped
|
|
68
|
+
- coChangeTotalMatched
|
|
51
69
|
- riskScore
|
|
52
70
|
- summary
|
|
53
71
|
---
|
|
@@ -102,12 +120,34 @@ ges_code_graph {
|
|
|
102
120
|
| 필드 | 설명 |
|
|
103
121
|
|------|------|
|
|
104
122
|
| `changedFiles` | 변경된 파일 목록 |
|
|
105
|
-
| `impactedFiles` |
|
|
123
|
+
| `impactedFiles` | import 그래프로만 뽑은 영향 파일 (테스트 파일 우선 정렬) |
|
|
124
|
+
| `rankedFiles` | import 신호와 git 이력 신호를 합쳐 출처를 붙인 목록 |
|
|
125
|
+
| `coChangeAvailable` | git 이력 신호가 실제로 실렸는지 |
|
|
126
|
+
| `coChangeReason` | 이력 신호가 없거나 이웃이 0건일 때 그 사유 |
|
|
127
|
+
| `coChangeTruncated` | 이력 이웃이 `limit`에 잘렸다. 켜지면 `rankedFiles`의 `history` 항목은 하한이다 — 다만 보인 것은 전체 순위의 상위 접두사다 |
|
|
128
|
+
| `coChangeMatchedCapped` | 조회가 질의 단 천장(10,000행)에 걸렸다. `coChangeTruncated`와 사유가 다르다 — 이쪽이 켜지면 접두사도 아니고 `coChangeTotalMatched`도 하한이다. 푸는 손잡이는 `limit`이 아니라 `minPairCount`와 `minConfidence`다 |
|
|
129
|
+
| `coChangeTotalMatched` | 임계를 통과한 이력 이웃 수. `coChangeMatchedCapped`가 꺼져 있으면 하한이 아니라 정확한 수다 |
|
|
106
130
|
| `riskScore` | 위험도 점수 0~1 (전체 대비 영향 노드 비율). `depthExhausted`면 하한이다 |
|
|
107
131
|
| `depthExhausted` | `maxDepth`에 걸려 탐색이 멈췄고 갈 곳이 남아 있었다 |
|
|
108
132
|
| `unexploredNodes` | 그때 다음 홉에서 기다리던 노드 수 |
|
|
109
133
|
| `summary` | 한 줄 요약 |
|
|
110
134
|
|
|
135
|
+
### `rankedFiles`의 출처 표시
|
|
136
|
+
|
|
137
|
+
`rankedFiles`의 각 항목에는 `origin`이 붙어 있고 값은 셋이다.
|
|
138
|
+
|
|
139
|
+
| `origin` | 뜻 | 함께 실리는 필드 |
|
|
140
|
+
|------|------|------|
|
|
141
|
+
| `both` | import와 git 이력 양쪽에 걸렸다. 가장 먼저 읽을 파일 | `hopDistance`, `coChangeCount`, `confidence`, `lift` |
|
|
142
|
+
| `history` | 이력에만 걸렸다. import 그래프가 원리상 못 보는 관계 | `coChangeCount`, `confidence`, `lift` |
|
|
143
|
+
| `import` | import 신호만 있다 | `hopDistance` |
|
|
144
|
+
|
|
145
|
+
`history`가 잡는 건 매니페스트끼리의 약속, 코드와 그 코드를 설명하는 문서, 스키마와 그걸 읽는 설정처럼 서로 import하지 않는 관계다. 소스를 아무리 파싱해도 안 나오지만 사람은 늘 함께 고쳐온 파일이라 읽을 값어치가 있다.
|
|
146
|
+
|
|
147
|
+
**사용자에게 보여줄 목록은 `rankedFiles`다.** `impactedFiles`는 import 신호만 담고 있어 이력에서 온 파일이 빠져 있다. 대신 테스트 러너 인자처럼 실행 명령에 그대로 넣는 자리에는 `impactedFiles`를 쓴다 — 이력에만 걸린 md나 json이 섞이면 명령이 깨진다.
|
|
148
|
+
|
|
149
|
+
**`coChangeAvailable: false`면 이력 신호 자체가 안 실린 것이다.** "함께 바뀐 파일이 없다"와 다르다. git 레포가 아니거나, 그래프를 레포 최상위가 아닌 경로에서 빌드했거나, 아직 빌드를 안 돌린 경우다. 이 구분을 안 알리면 사용자는 import 그래프만 본 결과를 전부로 읽는다.
|
|
150
|
+
|
|
111
151
|
**`depthExhausted: true`면 결과는 전부가 아니라 하한이다.** 기본 `maxDepth`가 2라 3홉 이상 떨어진 호출부는 목록에 없다. 이걸 안 알리면 사용자는 "영향받는 파일 12개, 위험도 낮음"을 완전한 답으로 읽고 나머지를 안 읽는다 — 이 스킬을 쓰는 이유가 사이드 이펙트를 놓치지 않으려는 것이므로 그 오해가 가장 비싸다.
|
|
112
152
|
|
|
113
153
|
## Skill Instructions
|
|
@@ -126,15 +166,24 @@ ges_code_graph {
|
|
|
126
166
|
- src/auth.ts
|
|
127
167
|
- src/middleware.ts
|
|
128
168
|
|
|
129
|
-
|
|
130
|
-
- src/auth.test.ts
|
|
131
|
-
-
|
|
132
|
-
- src/api/
|
|
169
|
+
**같이 봐야 할 파일** (M개):
|
|
170
|
+
- [둘 다] src/auth.test.ts import 1홉 + 함께 바뀜 12회
|
|
171
|
+
- [이력] docs/auth-flow.md 함께 바뀜 7회 (import 관계 없음)
|
|
172
|
+
- [import] src/api/routes.ts 2홉
|
|
133
173
|
|
|
134
174
|
**위험도**: 0.23 (낮음)
|
|
135
175
|
**요약**: {summary}
|
|
136
176
|
```
|
|
137
177
|
|
|
178
|
+
`rankedFiles`가 온 순서를 그대로 씁니다. `both`가 맨 위에 오도록 이미 정렬돼 있으므로 다시 세우지 않습니다.
|
|
179
|
+
|
|
180
|
+
`coChangeAvailable: false`면 목록 아래에 한 줄을 덧붙입니다.
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
ℹ️ git 이력 신호 없이 import 그래프만 본 결과입니다 ({coChangeReason}).
|
|
184
|
+
레포 최상위에서 /build-graph를 다시 돌리면 함께 바뀐 파일까지 잡습니다.
|
|
185
|
+
```
|
|
186
|
+
|
|
138
187
|
`depthExhausted: true`면 위 표시 바로 아래에 한 줄을 덧붙입니다. 빠뜨리지 않습니다.
|
|
139
188
|
|
|
140
189
|
```
|
|
@@ -142,7 +191,7 @@ ges_code_graph {
|
|
|
142
191
|
위 목록과 위험도는 하한이며 전부가 아닙니다. 전체를 보려면 maxDepth를 올려 다시 부르세요.
|
|
143
192
|
```
|
|
144
193
|
|
|
145
|
-
5. `
|
|
194
|
+
5. `rankedFiles` 목록을 컨텍스트로 활용합니다:
|
|
146
195
|
- "아래 파일들이 영향을 받을 수 있습니다. 관련 작업 전 이 파일들을 먼저 읽어보겠습니다:" 형식으로 안내
|
|
147
196
|
- 파일이 많으면 (10개 이상) 가장 중요한 파일(테스트 파일, 핵심 모듈)을 우선 읽도록 제안
|
|
148
197
|
|
|
@@ -161,13 +210,13 @@ ges_code_graph {
|
|
|
161
210
|
아래는 <변경 파일>이 바뀌었을 때 영향받는 파일 목록이다. 각 파일을 훑고
|
|
162
211
|
파일마다 한 줄로 적는다.
|
|
163
212
|
|
|
164
|
-
- 변경 파일과 어떻게 닿아 있나 (직접 import / 테스트 / 간접)
|
|
213
|
+
- 변경 파일과 어떻게 닿아 있나 (직접 import / 테스트 / 간접 / 이력상 동반 변경)
|
|
165
214
|
- 먼저 읽어야 할 순서 (1이 가장 먼저)
|
|
166
215
|
|
|
167
216
|
고쳐야 하는지는 판단하지 않는다 — 그건 이 목록을 받는 쪽이 정한다.
|
|
168
217
|
|
|
169
218
|
변경 파일: <changedFiles>
|
|
170
|
-
|
|
219
|
+
같이 봐야 할 파일: <rankedFiles의 filePath와 origin>
|
|
171
220
|
|
|
172
221
|
아래 JSON만 돌려준다.
|
|
173
222
|
{ files: [{ path, relation, order, why }] }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: build-graph
|
|
3
|
-
version: "1.
|
|
3
|
+
version: "1.1.0"
|
|
4
4
|
description: "Build a code knowledge graph for the current repository to enable blast-radius analysis. Graph build only. For first-time project setup — gestalt.json, the post-commit hook, and the graph together — use setup instead."
|
|
5
5
|
triggers:
|
|
6
6
|
- "build graph"
|
|
@@ -28,6 +28,7 @@ outputs:
|
|
|
28
28
|
- nodesBuilt
|
|
29
29
|
- edgesBuilt
|
|
30
30
|
- timeTakenMs
|
|
31
|
+
- coChange
|
|
31
32
|
---
|
|
32
33
|
|
|
33
34
|
# Build Graph Skill
|
|
@@ -41,10 +42,16 @@ outputs:
|
|
|
41
42
|
|
|
42
43
|
코드 지식 그래프는 파일, 함수, 클래스 사이의 의존 관계를 SQLite DB(`.gestalt/code-graph.db`)에 저장합니다. 한 번 빌드해두면 `blast-radius` 분석으로 변경 영향 파일만 빠르게 조회할 수 있어 불필요한 파일 읽기를 크게 줄일 수 있습니다.
|
|
43
44
|
|
|
45
|
+
빌드는 신호를 둘 만듭니다. 하나는 소스를 파싱해 얻는 import 그래프이고 다른 하나는 `git log`를 한 번 읽어 세는 co-change(함께 바뀐 파일)입니다. co-change는 파일 확장자를 가리지 않으므로 언어 플러그인이 못 읽는 JSON이나 Markdown도 신호에 잡힙니다. 매니페스트끼리의 약속이나 코드와 그 코드를 설명하는 문서처럼 서로 import하지 않는 관계가 여기서 드러납니다.
|
|
46
|
+
|
|
47
|
+
**co-change 수집은 `repoRoot`가 git 레포 최상위일 때만 돕니다.** 하위 디렉토리를 넘기면 `git log`가 부모 레포의 전체 이력을 끌어오므로 아예 건너뜁니다.
|
|
48
|
+
|
|
44
49
|
## 지원 언어
|
|
45
50
|
|
|
46
51
|
TypeScript / JavaScript, Python, Go, Java, Kotlin, Rust, Swift, Objective-C
|
|
47
52
|
|
|
53
|
+
co-change는 언어와 무관하게 git이 추적하는 모든 파일에 걸립니다.
|
|
54
|
+
|
|
48
55
|
## 실행 방법
|
|
49
56
|
|
|
50
57
|
### 기본 (전체 빌드)
|
|
@@ -95,6 +102,11 @@ ges_code_graph {
|
|
|
95
102
|
| `timeTakenMs` | 소요 시간 (밀리초) |
|
|
96
103
|
| `skippedCount` | 읽거나 파싱하지 못해 그래프에서 빠진 파일 수 |
|
|
97
104
|
| `skippedFiles` | 그중 앞 20개의 경로와 사유 (진단용) |
|
|
105
|
+
| `coChange` | git 이력 co-change 수집 결과. `pairs`(페어 수), `commitsUsed`(필터를 통과해 실제로 센 커밋), `commitsScanned`(읽은 전체 커밋), `mode`(`full` 또는 `incremental`) |
|
|
106
|
+
|
|
107
|
+
**`coChange`가 응답에 아예 없으면 수집을 건너뛴 것이다.** 페어가 0건인 것과 다르다. `repoRoot`가 git 레포 최상위가 아니거나 git 레포가 아닌 경우다. 이대로 두면 이후 `/blast-radius`가 import 신호만 보고 `coChangeAvailable: false`를 계속 돌려준다.
|
|
108
|
+
|
|
109
|
+
`commitsUsed`가 `commitsScanned`보다 한참 작은 건 정상이다. 파일이 하나뿐인 커밋과 21개 이상을 건드린 커밋은 신호에서 빠진다 — 릴리즈나 일괄 포맷팅 커밋 하나가 그 안의 모든 파일을 서로 연결해버리는 걸 막기 위해서다. 자세한 임계는 게슈탈트 레포의 `docs/code-graph.md`에 있다.
|
|
98
110
|
|
|
99
111
|
**`skippedCount`가 0이 아니면 반드시 사용자에게 알린다.** 이 파일들은 그래프에 없으므로 이후 `/blast-radius`가 영향 범위에서 영영 누락한다. 깊이 상한과 달리 파라미터를 올려도 되살아나지 않는다 — 파싱이 실패한 원인을 고쳐 다시 빌드하는 수밖에 없다.
|
|
100
112
|
|
|
@@ -102,12 +114,25 @@ ges_code_graph {
|
|
|
102
114
|
|
|
103
115
|
1. `repoRoot`가 주어지지 않으면 현재 작업 디렉토리(`cwd`)를 절대 경로로 사용합니다.
|
|
104
116
|
2. `ges_code_graph { action: "build", repoRoot: "<repoRoot>", mode: "<mode>" }`를 호출합니다.
|
|
105
|
-
3. 빌드 결과를 사용자에게 표시합니다. `
|
|
117
|
+
3. 빌드 결과를 사용자에게 표시합니다. `coChange`가 실려 있으면 한 줄로 함께 알립니다.
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
git 이력: {coChange.commitsUsed}개 커밋에서 {coChange.pairs}개 페어 ({coChange.mode})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`coChange`가 없으면 아래 줄을 덧붙입니다.
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
ℹ️ git 이력 신호를 수집하지 못했습니다. repoRoot가 git 레포 최상위인지 확인하세요.
|
|
127
|
+
이대로면 /blast-radius가 import 관계만 봅니다.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`skippedCount`가 0이 아니면 아래 줄을 빠뜨리지 않고 덧붙입니다.
|
|
106
131
|
|
|
107
132
|
```
|
|
108
133
|
⚠️ {skippedCount}개 파일이 그래프에서 빠졌습니다 (읽기·파싱 실패).
|
|
109
134
|
이 파일들은 영향범위 분석에 잡히지 않습니다: {skippedFiles의 경로와 사유}
|
|
110
135
|
```
|
|
111
136
|
|
|
112
|
-
4. "그래프 빌드 완료! 이제 `/blast-radius`로 변경 영향 파일을 분석할 수 있습니다." 안내를 포함합니다.
|
|
137
|
+
4. "그래프 빌드 완료! 이제 `/blast-radius`로 변경 영향 파일을 분석할 수 있습니다." 안내를 포함합니다. `ges_code_graph { action: "co_change", repoRoot: "<repoRoot>", target: "<파일>" }`로 특정 파일과 늘 함께 바뀌어온 파일만 따로 볼 수도 있다는 것도 함께 알립니다.
|
|
113
138
|
5. 오류가 발생하면 오류 내용을 표시하고 지원 언어인지 확인하도록 안내합니다.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: diff-radius
|
|
3
|
-
version: "1.
|
|
3
|
+
version: "1.1.0"
|
|
4
4
|
description: "커밋 전 미저장 변경과 스테이징 변경의 영향범위를 분석한다. 작업 중인 코드가 어디까지 영향 주는지 바로 확인할 때 자동 발동한다. 이미 고친 변경이 대상이다. 아직 손대지 않은 코드의 영향범위를 미리 보려면 blast-radius를 쓴다."
|
|
5
5
|
triggers:
|
|
6
6
|
# 작업 중 변경 확인
|
|
@@ -31,9 +31,27 @@ inputs:
|
|
|
31
31
|
type: number
|
|
32
32
|
required: false
|
|
33
33
|
description: "BFS traversal depth (default: 2)"
|
|
34
|
+
limit:
|
|
35
|
+
type: number
|
|
36
|
+
required: false
|
|
37
|
+
description: "Max co-change neighbors pulled from git history, 0-500 (default: 30)"
|
|
38
|
+
minPairCount:
|
|
39
|
+
type: number
|
|
40
|
+
required: false
|
|
41
|
+
description: "Drop co-change pairs seen together fewer times than this (default: 3)"
|
|
42
|
+
minConfidence:
|
|
43
|
+
type: number
|
|
44
|
+
required: false
|
|
45
|
+
description: "Drop co-change pairs below this confidence, 0-1 (default: 0.3)"
|
|
34
46
|
outputs:
|
|
35
47
|
- changedFiles
|
|
36
48
|
- impactedFiles
|
|
49
|
+
- rankedFiles
|
|
50
|
+
- coChangeAvailable
|
|
51
|
+
- coChangeReason
|
|
52
|
+
- coChangeTruncated
|
|
53
|
+
- coChangeMatchedCapped
|
|
54
|
+
- coChangeTotalMatched
|
|
37
55
|
- riskScore
|
|
38
56
|
- summary
|
|
39
57
|
---
|
|
@@ -96,10 +114,22 @@ ges_code_graph {
|
|
|
96
114
|
| 필드 | 설명 |
|
|
97
115
|
|------|------|
|
|
98
116
|
| `changedFiles` | 변경된 파일 목록 |
|
|
99
|
-
| `impactedFiles` |
|
|
117
|
+
| `impactedFiles` | import 그래프로만 뽑은 영향 파일 (테스트 파일 우선 정렬) |
|
|
118
|
+
| `rankedFiles` | import 신호와 git 이력 신호를 합쳐 출처를 붙인 목록 |
|
|
119
|
+
| `coChangeAvailable` | git 이력 신호가 실제로 실렸는지 |
|
|
120
|
+
| `coChangeReason` | 이력 신호가 없거나 이웃이 0건일 때 그 사유 |
|
|
121
|
+
| `coChangeTruncated` | 이력 이웃이 `limit`에 잘렸다. 켜지면 `rankedFiles`의 `history` 항목은 하한이다 — 다만 보인 것은 전체 순위의 상위 접두사다 |
|
|
122
|
+
| `coChangeMatchedCapped` | 조회가 질의 단 천장(10,000행)에 걸렸다. `coChangeTruncated`와 사유가 다르다 — 이쪽이 켜지면 접두사도 아니고 `coChangeTotalMatched`도 하한이다. 푸는 손잡이는 `limit`이 아니라 `minPairCount`와 `minConfidence`다 |
|
|
123
|
+
| `coChangeTotalMatched` | 임계를 통과한 이력 이웃 수. `coChangeMatchedCapped`가 꺼져 있으면 하한이 아니라 정확한 수다 |
|
|
100
124
|
| `riskScore` | 위험도 점수 0~1 |
|
|
101
125
|
| `summary` | 한 줄 요약 |
|
|
102
126
|
|
|
127
|
+
`rankedFiles` 각 항목의 `origin`은 `both`(import와 이력 양쪽), `history`(이력 전용), `import`(import 전용) 셋이다. `history`는 매니페스트끼리의 약속이나 코드와 그 문서처럼 서로 import하지 않아 파싱으로는 영영 안 잡히는 관계다. 커밋 직전에 "이것도 같이 고쳐야 하지 않나"를 잡아주는 자리라 이 스킬에서 특히 쓸모가 있다.
|
|
128
|
+
|
|
129
|
+
읽는 규칙은 `/blast-radius`와 같다. 사용자에게 보여줄 목록은 `rankedFiles`다. 테스트 러너 인자처럼 실행 명령에 그대로 넣는 자리에는 `impactedFiles`를 쓴다. 자세한 설명은 [`../blast-radius/SKILL.md`](../blast-radius/SKILL.md)의 "rankedFiles의 출처 표시" 절에 있다.
|
|
130
|
+
|
|
131
|
+
**`coChangeAvailable: false`면 이력 신호 자체가 안 실린 것이다.** 함께 바뀐 파일이 없다는 뜻이 아니다.
|
|
132
|
+
|
|
103
133
|
## Skill Instructions
|
|
104
134
|
|
|
105
135
|
1. `repoRoot`가 주어지지 않으면 현재 작업 디렉토리를 절대 경로로 사용합니다.
|
|
@@ -116,14 +146,22 @@ ges_code_graph {
|
|
|
116
146
|
- src/auth.ts
|
|
117
147
|
- src/middleware.ts
|
|
118
148
|
|
|
119
|
-
|
|
120
|
-
- src/auth.test.ts
|
|
121
|
-
-
|
|
149
|
+
**같이 봐야 할 파일** (M개):
|
|
150
|
+
- [둘 다] src/auth.test.ts import 1홉 + 함께 바뀜 12회
|
|
151
|
+
- [이력] docs/auth-flow.md 함께 바뀜 7회 (import 관계 없음)
|
|
152
|
+
- [import] src/api/routes.ts 2홉
|
|
122
153
|
|
|
123
154
|
**위험도**: 0.23 (낮음)
|
|
124
155
|
**요약**: {summary}
|
|
125
156
|
```
|
|
126
157
|
|
|
158
|
+
`rankedFiles`가 온 순서를 그대로 씁니다. `coChangeAvailable: false`면 목록 아래에 한 줄을 덧붙입니다.
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
ℹ️ git 이력 신호 없이 import 그래프만 본 결과입니다 ({coChangeReason}).
|
|
162
|
+
레포 최상위에서 /build-graph를 다시 돌리면 함께 바뀐 파일까지 잡습니다.
|
|
163
|
+
```
|
|
164
|
+
|
|
127
165
|
`depthExhausted: true`면 위 표시 바로 아래에 한 줄을 덧붙입니다. 빠뜨리지 않습니다.
|
|
128
166
|
|
|
129
167
|
```
|
|
@@ -131,5 +169,5 @@ ges_code_graph {
|
|
|
131
169
|
위 목록과 위험도는 하한이며 전부가 아닙니다. 전체를 보려면 maxDepth를 올려 다시 부르세요.
|
|
132
170
|
```
|
|
133
171
|
|
|
134
|
-
5. `
|
|
172
|
+
5. `rankedFiles` 목록을 컨텍스트로 활용합니다. 20개를 넘으면 읽는 순서를 서브에이전트에 맡깁니다 — 방식은 [`../blast-radius/SKILL.md`](../blast-radius/SKILL.md) 5번과 같습니다. 우선순위를 정하겠다고 세션이 20개 파일을 다 열면 이 스킬을 쓰는 이유가 없어집니다.
|
|
135
173
|
6. 변경된 파일이 없으면 "현재 미커밋 변경이 없습니다." 안내합니다.
|