cloving 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +235 -206
- package/dist/src/agent-harness-shell.d.ts +2 -1
- package/dist/src/agent-harness-shell.js +8 -5
- package/dist/src/authority/command-wait-checks.d.ts +8 -0
- package/dist/src/authority/command-wait-checks.js +88 -0
- package/dist/src/authority/command-wait-results.d.ts +15 -0
- package/dist/src/authority/command-wait-results.js +73 -0
- package/dist/src/authority/command-wait-view.d.ts +21 -0
- package/dist/src/authority/command-wait-view.js +34 -0
- package/dist/src/authority/command-waits.d.ts +39 -0
- package/dist/src/authority/command-waits.js +97 -0
- package/dist/src/authority/commands.js +22 -1
- package/dist/src/authority/dispatch-decision.d.ts +8 -0
- package/dist/src/authority/dispatch-decision.js +26 -1
- package/dist/src/authority/effect-requests.js +6 -3
- package/dist/src/authority/effect-results.js +4 -2
- package/dist/src/authority/history-state.d.ts +2 -0
- package/dist/src/authority/history-state.js +13 -1
- package/dist/src/authority/instants.d.ts +1 -0
- package/dist/src/authority/instants.js +21 -0
- package/dist/src/authority/reduction-state.d.ts +2 -0
- package/dist/src/authority/reduction-state.js +5 -0
- package/dist/src/authority/reduction.js +24 -0
- package/dist/src/authority/status-input.d.ts +2 -0
- package/dist/src/authority/status.d.ts +2 -0
- package/dist/src/authority/status.js +1 -0
- package/dist/src/authority/stop-sequence.d.ts +1 -0
- package/dist/src/authority/stop-sequence.js +2 -1
- package/dist/src/authority/transitions.d.ts +6 -4
- package/dist/src/authority/transitions.js +7 -0
- package/dist/src/broker/actor/authority-queries.d.ts +2 -1
- package/dist/src/broker/actor/authority-queries.js +14 -5
- package/dist/src/broker/actor/authority-receipts.js +1 -1
- package/dist/src/broker/actor/authority-settings.js +2 -2
- package/dist/src/broker/actor/authority-upgrades.d.ts +19 -2
- package/dist/src/broker/actor/authority-upgrades.js +7 -2
- package/dist/src/broker/actor/delivery-intents.js +2 -0
- package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
- package/dist/src/broker/actor/effect-delivery.js +15 -2
- package/dist/src/broker/actor/effect-plan.js +11 -2
- package/dist/src/broker/actor/effect-queries.d.ts +4 -0
- package/dist/src/broker/actor/effect-queries.js +9 -1
- package/dist/src/broker/actor/effect-turn.js +2 -0
- package/dist/src/broker/actor/stop-plan.js +9 -3
- package/dist/src/broker/actor/stop-turn.d.ts +2 -0
- package/dist/src/broker/actor/stop-turn.js +24 -11
- package/dist/src/broker/actor/turn-draft.d.ts +1 -0
- package/dist/src/broker/actor/turn-draft.js +4 -0
- package/dist/src/broker/actor/turn-state.js +5 -1
- package/dist/src/broker/authority-admission.js +60 -0
- package/dist/src/broker/authority-restore.d.ts +2 -0
- package/dist/src/broker/authority-restore.js +35 -1
- package/dist/src/broker/command-wait-restore.d.ts +31 -0
- package/dist/src/broker/command-wait-restore.js +86 -0
- package/dist/src/broker/decision-restore.d.ts +1 -1
- package/dist/src/broker/decision-restore.js +1 -0
- package/dist/src/broker/effect-upgrade.d.ts +2 -0
- package/dist/src/broker/effect-upgrade.js +8 -2
- package/dist/src/cli/arguments.d.ts +13 -0
- package/dist/src/cli/arguments.js +42 -3
- package/dist/src/cli/chat-stores.d.ts +2 -0
- package/dist/src/cli/chat-stores.js +113 -0
- package/dist/src/cli/client.d.ts +4 -1
- package/dist/src/cli/client.js +9 -3
- package/dist/src/cli/command-requests.d.ts +17 -0
- package/dist/src/cli/command-requests.js +43 -0
- package/dist/src/cli/command-waits.d.ts +9 -0
- package/dist/src/cli/command-waits.js +51 -0
- package/dist/src/cli/commands.js +14 -41
- package/dist/src/cli/config-file.d.ts +2 -2
- package/dist/src/cli/config-file.js +4 -2
- package/dist/src/cli/doctor-workflows.d.ts +5 -2
- package/dist/src/cli/doctor-workflows.js +12 -7
- package/dist/src/cli/doctor.js +6 -9
- package/dist/src/cli/harness-probes.d.ts +2 -0
- package/dist/src/cli/harness-probes.js +1 -1
- package/dist/src/cli/harness-processes.d.ts +6 -0
- package/dist/src/cli/harness-processes.js +36 -0
- package/dist/src/cli/init-command.d.ts +9 -0
- package/dist/src/cli/init-command.js +52 -0
- package/dist/src/cli/init-prompt-command.d.ts +10 -0
- package/dist/src/cli/init-prompt-command.js +145 -0
- package/dist/src/cli/init-prompt.d.ts +35 -0
- package/dist/src/cli/init-prompt.js +74 -0
- package/dist/src/cli/init-selection.d.ts +13 -0
- package/dist/src/cli/init-selection.js +75 -0
- package/dist/src/cli/main.d.ts +2 -0
- package/dist/src/cli/main.js +37 -7
- package/dist/src/cli/mcp-server.d.ts +1 -0
- package/dist/src/cli/mcp-server.js +156 -0
- package/dist/src/cli/mcp-tools.d.ts +15 -0
- package/dist/src/cli/mcp-tools.js +80 -0
- package/dist/src/cli/render.d.ts +1 -1
- package/dist/src/cli/render.js +17 -30
- package/dist/src/cli/report-ci-jobs.d.ts +23 -0
- package/dist/src/cli/report-ci-jobs.js +103 -0
- package/dist/src/cli/report-ci-usage.d.ts +9 -0
- package/dist/src/cli/report-ci-usage.js +185 -0
- package/dist/src/cli/report-ci.d.ts +13 -0
- package/dist/src/cli/report-ci.js +74 -0
- package/dist/src/cli/report-closures.d.ts +6 -0
- package/dist/src/cli/report-closures.js +97 -0
- package/dist/src/cli/report-flow.d.ts +7 -0
- package/dist/src/cli/report-flow.js +122 -0
- package/dist/src/cli/report-github-reader.d.ts +29 -0
- package/dist/src/cli/report-github-reader.js +157 -0
- package/dist/src/cli/report-github.d.ts +15 -8
- package/dist/src/cli/report-github.js +131 -150
- package/dist/src/cli/report-operator.d.ts +3 -0
- package/dist/src/cli/report-operator.js +40 -0
- package/dist/src/cli/report-ready.d.ts +3 -0
- package/dist/src/cli/report-ready.js +96 -0
- package/dist/src/cli/report-text.d.ts +9 -0
- package/dist/src/cli/report-text.js +33 -0
- package/dist/src/cli/report.d.ts +1 -0
- package/dist/src/cli/report.js +104 -27
- package/dist/src/cli/runtime-arguments.d.ts +2 -1
- package/dist/src/cli/runtime-arguments.js +7 -2
- package/dist/src/cli/schedule-arguments.d.ts +14 -0
- package/dist/src/cli/schedule-arguments.js +26 -0
- package/dist/src/cli/schedule-render.d.ts +22 -0
- package/dist/src/cli/schedule-render.js +73 -0
- package/dist/src/cli/terminal-text.d.ts +3 -0
- package/dist/src/cli/terminal-text.js +28 -0
- package/dist/src/cli/usage-render.d.ts +1 -0
- package/dist/src/cli/usage-render.js +28 -1
- package/dist/src/cli/usage.d.ts +1 -1
- package/dist/src/cli/usage.js +50 -7
- package/dist/src/cli/watch-actions.js +2 -2
- package/dist/src/cli/watch-board-view.js +19 -2
- package/dist/src/cli/watch-board.d.ts +4 -2
- package/dist/src/cli/watch-board.js +53 -43
- package/dist/src/cli/watch-card-forms.d.ts +1 -1
- package/dist/src/cli/watch-card-forms.js +11 -10
- package/dist/src/cli/watch-client.d.ts +1 -1
- package/dist/src/cli/watch-client.js +2 -11
- package/dist/src/cli/watch-header-view.d.ts +0 -5
- package/dist/src/cli/watch-header-view.js +8 -20
- package/dist/src/cli/watch-model.d.ts +4 -1
- package/dist/src/cli/watch-model.js +17 -11
- package/dist/src/cli/watch-page.js +12 -14
- package/dist/src/cli/watch-phases.d.ts +12 -3
- package/dist/src/cli/watch-phases.js +68 -11
- package/dist/src/cli/watch-pr-board.js +1 -1
- package/dist/src/cli/watch-pr-command.d.ts +1 -0
- package/dist/src/cli/watch-pull-request.js +18 -8
- package/dist/src/cli/watch-reads.d.ts +2 -0
- package/dist/src/cli/watch-reads.js +17 -16
- package/dist/src/cli/watch-render.d.ts +14 -0
- package/dist/src/cli/watch-run-input.d.ts +0 -1
- package/dist/src/cli/watch-run-input.js +0 -13
- package/dist/src/cli/watch-server.js +6 -6
- package/dist/src/cli/watch-view.d.ts +0 -3
- package/dist/src/cli/watch-view.js +13 -13
- package/dist/src/cli.js +59 -5
- package/dist/src/command-wait.d.ts +4 -0
- package/dist/src/command-wait.js +45 -0
- package/dist/src/configuration-change.d.ts +7 -0
- package/dist/src/configuration-change.js +14 -0
- package/dist/src/configuration-schema.d.ts +9 -0
- package/dist/src/configuration-schema.js +6 -2
- package/dist/src/daemon/attachment-file.d.ts +6 -0
- package/dist/src/daemon/attachment-file.js +86 -0
- package/dist/src/daemon/attachments.d.ts +14 -0
- package/dist/src/daemon/attachments.js +17 -0
- package/dist/src/daemon/claude-recovery.d.ts +50 -0
- package/dist/src/daemon/claude-recovery.js +204 -0
- package/dist/src/daemon/claude-stream.d.ts +27 -0
- package/dist/src/daemon/claude-stream.js +63 -0
- package/dist/src/daemon/claude-turn.d.ts +11 -25
- package/dist/src/daemon/claude-turn.js +64 -81
- package/dist/src/daemon/claude-worker.d.ts +2 -1
- package/dist/src/daemon/claude-worker.js +124 -122
- package/dist/src/daemon/daemon-adapters.d.ts +2 -0
- package/dist/src/daemon/daemon-adapters.js +26 -2
- package/dist/src/daemon/daemon-loops.d.ts +3 -1
- package/dist/src/daemon/daemon-loops.js +3 -1
- package/dist/src/daemon/daemon.js +14 -6
- package/dist/src/daemon/github-attach.d.ts +2 -0
- package/dist/src/daemon/github-attach.js +149 -0
- package/dist/src/daemon/github-ci-filters.d.ts +6 -0
- package/dist/src/daemon/github-ci-filters.js +138 -0
- package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
- package/dist/src/daemon/github-ci-workflows.js +148 -0
- package/dist/src/daemon/github-ci.js +22 -4
- package/dist/src/daemon/github-issue-methods.d.ts +2 -0
- package/dist/src/daemon/github-issue-methods.js +37 -2
- package/dist/src/daemon/github-merge-call.d.ts +2 -1
- package/dist/src/daemon/github-merge-call.js +10 -3
- package/dist/src/daemon/github-merge.js +52 -24
- package/dist/src/daemon/github-methods.js +12 -2
- package/dist/src/daemon/github-operation.d.ts +4 -0
- package/dist/src/daemon/github-operation.js +6 -0
- package/dist/src/daemon/github-worker.d.ts +4 -0
- package/dist/src/daemon/github-worker.js +6 -0
- package/dist/src/daemon/issue-queue.d.ts +1 -1
- package/dist/src/daemon/issue-queue.js +16 -11
- package/dist/src/daemon/notify-events.d.ts +6 -0
- package/dist/src/daemon/notify-events.js +84 -0
- package/dist/src/daemon/notify-journal.js +1 -1
- package/dist/src/daemon/notify-message.d.ts +4 -1
- package/dist/src/daemon/notify-message.js +36 -0
- package/dist/src/daemon/notify.d.ts +1 -1
- package/dist/src/daemon/notify.js +5 -77
- package/dist/src/daemon/operation-journal.d.ts +1 -0
- package/dist/src/daemon/queue-status.d.ts +9 -3
- package/dist/src/daemon/queue-status.js +17 -4
- package/dist/src/daemon/resume-index-lock.d.ts +13 -0
- package/dist/src/daemon/resume-index-lock.js +160 -0
- package/dist/src/daemon/resume-worktree.d.ts +7 -0
- package/dist/src/daemon/resume-worktree.js +29 -0
- package/dist/src/daemon/retrying-turn.d.ts +2 -12
- package/dist/src/daemon/retrying-turn.js +98 -172
- package/dist/src/daemon/schedule-control.d.ts +26 -0
- package/dist/src/daemon/schedule-control.js +110 -0
- package/dist/src/daemon/schedule-journal.d.ts +2 -15
- package/dist/src/daemon/schedule-journal.js +67 -4
- package/dist/src/daemon/ticket-registration.d.ts +2 -7
- package/dist/src/daemon/ticket-registration.js +15 -81
- package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
- package/dist/src/daemon/turn-attempt-journal.js +136 -0
- package/dist/src/daemon/turn-attempts.d.ts +47 -0
- package/dist/src/daemon/turn-attempts.js +166 -0
- package/dist/src/daemon/turn-report.d.ts +8 -1
- package/dist/src/daemon/turn-report.js +39 -0
- package/dist/src/daemon/work-tree.d.ts +9 -0
- package/dist/src/daemon/work-tree.js +20 -0
- package/dist/src/daemon/worker-profile.d.ts +8 -0
- package/dist/src/daemon/worker-profile.js +40 -0
- package/dist/src/daemon/workflow-schedules.d.ts +3 -0
- package/dist/src/daemon/workflow-schedules.js +98 -45
- package/dist/src/daemon/worktree-processes.d.ts +9 -0
- package/dist/src/daemon/worktree-processes.js +151 -0
- package/dist/src/doctor-report.d.ts +3 -5
- package/dist/src/doctor-report.js +6 -13
- package/dist/src/harness-start.d.ts +15 -0
- package/dist/src/harness-start.js +37 -0
- package/dist/src/host/command-wait.d.ts +38 -0
- package/dist/src/host/command-wait.js +115 -0
- package/dist/src/host/start-delivery.d.ts +5 -7
- package/dist/src/host/start-delivery.js +3 -15
- package/dist/src/host/step-bridge-host.d.ts +2 -0
- package/dist/src/host/step-bridge-host.js +21 -0
- package/dist/src/operation-identity.d.ts +1 -0
- package/dist/src/operation-identity.js +4 -0
- package/dist/src/private-config.schema.json +40 -0
- package/dist/src/project-config.schema.json +40 -0
- package/dist/src/project-settings.d.ts +2 -2
- package/dist/src/project-settings.js +3 -1
- package/dist/src/queue-spend.d.ts +4 -0
- package/dist/src/queue-spend.js +21 -0
- package/dist/src/relay/relay-service.d.ts +3 -0
- package/dist/src/relay/relay-service.js +5 -3
- package/dist/src/report-ci.d.ts +164 -0
- package/dist/src/report-ci.js +32 -0
- package/dist/src/report-effects.d.ts +15 -0
- package/dist/src/report-effects.js +212 -0
- package/dist/src/report-flow-types.d.ts +38 -0
- package/dist/src/report-flow-types.js +7 -0
- package/dist/src/report-flow.d.ts +43 -0
- package/dist/src/report-flow.js +193 -0
- package/dist/src/report-operator.d.ts +67 -0
- package/dist/src/report-operator.js +25 -0
- package/dist/src/report-quality.d.ts +221 -0
- package/dist/src/report-quality.js +94 -0
- package/dist/src/report-ready.d.ts +23 -0
- package/dist/src/report-ready.js +117 -0
- package/dist/src/report-statistics.d.ts +2 -1
- package/dist/src/report-statistics.js +40 -4
- package/dist/src/report.d.ts +588 -47
- package/dist/src/report.js +156 -41
- package/dist/src/schedule-progress.d.ts +33 -0
- package/dist/src/schedule-progress.js +45 -0
- package/dist/src/service/active-tickets.js +6 -6
- package/dist/src/service/command-waits.d.ts +34 -0
- package/dist/src/service/command-waits.js +86 -0
- package/dist/src/service/expiry.js +2 -0
- package/dist/src/service/gateway.js +3 -1
- package/dist/src/service/queue-spend.d.ts +6 -0
- package/dist/src/service/queue-spend.js +68 -0
- package/dist/src/service/replies.d.ts +8 -1
- package/dist/src/service/replies.js +11 -0
- package/dist/src/service/run-handlers.js +22 -2
- package/dist/src/service/run-metadata.d.ts +15 -1
- package/dist/src/service/run-metadata.js +93 -8
- package/dist/src/service/service.d.ts +4 -0
- package/dist/src/service/service.js +8 -8
- package/dist/src/service/submission-handler.js +18 -4
- package/dist/src/service/worker-port.js +9 -1
- package/dist/src/service/worker-totals.d.ts +2 -0
- package/dist/src/service/worker-totals.js +1 -1
- package/dist/src/step-bridge.d.ts +20 -0
- package/dist/src/steps/command-wait.d.ts +12 -0
- package/dist/src/steps/command-wait.js +26 -0
- package/dist/src/steps/open-decision-wait.d.ts +2 -0
- package/dist/src/steps/{decision-gate.js → open-decision-wait.js} +0 -7
- package/dist/src/steps/review-by-person.js +4 -1
- package/dist/src/steps/wait-for-command.d.ts +3 -0
- package/dist/src/steps/wait-for-command.js +17 -0
- package/dist/src/steps/wait-for-decision.js +1 -1
- package/dist/src/storage/command-wait-rows.d.ts +30 -0
- package/dist/src/storage/command-wait-rows.js +96 -0
- package/dist/src/storage/decision-snapshots.d.ts +8 -1
- package/dist/src/storage/decision-snapshots.js +15 -1
- package/dist/src/storage/domain-changes.d.ts +2 -0
- package/dist/src/storage/domain-changes.js +3 -0
- package/dist/src/storage/domain-schema.d.ts +13 -1
- package/dist/src/storage/domain-schema.js +31 -4
- package/dist/src/storage/effect-schema.d.ts +1 -0
- package/dist/src/storage/effect-schema.js +5 -0
- package/dist/src/testing-requests.d.ts +15 -0
- package/dist/src/testing-requests.js +93 -0
- package/dist/src/testing.d.ts +4 -10
- package/dist/src/testing.js +33 -86
- package/dist/src/worker-usage.d.ts +1 -0
- package/dist/src/worker-usage.js +3 -0
- package/dist/src/workflow-candidate.d.ts +1 -0
- package/dist/src/workflow-candidate.js +12 -1
- package/dist/src/workflow-contracts.d.ts +1 -0
- package/dist/src/workflow-contracts.js +9 -2
- package/dist/src/workflow-discovery.d.ts +2 -13
- package/dist/src/workflow-discovery.js +1 -13
- package/dist/src/workflow-refusals.js +0 -1
- package/dist/src/workflows.d.ts +1 -1
- package/dist/src/workflows.js +1 -1
- package/dist/tools/red-green-command.d.ts +1 -0
- package/dist/tools/red-green-command.js +174 -0
- package/dist/tools/red-green-process.d.ts +10 -0
- package/dist/tools/red-green-process.js +59 -0
- package/dist/tools/self-host-processes.d.ts +2 -0
- package/dist/tools/self-host-processes.js +32 -13
- package/dist/tools/self-host-project.js +13 -78
- package/dist/tools/self-host-runtime.js +1 -1
- package/dist/tools/self-host.js +42 -10
- package/dist/tools/template-command.d.ts +1 -0
- package/dist/tools/template-command.js +160 -0
- package/dist/tools/template-copy.d.ts +11 -0
- package/dist/tools/template-copy.js +130 -0
- package/dist/tools/template-files.d.ts +17 -0
- package/dist/tools/template-files.js +74 -0
- package/dist/tools/workflow-bundles.js +1 -0
- package/dist/tools/workflow-candidate-counts.js +2 -2
- package/dist/tools/workflow-candidate-shape.d.ts +3 -0
- package/dist/tools/workflow-candidate-shape.js +90 -0
- package/dist/tools/workflow-candidate-source.js +15 -1
- package/dist/tools/workflow-candidate-syntax.d.ts +2 -2
- package/dist/tools/workflow-candidate-syntax.js +24 -94
- package/dist/tools/workflow-command.js +1 -2
- package/dist/tools/workflow-folders.d.ts +2 -3
- package/dist/tools/workflow-folders.js +1 -1
- package/package.json +16 -8
- package/templates/develop/README.md +12 -0
- package/templates/develop/develop/flow-tests.ts +37 -0
- package/templates/develop/develop/pull.ts +5 -1
- package/templates/develop/develop/refusal-tests.ts +77 -0
- package/templates/develop/develop/turn.ts +2 -1
- package/templates/idea-to-issue/README.md +27 -0
- package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
- package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
- package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
- package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
- package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
- package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
- package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
- package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
- package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
- package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
- package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
- package/templates/idea-to-issue/idea-to-issue.ts +49 -0
- package/templates/idea-to-issue/template.json +81 -0
- package/templates/review-day/README.md +97 -0
- package/templates/review-day/review-day/critique.ts +58 -0
- package/templates/review-day/review-day/decision.ts +29 -0
- package/templates/review-day/review-day/facts.ts +69 -0
- package/templates/review-day/review-day/label.ts +29 -0
- package/templates/review-day/review-day/next.ts +28 -0
- package/templates/review-day/review-day/post.ts +27 -0
- package/templates/review-day/review-day/report.ts +98 -0
- package/templates/review-day/review-day/rules.ts +12 -0
- package/templates/review-day/review-day/scenarios.ts +76 -0
- package/templates/review-day/review-day/turn.ts +73 -0
- package/templates/review-day/review-day.declaration.json +16 -0
- package/templates/review-day/review-day.test.ts +362 -0
- package/templates/review-day/review-day.ts +37 -0
- package/templates/review-day/template.json +56 -0
- package/dist/src/cli/watch-start-view.d.ts +0 -18
- package/dist/src/cli/watch-start-view.js +0 -77
- package/dist/src/steps/decision-gate.d.ts +0 -3
- package/dist/workflows/develop-prd.d.ts +0 -7
- package/dist/workflows/develop-prd.js +0 -165
- package/dist/workflows/develop-ticket.d.ts +0 -9
- package/dist/workflows/develop-ticket.js +0 -207
- package/dist/workflows/issue-labels.d.ts +0 -16
- package/dist/workflows/issue-labels.js +0 -70
- package/dist/workflows/ticket-prompts.d.ts +0 -35
- package/dist/workflows/ticket-prompts.js +0 -147
package/dist/src/cli/client.d.ts
CHANGED
|
@@ -3,7 +3,10 @@ export interface Interruption {
|
|
|
3
3
|
readonly signal: Promise<void>;
|
|
4
4
|
readonly reply: Reply;
|
|
5
5
|
}
|
|
6
|
-
export
|
|
6
|
+
export interface ClientRequest extends ServiceRequest {
|
|
7
|
+
readonly signal?: AbortSignal;
|
|
8
|
+
}
|
|
9
|
+
export declare function send(runtimeDirectory: string, input: ClientRequest): Promise<Reply>;
|
|
7
10
|
export declare function listRuns(runtimeDirectory: string): Promise<Reply>;
|
|
8
11
|
export declare function mutate(runtimeDirectory: string, mutation: {
|
|
9
12
|
readonly request: ServiceRequest;
|
package/dist/src/cli/client.js
CHANGED
|
@@ -41,7 +41,7 @@ function exchange(context) {
|
|
|
41
41
|
error: { code: address.reason, detail: address.detail },
|
|
42
42
|
});
|
|
43
43
|
return new Promise((settle) => {
|
|
44
|
-
const socket = net.connect(address.path);
|
|
44
|
+
const socket = net.connect({ path: address.path, signal: context.signal });
|
|
45
45
|
let buffered = "";
|
|
46
46
|
let written = false;
|
|
47
47
|
socket.setEncoding("utf8");
|
|
@@ -86,8 +86,14 @@ function exchange(context) {
|
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
const unobserved = () => undefined;
|
|
89
|
-
export function send(runtimeDirectory,
|
|
90
|
-
|
|
89
|
+
export function send(runtimeDirectory, input) {
|
|
90
|
+
const { signal, ...request } = input;
|
|
91
|
+
return exchange({
|
|
92
|
+
runtimeDirectory,
|
|
93
|
+
request,
|
|
94
|
+
onEvent: unobserved,
|
|
95
|
+
...(signal === undefined ? {} : { signal }),
|
|
96
|
+
});
|
|
91
97
|
}
|
|
92
98
|
function listedRuns(result) {
|
|
93
99
|
const runs = result["runs"];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Fields, type Reply, type ServiceError, type ServiceRequest } from "../protocol.ts";
|
|
2
|
+
import { type ClientRequest } from "./client.ts";
|
|
3
|
+
export interface ReadCommand {
|
|
4
|
+
readonly kind: "status" | "questions" | "events";
|
|
5
|
+
readonly runId?: string | null;
|
|
6
|
+
readonly limit?: number | null;
|
|
7
|
+
readonly after?: string | number | null;
|
|
8
|
+
readonly follow?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function readCommandRequest(command: ReadCommand): ServiceRequest;
|
|
11
|
+
export declare function readCommandReply(runtimeDirectory: string, request: ClientRequest): Promise<Reply>;
|
|
12
|
+
export declare function errorObject(error: ServiceError, format?: {
|
|
13
|
+
readonly commandId?: string;
|
|
14
|
+
}): Fields;
|
|
15
|
+
export declare function commandJson(reply: Reply, format?: {
|
|
16
|
+
readonly commandId?: string;
|
|
17
|
+
}): Fields;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {} from "../protocol.js";
|
|
2
|
+
import { send } from "./client.js";
|
|
3
|
+
import { withCiReruns } from "./github-ci-progress.js";
|
|
4
|
+
import { statusJson } from "./render.js";
|
|
5
|
+
export function readCommandRequest(command) {
|
|
6
|
+
const { kind, runId, limit, after, follow } = command;
|
|
7
|
+
const parameters = kind === "questions"
|
|
8
|
+
? { runId }
|
|
9
|
+
: { runId, limit, after, ...(follow === undefined ? {} : { follow }) };
|
|
10
|
+
return {
|
|
11
|
+
operation: kind,
|
|
12
|
+
parameters: Object.fromEntries(Object.entries(parameters).filter(([, value]) => value !== null && value !== undefined)),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export async function readCommandReply(runtimeDirectory, request) {
|
|
16
|
+
const reply = await send(runtimeDirectory, request);
|
|
17
|
+
return request.operation === "status"
|
|
18
|
+
? await withCiReruns(runtimeDirectory, reply)
|
|
19
|
+
: reply;
|
|
20
|
+
}
|
|
21
|
+
export function errorObject(error, format = {}) {
|
|
22
|
+
if (error.code === "event-gap")
|
|
23
|
+
return {
|
|
24
|
+
schemaVersion: 1,
|
|
25
|
+
kind: "event-gap",
|
|
26
|
+
after: error["after"],
|
|
27
|
+
earliestAvailable: error["earliestAvailable"],
|
|
28
|
+
latestSequence: error["latestSequence"],
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
schemaVersion: 1,
|
|
32
|
+
kind: "error",
|
|
33
|
+
...error,
|
|
34
|
+
commandId: error["commandId"] ?? format.commandId ?? null,
|
|
35
|
+
runId: error["runId"] ?? null,
|
|
36
|
+
currentRevision: error["currentRevision"] ?? null,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function commandJson(reply, format = {}) {
|
|
40
|
+
return reply.kind === "error"
|
|
41
|
+
? errorObject(reply.error, format)
|
|
42
|
+
: statusJson(reply.result);
|
|
43
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Shown } from "./watch-element.ts";
|
|
2
|
+
import type { CommandWaitView } from "../authority/command-wait-view.ts";
|
|
3
|
+
export declare function shownCommandWaits(value: unknown): readonly CommandWaitView[];
|
|
4
|
+
export declare function commandWaitText(wait: CommandWaitView): string;
|
|
5
|
+
export declare function CommandWaits(props: {
|
|
6
|
+
readonly waits: readonly CommandWaitView[];
|
|
7
|
+
}): Shown;
|
|
8
|
+
export declare function effectBudgetText(spent: number | null | undefined, limit: number | null | undefined): string;
|
|
9
|
+
export declare function activeCommandWait(waits: readonly CommandWaitView[]): boolean;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { element } from "./watch-element.js";
|
|
2
|
+
import { record } from "../protocol.js";
|
|
3
|
+
function waitTime(value) {
|
|
4
|
+
return typeof value === "string" ? value : null;
|
|
5
|
+
}
|
|
6
|
+
export function shownCommandWaits(value) {
|
|
7
|
+
if (!Array.isArray(value))
|
|
8
|
+
return [];
|
|
9
|
+
return value.flatMap((entry) => {
|
|
10
|
+
const fields = record(entry);
|
|
11
|
+
if (typeof fields?.["name"] !== "string" ||
|
|
12
|
+
typeof fields["command"] !== "string" ||
|
|
13
|
+
typeof fields["state"] !== "string" ||
|
|
14
|
+
typeof fields["maximumWaitSeconds"] !== "number" ||
|
|
15
|
+
typeof fields["remainingSeconds"] !== "number" ||
|
|
16
|
+
typeof fields["checkCount"] !== "number")
|
|
17
|
+
return [];
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
name: fields["name"],
|
|
21
|
+
command: fields["command"],
|
|
22
|
+
state: fields["state"],
|
|
23
|
+
maximumWaitSeconds: fields["maximumWaitSeconds"],
|
|
24
|
+
remainingSeconds: fields["remainingSeconds"],
|
|
25
|
+
checkCount: fields["checkCount"],
|
|
26
|
+
startedAt: waitTime(fields["startedAt"]),
|
|
27
|
+
deadline: waitTime(fields["deadline"]),
|
|
28
|
+
nextCheckAt: waitTime(fields["nextCheckAt"]),
|
|
29
|
+
reason: waitTime(fields["reason"]),
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function commandWaitText(wait) {
|
|
35
|
+
const reason = wait.reason === null ? "" : ` · ${wait.reason}`;
|
|
36
|
+
return `Command wait ${wait.name} · ${wait.command} · ${wait.state} · ${String(wait.remainingSeconds)} s left · deadline ${wait.deadline ?? "none"} · next check ${wait.nextCheckAt ?? "none"} · checks ${String(wait.checkCount)}${reason}`;
|
|
37
|
+
}
|
|
38
|
+
export function CommandWaits(props) {
|
|
39
|
+
return props.waits.map((wait) => element("p", {
|
|
40
|
+
class: "meta command-wait",
|
|
41
|
+
children: commandWaitText(wait),
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
export function effectBudgetText(spent, limit) {
|
|
45
|
+
return spent == null || limit == null
|
|
46
|
+
? ""
|
|
47
|
+
: `${String(spent)} of ${String(limit)} effect units`;
|
|
48
|
+
}
|
|
49
|
+
export function activeCommandWait(waits) {
|
|
50
|
+
return waits.some((wait) => wait.state === "waiting");
|
|
51
|
+
}
|
package/dist/src/cli/commands.js
CHANGED
|
@@ -1,30 +1,14 @@
|
|
|
1
|
+
import { commandJson, errorObject, readCommandReply, readCommandRequest, } from "./command-requests.js";
|
|
1
2
|
import { reportCommand } from "./report.js";
|
|
3
|
+
import { scheduleServiceRequest } from "./schedule-arguments.js";
|
|
2
4
|
import { withCiReruns } from "./github-ci-progress.js";
|
|
3
5
|
import { readFile } from "node:fs/promises";
|
|
4
6
|
import { resolve } from "node:path";
|
|
5
7
|
import { record, } from "../protocol.js";
|
|
6
8
|
import { follow, listRuns, mutate, send } from "./client.js";
|
|
7
|
-
import { errorText, eventText, pendingSummary, rendered, runOverview,
|
|
9
|
+
import { errorText, eventText, pendingSummary, rendered, runOverview, } from "./render.js";
|
|
8
10
|
import { commandUsage } from "./usage.js";
|
|
9
11
|
import { defaultWatchPort, watchServer } from "./watch-server.js";
|
|
10
|
-
function errorObject(error, format) {
|
|
11
|
-
if (error.code === "event-gap")
|
|
12
|
-
return {
|
|
13
|
-
schemaVersion: 1,
|
|
14
|
-
kind: "event-gap",
|
|
15
|
-
after: error["after"],
|
|
16
|
-
earliestAvailable: error["earliestAvailable"],
|
|
17
|
-
latestSequence: error["latestSequence"],
|
|
18
|
-
};
|
|
19
|
-
return {
|
|
20
|
-
schemaVersion: 1,
|
|
21
|
-
kind: "error",
|
|
22
|
-
...error,
|
|
23
|
-
commandId: error["commandId"] ?? format.commandId ?? null,
|
|
24
|
-
runId: error["runId"] ?? null,
|
|
25
|
-
currentRevision: error["currentRevision"] ?? null,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
12
|
function failed(environment, failure) {
|
|
29
13
|
const { terminal } = environment;
|
|
30
14
|
const shown = errorObject(failure.error, failure.format);
|
|
@@ -42,16 +26,14 @@ function presented(environment, outcome) {
|
|
|
42
26
|
if (reply.kind === "error")
|
|
43
27
|
return failed(environment, { error: reply.error, format });
|
|
44
28
|
environment.terminal.out(format.json
|
|
45
|
-
? `${JSON.stringify(
|
|
29
|
+
? `${JSON.stringify(commandJson(reply))}\n`
|
|
46
30
|
: rendered(reply.result));
|
|
47
31
|
return 0;
|
|
48
32
|
}
|
|
49
33
|
async function requested(environment, exchange) {
|
|
50
|
-
const reply = await
|
|
34
|
+
const reply = await readCommandReply(environment.runtimeDirectory, exchange.request);
|
|
51
35
|
return presented(environment, {
|
|
52
|
-
reply
|
|
53
|
-
? await withCiReruns(environment.runtimeDirectory, reply)
|
|
54
|
-
: reply,
|
|
36
|
+
reply,
|
|
55
37
|
format: exchange.format,
|
|
56
38
|
});
|
|
57
39
|
}
|
|
@@ -153,10 +135,7 @@ async function status(environment, invocation) {
|
|
|
153
135
|
}
|
|
154
136
|
return requested(environment, {
|
|
155
137
|
format: { json },
|
|
156
|
-
request:
|
|
157
|
-
operation: "status",
|
|
158
|
-
parameters: present({ runId, limit, after }),
|
|
159
|
-
},
|
|
138
|
+
request: readCommandRequest(invocation),
|
|
160
139
|
});
|
|
161
140
|
}
|
|
162
141
|
function decision(environment, invocation) {
|
|
@@ -200,15 +179,7 @@ async function events(environment, invocation) {
|
|
|
200
179
|
const print = (event) => {
|
|
201
180
|
terminal.out(json ? `${JSON.stringify(event)}\n` : `${eventText(event)}\n`);
|
|
202
181
|
};
|
|
203
|
-
const request =
|
|
204
|
-
operation: "events",
|
|
205
|
-
parameters: present({
|
|
206
|
-
runId: invocation.runId,
|
|
207
|
-
after: invocation.after,
|
|
208
|
-
limit: invocation.limit,
|
|
209
|
-
follow: following,
|
|
210
|
-
}),
|
|
211
|
-
};
|
|
182
|
+
const request = readCommandRequest(invocation);
|
|
212
183
|
const reply = following
|
|
213
184
|
? await follow(environment.runtimeDirectory, {
|
|
214
185
|
request,
|
|
@@ -240,6 +211,11 @@ export function runtimeCommand(invocation, environment) {
|
|
|
240
211
|
return located(invocation, { ...environment, runtimeDirectory });
|
|
241
212
|
}
|
|
242
213
|
function located(invocation, environment) {
|
|
214
|
+
if (invocation.kind === "schedule")
|
|
215
|
+
return requested(environment, {
|
|
216
|
+
format: { json: invocation.json },
|
|
217
|
+
request: scheduleServiceRequest(invocation),
|
|
218
|
+
});
|
|
243
219
|
if (invocation.kind === "report")
|
|
244
220
|
return reportCommand(invocation, environment);
|
|
245
221
|
if (invocation.kind === "run")
|
|
@@ -256,10 +232,7 @@ function located(invocation, environment) {
|
|
|
256
232
|
return watch(environment, invocation);
|
|
257
233
|
return requested(environment, {
|
|
258
234
|
format: { json: invocation.json },
|
|
259
|
-
request:
|
|
260
|
-
operation: "questions",
|
|
261
|
-
parameters: present({ runId: invocation.runId }),
|
|
262
|
-
},
|
|
235
|
+
request: readCommandRequest(invocation),
|
|
263
236
|
});
|
|
264
237
|
}
|
|
265
238
|
function watch(environment, invocation) {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type SettingChange } from "../configuration-change.ts";
|
|
1
|
+
import { type SettingChange, type HarnessChange } from "../configuration-change.ts";
|
|
2
2
|
export declare function readConfigFile(path: string): Promise<string | undefined>;
|
|
3
|
-
export declare function changeConfigFile(path: string, change: SettingChange): Promise<void>;
|
|
3
|
+
export declare function changeConfigFile(path: string, change: SettingChange | HarnessChange): Promise<void>;
|
|
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { chmod, mkdir, readFile, rename, rm, stat, writeFile, } from "node:fs/promises";
|
|
3
3
|
import { dirname } from "node:path";
|
|
4
4
|
import { acquireSettingsLock, releaseSettingsLock } from "./config-lock.js";
|
|
5
|
-
import { changedConfiguration, } from "../configuration-change.js";
|
|
5
|
+
import { changedConfiguration, selectedHarnessConfiguration, } from "../configuration-change.js";
|
|
6
6
|
export async function readConfigFile(path) {
|
|
7
7
|
try {
|
|
8
8
|
return await readFile(path, "utf8");
|
|
@@ -38,7 +38,9 @@ export async function changeConfigFile(path, change) {
|
|
|
38
38
|
}
|
|
39
39
|
async function writeChange(path, change) {
|
|
40
40
|
const previous = await readConfigFile(path);
|
|
41
|
-
const next =
|
|
41
|
+
const next = "harness" in change
|
|
42
|
+
? selectedHarnessConfiguration(previous, change.harness)
|
|
43
|
+
: changedConfiguration(previous, change);
|
|
42
44
|
const mode = previous !== undefined && change.scope === "project"
|
|
43
45
|
? (await stat(path)).mode & 0o777
|
|
44
46
|
: 0o600;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import type { DoctorWorkflow } from "../doctor-report.ts";
|
|
2
|
-
export declare
|
|
1
|
+
import type { DoctorObservation, DoctorWorkflow } from "../doctor-report.ts";
|
|
2
|
+
export declare function workflowObservation(context: {
|
|
3
|
+
readonly workflows: readonly DoctorWorkflow[];
|
|
4
|
+
readonly prerequisite: string | undefined;
|
|
5
|
+
}): DoctorObservation;
|
|
3
6
|
export declare function doctorWorkflows(repository: string, environment: Readonly<NodeJS.ProcessEnv>): Promise<readonly DoctorWorkflow[]>;
|
|
@@ -3,12 +3,17 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { configurationRoot, absoluteWorkflowFolder, } from "../project-settings.js";
|
|
5
5
|
import { isCandidateDeclaration } from "../workflow-candidate.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
export function workflowObservation(context) {
|
|
7
|
+
if (context.prerequisite !== undefined)
|
|
8
|
+
return { result: "skip", detail: context.prerequisite };
|
|
9
|
+
const found = context.workflows.length > 0;
|
|
10
|
+
return {
|
|
11
|
+
result: found ? "ok" : "fail",
|
|
12
|
+
detail: found
|
|
13
|
+
? "Project or user workflow found"
|
|
14
|
+
: "No project or user workflow",
|
|
15
|
+
};
|
|
16
|
+
}
|
|
12
17
|
export async function doctorWorkflows(repository, environment) {
|
|
13
18
|
const discovered = [];
|
|
14
19
|
for (const [scope, folder] of [
|
|
@@ -41,5 +46,5 @@ export async function doctorWorkflows(repository, environment) {
|
|
|
41
46
|
discovered.push({ scope, ...declaration.workflow });
|
|
42
47
|
}
|
|
43
48
|
}
|
|
44
|
-
return
|
|
49
|
+
return discovered;
|
|
45
50
|
}
|
package/dist/src/cli/doctor.js
CHANGED
|
@@ -3,7 +3,7 @@ import { dirname, delimiter, join } from "node:path";
|
|
|
3
3
|
import { doctorCodes, doctorExitCode, doctorFixes, requiredDoctorCodes, } from "../doctor-report.js";
|
|
4
4
|
import { privateSettingsPath, projectSettings } from "./project-settings.js";
|
|
5
5
|
import { githubObservations } from "./doctor-github.js";
|
|
6
|
-
import {
|
|
6
|
+
import { doctorWorkflows, workflowObservation } from "./doctor-workflows.js";
|
|
7
7
|
import { runtimeObservation, serviceObservation } from "./doctor-runtime.js";
|
|
8
8
|
import { harnessObservations } from "./doctor-harness.js";
|
|
9
9
|
import { commandObservation, nodeObservation, privateTextsObservation, queueObservation, } from "./doctor-local.js";
|
|
@@ -40,7 +40,7 @@ export async function doctorReport(options) {
|
|
|
40
40
|
const found = repository === undefined
|
|
41
41
|
? {
|
|
42
42
|
observations: {},
|
|
43
|
-
required: requiredDoctorCodes([]
|
|
43
|
+
required: requiredDoctorCodes([]),
|
|
44
44
|
}
|
|
45
45
|
: await repositoryObservations({ ...options, repository });
|
|
46
46
|
const git = repository === undefined
|
|
@@ -94,18 +94,15 @@ async function repositoryObservations(options) {
|
|
|
94
94
|
settingsValid,
|
|
95
95
|
environment,
|
|
96
96
|
});
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
? environment["CLOVING_QUEUE_SECONDS"]
|
|
100
|
-
: undefined,
|
|
101
|
-
});
|
|
97
|
+
observations["no-workflow"] = workflowObservation(workflowContext);
|
|
98
|
+
const required = requiredDoctorCodes(workflowContext.workflows);
|
|
102
99
|
const dependent = await configuredObservations({ ...options, environment }, { prerequisite: workflowContext.prerequisite, project, serviceEnvironment });
|
|
103
100
|
return { observations: { ...observations, ...dependent }, required };
|
|
104
101
|
}
|
|
105
102
|
async function workflowRequirements(repository, context) {
|
|
106
103
|
if (!context.settingsValid)
|
|
107
104
|
return {
|
|
108
|
-
workflows:
|
|
105
|
+
workflows: [],
|
|
109
106
|
prerequisite: "Settings files are invalid",
|
|
110
107
|
};
|
|
111
108
|
try {
|
|
@@ -116,7 +113,7 @@ async function workflowRequirements(repository, context) {
|
|
|
116
113
|
}
|
|
117
114
|
catch (error) {
|
|
118
115
|
return {
|
|
119
|
-
workflows:
|
|
116
|
+
workflows: [],
|
|
120
117
|
prerequisite: `Workflow requirements unavailable: ${error instanceof Error ? error.message : "discovery failed"}`,
|
|
121
118
|
};
|
|
122
119
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { ProbeRunner } from "./probe-command.ts";
|
|
2
|
+
import { type ShellMode } from "../agent-harness-shell.ts";
|
|
2
3
|
export interface HarnessEntry {
|
|
3
4
|
readonly name: string;
|
|
4
5
|
readonly kind: "file" | "shell";
|
|
5
6
|
readonly path: string;
|
|
7
|
+
readonly shellMode?: ShellMode;
|
|
6
8
|
readonly version: string | null;
|
|
7
9
|
readonly working: boolean;
|
|
8
10
|
readonly reason: string | null;
|
|
@@ -87,7 +87,7 @@ async function probeShell(candidate, context) {
|
|
|
87
87
|
env,
|
|
88
88
|
});
|
|
89
89
|
const stdout = shellBlock(output.stdout, 0);
|
|
90
|
-
return probeEntry({ name, kind, path }, {
|
|
90
|
+
return probeEntry({ name, kind, path, ...(kind === "shell" ? { shellMode: mode } : {}) }, {
|
|
91
91
|
stdout: stdout ?? "",
|
|
92
92
|
reason: output.reason ?? (stdout === null ? "shell-protocol" : null),
|
|
93
93
|
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
function harnessProcesses(identifier, effects) {
|
|
2
|
+
let snapshot;
|
|
3
|
+
try {
|
|
4
|
+
snapshot = effects.snapshot();
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
return [identifier];
|
|
8
|
+
}
|
|
9
|
+
const rows = snapshot
|
|
10
|
+
.trim()
|
|
11
|
+
.split("\n")
|
|
12
|
+
.map((row) => row.trim().split(/\s+/).map(Number));
|
|
13
|
+
const identifiers = [identifier];
|
|
14
|
+
for (let index = 0; index < identifiers.length; index++) {
|
|
15
|
+
for (const [child, parent] of rows) {
|
|
16
|
+
if (parent === identifiers[index] && child !== undefined && child > 0)
|
|
17
|
+
identifiers.push(child);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return identifiers;
|
|
21
|
+
}
|
|
22
|
+
export function terminateHarness(identifier, effects) {
|
|
23
|
+
if (identifier === undefined)
|
|
24
|
+
return;
|
|
25
|
+
for (const target of harnessProcesses(identifier, effects).reverse()) {
|
|
26
|
+
try {
|
|
27
|
+
effects.kill(target, "SIGTERM");
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (!(error instanceof Error) ||
|
|
31
|
+
!("code" in error) ||
|
|
32
|
+
error.code !== "ESRCH")
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type HarnessStartRequest } from "../harness-start.ts";
|
|
2
|
+
import type { ProbeRunner } from "./probe-command.ts";
|
|
3
|
+
export declare function initCommand(context: {
|
|
4
|
+
readonly repository: string | undefined;
|
|
5
|
+
readonly environment: Readonly<NodeJS.ProcessEnv>;
|
|
6
|
+
readonly probe: ProbeRunner;
|
|
7
|
+
readonly harness: string | undefined;
|
|
8
|
+
readonly start: (request: HarnessStartRequest) => Promise<number | null>;
|
|
9
|
+
}): Promise<number>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { harnessStartRequest, } from "../harness-start.js";
|
|
3
|
+
import { changeConfigFile } from "./config-file.js";
|
|
4
|
+
import { chooseHarness, selectedHarness } from "./init-selection.js";
|
|
5
|
+
import { privateSettingsPath, projectSettings } from "./project-settings.js";
|
|
6
|
+
export async function initCommand(context) {
|
|
7
|
+
if (context.repository === undefined) {
|
|
8
|
+
process.stderr.write("not-a-repository: run git init.\n");
|
|
9
|
+
return 1;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const entry = context.harness === undefined
|
|
13
|
+
? await promptHarness({ ...context, repository: context.repository })
|
|
14
|
+
: await selectedHarness(context.harness, context);
|
|
15
|
+
await changeConfigFile(privateSettingsPath(context.environment, context.repository), {
|
|
16
|
+
harness: { name: entry.name, kind: entry.kind, path: entry.path },
|
|
17
|
+
scope: "private",
|
|
18
|
+
});
|
|
19
|
+
const request = harnessStartRequest(entry, {
|
|
20
|
+
repository: context.repository,
|
|
21
|
+
environment: context.environment,
|
|
22
|
+
message: "run `cloving init-prompt`",
|
|
23
|
+
});
|
|
24
|
+
const status = await context.start(request);
|
|
25
|
+
if (status !== null)
|
|
26
|
+
return status;
|
|
27
|
+
process.stderr.write("Open your agent in this repository and tell it: run `cloving init-prompt`.\n");
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
process.stderr.write((error instanceof Error ? error.message : "init-failed") + "\n");
|
|
32
|
+
return 2;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function promptHarness(context) {
|
|
36
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
37
|
+
throw new Error("harness-not-selected");
|
|
38
|
+
const terminal = createInterface({
|
|
39
|
+
input: process.stdin,
|
|
40
|
+
output: process.stdout,
|
|
41
|
+
});
|
|
42
|
+
try {
|
|
43
|
+
return await chooseHarness({
|
|
44
|
+
...context,
|
|
45
|
+
current: projectSettings(context.environment, context.repository).harness,
|
|
46
|
+
question: (text) => terminal.question(text),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
terminal.close();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type InitPromptFacts } from "./init-prompt.ts";
|
|
2
|
+
import type { ProbeRunner } from "./probe-command.ts";
|
|
3
|
+
interface PromptContext {
|
|
4
|
+
readonly repository: string | undefined;
|
|
5
|
+
readonly environment: Readonly<NodeJS.ProcessEnv>;
|
|
6
|
+
readonly probe: ProbeRunner;
|
|
7
|
+
}
|
|
8
|
+
export declare function initPromptFacts(context: PromptContext): Promise<InitPromptFacts>;
|
|
9
|
+
export declare function initPromptCommand(context: PromptContext): Promise<number>;
|
|
10
|
+
export {};
|