@eevee-ta/cli 1.0.1 → 1.3.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.
- package/README.md +175 -9
- package/assets/skills/eevee-integration/SKILL.md +46 -0
- package/assets/skills/eevee-integration/agents/openai.yaml +3 -0
- package/assets/skills/eevee-integration/references/intake.md +87 -0
- package/assets/skills/eevee-integration/references/java-springboot.md +182 -0
- package/assets/skills/eevee-integration/references/umijs.md +210 -0
- package/assets/skills/eevee-mcp/SKILL.md +74 -5
- package/assets/skills/eevee-mcp/reference.md +48 -3
- package/dist/src/bin/cli.js +23 -7
- package/dist/src/bin/cli.js.map +1 -1
- package/dist/src/commands/business-command.js +174 -2
- package/dist/src/commands/business-command.js.map +1 -1
- package/dist/src/commands/i18n-command.js +194 -0
- package/dist/src/commands/i18n-command.js.map +1 -0
- package/dist/src/commands/skill-command.js +42 -26
- package/dist/src/commands/skill-command.js.map +1 -1
- package/dist/src/lib/business-catalog.js +50 -20
- package/dist/src/lib/business-catalog.js.map +1 -1
- package/dist/src/lib/i18n-exporter.js +402 -0
- package/dist/src/lib/i18n-exporter.js.map +1 -0
- package/dist/src/lib/i18n-scanner.js +1172 -0
- package/dist/src/lib/i18n-scanner.js.map +1 -0
- package/dist/src/lib/mcp-client.js +1 -1
- package/dist/src/lib/mcp-client.js.map +1 -1
- package/dist/src/lib/skill-installer.js +19 -10
- package/dist/src/lib/skill-installer.js.map +1 -1
- package/dist/src/lib/updater.js +4 -4
- package/dist/src/lib/updater.js.map +1 -1
- package/dist/src/lib/version.js +1 -1
- package/dist/src/lib/version.js.map +1 -1
- package/install.sh +3 -3
- package/package.json +2 -2
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# UmiJS / Umi Max Integration
|
|
2
|
+
|
|
3
|
+
Use this reference for Umi, Umi Max, React, TypeScript, and similar front-end repositories.
|
|
4
|
+
|
|
5
|
+
## Inspect first
|
|
6
|
+
|
|
7
|
+
Determine:
|
|
8
|
+
|
|
9
|
+
- Monorepo app directory, such as `apps/gaia/src`, versus single-app `src`.
|
|
10
|
+
- Existing locale loader and output directory:
|
|
11
|
+
- `src/locales`
|
|
12
|
+
- `public/intl`
|
|
13
|
+
- `apps/<app>/public/intl`
|
|
14
|
+
- Runtime file format:
|
|
15
|
+
- JSON files loaded by `intl.js`
|
|
16
|
+
- ESM `js` / `ts` modules
|
|
17
|
+
- existing `INTL` / `COMM_INTL` maps
|
|
18
|
+
- Existing i18n functions, especially `formatMessage` from `tant-intl`.
|
|
19
|
+
- Existing npm scripts, lint-staged config, ESLint setup, and Git hooks.
|
|
20
|
+
- Existing term maps such as `intl.ts` / `intl.tsx`.
|
|
21
|
+
- Whether old ESLint plugin configuration exists and must be replaced rather than duplicated.
|
|
22
|
+
|
|
23
|
+
## `intl.json` shape
|
|
24
|
+
|
|
25
|
+
Single-app grouped JSON example:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"includes": ["src/**/*.{ts,tsx,js,jsx}"],
|
|
30
|
+
"excludes": ["**/*.d.ts"],
|
|
31
|
+
"excludeAscii": true,
|
|
32
|
+
"excludeTrack": true,
|
|
33
|
+
"token": "<basic-read-token-if-approved>",
|
|
34
|
+
"format": "json",
|
|
35
|
+
"groupByTag": true,
|
|
36
|
+
"clean": true,
|
|
37
|
+
"localeAliases": {
|
|
38
|
+
"zh-CN": "zh",
|
|
39
|
+
"en-US": "en"
|
|
40
|
+
},
|
|
41
|
+
"outPaths": [
|
|
42
|
+
{
|
|
43
|
+
"path": "/public/intl/",
|
|
44
|
+
"buildPath": "/public/intl/",
|
|
45
|
+
"projectIds": [
|
|
46
|
+
{
|
|
47
|
+
"projectId": 12,
|
|
48
|
+
"branchIds": [21],
|
|
49
|
+
"tags": ["web"]
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Monorepos should use app-specific paths and include globs. Confirm project, version, tags, grouping, aliases, and both output directories with the user before writing this file.
|
|
58
|
+
|
|
59
|
+
For ESM output, use `format: "js"` or `"ts"`:
|
|
60
|
+
|
|
61
|
+
```js
|
|
62
|
+
export default {
|
|
63
|
+
登录: 'Sign in',
|
|
64
|
+
};
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## npm scripts
|
|
68
|
+
|
|
69
|
+
Prefer wrappers that call the local CLI:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"scripts": {
|
|
74
|
+
"eevee": "eevee",
|
|
75
|
+
"eevee:export": "eevee i18n export",
|
|
76
|
+
"eevee:i18n": "eevee i18n scan",
|
|
77
|
+
"eevee:check": "eevee doctor"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
A shell wrapper can add `--no-update-check`, verify CLI version, and route `scan-changed` / `check`.
|
|
83
|
+
|
|
84
|
+
## Scanner behavior and false-positive handling
|
|
85
|
+
|
|
86
|
+
The CLI scans:
|
|
87
|
+
|
|
88
|
+
- JavaScript / TypeScript strings
|
|
89
|
+
- template literals
|
|
90
|
+
- JSX text
|
|
91
|
+
- Vue text where applicable
|
|
92
|
+
|
|
93
|
+
It ignores by default:
|
|
94
|
+
|
|
95
|
+
- pure ASCII when `excludeAscii: true`
|
|
96
|
+
- import/export source strings
|
|
97
|
+
- object property keys
|
|
98
|
+
- tracking calls
|
|
99
|
+
- tests, mocks, fixtures, generated Umi directories, and build outputs
|
|
100
|
+
- standard i18n expressions inside template interpolation
|
|
101
|
+
- member expressions such as `INTL.操作`
|
|
102
|
+
|
|
103
|
+
Nonstandard patterns are not automatically exempt. Use explicit comments:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
// eevee-i18n-disable-next-line:动态拼接词条字典 key
|
|
107
|
+
const title = REPO_INTL[`${isEdit ? '编辑' : '新建'}表`];
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
title: '操作', // eevee-i18n-disable:表格组件内部按 key 翻译
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
For a whole term-key map:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
// eevee-i18n-disable-file:本文件只维护词条 key
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Column arrays such as `COLUMN_DEFAULT_ALL` often need line-level comments when the table component translates keys internally. Add the comment to every affected title rather than suppressing an entire page file.
|
|
121
|
+
|
|
122
|
+
## Commit gate
|
|
123
|
+
|
|
124
|
+
Use a Git hook or lint-staged task that scans only staged frontend source files. A dedicated `scan-changed` script is easier to test than embedding complex shell in Git configuration.
|
|
125
|
+
|
|
126
|
+
Collect staged files with:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
git diff --name-only --cached --diff-filter=ACMR |
|
|
130
|
+
grep -E '\.(js|jsx|ts|tsx|vue)$'
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Pass each file to:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
eevee i18n scan . --include <file>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Skip when no matching file is staged.
|
|
140
|
+
|
|
141
|
+
For legacy repositories, full scanning can remain informational with `--no-fail`; only staged files should block commits.
|
|
142
|
+
|
|
143
|
+
## Validation
|
|
144
|
+
|
|
145
|
+
Run:
|
|
146
|
+
|
|
147
|
+
1. `npm run eevee -- version`, requiring CLI `>= 1.1.0`
|
|
148
|
+
2. Export dry-run and confirm expected project/version/tag/key counts
|
|
149
|
+
3. Real export only after confirming source of truth and cleanup behavior
|
|
150
|
+
4. Locale consistency:
|
|
151
|
+
- same key set
|
|
152
|
+
- expected count
|
|
153
|
+
- no duplicate keys
|
|
154
|
+
- runtime loader still references generated filenames
|
|
155
|
+
5. `eevee i18n scan --no-fail`
|
|
156
|
+
6. Blocking scan of staged source files
|
|
157
|
+
7. Existing project checks:
|
|
158
|
+
```bash
|
|
159
|
+
npm run tsc
|
|
160
|
+
npm run build
|
|
161
|
+
```
|
|
162
|
+
8. If ESLint integration changed, run the project's JS lint command and remove obsolete plugin configuration/dependencies.
|
|
163
|
+
|
|
164
|
+
## Documentation to leave in the repository
|
|
165
|
+
|
|
166
|
+
Record:
|
|
167
|
+
|
|
168
|
+
- project IDs and version IDs
|
|
169
|
+
- tag semantics and grouping
|
|
170
|
+
- output paths and format
|
|
171
|
+
- locale aliases
|
|
172
|
+
- npm or shell commands
|
|
173
|
+
- commit gate scope
|
|
174
|
+
- known false-positive categories and suppression examples
|
|
175
|
+
- legacy-debt policy and files or directories intentionally excluded
|
|
176
|
+
|
|
177
|
+
## Term upload requirements (source metadata)
|
|
178
|
+
|
|
179
|
+
When a repository uploads or backfills terms to EEVEE (for example a
|
|
180
|
+
`eevee:upload` wrapper around `eevee term create`), each term entry should carry
|
|
181
|
+
source metadata, not only translations:
|
|
182
|
+
|
|
183
|
+
| Field | Required | Shape / rule |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| `name` | yes | Term key. In zh-reference projects the key is usually the Chinese source text. |
|
|
186
|
+
| `translations` | yes | Map covering **every** project locale; use `""` only when explicitly intended. |
|
|
187
|
+
| `description` | recommended | Where the term appears, e.g. `顶栏导航:项目`. |
|
|
188
|
+
| `params` | recommended | Placeholder parameter array `[{"name":"count","value":"42","desc":"数量"}]`. Upload it whenever the source text contains `{placeholder}` tokens so translators see the parameter contract. |
|
|
189
|
+
| `source_info` | recommended | Repository origin `{"repo","branch","path","line"}`. All four fields must be filled together or omitted entirely (server rejects partial objects). Capture them from the file location / git revision at extraction time. |
|
|
190
|
+
|
|
191
|
+
Update semantics that scripts must respect:
|
|
192
|
+
|
|
193
|
+
- `term create --translations` is the only batch way to set initial translations.
|
|
194
|
+
- `term update` does **not** accept `--translations` (the server ignores it);
|
|
195
|
+
refresh existing translations per locale with
|
|
196
|
+
`eevee translation set-content --id <pid> --term-id <tid> --locale <locale> --content <text>`.
|
|
197
|
+
- Keep uploads idempotent: diff against `eevee term list`/`terms/page` first and
|
|
198
|
+
only write created terms plus drifted locales.
|
|
199
|
+
|
|
200
|
+
A minimal idempotent upload wrapper therefore looks like:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
eevee term list <project-id> --version-id <version-id> --json # remote baseline
|
|
204
|
+
eevee term create <project-id> <version-id> --name <key> \
|
|
205
|
+
--description "<location>" \
|
|
206
|
+
--params '[{"name":"count","value":"42","desc":"数量"}]' \
|
|
207
|
+
--source-info '{"repo":"org/web","branch":"main","path":"src/page.tsx","line":12}' \
|
|
208
|
+
--translations '{"zh-CN":"共 {count} 条","en-US":"{count} items"}'
|
|
209
|
+
eevee translation set-content --id <project-id> --term-id <tid> --locale en-US --content "{count} items"
|
|
210
|
+
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: eevee-mcp
|
|
3
|
-
description: Operate eevee through the @eevee/cli business commands—projects, versions, terms, translations, tags, permissions, logs—and retain access to raw MCP tools/resources/prompts.
|
|
3
|
+
description: Operate eevee through the @eevee-ta/cli business commands—projects, versions, terms, translations, tags, permissions, logs—and retain access to raw MCP tools/resources/prompts.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# eevee business-aware MCP skill
|
|
@@ -16,6 +16,7 @@ Use this skill when a user asks Codex/Claude or another terminal Agent to inspec
|
|
|
16
16
|
5. Keep the user's personal token private; never print it or put it in code/docs/tests.
|
|
17
17
|
6. Before creating a term or setting/updating translations, search existing terms in the same project/version and inspect their translations. Use those translations as terminology, tone, placeholder, capitalization, and style references before machine-translating the new content.
|
|
18
18
|
7. Every term should normally provide content for every locale configured by the project. Leave a locale as `""` only when the user explicitly says that locale must remain an empty string.
|
|
19
|
+
8. When creating or maintaining terms, enrich metadata best effort — description, `params` for placeholders, `source_info` when a repo location is known, and doc-link attachments. If the context is missing, ask once instead of silently omitting it; never force the user to provide everything.
|
|
19
20
|
|
|
20
21
|
## First-run setup
|
|
21
22
|
|
|
@@ -58,20 +59,80 @@ eevee project list
|
|
|
58
59
|
eevee project create --name Demo --locales zh-CN,en-US --description '示例项目'
|
|
59
60
|
eevee project detail 12
|
|
60
61
|
eevee version list 12
|
|
61
|
-
eevee version create --id 12 --name 'Release 1' --
|
|
62
|
+
eevee version create --id 12 --name 'Release 1' --deadline-date 2026-12-31
|
|
63
|
+
eevee version copy 12 34 --name 'Release 1.1' --description '复制版本资产' # legacy branch copy
|
|
62
64
|
eevee term create --id 12 --version-id 34 --name login.button \
|
|
63
65
|
--translations '{"zh-CN":"登录","en-US":"Sign in"}'
|
|
66
|
+
eevee term check-version-conflicts 12 --term-ids 56,57 --version-id 34
|
|
67
|
+
eevee term move-version 12 --term-ids 56,57 --version-id 34
|
|
64
68
|
eevee translation set-content --id 12 --term-id 56 --locale zh-CN --content 登录
|
|
65
|
-
eevee translation assign-translators --id 12 --
|
|
69
|
+
eevee translation assign-translators --id 12 --locale en-US --user-id 3 --term-ids 56,57
|
|
66
70
|
eevee permission list 12
|
|
67
71
|
eevee log list --id 12 --page 1 --page-size 20
|
|
68
72
|
```
|
|
69
73
|
|
|
74
|
+
`term move-version` is the legacy branch-migration command. It always performs a same-name
|
|
75
|
+
conflict precheck first. In an interactive terminal it prompts for batch ignore/overwrite or
|
|
76
|
+
item-by-item decisions; in non-interactive mode it preserves the legacy API behavior by
|
|
77
|
+
ignoring conflicts and moving only conflict-free terms. Explicit scripts may pass
|
|
78
|
+
`--conflict-strategy overwrite|ignore` or
|
|
79
|
+
`--conflict-decisions '{"56":"ignore","57":"overwrite"}'`. Use `term check-version-conflicts`
|
|
80
|
+
when the user only needs an audit preview.
|
|
81
|
+
|
|
82
|
+
Version status starts at 待开始 on create; change it afterwards with
|
|
83
|
+
`eevee version set-status`. Translation status ceiling depends on role:
|
|
84
|
+
translator → 已翻译(3), reviewer/admin → 已审核(4), plain member → 已机翻(2).
|
|
85
|
+
|
|
70
86
|
Add `--json` for machine-readable `{ok,data}` output, or `--raw` to inspect the complete MCP result.
|
|
71
87
|
|
|
88
|
+
## Local source i18n scan
|
|
89
|
+
|
|
90
|
+
When the user asks to inspect a repository for hardcoded Chinese UI terms or Spring Boot i18n compatibility, run the packaged local scanner instead of shelling out to ESLint:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
eevee i18n scan <project-dir> --json
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The command preserves the legacy `intl.json` ESLint-plugin options and also scans Java source, Java text blocks, Thymeleaf/JSP/Freemarker/Velocity templates, JS/TS strings, templates, JSX, and Vue files. It ignores tests, mocks, fixtures, generated Umi directories, and i18n expressions inside template interpolation. A non-zero exit code means issues were found.
|
|
97
|
+
|
|
98
|
+
## Configured term export
|
|
99
|
+
|
|
100
|
+
When the user asks to download or refresh locale files from eevee, inspect `intl.json` and run:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
eevee i18n export # path / development directory
|
|
104
|
+
eevee i18n export --target build # buildPath / online directory
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`branchIds` is a required list of version IDs; `[]` means all versions. `tags: []` means all terms; `tags: [null]` means terms without tags. Output supports JSON, ESM JS/TS, and Java properties, optional tag grouping, locale filename aliases, and configurable cleanup. Projects, versions, and tags are processed in configuration order; later entries overwrite duplicate keys when bundles are merged.
|
|
108
|
+
|
|
109
|
+
## Enrich term metadata (best effort)
|
|
110
|
+
|
|
111
|
+
Term quality depends on context, not only translations. When creating or
|
|
112
|
+
maintaining terms, upload as much of the following as the user's context
|
|
113
|
+
provides. Nothing below is mandatory — pass it whenever it is available:
|
|
114
|
+
|
|
115
|
+
| Field | When to include | How to collect |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| version | Always resolve explicitly | Single-version project: use that version. Multi-version project: ask the user which version owns the term before creating it. |
|
|
118
|
+
| description | Whenever the usage location is known | e.g. `顶栏导航:项目`, `设置页 → 保存按钮`. |
|
|
119
|
+
| params | Source text contains `{placeholder}` tokens | `--params '[{"name":"count","value":"42","desc":"数量"}]'` extracted from the call site; translators rely on this contract. |
|
|
120
|
+
| source_info | The term comes from a repository/file the user can point to | `--source-info '{"repo":"org/web","branch":"main","path":"src/page.tsx","line":12}'` from the file location and git revision. All four fields together, or omit entirely. |
|
|
121
|
+
| attachments | The user mentions screenshots, design specs, or docs | Design/doc URLs: `eevee term add-doc-link --id <pid> --term-id <tid> --link <url>`. Local screenshot files cannot be uploaded through MCP (multipart is unsupported) — tell the user to attach those in the web UI. |
|
|
122
|
+
|
|
123
|
+
The same enrichment applies to existing terms — backfill metadata with:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
eevee term update --id <pid> --term-id <tid> --description '设置页 → 保存按钮' --params '[{"name":"count","value":"42","desc":"数量"}]' --source-info '{"repo":"org/web","branch":"main","path":"src/page.tsx","line":12}'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Translations themselves are refreshed per locale with `translation set-content`.
|
|
130
|
+
|
|
72
131
|
## Required translation workflow
|
|
73
132
|
|
|
74
|
-
Apply this workflow to `term create
|
|
133
|
+
Apply this workflow to `term create` and `translation set-content`:
|
|
134
|
+
(`term update` only edits name/description/params/source_info — translations are
|
|
135
|
+
changed with `translation set-content`, one locale at a time.)
|
|
75
136
|
|
|
76
137
|
1. Read project detail or use another authoritative source to determine all project locales and the reference locale.
|
|
77
138
|
2. Search/list existing terms in the same project, preferably the same version and similar namespace or terminology, for example:
|
|
@@ -83,13 +144,16 @@ Apply this workflow to `term create`, `term update` when `--translations` is sup
|
|
|
83
144
|
|
|
84
145
|
3. Extract existing translations and use them as references for terminology, tone, placeholder handling, capitalization, punctuation, and product-specific wording. Do not blindly translate in isolation.
|
|
85
146
|
4. Machine-translate the missing or changed content while keeping the source meaning and reference conventions consistent.
|
|
86
|
-
5. Upload a complete translation map
|
|
147
|
+
5. Upload a complete translation map with `term create --translations`; when using `translation set-content`, fill every missing locale unless it is intentionally empty.
|
|
87
148
|
6. Before upload, verify that every key matches a project locale exactly and that no configured locale is omitted. Use `""` only when the user explicitly requires an empty value for that locale.
|
|
88
149
|
|
|
89
150
|
Example:
|
|
90
151
|
|
|
91
152
|
```bash
|
|
92
153
|
eevee term create <project-id> <version-id> --name login.button \
|
|
154
|
+
--description '登录页 → 提交按钮' \
|
|
155
|
+
--params '[{"name":"retry","value":"3","desc":"重试次数"}]' \
|
|
156
|
+
--source-info '{"repo":"org/web","branch":"main","path":"src/pages/login.tsx","line":42}' \
|
|
93
157
|
--translations '{"zh-CN":"登录","en-US":"Sign in","ja-JP":"ログイン"}'
|
|
94
158
|
```
|
|
95
159
|
|
|
@@ -120,6 +184,11 @@ Always inspect current capability with `eevee tools list`; future servers may ex
|
|
|
120
184
|
|
|
121
185
|
## Other standard MCP surfaces
|
|
122
186
|
|
|
187
|
+
The current eevee server implements only `initialize`, `ping`, `tools/*`, and
|
|
188
|
+
`notifications/initialized`. The commands below fail with `Method not found`
|
|
189
|
+
against it; use them only when `eevee tools list` confirms the connected server
|
|
190
|
+
actually exposes resources/prompts.
|
|
191
|
+
|
|
123
192
|
```bash
|
|
124
193
|
eevee resources list
|
|
125
194
|
eevee resources templates
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @eevee/cli reference for Agents
|
|
1
|
+
# @eevee-ta/cli reference for Agents
|
|
2
2
|
|
|
3
3
|
## Command model
|
|
4
4
|
|
|
@@ -38,8 +38,10 @@ eevee project delete 86 --yes --json
|
|
|
38
38
|
# Versions and terms
|
|
39
39
|
eevee version list 86
|
|
40
40
|
eevee version create --id 86 --name v1
|
|
41
|
+
eevee version copy 86 9 --name v1-copy --description 'Copied branch assets'
|
|
41
42
|
eevee term list 86
|
|
42
|
-
eevee term set-tags --id 86 --
|
|
43
|
+
eevee term set-tags --id 86 --term-id 22 --tag-ids 3,4
|
|
44
|
+
eevee version set-status --id 86 --version-id 9 --status 2
|
|
43
45
|
|
|
44
46
|
# Translations
|
|
45
47
|
eevee term list 86 --json
|
|
@@ -50,9 +52,36 @@ eevee translation set-status --id 86 --term-id 22 --locale en-US --status 3
|
|
|
50
52
|
|
|
51
53
|
Use the returned IDs from live responses rather than examples above.
|
|
52
54
|
|
|
55
|
+
### Version copy and branch migration
|
|
56
|
+
|
|
57
|
+
Versions are the EEVEE-unified representation of legacy branches.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Copy terms, translations, term-tag links, and attachments to a new version.
|
|
61
|
+
eevee version copy 86 9 --name v1-copy
|
|
62
|
+
|
|
63
|
+
# Audit same-name conflicts before moving selected terms to another version.
|
|
64
|
+
eevee term check-version-conflicts 86 --term-ids 22,23 --version-id 10 --json
|
|
65
|
+
|
|
66
|
+
# Move terms. The CLI always rechecks conflicts before writing.
|
|
67
|
+
eevee term move-version 86 --term-ids 22,23 --version-id 10
|
|
68
|
+
|
|
69
|
+
# Non-interactive/batch-compatible form: skip conflicts and move only safe terms.
|
|
70
|
+
eevee term move-version 86 --term-ids 22,23 --version-id 10 --conflict-strategy ignore
|
|
71
|
+
|
|
72
|
+
# Per-term decisions; keys are source term IDs.
|
|
73
|
+
eevee term move-version 86 --term-ids 22,23 --version-id 10 \
|
|
74
|
+
--conflict-decisions '{"22":"ignore","23":"overwrite"}'
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
In an interactive terminal, `term move-version` prompts for all-ignore, all-overwrite, or
|
|
78
|
+
item-by-item handling. `overwrite` deletes the target same-name term and its dependent assets
|
|
79
|
+
before moving the source term; `ignore` keeps the target and skips the source term. Locked terms
|
|
80
|
+
are rejected by the server. Do not guess project/version/term IDs—read them from live responses.
|
|
81
|
+
|
|
53
82
|
### Translation completeness workflow
|
|
54
83
|
|
|
55
|
-
Before `term create
|
|
84
|
+
Before `term create` or `translation set-content` — `term update` does not accept `--translations`; change existing translations one locale at a time with `translation set-content`:
|
|
56
85
|
|
|
57
86
|
1. Determine all locales configured on the project.
|
|
58
87
|
2. Search existing terms in the same project/version and read their details to collect comparable translations.
|
|
@@ -60,6 +89,20 @@ Before `term create`, `term update --translations`, or `translation set-content`
|
|
|
60
89
|
4. Provide content for every configured locale in principle. An empty string is allowed only when the user explicitly requests that locale to remain empty.
|
|
61
90
|
5. Re-check locale keys before upload; do not invent locales that the project has not configured.
|
|
62
91
|
|
|
92
|
+
## Term metadata enrichment (best effort)
|
|
93
|
+
|
|
94
|
+
When creating or maintaining terms, fill every field the context can provide —
|
|
95
|
+
none are mandatory, but pass them whenever possible:
|
|
96
|
+
|
|
97
|
+
- Confirm the owning version first (single version: use it; multi-version: ask the user).
|
|
98
|
+
- `--description` for the usage location, e.g. `设置页 → 保存按钮`.
|
|
99
|
+
- `--params '[{"name":"count","value":"42","desc":"数量"}]'` whenever the text has `{placeholder}` tokens.
|
|
100
|
+
- `--source-info '{"repo":"...","branch":"...","path":"...","line":12}'` when the term comes from a repository (all four fields together or omitted).
|
|
101
|
+
- Design/doc links with `eevee term add-doc-link --id <pid> --term-id <tid> --link <url>`;
|
|
102
|
+
local screenshot files must be attached in the web UI (MCP cannot upload multipart files).
|
|
103
|
+
- Backfill existing terms with `term update --description/--params/--source-info`;
|
|
104
|
+
refresh translations per locale with `translation set-content`.
|
|
105
|
+
|
|
63
106
|
## Built-in MCP tool fallbacks
|
|
64
107
|
|
|
65
108
|
| Server tool | Purpose | Invocation |
|
|
@@ -72,6 +115,8 @@ Check `eevee tools list` first; it is authoritative if the server adds tools lat
|
|
|
72
115
|
|
|
73
116
|
## Full MCP surface
|
|
74
117
|
|
|
118
|
+
Capability note: the current eevee server implements only `initialize`, `ping`, `tools/*`, and `notifications/initialized`. The resources/prompts/completion/logging requests below return `Method not found` against it; verify with `eevee tools list` before using them on a different server.
|
|
119
|
+
|
|
75
120
|
```bash
|
|
76
121
|
eevee ping
|
|
77
122
|
eevee tools list [--raw|--json]
|
package/dist/src/bin/cli.js
CHANGED
|
@@ -9,6 +9,7 @@ import { CLI_VERSION } from '../lib/version.js';
|
|
|
9
9
|
import { runConfig } from '../commands/config-command.js';
|
|
10
10
|
import { runPing, runPrompts, runRequest, runResources, runTools, } from '../commands/mcp-command.js';
|
|
11
11
|
import { runSkills } from '../commands/skill-command.js';
|
|
12
|
+
import { i18nScanUsage, runI18n } from '../commands/i18n-command.js';
|
|
12
13
|
const VERSION = CLI_VERSION;
|
|
13
14
|
const RUNTIME_FLAG_NAMES = new Set(['url', 'token', 'timeout']);
|
|
14
15
|
function extractRuntimeOptions(input) {
|
|
@@ -41,7 +42,7 @@ function extractRuntimeOptions(input) {
|
|
|
41
42
|
return { argv, options };
|
|
42
43
|
}
|
|
43
44
|
function usage() {
|
|
44
|
-
console.log(`@eevee/cli ${VERSION} — stable MCP command line client
|
|
45
|
+
console.log(`@eevee-ta/cli ${VERSION} — stable MCP command line client
|
|
45
46
|
|
|
46
47
|
Usage:
|
|
47
48
|
eevee <group> <action> [options]
|
|
@@ -69,6 +70,10 @@ Configuration
|
|
|
69
70
|
eevee config unset --url | --token
|
|
70
71
|
eevee config path
|
|
71
72
|
|
|
73
|
+
Local code quality
|
|
74
|
+
i18n scan scan hardcoded i18n terms in JS/TS/JSX/Vue and Java Spring Boot projects
|
|
75
|
+
i18n export export eevee terms through intl.json project/tag configuration
|
|
76
|
+
|
|
72
77
|
Agent skill commands
|
|
73
78
|
eevee skills install [codex|claude|cursor|opencode|universal][,...] [--global|--project DIR|--dir DIR]
|
|
74
79
|
eevee skills update [agents] [...target]
|
|
@@ -78,6 +83,10 @@ Agent skill commands
|
|
|
78
83
|
eevee skills agents
|
|
79
84
|
eevee skills info
|
|
80
85
|
|
|
86
|
+
Skill selection
|
|
87
|
+
--skill eevee-mcp business-aware eevee MCP operations (default)
|
|
88
|
+
--skill eevee-integration Java Spring Boot / UmiJS project integration guide
|
|
89
|
+
|
|
81
90
|
Diagnostics and meta commands
|
|
82
91
|
eevee doctor [--json]
|
|
83
92
|
eevee update [--yes] [--registry URL]
|
|
@@ -103,10 +112,6 @@ async function main() {
|
|
|
103
112
|
usage();
|
|
104
113
|
return;
|
|
105
114
|
}
|
|
106
|
-
if (argv[0] === 'version' || argv[0] === '--version') {
|
|
107
|
-
console.log(VERSION);
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
115
|
if (argv[0] === 'update') {
|
|
111
116
|
return await runUpdate(argv.slice(1));
|
|
112
117
|
}
|
|
@@ -135,6 +140,10 @@ async function main() {
|
|
|
135
140
|
}
|
|
136
141
|
return await runBusiness(business.command, [...business.argv, ...optionArgv]);
|
|
137
142
|
}
|
|
143
|
+
if (argv[0] === 'version' || argv[0] === '--version') {
|
|
144
|
+
console.log(VERSION);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
138
147
|
const command = argv.shift();
|
|
139
148
|
const next = argv[0];
|
|
140
149
|
switch (command) {
|
|
@@ -172,6 +181,13 @@ async function main() {
|
|
|
172
181
|
throw new Error('用法: eevee skills <install|update|list|paths|agents|info|uninstall>');
|
|
173
182
|
argv.shift();
|
|
174
183
|
return await runSkills(next, argv);
|
|
184
|
+
case 'i18n':
|
|
185
|
+
if (!next || next === '--help' || next === '-h') {
|
|
186
|
+
i18nScanUsage();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
argv.shift();
|
|
190
|
+
return await runI18n(next, argv);
|
|
175
191
|
case 'update':
|
|
176
192
|
return await runUpdate(argv);
|
|
177
193
|
case 'doctor':
|
|
@@ -197,12 +213,12 @@ async function promptForUpdate() {
|
|
|
197
213
|
return false;
|
|
198
214
|
const accepted = await confirmUpdate(check.current, check.latest);
|
|
199
215
|
if (!accepted) {
|
|
200
|
-
console.error(`发现新版本 @eevee/cli ${check.latest}(当前 ${check.current})。可执行: npm install --global @eevee/cli@latest --registry=${check.registry}`);
|
|
216
|
+
console.error(`发现新版本 @eevee-ta/cli ${check.latest}(当前 ${check.current})。可执行: npm install --global @eevee-ta/cli@latest --registry=${check.registry}`);
|
|
201
217
|
return false;
|
|
202
218
|
}
|
|
203
219
|
await installLatestCli();
|
|
204
220
|
const migrated = await migrateSkillsAfterCliUpdate();
|
|
205
|
-
console.log(`✓ @eevee/cli 已更新到 ${check.latest},${migrated ? 'Skill 已同步' : 'Skill 未能自动同步'}。请重新执行刚才的命令。`);
|
|
221
|
+
console.log(`✓ @eevee-ta/cli 已更新到 ${check.latest},${migrated ? 'Skill 已同步' : 'Skill 未能自动同步'}。请重新执行刚才的命令。`);
|
|
206
222
|
return true;
|
|
207
223
|
}
|
|
208
224
|
async function doctor(argv) {
|
package/dist/src/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,GACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACL,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,GACT,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/bin/cli.ts"],"names":[],"mappings":"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"}
|