@simplysm/sd-cli 13.0.0-beta.21 → 13.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -211,7 +211,7 @@ sd-cli init
211
211
 
212
212
  After initialization, use `sd-cli add client` and `sd-cli add server` to add packages.
213
213
 
214
- > **Note**: To install Claude Code skills/agents, use `sd-claude install` from the separate `@simplysm/sd-claude` package.
214
+ > **Note**: Claude Code skills/agents are automatically installed via `@simplysm/claude` postinstall.
215
215
 
216
216
  ### add client
217
217
 
@@ -270,6 +270,56 @@ sd-cli device -p my-app -u http://192.168.0.10:3000
270
270
  | `--options`, `-o` | Additional options to pass to sd.config.ts (multi-use) | `[]` |
271
271
  | `--debug` | Output debug logs | `false` |
272
272
 
273
+ ## Exported Types
274
+
275
+ This package exports configuration types for `sd.config.ts`. All types are importable from `@simplysm/sd-cli`.
276
+
277
+ ```typescript
278
+ import type {
279
+ SdConfigFn,
280
+ SdConfigParams,
281
+ SdConfig,
282
+ SdPackageConfig,
283
+ BuildTarget,
284
+ SdBuildPackageConfig,
285
+ SdClientPackageConfig,
286
+ SdServerPackageConfig,
287
+ SdScriptsPackageConfig,
288
+ SdPublishConfig,
289
+ SdLocalDirectoryPublishConfig,
290
+ SdStoragePublishConfig,
291
+ SdPostPublishScriptConfig,
292
+ SdCapacitorConfig,
293
+ SdCapacitorAndroidConfig,
294
+ SdCapacitorSignConfig,
295
+ SdCapacitorPermission,
296
+ SdCapacitorIntentFilter,
297
+ SdElectronConfig,
298
+ } from "@simplysm/sd-cli";
299
+ ```
300
+
301
+ | Type | Description |
302
+ |------|-------------|
303
+ | `SdConfigFn` | Function type for `sd.config.ts` default export: `(params: SdConfigParams) => SdConfig \| Promise<SdConfig>` |
304
+ | `SdConfigParams` | Parameters passed to the config function (`cwd`, `dev`, `opt`) |
305
+ | `SdConfig` | Root configuration object (`packages`, `replaceDeps?`, `postPublish?`) |
306
+ | `SdPackageConfig` | Union of all package config types |
307
+ | `BuildTarget` | Library build target: `"node" \| "browser" \| "neutral"` |
308
+ | `SdBuildPackageConfig` | Config for library packages (`node`/`browser`/`neutral` targets) |
309
+ | `SdClientPackageConfig` | Config for client packages (`client` target) |
310
+ | `SdServerPackageConfig` | Config for server packages (`server` target) |
311
+ | `SdScriptsPackageConfig` | Config for scripts-only packages (`scripts` target) |
312
+ | `SdPublishConfig` | Deployment config: `"npm" \| SdLocalDirectoryPublishConfig \| SdStoragePublishConfig` |
313
+ | `SdLocalDirectoryPublishConfig` | Local directory deployment config (`type: "local-directory"`, `path`) |
314
+ | `SdStoragePublishConfig` | FTP/FTPS/SFTP deployment config (`type`, `host`, `port?`, `path?`, `user?`, `pass?`) |
315
+ | `SdPostPublishScriptConfig` | Post-publish script config (`type: "script"`, `cmd`, `args`) |
316
+ | `SdCapacitorConfig` | Capacitor config for Android app builds |
317
+ | `SdCapacitorAndroidConfig` | Android platform-specific Capacitor config |
318
+ | `SdCapacitorSignConfig` | APK/AAB signing config (`keystore`, `storePassword`, `alias`, `password`) |
319
+ | `SdCapacitorPermission` | Android permission entry (`name`, `maxSdkVersion?`, `ignore?`) |
320
+ | `SdCapacitorIntentFilter` | Android intent filter entry (`action?`, `category?`) |
321
+ | `SdElectronConfig` | Electron desktop app build config |
322
+
273
323
  ## Configuration (sd.config.ts)
274
324
 
275
325
  Create an `sd.config.ts` file in the project root to define build targets and deployment settings per package. Used by `typecheck`, `watch`, `dev`, `build`, `publish`, and `device` commands.
@@ -411,11 +461,36 @@ Environment variable substitution is supported in `path` for local directory and
411
461
  },
412
462
  ```
413
463
 
464
+ ### Dependency Replacement (replaceDeps)
465
+
466
+ Replace `node_modules` packages with local source directories via symlinks. Useful for local development of dependent packages across separate repositories.
467
+
468
+ The key is a glob pattern to match packages in `node_modules`, and the value is the local source directory path. The `*` wildcard in the key is substituted into the `*` in the value.
469
+
470
+ ```typescript
471
+ import type { SdConfigFn } from "@simplysm/sd-cli";
472
+
473
+ const config: SdConfigFn = () => ({
474
+ packages: {
475
+ "my-app": { target: "client", server: "my-server" },
476
+ },
477
+ replaceDeps: {
478
+ // Replaces @simplysm/* packages in node_modules
479
+ // with symlinks to ../simplysm/packages/*/dist
480
+ "@simplysm/*": "../simplysm/packages/*",
481
+ },
482
+ });
483
+
484
+ export default config;
485
+ ```
486
+
414
487
  ### postPublish Scripts
415
488
 
416
489
  You can define scripts to run after deployment completes. Supports environment variable substitution (`%VER%`, `%PROJECT%`). On script failure, only a warning is printed and execution continues.
417
490
 
418
491
  ```typescript
492
+ import type { SdConfigFn } from "@simplysm/sd-cli";
493
+
419
494
  const config: SdConfigFn = () => ({
420
495
  packages: {
421
496
  /* ... */
@@ -428,6 +503,8 @@ const config: SdConfigFn = () => ({
428
503
  },
429
504
  ],
430
505
  });
506
+
507
+ export default config;
431
508
  ```
432
509
 
433
510
  ### Capacitor Configuration (SdCapacitorConfig)
@@ -9,7 +9,7 @@ export interface InitOptions {
9
9
  * 1. 디렉토리 비어있는지 확인
10
10
  * 2. 프로젝트명(폴더명) 검증
11
11
  * 3. Handlebars 템플릿 렌더링
12
- * 4. pnpm install + sd-cli install 실행
12
+ * 4. pnpm install 실행
13
13
  */
14
14
  export declare function runInit(_options: InitOptions): Promise<void>;
15
15
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,WAAW;CAAG;AA8B/B;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDlE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,WAAW;CAAG;AA8B/B;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDlE"}
@@ -39,9 +39,11 @@ async function runInit(_options) {
39
39
  logger.info("pnpm install \uC2E4\uD589 \uC911...");
40
40
  await spawn("pnpm", ["install"], { cwd });
41
41
  logger.success("pnpm install \uC644\uB8CC");
42
- logger.info("sd-claude install \uC2E4\uD589 \uC911...");
43
- await spawn("pnpm", ["exec", "sd-claude", "install"], { cwd });
44
- logger.success("sd-claude install \uC644\uB8CC");
42
+ logger.info("git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC911...");
43
+ await spawn("git", ["init"], { cwd });
44
+ await spawn("git", ["add", "."], { cwd });
45
+ await spawn("git", ["commit", "-m", "init"], { cwd });
46
+ logger.success("git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC644\uB8CC");
45
47
  consola.box(
46
48
  [
47
49
  "\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/init.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Init \uBA85\uB839 \uC635\uC158\n */\nexport interface InitOptions {}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * import.meta.dirname\uC5D0\uC11C \uC0C1\uC704\uB85C \uC62C\uB77C\uAC00\uBA70 package.json\uC744 \uCC3E\uC544 \uD328\uD0A4\uC9C0 \uB8E8\uD2B8\uB97C \uBC18\uD658\uD55C\uB2E4.\n */\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (!fs.existsSync(path.join(dir, \"package.json\"))) {\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error(\"package.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n dir = parent;\n }\n return dir;\n}\n\n/**\n * npm \uC2A4\uCF54\uD504 \uC774\uB984 \uC720\uD6A8\uC131 \uAC80\uC99D\n */\nfunction isValidScopeName(name: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(name);\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uC0C8 Simplysm \uD504\uB85C\uC81D\uD2B8\uB97C \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC\uC5D0 \uCD08\uAE30\uD654\uD55C\uB2E4.\n *\n * 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778\n * 2. \uD504\uB85C\uC81D\uD2B8\uBA85(\uD3F4\uB354\uBA85) \uAC80\uC99D\n * 3. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 4. pnpm install + sd-cli install \uC2E4\uD589\n */\nexport async function runInit(_options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:init\");\n\n // 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778 (dotfile/dotfolder \uC81C\uC678)\n const entries = fs.readdirSync(cwd).filter((e) => !e.startsWith(\".\"));\n if (entries.length > 0) {\n consola.error(\"\uB514\uB809\uD1A0\uB9AC\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBE48 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n // 2. \uD504\uB85C\uC81D\uD2B8\uBA85 \uAC80\uC99D\n const projectName = path.basename(cwd);\n if (!isValidScopeName(projectName)) {\n consola.error(`\uD504\uB85C\uC81D\uD2B8 \uC774\uB984 \"${projectName}\"\uC774(\uAC00) \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 3. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"init\");\n\n const context = { projectName };\n\n logger.info(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC911...\");\n await renderTemplateDir(templateDir, cwd, context);\n logger.success(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC644\uB8CC\");\n\n // 4. pnpm install\n logger.info(\"pnpm install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"install\"], { cwd });\n logger.success(\"pnpm install \uC644\uB8CC\");\n\n // 5. sd-claude install\n logger.info(\"sd-claude install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"exec\", \"sd-claude\", \"install\"], { cwd });\n logger.success(\"sd-claude install \uC644\uB8CC\");\n\n // 6. \uC644\uB8CC \uBA54\uC2DC\uC9C0\n consola.box(\n [\n \"\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!\",\n \"\",\n \"\uB2E4\uC74C \uB2E8\uACC4:\",\n \" sd-cli add client \uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n \" sd-cli add server \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n ].join(\"\\n\"),\n );\n}\n\n//#endregion\n"],
5
- "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAgBtB,SAAS,gBAAgB,UAA0B;AACjD,MAAI,MAAM;AACV,SAAO,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACrD,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,OAAM,IAAI,MAAM,kEAA0B;AAC9D,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAcA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qKAAmC;AACjD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ,MAAM,0CAAY,WAAW,4KAA0C;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,YAAY;AAE9B,SAAO,KAAK,8DAAiB;AAC7B,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,iEAAe;AAG9B,SAAO,KAAK,qCAAsB;AAClC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,2BAAiB;AAGhC,SAAO,KAAK,0CAA2B;AACvC,QAAM,MAAM,QAAQ,CAAC,QAAQ,aAAa,SAAS,GAAG,EAAE,IAAI,CAAC;AAC7D,SAAO,QAAQ,gCAAsB;AAGrC,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
4
+ "sourcesContent": ["import path from \"path\";\nimport fs from \"fs\";\nimport { consola } from \"consola\";\nimport { renderTemplateDir } from \"../utils/template\";\nimport { spawn } from \"../utils/spawn\";\n\n//#region Types\n\n/**\n * Init \uBA85\uB839 \uC635\uC158\n */\nexport interface InitOptions {}\n\n//#endregion\n\n//#region Utilities\n\n/**\n * import.meta.dirname\uC5D0\uC11C \uC0C1\uC704\uB85C \uC62C\uB77C\uAC00\uBA70 package.json\uC744 \uCC3E\uC544 \uD328\uD0A4\uC9C0 \uB8E8\uD2B8\uB97C \uBC18\uD658\uD55C\uB2E4.\n */\nfunction findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (!fs.existsSync(path.join(dir, \"package.json\"))) {\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error(\"package.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n dir = parent;\n }\n return dir;\n}\n\n/**\n * npm \uC2A4\uCF54\uD504 \uC774\uB984 \uC720\uD6A8\uC131 \uAC80\uC99D\n */\nfunction isValidScopeName(name: string): boolean {\n return /^[a-z][a-z0-9-]*$/.test(name);\n}\n\n//#endregion\n\n//#region Main\n\n/**\n * \uC0C8 Simplysm \uD504\uB85C\uC81D\uD2B8\uB97C \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC\uC5D0 \uCD08\uAE30\uD654\uD55C\uB2E4.\n *\n * 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778\n * 2. \uD504\uB85C\uC81D\uD2B8\uBA85(\uD3F4\uB354\uBA85) \uAC80\uC99D\n * 3. Handlebars \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n * 4. pnpm install \uC2E4\uD589\n */\nexport async function runInit(_options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const logger = consola.withTag(\"sd:cli:init\");\n\n // 1. \uB514\uB809\uD1A0\uB9AC \uBE44\uC5B4\uC788\uB294\uC9C0 \uD655\uC778 (dotfile/dotfolder \uC81C\uC678)\n const entries = fs.readdirSync(cwd).filter((e) => !e.startsWith(\".\"));\n if (entries.length > 0) {\n consola.error(\"\uB514\uB809\uD1A0\uB9AC\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBE48 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC2E4\uD589\uD574\uC8FC\uC138\uC694.\");\n process.exitCode = 1;\n return;\n }\n\n // 2. \uD504\uB85C\uC81D\uD2B8\uBA85 \uAC80\uC99D\n const projectName = path.basename(cwd);\n if (!isValidScopeName(projectName)) {\n consola.error(`\uD504\uB85C\uC81D\uD2B8 \uC774\uB984 \"${projectName}\"\uC774(\uAC00) \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC18C\uBB38\uC790, \uC22B\uC790, \uD558\uC774\uD508\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4.`);\n process.exitCode = 1;\n return;\n }\n\n // 3. \uD15C\uD50C\uB9BF \uB80C\uB354\uB9C1\n const pkgRoot = findPackageRoot(import.meta.dirname);\n const templateDir = path.join(pkgRoot, \"templates\", \"init\");\n\n const context = { projectName };\n\n logger.info(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC911...\");\n await renderTemplateDir(templateDir, cwd, context);\n logger.success(\"\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C \uC0DD\uC131 \uC644\uB8CC\");\n\n // 4. pnpm install\n logger.info(\"pnpm install \uC2E4\uD589 \uC911...\");\n await spawn(\"pnpm\", [\"install\"], { cwd });\n logger.success(\"pnpm install \uC644\uB8CC\");\n\n // 5. git \uCD08\uAE30\uD654\n logger.info(\"git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC911...\");\n await spawn(\"git\", [\"init\"], { cwd });\n await spawn(\"git\", [\"add\", \".\"], { cwd });\n await spawn(\"git\", [\"commit\", \"-m\", \"init\"], { cwd });\n logger.success(\"git \uC800\uC7A5\uC18C \uCD08\uAE30\uD654 \uC644\uB8CC\");\n\n // 6. \uC644\uB8CC \uBA54\uC2DC\uC9C0\n consola.box(\n [\n \"\uD504\uB85C\uC81D\uD2B8\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4!\",\n \"\",\n \"\uB2E4\uC74C \uB2E8\uACC4:\",\n \" sd-cli add client \uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n \" sd-cli add server \uC11C\uBC84 \uD328\uD0A4\uC9C0 \uCD94\uAC00\",\n ].join(\"\\n\"),\n );\n}\n\n//#endregion\n"],
5
+ "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAgBtB,SAAS,gBAAgB,UAA0B;AACjD,MAAI,MAAM;AACV,SAAO,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACrD,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,OAAM,IAAI,MAAM,kEAA0B;AAC9D,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,oBAAoB,KAAK,IAAI;AACtC;AAcA,eAAsB,QAAQ,UAAsC;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,aAAa;AAG5C,QAAM,UAAU,GAAG,YAAY,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,MAAM,qKAAmC;AACjD,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,YAAQ,MAAM,0CAAY,WAAW,4KAA0C;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,QAAM,UAAU,gBAAgB,YAAY,OAAO;AACnD,QAAM,cAAc,KAAK,KAAK,SAAS,aAAa,MAAM;AAE1D,QAAM,UAAU,EAAE,YAAY;AAE9B,SAAO,KAAK,8DAAiB;AAC7B,QAAM,kBAAkB,aAAa,KAAK,OAAO;AACjD,SAAO,QAAQ,iEAAe;AAG9B,SAAO,KAAK,qCAAsB;AAClC,QAAM,MAAM,QAAQ,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC;AACxC,SAAO,QAAQ,2BAAiB;AAGhC,SAAO,KAAK,qDAAkB;AAC9B,QAAM,MAAM,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC;AACpC,QAAM,MAAM,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,CAAC;AACxC,QAAM,MAAM,OAAO,CAAC,UAAU,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC;AACpD,SAAO,QAAQ,wDAAgB;AAG/B,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;",
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.21",
4
+ "version": "13.0.0-beta.23",
5
5
  "description": "심플리즘 패키지 - CLI 도구",
6
6
  "author": "김석래",
7
7
  "repository": {
@@ -40,9 +40,9 @@
40
40
  "vite-plugin-solid": "^2.11.10",
41
41
  "vite-tsconfig-paths": "^6.1.0",
42
42
  "yargs": "^18.0.0",
43
- "@simplysm/core-common": "13.0.0-beta.21",
44
- "@simplysm/core-node": "13.0.0-beta.21",
45
- "@simplysm/storage": "13.0.0-beta.21"
43
+ "@simplysm/storage": "13.0.0-beta.23",
44
+ "@simplysm/core-node": "13.0.0-beta.23",
45
+ "@simplysm/core-common": "13.0.0-beta.23"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/semver": "^7.7.1",
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/solid": "~13.0.0-beta.21",
7
+ "@simplysm/solid": "~13.0.0-beta.23",
8
8
  {{#if router}}
9
9
  "@solidjs/router": "^0.15.4",
10
10
  {{/if}}
@@ -4,6 +4,6 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/service-server": "~13.0.0-beta.21"
7
+ "@simplysm/service-server": "~13.0.0-beta.23"
8
8
  }
9
9
  }
@@ -1,11 +1,14 @@
1
+ import { env } from "@simplysm/core-common";
1
2
  import { ServiceServer } from "@simplysm/service-server";
2
3
 
3
- const server = new ServiceServer({
4
+ export const server = new ServiceServer({
4
5
  rootPath: process.cwd(),
5
6
  port: {{port}},
6
7
  services: [],
7
8
  });
8
9
 
9
- if (!process.env["DEV"]) {
10
+ // 프로덕션 모드: 정적 파일 서빙 포함하여 직접 listen
11
+ // Watch 모드 (env.DEV): Server Runtime Worker가 proxy 설정 후 listen 호출
12
+ if (!env.DEV) {
10
13
  await server.listen();
11
14
  }
@@ -11,15 +11,18 @@
11
11
  "---": "",
12
12
  "typecheck": "sd-cli typecheck",
13
13
  "lint": "sd-cli lint",
14
- "lint:fix": "sd-cli lint --fix"
14
+ "lint:fix": "sd-cli lint --fix",
15
+ "vitest": "vitest"
15
16
  },
16
17
  "devDependencies": {
17
- "@simplysm/sd-cli": "~13.0.0-beta.21",
18
- "@simplysm/sd-claude": "~13.0.0-beta.21",
19
- "@simplysm/eslint-plugin": "~13.0.0-beta.21",
18
+ "@simplysm/sd-cli": "~13.0.0-beta.23",
19
+ "@simplysm/claude": "~13.0.0-beta.23",
20
+ "@simplysm/eslint-plugin": "~13.0.0-beta.23",
20
21
  "@types/node": "^20.19.33",
21
22
  "eslint": "^9.39.2",
22
23
  "prettier": "^3.8.1",
23
- "typescript": "^5.9.3"
24
+ "typescript": "^5.9.3",
25
+ "vite-tsconfig-paths": "^6.1.0",
26
+ "vitest": "^4.0.18"
24
27
  }
25
28
  }
@@ -2,6 +2,7 @@ packages:
2
2
  - packages/*
3
3
 
4
4
  onlyBuiltDependencies:
5
+ - '@simplysm/claude'
5
6
  - bufferutil
6
7
  - core-js
7
8
  - cpu-features
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from "vitest/config";
2
+ import tsconfigPaths from "vite-tsconfig-paths";
3
+
4
+ export default defineConfig({
5
+ define: {
6
+ "process.env.DEV": JSON.stringify("true"),
7
+ "process.env.VER": JSON.stringify("1.0.0-test"),
8
+ },
9
+ plugins: [tsconfigPaths()],
10
+ test: {
11
+ globals: true,
12
+ environment: "node",
13
+ include: ["packages/*/tests/**/*.spec.{ts,tsx,js}"],
14
+ coverage: {
15
+ reportsDirectory: "./.coverage",
16
+ },
17
+ },
18
+ });