intentpatch 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.ko.md +59 -19
  2. package/README.md +57 -17
  3. package/dist/application/rules/added-dependency-usage-rule.js +2 -2
  4. package/dist/application/rules/added-dependency-usage-rule.js.map +1 -1
  5. package/dist/application/rules/npm-workspace-dependency-rule.d.ts +1 -1
  6. package/dist/application/rules/npm-workspace-dependency-rule.d.ts.map +1 -1
  7. package/dist/application/rules/npm-workspace-dependency-rule.js +30 -14
  8. package/dist/application/rules/npm-workspace-dependency-rule.js.map +1 -1
  9. package/dist/application/rules/package-json-workspace-dependency-rule.d.ts +5 -0
  10. package/dist/application/rules/package-json-workspace-dependency-rule.d.ts.map +1 -0
  11. package/dist/application/rules/package-json-workspace-dependency-rule.js +5 -0
  12. package/dist/application/rules/package-json-workspace-dependency-rule.js.map +1 -0
  13. package/dist/application/services/workspace-manifest-analysis.d.ts +1 -0
  14. package/dist/application/services/workspace-manifest-analysis.d.ts.map +1 -1
  15. package/dist/application/services/workspace-manifest-analysis.js +2 -2
  16. package/dist/application/services/workspace-manifest-analysis.js.map +1 -1
  17. package/dist/domain/report.d.ts +8 -0
  18. package/dist/domain/report.d.ts.map +1 -1
  19. package/dist/infrastructure/config/write-change-contract.d.ts +4 -0
  20. package/dist/infrastructure/config/write-change-contract.d.ts.map +1 -0
  21. package/dist/infrastructure/config/write-change-contract.js +24 -0
  22. package/dist/infrastructure/config/write-change-contract.js.map +1 -0
  23. package/dist/infrastructure/git/git-patch-preview-source.d.ts +11 -0
  24. package/dist/infrastructure/git/git-patch-preview-source.d.ts.map +1 -0
  25. package/dist/infrastructure/git/git-patch-preview-source.js +69 -0
  26. package/dist/infrastructure/git/git-patch-preview-source.js.map +1 -0
  27. package/dist/infrastructure/typescript/javascript-symbol-extractor.d.ts +1 -1
  28. package/dist/infrastructure/typescript/javascript-symbol-extractor.d.ts.map +1 -1
  29. package/dist/infrastructure/typescript/javascript-symbol-extractor.js +28 -1
  30. package/dist/infrastructure/typescript/javascript-symbol-extractor.js.map +1 -1
  31. package/dist/presentation/analyze-repository.d.ts +1 -0
  32. package/dist/presentation/analyze-repository.d.ts.map +1 -1
  33. package/dist/presentation/analyze-repository.js +8 -3
  34. package/dist/presentation/analyze-repository.js.map +1 -1
  35. package/dist/presentation/cli/arguments.d.ts +13 -1
  36. package/dist/presentation/cli/arguments.d.ts.map +1 -1
  37. package/dist/presentation/cli/arguments.js +82 -0
  38. package/dist/presentation/cli/arguments.js.map +1 -1
  39. package/dist/presentation/cli/main.js +37 -1
  40. package/dist/presentation/cli/main.js.map +1 -1
  41. package/dist/presentation/github/run-action.d.ts.map +1 -1
  42. package/dist/presentation/github/run-action.js +1 -0
  43. package/dist/presentation/github/run-action.js.map +1 -1
  44. package/dist/presentation/html/html-report.d.ts.map +1 -1
  45. package/dist/presentation/html/html-report.js +47 -2
  46. package/dist/presentation/html/html-report.js.map +1 -1
  47. package/package.json +1 -1
package/README.ko.md CHANGED
@@ -19,16 +19,36 @@ 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.1 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.8.0은 전역 설치 없이
25
- 실행할 수 있습니다.
39
+ Node.js 20 이상과 Git이 설치되어 있어야 합니다. 분석할 저장소에서 npm에 공개된 v0.9.1을
40
+ 전역 설치 없이 실행할 수 있습니다.
26
41
 
27
42
  ```bash
28
- npx intentpatch analyze --cwd /path/to/repository
29
- npx intentpatch analyze --format html --output intentpatch-report.html
43
+ cd /path/to/repository
44
+ npx intentpatch analyze
45
+ npx intentpatch analyze --format html --output ../intentpatch-report.html
30
46
  ```
31
47
 
48
+ 처음 실행하는 경우 [첫 실행 안내](./docs/first-run.md)의 `init → analyze → HTML` 순서와
49
+ 오류별 확인 방법을 참고하세요. HTML finding에서 해당 파일의 제한된 Git diff 미리보기로
50
+ 이동할 수 있습니다.
51
+
32
52
  현재 소스 버전을 실행하려면 저장소를 빌드합니다.
33
53
 
34
54
  ```bash
@@ -67,7 +87,7 @@ jobs:
67
87
 
68
88
  - name: Analyze pull request
69
89
  id: intentpatch
70
- uses: xx2xxjaeil/intent-patch@v0.8.0
90
+ uses: xx2xxjaeil/intent-patch@v0.9.1
71
91
  with:
72
92
  fail-on: high
73
93
 
@@ -79,8 +99,10 @@ jobs:
79
99
  path: intentpatch-report
80
100
  ```
81
101
 
82
- Action은 릴리스 버전이나 불변 commit SHA로 고정하는 방식을 권장합니다. v0.8.0에는 Yarn 4
83
- lockfile 분석, 소스와 테스트의 명시적 연결, 보고서 필터와 영향 그래프 탐색 개선이 포함됩니다.
102
+ Action은 릴리스 버전이나 불변 commit SHA로 고정하는 방식을 권장합니다. v0.9.1에는 HTML diff
103
+ 미리보기, 확대된 외부 평가와 정적 CommonJS 이름 export 삭제 탐지가 포함됩니다. v0.9.0에는 Yarn
104
+ workspace dependency 분석과 Change Contract를 안전하게 만드는 `init` 명령이 추가되었습니다.
105
+ Yarn 4 lockfile 분석, 소스와 테스트의 명시적 연결, 보고서 필터와 영향 그래프 탐색 개선,
84
106
  패키지 진입점 기준 공개 API 경고, 삭제된 모듈의 이전 import 영향 분석, 선택적 Claude Code·Codex·Cursor
85
107
  Hook도 사용할 수 있습니다. 공개 API 규칙의 별도 외부 평가 결과와 한계는
86
108
  [평가 보고서](./docs/external-repository-evaluation.md)에 기록했습니다. `@main`은 미릴리스 변경을 따라갑니다.
@@ -141,15 +163,15 @@ LOW 구현체가 하나뿐인 추상화 추가
141
163
 
142
164
  실제 커밋을 분석한 [독립 실행형 HTML 예시](./docs/examples/intent-input-change.html),
143
165
  [자체 저장소 변경 3건의 사례 연구](./docs/real-world-evaluation.md),
144
- [외부 저장소 변경 32건·규칙별 판정 38건의 평가 결과](./docs/external-repository-evaluation.md)를 볼 수 있습니다. 저장소를 clone한
166
+ [외부 저장소 변경 36건·규칙별 판정 43건의 평가 결과](./docs/external-repository-evaluation.md)를 볼 수 있습니다. 저장소를 clone한
145
167
  뒤 HTML 파일을 브라우저에서 열어 주세요. GitHub 파일 화면은 렌더링 대신 소스를 보여줄 수
146
168
  있습니다.
147
169
 
148
170
  ## 현재 구현된 기능
149
171
 
150
- 현재 소스는 Git 변경사항 수집, 루트·npm workspace `package.json`의 직접 dependency와 npm lockfile 분석, TypeScript
151
- 최상위 TypeScript·JavaScript 심볼과 공개 export 변경 분석, 기존 구현 중복·단일 구현 추상화 신호, import graph 기반
152
- 영향 범위와 테스트 동반 변경 분석을 제공합니다.
172
+ CLI는 Git 변경사항, 루트 및 npm·pnpm·Yarn workspace manifest의 직접 dependency,
173
+ lockfile 변경, 최상위 TypeScript·JavaScript 심볼과 공개 export, 기존 구현 중복·단일 구현
174
+ 추상화 신호, import graph 기반 영향 범위와 테스트 동반 변경을 분석합니다.
153
175
 
154
176
  - `HEAD`와 현재 working tree 비교
155
177
  - 두 Git reference 또는 브랜치 비교
@@ -170,6 +192,7 @@ LOW 구현체가 하나뿐인 추상화 추가
170
192
  - pnpm `pnpm-lock.yaml` v9의 레지스트리 패키지 추가·삭제·버전 변경 비교(2개 문서 형식 포함)
171
193
  - 잘못되었거나 미지원인 lockfile을 누락하지 않고 finding으로 보고
172
194
  - 루트 `workspaces` 패턴에 속한 변경 manifest의 직접 dependency를 workspace별로 보고
195
+ - 루트 `workspaces` 패턴에 속한 Yarn workspace manifest 변경도 분석하고 Yarn 근거를 표시
173
196
  - `pnpm-workspace.yaml`의 포함·제외 패턴에 속한 변경 manifest의 직접 dependency를 보고
174
197
  - workspace 설정 변경과 manifest의 workspace 안팎 이동을 탐지
175
198
  - finding 심각도(`high`, `medium`, `low`) 집계
@@ -263,6 +286,21 @@ intentpatch analyze --intent-file request.md --format html --output report.html
263
286
 
264
287
  ### Change Contract로 요청 범위 검사
265
288
 
289
+ `intentpatch init` 명령은 기존 파일을 덮어쓰지 않고 `.intentpatch.json`을 생성합니다.
290
+ 자연어 요청만으로 경로를 추측하지 않으므로 이번 작업의 실제 경로를 전달하세요.
291
+
292
+ ```bash
293
+ intentpatch init \
294
+ --intent "회원 탈퇴 기능 구현" \
295
+ --include 'src/user/**' --include 'tests/user/**' \
296
+ --allow package.json \
297
+ --test-source 'src/**/*.ts' --test-file 'tests/**/*.test.ts'
298
+ ```
299
+
300
+ 인자 없이 실행하면 비어 있지만 유효한 계약을 생성합니다. `scope.include` 경로를 지정하기
301
+ 전까지 범위 검사는 꺼져 있고, 테스트 변경 검사는 `--test-source`와 `--test-file`을 함께
302
+ 지정해야 켜집니다. 다른 디렉터리는 `--cwd`로 지정합니다. 이 명령은 v0.9.0부터 제공됩니다.
303
+
266
304
  분석할 저장소의 `.intentpatch.json`에 이번 요청의 기대 범위를 선언할 수 있습니다.
267
305
 
268
306
  ```json
@@ -427,7 +465,7 @@ npm run check
427
465
  - 생성한 npm tarball을 임시 프로젝트에 설치하고 실행하는 패키지 통합 테스트
428
466
  - 계층 간 의존 방향을 검증하는 아키텍처 테스트
429
467
 
430
- 외부 저장소의 실제 변경 32건에서 공개 API·의존성·범위·테스트 규칙의 경고를 사람이 검토한 기대 결과와 비교하는
468
+ 외부 저장소의 실제 변경 36건에서 공개 API·의존성·범위·테스트 규칙의 경고를 사람이 검토한 기대 결과와 비교하는
431
469
  방법은 [외부 저장소 평가 문서](./docs/external-repository-evaluation.md)에 정리했습니다.
432
470
 
433
471
  프로덕션 빌드만 확인하려면 다음 명령을 사용합니다.
@@ -444,7 +482,7 @@ npm pack --dry-run
444
482
 
445
483
  ## 릴리스
446
484
 
447
- `v0.8.0`처럼 `package.json` 버전과 일치하는 태그를 기본 브랜치의 커밋에 push하면 릴리스
485
+ `v0.9.1`처럼 `package.json` 버전과 일치하는 태그를 기본 브랜치의 커밋에 push하면 릴리스
448
486
  워크플로가 다음 작업을 순서대로 수행합니다.
449
487
 
450
488
  1. 태그·버전·기본 브랜치 포함 여부 검증
@@ -472,7 +510,7 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
472
510
  - ✅ pnpm `pnpm-lock.yaml` v9의 레지스트리 패키지 변경
473
511
  - ✅ pnpm workspace manifest의 직접 dependency 변경
474
512
  - ✅ Yarn 4 metadata-v8 `yarn.lock` 레지스트리 패키지 변경
475
- - Yarn workspace manifest 변경은 미구현
513
+ - ✅ Yarn workspace manifest의 직접 dependency 변경
476
514
  7. ✅ 직접 export된 공개 심볼 삭제와 export 해제 탐지
477
515
  - ✅ JavaScript ESM의 이름 있는 export·default export 삭제 탐지
478
516
  8. ✅ 단일 HTML 대시보드와 SVG 기반 dependency 영향 그래프
@@ -490,7 +528,7 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
490
528
  - 분석 대상은 최소 한 번 이상 커밋된 Git 저장소여야 합니다.
491
529
  - untracked symbolic link는 안전을 위해 내용을 읽지 않습니다.
492
530
  - 10 MiB를 초과하는 untracked 파일은 라인 수를 측정하지 않습니다.
493
- - 직접 dependency 선언 분석은 저장소 루트와 변경된 npm·pnpm workspace `package.json`의
531
+ - 직접 dependency 선언 분석은 저장소 루트와 변경된 npm·pnpm·Yarn workspace `package.json`의
494
532
  `dependencies`와 `devDependencies`를 대상으로 합니다.
495
533
  - 정적 참조 없음 finding은 미사용 확정이 아닌 검토 후보입니다. 유지보수 대상 JS/TS
496
534
  소스의 명시적 import·re-export·문자열 `require()`·`import()`를 살펴봅니다. CLI나 설정
@@ -501,8 +539,10 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
501
539
  - pnpm `pnpm-lock.yaml` v9은 프로젝트 문서의 레지스트리 패키지 ID와 버전을 비교합니다.
502
540
  integrity만 바뀐 경우, 로컬·Git 패키지, snapshot의 peer 변형, 부모 dependency 귀속은 분석하지 않습니다.
503
541
  루트의 직접 dependency 여부는 루트 importer를 기준으로 표시합니다.
504
- - workspace 판별은 루트의 npm `workspaces` 배열과 명시 경로, `*`·`**`·`?` 패턴을 지원합니다.
542
+ - npm·Yarn workspace 판별은 루트의 `workspaces` 배열과 명시 경로, `*`·`**`·`?` 패턴을 지원합니다.
505
543
  부정·중괄호·문자 클래스 패턴은 미지원 finding으로 보고합니다.
544
+ - Yarn 여부는 루트 `packageManager` 또는 `yarn.lock`으로 구분합니다. pnpm 설정이 함께
545
+ 있으면 중복 보고를 막기 위해 pnpm을 우선합니다.
506
546
  - pnpm workspace는 `pnpm-workspace.yaml`의 `packages`에 명시한 `*`·`**`·`?`와 선행 `!`
507
547
  제외 패턴을 지원합니다. npm 설정이 함께 있으면 중복 보고를 막기 위해 pnpm 설정을
508
548
  우선합니다. 그 외 glob 문법과 catalog는 해석하지 않습니다.
@@ -515,16 +555,16 @@ npm provenance가 자동 생성됩니다. 아직 npm에 존재하지 않는 신
515
555
  - TypeScript 심볼 분석은 `.ts`와 `.tsx`의 이름이 있는 최상위 함수, 클래스, 인터페이스, 타입
516
556
  별칭만 지원합니다.
517
557
  - JavaScript 심볼 분석은 `.js`·`.jsx`·`.mjs`·`.cjs`의 최상위 함수·클래스·변수 및 식별 가능한
518
- ESM export를 추적합니다. CommonJS `module.exports`는 아직 공개 API 분석 대상이 아닙니다.
558
+ ESM export와 최상위의 정적 `exports.name =`·`module.exports.name =` 할당을 추적합니다.
519
559
  - TypeScript 공개 API 분석은 이름이 있는 최상위 함수·인터페이스와 객체 리터럴, 같은 파일의
520
560
  비제네릭 별칭·교집합으로 구성된 공개 타입 별칭의 구성원 삭제를 지원합니다. 로컬
521
561
  `export { name }`, 외부 `export { name } from`, `export * from`은 export 근거로 추적합니다.
522
- JavaScript는 이름 있는 ESM export와 default export 삭제를 탐지하지만 함수의 타입 호환성을
562
+ JavaScript는 이름 있는 ESM export·default export와 정적 CommonJS 이름 삭제를 탐지하지만 함수의 타입 호환성을
523
563
  추정하지 않습니다. 변경 전 루트·하위 패키지의 `exports`가 소스 파일을 직접 가리키면 공개
524
564
  진입점과 상대 경로 re-export가 도달하는 파일에만 공개 API 경고를 냅니다. 이는 파일 단위
525
565
  근사치로, 이름 있는 re-export가 파일의 일부 심볼만 노출하는 경우도 있습니다. 생성된
526
566
  진입점이나 해석 불가능한 경로에서는 비공개라고 단정하지 않고 기존 경고를 유지합니다.
527
- CommonJS `module.exports`, 클래스 계약, 제네릭 별칭 인스턴스화, 합집합, 파일 간 타입 참조와
567
+ CommonJS 객체 전체 대입·동적 속성·중첩 대입, 클래스 계약, 제네릭 별칭 인스턴스화, 합집합, 파일 간 타입 참조와
528
568
  완전한 타입 할당 가능성은 해석하지 않습니다. 지원하지
529
569
  않는 타입 별칭 형태에서는 구성원 삭제 finding을 내지 않습니다.
530
570
  - 함수 호환성은 먼저 기록된 시그니처를 비교하고, 외부 참조 없이 해석할 수 있는 명시적 타입은
package/README.md CHANGED
@@ -16,16 +16,35 @@ 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.1 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.8.0 CLI without
22
- installing it globally:
36
+ IntentPatch requires Node.js 20 or later and Git. From the repository you want to review, run
37
+ the published v0.9.1 CLI without installing it globally:
23
38
 
24
39
  ```bash
25
- npx intentpatch analyze --cwd /path/to/repository
26
- npx intentpatch analyze --format html --output intentpatch-report.html
40
+ cd /path/to/repository
41
+ npx intentpatch analyze
42
+ npx intentpatch analyze --format html --output ../intentpatch-report.html
27
43
  ```
28
44
 
45
+ For the complete `init → analyze → HTML` walkthrough and common errors, see the
46
+ [first-run guide](./docs/first-run.md). HTML findings link to bounded local Git diff previews.
47
+
29
48
  To run the current source version instead, build it from the repository:
30
49
 
31
50
  ```bash
@@ -62,7 +81,7 @@ jobs:
62
81
 
63
82
  - name: Analyze pull request
64
83
  id: intentpatch
65
- uses: xx2xxjaeil/intent-patch@v0.8.0
84
+ uses: xx2xxjaeil/intent-patch@v0.9.1
66
85
  with:
67
86
  fail-on: high
68
87
 
@@ -74,10 +93,12 @@ jobs:
74
93
  path: intentpatch-report
75
94
  ```
76
95
 
77
- Pin the action to a released version or an immutable commit SHA. v0.8.0 adds Yarn 4
78
- lockfile analysis, explicit source-to-test mappings, report filters, and improved impact-graph
79
- navigation. It also includes package-entrypoint-aware public API warnings, historical import
80
- impact for deleted modules, and opt-in Claude Code, Codex, and Cursor Hooks.
96
+ Pin the action to a released version or an immutable commit SHA. v0.9.1 adds HTML diff previews,
97
+ expanded external evaluation, and static CommonJS named-export removal checks. v0.9.0 added Yarn workspace
98
+ dependency analysis and a safe `init` command for creating a Change Contract. It also includes
99
+ Yarn 4 lockfile analysis, explicit source-to-test mappings, report filters, improved impact-graph
100
+ navigation, package-entrypoint-aware public API warnings, historical import impact for deleted
101
+ modules, and opt-in Claude Code, Codex, and Cursor Hooks.
81
102
  See [the evaluation report](./docs/external-repository-evaluation.md) for the separately measured
82
103
  public-API rules and their limits. `@main` follows unreleased changes.
83
104
 
@@ -137,12 +158,14 @@ Every finding includes the relevant file, a stable rule ID, and evidence for the
137
158
  For reports generated from actual commits, see the
138
159
  [standalone HTML example](./docs/examples/intent-input-change.html), the
139
160
  [three-case self-repository study](./docs/real-world-evaluation.md), and the
140
- [external evaluation of 32 changes and 38 rule checks](./docs/external-repository-evaluation.md). After cloning,
161
+ [external evaluation of 36 changes and 43 rule checks](./docs/external-repository-evaluation.md). After cloning,
141
162
  open the HTML file locally in a browser; GitHub may show its source rather than render it.
142
163
 
143
164
  ## Implemented capabilities
144
165
 
145
- 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.
166
+ The CLI analyzes Git changes, direct dependencies in the root and npm/pnpm/Yarn workspace manifests,
167
+ lockfile changes, top-level TypeScript and JavaScript symbols and public exports, possible duplicate
168
+ implementations, single-implementation abstractions, import-graph impact, and related test changes.
146
169
 
147
170
  ### Git and reporting
148
171
 
@@ -170,6 +193,7 @@ The current source tree analyzes Git changes, direct dependencies in the root `p
170
193
  - Compare resolved registry package changes in pnpm `pnpm-lock.yaml` v9, including two-document lockfiles.
171
194
  - Report malformed or unsupported lockfiles as findings rather than silently skipping them.
172
195
  - Attribute direct dependency changes to changed npm workspace manifests selected by the root `workspaces` patterns.
196
+ - Attribute changed Yarn workspace manifests using the same root `workspaces` patterns, with Yarn provenance when `packageManager` or `yarn.lock` identifies Yarn.
173
197
  - Analyze changed pnpm workspace manifests selected by `pnpm-workspace.yaml`, including exclusion patterns.
174
198
  - Report changes to workspace patterns and manifest moves into or out of a configured workspace.
175
199
  - Extract top-level named functions, classes, interfaces, and type aliases from `.ts` and `.tsx` files.
@@ -256,6 +280,22 @@ intentpatch analyze --intent-file request.md --format html --output report.html
256
280
 
257
281
  ### Check request scope with a Change Contract
258
282
 
283
+ `intentpatch init` creates `.intentpatch.json` without overwriting an
284
+ existing file. Supply actual paths for the requested change; it never guesses scope from the
285
+ request text:
286
+
287
+ ```bash
288
+ intentpatch init \
289
+ --intent "Implement account deletion" \
290
+ --include 'src/user/**' --include 'tests/user/**' \
291
+ --allow package.json \
292
+ --test-source 'src/**/*.ts' --test-file 'tests/**/*.test.ts'
293
+ ```
294
+
295
+ `init` with no options creates a valid blank contract. Scope checks remain off until you add an
296
+ expected `--include` path; test-change checks require both `--test-source` and `--test-file`.
297
+ Use `--cwd` to target another directory. This command is included in v0.9.0 and later.
298
+
259
299
  Create `.intentpatch.json` in the repository being analyzed and declare the expected scope of the request:
260
300
 
261
301
  ```json
@@ -422,7 +462,7 @@ This command runs:
422
462
  - architecture tests that enforce dependency direction;
423
463
  - a reproducibility check for the bundled GitHub Action.
424
464
 
425
- For a reproducible check of 38 rule decisions across 32 reviewed changes in external
465
+ For a reproducible check of 43 rule decisions across 36 reviewed changes in external
426
466
  repositories, see the [external evaluation](./docs/external-repository-evaluation.md).
427
467
 
428
468
  Run only the production build with:
@@ -439,7 +479,7 @@ npm pack --dry-run
439
479
 
440
480
  ## Release process
441
481
 
442
- Pushing a tag such as `v0.8.0`, matching the version in `package.json`, from a commit contained in the default branch triggers the release workflow:
482
+ Pushing a tag such as `v0.9.1`, matching the version in `package.json`, from a commit contained in the default branch triggers the release workflow:
443
483
 
444
484
  1. Validate the tag, package version, and default-branch ancestry.
445
485
  2. Run the full quality suite and inspect the npm package with a dry run.
@@ -463,7 +503,7 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
463
503
  - ✅ pnpm `pnpm-lock.yaml` v9 resolved registry package changes
464
504
  - ✅ pnpm workspace manifest dependency changes
465
505
  - ✅ Yarn 4 metadata-v8 `yarn.lock` resolved registry package changes
466
- - Yarn workspace manifest changes remain open
506
+ - ✅ Yarn workspace manifest dependency changes
467
507
  7. ✅ Detection of removed public exports
468
508
  - ✅ Named and default ESM exports in JavaScript, without inferred type compatibility
469
509
  8. ✅ Standalone HTML dashboard and SVG dependency-impact graph
@@ -481,11 +521,11 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
481
521
  - The target must be a Git repository with at least one commit.
482
522
  - Untracked symbolic links are not read for safety.
483
523
  - Line counts are skipped for untracked files larger than 10 MiB.
484
- - Direct dependency declarations are analyzed from `dependencies` and `devDependencies` in the root `package.json` and changed npm/pnpm workspace manifests.
524
+ - Direct dependency declarations are analyzed from `dependencies` and `devDependencies` in the root `package.json` and changed npm/pnpm/Yarn workspace manifests.
485
525
  - 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.
486
526
  - 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.
487
527
  - 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.
488
- - Workspace detection supports the root npm `workspaces` array with explicit paths and `*`, `**`, and `?` globs. Negation, brace, and character-class patterns are reported as unsupported.
528
+ - 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.
489
529
  - 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.
490
530
  - Yarn 4 `yarn.lock` metadata-v8 analysis compares registry package resolutions and versions.
491
531
  Yarn Classic and other metadata versions are reported as unsupported. Workspace, patch, file,
@@ -493,7 +533,7 @@ No long-lived npm token is stored as a GitHub secret. Public packages published
493
533
  Runtime dependency usage is not established.
494
534
  - 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.
495
535
  - 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.
496
- - 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.
536
+ - 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 and static top-level `exports.name =` / `module.exports.name =` 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. Whole-object CommonJS assignments, dynamic keys, nested assignments, 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.
497
537
  - 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.
498
538
  - Interface property compatibility recognizes unchanged types and optional fields added inside
499
539
  supported object literals, including `Readonly` wrappers. Other nested type transformations
@@ -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":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,YAAY,GAAG,cAAc,CAAC;AACpC,oDAAoD;AACpD,MAAM,OAAO,wBAAwB;IAEhB;IACA;IACA;IACA;IAJnB,YACmB,SAA6B,EAC7B,KAAwB,EACxB,SAAmC,EACnC,mBAAwC;QAHxC,cAAS,GAAT,SAAS,CAAoB;QAC7B,UAAK,GAAL,KAAK,CAAmB;QACxB,cAAS,GAAT,SAAS,CAA0B;QACnC,wBAAmB,GAAnB,mBAAmB,CAAqB;IACxD,CAAC;IAEG,KAAK,CAAC,OAAO,CAAC,OAAwB;QAC3C,MAAM,gBAAgB,GAAG,CACvB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YACxE,IAAI,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YAC/D,IAAI,2BAA2B,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3F,CAAC,CACH,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CACnC,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,MAAM,KAAK,2BAA2B;YAC9C,OAAO,CAAC,MAAM,KAAK,4BAA4B,CAClD,CAAC;QACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAC/D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,CACxE,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;YAAE,OAAO,EAAE,CAAC;QAC1D,IAAI,QAAQ,GAAG,IAAI,CAAC;QAEpB,sDAAsD;QACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,QAAQ,GAAG,KAAK,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,mBAAmB,KAAK,IAAI,EAAE,CAAC;gBAC7E,QAAQ,GAAG,KAAK,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC9C,MAAM,WAAW,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,WAAW,KAAK,SAAS;oBAAE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEzB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YAChE,OAAO;gBACL;oBACE,MAAM,EAAE,gCAAgC;oBACxC,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,+CAA+C;oBACtD,WAAW,EAAE,GAAG,IAAI,iBAAiB,OAAO,CAAC,IAAI,gHAAgH;oBACjK,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,QAAQ,EAAE;wBACR,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACzC,YAAY,EAAE,KAAK,CAAC,MAAM;wBAC1B,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS;4BAC1C,CAAC,CAAC,EAAE;4BACJ,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;wBAC9C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS;4BAC/C,CAAC,CAAC,EAAE;4BACJ,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;qBACzD;iBACgB;aACpB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,wBAAwB,CAAC,SAAiB;IACjD,IACE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC;QAE7B,OAAO,SAAS,CAAC;IACnB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/F,CAAC"}
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,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"}
@@ -1,7 +1,7 @@
1
1
  import { isRecord } from "../../domain/value-guards.js";
2
2
  import { analyzeWorkspaceManifests, isNestedManifestChange, } from "../services/workspace-manifest-analysis.js";
3
3
  const rootManifestPath = "package.json";
4
- /** npm workspaces에 속한 변경 manifest를 찾아 기존 직접 dependency 규칙으로 분석한다. */
4
+ /** 기존 공개 클래스명을 유지하며 package.json workspaces를 npm 또는 Yarn으로 분류한다. */
5
5
  export class NpmWorkspaceDependencyRule {
6
6
  snapshots;
7
7
  constructor(snapshots) {
@@ -13,16 +13,20 @@ export class NpmWorkspaceDependencyRule {
13
13
  if (manifestChanges.length === 0 && !rootChanged) {
14
14
  return [];
15
15
  }
16
- // pnpm-workspace.yaml이 있으면 pnpm 설정이 우선한다. 동일 manifest의 finding 중복을 피한다.
16
+ // pnpm 설정이 있으면 별도 규칙이 담당한다. Yarn lockfile이 있으면 Yarn으로 귀속한다.
17
17
  const pnpmConfig = await this.snapshots.read(context.target, "pnpm-workspace.yaml");
18
18
  if (pnpmConfig.before !== undefined || pnpmConfig.after !== undefined)
19
19
  return [];
20
20
  const snapshot = await this.snapshots.read(context.target, rootManifestPath);
21
21
  const before = parseWorkspaceConfig(snapshot.before);
22
22
  const after = parseWorkspaceConfig(snapshot.after);
23
+ const yarnLock = await this.snapshots.read(context.target, "yarn.lock");
24
+ const manager = (after.ok ? after.managerHint : undefined) ??
25
+ (before.ok ? before.managerHint : undefined) ??
26
+ (yarnLock.before !== undefined || yarnLock.after !== undefined ? "yarn" : "npm");
23
27
  const errors = [
24
- ...(!before.ok ? [configFinding("base", before)] : []),
25
- ...(!after.ok ? [configFinding("current", after)] : []),
28
+ ...(!before.ok ? [configFinding("base", before, manager)] : []),
29
+ ...(!after.ok ? [configFinding("current", after, manager)] : []),
26
30
  ];
27
31
  if (errors.length > 0) {
28
32
  return errors;
@@ -33,20 +37,23 @@ export class NpmWorkspaceDependencyRule {
33
37
  const findings = [];
34
38
  if (rootChanged && JSON.stringify(before.patterns) !== JSON.stringify(after.patterns)) {
35
39
  findings.push({
36
- ruleId: "dependency/workspace-config-changed",
40
+ ruleId: manager === "yarn"
41
+ ? "dependency/yarn-workspace-config-changed"
42
+ : "dependency/workspace-config-changed",
37
43
  severity: "low",
38
- title: "npm workspace configuration changed",
44
+ title: `${manager} workspace configuration changed`,
39
45
  description: "The root package.json workspace patterns changed.",
40
46
  file: rootManifestPath,
41
47
  evidence: {
42
48
  from: JSON.stringify(before.patterns),
43
49
  to: JSON.stringify(after.patterns),
50
+ ...(manager === "yarn" ? { packageManager: manager } : {}),
44
51
  },
45
52
  });
46
53
  }
47
54
  return [
48
55
  ...findings,
49
- ...(await analyzeWorkspaceManifests(context, this.snapshots, manifestChanges, { includes: before.patterns, excludes: [] }, { includes: after.patterns, excludes: [] }, "npm")),
56
+ ...(await analyzeWorkspaceManifests(context, this.snapshots, manifestChanges, { includes: before.patterns, excludes: [] }, { includes: after.patterns, excludes: [] }, manager)),
50
57
  ];
51
58
  }
52
59
  }
@@ -64,8 +71,13 @@ function parseWorkspaceConfig(content) {
64
71
  if (!isRecord(manifest)) {
65
72
  return { ok: false, kind: "invalid", reason: "The root package.json must be an object." };
66
73
  }
74
+ const managerHint = typeof manifest.packageManager === "string" && manifest.packageManager.startsWith("yarn@")
75
+ ? "yarn"
76
+ : typeof manifest.packageManager === "string" && manifest.packageManager.startsWith("npm@")
77
+ ? "npm"
78
+ : undefined;
67
79
  if (manifest.workspaces === undefined) {
68
- return { ok: true, patterns: [] };
80
+ return { ok: true, patterns: [], ...(managerHint === undefined ? {} : { managerHint }) };
69
81
  }
70
82
  if (!Array.isArray(manifest.workspaces)) {
71
83
  return { ok: false, kind: "invalid", reason: "workspaces must be an array of paths." };
@@ -88,20 +100,24 @@ function parseWorkspaceConfig(content) {
88
100
  }
89
101
  patterns.push(pattern);
90
102
  }
91
- return { ok: true, patterns };
103
+ return { ok: true, patterns, ...(managerHint === undefined ? {} : { managerHint }) };
92
104
  }
93
- function configFinding(side, result) {
105
+ function configFinding(side, result, manager) {
94
106
  return {
95
107
  ruleId: result.kind === "invalid"
96
108
  ? "dependency/invalid-workspace-config"
97
109
  : "dependency/unsupported-workspace-pattern",
98
110
  severity: result.kind === "invalid" ? "high" : "low",
99
111
  title: result.kind === "invalid"
100
- ? "Invalid npm workspace configuration"
101
- : "Unsupported npm workspace pattern",
102
- description: `Could not analyze the ${side} npm workspaces: ${result.reason}`,
112
+ ? `Invalid ${manager} workspace configuration`
113
+ : `Unsupported ${manager} workspace pattern`,
114
+ description: `Could not analyze the ${side} ${manager} workspaces: ${result.reason}`,
103
115
  file: rootManifestPath,
104
- evidence: { side, reason: result.reason },
116
+ evidence: {
117
+ side,
118
+ reason: result.reason,
119
+ ...(manager === "yarn" ? { packageManager: manager } : {}),
120
+ },
105
121
  };
106
122
  }
107
123
  //# sourceMappingURL=npm-workspace-dependency-rule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"npm-workspace-dependency-rule.js","sourceRoot":"","sources":["../../../src/application/rules/npm-workspace-dependency-rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"npm-workspace-dependency-rule.js","sourceRoot":"","sources":["../../../src/application/rules/npm-workspace-dependency-rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { NpmWorkspaceDependencyRule } from "./npm-workspace-dependency-rule.js";
2
+ /** npm과 Yarn이 공유하는 package.json workspace 규칙의 명시적 이름. */
3
+ export declare class PackageJsonWorkspaceDependencyRule extends NpmWorkspaceDependencyRule {
4
+ }
5
+ //# sourceMappingURL=package-json-workspace-dependency-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json-workspace-dependency-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/package-json-workspace-dependency-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAEhF,yDAAyD;AACzD,qBAAa,kCAAmC,SAAQ,0BAA0B;CAAG"}
@@ -0,0 +1,5 @@
1
+ import { NpmWorkspaceDependencyRule } from "./npm-workspace-dependency-rule.js";
2
+ /** npm과 Yarn이 공유하는 package.json workspace 규칙의 명시적 이름. */
3
+ export class PackageJsonWorkspaceDependencyRule extends NpmWorkspaceDependencyRule {
4
+ }
5
+ //# sourceMappingURL=package-json-workspace-dependency-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json-workspace-dependency-rule.js","sourceRoot":"","sources":["../../../src/application/rules/package-json-workspace-dependency-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAEhF,yDAAyD;AACzD,MAAM,OAAO,kCAAmC,SAAQ,0BAA0B;CAAG"}
@@ -9,4 +9,5 @@ export interface WorkspacePatterns {
9
9
  export declare function isNestedManifestChange(change: FileChange): boolean;
10
10
  /** 패키지 매니저별 설정 해석 뒤에는 같은 manifest 비교·membership 규칙을 적용한다. */
11
11
  export declare function analyzeWorkspaceManifests(context: AnalysisContext, snapshots: FileSnapshotSource, changes: readonly FileChange[], before: WorkspacePatterns, after: WorkspacePatterns, manager: "npm" | "pnpm"): Promise<Finding[]>;
12
+ export declare function analyzeWorkspaceManifests(context: AnalysisContext, snapshots: FileSnapshotSource, changes: readonly FileChange[], before: WorkspacePatterns, after: WorkspacePatterns, manager: "npm" | "pnpm" | "yarn"): Promise<Finding[]>;
12
13
  //# sourceMappingURL=workspace-manifest-analysis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-manifest-analysis.d.ts","sourceRoot":"","sources":["../../../src/application/services/workspace-manifest-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAM3E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAElE;AAED,6DAA6D;AAC7D,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,KAAK,GAAG,MAAM,GACtB,OAAO,CAAC,OAAO,EAAE,CAAC,CAgDpB"}
1
+ {"version":3,"file":"workspace-manifest-analysis.d.ts","sourceRoot":"","sources":["../../../src/application/services/workspace-manifest-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAM3E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAElE;AAED,6DAA6D;AAC7D,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,KAAK,GAAG,MAAM,GACtB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AACtB,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAC/B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC"}
@@ -4,7 +4,6 @@ const manifestSuffix = "/package.json";
4
4
  export function isNestedManifestChange(change) {
5
5
  return isNestedManifestPath(change.path) || isNestedManifestPath(change.previousPath);
6
6
  }
7
- /** 패키지 매니저별 설정 해석 뒤에는 같은 manifest 비교·membership 규칙을 적용한다. */
8
7
  export async function analyzeWorkspaceManifests(context, snapshots, changes, before, after, manager) {
9
8
  const results = await Promise.all(changes.map(async (change) => {
10
9
  const previousPath = change.kind === "renamed" ? (change.previousPath ?? change.path) : change.path;
@@ -28,6 +27,7 @@ export async function analyzeWorkspaceManifests(context, snapshots, changes, bef
28
27
  currentPath,
29
28
  fromWorkspace: wasWorkspace,
30
29
  toWorkspace: isCurrentWorkspace,
30
+ ...(manager === "npm" ? {} : { packageManager: manager }),
31
31
  },
32
32
  },
33
33
  ]
@@ -40,7 +40,7 @@ export async function analyzeWorkspaceManifests(context, snapshots, changes, bef
40
40
  evidence: {
41
41
  ...finding.evidence,
42
42
  workspace,
43
- ...(manager === "pnpm" ? { packageManager: manager } : {}),
43
+ ...(manager === "npm" ? {} : { packageManager: manager }),
44
44
  },
45
45
  })),
46
46
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-manifest-analysis.js","sourceRoot":"","sources":["../../../src/application/services/workspace-manifest-analysis.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-manifest-analysis.js","sourceRoot":"","sources":["../../../src/application/services/workspace-manifest-analysis.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,cAAc,GAAG,eAAe,CAAC;AAOvC,MAAM,UAAU,sBAAsB,CAAC,MAAkB;IACvD,OAAO,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACxF,CAAC;AAmBD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAwB,EACxB,SAA6B,EAC7B,OAA8B,EAC9B,MAAyB,EACzB,KAAwB,EACxB,OAAgC;IAEhC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3B,MAAM,YAAY,GAChB,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACjF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAChC,MAAM,YAAY,GAChB,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC3F,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACxF,IAAI,CAAC,YAAY,IAAI,CAAC,kBAAkB;YAAE,OAAO,EAAE,CAAC;QAEpD,MAAM,YAAY,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QACpF,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,iBAAiB,GACrB,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,YAAY,KAAK,kBAAkB;YAC9D,CAAC,CAAC;gBACE;oBACE,MAAM,EAAE,yCAAyC;oBACjD,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,GAAG,OAAO,+BAA+B;oBAChD,WAAW,EAAE,GAAG,YAAY,aAAa,WAAW,kCAAkC;oBACtF,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE;wBACR,YAAY;wBACZ,WAAW;wBACX,aAAa,EAAE,YAAY;wBAC3B,WAAW,EAAE,kBAAkB;wBAC/B,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;qBAC1D;iBACF;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,YAAY,GAAG,MAAM,IAAI,qBAAqB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,OAAO,CACnF,OAAO,CACR,CAAC;QACF,OAAO;YACL,GAAG,iBAAiB;YACpB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAChC,GAAG,OAAO;gBACV,QAAQ,EAAE;oBACR,GAAG,OAAO,CAAC,QAAQ;oBACnB,SAAS;oBACT,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;iBAC1D;aACF,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAwB;IACpD,OAAO,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,QAA2B;IAC5D,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC3E,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAC7E,CAAC;AACJ,CAAC"}