diff --git a/.agents/skills/unidesk-cicd/SKILL.md b/.agents/skills/unidesk-cicd/SKILL.md index dcc8d58b..8ed29632 100644 --- a/.agents/skills/unidesk-cicd/SKILL.md +++ b/.agents/skills/unidesk-cicd/SKILL.md @@ -295,6 +295,9 @@ bun scripts/cli.ts hwlab nodes control-plane legacy-cicd --help - 镜像构建、manifest/digest 和 push 仍可阻塞; - registry cache export 必须使用 BuildKit 原生 `ignore-error=true` 或等价非阻塞配置,禁止在镜像已成功发布后仅因 cache 写入抖动把 TaskRun 判失败。 - PaC `status|closeout|history` 的 `--json` 是有界 machine contract;`--full` 展开单条详情,`--raw` 才展开目标侧原始 payload。`history --id --full` 不得重复嵌套同一 rows/consumer payload或依赖 `/tmp/unidesk-cli-output` 才可读。 + - `history --json` 默认 list 只保留 run id、consumer、时间、终态、耗时、完整 source commit、delivery class/owner、env reuse、trace、首断点、typed error、读取 observation、warning 和只读 next; + - source observation、classification、artifact、collector 与 TaskRun 详情只进入 `--id` 精确下钻或显式 `--full|--raw`; + - 默认 JSON 超过输出预算并退化成 `outputTruncated` 时,优先继续收紧 projector,不要求操作者使用临时 dump。 - PaC `status` 必须在 `observability.readOnlyCapture.timeoutMs` 内完成: - 目标侧通过 `pac-status-progress` 披露最后阶段,CLI 将其投影为 `observation.remoteStage`; - PipelineRun 按 YAML 选中的 Repository CR label 做服务端 selector;TaskRun 与 Argo 原始对象各只读取一次并复用,禁止 status 为同一 run 串行读取每个 Pod 日志或重复读取 Argo; diff --git a/scripts/src/platform-infra-pipelines-as-code.ts b/scripts/src/platform-infra-pipelines-as-code.ts index c58365f7..0910b26a 100644 --- a/scripts/src/platform-infra-pipelines-as-code.ts +++ b/scripts/src/platform-infra-pipelines-as-code.ts @@ -2883,6 +2883,8 @@ function compactCloseoutJson(result: Record): Record, includeTaskDetails = false): Record { const detailRequested = stringValue(result.detailId) !== "-"; + const deliveryBudget = record(result.deliveryBudget); + const deliveryBudgetPolicy = record(deliveryBudget.policy); return { ok: result.ok === true, action: result.action, @@ -2891,7 +2893,13 @@ export function compactHistoryJson(result: Record, includeTaskD config: result.config, consumers: result.consumers, detailId: result.detailId, - deliveryBudget: result.deliveryBudget, + deliveryBudget: { + state: deliveryBudget.state, + policy: { endToEndBudgetSeconds: deliveryBudgetPolicy.endToEndBudgetSeconds }, + exactCommand: deliveryBudget.exactCommand, + blocking: deliveryBudget.blocking, + mutation: false, + }, observation: result.observation, rows: arrayRecords(result.rows).map((row) => { const taskRuns = record(row.taskRuns); @@ -2901,67 +2909,70 @@ export function compactHistoryJson(result: Record, includeTaskD return { id: row.id ?? row.pipelineRun, consumer: row.consumer, - repo: row.repo, - pipeline: row.pipeline, triggeredAt: row.triggeredAt, - startTime: row.startTime, - completionTime: row.completionTime, displayTime: row.displayTime, displayTimeZone: row.displayTimeZone, durationSeconds: row.durationSeconds, status: row.status, reason: row.reason, commit: row.commit, - branch: row.branch, deliveryClass: row.deliveryClass, - deliveryAuthorityEligible: row.deliveryAuthorityEligible === true, deliveryOwner: row.deliveryOwner, - parentRelation: row.parentRelation, - classification: row.classification, + executionOwner: row.executionOwner, envReuse: row.envReuse, - sourceObservation: row.sourceObservation, traceId: row.traceId, firstBreak: row.firstBreak, error: row.error, - artifact: detailRequested ? { - imageStatus: artifact.imageStatus, - envReuse: artifact.envReuse, - digest: artifact.digest, - digests: artifact.digests, - gitopsCommit: artifact.gitopsCommit, - sourceCommit: artifact.sourceCommit, - action: artifact.action, - reason: artifact.reason, - catalog: { - present: catalog.present === true, - status: catalog.status, - sourceCommit: catalog.sourceCommit, - registryVerified: catalog.registryVerified === true, - publishedCount: catalog.publishedCount, - reusedCount: catalog.reusedCount, - requiredServiceCount: catalog.requiredServiceCount, - digestCount: catalog.digestCount, - source: catalog.source, + ...(detailRequested ? { + repo: row.repo, + pipeline: row.pipeline, + startTime: row.startTime, + completionTime: row.completionTime, + branch: row.branch, + deliveryAuthorityEligible: row.deliveryAuthorityEligible === true, + parentRelation: row.parentRelation, + classification: row.classification, + sourceObservation: row.sourceObservation, + artifact: { + imageStatus: artifact.imageStatus, + envReuse: artifact.envReuse, + digest: artifact.digest, + digests: artifact.digests, + gitopsCommit: artifact.gitopsCommit, + sourceCommit: artifact.sourceCommit, + action: artifact.action, + reason: artifact.reason, + catalog: { + present: catalog.present === true, + status: catalog.status, + sourceCommit: catalog.sourceCommit, + registryVerified: catalog.registryVerified === true, + publishedCount: catalog.publishedCount, + reusedCount: catalog.reusedCount, + requiredServiceCount: catalog.requiredServiceCount, + digestCount: catalog.digestCount, + source: catalog.source, + valuesPrinted: false, + }, valuesPrinted: false, }, - valuesPrinted: false, - } : undefined, - collector: detailRequested ? { - mode: collector.mode, - matchingTaskCount: collector.matchingTaskCount, - contractTaskCount: collector.contractTaskCount, - terminalRecordCount: collector.terminalRecordCount, - logErrorCount: collector.logErrorCount, - logErrors: collector.logErrors, - valuesPrinted: false, - } : undefined, - taskRuns: { - count: taskRuns.count, - longest: taskRuns.longest, - failed: taskRuns.failed, - details: includeTaskDetails ? taskRuns.details : undefined, - logsCommand: taskRuns.logsCommand, - }, + collector: { + mode: collector.mode, + matchingTaskCount: collector.matchingTaskCount, + contractTaskCount: collector.contractTaskCount, + terminalRecordCount: collector.terminalRecordCount, + logErrorCount: collector.logErrorCount, + logErrors: collector.logErrors, + valuesPrinted: false, + }, + taskRuns: { + count: taskRuns.count, + longest: taskRuns.longest, + failed: taskRuns.failed, + details: includeTaskDetails ? taskRuns.details : undefined, + logsCommand: taskRuns.logsCommand, + }, + } : {}), }; }), historyErrors: result.historyErrors,