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.
- package/README.md +1 -1
- package/dist/index.js +135 -62
- 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/
|
|
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
|
|
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
|
|
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
|
-
|
|
819
|
-
|
|
820
|
-
|
|
887
|
+
log2(kleur6.bold("Mimi Seed CLI \u2014 init"));
|
|
888
|
+
log2(kleur6.dim(cwd));
|
|
889
|
+
log2("");
|
|
821
890
|
if (!await hasAnyProjectSignal(cwd)) {
|
|
822
|
-
|
|
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
|
-
|
|
893
|
+
log2("\u{1F50D} \uC571 \uAC10\uC9C0 \uC911...");
|
|
825
894
|
const hints = await detectHints(cwd);
|
|
826
895
|
if (hints.length === 0) {
|
|
827
|
-
|
|
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
|
-
|
|
900
|
+
log2(` \u2022 ${h.name ?? "(\uC774\uB984 \uBBF8\uC0C1)"} ${kleur6.dim(tag)}`);
|
|
832
901
|
}
|
|
833
902
|
}
|
|
834
|
-
|
|
903
|
+
log2("");
|
|
835
904
|
if (process.env.MIMI_SEED_TOKEN) {
|
|
836
905
|
const cfg2 = await getEffectiveConfig();
|
|
837
906
|
if (cfg2 && hints.length > 0) {
|
|
838
|
-
|
|
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
|
-
|
|
911
|
+
log2(kleur6.red("\uB4F1\uB85D \uC2E4\uD328: " + result.text));
|
|
843
912
|
} else {
|
|
844
|
-
for (const line of result.text.split("\n"))
|
|
913
|
+
for (const line of result.text.split("\n")) log2(" " + line);
|
|
845
914
|
}
|
|
846
915
|
}
|
|
847
|
-
|
|
916
|
+
log2(kleur6.bold("\u2713 \uC644\uB8CC (CI \uBAA8\uB4DC)"));
|
|
848
917
|
return;
|
|
849
918
|
}
|
|
850
|
-
|
|
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
|
-
|
|
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
|
-
|
|
931
|
+
log2(kleur6.red("\uC5F0\uACB0 \uC2E4\uD328: " + e.message));
|
|
863
932
|
process.exit(1);
|
|
864
933
|
}
|
|
865
|
-
|
|
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
|
-
|
|
875
|
-
|
|
943
|
+
log2(kleur6.dim(` \uC800\uC7A5\uB428: ${CONFIG_LOCATION}`));
|
|
944
|
+
log2("");
|
|
876
945
|
if (hints.length > 0) {
|
|
877
|
-
|
|
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
|
-
|
|
950
|
+
log2(kleur6.red("\uB4F1\uB85D \uC2E4\uD328: " + result.text));
|
|
882
951
|
} else {
|
|
883
|
-
for (const line of result.text.split("\n"))
|
|
952
|
+
for (const line of result.text.split("\n")) log2(" " + line);
|
|
884
953
|
}
|
|
885
|
-
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
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
|
-
|
|
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
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
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
|
-
|
|
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"))
|
|
989
|
+
for (const line of r.text.split("\n")) log2(" " + line);
|
|
921
990
|
}
|
|
922
991
|
async function cmdLogout() {
|
|
923
992
|
await deleteConfig();
|
|
924
|
-
|
|
925
|
-
|
|
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
|
-
|
|
997
|
+
log2(`${kleur6.bold("mimi-seed")} \u2014 Claude Code\uC5D0\uC11C \uC571 \uCD9C\uC2DC \uC6B4\uC601
|
|
929
998
|
|
|
930
|
-
${
|
|
931
|
-
${
|
|
932
|
-
${
|
|
933
|
-
${
|
|
934
|
-
${
|
|
935
|
-
${
|
|
936
|
-
${
|
|
937
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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
|
-
|
|
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
|
-
|
|
1006
|
-
if (process.env.DEBUG)
|
|
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
|
}
|