@tienne/gestalt 0.76.0 → 0.77.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 (66) hide show
  1. package/CLAUDE.md +4 -3
  2. package/dist/package.json +1 -1
  3. package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +2 -2
  4. package/dist/plugin/role-agents/code-review-responder/AGENT.md +1 -1
  5. package/dist/plugin/role-agents/code-review-writer/AGENT.md +3 -2
  6. package/dist/plugin/role-agents/explainer/AGENT.md +1 -1
  7. package/dist/plugin/role-agents/explainer/references/audience.md +1 -1
  8. package/dist/plugin/skills/blast-radius/SKILL.md +58 -9
  9. package/dist/plugin/skills/build-graph/SKILL.md +28 -3
  10. package/dist/plugin/skills/diff-radius/SKILL.md +44 -6
  11. package/dist/plugin/skills/review/SKILL.md +30 -20
  12. package/dist/plugin/skills/review-loop/SKILL.md +3 -3
  13. package/dist/plugin/skills/ship/SKILL.md +1 -1
  14. package/dist/src/code-graph/blast-radius.d.ts +3 -3
  15. package/dist/src/code-graph/blast-radius.d.ts.map +1 -1
  16. package/dist/src/code-graph/blast-radius.js +111 -6
  17. package/dist/src/code-graph/blast-radius.js.map +1 -1
  18. package/dist/src/code-graph/cochange.d.ts +117 -0
  19. package/dist/src/code-graph/cochange.d.ts.map +1 -0
  20. package/dist/src/code-graph/cochange.js +444 -0
  21. package/dist/src/code-graph/cochange.js.map +1 -0
  22. package/dist/src/code-graph/engine.d.ts +13 -1
  23. package/dist/src/code-graph/engine.d.ts.map +1 -1
  24. package/dist/src/code-graph/engine.js +58 -4
  25. package/dist/src/code-graph/engine.js.map +1 -1
  26. package/dist/src/code-graph/index.d.ts +5 -2
  27. package/dist/src/code-graph/index.d.ts.map +1 -1
  28. package/dist/src/code-graph/index.js +2 -1
  29. package/dist/src/code-graph/index.js.map +1 -1
  30. package/dist/src/code-graph/storage.d.ts +93 -1
  31. package/dist/src/code-graph/storage.d.ts.map +1 -1
  32. package/dist/src/code-graph/storage.js +213 -0
  33. package/dist/src/code-graph/storage.js.map +1 -1
  34. package/dist/src/code-graph/types.d.ts +141 -0
  35. package/dist/src/code-graph/types.d.ts.map +1 -1
  36. package/dist/src/mcp/schemas.d.ts +12 -3
  37. package/dist/src/mcp/schemas.d.ts.map +1 -1
  38. package/dist/src/mcp/schemas.js +26 -3
  39. package/dist/src/mcp/schemas.js.map +1 -1
  40. package/dist/src/mcp/server.d.ts.map +1 -1
  41. package/dist/src/mcp/server.js +10 -4
  42. package/dist/src/mcp/server.js.map +1 -1
  43. package/dist/src/mcp/tools/code-graph-passthrough.d.ts +4 -1
  44. package/dist/src/mcp/tools/code-graph-passthrough.d.ts.map +1 -1
  45. package/dist/src/mcp/tools/code-graph-passthrough.js +23 -0
  46. package/dist/src/mcp/tools/code-graph-passthrough.js.map +1 -1
  47. package/dist/src/review-loop/fetch.d.ts +9 -4
  48. package/dist/src/review-loop/fetch.d.ts.map +1 -1
  49. package/dist/src/review-loop/fetch.js +13 -5
  50. package/dist/src/review-loop/fetch.js.map +1 -1
  51. package/dist/src/review-loop/state.js +1 -1
  52. package/package.json +1 -1
  53. package/plugin/.codex-plugin/plugin.json +1 -1
  54. package/plugin/.mcp.json +1 -1
  55. package/plugin/mcp.json +1 -1
  56. package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +2 -2
  57. package/plugin/role-agents/code-review-responder/AGENT.md +1 -1
  58. package/plugin/role-agents/code-review-writer/AGENT.md +3 -2
  59. package/plugin/role-agents/explainer/AGENT.md +1 -1
  60. package/plugin/role-agents/explainer/references/audience.md +1 -1
  61. package/plugin/skills/blast-radius/SKILL.md +58 -9
  62. package/plugin/skills/build-graph/SKILL.md +28 -3
  63. package/plugin/skills/diff-radius/SKILL.md +44 -6
  64. package/plugin/skills/review/SKILL.md +30 -20
  65. package/plugin/skills/review-loop/SKILL.md +3 -3
  66. package/plugin/skills/ship/SKILL.md +1 -1
@@ -1,10 +1,11 @@
1
+ import { MAX_MATCHED_ROWS } from './storage.js';
1
2
  import { NodeKind } from './types.js';
2
3
  /**
3
4
  * Computes blast-radius for a set of changed files using reverse BFS.
4
5
  * Reverse BFS: finds all nodes that depend on (import/call) the changed files.
5
6
  * Test files are prioritized in the result.
6
7
  */
7
- export function computeBlastRadius(store, changedFiles, maxDepth = 2) {
8
+ export function computeBlastRadius(store, changedFiles, maxDepth = 2, coChange) {
8
9
  if (changedFiles.length === 0) {
9
10
  return {
10
11
  changedFiles: [],
@@ -14,6 +15,12 @@ export function computeBlastRadius(store, changedFiles, maxDepth = 2) {
14
15
  maxDepthUsed: maxDepth,
15
16
  depthExhausted: false,
16
17
  unexploredNodes: 0,
18
+ rankedFiles: [],
19
+ coChangeAvailable: coChange?.available ?? false,
20
+ coChangeReason: coChange?.reason,
21
+ coChangeTruncated: coChange?.truncated ?? false,
22
+ coChangeMatchedCapped: coChange?.matchedCapped ?? false,
23
+ coChangeTotalMatched: coChange?.totalMatched ?? 0,
17
24
  summary: 'No changed files provided.',
18
25
  };
19
26
  }
@@ -89,8 +96,13 @@ export function computeBlastRadius(store, changedFiles, maxDepth = 2) {
89
96
  const stats = store.getStats('');
90
97
  const totalNodes = stats.totalNodes;
91
98
  const riskScore = totalNodes > 0 ? Math.min(1, impactedNodeIds.size / totalNodes) : 0;
92
- // 7. Build summary
93
- const summary = buildSummary(changedFiles, impactedFiles, impactedNodes, riskScore, maxDepth, depthExhausted, unexploredNodes);
99
+ // 7. import 신호와 이력 신호를 합쳐 출처를 붙인다.
100
+ // impactedFiles는 건드리지 않는다 — 소비자가 vitest 인자로 직결한다.
101
+ const rankedFiles = buildRankedFiles(changedFiles, impactedFiles, impactedNodes, coChange);
102
+ const historyOnly = rankedFiles.filter((f) => f.origin === 'history').length;
103
+ const both = rankedFiles.filter((f) => f.origin === 'both').length;
104
+ // 8. Build summary
105
+ const summary = buildSummary(changedFiles, impactedFiles, impactedNodes, riskScore, maxDepth, depthExhausted, unexploredNodes, coChange, historyOnly, both);
94
106
  return {
95
107
  changedFiles,
96
108
  impactedFiles,
@@ -99,9 +111,73 @@ export function computeBlastRadius(store, changedFiles, maxDepth = 2) {
99
111
  maxDepthUsed: maxDepth,
100
112
  depthExhausted,
101
113
  unexploredNodes,
114
+ rankedFiles,
115
+ coChangeAvailable: coChange?.available ?? false,
116
+ coChangeReason: coChange?.reason,
117
+ coChangeTruncated: coChange?.truncated ?? false,
118
+ coChangeMatchedCapped: coChange?.matchedCapped ?? false,
119
+ coChangeTotalMatched: coChange?.totalMatched ?? 0,
102
120
  summary,
103
121
  };
104
122
  }
123
+ /**
124
+ * both(두 신호 모두) → history(이력 전용) → import(import 전용) 순으로 세운다.
125
+ * 두 신호에 함께 걸린 파일이 가장 먼저 읽혀야 할 파일이다.
126
+ */
127
+ function buildRankedFiles(changedFiles, impactedFiles, impactedNodes, coChange) {
128
+ const hopByFile = new Map();
129
+ for (const f of changedFiles)
130
+ hopByFile.set(f, 0);
131
+ for (const node of impactedNodes) {
132
+ const prev = hopByFile.get(node.filePath);
133
+ if (prev === undefined || node.hopDistance < prev)
134
+ hopByFile.set(node.filePath, node.hopDistance);
135
+ }
136
+ const importSet = new Set(impactedFiles);
137
+ const neighbors = coChange?.neighbors ?? [];
138
+ const both = [];
139
+ const history = [];
140
+ const seenFromHistory = new Set();
141
+ for (const n of neighbors) {
142
+ seenFromHistory.add(n.filePath);
143
+ const entry = {
144
+ filePath: n.filePath,
145
+ origin: importSet.has(n.filePath) ? 'both' : 'history',
146
+ coChangeCount: n.pairCount,
147
+ confidence: n.confidence,
148
+ lift: n.lift,
149
+ isTest: isTestFile(n.filePath),
150
+ };
151
+ if (entry.origin === 'both') {
152
+ entry.hopDistance = hopByFile.get(n.filePath);
153
+ both.push(entry);
154
+ }
155
+ else {
156
+ history.push(entry);
157
+ }
158
+ }
159
+ // 경로까지 열쇠로 둔다. 점수와 카운트가 같은 행이 흔해 거기서 멈추면
160
+ // 순서가 입력 순서에 걸린다.
161
+ const byScore = (a, b) => (b.confidence ?? 0) * (b.lift ?? 0) - (a.confidence ?? 0) * (a.lift ?? 0) ||
162
+ (b.coChangeCount ?? 0) - (a.coChangeCount ?? 0) ||
163
+ a.filePath.localeCompare(b.filePath);
164
+ both.sort(byScore);
165
+ history.sort(byScore);
166
+ const importOnly = impactedFiles
167
+ .filter((f) => !seenFromHistory.has(f))
168
+ .map((f) => ({
169
+ filePath: f,
170
+ origin: 'import',
171
+ hopDistance: hopByFile.get(f) ?? 0,
172
+ isTest: isTestFile(f),
173
+ }));
174
+ importOnly.sort((a, b) => {
175
+ if (a.isTest !== b.isTest)
176
+ return a.isTest ? -1 : 1;
177
+ return (a.hopDistance ?? 0) - (b.hopDistance ?? 0) || a.filePath.localeCompare(b.filePath);
178
+ });
179
+ return [...both, ...history, ...importOnly];
180
+ }
105
181
  /**
106
182
  * Approximates the minimum hop distance from a node to the seed set.
107
183
  * Uses a simple BFS from the node backward toward the seeds.
@@ -137,19 +213,48 @@ function isTestFile(filePath) {
137
213
  filePath.includes('_test.') ||
138
214
  filePath.includes('test_'));
139
215
  }
140
- function buildSummary(changedFiles, impactedFiles, impactedNodes, riskScore, maxDepth, depthExhausted, unexploredNodes) {
216
+ function buildSummary(changedFiles, impactedFiles, impactedNodes, riskScore, maxDepth, depthExhausted, unexploredNodes, coChange, historyOnly, both) {
141
217
  const testFileCount = impactedFiles.filter(isTestFile).length;
142
218
  const riskLabel = riskScore > 0.6 ? 'HIGH' : riskScore > 0.3 ? 'MEDIUM' : 'LOW';
143
219
  const testNodes = impactedNodes.filter((n) => n.kind === NodeKind.Function && n.isTest).length;
144
220
  const base = `Changed ${changedFiles.length} file(s) impact ${impactedFiles.length} file(s) ` +
145
221
  `(${testFileCount} test files, ${testNodes} test functions). ` +
146
222
  `Risk: ${riskLabel} (${(riskScore * 100).toFixed(1)}%).`;
223
+ // 이력 신호가 안 실린 것과 함께 바뀐 파일이 없는 것은 다르다. summary만 읽는
224
+ // 자리가 있으므로 여기서도 둘을 갈라 말한다.
225
+ //
226
+ // 잘린 사실도 같이 싣는다. depthExhausted가 import 쪽을 하한이라고 말하는
227
+ // 것과 같은 이유다 — 목록만 보면 40개 중 30개를 전부로 읽는다.
228
+ //
229
+ // "top N of M"이라고 단정할 수 있는 건 자르는 자리가 랭킹을 다 세운 뒤
230
+ // 한 곳뿐이어서다. 질의가 점수와 다른 키로 먼저 자르면 이 문장이 거짓이 된다.
231
+ //
232
+ // 질의 천장에 걸린 경우가 정확히 그 자리라 문장을 갈라 쓴다. 같은 "lower
233
+ // bound"로 뭉뜽그리면 고칠 손잡이가 limit이라고 잘못 읽게 되는데, 천장을
234
+ // 푸는 건 limit이 아니라 임계다.
235
+ let capped = '';
236
+ if (coChange?.matchedCapped === true) {
237
+ capped =
238
+ ` History neighbors hit the ${MAX_MATCHED_ROWS}-row query ceiling: showing ` +
239
+ `${coChange.neighbors.length} of at least ${coChange.totalMatched} match(es), ` +
240
+ `and the list is not a ranked prefix. ` +
241
+ `Raise minPairCount or minConfidence to get an exact ranking.`;
242
+ }
243
+ else if (coChange?.truncated === true) {
244
+ capped =
245
+ ` History neighbors are a lower bound: showing the top ${coChange.neighbors.length} ` +
246
+ `of ${coChange.totalMatched} match(es). Raise limit to see more.`;
247
+ }
248
+ const history = !coChange?.available
249
+ ? ' Git history signal unavailable (import graph only).'
250
+ : ` Git history adds ${historyOnly} file(s) imports cannot see, ${both} confirmed by both signals.` +
251
+ capped;
147
252
  // 잘렸으면 요약에서 먼저 말한다. 사람은 summary만 읽고 판단하는 일이 잦은데
148
253
  // "영향 12개, 위험 낮음"만 보면 그게 전부인 줄 안다.
149
254
  if (!depthExhausted)
150
- return base;
255
+ return `${base}${history}`;
151
256
  return (`${base} INCOMPLETE: search stopped at depth ${maxDepth} with ${unexploredNodes} node(s) ` +
152
257
  `still unexplored, so the impact list and risk are lower bounds, not totals. ` +
153
- `Re-run with a higher maxDepth to see the rest.`);
258
+ `Re-run with a higher maxDepth to see the rest.${history}`);
154
259
  }
155
260
  //# sourceMappingURL=blast-radius.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"blast-radius.js","sourceRoot":"","sources":["../../../src/code-graph/blast-radius.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blast-radius.js","sourceRoot":"","sources":["../../../src/code-graph/blast-radius.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { type CodeGraphStore } from './storage.js';
2
+ import type { BuildMode, CoChangeBuildSummary, CoChangeTuning, CoChangeLookup, CoChangeNeighbor, CoChangeResult } from './types.js';
3
+ /**
4
+ * 한 커밋이 이 개수를 넘게 건드리면 신호에서 뺀다.
5
+ * 릴리즈 커밋이나 일괄 포맷팅이 모든 파일을 서로 연결해버리는 걸 막는다.
6
+ */
7
+ export declare const MAX_FILES_PER_COMMIT = 20;
8
+ /** 파일이 하나뿐인 커밋은 페어를 만들 수 없다 */
9
+ export declare const MIN_FILES_PER_COMMIT = 2;
10
+ /** 동시 등장이 이 미만인 페어는 우연으로 본다 */
11
+ export declare const MIN_PAIR_COUNT = 3;
12
+ export declare const DEFAULT_MIN_CONFIDENCE = 0.3;
13
+ export declare const DEFAULT_NEIGHBOR_LIMIT = 30;
14
+ export declare const DEFAULT_PAIR_LIMIT = 50;
15
+ export type GitRunner = (root: string, args: string[]) => string;
16
+ export interface CommitRecord {
17
+ sha: string;
18
+ files: string[];
19
+ }
20
+ export interface PairCounts {
21
+ /** 키는 `${a}\t${b}`이고 a < b로 정규화돼 있다 */
22
+ pairs: Map<string, number>;
23
+ solos: Map<string, number>;
24
+ commitsUsed: number;
25
+ commitsScanned: number;
26
+ }
27
+ export declare function pairKey(a: string, b: string): string;
28
+ /** `git log --format=%H --name-only --no-merges` 출력을 커밋 단위로 쪼갠다 */
29
+ export declare function parseGitLog(raw: string): CommitRecord[];
30
+ export declare function countPairs(commits: CommitRecord[]): PairCounts;
31
+ /** 보고 정밀도. 원시 카운트만 저장하므로 언제든 다시 계산할 수 있다 */
32
+ export declare const CONFIDENCE_DECIMALS = 2;
33
+ export declare const LIFT_DECIMALS = 1;
34
+ /**
35
+ * confidence는 방향별로 다르므로 큰 쪽을 쓴다.
36
+ * lift 분모는 이긴 방향의 상대 파일이 전체 커밋에서 등장하는 비율이다 —
37
+ * 어디에나 끼는 파일일수록 분모가 커져 점수가 눌린다.
38
+ *
39
+ * 반환 직전에 반올림한다. 이 함수가 두 소비 경로(cochange 응답과 blast-radius
40
+ * rankedFiles)가 만나는 유일한 지점이라 여기서 자르면 양쪽이 같은 값을 본다.
41
+ * 랭킹도 보고된 값 그대로 매겨져 "같아 보이는데 순서가 다른" 자리가 없어진다.
42
+ */
43
+ export declare function scoreNeighbor(pairCount: number, soloSelf: number, soloOther: number, commitsUsed: number): {
44
+ confidence: number;
45
+ lift: number;
46
+ };
47
+ /** 랭킹 키. 프로토타입이 검증한 정렬이다 */
48
+ export declare function neighborScore(n: {
49
+ confidence: number;
50
+ lift: number;
51
+ }): number;
52
+ /**
53
+ * 점수와 동시등장 다음에 경로를 마지막 열쇠로 둔다. 앞의 둘이 같은 행은 흔한데
54
+ * (카운트가 같으면 점수도 같기 쉽다) 거기서 멈추면 순서가 DB가 돌려준 행
55
+ * 순서에 걸린다. 질의에 `ORDER BY`가 없으므로 그건 보장이 없다.
56
+ */
57
+ export declare function compareNeighbors(a: {
58
+ confidence: number;
59
+ lift: number;
60
+ pairCount: number;
61
+ filePath: string;
62
+ }, b: {
63
+ confidence: number;
64
+ lift: number;
65
+ pairCount: number;
66
+ filePath: string;
67
+ }): number;
68
+ export interface CoChangeSyncOptions {
69
+ mode?: BuildMode;
70
+ runGit?: GitRunner;
71
+ }
72
+ /**
73
+ * git 이력에서 co-change 카운트를 수집해 DB에 병합한다.
74
+ *
75
+ * repoRoot가 레포 최상위가 아니면 아무것도 하지 않는다. 하위 디렉토리를
76
+ * repoRoot로 넘기면 `git log`가 부모 레포의 전체 이력을 돌려주기 때문이다 —
77
+ * 테스트가 `.gestalt-test/<uuid>`를 repoRoot로 쓰는 자리가 정확히 그 경우다.
78
+ *
79
+ * 수집 불가는 예외가 아니라 undefined로 알린다. 호출부는 그래프 빌드를
80
+ * 계속해야 한다. 0건과 미수집도 구분돼야 한다.
81
+ */
82
+ export declare function syncCoChange(store: CodeGraphStore, repoRoot: string, opts?: CoChangeSyncOptions): CoChangeBuildSummary | undefined;
83
+ export interface CoChangeQueryOptions extends CoChangeTuning {
84
+ target?: string;
85
+ /** 워킹트리 존재 확인. 테스트에서 주입한다 */
86
+ exists?: (filePath: string) => boolean;
87
+ /**
88
+ * 질의 단 절대 천장. 기본값은 `MAX_MATCHED_ROWS`다. 테스트에서 작은 값을
89
+ * 주입해 천장 분기를 찍는다.
90
+ *
91
+ * `CoChangeTuning`에 두지 않은 게 의도다 — 튜닝 면은 MCP 입력으로 그대로
92
+ * 열려 있는데, 안전판을 그 면에 올리면 외부 입력이 안전판을 푸는 자리가 된다.
93
+ */
94
+ maxMatchedRows?: number;
95
+ }
96
+ export interface NeighborScan {
97
+ neighbors: CoChangeNeighbor[];
98
+ /**
99
+ * 질의가 `maxMatchedRows` 천장에 걸렸다. 켜지면 `neighbors`는 임계를
100
+ * 통과한 전부가 아니고 점수 상위라는 보장도 없다 — 천장은 점수가 아니라
101
+ * 행을 읽은 순서로 걸리기 때문이다.
102
+ */
103
+ capped: boolean;
104
+ }
105
+ export declare function queryCoChange(store: CodeGraphStore, repoRoot: string, opts?: CoChangeQueryOptions): CoChangeResult;
106
+ /**
107
+ * 여러 seed 파일의 이웃을 하나로 합친다. blast-radius가 쓰는 진입점이다.
108
+ * 같은 파일이 여러 seed에 걸리면 점수가 높은 쪽을 남긴다. 합친 목록은
109
+ * `opts.limit`(기본 `DEFAULT_NEIGHBOR_LIMIT`)까지만 돌려준다. 잘렸으면
110
+ * `truncated`로 알린다 — 목록만 보면 그게 전부인 줄 안다.
111
+ *
112
+ * 자르는 자리가 여기 하나뿐이라 돌려준 목록은 임계를 통과한 전체의 상위
113
+ * 접두사다. `totalMatched`도 하한이 아니라 정확한 수다. 단 seed 중 하나라도
114
+ * 질의 천장에 걸리면(`matchedCapped`) 둘 다 성립하지 않는다.
115
+ */
116
+ export declare function buildCoChangeLookup(store: CodeGraphStore, repoRoot: string, seeds: string[], opts?: CoChangeQueryOptions): CoChangeLookup;
117
+ //# sourceMappingURL=cochange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cochange.d.ts","sourceRoot":"","sources":["../../../src/code-graph/cochange.ts"],"names":[],"mappings":"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"}