@numa-tech/numa 1.13.1 → 1.13.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.
Files changed (38) hide show
  1. package/README.md +59 -5
  2. package/dist/application-onboarding/client.d.ts +37 -3
  3. package/dist/application-onboarding/client.js +31 -2
  4. package/dist/application-onboarding/client.js.map +1 -1
  5. package/dist/application-onboarding/commands.d.ts +2 -0
  6. package/dist/application-onboarding/commands.js +202 -6
  7. package/dist/application-onboarding/commands.js.map +1 -1
  8. package/dist/application-onboarding/schemas.d.ts +772 -0
  9. package/dist/application-onboarding/schemas.js +315 -3
  10. package/dist/application-onboarding/schemas.js.map +1 -1
  11. package/dist/cli.js +6 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/command-catalog.js +154 -2
  14. package/dist/command-catalog.js.map +1 -1
  15. package/dist/gitops/schemas.js +2 -1
  16. package/dist/gitops/schemas.js.map +1 -1
  17. package/dist/jenkins-jobs/client.d.ts +319 -0
  18. package/dist/jenkins-jobs/client.js +136 -0
  19. package/dist/jenkins-jobs/client.js.map +1 -0
  20. package/dist/jenkins-jobs/commands.d.ts +6 -0
  21. package/dist/jenkins-jobs/commands.js +239 -0
  22. package/dist/jenkins-jobs/commands.js.map +1 -0
  23. package/dist/jenkins-jobs/schemas.d.ts +359 -0
  24. package/dist/jenkins-jobs/schemas.js +119 -0
  25. package/dist/jenkins-jobs/schemas.js.map +1 -0
  26. package/dist/publications/client.d.ts +181 -0
  27. package/dist/publications/client.js +147 -0
  28. package/dist/publications/client.js.map +1 -0
  29. package/dist/publications/commands.d.ts +8 -0
  30. package/dist/publications/commands.js +202 -0
  31. package/dist/publications/commands.js.map +1 -0
  32. package/dist/publications/scanner.d.ts +23 -0
  33. package/dist/publications/scanner.js +247 -0
  34. package/dist/publications/scanner.js.map +1 -0
  35. package/dist/publications/schemas.d.ts +164 -0
  36. package/dist/publications/schemas.js +90 -0
  37. package/dist/publications/schemas.js.map +1 -0
  38. package/package.json +4 -4
package/README.md CHANGED
@@ -193,7 +193,9 @@ numa config \
193
193
  | `numa mcp list/inspect/install/bridge/...` | 需登录 | 通过企业 Router 安装/桥接 MCP,并维护版本、标签和工具状态 |
194
194
  | `numa registry approvals/router/audit` | 需登录 | 两人制发布、Router 健康/对账和追加式审计 |
195
195
  | `numa registry tui` | 需登录 | 打开 namespace、Skills、MCP、审批、Router、审计全屏工作台 |
196
- | `numa app onboard/apply/resume/inspect/list/tui` | 需登录 | 创建新应用、录入存量应用并恢复服务端入驻会话 |
196
+ | `numa app begin/onboard/publication/jenkins-binding/observer-scope/first-build/...` | 需登录 | 创建、接入并按独立 child gate Promote 应用 |
197
+ | `numa publication scan/plan/apply/status/events/...` | 公开扫描/需登录写入 | 把 clean Git HEAD 通过受控 bundle 发布到受管仓库 |
198
+ | `numa jenkins job plan/apply/status/events/...` | 需登录 | 创建/校验 Jenkins Multibranch Job,默认不扫描、不构建 |
197
199
  | `numa app options` | 需登录 | 查询应用归属所需的团队、系统、业务域和环境 ID |
198
200
  | `numa app candidate list/inspect/preview/review/adopt` | 需登录 | 审查应用发现候选并确认收录,服务端执行最终管理员授权和审计 |
199
201
  | `numa media capabilities` | 需登录 | 查询媒体 API、Provider 和版本能力 |
@@ -492,6 +494,44 @@ v2 顶层字段使用严格白名单;旧 `repository`、provider 管理字段
492
494
  录入已有应用时改用 `repositoryStrategy: "ATTACH_EXISTING"`、`projectStrategy: "ASSESS_ONLY"` 和
493
495
  `repositoryRef: { "repositoryKey": "...", "expectedHead": "<40-64-hex>" }`。
494
496
 
497
+ 已有 clean Git 历史但没有 remote、并且需要完整 Promote 时使用 `schemaVersion: 3`。先幂等取得
498
+ `sessionNo`,再创建 consumer=`APPLICATION_ONBOARDING`、consumerRef=`sessionNo` 的 Repository
499
+ plan;Codeup 使用受管 README 初始化。parent 推进到 `ATTACH_PUBLICATION_PLAN` 后,CLI 才扫描
500
+ clean HEAD 并附加 session-scoped Publication child。不得改用独立 `STANDALONE` publication plan,
501
+ 也不得直接 `git push`:
502
+
503
+ ```bash
504
+ numa app begin --mode new --idempotency-key begin-code-index --yes --json
505
+
506
+ # 取得 consumer-bound Repository plan 后,把 planNo/planHash 写入 v3 spec
507
+ numa app onboard --session <session-no> --spec onboarding-v3.json --plan --json
508
+ numa app apply <session-no> --idempotency-key apply-code-index-parent --json
509
+
510
+ numa app publication attach <session-no> \
511
+ --source ./code-index --commit-message 'feat: publish code-index source' \
512
+ --client-request-id code-index-publication-1 \
513
+ --idempotency-key code-index-publication-1 --yes --json
514
+
515
+ numa app jenkins-binding confirm <session-no> \
516
+ --binding-id <id> --expected-version <version> \
517
+ --idempotency-key confirm-code-index-binding --yes --json
518
+
519
+ numa app observer-scope configure <session-no> \
520
+ --service-binding-id <id> \
521
+ --kustomization-namespace flux-system --kustomization-name prd \
522
+ --helm-release-namespace prd --helm-release-name code-index \
523
+ --workload-namespace prd --workload-kind Deployment --workload-name code-index \
524
+ --expected-version <version> --idempotency-key scope-code-index-prd --yes --json
525
+
526
+ # DEFER 永不触发构建;TRIGGER 是独立授权,生产仍由服务端强制审批证据
527
+ numa app first-build decide <session-no> --decision defer \
528
+ --idempotency-key defer-code-index-first-build --yes --json
529
+ ```
530
+
531
+ v3 structural spec 只允许 MCI_FLUX_V1 结构字段,拒绝 image、仓库/分支/namespace/path、raw
532
+ Kubernetes Secret 和明文敏感环境变量。Job Control Plane 默认 `scanMode=NONE`;`INDEX_ONLY`
533
+ 也必须通过服务端 NoTrigger 配置验证,不能等同于 build。
534
+
495
535
  ```bash
496
536
  # 只保存草稿并预检,不产生仓库、分支或 Jenkins 等外部副作用
497
537
  numa app onboard --spec onboarding.json --plan --json
@@ -544,7 +584,8 @@ numa repository namespace list --connection codeup-main --search 'numa/framework
544
584
  numa repository remote list --connection codeup-main --search code-index --json
545
585
  numa repository plan create \
546
586
  --connection codeup-main --namespace 99 --name code-index \
547
- --visibility private --initialization empty --owner-team-id 12 --json
587
+ --visibility private --initialization readme --owner-team-id 12 \
588
+ --consumer application-onboarding --consumer-ref <session-no> --json
548
589
 
549
590
  # 重新读取并审阅已经生成的不可变计划
550
591
  numa repository plan get <plan-no> --json
@@ -556,7 +597,7 @@ numa repository create \
556
597
  --idempotency-key code-index-20260822 --yes --json
557
598
  ```
558
599
 
559
- DevOps New 的 v2 spec 创建新仓库时,先以 `--consumer application-onboarding` 生成 CREATE plan,
600
+ DevOps New 的 v2/v3 spec 创建新仓库时,先以 `--consumer application-onboarding` 和真实 sessionNo 生成 CREATE plan,
560
601
  再把其 `planNo/planHash` 写入 `repositoryPlanRef`;录入已有应用时只写受管 catalog 的
561
602
  `repositoryKey` 和固定 `expectedHead`。旧 `numa app scm repository create` 已 fail-closed,不再调用
562
603
  Provider;只读 list/inspect 在兼容期保留。
@@ -625,17 +666,30 @@ SCM 管理接口位于 `/api/v1/admin/scm-connections`,最终权限始终由
625
666
  Client Role 校验。metadata JSON 只允许 provider、URL、组织、auth type 以及服务端托管的
626
667
  `aliyunAccountId`/`aliyunAssumeRoleId` 引用;Numa 不接收云 AK。CODEUP 必须引用
627
668
  `aliyunAccountId`,没有 access token 时直接使用服务端 Aliyun identity,不写入空 credential。
628
- GitHub App/PAT 或可选 Codeup access token 只能从 owner-only 文件或重定向 stdin 读取,禁止放在
629
- argv、环境变量和 metadata JSON 中,且不会出现在输出或错误中:
669
+ Codeup Personal AT 只用于 OpenAPI,不能当作 HTTPS Git 密码;包含 `100755` 文件的 Publication
670
+ 另需 Codeup HTTPS clone username/password。GitHub App/PAT 和这三项 Codeup credential 均为
671
+ WRITE_ONLY,只能从 owner-only 文件或重定向 stdin 读取,禁止放在 argv、环境变量和 metadata
672
+ JSON 中,且不会出现在输出或错误中。安全响应只返回 credential readiness boolean:
630
673
 
631
674
  ```bash
632
675
  numa app scm create --input codeup.json --json
633
676
  chmod 600 github-app.private.json
634
677
  numa app scm create --input github.json --credential-file github-app.private.json --json
635
678
  numa app scm rotate github-main --revision 4 --credential-stdin --yes --json < github-pat.private.json
679
+ numa app scm rotate codeup-main --revision 5 --credential-file codeup.private.json --yes --json
636
680
  numa app scm disable old-codeup --revision 7 --yes --json
637
681
  ```
638
682
 
683
+ Codeup 凭据文件结构如下;文件必须先执行 `chmod 600`,占位符不能直接使用:
684
+
685
+ ```json
686
+ {
687
+ "accessToken": "<Codeup Personal AT>",
688
+ "cloneUsername": "<Codeup HTTPS clone account>",
689
+ "clonePassword": "<Codeup HTTPS clone password>"
690
+ }
691
+ ```
692
+
639
693
  ## 应用候选收录
640
694
 
641
695
  Jenkins 发现任务只生成可审查的应用候选,不会直接创建正式应用。Numa 对外把后续动作称为
@@ -1,6 +1,6 @@
1
1
  import type { AuthConfig } from "../config.js";
2
2
  import { type KeycloakTokenProvider } from "../oauth.js";
3
- import { OnboardingSessionSchema, type JsonValue, type OnboardingCapabilities, type OnboardingEvent, type OnboardingMode, type OnboardingPreflight, type OnboardingSession, type OnboardingSessionState, type OnboardingTask, type ScmAdminConnection, type ScmAdminConnectionInput, type ScmConnection, type ScmNamespace, type ScmRepositoryCreateInput, type ScmCredentialUpdate, type ScmProvider, type ScmRepository } from "./schemas.js";
3
+ import { OnboardingSessionSchema, type JsonValue, type OnboardingCapabilities, type OnboardingEvent, type OnboardingFirstBuildActionRequest, type OnboardingFirstBuildActionResponse, type OnboardingJenkinsBindingActionRequest, type OnboardingJenkinsBindingActionResponse, type OnboardingMode, type OnboardingPreflight, type OnboardingObserverScopeActionRequest, type OnboardingObserverScopeActionResponse, type OnboardingPublicationPlanActionRequest, type OnboardingPublicationPlanActionResponse, type OnboardingSession, type OnboardingSessionState, type OnboardingTask, type ScmAdminConnection, type ScmAdminConnectionInput, type ScmConnection, type ScmNamespace, type ScmRepositoryCreateInput, type ScmCredentialUpdate, type ScmProvider, type ScmRepository } from "./schemas.js";
4
4
  export interface OnboardingClientDependencies {
5
5
  fetch?: typeof fetch;
6
6
  tokenProvider?: KeycloakTokenProvider;
@@ -77,7 +77,7 @@ export interface OnboardingApi {
77
77
  version: number;
78
78
  }): Promise<ScmAdminConnection>;
79
79
  disableAdminScmConnection(connectionCode: string, version: number): Promise<void>;
80
- createSession(mode: OnboardingMode): Promise<OnboardingSession>;
80
+ createSession(mode: OnboardingMode, idempotencyKey?: string): Promise<OnboardingSession>;
81
81
  listSessions(options?: {
82
82
  state?: OnboardingSessionState;
83
83
  mine?: boolean;
@@ -97,6 +97,10 @@ export interface OnboardingApi {
97
97
  planHash: string;
98
98
  idempotencyKey: string;
99
99
  }): Promise<OnboardingTask>;
100
+ attachPublicationPlan(sessionNo: string, input: OnboardingPublicationPlanActionRequest, idempotencyKey: string): Promise<OnboardingPublicationPlanActionResponse>;
101
+ confirmJenkinsBinding(sessionNo: string, input: OnboardingJenkinsBindingActionRequest, idempotencyKey: string): Promise<OnboardingJenkinsBindingActionResponse>;
102
+ configureObserverScope(sessionNo: string, input: OnboardingObserverScopeActionRequest, idempotencyKey: string): Promise<OnboardingObserverScopeActionResponse>;
103
+ decideFirstBuild(sessionNo: string, input: OnboardingFirstBuildActionRequest, idempotencyKey: string): Promise<OnboardingFirstBuildActionResponse>;
100
104
  getEvents(sessionNo: string, afterSequence?: number): Promise<{
101
105
  items: OnboardingEvent[];
102
106
  nextSequence: number;
@@ -232,6 +236,8 @@ export declare class OnboardingClient implements OnboardingApi {
232
236
  lastError?: string | null | undefined;
233
237
  version: number;
234
238
  credentialConfigured: boolean;
239
+ codeupAccessTokenConfigured: boolean;
240
+ codeupCloneCredentialConfigured: boolean;
235
241
  credentialVersion?: number | undefined;
236
242
  credentialUpdatedAt?: string | null | undefined;
237
243
  }[];
@@ -247,7 +253,7 @@ export declare class OnboardingClient implements OnboardingApi {
247
253
  version: number;
248
254
  }): Promise<ScmAdminConnection>;
249
255
  disableAdminScmConnection(connectionCode: string, version: number): Promise<void>;
250
- createSession(mode: OnboardingMode): Promise<OnboardingSession>;
256
+ createSession(mode: OnboardingMode, idempotencyKey?: string): Promise<OnboardingSession>;
251
257
  listSessions(options?: {
252
258
  state?: OnboardingSessionState;
253
259
  mine?: boolean;
@@ -267,6 +273,10 @@ export declare class OnboardingClient implements OnboardingApi {
267
273
  planHash: string;
268
274
  idempotencyKey: string;
269
275
  }): Promise<OnboardingTask>;
276
+ attachPublicationPlan(sessionNo: string, input: OnboardingPublicationPlanActionRequest, idempotencyKey: string): Promise<OnboardingPublicationPlanActionResponse>;
277
+ confirmJenkinsBinding(sessionNo: string, input: OnboardingJenkinsBindingActionRequest, idempotencyKey: string): Promise<OnboardingJenkinsBindingActionResponse>;
278
+ configureObserverScope(sessionNo: string, input: OnboardingObserverScopeActionRequest, idempotencyKey: string): Promise<OnboardingObserverScopeActionResponse>;
279
+ decideFirstBuild(sessionNo: string, input: OnboardingFirstBuildActionRequest, idempotencyKey: string): Promise<OnboardingFirstBuildActionResponse>;
270
280
  getEvents(sessionNo: string, afterSequence?: number): Promise<{
271
281
  items: {
272
282
  [x: string]: unknown;
@@ -296,6 +306,21 @@ export declare class OnboardingClient implements OnboardingApi {
296
306
  warnCount?: number | undefined;
297
307
  jenkinsCandidateBindingIds?: (string | number)[] | undefined;
298
308
  jenkinsPendingTiers?: string[] | undefined;
309
+ publicationPlanNo?: string | undefined;
310
+ publicationPlanHash?: string | undefined;
311
+ publicationRunNo?: string | undefined;
312
+ publicationState?: string | undefined;
313
+ publicationRevision?: string | undefined;
314
+ publicationManifestDigest?: string | undefined;
315
+ publicationFilesWritten?: number | undefined;
316
+ jenkinsPlanNo?: string | undefined;
317
+ jenkinsPlanHash?: string | undefined;
318
+ jenkinsRunNo?: string | undefined;
319
+ jenkinsState?: string | undefined;
320
+ jenkinsJobId?: string | number | undefined;
321
+ jenkinsBindingId?: string | number | undefined;
322
+ jenkinsInventoryGeneration?: number | undefined;
323
+ jenkinsConfigDigest?: string | undefined;
299
324
  gitopsPlanNumber?: string | undefined;
300
325
  gitopsPlanHash?: string | undefined;
301
326
  gitopsPlanFiles?: string[] | undefined;
@@ -309,6 +334,15 @@ export declare class OnboardingClient implements OnboardingApi {
309
334
  gitopsBaseRevision?: string | undefined;
310
335
  gitopsResultRevision?: string | undefined;
311
336
  gitopsReviewUrl?: string | undefined;
337
+ observerScopeNo?: string | undefined;
338
+ observerScopeStatus?: string | undefined;
339
+ observerEvidenceFreshness?: string | undefined;
340
+ observerLastDriftState?: string | undefined;
341
+ observerLastSequence?: number | undefined;
342
+ observerLastObservedAt?: string | undefined;
343
+ firstBuildDecision?: string | undefined;
344
+ firstBuildRequestId?: string | undefined;
345
+ firstBuildState?: string | undefined;
312
346
  retryAfterSeconds?: number | undefined;
313
347
  recoveryAction?: string | undefined;
314
348
  bundleDigest?: string | undefined;
@@ -1,7 +1,7 @@
1
1
  import { resolveBackendUrl } from "../backend.js";
2
2
  import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
3
3
  import { OnboardingError, redactOnboardingText } from "./errors.js";
4
- import { OnboardingApiErrorSchema, OnboardingAssessmentSchema, OnboardingCapabilitiesSchema, OnboardingEventListSchema, OnboardingObjectListSchema, OnboardingPreflightSchema, OnboardingSessionListSchema, OnboardingSessionSchema, OnboardingTaskSchema, ScmAdminConnectionListSchema, ScmAdminConnectionSchema, ScmConnectionListSchema, ScmNamespacePageSchema, ScmRepositoryPageSchema, ScmRepositorySchema } from "./schemas.js";
4
+ import { OnboardingApiErrorSchema, OnboardingAssessmentSchema, OnboardingCapabilitiesSchema, OnboardingEventListSchema, OnboardingFirstBuildActionResponseSchema, OnboardingJenkinsBindingActionResponseSchema, OnboardingObjectListSchema, OnboardingObserverScopeActionResponseSchema, OnboardingPreflightSchema, OnboardingPublicationPlanActionResponseSchema, OnboardingSessionListSchema, OnboardingSessionSchema, OnboardingTaskSchema, ScmAdminConnectionListSchema, ScmAdminConnectionSchema, ScmConnectionListSchema, ScmNamespacePageSchema, ScmRepositoryPageSchema, ScmRepositorySchema } from "./schemas.js";
5
5
  const API_ROOT = "/api/v1/application-onboarding";
6
6
  const ADMIN_SCM_ROOT = "/api/v1/admin/scm-connections";
7
7
  const SCM_ROOT = "/api/v1/scm/connections";
@@ -175,9 +175,10 @@ export class OnboardingClient {
175
175
  throw new OnboardingError(`Application onboarding API returned HTTP ${response.status}; expected 200 or 204.`, "onboarding_invalid_response", response.status, requestIdFrom(response, body));
176
176
  }
177
177
  }
178
- createSession(mode) {
178
+ createSession(mode, idempotencyKey) {
179
179
  return this.json(`${API_ROOT}/sessions`, OnboardingSessionSchema, {
180
180
  method: "POST",
181
+ headers: idempotencyKey ? { "Idempotency-Key": idempotencyKey } : undefined,
181
182
  body: JSON.stringify({ mode })
182
183
  }, [200, 201]);
183
184
  }
@@ -205,6 +206,34 @@ export class OnboardingClient {
205
206
  body: JSON.stringify({ planHash: input.planHash })
206
207
  }, [200, 202]);
207
208
  }
209
+ attachPublicationPlan(sessionNo, input, idempotencyKey) {
210
+ return this.json(`${API_ROOT}/sessions/${encodeURIComponent(safeSessionNo(sessionNo))}/publication-plan`, OnboardingPublicationPlanActionResponseSchema, {
211
+ method: "POST",
212
+ headers: { "Idempotency-Key": idempotencyKey },
213
+ body: JSON.stringify(input)
214
+ });
215
+ }
216
+ confirmJenkinsBinding(sessionNo, input, idempotencyKey) {
217
+ return this.json(`${API_ROOT}/sessions/${encodeURIComponent(safeSessionNo(sessionNo))}/jenkins-binding/confirm`, OnboardingJenkinsBindingActionResponseSchema, {
218
+ method: "POST",
219
+ headers: { "Idempotency-Key": idempotencyKey },
220
+ body: JSON.stringify(input)
221
+ });
222
+ }
223
+ configureObserverScope(sessionNo, input, idempotencyKey) {
224
+ return this.json(`${API_ROOT}/sessions/${encodeURIComponent(safeSessionNo(sessionNo))}/observer-scope`, OnboardingObserverScopeActionResponseSchema, {
225
+ method: "PUT",
226
+ headers: { "Idempotency-Key": idempotencyKey },
227
+ body: JSON.stringify(input)
228
+ });
229
+ }
230
+ decideFirstBuild(sessionNo, input, idempotencyKey) {
231
+ return this.json(`${API_ROOT}/sessions/${encodeURIComponent(safeSessionNo(sessionNo))}/first-build-decision`, OnboardingFirstBuildActionResponseSchema, {
232
+ method: "POST",
233
+ headers: { "Idempotency-Key": idempotencyKey },
234
+ body: JSON.stringify(input)
235
+ }, [200, 202]);
236
+ }
208
237
  getEvents(sessionNo, afterSequence) {
209
238
  return this.json(queryPath(`${API_ROOT}/sessions/${encodeURIComponent(safeSessionNo(sessionNo))}/events`, { afterSequence }), OnboardingEventListSchema);
210
239
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/application-onboarding/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/application-onboarding/client.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Command } from "commander";
2
+ import { type PublicationScanResult } from "../publications/scanner.js";
2
3
  import { type OnboardingApi } from "./client.js";
3
4
  import { OnboardingError } from "./errors.js";
4
5
  import { type OnboardingEvent, type OnboardingEventOutput, type OnboardingMode, type OnboardingSession, type OnboardingSessionState, type OnboardingSpec, type ScmAuthType, type ScmConnection, type ScmCredentialBundle, type ScmCredentialUpdate } from "./schemas.js";
@@ -7,6 +8,7 @@ export interface ApplicationOnboardingCommandDependencies {
7
8
  clientFactory?: () => OnboardingApi;
8
9
  interactive?: () => boolean;
9
10
  runTui?: typeof runOnboardingTui;
11
+ scanPublication?: (sourceDirectory: string) => Promise<PublicationScanResult>;
10
12
  sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
11
13
  }
12
14
  export interface OnboardingSpecExecutionResult {
@@ -4,9 +4,10 @@ import { loadAppConfig } from "../app-config.js";
4
4
  import { loadConfig } from "../config.js";
5
5
  import { registerApplicationCandidateCommands } from "../application-candidates/commands.js";
6
6
  import { SourceRepositoryClient } from "../repositories/client.js";
7
+ import { publicationScanSummary, scanProjectPublication } from "../publications/scanner.js";
7
8
  import { OnboardingClient } from "./client.js";
8
9
  import { OnboardingError, sanitizeOnboardingOutput } from "./errors.js";
9
- import { OnboardingModeSchema, OnboardingEventOutputSchema, OnboardingSessionStateSchema, OnboardingSpecSchema, ScmProviderSchema } from "./schemas.js";
10
+ import { OnboardingModeSchema, OnboardingEventOutputSchema, OnboardingFirstBuildActionRequestSchema, OnboardingJenkinsBindingActionRequestSchema, OnboardingObserverScopeActionRequestSchema, OnboardingPublicationPlanActionRequestSchema, OnboardingSessionStateSchema, OnboardingSpecSchema, ScmProviderSchema } from "./schemas.js";
10
11
  import { readScmAdminConnectionInput, readScmCredentialBundle } from "./scm-credentials.js";
11
12
  import { runOnboardingTui } from "./tui.js";
12
13
  const TERMINAL_STATES = new Set(["COMPLETED", "FAILED", "CANCELLED"]);
@@ -211,6 +212,56 @@ function idempotencyKey(value, operation = "--apply") {
211
212
  }
212
213
  return candidate;
213
214
  }
215
+ function stableActionText(value, label, maximum = 253) {
216
+ const candidate = value?.trim() ?? "";
217
+ if (!candidate || candidate.length > maximum || /[\u0000-\u001f\u007f]/u.test(candidate)) {
218
+ throw new OnboardingError(`${label} must be 1-${maximum} printable characters.`, "onboarding_input_invalid");
219
+ }
220
+ return candidate;
221
+ }
222
+ function sha256(value, label) {
223
+ const candidate = value?.trim() ?? "";
224
+ if (!/^[0-9a-f]{64}$/u.test(candidate)) {
225
+ throw new OnboardingError(`${label} must be the exact lower-case SHA-256 locked by the server.`, "onboarding_input_invalid");
226
+ }
227
+ return candidate;
228
+ }
229
+ function collectParameter(value, previous) {
230
+ return [...previous, value];
231
+ }
232
+ function buildParameters(values) {
233
+ if (!values?.length)
234
+ return undefined;
235
+ if (values.length > 100)
236
+ throw new OnboardingError("At most 100 first-build parameters are allowed.", "onboarding_input_invalid");
237
+ const result = {};
238
+ for (const value of values) {
239
+ const separator = value.indexOf("=");
240
+ const key = separator > 0 ? value.slice(0, separator).trim() : "";
241
+ const parameterValue = separator > 0 ? value.slice(separator + 1) : "";
242
+ if (!/^[A-Za-z_][A-Za-z0-9_.-]{0,127}$/u.test(key) || parameterValue.length > 2_000
243
+ || /[\u0000-\u001f\u007f]/u.test(parameterValue)) {
244
+ throw new OnboardingError("Each --parameter must be printable KEY=VALUE with a stable key.", "onboarding_input_invalid");
245
+ }
246
+ const normalizedKey = key.replace(/[^A-Za-z0-9]/gu, "").toLowerCase();
247
+ if (["secret", "password", "passwd", "credential", "token", "privatekey", "apikey", "accesskey"].some((part) => normalizedKey.includes(part))
248
+ || /\b(?:Bearer|Basic)\s+\S+/iu.test(parameterValue)
249
+ || /\b(?:gh[pousr]_[A-Za-z0-9_]{20,}|LTAI[A-Za-z0-9]{12,})\b/u.test(parameterValue)
250
+ || /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/u.test(parameterValue)) {
251
+ throw new OnboardingError("First-build parameters cannot contain credential-like keys or values.", "onboarding_secret_not_allowed");
252
+ }
253
+ if (Object.hasOwn(result, key))
254
+ throw new OnboardingError(`Duplicate first-build parameter: ${key}`, "onboarding_input_invalid");
255
+ result[key] = parameterValue;
256
+ }
257
+ return result;
258
+ }
259
+ function parsedActionInput(schema, value) {
260
+ const parsed = schema.safeParse(value);
261
+ if (!parsed.success)
262
+ throw new OnboardingError(`Invalid onboarding action input: ${parsed.error.message}`, "onboarding_input_invalid");
263
+ return parsed.data;
264
+ }
214
265
  export async function readOnboardingSpec(path) {
215
266
  try {
216
267
  const info = await stat(path);
@@ -353,6 +404,7 @@ export function registerApplicationOnboardingCommands(program, dependencies = {}
353
404
  const client = () => dependencies.clientFactory?.() ?? new OnboardingClient(loadConfig("platform"));
354
405
  const isInteractive = dependencies.interactive ?? (() => Boolean(process.stdin.isTTY && process.stdout.isTTY));
355
406
  const tui = dependencies.runTui ?? runOnboardingTui;
407
+ const scanPublication = dependencies.scanPublication ?? scanProjectPublication;
356
408
  const sleep = dependencies.sleep ?? defaultSleep;
357
409
  const app = program.command("app")
358
410
  .description("创建新应用或把存量代码库接入 DevOps 平台")
@@ -388,7 +440,8 @@ export function registerApplicationOnboardingCommands(program, dependencies = {}
388
440
  live probe 与连接变更由服务端校验平台管理员权限和乐观锁 version。
389
441
  provider credential 只能来自权限受限文件或重定向 stdin;禁止通过 argv、环境变量或普通 JSON 输出传递。
390
442
  Codeup 云 AK/Role 只能引用已有 aliyunAccountId/aliyunAssumeRoleId,Numa 不读取或保存云 AK。
391
- 未提供 Codeup accessToken 时使用服务端 Aliyun identity,不提交空 credential bundle
443
+ Codeup accessToken 只用于 OpenAPI;含 100755 文件的 Publication 另需 HTTPS cloneUsername/clonePassword
444
+ 三者只从 chmod 600 文件或重定向 stdin 写入;未提供时使用服务端 Aliyun identity,不提交空 credential bundle。
392
445
  `);
393
446
  addExamples(scm.command("list")
394
447
  .description("列出当前用户可见的安全 SCM 连接摘要")
@@ -541,7 +594,7 @@ export function registerApplicationOnboardingCommands(program, dependencies = {}
541
594
  if (credential) {
542
595
  connection = await onboarding.rotateAdminScmCredential(connection.code, scmCredentialUpdate(connection.version, connection.authType, credential));
543
596
  }
544
- await output(command, { ok: true, connection }, `${connection.code}\t${connection.status}\tversion:${connection.version}\tcredential:${connection.credentialConfigured ? "configured" : "missing"}`);
597
+ await output(command, { ok: true, connection }, `${connection.code}\t${connection.status}\tversion:${connection.version}\tcredential:${connection.credentialConfigured ? "configured" : "missing"}\tcodeup-at:${connection.codeupAccessTokenConfigured ? "ready" : "missing"}\tcodeup-clone:${connection.codeupCloneCredentialConfigured ? "ready" : "missing"}`);
545
598
  }), [
546
599
  "numa app scm create --input github.json --credential-file github-app.private.json --json",
547
600
  "numa app scm create --input codeup.json --json"
@@ -565,7 +618,7 @@ export function registerApplicationOnboardingCommands(program, dependencies = {}
565
618
  await output(command, { ok: true, connection }, `${connection.code}\t${connection.status}\tversion:${connection.version}`);
566
619
  }), ["numa app scm update github-main --input github.json --revision 4 --yes --json"]);
567
620
  addExamples(scm.command("rotate <code>")
568
- .description("平台管理员写入新 GitHub Codeup access token;不会回显 credential")
621
+ .description("平台管理员轮换 GitHub 凭据或 Codeup OpenAPI/HTTPS clone 凭据;不会回显 credential")
569
622
  .requiredOption("--revision <number>", "当前乐观锁 version")
570
623
  .option("--credential-file <file>", "仅 owner 可读(chmod 600)的 provider credential JSON")
571
624
  .option("--credential-stdin", "从重定向 stdin 读取 provider credential JSON")
@@ -587,7 +640,7 @@ export function registerApplicationOnboardingCommands(program, dependencies = {}
587
640
  await output(command, { ok: true, connection }, `${connection.code}\tcredential:configured\tversion:${connection.version}`);
588
641
  }), [
589
642
  "numa app scm rotate github-main --revision 4 --credential-file github-app.private.json --yes --json",
590
- "numa app scm rotate codeup-main --revision 2 --credential-stdin --yes --json < codeup-token.private.json"
643
+ "numa app scm rotate codeup-main --revision 2 --credential-stdin --yes --json < codeup.private.json"
591
644
  ]);
592
645
  addExamples(scm.command("disable <code>")
593
646
  .description("平台管理员软禁用连接;服务端会阻止仍被非终态会话使用的连接")
@@ -603,11 +656,27 @@ export function registerApplicationOnboardingCommands(program, dependencies = {}
603
656
  await onboarding.disableAdminScmConnection(code, version);
604
657
  await output(command, { ok: true, code, disabled: true, previousVersion: version }, `${code}\tDISABLED`);
605
658
  }), ["numa app scm disable github-main --revision 5 --yes --json"]);
659
+ addExamples(app.command("begin")
660
+ .description("幂等创建空 onboarding session,为 consumer-bound Repository plan 获取 sessionNo")
661
+ .requiredOption("--mode <mode>", "new|existing")
662
+ .requiredOption("--idempotency-key <key>", "同一 actor/mode 结果未知时复用")
663
+ .option("--yes", "确认创建服务端草稿会话")
664
+ .action(async (options, command) => {
665
+ requireConfirmation(options.yes, "Beginning an onboarding session");
666
+ const key = idempotencyKey(options.idempotencyKey, "onboarding begin");
667
+ const session = await client().createSession(parseOnboardingMode(options.mode), key);
668
+ await output(command, { ok: true, session, idempotencyKey: key }, sessionLine(session));
669
+ }), [
670
+ "numa app begin --mode new --idempotency-key begin-code-index-onboarding --yes --json"
671
+ ], [
672
+ "先取得 sessionNo,再创建 consumer=APPLICATION_ONBOARDING、consumerRef=sessionNo 的 Repository plan。",
673
+ "相同 actor/key/mode 安全返回原 session;不同 mode 冲突,不会创建第二个会话。"
674
+ ]);
606
675
  addExamples(app.command("onboard")
607
676
  .description("启动入驻向导,或按 JSON spec 创建、预检和执行")
608
677
  .option("--mode <mode>", "new|existing;如有 --spec 必须与文件一致")
609
678
  .option("--session <session-no>", "更新已有草稿并跨 Web/CLI 恢复;不创建新会话")
610
- .option("--spec <file>", "schemaVersion=1(兼容)或 2(Repository Control Plane)的 onboarding JSON 文件")
679
+ .option("--spec <file>", "schemaVersion=1(兼容)、2(Repository CP)或 3(Promote 全链路)的 onboarding JSON 文件")
611
680
  .option("--plan", "保存草稿并执行服务端预检,不产生外部副作用")
612
681
  .option("--apply", "保存草稿、预检并提交服务端异步执行")
613
682
  .option("--idempotency-key <key>", "apply 幂等键;结果不明时必须复用")
@@ -648,6 +717,133 @@ export function registerApplicationOnboardingCommands(program, dependencies = {}
648
717
  "未指定 --plan/--apply 时只保存服务端草稿。",
649
718
  "完整 spec 保存的 currentStep 为稳定字符串 REVIEW。"
650
719
  ]);
720
+ const publicationAction = app.command("publication")
721
+ .description("为 schemaVersion=3 会话附加受控本地源码 Publication 计划");
722
+ addExamples(publicationAction.command("attach <session-no>")
723
+ .description("扫描 clean Git HEAD 并创建绑定当前 onboarding planHash 的 child plan;不写远端 Git")
724
+ .requiredOption("--source <directory>", "本地 Git worktree 根目录")
725
+ .requiredOption("--commit-message <message>", "受审提交消息,1-500字符")
726
+ .requiredOption("--client-request-id <id>", "稳定 child request ID")
727
+ .requiredOption("--idempotency-key <key>", "结果未知时必须复用;须与 client-request-id 相同")
728
+ .option("--yes", "确认上传受限源码 bundle 并附加 child plan")
729
+ .action(async (sessionNo, options, command) => {
730
+ requireConfirmation(options.yes, "Attaching a project publication plan");
731
+ const key = idempotencyKey(options.idempotencyKey, "publication attach");
732
+ const clientRequestId = stableActionText(options.clientRequestId, "client-request-id", 200);
733
+ if (key !== clientRequestId) {
734
+ throw new OnboardingError("idempotency-key must exactly match client-request-id for publication attachment.", "onboarding_input_invalid");
735
+ }
736
+ const onboarding = client();
737
+ const session = await onboarding.getSession(sessionNo);
738
+ const source = await scanPublication(options.source);
739
+ const input = parsedActionInput(OnboardingPublicationPlanActionRequestSchema, {
740
+ parentPlanHash: sha256(session.planHash, "session planHash"),
741
+ clientRequestId,
742
+ sourceRevision: source.sourceRevision,
743
+ sourceTreeDigest: source.sourceTreeDigest,
744
+ clean: true,
745
+ commitMessage: options.commitMessage,
746
+ files: source.requestFiles
747
+ });
748
+ const result = await onboarding.attachPublicationPlan(sessionNo, input, key);
749
+ await output(command, {
750
+ ok: true,
751
+ session: result.session,
752
+ publicationPlan: result.publicationPlan,
753
+ replayed: result.replayed,
754
+ scan: publicationScanSummary(source),
755
+ idempotencyKey: key
756
+ }, `${result.publicationPlan.planNo}\t${result.publicationPlan.state}\t${result.publicationPlan.planHash}\treplayed:${result.replayed}`);
757
+ }), [
758
+ "numa app publication attach <session-no> --source ./code-index --commit-message 'feat: publish code-index source' --client-request-id onboarding-code-index-publication --idempotency-key onboarding-code-index-publication --yes --json"
759
+ ], [
760
+ "只读取 clean Git HEAD;输出不含 sourceRoot、contentBase64 或 SCM credential。",
761
+ "该动作只创建 child plan;onboarding worker 仍会等待显式执行和验证。"
762
+ ]);
763
+ const jenkinsBindingAction = app.command("jenkins-binding")
764
+ .description("确认 Job Control Plane 产生的候选 Jenkins binding");
765
+ addExamples(jenkinsBindingAction.command("confirm <session-no>")
766
+ .requiredOption("--binding-id <id>", "会话事件返回的候选 binding ID")
767
+ .requiredOption("--expected-version <number>", "候选 binding 当前乐观锁版本")
768
+ .requiredOption("--idempotency-key <key>", "结果未知时复用同一 key")
769
+ .option("--yes", "确认该 Jenkins job 与应用/tier 的绑定关系")
770
+ .action(async (sessionNo, options, command) => {
771
+ requireConfirmation(options.yes, "Confirming a Jenkins binding");
772
+ const key = idempotencyKey(options.idempotencyKey, "jenkins binding confirmation");
773
+ const input = parsedActionInput(OnboardingJenkinsBindingActionRequestSchema, {
774
+ bindingId: positiveInteger(options.bindingId, "binding-id"),
775
+ expectedVersion: nonNegativeInteger(options.expectedVersion, "expected-version", 0)
776
+ });
777
+ const result = await client().confirmJenkinsBinding(sessionNo, input, key);
778
+ await output(command, { ok: true, ...result, idempotencyKey: key }, `${result.binding.id}\t${result.binding.confirmationStatus}\tv${result.binding.version}\treplayed:${result.replayed}`);
779
+ }), [
780
+ "numa app jenkins-binding confirm <session-no> --binding-id 42 --expected-version 0 --idempotency-key confirm-code-index-binding --yes --json"
781
+ ], ["确认不会触发 scan 或 build;Job Control Plane 已独立验证配置和 inventory generation。"]);
782
+ const observerScopeAction = app.command("observer-scope")
783
+ .description("把服务绑定关联到 observer 可验证的精确 Flux/Kubernetes 坐标");
784
+ addExamples(observerScopeAction.command("configure <session-no>")
785
+ .requiredOption("--service-binding-id <id>", "会话锁定的 GitOps service binding ID")
786
+ .requiredOption("--kustomization-namespace <name>", "Flux Kustomization namespace")
787
+ .requiredOption("--kustomization-name <name>", "Flux Kustomization name")
788
+ .requiredOption("--helm-release-namespace <name>", "HelmRelease namespace")
789
+ .requiredOption("--helm-release-name <name>", "HelmRelease name")
790
+ .requiredOption("--workload-namespace <name>", "最终 workload namespace")
791
+ .requiredOption("--workload-kind <kind>", "最终 workload kind")
792
+ .requiredOption("--workload-name <name>", "最终 workload name")
793
+ .requiredOption("--expected-version <number>", "scope 当前版本;首次创建使用服务端事件给出的版本")
794
+ .requiredOption("--idempotency-key <key>", "结果未知时复用同一 key")
795
+ .option("--yes", "确认精确运行态坐标")
796
+ .action(async (sessionNo, options, command) => {
797
+ requireConfirmation(options.yes, "Configuring an observer scope");
798
+ const key = idempotencyKey(options.idempotencyKey, "observer scope configuration");
799
+ const input = parsedActionInput(OnboardingObserverScopeActionRequestSchema, {
800
+ serviceBindingId: positiveInteger(options.serviceBindingId, "service-binding-id"),
801
+ kustomizationNamespace: stableActionText(options.kustomizationNamespace, "kustomization-namespace"),
802
+ kustomizationName: stableActionText(options.kustomizationName, "kustomization-name"),
803
+ helmReleaseNamespace: stableActionText(options.helmReleaseNamespace, "helm-release-namespace"),
804
+ helmReleaseName: stableActionText(options.helmReleaseName, "helm-release-name"),
805
+ workloadNamespace: stableActionText(options.workloadNamespace, "workload-namespace"),
806
+ workloadKind: stableActionText(options.workloadKind, "workload-kind", 160),
807
+ workloadName: stableActionText(options.workloadName, "workload-name"),
808
+ expectedVersion: nonNegativeInteger(options.expectedVersion, "expected-version", 0)
809
+ });
810
+ const result = await client().configureObserverScope(sessionNo, input, key);
811
+ await output(command, { ok: true, ...result, idempotencyKey: key }, `${result.scope.scopeNo}\t${result.scope.status}\t${result.scope.evidenceFreshness}\t${result.scope.lastDriftState ?? "-"}`);
812
+ }), [
813
+ "numa app observer-scope configure <session-no> --service-binding-id 17 --kustomization-namespace flux-system --kustomization-name prd --helm-release-namespace prd --helm-release-name code-index --workload-namespace prd --workload-kind Deployment --workload-name code-index --expected-version 0 --idempotency-key scope-code-index-prd --yes --json"
814
+ ], ["服务端强制 serviceBindingId 属于该会话;CLI 不允许任意 cluster/path/YAML。"]);
815
+ const firstBuildAction = app.command("first-build")
816
+ .description("在全部结构与运行证据就绪后,独立决定首次 Jenkins build");
817
+ addExamples(firstBuildAction.command("decide <session-no>")
818
+ .requiredOption("--decision <decision>", "trigger|defer")
819
+ .option("--branch <branch>", "TRIGGER 的分支;缺省由服务端锁定配置决定")
820
+ .option("--parameter <KEY=VALUE>", "非敏感构建参数,可重复", collectParameter, [])
821
+ .option("--approve-id <id>", "生产 TRIGGER 的审批记录 ID")
822
+ .option("--production-reason <reason>", "生产 TRIGGER 的受审原因(至少10字符)")
823
+ .requiredOption("--idempotency-key <key>", "结果未知时复用同一 key")
824
+ .option("--yes", "确认记录决定;TRIGGER 会真正提交 Jenkins build")
825
+ .action(async (sessionNo, options, command) => {
826
+ requireConfirmation(options.yes, "Recording the first-build decision");
827
+ const decision = options.decision.trim().toUpperCase();
828
+ const input = parsedActionInput(OnboardingFirstBuildActionRequestSchema, {
829
+ decision,
830
+ branch: options.branch?.trim() || undefined,
831
+ parameters: buildParameters(options.parameter),
832
+ approveId: options.approveId?.trim() || undefined,
833
+ productionReason: options.productionReason?.trim() || undefined
834
+ });
835
+ const key = idempotencyKey(options.idempotencyKey, "first-build decision");
836
+ const result = await client().decideFirstBuild(sessionNo, input, key);
837
+ await output(command, { ok: true, ...result, idempotencyKey: key }, result.build
838
+ ? `${result.decision}\t${result.build.requestId}\t${result.build.state}\treplayed:${result.replayed}`
839
+ : `${result.decision}\tno-build\treplayed:${result.replayed}`);
840
+ }), [
841
+ "numa app first-build decide <session-no> --decision defer --idempotency-key defer-code-index-first-build --yes --json",
842
+ "numa app first-build decide <session-no> --decision trigger --branch main --idempotency-key trigger-code-index-first-build --yes --json"
843
+ ], [
844
+ "DEFER 永不触发 build,且会话保持 WAITING_EXTERNAL。",
845
+ "生产 TRIGGER 仍由服务端强制 ops-admin 与受审生产依据;参数禁止凭据式 key/value。"
846
+ ]);
651
847
  addExamples(app.command("resume <session-no>")
652
848
  .description("让服务端重新检查外部等待条件,不在客户端推进状态")
653
849
  .action(async (sessionNo, _options, command) => {