huaweicloud-devkit 1.1.4-next.1 → 1.1.4-next.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "huaweicloud-devkit",
3
3
  "mcpName": "io.github.huaweicloud/huaweicloud-devkit",
4
- "version": "1.1.4-next.1",
4
+ "version": "1.1.4-next.2",
5
5
  "kooCliVersion": "7.2.12",
6
6
  "description": "Agent toolkit that helps coding agents use Huawei Cloud Skills, KooCLI, APIs, SDKs, and future MCP capabilities safely and accurately.",
7
7
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  "mcpServers": "./.mcp.json",
18
18
  "description": "Guide coding agents to use Huawei Cloud Skills, KooCLI, APIs, SDKs, and future MCP capabilities with safer execution and less context.",
19
19
  "skills": "./skills/",
20
- "version": "1.1.4-next.1",
20
+ "version": "1.1.4-next.2",
21
21
  "author": {
22
22
  "name": "HuaweiCloud Mate",
23
23
  "url": "https://github.com/huaweicloud"
@@ -20,7 +20,7 @@
20
20
  "mcpServers": "./.mcp.json",
21
21
  "description": "Agent toolkit that helps coding agents use Huawei Cloud Skills, KooCLI, APIs, SDKs, and future MCP capabilities safely and accurately.",
22
22
  "skills": "./skills/",
23
- "version": "1.1.4-next.1",
23
+ "version": "1.1.4-next.2",
24
24
  "author": {
25
25
  "name": "HuaweiCloud Mate",
26
26
  "url": "https://github.com/huaweicloud"
@@ -17,7 +17,7 @@
17
17
  "mcpServers": "./.mcp.json",
18
18
  "description": "Guide coding agents to use Huawei Cloud Skills, KooCLI, APIs, SDKs, and future MCP capabilities with safer execution and less context.",
19
19
  "skills": "./skills/",
20
- "version": "1.1.4-next.1",
20
+ "version": "1.1.4-next.2",
21
21
  "author": {
22
22
  "name": "HuaweiCloud Mate",
23
23
  "url": "https://github.com/huaweicloud"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huaweicloud-devkit",
3
- "version": "1.1.4-next.1",
3
+ "version": "1.1.4-next.2",
4
4
  "description": "Guide coding agents to use Huawei Cloud Skills, KooCLI, APIs, SDKs, and future MCP capabilities with safer execution and less context.",
5
5
  "author": {
6
6
  "name": "HuaweiCloud Mate",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huaweicloud-devkit",
3
- "version": "1.1.4-next.1",
3
+ "version": "1.1.4-next.2",
4
4
  "description": "Guide coding agents to use Huawei Cloud Skills, KooCLI, APIs, SDKs, and future MCP capabilities with safer execution and less context.",
5
5
  "author": {
6
6
  "name": "HuaweiCloud Mate",
@@ -2,7 +2,7 @@
2
2
  "name": "huaweicloud-devkit",
3
3
  "id": "huaweicloud-devkit",
4
4
  "displayName": "HuaweiCloud DevKit",
5
- "version": "1.1.4-next.1",
5
+ "version": "1.1.4-next.2",
6
6
  "family": "bundle-plugin",
7
7
  "bundleFormat": "codex",
8
8
  "description": "Guide coding agents to use Huawei Cloud safely — KooCLI, APIs, SDKs, 28 MCP tools, skills, and safety guardrails.",
@@ -16,14 +16,14 @@ Domain expertise for billing queries (BSS). Covers cost tracking, bill details,
16
16
 
17
17
  ## Critical Warnings
18
18
 
19
- | Trap | Why |
20
- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
21
- | Bills delayed ~24h | Yesterday's costs may not appear until the next day |
22
- | BSS Admin role needed | IAM user must have BSS Administrator or Finance role |
23
- | Currency conversion varies | Cross-region costs use daily exchange rates |
24
- | Region fixed to cn-north-1 | BSS operations only support `--cli-region=cn-north-1` in KooCLI. This is a KooCLI metadata limitation — the billing data itself covers all regions. |
25
- | English catalog missing BSS | `Unsupported service: BSS` under the default `en` language is a KooCLI catalog gap, not a missing service. devkit auto-injects `--cli-lang=cn`; manual fallback: add `--cli-lang=cn` or `hcloud configure set --cli-lang=cn` — prefer `--cli-lang=cn` on the command itself so the global output language is untouched. |
26
- | `缺少必填参数 cli-domain-id` / APIGW.0301 | Invalid credentials — KooCLI can't resolve the account-id | Re-run `npx huaweicloud-devkit auth init` |
19
+ | Trap | Why |
20
+ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
21
+ | Bills delayed ~24h | Yesterday's costs may not appear until the next day |
22
+ | BSS Admin role needed | IAM user must have BSS Administrator or Finance role |
23
+ | Currency conversion varies | Cross-region costs use daily exchange rates |
24
+ | Region fixed to cn-north-1 | BSS operations only support `--cli-region=cn-north-1` in KooCLI. This is a KooCLI metadata limitation — the billing data itself covers all regions. |
25
+ | English catalog missing BSS | `Unsupported service: BSS` under the default `en` language is a KooCLI catalog gap, not a missing service. devkit detects it and advises the supported fix `hcloud configure set --cli-lang=cn` (switch is global-only; KooCLI has no per-command `--cli-lang` flag). Running with Chinese mode from the start (see Prerequisites) avoids the issue entirely. |
26
+ | `缺少必填参数 cli-domain-id` / APIGW.0301 | Invalid credentials — KooCLI can't resolve the account-id | Re-run `npx huaweicloud-devkit auth init` |
27
27
 
28
28
  ## Common Workflows
29
29
 
@@ -109,8 +109,8 @@ If a command needs an `adminPass` or other password field, do not leave plaintex
109
109
  ## Language / Service Catalog Trap
110
110
 
111
111
  - KooCLI loads the service list from a per-language catalog: `~/.hcloud/metaRepo/services_{cn,en}.json`. The **English catalog is incomplete** (149 services vs 220 in Chinese; ~70 services — BSS, DevStar, CloudTable, FRS, ASM, ... — are missing). A command against a service that only exists in the Chinese catalog fails with a misleading `Unsupported service: X`.
112
- - `huaweicloud-devkit` auto-injects `--cli-lang=cn` (proactive when the catalog shows `X ∈ cn ∧ X ∉ en`, reactive once if `Unsupported service` still appears) for read and write commands; approved write commands keep their approved argument list (injection happens inside the runner).
113
- - Manual fallback (do not rely on the auto path alone): append `--cli-lang=cn` to the failing command, or set globally with `hcloud configure set --cli-lang=cn` (this changes ALL CLI output language).
112
+ - KooCLI has **no per-command `--cli-lang` flag** — appending `--cli-lang=cn` is rejected as `不正确的参数:cli-lang`. The language switch is **global only**: `hcloud configure set --cli-lang=cn` (changes ALL CLI output language).
113
+ - `huaweicloud-devkit` detects `Unsupported service: X` and, when the cause is the en-catalog gap, returns an actionable hint to run `hcloud configure set --cli-lang=cn` (or to check the service name / refresh metadata for genuinely unknown services). It never mutates your command.
114
114
  - Distinguish from **region** metadata limits (e.g., BSS only supports `cn-north-1`): a region error is NOT solved by switching language.
115
115
 
116
116
  ## Output Formatting
@@ -196,24 +196,6 @@ function obsWriteHint(args) {
196
196
  return 'OBS write operations are obsutil-style and always write-class. Before executing, present the full resource manifest (bucket/object list) to the user for ONE batch approval, then run each command through plan → approve (see huawei-iac skill, Provisioning Rules).';
197
197
  }
198
198
 
199
- const OBS_SUBCOMMANDS = new Set([
200
- 'help',
201
- 'ls',
202
- 'mb',
203
- 'cp',
204
- 'mv',
205
- 'rm',
206
- 'chattri',
207
- 'config',
208
- 'cors',
209
- 'lifecycle',
210
- 'policy',
211
- 'share',
212
- 'sync',
213
- 'url',
214
- 'sign',
215
- ]);
216
-
217
199
  const CATALOG_TTL_MS = 5 * 60 * 1000;
218
200
  let _catalogCache = { dir: null, t: 0, cn: new Set(), en: new Set() };
219
201
 
@@ -252,19 +234,9 @@ export function classifyUnsupported(service, metaDir) {
252
234
  }
253
235
  // One or both catalog files are missing locally — we cannot distinguish
254
236
  // "service missing from the en catalog" from "en catalog not downloaded".
255
- // Only the reactive fallback may attempt --cli-lang=cn for this case.
256
237
  return 'unknown';
257
238
  }
258
239
 
259
- export function shouldInjectLang(args, metaDir) {
260
- const arr = Array.isArray(args) ? args.map(String) : [];
261
- if (arr.some((a) => /^--cli-lang=/.test(a))) return false;
262
- const s = (arr[0] || '').toUpperCase();
263
- if (!s) return false;
264
- if (s === 'OBS' && OBS_SUBCOMMANDS.has((arr[1] || '').toLowerCase())) return false;
265
- return classifyUnsupported(s, metaDir) === 'lang-missing';
266
- }
267
-
268
240
  export function planHcloudCommand(args, options = {}) {
269
241
  const normalizedArgs = Array.isArray(args) ? args.map(String) : [];
270
242
  const classification = classifyHcloudArgs(normalizedArgs, options);
@@ -301,7 +273,8 @@ const UNSUPPORTED_SERVICE_RE = /Unsupported service:\s*([A-Za-z0-9_-]+)/i;
301
273
  function appendLangHint(result, service, metaDir) {
302
274
  const cause = classifyUnsupported(service, metaDir);
303
275
  if (cause === 'lang-missing' || cause === 'unknown') {
304
- const nextStep = 'Re-run with --cli-lang=cn, or set hcloud configure set --cli-lang=cn.';
276
+ const nextStep =
277
+ 'KooCLI switches language only via global config: hcloud configure set --cli-lang=cn (changes CLI output language; BSS requires Chinese mode).';
305
278
  return {
306
279
  ...result,
307
280
  langCause: cause,
@@ -318,16 +291,6 @@ function appendLangHint(result, service, metaDir) {
318
291
  };
319
292
  }
320
293
 
321
- function isObsUtilStyle(args) {
322
- const s = String(args[0] || '').toUpperCase();
323
- return s === 'OBS' && OBS_SUBCOMMANDS.has(String(args[1] || '').toLowerCase());
324
- }
325
-
326
- function canRetryLang(service, metaDir) {
327
- const cause = classifyUnsupported(service, metaDir);
328
- return cause === 'lang-missing' || cause === 'unknown';
329
- }
330
-
331
294
  export async function runHcloud(args, options = {}) {
332
295
  const normalizedArgs = Array.isArray(args) ? args.map(String) : [];
333
296
  const plan = {
@@ -337,44 +300,13 @@ export async function runHcloud(args, options = {}) {
337
300
  assertAllowed(plan.classification);
338
301
 
339
302
  const metaDir = options.metaDir;
340
- const langGiven = normalizedArgs.some((a) => /^--cli-lang=/.test(a));
341
- const injectedArgs =
342
- !langGiven && shouldInjectLang(normalizedArgs, metaDir) ? [...normalizedArgs, '--cli-lang=cn'] : null;
343
-
344
- if (injectedArgs) {
345
- const result = await runHcloudOnceWithRetries(
346
- {
347
- ...plan,
348
- rawArgs: injectedArgs,
349
- },
350
- options,
351
- );
352
- const tagged = {
353
- ...result,
354
- autoRetried: true,
355
- injection: 'proactive',
356
- injectedLang: 'cn',
357
- };
358
- if (tagged.ok) return tagged;
359
- const match = `${result.stderr || ''}\n${result.stdout || ''}`.match(UNSUPPORTED_SERVICE_RE);
360
- return match ? appendLangHint(tagged, match[1], metaDir) : tagged;
361
- }
362
303
 
304
+ // KooCLI only switches language globally (`hcloud configure set --cli-lang=cn`); there is no
305
+ // per-command `--cli-lang` flag (it is rejected as "不正确的参数:cli-lang"). So we never mutate
306
+ // the command — we run it as-is and annotate `Unsupported service` with an actionable cause.
363
307
  const result = await runHcloudOnceWithRetries(plan, options);
364
308
  const text = `${result.stderr || ''}\n${result.stdout || ''}`;
365
309
  const match = text.match(UNSUPPORTED_SERVICE_RE);
366
- if (match && !langGiven && !result.ok && canRetryLang(match[1], metaDir) && !isObsUtilStyle(normalizedArgs)) {
367
- const retry = await runHcloudOnceWithRetries(
368
- {
369
- ...plan,
370
- rawArgs: [...normalizedArgs, '--cli-lang=cn'],
371
- },
372
- options,
373
- );
374
- return retry.ok
375
- ? { ...retry, autoRetried: true, reactiveFallback: true, injection: 'reactive', injectedLang: 'cn' }
376
- : appendLangHint(retry, match[1], metaDir);
377
- }
378
310
  if (match && !result.ok) {
379
311
  return appendLangHint(result, match[1], metaDir);
380
312
  }