mimi-seed 0.2.1 → 0.2.2

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 (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +135 -62
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -162,7 +162,7 @@ on:
162
162
 
163
163
  jobs:
164
164
  release:
165
- uses: jeonghwanko/app-gen/.github/workflows/mimi-seed-release.yml@master
165
+ uses: jeonghwanko/mimi-seed/.github/workflows/mimi-seed-release.yml@master
166
166
  with:
167
167
  locales: 'ko,en-US' # 다국어 릴리즈 노트
168
168
  apply-notes: true # 스토어에 자동 적용
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/index.ts
4
4
  import os2 from "os";
5
- import kleur5 from "kleur";
5
+ import kleur6 from "kleur";
6
6
  import open from "open";
7
7
 
8
8
  // src/detect.ts
@@ -807,62 +807,131 @@ async function cmdReview(argv) {
807
807
  `) : kleur4.green("\u2713 \uB2F5\uBCC0 \uAC8C\uC2DC \uC644\uB8CC\n"));
808
808
  }
809
809
 
810
+ // src/auth.ts
811
+ import { spawn } from "child_process";
812
+ import kleur5 from "kleur";
813
+ var MCP_PKG = "@yoonion/mimi-seed-mcp";
814
+ function log(msg) {
815
+ process.stdout.write(msg + "\n");
816
+ }
817
+ function printAuthHelp() {
818
+ log(`${kleur5.bold("mimi-seed auth")} \u2014 Google OAuth \uC778\uC99D (Firebase / AdMob / Play Store)
819
+
820
+ ${kleur5.bold("\uC11C\uBE0C\uBA85\uB839:")}
821
+ ${kleur5.cyan("mimi-seed auth login")} \uBE0C\uB77C\uC6B0\uC800\uB85C \uB85C\uADF8\uC778 (\uC774\uBBF8 \uC788\uC73C\uBA74 \uC790\uB3D9 refresh \uC2DC\uB3C4)
822
+ ${kleur5.cyan("mimi-seed auth status")} \uD604\uC7AC \uD1A0\uD070 \uC0C1\uD0DC
823
+ ${kleur5.cyan("mimi-seed auth refresh")} refresh_token\uC73C\uB85C \uAC31\uC2E0\uB9CC \uC2DC\uB3C4 (\uBE0C\uB77C\uC6B0\uC800 X)
824
+ ${kleur5.cyan("mimi-seed auth logout")} \uD1A0\uD070 \uC0AD\uC81C
825
+
826
+ ${kleur5.bold("login \uC635\uC158:")}
827
+ --no-browser URL \uC790\uB3D9 \uC624\uD508 \uC548 \uD568 (\uC9C1\uC811 \uBCF5\uBD99)
828
+ --timeout <\uCD08> \uCF5C\uBC31 \uB300\uAE30 \uC2DC\uAC04 (\uAE30\uBCF8 600)
829
+ --force \uAE30\uC874 \uD1A0\uD070 \uBB34\uC2DC\uD558\uACE0 \uAC15\uC81C \uC7AC\uB85C\uADF8\uC778
830
+
831
+ ${kleur5.dim(`\uB0B4\uBD80\uC801\uC73C\uB85C ${MCP_PKG} \uC758 mimi-seed-auth CLI\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.`)}`);
832
+ }
833
+ async function runMcpAuth(extraArgs) {
834
+ return new Promise((resolve) => {
835
+ const child = spawn("npx", ["-y", `${MCP_PKG}`, "mimi-seed-auth", ...extraArgs], {
836
+ stdio: "inherit",
837
+ shell: true
838
+ });
839
+ child.on("error", (e) => {
840
+ process.stderr.write(`
841
+ \u274C npx \uC2E4\uD589 \uC2E4\uD328: ${e.message}
842
+ `);
843
+ resolve(1);
844
+ });
845
+ child.on("exit", (code) => resolve(code ?? 0));
846
+ });
847
+ }
848
+ async function cmdAuth(args) {
849
+ const sub = args[0];
850
+ const rest = args.slice(1);
851
+ if (sub === "--help" || sub === "-h" || sub === "help") {
852
+ printAuthHelp();
853
+ return;
854
+ }
855
+ let mcpArgs;
856
+ switch (sub) {
857
+ case void 0:
858
+ case "login":
859
+ mcpArgs = rest;
860
+ break;
861
+ case "status":
862
+ mcpArgs = ["--status", ...rest];
863
+ break;
864
+ case "refresh":
865
+ mcpArgs = ["--refresh", ...rest];
866
+ break;
867
+ case "logout":
868
+ mcpArgs = ["--logout", ...rest];
869
+ break;
870
+ default:
871
+ log(kleur5.red(`\uC54C \uC218 \uC5C6\uB294 auth \uC11C\uBE0C\uBA85\uB839: ${sub}`));
872
+ printAuthHelp();
873
+ process.exit(1);
874
+ }
875
+ const code = await runMcpAuth(mcpArgs);
876
+ if (code !== 0) process.exit(code);
877
+ }
878
+
810
879
  // src/index.ts
811
880
  var DEFAULT_WEB_BASE = process.env.MIMI_SEED_WEB_BASE ?? "https://mimi-seed.pryzm.gg";
812
881
  var DEFAULT_MCP_ENDPOINT = `${DEFAULT_WEB_BASE}/api/mcp`;
813
- function log(msg) {
882
+ function log2(msg) {
814
883
  process.stdout.write(msg + "\n");
815
884
  }
816
885
  async function cmdInit() {
817
886
  const cwd = process.cwd();
818
- log(kleur5.bold("Mimi Seed CLI \u2014 init"));
819
- log(kleur5.dim(cwd));
820
- log("");
887
+ log2(kleur6.bold("Mimi Seed CLI \u2014 init"));
888
+ log2(kleur6.dim(cwd));
889
+ log2("");
821
890
  if (!await hasAnyProjectSignal(cwd)) {
822
- log(kleur5.yellow("\u26A0 package.json / app.json / android / ios \uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uADF8\uB798\uB3C4 \uC9C4\uD589\uD569\uB2C8\uB2E4."));
891
+ log2(kleur6.yellow("\u26A0 package.json / app.json / android / ios \uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uADF8\uB798\uB3C4 \uC9C4\uD589\uD569\uB2C8\uB2E4."));
823
892
  }
824
- log("\u{1F50D} \uC571 \uAC10\uC9C0 \uC911...");
893
+ log2("\u{1F50D} \uC571 \uAC10\uC9C0 \uC911...");
825
894
  const hints = await detectHints(cwd);
826
895
  if (hints.length === 0) {
827
- log(kleur5.yellow("\uAC10\uC9C0\uB41C \uC571 \uC5C6\uC74C. \uC6F9\uC5D0\uC11C \uC218\uB3D9 \uB4F1\uB85D \uAC00\uB2A5."));
896
+ log2(kleur6.yellow("\uAC10\uC9C0\uB41C \uC571 \uC5C6\uC74C. \uC6F9\uC5D0\uC11C \uC218\uB3D9 \uB4F1\uB85D \uAC00\uB2A5."));
828
897
  } else {
829
898
  for (const h of hints) {
830
899
  const tag = [h.packageName && `android:${h.packageName}`, h.bundleId && `ios:${h.bundleId}`].filter(Boolean).join(" ");
831
- log(` \u2022 ${h.name ?? "(\uC774\uB984 \uBBF8\uC0C1)"} ${kleur5.dim(tag)}`);
900
+ log2(` \u2022 ${h.name ?? "(\uC774\uB984 \uBBF8\uC0C1)"} ${kleur6.dim(tag)}`);
832
901
  }
833
902
  }
834
- log("");
903
+ log2("");
835
904
  if (process.env.MIMI_SEED_TOKEN) {
836
905
  const cfg2 = await getEffectiveConfig();
837
906
  if (cfg2 && hints.length > 0) {
838
- log(kleur5.dim("CI \uBAA8\uB4DC: MIMI_SEED_TOKEN \uC0AC\uC6A9"));
907
+ log2(kleur6.dim("CI \uBAA8\uB4DC: MIMI_SEED_TOKEN \uC0AC\uC6A9"));
839
908
  const payload = hints.map((h) => ({ name: h.name, packageName: h.packageName, bundleId: h.bundleId }));
840
909
  const result = await mcpCall(cfg2.endpoint, cfg2.token, "sync_apps", { hints: payload });
841
910
  if (result.isError) {
842
- log(kleur5.red("\uB4F1\uB85D \uC2E4\uD328: " + result.text));
911
+ log2(kleur6.red("\uB4F1\uB85D \uC2E4\uD328: " + result.text));
843
912
  } else {
844
- for (const line of result.text.split("\n")) log(" " + line);
913
+ for (const line of result.text.split("\n")) log2(" " + line);
845
914
  }
846
915
  }
847
- log(kleur5.bold("\u2713 \uC644\uB8CC (CI \uBAA8\uB4DC)"));
916
+ log2(kleur6.bold("\u2713 \uC644\uB8CC (CI \uBAA8\uB4DC)"));
848
917
  return;
849
918
  }
850
- log("\u{1F510} \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB85C\uADF8\uC778 \uB300\uAE30...");
919
+ log2("\u{1F510} \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB85C\uADF8\uC778 \uB300\uAE30...");
851
920
  const hostName = os2.hostname().slice(0, 32);
852
921
  const name = `cli-${hostName}`;
853
922
  const { port, promise } = await awaitHandshake(5 * 60 * 1e3);
854
923
  const callback = `http://127.0.0.1:${port}/cb`;
855
924
  const connectUrl = `${DEFAULT_WEB_BASE}/cli/connect?callback=${encodeURIComponent(callback)}&name=${encodeURIComponent(name)}`;
856
- log(kleur5.dim(` ${connectUrl}`));
925
+ log2(kleur6.dim(` ${connectUrl}`));
857
926
  await open(connectUrl);
858
927
  let handshake;
859
928
  try {
860
929
  handshake = await promise;
861
930
  } catch (e) {
862
- log(kleur5.red("\uC5F0\uACB0 \uC2E4\uD328: " + e.message));
931
+ log2(kleur6.red("\uC5F0\uACB0 \uC2E4\uD328: " + e.message));
863
932
  process.exit(1);
864
933
  }
865
- log(kleur5.green("\u2713 \uD1A0\uD070 \uC218\uC2E0"));
934
+ log2(kleur6.green("\u2713 \uD1A0\uD070 \uC218\uC2E0"));
866
935
  const cfg = {
867
936
  token: handshake.token,
868
937
  prefix: handshake.prefix,
@@ -871,30 +940,30 @@ async function cmdInit() {
871
940
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
872
941
  };
873
942
  await writeConfig(cfg);
874
- log(kleur5.dim(` \uC800\uC7A5\uB428: ${CONFIG_LOCATION}`));
875
- log("");
943
+ log2(kleur6.dim(` \uC800\uC7A5\uB428: ${CONFIG_LOCATION}`));
944
+ log2("");
876
945
  if (hints.length > 0) {
877
- log("\u{1F504} \uC571 \uB4F1\uB85D \uC911...");
946
+ log2("\u{1F504} \uC571 \uB4F1\uB85D \uC911...");
878
947
  const payload = hints.map((h) => ({ name: h.name, packageName: h.packageName, bundleId: h.bundleId }));
879
948
  const result = await mcpCall(cfg.endpoint, cfg.token, "sync_apps", { hints: payload });
880
949
  if (result.isError) {
881
- log(kleur5.red("\uB4F1\uB85D \uC2E4\uD328: " + result.text));
950
+ log2(kleur6.red("\uB4F1\uB85D \uC2E4\uD328: " + result.text));
882
951
  } else {
883
- for (const line of result.text.split("\n")) log(" " + line);
952
+ for (const line of result.text.split("\n")) log2(" " + line);
884
953
  }
885
- log("");
886
- }
887
- log(kleur5.bold("\u2713 \uC900\uBE44 \uC644\uB8CC."));
888
- log("");
889
- log("Claude Code\uC5D0\uC11C \uC774\uB807\uAC8C \uBB3C\uC5B4\uBCF4\uC138\uC694:");
890
- log(kleur5.cyan(' "\uB0B4 \uC571 \uCD9C\uC2DC \uC900\uBE44\uB410\uC5B4?"'));
891
- log(kleur5.cyan(' "\uB9B4\uB9AC\uC988 \uB178\uD2B8 \uC368\uC918"'));
892
- log(kleur5.cyan(' "\uB4F1\uB85D\uB41C \uC571 \uBAA9\uB85D \uBCF4\uC5EC\uC918"'));
893
- log("");
894
- log(`\uB300\uC2DC\uBCF4\uB4DC: ${kleur5.underline(DEFAULT_WEB_BASE + "/apps")}`);
895
- log("");
896
- log(
897
- kleur5.dim(
954
+ log2("");
955
+ }
956
+ log2(kleur6.bold("\u2713 \uC900\uBE44 \uC644\uB8CC."));
957
+ log2("");
958
+ log2("Claude Code\uC5D0\uC11C \uC774\uB807\uAC8C \uBB3C\uC5B4\uBCF4\uC138\uC694:");
959
+ log2(kleur6.cyan(' "\uB0B4 \uC571 \uCD9C\uC2DC \uC900\uBE44\uB410\uC5B4?"'));
960
+ log2(kleur6.cyan(' "\uB9B4\uB9AC\uC988 \uB178\uD2B8 \uC368\uC918"'));
961
+ log2(kleur6.cyan(' "\uB4F1\uB85D\uB41C \uC571 \uBAA9\uB85D \uBCF4\uC5EC\uC918"'));
962
+ log2("");
963
+ log2(`\uB300\uC2DC\uBCF4\uB4DC: ${kleur6.underline(DEFAULT_WEB_BASE + "/apps")}`);
964
+ log2("");
965
+ log2(
966
+ kleur6.dim(
898
967
  `Claude Code MCP \uB4F1\uB85D:
899
968
  claude mcp add --transport http mimi-seed ${DEFAULT_MCP_ENDPOINT} \\
900
969
  --header "Authorization: Bearer ${cfg.prefix}..."`
@@ -904,39 +973,40 @@ async function cmdInit() {
904
973
  async function cmdStatus() {
905
974
  const cfg = await getEffectiveConfig();
906
975
  if (!cfg) {
907
- log(kleur5.yellow("\uC5F0\uACB0\uB41C Mimi Seed \uACC4\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. `mimi-seed init` \uC2E4\uD589."));
976
+ log2(kleur6.yellow("\uC5F0\uACB0\uB41C Mimi Seed \uACC4\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. `mimi-seed init` \uC2E4\uD589."));
908
977
  process.exit(1);
909
978
  }
910
- log(kleur5.bold("Mimi Seed \uC5F0\uACB0 \uC0C1\uD0DC"));
911
- log(` \uD1A0\uD070: ${cfg.prefix}\u2026 (${cfg.createdAt.slice(0, 10)})`);
912
- log(` \uC5D4\uB4DC\uD3EC\uC778\uD2B8: ${cfg.endpoint}`);
913
- log("");
914
- log("\u{1F4CB} \uC571 \uBAA9\uB85D:");
979
+ log2(kleur6.bold("Mimi Seed \uC5F0\uACB0 \uC0C1\uD0DC"));
980
+ log2(` \uD1A0\uD070: ${cfg.prefix}\u2026 (${cfg.createdAt.slice(0, 10)})`);
981
+ log2(` \uC5D4\uB4DC\uD3EC\uC778\uD2B8: ${cfg.endpoint}`);
982
+ log2("");
983
+ log2("\u{1F4CB} \uC571 \uBAA9\uB85D:");
915
984
  const r = await mcpCall(cfg.endpoint, cfg.token, "list_apps", {});
916
985
  if (r.isError) {
917
- log(kleur5.red("\uC870\uD68C \uC2E4\uD328: " + r.text));
986
+ log2(kleur6.red("\uC870\uD68C \uC2E4\uD328: " + r.text));
918
987
  process.exit(1);
919
988
  }
920
- for (const line of r.text.split("\n")) log(" " + line);
989
+ for (const line of r.text.split("\n")) log2(" " + line);
921
990
  }
922
991
  async function cmdLogout() {
923
992
  await deleteConfig();
924
- log(kleur5.green("\u2713 \uB85C\uCEEC \uC124\uC815 \uC0AD\uC81C \uC644\uB8CC."));
925
- log(kleur5.dim("\uC6F9\uC5D0\uC11C \uD1A0\uD070 \uD574\uC9C0: /workspace/api-tokens"));
993
+ log2(kleur6.green("\u2713 \uB85C\uCEEC \uC124\uC815 \uC0AD\uC81C \uC644\uB8CC."));
994
+ log2(kleur6.dim("\uC6F9\uC5D0\uC11C \uD1A0\uD070 \uD574\uC9C0: /workspace/api-tokens"));
926
995
  }
927
996
  function printHelp() {
928
- log(`${kleur5.bold("mimi-seed")} \u2014 Claude Code\uC5D0\uC11C \uC571 \uCD9C\uC2DC \uC6B4\uC601
997
+ log2(`${kleur6.bold("mimi-seed")} \u2014 Claude Code\uC5D0\uC11C \uC571 \uCD9C\uC2DC \uC6B4\uC601
929
998
 
930
- ${kleur5.bold("\uBA85\uB839\uC5B4:")}
931
- ${kleur5.cyan("mimi-seed init")} \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8\uB97C Mimi Seed\uC5D0 \uC5F0\uACB0
932
- ${kleur5.cyan("mimi-seed status")} \uC5F0\uACB0 \uC0C1\uD0DC + \uB4F1\uB85D \uC571 \uBAA9\uB85D
933
- ${kleur5.cyan("mimi-seed doctor")} \uD658\uACBD \uC9C4\uB2E8 (\uD1A0\uD070\xB7Git\xB7\uD504\uB85C\uC81D\uD2B8\xB7CI \uCCB4\uD06C)
934
- ${kleur5.cyan("mimi-seed check")} \uCD9C\uC2DC \uC804 Readiness \uC810\uAC80
935
- ${kleur5.cyan("mimi-seed notes")} \uB9B4\uB9AC\uC988 \uB178\uD2B8 \uC0DD\uC131 (git log \u2192 AI \u2192 \uB9C8\uCF13 \uC801\uC6A9)
936
- ${kleur5.cyan("mimi-seed review")} \uB9AC\uBDF0 \uB2F5\uBCC0 AI \uCD08\uC548 \uC0DD\uC131 \uBC0F Play Store \uAC8C\uC2DC
937
- ${kleur5.cyan("mimi-seed logout")} \uB85C\uCEEC \uC124\uC815 \uC0AD\uC81C
999
+ ${kleur6.bold("\uBA85\uB839\uC5B4:")}
1000
+ ${kleur6.cyan("mimi-seed init")} \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8\uB97C Mimi Seed\uC5D0 \uC5F0\uACB0
1001
+ ${kleur6.cyan("mimi-seed status")} \uC5F0\uACB0 \uC0C1\uD0DC + \uB4F1\uB85D \uC571 \uBAA9\uB85D
1002
+ ${kleur6.cyan("mimi-seed auth")} Google OAuth \uC778\uC99D (Firebase/AdMob/Play). 'mimi-seed auth --help'
1003
+ ${kleur6.cyan("mimi-seed doctor")} \uD658\uACBD \uC9C4\uB2E8 (\uD1A0\uD070\xB7Git\xB7\uD504\uB85C\uC81D\uD2B8\xB7CI \uCCB4\uD06C)
1004
+ ${kleur6.cyan("mimi-seed check")} \uCD9C\uC2DC \uC804 Readiness \uC810\uAC80
1005
+ ${kleur6.cyan("mimi-seed notes")} \uB9B4\uB9AC\uC988 \uB178\uD2B8 \uC0DD\uC131 (git log \u2192 AI \u2192 \uB9C8\uCF13 \uC801\uC6A9)
1006
+ ${kleur6.cyan("mimi-seed review")} \uB9AC\uBDF0 \uB2F5\uBCC0 AI \uCD08\uC548 \uC0DD\uC131 \uBC0F Play Store \uAC8C\uC2DC
1007
+ ${kleur6.cyan("mimi-seed logout")} \uB85C\uCEEC \uC124\uC815 \uC0AD\uC81C
938
1008
 
939
- ${kleur5.bold("mimi-seed notes \uC635\uC158:")}
1009
+ ${kleur6.bold("mimi-seed notes \uC635\uC158:")}
940
1010
  --from <ref> \uC2DC\uC791 \uCEE4\uBC0B/\uD0DC\uADF8 (\uAE30\uBCF8: \uCD5C\uC2E0 \uD0DC\uADF8)
941
1011
  --to <ref> \uB05D \uCEE4\uBC0B (\uAE30\uBCF8: HEAD)
942
1012
  --locale ko,en-US \uB300\uC0C1 \uB85C\uCF00\uC77C (\uC27C\uD45C \uAD6C\uBD84)
@@ -944,11 +1014,11 @@ ${kleur5.bold("mimi-seed notes \uC635\uC158:")}
944
1014
  --no-interactive CI \uBAA8\uB4DC (\uD504\uB86C\uD504\uD2B8 \uC5C6\uC74C)
945
1015
  --limit <n> \uCD5C\uB300 \uCEE4\uBC0B \uC218 (\uAE30\uBCF8: 30)
946
1016
 
947
- ${kleur5.bold("mimi-seed check \uC635\uC158:")}
1017
+ ${kleur6.bold("mimi-seed check \uC635\uC158:")}
948
1018
  --app <id> \uC571 ID \uC9C0\uC815
949
1019
  --fail-on-blocker \uBE14\uB85C\uCEE4 \uC788\uC73C\uBA74 exit 1 (CI\uC6A9)
950
1020
 
951
- ${kleur5.bold("mimi-seed review \uC635\uC158:")}
1021
+ ${kleur6.bold("mimi-seed review \uC635\uC158:")}
952
1022
  --text <\uB0B4\uC6A9> \uB9AC\uBDF0 \uC6D0\uBB38 (\uBBF8\uC785\uB825 \uC2DC \uB300\uD654\uD615 \uD504\uB86C\uD504\uD2B8)
953
1023
  --rating <1-5> \uBCC4\uC810
954
1024
  --tone <tone> friendly / professional / empathetic / brief (\uAE30\uBCF8: friendly)
@@ -959,7 +1029,7 @@ ${kleur5.bold("mimi-seed review \uC635\uC158:")}
959
1029
  --package-name <p> \uD328\uD0A4\uC9C0\uBA85 (--apply \uC2DC \uD544\uC694)
960
1030
  --no-interactive CI \uBAA8\uB4DC
961
1031
 
962
- ${kleur5.bold("\uD658\uACBD\uBCC0\uC218:")}
1032
+ ${kleur6.bold("\uD658\uACBD\uBCC0\uC218:")}
963
1033
  MIMI_SEED_TOKEN PAT \uD1A0\uD070 (CI/CD \uBB34\uC778\uC99D \uBAA8\uB4DC)
964
1034
  MIMI_SEED_WEB_BASE \uC11C\uBC84 \uC8FC\uC18C (\uAE30\uBCF8: https://mimi-seed.pryzm.gg)
965
1035
  ANTHROPIC_API_KEY AI \uB178\uD2B8 \uC0DD\uC131 \uD65C\uC131\uD654 (\uC120\uD0DD)
@@ -988,6 +1058,9 @@ async function main() {
988
1058
  case "review":
989
1059
  await cmdReview(restArgs);
990
1060
  break;
1061
+ case "auth":
1062
+ await cmdAuth(restArgs);
1063
+ break;
991
1064
  case "logout":
992
1065
  await cmdLogout();
993
1066
  break;
@@ -997,13 +1070,13 @@ async function main() {
997
1070
  printHelp();
998
1071
  break;
999
1072
  default:
1000
- log(kleur5.red(`\uC54C \uC218 \uC5C6\uB294 \uBA85\uB839: ${cmd}`));
1073
+ log2(kleur6.red(`\uC54C \uC218 \uC5C6\uB294 \uBA85\uB839: ${cmd}`));
1001
1074
  printHelp();
1002
1075
  process.exit(1);
1003
1076
  }
1004
1077
  } catch (e) {
1005
- log(kleur5.red(`\uC624\uB958: ${e.message}`));
1006
- if (process.env.DEBUG) log(e.stack ?? "");
1078
+ log2(kleur6.red(`\uC624\uB958: ${e.message}`));
1079
+ if (process.env.DEBUG) log2(e.stack ?? "");
1007
1080
  process.exit(1);
1008
1081
  }
1009
1082
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mimi-seed",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Mimi Seed CLI — Claude Code에서 앱 출시 운영을 관리합니다.",
5
5
  "bin": {
6
6
  "mimi-seed": "dist/index.js"