mimi-seed 0.6.0 → 0.9.0

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.
@@ -1,6 +1,13 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ catalog
4
+ } from "./chunk-SZQFVTEW.js";
2
5
 
3
6
  // src/mcp-client.ts
7
+ var M = catalog(
8
+ { noSseData: "MCP SSE \uC751\uB2F5\uC5D0 data \uC5C6\uC74C" },
9
+ { noSseData: "No data in the MCP SSE response" }
10
+ );
4
11
  async function mcpCall(endpoint, token, name, args) {
5
12
  const res = await fetch(endpoint, {
6
13
  method: "POST",
@@ -31,7 +38,7 @@ async function mcpCall(endpoint, token, name, args) {
31
38
  if (contentType.includes("text/event-stream")) {
32
39
  const text2 = await res.text();
33
40
  const line = text2.split("\n").map((l) => l.trim()).find((l) => l.startsWith("data:"));
34
- if (!line) throw new Error("MCP SSE \uC751\uB2F5\uC5D0 data \uC5C6\uC74C");
41
+ if (!line) throw new Error(M().noSseData);
35
42
  payload = JSON.parse(line.slice(5).trim());
36
43
  } else {
37
44
  payload = await res.json();
@@ -0,0 +1,252 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/settings.ts
4
+ import fs from "fs";
5
+ import os from "os";
6
+ import path from "path";
7
+ var DEFAULT_LANG = "ko";
8
+ function settingsPath(home) {
9
+ return path.join(home, ".mimi-seed", "settings.json");
10
+ }
11
+ function readSettings(home = os.homedir()) {
12
+ try {
13
+ return JSON.parse(fs.readFileSync(settingsPath(home), "utf-8"));
14
+ } catch {
15
+ return {};
16
+ }
17
+ }
18
+ function writeSettings(next, home = os.homedir()) {
19
+ const dir = path.join(home, ".mimi-seed");
20
+ fs.mkdirSync(dir, { recursive: true, mode: 448 });
21
+ const merged = { ...readSettings(home), ...next };
22
+ fs.writeFileSync(settingsPath(home), JSON.stringify(merged, null, 2));
23
+ }
24
+ function isLangUnset(home = os.homedir()) {
25
+ return !process.env.MIMI_SEED_LANG && !readSettings(home).lang;
26
+ }
27
+ function isLang(v) {
28
+ return v === "ko" || v === "en";
29
+ }
30
+ function resolveLang(home = os.homedir()) {
31
+ const env = process.env.MIMI_SEED_LANG?.toLowerCase();
32
+ if (isLang(env)) return env;
33
+ const saved = readSettings(home).lang;
34
+ if (isLang(saved)) return saved;
35
+ return DEFAULT_LANG;
36
+ }
37
+
38
+ // src/i18n.ts
39
+ function catalog(ko2, en2) {
40
+ return () => resolveLang() === "en" ? en2 : ko2;
41
+ }
42
+ var ko = {
43
+ common: {
44
+ yes: "y",
45
+ optional: "\uC120\uD0DD",
46
+ required: "\uD544\uC218",
47
+ skip: "\uAC74\uB108\uB700",
48
+ cancelled: "\uCDE8\uC18C\uB428",
49
+ unknownCommand: (cmd) => `\uC54C \uC218 \uC5C6\uB294 \uBA85\uB839: ${cmd}`,
50
+ error: (msg) => `\uC624\uB958: ${msg}`,
51
+ checkWith: "\uC810\uAC80: mimi-seed doctor"
52
+ },
53
+ lang: {
54
+ ask: " \uC5B8\uC5B4\uB97C \uC120\uD0DD\uD574\uC918 [1] \uD55C\uAD6D\uC5B4 [2] English (\uC5D4\uD130=\uD55C\uAD6D\uC5B4): ",
55
+ saved: (l) => ` \u2705 \uC5B8\uC5B4: ${l === "ko" ? "\uD55C\uAD6D\uC5B4" : "English"} (\uB098\uC911\uC5D0 \uBC14\uAFB8\uAE30: mimi-seed lang en)`,
56
+ usage: `${"mimi-seed lang"} \u2014 CLI \uCD9C\uB825 \uC5B8\uC5B4
57
+
58
+ mimi-seed lang \uD604\uC7AC \uC5B8\uC5B4 \uD45C\uC2DC
59
+ mimi-seed lang ko \uD55C\uAD6D\uC5B4
60
+ mimi-seed lang en English
61
+
62
+ \uD658\uACBD\uBCC0\uC218 MIMI_SEED_LANG \uAC00 \uC788\uC73C\uBA74 \uADF8\uAC8C \uC6B0\uC120\uD569\uB2C8\uB2E4.`,
63
+ current: (l) => `\uD604\uC7AC \uC5B8\uC5B4: ${l === "ko" ? "\uD55C\uAD6D\uC5B4 (ko)" : "English (en)"}`,
64
+ invalid: (v) => `\uC54C \uC218 \uC5C6\uB294 \uC5B8\uC5B4: ${v} (ko \uB610\uB294 en)`
65
+ },
66
+ setup: {
67
+ title: "mimi-seed setup",
68
+ platformsDetected: (p) => ` \uAC10\uC9C0\uB41C \uD50C\uB7AB\uD3FC: ${p}`,
69
+ statusTitle: "\uC5F0\uACB0 \uC0C1\uD0DC",
70
+ statusDir: "(~/.mimi-seed)",
71
+ groupCore: "\uD575\uC2EC",
72
+ groupCi: "\uBE4C\uB4DC / CI",
73
+ groupMarketing: "\uB9C8\uCF00\uD305 \xB7 AI",
74
+ fallbackWorking: "\uD3F4\uBC31\uC73C\uB85C \uB3D9\uC791 \uC911",
75
+ missingRequired: " \uD544\uC218 \uD56D\uBAA9 \uB204\uB77D:",
76
+ cannotInteract: " \u2717 \uC774 \uC790\uACA9\uC99D\uBA85\uC740 \uB300\uD654\uD615 \uC785\uB825\uC774 \uD544\uC694\uD574\uC11C \uC5EC\uAE30\uC11C\uB294 \uC124\uC815\uD560 \uC218 \uC5C6\uC5B4:",
77
+ cannotInteractHint: " \uD130\uBBF8\uB110\uC5D0\uC11C \uC2E4\uD589\uD574\uC918 (Git Bash \uB4F1 TTY \uBBF8\uAC10\uC9C0 \uD658\uACBD\uC774\uBA74 --interactive).",
78
+ runInTerminal: " \uB300\uD654\uD615\uC73C\uB85C \uC5F0\uACB0\uD558\uB824\uBA74 \uD130\uBBF8\uB110\uC5D0\uC11C: mimi-seed setup",
79
+ onlyAlreadyDone: " \u2705 \uC694\uCCAD\uD55C \uD56D\uBAA9\uC740 \uC774\uBBF8 \uC5F0\uACB0\uB3FC \uC788\uC5B4.",
80
+ onlyReconnectHint: " \uB2E4\uC2DC \uC124\uC815\uD558\uB824\uBA74: mimi-seed setup --reconnect <id>",
81
+ allDone: " \u2705 \uC5F0\uACB0\uD560 \uAC8C \uB354 \uC5C6\uC5B4. \uB2E4 \uB410\uB2E4.",
82
+ planCount: (n) => ` ${n}\uAC1C \uD56D\uBAA9\uC744 \uC21C\uC11C\uB300\uB85C \uBB3C\uC5B4\uBCFC\uAC8C. \uC5B8\uC81C\uB4E0 s=\uAC74\uB108\uB6F0\uAE30, q=\uC885\uB8CC.`,
83
+ prompt: " [c] \uC5F0\uACB0 [s] \uAC74\uB108\uB6F0\uAE30 [?] \uC774\uAC74 \uC5B4\uB5BB\uAC8C \uAD6C\uD558\uB098\uC694 [q] \uC885\uB8CC : ",
84
+ promptInvalid: " c / s / ? / q \uC911\uC5D0\uC11C \uACE8\uB77C\uC918.",
85
+ quit: " \uC911\uB2E8\uD588\uC5B4. \uC774\uC5B4\uC11C \uD558\uB824\uBA74 \uB2E4\uC2DC: mimi-seed setup",
86
+ skipped: (fix) => ` \uAC74\uB108\uB700. \uB098\uC911\uC5D0: ${fix}`,
87
+ obtainTitle: (label) => ` ${label} \u2014 \uBBF8\uB9AC \uC900\uBE44\uD560 \uAC83`,
88
+ obtainMore: (anchor) => ` \uC790\uC138\uD788: docs/credentials.md#${anchor}`,
89
+ neededFor: (platform) => `(${platform} \uBC30\uD3EC\uC5D0 \uD544\uC694)`,
90
+ binFailed: (label, code, fix) => ` \u26A0 ${label} \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC9C0 \uC54A\uC558\uC5B4 (exit ${code}). \uB098\uC911\uC5D0 \uB2E4\uC2DC: ${fix}`,
91
+ verifying: " \u{1F50E} \uD1A0\uD070 \uAC80\uC99D \uC911...",
92
+ verifyFailed: (reason) => ` \u274C \uD1A0\uD070 \uAC80\uC99D \uC2E4\uD328: ${reason}`,
93
+ notSaved: (fix) => ` \uC800\uC7A5\uD558\uC9C0 \uC54A\uC558\uC5B4. \uB2E4\uC2DC: ${fix}`,
94
+ ciSaved: (label, who) => ` \u2705 ${label} \uC5F0\uACB0\uB428${who} \u2192 ~/.mimi-seed/ci.json`,
95
+ runSeparately: (cmd) => ` \uC774\uAC74 \uBCC4\uB3C4 \uBA85\uB839\uC73C\uB85C \uC2E4\uD589\uD574\uC918: ${cmd}`,
96
+ envVar: " \uD658\uACBD\uBCC0\uC218\uB85C \uC124\uC815\uD558\uB294 \uD56D\uBAA9\uC774\uC57C:",
97
+ pressEnter: " (\uC5D4\uD130\uB97C \uB204\uB974\uBA74 \uACC4\uC18D) ",
98
+ stillMissing: " \uC544\uC9C1 \uD544\uC218 \uD56D\uBAA9\uC774 \uB0A8\uC544 \uC788\uC5B4:",
99
+ requiredDone: " \u2705 \uD544\uC218 \uC5F0\uACB0 \uC644\uB8CC.",
100
+ nextSteps: " \uC810\uAC80: mimi-seed doctor \xB7 \uBC30\uD3EC: mimi-seed deploy"
101
+ },
102
+ doctor: {
103
+ title: "mimi-seed doctor",
104
+ secAuth: "\uC778\uC99D",
105
+ secCreds: "\uB85C\uCEEC \uC790\uACA9\uC99D\uBA85 (~/.mimi-seed)",
106
+ secEnv: "\uB85C\uCEEC \uD658\uACBD",
107
+ secApps: "\uC571 \uAC10\uC9C0",
108
+ noToken: "Mimi Seed \uD1A0\uD070 \uC5C6\uC74C",
109
+ noTokenFix: "`mimi-seed init` \uC2E4\uD589 \uD544\uC694",
110
+ tokenSaved: "\uD1A0\uD070 \uC800\uC7A5\uB428",
111
+ endpoint: "\uC5D4\uB4DC\uD3EC\uC778\uD2B8",
112
+ ciMode: "CI \uBAA8\uB4DC",
113
+ ciModeDetail: "MIMI_SEED_TOKEN \uD658\uACBD\uBCC0\uC218 \uC0AC\uC6A9 \uC911",
114
+ tokenInvalid: "\uD1A0\uD070 \uAC80\uC99D \uC2E4\uD328",
115
+ serverOk: "Mimi Seed \uC11C\uBC84 \uC5F0\uACB0\uB428",
116
+ appCount: (n) => `\uC571 ${n}\uAC1C`,
117
+ unknownService: (id) => `${id} (\uC54C \uC218 \uC5C6\uB294 \uC11C\uBE44\uC2A4)`,
118
+ credsHint: " \uC804\uBD80 \uC5F0\uACB0\uD558\uAE30: mimi-seed setup \xB7 OAuth \uC2E0\uC120\uB3C4: mimi-seed auth status\n",
119
+ nodeTooOld: (v) => `${v} \u2014 v20 \uC774\uC0C1 \uD544\uC694 (.nvmrc \uCC38\uACE0)`,
120
+ gitRepo: "Git \uC800\uC7A5\uC18C",
121
+ gitTag: (t2) => `\uCD5C\uC2E0 \uD0DC\uADF8: ${t2}`,
122
+ gitCommits: (n) => `\uCEE4\uBC0B ${n}\uAC1C`,
123
+ noGit: "Git \uC800\uC7A5\uC18C \uC5C6\uC74C",
124
+ noGitDetail: "mimi-seed notes \uC0AC\uC6A9 \uBD88\uAC00",
125
+ noApp: "\uC571 \uAC10\uC9C0 \uC5C6\uC74C",
126
+ noAppDetail: "app.json / build.gradle / Info.plist \uC5C6\uC74C",
127
+ unnamed: "(\uC774\uB984 \uBBF8\uC0C1)",
128
+ requirements: (proj) => `${proj} \uC694\uAD6C\uC0AC\uD56D (.mimi-seed.json)`,
129
+ thisProject: "\uC774 \uD504\uB85C\uC81D\uD2B8"
130
+ },
131
+ auth: {
132
+ title: "mimi-seed auth \u2014 \uB85C\uCEEC \uC790\uACA9\uC99D\uBA85 \uC778\uC99D/\uAD00\uB9AC",
133
+ statusTitle: "\uB85C\uCEEC \uC790\uACA9\uC99D\uBA85 \uC0C1\uD0DC",
134
+ connectAll: "\n \uD55C \uBC88\uC5D0 \uC5F0\uACB0: mimi-seed setup",
135
+ unknownSub: (sub) => `\uC54C \uC218 \uC5C6\uB294 auth \uC11C\uBE0C\uBA85\uB839: ${sub}`,
136
+ npxFailed: (cmd, msg) => `
137
+ \u274C ${cmd} \uC2E4\uD589 \uC2E4\uD328: ${msg}
138
+ `
139
+ }
140
+ };
141
+ var en = {
142
+ common: {
143
+ yes: "y",
144
+ optional: "optional",
145
+ required: "required",
146
+ skip: "skipped",
147
+ cancelled: "Cancelled",
148
+ unknownCommand: (cmd) => `Unknown command: ${cmd}`,
149
+ error: (msg) => `Error: ${msg}`,
150
+ checkWith: "Check with: mimi-seed doctor"
151
+ },
152
+ lang: {
153
+ ask: " Choose a language [1] \uD55C\uAD6D\uC5B4 [2] English (Enter = \uD55C\uAD6D\uC5B4): ",
154
+ saved: (l) => ` \u2705 Language: ${l === "ko" ? "\uD55C\uAD6D\uC5B4" : "English"} (change later: mimi-seed lang ko)`,
155
+ usage: `mimi-seed lang \u2014 CLI output language
156
+
157
+ mimi-seed lang show current language
158
+ mimi-seed lang ko \uD55C\uAD6D\uC5B4
159
+ mimi-seed lang en English
160
+
161
+ MIMI_SEED_LANG takes precedence when set.`,
162
+ current: (l) => `Current language: ${l === "ko" ? "\uD55C\uAD6D\uC5B4 (ko)" : "English (en)"}`,
163
+ invalid: (v) => `Unknown language: ${v} (use ko or en)`
164
+ },
165
+ setup: {
166
+ title: "mimi-seed setup",
167
+ platformsDetected: (p) => ` Detected platforms: ${p}`,
168
+ statusTitle: "Connection status",
169
+ statusDir: "(~/.mimi-seed)",
170
+ groupCore: "Core",
171
+ groupCi: "Build / CI",
172
+ groupMarketing: "Marketing \xB7 AI",
173
+ fallbackWorking: "working via fallback",
174
+ missingRequired: " Missing required:",
175
+ cannotInteract: " \u2717 These need interactive input and cannot be set up here:",
176
+ cannotInteractHint: " Run it in a terminal (add --interactive if your shell hides the TTY, e.g. Git Bash).",
177
+ runInTerminal: " To connect interactively, run: mimi-seed setup",
178
+ onlyAlreadyDone: " \u2705 What you asked for is already connected.",
179
+ onlyReconnectHint: " To redo it: mimi-seed setup --reconnect <id>",
180
+ allDone: " \u2705 Nothing left to connect. You're set.",
181
+ planCount: (n) => ` I'll walk you through ${n} item(s). s = skip, q = quit, anytime.`,
182
+ prompt: " [c] connect [s] skip [?] how do I get this [q] quit : ",
183
+ promptInvalid: " Please choose c / s / ? / q.",
184
+ quit: " Stopped. To pick up where you left off: mimi-seed setup",
185
+ skipped: (fix) => ` Skipped. Later: ${fix}`,
186
+ obtainTitle: (label) => ` ${label} \u2014 what to get first`,
187
+ obtainMore: (anchor) => ` Details: docs/credentials.md#${anchor}`,
188
+ neededFor: (platform) => `(needed to ship to ${platform})`,
189
+ binFailed: (label, code, fix) => ` \u26A0 ${label} was not completed (exit ${code}). Try again later: ${fix}`,
190
+ verifying: " \u{1F50E} Verifying token...",
191
+ verifyFailed: (reason) => ` \u274C Token verification failed: ${reason}`,
192
+ notSaved: (fix) => ` Nothing was saved. Retry: ${fix}`,
193
+ ciSaved: (label, who) => ` \u2705 ${label} connected${who} \u2192 ~/.mimi-seed/ci.json`,
194
+ runSeparately: (cmd) => ` Run this one separately: ${cmd}`,
195
+ envVar: " This one is set through an environment variable:",
196
+ pressEnter: " (press Enter to continue) ",
197
+ stillMissing: " Still missing, and required:",
198
+ requiredDone: " \u2705 All required credentials connected.",
199
+ nextSteps: " Check: mimi-seed doctor \xB7 Ship: mimi-seed deploy"
200
+ },
201
+ doctor: {
202
+ title: "mimi-seed doctor",
203
+ secAuth: "Account",
204
+ secCreds: "Local credentials (~/.mimi-seed)",
205
+ secEnv: "Environment",
206
+ secApps: "App detection",
207
+ noToken: "No Mimi Seed token",
208
+ noTokenFix: "run `mimi-seed init`",
209
+ tokenSaved: "Token stored",
210
+ endpoint: "Endpoint",
211
+ ciMode: "CI mode",
212
+ ciModeDetail: "using MIMI_SEED_TOKEN",
213
+ tokenInvalid: "Token rejected",
214
+ serverOk: "Connected to Mimi Seed",
215
+ appCount: (n) => `${n} app(s)`,
216
+ unknownService: (id) => `${id} (unknown service)`,
217
+ credsHint: " Connect everything: mimi-seed setup \xB7 OAuth freshness: mimi-seed auth status\n",
218
+ nodeTooOld: (v) => `${v} \u2014 v20+ required (see .nvmrc)`,
219
+ gitRepo: "Git repository",
220
+ gitTag: (t2) => `latest tag: ${t2}`,
221
+ gitCommits: (n) => `${n} commit(s)`,
222
+ noGit: "Not a git repository",
223
+ noGitDetail: "mimi-seed notes is unavailable",
224
+ noApp: "No app detected",
225
+ noAppDetail: "no app.json / build.gradle / Info.plist",
226
+ unnamed: "(unnamed)",
227
+ requirements: (proj) => `${proj} requirements (.mimi-seed.json)`,
228
+ thisProject: "This project"
229
+ },
230
+ auth: {
231
+ title: "mimi-seed auth \u2014 local credential setup",
232
+ statusTitle: "Local credential status",
233
+ connectAll: "\n Connect everything at once: mimi-seed setup",
234
+ unknownSub: (sub) => `Unknown auth subcommand: ${sub}`,
235
+ npxFailed: (cmd, msg) => `
236
+ \u274C Failed to run ${cmd}: ${msg}
237
+ `
238
+ }
239
+ };
240
+ var CATALOGS = { ko, en };
241
+ function t() {
242
+ return CATALOGS[resolveLang()];
243
+ }
244
+
245
+ export {
246
+ writeSettings,
247
+ isLangUnset,
248
+ isLang,
249
+ resolveLang,
250
+ catalog,
251
+ t
252
+ };