@fitlab-ai/agent-infra 0.9.13 → 0.9.15
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/cli.ts +26 -9
- package/bin/internal-cli.sh +45 -0
- package/dist/bin/cli.js +173 -157
- package/dist/bin/internal-cli.js +126 -42
- package/dist/lib/agent-client.js +5 -0
- package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
- package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
- package/dist/lib/defaults.json +103 -103
- package/dist/lib/fs/durable-write.js +37 -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/agent-client.js +5 -2
- package/dist/lib/internal/cli-route-inventory.js +154 -0
- package/dist/lib/internal/codex-lifecycle.js +15 -12
- package/dist/lib/internal/codex-sandbox-controller.js +8 -2
- package/dist/lib/internal/demo-promotion.js +322 -0
- package/dist/lib/internal/demo-transcript.js +454 -0
- package/dist/lib/internal/git-workflow.js +10 -6
- package/dist/lib/internal/host-control.js +28 -0
- package/dist/lib/internal/manual-validation.js +322 -0
- package/dist/lib/internal/platform-checks.js +16 -4
- package/dist/lib/internal/platform-comment.js +16 -4
- package/dist/lib/internal/platform-context.js +4 -1
- package/dist/lib/internal/platform-issue.js +12 -4
- package/dist/lib/internal/platform-metadata.js +88 -0
- package/dist/lib/internal/platform-pr-review.js +16 -3
- package/dist/lib/internal/platform-pr.js +42 -14
- package/dist/lib/internal/platform-release-notes.js +6 -3
- package/dist/lib/internal/platform-security.js +93 -0
- package/dist/lib/internal/pr-review-grade.js +14 -3
- package/dist/lib/internal/release-workflow.js +82 -89
- package/dist/lib/internal/sandbox-control.js +171 -7
- package/dist/lib/internal/task-activity.js +13 -4
- package/dist/lib/internal/task-artifact.js +19 -107
- package/dist/lib/internal/task-context.js +4 -1
- package/dist/lib/internal/task-create.js +48 -14
- package/dist/lib/internal/task-delivery.js +4 -1
- package/dist/lib/internal/task-event.js +38 -35
- package/dist/lib/internal/task-finalization.js +4 -1
- package/dist/lib/internal/task-invalidation.js +4 -1
- package/dist/lib/internal/task-ledger.js +12 -1
- package/dist/lib/internal/task-lifecycle.js +4 -1
- package/dist/lib/internal/task-operation-registry.js +519 -0
- package/dist/lib/internal/task-orchestration.js +12 -0
- package/dist/lib/internal/task-override.js +10 -3
- package/dist/lib/internal/task-qualification.js +90 -0
- package/dist/lib/internal/task-review.js +10 -52
- package/dist/lib/internal/task-short-id.js +11 -1
- package/dist/lib/internal/task-snapshot.js +4 -1
- package/dist/lib/internal/task-validate.js +37 -12
- package/dist/lib/internal/task-verify.js +5 -1
- package/dist/lib/internal/task-warning.js +8 -1
- package/dist/lib/owned-path.js +33 -0
- package/dist/lib/platform/check-status.js +11 -0
- package/dist/lib/platform/comment-safety.js +229 -0
- 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 +248 -26
- package/dist/lib/platform/issue-comments.js +146 -34
- package/dist/lib/platform/issues.js +1 -179
- package/dist/lib/platform/pr-change-report.js +6 -12
- package/dist/lib/platform/pr-checks.js +12 -65
- package/dist/lib/platform/pr-summary.js +83 -10
- package/dist/lib/platform/provider-contract.d.ts +67 -1
- package/dist/lib/platform/provider-contract.js +6 -2
- package/dist/lib/platform/provider-validation.js +76 -3
- package/dist/lib/platform/pull-requests.js +117 -275
- package/dist/lib/platform/repository-metadata.js +377 -0
- package/dist/lib/platform/security-alerts.js +155 -0
- package/dist/lib/platform/snapshots.js +2 -0
- package/dist/lib/platform/verification-sync.js +154 -162
- package/dist/lib/process-data/index.js +7 -0
- package/dist/lib/release/workflow.js +1 -1
- package/dist/lib/run/index.js +5 -0
- package/dist/lib/sandbox/commands/control-status.js +22 -0
- package/dist/lib/sandbox/commands/create.js +39 -8
- package/dist/lib/sandbox/commands/ls.js +5 -0
- package/dist/lib/sandbox/commands/rm.js +3 -807
- package/dist/lib/sandbox/commands/show.js +16 -0
- package/dist/lib/sandbox/control/audit.js +203 -0
- package/dist/lib/sandbox/control/client.js +125 -12
- package/dist/lib/sandbox/control/completed-reentry.js +85 -0
- package/dist/lib/sandbox/control/container-identity.js +28 -31
- package/dist/lib/sandbox/control/executor.js +233 -34
- 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 +656 -128
- package/dist/lib/sandbox/control/native-file-lock.js +85 -0
- package/dist/lib/sandbox/control/protocol.js +55 -4
- package/dist/lib/sandbox/control/server.js +720 -79
- package/dist/lib/sandbox/control/state.js +63 -3
- package/dist/lib/sandbox/control/task-view.js +183 -0
- package/dist/lib/sandbox/control/task-workflow.js +74 -0
- package/dist/lib/sandbox/control/workflow-executor.js +99 -0
- package/dist/lib/sandbox/engines/authority.js +289 -0
- package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
- package/dist/lib/sandbox/index.js +7 -2
- package/dist/lib/sandbox/recovery.js +49 -5
- package/dist/lib/sandbox/removal.js +1717 -0
- package/dist/lib/sandbox/task-cleanup.js +217 -0
- package/dist/lib/sandbox/workspace-view.js +15 -15
- package/dist/lib/sandbox/worktree-safety.js +4 -1
- package/dist/lib/server/index.js +8 -0
- 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 +101 -0
- package/dist/lib/task/artifact-lifecycle.js +71 -40
- package/dist/lib/task/artifact-name.js +36 -0
- package/dist/lib/task/artifact-operations.js +474 -0
- package/dist/lib/task/artifact-receipts.js +3 -15
- package/dist/lib/task/artifact-repair-intent.js +130 -0
- package/dist/lib/task/artifact-schema.js +127 -0
- package/dist/lib/task/capabilities.js +83 -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 +2 -16
- package/dist/lib/task/control-authority.js +375 -5
- package/dist/lib/task/control-recovery.js +128 -0
- package/dist/lib/task/create-service.js +103 -4
- package/dist/lib/task/create.js +80 -2
- package/dist/lib/task/decision-details.js +2 -46
- package/dist/lib/task/events.js +306 -76
- package/dist/lib/task/finalization-state.js +9 -0
- package/dist/lib/task/human-override.js +3 -6
- package/dist/lib/task/implementation-inputs.js +3 -3
- package/dist/lib/task/index.js +11 -3
- package/dist/lib/task/intermediate-cleanup.js +383 -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.js +19 -1
- package/dist/lib/task/local-artifact-finalization.js +190 -290
- 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 +101 -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 +206 -69
- package/dist/lib/task/qualification-audit.js +476 -0
- package/dist/lib/task/qualification-confirmation.js +109 -0
- package/dist/lib/task/qualification-intents.js +148 -0
- package/dist/lib/task/review-artifacts.js +23 -40
- package/dist/lib/task/review-command.js +25 -0
- package/dist/lib/task/review-finalization.js +146 -97
- package/dist/lib/task/review-fingerprint.js +2 -2
- package/dist/lib/task/sections.js +34 -54
- package/dist/lib/task/verification-config.js +11 -0
- package/dist/lib/task/verification-engine.js +170 -327
- package/dist/lib/task/verification.js +1 -1
- package/dist/lib/task/workflow-command.js +17 -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/lifecycle-build-manifest.json +3 -3
- package/lib/agent-client.ts +9 -0
- package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
- package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
- package/lib/fs/durable-write.ts +29 -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/agent-client.ts +4 -2
- package/lib/internal/cli-route-inventory.ts +142 -0
- package/lib/internal/codex-lifecycle.ts +14 -12
- package/lib/internal/codex-sandbox-controller.ts +7 -2
- package/lib/internal/demo-promotion.ts +354 -0
- package/lib/internal/demo-transcript.ts +419 -0
- package/lib/internal/git-workflow.ts +9 -6
- package/lib/internal/host-control.ts +28 -0
- package/lib/internal/manual-validation.ts +306 -0
- package/lib/internal/platform-checks.ts +12 -4
- package/lib/internal/platform-comment.ts +12 -4
- package/lib/internal/platform-context.ts +3 -1
- package/lib/internal/platform-issue.ts +11 -4
- package/lib/internal/platform-metadata.ts +70 -0
- package/lib/internal/platform-pr-review.ts +14 -3
- package/lib/internal/platform-pr.ts +38 -14
- package/lib/internal/platform-release-notes.ts +5 -3
- package/lib/internal/platform-security.ts +83 -0
- package/lib/internal/pr-review-grade.ts +10 -3
- package/lib/internal/release-workflow.ts +91 -87
- package/lib/internal/sandbox-control.ts +181 -6
- package/lib/internal/task-activity.ts +12 -4
- package/lib/internal/task-artifact.ts +15 -79
- package/lib/internal/task-context.ts +3 -1
- package/lib/internal/task-create.ts +76 -15
- package/lib/internal/task-delivery.ts +3 -1
- package/lib/internal/task-event.ts +21 -10
- package/lib/internal/task-finalization.ts +3 -1
- package/lib/internal/task-invalidation.ts +3 -1
- package/lib/internal/task-ledger.ts +11 -1
- package/lib/internal/task-lifecycle.ts +3 -1
- package/lib/internal/task-operation-registry.ts +590 -0
- package/lib/internal/task-orchestration.ts +12 -0
- package/lib/internal/task-override.ts +9 -3
- package/lib/internal/task-qualification.ts +61 -0
- package/lib/internal/task-review.ts +7 -50
- package/lib/internal/task-short-id.ts +10 -1
- package/lib/internal/task-snapshot.ts +3 -1
- package/lib/internal/task-validate.ts +32 -12
- package/lib/internal/task-verify.ts +4 -1
- package/lib/internal/task-warning.ts +7 -1
- package/lib/owned-path.ts +26 -0
- package/lib/platform/check-status.ts +9 -0
- package/lib/platform/comment-safety.ts +255 -0
- package/lib/platform/completion-backfill.ts +1 -1
- package/lib/platform/github-data.ts +322 -0
- package/lib/platform/github-provider.ts +244 -27
- package/lib/platform/issue-comments.ts +159 -35
- package/lib/platform/issues.ts +4 -245
- package/lib/platform/pr-change-report.ts +6 -12
- package/lib/platform/pr-checks.ts +13 -77
- package/lib/platform/pr-summary.ts +88 -11
- package/lib/platform/provider-contract.ts +78 -3
- package/lib/platform/provider-validation.ts +85 -3
- package/lib/platform/pull-requests.ts +129 -348
- package/lib/platform/repository-metadata.ts +453 -0
- package/lib/platform/security-alerts.ts +191 -0
- package/lib/platform/snapshots.ts +53 -0
- package/lib/platform/verification-sync.ts +171 -177
- package/lib/process-data/index.ts +7 -0
- package/lib/release/workflow.ts +3 -3
- package/lib/run/index.ts +5 -0
- package/lib/sandbox/commands/control-status.ts +26 -0
- package/lib/sandbox/commands/create.ts +53 -12
- package/lib/sandbox/commands/ls.ts +7 -0
- package/lib/sandbox/commands/rm.ts +3 -996
- package/lib/sandbox/commands/show.ts +16 -0
- package/lib/sandbox/control/audit.ts +253 -0
- package/lib/sandbox/control/client.ts +150 -13
- package/lib/sandbox/control/completed-reentry.ts +98 -0
- package/lib/sandbox/control/container-identity.ts +27 -43
- package/lib/sandbox/control/executor.ts +262 -37
- package/lib/sandbox/control/finalization-response.ts +29 -0
- package/lib/sandbox/control/identity-sentinel.ts +137 -0
- package/lib/sandbox/control/lifecycle.ts +672 -18
- package/lib/sandbox/control/native-file-lock.ts +108 -0
- package/lib/sandbox/control/protocol.ts +80 -8
- package/lib/sandbox/control/server.ts +779 -82
- package/lib/sandbox/control/state.ts +84 -3
- package/lib/sandbox/control/task-view.ts +240 -0
- package/lib/sandbox/control/task-workflow.ts +95 -0
- package/lib/sandbox/control/workflow-executor.ts +102 -0
- package/lib/sandbox/engines/authority.ts +365 -0
- package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
- package/lib/sandbox/index.ts +9 -2
- package/lib/sandbox/recovery.ts +49 -6
- package/lib/sandbox/removal.ts +2144 -0
- package/lib/sandbox/task-cleanup.ts +209 -0
- package/lib/sandbox/workspace-view.ts +26 -18
- package/lib/sandbox/worktree-safety.ts +4 -1
- package/lib/server/index.ts +10 -0
- package/lib/task/activity-intent.ts +2 -2
- package/lib/task/activity-log.ts +27 -19
- package/lib/task/artifact-command.ts +104 -0
- package/lib/task/artifact-lifecycle.ts +66 -39
- package/lib/task/artifact-name.ts +55 -0
- package/lib/task/artifact-operations.ts +580 -0
- package/lib/task/artifact-receipts.ts +3 -14
- package/lib/task/artifact-repair-intent.ts +152 -0
- package/lib/task/artifact-schema.ts +163 -0
- package/lib/task/capabilities.ts +82 -22
- package/lib/task/codex-orchestration.ts +85 -24
- package/lib/task/commit-identity.ts +31 -0
- package/lib/task/commit-operation.ts +2 -16
- package/lib/task/control-authority.ts +513 -6
- package/lib/task/control-recovery.ts +174 -0
- package/lib/task/create-service.ts +131 -6
- package/lib/task/create.ts +83 -1
- package/lib/task/decision-details.ts +3 -71
- package/lib/task/events.ts +292 -75
- package/lib/task/finalization-state.ts +11 -0
- package/lib/task/human-override.ts +3 -8
- package/lib/task/implementation-inputs.ts +3 -3
- package/lib/task/index.ts +16 -3
- package/lib/task/intermediate-cleanup.ts +455 -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.ts +17 -1
- package/lib/task/local-artifact-finalization.ts +223 -388
- 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 +152 -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 +191 -68
- package/lib/task/qualification-audit.ts +588 -0
- package/lib/task/qualification-confirmation.ts +117 -0
- package/lib/task/qualification-intents.ts +150 -0
- package/lib/task/review-artifacts.ts +21 -41
- package/lib/task/review-command.ts +23 -0
- package/lib/task/review-finalization.ts +154 -153
- package/lib/task/review-fingerprint.ts +2 -2
- package/lib/task/sections.ts +33 -52
- package/lib/task/verification-config.ts +12 -0
- package/lib/task/verification-engine.ts +165 -370
- package/lib/task/verification-types.ts +17 -0
- package/lib/task/verification.ts +1 -1
- package/lib/task/workflow-command.ts +18 -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/package.json +7 -2
- package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
- package/templates/.agents/rules/README.en.md +2 -0
- package/templates/.agents/rules/README.zh-CN.md +2 -0
- package/templates/.agents/rules/decision-qualification.en.md +22 -0
- package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
- package/templates/.agents/rules/evidence-reporting.en.md +28 -0
- package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
- package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
- package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
- package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
- package/templates/.agents/rules/security-alerts.en.md +8 -8
- package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
- 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 +15 -2
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
- package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
- package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
- package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
- package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
- package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
- package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
- package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -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 +4 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -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 +10 -23
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
- package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
- package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
- package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
- package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
- package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
- package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
- package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
- 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/review-analysis/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
- package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
- package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
- package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
- 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 +5 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
- 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 +29 -7
- package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
- package/templates/.agents/templates/task.en.md +6 -0
- package/templates/.agents/templates/task.zh-CN.md +6 -0
- 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
- package/templates/.agents/scripts/security-alerts.github.sh +0 -151
- package/templates/.agents/scripts/security-alerts.sh +0 -31
- package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
- package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
4
|
+
|
|
5
|
+
import { validateManualValidationReceipt } from './manual-validation-receipt.ts';
|
|
6
|
+
import {
|
|
7
|
+
MANUAL_VALIDATION_ARTIFACT as ARTIFACT,
|
|
8
|
+
MANUAL_VALIDATION_SHA40 as SHA40,
|
|
9
|
+
MANUAL_VALIDATION_SHA64 as SHA64,
|
|
10
|
+
MANUAL_VALIDATION_TASK_ID as TASK_ID,
|
|
11
|
+
exactKeys,
|
|
12
|
+
isRecord,
|
|
13
|
+
validTimestamp,
|
|
14
|
+
writeJsonAtomic
|
|
15
|
+
} from './manual-validation-shared.ts';
|
|
16
|
+
|
|
17
|
+
const MANUAL_VALIDATION_TRANSACTION_SCHEMA = 'agent-infra/manual-validation-transaction';
|
|
18
|
+
const MANUAL_VALIDATION_TRANSACTION_VERSION = 1;
|
|
19
|
+
const TRANSACTION_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
|
|
20
|
+
|
|
21
|
+
type ManualValidationTransactionPhase = 'prepared' | 'summary-staged' | 'receipt-committed' | 'final-promotion-in-progress' | 'committed' | 'aborted' | 'recovery-required';
|
|
22
|
+
type ManualValidationSummaryPreimage = Readonly<{ commentId: number | string | null; body: string; digest: string }>;
|
|
23
|
+
type ManualValidationTransaction = Readonly<{
|
|
24
|
+
schema: typeof MANUAL_VALIDATION_TRANSACTION_SCHEMA;
|
|
25
|
+
version: typeof MANUAL_VALIDATION_TRANSACTION_VERSION;
|
|
26
|
+
transactionId: string;
|
|
27
|
+
taskId: string;
|
|
28
|
+
prNumber: number;
|
|
29
|
+
prHeadSha: string;
|
|
30
|
+
evidenceDigest: string;
|
|
31
|
+
summaryPreimage: ManualValidationSummaryPreimage;
|
|
32
|
+
pendingSummaryDigest: string;
|
|
33
|
+
finalSummaryDigest: string;
|
|
34
|
+
artifact: string;
|
|
35
|
+
phase: ManualValidationTransactionPhase;
|
|
36
|
+
committedReceipt: string | null;
|
|
37
|
+
eventAppended: boolean;
|
|
38
|
+
attempt: number;
|
|
39
|
+
postWriteVerified: boolean;
|
|
40
|
+
createdAt: string;
|
|
41
|
+
updatedAt: string;
|
|
42
|
+
error: string | null;
|
|
43
|
+
}>;
|
|
44
|
+
type ManualValidationTransactionInput = Omit<ManualValidationTransaction, 'schema' | 'version' | 'phase' | 'committedReceipt' | 'eventAppended' | 'postWriteVerified' | 'error'> & {
|
|
45
|
+
transactionId?: string;
|
|
46
|
+
};
|
|
47
|
+
type ManualValidationTransactionPatch = Partial<Pick<ManualValidationTransaction, 'committedReceipt' | 'eventAppended' | 'postWriteVerified' | 'error' | 'updatedAt' | 'attempt'>>;
|
|
48
|
+
type ManualValidationTransactionErrorCode =
|
|
49
|
+
| 'MANUAL_VALIDATION_TRANSACTION_INVALID'
|
|
50
|
+
| 'MANUAL_VALIDATION_TRANSACTION_MISSING'
|
|
51
|
+
| 'MANUAL_VALIDATION_TRANSACTION_IDENTITY_MISMATCH'
|
|
52
|
+
| 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID';
|
|
53
|
+
type ManualValidationTransactionError = { code: ManualValidationTransactionErrorCode; message: string };
|
|
54
|
+
type ManualValidationTransactionResult =
|
|
55
|
+
| { ok: true; value: ManualValidationTransaction }
|
|
56
|
+
| { ok: false; error: ManualValidationTransactionError };
|
|
57
|
+
type ManualValidationGenerationArchiveOptions = Readonly<{
|
|
58
|
+
afterReceiptMove?: () => void;
|
|
59
|
+
}>;
|
|
60
|
+
|
|
61
|
+
function invalid(message: string): ManualValidationTransactionResult {
|
|
62
|
+
return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_INVALID', message } };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function summaryPreimageDigest(body: string): string {
|
|
66
|
+
return createHash('sha256').update(body, 'utf8').digest('hex');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function validateManualValidationTransaction(value: unknown, expected?: Partial<Pick<ManualValidationTransaction, 'transactionId' | 'taskId' | 'prNumber' | 'prHeadSha' | 'evidenceDigest' | 'artifact'>>): ManualValidationTransactionResult {
|
|
70
|
+
if (!isRecord(value)) return invalid('transaction must be a JSON object');
|
|
71
|
+
const keys = ['schema', 'version', 'transactionId', 'taskId', 'prNumber', 'prHeadSha', 'evidenceDigest', 'summaryPreimage', 'pendingSummaryDigest', 'finalSummaryDigest', 'artifact', 'phase', 'committedReceipt', 'eventAppended', 'attempt', 'postWriteVerified', 'createdAt', 'updatedAt', 'error'];
|
|
72
|
+
const keyError = exactKeys(value, keys, 'transaction');
|
|
73
|
+
if (keyError) return invalid(keyError);
|
|
74
|
+
if (value.schema !== MANUAL_VALIDATION_TRANSACTION_SCHEMA || value.version !== MANUAL_VALIDATION_TRANSACTION_VERSION) return invalid('transaction schema or version is unsupported');
|
|
75
|
+
if (typeof value.transactionId !== 'string' || !TRANSACTION_ID.test(value.transactionId)) return invalid('transactionId is invalid');
|
|
76
|
+
if (typeof value.taskId !== 'string' || !TASK_ID.test(value.taskId)) return invalid('taskId is invalid');
|
|
77
|
+
const prNumber = value.prNumber;
|
|
78
|
+
if (!Number.isSafeInteger(prNumber) || (prNumber as number) <= 0) return invalid('prNumber is invalid');
|
|
79
|
+
if (typeof value.prHeadSha !== 'string' || !SHA40.test(value.prHeadSha)) return invalid('prHeadSha is invalid');
|
|
80
|
+
if (typeof value.evidenceDigest !== 'string' || !SHA64.test(value.evidenceDigest)) return invalid('evidenceDigest is invalid');
|
|
81
|
+
if (!isRecord(value.summaryPreimage)) return invalid('summaryPreimage is invalid');
|
|
82
|
+
const preimage = value.summaryPreimage;
|
|
83
|
+
const preimageKeyError = exactKeys(preimage, ['commentId', 'body', 'digest'], 'summaryPreimage');
|
|
84
|
+
if (preimageKeyError) return invalid(preimageKeyError);
|
|
85
|
+
if (preimage.commentId !== null && typeof preimage.commentId !== 'number' && typeof preimage.commentId !== 'string') return invalid('summaryPreimage.commentId is invalid');
|
|
86
|
+
if (typeof preimage.body !== 'string' || typeof preimage.digest !== 'string' || !SHA64.test(preimage.digest) || summaryPreimageDigest(preimage.body) !== preimage.digest) return invalid('summaryPreimage digest is invalid');
|
|
87
|
+
for (const field of ['pendingSummaryDigest', 'finalSummaryDigest'] as const) if (typeof value[field] !== 'string' || !SHA64.test(value[field])) return invalid(`${field} is invalid`);
|
|
88
|
+
if (typeof value.artifact !== 'string' || !ARTIFACT.test(value.artifact)) return invalid('artifact is invalid');
|
|
89
|
+
if (!['prepared', 'summary-staged', 'receipt-committed', 'final-promotion-in-progress', 'committed', 'aborted', 'recovery-required'].includes(value.phase as string)) return invalid('phase is invalid');
|
|
90
|
+
if (value.committedReceipt !== null && (typeof value.committedReceipt !== 'string' || !SHA64.test(value.committedReceipt))) return invalid('committedReceipt is invalid');
|
|
91
|
+
if (typeof value.eventAppended !== 'boolean' || typeof value.postWriteVerified !== 'boolean') return invalid('transaction completion flags are invalid');
|
|
92
|
+
const attempt = value.attempt;
|
|
93
|
+
if (!Number.isSafeInteger(attempt) || (attempt as number) < 1) return invalid('attempt is invalid');
|
|
94
|
+
if (!validTimestamp(value.createdAt) || !validTimestamp(value.updatedAt)) return invalid('transaction timestamps are invalid');
|
|
95
|
+
if (value.error !== null && (typeof value.error !== 'string' || !value.error || /[\r\n]/u.test(value.error))) return invalid('transaction error is invalid');
|
|
96
|
+
if (['receipt-committed', 'final-promotion-in-progress', 'committed'].includes(value.phase as string) && value.committedReceipt === null) return invalid('receipt-backed phases require committedReceipt');
|
|
97
|
+
if (['final-promotion-in-progress', 'committed'].includes(value.phase as string) && !value.eventAppended) return invalid('final promotion requires an appended completion event');
|
|
98
|
+
if (value.phase === 'committed' && !value.postWriteVerified) return invalid('committed phase requires post-write verification');
|
|
99
|
+
const transaction = value as unknown as ManualValidationTransaction;
|
|
100
|
+
if (expected && Object.entries(expected).some(([key, expectedValue]) => expectedValue !== undefined && transaction[key as keyof ManualValidationTransaction] !== expectedValue)) {
|
|
101
|
+
return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_IDENTITY_MISMATCH', message: 'transaction identity does not match the expected operation' } };
|
|
102
|
+
}
|
|
103
|
+
return { ok: true, value: transaction };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function createManualValidationTransaction(input: ManualValidationTransactionInput): ManualValidationTransaction {
|
|
107
|
+
const transaction: ManualValidationTransaction = {
|
|
108
|
+
schema: MANUAL_VALIDATION_TRANSACTION_SCHEMA,
|
|
109
|
+
version: MANUAL_VALIDATION_TRANSACTION_VERSION,
|
|
110
|
+
transactionId: input.transactionId ?? `mv-${randomUUID()}`,
|
|
111
|
+
taskId: input.taskId,
|
|
112
|
+
prNumber: input.prNumber,
|
|
113
|
+
prHeadSha: input.prHeadSha,
|
|
114
|
+
evidenceDigest: input.evidenceDigest,
|
|
115
|
+
summaryPreimage: input.summaryPreimage,
|
|
116
|
+
pendingSummaryDigest: input.pendingSummaryDigest,
|
|
117
|
+
finalSummaryDigest: input.finalSummaryDigest,
|
|
118
|
+
artifact: input.artifact,
|
|
119
|
+
phase: 'prepared',
|
|
120
|
+
committedReceipt: null,
|
|
121
|
+
eventAppended: false,
|
|
122
|
+
attempt: input.attempt,
|
|
123
|
+
postWriteVerified: false,
|
|
124
|
+
createdAt: input.createdAt,
|
|
125
|
+
updatedAt: input.updatedAt,
|
|
126
|
+
error: null
|
|
127
|
+
};
|
|
128
|
+
const checked = validateManualValidationTransaction(transaction);
|
|
129
|
+
if (!checked.ok) throw new Error(`${checked.error.code}: ${checked.error.message}`);
|
|
130
|
+
return checked.value;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const allowedTransitions: Record<ManualValidationTransactionPhase, readonly ManualValidationTransactionPhase[]> = {
|
|
134
|
+
prepared: ['prepared', 'summary-staged', 'aborted', 'recovery-required'],
|
|
135
|
+
'summary-staged': ['summary-staged', 'receipt-committed', 'aborted', 'recovery-required'],
|
|
136
|
+
'receipt-committed': ['receipt-committed', 'final-promotion-in-progress', 'aborted', 'recovery-required'],
|
|
137
|
+
'final-promotion-in-progress': ['final-promotion-in-progress', 'committed', 'aborted', 'recovery-required'],
|
|
138
|
+
committed: ['committed'],
|
|
139
|
+
aborted: ['aborted', 'prepared'],
|
|
140
|
+
'recovery-required': ['recovery-required', 'prepared']
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
function transitionManualValidationTransaction(
|
|
144
|
+
current: ManualValidationTransaction,
|
|
145
|
+
phase: ManualValidationTransactionPhase,
|
|
146
|
+
patch: ManualValidationTransactionPatch = {}
|
|
147
|
+
): ManualValidationTransactionResult {
|
|
148
|
+
if (!allowedTransitions[current.phase].includes(phase)) return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID', message: `cannot transition from ${current.phase} to ${phase}` } };
|
|
149
|
+
if (phase === 'final-promotion-in-progress' && (!current.eventAppended && patch.eventAppended !== true)) return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID', message: 'final promotion requires an appended completion event' } };
|
|
150
|
+
const next: ManualValidationTransaction = {
|
|
151
|
+
...current,
|
|
152
|
+
phase,
|
|
153
|
+
committedReceipt: patch.committedReceipt !== undefined ? patch.committedReceipt : current.committedReceipt,
|
|
154
|
+
eventAppended: patch.eventAppended ?? current.eventAppended,
|
|
155
|
+
postWriteVerified: patch.postWriteVerified ?? current.postWriteVerified,
|
|
156
|
+
attempt: patch.attempt ?? current.attempt,
|
|
157
|
+
error: patch.error !== undefined ? patch.error : current.error,
|
|
158
|
+
updatedAt: patch.updatedAt ?? new Date().toISOString()
|
|
159
|
+
};
|
|
160
|
+
const checked = validateManualValidationTransaction(next);
|
|
161
|
+
if (!checked.ok) return checked;
|
|
162
|
+
return checked;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function retryManualValidationTransaction(current: ManualValidationTransaction, now = new Date().toISOString()): ManualValidationTransactionResult {
|
|
166
|
+
if (!['aborted', 'recovery-required'].includes(current.phase)) return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID', message: 'only aborted or recovery-required transactions can be retried' } };
|
|
167
|
+
return transitionManualValidationTransaction(current, 'prepared', {
|
|
168
|
+
updatedAt: now,
|
|
169
|
+
error: null,
|
|
170
|
+
committedReceipt: null,
|
|
171
|
+
eventAppended: false,
|
|
172
|
+
postWriteVerified: false,
|
|
173
|
+
attempt: current.attempt + 1
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function manualValidationTransactionPath(taskDir: string): string {
|
|
178
|
+
return path.join(taskDir, '.manual-validation', 'transaction.json');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function manualValidationGenerationPaths(taskDir: string, transaction: ManualValidationTransaction): {
|
|
182
|
+
receipt: { current: string; history: string };
|
|
183
|
+
transaction: { current: string; history: string };
|
|
184
|
+
} {
|
|
185
|
+
const stateDir = path.join(taskDir, '.manual-validation');
|
|
186
|
+
const historyDir = path.join(stateDir, 'history');
|
|
187
|
+
return {
|
|
188
|
+
receipt: {
|
|
189
|
+
current: path.join(stateDir, 'receipt.json'),
|
|
190
|
+
history: path.join(historyDir, `receipt-${transaction.transactionId}-attempt-${transaction.attempt}.json`)
|
|
191
|
+
},
|
|
192
|
+
transaction: {
|
|
193
|
+
current: manualValidationTransactionPath(taskDir),
|
|
194
|
+
history: path.join(historyDir, `transaction-${transaction.transactionId}-attempt-${transaction.attempt}.json`)
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function readReceiptAt(file: string, transaction: ManualValidationTransaction): 'missing' | 'valid' {
|
|
200
|
+
let value: unknown;
|
|
201
|
+
try {
|
|
202
|
+
value = JSON.parse(fs.readFileSync(file, 'utf8')) as unknown;
|
|
203
|
+
} catch (error) {
|
|
204
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') return 'missing';
|
|
205
|
+
throw new Error(`manual-validation receipt is unreadable: ${error instanceof Error ? error.message : String(error)}`);
|
|
206
|
+
}
|
|
207
|
+
const checked = validateManualValidationReceipt(value, {
|
|
208
|
+
transactionId: transaction.transactionId,
|
|
209
|
+
taskId: transaction.taskId,
|
|
210
|
+
prNumber: transaction.prNumber,
|
|
211
|
+
prHeadSha: transaction.prHeadSha,
|
|
212
|
+
evidenceDigest: transaction.evidenceDigest,
|
|
213
|
+
artifact: transaction.artifact
|
|
214
|
+
});
|
|
215
|
+
if (!checked.ok) throw new Error(`manual-validation receipt is invalid: ${checked.error.message}`);
|
|
216
|
+
if (transaction.committedReceipt !== null && checked.value.receiptDigest !== transaction.committedReceipt) {
|
|
217
|
+
throw new Error('manual-validation receipt does not match the committed transaction');
|
|
218
|
+
}
|
|
219
|
+
return 'valid';
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function validateManualValidationGenerationArchive(taskDir: string, transaction: ManualValidationTransaction, requireReceipt = false): void {
|
|
223
|
+
const paths = manualValidationGenerationPaths(taskDir, transaction);
|
|
224
|
+
const currentTransaction = fs.existsSync(paths.transaction.current);
|
|
225
|
+
const archivedTransaction = fs.existsSync(paths.transaction.history);
|
|
226
|
+
if (currentTransaction && archivedTransaction) throw new Error(`manual-validation archive has conflicting transaction files for ${transaction.transactionId}`);
|
|
227
|
+
if (!currentTransaction && !archivedTransaction) throw new Error(`manual-validation archive source is missing: ${paths.transaction.current}`);
|
|
228
|
+
const currentReceipt = requireReceipt
|
|
229
|
+
? readReceiptAt(paths.receipt.current, transaction)
|
|
230
|
+
: (fs.existsSync(paths.receipt.current) ? 'valid' : 'missing');
|
|
231
|
+
const archivedReceipt = requireReceipt
|
|
232
|
+
? readReceiptAt(paths.receipt.history, transaction)
|
|
233
|
+
: (fs.existsSync(paths.receipt.history) ? 'valid' : 'missing');
|
|
234
|
+
if (requireReceipt && currentReceipt === 'missing' && archivedReceipt === 'missing') {
|
|
235
|
+
throw new Error(`manual-validation receipt is missing for transaction ${transaction.transactionId}`);
|
|
236
|
+
}
|
|
237
|
+
if (currentReceipt === 'valid' && archivedReceipt === 'valid') {
|
|
238
|
+
throw new Error(`manual-validation archive has conflicting receipt files for ${transaction.transactionId}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function archiveManualValidationGeneration(
|
|
243
|
+
taskDir: string,
|
|
244
|
+
transaction: ManualValidationTransaction,
|
|
245
|
+
requireReceipt = false,
|
|
246
|
+
options: ManualValidationGenerationArchiveOptions = {}
|
|
247
|
+
): void {
|
|
248
|
+
const paths = manualValidationGenerationPaths(taskDir, transaction);
|
|
249
|
+
validateManualValidationGenerationArchive(taskDir, transaction, requireReceipt);
|
|
250
|
+
fs.mkdirSync(path.dirname(paths.receipt.history), { recursive: true });
|
|
251
|
+
const move = (source: string, target: string, required: boolean): void => {
|
|
252
|
+
if (!fs.existsSync(source)) {
|
|
253
|
+
if (fs.existsSync(target) || !required) return;
|
|
254
|
+
throw new Error(`manual-validation archive source is missing: ${source}`);
|
|
255
|
+
}
|
|
256
|
+
if (fs.existsSync(target)) throw new Error(`manual-validation archive target already exists: ${target}`);
|
|
257
|
+
fs.renameSync(source, target);
|
|
258
|
+
};
|
|
259
|
+
move(paths.receipt.current, paths.receipt.history, requireReceipt);
|
|
260
|
+
options.afterReceiptMove?.();
|
|
261
|
+
move(paths.transaction.current, paths.transaction.history, true);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function writeManualValidationTransactionAtomic(taskDir: string, transaction: ManualValidationTransaction): string {
|
|
265
|
+
const checked = validateManualValidationTransaction(transaction);
|
|
266
|
+
if (!checked.ok) throw new Error(`${checked.error.code}: ${checked.error.message}`);
|
|
267
|
+
const target = manualValidationTransactionPath(taskDir);
|
|
268
|
+
return writeJsonAtomic(target, transaction);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function readManualValidationTransaction(taskDir: string, expected?: Parameters<typeof validateManualValidationTransaction>[1]): ManualValidationTransactionResult {
|
|
272
|
+
const file = manualValidationTransactionPath(taskDir);
|
|
273
|
+
let value: unknown;
|
|
274
|
+
try { value = JSON.parse(fs.readFileSync(file, 'utf8')) as unknown; }
|
|
275
|
+
catch (error) {
|
|
276
|
+
return { ok: false, error: { code: (error as NodeJS.ErrnoException).code === 'ENOENT' ? 'MANUAL_VALIDATION_TRANSACTION_MISSING' : 'MANUAL_VALIDATION_TRANSACTION_INVALID', message: error instanceof Error ? error.message : String(error) } };
|
|
277
|
+
}
|
|
278
|
+
return validateManualValidationTransaction(value, expected);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export {
|
|
282
|
+
MANUAL_VALIDATION_TRANSACTION_SCHEMA,
|
|
283
|
+
MANUAL_VALIDATION_TRANSACTION_VERSION,
|
|
284
|
+
archiveManualValidationGeneration,
|
|
285
|
+
createManualValidationTransaction,
|
|
286
|
+
manualValidationTransactionPath,
|
|
287
|
+
validateManualValidationGenerationArchive,
|
|
288
|
+
readManualValidationTransaction,
|
|
289
|
+
retryManualValidationTransaction,
|
|
290
|
+
summaryPreimageDigest,
|
|
291
|
+
transitionManualValidationTransaction,
|
|
292
|
+
validateManualValidationTransaction,
|
|
293
|
+
writeManualValidationTransactionAtomic
|
|
294
|
+
};
|
|
295
|
+
export type {
|
|
296
|
+
ManualValidationSummaryPreimage,
|
|
297
|
+
ManualValidationTransaction,
|
|
298
|
+
ManualValidationTransactionError,
|
|
299
|
+
ManualValidationTransactionErrorCode,
|
|
300
|
+
ManualValidationTransactionInput,
|
|
301
|
+
ManualValidationTransactionPatch,
|
|
302
|
+
ManualValidationTransactionPhase,
|
|
303
|
+
ManualValidationTransactionResult
|
|
304
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
type SourceLine = {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
text: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
type VisibleHeading = SourceLine & {
|
|
8
|
+
level: number;
|
|
9
|
+
text: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type VisibleAnchor = SourceLine & {
|
|
13
|
+
id: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type VisibleMarkdown = {
|
|
17
|
+
hasUnclosedFence: boolean;
|
|
18
|
+
lines: SourceLine[];
|
|
19
|
+
headings: VisibleHeading[];
|
|
20
|
+
anchors: VisibleAnchor[];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const HEADING = /^ {0,3}(#{1,6})[ \t]+(.+?)\s*$/;
|
|
24
|
+
const FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})(.*)$/;
|
|
25
|
+
const FENCE_CLOSE = /^ {0,3}(`{3,}|~{3,})\s*$/;
|
|
26
|
+
const ANCHOR = /^\s*<a\s+id=(['"])([^'"]+)\1\s*><\/a>\s*$/;
|
|
27
|
+
|
|
28
|
+
function sourceLines(content: string): SourceLine[] {
|
|
29
|
+
const lines: SourceLine[] = [];
|
|
30
|
+
let start = 0;
|
|
31
|
+
while (start < content.length) {
|
|
32
|
+
const newline = content.indexOf('\n', start);
|
|
33
|
+
const end = newline === -1 ? content.length : newline;
|
|
34
|
+
lines.push({ start, end, text: content.slice(start, end).replace(/\r$/, '') });
|
|
35
|
+
start = newline === -1 ? content.length : newline + 1;
|
|
36
|
+
}
|
|
37
|
+
return lines;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function scanVisibleMarkdown(content: string): VisibleMarkdown {
|
|
41
|
+
const lines = sourceLines(content);
|
|
42
|
+
const visible: SourceLine[] = [];
|
|
43
|
+
const headings: VisibleHeading[] = [];
|
|
44
|
+
const anchors: VisibleAnchor[] = [];
|
|
45
|
+
let fence: { character: '`' | '~'; length: number } | null = null;
|
|
46
|
+
|
|
47
|
+
for (const line of lines) {
|
|
48
|
+
if (fence) {
|
|
49
|
+
const close = line.text.match(FENCE_CLOSE);
|
|
50
|
+
if (close && close[1]![0] === fence.character && close[1]!.length >= fence.length) fence = null;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const open = line.text.match(FENCE_OPEN);
|
|
54
|
+
const marker = open?.[1];
|
|
55
|
+
const info = open?.[2] ?? '';
|
|
56
|
+
if (marker && !(marker[0] === '`' && info.includes('`'))) {
|
|
57
|
+
fence = { character: marker[0] as '`' | '~', length: marker.length };
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
visible.push(line);
|
|
61
|
+
const heading = line.text.match(HEADING);
|
|
62
|
+
if (heading) headings.push({ ...line, level: heading[1]!.length, text: heading[2]!.trim() });
|
|
63
|
+
const anchor = line.text.match(ANCHOR);
|
|
64
|
+
if (anchor) anchors.push({ ...line, id: anchor[2]! });
|
|
65
|
+
}
|
|
66
|
+
return { lines: visible, headings, anchors, hasUnclosedFence: fence !== null };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { scanVisibleMarkdown };
|
|
70
|
+
export type { SourceLine, VisibleHeading, VisibleMarkdown };
|