mimi-seed 0.19.12 → 0.19.13
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
|
@@ -1,386 +1,50 @@
|
|
|
1
1
|
# mimi-seed
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
git log에서 릴리즈 노트를 생성하고, 출시 전 위험 요소를 자동 점검하며, Play Store / App Store에 바로 적용합니다.
|
|
6
|
-
|
|
7
|
-
## 빠른 시작
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npx mimi-seed check --local
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
로그인 없이 현재 저장소의 앱 식별자, Android Target API, Google Play Billing 지원 상태를 먼저 검사합니다.
|
|
14
|
-
검사기는 CLI에 번들되어 전체 MCP 패키지를 추가 설치하지 않으며, 저장소 전용 모드에서는 네트워크도 호출하지
|
|
15
|
-
않습니다. 정책 결과에는 근거 파일과 공식 출처가 포함됩니다. 실제 스토어 상태까지 연결하려면 그다음 실행합니다.
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npx mimi-seed init
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
현재 디렉토리에서 Android/iOS 앱을 자동 감지해 Mimi Seed 워크스페이스에 등록하고, PAT를 `~/.mimi-seed/config.json`에 저장합니다. 프로젝트 컨텍스트는 Claude Code용 `.claude/mimi-seed.md`와 Codex용 `AGENTS.md`에 함께 기록됩니다.
|
|
22
|
-
|
|
23
|
-
## 명령어
|
|
24
|
-
|
|
25
|
-
| 명령어 | 설명 |
|
|
26
|
-
|--------|------|
|
|
27
|
-
| `mimi-seed init` | 프로젝트를 Mimi Seed에 연결 (PAT 발급 + 앱 자동 등록 + `.claude/mimi-seed.md` / `AGENTS.md` 주입) |
|
|
28
|
-
| `mimi-seed setup` | **가진 계정을 한 번에 연결** (안내형 마법사) — 뭐가 빠졌는지 보여주고, 각 토큰을 어디서 발급받는지 알려줌 |
|
|
29
|
-
| `mimi-seed status` | 연결 상태 + 등록 앱 목록 |
|
|
30
|
-
| `mimi-seed auth` | 자격증명 개별 인증 — `login` / `appstore` / `playstore` / `bigquery` / `jenkins` / `ci` / `googleads` / `facebook` / `instagram` / `threads` |
|
|
31
|
-
| `mimi-seed doctor` | 환경 진단 (토큰·Git·앱·CI 한 번에 체크) |
|
|
32
|
-
| `mimi-seed check` | 계정이 없으면 로컬 Release Doctor, 연결 후에는 원격 Readiness 점검 |
|
|
33
|
-
| `mimi-seed notes` | AI 릴리즈 노트 생성 (git log → 3 톤 → 다국어 → 적용) |
|
|
34
|
-
| `mimi-seed review` | AI 리뷰 답변 초안 생성 및 Play Store 게시 |
|
|
35
|
-
| `mimi-seed deploy` | 앱 자동 배포 파이프라인 (CI 빌드 → 릴리즈 노트 → 스토어 적용) |
|
|
36
|
-
| `mimi-seed restart` | MCP 서버 프로세스 재시작 |
|
|
37
|
-
| `mimi-seed logout` | 로컬 설정 삭제 |
|
|
38
|
-
|
|
39
|
-
> `init`은 `.claude/mimi-seed.md`와 `AGENTS.md`를 함께 생성해 Claude Code와 Codex 세션마다 에이전트 컨텍스트(출시 워크플로우 + 슬래시 커맨드)를 자동 활성화합니다.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## mimi-seed notes
|
|
44
|
-
|
|
45
|
-
git 커밋 내역으로 앱 스토어 릴리즈 노트를 자동 생성합니다.
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# 기본: 최신 태그 이후 커밋 → 간결/상세/마케팅 3 톤 생성
|
|
49
|
-
mimi-seed notes
|
|
50
|
-
|
|
51
|
-
# 태그 범위 지정
|
|
52
|
-
mimi-seed notes --from v1.2.0 --to HEAD
|
|
53
|
-
|
|
54
|
-
# 다국어 동시 생성 (AI 필요)
|
|
55
|
-
mimi-seed notes --locale ko,en-US,ja
|
|
56
|
-
|
|
57
|
-
# 생성 후 Play Store 바로 적용
|
|
58
|
-
mimi-seed notes --apply
|
|
59
|
-
|
|
60
|
-
# CI 모드 (프롬프트 없음)
|
|
61
|
-
mimi-seed notes --no-interactive --apply
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**AI 생성 활성화** (`ANTHROPIC_API_KEY` 설정 시):
|
|
65
|
-
```bash
|
|
66
|
-
export ANTHROPIC_API_KEY=sk-ant-...
|
|
67
|
-
mimi-seed notes --locale ko,en-US,ja
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
설정하지 않으면 커밋 메시지 자동 포맷팅으로 동작합니다.
|
|
71
|
-
|
|
72
|
-
### 옵션
|
|
73
|
-
|
|
74
|
-
| 옵션 | 기본값 | 설명 |
|
|
75
|
-
|------|--------|------|
|
|
76
|
-
| `--from <ref>` | 최신 태그 | 시작 커밋 또는 태그 |
|
|
77
|
-
| `--to <ref>` | `HEAD` | 끝 커밋 |
|
|
78
|
-
| `--locale <list>` | `ko,en-US` | 다국어 로케일 (쉼표 구분) |
|
|
79
|
-
| `--apply` | false | 생성 후 스토어에 바로 적용 |
|
|
80
|
-
| `--no-interactive` | false | CI 모드 (프롬프트 없음) |
|
|
81
|
-
| `--limit <n>` | 30 | 최대 커밋 수 |
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## mimi-seed check
|
|
86
|
-
|
|
87
|
-
계정 연결 전에는 현재 저장소를 읽기 전용으로 검사하고, 연결 후에는 원격 Readiness 점수와 블로커를
|
|
88
|
-
확인합니다. `--local`은 연결 상태와 관계없이 로컬 검사만 실행합니다.
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
mimi-seed check
|
|
92
|
-
|
|
93
|
-
# 로그인 없이 저장소만 검사
|
|
94
|
-
mimi-seed check --local
|
|
95
|
-
|
|
96
|
-
# 모노레포의 특정 앱 검사
|
|
97
|
-
mimi-seed check --local --path apps/mobile
|
|
98
|
-
|
|
99
|
-
# CI에서 블로커 있으면 exit 1
|
|
100
|
-
mimi-seed check --local --fail-on-blocker
|
|
101
|
-
|
|
102
|
-
# JSON 보고서
|
|
103
|
-
mimi-seed check --local --json
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### 옵션
|
|
107
|
-
|
|
108
|
-
| 옵션 | 설명 |
|
|
109
|
-
|------|------|
|
|
110
|
-
| `--app <id>` | 앱 ID 지정 (기본: 첫 번째 등록 앱) |
|
|
111
|
-
| `--local` | 로그인 없이 현재 저장소만 검사 |
|
|
112
|
-
| `--path <dir>` | 로컬 검사 대상 경로 (기본: 현재 폴더) |
|
|
113
|
-
| `--json` | 로컬 검사 결과를 JSON으로 출력 |
|
|
114
|
-
| `--fail-on-blocker` | 블로커 존재 시 exit 1 (CI/CD용) |
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## mimi-seed doctor
|
|
119
|
-
|
|
120
|
-
로컬 환경 전체를 진단합니다.
|
|
3
|
+
Find mobile release risks before connecting store accounts.
|
|
121
4
|
|
|
122
5
|
```bash
|
|
123
|
-
mimi-seed
|
|
124
|
-
# ✓ 토큰 저장됨 prs_abc1... (2026-04-25)
|
|
125
|
-
# ✓ 엔드포인트 https://mimi-seed.pryzm.gg/api/mcp
|
|
126
|
-
# ✓ Mimi Seed 서버 연결됨 앱 2개
|
|
127
|
-
#
|
|
128
|
-
# ── 로컬 환경 ──
|
|
129
|
-
# ✓ Node.js v22.17.0
|
|
130
|
-
# ✓ Git 저장소 최신 태그: v1.3.0
|
|
131
|
-
# ⚠ ANTHROPIC_API_KEY 없음 설정 시 AI 릴리즈 노트/리뷰 답변 생성 가능
|
|
132
|
-
#
|
|
133
|
-
# ── 앱 감지 ──
|
|
134
|
-
# ✓ MyApp android:com.example.myapp ios:com.example.myapp
|
|
6
|
+
npx -y mimi-seed@latest check --local
|
|
135
7
|
```
|
|
136
8
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
9
|
+
Run in an Expo, React Native, Android, iOS or Unity app repository. Requires Node 20+.
|
|
10
|
+
Release Doctor reports identifiers, Target API and detectable Play Billing evidence with suggested actions.
|
|
11
|
+
Unresolved evidence remains a warning. A local pass does not guarantee store approval.
|
|
140
12
|
|
|
141
|
-
|
|
13
|
+
The checker is bundled; it does not install the full MCP server. Optional usage measurement is off by
|
|
14
|
+
default. See `mimi-seed telemetry --help` and the [privacy notice](https://mimi-seed.pryzm.gg/privacy/sdk-usage).
|
|
142
15
|
|
|
143
|
-
|
|
144
|
-
# 대화형 — 리뷰 입력 후 답변 생성
|
|
145
|
-
mimi-seed review
|
|
16
|
+
## Next steps
|
|
146
17
|
|
|
147
|
-
|
|
148
|
-
|
|
18
|
+
- Connect store checks: `npx mimi-seed init`, then `npx mimi-seed setup`.
|
|
19
|
+
- Repeat in CI: `npx mimi-seed check --local --fail-on-blocker`.
|
|
20
|
+
- Switch output language: `mimi-seed lang en`.
|
|
21
|
+
- Full options: `mimi-seed <command> --help`.
|
|
149
22
|
|
|
150
|
-
|
|
151
|
-
|
|
23
|
+
[Claude Code / Codex installation](https://github.com/jeonghwanko/mimi-seed-sdk#30-second-setup)
|
|
24
|
+
· [CI workflow and badge](https://github.com/jeonghwanko/mimi-seed-sdk/blob/main/docs/user-guide/release-doctor-ci.md)
|
|
25
|
+
· [Validation examples](https://mimi-seed.pryzm.gg/guides/validation-examples)
|
|
152
26
|
|
|
153
|
-
|
|
154
|
-
mimi-seed review --text "버그 있어요" --rating 2 \
|
|
155
|
-
--apply --package-name com.example.app --review-id <reviewId>
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### 옵션
|
|
159
|
-
|
|
160
|
-
| 옵션 | 기본값 | 설명 |
|
|
161
|
-
|------|--------|------|
|
|
162
|
-
| `--text <내용>` | (프롬프트) | 리뷰 원문 |
|
|
163
|
-
| `--rating <1-5>` | — | 별점 (맥락용) |
|
|
164
|
-
| `--tone <tone>` | `friendly` | `friendly` / `professional` / `empathetic` / `brief` |
|
|
165
|
-
| `--language <코드>` | `ko` | 답변 언어 (`ko`, `en`, `ja` 등) |
|
|
166
|
-
| `--app-name <이름>` | — | 앱 이름 (프롬프트 맥락용) |
|
|
167
|
-
| `--apply` | false | 답변을 Play Store에 바로 게시 |
|
|
168
|
-
| `--review-id <id>` | — | 게시 대상 리뷰 ID (`--apply` 시 필요) |
|
|
169
|
-
| `--package-name <p>` | — | Android 패키지명 (`--apply` 시 필요) |
|
|
170
|
-
| `--no-interactive` | false | CI 모드 (프롬프트 없음) |
|
|
171
|
-
|
|
172
|
-
> AI 생성 답변은 초안입니다. 게시 전 반드시 검토하세요.
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## mimi-seed setup
|
|
177
|
-
|
|
178
|
-
가진 계정을 **한 번에** 연결하는 안내형 마법사입니다. 연결 상태를 먼저 보여주고, 아직 안 된 것만 순서대로
|
|
179
|
-
물어봅니다. 각 항목에서 `?` 를 누르면 그 토큰을 **어디서 어떻게 발급받는지** 알려줍니다.
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
mimi-seed setup # 안내를 따라가며 연결
|
|
183
|
-
mimi-seed setup --only jenkins # 특정 항목만
|
|
184
|
-
mimi-seed setup --reconnect appstore # 이미 연결된 것도 다시 설정
|
|
185
|
-
mimi-seed setup --fail-on-missing # 필수 자격증명 없으면 exit 1 (CI 게이트)
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
이미 연결된 항목은 건너뛰므로 중간에 그만두고 나중에 다시 실행해도 됩니다.
|
|
189
|
-
비TTY / CI 환경에서는 아무것도 묻지 않고 상태표만 출력합니다.
|
|
190
|
-
전체 레퍼런스: [`docs/credentials.md`](../../docs/credentials.md)
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## mimi-seed auth
|
|
195
|
-
|
|
196
|
-
자격증명을 **개별로** 인증합니다. 실제 로직은 `@yoonion/mimi-seed-mcp` 의 `mimi-seed-*-auth` CLI 에 있고,
|
|
197
|
-
이 명령은 그걸 호출하는 통합 front door 입니다.
|
|
198
|
-
|
|
199
|
-
```bash
|
|
200
|
-
mimi-seed auth login # Google OAuth — 브라우저 로그인 (Firebase/AdMob/Play/Ads/GSC/GA4/IAM/BigQuery)
|
|
201
|
-
mimi-seed auth status # 현재 토큰 상태 (--all: 모든 자격증명 보유 여부)
|
|
202
|
-
mimi-seed auth refresh # refresh_token으로 갱신만 시도 (브라우저 X)
|
|
203
|
-
mimi-seed auth logout # 토큰 삭제
|
|
27
|
+
## Commands
|
|
204
28
|
|
|
205
|
-
|
|
206
|
-
mimi-seed auth playstore # Play 서비스 계정 (선택 — OAuth로도 대부분 동작)
|
|
207
|
-
mimi-seed auth bigquery # BigQuery 서비스 계정 (선택)
|
|
208
|
-
mimi-seed auth jenkins # Jenkins (저장 전 서버 프로브)
|
|
209
|
-
mimi-seed auth ci # GitHub Actions / GitLab CI
|
|
210
|
-
mimi-seed auth googleads # Google Ads
|
|
211
|
-
mimi-seed auth meta # Facebook · Instagram · Threads 통합 진입
|
|
212
|
-
mimi-seed auth facebook # Facebook 페이지
|
|
213
|
-
mimi-seed auth instagram # Instagram
|
|
214
|
-
mimi-seed auth threads # Threads
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### App Store Connect 재인증과 Vendor Number
|
|
218
|
-
|
|
219
|
-
`mimi-seed auth appstore`는 새 API key를 Apple API로 검증한 뒤에만 저장합니다. 기존 연결이 있으면 첫
|
|
220
|
-
질문에서 다음 중 하나를 선택합니다.
|
|
221
|
-
|
|
222
|
-
| 입력 | 동작 |
|
|
29
|
+
| Command | Purpose |
|
|
223
30
|
|---|---|
|
|
224
|
-
|
|
|
225
|
-
|
|
|
226
|
-
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
247
|
-
## mimi-seed deploy
|
|
248
|
-
|
|
249
|
-
CI 빌드부터 스토어 적용까지 출시 파이프라인 전체를 자동화합니다. 단계: **init → verify(블로커 점검) → notes(릴리즈 노트) → apply(스토어 적용) → promote**.
|
|
250
|
-
|
|
251
|
-
```bash
|
|
252
|
-
# Android 기본 배포 (CI 빌드 자동 감지 → Play Store)
|
|
253
|
-
mimi-seed deploy
|
|
254
|
-
|
|
255
|
-
# iOS 배포
|
|
256
|
-
mimi-seed deploy --platform ios
|
|
257
|
-
|
|
258
|
-
# 이미 빌드된 버전으로 노트만 적용 (CI 빌드 건너뜀)
|
|
259
|
-
mimi-seed deploy --skip-build --version-code 142
|
|
260
|
-
|
|
261
|
-
# 실제 배포 없이 파이프라인만 테스트
|
|
262
|
-
mimi-seed deploy --dry-run
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
지원 CI: **Jenkins · GitHub Actions · GitLab CI** (`--ci`로 강제 선택, 기본은 자동 감지).
|
|
266
|
-
|
|
267
|
-
### CI 설정 등록 (최초 1회)
|
|
268
|
-
|
|
269
|
-
```bash
|
|
270
|
-
mimi-seed deploy setup-jenkins # Jenkins URL·토큰·잡 이름 대화형 등록
|
|
271
|
-
mimi-seed deploy setup-github # GitHub Actions repo·workflow 등록
|
|
272
|
-
mimi-seed deploy setup-gitlab # GitLab project·trigger 등록
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
### 옵션
|
|
276
|
-
|
|
277
|
-
| 옵션 | 기본값 | 설명 |
|
|
278
|
-
|------|--------|------|
|
|
279
|
-
| `--platform android\|ios` | `android` | 배포 플랫폼 |
|
|
280
|
-
| `--app <id>` | 첫 등록 앱 | 앱 ID 지정 |
|
|
281
|
-
| `--version-code <n>` | — | 빌드 번호 직접 지정 (`--skip-build`와 함께) |
|
|
282
|
-
| `--from <ref>` / `--to <ref>` | 최신 태그 / `HEAD` | 릴리즈 노트용 커밋 범위 |
|
|
283
|
-
| `--language <코드>` | `ko-KR` | 릴리즈 노트 언어 |
|
|
284
|
-
| `--dry-run` | false | 실제 배포 없이 파이프라인 테스트 |
|
|
285
|
-
| `--skip-build` | false | CI 빌드 건너뜀 (`--version-code` 필수) |
|
|
286
|
-
| `--ci jenkins\|github\|gitlab` | auto | CI 강제 선택 |
|
|
287
|
-
| `--workflow <file>` | — | GitHub workflow 파일 (예: `deploy.yml`) |
|
|
288
|
-
| `--ref <branch\|tag>` | `main` | GitHub/GitLab 브랜치/태그 |
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## CI/CD 사용
|
|
293
|
-
|
|
294
|
-
### 방법 1 — 재사용 가능 워크플로우 (권장)
|
|
295
|
-
|
|
296
|
-
`.github/workflows/release.yml` 파일 하나만 추가하면 끝납니다.
|
|
297
|
-
|
|
298
|
-
```yaml
|
|
299
|
-
name: App Release
|
|
300
|
-
|
|
301
|
-
on:
|
|
302
|
-
push:
|
|
303
|
-
tags: ['v*'] # v1.2.3 태그 push 시 자동 실행
|
|
304
|
-
workflow_dispatch: # 수동 실행 버튼
|
|
305
|
-
|
|
306
|
-
jobs:
|
|
307
|
-
release:
|
|
308
|
-
uses: jeonghwanko/mimi-seed/.github/workflows/mimi-seed-release.yml@master
|
|
309
|
-
with:
|
|
310
|
-
locales: 'ko,en-US' # 다국어 릴리즈 노트
|
|
311
|
-
apply-notes: true # 스토어에 자동 적용
|
|
312
|
-
fail-on-blocker: true # 블로커 있으면 실패
|
|
313
|
-
secrets:
|
|
314
|
-
MIMI_SEED_TOKEN: ${{ secrets.MIMI_SEED_TOKEN }}
|
|
315
|
-
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # 선택: AI 생성
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### 방법 2 — 기존 워크플로우에 스텝 추가
|
|
319
|
-
|
|
320
|
-
```yaml
|
|
321
|
-
- name: 릴리즈 노트 생성 및 적용
|
|
322
|
-
env:
|
|
323
|
-
MIMI_SEED_TOKEN: ${{ secrets.MIMI_SEED_TOKEN }}
|
|
324
|
-
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
325
|
-
run: |
|
|
326
|
-
npx mimi-seed notes --apply --no-interactive --locale ko,en-US
|
|
327
|
-
npx mimi-seed check --fail-on-blocker
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
`MIMI_SEED_TOKEN`은 [대시보드 → API 토큰](https://mimi-seed.pryzm.gg/workspace/api-tokens)에서 발급하세요.
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
|
-
## Claude Code / Codex MCP 등록
|
|
335
|
-
|
|
336
|
-
`init` 후 1회 실행:
|
|
337
|
-
|
|
338
|
-
```bash
|
|
339
|
-
claude mcp add --transport http mimi-seed https://mimi-seed.pryzm.gg/api/mcp \
|
|
340
|
-
--header "Authorization: Bearer <PAT>"
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
Codex는 자동 쓰기 명령을 사용할 수 있습니다.
|
|
344
|
-
|
|
345
|
-
```bash
|
|
346
|
-
mimi-seed mcp codex --write
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
이 명령은 `mimi-seed-remote` HTTP 항목과 `bearer_token_env_var = "MIMI_SEED_TOKEN"`을 기록하며 PAT 자체는
|
|
350
|
-
`config.toml`에 쓰지 않습니다. Codex를 실행하는 환경에 `MIMI_SEED_TOKEN`을 설정하고 Codex를 다시 시작하세요.
|
|
351
|
-
|
|
352
|
-
등록 후 Claude Code 또는 Codex에서 대화로 제어:
|
|
353
|
-
|
|
354
|
-
```
|
|
355
|
-
"내 앱 출시 준비됐어?"
|
|
356
|
-
"릴리즈 노트 써줘"
|
|
357
|
-
"스크린샷 검수해줘"
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
---
|
|
361
|
-
|
|
362
|
-
## 앱 감지 대상
|
|
363
|
-
|
|
364
|
-
- `app.json` / `app.config.json` (Expo, React Native)
|
|
365
|
-
- `**/build.gradle(.kts)` — `applicationId`
|
|
366
|
-
- `**/Info.plist` — `CFBundleIdentifier`
|
|
367
|
-
- `**/project.pbxproj` — `PRODUCT_BUNDLE_IDENTIFIER`
|
|
368
|
-
- `package.json` — 앱 이름 보충
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## 환경변수
|
|
373
|
-
|
|
374
|
-
| 변수 | 설명 |
|
|
375
|
-
|------|------|
|
|
376
|
-
| `MIMI_SEED_TOKEN` | PAT 토큰 — CI/CD 무인증 모드 |
|
|
377
|
-
| `MIMI_SEED_WEB_BASE` | 서버 주소 (기본: `https://mimi-seed.pryzm.gg`) |
|
|
378
|
-
| `ANTHROPIC_API_KEY` | AI 릴리즈 노트/리뷰 답변 생성 활성화 (선택) |
|
|
379
|
-
| `DEBUG` | `1` 설정 시 오류 스택 트레이스 출력 |
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
## 관련 패키지
|
|
384
|
-
|
|
385
|
-
- [`@yoonion/mimi-seed-mcp`](https://www.npmjs.com/package/@yoonion/mimi-seed-mcp) — Claude Code / Codex / Cursor용 로컬 MCP 서버 (Firebase · Play Store · App Store · AdMob)
|
|
386
|
-
- [mimi-seed.pryzm.gg/tool](https://mimi-seed.pryzm.gg/tool) — 웹 콘솔 (스크린샷 검수, Copy Studio, 팀 워크스페이스)
|
|
31
|
+
| check | Local or connected release readiness |
|
|
32
|
+
| init | Connect the app and create agent context |
|
|
33
|
+
| setup | Guided account setup |
|
|
34
|
+
| telemetry | Optional usage measurement consent |
|
|
35
|
+
| doctor | Diagnose the environment and connections |
|
|
36
|
+
| notes | Generate release notes from Git history |
|
|
37
|
+
| review | Draft review replies |
|
|
38
|
+
| deploy | Orchestrate CI and store operations |
|
|
39
|
+
| auth | Manage individual connections |
|
|
40
|
+
| lang | Select English or Korean |
|
|
41
|
+
|
|
42
|
+
## 한국어
|
|
43
|
+
|
|
44
|
+
앱 저장소에서 위 명령을 실행하면 로그인 없이 출시 위험을 점검합니다.
|
|
45
|
+
[한국어 사용 가이드](https://github.com/jeonghwanko/mimi-seed-sdk/blob/main/README.ko.md)를 참고하세요.
|
|
46
|
+
|
|
47
|
+
## License
|
|
48
|
+
|
|
49
|
+
Licensed under [PolyForm Noncommercial](https://github.com/jeonghwanko/mimi-seed-sdk/blob/main/LICENSE).
|
|
50
|
+
Commercial use requires a separate license.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// src/setup.ts
|
|
4
4
|
import kleur2 from "kleur";
|
|
5
5
|
import * as readline2 from "readline";
|
|
6
|
-
import
|
|
6
|
+
import os7 from "os";
|
|
7
7
|
|
|
8
8
|
// src/credentials.ts
|
|
9
9
|
import fs3 from "fs";
|
|
@@ -1714,8 +1714,8 @@ async function triggerBuild(cfg, jobName, params) {
|
|
|
1714
1714
|
if (!res.ok) {
|
|
1715
1715
|
throw new Error(M3().jenkinsTriggerFailed(res.status, await res.text()));
|
|
1716
1716
|
}
|
|
1717
|
-
const
|
|
1718
|
-
const match =
|
|
1717
|
+
const location2 = res.headers.get("Location") ?? "";
|
|
1718
|
+
const match = location2.match(/\/queue\/item\/(\d+)\//);
|
|
1719
1719
|
return match?.[1] ?? "";
|
|
1720
1720
|
}
|
|
1721
1721
|
async function getQueueBuildNumber(cfg, queueItemId) {
|
|
@@ -2087,6 +2087,130 @@ async function cmdDeploy(argv) {
|
|
|
2087
2087
|
log(kleur.dim(" https://play.google.com/console/developers"));
|
|
2088
2088
|
}
|
|
2089
2089
|
|
|
2090
|
+
// src/telemetry.ts
|
|
2091
|
+
import fs9 from "fs";
|
|
2092
|
+
import os6 from "os";
|
|
2093
|
+
import path10 from "path";
|
|
2094
|
+
import { createHmac, randomUUID } from "crypto";
|
|
2095
|
+
|
|
2096
|
+
// package.json
|
|
2097
|
+
var version = "0.19.13";
|
|
2098
|
+
|
|
2099
|
+
// src/telemetry.ts
|
|
2100
|
+
var ENDPOINT = "https://mimi-seed.pryzm.gg/api/sdk-usage";
|
|
2101
|
+
var M4 = catalog(
|
|
2102
|
+
{
|
|
2103
|
+
notice: "\uC120\uD0DD\uC801 \uC0AC\uC6A9\uB7C9 \uCE21\uC815\uC740 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4. \uC548\uB0B4: mimi-seed telemetry --help\n",
|
|
2104
|
+
enabled: "\uC0AC\uC6A9\uB7C9 \uCE21\uC815 \uCF1C\uC9D0. \uC784\uC758 \uC124\uCE58 ID\xB7\uD504\uB85C\uC81D\uD2B8 \uD574\uC2DC\xB7\uBC84\uC804\xB7OS\xB7\uACB0\uACFC \uCF54\uB4DC\xB7\uC2E4\uD589\uC2DC\uAC04\uC744 \uC804\uC1A1\uD569\uB2C8\uB2E4. \uB044\uAE30: mimi-seed telemetry off\n",
|
|
2105
|
+
disabled: "\uC0AC\uC6A9\uB7C9 \uCE21\uC815 \uAEBC\uC9D0. MIMI_SEED_TELEMETRY=0\uC73C\uB85C\uB3C4 \uB04C \uC218 \uC788\uC2B5\uB2C8\uB2E4.\n",
|
|
2106
|
+
invalid: "\uC0AC\uC6A9\uBC95: mimi-seed telemetry on|off|status\n"
|
|
2107
|
+
},
|
|
2108
|
+
{
|
|
2109
|
+
notice: "Optional usage measurement is off. Learn more: mimi-seed telemetry --help\n",
|
|
2110
|
+
enabled: "Usage measurement enabled: random installation ID, project hash, version, OS, result codes and duration. Disable: mimi-seed telemetry off\n",
|
|
2111
|
+
disabled: "Usage measurement disabled. MIMI_SEED_TELEMETRY=0 also disables it.\n",
|
|
2112
|
+
invalid: "Usage: mimi-seed telemetry on|off|status\n"
|
|
2113
|
+
}
|
|
2114
|
+
);
|
|
2115
|
+
var location = () => path10.join(os6.homedir(), ".mimi-seed", "telemetry.json");
|
|
2116
|
+
function readConsent() {
|
|
2117
|
+
try {
|
|
2118
|
+
return JSON.parse(fs9.readFileSync(location(), "utf8"));
|
|
2119
|
+
} catch {
|
|
2120
|
+
return { enabled: false };
|
|
2121
|
+
}
|
|
2122
|
+
}
|
|
2123
|
+
function writeConsent(value) {
|
|
2124
|
+
const file = location();
|
|
2125
|
+
fs9.mkdirSync(path10.dirname(file), { recursive: true, mode: 448 });
|
|
2126
|
+
const temp = `${file}.${randomUUID()}.tmp`;
|
|
2127
|
+
fs9.writeFileSync(temp, JSON.stringify(value), { mode: 384 });
|
|
2128
|
+
fs9.renameSync(temp, file);
|
|
2129
|
+
}
|
|
2130
|
+
function telemetryEnabled() {
|
|
2131
|
+
if (process.env.MIMI_SEED_TELEMETRY !== void 0) return process.env.MIMI_SEED_TELEMETRY === "1";
|
|
2132
|
+
return readConsent().enabled === true;
|
|
2133
|
+
}
|
|
2134
|
+
function telemetryNotice() {
|
|
2135
|
+
return telemetryEnabled() ? "" : M4().notice;
|
|
2136
|
+
}
|
|
2137
|
+
function cmdTelemetry(argv) {
|
|
2138
|
+
const action = argv[0] ?? "status";
|
|
2139
|
+
if (argv.length > 1 || !["on", "off", "status"].includes(action)) {
|
|
2140
|
+
process.stderr.write(M4().invalid);
|
|
2141
|
+
process.exitCode = 2;
|
|
2142
|
+
return;
|
|
2143
|
+
}
|
|
2144
|
+
if (action === "on") {
|
|
2145
|
+
const consent = readConsent();
|
|
2146
|
+
writeConsent({ enabled: true, installationId: consent.installationId ?? randomUUID(), salt: consent.salt ?? randomUUID() });
|
|
2147
|
+
}
|
|
2148
|
+
if (action === "off") writeConsent({ enabled: false });
|
|
2149
|
+
process.stdout.write(telemetryEnabled() ? M4().enabled : M4().disabled);
|
|
2150
|
+
}
|
|
2151
|
+
function frameworkAt(root) {
|
|
2152
|
+
if (fs9.existsSync(path10.join(root, "ProjectSettings", "ProjectSettings.asset"))) return "unity";
|
|
2153
|
+
try {
|
|
2154
|
+
const pkg = JSON.parse(fs9.readFileSync(path10.join(root, "package.json"), "utf8"));
|
|
2155
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
2156
|
+
if (deps.expo) return "expo";
|
|
2157
|
+
if (deps["react-native"]) return "react-native";
|
|
2158
|
+
} catch {
|
|
2159
|
+
}
|
|
2160
|
+
return "native-or-unknown";
|
|
2161
|
+
}
|
|
2162
|
+
function usageRun(command, projectPath) {
|
|
2163
|
+
if (!telemetryEnabled()) return async () => {
|
|
2164
|
+
};
|
|
2165
|
+
try {
|
|
2166
|
+
const consent = readConsent();
|
|
2167
|
+
const installationId = consent.installationId ?? randomUUID();
|
|
2168
|
+
const salt = consent.salt ?? randomUUID();
|
|
2169
|
+
if (!consent.installationId || !consent.salt) writeConsent({ enabled: consent.enabled, installationId, salt });
|
|
2170
|
+
let normalized = path10.resolve(projectPath);
|
|
2171
|
+
try {
|
|
2172
|
+
normalized = fs9.realpathSync(normalized);
|
|
2173
|
+
} catch {
|
|
2174
|
+
}
|
|
2175
|
+
if (process.platform === "win32") normalized = normalized.toLowerCase();
|
|
2176
|
+
const base = {
|
|
2177
|
+
schema: 1,
|
|
2178
|
+
installationId,
|
|
2179
|
+
projectId: createHmac("sha256", salt).update(normalized).digest("hex"),
|
|
2180
|
+
runId: randomUUID(),
|
|
2181
|
+
version,
|
|
2182
|
+
os: process.platform,
|
|
2183
|
+
ci: Boolean(process.env.CI),
|
|
2184
|
+
command,
|
|
2185
|
+
framework: frameworkAt(normalized)
|
|
2186
|
+
};
|
|
2187
|
+
const started = Date.now();
|
|
2188
|
+
return async (outcome, report) => {
|
|
2189
|
+
if (!telemetryEnabled()) return;
|
|
2190
|
+
const payload = {
|
|
2191
|
+
...base,
|
|
2192
|
+
outcome,
|
|
2193
|
+
durationMs: Math.min(864e5, Math.max(0, Date.now() - started)),
|
|
2194
|
+
platforms: report?.platforms ?? [],
|
|
2195
|
+
codes: [...new Set(report?.findings.map((f) => f.code).filter((c) => /^[a-zA-Z0-9_]{1,80}$/.test(c)) ?? [])].slice(0, 60)
|
|
2196
|
+
};
|
|
2197
|
+
try {
|
|
2198
|
+
await fetch(ENDPOINT, {
|
|
2199
|
+
method: "POST",
|
|
2200
|
+
headers: { "content-type": "application/json" },
|
|
2201
|
+
body: JSON.stringify(payload),
|
|
2202
|
+
signal: AbortSignal.timeout(800),
|
|
2203
|
+
redirect: "error"
|
|
2204
|
+
});
|
|
2205
|
+
} catch {
|
|
2206
|
+
}
|
|
2207
|
+
};
|
|
2208
|
+
} catch {
|
|
2209
|
+
return async () => {
|
|
2210
|
+
};
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
|
|
2090
2214
|
// src/setup.ts
|
|
2091
2215
|
function log2(msg = "") {
|
|
2092
2216
|
process.stdout.write(msg + "\n");
|
|
@@ -2219,7 +2343,7 @@ async function connectOne(spec) {
|
|
|
2219
2343
|
}
|
|
2220
2344
|
async function cmdSetup(argv) {
|
|
2221
2345
|
const opts = parseSetupArgs(argv);
|
|
2222
|
-
const home =
|
|
2346
|
+
const home = os7.homedir();
|
|
2223
2347
|
migrateLegacyJenkins(home);
|
|
2224
2348
|
if (resolveMode(opts, process.env, process.stdin.isTTY) === "interactive") {
|
|
2225
2349
|
await ensureLangChosen();
|
|
@@ -2235,6 +2359,8 @@ async function cmdSetup(argv) {
|
|
|
2235
2359
|
let detected = detectAll(home);
|
|
2236
2360
|
printStatus(detected, platforms);
|
|
2237
2361
|
const mode = resolveMode(opts, process.env, process.stdin.isTTY);
|
|
2362
|
+
const finish = mode === "interactive" ? usageRun("setup", process.cwd()) : async () => {
|
|
2363
|
+
};
|
|
2238
2364
|
const plan = planSetup(detected, {
|
|
2239
2365
|
only: opts.only,
|
|
2240
2366
|
reconnect: opts.reconnect,
|
|
@@ -2258,6 +2384,8 @@ async function cmdSetup(argv) {
|
|
|
2258
2384
|
return;
|
|
2259
2385
|
}
|
|
2260
2386
|
if (plan.length === 0) {
|
|
2387
|
+
const satisfied = opts.only ? CREDENTIALS.filter((c) => opts.only.includes(c.id)).every((c) => isSatisfied(c, detected)) : missingRequired(detected, platforms).length === 0;
|
|
2388
|
+
await finish(satisfied ? "completed" : "incomplete");
|
|
2261
2389
|
if (opts.only) {
|
|
2262
2390
|
log2(kleur2.green(t().setup.onlyAlreadyDone));
|
|
2263
2391
|
log2(kleur2.dim(t().setup.onlyReconnectHint));
|
|
@@ -2307,6 +2435,8 @@ async function cmdSetup(argv) {
|
|
|
2307
2435
|
log2();
|
|
2308
2436
|
printStatus(detected, platforms);
|
|
2309
2437
|
const stillMissing = missingRequired(detected, platforms);
|
|
2438
|
+
const requestedMissing = opts.only ? CREDENTIALS.filter((c) => opts.only.includes(c.id) && !isSatisfied(c, detected)) : stillMissing;
|
|
2439
|
+
await finish(!aborted && requestedMissing.length === 0 ? "completed" : "incomplete");
|
|
2310
2440
|
if (stillMissing.length === 0) {
|
|
2311
2441
|
log2(kleur2.green(t().setup.requiredDone));
|
|
2312
2442
|
log2(kleur2.cyan(t().setup.tryPrompt));
|
|
@@ -2340,6 +2470,9 @@ export {
|
|
|
2340
2470
|
detectAll,
|
|
2341
2471
|
isSatisfied,
|
|
2342
2472
|
migrateLegacyJenkins,
|
|
2473
|
+
telemetryNotice,
|
|
2474
|
+
cmdTelemetry,
|
|
2475
|
+
usageRun,
|
|
2343
2476
|
MCP_PKG,
|
|
2344
2477
|
runMcpBin,
|
|
2345
2478
|
cmdDeploy,
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
catalog,
|
|
7
7
|
cmdDeploy,
|
|
8
8
|
cmdSetup,
|
|
9
|
+
cmdTelemetry,
|
|
9
10
|
credLabel,
|
|
10
11
|
credNote,
|
|
11
12
|
deleteConfig,
|
|
@@ -21,10 +22,12 @@ import {
|
|
|
21
22
|
resolveLang,
|
|
22
23
|
runMcpBin,
|
|
23
24
|
t,
|
|
25
|
+
telemetryNotice,
|
|
24
26
|
tryCredById,
|
|
27
|
+
usageRun,
|
|
25
28
|
writeConfig,
|
|
26
29
|
writeSettings
|
|
27
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-YIVIN2XR.js";
|
|
28
31
|
|
|
29
32
|
// src/index.ts
|
|
30
33
|
import os3 from "os";
|
|
@@ -1304,6 +1307,7 @@ var M3 = catalog(
|
|
|
1304
1307
|
localFailed: (message) => `Release Doctor \uC2E4\uD589 \uC2E4\uD328: ${message}
|
|
1305
1308
|
`,
|
|
1306
1309
|
title: "mimi-seed check \u2014 \uCD9C\uC2DC \uC804 \uC810\uAC80\n\n",
|
|
1310
|
+
localNext: "\n\uC2A4\uD1A0\uC5B4 \uAC80\uC0AC \uC5F0\uACB0: npx mimi-seed init\nCI\uC5D0\uC11C \uBC18\uBCF5 \uAC80\uC0AC: npx mimi-seed check --local --fail-on-blocker\n",
|
|
1307
1311
|
appsFailed: (msg) => `\uC571 \uBAA9\uB85D \uC870\uD68C \uC2E4\uD328: ${msg}
|
|
1308
1312
|
`,
|
|
1309
1313
|
noApps: "\uB4F1\uB85D\uB41C \uC571\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. `mimi-seed init` \uD6C4 \uC571\uC744 \uB4F1\uB85D\uD558\uC138\uC694.\n",
|
|
@@ -1341,6 +1345,7 @@ var M3 = catalog(
|
|
|
1341
1345
|
localFailed: (message) => `Release Doctor failed: ${message}
|
|
1342
1346
|
`,
|
|
1343
1347
|
title: "mimi-seed check \u2014 pre-launch check\n\n",
|
|
1348
|
+
localNext: "\nConnect store checks: npx mimi-seed init\nRun in CI: npx mimi-seed check --local --fail-on-blocker\n",
|
|
1344
1349
|
appsFailed: (msg) => `Failed to list apps: ${msg}
|
|
1345
1350
|
`,
|
|
1346
1351
|
noApps: "No apps registered. Run `mimi-seed init`, then register an app.\n",
|
|
@@ -1432,14 +1437,18 @@ async function cmdCheck(argv) {
|
|
|
1432
1437
|
return;
|
|
1433
1438
|
}
|
|
1434
1439
|
if (localRequested || !cfg) {
|
|
1440
|
+
const finish = usageRun("check", args.projectPath);
|
|
1435
1441
|
try {
|
|
1436
1442
|
const report = await scanReleaseDoctor(args.projectPath);
|
|
1437
1443
|
process.stdout.write(args.json ? `${JSON.stringify(report, null, 2)}
|
|
1438
1444
|
` : renderReleaseDoctor(report, resolveLang()));
|
|
1445
|
+
if (!args.json && !process.env.CI) process.stdout.write(M3().localNext + telemetryNotice());
|
|
1439
1446
|
if (args.failOnBlocker && report.counts.blocker > 0) process.exitCode = 1;
|
|
1447
|
+
await finish("completed", report);
|
|
1440
1448
|
} catch (error) {
|
|
1441
1449
|
process.stderr.write(kleur2.red(M3().localFailed(error instanceof Error ? error.message : String(error))));
|
|
1442
1450
|
process.exitCode = 2;
|
|
1451
|
+
await finish("failed");
|
|
1443
1452
|
}
|
|
1444
1453
|
return;
|
|
1445
1454
|
}
|
|
@@ -2160,7 +2169,7 @@ async function cmdAuth(args) {
|
|
|
2160
2169
|
if (sub === "threads") return void exitWith(await runMcpBin("mimi-seed-social-auth", ["threads", ...rest]));
|
|
2161
2170
|
if (sub === "tiktok") return void exitWith(await runMcpBin("mimi-seed-tiktok-business-auth", rest));
|
|
2162
2171
|
if (sub === "ci") {
|
|
2163
|
-
const { cmdSetup: cmdSetup2 } = await import("./setup-
|
|
2172
|
+
const { cmdSetup: cmdSetup2 } = await import("./setup-Z34QP6PO.js");
|
|
2164
2173
|
await cmdSetup2(["--only", "github,gitlab", "--reconnect", "github,gitlab"]);
|
|
2165
2174
|
return;
|
|
2166
2175
|
}
|
|
@@ -2657,6 +2666,7 @@ var M9 = catalog(
|
|
|
2657
2666
|
claudeWarn: " \u26A0 \uC2E4\uC81C \uD1A0\uD070\uC774 \uD3EC\uD568\uB41C \uBA85\uB839\uC785\uB2C8\uB2E4 (\uC178 \uD788\uC2A4\uD1A0\uB9AC\uC5D0 \uB0A8\uC74C). \uD1A0\uD070\uC740 ~/.mimi-seed/config.json \uC5D0\uB3C4 \uC800\uC7A5\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.",
|
|
2658
2667
|
// 명령별 상세 사용법 (SSOT). `mimi-seed <command> --help` 와 overview 가 공유.
|
|
2659
2668
|
usage: {
|
|
2669
|
+
telemetry: "mimi-seed telemetry on|off|status \u2014 \uC120\uD0DD\uC801 \uC0AC\uC6A9\uB7C9 \uCE21\uC815. \uAE30\uBCF8 \uAEBC\uC9D0. \uC784\uC758 \uC124\uCE58 ID, \uD504\uB85C\uC81D\uD2B8 \uD574\uC2DC, \uBC84\uC804, OS, \uACB0\uACFC \uCF54\uB4DC\uC640 \uC2E4\uD589\uC2DC\uAC04\uC744 \uC804\uC1A1\uD569\uB2C8\uB2E4. \uAC1C\uC778\uC815\uBCF4 \uC548\uB0B4: https://mimi-seed.pryzm.gg/privacy/sdk-usage . MIMI_SEED_TELEMETRY=0\uC740 \uD56D\uC0C1 \uC804\uC1A1\uC744 \uB055\uB2C8\uB2E4.",
|
|
2660
2670
|
init: `${kleur9.bold("mimi-seed init")} \u2014 \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8\uB97C Mimi Seed\uC5D0 \uC5F0\uACB0
|
|
2661
2671
|
|
|
2662
2672
|
\uC571 \uC790\uB3D9 \uAC10\uC9C0(Expo/Gradle/Info.plist/pbxproj) \u2192 \uBE0C\uB77C\uC6B0\uC800 PAT \uBC1C\uAE09(\uC6D0\uACA9 MCP) \u2192 \uC571 \uB4F1\uB85D
|
|
@@ -2759,6 +2769,7 @@ ${kleur9.bold("\uBA85\uB839\uC5B4:")}
|
|
|
2759
2769
|
${kleur9.cyan("mimi-seed ga4")} GA4 property\xB7data stream \uC0DD\uC131\xB7\uC870\uD68C
|
|
2760
2770
|
${kleur9.cyan("mimi-seed doctor")} \uD658\uACBD \uC9C4\uB2E8 (\uD1A0\uD070\xB7Git\xB7\uD504\uB85C\uC81D\uD2B8\xB7CI \uCCB4\uD06C)
|
|
2761
2771
|
${kleur9.cyan("mimi-seed check")} \uCD9C\uC2DC \uC804 Readiness \uC810\uAC80
|
|
2772
|
+
${kleur9.cyan("mimi-seed telemetry")} \uC120\uD0DD\uC801 \uC0AC\uC6A9\uB7C9 \uCE21\uC815 \uC124\uC815
|
|
2762
2773
|
${kleur9.cyan("mimi-seed notes")} \uB9B4\uB9AC\uC988 \uB178\uD2B8 \uC0DD\uC131 (git log \u2192 AI \u2192 \uB9C8\uCF13 \uC801\uC6A9)
|
|
2763
2774
|
${kleur9.cyan("mimi-seed review")} \uB9AC\uBDF0 \uB2F5\uBCC0 AI \uCD08\uC548 \uC0DD\uC131 \uBC0F Play Store \uAC8C\uC2DC
|
|
2764
2775
|
${kleur9.cyan("mimi-seed deploy")} \uC571 \uC790\uB3D9 \uBC30\uD3EC (CI \u2192 Play Store/App Store)
|
|
@@ -2826,6 +2837,7 @@ ${kleur9.bold("\uD658\uACBD\uBCC0\uC218:")}
|
|
|
2826
2837
|
claudeTitle: "Claude Code MCP registration \u2014 run this one line as-is:",
|
|
2827
2838
|
claudeWarn: " \u26A0 This command contains the real token (it stays in your shell history). The token is also stored in ~/.mimi-seed/config.json.",
|
|
2828
2839
|
usage: {
|
|
2840
|
+
telemetry: "mimi-seed telemetry on|off|status \u2014 optional usage measurement, off by default. Sends a random installation ID, project hash, version, OS, result codes and duration. Privacy: https://mimi-seed.pryzm.gg/privacy/sdk-usage . MIMI_SEED_TELEMETRY=0 always disables transmission.",
|
|
2829
2841
|
init: `${kleur9.bold("mimi-seed init")} \u2014 connect the current project to Mimi Seed
|
|
2830
2842
|
|
|
2831
2843
|
Auto-detects apps (Expo/Gradle/Info.plist/pbxproj) \u2192 issues a PAT in the browser (remote MCP) \u2192 registers the apps
|
|
@@ -2928,6 +2940,7 @@ ${kleur9.bold("Commands:")}
|
|
|
2928
2940
|
${kleur9.cyan("mimi-seed ga4")} create and list GA4 properties and data streams
|
|
2929
2941
|
${kleur9.cyan("mimi-seed doctor")} environment check (token \xB7 Git \xB7 project \xB7 CI)
|
|
2930
2942
|
${kleur9.cyan("mimi-seed check")} pre-release readiness check
|
|
2943
|
+
${kleur9.cyan("mimi-seed telemetry")} optional usage measurement settings
|
|
2931
2944
|
${kleur9.cyan("mimi-seed notes")} generate release notes (git log \u2192 AI \u2192 push to stores)
|
|
2932
2945
|
${kleur9.cyan("mimi-seed review")} draft a review reply with AI and post it to the Play Store
|
|
2933
2946
|
${kleur9.cyan("mimi-seed deploy")} automated app release (CI \u2192 Play Store/App Store)
|
|
@@ -3209,6 +3222,9 @@ async function main() {
|
|
|
3209
3222
|
case "check":
|
|
3210
3223
|
await cmdCheck(restArgs);
|
|
3211
3224
|
break;
|
|
3225
|
+
case "telemetry":
|
|
3226
|
+
cmdTelemetry(restArgs);
|
|
3227
|
+
break;
|
|
3212
3228
|
case "notes":
|
|
3213
3229
|
await cmdNotes(restArgs);
|
|
3214
3230
|
break;
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mimi-seed",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"keywords": ["release-doctor", "expo", "react-native", "unity", "google-play", "app-store", "release-readiness", "mcp", "cli"],
|
|
4
|
+
"version": "0.19.13",
|
|
5
|
+
"description": "Release Doctor: check Expo, React Native and Unity release risks before connecting app stores.",
|
|
5
6
|
"bin": {
|
|
6
7
|
"mimi-seed": "dist/index.js"
|
|
7
8
|
},
|