intentpatch 0.7.0 → 0.9.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 (73) hide show
  1. package/README.ko.md +73 -22
  2. package/README.md +77 -20
  3. package/dist/application/ports/property-type-compatibility.d.ts +5 -0
  4. package/dist/application/ports/property-type-compatibility.d.ts.map +1 -0
  5. package/dist/application/ports/property-type-compatibility.js +2 -0
  6. package/dist/application/ports/property-type-compatibility.js.map +1 -0
  7. package/dist/application/ports/yarn-lock-parser.d.ts +19 -0
  8. package/dist/application/ports/yarn-lock-parser.d.ts.map +1 -0
  9. package/dist/application/ports/yarn-lock-parser.js +2 -0
  10. package/dist/application/ports/yarn-lock-parser.js.map +1 -0
  11. package/dist/application/rules/added-dependency-usage-rule.js +2 -2
  12. package/dist/application/rules/added-dependency-usage-rule.js.map +1 -1
  13. package/dist/application/rules/missing-test-change-rule.d.ts.map +1 -1
  14. package/dist/application/rules/missing-test-change-rule.js +17 -12
  15. package/dist/application/rules/missing-test-change-rule.js.map +1 -1
  16. package/dist/application/rules/npm-workspace-dependency-rule.d.ts +1 -1
  17. package/dist/application/rules/npm-workspace-dependency-rule.d.ts.map +1 -1
  18. package/dist/application/rules/npm-workspace-dependency-rule.js +30 -14
  19. package/dist/application/rules/npm-workspace-dependency-rule.js.map +1 -1
  20. package/dist/application/rules/package-json-workspace-dependency-rule.d.ts +5 -0
  21. package/dist/application/rules/package-json-workspace-dependency-rule.d.ts.map +1 -0
  22. package/dist/application/rules/package-json-workspace-dependency-rule.js +5 -0
  23. package/dist/application/rules/package-json-workspace-dependency-rule.js.map +1 -0
  24. package/dist/application/rules/public-api-compatibility-rule.d.ts +3 -1
  25. package/dist/application/rules/public-api-compatibility-rule.d.ts.map +1 -1
  26. package/dist/application/rules/public-api-compatibility-rule.js +16 -11
  27. package/dist/application/rules/public-api-compatibility-rule.js.map +1 -1
  28. package/dist/application/rules/yarn-lockfile-rule.d.ts +12 -0
  29. package/dist/application/rules/yarn-lockfile-rule.d.ts.map +1 -0
  30. package/dist/application/rules/yarn-lockfile-rule.js +106 -0
  31. package/dist/application/rules/yarn-lockfile-rule.js.map +1 -0
  32. package/dist/application/services/analyze-test-changes.d.ts.map +1 -1
  33. package/dist/application/services/analyze-test-changes.js +3 -1
  34. package/dist/application/services/analyze-test-changes.js.map +1 -1
  35. package/dist/application/services/workspace-manifest-analysis.d.ts +1 -0
  36. package/dist/application/services/workspace-manifest-analysis.d.ts.map +1 -1
  37. package/dist/application/services/workspace-manifest-analysis.js +2 -2
  38. package/dist/application/services/workspace-manifest-analysis.js.map +1 -1
  39. package/dist/domain/change-contract.d.ts +3 -0
  40. package/dist/domain/change-contract.d.ts.map +1 -1
  41. package/dist/domain/change-contract.js +19 -0
  42. package/dist/domain/change-contract.js.map +1 -1
  43. package/dist/infrastructure/config/json-change-contract-loader.js +13 -1
  44. package/dist/infrastructure/config/json-change-contract-loader.js.map +1 -1
  45. package/dist/infrastructure/config/write-change-contract.d.ts +4 -0
  46. package/dist/infrastructure/config/write-change-contract.d.ts.map +1 -0
  47. package/dist/infrastructure/config/write-change-contract.js +24 -0
  48. package/dist/infrastructure/config/write-change-contract.js.map +1 -0
  49. package/dist/infrastructure/git/git-file-snapshot-source.js +1 -1
  50. package/dist/infrastructure/git/git-file-snapshot-source.js.map +1 -1
  51. package/dist/infrastructure/typescript/typescript-property-type-compatibility.d.ts +6 -0
  52. package/dist/infrastructure/typescript/typescript-property-type-compatibility.d.ts.map +1 -0
  53. package/dist/infrastructure/typescript/typescript-property-type-compatibility.js +72 -0
  54. package/dist/infrastructure/typescript/typescript-property-type-compatibility.js.map +1 -0
  55. package/dist/infrastructure/yarn/yarn-lock-parser.d.ts +6 -0
  56. package/dist/infrastructure/yarn/yarn-lock-parser.d.ts.map +1 -0
  57. package/dist/infrastructure/yarn/yarn-lock-parser.js +77 -0
  58. package/dist/infrastructure/yarn/yarn-lock-parser.js.map +1 -0
  59. package/dist/presentation/analyze-repository.d.ts.map +1 -1
  60. package/dist/presentation/analyze-repository.js +7 -3
  61. package/dist/presentation/analyze-repository.js.map +1 -1
  62. package/dist/presentation/cli/arguments.d.ts +13 -1
  63. package/dist/presentation/cli/arguments.d.ts.map +1 -1
  64. package/dist/presentation/cli/arguments.js +82 -0
  65. package/dist/presentation/cli/arguments.js.map +1 -1
  66. package/dist/presentation/cli/main.js +34 -0
  67. package/dist/presentation/cli/main.js.map +1 -1
  68. package/dist/presentation/cli/text-report.js +3 -0
  69. package/dist/presentation/cli/text-report.js.map +1 -1
  70. package/dist/presentation/html/html-report.d.ts.map +1 -1
  71. package/dist/presentation/html/html-report.js +84 -14
  72. package/dist/presentation/html/html-report.js.map +1 -1
  73. package/package.json +1 -1
package/README.ko.md CHANGED
@@ -19,9 +19,24 @@ IntentPatch는 이러한 질문에 답하기 위해 **Git diff, 정적 분석,
19
19
  LLM 없이도 재현 가능한 분석을 제공하고, AI 설명 기능은 선택적으로 결합하는 것을 목표로
20
20
  합니다.
21
21
 
22
+ ## 실제 보고서 바로 보기
23
+
24
+ 저장소를 복제한 뒤 실제 커밋 하나를 분석하는 명령을 실행합니다.
25
+
26
+ ```bash
27
+ git clone https://github.com/xx2xxjaeil/intent-patch.git
28
+ cd intent-patch
29
+ npx --yes intentpatch@0.9.0 analyze --base '1cc489b^' --head 1cc489b --format html --output intentpatch-report.html
30
+ ```
31
+
32
+ 생성된 `intentpatch-report.html`을 로컬 브라우저에서 여세요. 이 변경에서는 나중에 수정된
33
+ 공개 API 위험과 중복 코드 후보가 보고됩니다. 판단 근거는 [실제 변경 사례](./docs/real-world-evaluation.md)에
34
+ 정리했고, [저장된 HTML 보고서](./docs/examples/intent-input-change.html)도 확인할 수 있습니다.
35
+ GitHub에서는 HTML 화면 대신 소스가 보일 수 있습니다.
36
+
22
37
  ## 빠른 시작
23
38
 
24
- Node.js 20 이상과 Git이 설치되어 있어야 합니다. npm에 공개된 v0.7.0은 전역 설치 없이
39
+ Node.js 20 이상과 Git이 설치되어 있어야 합니다. npm에 공개된 v0.9.0은 전역 설치 없이
25
40
  실행할 수 있습니다.
26
41
 
27
42
  ```bash
@@ -67,7 +82,7 @@ jobs:
67
82
 
68
83
  - name: Analyze pull request
69
84
  id: intentpatch
70
- uses: xx2xxjaeil/intent-patch@v0.7.0
85
+ uses: xx2xxjaeil/intent-patch@v0.9.0
71
86
  with:
72
87
  fail-on: high
73
88
 
@@ -79,9 +94,11 @@ jobs:
79
94
  path: intentpatch-report
80
95
  ```
81
96
 
82
- Action은 릴리스 버전이나 불변 commit SHA로 고정하는 방식을 권장합니다. v0.7.0에는
97
+ Action은 릴리스 버전이나 불변 commit SHA로 고정하는 방식을 권장합니다. v0.9.0에는 Yarn
98
+ workspace dependency 분석과 Change Contract를 안전하게 만드는 `init` 명령이 추가되었습니다.
99
+ Yarn 4 lockfile 분석, 소스와 테스트의 명시적 연결, 보고서 필터와 영향 그래프 탐색 개선,
83
100
  패키지 진입점 기준 공개 API 경고, 삭제된 모듈의 이전 import 영향 분석, 선택적 Claude Code·Codex·Cursor
84
- Hook이 포함됩니다. 공개 API 규칙의 별도 외부 평가 결과와 한계는
101
+ Hook도 사용할 수 있습니다. 공개 API 규칙의 별도 외부 평가 결과와 한계는
85
102
  [평가 보고서](./docs/external-repository-evaluation.md)에 기록했습니다. `@main`은 미릴리스 변경을 따라갑니다.
86
103
  Action은 PR·push 이벤트의 commit 범위를 자동으로 선택하고 다음 결과를 남깁니다.
87
104
 
@@ -101,6 +118,7 @@ Action은 PR·push 이벤트의 commit 범위를 자동으로 선택하고 다
101
118
  ## Codex·Cursor Hook
102
119
 
103
120
  v0.7.0부터 선택형 [Codex](./docs/codex.md)·[Cursor](./docs/cursor.md) 턴 분석을 사용할 수 있습니다. 동일한 결정론적 분석기를 사용하며 API 키나 유료 모델은 필요하지 않습니다. Codex는 Hook에 개수만 요약하고, Cursor는 Git 메타데이터에 비공개 HTML 보고서를 저장한 뒤 경로를 로그로 남깁니다. Cursor에 새 AI 요청을 자동 제출하지 않습니다.
121
+ [Hook 스모크 테스트 체크리스트](./docs/hook-smoke-test.md)는 패키지 CLI 테스트와 실제 앱 테스트를 구분합니다.
104
122
 
105
123
  ## 프로젝트가 지향하는 결과
106
124
 
@@ -139,15 +157,15 @@ LOW 구현체가 하나뿐인 추상화 추가
139
157
 
140
158
  실제 커밋을 분석한 [독립 실행형 HTML 예시](./docs/examples/intent-input-change.html),
141
159
  [자체 저장소 변경 3건의 사례 연구](./docs/real-world-evaluation.md),
142
- [외부 저장소 변경 26건·규칙별 판정 29건의 평가 결과](./docs/external-repository-evaluation.md)를 볼 수 있습니다. 저장소를 clone한
160
+ [외부 저장소 변경 32건·규칙별 판정 38건의 평가 결과](./docs/external-repository-evaluation.md)를 볼 수 있습니다. 저장소를 clone한
143
161
  뒤 HTML 파일을 브라우저에서 열어 주세요. GitHub 파일 화면은 렌더링 대신 소스를 보여줄 수
144
162
  있습니다.
145
163
 
146
164
  ## 현재 구현된 기능
147
165
 
148
- 현재 소스는 Git 변경사항 수집, 루트·npm workspace `package.json`의 직접 dependency와 npm lockfile 분석, TypeScript
149
- 최상위 TypeScript·JavaScript 심볼과 공개 export 변경 분석, 기존 구현 중복·단일 구현 추상화 신호, import graph 기반
150
- 영향 범위와 테스트 동반 변경 분석을 제공합니다.
166
+ CLI는 Git 변경사항, 루트 및 npm·pnpm·Yarn workspace manifest의 직접 dependency,
167
+ lockfile 변경, 최상위 TypeScript·JavaScript 심볼과 공개 export, 기존 구현 중복·단일 구현
168
+ 추상화 신호, import graph 기반 영향 범위와 테스트 동반 변경을 분석합니다.
151
169
 
152
170
  - `HEAD`와 현재 working tree 비교
153
171
  - 두 Git reference 또는 브랜치 비교
@@ -157,7 +175,7 @@ LOW 구현체가 하나뿐인 추상화 추가
157
175
  - working tree 분석 시 untracked 파일 포함
158
176
  - 터미널용 텍스트 보고서
159
177
  - 후속 도구 연동을 위한 JSON 보고서
160
- - 요약 카드, finding, 테스트 신호와 영향 그래프를 담은 단일 HTML 보고서
178
+ - 요약 카드, 경로·심각도 필터, finding, 테스트 신호와 탐색 가능한 영향 그래프를 담은 단일 HTML 보고서
161
179
  - 외부 CDN이나 JavaScript dependency가 필요 없는 인라인 CSS·SVG 시각화
162
180
  - production·development dependency 추가 탐지
163
181
  - dependency 삭제, 버전 변경, 섹션 이동 탐지
@@ -168,6 +186,7 @@ LOW 구현체가 하나뿐인 추상화 추가
168
186
  - pnpm `pnpm-lock.yaml` v9의 레지스트리 패키지 추가·삭제·버전 변경 비교(2개 문서 형식 포함)
169
187
  - 잘못되었거나 미지원인 lockfile을 누락하지 않고 finding으로 보고
170
188
  - 루트 `workspaces` 패턴에 속한 변경 manifest의 직접 dependency를 workspace별로 보고
189
+ - 루트 `workspaces` 패턴에 속한 Yarn workspace manifest 변경도 분석하고 Yarn 근거를 표시
171
190
  - `pnpm-workspace.yaml`의 포함·제외 패턴에 속한 변경 manifest의 직접 dependency를 보고
172
191
  - workspace 설정 변경과 manifest의 workspace 안팎 이동을 탐지
173
192
  - finding 심각도(`high`, `medium`, `low`) 집계
@@ -197,7 +216,7 @@ LOW 구현체가 하나뿐인 추상화 추가
197
216
  - CLI 요청 문서 또는 선택적으로 GitHub PR 본문에서 요청 의도를 입력
198
217
  - 예상·허용 패턴을 벗어난 변경 파일을 파일별 `medium` finding으로 탐지
199
218
  - 변경 파일 수와 측정 라인 예산 초과를 수치 근거가 있는 `low` finding으로 탐지
200
- - Contract가 지정한 소스·테스트 경로를 분류하고 파일명 기준으로 관련 변경 연결
219
+ - Contract가 지정한 소스·테스트 경로를 분류하고 파일명 또는 명시적 매핑으로 관련 변경 연결
201
220
  - 테스트 변경 수와 추가·삭제 수를 별도의 분석 사실로 집계
202
221
  - 관련 테스트 변경이 없는 소스 파일을 `medium` finding으로 탐지
203
222
  - `*`, `**`, `?` 기반의 저장소 상대 경로 패턴 지원
@@ -261,6 +280,21 @@ intentpatch analyze --intent-file request.md --format html --output report.html
261
280
 
262
281
  ### Change Contract로 요청 범위 검사
263
282
 
283
+ `intentpatch init` 명령은 기존 파일을 덮어쓰지 않고 `.intentpatch.json`을 생성합니다.
284
+ 자연어 요청만으로 경로를 추측하지 않으므로 이번 작업의 실제 경로를 전달하세요.
285
+
286
+ ```bash
287
+ intentpatch init \
288
+ --intent "회원 탈퇴 기능 구현" \
289
+ --include 'src/user/**' --include 'tests/user/**' \
290
+ --allow package.json \
291
+ --test-source 'src/**/*.ts' --test-file 'tests/**/*.test.ts'
292
+ ```
293
+
294
+ 인자 없이 실행하면 비어 있지만 유효한 계약을 생성합니다. `scope.include` 경로를 지정하기
295
+ 전까지 범위 검사는 꺼져 있고, 테스트 변경 검사는 `--test-source`와 `--test-file`을 함께
296
+ 지정해야 켜집니다. 다른 디렉터리는 `--cwd`로 지정합니다. 이 명령은 v0.9.0부터 제공됩니다.
297
+
264
298
  분석할 저장소의 `.intentpatch.json`에 이번 요청의 기대 범위를 선언할 수 있습니다.
265
299
 
266
300
  ```json
@@ -287,9 +321,14 @@ intentpatch analyze --intent-file request.md --format html --output report.html
287
321
  - `tests.requireFor`: 테스트 동반 변경을 확인할 소스 경로
288
322
  - `tests.include`: 테스트 파일로 분류할 경로
289
323
  - `tests.exclude`: 생성 파일이나 선언 파일처럼 검사에서 제외할 소스 경로
324
+ - `tests.related`: 소스 파일의 정확한 경로와 관련 테스트 경로 패턴의 명시적 연결.
325
+ 해당 소스에는 파일명 기반 자동 연결 대신 이 설정을 적용합니다.
290
326
 
291
- 테스트 연결은 결정적인 결과를 위해 파일명을 사용합니다. 예를 들어 `src/user.ts`는
327
+ 명시적 연결이 없으면 테스트 연결은 결정적인 결과를 위해 파일명을 사용합니다. 예를 들어 `src/user.ts`는
292
328
  `tests/user.test.ts`, `user.spec.ts`, `user.integration.test.ts` 같은 변경과 연결됩니다.
329
+ 이름이 다른 통합 테스트는 `tests` 객체 안에
330
+ `"related": { "src/user.ts": ["tests/account-deletion*.test.ts"] }`처럼 지정할 수 있습니다.
331
+ `tests.include`에 속한 변경 테스트만 인정합니다.
293
332
 
294
333
  기본 파일 대신 별도 계약을 사용하려면 `--config`를 지정합니다. 상대 경로는 `--cwd`를 기준으로
295
334
  해석합니다.
@@ -420,7 +459,7 @@ npm run check
420
459
  - 생성한 npm tarball을 임시 프로젝트에 설치하고 실행하는 패키지 통합 테스트
421
460
  - 계층 간 의존 방향을 검증하는 아키텍처 테스트
422
461
 
423
- 외부 저장소의 실제 변경 26건에서 공개 API 규칙 4개의 경고를 사람이 검토한 기대 결과와 비교하는
462
+ 외부 저장소의 실제 변경 32건에서 공개 API·의존성·범위·테스트 규칙의 경고를 사람이 검토한 기대 결과와 비교하는
424
463
  방법은 [외부 저장소 평가 문서](./docs/external-repository-evaluation.md)에 정리했습니다.
425
464
 
426
465
  프로덕션 빌드만 확인하려면 다음 명령을 사용합니다.
@@ -437,7 +476,7 @@ npm pack --dry-run
437
476
 
438
477
  ## 릴리스
439
478
 
440
- `v0.7.0`처럼 `package.json` 버전과 일치하는 태그를 기본 브랜치의 커밋에 push하면 릴리스
479
+ `v0.9.0`처럼 `package.json` 버전과 일치하는 태그를 기본 브랜치의 커밋에 push하면 릴리스
441
480
  워크플로가 다음 작업을 순서대로 수행합니다.
442
481
 
443
482
  1. 태그·버전·기본 브랜치 포함 여부 검증
@@ -464,7 +503,8 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
464
503
  - ✅ npm workspace manifest의 직접 dependency 변경
465
504
  - ✅ pnpm `pnpm-lock.yaml` v9의 레지스트리 패키지 변경
466
505
  - ✅ pnpm workspace manifest의 직접 dependency 변경
467
- - Yarn adapter
506
+ - ✅ Yarn 4 metadata-v8 `yarn.lock` 레지스트리 패키지 변경
507
+ - ✅ Yarn workspace manifest의 직접 dependency 변경
468
508
  7. ✅ 직접 export된 공개 심볼 삭제와 export 해제 탐지
469
509
  - ✅ JavaScript ESM의 이름 있는 export·default export 삭제 탐지
470
510
  8. ✅ 단일 HTML 대시보드와 SVG 기반 dependency 영향 그래프
@@ -482,7 +522,7 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
482
522
  - 분석 대상은 최소 한 번 이상 커밋된 Git 저장소여야 합니다.
483
523
  - untracked symbolic link는 안전을 위해 내용을 읽지 않습니다.
484
524
  - 10 MiB를 초과하는 untracked 파일은 라인 수를 측정하지 않습니다.
485
- - 직접 dependency 선언 분석은 저장소 루트와 변경된 npm·pnpm workspace `package.json`의
525
+ - 직접 dependency 선언 분석은 저장소 루트와 변경된 npm·pnpm·Yarn workspace `package.json`의
486
526
  `dependencies`와 `devDependencies`를 대상으로 합니다.
487
527
  - 정적 참조 없음 finding은 미사용 확정이 아닌 검토 후보입니다. 유지보수 대상 JS/TS
488
528
  소스의 명시적 import·re-export·문자열 `require()`·`import()`를 살펴봅니다. CLI나 설정
@@ -493,13 +533,19 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
493
533
  - pnpm `pnpm-lock.yaml` v9은 프로젝트 문서의 레지스트리 패키지 ID와 버전을 비교합니다.
494
534
  integrity만 바뀐 경우, 로컬·Git 패키지, snapshot의 peer 변형, 부모 dependency 귀속은 분석하지 않습니다.
495
535
  루트의 직접 dependency 여부는 루트 importer를 기준으로 표시합니다.
496
- - workspace 판별은 루트의 npm `workspaces` 배열과 명시 경로, `*`·`**`·`?` 패턴을 지원합니다.
536
+ - npm·Yarn workspace 판별은 루트의 `workspaces` 배열과 명시 경로, `*`·`**`·`?` 패턴을 지원합니다.
497
537
  부정·중괄호·문자 클래스 패턴은 미지원 finding으로 보고합니다.
538
+ - Yarn 여부는 루트 `packageManager` 또는 `yarn.lock`으로 구분합니다. pnpm 설정이 함께
539
+ 있으면 중복 보고를 막기 위해 pnpm을 우선합니다.
498
540
  - pnpm workspace는 `pnpm-workspace.yaml`의 `packages`에 명시한 `*`·`**`·`?`와 선행 `!`
499
541
  제외 패턴을 지원합니다. npm 설정이 함께 있으면 중복 보고를 막기 위해 pnpm 설정을
500
542
  우선합니다. 그 외 glob 문법과 catalog는 해석하지 않습니다.
501
- - Yarn lockfile과 런타임에서의 실제 dependency 사용 여부는 아직 분석하지 않습니다.
502
- - working tree의 `package-lock.json`·`pnpm-lock.yaml`은 10 MiB, 그 외 텍스트 snapshot은 1 MiB로 제한합니다.
543
+ - Yarn 4 metadata-v8 `yarn.lock`의 레지스트리 패키지 해석 결과와 버전은 비교합니다.
544
+ Yarn Classic·다른 metadata 버전은 미지원으로 보고합니다. workspace·patch·file·Git·virtual
545
+ 해석 결과, checksum만 바뀐 경우, 부모 dependency 귀속은 분석하지 않습니다. 런타임에서의 실제
546
+ dependency 사용 여부도 판정하지 않습니다.
547
+ - working tree의 `package-lock.json`·`pnpm-lock.yaml`·`yarn.lock`은 10 MiB,
548
+ 그 외 텍스트 snapshot은 1 MiB로 제한합니다.
503
549
  - TypeScript 심볼 분석은 `.ts`와 `.tsx`의 이름이 있는 최상위 함수, 클래스, 인터페이스, 타입
504
550
  별칭만 지원합니다.
505
551
  - JavaScript 심볼 분석은 `.js`·`.jsx`·`.mjs`·`.cjs`의 최상위 함수·클래스·변수 및 식별 가능한
@@ -520,6 +566,9 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
520
566
  그대로인 기본형 인자가 합집합 타입으로 확장된 경우는 제한적인 구문 검사로도 확인합니다.
521
567
  그 밖의 미해결 타입 이름, 추론된 타입, 파싱할 수 없는 시그니처는 확인 불가로 남겨 검토
522
568
  경고를 유지합니다. 전체 프로젝트의 타입 검사나 런타임 호환성 보증은 아닙니다.
569
+ - 인터페이스 속성 타입은 기존 타입이 같거나 지원하는 객체 리터럴 안에 선택 필드만 추가된
570
+ 경우(`Readonly` 포함)에만 호환된다고 판단합니다. 다른 중첩 타입 변경은 호환을 단정하지
571
+ 않고 검토 경고를 유지합니다.
523
572
  - 중복 구현 후보는 새로 추가된 최상위 함수와 기존 최상위 함수의 토큰이 공백·주석을 제외하고
524
573
  완전히 같으며 본문이 12토큰 이상일 때만 보고합니다. 식별자 이름이 바뀐 유사 코드, 메서드,
525
574
  의미적으로만 같은 구현은 탐지하지 않습니다.
@@ -548,10 +597,12 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
548
597
  0줄이라고 간주하지 않지만, 해당 파일의 크기를 라인 예산에 포함하지도 않습니다.
549
598
  - 테스트 분석은 실행 결과나 코드 커버리지를 측정하지 않고 Contract에 지정된 변경 파일만
550
599
  비교합니다.
551
- - 관련 테스트는 현재 소스와 테스트의 파일명이 같은지로 판단하므로 이름이 다른 통합 테스트나
552
- 하나의 테스트가 여러 소스를 검증하는 관계는 자동으로 연결하지 못합니다.
553
- - HTML 영향 그래프는 변경 모듈과 영향 파일을 결정적인 두 열 레이아웃으로 표시합니다. 노드 이동,
554
- 확대·축소와 필터링을 제공하는 대화형 웹 UI는 아직 구현하지 않았습니다.
600
+ - 관련 테스트는 기본적으로 파일명으로 연결하지만 정확한 소스 경로에 `tests.related`를
601
+ 선언하면 이름이 다른 테스트도 지정할 수 있습니다. 이는 테스트 실행이나 실제 커버리지 측정이
602
+ 아니라 사용자가 선언한 연결입니다.
603
+ - HTML 영향 그래프는 결정적인 두 열 레이아웃이며 노드를 누르면 보고서의 관련 행으로 이동합니다.
604
+ 경로·심각도 필터는 보고서 행만 좁히고 그래프 자체를 필터링하지 않습니다. 노드 이동과 확대·축소는
605
+ 아직 구현하지 않았습니다.
555
606
 
556
607
  ## 라이선스
557
608
 
package/README.md CHANGED
@@ -16,9 +16,24 @@ AI coding agents such as Codex, Claude Code, and Cursor can change many files fr
16
16
 
17
17
  IntentPatch combines **Git diff analysis, static analysis, and dependency analysis** to answer those questions. Its core analysis is deterministic and works without an LLM. Optional AI explanations can be added later without making the core tool dependent on a model provider.
18
18
 
19
+ ## See a real report
20
+
21
+ Clone the repository, then run one analysis command against a real change in its history:
22
+
23
+ ```bash
24
+ git clone https://github.com/xx2xxjaeil/intent-patch.git
25
+ cd intent-patch
26
+ npx --yes intentpatch@0.9.0 analyze --base '1cc489b^' --head 1cc489b --format html --output intentpatch-report.html
27
+ ```
28
+
29
+ Open `intentpatch-report.html` locally. This case reports a public-API risk and a duplicate-code
30
+ candidate that were later fixed; [the case study](./docs/real-world-evaluation.md) explains the
31
+ review decisions. The [checked-in HTML report](./docs/examples/intent-input-change.html) is the
32
+ same real-change example, not a mockup. GitHub may show the HTML source rather than render it.
33
+
19
34
  ## Quick start
20
35
 
21
- IntentPatch requires Node.js 20 or later and Git. Run the published v0.7.0 CLI without
36
+ IntentPatch requires Node.js 20 or later and Git. Run the published v0.9.0 CLI without
22
37
  installing it globally:
23
38
 
24
39
  ```bash
@@ -62,7 +77,7 @@ jobs:
62
77
 
63
78
  - name: Analyze pull request
64
79
  id: intentpatch
65
- uses: xx2xxjaeil/intent-patch@v0.7.0
80
+ uses: xx2xxjaeil/intent-patch@v0.9.0
66
81
  with:
67
82
  fail-on: high
68
83
 
@@ -74,9 +89,11 @@ jobs:
74
89
  path: intentpatch-report
75
90
  ```
76
91
 
77
- Pin the action to a released version or an immutable commit SHA. v0.7.0 includes
78
- package-entrypoint-aware public API warnings, historical import impact for deleted modules,
79
- and opt-in Claude Code, Codex, and Cursor Hooks.
92
+ Pin the action to a released version or an immutable commit SHA. v0.9.0 adds Yarn workspace
93
+ dependency analysis and a safe `init` command for creating a Change Contract. It also includes
94
+ Yarn 4 lockfile analysis, explicit source-to-test mappings, report filters, improved impact-graph
95
+ navigation, package-entrypoint-aware public API warnings, historical import impact for deleted
96
+ modules, and opt-in Claude Code, Codex, and Cursor Hooks.
80
97
  See [the evaluation report](./docs/external-repository-evaluation.md) for the separately measured
81
98
  public-API rules and their limits. `@main` follows unreleased changes.
82
99
 
@@ -97,6 +114,7 @@ An opt-in Hook adapter captures a turn's original prompt and starting commit, th
97
114
  ## Codex and Cursor Hooks
98
115
 
99
116
  Version 0.7.0 adds opt-in turn analysis for [Codex](./docs/codex.md) and [Cursor](./docs/cursor.md). These adapters use the same deterministic analyzer and require no API key or paid model. Codex returns a count-only Hook message. Cursor writes a private HTML report under Git metadata and logs its path without auto-submitting another AI prompt.
117
+ The [Hook smoke-test checklist](./docs/hook-smoke-test.md) separates packaged CLI checks from live application checks.
100
118
 
101
119
  ## What the report looks like
102
120
 
@@ -135,12 +153,14 @@ Every finding includes the relevant file, a stable rule ID, and evidence for the
135
153
  For reports generated from actual commits, see the
136
154
  [standalone HTML example](./docs/examples/intent-input-change.html), the
137
155
  [three-case self-repository study](./docs/real-world-evaluation.md), and the
138
- [external evaluation of 26 changes and 29 rule checks](./docs/external-repository-evaluation.md). After cloning,
156
+ [external evaluation of 32 changes and 38 rule checks](./docs/external-repository-evaluation.md). After cloning,
139
157
  open the HTML file locally in a browser; GitHub may show its source rather than render it.
140
158
 
141
159
  ## Implemented capabilities
142
160
 
143
- The current source tree analyzes Git changes, direct dependencies in the root `package.json`, top-level TypeScript and JavaScript symbols and public exports, possible duplicate implementations, single-implementation abstractions, import-graph impact, and related test changes.
161
+ The CLI analyzes Git changes, direct dependencies in the root and npm/pnpm/Yarn workspace manifests,
162
+ lockfile changes, top-level TypeScript and JavaScript symbols and public exports, possible duplicate
163
+ implementations, single-implementation abstractions, import-graph impact, and related test changes.
144
164
 
145
165
  ### Git and reporting
146
166
 
@@ -151,7 +171,7 @@ The current source tree analyzes Git changes, direct dependencies in the root `p
151
171
  - Distinguish binary files.
152
172
  - Include untracked files in working-tree analysis.
153
173
  - Render terminal-friendly text and machine-readable JSON reports.
154
- - Generate a standalone HTML report containing summary cards, findings, test signals, and an impact graph.
174
+ - Generate a standalone HTML report containing summary cards, path/severity filters, findings, test signals, and a navigable impact graph.
155
175
  - Render the visualization with inline CSS and SVG, without a CDN or runtime JavaScript dependency.
156
176
  - Aggregate findings by `high`, `medium`, and `low` severity.
157
177
  - Return a CI-friendly exit code through `--fail-on`.
@@ -168,6 +188,7 @@ The current source tree analyzes Git changes, direct dependencies in the root `p
168
188
  - Compare resolved registry package changes in pnpm `pnpm-lock.yaml` v9, including two-document lockfiles.
169
189
  - Report malformed or unsupported lockfiles as findings rather than silently skipping them.
170
190
  - Attribute direct dependency changes to changed npm workspace manifests selected by the root `workspaces` patterns.
191
+ - Attribute changed Yarn workspace manifests using the same root `workspaces` patterns, with Yarn provenance when `packageManager` or `yarn.lock` identifies Yarn.
171
192
  - Analyze changed pnpm workspace manifests selected by `pnpm-workspace.yaml`, including exclusion patterns.
172
193
  - Report changes to workspace patterns and manifest moves into or out of a configured workspace.
173
194
  - Extract top-level named functions, classes, interfaces, and type aliases from `.ts` and `.tsx` files.
@@ -198,7 +219,7 @@ The current source tree analyzes Git changes, direct dependencies in the root `p
198
219
  - Accept a request text/Markdown file through the CLI, or opt in to using the PR body in the GitHub Action.
199
220
  - Report each file outside expected and allowed patterns as a medium-severity finding.
200
221
  - Report file-count and measurable-line budget overruns with numeric evidence.
201
- - Classify source and test paths declared by the contract and connect related changes by basename.
222
+ - Classify source and test paths declared by the contract and connect related changes by basename or an explicit mapping.
202
223
  - Report test file counts and added or deleted tests as separate facts.
203
224
  - Report source files without a related test change as medium-severity findings.
204
225
  - Support repository-relative `*`, `**`, and `?` path patterns.
@@ -254,6 +275,22 @@ intentpatch analyze --intent-file request.md --format html --output report.html
254
275
 
255
276
  ### Check request scope with a Change Contract
256
277
 
278
+ `intentpatch init` creates `.intentpatch.json` without overwriting an
279
+ existing file. Supply actual paths for the requested change; it never guesses scope from the
280
+ request text:
281
+
282
+ ```bash
283
+ intentpatch init \
284
+ --intent "Implement account deletion" \
285
+ --include 'src/user/**' --include 'tests/user/**' \
286
+ --allow package.json \
287
+ --test-source 'src/**/*.ts' --test-file 'tests/**/*.test.ts'
288
+ ```
289
+
290
+ `init` with no options creates a valid blank contract. Scope checks remain off until you add an
291
+ expected `--include` path; test-change checks require both `--test-source` and `--test-file`.
292
+ Use `--cwd` to target another directory. This command is included in v0.9.0 and later.
293
+
257
294
  Create `.intentpatch.json` in the repository being analyzed and declare the expected scope of the request:
258
295
 
259
296
  ```json
@@ -280,8 +317,18 @@ Create `.intentpatch.json` in the repository being analyzed and declare the expe
280
317
  - `tests.requireFor`: source paths that require a related test change;
281
318
  - `tests.include`: paths classified as tests;
282
319
  - `tests.exclude`: generated or declaration files excluded from the source check.
320
+ - `tests.related`: optional exact source paths mapped to related test path patterns; an explicit
321
+ mapping overrides basename matching for that source.
322
+
323
+ Without an explicit mapping, test matching uses basenames for deterministic results. For example,
324
+ `src/user.ts` can match changed files such as `tests/user.test.ts`, `user.spec.ts`, or
325
+ `user.integration.test.ts`. For a differently named integration test, add a mapping:
326
+
327
+ ```json
328
+ "related": { "src/user.ts": ["tests/account-deletion*.test.ts"] }
329
+ ```
283
330
 
284
- Test matching uses basenames for deterministic results. For example, `src/user.ts` can match changed files such as `tests/user.test.ts`, `user.spec.ts`, or `user.integration.test.ts`.
331
+ Place `related` inside the `tests` object. Only changed test files matching `tests.include` count.
285
332
 
286
333
  Use `--config` to select another contract. Relative paths are resolved from `--cwd`:
287
334
 
@@ -410,8 +457,8 @@ This command runs:
410
457
  - architecture tests that enforce dependency direction;
411
458
  - a reproducibility check for the bundled GitHub Action.
412
459
 
413
- For a reproducible check of four public-API rules against 18 reviewed changes in
414
- external repositories, see the [external evaluation](./docs/external-repository-evaluation.md).
460
+ For a reproducible check of 38 rule decisions across 32 reviewed changes in external
461
+ repositories, see the [external evaluation](./docs/external-repository-evaluation.md).
415
462
 
416
463
  Run only the production build with:
417
464
 
@@ -427,7 +474,7 @@ npm pack --dry-run
427
474
 
428
475
  ## Release process
429
476
 
430
- Pushing a tag such as `v0.7.0`, matching the version in `package.json`, from a commit contained in the default branch triggers the release workflow:
477
+ Pushing a tag such as `v0.9.0`, matching the version in `package.json`, from a commit contained in the default branch triggers the release workflow:
431
478
 
432
479
  1. Validate the tag, package version, and default-branch ancestry.
433
480
  2. Run the full quality suite and inspect the npm package with a dry run.
@@ -450,7 +497,8 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
450
497
  - ✅ npm workspace manifest dependency changes
451
498
  - ✅ pnpm `pnpm-lock.yaml` v9 resolved registry package changes
452
499
  - ✅ pnpm workspace manifest dependency changes
453
- - Yarn adapter
500
+ - ✅ Yarn 4 metadata-v8 `yarn.lock` resolved registry package changes
501
+ - ✅ Yarn workspace manifest dependency changes
454
502
  7. ✅ Detection of removed public exports
455
503
  - ✅ Named and default ESM exports in JavaScript, without inferred type compatibility
456
504
  8. ✅ Standalone HTML dashboard and SVG dependency-impact graph
@@ -468,17 +516,23 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
468
516
  - The target must be a Git repository with at least one commit.
469
517
  - Untracked symbolic links are not read for safety.
470
518
  - Line counts are skipped for untracked files larger than 10 MiB.
471
- - Direct dependency declarations are analyzed from `dependencies` and `devDependencies` in the root `package.json` and changed npm/pnpm workspace manifests.
519
+ - Direct dependency declarations are analyzed from `dependencies` and `devDependencies` in the root `package.json` and changed npm/pnpm/Yarn workspace manifests.
472
520
  - The no-static-reference finding is a review candidate, not proof that a package is unused. It checks explicit JS/TS imports, re-exports, literal `require()` and `import()` across maintained source files; CLI-only/configuration usage may not appear. It does not emit a candidate if source reads or parsing are incomplete, a computed module load exists, no source was scanned, or more than 5,000 source files are present.
473
521
  - npm `package-lock.json` v2/v3 analysis compares installed package paths and versions, not dependency provenance, integrity hashes, or vulnerability data. It does not attribute transitive packages to their parents.
474
522
  - pnpm `pnpm-lock.yaml` v9 analysis compares registry package IDs and versions in the project document. It ignores integrity-only edits, local/Git packages, snapshot peer variants, and dependency provenance. Root-direct evidence comes from the root importer only.
475
- - Workspace detection supports the root npm `workspaces` array with explicit paths and `*`, `**`, and `?` globs. Negation, brace, and character-class patterns are reported as unsupported.
523
+ - npm and Yarn workspace detection supports the root `workspaces` array with explicit paths and `*`, `**`, and `?` globs. Negation, brace, and character-class patterns are reported as unsupported. Yarn is identified by the root `packageManager` field or `yarn.lock`; when pnpm config also exists, pnpm takes precedence.
476
524
  - pnpm workspace detection reads `pnpm-workspace.yaml` `packages` patterns with `*`, `**`, `?`, and leading `!` exclusions. When both npm and pnpm workspace settings exist, pnpm settings take precedence to avoid duplicate findings. Other glob features and pnpm catalogs are not interpreted.
477
- - Yarn lockfiles and runtime dependency usage are not analyzed yet.
478
- - Working-tree `package-lock.json` and `pnpm-lock.yaml` files are limited to 10 MiB; other text snapshots retain the 1 MiB limit.
525
+ - Yarn 4 `yarn.lock` metadata-v8 analysis compares registry package resolutions and versions.
526
+ Yarn Classic and other metadata versions are reported as unsupported. Workspace, patch, file,
527
+ Git, and virtual resolutions, checksum-only changes, and dependency provenance are not analyzed.
528
+ Runtime dependency usage is not established.
529
+ - Working-tree `package-lock.json`, `pnpm-lock.yaml`, and `yarn.lock` files are limited to 10 MiB; other text snapshots retain the 1 MiB limit.
479
530
  - TypeScript symbol analysis supports named top-level functions, classes, interfaces, and type aliases in `.ts` and `.tsx` files. JavaScript symbol analysis supports named top-level functions, classes, variables, and identifiable ESM exports in `.js`, `.jsx`, `.mjs`, and `.cjs` files.
480
531
  - TypeScript public API analysis supports named top-level functions and interfaces, plus member removal from exported object type aliases composed of type literals and same-file, non-generic aliases/intersections. Local `export { name }`, external `export { name } from`, and `export * from` are tracked as export evidence. JavaScript supports identifiable named and default ESM export removal, but does not infer function signatures. Previous root or nested package `exports` are followed through explicit source targets and relative re-exports. This is a file-level approximation: a named re-export may still expose only some symbols from its module. If an entrypoint is generated, unresolved, or unsupported, IntentPatch retains the earlier conservative warnings instead of claiming a file is private. CommonJS `module.exports`, class contracts, generic alias instantiation, unions, cross-file type references, and full type assignability are not interpreted yet. Unsupported type-alias shapes do not produce member-removal findings.
481
532
  - Function compatibility first compares recorded signatures. For self-contained, explicitly typed declarations it then uses strict TypeScript assignability to avoid warning on compatible changes. A narrow syntactic check also accepts primitive parameters widened by union arms when the return text is unchanged. Other unresolved names, inferred types, malformed or unsupported signature shapes remain unverified and keep the review warning; this is not a whole-project type check or a runtime compatibility guarantee.
533
+ - Interface property compatibility recognizes unchanged types and optional fields added inside
534
+ supported object literals, including `Readonly` wrappers. Other nested type transformations
535
+ remain unverified rather than being treated as compatible.
482
536
  - Duplicate candidates require a newly added top-level function and an existing top-level function to have exactly the same normalized tokens after comments and whitespace are removed, with at least 12 body tokens. Renamed identifiers, methods, and semantically equivalent implementations are not detected.
483
537
  - A single-implementation abstraction is reported only when exactly one named class explicitly uses `implements` for a new interface. Structural implementation, factory return types, and runtime registration are not calculated.
484
538
  - Methods, TypeScript variable declarations, enums, and nested declarations are not included in symbol analysis.
@@ -494,8 +548,11 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
494
548
  - Path patterns support only repository-relative `*`, `**`, and `?`; negation and brace expansion are not supported.
495
549
  - `maxLines` sums only measurable added and deleted lines in text files. Binary or unmeasurable files are not treated as zero lines, but their size is not included in the budget.
496
550
  - Test analysis compares only the changed paths declared in the contract; it does not execute tests or measure coverage.
497
- - Related tests are matched by basename. Integration tests with different names or one test covering several source files cannot be linked automatically yet.
498
- - The HTML impact graph uses a deterministic two-column layout. Interactive node movement, zooming, and filtering are not implemented yet.
551
+ - Related tests are matched by basename unless an exact source path has a `tests.related`
552
+ mapping. This is a declared relationship, not inferred test coverage; tests are not executed.
553
+ - The HTML impact graph uses a deterministic two-column layout. Nodes link to report rows; path
554
+ search and severity filters narrow report rows, not the graph itself. Node movement and zoom
555
+ are not implemented.
499
556
 
500
557
  ## License
501
558
 
@@ -0,0 +1,5 @@
1
+ /** 기존 객체 타입에 선택 필드만 더해졌는지 보수적으로 판정한다. */
2
+ export interface PropertyTypeCompatibility {
3
+ preservesOptionalObjectExtensions(previous: string, current: string): boolean;
4
+ }
5
+ //# sourceMappingURL=property-type-compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-type-compatibility.d.ts","sourceRoot":"","sources":["../../../src/application/ports/property-type-compatibility.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,WAAW,yBAAyB;IACxC,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=property-type-compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-type-compatibility.js","sourceRoot":"","sources":["../../../src/application/ports/property-type-compatibility.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ /** Yarn 4 lockfile에서 검증된 레지스트리 해석 결과만 전달한다. */
2
+ export interface YarnLockedPackage {
3
+ readonly id: string;
4
+ readonly name: string;
5
+ readonly version: string;
6
+ readonly rootDirect: boolean;
7
+ }
8
+ export type YarnLockParseResult = Readonly<{
9
+ ok: true;
10
+ packages: ReadonlyMap<string, YarnLockedPackage>;
11
+ }> | Readonly<{
12
+ ok: false;
13
+ kind: "invalid" | "unsupported";
14
+ reason: string;
15
+ }>;
16
+ export interface YarnLockParser {
17
+ parse(content: string): YarnLockParseResult;
18
+ }
19
+ //# sourceMappingURL=yarn-lock-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yarn-lock-parser.d.ts","sourceRoot":"","sources":["../../../src/application/ports/yarn-lock-parser.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAAE,CAAC,GACxE,QAAQ,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAAC;CAC7C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=yarn-lock-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yarn-lock-parser.js","sourceRoot":"","sources":["../../../src/application/ports/yarn-lock-parser.ts"],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import { isMaintainedSourcePath } from "../services/is-maintained-source-path.js";
2
- import { NpmWorkspaceDependencyRule } from "./npm-workspace-dependency-rule.js";
3
2
  import { PackageDependencyRule } from "./package-dependency-rule.js";
3
+ import { PackageJsonWorkspaceDependencyRule } from "./package-json-workspace-dependency-rule.js";
4
4
  import { PnpmWorkspaceDependencyRule } from "./pnpm-workspace-dependency-rule.js";
5
5
  const rootManifest = "package.json";
6
6
  /** 새 직접 dependency의 정적 소스 참조가 없을 때만 검토 후보를 제시한다. */
@@ -18,7 +18,7 @@ export class AddedDependencyUsageRule {
18
18
  async analyze(context) {
19
19
  const manifestFindings = (await Promise.all([
20
20
  new PackageDependencyRule(this.snapshots, rootManifest).analyze(context),
21
- new NpmWorkspaceDependencyRule(this.snapshots).analyze(context),
21
+ new PackageJsonWorkspaceDependencyRule(this.snapshots).analyze(context),
22
22
  new PnpmWorkspaceDependencyRule(this.snapshots, this.pnpmWorkspaceParser).analyze(context),
23
23
  ])).flat();
24
24
  const added = manifestFindings.filter((finding) => finding.ruleId === "dependency/new-production" ||
@@ -1 +1 @@
1
- {"version":3,"file":"added-dependency-usage-rule.js","sourceRoot":"","sources":["../../../src/application/rules/added-dependency-usage-rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"added-dependency-usage-rule.js","sourceRoot":"","sources":["../../../src/application/rules/added-dependency-usage-rule.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"missing-test-change-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/missing-test-change-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE/E,oDAAoD;AACpD,qBAAa,qBAAsB,YAAW,YAAY;IAC3C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CAsB5E"}
1
+ {"version":3,"file":"missing-test-change-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/missing-test-change-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE/E,oDAAoD;AACpD,qBAAa,qBAAsB,YAAW,YAAY;IAC3C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CA2B5E"}
@@ -8,18 +8,23 @@ export class MissingTestChangeRule {
8
8
  const testPatterns = context.contract?.tests?.include.join(", ") ?? "";
9
9
  return testChanges.sourceCoverage
10
10
  .filter((coverage) => coverage.matchingTests.length === 0)
11
- .map((coverage) => ({
12
- ruleId: "tests/missing-related-change",
13
- severity: "medium",
14
- title: "Source change without matching test change",
15
- description: `${coverage.sourcePath} changed without a changed test sharing the same basename.`,
16
- file: coverage.sourcePath,
17
- evidence: {
18
- sourceChangeKind: coverage.sourceChangeKind,
19
- matchingStrategy: "basename",
20
- testPatterns,
21
- },
22
- }));
11
+ .map((coverage) => {
12
+ const explicit = Object.hasOwn(context.contract?.tests?.related ?? {}, coverage.sourcePath);
13
+ return {
14
+ ruleId: "tests/missing-related-change",
15
+ severity: "medium",
16
+ title: "Source change without matching test change",
17
+ description: explicit
18
+ ? `${coverage.sourcePath} changed without a changed test from its explicit related-test mapping.`
19
+ : `${coverage.sourcePath} changed without a changed test sharing the same basename.`,
20
+ file: coverage.sourcePath,
21
+ evidence: {
22
+ sourceChangeKind: coverage.sourceChangeKind,
23
+ matchingStrategy: explicit ? "explicit" : "basename",
24
+ testPatterns,
25
+ },
26
+ };
27
+ });
23
28
  }
24
29
  }
25
30
  //# sourceMappingURL=missing-test-change-rule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"missing-test-change-rule.js","sourceRoot":"","sources":["../../../src/application/rules/missing-test-change-rule.ts"],"names":[],"mappings":"AAGA,oDAAoD;AACpD,MAAM,OAAO,qBAAqB;IACzB,KAAK,CAAC,OAAO,CAAC,OAAwB;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO,WAAW,CAAC,cAAc;aAC9B,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;aACzD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClB,MAAM,EAAE,8BAA8B;YACtC,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,4CAA4C;YACnD,WAAW,EAAE,GAAG,QAAQ,CAAC,UAAU,4DAA4D;YAC/F,IAAI,EAAE,QAAQ,CAAC,UAAU;YACzB,QAAQ,EAAE;gBACR,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;gBAC3C,gBAAgB,EAAE,UAAU;gBAC5B,YAAY;aACb;SACF,CAAC,CAAC,CAAC;IACR,CAAC;CACF"}
1
+ {"version":3,"file":"missing-test-change-rule.js","sourceRoot":"","sources":["../../../src/application/rules/missing-test-change-rule.ts"],"names":[],"mappings":"AAGA,oDAAoD;AACpD,MAAM,OAAO,qBAAqB;IACzB,KAAK,CAAC,OAAO,CAAC,OAAwB;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO,WAAW,CAAC,cAAc;aAC9B,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;aACzD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5F,OAAO;gBACL,MAAM,EAAE,8BAA8B;gBACtC,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,4CAA4C;gBACnD,WAAW,EAAE,QAAQ;oBACnB,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,yEAAyE;oBACjG,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,4DAA4D;gBACtF,IAAI,EAAE,QAAQ,CAAC,UAAU;gBACzB,QAAQ,EAAE;oBACR,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;oBAC3C,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;oBACpD,YAAY;iBACb;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACP,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  import type { Finding } from "../../domain/finding.js";
2
2
  import type { AnalysisContext, AnalysisRule } from "../ports/analysis-rule.js";
3
3
  import type { FileSnapshotSource } from "../ports/file-snapshot-source.js";
4
- /** npm workspaces에 속한 변경 manifest를 찾아 기존 직접 dependency 규칙으로 분석한다. */
4
+ /** 기존 공개 클래스명을 유지하며 package.json workspaces를 npm 또는 Yarn으로 분류한다. */
5
5
  export declare class NpmWorkspaceDependencyRule implements AnalysisRule {
6
6
  private readonly snapshots;
7
7
  constructor(snapshots: FileSnapshotSource);
@@ -1 +1 @@
1
- {"version":3,"file":"npm-workspace-dependency-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/npm-workspace-dependency-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAY3E,qEAAqE;AACrE,qBAAa,0BAA2B,YAAW,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,kBAAkB;IAEpD,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CAsD5E"}
1
+ {"version":3,"file":"npm-workspace-dependency-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/npm-workspace-dependency-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAY3E,oEAAoE;AACpE,qBAAa,0BAA2B,YAAW,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,kBAAkB;IAEpD,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CA+D5E"}