@simplysm/sd-cli 13.0.68 → 13.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +10 -957
  2. package/dist/builders/BaseBuilder.d.ts +23 -23
  3. package/dist/builders/BaseBuilder.d.ts.map +1 -1
  4. package/dist/builders/BaseBuilder.js +15 -15
  5. package/dist/builders/DtsBuilder.d.ts +4 -4
  6. package/dist/builders/DtsBuilder.js +1 -1
  7. package/dist/builders/LibraryBuilder.d.ts +3 -3
  8. package/dist/builders/types.d.ts +10 -10
  9. package/dist/capacitor/capacitor.d.ts +36 -36
  10. package/dist/capacitor/capacitor.js +63 -63
  11. package/dist/capacitor/capacitor.js.map +1 -1
  12. package/dist/commands/add-client.d.ts +8 -8
  13. package/dist/commands/add-client.js +15 -15
  14. package/dist/commands/add-client.js.map +1 -1
  15. package/dist/commands/add-server.d.ts +9 -9
  16. package/dist/commands/add-server.js +13 -13
  17. package/dist/commands/add-server.js.map +1 -1
  18. package/dist/commands/build.d.ts +9 -9
  19. package/dist/commands/check.js +3 -3
  20. package/dist/commands/check.js.map +1 -1
  21. package/dist/commands/dev.d.ts +9 -9
  22. package/dist/commands/device.d.ts +9 -9
  23. package/dist/commands/device.d.ts.map +1 -1
  24. package/dist/commands/device.js +17 -17
  25. package/dist/commands/device.js.map +1 -1
  26. package/dist/commands/init.d.ts +6 -6
  27. package/dist/commands/init.js +12 -12
  28. package/dist/commands/init.js.map +1 -1
  29. package/dist/commands/lint.d.ts +23 -23
  30. package/dist/commands/lint.d.ts.map +1 -1
  31. package/dist/commands/lint.js +25 -25
  32. package/dist/commands/lint.js.map +1 -1
  33. package/dist/commands/publish.d.ts +13 -13
  34. package/dist/commands/publish.d.ts.map +1 -1
  35. package/dist/commands/publish.js +61 -61
  36. package/dist/commands/publish.js.map +1 -1
  37. package/dist/commands/replace-deps.d.ts +3 -3
  38. package/dist/commands/replace-deps.d.ts.map +1 -1
  39. package/dist/commands/replace-deps.js +1 -1
  40. package/dist/commands/replace-deps.js.map +1 -1
  41. package/dist/commands/typecheck.d.ts +20 -20
  42. package/dist/commands/typecheck.d.ts.map +1 -1
  43. package/dist/commands/typecheck.js +20 -20
  44. package/dist/commands/typecheck.js.map +1 -1
  45. package/dist/commands/watch.d.ts +7 -7
  46. package/dist/electron/electron.d.ts +27 -27
  47. package/dist/electron/electron.js +32 -32
  48. package/dist/electron/electron.js.map +1 -1
  49. package/dist/infra/ResultCollector.d.ts +9 -9
  50. package/dist/infra/ResultCollector.js +5 -5
  51. package/dist/infra/SignalHandler.d.ts +7 -7
  52. package/dist/infra/SignalHandler.js +4 -4
  53. package/dist/infra/WorkerManager.d.ts +14 -14
  54. package/dist/infra/WorkerManager.js +11 -11
  55. package/dist/orchestrators/BuildOrchestrator.d.ts +19 -19
  56. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  57. package/dist/orchestrators/BuildOrchestrator.js +26 -26
  58. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  59. package/dist/orchestrators/DevOrchestrator.d.ts +25 -25
  60. package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -1
  61. package/dist/orchestrators/DevOrchestrator.js +30 -30
  62. package/dist/orchestrators/DevOrchestrator.js.map +1 -1
  63. package/dist/orchestrators/WatchOrchestrator.d.ts +13 -13
  64. package/dist/orchestrators/WatchOrchestrator.js +17 -17
  65. package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
  66. package/dist/sd-cli-entry.d.ts +2 -2
  67. package/dist/sd-cli-entry.js +38 -38
  68. package/dist/sd-cli-entry.js.map +1 -1
  69. package/dist/sd-cli.d.ts +2 -2
  70. package/dist/sd-cli.js +1 -1
  71. package/dist/sd-cli.js.map +1 -1
  72. package/dist/sd-config.types.d.ts +84 -84
  73. package/dist/sd-config.types.d.ts.map +1 -1
  74. package/dist/utils/build-env.d.ts +1 -1
  75. package/dist/utils/config-editor.d.ts +5 -5
  76. package/dist/utils/config-editor.js +2 -2
  77. package/dist/utils/config-editor.js.map +1 -1
  78. package/dist/utils/copy-public.d.ts +9 -9
  79. package/dist/utils/copy-src.d.ts +9 -9
  80. package/dist/utils/esbuild-config.d.ts +30 -30
  81. package/dist/utils/esbuild-config.d.ts.map +1 -1
  82. package/dist/utils/output-utils.d.ts +6 -6
  83. package/dist/utils/package-utils.d.ts +6 -6
  84. package/dist/utils/package-utils.js +1 -1
  85. package/dist/utils/package-utils.js.map +1 -1
  86. package/dist/utils/rebuild-manager.js +3 -3
  87. package/dist/utils/rebuild-manager.js.map +1 -1
  88. package/dist/utils/replace-deps.d.ts +25 -25
  89. package/dist/utils/replace-deps.js +3 -3
  90. package/dist/utils/replace-deps.js.map +1 -1
  91. package/dist/utils/sd-config.d.ts +3 -3
  92. package/dist/utils/sd-config.js +3 -3
  93. package/dist/utils/sd-config.js.map +1 -1
  94. package/dist/utils/tailwind-config-deps.d.ts +3 -3
  95. package/dist/utils/template.d.ts +8 -8
  96. package/dist/utils/tsconfig.d.ts +16 -16
  97. package/dist/utils/tsconfig.js +2 -2
  98. package/dist/utils/tsconfig.js.map +1 -1
  99. package/dist/utils/typecheck-serialization.d.ts +8 -8
  100. package/dist/utils/vite-config.d.ts +8 -8
  101. package/dist/utils/vite-config.d.ts.map +1 -1
  102. package/dist/utils/vite-config.js +3 -3
  103. package/dist/utils/worker-events.d.ts +12 -12
  104. package/dist/utils/worker-events.d.ts.map +1 -1
  105. package/dist/utils/worker-utils.d.ts +3 -3
  106. package/dist/utils/worker-utils.js +2 -2
  107. package/dist/utils/worker-utils.js.map +1 -1
  108. package/dist/workers/client.worker.d.ts +14 -14
  109. package/dist/workers/client.worker.d.ts.map +1 -1
  110. package/dist/workers/client.worker.js +1 -1
  111. package/dist/workers/client.worker.js.map +1 -1
  112. package/dist/workers/dts.worker.d.ts +13 -13
  113. package/dist/workers/dts.worker.d.ts.map +1 -1
  114. package/dist/workers/dts.worker.js +3 -3
  115. package/dist/workers/dts.worker.js.map +1 -1
  116. package/dist/workers/library.worker.d.ts +12 -12
  117. package/dist/workers/library.worker.js +1 -1
  118. package/dist/workers/library.worker.js.map +1 -1
  119. package/dist/workers/lint.worker.d.ts +1 -1
  120. package/dist/workers/server-runtime.worker.d.ts +6 -6
  121. package/dist/workers/server-runtime.worker.js +6 -6
  122. package/dist/workers/server-runtime.worker.js.map +1 -1
  123. package/dist/workers/server.worker.d.ts +20 -20
  124. package/dist/workers/server.worker.d.ts.map +1 -1
  125. package/dist/workers/server.worker.js +6 -6
  126. package/dist/workers/server.worker.js.map +1 -1
  127. package/package.json +8 -7
  128. package/src/builders/BaseBuilder.ts +33 -33
  129. package/src/builders/DtsBuilder.ts +5 -5
  130. package/src/builders/LibraryBuilder.ts +9 -9
  131. package/src/builders/types.ts +10 -10
  132. package/src/capacitor/capacitor.ts +119 -119
  133. package/src/commands/add-client.ts +31 -31
  134. package/src/commands/add-server.ts +34 -34
  135. package/src/commands/build.ts +9 -9
  136. package/src/commands/check.ts +5 -5
  137. package/src/commands/dev.ts +9 -9
  138. package/src/commands/device.ts +30 -30
  139. package/src/commands/init.ts +25 -25
  140. package/src/commands/lint.ts +64 -64
  141. package/src/commands/publish.ts +139 -139
  142. package/src/commands/replace-deps.ts +4 -4
  143. package/src/commands/typecheck.ts +74 -74
  144. package/src/commands/watch.ts +7 -7
  145. package/src/electron/electron.ts +51 -51
  146. package/src/infra/ResultCollector.ts +9 -9
  147. package/src/infra/SignalHandler.ts +7 -7
  148. package/src/infra/WorkerManager.ts +14 -14
  149. package/src/orchestrators/BuildOrchestrator.ts +76 -76
  150. package/src/orchestrators/DevOrchestrator.ts +88 -88
  151. package/src/orchestrators/WatchOrchestrator.ts +39 -39
  152. package/src/sd-cli-entry.ts +43 -43
  153. package/src/sd-cli.ts +15 -15
  154. package/src/sd-config.types.ts +85 -85
  155. package/src/utils/build-env.ts +1 -1
  156. package/src/utils/config-editor.ts +19 -19
  157. package/src/utils/copy-public.ts +17 -17
  158. package/src/utils/copy-src.ts +11 -11
  159. package/src/utils/esbuild-config.ts +33 -33
  160. package/src/utils/output-utils.ts +11 -11
  161. package/src/utils/package-utils.ts +12 -12
  162. package/src/utils/rebuild-manager.ts +3 -3
  163. package/src/utils/replace-deps.ts +361 -361
  164. package/src/utils/sd-config.ts +44 -44
  165. package/src/utils/tailwind-config-deps.ts +98 -98
  166. package/src/utils/template.ts +56 -56
  167. package/src/utils/tsconfig.ts +127 -127
  168. package/src/utils/typecheck-serialization.ts +86 -86
  169. package/src/utils/vite-config.ts +341 -341
  170. package/src/utils/worker-events.ts +16 -16
  171. package/src/utils/worker-utils.ts +45 -45
  172. package/src/workers/client.worker.ts +34 -34
  173. package/src/workers/dts.worker.ts +467 -467
  174. package/src/workers/library.worker.ts +314 -314
  175. package/src/workers/lint.worker.ts +16 -16
  176. package/src/workers/server-runtime.worker.ts +157 -157
  177. package/src/workers/server.worker.ts +572 -572
  178. package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
  179. package/templates/add-server/__SERVER__/package.json.hbs +2 -2
  180. package/templates/init/package.json.hbs +3 -3
  181. package/tests/config-editor.spec.ts +160 -0
  182. package/tests/copy-src.spec.ts +50 -0
  183. package/tests/get-compiler-options-for-package.spec.ts +139 -0
  184. package/tests/get-package-source-files.spec.ts +181 -0
  185. package/tests/get-types-from-package-json.spec.ts +107 -0
  186. package/tests/infra/ResultCollector.spec.ts +39 -0
  187. package/tests/infra/SignalHandler.spec.ts +38 -0
  188. package/tests/infra/WorkerManager.spec.ts +97 -0
  189. package/tests/load-ignore-patterns.spec.ts +188 -0
  190. package/tests/load-sd-config.spec.ts +137 -0
  191. package/tests/package-utils.spec.ts +188 -0
  192. package/tests/parse-root-tsconfig.spec.ts +89 -0
  193. package/tests/replace-deps.spec.ts +308 -0
  194. package/tests/run-lint.spec.ts +415 -0
  195. package/tests/run-typecheck.spec.ts +653 -0
  196. package/tests/run-watch.spec.ts +75 -0
  197. package/tests/sd-cli.spec.ts +330 -0
  198. package/tests/tailwind-config-deps.spec.ts +30 -0
  199. package/tests/template.spec.ts +70 -0
  200. package/tests/utils/rebuild-manager.spec.ts +43 -0
  201. package/tests/write-changed-output-files.spec.ts +97 -0
@@ -39,7 +39,7 @@ async function loadIgnorePatterns(cwd) {
39
39
  }
40
40
  if (configPath == null) {
41
41
  throw new SdError(
42
- `ESLint \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 (cwd: ${cwd}): ${ESLINT_CONFIG_FILES.join(", ")}`
42
+ `Cannot find ESLint config file (cwd: ${cwd}): ${ESLINT_CONFIG_FILES.join(", ")}`
43
43
  );
44
44
  }
45
45
  const jiti = createJiti(import.meta.url);
@@ -52,10 +52,10 @@ async function loadIgnorePatterns(cwd) {
52
52
  } else if (configModule != null && typeof configModule === "object" && "default" in configModule) {
53
53
  configs = configModule.default;
54
54
  } else {
55
- throw new SdError(`ESLint \uC124\uC815 \uD30C\uC77C\uC774 \uC62C\uBC14\uB978 \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${configPath}`);
55
+ throw new SdError(`ESLint config file is not in correct format: ${configPath}`);
56
56
  }
57
57
  if (!Array.isArray(configs)) {
58
- throw new SdError(`ESLint \uC124\uC815\uC774 \uBC30\uC5F4\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${configPath}`);
58
+ throw new SdError(`ESLint config is not an array: ${configPath}`);
59
59
  }
60
60
  return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);
61
61
  }
@@ -69,15 +69,15 @@ async function executeLint(options) {
69
69
  const { targets, fix, timing } = options;
70
70
  const cwd = process.cwd();
71
71
  const logger = consola.withTag("sd:cli:lint");
72
- logger.debug("\uB9B0\uD2B8 \uC2DC\uC791", { targets, fix, timing });
72
+ logger.debug("start lint", { targets, fix, timing });
73
73
  if (timing) {
74
74
  process.env["TIMING"] = "1";
75
75
  }
76
- logger.start("ESLint \uC124\uC815 \uB85C\uB4DC");
76
+ logger.start("loading ESLint config");
77
77
  const ignorePatterns = await loadIgnorePatterns(cwd);
78
- logger.debug("ignore \uD328\uD134 \uB85C\uB4DC \uC644\uB8CC", { ignorePatternCount: ignorePatterns.length });
79
- logger.success(`ESLint \uC124\uC815 \uB85C\uB4DC (${ignorePatterns.length}\uAC1C ignore \uD328\uD134)`);
80
- logger.start("\uB9B0\uD2B8 \uB300\uC0C1 \uD30C\uC77C \uC218\uC9D1");
78
+ logger.debug("ignore patterns loaded", { ignorePatternCount: ignorePatterns.length });
79
+ logger.success(`loaded ESLint config (${ignorePatterns.length} ignore patterns)`);
80
+ logger.start("collecting lint target files");
81
81
  let files = await fsGlob("**/*.{ts,tsx,js,jsx}", {
82
82
  cwd,
83
83
  ignore: ignorePatterns,
@@ -85,12 +85,12 @@ async function executeLint(options) {
85
85
  absolute: true
86
86
  });
87
87
  files = pathFilterByTargets(files, targets, cwd);
88
- logger.debug("\uD30C\uC77C \uC218\uC9D1 \uC644\uB8CC", { fileCount: files.length });
89
- logger.success(`\uB9B0\uD2B8 \uB300\uC0C1 \uD30C\uC77C \uC218\uC9D1 (${files.length}\uAC1C)`);
88
+ logger.debug("file collection complete", { fileCount: files.length });
89
+ logger.success(`collected lint target files (${files.length} files)`);
90
90
  let eslint;
91
91
  let eslintResults;
92
92
  if (files.length > 0) {
93
- logger.start(`\uB9B0\uD2B8 \uC2E4\uD589 \uC911... (${files.length}\uAC1C \uD30C\uC77C)`);
93
+ logger.start(`running lint... (${files.length} files)`);
94
94
  eslint = new ESLint({
95
95
  cwd,
96
96
  fix,
@@ -98,17 +98,17 @@ async function executeLint(options) {
98
98
  cacheLocation: path.join(cwd, ".cache", "eslint.cache")
99
99
  });
100
100
  eslintResults = await eslint.lintFiles(files);
101
- logger.success("\uB9B0\uD2B8 \uC2E4\uD589 \uC644\uB8CC");
101
+ logger.success("lint complete");
102
102
  if (fix) {
103
- logger.debug("\uC790\uB3D9 \uC218\uC815 \uC801\uC6A9 \uC911...");
103
+ logger.debug("applying auto-fix...");
104
104
  await ESLint.outputFixes(eslintResults);
105
- logger.debug("\uC790\uB3D9 \uC218\uC815 \uC801\uC6A9 \uC644\uB8CC");
105
+ logger.debug("auto-fix applied");
106
106
  }
107
107
  }
108
108
  const hasStylelintCfg = await hasStylelintConfig(cwd);
109
109
  let stylelintResult;
110
110
  if (hasStylelintCfg) {
111
- logger.start("CSS \uD30C\uC77C \uC218\uC9D1");
111
+ logger.start("collecting CSS files");
112
112
  let cssFiles = await fsGlob("**/*.css", {
113
113
  cwd,
114
114
  ignore: ignorePatterns,
@@ -116,9 +116,9 @@ async function executeLint(options) {
116
116
  absolute: true
117
117
  });
118
118
  cssFiles = pathFilterByTargets(cssFiles, targets, cwd);
119
- logger.success(`CSS \uD30C\uC77C \uC218\uC9D1 (${cssFiles.length}\uAC1C)`);
119
+ logger.success(`collected CSS files (${cssFiles.length} files)`);
120
120
  if (cssFiles.length > 0) {
121
- logger.start(`Stylelint \uC2E4\uD589 \uC911... (${cssFiles.length}\uAC1C \uD30C\uC77C)`);
121
+ logger.start(`running Stylelint... (${cssFiles.length} files)`);
122
122
  let configFile;
123
123
  for (const f of STYLELINT_CONFIG_FILES) {
124
124
  const configPath = path.join(cwd, f);
@@ -150,21 +150,21 @@ async function executeLint(options) {
150
150
  };
151
151
  }
152
152
  stylelintResult = await stylelint.lint(stylelintOptions);
153
- logger.success("Stylelint \uC2E4\uD589 \uC644\uB8CC");
153
+ logger.success("Stylelint execution complete");
154
154
  }
155
155
  }
156
156
  if (files.length === 0 || eslintResults == null || eslint == null) {
157
- logger.info("\uB9B0\uD2B8\uD560 \uD30C\uC77C \uC5C6\uC74C");
157
+ logger.info("no files to lint");
158
158
  return { success: true, errorCount: 0, warningCount: 0, formattedOutput: "" };
159
159
  }
160
160
  let errorCount = eslintResults.sum((r) => r.errorCount);
161
161
  let warningCount = eslintResults.sum((r) => r.warningCount);
162
162
  if (errorCount > 0) {
163
- logger.error("\uB9B0\uD2B8 \uC5D0\uB7EC \uBC1C\uC0DD", { errorCount, warningCount });
163
+ logger.error("lint errors occurred", { errorCount, warningCount });
164
164
  } else if (warningCount > 0) {
165
- logger.info("\uB9B0\uD2B8 \uC644\uB8CC (\uACBD\uACE0 \uC788\uC74C)", { errorCount, warningCount });
165
+ logger.info("lint complete (warnings present)", { errorCount, warningCount });
166
166
  } else {
167
- logger.info("\uB9B0\uD2B8 \uC644\uB8CC", { errorCount, warningCount });
167
+ logger.info("lint complete", { errorCount, warningCount });
168
168
  }
169
169
  let formattedOutput = "";
170
170
  const formatter = await eslint.loadFormatter("stylish");
@@ -182,17 +182,17 @@ async function executeLint(options) {
182
182
  errorCount += stylelintErrorCount;
183
183
  warningCount += stylelintWarningCount;
184
184
  if (stylelintErrorCount > 0) {
185
- logger.error("Stylelint \uC5D0\uB7EC \uBC1C\uC0DD", {
185
+ logger.error("Stylelint errors occurred", {
186
186
  errorCount: stylelintErrorCount,
187
187
  warningCount: stylelintWarningCount
188
188
  });
189
189
  } else if (stylelintWarningCount > 0) {
190
- logger.info("Stylelint \uC644\uB8CC (\uACBD\uACE0 \uC788\uC74C)", {
190
+ logger.info("Stylelint complete (warnings present)", {
191
191
  errorCount: stylelintErrorCount,
192
192
  warningCount: stylelintWarningCount
193
193
  });
194
194
  } else {
195
- logger.info("Stylelint \uC644\uB8CC", {
195
+ logger.info("Stylelint complete", {
196
196
  errorCount: stylelintErrorCount,
197
197
  warningCount: stylelintWarningCount
198
198
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/lint.ts"],
4
- "mappings": "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",
4
+ "mappings": "AAAA,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,UAAU,QAAQ,2BAA2B;AACtD,OAAO;AACP,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,OAAO,eAAe;AAmCtB,MAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,sBAAsB,MAA8C;AAC3E,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAAU,QAAO;AACrD,MAAI,EAAE,aAAa,MAAO,QAAO;AACjC,MAAI,WAAW,KAAM,QAAO;AAC5B,QAAM,UAAW,KAA8B;AAC/C,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QAAQ,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ;AACnD;AAOA,eAAsB,mBAAmB,KAAgC;AACvE,MAAI;AACJ,aAAW,KAAK,qBAAqB;AACnC,UAAM,IAAI,KAAK,KAAK,KAAK,CAAC;AAC1B,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI;AAAA,MACR,wCAAwC,GAAG,MAAM,oBAAoB,KAAK,IAAI,CAAC;AAAA,IACjF;AAAA,EACF;AAEA,QAAM,OAAO,WAAW,YAAY,GAAG;AACvC,QAAM,eAAe,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,MAAM,QAAQ,YAAY,GAAG;AAC/B,cAAU;AAAA,EACZ,WACE,gBAAgB,QAChB,OAAO,iBAAiB,YACxB,aAAa,cACb;AACA,cAAU,aAAa;AAAA,EACzB,OAAO;AACL,UAAM,IAAI,QAAQ,gDAAgD,UAAU,EAAE;AAAA,EAChF;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,UAAM,IAAI,QAAQ,kCAAkC,UAAU,EAAE;AAAA,EAClE;AAEA,SAAO,QAAQ,OAAO,qBAAqB,EAAE,QAAQ,CAAC,SAAS,KAAK,OAAO;AAC7E;AAKA,eAAe,mBAAmB,KAA+B;AAC/D,aAAW,KAAK,wBAAwB;AACtC,QAAI,MAAM,SAAS,KAAK,KAAK,KAAK,CAAC,CAAC,EAAG,QAAO;AAAA,EAChD;AACA,SAAO;AACT;AAiBA,eAAsB,YAAY,SAA2C;AAC3E,QAAM,EAAE,SAAS,KAAK,OAAO,IAAI;AACjC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAE5C,SAAO,MAAM,cAAc,EAAE,SAAS,KAAK,OAAO,CAAC;AAGnD,MAAI,QAAQ;AACV,YAAQ,IAAI,QAAQ,IAAI;AAAA,EAC1B;AAGA,SAAO,MAAM,uBAAuB;AACpC,QAAM,iBAAiB,MAAM,mBAAmB,GAAG;AACnD,SAAO,MAAM,0BAA0B,EAAE,oBAAoB,eAAe,OAAO,CAAC;AACpF,SAAO,QAAQ,yBAAyB,eAAe,MAAM,mBAAmB;AAGhF,SAAO,MAAM,8BAA8B;AAC3C,MAAI,QAAQ,MAAM,OAAO,wBAAwB;AAAA,IAC/C;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AACD,UAAQ,oBAAoB,OAAO,SAAS,GAAG;AAC/C,SAAO,MAAM,4BAA4B,EAAE,WAAW,MAAM,OAAO,CAAC;AACpE,SAAO,QAAQ,gCAAgC,MAAM,MAAM,SAAS;AAGpE,MAAI;AACJ,MAAI;AACJ,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,MAAM,oBAAoB,MAAM,MAAM,SAAS;AACtD,aAAS,IAAI,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,eAAe,KAAK,KAAK,KAAK,UAAU,cAAc;AAAA,IACxD,CAAC;AACD,oBAAgB,MAAM,OAAO,UAAU,KAAK;AAC5C,WAAO,QAAQ,eAAe;AAG9B,QAAI,KAAK;AACP,aAAO,MAAM,sBAAsB;AACnC,YAAM,OAAO,YAAY,aAAa;AACtC,aAAO,MAAM,kBAAkB;AAAA,IACjC;AAAA,EACF;AAGA,QAAM,kBAAkB,MAAM,mBAAmB,GAAG;AACpD,MAAI;AACJ,MAAI,iBAAiB;AACnB,WAAO,MAAM,sBAAsB;AACnC,QAAI,WAAW,MAAM,OAAO,YAAY;AAAA,MACtC;AAAA,MACA,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AACD,eAAW,oBAAoB,UAAU,SAAS,GAAG;AACrD,WAAO,QAAQ,wBAAwB,SAAS,MAAM,SAAS;AAE/D,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,MAAM,yBAAyB,SAAS,MAAM,SAAS;AAC9D,UAAI;AACJ,iBAAW,KAAK,wBAAwB;AACtC,cAAM,aAAa,KAAK,KAAK,KAAK,CAAC;AACnC,YAAI,MAAM,SAAS,UAAU,GAAG;AAC9B,uBAAa;AACb;AAAA,QACF;AAAA,MACF;AAGA,UAAI;AACJ,UAAI,cAAc,QAAQ,QAAQ,KAAK,UAAU,GAAG;AAClD,cAAM,OAAO,WAAW,YAAY,GAAG;AACvC,cAAM,eAAe,MAAM,KAAK,OAAsC,UAAU;AAChF,cAAM,SAAS,aAAa;AAC5B,2BAAmB;AAAA,UACjB,OAAO;AAAA,UACP;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA,OAAO;AAAA,UACP,eAAe,KAAK,KAAK,KAAK,UAAU,iBAAiB;AAAA,QAC3D;AAAA,MACF,OAAO;AACL,2BAAmB;AAAA,UACjB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,eAAe,KAAK,KAAK,KAAK,UAAU,iBAAiB;AAAA,QAC3D;AAAA,MACF;AACA,wBAAkB,MAAM,UAAU,KAAK,gBAAgB;AACvD,aAAO,QAAQ,8BAA8B;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,MAAM,WAAW,KAAK,iBAAiB,QAAQ,UAAU,MAAM;AACjE,WAAO,KAAK,kBAAkB;AAC9B,WAAO,EAAE,SAAS,MAAM,YAAY,GAAG,cAAc,GAAG,iBAAiB,GAAG;AAAA,EAC9E;AAGA,MAAI,aAAa,cAAc,IAAI,CAAC,MAAM,EAAE,UAAU;AACtD,MAAI,eAAe,cAAc,IAAI,CAAC,MAAM,EAAE,YAAY;AAE1D,MAAI,aAAa,GAAG;AAClB,WAAO,MAAM,wBAAwB,EAAE,YAAY,aAAa,CAAC;AAAA,EACnE,WAAW,eAAe,GAAG;AAC3B,WAAO,KAAK,oCAAoC,EAAE,YAAY,aAAa,CAAC;AAAA,EAC9E,OAAO;AACL,WAAO,KAAK,iBAAiB,EAAE,YAAY,aAAa,CAAC;AAAA,EAC3D;AAGA,MAAI,kBAAkB;AACtB,QAAM,YAAY,MAAM,OAAO,cAAc,SAAS;AACtD,QAAM,aAAa,MAAM,UAAU,OAAO,aAAa;AACvD,MAAI,YAAY;AACd,uBAAmB;AAAA,EACrB;AAGA,MAAI,mBAAmB,QAAQ,gBAAgB,QAAQ,SAAS,GAAG;AACjE,UAAM,sBAAsB,gBAAgB,QAAQ;AAAA,MAClD,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AAAA,IAC1D;AACA,UAAM,wBAAwB,gBAAgB,QAAQ;AAAA,MACpD,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EAAE;AAAA,IAC5D;AAEA,kBAAc;AACd,oBAAgB;AAEhB,QAAI,sBAAsB,GAAG;AAC3B,aAAO,MAAM,6BAA6B;AAAA,QACxC,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,WAAW,wBAAwB,GAAG;AACpC,aAAO,KAAK,yCAAyC;AAAA,QACnD,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK,sBAAsB;AAAA,QAChC,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAGA,UAAM,qBAAqB,MAAM,UAAU,WAAW;AACtD,UAAM,kBAAkB,mBAAmB,gBAAgB,SAAS,eAAe;AACnF,QAAI,iBAAiB;AACnB,yBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,eAAe;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAUA,eAAsB,QAAQ,SAAqC;AACjE,QAAM,SAAS,MAAM,YAAY,OAAO;AACxC,MAAI,OAAO,iBAAiB;AAC1B,YAAQ,OAAO,MAAM,OAAO,eAAe;AAAA,EAC7C;AACA,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,WAAW;AAAA,EACrB;AACF;",
5
5
  "names": []
6
6
  }
@@ -1,27 +1,27 @@
1
1
  import "@simplysm/core-common";
2
2
  /**
3
- * Publish 명령 옵션
3
+ * Publish command options
4
4
  */
5
5
  export interface PublishOptions {
6
- /** 배포할 패키지 필터 ( 배열이면 publish 설정이 있는 모든 패키지) */
6
+ /** Filter for packages to deploy (empty array deploys all packages with publish config) */
7
7
  targets: string[];
8
- /** 빌드 없이 배포 (위험) */
8
+ /** Deploy without building (dangerous) */
9
9
  noBuild: boolean;
10
- /** 실제 배포 없이 시뮬레이션 */
10
+ /** Simulate deployment without actually deploying */
11
11
  dryRun: boolean;
12
- /** sd.config.ts 전달할 추가 옵션 */
12
+ /** Additional options to pass to sd.config.ts */
13
13
  options: string[];
14
14
  }
15
15
  /**
16
- * publish 명령을 실행한다.
16
+ * Execute publish command.
17
17
  *
18
- * **배포 순서 (안전성 우선):**
19
- * 1. 사전 검증 (npm 인증, Git 상태)
20
- * 2. 버전 업그레이드 (package.json + 템플릿)
21
- * 3. 빌드
22
- * 4. Git 커밋/태그/푸시 (변경된 파일만 명시적으로 staging)
23
- * 5. pnpm 배포
24
- * 6. postPublish (실패해도 계속)
18
+ * **Deployment order (safety first):**
19
+ * 1. Pre-validation (npm auth, Git status)
20
+ * 2. Version upgrade (package.json + templates)
21
+ * 3. Build
22
+ * 4. Git commit/tag/push (explicitly stage only changed files)
23
+ * 5. pnpm deployment
24
+ * 6. postPublish (continue even if it fails)
25
25
  */
26
26
  export declare function runPublish(options: PublishOptions): Promise<void>;
27
27
  //# sourceMappingURL=publish.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\publish.ts"],"names":[],"mappings":"AAMA,OAAO,uBAAuB,CAAC;AAe/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;AA2aD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyWvE"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\publish.ts"],"names":[],"mappings":"AAMA,OAAO,uBAAuB,CAAC;AAe/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2FAA2F;IAC3F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,MAAM,EAAE,OAAO,CAAC;IAChB,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA2aD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyWvE"}
@@ -25,7 +25,7 @@ function replaceEnvVariables(str, version, projectPath) {
25
25
  return env[envName] ?? match;
26
26
  });
27
27
  if (/%[^%]+%/.test(result)) {
28
- throw new Error(`\uD658\uACBD\uBCC0\uC218 \uCE58\uD658 \uC2E4\uD328: ${str} \u2192 ${result}`);
28
+ throw new Error(`Environment variable substitution failed: ${str} \u2192 ${result}`);
29
29
  }
30
30
  return result;
31
31
  }
@@ -51,7 +51,7 @@ async function ensureSshAuth(publishPackages, logger) {
51
51
  if (pkg.config.type !== "sftp") continue;
52
52
  if (pkg.config.pass != null) continue;
53
53
  if (pkg.config.user == null) {
54
- throw new Error(`[${pkg.name}] SFTP \uC124\uC815\uC5D0 user\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`);
54
+ throw new Error(`[${pkg.name}] SFTP config missing user.`);
55
55
  }
56
56
  const key = `${pkg.config.user}@${pkg.config.host}`;
57
57
  sshTargets.set(key, {
@@ -65,14 +65,14 @@ async function ensureSshAuth(publishPackages, logger) {
65
65
  const keyPath = path.join(sshDir, "id_ed25519");
66
66
  const pubKeyPath = path.join(sshDir, "id_ed25519.pub");
67
67
  if (!fs.existsSync(keyPath)) {
68
- logger.info("SSH \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC0DD\uC131\uD569\uB2C8\uB2E4...");
68
+ logger.info("SSH key not found. Creating one...");
69
69
  if (!fs.existsSync(sshDir)) {
70
70
  fs.mkdirSync(sshDir, { mode: 448 });
71
71
  }
72
72
  const keyPair = utils.generateKeyPairSync("ed25519");
73
73
  fs.writeFileSync(keyPath, keyPair.private, { mode: 384 });
74
74
  fs.writeFileSync(pubKeyPath, keyPair.public + "\n", { mode: 420 });
75
- logger.info(`SSH \uD0A4 \uC0DD\uC131 \uC644\uB8CC: ${keyPath}`);
75
+ logger.info(`SSH key created: ${keyPath}`);
76
76
  }
77
77
  const privateKeyData = fs.readFileSync(keyPath);
78
78
  const publicKey = fs.readFileSync(pubKeyPath, "utf-8").trim();
@@ -85,15 +85,15 @@ async function ensureSshAuth(publishPackages, logger) {
85
85
  agent: sshAgent
86
86
  });
87
87
  if (canAuth) {
88
- logger.debug(`SSH \uD0A4 \uC778\uC99D \uD655\uC778: ${label}`);
88
+ logger.debug(`SSH key authentication verified: ${label}`);
89
89
  continue;
90
90
  }
91
- logger.info(`${label}: SSH \uD0A4\uAC00 \uC11C\uBC84\uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`);
91
+ logger.info(`${label}: SSH key not registered on server.`);
92
92
  const pass = await passwordPrompt({
93
- message: `${label} \uBE44\uBC00\uBC88\uD638 (\uACF5\uAC1C\uD0A4 \uB4F1\uB85D\uC6A9):`
93
+ message: `${label} password (to register public key):`
94
94
  });
95
95
  await registerSshPublicKey(target, pass, publicKey);
96
- logger.info(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC644\uB8CC: ${label}`);
96
+ logger.info(`SSH public key registered: ${label}`);
97
97
  }
98
98
  }
99
99
  function testSshKeyAuth(target, auth) {
@@ -133,7 +133,7 @@ function registerSshPublicKey(target, pass, publicKey) {
133
133
  conn.exec(cmd, (err, stream) => {
134
134
  if (err) {
135
135
  conn.end();
136
- reject(new Error(`SSH \uBA85\uB839 \uC2E4\uD589 \uC2E4\uD328: ${err.message}`));
136
+ reject(new Error(`Failed to execute SSH command: ${err.message}`));
137
137
  return;
138
138
  }
139
139
  let stderr = "";
@@ -145,7 +145,7 @@ function registerSshPublicKey(target, pass, publicKey) {
145
145
  stream.on("exit", (code) => {
146
146
  conn.end();
147
147
  if (code !== 0) {
148
- reject(new Error(`SSH \uACF5\uAC1C\uD0A4 \uB4F1\uB85D \uC2E4\uD328 (exit code: ${code}): ${stderr}`));
148
+ reject(new Error(`Failed to register SSH public key (exit code: ${code}): ${stderr}`));
149
149
  } else {
150
150
  resolve();
151
151
  }
@@ -153,7 +153,7 @@ function registerSshPublicKey(target, pass, publicKey) {
153
153
  });
154
154
  });
155
155
  conn.on("error", (err) => {
156
- reject(new Error(`SSH \uC811\uC18D \uC2E4\uD328 (${target.host}): ${err.message}`));
156
+ reject(new Error(`SSH connection failed (${target.host}): ${err.message}`));
157
157
  });
158
158
  conn.connect({
159
159
  host: target.host,
@@ -215,9 +215,9 @@ async function publishPackage(pkgPath, publishConfig, version, projectPath, logg
215
215
  const targetPath = replaceEnvVariables(publishConfig.path, version, projectPath);
216
216
  const distPath = path.resolve(pkgPath, "dist");
217
217
  if (dryRun) {
218
- logger.info(`[DRY-RUN] [${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);
218
+ logger.info(`[DRY-RUN] [${pkgName}] copy to local: ${distPath} \u2192 ${targetPath}`);
219
219
  } else {
220
- logger.debug(`[${pkgName}] \uB85C\uCEEC \uBCF5\uC0AC: ${distPath} \u2192 ${targetPath}`);
220
+ logger.debug(`[${pkgName}] copy to local: ${distPath} \u2192 ${targetPath}`);
221
221
  await fsCopy(distPath, targetPath);
222
222
  }
223
223
  } else {
@@ -225,10 +225,10 @@ async function publishPackage(pkgPath, publishConfig, version, projectPath, logg
225
225
  const remotePath = publishConfig.path ?? "/";
226
226
  if (dryRun) {
227
227
  logger.info(
228
- `[DRY-RUN] [${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`
228
+ `[DRY-RUN] [${pkgName}] ${publishConfig.type} upload: ${distPath} \u2192 ${remotePath}`
229
229
  );
230
230
  } else {
231
- logger.debug(`[${pkgName}] ${publishConfig.type} \uC5C5\uB85C\uB4DC: ${distPath} \u2192 ${remotePath}`);
231
+ logger.debug(`[${pkgName}] ${publishConfig.type} upload: ${distPath} \u2192 ${remotePath}`);
232
232
  await StorageFactory.connect(
233
233
  publishConfig.type,
234
234
  {
@@ -291,15 +291,15 @@ async function runPublish(options) {
291
291
  const cwd = process.cwd();
292
292
  const logger = consola.withTag("sd:cli:publish");
293
293
  if (dryRun) {
294
- logger.info("[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uBAA8\uB4DC - \uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC74C");
294
+ logger.info("[DRY-RUN] Simulation mode - no actual deployment");
295
295
  }
296
- logger.debug("\uBC30\uD3EC \uC2DC\uC791", { targets, noBuild, dryRun });
296
+ logger.debug("publish start", { targets, noBuild, dryRun });
297
297
  let sdConfig;
298
298
  try {
299
299
  sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });
300
- logger.debug("sd.config.ts \uB85C\uB4DC \uC644\uB8CC");
300
+ logger.debug("sd.config.ts loaded");
301
301
  } catch (err) {
302
- logger.error(`sd.config.ts \uB85C\uB4DC \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);
302
+ logger.error(`Failed to load sd.config.ts: ${err instanceof Error ? err.message : err}`);
303
303
  process.exitCode = 1;
304
304
  return;
305
305
  }
@@ -321,7 +321,7 @@ async function runPublish(options) {
321
321
  if (targets.length > 0 && !targets.includes(name)) continue;
322
322
  const pkgPath = allPkgPaths.find((p) => path.basename(p) === name);
323
323
  if (pkgPath == null) {
324
- logger.warn(`\uD328\uD0A4\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${name}`);
324
+ logger.warn(`Package not found: ${name}`);
325
325
  continue;
326
326
  }
327
327
  publishPackages.push({
@@ -331,24 +331,24 @@ async function runPublish(options) {
331
331
  });
332
332
  }
333
333
  if (publishPackages.length === 0) {
334
- process.stdout.write("\u2714 \uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\n");
334
+ process.stdout.write("\u2714 No packages to deploy.\n");
335
335
  return;
336
336
  }
337
337
  logger.debug(
338
- "\uBC30\uD3EC \uB300\uC0C1 \uD328\uD0A4\uC9C0",
338
+ "Target packages to deploy",
339
339
  publishPackages.map((p) => p.name)
340
340
  );
341
341
  const hasGit = await fsExists(path.resolve(cwd, ".git"));
342
342
  if (publishPackages.some((p) => p.config === "npm")) {
343
- logger.debug("npm \uC778\uC99D \uD655\uC778...");
343
+ logger.debug("Verifying npm authentication...");
344
344
  try {
345
345
  const { stdout: whoami } = await execa("npm", ["whoami"]);
346
346
  if (whoami.trim() === "") {
347
- throw new Error("npm \uB85C\uADF8\uC778 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.");
347
+ throw new Error("npm login information not found.");
348
348
  }
349
- logger.debug(`npm \uB85C\uADF8\uC778 \uD655\uC778: ${whoami.trim()}`);
349
+ logger.debug(`npm login verified: ${whoami.trim()}`);
350
350
  } catch (err) {
351
- logger.error(`npm whoami \uC2E4\uD328:`, err);
351
+ logger.error(`npm whoami failed:`, err);
352
352
  process.exitCode = 1;
353
353
  return;
354
354
  }
@@ -356,17 +356,17 @@ async function runPublish(options) {
356
356
  try {
357
357
  await ensureSshAuth(publishPackages, logger);
358
358
  } catch (err) {
359
- logger.error(`SSH \uC778\uC99D \uC124\uC815 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);
359
+ logger.error(`Failed to setup SSH authentication: ${err instanceof Error ? err.message : err}`);
360
360
  process.exitCode = 1;
361
361
  return;
362
362
  }
363
363
  if (!noBuild && hasGit) {
364
- logger.debug("Git \uCEE4\uBC0B \uC5EC\uBD80 \uD655\uC778...");
364
+ logger.debug("Checking git commit status...");
365
365
  try {
366
366
  const { stdout: diff } = await execa("git", ["diff", "--name-only"]);
367
367
  const { stdout: stagedDiff } = await execa("git", ["diff", "--cached", "--name-only"]);
368
368
  if (diff.trim() !== "" || stagedDiff.trim() !== "") {
369
- logger.info("\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D \uAC10\uC9C0. claude \uC790\uB3D9 \uCEE4\uBC0B \uC2DC\uB3C4...");
369
+ logger.info("Uncommitted changes detected. Attempting auto-commit with claude...");
370
370
  try {
371
371
  await execa("claude", [
372
372
  "-p",
@@ -377,17 +377,17 @@ async function runPublish(options) {
377
377
  ]);
378
378
  } catch (e) {
379
379
  throw new Error(
380
- "\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))
380
+ "Auto-commit failed. Please commit manually and try again.\n" + (e instanceof Error ? e.message : String(e))
381
381
  );
382
382
  }
383
383
  const { stdout: recheckDiff } = await execa("git", ["diff", "--name-only"]);
384
384
  const { stdout: recheckStaged } = await execa("git", ["diff", "--cached", "--name-only"]);
385
385
  if (recheckDiff.trim() !== "" || recheckStaged.trim() !== "") {
386
386
  throw new Error(
387
- "\uC790\uB3D9 \uCEE4\uBC0B \uD6C4\uC5D0\uB3C4 \uBBF8\uCEE4\uBC0B \uBCC0\uACBD\uC0AC\uD56D\uC774 \uB0A8\uC544\uC788\uC2B5\uB2C8\uB2E4.\n" + recheckDiff + recheckStaged
387
+ "Uncommitted changes still remain after auto-commit.\n" + recheckDiff + recheckStaged
388
388
  );
389
389
  }
390
- logger.info("\uC790\uB3D9 \uCEE4\uBC0B \uC644\uB8CC.");
390
+ logger.info("Auto-commit completed.");
391
391
  }
392
392
  } catch (err) {
393
393
  logger.error(err instanceof Error ? err.message : err);
@@ -397,22 +397,22 @@ async function runPublish(options) {
397
397
  }
398
398
  let version = projPkg.version;
399
399
  if (noBuild) {
400
- logger.warn("\uBE4C\uB4DC\uD558\uC9C0 \uC54A\uACE0 \uBC30\uD3EC\uD558\uB294 \uAC83\uC740 \uC0C1\uB2F9\uD788 \uC704\uD5D8\uD569\uB2C8\uB2E4.");
401
- await waitWithCountdown("\uD504\uB85C\uC138\uC2A4\uB97C \uC911\uC9C0\uD558\uB824\uBA74 'CTRL+C'\uB97C \uB204\uB974\uC138\uC694.", 5);
400
+ logger.warn("Deploying without building is quite dangerous.");
401
+ await waitWithCountdown("Press 'CTRL+C' to stop the process.", 5);
402
402
  } else {
403
- logger.debug("\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC...");
403
+ logger.debug("Upgrading version...");
404
404
  const upgradeResult = await upgradeVersion(cwd, allPkgPaths, dryRun);
405
405
  version = upgradeResult.version;
406
406
  const _changedFiles = upgradeResult.changedFiles;
407
407
  if (dryRun) {
408
- logger.info(`[DRY-RUN] \uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version} (\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C)`);
408
+ logger.info(`[DRY-RUN] Version upgrade: ${projPkg.version} \u2192 ${version} (files not modified)`);
409
409
  } else {
410
- logger.info(`\uBC84\uC804 \uC5C5\uADF8\uB808\uC774\uB4DC: ${projPkg.version} \u2192 ${version}`);
410
+ logger.info(`Version upgrade: ${projPkg.version} \u2192 ${version}`);
411
411
  }
412
412
  if (dryRun) {
413
- logger.info("[DRY-RUN] \uBE4C\uB4DC \uC2DC\uC791 (\uAC80\uC99D\uC6A9)...");
413
+ logger.info("[DRY-RUN] Starting build (validation only)...");
414
414
  } else {
415
- logger.debug("\uBE4C\uB4DC \uC2DC\uC791...");
415
+ logger.debug("Starting build...");
416
416
  }
417
417
  try {
418
418
  await runBuild({
@@ -420,14 +420,14 @@ async function runPublish(options) {
420
420
  options: options.options
421
421
  });
422
422
  if (process.exitCode === 1) {
423
- throw new Error("\uBE4C\uB4DC \uC2E4\uD328");
423
+ throw new Error("Build failed");
424
424
  }
425
425
  } catch {
426
426
  if (dryRun) {
427
- logger.error("[DRY-RUN] \uBE4C\uB4DC \uC2E4\uD328");
427
+ logger.error("[DRY-RUN] Build failed");
428
428
  } else {
429
429
  logger.error(
430
- "\uBE4C\uB4DC \uC2E4\uD328. \uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:\n \uBC84\uC804 \uBCC0\uACBD\uC744 \uB418\uB3CC\uB9AC\uB824\uBA74:\n git checkout -- package.json packages/*/package.json packages/sd-cli/templates/"
430
+ "Build failed. Manual recovery may be necessary:\n To revert version changes:\n git checkout -- package.json packages/*/package.json packages/sd-cli/templates/"
431
431
  );
432
432
  }
433
433
  process.exitCode = 1;
@@ -435,30 +435,30 @@ async function runPublish(options) {
435
435
  }
436
436
  if (hasGit) {
437
437
  if (dryRun) {
438
- logger.info("[DRY-RUN] Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC \uC2DC\uBBAC\uB808\uC774\uC158...");
439
- logger.info(`[DRY-RUN] git add (${_changedFiles.length}\uAC1C \uD30C\uC77C)`);
438
+ logger.info("[DRY-RUN] Simulating Git commit/tag/push...");
439
+ logger.info(`[DRY-RUN] git add (${_changedFiles.length} files)`);
440
440
  logger.info(`[DRY-RUN] git commit -m "v${version}"`);
441
441
  logger.info(`[DRY-RUN] git tag -a v${version} -m "v${version}"`);
442
442
  logger.info("[DRY-RUN] git push --dry-run");
443
443
  await execa("git", ["push", "--dry-run"]);
444
444
  logger.info("[DRY-RUN] git push --tags --dry-run");
445
445
  await execa("git", ["push", "--tags", "--dry-run"]);
446
- logger.info("[DRY-RUN] Git \uC791\uC5C5 \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC");
446
+ logger.info("[DRY-RUN] Git operations simulation completed");
447
447
  } else {
448
- logger.debug("Git \uCEE4\uBC0B/\uD0DC\uADF8/\uD478\uC2DC...");
448
+ logger.debug("Git commit/tag/push...");
449
449
  try {
450
450
  await execa("git", ["add", ..._changedFiles]);
451
451
  await execa("git", ["commit", "-m", `v${version}`]);
452
452
  await execa("git", ["tag", "-a", `v${version}`, "-m", `v${version}`]);
453
453
  await execa("git", ["push"]);
454
454
  await execa("git", ["push", "--tags"]);
455
- logger.debug("Git \uC791\uC5C5 \uC644\uB8CC");
455
+ logger.debug("Git operations completed");
456
456
  } catch (err) {
457
457
  logger.error(
458
- `Git \uC791\uC5C5 \uC2E4\uD328: ${err instanceof Error ? err.message : err}
459
- \uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4:
460
- git revert HEAD # \uBC84\uC804 \uCEE4\uBC0B \uB418\uB3CC\uB9AC\uAE30
461
- git tag -d v${version} # \uD0DC\uADF8 \uC0AD\uC81C`
458
+ `Git operations failed: ${err instanceof Error ? err.message : err}
459
+ Manual recovery may be necessary:
460
+ git revert HEAD # Revert version commit
461
+ git tag -d v${version} # Delete tag`
462
462
  );
463
463
  process.exitCode = 1;
464
464
  return;
@@ -485,7 +485,7 @@ async function runPublish(options) {
485
485
  if (attempt < maxRetries) {
486
486
  const delay = attempt * 5e3;
487
487
  logger.debug(
488
- dryRun ? `[DRY-RUN] ${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})` : `${pkg.name} (\uC7AC\uC2DC\uB3C4 ${attempt + 1}/${maxRetries})`
488
+ dryRun ? `[DRY-RUN] ${pkg.name} (retry ${attempt + 1}/${maxRetries})` : `${pkg.name} (retry ${attempt + 1}/${maxRetries})`
489
489
  );
490
490
  await new Promise((resolve) => setTimeout(resolve, delay));
491
491
  } else {
@@ -509,42 +509,42 @@ async function runPublish(options) {
509
509
  if (failedPkgNames.length > 0) {
510
510
  if (publishedPackages.length > 0) {
511
511
  logger.error(
512
- "\uBC30\uD3EC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\n\uC774\uBBF8 \uBC30\uD3EC\uB41C \uD328\uD0A4\uC9C0:\n" + publishedPackages.map((n) => ` - ${n}`).join("\n") + "\n\n\uC218\uB3D9 \uBCF5\uAD6C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\nnpm \uD328\uD0A4\uC9C0\uB294 72\uC2DC\uAC04 \uB0B4\uC5D0 `npm unpublish <pkg>@<version>` \uC73C\uB85C \uC0AD\uC81C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
512
+ "Error during deployment.\nAlready deployed packages:\n" + publishedPackages.map((n) => ` - ${n}`).join("\n") + "\n\nManual recovery may be necessary.\nnpm packages can be deleted within 72 hours with `npm unpublish <pkg>@<version>`."
513
513
  );
514
514
  }
515
515
  for (const name of failedPkgNames) {
516
- logger.error(`[${name}] \uBC30\uD3EC \uC2E4\uD328`);
516
+ logger.error(`[${name}] Deployment failed`);
517
517
  }
518
518
  process.exitCode = 1;
519
519
  return;
520
520
  }
521
521
  if (sdConfig.postPublish != null && sdConfig.postPublish.length > 0) {
522
522
  if (dryRun) {
523
- logger.info("[DRY-RUN] postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2DC\uBBAC\uB808\uC774\uC158...");
523
+ logger.info("[DRY-RUN] Simulating postPublish scripts...");
524
524
  } else {
525
- logger.debug("postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589...");
525
+ logger.debug("Running postPublish scripts...");
526
526
  }
527
527
  for (const script of sdConfig.postPublish) {
528
528
  try {
529
529
  const cmd = replaceEnvVariables(script.cmd, version, cwd);
530
530
  const args = script.args.map((arg) => replaceEnvVariables(arg, version, cwd));
531
531
  if (dryRun) {
532
- logger.info(`[DRY-RUN] \uC2E4\uD589 \uC608\uC815: ${cmd} ${args.join(" ")}`);
532
+ logger.info(`[DRY-RUN] Will execute: ${cmd} ${args.join(" ")}`);
533
533
  } else {
534
- logger.debug(`\uC2E4\uD589: ${cmd} ${args.join(" ")}`);
534
+ logger.debug(`Executing: ${cmd} ${args.join(" ")}`);
535
535
  await execa(cmd, args, { cwd });
536
536
  }
537
537
  } catch (err) {
538
538
  logger.warn(
539
- `postPublish \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD328 (\uACC4\uC18D \uC9C4\uD589): ${err instanceof Error ? err.message : err}`
539
+ `postPublish script failed (continuing): ${err instanceof Error ? err.message : err}`
540
540
  );
541
541
  }
542
542
  }
543
543
  }
544
544
  if (dryRun) {
545
- logger.info(`[DRY-RUN] \uC2DC\uBBAC\uB808\uC774\uC158 \uC644\uB8CC. \uC2E4\uC81C \uBC30\uD3EC \uC2DC \uBC84\uC804: v${version}`);
545
+ logger.info(`[DRY-RUN] Simulation completed. Actual deployment version: v${version}`);
546
546
  } else {
547
- logger.info(`\uBAA8\uB4E0 \uBC30\uD3EC\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. (v${version})`);
547
+ logger.info(`All deployments completed. (v${version})`);
548
548
  }
549
549
  }
550
550
  export {