@simplysm/sd-cli 13.0.0-beta.41 → 13.0.0-beta.45
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/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +18 -8
- package/dist/commands/publish.js.map +2 -2
- package/package.json +4 -4
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
|
@@ -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,
|
|
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"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -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"
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
}
|
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.
|
|
4
|
+
"version": "13.0.0-beta.45",
|
|
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.
|
|
46
|
-
"@simplysm/
|
|
47
|
-
"@simplysm/
|
|
45
|
+
"@simplysm/core-common": "13.0.0-beta.45",
|
|
46
|
+
"@simplysm/storage": "13.0.0-beta.45",
|
|
47
|
+
"@simplysm/core-node": "13.0.0-beta.45"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/semver": "^7.7.1",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"vitest": "vitest"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@simplysm/sd-cli": "~13.0.0-beta.
|
|
19
|
-
"@simplysm/claude": "~13.0.0-beta.
|
|
20
|
-
"@simplysm/eslint-plugin": "~13.0.0-beta.
|
|
18
|
+
"@simplysm/sd-cli": "~13.0.0-beta.45",
|
|
19
|
+
"@simplysm/claude": "~13.0.0-beta.45",
|
|
20
|
+
"@simplysm/eslint-plugin": "~13.0.0-beta.45",
|
|
21
21
|
"@types/node": "^20.19.33",
|
|
22
22
|
"eslint": "^9.39.2",
|
|
23
23
|
"prettier": "^3.8.1",
|