@simplysm/sd-cli 13.0.0-beta.38 → 13.0.0-beta.44

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.
package/README.md CHANGED
@@ -176,7 +176,7 @@ During production build (`sd-cli build`), the following deployment files are gen
176
176
  | File | Description |
177
177
  |------|-------------|
178
178
  | `package.json` | Minimal package.json with externalized dependencies (version `"*"`) for `npm install` on the deployment server |
179
- | `mise.toml` | Node.js version specification (read from root `mise.toml`) |
179
+ | `mise.toml` | Node.js version specification (read from root `mise.toml`) — only generated when `packageManager: "mise"` is set |
180
180
  | `openssl.cnf` | Legacy OpenSSL provider activation (required for MSSQL and other legacy TLS connections) |
181
181
  | `pm2.config.cjs` | PM2 process manager config (only generated when `pm2` is configured) |
182
182
 
@@ -478,10 +478,10 @@ Users can install the app on their home screen on supported browsers and devices
478
478
  publish?: SdPublishConfig; // Deployment config (optional)
479
479
  configs?: Record<string, unknown>; // Runtime config (written to dist/.config.json during build)
480
480
  externals?: string[]; // Additional modules to exclude from bundle (optional)
481
+ packageManager?: "volta" | "mise"; // Package manager for Node.js version management (optional)
481
482
  pm2?: { // PM2 config — generates dist/pm2.config.cjs (optional)
482
483
  name?: string; // PM2 process name (defaults to package name)
483
484
  ignoreWatchPaths?: string[]; // Paths to ignore in PM2 watch
484
- noInterpreter?: boolean; // Skip interpreter path (use system PATH node)
485
485
  };
486
486
  }
487
487
  ```
@@ -715,7 +715,7 @@ Electron configuration for Windows desktop app builds in `client` target package
715
715
 
716
716
  ### Server Externals & PM2 Configuration
717
717
 
718
- Server packages can configure external modules and PM2 deployment settings.
718
+ Server packages can configure external modules, package manager selection, and PM2 deployment settings.
719
719
 
720
720
  #### Externals
721
721
 
@@ -728,6 +728,55 @@ Native modules (with `binding.gyp`) are automatically detected and externalized.
728
728
  },
729
729
  ```
730
730
 
731
+ #### Package Manager Selection
732
+
733
+ The `packageManager` field controls which Node.js version management tool is used in production deployment:
734
+
735
+ ```typescript
736
+ "my-server": {
737
+ target: "server",
738
+ packageManager: "volta", // Use Volta for Node.js version management
739
+ },
740
+ ```
741
+
742
+ **Supported package managers:**
743
+
744
+ | Value | Behavior | Generated Files |
745
+ |-------|----------|-----------------|
746
+ | `"volta"` | Uses Volta for Node.js version management. PM2 config will execute `node` directly (Volta manages version via `package.json` engines field). | `package.json` includes `volta` field with Node.js version |
747
+ | `"mise"` | Uses mise for Node.js version management. PM2 config will resolve interpreter path via `mise which node`. | `mise.toml` is copied to `dist/` with Node.js version from root `mise.toml` |
748
+ | `undefined` | No version management tool. PM2 config will execute `node` directly from system PATH. | No additional version management files |
749
+
750
+ **Examples:**
751
+
752
+ ```typescript
753
+ // Using Volta
754
+ "my-server": {
755
+ target: "server",
756
+ packageManager: "volta",
757
+ pm2: {
758
+ name: "my-app-server",
759
+ },
760
+ },
761
+
762
+ // Using mise
763
+ "my-server": {
764
+ target: "server",
765
+ packageManager: "mise",
766
+ pm2: {
767
+ name: "my-app-server",
768
+ },
769
+ },
770
+
771
+ // No package manager (use system PATH node)
772
+ "my-server": {
773
+ target: "server",
774
+ pm2: {
775
+ name: "my-app-server",
776
+ },
777
+ },
778
+ ```
779
+
731
780
  #### PM2 Configuration
732
781
 
733
782
  When `pm2` is configured, `dist/pm2.config.cjs` is generated during production build for use with [PM2](https://pm2.keymetrics.io/) process manager:
@@ -735,13 +784,13 @@ When `pm2` is configured, `dist/pm2.config.cjs` is generated during production b
735
784
  ```typescript
736
785
  "my-server": {
737
786
  target: "server",
787
+ packageManager: "mise", // Optional: specify package manager
738
788
  env: {
739
789
  CUSTOM_VAR: "value",
740
790
  },
741
791
  pm2: {
742
792
  name: "my-app-server", // PM2 process name (optional)
743
793
  ignoreWatchPaths: ["uploads"], // Additional paths to ignore in PM2 watch (optional)
744
- noInterpreter: false, // Set true to skip mise-managed node path (optional)
745
794
  },
746
795
  },
747
796
  ```
@@ -750,9 +799,9 @@ When `pm2` is configured, `dist/pm2.config.cjs` is generated during production b
750
799
 
751
800
  - Process name (from `pm2.name` or derived from package name)
752
801
  - Watch mode enabled with configurable ignore paths (`node_modules`, `www` + custom paths)
753
- - Node.js interpreter path via `mise which node` (unless `noInterpreter: true`)
802
+ - Node.js interpreter path (resolved via `mise which node` if `packageManager: "mise"`, otherwise `node` from PATH)
754
803
  - `--openssl-config=openssl.cnf` interpreter argument for legacy TLS support
755
- - Environment variables: `NODE_ENV=production`, `TZ=Asia/Seoul`, `SD_VERSION`, plus custom `env` values
804
+ - Environment variables: `NODE_ENV=production`, `TZ=Asia/Seoul`, plus custom `env` values
756
805
 
757
806
  **Deployment workflow:**
758
807
 
@@ -764,8 +813,15 @@ sd-cli build my-server
764
813
 
765
814
  # 3. On the deployment server:
766
815
  cd /path/to/my-server/dist
767
- npm install # Install externalized dependencies
768
- pm2 start pm2.config.cjs # Start with PM2
816
+
817
+ # If using mise, install mise and activate
818
+ mise install # Only needed if packageManager: "mise"
819
+
820
+ # Install externalized dependencies
821
+ npm install
822
+
823
+ # Start with PM2
824
+ pm2 start pm2.config.cjs
769
825
  ```
770
826
 
771
827
  ## Cache
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAmB/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8ED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6VnE"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAmB/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8ED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8VnE"}
@@ -255,7 +255,8 @@ async function runBuild(options) {
255
255
  env: { ...baseEnv, ...config.env },
256
256
  configs: config.configs,
257
257
  externals: config.externals,
258
- pm2: config.pm2
258
+ pm2: config.pm2,
259
+ packageManager: config.packageManager
259
260
  });
260
261
  results.push({
261
262
  name,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/build.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport ts from \"typescript\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { Worker, type WorkerProxy, fsRm } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig, SdBuildPackageConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport { runLint, type LintOptions } from \"./lint\";\nimport type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { Electron } from \"../electron/electron\";\nimport { copySrcFiles } from \"../utils/copy-src\";\n\n//#region Types\n\n/**\n * Build \uBA85\uB839 \uC635\uC158\n */\nexport interface BuildOptions {\n /** \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uACB0\uACFC\n */\ninterface BuildResult {\n name: string;\n target: string;\n type: \"js\" | \"dts\" | \"vite\" | \"capacitor\" | \"electron\";\n success: boolean;\n errors?: string[];\n diagnostics?: ts.Diagnostic[];\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uBD84\uB958 \uACB0\uACFC\n */\ninterface ClassifiedPackages {\n /** node/browser/neutral \uD0C0\uAC9F (JS + dts) */\n buildPackages: Array<{ name: string; config: SdBuildPackageConfig }>;\n /** client \uD0C0\uAC9F (Vite build + typecheck) */\n clientPackages: Array<{ name: string; config: SdClientPackageConfig }>;\n /** server \uD0C0\uAC9F (JS \uBE4C\uB4DC, dts \uC81C\uC678) */\n serverPackages: Array<{ name: string; config: SdServerPackageConfig }>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD328\uD0A4\uC9C0\uB97C \uD0C0\uAC9F\uBCC4\uB85C \uBD84\uB958\n * - node/browser/neutral: buildPackages (JS + dts)\n * - client: clientPackages (Vite build + typecheck)\n * - server: serverPackages (JS \uBE4C\uB4DC, dts \uC81C\uC678)\n * - scripts: \uC81C\uC678\n */\nfunction classifyPackages(\n packages: Record<\n string,\n SdBuildPackageConfig | SdClientPackageConfig | SdServerPackageConfig | { target: \"scripts\" } | undefined\n >,\n targets: string[],\n): ClassifiedPackages {\n const buildPackages: ClassifiedPackages[\"buildPackages\"] = [];\n const clientPackages: ClassifiedPackages[\"clientPackages\"] = [];\n const serverPackages: ClassifiedPackages[\"serverPackages\"] = [];\n\n for (const [name, config] of Object.entries(packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n if (config.target === \"client\") {\n clientPackages.push({ name, config });\n } else if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else {\n buildPackages.push({ name, config });\n }\n }\n\n return { buildPackages, clientPackages, serverPackages };\n}\n\n/**\n * dist \uD3F4\uB354 \uC0AD\uC81C\n */\nasync function cleanDistFolders(cwd: string, packageNames: string[]): Promise<void> {\n await Promise.all(packageNames.map((name) => fsRm(path.join(cwd, \"packages\", name, \"dist\"))));\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - lint \uC2E4\uD589\n * - dist \uD3F4\uB354 \uC815\uB9AC (clean build)\n * - `node`/`browser`/`neutral` \uD0C0\uAC9F: esbuild JS \uBE4C\uB4DC + dts \uC0DD\uC131 (\uD0C0\uC785\uCCB4\uD06C \uD3EC\uD568)\n * - `client` \uD0C0\uAC9F: Vite production \uBE4C\uB4DC + typecheck (dts \uBD88\uD544\uC694)\n * - \uD558\uB098\uB77C\uB3C4 \uC2E4\uD328\uD558\uBA74 `process.exitCode = 1` \uC124\uC815\n *\n * @param options - build \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve\n */\nexport async function runBuild(options: BuildOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:build\");\n\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"false\" };\n\n // \uD328\uD0A4\uC9C0 \uBD84\uB958\n const { buildPackages, clientPackages, serverPackages } = classifyPackages(sdConfig.packages, targets);\n const allPackageNames = [\n ...buildPackages.map((p) => p.name),\n ...clientPackages.map((p) => p.name),\n ...serverPackages.map((p) => p.name),\n ];\n\n if (allPackageNames.length === 0) {\n process.stdout.write(\"\u2714 \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\"\uD328\uD0A4\uC9C0 \uBD84\uB958 \uC644\uB8CC\", {\n buildPackages: buildPackages.map((p) => p.name),\n clientPackages: clientPackages.map((p) => p.name),\n serverPackages: serverPackages.map((p) => p.name),\n });\n\n // \uACB0\uACFC \uC218\uC9D1\n const results: BuildResult[] = [];\n // \uC5D0\uB7EC \uCD94\uC801 (\uAC1D\uCCB4\uB85C \uB798\uD551\uD558\uC5EC \uCF5C\uBC31 \uB0B4 \uC218\uC815 \uCD94\uC801 \uAC00\uB2A5\uD558\uAC8C \uD568)\n const state = { hasError: false };\n\n // Worker \uACBD\uB85C\n const libraryWorkerPath = import.meta.resolve(\"../workers/library.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const dtsWorkerPath = import.meta.resolve(\"../workers/dts.worker\");\n\n // \uD30C\uC77C \uCE90\uC2DC (diagnostics \uCD9C\uB825\uC6A9)\n const fileCache = new Map<string, string>();\n\n // formatHost (diagnostics \uCD9C\uB825\uC6A9)\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // Lint \uC635\uC158 (\uC804\uCCB4 \uD328\uD0A4\uC9C0 \uB300\uC0C1)\n const lintOptions: LintOptions = {\n targets: allPackageNames.map((name) => `packages/${name}`),\n fix: false,\n timing: false,\n };\n\n // Listr \uAD6C\uC870: Lint \u2192 Clean \u2192 Build (\uC21C\uCC28)\n const mainListr = new Listr(\n [\n {\n title: \"Lint\",\n task: async () => {\n await runLint(lintOptions);\n // lint \uC5D0\uB7EC\uAC00 \uC788\uC73C\uBA74 process.exitCode\uAC00 1\uB85C \uC124\uC815\uB428\n if (process.exitCode === 1) {\n state.hasError = true;\n }\n },\n },\n {\n title: \"Clean\",\n task: async () => {\n await cleanDistFolders(cwd, allPackageNames);\n },\n },\n {\n title: \"Build\",\n task: (_, task) => {\n const buildTasks: ListrTask[] = [];\n\n // buildPackages: JS \uBE4C\uB4DC + dts \uC0DD\uC131\n for (const { name, config } of buildPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const env: TypecheckEnv = config.target === \"node\" ? \"node\" : \"browser\";\n\n buildTasks.push({\n title: `${name} (${config.target})`,\n task: async () => {\n // JS \uBE4C\uB4DC\uC640 DTS \uC0DD\uC131\uC744 \uBCD1\uB82C \uC2E4\uD589\n const libraryWorker: WorkerProxy<typeof LibraryWorkerModule> =\n Worker.create<typeof LibraryWorkerModule>(libraryWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const [buildResult, dtsResult] = await Promise.all([\n // JS \uBE4C\uB4DC\n libraryWorker.build({ name, config, cwd, pkgDir }),\n // DTS \uC0DD\uC131\n dtsWorker.buildDts({ name, cwd, pkgDir, env, emit: true }),\n ]);\n\n // JS \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: config.target,\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n\n // DTS \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: config.target,\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([libraryWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // copySrc \uD30C\uC77C \uBCF5\uC0AC\n if (config.copySrc != null && config.copySrc.length > 0) {\n await copySrcFiles(pkgDir, config.copySrc);\n }\n },\n });\n }\n\n // clientPackages: Vite \uBE4C\uB4DC + typecheck + Capacitor \uBE4C\uB4DC\n for (const { name, config } of clientPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (client)`,\n task: async () => {\n // Vite \uBE4C\uB4DC\uC640 \uD0C0\uC785\uCCB4\uD06C\uB97C \uBCD1\uB82C \uC2E4\uD589\n const clientWorker: WorkerProxy<typeof ClientWorkerModule> =\n Worker.create<typeof ClientWorkerModule>(clientWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const clientConfig: SdClientPackageConfig = {\n ...config,\n env: { ...baseEnv, ...config.env },\n };\n const [clientResult, dtsResult] = await Promise.all([\n // Vite production \uBE4C\uB4DC\n clientWorker.build({ name, config: clientConfig, cwd, pkgDir }),\n // typecheck (dts \uC5C6\uC774)\n dtsWorker.buildDts({\n name,\n cwd,\n pkgDir,\n env: \"browser\",\n emit: false,\n }),\n ]);\n\n // Vite \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: \"client\",\n type: \"vite\",\n success: clientResult.success,\n errors: clientResult.errors,\n });\n if (!clientResult.success) state.hasError = true;\n\n // \uD0C0\uC785\uCCB4\uD06C \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: \"client\",\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([clientWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // Capacitor \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.capacitor != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor);\n await cap.initialize();\n await cap.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n\n // Electron \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.electron != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const electron = await Electron.create(pkgDir, config.electron);\n await electron.initialize();\n await electron.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n },\n });\n }\n\n // serverPackages: JS \uBE4C\uB4DC\uB9CC (dts \uC0DD\uC131 \uC81C\uC678)\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (server)`,\n task: async () => {\n const serverWorker: WorkerProxy<typeof ServerWorkerModule> =\n Worker.create<typeof ServerWorkerModule>(serverWorkerPath);\n\n try {\n const buildResult = await serverWorker.build({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n externals: config.externals,\n pm2: config.pm2,\n });\n\n results.push({\n name,\n target: \"server\",\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n } finally {\n await serverWorker.terminate();\n }\n },\n });\n }\n\n return task.newListr(buildTasks, { concurrent: true, exitOnError: false });\n },\n },\n ],\n {\n concurrent: false,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n try {\n await mainListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uC218\uC9D1\uB428\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n for (const result of results) {\n if (!result.success) {\n const typeLabel = result.type === \"dts\" ? \"dts\" : result.target;\n const errorLines: string[] = [`${result.name} (${typeLabel})`];\n if (result.errors != null) {\n for (const error of result.errors) {\n for (const line of error.split(\"\\n\")) {\n errorLines.push(` \u2192 ${line}`);\n }\n }\n }\n consola.error(errorLines.join(\"\\n\"));\n }\n if (result.diagnostics != null) {\n allDiagnostics.push(...result.diagnostics);\n }\n }\n\n // diagnostics \uCD9C\uB825 (\uC911\uBCF5 \uC81C\uAC70)\n if (allDiagnostics.length > 0) {\n const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);\n const message = ts.formatDiagnosticsWithColorAndContext(uniqueDiagnostics, formatHost);\n process.stdout.write(message);\n }\n\n // \uACB0\uACFC \uB85C\uADF8 \uCD9C\uB825\n if (state.hasError) {\n logger.error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n process.exitCode = 1;\n } else {\n logger.info(\"\uBE4C\uB4DC \uC644\uB8CC\");\n }\n}\n\n//#endregion\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from \"path\";\nimport ts from \"typescript\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { Worker, type WorkerProxy, fsRm } from \"@simplysm/core-node\";\nimport \"@simplysm/core-common\";\nimport { consola, LogLevels } from \"consola\";\nimport type { SdConfig, SdBuildPackageConfig, SdClientPackageConfig, SdServerPackageConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { getVersion } from \"../utils/build-env\";\nimport { setupReplaceDeps } from \"../utils/replace-deps\";\nimport type { TypecheckEnv } from \"../utils/tsconfig\";\nimport { deserializeDiagnostic } from \"../utils/typecheck-serialization\";\nimport { runLint, type LintOptions } from \"./lint\";\nimport type * as LibraryWorkerModule from \"../workers/library.worker\";\nimport type * as ServerWorkerModule from \"../workers/server.worker\";\nimport type * as ClientWorkerModule from \"../workers/client.worker\";\nimport type * as DtsWorkerModule from \"../workers/dts.worker\";\nimport { Capacitor } from \"../capacitor/capacitor\";\nimport { Electron } from \"../electron/electron\";\nimport { copySrcFiles } from \"../utils/copy-src\";\n\n//#region Types\n\n/**\n * Build \uBA85\uB839 \uC635\uC158\n */\nexport interface BuildOptions {\n /** \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uACB0\uACFC\n */\ninterface BuildResult {\n name: string;\n target: string;\n type: \"js\" | \"dts\" | \"vite\" | \"capacitor\" | \"electron\";\n success: boolean;\n errors?: string[];\n diagnostics?: ts.Diagnostic[];\n}\n\n/**\n * \uD328\uD0A4\uC9C0 \uBD84\uB958 \uACB0\uACFC\n */\ninterface ClassifiedPackages {\n /** node/browser/neutral \uD0C0\uAC9F (JS + dts) */\n buildPackages: Array<{ name: string; config: SdBuildPackageConfig }>;\n /** client \uD0C0\uAC9F (Vite build + typecheck) */\n clientPackages: Array<{ name: string; config: SdClientPackageConfig }>;\n /** server \uD0C0\uAC9F (JS \uBE4C\uB4DC, dts \uC81C\uC678) */\n serverPackages: Array<{ name: string; config: SdServerPackageConfig }>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD328\uD0A4\uC9C0\uB97C \uD0C0\uAC9F\uBCC4\uB85C \uBD84\uB958\n * - node/browser/neutral: buildPackages (JS + dts)\n * - client: clientPackages (Vite build + typecheck)\n * - server: serverPackages (JS \uBE4C\uB4DC, dts \uC81C\uC678)\n * - scripts: \uC81C\uC678\n */\nfunction classifyPackages(\n packages: Record<\n string,\n SdBuildPackageConfig | SdClientPackageConfig | SdServerPackageConfig | { target: \"scripts\" } | undefined\n >,\n targets: string[],\n): ClassifiedPackages {\n const buildPackages: ClassifiedPackages[\"buildPackages\"] = [];\n const clientPackages: ClassifiedPackages[\"clientPackages\"] = [];\n const serverPackages: ClassifiedPackages[\"serverPackages\"] = [];\n\n for (const [name, config] of Object.entries(packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n if (config.target === \"client\") {\n clientPackages.push({ name, config });\n } else if (config.target === \"server\") {\n serverPackages.push({ name, config });\n } else {\n buildPackages.push({ name, config });\n }\n }\n\n return { buildPackages, clientPackages, serverPackages };\n}\n\n/**\n * dist \uD3F4\uB354 \uC0AD\uC81C\n */\nasync function cleanDistFolders(cwd: string, packageNames: string[]): Promise<void> {\n await Promise.all(packageNames.map((name) => fsRm(path.join(cwd, \"packages\", name, \"dist\"))));\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\n *\n * - `sd.config.ts`\uB97C \uB85C\uB4DC\uD558\uC5EC \uD328\uD0A4\uC9C0\uBCC4 \uBE4C\uB4DC \uD0C0\uAC9F \uC815\uBCF4 \uD655\uC778 (\uD544\uC218)\n * - lint \uC2E4\uD589\n * - dist \uD3F4\uB354 \uC815\uB9AC (clean build)\n * - `node`/`browser`/`neutral` \uD0C0\uAC9F: esbuild JS \uBE4C\uB4DC + dts \uC0DD\uC131 (\uD0C0\uC785\uCCB4\uD06C \uD3EC\uD568)\n * - `client` \uD0C0\uAC9F: Vite production \uBE4C\uB4DC + typecheck (dts \uBD88\uD544\uC694)\n * - \uD558\uB098\uB77C\uB3C4 \uC2E4\uD328\uD558\uBA74 `process.exitCode = 1` \uC124\uC815\n *\n * @param options - build \uC2E4\uD589 \uC635\uC158\n * @returns \uC644\uB8CC \uC2DC resolve\n */\nexport async function runBuild(options: BuildOptions): Promise<void> {\n const { targets } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:build\");\n\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791\", { targets });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // replaceDeps \uC124\uC815\uC774 \uC788\uC73C\uBA74 symlink \uAD50\uCCB4\n if (sdConfig.replaceDeps != null) {\n await setupReplaceDeps(cwd, sdConfig.replaceDeps);\n }\n\n // VER, DEV \uD658\uACBD\uBCC0\uC218 \uC900\uBE44\n const version = await getVersion(cwd);\n const baseEnv = { VER: version, DEV: \"false\" };\n\n // \uD328\uD0A4\uC9C0 \uBD84\uB958\n const { buildPackages, clientPackages, serverPackages } = classifyPackages(sdConfig.packages, targets);\n const allPackageNames = [\n ...buildPackages.map((p) => p.name),\n ...clientPackages.map((p) => p.name),\n ...serverPackages.map((p) => p.name),\n ];\n\n if (allPackageNames.length === 0) {\n process.stdout.write(\"\u2714 \uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\"\uD328\uD0A4\uC9C0 \uBD84\uB958 \uC644\uB8CC\", {\n buildPackages: buildPackages.map((p) => p.name),\n clientPackages: clientPackages.map((p) => p.name),\n serverPackages: serverPackages.map((p) => p.name),\n });\n\n // \uACB0\uACFC \uC218\uC9D1\n const results: BuildResult[] = [];\n // \uC5D0\uB7EC \uCD94\uC801 (\uAC1D\uCCB4\uB85C \uB798\uD551\uD558\uC5EC \uCF5C\uBC31 \uB0B4 \uC218\uC815 \uCD94\uC801 \uAC00\uB2A5\uD558\uAC8C \uD568)\n const state = { hasError: false };\n\n // Worker \uACBD\uB85C\n const libraryWorkerPath = import.meta.resolve(\"../workers/library.worker\");\n const serverWorkerPath = import.meta.resolve(\"../workers/server.worker\");\n const clientWorkerPath = import.meta.resolve(\"../workers/client.worker\");\n const dtsWorkerPath = import.meta.resolve(\"../workers/dts.worker\");\n\n // \uD30C\uC77C \uCE90\uC2DC (diagnostics \uCD9C\uB825\uC6A9)\n const fileCache = new Map<string, string>();\n\n // formatHost (diagnostics \uCD9C\uB825\uC6A9)\n const formatHost: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (f) => f,\n getCurrentDirectory: () => cwd,\n getNewLine: () => ts.sys.newLine,\n };\n\n // Lint \uC635\uC158 (\uC804\uCCB4 \uD328\uD0A4\uC9C0 \uB300\uC0C1)\n const lintOptions: LintOptions = {\n targets: allPackageNames.map((name) => `packages/${name}`),\n fix: false,\n timing: false,\n };\n\n // Listr \uAD6C\uC870: Lint \u2192 Clean \u2192 Build (\uC21C\uCC28)\n const mainListr = new Listr(\n [\n {\n title: \"Lint\",\n task: async () => {\n await runLint(lintOptions);\n // lint \uC5D0\uB7EC\uAC00 \uC788\uC73C\uBA74 process.exitCode\uAC00 1\uB85C \uC124\uC815\uB428\n if (process.exitCode === 1) {\n state.hasError = true;\n }\n },\n },\n {\n title: \"Clean\",\n task: async () => {\n await cleanDistFolders(cwd, allPackageNames);\n },\n },\n {\n title: \"Build\",\n task: (_, task) => {\n const buildTasks: ListrTask[] = [];\n\n // buildPackages: JS \uBE4C\uB4DC + dts \uC0DD\uC131\n for (const { name, config } of buildPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n const env: TypecheckEnv = config.target === \"node\" ? \"node\" : \"browser\";\n\n buildTasks.push({\n title: `${name} (${config.target})`,\n task: async () => {\n // JS \uBE4C\uB4DC\uC640 DTS \uC0DD\uC131\uC744 \uBCD1\uB82C \uC2E4\uD589\n const libraryWorker: WorkerProxy<typeof LibraryWorkerModule> =\n Worker.create<typeof LibraryWorkerModule>(libraryWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const [buildResult, dtsResult] = await Promise.all([\n // JS \uBE4C\uB4DC\n libraryWorker.build({ name, config, cwd, pkgDir }),\n // DTS \uC0DD\uC131\n dtsWorker.buildDts({ name, cwd, pkgDir, env, emit: true }),\n ]);\n\n // JS \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: config.target,\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n\n // DTS \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: config.target,\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([libraryWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // copySrc \uD30C\uC77C \uBCF5\uC0AC\n if (config.copySrc != null && config.copySrc.length > 0) {\n await copySrcFiles(pkgDir, config.copySrc);\n }\n },\n });\n }\n\n // clientPackages: Vite \uBE4C\uB4DC + typecheck + Capacitor \uBE4C\uB4DC\n for (const { name, config } of clientPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (client)`,\n task: async () => {\n // Vite \uBE4C\uB4DC\uC640 \uD0C0\uC785\uCCB4\uD06C\uB97C \uBCD1\uB82C \uC2E4\uD589\n const clientWorker: WorkerProxy<typeof ClientWorkerModule> =\n Worker.create<typeof ClientWorkerModule>(clientWorkerPath);\n const dtsWorker: WorkerProxy<typeof DtsWorkerModule> =\n Worker.create<typeof DtsWorkerModule>(dtsWorkerPath);\n\n try {\n const clientConfig: SdClientPackageConfig = {\n ...config,\n env: { ...baseEnv, ...config.env },\n };\n const [clientResult, dtsResult] = await Promise.all([\n // Vite production \uBE4C\uB4DC\n clientWorker.build({ name, config: clientConfig, cwd, pkgDir }),\n // typecheck (dts \uC5C6\uC774)\n dtsWorker.buildDts({\n name,\n cwd,\n pkgDir,\n env: \"browser\",\n emit: false,\n }),\n ]);\n\n // Vite \uBE4C\uB4DC \uACB0\uACFC \uCC98\uB9AC\n results.push({\n name,\n target: \"client\",\n type: \"vite\",\n success: clientResult.success,\n errors: clientResult.errors,\n });\n if (!clientResult.success) state.hasError = true;\n\n // \uD0C0\uC785\uCCB4\uD06C \uACB0\uACFC \uCC98\uB9AC\n const diagnostics = dtsResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));\n results.push({\n name,\n target: \"client\",\n type: \"dts\",\n success: dtsResult.success,\n errors: dtsResult.errors,\n diagnostics,\n });\n if (!dtsResult.success) state.hasError = true;\n } finally {\n await Promise.all([clientWorker.terminate(), dtsWorker.terminate()]);\n }\n\n // Capacitor \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.capacitor != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const cap = await Capacitor.create(pkgDir, config.capacitor);\n await cap.initialize();\n await cap.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"capacitor\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n\n // Electron \uBE4C\uB4DC (\uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0\uB9CC)\n if (config.electron != null) {\n const outPath = path.join(pkgDir, \"dist\");\n try {\n const electron = await Electron.create(pkgDir, config.electron);\n await electron.initialize();\n await electron.build(outPath);\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: true,\n });\n } catch (err) {\n results.push({\n name,\n target: \"client\",\n type: \"electron\",\n success: false,\n errors: [err instanceof Error ? err.message : String(err)],\n });\n state.hasError = true;\n }\n }\n },\n });\n }\n\n // serverPackages: JS \uBE4C\uB4DC\uB9CC (dts \uC0DD\uC131 \uC81C\uC678)\n for (const { name, config } of serverPackages) {\n const pkgDir = path.join(cwd, \"packages\", name);\n\n buildTasks.push({\n title: `${name} (server)`,\n task: async () => {\n const serverWorker: WorkerProxy<typeof ServerWorkerModule> =\n Worker.create<typeof ServerWorkerModule>(serverWorkerPath);\n\n try {\n const buildResult = await serverWorker.build({\n name,\n cwd,\n pkgDir,\n env: { ...baseEnv, ...config.env },\n configs: config.configs,\n externals: config.externals,\n pm2: config.pm2,\n packageManager: config.packageManager,\n });\n\n results.push({\n name,\n target: \"server\",\n type: \"js\",\n success: buildResult.success,\n errors: buildResult.errors,\n });\n if (!buildResult.success) state.hasError = true;\n } finally {\n await serverWorker.terminate();\n }\n },\n });\n }\n\n return task.newListr(buildTasks, { concurrent: true, exitOnError: false });\n },\n },\n ],\n {\n concurrent: false,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n try {\n await mainListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 results\uC5D0 \uC774\uBBF8 \uC218\uC9D1\uB428\n }\n\n // \uACB0\uACFC \uCD9C\uB825\n const allDiagnostics: ts.Diagnostic[] = [];\n for (const result of results) {\n if (!result.success) {\n const typeLabel = result.type === \"dts\" ? \"dts\" : result.target;\n const errorLines: string[] = [`${result.name} (${typeLabel})`];\n if (result.errors != null) {\n for (const error of result.errors) {\n for (const line of error.split(\"\\n\")) {\n errorLines.push(` \u2192 ${line}`);\n }\n }\n }\n consola.error(errorLines.join(\"\\n\"));\n }\n if (result.diagnostics != null) {\n allDiagnostics.push(...result.diagnostics);\n }\n }\n\n // diagnostics \uCD9C\uB825 (\uC911\uBCF5 \uC81C\uAC70)\n if (allDiagnostics.length > 0) {\n const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);\n const message = ts.formatDiagnosticsWithColorAndContext(uniqueDiagnostics, formatHost);\n process.stdout.write(message);\n }\n\n // \uACB0\uACFC \uB85C\uADF8 \uCD9C\uB825\n if (state.hasError) {\n logger.error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n process.exitCode = 1;\n } else {\n logger.info(\"\uBE4C\uB4DC \uC644\uB8CC\");\n }\n}\n\n//#endregion\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAOA,OAAO,uBAAuB,CAAC;AAc/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAsaD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoWvE"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAOA,OAAO,uBAAuB,CAAC;AAc/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAsaD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA+WvE"}
@@ -199,7 +199,7 @@ async function publishPackage(pkgPath, publishConfig, version, projectPath, logg
199
199
  const pkgName = path.basename(pkgPath);
200
200
  if (publishConfig === "npm") {
201
201
  const prereleaseInfo = semver.prerelease(version);
202
- const args = ["publish", "--access", "public"];
202
+ const args = ["publish", "--access", "public", "--no-git-checks"];
203
203
  if (prereleaseInfo !== null && typeof prereleaseInfo[0] === "string") {
204
204
  args.push("--tag", prereleaseInfo[0]);
205
205
  }
@@ -376,13 +376,23 @@ async function runPublish(options) {
376
376
  if (!noBuild && hasGit) {
377
377
  logger.debug("Git \uCEE4\uBC0B \uC5EC\uBD80 \uD655\uC778...");
378
378
  try {
379
- const diff = await spawn("git", ["diff", "--name-only", "--", "packages/"]);
380
- if (diff.trim() !== "") {
381
- throw new Error("\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4.\n" + diff);
382
- }
383
- const stagedDiff = await spawn("git", ["diff", "--cached", "--name-only", "--", "packages/"]);
384
- if (stagedDiff.trim() !== "") {
385
- throw new Error("staged\uB41C \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 \uCEE4\uBC0B\uD558\uAC70\uB098 unstage\uD558\uC138\uC694.\n" + stagedDiff);
379
+ const diff = await spawn("git", ["diff", "--name-only"]);
380
+ const stagedDiff = await spawn("git", ["diff", "--cached", "--name-only"]);
381
+ if (diff.trim() !== "" || stagedDiff.trim() !== "") {
382
+ logger.info("\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D \uAC10\uC9C0. claude \uC790\uB3D9 \uCEE4\uBC0B \uC2DC\uB3C4...");
383
+ try {
384
+ await spawn("claude", ["-p", "/sd-commit all", "--dangerously-skip-permissions", "--model", "haiku"]);
385
+ } catch (e) {
386
+ throw new Error(
387
+ "\uC790\uB3D9 \uCEE4\uBC0B\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCEE4\uBC0B \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.\n" + (e instanceof Error ? e.message : String(e))
388
+ );
389
+ }
390
+ const recheckDiff = await spawn("git", ["diff", "--name-only"]);
391
+ const recheckStaged = await spawn("git", ["diff", "--cached", "--name-only"]);
392
+ if (recheckDiff.trim() !== "" || recheckStaged.trim() !== "") {
393
+ throw new Error("\uC790\uB3D9 \uCEE4\uBC0B \uD6C4\uC5D0\uB3C4 \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D\uC774 \uB0A8\uC544\uC788\uC2B5\uB2C8\uB2E4.\n" + recheckDiff + recheckStaged);
394
+ }
395
+ logger.info("\uC790\uB3D9 \uCEE4\uBC0B \uC644\uB8CC.");
386
396
  }
387
397
  } catch (err) {
388
398
  consola.error(err instanceof Error ? err.message : err);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/publish.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport semver from \"semver\";\nimport { consola, LogLevels } from \"consola\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { StorageFactory } from \"@simplysm/storage\";\nimport { fsExists, fsRead, fsReadJson, fsWrite, fsGlob, fsCopy } from \"@simplysm/core-node\";\nimport { env, jsonStringify } from \"@simplysm/core-common\";\nimport \"@simplysm/core-common\";\nimport type { SdConfig, SdPublishConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { spawn } from \"../utils/spawn\";\nimport { runBuild } from \"./build\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport ssh2 from \"ssh2\";\nimport { password as passwordPrompt } from \"@inquirer/prompts\";\n\nconst { Client: SshClient, utils } = ssh2;\n\n//#region Types\n\n/**\n * Publish \uBA85\uB839 \uC635\uC158\n */\nexport interface PublishOptions {\n /** \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 publish \uC124\uC815\uC774 \uC788\uB294 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** \uBE4C\uB4DC \uC5C6\uC774 \uBC30\uD3EC (\uC704\uD5D8) */\n noBuild: boolean;\n /** \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158 */\n dryRun: boolean;\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * package.json \uD0C0\uC785 (\uD544\uC694\uD55C \uD544\uB4DC\uB9CC)\n */\ninterface PackageJson {\n name: string;\n version: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD658\uACBD\uBCC0\uC218 \uCE58\uD658 (%VAR% \uD615\uC2DD)\n * @throws \uCE58\uD658 \uACB0\uACFC\uAC00 \uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uC5D0\uB7EC\n */\nfunction replaceEnvVariables(str: string, version: string, projectPath: string): string {\n const result = str.replace(/%([^%]+)%/g, (match, envName: string) => {\n if (envName === \"VER\") {\n return version;\n }\n if (envName === \"PROJECT\") {\n return projectPath;\n }\n return (env[envName] as string | undefined) ?? match;\n });\n\n // \uCE58\uD658\uB418\uC9C0 \uC54A\uC740 \uD658\uACBD\uBCC0\uC218\uAC00 \uB0A8\uC544\uC788\uC73C\uBA74 \uC5D0\uB7EC\n if (/%[^%]+%/.test(result)) {\n throw new Error(`\uD658\uACBD\uBCC0\uC218 \uCE58\uD658 \uC2E4\uD328: ${str} \u2192 ${result}`);\n }\n\n return result;\n}\n\n/**\n * \uCE74\uC6B4\uD2B8\uB2E4\uC6B4 \uB300\uAE30\n */\nasync function waitWithCountdown(message: string, seconds: number): Promise<void> {\n for (let i = seconds; i > 0; i--) {\n if (i !== seconds && process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n }\n process.stdout.write(`${message} ${i}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n if (process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n process.stdout.clearLine(0);\n } else {\n process.stdout.write(\"\\n\");\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uC0AC\uC804 \uD655\uC778 \uBC0F \uC124\uC815\n *\n * pass\uAC00 \uC5C6\uB294 SFTP \uC11C\uBC84\uC5D0 \uB300\uD574:\n * 1. SSH \uD0A4 \uD30C\uC77C\uC774 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n * 2. \uD0A4 \uC778\uC99D\uC744 \uD14C\uC2A4\uD2B8\uD558\uACE0, \uC2E4\uD328\uD558\uBA74 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n */\nasync function ensureSshAuth(\n publishPackages: Array<{ name: string; config: SdPublishConfig }>,\n logger: ReturnType<typeof consola.withTag>,\n): Promise<void> {\n // pass \uC5C6\uB294 SFTP \uC11C\uBC84 \uC218\uC9D1 (user@host \uC911\uBCF5 \uC81C\uAC70)\n const sshTargets = new Map<string, { host: string; port?: number; user: string }>();\n for (const pkg of publishPackages) {\n if (pkg.config === \"npm\") continue;\n if (pkg.config.type !== \"sftp\") continue;\n if (pkg.config.pass != null) continue;\n if (pkg.config.user == null) {\n throw new Error(`[${pkg.name}] SFTP \uC124\uC815\uC5D0 user\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n const key = `${pkg.config.user}@${pkg.config.host}`;\n sshTargets.set(key, {\n host: pkg.config.host,\n port: pkg.config.port,\n user: pkg.config.user,\n });\n }\n\n if (sshTargets.size === 0) return;\n\n // SSH \uD0A4 \uD30C\uC77C \uD655\uC778/\uC0DD\uC131\n const sshDir = path.join(os.homedir(), \".ssh\");\n const keyPath = path.join(sshDir, \"id_ed25519\");\n const pubKeyPath = path.join(sshDir, \"id_ed25519.pub\");\n\n if (!fs.existsSync(keyPath)) {\n logger.info(\"SSH \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC0DD\uC131\uD569\uB2C8\uB2E4...\");\n\n if (!fs.existsSync(sshDir)) {\n fs.mkdirSync(sshDir, { mode: 0o700 });\n }\n\n const keyPair = utils.generateKeyPairSync(\"ed25519\");\n fs.writeFileSync(keyPath, keyPair.private, { mode: 0o600 });\n fs.writeFileSync(pubKeyPath, keyPair.public + \"\\n\", { mode: 0o644 });\n\n logger.info(`SSH \uD0A4 \uC0DD\uC131 \uC644\uB8CC: ${keyPath}`);\n }\n\n const privateKeyData = fs.readFileSync(keyPath);\n const publicKey = fs.readFileSync(pubKeyPath, \"utf-8\").trim();\n\n // privateKey\uAC00 \uC554\uD638\uD654\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\n const parsed = utils.parseKey(privateKeyData);\n const isKeyEncrypted = parsed instanceof Error;\n const sshAgent = process.env[\"SSH_AUTH_SOCK\"];\n\n // \uAC01 \uC11C\uBC84\uC5D0 \uB300\uD574 \uD0A4 \uC778\uC99D \uD655\uC778\n for (const [label, target] of sshTargets) {\n const canAuth = await testSshKeyAuth(target, {\n privateKey: isKeyEncrypted ? undefined : privateKeyData,\n agent: sshAgent,\n });\n if (canAuth) {\n logger.debug(`SSH \uD0A4 \uC778\uC99D \uD655\uC778: ${label}`);\n continue;\n }\n\n // \uD0A4 \uC778\uC99D \uC2E4\uD328 \u2192 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n logger.info(`${label}: SSH \uD0A4\uAC00 \uC11C\uBC84\uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`);\n const pass = await passwordPrompt({\n message: `${label} \uBE44\uBC00\uBC88\uD638 (\uACF5\uAC1C\uD0A4 \uB4F1\uB85D\uC6A9):`,\n });\n\n await registerSshPublicKey(target, pass, publicKey);\n logger.info(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC644\uB8CC: ${label}`);\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uD14C\uC2A4\uD2B8 (\uC811\uC18D \uD6C4 \uC989\uC2DC \uC885\uB8CC)\n */\nfunction testSshKeyAuth(\n target: { host: string; port?: number; user: string },\n auth: { privateKey?: Buffer; agent?: string },\n): Promise<boolean> {\n if (auth.privateKey == null && auth.agent == null) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n conn.end();\n resolve(true);\n });\n conn.on(\"error\", () => {\n resolve(false);\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n ...(auth.privateKey != null ? { privateKey: auth.privateKey } : {}),\n ...(auth.agent != null ? { agent: auth.agent } : {}),\n readyTimeout: 10_000,\n });\n });\n}\n\n/**\n * \uBE44\uBC00\uBC88\uD638\uB85C \uC11C\uBC84\uC5D0 \uC811\uC18D\uD558\uC5EC SSH \uACF5\uAC1C\uD0A4\uB97C \uB4F1\uB85D\n */\nfunction registerSshPublicKey(\n target: { host: string; port?: number; user: string },\n pass: string,\n publicKey: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n // authorized_keys\uC5D0 \uACF5\uAC1C\uD0A4 \uCD94\uAC00\n const cmd = [\n \"mkdir -p ~/.ssh\",\n \"chmod 700 ~/.ssh\",\n `echo '${publicKey}' >> ~/.ssh/authorized_keys`,\n \"chmod 600 ~/.ssh/authorized_keys\",\n ].join(\" && \");\n\n conn.exec(cmd, (err, stream) => {\n if (err) {\n conn.end();\n reject(new Error(`SSH \uBA85\uB839 \uC2E4\uD589 \uC2E4\uD328: ${err.message}`));\n return;\n }\n\n let stderr = \"\";\n stream.on(\"data\", () => {}); // stdout \uC18C\uBE44 (\uBBF8\uC18C\uBE44 \uC2DC stream \uBBF8\uC885\uB8CC)\n stream.stderr.on(\"data\", (data: Uint8Array) => {\n stderr += data.toString();\n });\n stream.on(\"exit\", (code: number | null) => {\n conn.end();\n if (code !== 0) {\n reject(new Error(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC2E4\uD328 (exit code: ${code}): ${stderr}`));\n } else {\n resolve();\n }\n });\n });\n });\n conn.on(\"error\", (err) => {\n reject(new Error(`SSH \uC811\uC18D \uC2E4\uD328 (${target.host}): ${err.message}`));\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n password: pass,\n readyTimeout: 10_000,\n });\n });\n}\n\n//#endregion\n\n//#region Version Upgrade\n\n/**\n * \uD504\uB85C\uC81D\uD2B8 \uBC0F \uD328\uD0A4\uC9C0 \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n * @param dryRun true\uBA74 \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uACC4\uC0B0\n */\nasync function upgradeVersion(\n cwd: string,\n allPkgPaths: string[],\n dryRun: boolean,\n): Promise<{ version: string; changedFiles: string[] }> {\n const changedFiles: string[] = [];\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n const currentVersion = projPkg.version;\n const prereleaseInfo = semver.prerelease(currentVersion);\n\n // prerelease \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC99D\uAC00 \uBC29\uC2DD \uACB0\uC815\n const newVersion =\n prereleaseInfo !== null ? semver.inc(currentVersion, \"prerelease\")! : semver.inc(currentVersion, \"patch\")!;\n\n if (dryRun) {\n // dry-run: \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uBC18\uD658\n return { version: newVersion, changedFiles: [] };\n }\n\n projPkg.version = newVersion;\n await fsWrite(projPkgPath, jsonStringify(projPkg, { space: 2 }) + \"\\n\");\n changedFiles.push(projPkgPath);\n\n // \uAC01 \uD328\uD0A4\uC9C0 package.json \uBC84\uC804 \uC124\uC815\n for (const pkgPath of allPkgPaths) {\n const pkgJsonPath = path.resolve(pkgPath, \"package.json\");\n const pkgJson = await fsReadJson<PackageJson>(pkgJsonPath);\n pkgJson.version = newVersion;\n await fsWrite(pkgJsonPath, jsonStringify(pkgJson, { space: 2 }) + \"\\n\");\n changedFiles.push(pkgJsonPath);\n }\n\n // \uD15C\uD50C\uB9BF \uD30C\uC77C\uC758 @simplysm \uD328\uD0A4\uC9C0 \uBC84\uC804 \uB3D9\uAE30\uD654\n const templateFiles = await fsGlob(path.resolve(cwd, \"packages/sd-cli/templates/**/*.hbs\"));\n const versionRegex = /(\"@simplysm\\/[^\"]+\"\\s*:\\s*)\"~[^\"]+\"/g;\n\n for (const templatePath of templateFiles) {\n const content = await fsRead(templatePath);\n const newContent = content.replace(versionRegex, `$1\"~${newVersion}\"`);\n\n if (content !== newContent) {\n await fsWrite(templatePath, newContent);\n changedFiles.push(templatePath);\n }\n }\n\n return { version: newVersion, changedFiles };\n}\n\n//#endregion\n\n//#region Package Publishing\n\n/**\n * \uAC1C\uBCC4 \uD328\uD0A4\uC9C0 \uBC30\uD3EC\n * @param dryRun true\uBA74 \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158\n */\nasync function publishPackage(\n pkgPath: string,\n publishConfig: SdPublishConfig,\n version: string,\n projectPath: string,\n logger: ReturnType<typeof consola.withTag>,\n dryRun: boolean,\n): Promise<void> {\n const pkgName = path.basename(pkgPath);\n\n if (publishConfig === \"npm\") {\n // npm publish\n const prereleaseInfo = semver.prerelease(version);\n const args = [\"publish\", \"--access\", \"public\"];\n\n if (prereleaseInfo !== null && typeof prereleaseInfo[0] === \"string\") {\n args.push(\"--tag\", prereleaseInfo[0]);\n }\n\n if (dryRun) {\n args.push(\"--dry-run\");\n logger.info(`[DRY-RUN] [${pkgName}] pnpm ${args.join(\" \")}`);\n } else {\n logger.debug(`[${pkgName}] pnpm ${args.join(\" \")}`);\n }\n\n await spawn(\"pnpm\", args, { cwd: pkgPath });\n } else if (publishConfig.type === \"local-directory\") {\n // \uB85C\uCEEC \uB514\uB809\uD1A0\uB9AC \uBCF5\uC0AC\n const targetPath = replaceEnvVariables(publishConfig.path, version, projectPath);\n const distPath = path.resolve(pkgPath, \"dist\");\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n } else {\n logger.debug(`[${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n await fsCopy(distPath, targetPath);\n }\n } else {\n // \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC\n const distPath = path.resolve(pkgPath, \"dist\");\n const remotePath = publishConfig.path ?? \"/\";\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n } else {\n logger.debug(`[${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n await StorageFactory.connect(\n publishConfig.type,\n {\n host: publishConfig.host,\n port: publishConfig.port,\n user: publishConfig.user,\n pass: publishConfig.pass,\n },\n async (storage) => {\n await storage.uploadDir(distPath, remotePath);\n },\n );\n }\n }\n}\n\n//#endregion\n\n//#region Dependency Levels\n\n/**\n * \uBC30\uD3EC \uD328\uD0A4\uC9C0\uC758 \uC758\uC874\uC131 \uB808\uBCA8\uC744 \uACC4\uC0B0\uD55C\uB2E4.\n * \uC758\uC874\uC131\uC774 \uC5C6\uB294 \uD328\uD0A4\uC9C0 \u2192 Level 0, Level 0\uC5D0\uB9CC \uC758\uC874 \u2192 Level 1, ...\n */\nasync function computePublishLevels(\n publishPkgs: Array<{ name: string; path: string; config: SdPublishConfig }>,\n): Promise<Array<Array<{ name: string; path: string; config: SdPublishConfig }>>> {\n const pkgNames = new Set(publishPkgs.map((p) => p.name));\n\n // \uAC01 \uD328\uD0A4\uC9C0\uC758 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uB0B4 \uC758\uC874\uC131 \uC218\uC9D1\n const depsMap = new Map<string, Set<string>>();\n for (const pkg of publishPkgs) {\n const pkgJson = await fsReadJson<PackageJson>(path.resolve(pkg.path, \"package.json\"));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.peerDependencies,\n ...pkgJson.optionalDependencies,\n };\n\n const workspaceDeps = new Set<string>();\n for (const depName of Object.keys(allDeps)) {\n const shortName = depName.replace(/^@simplysm\\//, \"\");\n if (shortName !== depName && pkgNames.has(shortName)) {\n workspaceDeps.add(shortName);\n }\n }\n depsMap.set(pkg.name, workspaceDeps);\n }\n\n // \uC704\uC0C1 \uC815\uB82C\uB85C \uB808\uBCA8 \uBD84\uB958\n const levels: Array<Array<{ name: string; path: string; config: SdPublishConfig }>> = [];\n const assigned = new Set<string>();\n const remaining = new Map(publishPkgs.map((p) => [p.name, p]));\n\n while (remaining.size > 0) {\n const level: Array<{ name: string; path: string; config: SdPublishConfig }> = [];\n for (const [name, pkg] of remaining) {\n const deps = depsMap.get(name)!;\n if ([...deps].every((d) => assigned.has(d))) {\n level.push(pkg);\n }\n }\n\n if (level.length === 0) {\n // \uC21C\uD658 \uC758\uC874\uC131 \u2014 \uB0A8\uC740 \uD328\uD0A4\uC9C0\uB97C \uBAA8\uB450 \uB9C8\uC9C0\uB9C9 \uB808\uBCA8\uC5D0 \uBC30\uCE58\n levels.push([...remaining.values()]);\n break;\n }\n\n for (const pkg of level) {\n assigned.add(pkg.name);\n remaining.delete(pkg.name);\n }\n levels.push(level);\n }\n\n return levels;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * publish \uBA85\uB839\uC744 \uC2E4\uD589\uD55C\uB2E4.\n *\n * **\uBC30\uD3EC \uC21C\uC11C (\uC548\uC804\uC131 \uC6B0\uC120):**\n * 1. \uC0AC\uC804 \uAC80\uC99D (npm \uC778\uC99D, Git \uC0C1\uD0DC)\n * 2. \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC (package.json + \uD15C\uD50C\uB9BF)\n * 3. \uBE4C\uB4DC\n * 4. Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC (\uBCC0\uACBD\uB41C \uD30C\uC77C\uB9CC \uBA85\uC2DC\uC801\uC73C\uB85C staging)\n * 5. pnpm \uBC30\uD3EC\n * 6. postPublish (\uC2E4\uD328\uD574\uB3C4 \uACC4\uC18D)\n */\nexport async function runPublish(options: PublishOptions): Promise<void> {\n const { targets, noBuild, dryRun } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:publish\");\n\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uBAA8\uB4DC - \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC74C\");\n }\n\n logger.debug(\"\uBC30\uD3EC \uC2DC\uC791\", { targets, noBuild, dryRun });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // package.json \uB85C\uB4DC\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n // pnpm-workspace.yaml\uC5D0\uC11C \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uD328\uD0A4\uC9C0 \uACBD\uB85C \uC218\uC9D1\n const workspaceYamlPath = path.resolve(cwd, \"pnpm-workspace.yaml\");\n const workspaceGlobs: string[] = [];\n if (await fsExists(workspaceYamlPath)) {\n const yamlContent = await fsRead(workspaceYamlPath);\n let inPackages = false;\n for (const line of yamlContent.split(\"\\n\")) {\n if (/^packages:\\s*$/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = /^\\s+-\\s+(.+)$/.exec(line);\n if (match != null) {\n workspaceGlobs.push(match[1].trim());\n } else {\n break;\n }\n }\n }\n }\n\n const allPkgPaths = (await Promise.all(workspaceGlobs.map((item) => fsGlob(path.resolve(cwd, item)))))\n .flat()\n .filter((item) => !item.includes(\".\"));\n\n // publish \uC124\uC815\uC774 \uC788\uB294 \uD328\uD0A4\uC9C0 \uD544\uD130\uB9C1\n const publishPackages: Array<{\n name: string;\n path: string;\n config: SdPublishConfig;\n }> = [];\n\n for (const [name, config] of Object.entries(sdConfig.packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n const pkgConfig = config;\n if (pkgConfig.publish == null) continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n const pkgPath = allPkgPaths.find((p) => path.basename(p) === name);\n if (pkgPath == null) {\n logger.warn(`\uD328\uD0A4\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${name}`);\n continue;\n }\n\n publishPackages.push({\n name,\n path: pkgPath,\n config: pkgConfig.publish,\n });\n }\n\n if (publishPackages.length === 0) {\n process.stdout.write(\"\u2714 \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\n \"\uBC30\uD3EC \uB300\uC0C1 \uD328\uD0A4\uC9C0\",\n publishPackages.map((p) => p.name),\n );\n\n // Git \uC0AC\uC6A9 \uC5EC\uBD80 \uD655\uC778\n const hasGit = await fsExists(path.resolve(cwd, \".git\"));\n\n //#region Phase 1: \uC0AC\uC804 \uAC80\uC99D\n\n // npm \uC778\uC99D \uD655\uC778 (npm publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n if (publishPackages.some((p) => p.config === \"npm\")) {\n logger.debug(\"npm \uC778\uC99D \uD655\uC778...\");\n try {\n const whoami = await spawn(\"npm\", [\"whoami\"]);\n if (whoami.trim() === \"\") {\n throw new Error(\"npm \uB85C\uADF8\uC778 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n logger.debug(`npm \uB85C\uADF8\uC778 \uD655\uC778: ${whoami.trim()}`);\n } catch {\n consola.error(\n \"npm \uD1A0\uD070\uC774 \uC720\uD6A8\uD558\uC9C0 \uC54A\uAC70\uB098 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\\n\" +\n \"https://www.npmjs.com/settings/~/tokens \uC5D0\uC11C Granular Access Token \uC0DD\uC131 \uD6C4:\\n\" +\n \" npm config set //registry.npmjs.org/:_authToken <\uD1A0\uD070>\",\n );\n process.exitCode = 1;\n return;\n }\n }\n\n // SSH \uD0A4 \uC778\uC99D \uD655\uC778 (pass \uC5C6\uB294 SFTP publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n try {\n await ensureSshAuth(publishPackages, logger);\n } catch (err) {\n consola.error(`SSH \uC778\uC99D \uC124\uC815 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // Git \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 (noBuild\uAC00 \uC544\uB2CC \uACBD\uC6B0)\n if (!noBuild && hasGit) {\n logger.debug(\"Git \uCEE4\uBC0B \uC5EC\uBD80 \uD655\uC778...\");\n try {\n // unstaged \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 (packages/ \uD3F4\uB354\uB9CC)\n const diff = await spawn(\"git\", [\"diff\", \"--name-only\", \"--\", \"packages/\"]);\n if (diff.trim() !== \"\") {\n throw new Error(\"\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4.\\n\" + diff);\n }\n\n // staged \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 (packages/ \uD3F4\uB354\uB9CC)\n const stagedDiff = await spawn(\"git\", [\"diff\", \"--cached\", \"--name-only\", \"--\", \"packages/\"]);\n if (stagedDiff.trim() !== \"\") {\n throw new Error(\"staged\uB41C \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 \uCEE4\uBC0B\uD558\uAC70\uB098 unstage\uD558\uC138\uC694.\\n\" + stagedDiff);\n }\n } catch (err) {\n consola.error(err instanceof Error ? err.message : err);\n process.exitCode = 1;\n return;\n }\n }\n\n //#endregion\n\n //#region Phase 2 & 3: \uBE4C\uB4DC \uB610\uB294 noBuild \uACBD\uACE0\n\n let version = projPkg.version;\n\n if (noBuild) {\n // noBuild \uACBD\uACE0\n logger.warn(\"\uBE4C\uB4DC\uD558\uC9C0 \uC54A\uACE0 \uBC30\uD3EC\uD558\uB294 \uAC83\uC740 \uC0C1\uB2F9\uD788 \uC704\uD5D8\uD569\uB2C8\uB2E4.\");\n await waitWithCountdown(\"\uD504\uB85C\uC138\uC2A4\uB97C \uC911\uC9C0\uD558\uB824\uBA74 'CTRL+C'\uB97C \uB204\uB974\uC138\uC694.\", 5);\n } else {\n // \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n logger.debug(\"\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC...\");\n const upgradeResult = await upgradeVersion(cwd, allPkgPaths, dryRun);\n version = upgradeResult.version;\n const _changedFiles = upgradeResult.changedFiles;\n if (dryRun) {\n logger.info(`[DRY-RUN] \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version} (\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C)`);\n } else {\n logger.info(`\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version}`);\n }\n\n // \uBE4C\uB4DC \uC2E4\uD589\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uBE4C\uB4DC \uC2DC\uC791 (\uAC80\uC99D\uC6A9)...\");\n } else {\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791...\");\n }\n\n try {\n await runBuild({\n targets: publishPackages.map((p) => p.name),\n options: options.options,\n });\n\n // \uBE4C\uB4DC \uC2E4\uD328 \uD655\uC778\n if (process.exitCode === 1) {\n throw new Error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n }\n } catch {\n if (dryRun) {\n logger.error(\"[DRY-RUN] \uBE4C\uB4DC \uC2E4\uD328\");\n } else {\n consola.error(\n \"\uBE4C\uB4DC \uC2E4\uD328. \uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n \" \uBC84\uC804 \uBCC0\uACBD\uC744 \uB418\uB3CC\uB9AC\uB824\uBA74:\\n\" +\n \" git checkout -- package.json packages/*/package.json packages/sd-cli/templates/\",\n );\n }\n process.exitCode = 1;\n return;\n }\n\n //#region Phase 3: Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC\n\n if (hasGit) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC \uC2DC\uBBAC\uB808\uC774\uC158...\");\n logger.info(`[DRY-RUN] git add (${_changedFiles.length}\uAC1C \uD30C\uC77C)`);\n logger.info(`[DRY-RUN] git commit -m \"v${version}\"`);\n logger.info(`[DRY-RUN] git tag -a v${version} -m \"v${version}\"`);\n logger.info(\"[DRY-RUN] git push --dry-run\");\n await spawn(\"git\", [\"push\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] git push --tags --dry-run\");\n await spawn(\"git\", [\"push\", \"--tags\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] Git \uC791\uC5C5 \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC\");\n } else {\n logger.debug(\"Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC...\");\n try {\n await spawn(\"git\", [\"add\", ..._changedFiles]);\n await spawn(\"git\", [\"commit\", \"-m\", `v${version}`]);\n await spawn(\"git\", [\"tag\", \"-a\", `v${version}`, \"-m\", `v${version}`]);\n await spawn(\"git\", [\"push\"]);\n await spawn(\"git\", [\"push\", \"--tags\"]);\n logger.debug(\"Git \uC791\uC5C5 \uC644\uB8CC\");\n } catch (err) {\n consola.error(\n `Git \uC791\uC5C5 \uC2E4\uD328: ${err instanceof Error ? err.message : err}\\n` +\n \"\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n ` git revert HEAD # \uBC84\uC804 \uCEE4\uBC0B \uB418\uB3CC\uB9AC\uAE30\\n` +\n ` git tag -d v${version} # \uD0DC\uADF8 \uC0AD\uC81C`,\n );\n process.exitCode = 1;\n return;\n }\n }\n }\n\n //#endregion\n }\n\n //#endregion\n\n //#region Phase 4: \uBC30\uD3EC (\uC758\uC874\uC131 \uB808\uBCA8\uBCC4 \uBCD1\uB82C, Listr)\n\n const levels = await computePublishLevels(publishPackages);\n const publishedPackages: string[] = [];\n let publishFailed = false;\n\n const publishListr = new Listr(\n levels.map(\n (levelPkgs, levelIdx): ListrTask => ({\n title: `Level ${levelIdx + 1}/${levels.length}`,\n skip: () => publishFailed,\n task: (_, task) =>\n task.newListr(\n levelPkgs.map(\n (pkg): ListrTask => ({\n title: dryRun ? `[DRY-RUN] ${pkg.name}` : pkg.name,\n task: async (_ctx, pkgTask) => {\n const maxRetries = 3;\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await publishPackage(pkg.path, pkg.config, version, cwd, logger, dryRun);\n break;\n } catch (err) {\n if (attempt < maxRetries) {\n const delay = attempt * 5_000;\n pkgTask.title = dryRun\n ? `[DRY-RUN] ${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`\n : `${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`;\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n throw err;\n }\n }\n }\n publishedPackages.push(pkg.name);\n },\n }),\n ),\n { concurrent: true, exitOnError: false },\n ),\n }),\n ),\n {\n concurrent: false,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n try {\n await publishListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 \uC544\uB798\uC5D0\uC11C \uCC98\uB9AC\n }\n\n // \uC2E4\uD328\uD55C \uD328\uD0A4\uC9C0 \uD655\uC778\n const allPkgNames = publishPackages.map((p) => p.name);\n const failedPkgNames = allPkgNames.filter((n) => !publishedPackages.includes(n));\n\n if (failedPkgNames.length > 0) {\n publishFailed = true;\n\n if (publishedPackages.length > 0) {\n consola.error(\n \"\uBC30\uD3EC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\\n\" +\n \"\uC774\uBBF8 \uBC30\uD3EC\uB41C \uD328\uD0A4\uC9C0:\\n\" +\n publishedPackages.map((n) => ` - ${n}`).join(\"\\n\") +\n \"\\n\\n\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\\n\" +\n \"npm \uD328\uD0A4\uC9C0\uB294 72\uC2DC\uAC04 \uB0B4\uC5D0 `npm unpublish <pkg>@<version>` \uC73C\uB85C \uC0AD\uC81C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\",\n );\n }\n\n for (const name of failedPkgNames) {\n consola.error(`[${name}] \uBC30\uD3EC \uC2E4\uD328`);\n }\n process.exitCode = 1;\n return;\n }\n\n //#endregion\n\n //#region Phase 5: postPublish\n\n if (sdConfig.postPublish != null && sdConfig.postPublish.length > 0) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2DC\uBBAC\uB808\uC774\uC158...\");\n } else {\n logger.debug(\"postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589...\");\n }\n\n for (const script of sdConfig.postPublish) {\n try {\n const cmd = replaceEnvVariables(script.cmd, version, cwd);\n const args = script.args.map((arg) => replaceEnvVariables(arg, version, cwd));\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2E4\uD589 \uC608\uC815: ${cmd} ${args.join(\" \")}`);\n } else {\n logger.debug(`\uC2E4\uD589: ${cmd} ${args.join(\" \")}`);\n await spawn(cmd, args, { cwd });\n }\n } catch (err) {\n // postPublish \uC2E4\uD328 \uC2DC \uACBD\uACE0\uB9CC \uCD9C\uB825 (\uBC30\uD3EC \uB864\uBC31 \uBD88\uAC00)\n logger.warn(`postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD328 (\uACC4\uC18D \uC9C4\uD589): ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n //#endregion\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC. \uC2E4\uC81C \uBC30\uD3EC \uC2DC \uBC84\uC804: v${version}`);\n } else {\n logger.info(`\uBAA8\uB4E0 \uBC30\uD3EC\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. (v${version})`);\n }\n}\n\n//#endregion\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from \"path\";\nimport semver from \"semver\";\nimport { consola, LogLevels } from \"consola\";\nimport { Listr, type ListrTask } from \"listr2\";\nimport { StorageFactory } from \"@simplysm/storage\";\nimport { fsExists, fsRead, fsReadJson, fsWrite, fsGlob, fsCopy } from \"@simplysm/core-node\";\nimport { env, jsonStringify } from \"@simplysm/core-common\";\nimport \"@simplysm/core-common\";\nimport type { SdConfig, SdPublishConfig } from \"../sd-config.types\";\nimport { loadSdConfig } from \"../utils/sd-config\";\nimport { spawn } from \"../utils/spawn\";\nimport { runBuild } from \"./build\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport ssh2 from \"ssh2\";\nimport { password as passwordPrompt } from \"@inquirer/prompts\";\n\nconst { Client: SshClient, utils } = ssh2;\n\n//#region Types\n\n/**\n * Publish \uBA85\uB839 \uC635\uC158\n */\nexport interface PublishOptions {\n /** \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0 \uD544\uD130 (\uBE48 \uBC30\uC5F4\uC774\uBA74 publish \uC124\uC815\uC774 \uC788\uB294 \uBAA8\uB4E0 \uD328\uD0A4\uC9C0) */\n targets: string[];\n /** \uBE4C\uB4DC \uC5C6\uC774 \uBC30\uD3EC (\uC704\uD5D8) */\n noBuild: boolean;\n /** \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158 */\n dryRun: boolean;\n /** sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uCD94\uAC00 \uC635\uC158 */\n options: string[];\n}\n\n/**\n * package.json \uD0C0\uC785 (\uD544\uC694\uD55C \uD544\uB4DC\uB9CC)\n */\ninterface PackageJson {\n name: string;\n version: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * \uD658\uACBD\uBCC0\uC218 \uCE58\uD658 (%VAR% \uD615\uC2DD)\n * @throws \uCE58\uD658 \uACB0\uACFC\uAC00 \uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uC5D0\uB7EC\n */\nfunction replaceEnvVariables(str: string, version: string, projectPath: string): string {\n const result = str.replace(/%([^%]+)%/g, (match, envName: string) => {\n if (envName === \"VER\") {\n return version;\n }\n if (envName === \"PROJECT\") {\n return projectPath;\n }\n return (env[envName] as string | undefined) ?? match;\n });\n\n // \uCE58\uD658\uB418\uC9C0 \uC54A\uC740 \uD658\uACBD\uBCC0\uC218\uAC00 \uB0A8\uC544\uC788\uC73C\uBA74 \uC5D0\uB7EC\n if (/%[^%]+%/.test(result)) {\n throw new Error(`\uD658\uACBD\uBCC0\uC218 \uCE58\uD658 \uC2E4\uD328: ${str} \u2192 ${result}`);\n }\n\n return result;\n}\n\n/**\n * \uCE74\uC6B4\uD2B8\uB2E4\uC6B4 \uB300\uAE30\n */\nasync function waitWithCountdown(message: string, seconds: number): Promise<void> {\n for (let i = seconds; i > 0; i--) {\n if (i !== seconds && process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n }\n process.stdout.write(`${message} ${i}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n if (process.stdout.isTTY) {\n process.stdout.cursorTo(0);\n process.stdout.clearLine(0);\n } else {\n process.stdout.write(\"\\n\");\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uC0AC\uC804 \uD655\uC778 \uBC0F \uC124\uC815\n *\n * pass\uAC00 \uC5C6\uB294 SFTP \uC11C\uBC84\uC5D0 \uB300\uD574:\n * 1. SSH \uD0A4 \uD30C\uC77C\uC774 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n * 2. \uD0A4 \uC778\uC99D\uC744 \uD14C\uC2A4\uD2B8\uD558\uACE0, \uC2E4\uD328\uD558\uBA74 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n */\nasync function ensureSshAuth(\n publishPackages: Array<{ name: string; config: SdPublishConfig }>,\n logger: ReturnType<typeof consola.withTag>,\n): Promise<void> {\n // pass \uC5C6\uB294 SFTP \uC11C\uBC84 \uC218\uC9D1 (user@host \uC911\uBCF5 \uC81C\uAC70)\n const sshTargets = new Map<string, { host: string; port?: number; user: string }>();\n for (const pkg of publishPackages) {\n if (pkg.config === \"npm\") continue;\n if (pkg.config.type !== \"sftp\") continue;\n if (pkg.config.pass != null) continue;\n if (pkg.config.user == null) {\n throw new Error(`[${pkg.name}] SFTP \uC124\uC815\uC5D0 user\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n const key = `${pkg.config.user}@${pkg.config.host}`;\n sshTargets.set(key, {\n host: pkg.config.host,\n port: pkg.config.port,\n user: pkg.config.user,\n });\n }\n\n if (sshTargets.size === 0) return;\n\n // SSH \uD0A4 \uD30C\uC77C \uD655\uC778/\uC0DD\uC131\n const sshDir = path.join(os.homedir(), \".ssh\");\n const keyPath = path.join(sshDir, \"id_ed25519\");\n const pubKeyPath = path.join(sshDir, \"id_ed25519.pub\");\n\n if (!fs.existsSync(keyPath)) {\n logger.info(\"SSH \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC0DD\uC131\uD569\uB2C8\uB2E4...\");\n\n if (!fs.existsSync(sshDir)) {\n fs.mkdirSync(sshDir, { mode: 0o700 });\n }\n\n const keyPair = utils.generateKeyPairSync(\"ed25519\");\n fs.writeFileSync(keyPath, keyPair.private, { mode: 0o600 });\n fs.writeFileSync(pubKeyPath, keyPair.public + \"\\n\", { mode: 0o644 });\n\n logger.info(`SSH \uD0A4 \uC0DD\uC131 \uC644\uB8CC: ${keyPath}`);\n }\n\n const privateKeyData = fs.readFileSync(keyPath);\n const publicKey = fs.readFileSync(pubKeyPath, \"utf-8\").trim();\n\n // privateKey\uAC00 \uC554\uD638\uD654\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\n const parsed = utils.parseKey(privateKeyData);\n const isKeyEncrypted = parsed instanceof Error;\n const sshAgent = process.env[\"SSH_AUTH_SOCK\"];\n\n // \uAC01 \uC11C\uBC84\uC5D0 \uB300\uD574 \uD0A4 \uC778\uC99D \uD655\uC778\n for (const [label, target] of sshTargets) {\n const canAuth = await testSshKeyAuth(target, {\n privateKey: isKeyEncrypted ? undefined : privateKeyData,\n agent: sshAgent,\n });\n if (canAuth) {\n logger.debug(`SSH \uD0A4 \uC778\uC99D \uD655\uC778: ${label}`);\n continue;\n }\n\n // \uD0A4 \uC778\uC99D \uC2E4\uD328 \u2192 \uBE44\uBC00\uBC88\uD638\uB85C \uACF5\uAC1C\uD0A4 \uB4F1\uB85D\n logger.info(`${label}: SSH \uD0A4\uAC00 \uC11C\uBC84\uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`);\n const pass = await passwordPrompt({\n message: `${label} \uBE44\uBC00\uBC88\uD638 (\uACF5\uAC1C\uD0A4 \uB4F1\uB85D\uC6A9):`,\n });\n\n await registerSshPublicKey(target, pass, publicKey);\n logger.info(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC644\uB8CC: ${label}`);\n }\n}\n\n/**\n * SSH \uD0A4 \uC778\uC99D \uD14C\uC2A4\uD2B8 (\uC811\uC18D \uD6C4 \uC989\uC2DC \uC885\uB8CC)\n */\nfunction testSshKeyAuth(\n target: { host: string; port?: number; user: string },\n auth: { privateKey?: Buffer; agent?: string },\n): Promise<boolean> {\n if (auth.privateKey == null && auth.agent == null) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n conn.end();\n resolve(true);\n });\n conn.on(\"error\", () => {\n resolve(false);\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n ...(auth.privateKey != null ? { privateKey: auth.privateKey } : {}),\n ...(auth.agent != null ? { agent: auth.agent } : {}),\n readyTimeout: 10_000,\n });\n });\n}\n\n/**\n * \uBE44\uBC00\uBC88\uD638\uB85C \uC11C\uBC84\uC5D0 \uC811\uC18D\uD558\uC5EC SSH \uACF5\uAC1C\uD0A4\uB97C \uB4F1\uB85D\n */\nfunction registerSshPublicKey(\n target: { host: string; port?: number; user: string },\n pass: string,\n publicKey: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const conn = new SshClient();\n conn.on(\"ready\", () => {\n // authorized_keys\uC5D0 \uACF5\uAC1C\uD0A4 \uCD94\uAC00\n const cmd = [\n \"mkdir -p ~/.ssh\",\n \"chmod 700 ~/.ssh\",\n `echo '${publicKey}' >> ~/.ssh/authorized_keys`,\n \"chmod 600 ~/.ssh/authorized_keys\",\n ].join(\" && \");\n\n conn.exec(cmd, (err, stream) => {\n if (err) {\n conn.end();\n reject(new Error(`SSH \uBA85\uB839 \uC2E4\uD589 \uC2E4\uD328: ${err.message}`));\n return;\n }\n\n let stderr = \"\";\n stream.on(\"data\", () => {}); // stdout \uC18C\uBE44 (\uBBF8\uC18C\uBE44 \uC2DC stream \uBBF8\uC885\uB8CC)\n stream.stderr.on(\"data\", (data: Uint8Array) => {\n stderr += data.toString();\n });\n stream.on(\"exit\", (code: number | null) => {\n conn.end();\n if (code !== 0) {\n reject(new Error(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC2E4\uD328 (exit code: ${code}): ${stderr}`));\n } else {\n resolve();\n }\n });\n });\n });\n conn.on(\"error\", (err) => {\n reject(new Error(`SSH \uC811\uC18D \uC2E4\uD328 (${target.host}): ${err.message}`));\n });\n conn.connect({\n host: target.host,\n port: target.port ?? 22,\n username: target.user,\n password: pass,\n readyTimeout: 10_000,\n });\n });\n}\n\n//#endregion\n\n//#region Version Upgrade\n\n/**\n * \uD504\uB85C\uC81D\uD2B8 \uBC0F \uD328\uD0A4\uC9C0 \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n * @param dryRun true\uBA74 \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uACC4\uC0B0\n */\nasync function upgradeVersion(\n cwd: string,\n allPkgPaths: string[],\n dryRun: boolean,\n): Promise<{ version: string; changedFiles: string[] }> {\n const changedFiles: string[] = [];\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n const currentVersion = projPkg.version;\n const prereleaseInfo = semver.prerelease(currentVersion);\n\n // prerelease \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC99D\uAC00 \uBC29\uC2DD \uACB0\uC815\n const newVersion =\n prereleaseInfo !== null ? semver.inc(currentVersion, \"prerelease\")! : semver.inc(currentVersion, \"patch\")!;\n\n if (dryRun) {\n // dry-run: \uD30C\uC77C \uC218\uC815 \uC5C6\uC774 \uC0C8 \uBC84\uC804\uB9CC \uBC18\uD658\n return { version: newVersion, changedFiles: [] };\n }\n\n projPkg.version = newVersion;\n await fsWrite(projPkgPath, jsonStringify(projPkg, { space: 2 }) + \"\\n\");\n changedFiles.push(projPkgPath);\n\n // \uAC01 \uD328\uD0A4\uC9C0 package.json \uBC84\uC804 \uC124\uC815\n for (const pkgPath of allPkgPaths) {\n const pkgJsonPath = path.resolve(pkgPath, \"package.json\");\n const pkgJson = await fsReadJson<PackageJson>(pkgJsonPath);\n pkgJson.version = newVersion;\n await fsWrite(pkgJsonPath, jsonStringify(pkgJson, { space: 2 }) + \"\\n\");\n changedFiles.push(pkgJsonPath);\n }\n\n // \uD15C\uD50C\uB9BF \uD30C\uC77C\uC758 @simplysm \uD328\uD0A4\uC9C0 \uBC84\uC804 \uB3D9\uAE30\uD654\n const templateFiles = await fsGlob(path.resolve(cwd, \"packages/sd-cli/templates/**/*.hbs\"));\n const versionRegex = /(\"@simplysm\\/[^\"]+\"\\s*:\\s*)\"~[^\"]+\"/g;\n\n for (const templatePath of templateFiles) {\n const content = await fsRead(templatePath);\n const newContent = content.replace(versionRegex, `$1\"~${newVersion}\"`);\n\n if (content !== newContent) {\n await fsWrite(templatePath, newContent);\n changedFiles.push(templatePath);\n }\n }\n\n return { version: newVersion, changedFiles };\n}\n\n//#endregion\n\n//#region Package Publishing\n\n/**\n * \uAC1C\uBCC4 \uD328\uD0A4\uC9C0 \uBC30\uD3EC\n * @param dryRun true\uBA74 \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158\n */\nasync function publishPackage(\n pkgPath: string,\n publishConfig: SdPublishConfig,\n version: string,\n projectPath: string,\n logger: ReturnType<typeof consola.withTag>,\n dryRun: boolean,\n): Promise<void> {\n const pkgName = path.basename(pkgPath);\n\n if (publishConfig === \"npm\") {\n // npm publish\n const prereleaseInfo = semver.prerelease(version);\n const args = [\"publish\", \"--access\", \"public\", \"--no-git-checks\"];\n\n if (prereleaseInfo !== null && typeof prereleaseInfo[0] === \"string\") {\n args.push(\"--tag\", prereleaseInfo[0]);\n }\n\n if (dryRun) {\n args.push(\"--dry-run\");\n logger.info(`[DRY-RUN] [${pkgName}] pnpm ${args.join(\" \")}`);\n } else {\n logger.debug(`[${pkgName}] pnpm ${args.join(\" \")}`);\n }\n\n await spawn(\"pnpm\", args, { cwd: pkgPath });\n } else if (publishConfig.type === \"local-directory\") {\n // \uB85C\uCEEC \uB514\uB809\uD1A0\uB9AC \uBCF5\uC0AC\n const targetPath = replaceEnvVariables(publishConfig.path, version, projectPath);\n const distPath = path.resolve(pkgPath, \"dist\");\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n } else {\n logger.debug(`[${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);\n await fsCopy(distPath, targetPath);\n }\n } else {\n // \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC\n const distPath = path.resolve(pkgPath, \"dist\");\n const remotePath = publishConfig.path ?? \"/\";\n\n if (dryRun) {\n logger.info(`[DRY-RUN] [${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n } else {\n logger.debug(`[${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);\n await StorageFactory.connect(\n publishConfig.type,\n {\n host: publishConfig.host,\n port: publishConfig.port,\n user: publishConfig.user,\n pass: publishConfig.pass,\n },\n async (storage) => {\n await storage.uploadDir(distPath, remotePath);\n },\n );\n }\n }\n}\n\n//#endregion\n\n//#region Dependency Levels\n\n/**\n * \uBC30\uD3EC \uD328\uD0A4\uC9C0\uC758 \uC758\uC874\uC131 \uB808\uBCA8\uC744 \uACC4\uC0B0\uD55C\uB2E4.\n * \uC758\uC874\uC131\uC774 \uC5C6\uB294 \uD328\uD0A4\uC9C0 \u2192 Level 0, Level 0\uC5D0\uB9CC \uC758\uC874 \u2192 Level 1, ...\n */\nasync function computePublishLevels(\n publishPkgs: Array<{ name: string; path: string; config: SdPublishConfig }>,\n): Promise<Array<Array<{ name: string; path: string; config: SdPublishConfig }>>> {\n const pkgNames = new Set(publishPkgs.map((p) => p.name));\n\n // \uAC01 \uD328\uD0A4\uC9C0\uC758 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uB0B4 \uC758\uC874\uC131 \uC218\uC9D1\n const depsMap = new Map<string, Set<string>>();\n for (const pkg of publishPkgs) {\n const pkgJson = await fsReadJson<PackageJson>(path.resolve(pkg.path, \"package.json\"));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.peerDependencies,\n ...pkgJson.optionalDependencies,\n };\n\n const workspaceDeps = new Set<string>();\n for (const depName of Object.keys(allDeps)) {\n const shortName = depName.replace(/^@simplysm\\//, \"\");\n if (shortName !== depName && pkgNames.has(shortName)) {\n workspaceDeps.add(shortName);\n }\n }\n depsMap.set(pkg.name, workspaceDeps);\n }\n\n // \uC704\uC0C1 \uC815\uB82C\uB85C \uB808\uBCA8 \uBD84\uB958\n const levels: Array<Array<{ name: string; path: string; config: SdPublishConfig }>> = [];\n const assigned = new Set<string>();\n const remaining = new Map(publishPkgs.map((p) => [p.name, p]));\n\n while (remaining.size > 0) {\n const level: Array<{ name: string; path: string; config: SdPublishConfig }> = [];\n for (const [name, pkg] of remaining) {\n const deps = depsMap.get(name)!;\n if ([...deps].every((d) => assigned.has(d))) {\n level.push(pkg);\n }\n }\n\n if (level.length === 0) {\n // \uC21C\uD658 \uC758\uC874\uC131 \u2014 \uB0A8\uC740 \uD328\uD0A4\uC9C0\uB97C \uBAA8\uB450 \uB9C8\uC9C0\uB9C9 \uB808\uBCA8\uC5D0 \uBC30\uCE58\n levels.push([...remaining.values()]);\n break;\n }\n\n for (const pkg of level) {\n assigned.add(pkg.name);\n remaining.delete(pkg.name);\n }\n levels.push(level);\n }\n\n return levels;\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * publish \uBA85\uB839\uC744 \uC2E4\uD589\uD55C\uB2E4.\n *\n * **\uBC30\uD3EC \uC21C\uC11C (\uC548\uC804\uC131 \uC6B0\uC120):**\n * 1. \uC0AC\uC804 \uAC80\uC99D (npm \uC778\uC99D, Git \uC0C1\uD0DC)\n * 2. \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC (package.json + \uD15C\uD50C\uB9BF)\n * 3. \uBE4C\uB4DC\n * 4. Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC (\uBCC0\uACBD\uB41C \uD30C\uC77C\uB9CC \uBA85\uC2DC\uC801\uC73C\uB85C staging)\n * 5. pnpm \uBC30\uD3EC\n * 6. postPublish (\uC2E4\uD328\uD574\uB3C4 \uACC4\uC18D)\n */\nexport async function runPublish(options: PublishOptions): Promise<void> {\n const { targets, noBuild, dryRun } = options;\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:publish\");\n\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uBAA8\uB4DC - \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC74C\");\n }\n\n logger.debug(\"\uBC30\uD3EC \uC2DC\uC791\", { targets, noBuild, dryRun });\n\n // sd.config.ts \uB85C\uB4DC\n let sdConfig: SdConfig;\n try {\n sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });\n logger.debug(\"sd.config.ts \uB85C\uB4DC \uC644\uB8CC\");\n } catch (err) {\n consola.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // package.json \uB85C\uB4DC\n const projPkgPath = path.resolve(cwd, \"package.json\");\n const projPkg = await fsReadJson<PackageJson>(projPkgPath);\n\n // pnpm-workspace.yaml\uC5D0\uC11C \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uD328\uD0A4\uC9C0 \uACBD\uB85C \uC218\uC9D1\n const workspaceYamlPath = path.resolve(cwd, \"pnpm-workspace.yaml\");\n const workspaceGlobs: string[] = [];\n if (await fsExists(workspaceYamlPath)) {\n const yamlContent = await fsRead(workspaceYamlPath);\n let inPackages = false;\n for (const line of yamlContent.split(\"\\n\")) {\n if (/^packages:\\s*$/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = /^\\s+-\\s+(.+)$/.exec(line);\n if (match != null) {\n workspaceGlobs.push(match[1].trim());\n } else {\n break;\n }\n }\n }\n }\n\n const allPkgPaths = (await Promise.all(workspaceGlobs.map((item) => fsGlob(path.resolve(cwd, item)))))\n .flat()\n .filter((item) => !item.includes(\".\"));\n\n // publish \uC124\uC815\uC774 \uC788\uB294 \uD328\uD0A4\uC9C0 \uD544\uD130\uB9C1\n const publishPackages: Array<{\n name: string;\n path: string;\n config: SdPublishConfig;\n }> = [];\n\n for (const [name, config] of Object.entries(sdConfig.packages)) {\n if (config == null) continue;\n if (config.target === \"scripts\") continue;\n\n const pkgConfig = config;\n if (pkgConfig.publish == null) continue;\n\n // targets\uAC00 \uC9C0\uC815\uB418\uBA74 \uD574\uB2F9 \uD328\uD0A4\uC9C0\uB9CC \uD3EC\uD568\n if (targets.length > 0 && !targets.includes(name)) continue;\n\n const pkgPath = allPkgPaths.find((p) => path.basename(p) === name);\n if (pkgPath == null) {\n logger.warn(`\uD328\uD0A4\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${name}`);\n continue;\n }\n\n publishPackages.push({\n name,\n path: pkgPath,\n config: pkgConfig.publish,\n });\n }\n\n if (publishPackages.length === 0) {\n process.stdout.write(\"\u2714 \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\\n\");\n return;\n }\n\n logger.debug(\n \"\uBC30\uD3EC \uB300\uC0C1 \uD328\uD0A4\uC9C0\",\n publishPackages.map((p) => p.name),\n );\n\n // Git \uC0AC\uC6A9 \uC5EC\uBD80 \uD655\uC778\n const hasGit = await fsExists(path.resolve(cwd, \".git\"));\n\n //#region Phase 1: \uC0AC\uC804 \uAC80\uC99D\n\n // npm \uC778\uC99D \uD655\uC778 (npm publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n if (publishPackages.some((p) => p.config === \"npm\")) {\n logger.debug(\"npm \uC778\uC99D \uD655\uC778...\");\n try {\n const whoami = await spawn(\"npm\", [\"whoami\"]);\n if (whoami.trim() === \"\") {\n throw new Error(\"npm \uB85C\uADF8\uC778 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n logger.debug(`npm \uB85C\uADF8\uC778 \uD655\uC778: ${whoami.trim()}`);\n } catch {\n consola.error(\n \"npm \uD1A0\uD070\uC774 \uC720\uD6A8\uD558\uC9C0 \uC54A\uAC70\uB098 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\\n\" +\n \"https://www.npmjs.com/settings/~/tokens \uC5D0\uC11C Granular Access Token \uC0DD\uC131 \uD6C4:\\n\" +\n \" npm config set //registry.npmjs.org/:_authToken <\uD1A0\uD070>\",\n );\n process.exitCode = 1;\n return;\n }\n }\n\n // SSH \uD0A4 \uC778\uC99D \uD655\uC778 (pass \uC5C6\uB294 SFTP publish \uC124\uC815\uC774 \uC788\uB294 \uACBD\uC6B0)\n try {\n await ensureSshAuth(publishPackages, logger);\n } catch (err) {\n consola.error(`SSH \uC778\uC99D \uC124\uC815 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n\n // Git \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D \uD655\uC778 \uBC0F \uC790\uB3D9 \uCEE4\uBC0B (noBuild\uAC00 \uC544\uB2CC \uACBD\uC6B0)\n if (!noBuild && hasGit) {\n logger.debug(\"Git \uCEE4\uBC0B \uC5EC\uBD80 \uD655\uC778...\");\n try {\n const diff = await spawn(\"git\", [\"diff\", \"--name-only\"]);\n const stagedDiff = await spawn(\"git\", [\"diff\", \"--cached\", \"--name-only\"]);\n\n if (diff.trim() !== \"\" || stagedDiff.trim() !== \"\") {\n logger.info(\"\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D \uAC10\uC9C0. claude \uC790\uB3D9 \uCEE4\uBC0B \uC2DC\uB3C4...\");\n try {\n await spawn(\"claude\", [\"-p\", \"/sd-commit all\", \"--dangerously-skip-permissions\", \"--model\", \"haiku\"]);\n } catch (e) {\n throw new Error(\n \"\uC790\uB3D9 \uCEE4\uBC0B\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCEE4\uBC0B \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.\\n\" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n\n // \uCEE4\uBC0B \uD6C4 \uC7AC\uD655\uC778\n const recheckDiff = await spawn(\"git\", [\"diff\", \"--name-only\"]);\n const recheckStaged = await spawn(\"git\", [\"diff\", \"--cached\", \"--name-only\"]);\n if (recheckDiff.trim() !== \"\" || recheckStaged.trim() !== \"\") {\n throw new Error(\"\uC790\uB3D9 \uCEE4\uBC0B \uD6C4\uC5D0\uB3C4 \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D\uC774 \uB0A8\uC544\uC788\uC2B5\uB2C8\uB2E4.\\n\" + recheckDiff + recheckStaged);\n }\n logger.info(\"\uC790\uB3D9 \uCEE4\uBC0B \uC644\uB8CC.\");\n }\n } catch (err) {\n consola.error(err instanceof Error ? err.message : err);\n process.exitCode = 1;\n return;\n }\n }\n\n //#endregion\n\n //#region Phase 2 & 3: \uBE4C\uB4DC \uB610\uB294 noBuild \uACBD\uACE0\n\n let version = projPkg.version;\n\n if (noBuild) {\n // noBuild \uACBD\uACE0\n logger.warn(\"\uBE4C\uB4DC\uD558\uC9C0 \uC54A\uACE0 \uBC30\uD3EC\uD558\uB294 \uAC83\uC740 \uC0C1\uB2F9\uD788 \uC704\uD5D8\uD569\uB2C8\uB2E4.\");\n await waitWithCountdown(\"\uD504\uB85C\uC138\uC2A4\uB97C \uC911\uC9C0\uD558\uB824\uBA74 'CTRL+C'\uB97C \uB204\uB974\uC138\uC694.\", 5);\n } else {\n // \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC\n logger.debug(\"\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC...\");\n const upgradeResult = await upgradeVersion(cwd, allPkgPaths, dryRun);\n version = upgradeResult.version;\n const _changedFiles = upgradeResult.changedFiles;\n if (dryRun) {\n logger.info(`[DRY-RUN] \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version} (\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C)`);\n } else {\n logger.info(`\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version}`);\n }\n\n // \uBE4C\uB4DC \uC2E4\uD589\n if (dryRun) {\n logger.info(\"[DRY-RUN] \uBE4C\uB4DC \uC2DC\uC791 (\uAC80\uC99D\uC6A9)...\");\n } else {\n logger.debug(\"\uBE4C\uB4DC \uC2DC\uC791...\");\n }\n\n try {\n await runBuild({\n targets: publishPackages.map((p) => p.name),\n options: options.options,\n });\n\n // \uBE4C\uB4DC \uC2E4\uD328 \uD655\uC778\n if (process.exitCode === 1) {\n throw new Error(\"\uBE4C\uB4DC \uC2E4\uD328\");\n }\n } catch {\n if (dryRun) {\n logger.error(\"[DRY-RUN] \uBE4C\uB4DC \uC2E4\uD328\");\n } else {\n consola.error(\n \"\uBE4C\uB4DC \uC2E4\uD328. \uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n \" \uBC84\uC804 \uBCC0\uACBD\uC744 \uB418\uB3CC\uB9AC\uB824\uBA74:\\n\" +\n \" git checkout -- package.json packages/*/package.json packages/sd-cli/templates/\",\n );\n }\n process.exitCode = 1;\n return;\n }\n\n //#region Phase 3: Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC\n\n if (hasGit) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC \uC2DC\uBBAC\uB808\uC774\uC158...\");\n logger.info(`[DRY-RUN] git add (${_changedFiles.length}\uAC1C \uD30C\uC77C)`);\n logger.info(`[DRY-RUN] git commit -m \"v${version}\"`);\n logger.info(`[DRY-RUN] git tag -a v${version} -m \"v${version}\"`);\n logger.info(\"[DRY-RUN] git push --dry-run\");\n await spawn(\"git\", [\"push\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] git push --tags --dry-run\");\n await spawn(\"git\", [\"push\", \"--tags\", \"--dry-run\"]);\n logger.info(\"[DRY-RUN] Git \uC791\uC5C5 \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC\");\n } else {\n logger.debug(\"Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC...\");\n try {\n await spawn(\"git\", [\"add\", ..._changedFiles]);\n await spawn(\"git\", [\"commit\", \"-m\", `v${version}`]);\n await spawn(\"git\", [\"tag\", \"-a\", `v${version}`, \"-m\", `v${version}`]);\n await spawn(\"git\", [\"push\"]);\n await spawn(\"git\", [\"push\", \"--tags\"]);\n logger.debug(\"Git \uC791\uC5C5 \uC644\uB8CC\");\n } catch (err) {\n consola.error(\n `Git \uC791\uC5C5 \uC2E4\uD328: ${err instanceof Error ? err.message : err}\\n` +\n \"\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\\n\" +\n ` git revert HEAD # \uBC84\uC804 \uCEE4\uBC0B \uB418\uB3CC\uB9AC\uAE30\\n` +\n ` git tag -d v${version} # \uD0DC\uADF8 \uC0AD\uC81C`,\n );\n process.exitCode = 1;\n return;\n }\n }\n }\n\n //#endregion\n }\n\n //#endregion\n\n //#region Phase 4: \uBC30\uD3EC (\uC758\uC874\uC131 \uB808\uBCA8\uBCC4 \uBCD1\uB82C, Listr)\n\n const levels = await computePublishLevels(publishPackages);\n const publishedPackages: string[] = [];\n let publishFailed = false;\n\n const publishListr = new Listr(\n levels.map(\n (levelPkgs, levelIdx): ListrTask => ({\n title: `Level ${levelIdx + 1}/${levels.length}`,\n skip: () => publishFailed,\n task: (_, task) =>\n task.newListr(\n levelPkgs.map(\n (pkg): ListrTask => ({\n title: dryRun ? `[DRY-RUN] ${pkg.name}` : pkg.name,\n task: async (_ctx, pkgTask) => {\n const maxRetries = 3;\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await publishPackage(pkg.path, pkg.config, version, cwd, logger, dryRun);\n break;\n } catch (err) {\n if (attempt < maxRetries) {\n const delay = attempt * 5_000;\n pkgTask.title = dryRun\n ? `[DRY-RUN] ${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`\n : `${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`;\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n throw err;\n }\n }\n }\n publishedPackages.push(pkg.name);\n },\n }),\n ),\n { concurrent: true, exitOnError: false },\n ),\n }),\n ),\n {\n concurrent: false,\n exitOnError: false,\n renderer: consola.level >= LogLevels.debug ? \"verbose\" : \"default\",\n },\n );\n\n try {\n await publishListr.run();\n } catch {\n // Listr \uB0B4\uBD80 \uC5D0\uB7EC\uB294 \uC544\uB798\uC5D0\uC11C \uCC98\uB9AC\n }\n\n // \uC2E4\uD328\uD55C \uD328\uD0A4\uC9C0 \uD655\uC778\n const allPkgNames = publishPackages.map((p) => p.name);\n const failedPkgNames = allPkgNames.filter((n) => !publishedPackages.includes(n));\n\n if (failedPkgNames.length > 0) {\n publishFailed = true;\n\n if (publishedPackages.length > 0) {\n consola.error(\n \"\uBC30\uD3EC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\\n\" +\n \"\uC774\uBBF8 \uBC30\uD3EC\uB41C \uD328\uD0A4\uC9C0:\\n\" +\n publishedPackages.map((n) => ` - ${n}`).join(\"\\n\") +\n \"\\n\\n\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\\n\" +\n \"npm \uD328\uD0A4\uC9C0\uB294 72\uC2DC\uAC04 \uB0B4\uC5D0 `npm unpublish <pkg>@<version>` \uC73C\uB85C \uC0AD\uC81C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\",\n );\n }\n\n for (const name of failedPkgNames) {\n consola.error(`[${name}] \uBC30\uD3EC \uC2E4\uD328`);\n }\n process.exitCode = 1;\n return;\n }\n\n //#endregion\n\n //#region Phase 5: postPublish\n\n if (sdConfig.postPublish != null && sdConfig.postPublish.length > 0) {\n if (dryRun) {\n logger.info(\"[DRY-RUN] postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2DC\uBBAC\uB808\uC774\uC158...\");\n } else {\n logger.debug(\"postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589...\");\n }\n\n for (const script of sdConfig.postPublish) {\n try {\n const cmd = replaceEnvVariables(script.cmd, version, cwd);\n const args = script.args.map((arg) => replaceEnvVariables(arg, version, cwd));\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2E4\uD589 \uC608\uC815: ${cmd} ${args.join(\" \")}`);\n } else {\n logger.debug(`\uC2E4\uD589: ${cmd} ${args.join(\" \")}`);\n await spawn(cmd, args, { cwd });\n }\n } catch (err) {\n // postPublish \uC2E4\uD328 \uC2DC \uACBD\uACE0\uB9CC \uCD9C\uB825 (\uBC30\uD3EC \uB864\uBC31 \uBD88\uAC00)\n logger.warn(`postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD328 (\uACC4\uC18D \uC9C4\uD589): ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n //#endregion\n\n if (dryRun) {\n logger.info(`[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC. \uC2E4\uC81C \uBC30\uD3EC \uC2DC \uBC84\uC804: v${version}`);\n } else {\n logger.info(`\uBAA8\uB4E0 \uBC30\uD3EC\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. (v${version})`);\n }\n}\n\n//#endregion\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -184,9 +184,9 @@ export interface SdServerPackageConfig {
184
184
  name?: string;
185
185
  /** PM2 watch에서 제외할 경로 */
186
186
  ignoreWatchPaths?: string[];
187
- /** true면 interpreter 경로 생략 (시스템 PATH의 node 사용) */
188
- noInterpreter?: boolean;
189
187
  };
188
+ /** Package manager to use (affects mise.toml or volta settings generation) */
189
+ packageManager?: "volta" | "mise";
190
190
  }
191
191
  /**
192
192
  * 스크립트 전용 패키지 설정 (watch/typecheck 제외)
@@ -1 +1 @@
1
- {"version":3,"file":"sd-config.types.d.ts","sourceRoot":"","sources":["../src/sd-config.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAIzD;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,6BAA6B,GAAG,sBAAsB,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,iBAAiB,CAAC;IACxB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAID;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,iBAAiB;IACjB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gCAAgC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uBAAuB;IACvB,aAAa,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC1C,oBAAoB;IACpB,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe;IACf,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,wBAAwB,CAAC;KACpC,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,2BAA2B;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY;IACZ,MAAM,EAAE,QAAQ,CAAC;IACjB;;;;OAIG;IACH,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,iBAAiB;IACjB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,mBAAmB;IACnB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,kBAAkB;IAClB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY;IACZ,MAAM,EAAE,QAAQ,CAAC;IACjB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,iBAAiB;IACjB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,GAAG,CAAC,EAAE;QACJ,iDAAiD;QACjD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,yBAAyB;QACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,kDAAkD;QAClD,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,YAAY;IACZ,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,sBAAsB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC;IACtD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,uBAAuB;IACvB,WAAW,CAAC,EAAE,yBAAyB,EAAE,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe;IACf,GAAG,EAAE,OAAO,CAAC;IACb,0BAA0B;IAC1B,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"sd-config.types.d.ts","sourceRoot":"","sources":["../src/sd-config.types.ts"],"names":[],"mappings":"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"}
@@ -15,8 +15,9 @@ export interface ServerBuildInfo {
15
15
  pm2?: {
16
16
  name?: string;
17
17
  ignoreWatchPaths?: string[];
18
- noInterpreter?: boolean;
19
18
  };
19
+ /** Package manager to use (affects mise.toml or volta settings generation) */
20
+ packageManager?: "volta" | "mise";
20
21
  }
21
22
  /**
22
23
  * Server 빌드 결과
@@ -1 +1 @@
1
- {"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["../../src/workers/server.worker.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AA6LD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6CtE;AAKD;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E9D;AAED;;;GAGG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;AAED,QAAA,MAAM,MAAM;;;eACD,OAAO,KAAK;oBAAc,OAAO,UAAU;mBAAa,OAAO,SAAS;;;CAMjF,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["../../src/workers/server.worker.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,8EAA8E;IAC9E,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAiMD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6CtE;AAKD;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E9D;AAED;;;GAGG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;AAED,QAAA,MAAM,MAAM;;;eACD,OAAO,KAAK;oBAAc,OAAO,UAAU;mBAAa,OAAO,SAAS;;;CAMjF,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
+ import cp from "child_process";
3
4
  import esbuild from "esbuild";
4
5
  import { createWorker } from "@simplysm/core-node";
5
6
  import { consola } from "consola";
@@ -50,20 +51,26 @@ function generateProductionFiles(info, externals) {
50
51
  }
51
52
  distPkgJson["dependencies"] = deps;
52
53
  }
54
+ if (info.packageManager === "volta") {
55
+ const nodeVersion = cp.execSync("node -v").toString().trim();
56
+ distPkgJson["volta"] = { node: nodeVersion };
57
+ }
53
58
  fs.writeFileSync(path.join(distDir, "package.json"), JSON.stringify(distPkgJson, void 0, 2));
54
- logger.debug("GEN mise.toml...");
55
- const rootMiseTomlPath = path.join(info.cwd, "mise.toml");
56
- let nodeVersion = "20";
57
- if (fs.existsSync(rootMiseTomlPath)) {
58
- const miseContent = fs.readFileSync(rootMiseTomlPath, "utf-8");
59
- const match = /node\s*=\s*"([^"]+)"/.exec(miseContent);
60
- if (match != null) {
61
- nodeVersion = match[1];
59
+ if (info.packageManager === "mise") {
60
+ logger.debug("GEN mise.toml...");
61
+ const rootMiseTomlPath = path.join(info.cwd, "mise.toml");
62
+ let nodeVersion = "20";
63
+ if (fs.existsSync(rootMiseTomlPath)) {
64
+ const miseContent = fs.readFileSync(rootMiseTomlPath, "utf-8");
65
+ const match = /node\s*=\s*"([^"]+)"/.exec(miseContent);
66
+ if (match != null) {
67
+ nodeVersion = match[1];
68
+ }
62
69
  }
63
- }
64
- fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]
70
+ fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]
65
71
  node = "${nodeVersion}"
66
72
  `);
73
+ }
67
74
  logger.debug("GEN openssl.cnf...");
68
75
  fs.writeFileSync(
69
76
  path.join(distDir, "openssl.cnf"),
@@ -98,11 +105,10 @@ node = "${nodeVersion}"
98
105
  const envObj = {
99
106
  NODE_ENV: "production",
100
107
  TZ: "Asia/Seoul",
101
- SD_VERSION: pkgJson.version,
102
108
  ...info.env ?? {}
103
109
  };
104
110
  const envStr = JSON.stringify(envObj, void 0, 4);
105
- const interpreterLine = info.pm2.noInterpreter ? "" : ` interpreter: cp.execSync("mise which node").toString().trim(),
111
+ const interpreterLine = info.packageManager === "volta" ? "" : ` interpreter: cp.execSync("mise which node").toString().trim(),
106
112
  `;
107
113
  const pm2Config = [
108
114
  `const cp = require("child_process");`,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/workers/server.worker.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport esbuild from \"esbuild\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from \"../utils/tsconfig\";\nimport {\n createServerEsbuildOptions,\n collectUninstalledOptionalPeerDeps,\n collectNativeModuleExternals,\n} from \"../utils/esbuild-config\";\n\n//#region Types\n\n/**\n * Server \uBE4C\uB4DC \uC815\uBCF4 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC6A9)\n */\nexport interface ServerBuildInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n /** PM2 \uC124\uC815 (\uC9C0\uC815 \uC2DC dist/pm2.config.cjs \uC0DD\uC131) */\n pm2?: {\n name?: string;\n ignoreWatchPaths?: string[];\n noInterpreter?: boolean;\n };\n}\n\n/**\n * Server \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface ServerBuildResult {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * Server Watch \uC815\uBCF4\n */\nexport interface ServerWatchInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface ServerBuildEvent {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface ServerErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface ServerWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: ServerBuildEvent;\n error: ServerErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:server:worker\");\n\n/** esbuild build context (\uC815\uB9AC \uB300\uC0C1) */\nlet esbuildContext: esbuild.BuildContext | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n // \uC804\uC5ED \uBCC0\uC218\uB97C \uC784\uC2DC \uBCC0\uC218\uB85C \uCEA1\uCC98 \uD6C4 \uCD08\uAE30\uD654\n // (Promise.all \uB300\uAE30 \uC911 \uB2E4\uB978 \uD638\uCD9C\uC5D0\uC11C \uC804\uC5ED \uBCC0\uC218\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C)\n const contextToDispose = esbuildContext;\n esbuildContext = undefined;\n\n if (contextToDispose != null) {\n await contextToDispose.dispose();\n }\n}\n\n/**\n * \uC138 \uAC00\uC9C0 \uC18C\uC2A4\uC5D0\uC11C external \uBAA8\uB4C8\uC744 \uC218\uC9D1\uD558\uC5EC \uD569\uCE5C\uB2E4.\n * 1. \uBBF8\uC124\uCE58 optional peer deps\n * 2. binding.gyp \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8\n * 3. sd.config.ts \uC218\uB3D9 \uC9C0\uC815\n */\nfunction collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {\n const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);\n const nativeModules = collectNativeModuleExternals(pkgDir);\n const manual = manualExternals ?? [];\n\n const merged = [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];\n\n if (optionalPeerDeps.length > 0) {\n logger.debug(\"\uBBF8\uC124\uCE58 optional peer deps (external):\", optionalPeerDeps);\n }\n if (nativeModules.length > 0) {\n logger.debug(\"\uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8 (external):\", nativeModules);\n }\n if (manual.length > 0) {\n logger.debug(\"\uC218\uB3D9 \uC9C0\uC815 (external):\", manual);\n }\n\n return merged;\n}\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBC30\uD3EC\uC6A9 \uD30C\uC77C \uC0DD\uC131 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC5D0\uC11C\uB9CC \uD638\uCD9C)\n *\n * - dist/package.json: external \uBAA8\uB4C8\uC744 dependencies\uB85C \uD3EC\uD568\n * - dist/mise.toml: Node \uBC84\uC804 \uC9C0\uC815\n * - dist/openssl.cnf: \uB808\uAC70\uC2DC OpenSSL \uD504\uB85C\uBC14\uC774\uB354 \uD65C\uC131\uD654\n * - dist/pm2.config.cjs: PM2 \uD504\uB85C\uC138\uC2A4 \uC124\uC815 (pm2 \uC635\uC158\uC774 \uC788\uC744 \uB54C\uB9CC)\n */\nfunction generateProductionFiles(info: ServerBuildInfo, externals: string[]): void {\n const distDir = path.join(info.pkgDir, \"dist\");\n const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, \"package.json\"), \"utf-8\"));\n\n // dist/package.json\n logger.debug(\"GEN package.json...\");\n const distPkgJson: Record<string, unknown> = {\n name: pkgJson.name,\n version: pkgJson.version,\n type: pkgJson.type,\n };\n if (externals.length > 0) {\n const deps: Record<string, string> = {};\n for (const ext of externals) {\n deps[ext] = \"*\";\n }\n distPkgJson[\"dependencies\"] = deps;\n }\n fs.writeFileSync(path.join(distDir, \"package.json\"), JSON.stringify(distPkgJson, undefined, 2));\n\n // dist/mise.toml\n logger.debug(\"GEN mise.toml...\");\n const rootMiseTomlPath = path.join(info.cwd, \"mise.toml\");\n let nodeVersion = \"20\";\n if (fs.existsSync(rootMiseTomlPath)) {\n const miseContent = fs.readFileSync(rootMiseTomlPath, \"utf-8\");\n const match = /node\\s*=\\s*\"([^\"]+)\"/.exec(miseContent);\n if (match != null) {\n nodeVersion = match[1];\n }\n }\n fs.writeFileSync(path.join(distDir, \"mise.toml\"), `[tools]\\nnode = \"${nodeVersion}\"\\n`);\n\n // dist/openssl.cnf\n logger.debug(\"GEN openssl.cnf...\");\n fs.writeFileSync(\n path.join(distDir, \"openssl.cnf\"),\n [\n \"nodejs_conf = openssl_init\",\n \"\",\n \"[openssl_init]\",\n \"providers = provider_sect\",\n \"ssl_conf = ssl_sect\",\n \"\",\n \"[provider_sect]\",\n \"default = default_sect\",\n \"legacy = legacy_sect\",\n \"\",\n \"[default_sect]\",\n \"activate = 1\",\n \"\",\n \"[legacy_sect]\",\n \"activate = 1\",\n \"\",\n \"[ssl_sect]\",\n \"system_default = system_default_sect\",\n \"\",\n \"[system_default_sect]\",\n \"Options = UnsafeLegacyRenegotiation\",\n ].join(\"\\n\"),\n );\n\n // dist/pm2.config.cjs (pm2 \uC124\uC815\uC774 \uC788\uC744 \uB54C\uB9CC)\n if (info.pm2 != null) {\n logger.debug(\"GEN pm2.config.cjs...\");\n\n const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, \"\").replace(/[/\\\\]/g, \"-\");\n const ignoreWatch = JSON.stringify([\"node_modules\", \"www\", ...(info.pm2.ignoreWatchPaths ?? [])]);\n const envObj: Record<string, string> = {\n NODE_ENV: \"production\",\n TZ: \"Asia/Seoul\",\n SD_VERSION: pkgJson.version,\n ...(info.env ?? {}),\n };\n const envStr = JSON.stringify(envObj, undefined, 4);\n\n const interpreterLine = info.pm2.noInterpreter\n ? \"\"\n : ` interpreter: cp.execSync(\"mise which node\").toString().trim(),\\n`;\n\n const pm2Config = [\n `const cp = require(\"child_process\");`,\n ``,\n `module.exports = {`,\n ` name: ${JSON.stringify(pm2Name)},`,\n ` script: \"main.js\",`,\n ` watch: true,`,\n ` watch_delay: 2000,`,\n ` ignore_watch: ${ignoreWatch},`,\n interpreterLine.trimEnd(),\n ` interpreter_args: \"--openssl-config=openssl.cnf\",`,\n ` env: ${envStr.replace(/\\n/g, \"\\n \")},`,\n ` arrayProcess: \"concat\",`,\n ` useDelTargetNull: true,`,\n `};`,\n ]\n .filter((line) => line !== \"\")\n .join(\"\\n\");\n\n fs.writeFileSync(path.join(distDir, \"pm2.config.cjs\"), pm2Config);\n }\n}\n\n// \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC804 \uB9AC\uC18C\uC2A4 \uC815\uB9AC (SIGTERM/SIGINT)\n// \uC8FC\uC758: worker.terminate()\uB294 \uC774 \uD578\uB4E4\uB7EC\uB4E4\uC744 \uD638\uCD9C\uD558\uC9C0 \uC54A\uACE0 \uC989\uC2DC \uC885\uB8CC\uB428.\n// \uADF8\uB7EC\uB098 watch \uBAA8\uB4DC\uC5D0\uC11C \uC815\uC0C1 \uC885\uB8CC\uB294 \uBA54\uC778 \uD504\uB85C\uC138\uC2A4\uC758 SIGINT/SIGTERM\uC744 \uD1B5\uD574 \uC774\uB8E8\uC5B4\uC9C0\uBBC0\uB85C \uBB38\uC81C\uC5C6\uC74C.\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC\n */\nasync function build(info: ServerBuildInfo): Promise<ServerBuildResult> {\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uC77C\uD68C\uC131 \uBE4C\uB4DC\n const esbuildOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n const result = await esbuild.build(esbuildOptions);\n\n // Generate .config.json\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n\n // Generate production files (package.json, mise.toml, openssl.cnf, pm2.config.cjs)\n generateProductionFiles(info, external);\n\n const errors = result.errors.map((e) => e.text);\n return {\n success: result.errors.length === 0,\n mainJsPath,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n mainJsPath,\n errors: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\n/** startWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * watch \uC2DC\uC791\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startWatch(info: ServerWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\uB97C \uC704\uD55C Promise\n let resolveFirstBuild!: () => void;\n const firstBuildPromise = new Promise<void>((resolve) => {\n resolveFirstBuild = resolve;\n });\n\n let isFirstBuild = true;\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uAE30\uBCF8 \uC635\uC158 \uC0DD\uC131\n const baseOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n // watch\uC6A9 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\n esbuildContext = await esbuild.context({\n ...baseOptions,\n plugins: [\n {\n name: \"watch-notify\",\n setup(pluginBuild) {\n pluginBuild.onStart(() => {\n sender.send(\"buildStart\", {});\n });\n\n pluginBuild.onEnd((result) => {\n const errors = result.errors.map((e) => e.text);\n const success = result.errors.length === 0;\n\n // Generate .config.json on first successful build\n if (isFirstBuild && success) {\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n }\n\n sender.send(\"build\", { success, mainJsPath, errors: errors.length > 0 ? errors : undefined });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n resolveFirstBuild();\n }\n });\n },\n },\n ],\n });\n\n await esbuildContext.watch();\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\n await firstBuildPromise;\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * watch \uC911\uC9C0\n * @remarks esbuild context\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n */\nasync function stopWatch(): Promise<void> {\n await cleanup();\n}\n\nconst sender = createWorker<\n { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },\n ServerWorkerEvents\n>({\n build,\n startWatch,\n stopWatch,\n});\n\nexport default sender;\n\n//#endregion\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport cp from \"child_process\";\nimport esbuild from \"esbuild\";\nimport { createWorker } from \"@simplysm/core-node\";\nimport { consola } from \"consola\";\nimport { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from \"../utils/tsconfig\";\nimport {\n createServerEsbuildOptions,\n collectUninstalledOptionalPeerDeps,\n collectNativeModuleExternals,\n} from \"../utils/esbuild-config\";\n\n//#region Types\n\n/**\n * Server \uBE4C\uB4DC \uC815\uBCF4 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC6A9)\n */\nexport interface ServerBuildInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n /** PM2 \uC124\uC815 (\uC9C0\uC815 \uC2DC dist/pm2.config.cjs \uC0DD\uC131) */\n pm2?: {\n name?: string;\n ignoreWatchPaths?: string[];\n };\n /** Package manager to use (affects mise.toml or volta settings generation) */\n packageManager?: \"volta\" | \"mise\";\n}\n\n/**\n * Server \uBE4C\uB4DC \uACB0\uACFC\n */\nexport interface ServerBuildResult {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * Server Watch \uC815\uBCF4\n */\nexport interface ServerWatchInfo {\n name: string;\n cwd: string;\n pkgDir: string;\n /** \uBE4C\uB4DC \uC2DC \uCE58\uD658\uD560 \uD658\uACBD\uBCC0\uC218 */\n env?: Record<string, string>;\n /** \uB7F0\uD0C0\uC784 \uC124\uC815 (dist/.config.json\uC5D0 \uAE30\uB85D) */\n configs?: Record<string, unknown>;\n /** sd.config.ts\uC5D0\uC11C \uC218\uB3D9 \uC9C0\uC815\uD55C external \uBAA8\uB4C8 */\n externals?: string[];\n}\n\n/**\n * \uBE4C\uB4DC \uC774\uBCA4\uD2B8\n */\nexport interface ServerBuildEvent {\n success: boolean;\n mainJsPath: string;\n errors?: string[];\n}\n\n/**\n * \uC5D0\uB7EC \uC774\uBCA4\uD2B8\n */\nexport interface ServerErrorEvent {\n message: string;\n}\n\n/**\n * Worker \uC774\uBCA4\uD2B8 \uD0C0\uC785\n */\nexport interface ServerWorkerEvents extends Record<string, unknown> {\n buildStart: Record<string, never>;\n build: ServerBuildEvent;\n error: ServerErrorEvent;\n}\n\n//#endregion\n\n//#region \uB9AC\uC18C\uC2A4 \uAD00\uB9AC\n\nconst logger = consola.withTag(\"sd:cli:server:worker\");\n\n/** esbuild build context (\uC815\uB9AC \uB300\uC0C1) */\nlet esbuildContext: esbuild.BuildContext | undefined;\n\n/**\n * \uB9AC\uC18C\uC2A4 \uC815\uB9AC\n */\nasync function cleanup(): Promise<void> {\n // \uC804\uC5ED \uBCC0\uC218\uB97C \uC784\uC2DC \uBCC0\uC218\uB85C \uCEA1\uCC98 \uD6C4 \uCD08\uAE30\uD654\n // (Promise.all \uB300\uAE30 \uC911 \uB2E4\uB978 \uD638\uCD9C\uC5D0\uC11C \uC804\uC5ED \uBCC0\uC218\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C)\n const contextToDispose = esbuildContext;\n esbuildContext = undefined;\n\n if (contextToDispose != null) {\n await contextToDispose.dispose();\n }\n}\n\n/**\n * \uC138 \uAC00\uC9C0 \uC18C\uC2A4\uC5D0\uC11C external \uBAA8\uB4C8\uC744 \uC218\uC9D1\uD558\uC5EC \uD569\uCE5C\uB2E4.\n * 1. \uBBF8\uC124\uCE58 optional peer deps\n * 2. binding.gyp \uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8\n * 3. sd.config.ts \uC218\uB3D9 \uC9C0\uC815\n */\nfunction collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {\n const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);\n const nativeModules = collectNativeModuleExternals(pkgDir);\n const manual = manualExternals ?? [];\n\n const merged = [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];\n\n if (optionalPeerDeps.length > 0) {\n logger.debug(\"\uBBF8\uC124\uCE58 optional peer deps (external):\", optionalPeerDeps);\n }\n if (nativeModules.length > 0) {\n logger.debug(\"\uB124\uC774\uD2F0\uBE0C \uBAA8\uB4C8 (external):\", nativeModules);\n }\n if (manual.length > 0) {\n logger.debug(\"\uC218\uB3D9 \uC9C0\uC815 (external):\", manual);\n }\n\n return merged;\n}\n\n/**\n * \uD504\uB85C\uB355\uC158 \uBC30\uD3EC\uC6A9 \uD30C\uC77C \uC0DD\uC131 (\uC77C\uD68C\uC131 \uBE4C\uB4DC\uC5D0\uC11C\uB9CC \uD638\uCD9C)\n *\n * - dist/package.json: external \uBAA8\uB4C8\uC744 dependencies\uB85C \uD3EC\uD568 (volta \uC0AC\uC6A9 \uC2DC volta \uD544\uB4DC \uCD94\uAC00)\n * - dist/mise.toml: Node \uBC84\uC804 \uC9C0\uC815 (packageManager === \"mise\"\uC77C \uB54C\uB9CC)\n * - dist/openssl.cnf: \uB808\uAC70\uC2DC OpenSSL \uD504\uB85C\uBC14\uC774\uB354 \uD65C\uC131\uD654\n * - dist/pm2.config.cjs: PM2 \uD504\uB85C\uC138\uC2A4 \uC124\uC815 (pm2 \uC635\uC158\uC774 \uC788\uC744 \uB54C\uB9CC)\n */\nfunction generateProductionFiles(info: ServerBuildInfo, externals: string[]): void {\n const distDir = path.join(info.pkgDir, \"dist\");\n const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, \"package.json\"), \"utf-8\"));\n\n // dist/package.json\n logger.debug(\"GEN package.json...\");\n const distPkgJson: Record<string, unknown> = {\n name: pkgJson.name,\n version: pkgJson.version,\n type: pkgJson.type,\n };\n if (externals.length > 0) {\n const deps: Record<string, string> = {};\n for (const ext of externals) {\n deps[ext] = \"*\";\n }\n distPkgJson[\"dependencies\"] = deps;\n }\n if (info.packageManager === \"volta\") {\n const nodeVersion = cp.execSync(\"node -v\").toString().trim();\n distPkgJson[\"volta\"] = { node: nodeVersion };\n }\n fs.writeFileSync(path.join(distDir, \"package.json\"), JSON.stringify(distPkgJson, undefined, 2));\n\n // dist/mise.toml (packageManager === \"mise\"\uC77C \uB54C\uB9CC)\n if (info.packageManager === \"mise\") {\n logger.debug(\"GEN mise.toml...\");\n const rootMiseTomlPath = path.join(info.cwd, \"mise.toml\");\n let nodeVersion = \"20\";\n if (fs.existsSync(rootMiseTomlPath)) {\n const miseContent = fs.readFileSync(rootMiseTomlPath, \"utf-8\");\n const match = /node\\s*=\\s*\"([^\"]+)\"/.exec(miseContent);\n if (match != null) {\n nodeVersion = match[1];\n }\n }\n fs.writeFileSync(path.join(distDir, \"mise.toml\"), `[tools]\\nnode = \"${nodeVersion}\"\\n`);\n }\n\n // dist/openssl.cnf\n logger.debug(\"GEN openssl.cnf...\");\n fs.writeFileSync(\n path.join(distDir, \"openssl.cnf\"),\n [\n \"nodejs_conf = openssl_init\",\n \"\",\n \"[openssl_init]\",\n \"providers = provider_sect\",\n \"ssl_conf = ssl_sect\",\n \"\",\n \"[provider_sect]\",\n \"default = default_sect\",\n \"legacy = legacy_sect\",\n \"\",\n \"[default_sect]\",\n \"activate = 1\",\n \"\",\n \"[legacy_sect]\",\n \"activate = 1\",\n \"\",\n \"[ssl_sect]\",\n \"system_default = system_default_sect\",\n \"\",\n \"[system_default_sect]\",\n \"Options = UnsafeLegacyRenegotiation\",\n ].join(\"\\n\"),\n );\n\n // dist/pm2.config.cjs (pm2 \uC124\uC815\uC774 \uC788\uC744 \uB54C\uB9CC)\n if (info.pm2 != null) {\n logger.debug(\"GEN pm2.config.cjs...\");\n\n const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, \"\").replace(/[/\\\\]/g, \"-\");\n const ignoreWatch = JSON.stringify([\"node_modules\", \"www\", ...(info.pm2.ignoreWatchPaths ?? [])]);\n const envObj: Record<string, string> = {\n NODE_ENV: \"production\",\n TZ: \"Asia/Seoul\",\n ...(info.env ?? {}),\n };\n const envStr = JSON.stringify(envObj, undefined, 4);\n\n const interpreterLine =\n info.packageManager === \"volta\" ? \"\" : ` interpreter: cp.execSync(\"mise which node\").toString().trim(),\\n`;\n\n const pm2Config = [\n `const cp = require(\"child_process\");`,\n ``,\n `module.exports = {`,\n ` name: ${JSON.stringify(pm2Name)},`,\n ` script: \"main.js\",`,\n ` watch: true,`,\n ` watch_delay: 2000,`,\n ` ignore_watch: ${ignoreWatch},`,\n interpreterLine.trimEnd(),\n ` interpreter_args: \"--openssl-config=openssl.cnf\",`,\n ` env: ${envStr.replace(/\\n/g, \"\\n \")},`,\n ` arrayProcess: \"concat\",`,\n ` useDelTargetNull: true,`,\n `};`,\n ]\n .filter((line) => line !== \"\")\n .join(\"\\n\");\n\n fs.writeFileSync(path.join(distDir, \"pm2.config.cjs\"), pm2Config);\n }\n}\n\n// \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uC804 \uB9AC\uC18C\uC2A4 \uC815\uB9AC (SIGTERM/SIGINT)\n// \uC8FC\uC758: worker.terminate()\uB294 \uC774 \uD578\uB4E4\uB7EC\uB4E4\uC744 \uD638\uCD9C\uD558\uC9C0 \uC54A\uACE0 \uC989\uC2DC \uC885\uB8CC\uB428.\n// \uADF8\uB7EC\uB098 watch \uBAA8\uB4DC\uC5D0\uC11C \uC815\uC0C1 \uC885\uB8CC\uB294 \uBA54\uC778 \uD504\uB85C\uC138\uC2A4\uC758 SIGINT/SIGTERM\uC744 \uD1B5\uD574 \uC774\uB8E8\uC5B4\uC9C0\uBBC0\uB85C \uBB38\uC81C\uC5C6\uC74C.\nprocess.on(\"SIGTERM\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\nprocess.on(\"SIGINT\", () => {\n cleanup()\n .catch((err) => {\n logger.error(\"cleanup \uC2E4\uD328\", err);\n })\n .finally(() => {\n process.exit(0);\n });\n});\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uC77C\uD68C\uC131 \uBE4C\uB4DC\n */\nasync function build(info: ServerBuildInfo): Promise<ServerBuildResult> {\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uC77C\uD68C\uC131 \uBE4C\uB4DC\n const esbuildOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n const result = await esbuild.build(esbuildOptions);\n\n // Generate .config.json\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n\n // Generate production files (package.json, mise.toml, openssl.cnf, pm2.config.cjs)\n generateProductionFiles(info, external);\n\n const errors = result.errors.map((e) => e.text);\n return {\n success: result.errors.length === 0,\n mainJsPath,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n mainJsPath,\n errors: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\n/** startWatch \uD638\uCD9C \uC5EC\uBD80 \uD50C\uB798\uADF8 */\nlet isWatchStarted = false;\n\n/**\n * watch \uC2DC\uC791\n * @remarks \uC774 \uD568\uC218\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.\n * @throws \uC774\uBBF8 watch\uAC00 \uC2DC\uC791\uB41C \uACBD\uC6B0\n */\nasync function startWatch(info: ServerWatchInfo): Promise<void> {\n if (isWatchStarted) {\n throw new Error(\"startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n isWatchStarted = true;\n\n try {\n // tsconfig \uD30C\uC2F1\n const parsedConfig = parseRootTsconfig(info.cwd);\n const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);\n\n // \uC11C\uBC84\uB294 node \uD658\uACBD\n const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, \"node\", info.pkgDir);\n\n const mainJsPath = path.join(info.pkgDir, \"dist\", \"main.js\");\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\uB97C \uC704\uD55C Promise\n let resolveFirstBuild!: () => void;\n const firstBuildPromise = new Promise<void>((resolve) => {\n resolveFirstBuild = resolve;\n });\n\n let isFirstBuild = true;\n\n // \uBAA8\uB4E0 external \uC218\uC9D1 (optional peer deps + native modules + manual)\n const external = collectAllExternals(info.pkgDir, info.externals);\n\n // esbuild \uAE30\uBCF8 \uC635\uC158 \uC0DD\uC131\n const baseOptions = createServerEsbuildOptions({\n pkgDir: info.pkgDir,\n entryPoints,\n compilerOptions,\n env: info.env,\n external,\n });\n\n // watch\uC6A9 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\n esbuildContext = await esbuild.context({\n ...baseOptions,\n plugins: [\n {\n name: \"watch-notify\",\n setup(pluginBuild) {\n pluginBuild.onStart(() => {\n sender.send(\"buildStart\", {});\n });\n\n pluginBuild.onEnd((result) => {\n const errors = result.errors.map((e) => e.text);\n const success = result.errors.length === 0;\n\n // Generate .config.json on first successful build\n if (isFirstBuild && success) {\n const confDistPath = path.join(info.pkgDir, \"dist\", \".config.json\");\n fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));\n }\n\n sender.send(\"build\", { success, mainJsPath, errors: errors.length > 0 ? errors : undefined });\n\n if (isFirstBuild) {\n isFirstBuild = false;\n resolveFirstBuild();\n }\n });\n },\n },\n ],\n });\n\n await esbuildContext.watch();\n\n // \uCCAB \uBC88\uC9F8 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30\n await firstBuildPromise;\n } catch (err) {\n sender.send(\"error\", {\n message: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * watch \uC911\uC9C0\n * @remarks esbuild context\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.\n */\nasync function stopWatch(): Promise<void> {\n await cleanup();\n}\n\nconst sender = createWorker<\n { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },\n ServerWorkerEvents\n>({\n build,\n startWatch,\n stopWatch,\n});\n\nexport default sender;\n\n//#endregion\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
3
  "sideEffects": false,
4
- "version": "13.0.0-beta.38",
4
+ "version": "13.0.0-beta.44",
5
5
  "description": "심플리즘 패키지 - CLI 도구",
6
6
  "author": "김석래",
7
7
  "repository": {
@@ -42,9 +42,9 @@
42
42
  "vite-plugin-solid": "^2.11.10",
43
43
  "vite-tsconfig-paths": "^6.1.0",
44
44
  "yargs": "^18.0.0",
45
- "@simplysm/core-common": "13.0.0-beta.38",
46
- "@simplysm/core-node": "13.0.0-beta.38",
47
- "@simplysm/storage": "13.0.0-beta.38"
45
+ "@simplysm/core-common": "13.0.0-beta.44",
46
+ "@simplysm/core-node": "13.0.0-beta.44",
47
+ "@simplysm/storage": "13.0.0-beta.44"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/semver": "^7.7.1",
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/solid": "~13.0.0-beta.38",
7
+ "@simplysm/solid": "~13.0.0-beta.44",
8
8
  {{#if router}}
9
9
  "@solidjs/router": "^0.15.4",
10
10
  {{/if}}
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/core-common": "~13.0.0-beta.38",
8
- "@simplysm/service-server": "~13.0.0-beta.38"
7
+ "@simplysm/core-common": "~13.0.0-beta.44",
8
+ "@simplysm/service-server": "~13.0.0-beta.44"
9
9
  }
10
10
  }
@@ -15,9 +15,9 @@
15
15
  "vitest": "vitest"
16
16
  },
17
17
  "devDependencies": {
18
- "@simplysm/sd-cli": "~13.0.0-beta.38",
19
- "@simplysm/claude": "~13.0.0-beta.38",
20
- "@simplysm/eslint-plugin": "~13.0.0-beta.38",
18
+ "@simplysm/sd-cli": "~13.0.0-beta.44",
19
+ "@simplysm/claude": "~13.0.0-beta.44",
20
+ "@simplysm/eslint-plugin": "~13.0.0-beta.44",
21
21
  "@types/node": "^20.19.33",
22
22
  "eslint": "^9.39.2",
23
23
  "prettier": "^3.8.1",