intentpatch 0.4.0 → 0.6.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 (85) hide show
  1. package/README.ko.md +41 -20
  2. package/README.md +27 -15
  3. package/dist/application/ports/agent-intent-session-store.d.ts +11 -0
  4. package/dist/application/ports/agent-intent-session-store.d.ts.map +1 -0
  5. package/dist/application/ports/agent-intent-session-store.js +2 -0
  6. package/dist/application/ports/agent-intent-session-store.js.map +1 -0
  7. package/dist/application/ports/function-signature-compatibility.d.ts +8 -0
  8. package/dist/application/ports/function-signature-compatibility.d.ts.map +1 -0
  9. package/dist/application/ports/function-signature-compatibility.js +2 -0
  10. package/dist/application/ports/function-signature-compatibility.js.map +1 -0
  11. package/dist/application/ports/module-alias-resolver.d.ts +2 -1
  12. package/dist/application/ports/module-alias-resolver.d.ts.map +1 -1
  13. package/dist/application/ports/project-file-source.d.ts +4 -3
  14. package/dist/application/ports/project-file-source.d.ts.map +1 -1
  15. package/dist/application/ports/public-api-boundary.d.ts +6 -0
  16. package/dist/application/ports/public-api-boundary.d.ts.map +1 -0
  17. package/dist/application/ports/public-api-boundary.js +2 -0
  18. package/dist/application/ports/public-api-boundary.js.map +1 -0
  19. package/dist/application/rules/public-api-compatibility-rule.d.ts +4 -1
  20. package/dist/application/rules/public-api-compatibility-rule.d.ts.map +1 -1
  21. package/dist/application/rules/public-api-compatibility-rule.js +116 -12
  22. package/dist/application/rules/public-api-compatibility-rule.js.map +1 -1
  23. package/dist/application/rules/public-api-removal-rule.d.ts.map +1 -1
  24. package/dist/application/rules/public-api-removal-rule.js +8 -1
  25. package/dist/application/rules/public-api-removal-rule.js.map +1 -1
  26. package/dist/application/services/analyze-import-impact.d.ts +3 -1
  27. package/dist/application/services/analyze-import-impact.d.ts.map +1 -1
  28. package/dist/application/services/analyze-import-impact.js +69 -26
  29. package/dist/application/services/analyze-import-impact.js.map +1 -1
  30. package/dist/application/services/compare-source-symbols.d.ts +3 -1
  31. package/dist/application/services/compare-source-symbols.d.ts.map +1 -1
  32. package/dist/application/services/compare-source-symbols.js +8 -2
  33. package/dist/application/services/compare-source-symbols.js.map +1 -1
  34. package/dist/domain/impact.d.ts +2 -0
  35. package/dist/domain/impact.d.ts.map +1 -1
  36. package/dist/domain/impact.js.map +1 -1
  37. package/dist/domain/symbol-change.d.ts +10 -1
  38. package/dist/domain/symbol-change.d.ts.map +1 -1
  39. package/dist/domain/symbol-change.js +6 -0
  40. package/dist/domain/symbol-change.js.map +1 -1
  41. package/dist/infrastructure/git/git-private-agent-intent-store.d.ts +12 -0
  42. package/dist/infrastructure/git/git-private-agent-intent-store.d.ts.map +1 -0
  43. package/dist/infrastructure/git/git-private-agent-intent-store.js +120 -0
  44. package/dist/infrastructure/git/git-private-agent-intent-store.js.map +1 -0
  45. package/dist/infrastructure/git/git-project-file-source.d.ts +4 -3
  46. package/dist/infrastructure/git/git-project-file-source.d.ts.map +1 -1
  47. package/dist/infrastructure/git/git-project-file-source.js +19 -6
  48. package/dist/infrastructure/git/git-project-file-source.js.map +1 -1
  49. package/dist/infrastructure/typescript/package-exports-api-boundary.d.ts +11 -0
  50. package/dist/infrastructure/typescript/package-exports-api-boundary.d.ts.map +1 -0
  51. package/dist/infrastructure/typescript/package-exports-api-boundary.js +206 -0
  52. package/dist/infrastructure/typescript/package-exports-api-boundary.js.map +1 -0
  53. package/dist/infrastructure/typescript/typescript-config-loader.d.ts +2 -2
  54. package/dist/infrastructure/typescript/typescript-config-loader.d.ts.map +1 -1
  55. package/dist/infrastructure/typescript/typescript-config-loader.js +2 -2
  56. package/dist/infrastructure/typescript/typescript-config-loader.js.map +1 -1
  57. package/dist/infrastructure/typescript/typescript-function-signature-compatibility.d.ts +6 -0
  58. package/dist/infrastructure/typescript/typescript-function-signature-compatibility.d.ts.map +1 -0
  59. package/dist/infrastructure/typescript/typescript-function-signature-compatibility.js +141 -0
  60. package/dist/infrastructure/typescript/typescript-function-signature-compatibility.js.map +1 -0
  61. package/dist/infrastructure/typescript/typescript-module-alias-resolver.d.ts +2 -2
  62. package/dist/infrastructure/typescript/typescript-module-alias-resolver.d.ts.map +1 -1
  63. package/dist/infrastructure/typescript/typescript-module-alias-resolver.js +2 -2
  64. package/dist/infrastructure/typescript/typescript-module-alias-resolver.js.map +1 -1
  65. package/dist/infrastructure/typescript/typescript-symbol-extractor.d.ts.map +1 -1
  66. package/dist/infrastructure/typescript/typescript-symbol-extractor.js +77 -11
  67. package/dist/infrastructure/typescript/typescript-symbol-extractor.js.map +1 -1
  68. package/dist/presentation/analyze-repository.d.ts.map +1 -1
  69. package/dist/presentation/analyze-repository.js +4 -5
  70. package/dist/presentation/analyze-repository.js.map +1 -1
  71. package/dist/presentation/claude-code/hook.d.ts +13 -0
  72. package/dist/presentation/claude-code/hook.d.ts.map +1 -0
  73. package/dist/presentation/claude-code/hook.js +91 -0
  74. package/dist/presentation/claude-code/hook.js.map +1 -0
  75. package/dist/presentation/cli/arguments.d.ts +6 -1
  76. package/dist/presentation/cli/arguments.d.ts.map +1 -1
  77. package/dist/presentation/cli/arguments.js +9 -0
  78. package/dist/presentation/cli/arguments.js.map +1 -1
  79. package/dist/presentation/cli/main.js +11 -0
  80. package/dist/presentation/cli/main.js.map +1 -1
  81. package/dist/presentation/cli/text-report.js +1 -1
  82. package/dist/presentation/cli/text-report.js.map +1 -1
  83. package/dist/presentation/html/html-report.js +3 -2
  84. package/dist/presentation/html/html-report.js.map +1 -1
  85. package/package.json +2 -1
package/README.ko.md CHANGED
@@ -21,7 +21,7 @@ LLM 없이도 재현 가능한 분석을 제공하고, AI 설명 기능은 선
21
21
 
22
22
  ## 빠른 시작
23
23
 
24
- Node.js 20 이상과 Git이 설치되어 있어야 합니다. npm에 공개된 v0.4.0은 전역 설치 없이
24
+ Node.js 20 이상과 Git이 설치되어 있어야 합니다. npm에 공개된 v0.6.0은 전역 설치 없이
25
25
  실행할 수 있습니다.
26
26
 
27
27
  ```bash
@@ -67,7 +67,7 @@ jobs:
67
67
 
68
68
  - name: Analyze pull request
69
69
  id: intentpatch
70
- uses: xx2xxjaeil/intent-patch@v0.4.0
70
+ uses: xx2xxjaeil/intent-patch@v0.6.0
71
71
  with:
72
72
  fail-on: high
73
73
 
@@ -79,10 +79,10 @@ jobs:
79
79
  path: intentpatch-report
80
80
  ```
81
81
 
82
- Action은 릴리스 버전이나 불변 commit SHA로 고정하는 방식을 권장합니다. v0.4.0에는
83
- JS/JSX import 영향 범위 분석과 ESM export 변경 분석이 추가됐습니다. 외부 저장소에서의
84
- 검증 결과는 [평가 보고서](./docs/external-repository-evaluation.md)에 기록했습니다. `@main`은
85
- 미릴리스 변경을 따라갑니다.
82
+ Action은 릴리스 버전이나 불변 commit SHA로 고정하는 방식을 권장합니다. v0.6.0에는
83
+ 패키지 진입점 기준 공개 API 경고, 삭제된 모듈의 이전 import 영향 분석, 선택적 Claude Code
84
+ Hook이 포함됩니다. 공개 API 규칙의 별도 외부 평가 결과와 한계는
85
+ [평가 보고서](./docs/external-repository-evaluation.md)에 기록했습니다. `@main`은 미릴리스 변경을 따라갑니다.
86
86
  Action은 PR·push 이벤트의 commit 범위를 자동으로 선택하고 다음 결과를 남깁니다.
87
87
 
88
88
  - GitHub Actions Job Summary의 Markdown 보고서
@@ -94,6 +94,10 @@ Action은 PR·push 이벤트의 commit 범위를 자동으로 선택하고 다
94
94
  입력·출력과 이벤트별 비교 기준은 [GitHub Action 사용 문서](./docs/github-action.md)에서
95
95
  확인할 수 있습니다.
96
96
 
97
+ ## Claude Code Hook
98
+
99
+ 선택적으로 Hook을 연결하면 한 턴의 원래 요청과 시작 commit을 보관하고, Claude Code가 응답을 마칠 때 변경 파일·finding 개수를 짧게 보여줍니다. 요청문을 외부 서비스로 보내지 않습니다. 설치 방법, 설정 예시, 로컬 임시 저장의 보안상 주의점은 [설정 문서](https://github.com/xx2xxjaeil/intent-patch/blob/main/docs/claude-code.md)를 참고하세요.
100
+
97
101
  ## 프로젝트가 지향하는 결과
98
102
 
99
103
  ```text
@@ -129,9 +133,9 @@ LOW 구현체가 하나뿐인 추상화 추가
129
133
  분석 결과는 단순한 경고 문구가 아니라 관련 파일, 규칙 ID, 판단 근거와 함께 제공하는 것을
130
134
  원칙으로 합니다.
131
135
 
132
- 실제 IntentPatch 커밋을 분석한 [독립 실행형 HTML 예시](./docs/examples/intent-input-change.html)와
133
- [자체 변경 3건의 검증 결과](./docs/real-world-evaluation.md)와
134
- [외부 저장소 6건의 검증 결과](./docs/external-repository-evaluation.md)를 볼 수 있습니다. 저장소를 clone한
136
+ 실제 커밋을 분석한 [독립 실행형 HTML 예시](./docs/examples/intent-input-change.html),
137
+ [자체 저장소 변경 3건의 사례 연구](./docs/real-world-evaluation.md),
138
+ [외부 저장소 변경 20건·규칙별 판정 23건의 평가 결과](./docs/external-repository-evaluation.md)를 볼 수 있습니다. 저장소를 clone한
135
139
  뒤 HTML 파일을 브라우저에서 열어 주세요. GitHub 파일 화면은 렌더링 대신 소스를 보여줄 수
136
140
  있습니다.
137
141
 
@@ -170,7 +174,8 @@ LOW 구현체가 하나뿐인 추상화 추가
170
174
  - 심볼 추가·수정·삭제 탐지와 소스 위치 표시
171
175
  - 직접 `export`된 선언, 로컬 export 목록과 외부 re-export를 공개 심볼 근거에 보존
172
176
  - 공개 심볼 삭제와 `export` 해제를 호환성 위험 `high` finding으로 탐지
173
- - 공개 함수의 기존 호출 시그니처 제거와 공개 인터페이스의 호환성 파괴를 `high` finding으로 탐지
177
+ - 공개 함수의 기존 호출 시그니처 제거, 공개 인터페이스의 호환성 파괴, 해석 가능한 공개 객체 타입 별칭의 구성원 삭제를 `high` finding으로 탐지
178
+ - TypeScript가 현재 함수 타입으로 기존 호출을 수용할 수 있다고 확인한 경우 시그니처 변경 경고를 제외
174
179
  - 구현이 추가된 기존 overload는 제외하고 기존 overload가 사라진 경우만 함수 계약 변경으로 판정
175
180
  - 공백과 주석을 제외한 구현 토큰이 같은 신규 함수와 기존 함수를 재사용 후보 `medium` finding으로 탐지
176
181
  - 신규 인터페이스를 명시적으로 구현하는 클래스가 하나뿐이면 추상화 검토 `low` finding으로 탐지
@@ -181,6 +186,7 @@ LOW 구현체가 하나뿐인 추상화 추가
181
186
  사용해 로컬 별칭 import 해석
182
187
  - `.js`·`.jsx`·`.mjs`·`.cjs` specifier를 대응하는 TypeScript 소스로 해석
183
188
  - 변경 모듈을 import하는 직접 의존자와 여러 단계를 거친 간접 영향 파일 계산
189
+ - 삭제된 모듈을 이전 revision에서 import하던 파일도 별도 과거 import 표시와 함께 영향 범위에 포함
184
190
  - 해결하지 못한 상대 import와 읽기·파싱 실패를 분석 근거로 보존
185
191
  - working tree의 tracked·untracked 파일 또는 지정한 head ref를 동일한 결과점에서 분석
186
192
  - `.intentpatch.json`에 요청 의도, 예상 경로, 허용 경로와 변경량 예산 선언
@@ -410,6 +416,9 @@ npm run check
410
416
  - 생성한 npm tarball을 임시 프로젝트에 설치하고 실행하는 패키지 통합 테스트
411
417
  - 계층 간 의존 방향을 검증하는 아키텍처 테스트
412
418
 
419
+ 외부 저장소의 실제 변경 20건에서 공개 API 규칙 4개의 경고를 사람이 검토한 기대 결과와 비교하는
420
+ 방법은 [외부 저장소 평가 문서](./docs/external-repository-evaluation.md)에 정리했습니다.
421
+
413
422
  프로덕션 빌드만 확인하려면 다음 명령을 사용합니다.
414
423
 
415
424
  ```bash
@@ -424,7 +433,7 @@ npm pack --dry-run
424
433
 
425
434
  ## 릴리스
426
435
 
427
- `v0.4.0`처럼 `package.json` 버전과 일치하는 태그를 기본 브랜치의 커밋에 push하면 릴리스
436
+ `v0.6.0`처럼 `package.json` 버전과 일치하는 태그를 기본 브랜치의 커밋에 push하면 릴리스
428
437
  워크플로가 다음 작업을 순서대로 수행합니다.
429
438
 
430
439
  1. 태그·버전·기본 브랜치 포함 여부 검증
@@ -460,7 +469,8 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
460
469
  11. ✅ PR·push 비교, Job Summary와 artifact 출력을 제공하는 GitHub Action
461
470
  12. 요청 입력과 에이전트 adapter
462
471
  - ✅ CLI 요청 문서와 선택적 GitHub PR 본문 입력
463
- - Codex·Claude Code·Cursor 전용 adapter
472
+ - ✅ 선택적 Claude Code Hook
473
+ - Codex·Cursor 전용 adapter
464
474
  13. 근거 기반 결과에 대한 선택적 LLM 설명
465
475
 
466
476
  ## 현재 제한사항
@@ -490,12 +500,21 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
490
500
  별칭만 지원합니다.
491
501
  - JavaScript 심볼 분석은 `.js`·`.jsx`·`.mjs`·`.cjs`의 최상위 함수·클래스·변수 및 식별 가능한
492
502
  ESM export를 추적합니다. CommonJS `module.exports`는 아직 공개 API 분석 대상이 아닙니다.
493
- - TypeScript 공개 API 분석은 이름이 있는 최상위 함수·인터페이스, 로컬 `export { name }`, 외부
494
- `export { name } from`, `export * from`을 지원합니다. JavaScript는 이름 있는 ESM export와
495
- default export 삭제를 탐지하지만 함수의 타입 호환성을 추정하지 않습니다. package `exports`와
496
- 클래스·타입 별칭의 세부 계약은 해석하지 않습니다.
497
- - 함수 호환성은 명시된 파라미터·반환 타입 텍스트를 비교합니다. 추론된 반환 타입 변화나
498
- TypeScript의 구조적 타입 할당 가능성까지 판정하지 않습니다.
503
+ - TypeScript 공개 API 분석은 이름이 있는 최상위 함수·인터페이스와 객체 리터럴, 같은 파일의
504
+ 비제네릭 별칭·교집합으로 구성된 공개 타입 별칭의 구성원 삭제를 지원합니다. 로컬
505
+ `export { name }`, 외부 `export { name } from`, `export * from`은 export 근거로 추적합니다.
506
+ JavaScript는 이름 있는 ESM export와 default export 삭제를 탐지하지만 함수의 타입 호환성을
507
+ 추정하지 않습니다. 변경 전 루트·하위 패키지의 `exports`가 소스 파일을 직접 가리키면 공개
508
+ 진입점과 상대 경로 re-export가 도달하는 파일에만 공개 API 경고를 냅니다. 이는 파일 단위
509
+ 근사치로, 이름 있는 re-export가 파일의 일부 심볼만 노출하는 경우도 있습니다. 생성된
510
+ 진입점이나 해석 불가능한 경로에서는 비공개라고 단정하지 않고 기존 경고를 유지합니다.
511
+ CommonJS `module.exports`, 클래스 계약, 제네릭 별칭 인스턴스화, 합집합, 파일 간 타입 참조와
512
+ 완전한 타입 할당 가능성은 해석하지 않습니다. 지원하지
513
+ 않는 타입 별칭 형태에서는 구성원 삭제 finding을 내지 않습니다.
514
+ - 함수 호환성은 먼저 기록된 시그니처를 비교하고, 외부 참조 없이 해석할 수 있는 명시적 타입은
515
+ TypeScript의 엄격한 할당 가능성 검사로 기존 호출 유지 여부를 확인합니다. 미해결 타입 이름,
516
+ 추론된 타입, 파싱할 수 없는 시그니처는 확인 불가로 남겨 검토 경고를 유지합니다. 전체 프로젝트의
517
+ 타입 검사나 런타임 호환성 보증은 아닙니다.
499
518
  - 중복 구현 후보는 새로 추가된 최상위 함수와 기존 최상위 함수의 토큰이 공백·주석을 제외하고
500
519
  완전히 같으며 본문이 12토큰 이상일 때만 보고합니다. 식별자 이름이 바뀐 유사 코드, 메서드,
501
520
  의미적으로만 같은 구현은 탐지하지 않습니다.
@@ -509,8 +528,10 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
509
528
  - 외부 패키지 설정을 참조하는 `extends`, project references, 임의 이름의 설정 파일,
510
529
  package `imports`·`exports`, 외부 package import, 계산된 모듈 경로는 아직 그래프에서
511
530
  해석하지 않습니다.
512
- - 영향 그래프는 비교 결과점(working tree 또는 head ref)의 파일을 기준으로 만듭니다. 따라서
513
- 삭제된 모듈을 가리키던 과거 import의 영향은 현재 단계에서 계산할 수 없습니다.
531
+ - 기본 영향 그래프는 비교 결과점(working tree 또는 head ref)의 파일을 기준으로 만듭니다.
532
+ 소스 모듈이 삭제되면 변경 전 Git snapshot과 당시의 tsconfig/jsconfig 별칭을 다시 읽어 살아 있는
533
+ 직접·간접 의존자를 찾고, 텍스트·HTML 보고서에 `previous imports`로 표시합니다. 계산된 모듈
534
+ 경로는 추론하지 않으며 함께 삭제된 importer를 현재 영향 파일로 집계하지 않습니다.
514
535
  - 영향 분석용 소스 파일은 파일당 1 MiB로 제한하며, symbolic link는 읽지 않습니다.
515
536
  - `dist`·`build`·`coverage`·`action-dist`·`node_modules` 같은 생성 디렉터리는 Git 변경량에는
516
537
  포함하지만 심볼·import graph·정적 package 참조 분석에서는 제외합니다.
package/README.md CHANGED
@@ -18,7 +18,7 @@ IntentPatch combines **Git diff analysis, static analysis, and dependency analys
18
18
 
19
19
  ## Quick start
20
20
 
21
- IntentPatch requires Node.js 20 or later and Git. Run the published v0.4.0 CLI without
21
+ IntentPatch requires Node.js 20 or later and Git. Run the published v0.6.0 CLI without
22
22
  installing it globally:
23
23
 
24
24
  ```bash
@@ -62,7 +62,7 @@ jobs:
62
62
 
63
63
  - name: Analyze pull request
64
64
  id: intentpatch
65
- uses: xx2xxjaeil/intent-patch@v0.4.0
65
+ uses: xx2xxjaeil/intent-patch@v0.6.0
66
66
  with:
67
67
  fail-on: high
68
68
 
@@ -74,9 +74,10 @@ jobs:
74
74
  path: intentpatch-report
75
75
  ```
76
76
 
77
- Pin the action to a released version or an immutable commit SHA. The v0.4.0 release adds
78
- JS/JSX import-impact and ESM export analysis, with external-repository evaluation documented in
79
- [the evaluation report](./docs/external-repository-evaluation.md). `@main` follows unreleased changes.
77
+ Pin the action to a released version or an immutable commit SHA. v0.6.0 adds package-entrypoint-aware
78
+ public API warnings, historical import impact for deleted modules, and the opt-in Claude Code Hook.
79
+ See [the evaluation report](./docs/external-repository-evaluation.md) for the separately measured
80
+ public-API rules and their limits. `@main` follows unreleased changes.
80
81
 
81
82
  The action detects the comparison range for pull request and push events and produces:
82
83
 
@@ -88,6 +89,10 @@ The action detects the comparison range for pull request and push events and pro
88
89
 
89
90
  See the [GitHub Action guide](./docs/github-action.md) for inputs, outputs, and event-specific comparison behavior.
90
91
 
92
+ ## Claude Code Hook
93
+
94
+ An opt-in Hook adapter captures a turn's original prompt and starting commit, then shows a small change/finding summary when Claude Code stops. It does not send the prompt to an external service. See the [setup guide](https://github.com/xx2xxjaeil/intent-patch/blob/main/docs/claude-code.md) for installation, the Hook configuration example, and local-state security notes.
95
+
91
96
  ## What the report looks like
92
97
 
93
98
  ```text
@@ -122,10 +127,10 @@ LOW New abstraction has only one implementation
122
127
 
123
128
  Every finding includes the relevant file, a stable rule ID, and evidence for the decision instead of only presenting an unexplained warning.
124
129
 
125
- For a report generated from an actual IntentPatch commit, see the
126
- [standalone HTML example](./docs/examples/intent-input-change.html) and the
127
- [three-case self-evaluation](./docs/real-world-evaluation.md) and
128
- [six-case external evaluation](./docs/external-repository-evaluation.md). After cloning,
130
+ For reports generated from actual commits, see the
131
+ [standalone HTML example](./docs/examples/intent-input-change.html), the
132
+ [three-case self-repository study](./docs/real-world-evaluation.md), and the
133
+ [external evaluation of 20 changes and 23 rule checks](./docs/external-repository-evaluation.md). After cloning,
129
134
  open the HTML file locally in a browser; GitHub may show its source rather than render it.
130
135
 
131
136
  ## Implemented capabilities
@@ -164,8 +169,10 @@ The current source tree analyzes Git changes, direct dependencies in the root `p
164
169
  - Track named top-level JavaScript/JSX functions, classes, variables, ESM export aliases, and default exports without inferring type compatibility.
165
170
  - Detect symbol additions, modifications, and removals with source locations.
166
171
  - Preserve direct exports, local export lists, and external re-exports as public-symbol evidence.
172
+ - When the previous package `exports` resolve to maintained source files, limit public API warnings to those entrypoints and their re-exported modules.
167
173
  - Report removed public symbols and removed exports as high-severity compatibility risks.
168
- - Detect removed public function call signatures and incompatible public interface changes.
174
+ - Detect removed public function call signatures, incompatible public interface changes, and removed members of resolvable public object type aliases.
175
+ - Suppress a public function signature warning when TypeScript confirms that the current callable type still accepts the previous calls.
169
176
  - Exclude overloads that only gain an implementation while reporting previously available overloads that disappear.
170
177
  - Find newly added functions whose normalized implementation matches an existing function.
171
178
  - Report a newly added interface when exactly one class explicitly implements it.
@@ -181,6 +188,7 @@ The current source tree analyzes Git changes, direct dependencies in the root `p
181
188
  - Calculate direct importers and transitively impacted files for changed modules.
182
189
  - Preserve unresolved relative imports and file read or parse failures as evidence.
183
190
  - Build the graph at the same result point as the diff: the working tree or the selected head ref.
191
+ - Include importers that depended on a deleted module in the previous revision, with a distinct previous-import marker.
184
192
  - Read intent, expected paths, allowed paths, and change budgets from `.intentpatch.json`.
185
193
  - Accept a request text/Markdown file through the CLI, or opt in to using the PR body in the GitHub Action.
186
194
  - Report each file outside expected and allowed patterns as a medium-severity finding.
@@ -397,6 +405,9 @@ This command runs:
397
405
  - architecture tests that enforce dependency direction;
398
406
  - a reproducibility check for the bundled GitHub Action.
399
407
 
408
+ For a reproducible check of four public-API rules against 18 reviewed changes in
409
+ external repositories, see the [external evaluation](./docs/external-repository-evaluation.md).
410
+
400
411
  Run only the production build with:
401
412
 
402
413
  ```bash
@@ -411,7 +422,7 @@ npm pack --dry-run
411
422
 
412
423
  ## Release process
413
424
 
414
- Pushing a tag such as `v0.4.0`, matching the version in `package.json`, from a commit contained in the default branch triggers the release workflow:
425
+ Pushing a tag such as `v0.6.0`, matching the version in `package.json`, from a commit contained in the default branch triggers the release workflow:
415
426
 
416
427
  1. Validate the tag, package version, and default-branch ancestry.
417
428
  2. Run the full quality suite and inspect the npm package with a dry run.
@@ -443,7 +454,8 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
443
454
  11. ✅ GitHub Action with PR/push comparison, Job Summary, annotations, and artifacts
444
455
  12. Request capture and agent adapters
445
456
  - ✅ CLI request file and opt-in GitHub PR body
446
- - Codex, Claude Code, and Cursor-specific adapters
457
+ - ✅ Opt-in Claude Code Hook
458
+ - Codex and Cursor-specific adapters
447
459
  13. Optional LLM explanations grounded in deterministic evidence
448
460
 
449
461
  ## Current limitations
@@ -460,8 +472,8 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
460
472
  - Yarn lockfiles and runtime dependency usage are not analyzed yet.
461
473
  - Working-tree `package-lock.json` and `pnpm-lock.yaml` files are limited to 10 MiB; other text snapshots retain the 1 MiB limit.
462
474
  - 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.
463
- - TypeScript public API analysis supports named top-level functions and interfaces, local `export { name }`, external `export { name } from`, and `export * from`. JavaScript supports identifiable named and default ESM export removal, but does not infer function signatures. Package `exports`, CommonJS `module.exports`, and detailed class or type-alias contracts are not interpreted yet.
464
- - Function compatibility compares explicitly written parameter and return-type text. It does not evaluate inferred return types or full TypeScript structural assignability.
475
+ - 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.
476
+ - Function compatibility first compares recorded signatures. For self-contained, explicitly typed declarations it then uses strict TypeScript assignability to avoid warning on compatible changes. 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.
465
477
  - 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.
466
478
  - 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.
467
479
  - Methods, TypeScript variable declarations, enums, and nested declarations are not included in symbol analysis.
@@ -470,7 +482,7 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
470
482
  `jsconfig.json`, with relative `extends` support.
471
483
  - Package-based config `extends`, project references, arbitrary config filenames, package
472
484
  `imports`/`exports`, external package imports, and computed module loads are not resolved in the graph.
473
- - The graph is built from files at the comparison result point: the working tree or head ref. Impact from historical imports that referenced a deleted module cannot be calculated yet.
485
+ - The main graph is built from files at the comparison result point: the working tree or head ref. For a deleted source module, IntentPatch also walks the previous Git snapshot to find surviving direct and transitive importers; these paths are marked `previous imports` in text and HTML reports. The historical walk uses the previous `tsconfig.json`/`jsconfig.json` for aliases, but does not infer dynamic module loads or report deleted importers as currently affected files.
474
486
  - Source files used for impact analysis are limited to 1 MiB per file, and symbolic links are not read.
475
487
  - Generated directories such as `dist`, `build`, `coverage`, `action-dist`, and `node_modules` remain visible in Git change counts but are excluded from symbol, import-graph, and static package-reference scans.
476
488
  - IntentPatch does not infer expected paths from natural-language intent. Scope decisions use the contract's explicit `include` and `allow` patterns.
@@ -0,0 +1,11 @@
1
+ export interface CapturedAgentIntent {
2
+ readonly intent: string;
3
+ readonly baseRef: string;
4
+ }
5
+ /** 에이전트의 한 턴 동안만 요청문을 보관하는 출력 포트다. */
6
+ export interface AgentIntentSessionStore {
7
+ capture(sessionId: string, workingDirectory: string, intent: string): Promise<void>;
8
+ take(sessionId: string, workingDirectory: string): Promise<CapturedAgentIntent | undefined>;
9
+ clear(sessionId: string, workingDirectory: string): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=agent-intent-session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-intent-session-store.d.ts","sourceRoot":"","sources":["../../../src/application/ports/agent-intent-session-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAC5F,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-intent-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-intent-session-store.js","sourceRoot":"","sources":["../../../src/application/ports/agent-intent-session-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Checks whether the current callable type still accepts all previously published calls.
3
+ * Undefined means the available signature evidence cannot establish compatibility.
4
+ */
5
+ export interface FunctionSignatureCompatibility {
6
+ preservesPreviousCalls(previous: readonly string[], current: readonly string[]): boolean | undefined;
7
+ }
8
+ //# sourceMappingURL=function-signature-compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-signature-compatibility.d.ts","sourceRoot":"","sources":["../../../src/application/ports/function-signature-compatibility.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,sBAAsB,CACpB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,GAAG,SAAS,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=function-signature-compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-signature-compatibility.js","sourceRoot":"","sources":["../../../src/application/ports/function-signature-compatibility.ts"],"names":[],"mappings":""}
@@ -1,8 +1,9 @@
1
1
  import type { ImpactAnalysisIssue } from "../../domain/impact.js";
2
2
  import type { AnalysisTarget } from "../../domain/report.js";
3
+ import type { ProjectSnapshot } from "./project-file-source.js";
3
4
  /** 분석 결과점에서 해석 가능한 비상대 경로 import를 찾는 언어별 출력 포트다. */
4
5
  export interface ModuleAliasResolver {
5
- prepare(target: AnalysisTarget, repositoryPaths: readonly string[], sourcePaths: ReadonlySet<string>): Promise<PreparedModuleAliasResolver>;
6
+ prepare(target: AnalysisTarget, repositoryPaths: readonly string[], sourcePaths: ReadonlySet<string>, snapshot?: ProjectSnapshot): Promise<PreparedModuleAliasResolver>;
6
7
  }
7
8
  export interface PreparedModuleAliasResolver {
8
9
  readonly issues: readonly ImpactAnalysisIssue[];
@@ -1 +1 @@
1
- {"version":3,"file":"module-alias-resolver.d.ts","sourceRoot":"","sources":["../../../src/application/ports/module-alias-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CACL,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAClE"}
1
+ {"version":3,"file":"module-alias-resolver.d.ts","sourceRoot":"","sources":["../../../src/application/ports/module-alias-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CACL,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAClE"}
@@ -8,9 +8,10 @@ export type ProjectFileReadResult = Readonly<{
8
8
  kind: "unavailable";
9
9
  reason: string;
10
10
  }>;
11
- /** 분석 결과점의 프로젝트 파일 목록과 텍스트를 공급하는 출력 포트다. */
11
+ export type ProjectSnapshot = "base" | "current";
12
+ /** 분석 기준점 또는 결과점의 프로젝트 파일 목록과 텍스트를 공급하는 출력 포트다. */
12
13
  export interface ProjectFileSource {
13
- listPaths(target: AnalysisTarget): Promise<readonly string[]>;
14
- read(target: AnalysisTarget, path: string): Promise<ProjectFileReadResult>;
14
+ listPaths(target: AnalysisTarget, snapshot?: ProjectSnapshot): Promise<readonly string[]>;
15
+ read(target: AnalysisTarget, path: string, snapshot?: ProjectSnapshot): Promise<ProjectFileReadResult>;
15
16
  }
16
17
  //# sourceMappingURL=project-file-source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-file-source.d.ts","sourceRoot":"","sources":["../../../src/application/ports/project-file-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAC7B,QAAQ,CAAC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtD,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC5E"}
1
+ {"version":3,"file":"project-file-source.d.ts","sourceRoot":"","sources":["../../../src/application/ports/project-file-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAC7B,QAAQ,CAAC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjD,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC1F,IAAI,CACF,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnC"}
@@ -0,0 +1,6 @@
1
+ import type { AnalysisTarget } from "../../domain/report.js";
2
+ /** 확인 가능한 package exports 경계 밖에 있던 변경 파일만 반환한다. */
3
+ export interface PublicApiBoundary {
4
+ internalPaths(target: AnalysisTarget, changedPaths: readonly string[]): Promise<ReadonlySet<string>>;
5
+ }
6
+ //# sourceMappingURL=public-api-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api-boundary.d.ts","sourceRoot":"","sources":["../../../src/application/ports/public-api-boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,aAAa,CACX,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;CACjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=public-api-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api-boundary.js","sourceRoot":"","sources":["../../../src/application/ports/public-api-boundary.ts"],"names":[],"mappings":""}
@@ -1,7 +1,10 @@
1
1
  import type { Finding } from "../../domain/finding.js";
2
2
  import type { AnalysisContext, AnalysisRule } from "../ports/analysis-rule.js";
3
- /** 공개 함수와 인터페이스의 이전 계약을 더 이상 만족하지 않는 변경을 찾는다. */
3
+ import type { FunctionSignatureCompatibility } from "../ports/function-signature-compatibility.js";
4
+ /** 공개 함수·인터페이스 계약과 공개 객체 타입의 구성원 삭제를 찾는다. */
4
5
  export declare class PublicApiCompatibilityRule implements AnalysisRule {
6
+ private readonly signatureCompatibility;
7
+ constructor(signatureCompatibility: FunctionSignatureCompatibility);
5
8
  analyze(context: AnalysisContext): Promise<readonly Finding[]>;
6
9
  }
7
10
  //# sourceMappingURL=public-api-compatibility-rule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api-compatibility-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/public-api-compatibility-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAOvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE/E,iDAAiD;AACjD,qBAAa,0BAA2B,YAAW,YAAY;IAChD,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CAG5E"}
1
+ {"version":3,"file":"public-api-compatibility-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/public-api-compatibility-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAQvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAEnG,6CAA6C;AAC7C,qBAAa,0BAA2B,YAAW,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBAAtB,sBAAsB,EAAE,8BAA8B;IAE7E,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CAK5E"}
@@ -1,11 +1,16 @@
1
- /** 공개 함수와 인터페이스의 이전 계약을 더 이상 만족하지 않는 변경을 찾는다. */
1
+ /** 공개 함수·인터페이스 계약과 공개 객체 타입의 구성원 삭제를 찾는다. */
2
2
  export class PublicApiCompatibilityRule {
3
+ signatureCompatibility;
4
+ constructor(signatureCompatibility) {
5
+ this.signatureCompatibility = signatureCompatibility;
6
+ }
3
7
  async analyze(context) {
4
- return (context.symbolChanges?.changes ?? []).flatMap(toFinding);
8
+ return (context.symbolChanges?.changes ?? []).flatMap((change) => toFinding(change, this.signatureCompatibility));
5
9
  }
6
10
  }
7
- function toFinding(change) {
11
+ function toFinding(change, signatureCompatibility) {
8
12
  if (change.changeKind !== "modified" ||
13
+ change.beforePubliclyReachable === false ||
9
14
  change.beforeExported !== true ||
10
15
  change.afterExported !== true ||
11
16
  change.beforePublicApi === undefined ||
@@ -14,17 +19,45 @@ function toFinding(change) {
14
19
  return [];
15
20
  }
16
21
  if (change.beforePublicApi.kind === "function" && change.afterPublicApi.kind === "function") {
17
- return functionFinding(change, change.beforePublicApi, change.afterPublicApi);
22
+ return functionFinding(change, change.beforePublicApi, change.afterPublicApi, signatureCompatibility);
18
23
  }
19
24
  if (change.beforePublicApi.kind === "interface" && change.afterPublicApi.kind === "interface") {
20
25
  return interfaceFinding(change, change.beforePublicApi, change.afterPublicApi);
21
26
  }
27
+ if (change.beforePublicApi.kind === "type-alias" && change.afterPublicApi.kind === "type-alias") {
28
+ return typeAliasFinding(change, change.beforePublicApi, change.afterPublicApi);
29
+ }
22
30
  return [];
23
31
  }
24
- function functionFinding(change, before, after) {
32
+ function typeAliasFinding(change, before, after) {
33
+ const currentMembers = new Set(after.members.map(memberIdentity));
34
+ const removedMembers = [
35
+ ...new Set(before.members
36
+ .filter((member) => !currentMembers.has(memberIdentity(member)))
37
+ .map((member) => member.name)),
38
+ ].sort();
39
+ if (removedMembers.length === 0)
40
+ return [];
41
+ return [
42
+ {
43
+ ruleId: "api/public-type-member-removed",
44
+ severity: "high",
45
+ title: "Public type member removed",
46
+ description: `The exported type ${change.name} no longer contains every previous member.`,
47
+ file: change.path,
48
+ evidence: {
49
+ symbolName: change.name,
50
+ removedMembers: removedMembers.join(", "),
51
+ ...(change.afterLine === undefined ? {} : { currentLine: change.afterLine }),
52
+ },
53
+ },
54
+ ];
55
+ }
56
+ function functionFinding(change, before, after, signatureCompatibility) {
25
57
  const currentSignatures = new Set(after.signatures);
26
58
  const removedSignatures = before.signatures.filter((signature) => !currentSignatures.has(signature));
27
- if (removedSignatures.length === 0) {
59
+ if (removedSignatures.length === 0 ||
60
+ signatureCompatibility.preservesPreviousCalls(before.signatures, after.signatures) === true) {
28
61
  return [];
29
62
  }
30
63
  return [
@@ -69,22 +102,93 @@ function interfaceBreakingReasons(before, after) {
69
102
  if (!sameValues(before.extendsTypes, after.extendsTypes)) {
70
103
  reasons.push("extended types changed");
71
104
  }
72
- const currentMembers = new Set(after.members.map(memberContract));
73
105
  for (const member of before.members) {
74
- if (!currentMembers.has(memberContract(member))) {
106
+ if (!after.members.some((current) => preservesMember(member, current))) {
75
107
  reasons.push(`member removed or changed: ${member.name}`);
76
108
  }
77
109
  }
78
- const previousMembers = new Set(before.members.map(memberContract));
79
110
  for (const member of after.members) {
80
- if (!member.optional && !previousMembers.has(memberContract(member))) {
111
+ if (!member.optional && !before.members.some((previous) => preservesMember(previous, member))) {
81
112
  reasons.push(`required member added or changed: ${member.name}`);
82
113
  }
83
114
  }
84
115
  return [...new Set(reasons)].sort();
85
116
  }
86
- function memberContract(member) {
87
- return [member.memberKind, member.name, member.optional, member.signature].join("\0");
117
+ function preservesMember(previous, current) {
118
+ if (previous.name !== current.name ||
119
+ previous.memberKind !== current.memberKind ||
120
+ previous.optional !== current.optional)
121
+ return false;
122
+ return (previous.signature === current.signature ||
123
+ (previous.memberKind === "method" &&
124
+ preservesMethodCalls(previous.signature, current.signature)));
125
+ }
126
+ /** 기존 인자·반환형을 그대로 두고 선택적 인자만 끝에 더한 메서드는 이전 호출을 수용한다. */
127
+ function preservesMethodCalls(previous, current) {
128
+ if (!previous.startsWith("(") || !current.startsWith("("))
129
+ return false;
130
+ const previousClose = closingParenthesis(previous);
131
+ const currentClose = closingParenthesis(current);
132
+ if (previousClose === undefined ||
133
+ currentClose === undefined ||
134
+ previous.slice(previousClose + 1) !== current.slice(currentClose + 1))
135
+ return false;
136
+ const previousParameters = splitParameters(previous.slice(1, previousClose));
137
+ const currentParameters = splitParameters(current.slice(1, currentClose));
138
+ if (previousParameters === undefined ||
139
+ currentParameters === undefined ||
140
+ currentParameters.length <= previousParameters.length)
141
+ return false;
142
+ return (previousParameters.every((parameter, index) => parameter === currentParameters[index]) &&
143
+ currentParameters
144
+ .slice(previousParameters.length)
145
+ .every((parameter) => parameter.endsWith("?") && !parameter.startsWith("...")));
146
+ }
147
+ function closingParenthesis(signature) {
148
+ let depth = 0;
149
+ for (let index = 0; index < signature.length; index += 1) {
150
+ if (signature[index] === "(")
151
+ depth += 1;
152
+ if (signature[index] === ")" && --depth === 0)
153
+ return index;
154
+ }
155
+ return undefined;
156
+ }
157
+ function splitParameters(value) {
158
+ if (value.length === 0)
159
+ return [];
160
+ const parameters = [];
161
+ const closing = new Map([
162
+ ["(", ")"],
163
+ ["[", "]"],
164
+ ["{", "}"],
165
+ ["<", ">"],
166
+ ]);
167
+ const stack = [];
168
+ let start = 0;
169
+ for (let index = 0; index < value.length; index += 1) {
170
+ const character = value[index];
171
+ if (character === "," && stack.length === 0) {
172
+ parameters.push(value.slice(start, index).trim());
173
+ start = index + 1;
174
+ }
175
+ else if (character !== undefined && closing.has(character)) {
176
+ stack.push(closing.get(character) ?? "");
177
+ }
178
+ else if (character === ")" || character === "]" || character === "}" || character === ">") {
179
+ if (character === ">" && value[index - 1] === "=")
180
+ continue;
181
+ if (stack.pop() !== character)
182
+ return undefined;
183
+ }
184
+ }
185
+ if (stack.length > 0)
186
+ return undefined;
187
+ parameters.push(value.slice(start).trim());
188
+ return parameters;
189
+ }
190
+ function memberIdentity(member) {
191
+ return [member.memberKind, member.name].join("\0");
88
192
  }
89
193
  function sameValues(left, right) {
90
194
  return left.length === right.length && left.every((value, index) => value === right[index]);
@@ -1 +1 @@
1
- {"version":3,"file":"public-api-compatibility-rule.js","sourceRoot":"","sources":["../../../src/application/rules/public-api-compatibility-rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public-api-compatibility-rule.js","sourceRoot":"","sources":["../../../src/application/rules/public-api-compatibility-rule.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"public-api-removal-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/public-api-removal-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE/E,kDAAkD;AAClD,qBAAa,oBAAqB,YAAW,YAAY;IAC1C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CAG5E"}
1
+ {"version":3,"file":"public-api-removal-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/public-api-removal-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE/E,kDAAkD;AAClD,qBAAa,oBAAqB,YAAW,YAAY;IAC1C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CAa5E"}