@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
|
@@ -23,11 +23,31 @@ Execute the project's full test workflow including compilation checks and unit t
|
|
|
23
23
|
|
|
24
24
|
Confirm no compilation errors.
|
|
25
25
|
|
|
26
|
-
## 2. Run
|
|
26
|
+
## 2. Run Tests by Layer
|
|
27
27
|
|
|
28
|
-
This project uses
|
|
28
|
+
This project uses test layers as an optional optimization; if the test suite is small, all layers may map to the same full test command.
|
|
29
29
|
|
|
30
|
-
### smoke (target <
|
|
30
|
+
### fast smoke (reference target <10s)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# TODO: Replace with this project's fast smoke subset command
|
|
34
|
+
# npm run test:smoke:fast (Node.js)
|
|
35
|
+
# pytest -m "not slow" (Python)
|
|
36
|
+
# go test -short ./... (Go)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Use for code-task inner loops when the project provides a build-free fast path. It should cover the same tests as smoke while skipping redundant compilation or generation.
|
|
40
|
+
|
|
41
|
+
### platform-smoke (cross-platform boundary)
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# TODO: Replace with this project's cross-platform integration subset command
|
|
45
|
+
# npm run test:platform-smoke:fast (Node.js)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Use for real CLI, git, shell, or subprocess tests moved out of the unit tier while preserving their original Windows/macOS execution boundary.
|
|
49
|
+
|
|
50
|
+
### smoke (reference target <10s)
|
|
31
51
|
|
|
32
52
|
```bash
|
|
33
53
|
# TODO: Replace with this project's smoke subset command
|
|
@@ -37,11 +57,11 @@ This project uses three test layers as an optional optimization; if the test sui
|
|
|
37
57
|
```
|
|
38
58
|
|
|
39
59
|
Use for:
|
|
40
|
-
-
|
|
41
|
-
- save-and-run / frequent feedback
|
|
60
|
+
- after completing an implementation step
|
|
61
|
+
- save-and-run / frequent feedback when no fast path exists
|
|
42
62
|
- project structure, configuration, and template contract checks
|
|
43
63
|
|
|
44
|
-
### core (target <
|
|
64
|
+
### core (reference target <95s)
|
|
45
65
|
|
|
46
66
|
```bash
|
|
47
67
|
# TODO: Replace with this project's core subset command
|
|
@@ -55,7 +75,7 @@ Use for:
|
|
|
55
75
|
- final verification before writing code.md / code-r{N}.md
|
|
56
76
|
- local gate before pushing a PR
|
|
57
77
|
|
|
58
|
-
### full (
|
|
78
|
+
### full (reference target <100s)
|
|
59
79
|
|
|
60
80
|
```bash
|
|
61
81
|
# TODO: Replace with this project's full test command
|
|
@@ -72,6 +92,8 @@ Use for:
|
|
|
72
92
|
|
|
73
93
|
If the project is not layered yet, smoke / core / full may all map to the same full test command; layering is a feedback-speed optimization, not a prerequisite for using the collaboration workflow.
|
|
74
94
|
|
|
95
|
+
Reference targets are feedback budgets, not merge gates. If coverage is collected, document whether it runs only on the main branch and whether it blocks acceptance.
|
|
96
|
+
|
|
75
97
|
## 3. Output Results
|
|
76
98
|
|
|
77
99
|
Report test result summary:
|
|
@@ -21,11 +21,31 @@ description: >
|
|
|
21
21
|
|
|
22
22
|
确认没有编译错误。
|
|
23
23
|
|
|
24
|
-
## 2.
|
|
24
|
+
## 2. 运行测试(按层级选择)
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
测试层级是可选的反馈速度优化;如果测试套件较小,所有层级都可以映射到同一个完整测试命令。
|
|
27
27
|
|
|
28
|
-
### smoke
|
|
28
|
+
### fast smoke(参考目标 <10s)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# TODO:替换为项目的 fast smoke 子集命令
|
|
32
|
+
# npm run test:smoke:fast (Node.js)
|
|
33
|
+
# pytest -m "not slow" (Python)
|
|
34
|
+
# go test -short ./... (Go)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
当项目提供不重复构建的快速路径时,用于 code-task 内循环。它应覆盖与 smoke 相同的测试,同时跳过重复的编译或生成步骤。
|
|
38
|
+
|
|
39
|
+
### platform-smoke(跨平台边界)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# TODO:替换为项目的跨平台 integration 子集命令
|
|
43
|
+
# npm run test:platform-smoke:fast (Node.js)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
用于承接从 unit 层迁出的真实 CLI、git、shell 或子进程测试,同时保留其原有 Windows/macOS 执行边界。
|
|
47
|
+
|
|
48
|
+
### smoke(参考目标 <10s)
|
|
29
49
|
|
|
30
50
|
```bash
|
|
31
51
|
# TODO:替换为项目的 smoke 子集命令
|
|
@@ -35,11 +55,11 @@ description: >
|
|
|
35
55
|
```
|
|
36
56
|
|
|
37
57
|
适用场景:
|
|
38
|
-
-
|
|
39
|
-
-
|
|
58
|
+
- 完成一个实施步骤后
|
|
59
|
+
- 项目没有 fast 路径时的保存即跑 / 频繁反馈
|
|
40
60
|
- 仅断言项目结构、配置、模板契约
|
|
41
61
|
|
|
42
|
-
### core
|
|
62
|
+
### core(参考目标 <95s)
|
|
43
63
|
|
|
44
64
|
```bash
|
|
45
65
|
# TODO:替换为项目的 core 子集命令
|
|
@@ -53,7 +73,7 @@ description: >
|
|
|
53
73
|
- 写 code.md / code-r{N}.md 报告前的最终验证
|
|
54
74
|
- 推送 PR 前的本地把关
|
|
55
75
|
|
|
56
|
-
### full
|
|
76
|
+
### full(参考目标 <100s)
|
|
57
77
|
|
|
58
78
|
```bash
|
|
59
79
|
# TODO:替换为项目的完整测试命令
|
|
@@ -70,6 +90,8 @@ description: >
|
|
|
70
90
|
|
|
71
91
|
如果项目尚未分层,smoke / core / full 可以全部使用完整测试命令;分层不是使用协作工作流的前置条件。
|
|
72
92
|
|
|
93
|
+
参考目标是反馈预算,不是合并门禁。如果采集覆盖率,应说明是否仅在 main 分支运行,以及是否阻塞验收。
|
|
94
|
+
|
|
73
95
|
## 3. 输出结果
|
|
74
96
|
|
|
75
97
|
报告测试结果摘要:
|
|
@@ -1269,6 +1269,9 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1269
1269
|
}
|
|
1270
1270
|
}
|
|
1271
1271
|
const version = resolveVersionFromTemplateRoot(templateRoot);
|
|
1272
|
+
const projectTemplateRoot = path.join(projectRoot, 'templates');
|
|
1273
|
+
const sourceRepositoryTemplate = fs.existsSync(projectTemplateRoot)
|
|
1274
|
+
&& fs.realpathSync(templateRoot) === fs.realpathSync(projectTemplateRoot);
|
|
1272
1275
|
|
|
1273
1276
|
const { project, org, language: lang = 'en' } = cfg;
|
|
1274
1277
|
const platformType = cfg.platform?.type || DEFAULTS.platform.type;
|
|
@@ -1771,6 +1774,17 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1771
1774
|
for (const [tgt, src] of selected) {
|
|
1772
1775
|
if (expectedTargets) expectedTargets.add(tgt);
|
|
1773
1776
|
|
|
1777
|
+
if (sourceRepositoryTemplate && tgt === '.github/workflows/pr-label.yml') {
|
|
1778
|
+
report.managed.protected.push({
|
|
1779
|
+
target: tgt,
|
|
1780
|
+
reason: 'source-repository',
|
|
1781
|
+
baseline: trustedBaseline(managedBaselines[tgt]),
|
|
1782
|
+
local: fs.existsSync(path.join(projectRoot, tgt)) ? sha256(fs.readFileSync(path.join(projectRoot, tgt))) : null,
|
|
1783
|
+
template: sha256(renderContent(fs.readFileSync(path.join(templateRoot, src), 'utf8'), vars))
|
|
1784
|
+
});
|
|
1785
|
+
continue;
|
|
1786
|
+
}
|
|
1787
|
+
|
|
1774
1788
|
if (matchesAny(tgt, merged) || matchesAny(tgt, ejected)) {
|
|
1775
1789
|
report.managed.skippedMerged.push(tgt);
|
|
1776
1790
|
continue;
|
|
@@ -36,10 +36,16 @@ delivery_remote_head: # Most recent successfully delivered task branch
|
|
|
36
36
|
|
|
37
37
|
### Constraints
|
|
38
38
|
|
|
39
|
+
| constraint_id | statement | status | authority | source | evidence | derived_from | approval_evidence |
|
|
40
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
41
|
+
|
|
39
42
|
### Confirmed Decisions
|
|
40
43
|
|
|
41
44
|
### Candidate and Rejected Options
|
|
42
45
|
|
|
46
|
+
| candidate_id | statement | status | constraint_ids | impact | evidence |
|
|
47
|
+
| --- | --- | --- | --- | --- | --- |
|
|
48
|
+
|
|
43
49
|
### Acceptance Criteria
|
|
44
50
|
|
|
45
51
|
### Open Questions
|
|
@@ -36,10 +36,16 @@ delivery_remote_head: # 最近一次成功交付到 remote 的任务分
|
|
|
36
36
|
|
|
37
37
|
### 约束
|
|
38
38
|
|
|
39
|
+
| constraint_id | statement | status | authority | source | evidence | derived_from | approval_evidence |
|
|
40
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
41
|
+
|
|
39
42
|
### 已确认决策
|
|
40
43
|
|
|
41
44
|
### 候选与否决方案
|
|
42
45
|
|
|
46
|
+
| candidate_id | statement | status | constraint_ids | impact | evidence |
|
|
47
|
+
| --- | --- | --- | --- | --- | --- |
|
|
48
|
+
|
|
43
49
|
### 验收标准
|
|
44
50
|
|
|
45
51
|
### 未决事项
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Run host-side task validation and record sanitized evidence"
|
|
3
|
-
usage: "/run-manual-validation [--task <ref> | -t <ref>] [--scope snapshot|inplace] [--timeout <ms>] [--format text|json] -- <command...>"
|
|
3
|
+
usage: "/run-manual-validation [--task <ref> | -t <ref> | --branch <ref>] [--scope snapshot|inplace] [--timeout <ms>] [--format text|json] -- <command...>"
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "运行宿主侧任务校验并记录去敏证据"
|
|
3
|
-
usage: "/run-manual-validation [--task <ref> | -t <ref>] [--scope snapshot|inplace] [--timeout <ms>] [--format text|json] -- <command...>"
|
|
3
|
+
usage: "/run-manual-validation [--task <ref> | -t <ref> | --branch <ref>] [--scope snapshot|inplace] [--timeout <ms>] [--format text|json] -- <command...>"
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const adapters = new Map();
|
|
2
|
-
function registerPlatformAdapter(adapter) {
|
|
3
|
-
if (!adapter.type.trim())
|
|
4
|
-
throw new Error('Platform adapter type is required');
|
|
5
|
-
adapters.set(adapter.type, adapter);
|
|
6
|
-
}
|
|
7
|
-
function getPlatformAdapter(type) {
|
|
8
|
-
return type ? adapters.get(type) ?? null : null;
|
|
9
|
-
}
|
|
10
|
-
function registerPlatformCapabilities(type, capabilities) {
|
|
11
|
-
const adapter = adapters.get(type) ?? { type };
|
|
12
|
-
adapters.set(type, { ...adapter, ...capabilities });
|
|
13
|
-
}
|
|
14
|
-
function hasPlatformCapability(type, capability) {
|
|
15
|
-
const adapter = getPlatformAdapter(type);
|
|
16
|
-
if (capability === 'change-request')
|
|
17
|
-
return typeof adapter?.inspectChangeRequest === 'function';
|
|
18
|
-
if (capability === 'issue-closing-change-requests')
|
|
19
|
-
return typeof adapter?.inspectIssueClosingChangeRequests === 'function';
|
|
20
|
-
if (capability === 'required-checks')
|
|
21
|
-
return typeof adapter?.inspectRequiredChecks === 'function';
|
|
22
|
-
return typeof adapter?.resolveChangeRequestGitEvidence === 'function';
|
|
23
|
-
}
|
|
24
|
-
function inspectPlatformIssueClosingChangeRequests(type, context) {
|
|
25
|
-
const adapter = getPlatformAdapter(type);
|
|
26
|
-
return adapter?.inspectIssueClosingChangeRequests?.(context) ??
|
|
27
|
-
unsupported(type, 'issue closing change-request inspection');
|
|
28
|
-
}
|
|
29
|
-
function unsupported(type, capability) {
|
|
30
|
-
return {
|
|
31
|
-
ok: false,
|
|
32
|
-
error: {
|
|
33
|
-
code: 'PLATFORM_CAPABILITY_UNSUPPORTED',
|
|
34
|
-
message: `Platform '${type || 'none'}' does not provide ${capability}`,
|
|
35
|
-
retryable: false
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
function inspectPlatformChangeRequest(type, context) {
|
|
40
|
-
const adapter = getPlatformAdapter(type);
|
|
41
|
-
return adapter?.inspectChangeRequest?.(context) ?? unsupported(type, 'change-request inspection');
|
|
42
|
-
}
|
|
43
|
-
function inspectPlatformRequiredChecks(type, context) {
|
|
44
|
-
const adapter = getPlatformAdapter(type);
|
|
45
|
-
return adapter?.inspectRequiredChecks?.(context) ?? unsupported(type, 'required-checks inspection');
|
|
46
|
-
}
|
|
47
|
-
function resolvePlatformChangeRequestGitEvidence(type, context) {
|
|
48
|
-
const adapter = getPlatformAdapter(type);
|
|
49
|
-
return adapter?.resolveChangeRequestGitEvidence?.(context) ??
|
|
50
|
-
unsupported(type, 'change-request Git evidence');
|
|
51
|
-
}
|
|
52
|
-
function listPlatformAdapters() {
|
|
53
|
-
return [...adapters.keys()].sort();
|
|
54
|
-
}
|
|
55
|
-
export { getPlatformAdapter, hasPlatformCapability, inspectPlatformChangeRequest, inspectPlatformIssueClosingChangeRequests, inspectPlatformRequiredChecks, listPlatformAdapters, registerPlatformAdapter, registerPlatformCapabilities, resolvePlatformChangeRequestGitEvidence };
|
|
56
|
-
//# sourceMappingURL=adapters.js.map
|
package/lib/platform/adapters.ts
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import type { PlatformError, PlatformResult } from './types.ts';
|
|
2
|
-
import type { ResourceIdentity } from './resource-identity.ts';
|
|
3
|
-
|
|
4
|
-
type PlatformAdapterContext = {
|
|
5
|
-
cwd: string;
|
|
6
|
-
gitRemote?: (cwd: string) => string | null;
|
|
7
|
-
client?: unknown;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
type PlatformMergeability = {
|
|
11
|
-
state: 'mergeable' | 'conflicting' | 'unknown';
|
|
12
|
-
detail: string | null;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
type PlatformChangeRequestSnapshot = {
|
|
16
|
-
repository: string;
|
|
17
|
-
number: number;
|
|
18
|
-
nodeId: string;
|
|
19
|
-
url: string;
|
|
20
|
-
state: 'open' | 'closed';
|
|
21
|
-
title: string;
|
|
22
|
-
body: string;
|
|
23
|
-
draft: boolean;
|
|
24
|
-
head: { repository: string; ref: string; sha: string };
|
|
25
|
-
base: { repository: string; ref: string; sha: string };
|
|
26
|
-
mergedAt: string | null;
|
|
27
|
-
mergeCommitSha: string | null;
|
|
28
|
-
labels: string[];
|
|
29
|
-
assignees: string[];
|
|
30
|
-
milestone: string | null;
|
|
31
|
-
mergeability?: PlatformMergeability;
|
|
32
|
-
identity?: ResourceIdentity;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
type PlatformCheckSnapshot = {
|
|
36
|
-
name: string;
|
|
37
|
-
bucket: 'pass' | 'fail' | 'pending' | 'cancel';
|
|
38
|
-
workflow?: string | null;
|
|
39
|
-
conclusion?: string | null;
|
|
40
|
-
detailsUrl?: string | null;
|
|
41
|
-
startedAt?: string | null;
|
|
42
|
-
completedAt?: string | null;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
type PlatformInspectionResult<T> = {
|
|
46
|
-
ok: boolean;
|
|
47
|
-
value?: T;
|
|
48
|
-
error?: PlatformError;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
type ChangeRequestInspectionContext = PlatformAdapterContext & {
|
|
52
|
-
repository: string;
|
|
53
|
-
number: number;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
type IssueClosingChangeRequestsContext = PlatformAdapterContext & {
|
|
57
|
-
repository: string;
|
|
58
|
-
issueNumber: number;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
type RequiredChecksInspectionContext = ChangeRequestInspectionContext & {
|
|
62
|
-
headSha: string;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
type ChangeRequestGitEvidenceContext = ChangeRequestInspectionContext & {
|
|
66
|
-
pullRequest: PlatformChangeRequestSnapshot;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
type PlatformChangeRequestGitEvidenceSpec = {
|
|
70
|
-
remoteUrl: string;
|
|
71
|
-
reviewedHeadRef: string;
|
|
72
|
-
targetHeadRef: string;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
type PlatformAdapter = {
|
|
76
|
-
type: string;
|
|
77
|
-
resolveContext(context: PlatformAdapterContext): PlatformResult;
|
|
78
|
-
inspectChangeRequest?(
|
|
79
|
-
context: ChangeRequestInspectionContext
|
|
80
|
-
): PlatformInspectionResult<PlatformChangeRequestSnapshot>;
|
|
81
|
-
inspectIssueClosingChangeRequests?(
|
|
82
|
-
context: IssueClosingChangeRequestsContext
|
|
83
|
-
): PlatformInspectionResult<PlatformChangeRequestSnapshot[]>;
|
|
84
|
-
inspectRequiredChecks?(
|
|
85
|
-
context: RequiredChecksInspectionContext
|
|
86
|
-
): PlatformInspectionResult<PlatformCheckSnapshot[]>;
|
|
87
|
-
resolveChangeRequestGitEvidence?(
|
|
88
|
-
context: ChangeRequestGitEvidenceContext
|
|
89
|
-
): PlatformInspectionResult<PlatformChangeRequestGitEvidenceSpec>;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const adapters = new Map<string, PlatformAdapter>();
|
|
93
|
-
|
|
94
|
-
function registerPlatformAdapter(adapter: PlatformAdapter): void {
|
|
95
|
-
if (!adapter.type.trim()) throw new Error('Platform adapter type is required');
|
|
96
|
-
adapters.set(adapter.type, adapter);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function getPlatformAdapter(type: string | null): PlatformAdapter | null {
|
|
100
|
-
return type ? adapters.get(type) ?? null : null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function registerPlatformCapabilities(
|
|
104
|
-
type: string,
|
|
105
|
-
capabilities: Pick<
|
|
106
|
-
PlatformAdapter,
|
|
107
|
-
'inspectChangeRequest' | 'inspectIssueClosingChangeRequests' | 'inspectRequiredChecks' | 'resolveChangeRequestGitEvidence'
|
|
108
|
-
>
|
|
109
|
-
): void {
|
|
110
|
-
const adapter = adapters.get(type) ?? { type } as PlatformAdapter;
|
|
111
|
-
adapters.set(type, { ...adapter, ...capabilities });
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function hasPlatformCapability(
|
|
115
|
-
type: string | null,
|
|
116
|
-
capability: 'change-request' | 'issue-closing-change-requests' | 'required-checks' | 'change-request-git-evidence'
|
|
117
|
-
): boolean {
|
|
118
|
-
const adapter = getPlatformAdapter(type);
|
|
119
|
-
if (capability === 'change-request') return typeof adapter?.inspectChangeRequest === 'function';
|
|
120
|
-
if (capability === 'issue-closing-change-requests') return typeof adapter?.inspectIssueClosingChangeRequests === 'function';
|
|
121
|
-
if (capability === 'required-checks') return typeof adapter?.inspectRequiredChecks === 'function';
|
|
122
|
-
return typeof adapter?.resolveChangeRequestGitEvidence === 'function';
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function inspectPlatformIssueClosingChangeRequests(
|
|
126
|
-
type: string | null,
|
|
127
|
-
context: IssueClosingChangeRequestsContext
|
|
128
|
-
): PlatformInspectionResult<PlatformChangeRequestSnapshot[]> {
|
|
129
|
-
const adapter = getPlatformAdapter(type);
|
|
130
|
-
return adapter?.inspectIssueClosingChangeRequests?.(context) ??
|
|
131
|
-
unsupported(type, 'issue closing change-request inspection');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function unsupported<T>(type: string | null, capability: string): PlatformInspectionResult<T> {
|
|
135
|
-
return {
|
|
136
|
-
ok: false,
|
|
137
|
-
error: {
|
|
138
|
-
code: 'PLATFORM_CAPABILITY_UNSUPPORTED',
|
|
139
|
-
message: `Platform '${type || 'none'}' does not provide ${capability}`,
|
|
140
|
-
retryable: false
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function inspectPlatformChangeRequest(
|
|
146
|
-
type: string | null,
|
|
147
|
-
context: ChangeRequestInspectionContext
|
|
148
|
-
): PlatformInspectionResult<PlatformChangeRequestSnapshot> {
|
|
149
|
-
const adapter = getPlatformAdapter(type);
|
|
150
|
-
return adapter?.inspectChangeRequest?.(context) ?? unsupported(type, 'change-request inspection');
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function inspectPlatformRequiredChecks(
|
|
154
|
-
type: string | null,
|
|
155
|
-
context: RequiredChecksInspectionContext
|
|
156
|
-
): PlatformInspectionResult<PlatformCheckSnapshot[]> {
|
|
157
|
-
const adapter = getPlatformAdapter(type);
|
|
158
|
-
return adapter?.inspectRequiredChecks?.(context) ?? unsupported(type, 'required-checks inspection');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
function resolvePlatformChangeRequestGitEvidence(
|
|
162
|
-
type: string | null,
|
|
163
|
-
context: ChangeRequestGitEvidenceContext
|
|
164
|
-
): PlatformInspectionResult<PlatformChangeRequestGitEvidenceSpec> {
|
|
165
|
-
const adapter = getPlatformAdapter(type);
|
|
166
|
-
return adapter?.resolveChangeRequestGitEvidence?.(context) ??
|
|
167
|
-
unsupported(type, 'change-request Git evidence');
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function listPlatformAdapters(): string[] {
|
|
171
|
-
return [...adapters.keys()].sort();
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export {
|
|
175
|
-
getPlatformAdapter,
|
|
176
|
-
hasPlatformCapability,
|
|
177
|
-
inspectPlatformChangeRequest,
|
|
178
|
-
inspectPlatformIssueClosingChangeRequests,
|
|
179
|
-
inspectPlatformRequiredChecks,
|
|
180
|
-
listPlatformAdapters,
|
|
181
|
-
registerPlatformAdapter,
|
|
182
|
-
registerPlatformCapabilities,
|
|
183
|
-
resolvePlatformChangeRequestGitEvidence
|
|
184
|
-
};
|
|
185
|
-
export type {
|
|
186
|
-
ChangeRequestGitEvidenceContext,
|
|
187
|
-
ChangeRequestInspectionContext,
|
|
188
|
-
IssueClosingChangeRequestsContext,
|
|
189
|
-
PlatformAdapter,
|
|
190
|
-
PlatformAdapterContext,
|
|
191
|
-
PlatformChangeRequestGitEvidenceSpec,
|
|
192
|
-
PlatformChangeRequestSnapshot,
|
|
193
|
-
PlatformCheckSnapshot,
|
|
194
|
-
PlatformInspectionResult,
|
|
195
|
-
PlatformMergeability,
|
|
196
|
-
RequiredChecksInspectionContext
|
|
197
|
-
};
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
|
|
3
|
-
set -e
|
|
4
|
-
|
|
5
|
-
operation="${1:-}"
|
|
6
|
-
shift || true
|
|
7
|
-
number=""
|
|
8
|
-
reason=""
|
|
9
|
-
comment_file=""
|
|
10
|
-
|
|
11
|
-
while [ "$#" -gt 0 ]; do
|
|
12
|
-
case "$1" in
|
|
13
|
-
--number)
|
|
14
|
-
number="${2:-}"
|
|
15
|
-
shift
|
|
16
|
-
;;
|
|
17
|
-
--reason)
|
|
18
|
-
reason="${2:-}"
|
|
19
|
-
shift
|
|
20
|
-
;;
|
|
21
|
-
--comment-file)
|
|
22
|
-
comment_file="${2:-}"
|
|
23
|
-
shift
|
|
24
|
-
;;
|
|
25
|
-
*)
|
|
26
|
-
echo "Unknown option: $1" >&2
|
|
27
|
-
exit 2
|
|
28
|
-
;;
|
|
29
|
-
esac
|
|
30
|
-
shift
|
|
31
|
-
done
|
|
32
|
-
|
|
33
|
-
emit_error() {
|
|
34
|
-
code="$1"
|
|
35
|
-
message="$2"
|
|
36
|
-
node - "$operation" "$code" "$message" <<'NODE'
|
|
37
|
-
const [operation, code, message] = process.argv.slice(2);
|
|
38
|
-
process.stdout.write(`${JSON.stringify({ status: "failed", operation, error: { code, message } })}\n`);
|
|
39
|
-
NODE
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
case "$operation" in
|
|
43
|
-
read-dependabot|dismiss-dependabot|read-codescan|dismiss-codescan) ;;
|
|
44
|
-
*)
|
|
45
|
-
emit_error "SECURITY_OPERATION_INVALID" "Unknown security alert operation."
|
|
46
|
-
exit 1
|
|
47
|
-
;;
|
|
48
|
-
esac
|
|
49
|
-
|
|
50
|
-
case "$number" in
|
|
51
|
-
''|*[!0-9]*)
|
|
52
|
-
emit_error "SECURITY_NUMBER_INVALID" "Alert number must be a positive integer."
|
|
53
|
-
exit 1
|
|
54
|
-
;;
|
|
55
|
-
esac
|
|
56
|
-
|
|
57
|
-
if ! command -v gh >/dev/null 2>&1; then
|
|
58
|
-
emit_error "PLATFORM_CLI_MISSING" "The platform CLI is not installed."
|
|
59
|
-
exit 1
|
|
60
|
-
fi
|
|
61
|
-
if ! gh auth token >/dev/null 2>&1; then
|
|
62
|
-
emit_error "PLATFORM_NOT_AUTHENTICATED" "The platform CLI is not authenticated."
|
|
63
|
-
exit 1
|
|
64
|
-
fi
|
|
65
|
-
repo="$(gh repo view --json nameWithOwner --jq '.nameWithOwner')" || {
|
|
66
|
-
emit_error "PLATFORM_REPOSITORY_UNAVAILABLE" "Unable to access the current repository."
|
|
67
|
-
exit 1
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
case "$operation" in
|
|
71
|
-
*dependabot*) endpoint="repos/$repo/dependabot/alerts/$number" ;;
|
|
72
|
-
*codescan*) endpoint="repos/$repo/code-scanning/alerts/$number" ;;
|
|
73
|
-
esac
|
|
74
|
-
|
|
75
|
-
tmpdir="$(mktemp -d)"
|
|
76
|
-
trap 'rm -rf "$tmpdir"' EXIT HUP INT TERM
|
|
77
|
-
|
|
78
|
-
if [ "$operation" = "read-dependabot" ] || [ "$operation" = "read-codescan" ]; then
|
|
79
|
-
if ! gh api "$endpoint" > "$tmpdir/response.json" 2> "$tmpdir/error.txt"; then
|
|
80
|
-
emit_error "SECURITY_API_FAILED" "Unable to read the security alert."
|
|
81
|
-
exit 2
|
|
82
|
-
fi
|
|
83
|
-
else
|
|
84
|
-
if [ -z "$reason" ] || [ -z "$comment_file" ] || [ ! -f "$comment_file" ]; then
|
|
85
|
-
emit_error "SECURITY_DISMISS_INPUT_INVALID" "Dismissal reason and comment file are required."
|
|
86
|
-
exit 1
|
|
87
|
-
fi
|
|
88
|
-
if ! gh api "$endpoint" > "$tmpdir/current.json" 2> "$tmpdir/error.txt"; then
|
|
89
|
-
emit_error "SECURITY_API_FAILED" "Unable to read the security alert before dismissal."
|
|
90
|
-
exit 2
|
|
91
|
-
fi
|
|
92
|
-
state="$(node - "$tmpdir/current.json" <<'NODE'
|
|
93
|
-
const fs = require("node:fs");
|
|
94
|
-
try {
|
|
95
|
-
const alert = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
|
|
96
|
-
process.stdout.write(typeof alert.state === "string" ? alert.state : "invalid");
|
|
97
|
-
} catch {
|
|
98
|
-
process.stdout.write("invalid");
|
|
99
|
-
}
|
|
100
|
-
NODE
|
|
101
|
-
)"
|
|
102
|
-
case "$state" in
|
|
103
|
-
open) ;;
|
|
104
|
-
dismissed|fixed)
|
|
105
|
-
node - "$operation" "$tmpdir/current.json" <<'NODE'
|
|
106
|
-
const fs = require("node:fs");
|
|
107
|
-
const [operation, responsePath] = process.argv.slice(2);
|
|
108
|
-
const data = JSON.parse(fs.readFileSync(responsePath, "utf8"));
|
|
109
|
-
process.stdout.write(`${JSON.stringify({ status: "no-op", operation, data })}\n`);
|
|
110
|
-
NODE
|
|
111
|
-
exit 0
|
|
112
|
-
;;
|
|
113
|
-
*)
|
|
114
|
-
emit_error "SECURITY_RESPONSE_INVALID" "The platform returned an alert without a valid state."
|
|
115
|
-
exit 1
|
|
116
|
-
;;
|
|
117
|
-
esac
|
|
118
|
-
node - "$reason" "$comment_file" > "$tmpdir/payload.json" <<'NODE'
|
|
119
|
-
const fs = require("node:fs");
|
|
120
|
-
const [reason, commentFile] = process.argv.slice(2);
|
|
121
|
-
process.stdout.write(JSON.stringify({
|
|
122
|
-
state: "dismissed",
|
|
123
|
-
dismissed_reason: reason,
|
|
124
|
-
dismissed_comment: fs.readFileSync(commentFile, "utf8")
|
|
125
|
-
}));
|
|
126
|
-
NODE
|
|
127
|
-
if ! gh api --method PATCH "$endpoint" --input "$tmpdir/payload.json" > "$tmpdir/response.json" 2> "$tmpdir/error.txt"; then
|
|
128
|
-
emit_error "SECURITY_API_FAILED" "Unable to dismiss the security alert."
|
|
129
|
-
exit 2
|
|
130
|
-
fi
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
node - "$operation" "$tmpdir/response.json" <<'NODE'
|
|
134
|
-
const fs = require("node:fs");
|
|
135
|
-
const [operation, responsePath] = process.argv.slice(2);
|
|
136
|
-
const raw = fs.readFileSync(responsePath, "utf8").trim();
|
|
137
|
-
let data = null;
|
|
138
|
-
if (raw) {
|
|
139
|
-
try {
|
|
140
|
-
data = JSON.parse(raw);
|
|
141
|
-
} catch {
|
|
142
|
-
process.stdout.write(`${JSON.stringify({
|
|
143
|
-
status: "failed",
|
|
144
|
-
operation,
|
|
145
|
-
error: { code: "SECURITY_RESPONSE_INVALID", message: "The platform returned invalid JSON." }
|
|
146
|
-
})}\n`);
|
|
147
|
-
process.exit(1);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
process.stdout.write(`${JSON.stringify({ status: "applied", operation, data })}\n`);
|
|
151
|
-
NODE
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
|
|
3
|
-
set -e
|
|
4
|
-
|
|
5
|
-
operation="${1:-}"
|
|
6
|
-
|
|
7
|
-
node - "$operation" <<'NODE'
|
|
8
|
-
const operation = process.argv[2] || "";
|
|
9
|
-
const known = new Set([
|
|
10
|
-
"read-dependabot",
|
|
11
|
-
"dismiss-dependabot",
|
|
12
|
-
"read-codescan",
|
|
13
|
-
"dismiss-codescan"
|
|
14
|
-
]);
|
|
15
|
-
const payload = known.has(operation)
|
|
16
|
-
? {
|
|
17
|
-
status: "degraded",
|
|
18
|
-
operation,
|
|
19
|
-
error: {
|
|
20
|
-
code: "PLATFORM_SECURITY_UNSUPPORTED",
|
|
21
|
-
message: "The current platform does not provide a security alert adapter."
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
: {
|
|
25
|
-
status: "failed",
|
|
26
|
-
operation,
|
|
27
|
-
error: { code: "SECURITY_OPERATION_INVALID", message: "Unknown security alert operation." }
|
|
28
|
-
};
|
|
29
|
-
process.stdout.write(`${JSON.stringify(payload)}\n`);
|
|
30
|
-
process.exit(known.has(operation) ? 0 : 1);
|
|
31
|
-
NODE
|