@fitlab-ai/agent-infra 0.9.14 → 0.10.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 +10 -0
- package/README.zh-CN.md +10 -0
- package/bin/internal-cli.sh +45 -0
- package/dist/bin/internal-cli.js +93 -30
- package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
- package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +9 -4
- package/dist/lib/agent-clients/adapters/codex-lifecycle/store.js +43 -3
- package/dist/lib/defaults.json +103 -103
- package/dist/lib/fs/durable-write.js +39 -0
- package/dist/lib/fs/file-lock.js +111 -0
- package/dist/lib/host-control/audit.js +19 -0
- package/dist/lib/host-control/client.js +142 -0
- package/dist/lib/host-control/command.js +49 -0
- package/dist/lib/host-control/path.js +160 -0
- package/dist/lib/host-control/secure-fs.js +140 -0
- package/dist/lib/host-control/server.js +159 -0
- package/dist/lib/host-control/service.js +112 -0
- package/dist/lib/init.js +11 -2
- package/dist/lib/internal/cli-route-inventory.js +4 -2
- package/dist/lib/internal/codex-lifecycle.js +6 -6
- package/dist/lib/internal/demo-promotion.js +322 -0
- package/dist/lib/internal/demo-transcript.js +454 -0
- package/dist/lib/internal/host-control.js +28 -0
- package/dist/lib/internal/manual-validation.js +331 -0
- package/dist/lib/internal/platform-pr.js +18 -4
- package/dist/lib/internal/release-workflow.js +63 -84
- package/dist/lib/internal/sandbox-control.js +149 -2
- package/dist/lib/internal/task-artifact.js +16 -263
- package/dist/lib/internal/task-create.js +6 -5
- package/dist/lib/internal/task-event.js +37 -37
- package/dist/lib/internal/task-lifecycle.js +2 -2
- package/dist/lib/internal/task-operation-registry.js +101 -4
- package/dist/lib/internal/task-review.js +11 -56
- package/dist/lib/internal/task-validate.js +30 -10
- package/dist/lib/owned-path.js +33 -0
- package/dist/lib/platform/check-status.js +11 -0
- package/dist/lib/platform/comment-safety.js +4 -1
- package/dist/lib/platform/completion-backfill.js +1 -1
- package/dist/lib/platform/github-data.js +241 -0
- package/dist/lib/platform/github-provider.js +15 -20
- package/dist/lib/platform/issue-comments.js +18 -12
- package/dist/lib/platform/issues.js +2 -180
- package/dist/lib/platform/pr-change-report.js +5 -4
- package/dist/lib/platform/pr-checks.js +12 -65
- package/dist/lib/platform/pr-summary.js +117 -33
- package/dist/lib/platform/pull-requests.js +5 -108
- package/dist/lib/platform/snapshots.js +2 -0
- package/dist/lib/platform/task-identities.js +2 -9
- package/dist/lib/platform/verification-sync.js +132 -143
- package/dist/lib/pr-review/evidence-grading.js +4 -8
- package/dist/lib/release/workflow.js +1 -1
- package/dist/lib/sandbox/commands/create.js +7 -2
- package/dist/lib/sandbox/commands/rm.js +19 -1511
- package/dist/lib/sandbox/control/audit.js +203 -0
- package/dist/lib/sandbox/control/client.js +93 -54
- package/dist/lib/sandbox/control/executor.js +129 -65
- package/dist/lib/sandbox/control/finalization-response.js +27 -0
- package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
- package/dist/lib/sandbox/control/lifecycle.js +36 -2
- package/dist/lib/sandbox/control/native-file-lock.js +6 -98
- package/dist/lib/sandbox/control/protocol.js +55 -4
- package/dist/lib/sandbox/control/server.js +518 -127
- package/dist/lib/sandbox/control/state.js +64 -0
- package/dist/lib/sandbox/control/task-workflow.js +74 -0
- package/dist/lib/sandbox/control/workflow-executor.js +89 -0
- package/dist/lib/sandbox/index.js +1 -2
- package/dist/lib/sandbox/recovery.js +28 -4
- package/dist/lib/sandbox/removal.js +822 -0
- package/dist/lib/sandbox/task-cleanup.js +217 -0
- package/dist/lib/sandbox/workspace-identity.js +17 -1
- package/dist/lib/sandbox/workspace-view.js +13 -14
- package/dist/lib/task/activity-intent.js +2 -1
- package/dist/lib/task/activity-log.js +30 -24
- package/dist/lib/task/artifact-command.js +79 -0
- package/dist/lib/task/artifact-lifecycle.js +30 -28
- package/dist/lib/task/artifact-name.js +36 -0
- package/dist/lib/task/artifact-operations.js +29 -289
- package/dist/lib/task/artifact-receipts.js +3 -15
- package/dist/lib/task/artifact-recovery.js +430 -0
- package/dist/lib/task/artifact-repair-intent.js +134 -29
- package/dist/lib/task/artifact-schema.js +6 -14
- package/dist/lib/task/capabilities.js +12 -19
- package/dist/lib/task/codex-orchestration.js +71 -25
- package/dist/lib/task/commit-identity.js +28 -0
- package/dist/lib/task/commit-operation.js +33 -20
- package/dist/lib/task/control-authority.js +403 -6
- package/dist/lib/task/control-recovery.js +140 -0
- package/dist/lib/task/create-service.js +1 -8
- package/dist/lib/task/create.js +62 -9
- package/dist/lib/task/decision-details.js +2 -46
- package/dist/lib/task/delegation-receipts.js +64 -3
- package/dist/lib/task/events.js +275 -22
- package/dist/lib/task/finalization-state.js +9 -0
- package/dist/lib/task/human-override.js +8 -14
- package/dist/lib/task/implementation-inputs.js +3 -3
- package/dist/lib/task/intermediate-cleanup.js +441 -0
- package/dist/lib/task/invalidation.js +18 -65
- package/dist/lib/task/ledger-intents.js +7 -22
- package/dist/lib/task/ledger.js +1 -3
- package/dist/lib/task/lifecycle-recovery.js +549 -0
- package/dist/lib/task/lifecycle.js +31 -4
- package/dist/lib/task/local-artifact-finalization.js +197 -197
- package/dist/lib/task/manual-validation-completion.js +26 -0
- package/dist/lib/task/manual-validation-evidence.js +130 -0
- package/dist/lib/task/manual-validation-receipt.js +105 -0
- package/dist/lib/task/manual-validation-shared.js +40 -0
- package/dist/lib/task/manual-validation-transaction.js +243 -0
- package/dist/lib/task/markdown.js +47 -0
- package/dist/lib/task/orchestration.js +66 -19
- package/dist/lib/task/pr-delivery-fact.js +12 -56
- package/dist/lib/task/qualification-audit.js +20 -34
- package/dist/lib/task/recovery-warning.js +19 -0
- package/dist/lib/task/review-artifacts.js +2 -18
- package/dist/lib/task/review-command.js +26 -0
- package/dist/lib/task/review-finalization.js +175 -216
- package/dist/lib/task/review-fingerprint.js +2 -2
- package/dist/lib/task/sections.js +34 -56
- package/dist/lib/task/short-id.js +15 -7
- package/dist/lib/task/task-execution-lock.js +1 -1
- package/dist/lib/task/verification-engine.js +119 -337
- package/dist/lib/task/verification.js +1 -1
- package/dist/lib/task/workflow-command.js +16 -0
- package/dist/lib/task/workflow-warning-intents.js +0 -16
- package/dist/lib/task/workflow-warnings.js +28 -2
- package/dist/lib/update.js +2 -0
- package/dist/lib/version.js +1 -11
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
- package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +10 -4
- package/lib/agent-clients/adapters/codex-lifecycle/store.ts +55 -3
- package/lib/fs/durable-write.ts +30 -0
- package/lib/fs/file-lock.ts +113 -0
- package/lib/host-control/audit.ts +22 -0
- package/lib/host-control/client.ts +172 -0
- package/lib/host-control/command.ts +60 -0
- package/lib/host-control/path.ts +167 -0
- package/lib/host-control/secure-fs.ts +135 -0
- package/lib/host-control/server.ts +180 -0
- package/lib/host-control/service.ts +133 -0
- package/lib/init.ts +15 -2
- package/lib/internal/cli-route-inventory.ts +4 -2
- package/lib/internal/codex-lifecycle.ts +6 -6
- package/lib/internal/demo-promotion.ts +354 -0
- package/lib/internal/demo-transcript.ts +419 -0
- package/lib/internal/host-control.ts +28 -0
- package/lib/internal/manual-validation.ts +315 -0
- package/lib/internal/platform-pr.ts +15 -4
- package/lib/internal/release-workflow.ts +74 -82
- package/lib/internal/sandbox-control.ts +162 -1
- package/lib/internal/task-artifact.ts +14 -217
- package/lib/internal/task-create.ts +5 -5
- package/lib/internal/task-event.ts +20 -11
- package/lib/internal/task-lifecycle.ts +4 -3
- package/lib/internal/task-operation-registry.ts +111 -4
- package/lib/internal/task-review.ts +9 -54
- package/lib/internal/task-validate.ts +26 -10
- package/lib/owned-path.ts +26 -0
- package/lib/platform/check-status.ts +9 -0
- package/lib/platform/comment-safety.ts +5 -0
- package/lib/platform/completion-backfill.ts +1 -1
- package/lib/platform/github-data.ts +322 -0
- package/lib/platform/github-provider.ts +15 -20
- package/lib/platform/issue-comments.ts +21 -14
- package/lib/platform/issues.ts +5 -246
- package/lib/platform/pr-change-report.ts +7 -5
- package/lib/platform/pr-checks.ts +13 -77
- package/lib/platform/pr-summary.ts +123 -35
- package/lib/platform/pull-requests.ts +6 -173
- package/lib/platform/snapshots.ts +53 -0
- package/lib/platform/task-identities.ts +3 -14
- package/lib/platform/verification-sync.ts +150 -156
- package/lib/pr-review/evidence-grading.ts +4 -9
- package/lib/release/workflow.ts +3 -3
- package/lib/sandbox/commands/create.ts +7 -6
- package/lib/sandbox/commands/rm.ts +21 -1895
- package/lib/sandbox/control/audit.ts +253 -0
- package/lib/sandbox/control/client.ts +109 -66
- package/lib/sandbox/control/executor.ts +134 -74
- package/lib/sandbox/control/finalization-response.ts +29 -0
- package/lib/sandbox/control/identity-sentinel.ts +137 -0
- package/lib/sandbox/control/lifecycle.ts +45 -3
- package/lib/sandbox/control/native-file-lock.ts +6 -107
- package/lib/sandbox/control/protocol.ts +80 -6
- package/lib/sandbox/control/server.ts +567 -132
- package/lib/sandbox/control/state.ts +86 -0
- package/lib/sandbox/control/task-workflow.ts +95 -0
- package/lib/sandbox/control/workflow-executor.ts +92 -0
- package/lib/sandbox/index.ts +1 -2
- package/lib/sandbox/recovery.ts +28 -5
- package/lib/sandbox/removal.ts +1142 -0
- package/lib/sandbox/task-cleanup.ts +209 -0
- package/lib/sandbox/workspace-identity.ts +19 -3
- package/lib/sandbox/workspace-view.ts +17 -15
- package/lib/task/activity-intent.ts +2 -2
- package/lib/task/activity-log.ts +27 -19
- package/lib/task/artifact-command.ts +85 -0
- package/lib/task/artifact-lifecycle.ts +31 -26
- package/lib/task/artifact-name.ts +55 -0
- package/lib/task/artifact-operations.ts +34 -310
- package/lib/task/artifact-receipts.ts +3 -14
- package/lib/task/artifact-recovery.ts +519 -0
- package/lib/task/artifact-repair-intent.ts +162 -33
- package/lib/task/artifact-schema.ts +5 -34
- package/lib/task/capabilities.ts +13 -22
- package/lib/task/codex-orchestration.ts +85 -24
- package/lib/task/commit-identity.ts +31 -0
- package/lib/task/commit-operation.ts +37 -20
- package/lib/task/control-authority.ts +540 -10
- package/lib/task/control-recovery.ts +186 -0
- package/lib/task/create-service.ts +1 -10
- package/lib/task/create.ts +63 -8
- package/lib/task/decision-details.ts +3 -71
- package/lib/task/delegation-receipts.ts +73 -2
- package/lib/task/events.ts +309 -24
- package/lib/task/finalization-state.ts +11 -0
- package/lib/task/human-override.ts +8 -16
- package/lib/task/implementation-inputs.ts +3 -3
- package/lib/task/intermediate-cleanup.ts +493 -0
- package/lib/task/invalidation.ts +18 -62
- package/lib/task/ledger-intents.ts +7 -24
- package/lib/task/ledger.ts +1 -3
- package/lib/task/lifecycle-recovery.ts +691 -0
- package/lib/task/lifecycle.ts +30 -5
- package/lib/task/local-artifact-finalization.ts +244 -234
- package/lib/task/manual-validation-completion.ts +40 -0
- package/lib/task/manual-validation-evidence.ts +209 -0
- package/lib/task/manual-validation-receipt.ts +156 -0
- package/lib/task/manual-validation-shared.ts +50 -0
- package/lib/task/manual-validation-transaction.ts +304 -0
- package/lib/task/markdown.ts +70 -0
- package/lib/task/orchestration.ts +84 -19
- package/lib/task/pr-delivery-fact.ts +15 -62
- package/lib/task/qualification-audit.ts +22 -33
- package/lib/task/recovery-warning.ts +21 -0
- package/lib/task/review-artifacts.ts +1 -20
- package/lib/task/review-command.ts +24 -0
- package/lib/task/review-finalization.ts +183 -292
- package/lib/task/review-fingerprint.ts +2 -2
- package/lib/task/sections.ts +33 -54
- package/lib/task/short-id.ts +27 -5
- package/lib/task/task-execution-lock.ts +1 -1
- package/lib/task/verification-engine.ts +113 -383
- package/lib/task/verification-types.ts +15 -0
- package/lib/task/verification.ts +1 -1
- package/lib/task/workflow-command.ts +17 -0
- package/lib/task/workflow-warning-intents.ts +0 -13
- package/lib/task/workflow-warnings.ts +21 -2
- package/lib/update.ts +6 -0
- package/lib/version.ts +1 -15
- package/package.json +6 -6
- package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
- package/templates/.agents/rules/create-issue.en.md +1 -1
- package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
- package/templates/.agents/rules/issue-sync.en.md +4 -2
- package/templates/.agents/rules/issue-sync.zh-CN.md +4 -3
- package/templates/.agents/rules/local-artifact-repair.en.md +46 -39
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +43 -36
- package/templates/.agents/rules/testing-discipline.en.md +2 -0
- package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
- package/templates/.agents/scripts/package.json +3 -0
- package/templates/.agents/skills/analyze-task/SKILL.en.md +6 -6
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +6 -6
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -1
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/block-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/block-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/block-task/config/verify.json +1 -1
- package/templates/.agents/skills/cancel-task/SKILL.en.md +3 -3
- package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/cancel-task/config/verify.json +1 -1
- package/templates/.agents/skills/code-task/SKILL.en.md +7 -7
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +7 -7
- package/templates/.agents/skills/code-task/config/verify.en.json +1 -1
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +1 -1
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +1 -1
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +33 -21
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +33 -21
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
- package/templates/.agents/skills/complete-task/SKILL.en.md +3 -3
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/complete-task/config/verify.en.json +2 -2
- package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +2 -2
- package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +1 -1
- package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +1 -1
- package/templates/.agents/skills/create-pr/SKILL.en.md +2 -2
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/create-pr/config/verify.json +1 -1
- package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +2 -2
- package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +2 -2
- package/templates/.agents/skills/create-task/SKILL.en.md +5 -5
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +5 -5
- package/templates/.agents/skills/create-task/config/verify.json +1 -1
- package/templates/.agents/skills/import-issue/SKILL.en.md +8 -8
- package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +8 -8
- package/templates/.agents/skills/import-issue/config/verify.json +2 -2
- package/templates/.agents/skills/plan-task/SKILL.en.md +4 -4
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +4 -4
- package/templates/.agents/skills/plan-task/config/verify.en.json +1 -1
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/release/SKILL.en.md +7 -3
- package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
- package/templates/.agents/skills/restore-task/SKILL.en.md +2 -2
- package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/restore-task/config/verify.json +1 -1
- package/templates/.agents/skills/review-analysis/SKILL.en.md +2 -2
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +7 -7
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +6 -6
- package/templates/.agents/skills/review-code/SKILL.en.md +2 -2
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-code/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-code/reference/report-template.en.md +12 -12
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +12 -12
- package/templates/.agents/skills/review-plan/SKILL.en.md +2 -2
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/review-plan/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +7 -7
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +7 -7
- package/templates/.agents/skills/review-pr/config/verify.en.json +1 -1
- package/templates/.agents/skills/review-pr/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +3 -3
- package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +3 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +20 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +20 -3
- package/templates/.agents/skills/run-manual-validation/config/verify.en.json +1 -1
- package/templates/.agents/skills/run-manual-validation/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +2 -0
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +2 -0
- package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
- package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/test/SKILL.en.md +17 -6
- package/templates/.agents/skills/test/SKILL.zh-CN.md +17 -6
- package/templates/.agents/templates/task.en.md +1 -1
- package/templates/.agents/templates/task.zh-CN.md +1 -1
- package/templates/.claude/commands/import-issue.en.md +1 -1
- package/templates/.claude/commands/import-issue.zh-CN.md +1 -1
- package/templates/.claude/commands/restore-task.en.md +1 -1
- package/templates/.claude/commands/restore-task.zh-CN.md +1 -1
- package/templates/.claude/commands/run-manual-validation.en.md +1 -1
- package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
- package/dist/lib/platform/adapters.js +0 -56
- package/lib/platform/adapters.ts +0 -197
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isLegacyCompatibilityEnabled, legacyCompatibilityError, VERSION } from '../version.js';
|
|
2
1
|
import { isResourceIdentity, parseResourceIdentity, resourceIdentityNumber, serializeResourceIdentity } from '../platform/resource-identity.js';
|
|
3
2
|
const PR_DELIVERY_FACT_KEY = 'pr_delivery_fact';
|
|
4
3
|
function factError(message) {
|
|
@@ -28,11 +27,6 @@ function timestamp(value, label) {
|
|
|
28
27
|
throw factError(`${label} must be a valid timestamp`);
|
|
29
28
|
return new Date(result).toISOString();
|
|
30
29
|
}
|
|
31
|
-
function positiveNumber(value, label) {
|
|
32
|
-
if (!Number.isSafeInteger(value) || value <= 0)
|
|
33
|
-
throw factError(`${label} must be a positive integer`);
|
|
34
|
-
return value;
|
|
35
|
-
}
|
|
36
30
|
function parseRef(value, label) {
|
|
37
31
|
if (!isRecord(value))
|
|
38
32
|
throw factError(`${label} must be an object`);
|
|
@@ -51,36 +45,17 @@ function canonicalIdentity(value) {
|
|
|
51
45
|
base: parseRef(value.base, 'identity.base')
|
|
52
46
|
};
|
|
53
47
|
}
|
|
54
|
-
function decodeLegacyIdentity(value) {
|
|
55
|
-
if (!isRecord(value))
|
|
56
|
-
throw factError('legacy identity must be an object');
|
|
57
|
-
// TODO(compat): Remove the v1 identity decoder before the first stable v1.0.0 release.
|
|
58
|
-
exactKeys(value, ['repository', 'number', 'nodeId', 'url', 'head', 'base'], 'legacy identity');
|
|
59
|
-
const legacy = {
|
|
60
|
-
number: positiveNumber(value.number, 'legacy identity.number'),
|
|
61
|
-
repository: text(value.repository, 'identity.repository'),
|
|
62
|
-
nodeId: text(value.nodeId, 'legacy identity.nodeId'),
|
|
63
|
-
url: text(value.url, 'identity.url'),
|
|
64
|
-
head: parseRef(value.head, 'identity.head'),
|
|
65
|
-
base: parseRef(value.base, 'identity.base')
|
|
66
|
-
};
|
|
67
|
-
return {
|
|
68
|
-
resource: { kind: 'number', value: legacy.number },
|
|
69
|
-
repository: legacy.repository,
|
|
70
|
-
url: legacy.url,
|
|
71
|
-
head: legacy.head,
|
|
72
|
-
base: legacy.base
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
48
|
function provenanceForSource(source) { return source === 'created' ? 'create-post' : source === 'reused' ? 'reuse' : source; }
|
|
76
|
-
function
|
|
49
|
+
function legacyFactError() {
|
|
50
|
+
return Object.assign(new Error('PLATFORM_IDENTITY_LEGACY_UNSUPPORTED: v1 PR delivery fact is unsupported; use the previous tool version to view this task or migrate its fact to version 2 before using this version'), { code: 'PLATFORM_IDENTITY_LEGACY_UNSUPPORTED' });
|
|
51
|
+
}
|
|
52
|
+
function parseFact(value) {
|
|
77
53
|
if (!isRecord(value))
|
|
78
54
|
throw factError('fact must be an object');
|
|
79
|
-
if (
|
|
55
|
+
if (value.version === 1)
|
|
56
|
+
throw legacyFactError();
|
|
57
|
+
if (value.version !== 2 || typeof value.state !== 'string')
|
|
80
58
|
throw factError('version or state is invalid');
|
|
81
|
-
if (value.version === 1 && !isLegacyCompatibilityEnabled(runtimeVersion)) {
|
|
82
|
-
throw legacyCompatibilityError('v1 PR delivery fact', runtimeVersion);
|
|
83
|
-
}
|
|
84
59
|
if (value.state === 'unbound') {
|
|
85
60
|
exactKeys(value, ['version', 'state', 'reason'], 'unbound fact');
|
|
86
61
|
if (value.reason !== 'initial')
|
|
@@ -95,25 +70,6 @@ function parseFact(value, runtimeVersion = VERSION) {
|
|
|
95
70
|
}
|
|
96
71
|
if (value.state !== 'bound')
|
|
97
72
|
throw factError('state is invalid');
|
|
98
|
-
if (value.version === 1) {
|
|
99
|
-
// TODO(compat): Remove this v1-to-v2 shape conversion before the first stable v1.0.0 release.
|
|
100
|
-
exactKeys(value, ['version', 'state', 'identity', 'binding', 'provenance'], 'legacy bound fact');
|
|
101
|
-
if (!isRecord(value.binding) || !isRecord(value.provenance))
|
|
102
|
-
throw factError('legacy binding or provenance is invalid');
|
|
103
|
-
exactKeys(value.binding, ['status', 'source', 'verifiedAt', 'issueNumber', 'remoteState', 'mergedAt', 'mergeCommitSha'], 'legacy binding');
|
|
104
|
-
const issueNumber = value.binding.issueNumber === null ? null : positiveNumber(value.binding.issueNumber, 'legacy binding.issueNumber');
|
|
105
|
-
return parseFact({
|
|
106
|
-
version: 2,
|
|
107
|
-
state: 'bound',
|
|
108
|
-
identity: decodeLegacyIdentity(value.identity),
|
|
109
|
-
binding: {
|
|
110
|
-
status: 'verified', source: value.binding.source, verifiedAt: timestamp(value.binding.verifiedAt, 'binding.verifiedAt'),
|
|
111
|
-
issueIdentity: issueNumber === null ? null : { kind: 'number', value: issueNumber }, remoteState: value.binding.remoteState,
|
|
112
|
-
mergedAt: value.binding.mergedAt === null ? null : timestamp(value.binding.mergedAt, 'binding.mergedAt'), mergeCommitSha: nullableText(value.binding.mergeCommitSha, 'binding.mergeCommitSha')
|
|
113
|
-
},
|
|
114
|
-
provenance: value.provenance
|
|
115
|
-
}, runtimeVersion);
|
|
116
|
-
}
|
|
117
73
|
exactKeys(value, ['version', 'state', 'identity', 'binding', 'provenance'], 'bound fact');
|
|
118
74
|
if (!isRecord(value.binding) || !isRecord(value.provenance))
|
|
119
75
|
throw factError('binding or provenance is invalid');
|
|
@@ -142,7 +98,7 @@ function parseFact(value, runtimeVersion = VERSION) {
|
|
|
142
98
|
provenance: { establishedBy: value.provenance.establishedBy }
|
|
143
99
|
};
|
|
144
100
|
}
|
|
145
|
-
function decodePrDeliveryFact(value,
|
|
101
|
+
function decodePrDeliveryFact(value, _runtimeVersion) {
|
|
146
102
|
if (typeof value === 'string') {
|
|
147
103
|
let decoded;
|
|
148
104
|
try {
|
|
@@ -151,16 +107,16 @@ function decodePrDeliveryFact(value, runtimeVersion = VERSION) {
|
|
|
151
107
|
catch {
|
|
152
108
|
throw factError('value is not valid JSON');
|
|
153
109
|
}
|
|
154
|
-
return parseFact(decoded
|
|
110
|
+
return parseFact(decoded);
|
|
155
111
|
}
|
|
156
|
-
return parseFact(value
|
|
112
|
+
return parseFact(value);
|
|
157
113
|
}
|
|
158
114
|
function encodePrDeliveryFact(fact) { return JSON.stringify(parseFact(fact)); }
|
|
159
|
-
function readPrDeliveryFact(metadata,
|
|
115
|
+
function readPrDeliveryFact(metadata, _runtimeVersion) {
|
|
160
116
|
if (!Object.hasOwn(metadata, PR_DELIVERY_FACT_KEY) || metadata[PR_DELIVERY_FACT_KEY] === '')
|
|
161
117
|
return { status: 'missing', fact: null };
|
|
162
118
|
try {
|
|
163
|
-
return { status: 'valid', fact: decodePrDeliveryFact(metadata[PR_DELIVERY_FACT_KEY]
|
|
119
|
+
return { status: 'valid', fact: decodePrDeliveryFact(metadata[PR_DELIVERY_FACT_KEY]) };
|
|
164
120
|
}
|
|
165
121
|
catch (error) {
|
|
166
122
|
return { status: 'invalid', fact: null, error: asFactError(error) };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
+
import { parseArtifactName } from './artifact-name.js';
|
|
2
3
|
import { parseTypedTaskFrontmatter } from './frontmatter.js';
|
|
3
|
-
import { parseTable } from './sections.js';
|
|
4
|
+
import { findSectionRange, parseTable } from './sections.js';
|
|
5
|
+
import { scanVisibleMarkdown } from './markdown.js';
|
|
4
6
|
const TASK_CONSTRAINT_HEADINGS = ['约束', 'Constraints'];
|
|
5
7
|
const TASK_CANDIDATE_HEADINGS = ['候选与否决方案', 'Candidate and Rejected Options', 'Candidates and Rejected Options', 'Candidates and Rejected Alternatives'];
|
|
6
8
|
const AUDIT_HEADINGS = ['资格审计', '资格审计复核', 'Qualification Audit', 'Qualification Audit Review'];
|
|
@@ -72,21 +74,8 @@ function taskInputDigest(qualification) {
|
|
|
72
74
|
return digest(canonicalTaskInput(qualification));
|
|
73
75
|
}
|
|
74
76
|
function sectionBody(content, aliases, level = 2) {
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
const match = new RegExp(`^${marker}\\s+(${heading})\\s*$`, 'm').exec(content);
|
|
78
|
-
if (!match)
|
|
79
|
-
return null;
|
|
80
|
-
const rest = content.slice((match.index ?? 0) + match[0].length);
|
|
81
|
-
const end = rest.search(new RegExp(`^#{2,${level}}\\s+`, 'm'));
|
|
82
|
-
return rest.slice(0, end < 0 ? rest.length : end);
|
|
83
|
-
}
|
|
84
|
-
function stripSection(content, aliases) {
|
|
85
|
-
const body = sectionBody(content, aliases);
|
|
86
|
-
if (body === null)
|
|
87
|
-
return normalizeText(content);
|
|
88
|
-
const heading = aliases.map((value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
|
|
89
|
-
return normalizeText(content.replace(new RegExp(`^##\\s+(?:${heading})\\s*$[\\s\\S]*?(?=^##\\s+|(?![\\s\\S]))`, 'm'), ''));
|
|
77
|
+
const section = findSectionRange(content, aliases, level);
|
|
78
|
+
return section ? content.slice(section.bodyStart, section.end) : null;
|
|
90
79
|
}
|
|
91
80
|
function stripFrontmatter(content) {
|
|
92
81
|
const opening = /^---(?:\r?\n)/.exec(content);
|
|
@@ -119,7 +108,7 @@ function nonConstraintInputDigest(content) {
|
|
|
119
108
|
['返工意图', 'Rework Intents'],
|
|
120
109
|
CONFIRMATION_HEADINGS,
|
|
121
110
|
['完成检查清单', 'Completion Checklist']
|
|
122
|
-
].reduce((value, aliases) =>
|
|
111
|
+
].reduce((value, aliases) => stripSectionAtLevel(value, aliases, 2), projection);
|
|
123
112
|
return digest(projection);
|
|
124
113
|
}
|
|
125
114
|
function taskInputSection(content, aliases) {
|
|
@@ -130,12 +119,8 @@ function stripTaskInputSection(content, aliases) {
|
|
|
130
119
|
return stripSectionAtLevel(result, aliases, 2);
|
|
131
120
|
}
|
|
132
121
|
function stripSectionAtLevel(content, aliases, level) {
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
return normalizeText(content);
|
|
136
|
-
const heading = aliases.map((value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
|
|
137
|
-
const marker = '#'.repeat(level);
|
|
138
|
-
return normalizeText(content.replace(new RegExp(`^${marker}\\s+(?:${heading})\\s*$[\\s\\S]*?(?=^#{2,${level}}\\s+|(?![\\s\\S]))`, 'm'), ''));
|
|
122
|
+
const section = findSectionRange(content, aliases, level);
|
|
123
|
+
return normalizeText(section ? content.slice(0, section.start) + content.slice(section.end) : content);
|
|
139
124
|
}
|
|
140
125
|
function parseTaskQualification(content) {
|
|
141
126
|
const constraintBody = taskInputSection(content, TASK_CONSTRAINT_HEADINGS);
|
|
@@ -144,12 +129,14 @@ function parseTaskQualification(content) {
|
|
|
144
129
|
const hasCandidateHeading = candidateBody !== null;
|
|
145
130
|
if ((!hasConstraintHeading && !hasCandidateHeading)
|
|
146
131
|
|| (hasConstraintHeading && hasCandidateHeading
|
|
147
|
-
&&
|
|
132
|
+
&& !scanVisibleMarkdown(constraintBody).lines.some((line) => line.text.trim().startsWith('|'))
|
|
133
|
+
&& !scanVisibleMarkdown(candidateBody).lines.some((line) => line.text.trim().startsWith('|')))) {
|
|
148
134
|
return { ok: true, qualification: { present: false, constraints: [], candidates: [], constraintDigest: digest([]), taskInputDigest: digest({ constraints: [], candidates: [] }), nonConstraintInputDigest: nonConstraintInputDigest(content) } };
|
|
149
135
|
}
|
|
150
136
|
if (!hasConstraintHeading || !hasCandidateHeading) {
|
|
151
|
-
const
|
|
152
|
-
|
|
137
|
+
const visible = scanVisibleMarkdown(content).lines.map((line) => line.text).join('\n');
|
|
138
|
+
const hasCanonicalTable = new RegExp(`\\|\\s*${CONSTRAINT_COLUMNS.join('\\s*\\|\\s*')}\\s*\\|`).test(visible)
|
|
139
|
+
|| new RegExp(`\\|\\s*${CANDIDATE_COLUMNS.join('\\s*\\|\\s*')}\\s*\\|`).test(visible);
|
|
153
140
|
if (hasCanonicalTable)
|
|
154
141
|
return { ok: false, code: 'QUALIFICATION_TASK_CONTRACT_INVALID', message: 'task qualification requires both constraints and candidates sections' };
|
|
155
142
|
return { ok: true, qualification: { present: false, constraints: [], candidates: [], constraintDigest: digest([]), taskInputDigest: digest({ constraints: [], candidates: [] }), nonConstraintInputDigest: nonConstraintInputDigest(content) } };
|
|
@@ -228,17 +215,16 @@ function parseAuditTable(content, heading, columns) {
|
|
|
228
215
|
const table = parseTable(`## Qualification Audit Body\n${subsection}`, { sectionAliases: ['Qualification Audit Body'], columns });
|
|
229
216
|
return table?.rows.map((row) => ({ ...row.values })) ?? null;
|
|
230
217
|
}
|
|
231
|
-
function
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
return { family: match[1], round: match[2] ? Number(match[2]) : 1 };
|
|
218
|
+
function parseAuditArtifactName(value) {
|
|
219
|
+
const identity = parseArtifactName(value);
|
|
220
|
+
return identity && ARTIFACT_FAMILIES.includes(identity.family)
|
|
221
|
+
? { family: identity.family, round: identity.round } : null;
|
|
236
222
|
}
|
|
237
223
|
function upstreamArtifactDigest(rows) {
|
|
238
224
|
return digest([...rows].map((row) => ({ ...row })).sort((a, b) => `${a.upstreamFamily}/${a.upstreamArtifact}/${a.relation}`.localeCompare(`${b.upstreamFamily}/${b.upstreamArtifact}/${b.relation}`)));
|
|
239
225
|
}
|
|
240
226
|
function validateUpstreamRelation(row) {
|
|
241
|
-
const identity =
|
|
227
|
+
const identity = parseAuditArtifactName(row.upstreamArtifact);
|
|
242
228
|
if (!ARTIFACT_FAMILIES.includes(row.upstreamFamily) || !identity || identity.family !== row.upstreamFamily
|
|
243
229
|
|| identity.round !== row.upstreamRound || !Number.isSafeInteger(row.upstreamRound)
|
|
244
230
|
|| !/^[a-f0-9]{64}$/i.test(row.upstreamSha256) || !RELATIONS.includes(row.relation)) {
|
|
@@ -283,7 +269,7 @@ function expectedQualificationRelations(taskContent, family) {
|
|
|
283
269
|
const inputSha256 = family === 'code' ? frontmatter.code_input_sha256 : family.startsWith('review-') ? frontmatter.review_input_sha256 : '';
|
|
284
270
|
if (typeof inputName !== 'string' || !inputName || typeof inputSha256 !== 'string' || !inputSha256)
|
|
285
271
|
return { ok: true, relations: undefined };
|
|
286
|
-
const identity =
|
|
272
|
+
const identity = parseAuditArtifactName(inputName);
|
|
287
273
|
if (!identity)
|
|
288
274
|
return { ok: false, code: 'QUALIFICATION_STARTED_INPUT_INVALID', message: `started input '${inputName}' is not canonical` };
|
|
289
275
|
const relation = {
|
|
@@ -444,7 +430,7 @@ function validateQualificationAudit(taskContent, artifactContent, options = {})
|
|
|
444
430
|
|| upstreamArtifactDigest(options.expectedUpstreamRelations) !== upstreamArtifactDigest(audit.audit.upstreamRelations)))
|
|
445
431
|
return { ok: false, code: 'QUALIFICATION_UPSTREAM_RELATION_MISMATCH', message: 'qualification audit upstream relations do not match the started artifact inputs' };
|
|
446
432
|
if (options.family && options.artifact) {
|
|
447
|
-
const identity =
|
|
433
|
+
const identity = parseAuditArtifactName(options.artifact);
|
|
448
434
|
if (!identity || identity.family !== options.family)
|
|
449
435
|
return { ok: false, code: 'QUALIFICATION_ARTIFACT_IDENTITY_INVALID', message: `artifact '${options.artifact}' is not canonical for '${options.family}'` };
|
|
450
436
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
function warningText(value) {
|
|
2
|
+
return typeof value === 'string' && value.length > 0 && value.trim() === value && !/[\r\n]/u.test(value);
|
|
3
|
+
}
|
|
4
|
+
export function isRecoveryWarning(value) {
|
|
5
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
6
|
+
return false;
|
|
7
|
+
const warning = value;
|
|
8
|
+
return Object.keys(warning).sort().join(',') === 'action,code,message'
|
|
9
|
+
&& warningText(warning.code)
|
|
10
|
+
&& warningText(warning.message)
|
|
11
|
+
&& warningText(warning.action);
|
|
12
|
+
}
|
|
13
|
+
export function sameRecoveryWarning(left, right) {
|
|
14
|
+
return isRecoveryWarning(left) && isRecoveryWarning(right)
|
|
15
|
+
&& left.code === right.code
|
|
16
|
+
&& left.message === right.message
|
|
17
|
+
&& left.action === right.action;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=recovery-warning.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { scanVisibleMarkdown } from './
|
|
3
|
+
import { scanVisibleMarkdown } from './markdown.js';
|
|
4
4
|
const SUMMARY_HEADINGS = new Set(['审查摘要', 'Review Summary']);
|
|
5
5
|
const PLACEHOLDERS = [
|
|
6
6
|
'{unresolved-blockers}',
|
|
@@ -10,22 +10,6 @@ const PLACEHOLDERS = [
|
|
|
10
10
|
function escapeRegExp(value) {
|
|
11
11
|
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
12
12
|
}
|
|
13
|
-
function maxRound(entries, stem) {
|
|
14
|
-
let max = 0;
|
|
15
|
-
for (const entry of entries) {
|
|
16
|
-
if (entry === `${stem}.md`) {
|
|
17
|
-
max = Math.max(max, 1);
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
const match = entry.match(new RegExp(`^${escapeRegExp(stem)}-r(\\d+)\\.md$`));
|
|
21
|
-
if (match)
|
|
22
|
-
max = Math.max(max, Number(match[1]));
|
|
23
|
-
}
|
|
24
|
-
return max;
|
|
25
|
-
}
|
|
26
|
-
function artifactName(stem, round) {
|
|
27
|
-
return round === 1 ? `${stem}.md` : `${stem}-r${round}.md`;
|
|
28
|
-
}
|
|
29
13
|
function normalizeVerdict(raw) {
|
|
30
14
|
const value = String(raw).trim().toLowerCase();
|
|
31
15
|
if (value === '通过' || value === 'approved')
|
|
@@ -199,5 +183,5 @@ function parseVerdict(reviewPath) {
|
|
|
199
183
|
}
|
|
200
184
|
return resolveCanonicalVerdict(parsed.summary);
|
|
201
185
|
}
|
|
202
|
-
export {
|
|
186
|
+
export { equalCounts, escapeRegExp, extractSection, finalizeReviewSummaryContent, normalizeVerdict, parseReviewSummary, parseVerdict, resolveCanonicalVerdict };
|
|
203
187
|
//# sourceMappingURL=review-artifacts.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function parseReviewCommand(args) {
|
|
2
|
+
if (!args[0] || args[1] !== 'finalize-summary')
|
|
3
|
+
throw new Error('task ref and finalize-summary are required');
|
|
4
|
+
const values = {};
|
|
5
|
+
const flags = {
|
|
6
|
+
'--stage': 'stage', '--artifact': 'artifact', '--orchestrated': 'orchestrated', '--dry-run': 'dryRun',
|
|
7
|
+
'--recovery-id': 'recoveryId',
|
|
8
|
+
'--override-ticket': 'overrideTicket', '--override-target': 'overrideTarget', '--override-scope': 'overrideScope'
|
|
9
|
+
};
|
|
10
|
+
for (let index = 2; index < args.length; index += 1) {
|
|
11
|
+
const flag = args[index];
|
|
12
|
+
if (!Object.hasOwn(flags, flag))
|
|
13
|
+
throw new Error(`unknown option '${flag}'`);
|
|
14
|
+
const key = flags[flag];
|
|
15
|
+
if (Object.hasOwn(values, key))
|
|
16
|
+
throw new Error(`duplicate option '${flag}'`);
|
|
17
|
+
const value = flag === '--orchestrated' || flag === '--dry-run' ? true : args[++index];
|
|
18
|
+
if (!value || typeof value === 'string' && value.startsWith('--'))
|
|
19
|
+
throw new Error(`option '${flag}' requires a value`);
|
|
20
|
+
values[key] = value;
|
|
21
|
+
}
|
|
22
|
+
if (!values.stage || !values.artifact)
|
|
23
|
+
throw new Error("options '--stage' and '--artifact' are required");
|
|
24
|
+
return { taskRef: args[0], ...values };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=review-command.js.map
|