@simplysm/sd-claude 14.0.88 → 14.0.90

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 (135) hide show
  1. package/claude/references/sd-simplysm14/README.md +16 -17
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +39 -43
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +174 -80
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +41 -50
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +60 -26
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +109 -37
  7. package/claude/references/sd-simplysm14/apis/angular/infra.md +61 -44
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +39 -31
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +73 -85
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +54 -39
  11. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +55 -30
  12. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +71 -67
  13. package/claude/references/sd-simplysm14/apis/angular/sheet.md +82 -72
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +35 -36
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +71 -43
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +38 -30
  17. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +45 -50
  18. package/claude/references/sd-simplysm14/apis/core-browser/README.md +42 -55
  19. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
  20. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +39 -38
  21. package/claude/references/sd-simplysm14/apis/core-common/README.md +95 -103
  22. package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +59 -54
  23. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +86 -0
  24. package/claude/references/sd-simplysm14/apis/core-common/datetime.md +57 -66
  25. package/claude/references/sd-simplysm14/apis/core-common/errors.md +86 -0
  26. package/claude/references/sd-simplysm14/apis/core-common/obj.md +60 -42
  27. package/claude/references/sd-simplysm14/apis/core-common/serialization.md +55 -0
  28. package/claude/references/sd-simplysm14/apis/core-node/README.md +10 -8
  29. package/claude/references/sd-simplysm14/apis/core-node/consola.md +29 -32
  30. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +34 -22
  31. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +29 -25
  32. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +40 -53
  33. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +22 -29
  34. package/claude/references/sd-simplysm14/apis/core-node/worker.md +31 -31
  35. package/claude/references/sd-simplysm14/apis/excel/README.md +26 -26
  36. package/claude/references/sd-simplysm14/apis/excel/cell.md +37 -29
  37. package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +29 -15
  38. package/claude/references/sd-simplysm14/apis/excel/style.md +33 -27
  39. package/claude/references/sd-simplysm14/apis/excel/utils.md +29 -19
  40. package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +78 -55
  41. package/claude/references/sd-simplysm14/apis/excel/wrapper.md +42 -45
  42. package/claude/references/sd-simplysm14/apis/lint/README.md +27 -21
  43. package/claude/references/sd-simplysm14/apis/lint/rules.md +89 -49
  44. package/claude/references/sd-simplysm14/apis/orm-common/README.md +6 -62
  45. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +149 -67
  46. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +111 -99
  47. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +115 -72
  48. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +134 -92
  49. package/claude/references/sd-simplysm14/apis/orm-common/types.md +67 -52
  50. package/claude/references/sd-simplysm14/apis/orm-node/README.md +63 -26
  51. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +51 -40
  52. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +10 -12
  53. package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +92 -45
  54. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +226 -108
  55. package/claude/references/sd-simplysm14/apis/service-client/README.md +90 -88
  56. package/claude/references/sd-simplysm14/apis/service-client/orm.md +37 -29
  57. package/claude/references/sd-simplysm14/apis/service-client/transport.md +45 -20
  58. package/claude/references/sd-simplysm14/apis/service-common/README.md +89 -40
  59. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +126 -34
  60. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +109 -54
  61. package/claude/references/sd-simplysm14/apis/service-server/README.md +70 -66
  62. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +47 -47
  63. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +71 -34
  64. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +31 -32
  65. package/claude/references/sd-simplysm14/apis/storage/README.md +34 -28
  66. package/claude/references/sd-simplysm14/manuals/client-app-structure.md +142 -140
  67. package/claude/references/sd-simplysm14/manuals/client-orm.md +1 -1
  68. package/claude/references/sd-simplysm14/manuals/client-service.md +19 -7
  69. package/claude/references/sd-simplysm14/manuals/client-shared-data.md +2 -2
  70. package/claude/references/sd-simplysm14/manuals/client-system-log.md +11 -3
  71. package/claude/references/sd-simplysm14/manuals/data-log.md +0 -1
  72. package/claude/references/sd-simplysm14/manuals/orm.md +16 -0
  73. package/claude/rules/sd-design-rules.md +10 -0
  74. package/claude/skills/sd-docs/SKILL.md +58 -46
  75. package/claude/skills/sd-docs/references/{doc-rules.md → subagent-prompt.md} +103 -103
  76. package/claude/skills/sd-impl/SKILL.md +1 -1
  77. package/claude/skills/sd-spec/SKILL.md +858 -858
  78. package/claude/skills/sd-spec/references/example-spec.md +26 -36
  79. package/package.json +1 -1
  80. package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +0 -47
  81. package/claude/references/sd-simplysm14/apis/orm-common/query-builder.md +0 -29
  82. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +0 -99
  83. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +0 -12
  84. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +0 -3
  85. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +0 -150
  86. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +0 -143
  87. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +0 -150
  88. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +0 -2
  89. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +0 -12
  90. package/claude/skills/sd-demo/evals/golden.jsonl +0 -1
  91. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +0 -8
  92. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
  93. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  94. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tsconfig.json +0 -10
  95. package/claude/skills/sd-dev/evals/golden.jsonl +0 -1
  96. package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +0 -7
  97. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +0 -5
  98. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +0 -3
  99. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +0 -6
  100. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +0 -1
  101. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +0 -5
  102. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +0 -8
  103. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +0 -7
  104. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +0 -3
  105. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +0 -5
  106. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +0 -3
  107. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +0 -6
  108. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +0 -1
  109. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +0 -5
  110. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +0 -8
  111. package/claude/skills/sd-docs/evals/golden.jsonl +0 -2
  112. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +0 -101
  113. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +0 -101
  114. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +0 -46
  115. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +0 -89
  116. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +0 -101
  117. package/claude/skills/sd-impl/evals/golden.jsonl +0 -4
  118. package/claude/skills/sd-manual/evals/fixtures/new-manual/src/notification.ts +0 -25
  119. package/claude/skills/sd-manual/evals/fixtures/update-manual/.claude/references/sd-simplysm14/manuals/notification.md +0 -14
  120. package/claude/skills/sd-manual/evals/fixtures/update-manual/src/notification.ts +0 -37
  121. package/claude/skills/sd-manual/evals/golden.jsonl +0 -2
  122. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +0 -7
  123. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +0 -4
  124. package/claude/skills/sd-review/evals/golden.jsonl +0 -2
  125. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +0 -14
  126. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  127. package/claude/skills/sd-skill/evals/golden.jsonl +0 -2
  128. package/claude/skills/sd-spec/evals/fixtures/case-a-split//355/232/214/354/235/230/353/241/235.md +0 -20
  129. package/claude/skills/sd-spec/evals/fixtures/case-b-detail/.specs/260513120000_warehouse/spec.md +0 -95
  130. package/claude/skills/sd-spec/evals/golden.jsonl +0 -2
  131. package/claude/skills/sd-unpack/evals/fixtures/eml-with-text-attachment/meeting.eml +0 -21
  132. package/claude/skills/sd-unpack/evals/fixtures/simple-eml/meeting.eml +0 -10
  133. package/claude/skills/sd-unpack/evals/golden.jsonl +0 -2
  134. package/claude/skills/sd-use/evals/fixtures/empty/.gitkeep +0 -0
  135. package/claude/skills/sd-use/evals/golden.jsonl +0 -6
@@ -1,70 +1,117 @@
1
1
  # @simplysm/sd-cli — SdTsCompiler
2
2
 
3
- 패키지 디렉토리의 `.ts` 를 TS 또는 Angular AOT 로 **증분** 컴파일하는 클래스. 한 번의 `compileAsync` 호출로 직렬화된 진단 + emit 결과 + lint + SCSS 결과를 묶어 반환. tsconfig 의 `angularCompilerOptions` 존재 여부로 Angular/일반 모드를 자동 판별. 빌드 엔진·`sdAngularPlugin` 내부에서 사용. 진단은 worker 경계를 통과하도록 `SerializedDiagnostic` 으로 직렬화됨.
3
+ 패키지 디렉토리의 `.ts` 를 TypeScript 또는 Angular AOT 로 **증분** 컴파일하는 클래스. 한 번의 `compileAsync` 호출로 직렬화된 진단 + emit 결과 + lint + SCSS 결과를 묶음(`ISdTsCompilerResult`)으로 반환한다. tsconfig 의 `angularCompilerOptions` 존재 여부로 Angular/일반 모드를 자동 판별. 빌드 엔진과 `sdAngularPlugin` 내부에서 사용. 진단은 worker 경계를 통과하도록 `SerializedDiagnostic` 으로 직렬화되며, 내부 크래시는 단계별로 잡아 진단으로 보고(부분 복구)한다.
4
4
 
5
- ## SdTsCompiler
5
+ ## ISdTsCompilerOptions (생성자 인자)
6
+
7
+ ```typescript
8
+ interface ISdTsCompilerOptions {
9
+ pkgDir: string;
10
+ cwd: string;
11
+ output: { js: boolean; dts: boolean };
12
+ includeTests?: boolean;
13
+ env?: TypecheckEnv;
14
+ // Angular 전용 (isForAngular 시 활성)
15
+ sourceFileCache?: AngularSourceFileCache;
16
+ transformStylesheet?: (data: string, containingFile: string, stylesheetFile?: string) => Promise<string | null>;
17
+ externalStylesheets?: Map<string, string>;
18
+ compilerOptionsTransformer?: (options: ts.CompilerOptions) => ts.CompilerOptions;
19
+ // SCSS/lint 통합
20
+ lint?: boolean;
21
+ globalScss?: boolean;
22
+ }
23
+ ```
24
+
25
+ - pkgDir: string — 컴파일 대상 패키지 디렉토리. `<pkgDir>/tsconfig.json` 을 파싱하고 `<pkgDir>/dist` 로 emit, `<pkgDir>/.cache` 에 tsbuildinfo 를 둔다.
26
+ - cwd: string — 워크스페이스 루트. 진단 필터링(`isWorkspaceDiagnostic`)·경로 상대화·에러 포맷 기준점.
27
+ - output.js: boolean — JS emit 여부. true 면 `.js` 산출(non-Angular 은 import 에 `.js` 확장자 부착 + 경로 재작성, Angular 은 `emitResults` 로 반환).
28
+ - output.dts: boolean — `.d.ts` emit 여부. `js`/`dts` 조합에 따라 emit-only·declaration-only·noEmit(둘 다 false = 타입체크만) 으로 분기.
29
+ - includeTests?: boolean — `tests/` 파일을 rootNames 에 포함할지. 기본 false. 테스트까지 컴파일해야 하면 true(예: `sdAngularPlugin`).
30
+ - env?: TypecheckEnv — 타입체크 환경. 지정 시 `getCompilerOptionsForEnv()` 로 환경별 compilerOptions 를 적용하고 tsbuildinfo 파일명에 접미사를 붙임. 환경 분리 타입체크에 쓴다.
31
+ - sourceFileCache?: AngularSourceFileCache — Angular 증분용 SourceFile 캐시. 미제공 시 내부 생성. 여러 `compileAsync` 라운드 간 캐시를 공유하려면 외부에서 주입.
32
+ - transformStylesheet?: (data, containingFile, stylesheetFile?) => Promise<string|null> — 컴포넌트 스타일 변환 콜백(Angular only). `null` 반환 시 변환 안 함. 미제공이고 Angular 면 라이브러리용 SCSS 변환 콜백을 자동 생성. 클라이언트 빌드처럼 커스텀 스타일 파이프라인이 필요할 때 직접 제공.
33
+ - externalStylesheets?: Map<string, string> — 외부 스타일시트 맵(클라이언트 빌드용). 지정 시 비-템플릿 스타일 리소스를 해시 기반 `.css` 외부 파일명으로 매핑(`resourceNameToFileName`). 스타일을 별도 청크로 뽑을 때.
34
+ - compilerOptionsTransformer?: (options) => ts.CompilerOptions — 최종 compilerOptions 후처리 훅. 클라이언트의 `target`/`module`/`rootDir` 강제 등에 쓴다.
35
+ - lint?: boolean — true 면 `compileAsync` 가 program 기반 lint 를 함께 돌려 결과를 `result.lint` 에 담는다(affected 파일만 대상). 컴파일과 동시에 lint 하고 싶을 때.
36
+ - globalScss?: boolean — true 면 `scss/styles.scss` → `dist/styles.css` 글로벌 SCSS 를 컴파일하고 에러를 `result.scssErrors` 에 더한다.
37
+
38
+ ## ISdTsCompilerEmitOptions (compileAsync 2번째 인자)
39
+
40
+ ```typescript
41
+ interface ISdTsCompilerEmitOptions {
42
+ sourceFilter?: (fileName: string) => boolean;
43
+ additionalTransformers?: {
44
+ before?: ts.TransformerFactory<ts.SourceFile>[];
45
+ after?: ts.TransformerFactory<ts.SourceFile>[];
46
+ };
47
+ }
48
+ ```
49
+
50
+ - sourceFilter?: (fileName) => boolean — emit 결과 필터(Angular only). true 인 소스만 `emitResults` 에 남긴다. 특정 파일의 emit 만 필요할 때(예: HMR 단일 파일).
51
+ - additionalTransformers?.before / .after — Angular 기본 transformers 앞/뒤에 끼울 추가 TS transformer 배열(Angular only). 커스텀 코드 변환을 주입할 때.
52
+
53
+ ## SdTsCompiler — 메서드
6
54
 
7
55
  ```typescript
8
56
  class SdTsCompiler {
9
57
  constructor(options: ISdTsCompilerOptions);
10
58
  compileAsync(modifiedFiles?: ReadonlySet<string>, emitOptions?: ISdTsCompilerEmitOptions): Promise<ISdTsCompilerResult>;
59
+ get sideEffectScssRegistry(): Map<string, SideEffectScssEntry>;
11
60
  compileSideEffectScss(): void;
12
61
  findAffectedByScss(scssPath: string): string[];
13
- get sideEffectScssRegistry(): Map<string, SideEffectScssEntry>;
14
62
  }
15
63
  ```
16
64
 
17
- - compileAsync(modifiedFiles?, emitOptions?) — 1회 증분 컴파일. `modifiedFiles` = 직전 변경 파일 절대경로 집합(전달 sourceFileCache·packageJsonCache 무효화, 미전달전체). `emitOptions` = emit 세부 제어. 위험 구간을 단계별 try/catch 감싸 부분 복구하며, 잡힌 크래시는 결과의 `diagnostics`/`errors` 에 합산됨(silent skip 아님).
18
- - compileSideEffectScss() — `sideEffectScssRegistry` 에 등록된 side-effect SCSS 항목을 모두 CSS 로 컴파일. emit 코드가 항목을 레지스트리에 채운 뒤 호출.
19
- - findAffectedByScss(scssPath) — 주어진 SCSS 경로에 의존하는 소스 파일 목록 반환(역방향 탐색). watch 에서 SCSS 변경 시 재컴파일 대상을 찾을 때.
20
- - sideEffectScssRegistryside-effect SCSS 항목 (소스경로 → 엔트리). emit 코드가 항목을 등록하는 통로.
65
+ - compileAsync(modifiedFiles?, emitOptions?) — 1회 증분 컴파일 실행. `modifiedFiles` = 직전 변경된 파일 절대경로 집합(증분 무효화용, 미지정·빈 집합이면 캐시 그대로 사용; node_modules 포함 변경 packageJsonCache 클리어). `emitOptions` emit 필터/transformer. 같은 인스턴스로 반복 호출해 증분 빌드를 이어간다.
66
+ - sideEffectScssRegistry (getter) — side-effect SCSS 등록부(`Map<소스, SideEffectScssEntry>`) 참조. emit 코드가 항목을 등록하는 통로.
67
+ - compileSideEffectScss() — 레지스트리의 모든 항목을 CSS 컴파일하고 에러/의존성을 내부 상태에 반영.
68
+ - findAffectedByScss(scssPath)주어진 SCSS 경로에 의존하는 소유자 파일 경로 배열을 반환(역방향 탐색). watch 에서 SCSS 변경 시 재컴파일 대상 산출에 쓴다.
21
69
 
22
- `compileAsync` 동작 요약: tsconfig 파싱 → `includeTests` 에 따라 rootNames 결정 → `output` 플래그로 compilerOptions 구성(`compilerOptionsTransformer` 마지막 적용) → Angular 면 `NgtscProgram.analyzeAsync`, 아니면 `EmitAndSemanticDiagnosticsBuilderProgram` → affected 파일 추적 → emit → 진단 수집·직렬화·필터(workspace 내부만) → `globalScss`/`lint` 병렬 실행. 비-Angular emit 은 writeFile 훅으로 디스크에 직접 쓰고(`emitResults` undefined), Angular emit 은 `emitResults` 로 메모리 반환.
70
+ 사용 예:
23
71
 
24
72
  ```typescript
25
73
  import { SdTsCompiler } from "@simplysm/sd-cli";
26
- const compiler = new SdTsCompiler({ pkgDir, cwd, output: { js: true, dts: true }, lint: true });
74
+
75
+ const compiler = new SdTsCompiler({
76
+ pkgDir: "/repo/packages/core-common",
77
+ cwd: "/repo",
78
+ output: { js: true, dts: true },
79
+ });
27
80
  const result = await compiler.compileAsync();
28
81
  if (result.errorCount > 0) console.error(result.errors);
82
+ // watch 라운드: 변경 파일만 넘겨 증분 컴파일
83
+ const next = await compiler.compileAsync(new Set(["/repo/packages/core-common/src/foo.ts"]));
29
84
  ```
30
85
 
31
- ## ISdTsCompilerOptions
32
-
33
- 생성자 옵션.
34
-
35
- - pkgDir: string — 컴파일 대상 패키지 디렉토리 절대경로. rootNames·outDir·SCSS loadPath 기준.
36
- - cwd: string — workspace 루트. diagnostics 필터링(워크스페이스 내부 진단만 남김)·상대경로 로깅 기준.
37
- - output: { js: boolean; dts: boolean } — 출력 제어. `js` = `.js` emit 여부, `dts` = `.d.ts` emit 여부. 둘 다 false 면 noEmit(타입체크만). 조합에 따라 declaration/sourceMap/tsBuildInfoFile 이름이 달라짐.
38
- - includeTests?: boolean — `tests/` 파일을 rootNames 에 포함할지. 기본 false. 테스트 AOT 컴파일(Vitest)에서 true.
39
- - env?: "node" | "browser" — 타입체크 환경. 설정 시 환경별 compilerOptions 조정(`getCompilerOptionsForEnv`) 적용. 동일 패키지를 환경별로 분리 검증할 때.
40
- - sourceFileCache?: AngularSourceFileCache — Angular 증분 빌드용 SourceFile 캐시. 미제공 시 내부 생성. 인스턴스 간 캐시 공유로 증분 속도 확보.
41
- - transformStylesheet?: (data, containingFile, stylesheetFile?) => Promise<string | null> — 스타일시트 변환 콜백(Angular 전용). 인라인/외부 스타일을 가공해 반환, `null` 이면 미변환. 미제공 + Angular 면 라이브러리용 SCSS 변환 콜백이 자동 생성됨.
42
- - externalStylesheets?: Map<string, string> — 외부 스타일시트 맵(클라이언트 빌드용). `resourceNameToFileName` 에서 비-템플릿 리소스를 해시 기반 `.css` 외부 ID 로 치환할 때 채워짐.
43
- - compilerOptionsTransformer?: (options) => ts.CompilerOptions — compilerOptions 최종 후처리. 내부 구성 이후 마지막에 적용되어 target/module/rootDir 등을 강제 가능. 클라이언트·Vitest 빌드에서 사용.
44
- - lint?: boolean — true 면 `compileAsync` 가 lint 를 함께 실행하고 결과를 `result.lint` 에 포함. lint runner 는 lazy init 후 인스턴스 재사용.
45
- - globalScss?: boolean — true 면 `scss/styles.scss` → `dist/styles.css` 글로벌 SCSS 컴파일 수행. 글로벌 스타일 산출이 필요한 패키지에서.
46
-
47
- ## ISdTsCompilerEmitOptions
86
+ ## ISdTsCompilerResult (compileAsync 반환)
48
87
 
49
- `compileAsync` 의 두 번째 인자(emit 세부 제어, Angular 전용).
50
-
51
- - sourceFilter?: (fileName: string) => boolean — emit 대상 소스 필터. 지정 시 통과한 소스의 EmitResult 만 결과에 포함. 일부 파일만 재emit 할 때.
52
- - additionalTransformers?: { before?; after? } — Angular transformers 외 추가 TS transformer factory. `before`/`after` 각각 `ts.TransformerFactory<ts.SourceFile>[]`. 컴파일 파이프라인에 사용자 변환을 끼울 때.
53
-
54
- ## ISdTsCompilerResult
55
-
56
- `compileAsync` 반환값.
88
+ ```typescript
89
+ interface ISdTsCompilerResult {
90
+ program: ts.Program;
91
+ builderProgram: ts.EmitAndSemanticDiagnosticsBuilderProgram;
92
+ isForAngular: boolean;
93
+ affectedFiles: ReadonlySet<string> | undefined;
94
+ diagnostics: SerializedDiagnostic[];
95
+ errorCount: number;
96
+ warningCount: number;
97
+ errors?: string[];
98
+ ngtscProgram?: NgtscProgram;
99
+ emitResults?: EmitResult[]; // EmitResult: { filename; contents; sourceFileName }
100
+ lint?: LintWithProgramResult;
101
+ scssErrors: string[];
102
+ scssDependencies: ReadonlyMap<string, ReadonlySet<string>>;
103
+ }
104
+ ```
57
105
 
58
- - program: ts.Program — TypeScript Program 참조. lint·외부 도구용.
59
- - builderProgram: ts.EmitAndSemanticDiagnosticsBuilderProgram Builder Program 참조. 다음 증분 호출에 재사용됨.
60
- - isForAngular: boolean — Angular 패키지 여부(tsconfig `angularCompilerOptions` 존재로 판별).
61
- - affectedFiles: ReadonlySet<string> | undefined — 이번 빌드에서 영향받은 파일(posix 경로). `undefined` = 전역 변경(전체 리빌드).
62
- - diagnostics: SerializedDiagnostic[] — 직렬화된 진단 정보(worker 경계 통과용). 워크스페이스 내부 진단만 남기고 필터됨.
63
- - errorCount: number — Error 카테고리 진단 수(단계별 크래시 진단 합산).
64
- - warningCount: numberWarning 카테고리 진단 수.
65
- - errors?: string[]Error 진단을 "파일:줄:열: TS코드: 메시지" 형식으로 포맷한 배열. 없으면 undefined.
66
- - ngtscProgram?: NgtscProgramNgtscProgram 참조(Angular 전용, HMR ). 비-Angular 이면 undefined.
67
- - emitResults?: EmitResult[]Angular emit 결과 배열(`{ filename, contents, sourceFileName }`). 비-Angular 면 undefined(writeFile 훅이 디스크에 직접 씀).
68
- - lint?: LintWithProgramResult — lint 결과. `lint` 옵션 활성 시에만 존재.
106
+ - program: ts.Program — TS Program 참조. lint·외부 도구에 넘길 때.
107
+ - builderProgram — 증분 BuilderProgram 참조.
108
+ - isForAngular: boolean — Angular 모드로 컴파일됐는지(tsconfig `angularCompilerOptions` 유무로 결정). 후속 처리 분기에 쓴다.
109
+ - affectedFiles: ReadonlySet<string> | undefined — 이번 빌드에서 영향받은 파일(posix 경로). `undefined` = 전역 변경(전체 리빌드). 부분 재처리 범위 판단에 쓴다.
110
+ - diagnostics: SerializedDiagnostic[] — 직렬화된 진단 전체(worker 경계 통과용). 내부 크래시 진단도 합산됨.
111
+ - errorCount / warningCount: number — Error / Warning 카테고리 진단 수. 크래시는 errorCount 에 가산.
112
+ - errors?: string[]Error 진단을 `"파일:줄:열: TS코드: 메시지"` 형식으로 포맷한 배열(없으면 undefined). 로그 출력에 바로 쓴다.
113
+ - ngtscProgram?: NgtscProgramNgtscProgram 참조(Angular only, HMR 용). non-Angular 이면 undefined.
114
+ - emitResults?: EmitResult[]Angular emit 결과 배열. 각 항목 `{ filename; contents; sourceFileName }`(sourceFileName = 원본 소스 경로). non-Angular writeFile 훅으로 디스크에 직접 쓰므로 undefined. 메모리상 컴파일 결과가 필요한 플러그인이 소비.
115
+ - lint?: LintWithProgramResultlint 결과(`lint: true` 때만).
69
116
  - scssErrors: string[] — SCSS 컴파일 에러 목록.
70
117
  - scssDependencies: ReadonlyMap<string, ReadonlySet<string>> — SCSS 의존성 맵(소유자 파일 → 의존 SCSS 경로 집합). watch 역방향 탐색용.
@@ -1,173 +1,291 @@
1
1
  # @simplysm/sd-cli — sd.config.ts 설정 타입
2
2
 
3
- 프로젝트 루트 `sd.config.ts` 작성에 쓰는 타입 묶음. `sd.config.ts` 는 `SdConfigFn`(=`(params: SdConfigParams) => SdConfig | Promise<SdConfig>`)을 default export 해야 함. 권위 소스는 `packages/sd-cli/src/sd-config.types.ts`.
3
+ 프로젝트 루트 `sd.config.ts` 작성·수정 함께 읽히는 타입 묶음. `sd.config.ts` 는 `SdConfigFn` 을 default export 해야 한다. 권위 소스는 `packages/sd-cli/src/sd-config.types.ts`. 모든 타입은 `import type { ... } from "@simplysm/sd-cli"` 로 가져온다.
4
4
 
5
- ## SdConfigFn / SdConfigParams
6
-
7
- `sd.config.ts` 의 default export 시그니처. `SdConfig` 또는 그 Promise 를 반환.
5
+ ## SdConfigFn / SdConfigParams / SdConfig
8
6
 
9
7
  ```typescript
10
8
  type SdConfigFn = (params: SdConfigParams) => SdConfig | Promise<SdConfig>;
9
+
10
+ interface SdConfigParams {
11
+ cwd: string;
12
+ dev: boolean;
13
+ opt: string[];
14
+ }
15
+
16
+ interface SdConfig {
17
+ packages: Record<string, SdPackageConfig | undefined>;
18
+ replaceDeps?: Record<string, string>;
19
+ postPublish?: SdPostPublishScriptConfig[];
20
+ }
11
21
  ```
12
22
 
13
- `SdConfigParams` (함수에 주입되는 인자):
23
+ `SdConfigParams` (sd-cli 가 설정 함수에 주입):
24
+
25
+ - cwd: string — 현재 작업 디렉토리(워크스페이스 루트). 설정에서 경로를 절대화할 때 쓴다.
26
+ - dev: boolean — 개발 모드 플래그. true 면 dev 실행(watch/dev). env·publish 를 모드별로 분기할 때 쓴다.
27
+ - opt: string[] — CLI 의 `-o` 플래그로 넘어온 추가 옵션 배열. 임의 빌드 변형(예: 특정 환경 타겟)을 분기할 때 쓴다.
14
28
 
15
- - cwd: string — 현재 작업 디렉토리(워크스페이스 루트). 경로 계산 기준.
16
- - dev: boolean — 개발 모드 플래그. true 면 dev 실행, false 면 빌드/배포. env 분기에 사용.
17
- - opt: string[]CLI `-o` 플래그로 전달된 추가 옵션 문자열 배열. 조건부 설정 분기용.
29
+ `SdConfig`:
30
+
31
+ - packages: Record<string, SdPackageConfig | undefined> 키는 `packages/` 하위 디렉토리명(예: `"core-common"`), 값은 해당 패키지 빌드 설정. `undefined` 패키지를 빌드 대상에서 제외. 워크스페이스의 어떤 패키지를 어떤 타겟으로 빌드할지 한 곳에 모은다.
32
+ - replaceDeps?: Record<string, string> — 의존성 교체(심링크). 키는 node_modules 에서 찾을 패키지 glob(예: `"@simplysm/*"`), 값은 로컬 소스 디렉토리 경로로 키의 `*` 캡처가 값의 `*` 에 치환됨(예: `"../simplysm/packages/*"`). 배포된 패키지 대신 로컬 소스를 곧바로 쓰고 싶을 때.
33
+ - postPublish?: SdPostPublishScriptConfig[] — 배포 완료 후 순차 실행할 스크립트 목록. 배포 후 알림·태깅 등 후처리에 쓴다.
34
+
35
+ 사용 예:
18
36
 
19
37
  ```typescript
20
38
  import type { SdConfigFn } from "@simplysm/sd-cli";
39
+
21
40
  const config: SdConfigFn = ({ dev }) => ({
22
41
  packages: {
23
42
  "core-common": { target: "neutral" },
24
- "core-node": { target: "node" },
43
+ "core-node": { target: "node", publish: { type: "npm" } },
44
+ "demo-client": dev ? { target: "client", server: "demo-server" } : undefined,
25
45
  },
26
46
  });
27
47
  export default config;
28
48
  ```
29
49
 
30
- ## SdConfig
50
+ ## SdPackageConfig (빌드 타겟 분기 유니온)
31
51
 
32
- `sd.config.ts` 최상위 설정 객체.
52
+ ```typescript
53
+ type SdPackageConfig =
54
+ | SdBuildPackageConfig // target: "node" | "browser" | "neutral"
55
+ | SdClientPackageConfig // target: "client"
56
+ | SdServerPackageConfig // target: "server"
57
+ | SdScriptsPackageConfig; // target: "scripts"
58
+ ```
33
59
 
34
- - packages: Record<string, SdPackageConfig | undefined> — 패키지별 설정. key 는 `packages/` 하위 디렉토리명(예: `"core-common"`). 값을 `undefined` 로 두면 해당 패키지 비활성. 빌드 대상·타겟을 패키지마다 지정.
35
- - replaceDeps?: Record<string, string> — 의존성 교체. key 는 node_modules 에서 찾을 패키지 glob(예: `"@simplysm/*"`), value 는 소스 디렉토리 경로이며 key 의 `*` 캡처가 value 의 `*` 에 치환됨. node_modules 패키지를 로컬 소스로 심링크해 빌드 없이 소스 import 할 때.
36
- - postPublish?: SdPostPublishScriptConfig[] — 배포 완료 후 순차 실행할 스크립트 목록. 배포 후 후처리(태깅·알림 등)에 사용.
60
+ 판별자는 `target`. enum literal 의미:
37
61
 
38
- ## SdPackageConfig (타겟별 패키지 설정)
62
+ - "node" / "browser" / "neutral" ( `SdBuildPackageConfig`) — esbuild 라이브러리 패키지. "node" = Node.js 전용, "browser" = 브라우저 전용, "neutral" = 공용. npm 배포 라이브러리에 쓴다.
63
+ - "client" (→ `SdClientPackageConfig`) — Frontend 앱(Angular + Capacitor/Electron/PWA 옵션). esbuild + define 으로 env 주입.
64
+ - "server" (→ `SdServerPackageConfig`) — Fastify 서버 앱. esbuild banner 로 env 주입, PM2 옵션.
65
+ - "scripts" (→ `SdScriptsPackageConfig`) — 유틸 패키지. watch 훅이 없으면 watch/typecheck 대상에서 제외됨.
39
66
 
40
- `SdBuildPackageConfig | SdClientPackageConfig | SdServerPackageConfig | SdScriptsPackageConfig` 의 union. `target` 값으로 분기된다.
67
+ ### SdBuildPackageConfig (node/browser/neutral)
41
68
 
42
- ### SdBuildPackageConfig (라이브러리: node/browser/neutral)
69
+ ```typescript
70
+ interface SdBuildPackageConfig {
71
+ target: BuildTarget; // "node" | "browser" | "neutral"
72
+ publish?: SdPublishConfig;
73
+ copySrc?: string[];
74
+ watch?: SdWatchHookConfig;
75
+ }
76
+ ```
43
77
 
44
- - target: "node" | "browser" | "neutral" — esbuild 라이브러리 빌드 타겟. "node" = Node.js 전용, "browser" = 브라우저 전용, "neutral" = 공용. 패키지 실행 환경에 맞춰 선택.
45
- - publish?: SdPublishConfig — 배포 설정. 미지정 시 배포 제외.
46
- - copySrc?: string[] — `src/` 에서 `dist/` 로 그대로 복사할 파일의 glob 패턴(src/ 기준 상대 경로). 비-TS 리소스 동봉용.
47
- - watch?: SdWatchHookConfig — watch 훅. 지정 watch 모드에서 빌드 엔진과 함께 명령 실행.
78
+ - target: "node"|"browser"|"neutral" — 빌드 런타임 타겟(위 풀이 참조). 라이브러리가 어느 환경에서 돌지에 맞춰 고른다.
79
+ - publish?: SdPublishConfig — 배포 대상 설정. 미지정 시 배포 안 함. npm 배포 라이브러리면 `{ type: "npm" }`.
80
+ - copySrc?: string[] — `src/` 에서 `dist/` 로 그대로 복사할 파일 glob(src 기준 상대). 컴파일 대상 아닌 정적 리소스를 산출물에 포함할 때.
81
+ - watch?: SdWatchHookConfig — watch 모드에서 빌드 엔진과 함께 실행할 훅. 빌드 부수 작업(코드 생성 등)을 watch 에 끼울 때.
48
82
 
49
- ### SdClientPackageConfig (Frontend 앱: target "client")
83
+ ### SdClientPackageConfig (client)
50
84
 
51
- - target: "client" — esbuild 기반 Angular 클라이언트 앱 빌드.
52
- - server: string | number — 연결할 서버. string = 서버 패키지명(예: `"demo-server"`), number = 포트 직접 지정(하위 호환). 개발 프록시/API 대상 결정.
53
- - env?: Record<string, string> — 빌드 시 `process.env` 를 객체로 치환할 환경 변수. 클라이언트 코드의 env 주입.
54
- - publish?: SdPublishConfig — 배포 설정.
55
- - capacitor?: SdCapacitorConfig — Capacitor(모바일) 패키징 설정. 지정 시 앱 패키징.
56
- - electron?: SdElectronConfig — Electron(데스크톱) 패키징 설정. 지정 시 데스크톱 패키징.
57
- - configs?: Record<string, unknown> — 런타임 설정. 빌드 시 `dist/.config.json` 으로 기록되어 런타임에 로드됨.
58
- - exclude?: string[] — Capacitor/Electron package.json 에 추가할 패키지(또는 제외 목록). 패키징 의존성 조정.
59
- - browserSupport?: SdBrowserSupportConfig — 브라우저 지원(browserslist·PostCSS·legacyModule) 설정.
60
- - pwa?: false | SdPwaConfig — PWA 설정. `false` 면 비활성, 미지정 시 기본값으로 활성화. PWA manifest 제어.
85
+ ```typescript
86
+ interface SdClientPackageConfig {
87
+ target: "client";
88
+ server: string | number;
89
+ env?: Record<string, string>;
90
+ publish?: SdPublishConfig;
91
+ capacitor?: SdCapacitorConfig;
92
+ electron?: SdElectronConfig;
93
+ configs?: Record<string, unknown>;
94
+ exclude?: string[];
95
+ browserSupport?: SdBrowserSupportConfig;
96
+ pwa?: false | SdPwaConfig;
97
+ }
98
+ ```
61
99
 
62
- ### SdServerPackageConfig (Fastify 서버: target "server")
100
+ - server: string | number — 연결할 dev 서버. string = 서버 패키지명(예: `"demo-server"`), number = 포트 직접 지정(하위 호환). 보통 같은 워크스페이스의 서버 패키지명을 준다.
101
+ - env?: Record<string, string> — 빌드 시 `process.env` 를 객체로 치환할 환경 변수. 프론트 코드에 빌드 타임 상수를 주입할 때.
102
+ - publish?: SdPublishConfig — 산출물 배포 설정.
103
+ - capacitor?: SdCapacitorConfig — Capacitor 모바일 앱 패키징 설정. 지정 시 Android 등으로 패키징.
104
+ - electron?: SdElectronConfig — Electron 데스크톱 앱 패키징 설정.
105
+ - configs?: Record<string, unknown> — 런타임 설정. 빌드 시 `dist/.config.json` 으로 기록되어 앱이 런타임에 읽음. 배포 환경별 가변 값.
106
+ - exclude?: string[] — Capacitor/Electron `package.json` 에 추가(번들 제외)할 패키지 목록.
107
+ - browserSupport?: SdBrowserSupportConfig — 브라우저 호환(browserslist/PostCSS/legacyModule) 설정.
108
+ - pwa?: false | SdPwaConfig — PWA 설정. `false` 면 비활성화, 미지정 시 기본값으로 활성화, 객체면 manifest 커스텀. PWA 가 필요 없으면 `false`.
63
109
 
64
- - target: "server" — esbuild 기반 Fastify 서버 앱 빌드.
65
- - env?: Record<string, string> — 빌드 시 `process.env.KEY` 를 상수로 치환할 환경 변수.
66
- - publish?: SdPublishConfig — 배포 설정.
67
- - configs?: Record<string, unknown> — 런타임 설정. 빌드 시 `dist/.config.json` 으로 기록.
68
- - externals?: string[] — esbuild 번들에 포함하지 않을 외부 모듈. 네이티브 모듈(binding.gyp 자동 감지분에 추가)을 번들 제외할 때.
69
- - pm2?: { name?: string; ignoreWatchPaths?: string[] } — PM2 설정. 지정 시 `dist/pm2.config.cjs` 생성. `name` = 프로세스 이름(미지정 시 package.json name 기반), `ignoreWatchPaths` = PM2 watch 제외 경로.
70
- - packageManager?: "volta" | "mise" — 사용할 패키지 매니저. 생성되는 mise.toml/volta 설정에 영향. 배포 환경의 런타임 관리자 선택.
110
+ ### SdServerPackageConfig (server)
71
111
 
72
- ### SdScriptsPackageConfig (유틸 스크립트: target "scripts")
112
+ ```typescript
113
+ interface SdServerPackageConfig {
114
+ target: "server";
115
+ env?: Record<string, string>;
116
+ publish?: SdPublishConfig;
117
+ configs?: Record<string, unknown>;
118
+ externals?: string[];
119
+ pm2?: { name?: string; ignoreWatchPaths?: string[] };
120
+ packageManager?: "volta" | "mise";
121
+ }
122
+ ```
123
+
124
+ - env?: Record<string, string> — 빌드 시 `process.env.KEY` 를 상수로 치환(esbuild banner). 서버 빌드 타임 상수 주입.
125
+ - configs?: Record<string, unknown> — 런타임 설정. `dist/.config.json` 으로 기록.
126
+ - externals?: string[] — esbuild 번들에 포함하지 않을 외부 모듈. 자동 `binding.gyp` 감지 항목에 더해짐. 네이티브 모듈을 번들에서 뺄 때.
127
+ - pm2?.name?: string — PM2 프로세스 이름. 미지정 시 `package.json` name 에서 생성. 지정 시 `dist/pm2.config.cjs` 생성.
128
+ - pm2?.ignoreWatchPaths?: string[] — PM2 watch 에서 제외할 경로.
129
+ - packageManager?: "volta" | "mise" — 산출물에 생성할 패키지 매니저 설정 종류. "volta" = volta 설정, "mise" = `mise.toml` 생성. 배포 서버의 매니저에 맞춘다.
73
130
 
74
- - target: "scripts" — 빌드 산출 없는 스크립트 전용 패키지. watch 훅 미설정 시 watch/typecheck 에서 제외됨.
75
- - publish?: SdPublishConfig — 배포 설정.
76
- - watch?: SdWatchHookConfig — watch 훅. 지정 시 watch 모드에 패키지 포함.
131
+ ### SdScriptsPackageConfig (scripts)
132
+
133
+ ```typescript
134
+ interface SdScriptsPackageConfig {
135
+ target: "scripts";
136
+ publish?: SdPublishConfig;
137
+ watch?: SdWatchHookConfig;
138
+ }
139
+ ```
140
+
141
+ - watch?: SdWatchHookConfig — watch 훅. 지정해야만 이 패키지가 watch 모드에 포함됨(미지정 시 watch/typecheck 제외). 파일 변경 시 임의 명령 실행에 쓴다.
77
142
 
78
143
  ## SdWatchHookConfig
79
144
 
80
- watch 모드에서 파일 변경 시 임의 명령을 실행하는 훅. `SdBuildPackageConfig.watch` / `SdScriptsPackageConfig.watch` 에 사용.
145
+ ```typescript
146
+ interface SdWatchHookConfig {
147
+ target: string[];
148
+ cmd: string;
149
+ args?: string[];
150
+ }
151
+ ```
81
152
 
82
- - target: string[] — 감시할 glob 패턴(패키지 디렉토리 기준 상대 경로). 어떤 파일 변경을 트리거로 볼지.
83
- - cmd: string — 변경 시 실행할 명령어.
153
+ - target: string[] — 감시할 glob 패턴(패키지 디렉토리 기준 상대). 어떤 파일 변경에 반응할지.
154
+ - cmd: string — 변경 감지 시 실행할 명령어.
84
155
  - args?: string[] — 명령어 인수.
85
156
 
86
- ## 배포 설정 (SdPublishConfig 계열)
157
+ ## 배포 설정 (SdPublishConfig 유니온 + SdPostPublishScriptConfig)
87
158
 
88
- `SdNpmPublishConfig | SdLocalDirectoryPublishConfig | SdStoragePublishConfig` union. `type` 으로 분기.
159
+ ```typescript
160
+ type SdPublishConfig = SdNpmPublishConfig | SdLocalDirectoryPublishConfig | SdStoragePublishConfig;
161
+ ```
89
162
 
90
- - SdNpmPublishConfig — `{ type: "npm" }`. npm 레지스트리 배포.
91
- - SdLocalDirectoryPublishConfig — `{ type: "local-directory"; path: string }`. 로컬 디렉토리 복사 배포. `path` 는 환경 변수 치환(`%VER%`, `%PROJECT%`) 지원.
92
- - SdStoragePublishConfig — FTP/FTPS/SFTP 업로드 배포.
93
- - type: "ftp" | "ftps" | "sftp" — 전송 프로토콜. 보안 필요 시 ftps/sftp.
94
- - host: string — 서버 호스트.
95
- - port?: number — 포트.
96
- - path?: string — 업로드 대상 경로.
97
- - user?: string — 접속 계정.
98
- - password?: string — 접속 비밀번호.
163
+ 판별자는 `type`:
99
164
 
100
- `SdPostPublishScriptConfig` (배포 스크립트):
165
+ - `SdNpmPublishConfig` `{ type: "npm" }`. npm 레지스트리 배포. 공개 라이브러리에 쓴다.
166
+ - `SdLocalDirectoryPublishConfig` — `{ type: "local-directory"; path: string }`. 로컬 디렉토리로 복사. `path` 는 `%VER%`/`%PROJECT%` 치환 지원. 사내 공유 폴더 배포에.
167
+ - `SdStoragePublishConfig` — `{ type: "ftp"|"ftps"|"sftp"; host; port?; path?; user?; password? }`. type 별 프로토콜 차이(ftp = 평문, ftps = TLS, sftp = SSH). 원격 서버 업로드 배포에. host 만 필수, 나머지는 선택.
101
168
 
102
- - type: "script" — 스크립트 실행 항목.
103
- - cmd: string — 실행 명령어.
104
- - args: string[] — 인수. 환경 변수 치환(`%VER%`, `%PROJECT%`) 지원.
169
+ ```typescript
170
+ interface SdPostPublishScriptConfig {
171
+ type: "script";
172
+ cmd: string;
173
+ args: string[]; // %VER%, %PROJECT% 치환 지원
174
+ }
175
+ ```
176
+
177
+ - cmd: string — 배포 후 실행할 명령어.
178
+ - args: string[] — 인수. `%VER%`(버전), `%PROJECT%`(프로젝트명) 치환됨.
105
179
 
106
- ## Capacitor 설정 (SdClientPackageConfig.capacitor)
180
+ ## Capacitor 설정 (client 의 capacitor)
107
181
 
108
- `SdCapacitorConfig`:
182
+ ```typescript
183
+ interface SdCapacitorConfig {
184
+ appId: string;
185
+ appName: string;
186
+ plugins?: Record<string, Record<string, unknown> | true>;
187
+ icon?: string;
188
+ debug?: boolean;
189
+ platform?: { android?: SdCapacitorAndroidConfig };
190
+ }
191
+ ```
109
192
 
110
- - appId: string — 앱 ID(예: `"com.example.app"`).
111
- - appName: string — 앱 이름.
112
- - plugins?: Record<string, Record<string, unknown> | true> — Capacitor 플러그인 설정. key = 패키지명, value = `true`(옵션 없음) 또는 플러그인 옵션 객체.
113
- - icon?: string — 앱 아이콘 경로(패키지 디렉토리 기준 상대).
193
+ - appId: string — 앱 ID(역도메인, 예: `"com.example.app"`). 스토어 식별자.
194
+ - appName: string — 앱 표시 이름.
195
+ - plugins?: Record<string, Record<string, unknown> | true> — Capacitor 플러그인. = 패키지명, = `true`(옵션 없이 활성) 또는 옵션 객체. 옵션이 필요 없으면 `true`.
196
+ - icon?: string — 앱 아이콘 경로(패키지 기준 상대).
114
197
  - debug?: boolean — 디버그 빌드 플래그.
115
- - platform?: { android?: SdCapacitorAndroidConfig } — 플랫폼별 설정(현재 android).
198
+ - platform?.android?: SdCapacitorAndroidConfig — Android 플랫폼별 설정.
116
199
 
117
- `SdCapacitorAndroidConfig`:
200
+ ```typescript
201
+ interface SdCapacitorAndroidConfig {
202
+ config?: Record<string, string>;
203
+ bundle?: boolean;
204
+ intentFilters?: SdCapacitorIntentFilter[];
205
+ sign?: SdCapacitorSignConfig;
206
+ sdkVersion?: number;
207
+ permissions?: SdCapacitorPermission[];
208
+ }
209
+ ```
118
210
 
119
- - config?: Record<string, string> — AndroidManifest.xml `application` 태그 속성(예: `{ requestLegacyExternalStorage: "true" }`).
120
- - bundle?: boolean — true AAB 번들, false APK 빌드.
121
- - intentFilters?: SdCapacitorIntentFilter[] — Intent Filter 목록.
122
- - sign?: SdCapacitorSignConfig — APK/AAB 서명 설정.
211
+ - config?: Record<string, string> — `AndroidManifest.xml` 의 `<application>` 태그 속성(예: `{ requestLegacyExternalStorage: "true" }`).
212
+ - bundle?: boolean — true = AAB 번들, false = APK. 스토어 배포면 true.
213
+ - intentFilters?: SdCapacitorIntentFilter[] — 딥링크 등 Intent Filter 목록.
214
+ - sign?: SdCapacitorSignConfig — APK/AAB 서명 설정. 릴리스 빌드에 필요.
123
215
  - sdkVersion?: number — Android SDK 버전(minSdk·targetSdk 공통).
124
216
  - permissions?: SdCapacitorPermission[] — 추가 권한 목록.
125
217
 
126
- `SdCapacitorIntentFilter`:
127
-
128
- - action?: string intent 액션(예: `"android.intent.action.VIEW"`).
129
- - category?: string intent 카테고리(예: `"android.intent.category.DEFAULT"`).
130
-
131
- `SdCapacitorSignConfig`:
132
-
133
- - keystore: string — keystore 파일 경로(패키지 디렉토리 기준 상대).
134
- - storePassword: string — keystore 비밀번호.
135
- - alias: string — 키 별칭.
136
- - password: string — 키 비밀번호.
137
- - keystoreType?: string — keystore 타입(기본 `"jks"`).
218
+ ```typescript
219
+ interface SdCapacitorSignConfig { keystore: string; storePassword: string; alias: string; password: string; keystoreType?: string; }
220
+ interface SdCapacitorPermission { name: string; maxSdkVersion?: number; ignore?: string; }
221
+ interface SdCapacitorIntentFilter { action?: string; category?: string; }
222
+ ```
138
223
 
139
- `SdCapacitorPermission`:
224
+ - SdCapacitorSignConfig.keystore — keystore 파일 경로(패키지 기준 상대). storePassword/alias/password = 서명 자격. keystoreType?: string — keystore 타입(기본값 `"jks"`).
225
+ - SdCapacitorPermission.name — 권한 이름(예: `"CAMERA"`). maxSdkVersion?: number — 권한 적용 최대 SDK. ignore?: string — `tools:ignore` 속성 값.
226
+ - SdCapacitorIntentFilter.action — intent 액션(예: `"android.intent.action.VIEW"`). category — intent 카테고리(예: `"android.intent.category.DEFAULT"`).
140
227
 
141
- - name: string — 권한 이름(예: `"CAMERA"`, `"WRITE_EXTERNAL_STORAGE"`).
142
- - maxSdkVersion?: number — 권한 적용 최대 SDK 버전.
143
- - ignore?: string — `tools:ignore` 속성 값.
228
+ ## Electron 설정 (client electron)
144
229
 
145
- ## Electron 설정 (SdElectronConfig)
230
+ ```typescript
231
+ interface SdElectronConfig {
232
+ appId: string;
233
+ portable?: boolean;
234
+ installerIcon?: string;
235
+ reinstallDependencies?: string[];
236
+ postInstallScript?: string;
237
+ nsisOptions?: Record<string, unknown>;
238
+ env?: Record<string, string>;
239
+ }
240
+ ```
146
241
 
147
- - appId: string — Electron 앱 ID(예: `"com.example.myapp"`).
148
- - portable?: boolean — true 포터블 `.exe`, false/미지정 NSIS 설치 프로그램.
149
- - installerIcon?: string — 설치 프로그램 아이콘 경로(`.ico`, 패키지 기준 상대).
150
- - reinstallDependencies?: string[] — Electron 에 포함할 npm 패키지(네이티브 모듈 등).
242
+ - appId: string — Electron 앱 ID(역도메인, 예: `"com.example.myapp"`).
243
+ - portable?: boolean — true = 포터블 `.exe`, false/미지정 = NSIS 설치 프로그램. 설치 없이 실행 배포면 true.
244
+ - installerIcon?: string — 설치 프로그램 아이콘(`.ico`, 패키지 기준 상대).
245
+ - reinstallDependencies?: string[] — Electron 에 포함할 npm 패키지(네이티브 모듈 등) 목록.
151
246
  - postInstallScript?: string — npm postinstall 스크립트.
152
247
  - nsisOptions?: Record<string, unknown> — NSIS 옵션(`portable` 이 false 일 때 적용).
153
- - env?: Record<string, string> — 환경 변수. `electron-main.ts` 에서 `process.env` 로 접근.
248
+ - env?: Record<string, string> — 환경 변수. `electron-main.ts` 에서 `process.env` 로 접근 가능.
154
249
 
155
- ## PWA 설정 (SdPwaConfig)
250
+ ## PWA 설정 (client 의 pwa)
156
251
 
157
- `SdPwaConfig`:
252
+ ```typescript
253
+ interface SdPwaConfig { manifest?: SdPwaManifestConfig; }
254
+ interface SdPwaManifestConfig {
255
+ name?: string;
256
+ short_name?: string;
257
+ display?: "standalone" | "fullscreen" | "minimal-ui" | "browser";
258
+ theme_color?: string;
259
+ background_color?: string;
260
+ icons?: Array<{ src: string; sizes: string; type?: string }>;
261
+ }
262
+ ```
158
263
 
159
- - manifest?: SdPwaManifestConfig — PWA manifest 설정.
264
+ - manifest?: SdPwaManifestConfig — PWA manifest 커스터마이징. 미지정 시 기본 manifest.
265
+ - display?: "standalone"|"fullscreen"|"minimal-ui"|"browser" — 앱 표시 모드. "standalone" = 브라우저 UI 없는 앱 창, "fullscreen" = 전체 화면, "minimal-ui" = 최소 브라우저 UI, "browser" = 일반 탭. 네이티브 느낌이면 "standalone".
266
+ - name/short_name/theme_color/background_color — manifest 표준 필드(앱 이름·축약명·테마색·배경색).
267
+ - icons?: Array<{ src; sizes; type? }> — manifest 아이콘 목록(경로·크기·MIME).
160
268
 
161
- `SdPwaManifestConfig` (모두 선택):
269
+ ## SdBrowserSupportConfig (client 의 browserSupport)
162
270
 
163
- - name?: string — 앱 전체 이름.
164
- - short_name?: string — 짧은 이름(홈 화면 등).
165
- - display?: "standalone" | "fullscreen" | "minimal-ui" | "browser" — 표시 모드. "standalone" = 단독 앱처럼, "fullscreen" = 전체 화면, "minimal-ui" = 최소 브라우저 UI, "browser" = 일반 탭. 앱 체감 수준 선택.
166
- - theme_color?: string 테마 색상.
167
- - background_color?: string — 스플래시 배경 색상.
168
- - icons?: Array<{ src: string; sizes: string; type?: string }> — 아이콘 목록. `src` = 경로, `sizes` = 크기 문자열(예: `"512x512"`), `type` = MIME 타입.
271
+ ```typescript
272
+ interface SdBrowserSupportConfig {
273
+ browserslist?: string | string[];
274
+ postCss?: { plugins: [string, (object | string)?][] };
275
+ legacyModule?: boolean;
276
+ }
277
+ ```
278
+
279
+ - browserslist?: string | string[] — browserslist 쿼리(예: `"last 2 Chrome versions"` 또는 `["ie 11", "last 2 versions"]`). 트랜스파일·prefix 대상 브라우저 범위.
280
+ - postCss?.plugins: [string, (object|string)?][] — PostCSS 플러그인 `[이름, 옵션?]` 튜플 배열.
281
+ - legacyModule?: boolean — 레거시 모듈 지원. true 면 코드 분할 비활성화 + `import.meta` 치환. 구형 환경 대응이 필요할 때.
169
282
 
170
283
  ## 보조 타입
171
284
 
172
- - BuildTarget — `"node" | "browser" | "neutral"`. `SdBuildPackageConfig.target` 값 집합.
173
- - NpmConfig npm `package.json` 구조 타입(`name`, `version`, `description?`, `dependencies?`, `devDependencies?`, `peerDependencies?`, `volta?`). 설정 코드에서 package.json 을 타입 있게 다룰 때.
285
+ ```typescript
286
+ type BuildTarget = "node" | "browser" | "neutral";
287
+ interface NpmConfig { name; version; description?; dependencies?; devDependencies?; peerDependencies?; volta?; }
288
+ ```
289
+
290
+ - BuildTarget — esbuild 라이브러리 빌드 런타임 타겟 enum(위 `SdPackageConfig` 풀이 참조).
291
+ - NpmConfig — `package.json` 구조 타입. name/version 필수, 나머지 선택. package.json 을 타입 안전하게 다룰 때.