@numa-tech/numa 1.12.7 → 1.12.10

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.
Files changed (99) hide show
  1. package/README.md +266 -47
  2. package/dist/ai-registry/bridge.d.ts +8 -0
  3. package/dist/ai-registry/bridge.js +63 -0
  4. package/dist/ai-registry/bridge.js.map +1 -0
  5. package/dist/ai-registry/client.d.ts +29 -3
  6. package/dist/ai-registry/client.js +112 -8
  7. package/dist/ai-registry/client.js.map +1 -1
  8. package/dist/ai-registry/commands.js +367 -112
  9. package/dist/ai-registry/commands.js.map +1 -1
  10. package/dist/ai-registry/errors.d.ts +2 -1
  11. package/dist/ai-registry/errors.js +12 -1
  12. package/dist/ai-registry/errors.js.map +1 -1
  13. package/dist/ai-registry/mcp-installer.d.ts +1 -0
  14. package/dist/ai-registry/mcp-installer.js +4 -0
  15. package/dist/ai-registry/mcp-installer.js.map +1 -1
  16. package/dist/ai-registry/namespace.d.ts +17 -0
  17. package/dist/ai-registry/namespace.js +53 -0
  18. package/dist/ai-registry/namespace.js.map +1 -0
  19. package/dist/ai-registry/schemas.d.ts +127 -2
  20. package/dist/ai-registry/schemas.js +42 -2
  21. package/dist/ai-registry/schemas.js.map +1 -1
  22. package/dist/ai-registry/sync.d.ts +23 -0
  23. package/dist/ai-registry/sync.js +276 -0
  24. package/dist/ai-registry/sync.js.map +1 -0
  25. package/dist/ai-registry/tui.d.ts +2 -0
  26. package/dist/ai-registry/tui.js +140 -0
  27. package/dist/ai-registry/tui.js.map +1 -0
  28. package/dist/ai-registry/workspace.d.ts +191 -0
  29. package/dist/ai-registry/workspace.js +167 -0
  30. package/dist/ai-registry/workspace.js.map +1 -0
  31. package/dist/app-config.d.ts +3 -2
  32. package/dist/app-config.js +5 -3
  33. package/dist/app-config.js.map +1 -1
  34. package/dist/application-candidates/client.d.ts +167 -0
  35. package/dist/application-candidates/client.js +103 -0
  36. package/dist/application-candidates/client.js.map +1 -0
  37. package/dist/application-candidates/commands.d.ts +13 -0
  38. package/dist/application-candidates/commands.js +225 -0
  39. package/dist/application-candidates/commands.js.map +1 -0
  40. package/dist/application-candidates/schemas.d.ts +171 -0
  41. package/dist/application-candidates/schemas.js +80 -0
  42. package/dist/application-candidates/schemas.js.map +1 -0
  43. package/dist/application-onboarding/client.d.ts +256 -0
  44. package/dist/application-onboarding/client.js +213 -0
  45. package/dist/application-onboarding/client.js.map +1 -0
  46. package/dist/application-onboarding/commands.d.ts +64 -0
  47. package/dist/application-onboarding/commands.js +694 -0
  48. package/dist/application-onboarding/commands.js.map +1 -0
  49. package/dist/application-onboarding/errors.d.ts +11 -0
  50. package/dist/application-onboarding/errors.js +51 -0
  51. package/dist/application-onboarding/errors.js.map +1 -0
  52. package/dist/application-onboarding/schemas.d.ts +1167 -0
  53. package/dist/application-onboarding/schemas.js +459 -0
  54. package/dist/application-onboarding/schemas.js.map +1 -0
  55. package/dist/application-onboarding/scm-credentials.d.ts +8 -0
  56. package/dist/application-onboarding/scm-credentials.js +98 -0
  57. package/dist/application-onboarding/scm-credentials.js.map +1 -0
  58. package/dist/application-onboarding/tui-model.d.ts +131 -0
  59. package/dist/application-onboarding/tui-model.js +554 -0
  60. package/dist/application-onboarding/tui-model.js.map +1 -0
  61. package/dist/application-onboarding/tui.d.ts +14 -0
  62. package/dist/application-onboarding/tui.js +554 -0
  63. package/dist/application-onboarding/tui.js.map +1 -0
  64. package/dist/cli.js +43 -7
  65. package/dist/cli.js.map +1 -1
  66. package/dist/command-catalog.d.ts +1 -0
  67. package/dist/command-catalog.js +231 -10
  68. package/dist/command-catalog.js.map +1 -1
  69. package/dist/config-page.js +2 -0
  70. package/dist/config-page.js.map +1 -1
  71. package/dist/config.d.ts +1 -0
  72. package/dist/config.js +1 -0
  73. package/dist/config.js.map +1 -1
  74. package/dist/pipeline/client.d.ts +10 -6
  75. package/dist/pipeline/client.js +7 -4
  76. package/dist/pipeline/client.js.map +1 -1
  77. package/dist/pipeline/commands.d.ts +5 -1
  78. package/dist/pipeline/commands.js +89 -18
  79. package/dist/pipeline/commands.js.map +1 -1
  80. package/dist/pipeline/schemas.d.ts +7 -7
  81. package/dist/pipeline/schemas.js +2 -2
  82. package/dist/pipeline/schemas.js.map +1 -1
  83. package/dist/platform-profile.d.ts +8 -2
  84. package/dist/platform-profile.js +5 -2
  85. package/dist/platform-profile.js.map +1 -1
  86. package/dist/web-console-page.d.ts +3 -3
  87. package/dist/web-console-page.js +75 -20
  88. package/dist/web-console-page.js.map +1 -1
  89. package/dist/web-console.d.ts +1 -1
  90. package/dist/web-console.js +50 -3
  91. package/dist/web-console.js.map +1 -1
  92. package/package.json +8 -5
  93. package/skills/numa-ai-registry/SKILL.md +25 -19
  94. package/skills/numa-ai-registry/evals/evals.json +10 -10
  95. package/skills/numa-ai-registry/references/command-contract.md +41 -6
  96. package/skills/numa-cli/SKILL.md +44 -0
  97. package/skills/numa-cli/agents/openai.yaml +4 -0
  98. package/skills/numa-cli/evals/evals.json +35 -0
  99. package/skills/numa-cli/references/pipeline-release.md +107 -0
package/README.md CHANGED
@@ -10,6 +10,7 @@
10
10
  - 包含 Realm 角色、Client 角色和用户组的个人信息页;
11
11
  - 使用服务端托管的 Codex 账号启动官方 Codex CLI,客户端不保存 refresh token;
12
12
  - 通过平台授权代理发现、治理并安装私有 Nacos Skills 与 MCP Servers;
13
+ - 通过可恢复的 `app` 会话和统一 Web/API 契约创建新应用或录入存量仓库;
13
14
  - 通过领域化 `media` 命令安全调用平台托管的 TTS、视频、资产和素材库服务;
14
15
  - 兼容原有 stdio MCP 服务。
15
16
 
@@ -34,10 +35,10 @@ npm config set @numa-tech:registry=https://registry.npmjs.org/
34
35
  ```
35
36
 
36
37
  脚本会先检查 Git 工作区干净、当前分支与 upstream 完全同步,再于修改版本号之前检查公共
37
- npm 身份以及 `@tokensrc`、`@numa-tech` scope 权限。使用验证器 App
38
- 本地交互发布会在公共 npm 推送前隐藏输入 6 OTP,并显式传给 `npm publish`;
39
- 使用带 bypass 2FA 权限的 granular token 时直接回车即可。非交互环境可以临时提供
40
- `NUMA_PUBLIC_NPM_OTP`,更推荐使用 bypass 2FA granular token 或 npm trusted publishing。
38
+ npm 身份以及 `@tokensrc`、`@numa-tech` scope 权限。发布认证默认完全交给 npm 处理;
39
+ 需要时 npm 会启动自己的浏览器认证或 2FA 流程,脚本不会额外询问 OTP。也可以临时通过
40
+ `NUMA_PUBLIC_NPM_OTP` 显式提供 6 位 OTP;自动化发布更推荐使用带 bypass 2FA 权限的
41
+ granular token 或 npm trusted publishing。
41
42
 
42
43
  首次从本机发布公共包,或公共登录已经过期时,先运行:
43
44
 
@@ -187,9 +188,14 @@ numa config \
187
188
  | `numa admin context` | 需角色 | 要求 `platform-admin` 或 `numa-admin` |
188
189
  | `numa registry instances list/create/update/delete` | 需登录 | 管理数据库中的 Nacos 实例和 OIDC 配置;写操作需要 Registry admin |
189
190
  | `numa registry namespaces list/resolve/check/create/update/delete` | 需登录 | 管理多实例 namespace 路由与跨集群默认项;写操作需要 Registry admin |
190
- | `numa registry skill list/inspect/install/upload/...` | 需登录 | 发现、安装和治理 Nacos Skills;发布类操作需要 Registry admin |
191
- | `numa registry mcp list/inspect/install/create/update/delete` | 需登录 | 发现、安装和维护 Nacos MCP Servers;写操作需要 Registry admin |
192
- | `numa registry tui` | 需登录 | 在终端交互浏览、安装和治理 Skill/MCP |
191
+ | `numa registry capabilities/init/lock/sync/upgrade` | 需登录 | 读取授权边界并以可提交的 manifest/lock 确定性安装 |
192
+ | `numa registry skill list/inspect/install/upload/...` | 需登录 | 发现、安装和治理 Nacos Skills;服务端按团队、角色和生命周期授权 |
193
+ | `numa registry mcp list/inspect/install/bridge/...` | 需登录 | 通过企业 Router 安装/桥接 MCP,并维护版本、标签和工具状态 |
194
+ | `numa registry approvals/router/audit` | 需登录 | 两人制发布、Router 健康/对账和追加式审计 |
195
+ | `numa registry tui` | 需登录 | 打开 namespace、Skills、MCP、审批、Router、审计全屏工作台 |
196
+ | `numa app onboard/apply/resume/inspect/list/tui` | 需登录 | 创建新应用、录入存量应用并恢复服务端入驻会话 |
197
+ | `numa app options` | 需登录 | 查询应用归属所需的团队、系统、业务域和环境 ID |
198
+ | `numa app candidate list/inspect/preview/review/adopt` | 需登录 | 审查应用发现候选并确认收录,服务端执行最终管理员授权和审计 |
193
199
  | `numa media capabilities` | 需登录 | 查询媒体 API、Provider 和版本能力 |
194
200
  | `numa media tts submit` | 需登录 | 提交 TTS 异步任务 |
195
201
  | `numa media video submit` | 需登录 | 提交视频生成异步任务 |
@@ -232,6 +238,8 @@ CLI 的本地角色检查用于快速反馈和隐藏无权限入口,不能替
232
238
  - `profileUrl`:完整的公开 client-configuration URL;设置后各模块只使用该
233
239
  profile 声明的 service 与 authority;
234
240
  - `profileId`:可选的 profile 标识锁定;远端返回其他标识时拒绝启用;
241
+ - `aiRegistryDefaultNamespaceKey`:用户级 Registry 默认 namespace;优先级低于命令行和
242
+ 项目 `.numa/registry.json`,高于 profile 默认值;
235
243
  - `registryUrl`:npm registry,默认公共 npm,也可配置公司私有 registry;
236
244
  - `checkUpdates`:是否检查 CLI 更新。
237
245
 
@@ -268,9 +276,9 @@ numa login --no-console --no-config --json
268
276
  ```
269
277
 
270
278
  控制台展示当前身份、Realm/Client 角色、AI Registry、ChatGPT 账号、基础配置和机器可读命令目录。
271
- AI Registry 页按“namespace → Skill/MCP → 详情/动作”组织,支持搜索、详情、安装以及 Skill
272
- 提交/发布/上下线。发布按钮是否可用只是界面提示,实际权限始终由平台 Keycloak Policy
273
- Enforcer 决定。
279
+ AI Registry 页包含目录、发布收件箱、实例/双凭据、Namespace/Profile、Router、权限/审计六个
280
+ 工作区,并展示 capability 返回的环境、动作和 Router 状态。按钮是否可用只是界面提示,实际
281
+ 权限、两人制和生命周期始终由平台服务端决定。
274
282
  ChatGPT 账号页先读取 `codex-multi-auth` 的本地账号与额度缓存并立即展示,再使用当前
275
283
  Keycloak 会话连接平台补充当前用户可用账号、剩余 limit 和同步状态。平台不可用时页面
276
284
  保留本地结果并明确显示“远程同步失败”,不会把 access token 或 refresh token 返回给页面。
@@ -287,20 +295,27 @@ CSP。OIDC access/refresh token 始终保留在 CLI 进程及私有缓存中,
287
295
 
288
296
  ## 私有 Nacos AI Registry
289
297
 
290
- `numa registry` 对接 `mci-devops-platform` 的 `/api/v1/ai-registry` 类型化 API。客户端只携带
291
- 当前用户 Keycloak Bearer Token;平台从自己的数据库解析 Nacos 实例、namespace 和该实例的
292
- OIDC client-credentials,再访问目标 Nacos。Nacos token、OIDC client secret endpoint
293
- credential 不写入 Numa 配置,也不由读取 API 返回。
298
+ `numa registry` 对接 `mci-devops-platform` 的 `/api/v1/ai-registry` 类型化 API。Nacos 是
299
+ Skill/MCP 内容、版本、标签和上下线状态的主仓库;平台只维护组织、团队、权限、审批、profile、
300
+ Router 绑定、对账和审计。Numa 只携带当前用户 Keycloak Bearer Token,且 capability 响应若
301
+ 包含 Nacos 地址、token、secret、password credential 字段会被客户端拒绝。
302
+
303
+ `GET /api/v1/ai-registry/capabilities` 返回当前用户可见 namespace、环境、动作、Router
304
+ Streamable HTTP/OAuth resource 和客户端适配器。profile v1 可追加
305
+ `services.aiRegistry.capabilityUrl` 与
306
+ `services.aiRegistry.configuration.defaultNamespaceKey`,旧客户端会忽略这些字段。
294
307
 
295
308
  权限契约:
296
309
 
297
- - `mci-devops-platform-ai-registry-reader`:`view`,可列出、检查、下载和安装;
298
- - `mci-devops-platform-ai-registry-admin`:`view` + `edit`,作为操作管理员管理实例、namespace、Skill 和 MCP;
299
- - 平台 operations admin 同时拥有 `view` + `edit`。
310
+ - 团队 `MEMBER+` 可使用已授权 namespace;
311
+ - 团队 `MAINTAINER/ADMIN/OWNER` 可维护本团队草稿;
312
+ - `ai-registry-reviewer` 可审核发布申请,且不得审核或发布自己的申请;
313
+ - `ai-registry-admin` 管理 Registry,`ops-admin` 才能执行 `*` allowlist、Admin API 和紧急操作。
300
314
 
301
- Nacos `baseUrl`、token URI、client ID、client secret scope 全部按实例保存在
302
- `mci-devops-platform` 数据库。client secret 使用 AES-256-GCM 密文存储,读取接口只返回
303
- `credentialConfigured`,不会返回明文或密文。平台部署只需从 Secret/KMS 注入数据库密文的
315
+ 每个 Nacos 实例分别配置 `READER` `MAINTAINER` 凭据,可使用 OIDC client credentials 或
316
+ Nacos username/password,并为每套凭据设置精确 namespace allowlist。凭据使用 AES-256-GCM
317
+ 密文存储,读取接口只返回 configured 状态,不返回明文或密文。旧单凭据作为 `LEGACY_BOTH`
318
+ 继续工作,管理员验证两套新凭据后再显式停用。平台部署从 Secret/KMS 注入数据库密文的
304
319
  主密钥环 `AI_REGISTRY_SECRET_ENCRYPTION_KEYS` 与当前 key ID
305
320
  `AI_REGISTRY_SECRET_CURRENT_KEY_ID`;这两项是密钥管理材料,不是某个 Nacos 实例的配置。
306
321
  密钥环格式为逗号分隔的 `keyId=Base64(32-byte-key)`;轮换时先加入新 key 并切换当前 key ID,
@@ -309,25 +324,35 @@ SSRF 安全策略仍由 `AI_REGISTRY_ALLOWED_UPSTREAM_HOSTS`、
309
324
  `AI_REGISTRY_ALLOWED_TOKEN_HOSTS` 控制,allow-list 为空时 fail closed;HTTP 只可通过
310
325
  `AI_REGISTRY_ALLOW_HTTP=true` 用于开发环境。
311
326
 
312
- Nacos 实例文件示例(`clientSecret` 仅写入):
327
+ Nacos 实例文件示例(凭据字段仅写入,实际字段以平台 capability/API revision 为准):
313
328
 
314
329
  ```json
315
330
  {
316
331
  "code": "cluster-a",
317
332
  "displayName": "Nacos Cluster A",
318
333
  "baseUrl": "https://nacos.internal.example:8848",
319
- "authenticationType": "OIDC_CLIENT_CREDENTIALS",
320
- "tokenUri": "https://sso.internal.example/realms/mci/protocol/openid-connect/token",
321
- "clientId": "nacos-registry-broker",
322
- "clientSecret": "write-only-secret",
323
- "scope": "openid",
334
+ "credentials": {
335
+ "reader": {
336
+ "authenticationType": "OIDC_CLIENT_CREDENTIALS",
337
+ "tokenUri": "https://sso.internal.example/realms/mci/protocol/openid-connect/token",
338
+ "clientId": "nacos-registry-reader",
339
+ "clientSecret": "write-only-secret",
340
+ "namespaceAllowlist": ["team-ai"]
341
+ },
342
+ "maintainer": {
343
+ "authenticationType": "NACOS_USERNAME_PASSWORD",
344
+ "username": "registry-maintainer",
345
+ "password": "write-only-password",
346
+ "namespaceAllowlist": ["team-ai"]
347
+ }
348
+ },
324
349
  "description": "A 集群",
325
350
  "status": "ACTIVE"
326
351
  }
327
352
  ```
328
353
 
329
- `instances update` 必须带列表结果中的当前 `version`,用于乐观锁保护;省略 `clientSecret`
330
- 表示保留已有密文。建议让包含明文 secret 的输入文件仅对当前用户可读,并在写入后安全删除。
354
+ `instances update` 必须带列表结果中的当前 `version`,用于乐观锁保护;省略某套凭据表示保留
355
+ 已有密文。建议让包含明文 secret 的输入文件仅对当前用户可读,并在写入后安全删除。
331
356
 
332
357
  namespace 文件示例:
333
358
 
@@ -343,13 +368,13 @@ namespace 文件示例:
343
368
  ```
344
369
 
345
370
  `namespaceKey` 是客户端使用的稳定名称,`namespaceId` 是该 Nacos 实例中的真实 ID。同一个
346
- `namespaceKey` 可以存在于多个实例;其中最多一个 ACTIVE 路由可设为 `isDefault=true`。
347
- 客户端只传 `--namespace team-ai` 时,平台会选择唯一匹配项或默认项;同名且没有默认项时返回
348
- `AI_REGISTRY_NAMESPACE_AMBIGUOUS`,此时必须加 `--instance cluster-b` 消歧。
371
+ `namespaceKey` 可以存在于多个实例。Numa 的选择顺序固定为 `--namespace` → 最近的
372
+ `.numa/registry.json` 用户 `aiRegistryDefaultNamespaceKey` → profile 默认值;选择结果必须
373
+ 存在于 capability 授权列表。同名绑定必须由 manifest/`--instance` 消歧,默认值无效时明确失败,
374
+ 不会切换到其他可用 namespace。旧 `isDefault` 仅供迁移期兼容客户端使用。
349
375
 
350
- V34 会把旧服务行拆成实例和 namespace,但旧 `credentialRef` 无法自动转换为数据库密文,
351
- 所以迁移后的实例会先置为 `DISABLED`。管理员写入完整 OIDC 配置和 `clientSecret` 后再启用;
352
- 跨集群重复的旧 namespace 不会自动猜测默认项。
376
+ profile 管理员发布 `defaultNamespaceKey` 且满足最低客户端版本后,才可逐步移除旧 `isDefault`
377
+ fallback。服务器端数据库迁移必须从当前版本新增 Flyway migration,不修改历史迁移。
353
378
 
354
379
  先发现实例和 namespace,再通过 namespace 操作资源:
355
380
 
@@ -359,6 +384,13 @@ numa registry namespaces list --namespace team-ai --json
359
384
  numa registry namespaces resolve team-ai --json
360
385
  numa registry namespaces check team-ai --json
361
386
 
387
+ numa registry capabilities --json
388
+ numa registry init --namespace team-ai --instance cluster-b --json
389
+ # 编辑 .numa/registry.json 后:
390
+ numa registry lock --json
391
+ numa registry sync --json
392
+ numa registry upgrade release-helper --json
393
+
362
394
  numa registry skill list --namespace team-ai --search deploy --json
363
395
  numa registry skill inspect release-helper --namespace team-ai --json
364
396
  numa registry skill install release-helper \
@@ -367,50 +399,237 @@ numa registry skill install release-helper \
367
399
  numa registry mcp list --namespace team-ai --json
368
400
  numa registry mcp inspect internal-docs --namespace team-ai --json
369
401
  numa registry mcp install internal-docs \
370
- --namespace team-ai --instance cluster-b --agent claude --scope project --json
402
+ --namespace team-ai --instance cluster-b --agent claude --scope project --transport remote --json
403
+
404
+ # 仅供 stdio Agent;复用 Numa 登录/刷新连接 Router
405
+ numa registry mcp bridge --namespace team-ai
371
406
 
372
407
  # 也可使用终端交互界面
373
408
  numa registry tui
374
409
  ```
375
410
 
376
- Skill 发布生命周期:
411
+ 两人制发布生命周期:
377
412
 
378
413
  ```bash
379
414
  numa registry skill upload ./release-helper.zip \
380
415
  --namespace team-ai --target-version 1.0.0 --json
381
- numa registry skill submit release-helper --namespace team-ai --json
382
- numa registry skill publish release-helper \
383
- --namespace team-ai --version 1.0.0 --json
384
- numa registry skill online release-helper --namespace team-ai --json
385
- numa registry skill scope release-helper PRIVATE --namespace team-ai --json
386
- numa registry skill tags release-helper deploy java --namespace team-ai --json
416
+ numa registry approvals submit skill release-helper \
417
+ --namespace team-ai --resource-version 1.0.0 --reason "scanner passed" --json
418
+ # 必须由另一位 reviewer 执行
419
+ numa registry approvals review rr_123 \
420
+ --decision APPROVED --reason "reviewed" --version 1 --json
421
+ numa registry approvals publish rr_123 --version 2 --json
422
+ numa registry audit --namespace team-ai --json
387
423
  ```
388
424
 
425
+ 生命周期由服务端统一为
426
+ `DRAFT → SUBMITTED → APPROVED/REJECTED → PUBLISHING → PUBLISHED/FAILED → OFFLINE`。
427
+ 生产及企业默认 namespace 的 Skill 不允许绕过 scanner;非生产豁免也必须带原因并由 Reviewer
428
+ 审批。MCP 发布由服务端执行协议、工具 schema、禁用工具和 Endpoint 健康预检。
429
+
389
430
  远端删除必须带 `--yes`。本地同名 Skill/MCP 默认拒绝覆盖;用户明确同意后才使用
390
431
  `--force`,支持原子替换的适配器会先保留时间戳备份。Skill 下载必须通过平台返回的
391
432
  SHA-256 校验,ZIP 在解压前会检查根 `SKILL.md`、路径穿越、符号链接、重复路径、文件数和
392
- 膨胀大小。MCP 定义中的敏感 env/header 只能使用 `${ENV_VAR}` 占位符,不能携带明文密钥。
433
+ 膨胀大小。`.numa/registry.lock.json` 保存解析后的精确版本、Nacos 来源、SHA-256 和安装状态;
434
+ 普通 `sync` 不解析标签,只有首次 `lock` 或显式 `upgrade` 会变更版本。MCP 客户端只安装
435
+ capability 发布且健康的企业 Router,不安装 Nacos 中的下游 endpoint。
393
436
 
394
437
  ### 客户端安装适配
395
438
 
396
439
  | 客户端 | Skill | MCP Server |
397
440
  | --- | --- | --- |
398
- | ChatGPT / Codex coding workspace | `.codex/skills` | ChatGPT 仅接受远程 HTTPS MCP App;Numa 返回 Developer mode/App 创建指引,不会冒充修改工作区设置 |
441
+ | ChatGPT / Codex coding workspace | `.codex/skills` | ChatGPT 连接企业 Router 的远程 HTTPS OAuth resource;Numa 返回 App 创建指引 |
399
442
  | Codex | `.codex/skills` | 调用官方 `codex mcp add`,仅 user scope |
400
443
  | Claude | `.claude/skills` | 项目 `.mcp.json`;user scope 使用 `~/.claude.json` |
401
444
  | Cursor | `.cursor/skills` | `.cursor/mcp.json` |
402
445
  | WorkBuddy | `.workbuddy/skills` | `.workbuddy/mcp.json`;目录可通过 custom adapter 调整 |
403
446
  | OpenClaw | `.openclaw/skills` | 调用官方 `openclaw mcp set`,仅 user scope |
404
447
 
405
- ChatGPT 本身不能直接连接本地 stdio MCP。Numa `--agent chatgpt` 只为远程 HTTPS endpoint
406
- 生成受控安装指引;私网或本机 MCP 需要先发布为远程服务,或使用 ChatGPT 支持的 Secure
407
- MCP Tunnel。ChatGPT workspace 还需管理员按其计划和 RBAC 开启 Developer mode。
448
+ ChatGPT 不能启动本地 stdio bridge;它直接连接企业 Router 的远程 HTTPS OAuth resource。
449
+ 其他只支持 stdio Agent 可运行 `numa registry mcp bridge`,由 Numa 获取/刷新用户 Token
450
+ 并只发送给 Router,不向 Nacos 或下游 MCP 透传。ChatGPT workspace 仍需管理员按计划和
451
+ RBAC 开启 Developer mode。
408
452
 
409
453
  仓库内置的自用 Skill 位于 `skills/numa-ai-registry/SKILL.md`,并随 npm 包发布。它指导 AI
410
454
  按“认证 → 服务解析 → inspect → 安装/治理 → 复查”的顺序使用 Registry,同时明确禁止索取
411
455
  Nacos token、绕过 403 或未经确认覆盖本地配置。对应场景评测在
412
456
  `skills/numa-ai-registry/evals/evals.json`。
413
457
 
458
+ ## 应用创建与存量录入
459
+
460
+ `numa app` 使用 platform profile 的 `platform` service 和现有 `mcp-client` Keycloak 会话调用
461
+ `/api/v1/application-onboarding`。Web、CLI 和 TUI 共享服务端 `sessionNo`、乐观锁 `revision`、
462
+ `planHash` 和单调递增的 event sequence;CLI 只展示服务端状态,不会在本地推断任务已完成。
463
+
464
+ 交互终端直接运行 `numa app onboard` 会打开 Ink TUI,并可在同一服务端草稿中完成
465
+ `MODE → BASIC_INFORMATION → OWNERSHIP → SOURCE_CONTROL → TECHNOLOGY → STANDARDIZATION → DELIVERY → REVIEW → EXECUTION`
466
+ 九步。`[` / `]` 切换步骤(切换时保存 `revision` 与稳定 `currentStep`),方向键选择字段和目录项,
467
+ `Enter` / `e` 编辑,`s` 保存;`REVIEW` 中先按 `p` 查看阻断、警告与 `planHash`,再按 `a`、`y`
468
+ 二次确认执行。目录接口不可用时仍可手工输入实体 ID;仓库 Provider 返回 501 时会明确提示手工输入
469
+ 稳定 `externalId` 与 `expectedHead`,不会把 URL 或凭据写入草稿。
470
+
471
+ 非交互、CI 和 AI 调用必须提供 `--spec`。spec 使用 `schemaVersion: 1`,不得包含 Token、密码、
472
+ SCM credential 或 secret ref:
473
+
474
+ ```bash
475
+ # 只保存草稿并预检,不产生仓库、分支或 Jenkins 等外部副作用
476
+ numa app onboard --spec onboarding.json --plan --json
477
+
478
+ # 接续 Web/TUI 中已保存的同一草稿;使用服务端最新 revision,避免静默覆盖
479
+ numa app onboard --session <session-no> --spec onboarding.json --plan --json
480
+
481
+ # 一步式使用服务端最新 planHash 提交异步执行;幂等键为必填
482
+ numa app onboard \
483
+ --spec onboarding.json \
484
+ --apply \
485
+ --idempotency-key app-order-20260819 \
486
+ --json
487
+ ```
488
+
489
+ 自动化更推荐先运行 `--plan`、保存返回的 `session_no`,再明确提交该会话。这样即使网络在
490
+ apply 返回前中断,也可以对同一会话复用原幂等键,而不会重新创建草稿:
491
+
492
+ ```bash
493
+ numa app apply <session-no> --idempotency-key app-order-20260819 --json
494
+ numa app inspect <session-no> --watch --after-sequence 42
495
+ numa app resume <session-no> --json
496
+ numa app tui --session <session-no>
497
+ ```
498
+
499
+ `inspect --watch` 每次都从最后已确认的 sequence 补拉,断线重连不会重复展示事件;Ctrl+C
500
+ 只停止本地观察,不取消服务端任务。取消必须显式执行 `numa app cancel <session-no> --yes`,
501
+ 且不会回滚已经完成的外部副作用。完整 spec schema、状态机和入驻流程由 DevOps 平台的
502
+ Application Onboarding 契约定义。
503
+
504
+ SCM 目录和连接诊断使用同一身份。仓库查询支持服务端 search/cursor 分页,返回稳定的
505
+ `externalId`、`defaultBranch`、`headRevision`;向导选中仓库后会把 `headRevision` 固定为
506
+ `expectedHead`。HTTP 429 会保留服务端 `Retry-After` 诊断,Provider 未安装(501)时 TUI
507
+ 明确退回手工填写稳定标识:
508
+
509
+ ```bash
510
+ numa app scm list --provider codeup --json
511
+ numa app scm inspect codeup-main --repositories --search order --limit 50 --json
512
+ numa app scm inspect codeup-main --repositories --cursor '<next-cursor>' --limit 50 --json
513
+ numa app scm probe codeup-main --json
514
+ ```
515
+
516
+ SCM 管理接口位于 `/api/v1/admin/scm-connections`,最终权限始终由网关和后端按 canonical
517
+ Client Role 校验。metadata JSON 只允许 provider、URL、组织、auth type 以及服务端托管的
518
+ `aliyunAccountId`/`aliyunAssumeRoleId` 引用;Numa 不接收云 AK。CODEUP 必须引用
519
+ `aliyunAccountId`,没有 access token 时直接使用服务端 Aliyun identity,不写入空 credential。
520
+ GitHub App/PAT 或可选 Codeup access token 只能从 owner-only 文件或重定向 stdin 读取,禁止放在
521
+ argv、环境变量和 metadata JSON 中,且不会出现在输出或错误中:
522
+
523
+ ```bash
524
+ numa app scm create --input codeup.json --json
525
+ chmod 600 github-app.private.json
526
+ numa app scm create --input github.json --credential-file github-app.private.json --json
527
+ numa app scm rotate github-main --revision 4 --credential-stdin --yes --json < github-pat.private.json
528
+ numa app scm disable old-codeup --revision 7 --yes --json
529
+ ```
530
+
531
+ ## 应用候选收录
532
+
533
+ Jenkins 发现任务只生成可审查的应用候选,不会直接创建正式应用。Numa 对外把后续动作称为
534
+ “候选收录”(`adopt`):候选可能创建新应用,也可能合并到已有应用,同时确认候选携带的
535
+ Jenkins Job 绑定。“转正”容易与 npm 发布晋级、环境晋级或人员状态混淆,因此不作为 CLI
536
+ 命令和用户提示;服务端继续使用既有 `/promote` API 与审计事件,保持兼容。
537
+
538
+ 先查询候选和所需目录 ID:
539
+
540
+ ```bash
541
+ numa app options team --search platform --json
542
+ numa app options system --json
543
+ numa profile --json
544
+
545
+ numa app candidate list --status new --json
546
+ numa app candidate inspect 123 --json
547
+ ```
548
+
549
+ `candidate list` 仅返回 `APPLICATION` 类型候选;列表中的 `id` 是后续操作使用的稳定候选 ID,
550
+ 不等同于 Jenkins Job ID 或 Build Number。Job ID、环境层及绑定证据来自候选的
551
+ `proposed_relationships`,CLI 不要求用户重复填写。
552
+
553
+ 收录必须先通过服务端预检,并在写入时显式确认:
554
+
555
+ ```bash
556
+ numa app candidate preview 123 --json
557
+ numa app candidate adopt 123 --yes --json
558
+
559
+ # 最多批量处理 200 个候选;任一预检阻断时不会提交本批收录
560
+ numa app candidate adopt 123 124 --yes --json
561
+ ```
562
+
563
+ 如果候选缺少名称、环境证据不明确,或需要合并到已有应用,先 `inspect` 获取完整候选与
564
+ `version`,再用完整 review JSON 和乐观锁版本提交修复:
565
+
566
+ ```bash
567
+ numa app candidate review 123 \
568
+ --input candidate-review.json \
569
+ --revision 4 \
570
+ --json
571
+ ```
572
+
573
+ review JSON 必须包含 `operation`、`proposedFields`、`proposedRelationships` 和 `confidence`,
574
+ 且禁止嵌入凭据或 secret 引用。最终 Scope、候选状态、Job 时效性、CREATE/MERGE 冲突、逐候选
575
+ 事务和审计记录均由网关及 DevOps 后端校验,CLI 本地隐藏或显示命令不构成授权。
576
+
577
+ ## Jenkins 流水线与生产操作
578
+
579
+ `numa pipeline` 通过平台授权代理查询和操作 Jenkins。CLI 不接收 Jenkins 用户名、Token 或
580
+ URL;生产 build、retry 和 stop 由服务端再次校验 `ops-admin` 与审批依据。
581
+
582
+ 三个容易混淆的标识含义不同:
583
+
584
+ | 标识 | 生成方 | 用途 | 重试规则 |
585
+ | --- | --- | --- | --- |
586
+ | `requestId` | 平台 | 标识已创建的构建任务,用于 status、log、stop、retry | 新任务产生新值 |
587
+ | `idempotency-key` | CLI 或调用者 | 判断重复提交是否属于同一次部署 | 同一次提交重试必须复用;新部署使用新值 |
588
+ | `approve-id` | 审批流程或管理员 | 记录生产操作依据 | 按审批范围使用,不是任务标识 |
589
+
590
+ `idempotency-key` 是可选参数。不传时 CLI 会自动生成 UUID,并在成功结果中以
591
+ `idempotency_key` 返回。生产部署和自动化脚本建议显式指定:如果网络中断导致结果不明,
592
+ 使用原值重新提交,平台会返回原任务或拒绝内容不一致的冲突,不会无意创建第二个构建。
593
+
594
+ ```bash
595
+ numa pipeline inspect mci-devops-platform --json
596
+
597
+ numa pipeline build mci-devops-platform \
598
+ --tier production \
599
+ --branch main \
600
+ --approve-id OPS-APPROVAL-20260818-001 \
601
+ --idempotency-key mci-devops-platform-prd-20260818-001 \
602
+ --wait \
603
+ --json
604
+ ```
605
+
606
+ 生产操作必须提供 `--approve-id` 或至少 10 个字符的 `--production-reason`。CLI 将二者作为
607
+ 独立治理字段提交;不能使用 `--param APPROVE_ID=...` 绕过治理。平台保存两者及审计记录,
608
+ 仅在生产 trigger/retry 时把经过验证的 `approveId` 映射为 Jenkins `APPROVE_ID`;
609
+ `productionReason` 不会转发给 Jenkins。
610
+
611
+ `--wait` 和 `status --watch` 约每 2 秒轮询一次,当前没有默认超时,会持续到 `SUCCESS`、
612
+ `FAILED`、`ABORTED`、`CANCELLED` 或 `NOT_BUILT`。按 `Ctrl+C` 或遇到网络错误只会结束本地
613
+ 等待,不会停止 Jenkins 构建;真正停止任务需要显式执行 `pipeline stop ... --yes`。
614
+ `build --wait` 仅在 `SUCCESS` 时返回退出码 0,其他终态返回非零。
615
+
616
+ 保存 build 返回的 `requestId`,可以随时恢复查询:
617
+
618
+ ```bash
619
+ numa pipeline status req_01ABC --watch
620
+ numa pipeline log req_01ABC --follow
621
+ ```
622
+
623
+ 如果没有保存 `requestId`,先按应用和环境检索构建记录,再使用返回的 `requestId`:
624
+
625
+ ```bash
626
+ numa pipeline builds --app mci-devops-platform --tier production --limit 20 --json
627
+ ```
628
+
629
+ `pipeline builds` 使用游标分页:`--limit` 是每页条数,不是页码;下一页应把上一页响应中的
630
+ `next_cursor` 传给 `--cursor`。面向 AI 和自动化的同一套操作语义也包含在 `numa commands --json` 的
631
+ `operationalNotes` 字段中,因此基本流水线操作不依赖额外 Skill。
632
+
414
633
  ## 平台媒体服务
415
634
 
416
635
  自 1.8.0 起,`numa media` 通过当前 Keycloak 会话调用 `/api/v1/media`。第三方
@@ -0,0 +1,8 @@
1
+ import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
2
+ import type { AiRegistryClient } from "./client.js";
3
+ export declare function runMcpBridge(client: AiRegistryClient, options: {
4
+ namespace?: string;
5
+ instance?: string;
6
+ workspace?: string;
7
+ }): Promise<void>;
8
+ export declare function bridgeMcpTransports(local: Transport, remote: Transport): Promise<void>;
@@ -0,0 +1,63 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import { loadConfig } from "../config.js";
4
+ import { fetchWithKeycloakIdentity } from "../oauth.js";
5
+ import { AiRegistryError, redactRegistryText } from "./errors.js";
6
+ import { resolveRegistryNamespace } from "./namespace.js";
7
+ export async function runMcpBridge(client, options) {
8
+ const context = await resolveRegistryNamespace(client, options);
9
+ const router = context.capability.router;
10
+ if (!router?.endpoint || router.status !== "READY") {
11
+ throw new AiRegistryError(`Namespace ${context.namespace.namespaceKey} has no ready enterprise Router.`, "ai_registry_router_unavailable");
12
+ }
13
+ const endpoint = new URL(router.endpoint);
14
+ const local = ["localhost", "127.0.0.1", "::1", "[::1]"].includes(endpoint.hostname);
15
+ if (endpoint.protocol !== "https:" && !(endpoint.protocol === "http:" && local)) {
16
+ throw new AiRegistryError("Enterprise Router endpoint must use HTTPS.", "ai_registry_router_invalid");
17
+ }
18
+ await client.checkRouter(context.namespace.id);
19
+ const authConfig = loadConfig("aiRegistry");
20
+ const remote = new StreamableHTTPClientTransport(endpoint, {
21
+ fetch: async (input, init) => fetchWithKeycloakIdentity(authConfig, String(input), () => ({ ...init, headers: new Headers(init?.headers) }))
22
+ });
23
+ await bridgeMcpTransports(new StdioServerTransport(), remote);
24
+ }
25
+ export async function bridgeMcpTransports(local, remote) {
26
+ let closed = false;
27
+ let resolveClosed;
28
+ let rejectClosed;
29
+ const completed = new Promise((resolvePromise, rejectPromise) => {
30
+ resolveClosed = resolvePromise;
31
+ rejectClosed = rejectPromise;
32
+ });
33
+ const fail = (error) => {
34
+ if (closed)
35
+ return;
36
+ closed = true;
37
+ rejectClosed?.(new AiRegistryError(`MCP bridge failed: ${redactRegistryText(error.message)}`, "ai_registry_bridge_failed"));
38
+ void Promise.allSettled([local.close(), remote.close()]);
39
+ };
40
+ const finish = () => {
41
+ if (closed)
42
+ return;
43
+ closed = true;
44
+ resolveClosed?.();
45
+ void Promise.allSettled([local.close(), remote.close()]);
46
+ };
47
+ local.onmessage = (message) => { void remote.send(message).catch(fail); };
48
+ remote.onmessage = (message) => { void local.send(message).catch(fail); };
49
+ local.onerror = fail;
50
+ remote.onerror = fail;
51
+ local.onclose = finish;
52
+ remote.onclose = finish;
53
+ try {
54
+ await remote.start();
55
+ await local.start();
56
+ await completed;
57
+ }
58
+ catch (error) {
59
+ fail(error instanceof Error ? error : new Error(String(error)));
60
+ await completed;
61
+ }
62
+ }
63
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/ai-registry/bridge.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { AuthConfig } from "../config.js";
2
2
  import { type KeycloakTokenProvider } from "../oauth.js";
3
- import { type JsonObject, type RegistryInstance, type RegistryNamespace } from "./schemas.js";
3
+ import { type JsonObject, type RegistryCapabilities, type RegistryInstance, type RegistryNamespace, type RegistryRouter } from "./schemas.js";
4
4
  export interface AiRegistryClientDependencies {
5
5
  fetch?: typeof fetch;
6
6
  tokenProvider?: KeycloakTokenProvider;
@@ -9,6 +9,7 @@ export interface SkillDownload {
9
9
  bytes: Buffer;
10
10
  fileName: string;
11
11
  sha256: string;
12
+ version?: string;
12
13
  }
13
14
  export declare class AiRegistryClient {
14
15
  private readonly config;
@@ -18,6 +19,7 @@ export declare class AiRegistryClient {
18
19
  private authenticatedFetch;
19
20
  private json;
20
21
  listInstances(): Promise<RegistryInstance[]>;
22
+ getCapabilities(): Promise<RegistryCapabilities>;
21
23
  createInstance(input: JsonObject): Promise<RegistryInstance>;
22
24
  updateInstance(instanceId: number, input: JsonObject): Promise<RegistryInstance>;
23
25
  deleteInstance(instanceId: number): Promise<void>;
@@ -48,17 +50,41 @@ export declare class AiRegistryClient {
48
50
  commitMsg?: string;
49
51
  uploadAction?: string;
50
52
  }): Promise<unknown>;
51
- skillAction(namespaceId: number, skillName: string, action: "submit" | "publish" | "online" | "offline" | "scope" | "biz-tags" | "delete", body?: Record<string, unknown>): Promise<unknown>;
53
+ skillAction(namespaceId: number, skillName: string, action: "submit" | "publish" | "online" | "offline" | "scope" | "biz-tags" | "labels" | "delete", body?: Record<string, unknown>): Promise<unknown>;
52
54
  listMcpServers(namespaceId: number, options?: {
53
55
  search?: string;
54
56
  mcpName?: string;
55
57
  pageNo?: number;
56
58
  pageSize?: number;
57
59
  }): Promise<JsonObject>;
58
- getMcpServer(namespaceId: number, mcpName: string, version?: string): Promise<JsonObject>;
60
+ getMcpServer(namespaceId: number, mcpName: string, versionOrOptions?: string | {
61
+ version?: string;
62
+ label?: string;
63
+ }): Promise<JsonObject>;
59
64
  createMcpServer(namespaceId: number, specification: JsonObject): Promise<unknown>;
60
65
  updateMcpServer(namespaceId: number, mcpName: string, specification: JsonObject): Promise<unknown>;
61
66
  deleteMcpServer(namespaceId: number, mcpName: string, version?: string): Promise<unknown>;
67
+ mcpAction(namespaceId: number, mcpName: string, action: "online" | "offline" | "biz-tags", body?: Record<string, unknown>): Promise<unknown>;
68
+ setMcpToolEnabled(namespaceId: number, mcpName: string, toolName: string, enabled: boolean, version?: number): Promise<unknown>;
69
+ createSkillDraft(namespaceId: number, skillName: string, body?: Record<string, unknown>): Promise<unknown>;
70
+ listReleaseRequests(options?: {
71
+ namespaceId?: number;
72
+ state?: string;
73
+ cursor?: string;
74
+ limit?: number;
75
+ }): Promise<JsonObject>;
76
+ createReleaseRequest(body: JsonObject): Promise<unknown>;
77
+ reviewReleaseRequest(requestId: string, body: JsonObject): Promise<unknown>;
78
+ publishReleaseRequest(requestId: string, body?: JsonObject): Promise<unknown>;
79
+ getRouter(namespaceId: number): Promise<RegistryRouter>;
80
+ connectRouter(namespaceId: number, body?: JsonObject): Promise<unknown>;
81
+ checkRouter(namespaceId: number): Promise<JsonObject>;
82
+ reconcileNamespace(namespaceId: number): Promise<JsonObject>;
83
+ listAuditEvents(options?: {
84
+ namespaceId?: number;
85
+ cursor?: string;
86
+ limit?: number;
87
+ }): Promise<JsonObject>;
62
88
  private object;
63
89
  private instanceResponse;
64
90
  private namespaceResponse;