@simplysm/sd-cli 14.0.48 → 14.0.49

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 (75) hide show
  1. package/package.json +5 -5
  2. package/tests/angular/angular-compiler-hmr-removal.verify.md +12 -12
  3. package/tests/angular/onbuild-lint-removal.verify.md +4 -4
  4. package/tests/angular/vite-angular-plugin-sdtscompiler.verify.md +9 -9
  5. package/tests/angular/vite-angular-plugin-vitest.verify.md +16 -16
  6. package/tests/capacitor/capacitor-android-exports.verify.md +7 -7
  7. package/tests/commands/publish-npm-local-split.verify.md +5 -5
  8. package/tests/commands/publish-responsibility-split.verify.md +9 -9
  9. package/tests/commands/publish-set.verify.md +3 -3
  10. package/tests/commands/publish-storage-split.verify.md +4 -4
  11. package/tests/commands/slice3-severity-cleanup.verify.md +8 -8
  12. package/tests/deps/deps-directory-separation.verify.md +11 -11
  13. package/tests/deps/replace-deps/replace-deps-perf.verify.md +6 -6
  14. package/tests/deps/server-externals/mise-toml-parse-intent.verify.md +8 -8
  15. package/tests/electron/electron-symlink-cleanup.verify.md +4 -4
  16. package/tests/engines/engine-duplicate-output-removal.verify.md +6 -6
  17. package/tests/engines/engine-typecheck-selection.verify.md +4 -4
  18. package/tests/engines/esbuild-client-engine.verify.md +11 -11
  19. package/tests/engines/normalize-result.verify.md +5 -5
  20. package/tests/engines/vite-dependency-cleanup.verify.md +11 -11
  21. package/tests/esbuild/esbuild-angular-compiler-plugin-hmr.verify.md +10 -10
  22. package/tests/esbuild/esbuild-angular-compiler-plugin-onload.verify.md +17 -17
  23. package/tests/esbuild/esbuild-angular-compiler-plugin-onstart-extraction.verify.md +12 -12
  24. package/tests/esbuild/esbuild-angular-compiler-plugin-sdtscompiler.verify.md +11 -11
  25. package/tests/esbuild/esbuild-angular-compiler-plugin-stylesheet.verify.md +13 -13
  26. package/tests/esbuild/esbuild-angular-compiler-plugin-worker.verify.md +32 -32
  27. package/tests/esbuild/esbuild-angular-compiler-plugin.verify.md +9 -9
  28. package/tests/esbuild/esbuild-postcss-plugin-chunking.verify.md +3 -3
  29. package/tests/esbuild/esbuild-tsc-plugin-imports.verify.md +9 -9
  30. package/tests/esbuild/esbuild-worker-plugin-node.verify.md +7 -7
  31. package/tests/esbuild/esbuild-worker-plugin.verify.md +3 -3
  32. package/tests/orchestrators/dist-delete-watcher.verify.md +6 -6
  33. package/tests/orchestrators/orchestrator-baseenv.verify.md +6 -6
  34. package/tests/orchestrators/orchestrator-diagnostic-formatting.verify.md +6 -6
  35. package/tests/orchestrators/orchestrator-initializemode-signature.verify.md +5 -5
  36. package/tests/orchestrators/slice1-stdout-to-consola.verify.md +6 -6
  37. package/tests/sd-cli-catch-all.verify.md +3 -3
  38. package/tests/sd-cli-log-tag.verify.md +7 -7
  39. package/tests/ts-compiler/SdTsCompiler-affected-files.verify.md +4 -4
  40. package/tests/ts-compiler/SdTsCompiler-diagnostics.verify.md +8 -8
  41. package/tests/ts-compiler/SdTsCompiler-emit.verify.md +5 -5
  42. package/tests/ts-compiler/SdTsCompiler.verify.md +20 -20
  43. package/tests/ts-compiler/scss-lint-integration.verify.md +10 -10
  44. package/tests/utils/copy-public-outdir.verify.md +4 -4
  45. package/tests/utils/dev-http-server.verify.md +4 -4
  46. package/tests/utils/engine-watch-events.verify.md +8 -8
  47. package/tests/utils/esbuild-client-config-integration.verify.md +5 -5
  48. package/tests/utils/esbuild-client-config-postcss.verify.md +2 -2
  49. package/tests/utils/esbuild-client-config.verify.md +16 -16
  50. package/tests/utils/esbuild-index-html.verify.md +6 -6
  51. package/tests/utils/esbuild-pwa.verify.md +5 -5
  52. package/tests/utils/esbuild-scss-plugin.verify.md +4 -4
  53. package/tests/utils/hmr-service.verify.md +10 -10
  54. package/tests/utils/lint-core-import-paths.verify.md +6 -6
  55. package/tests/utils/replace-deps-split.verify.md +11 -11
  56. package/tests/utils/replace-deps-watch.verify.md +5 -5
  57. package/tests/utils/server-production-files-import-paths.verify.md +10 -10
  58. package/tests/utils/vite-config-cleanup.verify.md +3 -3
  59. package/tests/workers/build-watch-paths-library.verify.md +6 -6
  60. package/tests/workers/build-watch-paths-ngtsc-server.verify.md +8 -8
  61. package/tests/workers/client-worker-browser-support.verify.md +3 -3
  62. package/tests/workers/client-worker-cleanup.verify.md +4 -4
  63. package/tests/workers/client-worker-initial-build-error.verify.md +3 -3
  64. package/tests/workers/client-worker-initial-build-warnings.verify.md +3 -3
  65. package/tests/workers/client-worker-mtime-incremental.verify.md +6 -6
  66. package/tests/workers/client-worker-onend-sync.verify.md +3 -3
  67. package/tests/workers/client-worker-refactor.verify.md +18 -18
  68. package/tests/workers/client-worker-ts-cache-invalidation.verify.md +8 -8
  69. package/tests/workers/dev-port-file.verify.md +3 -3
  70. package/tests/workers/ngtsc-build-rootnames-refresh.verify.md +4 -4
  71. package/tests/workers/server-build-context-dispose.verify.md +4 -4
  72. package/tests/workers/server-build-worker-plugin.verify.md +5 -5
  73. package/tests/workers/server-build-worker-refactoring.verify.md +10 -10
  74. package/tests/workers/server-esbuild-context-integration.verify.md +6 -6
  75. package/tests/workers/server-esbuild-context-tsc.verify.md +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
- "version": "14.0.48",
3
+ "version": "14.0.49",
4
4
  "description": "Simplysm package - CLI tool",
5
5
  "author": "simplysm",
6
6
  "license": "Apache-2.0",
@@ -22,7 +22,7 @@
22
22
  "@angular/build": "^21.2.7",
23
23
  "@angular/compiler-cli": "^21.2.9",
24
24
  "@fastify/http-proxy": "^11.4.4",
25
- "@inquirer/prompts": "^8.4.1",
25
+ "@inquirer/prompts": "^8.4.2",
26
26
  "acorn": "^8.16.0",
27
27
  "acorn-walk": "^8.3.5",
28
28
  "browserslist-to-esbuild": "^2.1.1",
@@ -44,9 +44,9 @@
44
44
  "ws": "^8.20.0",
45
45
  "yaml": "^2.8.3",
46
46
  "yargs": "^18.0.0",
47
- "@simplysm/storage": "14.0.48",
48
- "@simplysm/core-common": "14.0.48",
49
- "@simplysm/core-node": "14.0.48"
47
+ "@simplysm/core-node": "14.0.49",
48
+ "@simplysm/storage": "14.0.49",
49
+ "@simplysm/core-common": "14.0.49"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/semver": "^7.7.1",
@@ -2,15 +2,15 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] enableHmr 프로퍼티가 AngularCompilerOptions에서 제거됨: `angular-compiler.ts` 인터페이스에 `enableHmr` 없음 확인
6
- - [x] HMR_MODIFIED_FILE_LIMIT 상수가 제거됨: `angular-compiler.ts`에서 해당 상수 없음 확인
7
- - [x] collectHmrCandidates import가 제거됨: `angular-compiler.ts`에서 `hmr-candidates` import 없음 확인
8
- - [x] stale source file 수집 로직이 제거됨: `angular-compiler.ts`에서 `staleSourceFiles`, `useHmr` 변수 없음 확인
9
- - [x] enableHmr 프로퍼티가 AngularBuildPipelineOptions에서 제거됨: `angular-build-pipeline.ts` 인터페이스에 `enableHmr` 없음 확인
10
- - [x] templateUpdates 프로퍼티가 PipelineResult에서 제거됨: `angular-build-pipeline.ts` 인터페이스에 `templateUpdates` 없음 확인
11
- - [x] vite-angular-plugin.ts의 `enableHmr: false` 제거됨: Pipeline 생성 시 `enableHmr` 옵션 없음 확인
12
- - [x] hmr-candidates.ts 파일 삭제됨: `src/utils/hmr-candidates.ts` 파일 존재하지 않음
13
- - [x] angular-compiler-hmr.spec.ts 삭제됨: `tests/angular/angular-compiler-hmr.spec.ts` 파일 존재하지 않음
14
- - [x] hmr-candidates.spec.ts 삭제됨: `tests/angular/hmr-candidates.spec.ts` 파일 존재하지 않음
15
- - [x] client.worker.ts 변경 없음: `client.worker.ts`는 `createCompilerPlugin` 경로를 사용하며 AngularCompiler를 직접 참조하지 않음
16
- - [x] hmr-service.ts, hmr-client-script.ts, esbuild-client-config.ts 변경 없음: client.worker.ts 경로의 HMR 인프라는 그대로 유지됨
5
+ - enableHmr 프로퍼티가 AngularCompilerOptions에서 제거됨: `angular-compiler.ts` 인터페이스에 `enableHmr` 없음 확인
6
+ - HMR_MODIFIED_FILE_LIMIT 상수가 제거됨: `angular-compiler.ts`에서 해당 상수 없음 확인
7
+ - collectHmrCandidates import가 제거됨: `angular-compiler.ts`에서 `hmr-candidates` import 없음 확인
8
+ - stale source file 수집 로직이 제거됨: `angular-compiler.ts`에서 `staleSourceFiles`, `useHmr` 변수 없음 확인
9
+ - enableHmr 프로퍼티가 AngularBuildPipelineOptions에서 제거됨: `angular-build-pipeline.ts` 인터페이스에 `enableHmr` 없음 확인
10
+ - templateUpdates 프로퍼티가 PipelineResult에서 제거됨: `angular-build-pipeline.ts` 인터페이스에 `templateUpdates` 없음 확인
11
+ - vite-angular-plugin.ts의 `enableHmr: false` 제거됨: Pipeline 생성 시 `enableHmr` 옵션 없음 확인
12
+ - hmr-candidates.ts 파일 삭제됨: `src/utils/hmr-candidates.ts` 파일 존재하지 않음
13
+ - angular-compiler-hmr.spec.ts 삭제됨: `tests/angular/angular-compiler-hmr.spec.ts` 파일 존재하지 않음
14
+ - hmr-candidates.spec.ts 삭제됨: `tests/angular/hmr-candidates.spec.ts` 파일 존재하지 않음
15
+ - client.worker.ts 변경 없음: `client.worker.ts`는 `createCompilerPlugin` 경로를 사용하며 AngularCompiler를 직접 참조하지 않음
16
+ - hmr-service.ts, hmr-client-script.ts, esbuild-client-config.ts 변경 없음: client.worker.ts 경로의 HMR 인프라는 그대로 유지됨
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] `SdAngularPluginOptions.onBuild` 타입에서 `lint?` 필드가 제거됨: `vite-angular-plugin.ts:32-35` — `result` 타입이 `{ success: boolean; errors?: string[]; warnings?: string[] }` 으로 변경됨, `lint?` 없음
6
- - [x] `CreateClientViteConfigOptions.onBuild` 타입에서 `lint?` 필드가 제거됨: `vite-config.ts:34-37` — 동일하게 `lint?` 없음
7
- - [x] `vite-angular-plugin.ts`에서 `LintWithProgramResult` import 제거됨: import 목록에 해당 import 없음
8
- - [x] `vite-angular-plugin.ts`의 3개 `onBuild` 호출 지점(buildStart:321, handleHotUpdate:409, handleHotUpdate:433)에서 lint 미전달 — 기존에도 전달하지 않았으므로 변경 없음, 타입 정합
5
+ - `SdAngularPluginOptions.onBuild` 타입에서 `lint?` 필드가 제거됨: `vite-angular-plugin.ts:32-35` — `result` 타입이 `{ success: boolean; errors?: string[]; warnings?: string[] }` 으로 변경됨, `lint?` 없음
6
+ - `CreateClientViteConfigOptions.onBuild` 타입에서 `lint?` 필드가 제거됨: `vite-config.ts:34-37` — 동일하게 `lint?` 없음
7
+ - `vite-angular-plugin.ts`에서 `LintWithProgramResult` import 제거됨: import 목록에 해당 import 없음
8
+ - `vite-angular-plugin.ts`의 3개 `onBuild` 호출 지점(buildStart:321, handleHotUpdate:409, handleHotUpdate:433)에서 lint 미전달 — 기존에도 전달하지 않았으므로 변경 없음, 타입 정합
@@ -2,12 +2,12 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] AngularBuildPipeline import 제거: `vite-angular-plugin.ts:6` — `SdTsCompiler` import으로 교체, `AngularBuildPipeline` 미사용
6
- - [x] SdTsCompiler 인스턴스 생성: `:69-81` — `new SdTsCompiler({ pkgDir, cwd, output: { js: true, dts: false }, sourceFileCache, compilerOptionsTransformer })` 올바르게 구성
7
- - [x] compileAsync 호출: `:90` — `sdTsCompiler.compileAsync(modifiedFiles)` 호출, modifiedFiles는 pendingWatchChanges에서 수집
8
- - [x] emitResults → emittedFilesBySource 매핑: `:93-95` — `pathx.posix(sourceFileName)` 키로 저장
9
- - [x] transform 훅: `:107-124` — `emittedFilesBySource.get(normalizedId)` 조회, 인라인 소스맵 분리 유지
10
- - [x] buildEnd에서 sdTsCompiler 참조 해제: `:127` — `sdTsCompiler = undefined`
11
- - [x] watch 모드 증분 빌드: `:61-66` — pendingWatchChanges를 modifiedFiles로 전달, compileAsync에서 증분 처리
12
- - [x] 이미 초기화됐고 변경 없으면 건너뜀: `:84-87` — `emittedFilesBySource.size > 0 && modifiedFiles == null` 조건
13
- - [x] 기존 테스트 회귀: vite-angular-plugin.spec.ts 6개, vite-angular-plugin-vitest.spec.ts + legacy-watch.spec.ts 5개 모두 통과
5
+ - AngularBuildPipeline import 제거: `vite-angular-plugin.ts:6` — `SdTsCompiler` import으로 교체, `AngularBuildPipeline` 미사용
6
+ - SdTsCompiler 인스턴스 생성: `:69-81` — `new SdTsCompiler({ pkgDir, cwd, output: { js: true, dts: false }, sourceFileCache, compilerOptionsTransformer })` 올바르게 구성
7
+ - compileAsync 호출: `:90` — `sdTsCompiler.compileAsync(modifiedFiles)` 호출, modifiedFiles는 pendingWatchChanges에서 수집
8
+ - emitResults → emittedFilesBySource 매핑: `:93-95` — `pathx.posix(sourceFileName)` 키로 저장
9
+ - transform 훅: `:107-124` — `emittedFilesBySource.get(normalizedId)` 조회, 인라인 소스맵 분리 유지
10
+ - buildEnd에서 sdTsCompiler 참조 해제: `:127` — `sdTsCompiler = undefined`
11
+ - watch 모드 증분 빌드: `:61-66` — pendingWatchChanges를 modifiedFiles로 전달, compileAsync에서 증분 처리
12
+ - 이미 초기화됐고 변경 없으면 건너뜀: `:84-87` — `emittedFilesBySource.size > 0 && modifiedFiles == null` 조건
13
+ - 기존 테스트 회귀: vite-angular-plugin.spec.ts 6개, vite-angular-plugin-vitest.spec.ts + legacy-watch.spec.ts 5개 모두 통과
@@ -2,19 +2,19 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] vite-config.ts 삭제됨: `ls packages/sd-cli/src/utils/vite-config.ts` → 파일 없음 확인
6
- - [x] vite-scope-watch-plugin.ts 삭제됨: `ls packages/sd-cli/src/utils/vite-scope-watch-plugin.ts` → 파일 없음 확인
7
- - [x] vite-postcss-inline-plugin.ts 삭제됨: `ls packages/sd-cli/src/angular/vite-postcss-inline-plugin.ts` → 파일 없음 확인
8
- - [x] vite-pwa-plugin.ts 삭제됨: `ls packages/sd-cli/src/utils/vite-pwa-plugin.ts` → 파일 없음 확인
9
- - [x] vite-angular-plugin.ts에서 config() 훅 유지: config()는 isDev, pkgConfig, resolvedPkgDir 초기화에 필수. Vitest가 Vite plugin lifecycle을 호출하므로 유지. 단, optimizeDeps/define 반환값 제거됨
10
- - [x] vite-angular-plugin.ts에서 configResolved() 훅 유지: enableSourcemap 설정에 필요. 단, prebundleTransformer 생성 제거됨
11
- - [x] handleHotUpdate() 제거됨: HMR 배칭(pendingHmrFiles, hmrBatchTimer, processHmrBatch) 모두 제거됨
12
- - [x] configureServer() 제거됨: devServer, isDevServer, angularComponentMiddleware 모두 제거됨
13
- - [x] onBuildStart/onBuild 콜백 제거됨: SdAngularPluginOptions에서 onBuildStart, onBuild 필드 삭제됨. buildStart()에서 options.onBuild 호출 제거됨
14
- - [x] resolveReplaceDeps() 제거됨: scope watch 관련 replaceDepDistPaths, resolveReplaceDepEntries import 모두 제거됨
15
- - [x] watchChange(id) 유지됨: pendingWatchChanges에 파일 경로 수집. Vitest watch 모드에서 캐시 무효화에 사용
16
- - [x] buildStart() 유지됨: tsconfig 파싱, AngularSourceFileCache 생성/재사용, AngularBuildPipeline 초기화, 전체/증분 컴파일 수행. enableHmr: false로 고정 (Vitest에서 HMR 불필요)
17
- - [x] transform() 유지됨: .ts 파일에 대해 Pipeline emit JS 반환 + JavaScriptTransformer 적용. query param 제거 및 인라인 소스맵 분리 로직 유지
18
- - [x] buildEnd() 간소화됨: isDev 분기 제거. 항상 jsTransformer.close() + pipeline 해제. prebundleTransformer 제거
19
- - [x] Vite 타입 import 축소: `ModuleNode`, `ViteDevServer` import 제거됨. `Plugin` 타입만 유지
20
- - [x] 미사용 import 제거: `createHash`, `fsp`, `fs`, `IncomingMessage`, `ServerResponse`, `SdConfig`, `resolveReplaceDepEntries` 제거됨
5
+ - vite-config.ts 삭제됨: `ls packages/sd-cli/src/utils/vite-config.ts` → 파일 없음 확인
6
+ - vite-scope-watch-plugin.ts 삭제됨: `ls packages/sd-cli/src/utils/vite-scope-watch-plugin.ts` → 파일 없음 확인
7
+ - vite-postcss-inline-plugin.ts 삭제됨: `ls packages/sd-cli/src/angular/vite-postcss-inline-plugin.ts` → 파일 없음 확인
8
+ - vite-pwa-plugin.ts 삭제됨: `ls packages/sd-cli/src/utils/vite-pwa-plugin.ts` → 파일 없음 확인
9
+ - vite-angular-plugin.ts에서 config() 훅 유지: config()는 isDev, pkgConfig, resolvedPkgDir 초기화에 필수. Vitest가 Vite plugin lifecycle을 호출하므로 유지. 단, optimizeDeps/define 반환값 제거됨
10
+ - vite-angular-plugin.ts에서 configResolved() 훅 유지: enableSourcemap 설정에 필요. 단, prebundleTransformer 생성 제거됨
11
+ - handleHotUpdate() 제거됨: HMR 배칭(pendingHmrFiles, hmrBatchTimer, processHmrBatch) 모두 제거됨
12
+ - configureServer() 제거됨: devServer, isDevServer, angularComponentMiddleware 모두 제거됨
13
+ - onBuildStart/onBuild 콜백 제거됨: SdAngularPluginOptions에서 onBuildStart, onBuild 필드 삭제됨. buildStart()에서 options.onBuild 호출 제거됨
14
+ - resolveReplaceDeps() 제거됨: scope watch 관련 replaceDepDistPaths, resolveReplaceDepEntries import 모두 제거됨
15
+ - watchChange(id) 유지됨: pendingWatchChanges에 파일 경로 수집. Vitest watch 모드에서 캐시 무효화에 사용
16
+ - buildStart() 유지됨: tsconfig 파싱, AngularSourceFileCache 생성/재사용, AngularBuildPipeline 초기화, 전체/증분 컴파일 수행. enableHmr: false로 고정 (Vitest에서 HMR 불필요)
17
+ - transform() 유지됨: .ts 파일에 대해 Pipeline emit JS 반환 + JavaScriptTransformer 적용. query param 제거 및 인라인 소스맵 분리 로직 유지
18
+ - buildEnd() 간소화됨: isDev 분기 제거. 항상 jsTransformer.close() + pipeline 해제. prebundleTransformer 제거
19
+ - Vite 타입 import 축소: `ModuleNode`, `ViteDevServer` import 제거됨. `Plugin` 타입만 유지
20
+ - 미사용 import 제거: `createHash`, `fsp`, `fs`, `IncomingMessage`, `ServerResponse`, `SdConfig`, `resolveReplaceDepEntries` 제거됨
@@ -2,10 +2,10 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] configureAndroid이 capacitor-android.ts에서 export된다: line 13 `export async function configureAndroid`
6
- - [x] findJava21이 capacitor-android.ts에서 export된다: line 53 `export async function findJava21`
7
- - [x] findAndroidSdk가 capacitor-android.ts에서 export된다: line 76 `export async function findAndroidSdk`
8
- - [x] 내부 configure 함수들(_configureJavaHomePath 등)은 export되지 않는다: `^export` 검색 결과 3개만 확인
9
- - [x] Capacitor 클래스의 _validateTools가 findAndroidSdk/findJava21을 import하여 사용한다: line 8 import, line 217/229 호출
10
- - [x] Capacitor 클래스에서 9개 Android 설정 private 메서드가 삭제되었다: `_configureAndroid` 등 검색 결과 0건
11
- - [x] capacitor.ts에서 env import가 제거되었다: `import.*env.*from` 검색 결과 0건
5
+ - configureAndroid이 capacitor-android.ts에서 export된다: line 13 `export async function configureAndroid`
6
+ - findJava21이 capacitor-android.ts에서 export된다: line 53 `export async function findJava21`
7
+ - findAndroidSdk가 capacitor-android.ts에서 export된다: line 76 `export async function findAndroidSdk`
8
+ - 내부 configure 함수들(_configureJavaHomePath 등)은 export되지 않는다: `^export` 검색 결과 3개만 확인
9
+ - Capacitor 클래스의 _validateTools가 findAndroidSdk/findJava21을 import하여 사용한다: line 8 import, line 217/229 호출
10
+ - Capacitor 클래스에서 9개 Android 설정 private 메서드가 삭제되었다: `_configureAndroid` 등 검색 결과 0건
11
+ - capacitor.ts에서 env import가 제거되었다: `import.*env.*from` 검색 결과 0건
@@ -2,8 +2,8 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] npm 배포 로직(publishNpm)이 npm-publisher.ts에 위치: `src/commands/publish/npm-publisher.ts:9`
6
- - [x] 로컬 복사 로직(publishToLocal)이 local-publisher.ts에 위치: `src/commands/publish/local-publisher.ts:9`
7
- - [x] index.ts의 publishPackage가 각 publisher 호출로 교체됨: `src/commands/publish/index.ts:163-171` — type별 분기가 publishNpm, publishToLocal, publishToStorage 호출
8
- - [x] export 경로 불변: `import { runPublish } from "./commands/publish"` — sd-cli-entry.ts에서 동일 경로로 resolve됨 (commands/publish/index.ts)
9
- - [x] 버전 업그레이드, Git, 빌드 로직은 index.ts에 유지: upgradeVersion(:99), Git commit/tag/push(:487-499), runBuild 호출(:459)
5
+ - npm 배포 로직(publishNpm)이 npm-publisher.ts에 위치: `src/commands/publish/npm-publisher.ts:9`
6
+ - 로컬 복사 로직(publishToLocal)이 local-publisher.ts에 위치: `src/commands/publish/local-publisher.ts:9`
7
+ - index.ts의 publishPackage가 각 publisher 호출로 교체됨: `src/commands/publish/index.ts:163-171` — type별 분기가 publishNpm, publishToLocal, publishToStorage 호출
8
+ - export 경로 불변: `import { runPublish } from "./commands/publish"` — sd-cli-entry.ts에서 동일 경로로 resolve됨 (commands/publish/index.ts)
9
+ - 버전 업그레이드, Git, 빌드 로직은 index.ts에 유지: upgradeVersion(:99), Git commit/tag/push(:487-499), runBuild 호출(:459)
@@ -2,12 +2,12 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] version-upgrade.ts에 upgradeVersion, computePublishLevels, PackageJson이 export됨: `src/commands/publish/version-upgrade.ts` 확인 완료
6
- - [x] env-utils.ts에 replaceEnvVariables, waitWithCountdown이 export됨: `src/commands/publish/env-utils.ts` 확인 완료
7
- - [x] index.ts에서 추출 함수가 제거되고 import로 대체됨: `index.ts:14-15`에서 version-upgrade, env-utils import 확인
8
- - [x] index.ts export 불변 — runPublish, PublishOptions만 export: `index.ts:22` PublishOptions, `index.ts:76` runPublish 확인
9
- - [x] sd-cli-entry.ts의 import 경로 불변: `sd-cli-entry.ts:12` `import { runPublish } from "./commands/publish"` 유지
10
- - [x] 함수 시그니처 불변: upgradeVersion(cwd, allPkgPaths, dryRun), computePublishLevels(publishPkgs), replaceEnvVariables(str, version, projectPath), waitWithCountdown(message, seconds) 모두 원본과 동일
11
- - [x] index.ts LOC 축소: 639 → 455 LOC (목표 ~300 이하는 미달이나, 오케스트레이션 자체가 ~280 LOC이므로 적정)
12
- - [x] 총 LOC 보존: 631 total ≈ 639 original (import/export 차이)
13
- - [x] 기존 테스트 40개 전량 통과: vitest run 결과 40 passed
5
+ - version-upgrade.ts에 upgradeVersion, computePublishLevels, PackageJson이 export됨: `src/commands/publish/version-upgrade.ts` 확인 완료
6
+ - env-utils.ts에 replaceEnvVariables, waitWithCountdown이 export됨: `src/commands/publish/env-utils.ts` 확인 완료
7
+ - index.ts에서 추출 함수가 제거되고 import로 대체됨: `index.ts:14-15`에서 version-upgrade, env-utils import 확인
8
+ - index.ts export 불변 — runPublish, PublishOptions만 export: `index.ts:22` PublishOptions, `index.ts:76` runPublish 확인
9
+ - sd-cli-entry.ts의 import 경로 불변: `sd-cli-entry.ts:12` `import { runPublish } from "./commands/publish"` 유지
10
+ - 함수 시그니처 불변: upgradeVersion(cwd, allPkgPaths, dryRun), computePublishLevels(publishPkgs), replaceEnvVariables(str, version, projectPath), waitWithCountdown(message, seconds) 모두 원본과 동일
11
+ - index.ts LOC 축소: 639 → 455 LOC (목표 ~300 이하는 미달이나, 오케스트레이션 자체가 ~280 LOC이므로 적정)
12
+ - 총 LOC 보존: 631 total ≈ 639 original (import/export 차이)
13
+ - 기존 테스트 40개 전량 통과: vitest run 결과 40 passed
@@ -2,6 +2,6 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] Set 생성: `publish.ts:773` — `const publishedSet = new Set(publishedPackages)` 확인
6
- - [x] Set.has() 사용: `publish.ts:774` — `allPkgNames.filter(n => !publishedSet.has(n))` 확인
7
- - [x] 동작 동등성: `Array.includes()` → `Set.has()` 변환은 동일한 boolean 결과를 반환하���로 기능 동등
5
+ - Set 생성: `publish.ts:773` — `const publishedSet = new Set(publishedPackages)` 확인
6
+ - Set.has() 사용: `publish.ts:774` — `allPkgNames.filter(n => !publishedSet.has(n))` 확인
7
+ - 동작 동등성: `Array.includes()` → `Set.has()` 변환은 동일한 boolean 결과를 반환하���로 기능 동등
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] SSH 인증 로직(ensureSshAuth, testSshKeyAuth, registerSshPublicKey)이 storage-publisher.ts에 위치: `src/commands/publish/storage-publisher.ts:55` (ensureSshAuth), `:128` (testSshKeyAuth), `:157` (registerSshPublicKey)
6
- - [x] 스토리지 배포 로직(publishToStorage)이 storage-publisher.ts에 위치: `src/commands/publish/storage-publisher.ts:17`
7
- - [x] index.ts에서 ensureSshAuth와 publishToStorage를 import하여 사용: `src/commands/publish/index.ts:13`
8
- - [x] import 경로 "./commands/publish"가 디렉토리 구조 변환 후에도 동일하게 resolve: `publish/index.ts`가 Node.js 모듈 resolution에 의해 `commands/publish`로 resolve됨
5
+ - SSH 인증 로직(ensureSshAuth, testSshKeyAuth, registerSshPublicKey)이 storage-publisher.ts에 위치: `src/commands/publish/storage-publisher.ts:55` (ensureSshAuth), `:128` (testSshKeyAuth), `:157` (registerSshPublicKey)
6
+ - 스토리지 배포 로직(publishToStorage)이 storage-publisher.ts에 위치: `src/commands/publish/storage-publisher.ts:17`
7
+ - index.ts에서 ensureSshAuth와 publishToStorage를 import하여 사용: `src/commands/publish/index.ts:13`
8
+ - import 경로 "./commands/publish"가 디렉토리 구조 변환 후에도 동일하게 resolve: `publish/index.ts`가 Node.js 모듈 resolution에 의해 `commands/publish`로 resolve됨
@@ -2,11 +2,11 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] replace-deps.ts:5 — `const logger = consola.withTag("sd:cli:replace-deps")` 모듈-레벨 로거 추가 확인
6
- - [x] replace-deps.ts:24 — `consola.warn(...)` → `logger.warn(...)` 변경 확인
7
- - [x] deployment-phase.ts:66-70 — DRY-RUN 성공 메시지 `debug` → `info` 전환 확인: `dryRun ? logger.info("[DRY-RUN] ...") : logger.debug(...)`
8
- - [x] deployment-phase.ts:76-80 — DRY-RUN 재시도 메시지 `debug` → `info` 전환 확인: 동일 패턴
9
- - [x] deployment-phase.ts:102 — `logger.fail(...)` → `logger.error(...)` 전환 확인
10
- - [x] BuildOrchestrator.ts:251 — `this._logger.success("빌드 실행 완료")` 행 제거 확인: 250행 뒤에 바로 `return` 문
11
- - [x] BuildOrchestrator.ts:477 — `this._logger.info("빌드 완료")` → `this._logger.success("빌드 완료")` 전환 확인
12
- - [x] BuildOrchestrator.ts:232-233 — `this._logger.start("빌드 실행 중...")` 유지 확인: start(232)/success(477) 쌍 정상화
5
+ - replace-deps.ts:5 — `const logger = consola.withTag("sd:cli:replace-deps")` 모듈-레벨 로거 추가 확인
6
+ - replace-deps.ts:24 — `consola.warn(...)` → `logger.warn(...)` 변경 확인
7
+ - deployment-phase.ts:66-70 — DRY-RUN 성공 메시지 `debug` → `info` 전환 확인: `dryRun ? logger.info("[DRY-RUN] ...") : logger.debug(...)`
8
+ - deployment-phase.ts:76-80 — DRY-RUN 재시도 메시지 `debug` → `info` 전환 확인: 동일 패턴
9
+ - deployment-phase.ts:102 — `logger.fail(...)` → `logger.error(...)` 전환 확인
10
+ - BuildOrchestrator.ts:251 — `this._logger.success("빌드 실행 완료")` 행 제거 확인: 250행 뒤에 바로 `return` 문
11
+ - BuildOrchestrator.ts:477 — `this._logger.info("빌드 완료")` → `this._logger.success("빌드 완료")` 전환 확인
12
+ - BuildOrchestrator.ts:232-233 — `this._logger.start("빌드 실행 중...")` 유지 확인: start(232)/success(477) 쌍 정상화
@@ -2,14 +2,14 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] replace-deps/ 서브디렉토리에 3개 파일 존재: `collect-deps.ts`, `replace-deps.ts`, `replace-deps-resolve.ts` — glob으로 확인
6
- - [x] server-externals/ 서브디렉토리에 1개 파일 존재: `server-production-files.ts` — glob으로 확인
7
- - [x] deps/ 루트에 이전 파일 없음: `replace-deps/`, `server-externals/` 서브디렉토리만 존재
8
- - [x] collect-deps.ts 내부 import 수정: `../../utils/package-utils` — 코드 확인
9
- - [x] server-production-files.ts 내부 import 수정: `../../workers/server-build.worker`, `../../esbuild/esbuild-config` — 코드 확인
10
- - [x] replace-deps.ts → replace-deps-resolve.ts 상대 import 변경 없음: 같은 디렉토리 이동으로 `./replace-deps-resolve` 유지 — 코드 확인
11
- - [x] src/ 소비자 7건 import 경로 업데이트: grep으로 이전 경로 참조 0건 확인
12
- - [x] tests/ 소비자 전체 import 경로 업데이트: grep으로 이전 경로 참조 0건 확인
13
- - [x] typecheck 통과 (기존 에러 4건 제외): `pnpm typecheck` 실행 확인
14
- - [x] lint 통과: `pnpm lint sd-cli` 0 에러 확인
15
- - [x] 관련 테스트 통과: replace-deps-watch 2개 파일 5개 테스트 전체 통과 확인
5
+ - replace-deps/ 서브디렉토리에 3개 파일 존재: `collect-deps.ts`, `replace-deps.ts`, `replace-deps-resolve.ts` — glob으로 확인
6
+ - server-externals/ 서브디렉토리에 1개 파일 존재: `server-production-files.ts` — glob으로 확인
7
+ - deps/ 루트에 이전 파일 없음: `replace-deps/`, `server-externals/` 서브디렉토리만 존재
8
+ - collect-deps.ts 내부 import 수정: `../../utils/package-utils` — 코드 확인
9
+ - server-production-files.ts 내부 import 수정: `../../workers/server-build.worker`, `../../esbuild/esbuild-config` — 코드 확인
10
+ - replace-deps.ts → replace-deps-resolve.ts 상대 import 변경 없음: 같은 디렉토리 이동으로 `./replace-deps-resolve` 유지 — 코드 확인
11
+ - src/ 소비자 7건 import 경로 업데이트: grep으로 이전 경로 참조 0건 확인
12
+ - tests/ 소비자 전체 import 경로 업데이트: grep으로 이전 경로 참조 0건 확인
13
+ - typecheck 통과 (기존 에러 4건 제외): `pnpm typecheck` 실행 확인
14
+ - lint 통과: `pnpm lint sd-cli` 0 에러 확인
15
+ - 관련 테스트 통과: replace-deps-watch 2개 파일 5개 테스트 전체 통과 확인
@@ -4,12 +4,12 @@
4
4
 
5
5
  ### Slice 1: Set 중복 검사 + glob 병렬화
6
6
 
7
- - [x] `resolveAllReplaceDepEntries`에서 `entries.some()` 대신 `Set<string>` 사용 확인: `replace-deps-resolve.ts:143`에 `seenTargetPaths = new Set<string>()` 선언, `:205`에서 `seenTargetPaths.has(actualTargetPath)` + `seenTargetPaths.add(actualTargetPath)` 사용. 기존 `entries.some()` 제거됨.
8
- - [x] glob 병렬화 확인: `replace-deps-resolve.ts:167-171`에서 `Promise.all(Object.keys(replaceDeps).map(...))` 사용. 기존 순차 `for` 루프 제거됨. `:172-174`에서 `flatMap`으로 결과를 합침.
9
- - [x] `seenTargetPaths`가 while 루프 바깥에 선언되어 재귀 탐색 전체에 걸쳐 중복 방지가 유지됨 확인.
7
+ - `resolveAllReplaceDepEntries`에서 `entries.some()` 대신 `Set<string>` 사용 확인: `replace-deps-resolve.ts:143`에 `seenTargetPaths = new Set<string>()` 선언, `:205`에서 `seenTargetPaths.has(actualTargetPath)` + `seenTargetPaths.add(actualTargetPath)` 사용. 기존 `entries.some()` 제거됨.
8
+ - glob 병렬화 확인: `replace-deps-resolve.ts:167-171`에서 `Promise.all(Object.keys(replaceDeps).map(...))` 사용. 기존 순차 `for` 루프 제거됨. `:172-174`에서 `flatMap`으로 결과를 합침.
9
+ - `seenTargetPaths`가 while 루프 바깥에 선언되어 재귀 탐색 전체에 걸쳐 중복 방지가 유지됨 확인.
10
10
 
11
11
  ### Slice 2: watch onChange entries 사전 필터링
12
12
 
13
- - [x] `watchReplaceDeps`에서 사전 필터링 확인: `replace-deps.ts:240-242`에 `sourceEntries = entries.filter(e => e.resolvedSourcePath === entry.resolvedSourcePath)` 선언. watcher 생성 전에 필터링되어 클로저에 캡처됨.
14
- - [x] onChange 내부에서 `sourceEntries`만 순회 확인: `replace-deps.ts:252`에서 `for (const e of sourceEntries)` 사용. 기존 `for (const e of entries)` + `if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;` 패턴이 제거됨.
15
- - [x] `entries` 배열은 `resolveAllReplaceDepEntries` 호출 후 불변이므로, 필터링 결과가 watcher 생명주기 동안 유효함 확인 (`replace-deps.ts:202`에서 `entries` 할당 후 수정 없음).
13
+ - `watchReplaceDeps`에서 사전 필터링 확인: `replace-deps.ts:240-242`에 `sourceEntries = entries.filter(e => e.resolvedSourcePath === entry.resolvedSourcePath)` 선언. watcher 생성 전에 필터링되어 클로저에 캡처됨.
14
+ - onChange 내부에서 `sourceEntries`만 순회 확인: `replace-deps.ts:252`에서 `for (const e of sourceEntries)` 사용. 기존 `for (const e of entries)` + `if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;` 패턴이 제거됨.
15
+ - `entries` 배열은 `resolveAllReplaceDepEntries` 호출 후 불변이므로, 필터링 결과가 watcher 생명주기 동안 유효함 확인 (`replace-deps.ts:202`에서 `entries` 할당 후 수정 없음).
@@ -6,11 +6,11 @@
6
6
 
7
7
  ## 검증 항목
8
8
 
9
- - [x] **WHY 주석 존재**: `server-production-files.ts:114`에 `// mise.toml은 저장소에서 관리되는 설정 파일이므로, 파싱 실패 시 폴백하지 않고 예외를 전파하여 설정 오류를 즉시 드러낸다.` 주석이 `TOML.parse(miseContent)` 호출(`:115`) 직전에 존재함을 확인
10
- - [x] **명시적 크래시 의도 서술**: 주석이 "저장소에서 관리되는 설정 파일", "폴백하지 않고", "예외를 전파", "설정 오류를 즉시 드러낸다" 표현을 모두 포함하여 wbs에 명시된 WHY를 서술
11
- - [x] **WHAT 서술 지양**: "TOML을 파싱한다" 같은 코드 재서술이 아니라, 폴백을 의도적으로 하지 않는 이유(설정 오류 즉시 노출)를 설명
12
- - [x] **try-catch 미추가**: `:109-121` 블록 전체에 try 키워드 없음을 확인 — 파싱 예외는 상위로 전파됨
13
- - [x] **주석 스타일**: `//` 한 줄 주석 (JSDoc 아님)
14
- - [x] **주석 언어**: 한국어
15
- - [x] **기타 코드 미변경**: `git diff server-production-files.ts` 결과 라인 114의 주석 추가 1줄 외 변경 없음 (아래 명령 실행 결과 참조)
16
- - [x] **기존 테스트 통과**: `pnpm exec vitest run --project node packages/sd-cli/tests/workers/server-build-worker.spec.ts` 25/25 통과, 특히 `generates dist/mise.toml when packageManager=mise` 테스트(TOML.parse 경로 실행)가 통과하여 파싱 로직 회귀 없음을 확인. 참고: 전체 sd-cli 테스트(`packages/sd-cli/tests/`)에서 1건 실패(`esbuild-worker-plugin.acc.spec.ts:143`)가 있으나 이는 Feature 1.1 영역이며 본 Feature 1.3 변경(주석 1줄 추가)과 무관
9
+ - **WHY 주석 존재**: `server-production-files.ts:114`에 `// mise.toml은 저장소에서 관리되는 설정 파일이므로, 파싱 실패 시 폴백하지 않고 예외를 전파하여 설정 오류를 즉시 드러낸다.` 주석이 `TOML.parse(miseContent)` 호출(`:115`) 직전에 존재함을 확인
10
+ - **명시적 크래시 의도 서술**: 주석이 "저장소에서 관리되는 설정 파일", "폴백하지 않고", "예외를 전파", "설정 오류를 즉시 드러낸다" 표현을 모두 포함하여 wbs에 명시된 WHY를 서술
11
+ - **WHAT 서술 지양**: "TOML을 파싱한다" 같은 코드 재서술이 아니라, 폴백을 의도적으로 하지 않는 이유(설정 오류 즉시 노출)를 설명
12
+ - **try-catch 미추가**: `:109-121` 블록 전체에 try 키워드 없음을 확인 — 파싱 예외는 상위로 전파됨
13
+ - **주석 스타일**: `//` 한 줄 주석 (JSDoc 아님)
14
+ - **주석 언어**: 한국어
15
+ - **기타 코드 미변경**: `git diff server-production-files.ts` 결과 라인 114의 주석 추가 1줄 외 변경 없음 (아래 명령 실행 결과 참조)
16
+ - **기존 테스트 통과**: `pnpm exec vitest run --project node packages/sd-cli/tests/workers/server-build-worker.spec.ts` 25/25 통과, 특히 `generates dist/mise.toml when packageManager=mise` 테스트(TOML.parse 경로 실행)가 통과하여 파싱 로직 회귀 없음을 확인. 참고: 전체 sd-cli 테스트(`packages/sd-cli/tests/`)에서 1건 실패(`esbuild-worker-plugin.acc.spec.ts:143`)가 있으나 이는 Feature 1.1 영역이며 본 Feature 1.3 변경(주석 1줄 추가)과 무관
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] try-catch-finally 구조 적용: `electron.ts:348-358` — try 블록에서 writeFile/symlink/lstat 수행, finally에서 정리
6
- - [x] finally에서 testLink, testTarget 각각 unlink: `finally { try { fs.unlinkSync(testLink); } catch {} try { fs.unlinkSync(testTarget); } catch {} }` 확인
7
- - [x] 성공 시에도 파일 정리: try 블록 return 후 finally가 실행되므로 정리 보장
8
- - [x] 실패 시에도 파일 정리: catch 블록 return 후 finally가 실행되므로 정리 보장
5
+ - try-catch-finally 구조 적용: `electron.ts:348-358` — try 블록에서 writeFile/symlink/lstat 수행, finally에서 정리
6
+ - finally에서 testLink, testTarget 각각 unlink: `finally { try { fs.unlinkSync(testLink); } catch {} try { fs.unlinkSync(testTarget); } catch {} }` 확인
7
+ - 성공 시에도 파일 정리: try 블록 return 후 finally가 실행되므로 정리 보장
8
+ - 실패 시에도 파일 정리: catch 블록 return 후 finally가 실행되므로 정리 보장
@@ -2,9 +2,9 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] esbuild-client-config.ts logLevel이 모든 모드에서 "silent"인지: `esbuild-client-config.ts:191` — `logLevel: "silent"` 확인. 기존 `isDev ? "warning" : "silent"` 삼항 연산자 제거됨
6
- - [x] EsbuildClientEngine에 중복 error 핸들러가 없는지: `EsbuildClientEngine.ts:103-110` — setupWatchEvents만 error 이벤트 처리. 기존 `worker.on("error", ...)` 핸들러(logger.error 호출) 제거됨
7
- - [x] EsbuildClientEngine 초기 빌드 실패 시 logger.error 미호출: `EsbuildClientEngine.ts:129-138` — `!result.success` 분기에서 `resultCollector.add()`만 호출. logger.error 줄 제거됨
8
- - [x] BaseEngine에 logger.warn() 블록이 없는지: `BaseEngine.ts:166-180` — build 이벤트 핸들러에 lint 결과 보고만 존재. warnings에 대한 logger.warn() 블록 제거됨
9
- - [x] BaseEngine startWatch 실패 시 logger.debug 사용: `BaseEngine.ts:182-183` — `logger.debug(...)` 확인. 기존 `logger.error(...)` → `logger.debug(...)` 변경됨
10
- - [x] BaseEngine lint 결과 보고 로직 유지: `BaseEngine.ts:170-179` — `event.lint != null` 조건의 ResultCollector 보고 로직이 그대로 유지됨
5
+ - esbuild-client-config.ts logLevel이 모든 모드에서 "silent"인지: `esbuild-client-config.ts:191` — `logLevel: "silent"` 확인. 기존 `isDev ? "warning" : "silent"` 삼항 연산자 제거됨
6
+ - EsbuildClientEngine에 중복 error 핸들러가 없는지: `EsbuildClientEngine.ts:103-110` — setupWatchEvents만 error 이벤트 처리. 기존 `worker.on("error", ...)` 핸들러(logger.error 호출) 제거됨
7
+ - EsbuildClientEngine 초기 빌드 실패 시 logger.error 미호출: `EsbuildClientEngine.ts:129-138` — `!result.success` 분기에서 `resultCollector.add()`만 호출. logger.error 줄 제거됨
8
+ - BaseEngine에 logger.warn() 블록이 없는지: `BaseEngine.ts:166-180` — build 이벤트 핸들러에 lint 결과 보고만 존재. warnings에 대한 logger.warn() 블록 제거됨
9
+ - BaseEngine startWatch 실패 시 logger.debug 사용: `BaseEngine.ts:182-183` — `logger.debug(...)` 확인. 기존 `logger.error(...)` → `logger.debug(...)` 변경됨
10
+ - BaseEngine lint 결과 보고 로직 유지: `BaseEngine.ts:170-179` — `event.lint != null` 조건의 ResultCollector 보고 로직이 그대로 유지됨
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] target 변환 로직 제거됨: `TypecheckOrchestrator.ts:133-142`에서 `config.target === "client" ? { target: "browser" as const } : config` 코드가 제거되고, 원본 `config`가 그대로 `_typecheckTasks`에 저장됨
6
- - [x] createTypecheckEngine 호출: `TypecheckOrchestrator.ts:209`에서 `createBuildEngine` 대신 `createTypecheckEngine`을 호출함
7
- - [x] import 변경: `TypecheckOrchestrator.ts:7`에서 `createBuildEngine` 대신 `createTypecheckEngine`을 import함
8
- - [x] createTypecheckEngine 내부 변환: `engines/index.ts`의 `createTypecheckEngine`이 client target을 `{ target: "browser" }`로 변환하여 `createBuildEngine`에 위임함
5
+ - target 변환 로직 제거됨: `TypecheckOrchestrator.ts:133-142`에서 `config.target === "client" ? { target: "browser" as const } : config` 코드가 제거되고, 원본 `config`가 그대로 `_typecheckTasks`에 저장됨
6
+ - createTypecheckEngine 호출: `TypecheckOrchestrator.ts:209`에서 `createBuildEngine` 대신 `createTypecheckEngine`을 호출함
7
+ - import 변경: `TypecheckOrchestrator.ts:7`에서 `createBuildEngine` 대신 `createTypecheckEngine`을 import함
8
+ - createTypecheckEngine 내부 변환: `engines/index.ts`의 `createTypecheckEngine`이 client target을 `{ target: "browser" }`로 변환하여 `createBuildEngine`에 위임함
@@ -2,14 +2,14 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] legacy 프로덕션 빌드: client.worker.ts build()에서 `legacyModule` 플래그가 resolvePackageInfo()를 통해 sd.config.ts에서 읽히고 createClientEsbuildContext()에 전달됨 (line 100, 124). esbuild-client-config.ts에서 splitting:false, import-meta:false 적용 확인 (line 160, 171)
6
- - [x] legacy dev watch: startWatch()에서 동일하게 legacyModule이 전달되고 (line 224), legacyModule=true 시 templateUpdates를 undefined로 전달하여 Angular HMR banner를 비활성화 (line 227). CSS swap + full-reload만 동작
7
- - [x] device 호환성 (.dev-port): startWatch()에서 포트 할당 후 dist/.dev-port에 기록 (line 319). EsbuildClientEngine.stop()에서 .dev-port 삭제 (line 153-154)
8
- - [x] device 호환성 (dist/ 구조): esbuild가 dist/에 직접 write:true로 출력 (esbuild-client-config.ts line 163). Capacitor/Electron이 dist/에서 접근 가능한 구조 유지
9
- - [x] framework 필드 제거: SdClientPackageConfig에서 framework 필드 삭제됨 (sd-config.types.ts 확인). ClientBuildInfo에서 framework 필드 삭제됨 (client.worker.ts line 27-42). EsbuildClientEngine.run()에서 framework을 worker에 전달하지 않음
10
- - [x] ClientBuildInfo.exclude 제거: ClientBuildInfo에 exclude 필드 없음 (client.worker.ts line 27-42). SdClientPackageConfig.exclude는 Capacitor/Electron용으로 유지
11
- - [x] scopeRebuild 이벤트 제거: ClientWorkerEvents에 scopeRebuild 없음 (client.worker.ts line 53-58). EsbuildClientEngine에서 scopeRebuild 이벤트 구독 안 함 (자동 테스트로도 검증)
12
- - [x] .config.json 기록: build()에서 writeConfigJson() 호출 (line 169). startWatch()에서 writeConfigJson() 호출 (line 318)
13
- - [x] 팩토리 교체: engines/index.ts에서 ViteEngine → EsbuildClientEngine으로 교체 확인. import 및 생성자 호출 모두 EsbuildClientEngine 사용
14
- - [x] stopWatch 리소스 정리 순서: esbuild context dispose → HMR close → HTTP server close → public watcher close (line 332-360). 구현계획의 순서와 일치
15
- - [!] resolvePackageInfo의 dev 고정값: build()에서도 `dev: true`로 loadSdConfig를 호출함 (line 82). build 모드에서는 `dev: false`여야 할 수 있으나, 기존 ViteEngine도 동일한 패턴이므로 기존 동작 유지. 별도 수정 불요
5
+ - legacy 프로덕션 빌드: client.worker.ts build()에서 `legacyModule` 플래그가 resolvePackageInfo()를 통해 sd.config.ts에서 읽히고 createClientEsbuildContext()에 전달됨 (line 100, 124). esbuild-client-config.ts에서 splitting:false, import-meta:false 적용 확인 (line 160, 171)
6
+ - legacy dev watch: startWatch()에서 동일하게 legacyModule이 전달되고 (line 224), legacyModule=true 시 templateUpdates를 undefined로 전달하여 Angular HMR banner를 비활성화 (line 227). CSS swap + full-reload만 동작
7
+ - device 호환성 (.dev-port): startWatch()에서 포트 할당 후 dist/.dev-port에 기록 (line 319). EsbuildClientEngine.stop()에서 .dev-port 삭제 (line 153-154)
8
+ - device 호환성 (dist/ 구조): esbuild가 dist/에 직접 write:true로 출력 (esbuild-client-config.ts line 163). Capacitor/Electron이 dist/에서 접근 가능한 구조 유지
9
+ - framework 필드 제거: SdClientPackageConfig에서 framework 필드 삭제됨 (sd-config.types.ts 확인). ClientBuildInfo에서 framework 필드 삭제됨 (client.worker.ts line 27-42). EsbuildClientEngine.run()에서 framework을 worker에 전달하지 않음
10
+ - ClientBuildInfo.exclude 제거: ClientBuildInfo에 exclude 필드 없음 (client.worker.ts line 27-42). SdClientPackageConfig.exclude는 Capacitor/Electron용으로 유지
11
+ - scopeRebuild 이벤트 제거: ClientWorkerEvents에 scopeRebuild 없음 (client.worker.ts line 53-58). EsbuildClientEngine에서 scopeRebuild 이벤트 구독 안 함 (자동 테스트로도 검증)
12
+ - .config.json 기록: build()에서 writeConfigJson() 호출 (line 169). startWatch()에서 writeConfigJson() 호출 (line 318)
13
+ - 팩토리 교체: engines/index.ts에서 ViteEngine → EsbuildClientEngine으로 교체 확인. import 및 생성자 호출 모두 EsbuildClientEngine 사용
14
+ - stopWatch 리소스 정리 순서: esbuild context dispose → HMR close → HTTP server close → public watcher close (line 332-360). 구현계획의 순서와 일치
15
+ - resolvePackageInfo의 dev 고정값: build()에서도 `dev: true`로 loadSdConfig를 호출함 (line 82). build 모드에서는 `dev: false`여야 할 수 있으나, 기존 ViteEngine도 동일한 패턴이므로 기존 동작 유지. 별도 수정 불요
@@ -2,8 +2,8 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] TscEngine._callBuild()가 this._normalizeResult(result)를 호출한다: TscEngine.ts:56 확인 — `return this._normalizeResult(result);`
6
- - [x] NgtscEngine._callBuild()가 this._normalizeResult(result)를 호출한다: NgtscEngine.ts:55 확인 — `return this._normalizeResult(result);`
7
- - [x] ServerEsbuildEngine._callBuild()가 this._normalizeResult(result)를 호출한다: ServerEsbuildEngine.ts:60 확인 — `return this._normalizeResult(result);`
8
- - [x] BaseEngine._normalizeResult()의 입력 타입이 Worker 반환 구조와 호환된다: build.errors?/warnings?가 optional이고, diagnostics가 SerializedDiagnostic[]로 일치
9
- - [x] 3개 서브클래스에서 인라인 normalization 코드가 완전히 제거되었다: 각 파일에서 `result.build.errors ??` 패턴이 더 이상 없음
5
+ - TscEngine._callBuild()가 this._normalizeResult(result)를 호출한다: TscEngine.ts:56 확인 — `return this._normalizeResult(result);`
6
+ - NgtscEngine._callBuild()가 this._normalizeResult(result)를 호출한다: NgtscEngine.ts:55 확인 — `return this._normalizeResult(result);`
7
+ - ServerEsbuildEngine._callBuild()가 this._normalizeResult(result)를 호출한다: ServerEsbuildEngine.ts:60 확인 — `return this._normalizeResult(result);`
8
+ - BaseEngine._normalizeResult()의 입력 타입이 Worker 반환 구조와 호환된다: build.errors?/warnings?가 optional이고, diagnostics가 SerializedDiagnostic[]로 일치
9
+ - 3개 서브클래스에서 인라인 normalization 코드가 완전히 제거되었다: 각 파일에서 `result.build.errors ??` 패턴이 더 이상 없음
@@ -3,22 +3,22 @@
3
3
  ## 검증 항목
4
4
 
5
5
  ### Scenario: 빌드 전용 Vite 플러그인 의존성 제거
6
- - [x] vite-plugin-pwa가 package.json dependencies에서 제거됨: package.json에 vite-plugin-pwa 미존재 확인
7
- - [x] vite-plugin-solid가 package.json dependencies에서 제거됨: package.json에 vite-plugin-solid 미존재 확인
6
+ - vite-plugin-pwa가 package.json dependencies에서 제거됨: package.json에 vite-plugin-pwa 미존재 확인
7
+ - vite-plugin-solid가 package.json dependencies에서 제거됨: package.json에 vite-plugin-solid 미존재 확인
8
8
 
9
9
  ### Scenario: Vitest용 Vite 의존성을 devDependencies로 이동
10
- - [x] vite가 devDependencies에 존재하고 dependencies에 없음: package.json:55 `"vite": "^7.3.2"` in devDependencies
11
- - [x] vite-tsconfig-paths가 devDependencies에 존재하고 dependencies에 없음: package.json:56 `"vite-tsconfig-paths": "^6.1.1"` in devDependencies
10
+ - vite가 devDependencies에 존재하고 dependencies에 없음: package.json:55 `"vite": "^7.3.2"` in devDependencies
11
+ - vite-tsconfig-paths가 devDependencies에 존재하고 dependencies에 없음: package.json:56 `"vite-tsconfig-paths": "^6.1.1"` in devDependencies
12
12
 
13
13
  ### Scenario: workbox 관련 타입 정리
14
- - [x] SdPwaWorkboxConfig 인터페이스가 sd-config.types.ts에서 삭제됨: grep "SdPwaWorkboxConfig" → No matches found
15
- - [x] SdPwaConfig에서 workbox 필드가 삭제됨: grep "workbox" → No matches found
16
- - [x] pnpm typecheck sd-cli 통과: 0개 에러, 0개 경고
14
+ - SdPwaWorkboxConfig 인터페이스가 sd-config.types.ts에서 삭제됨: grep "SdPwaWorkboxConfig" → No matches found
15
+ - SdPwaConfig에서 workbox 필드가 삭제됨: grep "workbox" → No matches found
16
+ - pnpm typecheck sd-cli 통과: 0개 에러, 0개 경고
17
17
 
18
18
  ### Scenario: ViteEngine.ts 삭제
19
- - [x] engines/ViteEngine.ts 파일이 존재하지 않음: `test -f` → DELETED
20
- - [x] engines/index.ts에서 ViteEngine 미참조: grep "ViteEngine" engines/index.ts → No matches found
21
- - [x] tests/engines/vite-engine.spec.ts 삭제됨: `test -f` → DELETED
19
+ - engines/ViteEngine.ts 파일이 존재하지 않음: `test -f` → DELETED
20
+ - engines/index.ts에서 ViteEngine 미참조: grep "ViteEngine" engines/index.ts → No matches found
21
+ - tests/engines/vite-engine.spec.ts 삭제됨: `test -f` → DELETED
22
22
 
23
23
  ### Scenario: 의존성 변경 �� lockfile 갱신
24
- - [x] pnpm install 성공: Packages: +1 -184, Done in 6.1s
24
+ - pnpm install 성공: Packages: +1 -184, Done in 6.1s
@@ -2,22 +2,22 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] **증분 빌드 조건 판단**: `esbuild-angular-compiler-plugin.ts:200` — `angularCompiler != null && sourceFileCache != null && sourceFileCache.modifiedFiles.size > 0`으로 증분 빌드 감지. 첫 빌드는 `angularCompiler == null` 경로로 진입.
5
+ - **증분 빌드 조건 판단**: `esbuild-angular-compiler-plugin.ts:200` — `angularCompiler != null && sourceFileCache != null && sourceFileCache.modifiedFiles.size > 0`으로 증분 빌드 감지. 첫 빌드는 `angularCompiler == null` 경로로 진입.
6
6
 
7
- - [x] **staleSourceFiles 캡처 타이밍**: `esbuild-angular-compiler-plugin.ts:208-219` — `invalidate()` 호출 전에 이전 `ts.Program`에서 stale source files를 캡처. `invalidate` 후에는 캐시에서 삭제되므로 순서가 중요.
7
+ - **staleSourceFiles 캡처 타이밍**: `esbuild-angular-compiler-plugin.ts:208-219` — `invalidate()` 호출 전에 이전 `ts.Program`에서 stale source files를 캡처. `invalidate` 후에는 캐시에서 삭제되므로 순서가 중요.
8
8
 
9
- - [x] **FileReferenceTracker.update → sourceFileCache.invalidate**: `esbuild-angular-compiler-plugin.ts:221-224` — `referencedFileTracker.update()`로 전이적 의존성 확장 후 `invalidate()` 호출. 확장된 파일 집합이 전달됨.
9
+ - **FileReferenceTracker.update → sourceFileCache.invalidate**: `esbuild-angular-compiler-plugin.ts:221-224` — `referencedFileTracker.update()`로 전이적 의존성 확장 후 `invalidate()` 호출. 확장된 파일 집합이 전달됨.
10
10
 
11
- - [x] **stale additionalResults 제거**: `esbuild-angular-compiler-plugin.ts:226-229` — expandedModifiedFiles의 각 파일에 대해 `additionalResults.delete()` 호출.
11
+ - **stale additionalResults 제거**: `esbuild-angular-compiler-plugin.ts:226-229` — expandedModifiedFiles의 각 파일에 대해 `additionalResults.delete()` 호출.
12
12
 
13
- - [x] **HMR 활성화 조건**: `esbuild-angular-compiler-plugin.ts:204-206` — `templateUpdates != null && modifiedFiles.size <= 32`. 32개 초과 시 HMR 건너뜀.
13
+ - **HMR 활성화 조건**: `esbuild-angular-compiler-plugin.ts:204-206` — `templateUpdates != null && modifiedFiles.size <= 32`. 32개 초과 시 HMR 건너뜀.
14
14
 
15
- - [x] **collectHmrCandidates 호출**: `esbuild-angular-compiler-plugin.ts:235-239` — `ngtscProgram`과 `staleSourceFiles`를 전달. `sourceFileCache.modifiedFiles`(확장 전 원본)을 대상으로 분석.
15
+ - **collectHmrCandidates 호출**: `esbuild-angular-compiler-plugin.ts:235-239` — `ngtscProgram`과 `staleSourceFiles`를 전달. `sourceFileCache.modifiedFiles`(확장 전 원본)을 대상으로 분석.
16
16
 
17
- - [x] **emitHmrUpdateModule 호출 및 null 처리**: `esbuild-angular-compiler-plugin.ts:259-264` — `emitHmrUpdateModule`이 null/undefined 반환 시 break (templateUpdates 전파 중단). NgCompiler API를 Record 캐스팅으로 접근 (타입이 private이므로).
17
+ - **emitHmrUpdateModule 호출 및 null 처리**: `esbuild-angular-compiler-plugin.ts:259-264` — `emitHmrUpdateModule`이 null/undefined 반환 시 break (templateUpdates 전파 중단). NgCompiler API를 Record 캐스팅으로 접근 (타입이 private이므로).
18
18
 
19
- - [x] **templateUpdates Map 전파**: `esbuild-angular-compiler-plugin.ts:266` — `pluginOptions.templateUpdates!.set(updateId, updateText)`로 외부 Map에 직접 기록.
19
+ - **templateUpdates Map 전파**: `esbuild-angular-compiler-plugin.ts:266` — `pluginOptions.templateUpdates!.set(updateId, updateText)`로 외부 Map에 직접 기록.
20
20
 
21
- - [x] **updateId 형식**: `esbuild-angular-compiler-plugin.ts:256-258` — `encodeURIComponent("{relativePath}@{className}")`. relativePath는 hostDir 기준 상대경로, 백슬래시를 슬래시로 변환.
21
+ - **updateId 형식**: `esbuild-angular-compiler-plugin.ts:256-258` — `encodeURIComponent("{relativePath}@{className}")`. relativePath는 hostDir 기준 상대경로, 백슬래시를 슬래시로 변환.
22
22
 
23
- - [x] **hmr-candidates.ts 구조**: `hmr-candidates.ts` — `collectHmrCandidates` 함수가 원본 `hmr-candidates.js`의 로직을 TypeScript로 이식. `analyzeFileUpdates`, `analyzeMetaUpdates`, `equalRangeText` 헬퍼 포함. SUPPORTED_FIELD_NAMES = {template, templateUrl, styles, styleUrl, stylesUrl}.
23
+ - **hmr-candidates.ts 구조**: `hmr-candidates.ts` — `collectHmrCandidates` 함수가 원본 `hmr-candidates.js`의 로직을 TypeScript로 이식. `analyzeFileUpdates`, `analyzeMetaUpdates`, `equalRangeText` 헬퍼 포함. SUPPORTED_FIELD_NAMES = {template, templateUrl, styles, styleUrl, stylesUrl}.
@@ -2,20 +2,20 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] TS onLoad 훅이 `/\.[cm]?[jt]sx?$/` 필터로 등록된다: :517 `build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, ...)`
6
- - [x] JS onLoad 훅이 `/\.[cm]?js$/` 필터로 등록된다: :584 `build.onLoad({ filter: /\.[cm]?js$/ }, ...)`
7
- - [x] TS onLoad: shouldTsIgnoreJs=true이고 JS 파일이면 undefined 반환: :522 `if (shouldTsIgnoreJs && isJS) return undefined`
8
- - [x] TS onLoad: 캐시 미스 + hasCompilationErrors이면 `{ contents: '', loader: 'js' }` 반환: :530
9
- - [x] TS onLoad: 캐시 미스 + allowJs + JS이면 undefined 반환: :535
10
- - [x] TS onLoad: 캐시 미스 + Angular 데코레이터 없으면 warning 반환: :541-547
11
- - [x] TS onLoad: 캐시 미스 + Angular 데코레이터 있으면 error 반환: :550-552
12
- - [x] TS onLoad: string 캐시 + (useTypeScriptTranspilation || isJS)이면 transformData 호출 → Uint8Array 재캐싱: :556-565
13
- - [x] TS onLoad: Uint8Array 캐시이면 재변환 없이 그대로 반환: :556 조건 `typeof contents === "string"` — Uint8Array는 조건 불일치로 통과
14
- - [x] TS onLoad: loader 결정 — (useTypeScriptTranspilation || isJS) → 'js', .tsx → 'tsx', 기타 → 'ts': :569-574
15
- - [x] JS onLoad: createCachedLoad(loadResultCache, callback)으로 래핑: :586
16
- - [x] JS onLoad: transformFile(request, false, sideEffects) 호출: :589
17
- - [x] hasSideEffects: advancedOptimizations=false → undefined 반환: :292-293
18
- - [x] hasSideEffects: advancedOptimizations=true → build.resolve() 호출: :295-298
19
- - [x] shouldTsIgnoreJs: onStart에서 !compilerOptions.allowJs로 결정: :405
20
- - [x] useTypeScriptTranspilation: !isolatedModules || !!sourceMap || !!inlineSourceMap으로 결정: :406-407
21
- - [x] loadResultCache 옵션이 AngularCompilerPluginOptions에 추가됨: :33
5
+ - TS onLoad 훅이 `/\.[cm]?[jt]sx?$/` 필터로 등록된다: :517 `build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, ...)`
6
+ - JS onLoad 훅이 `/\.[cm]?js$/` 필터로 등록된다: :584 `build.onLoad({ filter: /\.[cm]?js$/ }, ...)`
7
+ - TS onLoad: shouldTsIgnoreJs=true이고 JS 파일이면 undefined 반환: :522 `if (shouldTsIgnoreJs && isJS) return undefined`
8
+ - TS onLoad: 캐시 미스 + hasCompilationErrors이면 `{ contents: '', loader: 'js' }` 반환: :530
9
+ - TS onLoad: 캐시 미스 + allowJs + JS이면 undefined 반환: :535
10
+ - TS onLoad: 캐시 미스 + Angular 데코레이터 없으면 warning 반환: :541-547
11
+ - TS onLoad: 캐시 미스 + Angular 데코레이터 있으면 error 반환: :550-552
12
+ - TS onLoad: string 캐시 + (useTypeScriptTranspilation || isJS)이면 transformData 호출 → Uint8Array 재캐싱: :556-565
13
+ - TS onLoad: Uint8Array 캐시이면 재변환 없이 그대로 반환: :556 조건 `typeof contents === "string"` — Uint8Array는 조건 불일치로 통과
14
+ - TS onLoad: loader 결정 — (useTypeScriptTranspilation || isJS) → 'js', .tsx → 'tsx', 기타 → 'ts': :569-574
15
+ - JS onLoad: createCachedLoad(loadResultCache, callback)으로 래핑: :586
16
+ - JS onLoad: transformFile(request, false, sideEffects) 호출: :589
17
+ - hasSideEffects: advancedOptimizations=false → undefined 반환: :292-293
18
+ - hasSideEffects: advancedOptimizations=true → build.resolve() 호출: :295-298
19
+ - shouldTsIgnoreJs: onStart에서 !compilerOptions.allowJs로 결정: :405
20
+ - useTypeScriptTranspilation: !isolatedModules || !!sourceMap || !!inlineSourceMap으로 결정: :406-407
21
+ - loadResultCache 옵션이 AngularCompilerPluginOptions에 추가됨: :33
@@ -2,15 +2,15 @@
2
2
 
3
3
  ## 검증 항목
4
4
 
5
- - [x] **handleIncrementalBuild 클로저 변수 접근**: `pluginOptions.sourceFileCache!` (314줄), `pluginOptions.templateUpdates` (316줄), `angularCompiler!` (322, 342, 345, 353줄), `referencedFileTracker` (332줄), `additionalResults` (339줄), `cwd` (359줄) — 모두 setup 스코프(248-289줄)에서 선언된 변수를 파라미터 없이 직접 접근. 원본에서 `errors`/`warnings`를 사용하지 않아 파라미터 불필요 (lint 에러로 확인, 제거)
6
- - [x] **handleFirstBuild 클로저 변수 접근**: `pluginOptions` (378, 387-390줄), `preserveSymlinks` (381줄), `angularCompiler` (394줄 대입), `shouldTsIgnoreJs` (398줄 대입), `useTypeScriptTranspilation` (399줄 대입) — 모두 setup 스코프 변수 직접 접근. 파라미터 없음
7
- - [x] **createWebWorkerProcessor 클로저 변수 접근**: `build` (410줄), `pluginOptions.sourcemap` (410줄), `cwd` (422, 437줄), `referencedFileTracker` (417, 435줄), `additionalResults` (424, 428줄) — 모두 setup 스코프 변수 직접 접근. `errors`/`warnings`만 파라미터로 전달
8
- - [x] **onStart 반환값 동일**: onStart 콜백(456-526줄)이 동일한 `result` 객체를 반환 (`errors`/`warnings` 할당 로직 523-525줄 유지). 추출 전과 동일한 `{errors, warnings}` 구조
9
- - [x] **내부 상태 변화 동일**: `handleIncrementalBuild`에서 `sourceFileCache.invalidate()` (328줄), `additionalResults.delete()` (332줄), `angularCompiler.update()` (335줄), `templateUpdates.set()/clear()` (366, 370줄) — 원본 코드(316-383줄)와 동일한 mutation 순서와 로직
10
- - [x] **handleFirstBuild 상태 설정**: `angularCompiler = compiler` (394줄), `shouldTsIgnoreJs = !co.allowJs` (398줄), `useTypeScriptTranspilation` (399-400줄) — 원본 코드(384-409줄)와 동일
11
- - [x] **HMR 실패 시 templateUpdates 초기화**: `updateText === null || updateText === undefined` 조건(364줄) → `pluginOptions.templateUpdates!.clear()` (366줄) + `break` (367줄) — 원본과 동일
12
- - [x] **Worker 빌드 성공 경로**: `additionalResults.set(fullWorkerPath, {outputFiles, metafile})` (428-431줄) → `workerCodeFile` 찾기 (442-444줄) → 상대 경로 반환 (450-451줄) — 원본과 동일
13
- - [x] **Worker 빌드 실패 경로**: `errors.push(...workerResult.errors)` (415줄) → `referencedFileTracker.add()` (417-423줄) → `additionalResults.set()` (424줄) → `return workerFile` (425줄) — 원본과 동일
14
- - [x] **onStart 오케스트레이션 축소**: onStart 콜백이 456-526줄 = ~70줄로 축소됨. 구성: stylesheetErrors 리셋(4줄) + 분기 호출(5줄) + processWebWorker 생성(1줄) + emit(5줄) + diagnostics(8줄) + stylesheet 브릿징(12줄) + 에러 핸들링(13줄) + 결과 반환(3줄)
15
- - [x] **onLoad/onEnd/onDispose 미변경**: 528줄 이후의 onLoad(528-593줄), onEnd(615-625줄), onDispose(628-632줄) 핸들러가 변경되지 않음
16
- - [x] **기존 테스트 26개 통과**: vitest run 실행 결과 26 passed, 0 failed
5
+ - **handleIncrementalBuild 클로저 변수 접근**: `pluginOptions.sourceFileCache!` (314줄), `pluginOptions.templateUpdates` (316줄), `angularCompiler!` (322, 342, 345, 353줄), `referencedFileTracker` (332줄), `additionalResults` (339줄), `cwd` (359줄) — 모두 setup 스코프(248-289줄)에서 선언된 변수를 파라미터 없이 직접 접근. 원본에서 `errors`/`warnings`를 사용하지 않아 파라미터 불필요 (lint 에러로 확인, 제거)
6
+ - **handleFirstBuild 클로저 변수 접근**: `pluginOptions` (378, 387-390줄), `preserveSymlinks` (381줄), `angularCompiler` (394줄 대입), `shouldTsIgnoreJs` (398줄 대입), `useTypeScriptTranspilation` (399줄 대입) — 모두 setup 스코프 변수 직접 접근. 파라미터 없음
7
+ - **createWebWorkerProcessor 클로저 변수 접근**: `build` (410줄), `pluginOptions.sourcemap` (410줄), `cwd` (422, 437줄), `referencedFileTracker` (417, 435줄), `additionalResults` (424, 428줄) — 모두 setup 스코프 변수 직접 접근. `errors`/`warnings`만 파라미터로 전달
8
+ - **onStart 반환값 동일**: onStart 콜백(456-526줄)이 동일한 `result` 객체를 반환 (`errors`/`warnings` 할당 로직 523-525줄 유지). 추출 전과 동일한 `{errors, warnings}` 구조
9
+ - **내부 상태 변화 동일**: `handleIncrementalBuild`에서 `sourceFileCache.invalidate()` (328줄), `additionalResults.delete()` (332줄), `angularCompiler.update()` (335줄), `templateUpdates.set()/clear()` (366, 370줄) — 원본 코드(316-383줄)와 동일한 mutation 순서와 로직
10
+ - **handleFirstBuild 상태 설정**: `angularCompiler = compiler` (394줄), `shouldTsIgnoreJs = !co.allowJs` (398줄), `useTypeScriptTranspilation` (399-400줄) — 원본 코드(384-409줄)와 동일
11
+ - **HMR 실패 시 templateUpdates 초기화**: `updateText === null || updateText === undefined` 조건(364줄) → `pluginOptions.templateUpdates!.clear()` (366줄) + `break` (367줄) — 원본과 동일
12
+ - **Worker 빌드 성공 경로**: `additionalResults.set(fullWorkerPath, {outputFiles, metafile})` (428-431줄) → `workerCodeFile` 찾기 (442-444줄) → 상대 경로 반환 (450-451줄) — 원본과 동일
13
+ - **Worker 빌드 실패 경로**: `errors.push(...workerResult.errors)` (415줄) → `referencedFileTracker.add()` (417-423줄) → `additionalResults.set()` (424줄) → `return workerFile` (425줄) — 원본과 동일
14
+ - **onStart 오케스트레이션 축소**: onStart 콜백이 456-526줄 = ~70줄로 축소됨. 구성: stylesheetErrors 리셋(4줄) + 분기 호출(5줄) + processWebWorker 생성(1줄) + emit(5줄) + diagnostics(8줄) + stylesheet 브릿징(12줄) + 에러 핸들링(13줄) + 결과 반환(3줄)
15
+ - **onLoad/onEnd/onDispose 미변경**: 528줄 이후의 onLoad(528-593줄), onEnd(615-625줄), onDispose(628-632줄) 핸들러가 변경되지 않음
16
+ - **기존 테스트 26개 통과**: vitest run 실행 결과 26 passed, 0 failed