cloving 1.1.0 → 1.3.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 +584 -144
- package/assets/watch-fonts/fira-code-OFL.md +93 -0
- package/assets/watch-fonts/fira-code-latin-400-normal.woff2 +0 -0
- package/assets/watch-fonts/fira-code-latin-500-normal.woff2 +0 -0
- package/assets/watch-fonts/heebo-OFL.md +93 -0
- package/assets/watch-fonts/heebo-latin-500-normal.woff2 +0 -0
- package/assets/watch-fonts/heebo-latin-700-normal.woff2 +0 -0
- package/assets/watch-fonts/heebo-latin-800-normal.woff2 +0 -0
- package/assets/watch-fonts/manifest.json +112 -0
- package/assets/watch-fonts/space-grotesk-OFL.md +93 -0
- package/assets/watch-fonts/space-grotesk-latin-400-normal.woff2 +0 -0
- package/assets/watch-fonts/space-grotesk-latin-500-normal.woff2 +0 -0
- package/assets/watch-fonts/space-grotesk-latin-600-normal.woff2 +0 -0
- package/assets/watch-fonts/space-grotesk-latin-700-normal.woff2 +0 -0
- package/dist/src/agent-harness-shell.d.ts +12 -0
- package/dist/src/agent-harness-shell.js +90 -0
- package/dist/src/agent-harness-versions.d.ts +8 -0
- package/dist/src/agent-harness-versions.js +49 -0
- package/dist/src/agent-harnesses.d.ts +4 -0
- package/dist/src/agent-harnesses.js +13 -0
- package/dist/src/authority/commands.d.ts +2 -0
- package/dist/src/authority/commands.js +49 -8
- package/dist/src/authority/dispatch-decision.d.ts +1 -0
- package/dist/src/authority/dispatch-decision.js +7 -4
- package/dist/src/authority/events.js +2 -2
- package/dist/src/authority/gate-reduction.d.ts +1 -0
- package/dist/src/authority/gate-reduction.js +18 -3
- package/dist/src/authority/gates.d.ts +2 -1
- package/dist/src/authority/gates.js +5 -1
- package/dist/src/authority/handoff-chain.d.ts +24 -0
- package/dist/src/authority/handoff-chain.js +46 -0
- package/dist/src/authority/operations.js +1 -1
- package/dist/src/authority/reconciliation.d.ts +1 -0
- package/dist/src/authority/reconciliation.js +18 -11
- package/dist/src/authority/reduction.d.ts +1 -1
- package/dist/src/authority/reduction.js +6 -1
- package/dist/src/authority/status-input.d.ts +1 -1
- package/dist/src/authority/status.d.ts +1 -0
- package/dist/src/authority/status.js +27 -3
- package/dist/src/authority/transitions.d.ts +5 -5
- package/dist/src/authority/transitions.js +9 -0
- package/dist/src/broker/actor/authority-delivery.js +1 -0
- package/dist/src/broker/actor/authority-queries.d.ts +11 -1
- package/dist/src/broker/actor/authority-queries.js +67 -3
- package/dist/src/broker/actor/authority-receipts.js +11 -1
- package/dist/src/broker/actor/authority-session.js +2 -2
- package/dist/src/broker/actor/authority-settings.js +4 -0
- package/dist/src/broker/actor/delivery-intents.d.ts +3 -1
- package/dist/src/broker/actor/delivery-intents.js +4 -4
- package/dist/src/broker/actor/effect-delivery.js +13 -1
- package/dist/src/broker/actor/effect-queries.d.ts +1 -0
- package/dist/src/broker/actor/effect-queries.js +7 -0
- package/dist/src/broker/actor/pin-check.js +1 -1
- package/dist/src/broker/actor/stop-plan.js +1 -1
- package/dist/src/broker/actor/turn-state.js +1 -1
- package/dist/src/broker/authority-admission.js +26 -5
- package/dist/src/broker/authority-restore.js +1 -0
- package/dist/src/broker/decision-restore.js +4 -4
- package/dist/src/broker/socket-address.d.ts +3 -1
- package/dist/src/broker/socket-address.js +2 -2
- package/dist/src/cli/arguments.d.ts +11 -13
- package/dist/src/cli/arguments.js +37 -107
- package/dist/src/cli/command-effects.d.ts +7 -0
- package/dist/src/cli/command-effects.js +39 -0
- package/dist/src/cli/commands.js +11 -4
- package/dist/src/cli/config-arguments.d.ts +11 -0
- package/dist/src/cli/config-arguments.js +59 -0
- package/dist/src/cli/config-command.d.ts +2 -0
- package/dist/src/cli/config-command.js +105 -0
- package/dist/src/cli/config-file.d.ts +3 -0
- package/dist/src/cli/config-file.js +50 -0
- package/dist/src/cli/config-lock.d.ts +7 -0
- package/dist/src/cli/config-lock.js +61 -0
- package/dist/src/cli/config-notice.d.ts +5 -0
- package/dist/src/cli/config-notice.js +46 -0
- package/dist/src/cli/doctor-github.d.ts +9 -0
- package/dist/src/cli/doctor-github.js +138 -0
- package/dist/src/cli/doctor-harness.d.ts +13 -0
- package/dist/src/cli/doctor-harness.js +242 -0
- package/dist/src/cli/doctor-local.d.ts +18 -0
- package/dist/src/cli/doctor-local.js +77 -0
- package/dist/src/cli/doctor-runtime.d.ts +15 -0
- package/dist/src/cli/doctor-runtime.js +176 -0
- package/dist/src/cli/doctor-service.d.ts +1 -0
- package/dist/src/cli/doctor-service.js +11 -0
- package/dist/src/cli/doctor-workflows.d.ts +3 -0
- package/dist/src/cli/doctor-workflows.js +45 -0
- package/dist/src/cli/doctor.d.ts +15 -0
- package/dist/src/cli/doctor.js +190 -0
- package/dist/src/cli/github-ci-progress.d.ts +8 -0
- package/dist/src/cli/github-ci-progress.js +83 -0
- package/dist/src/cli/github-retry.d.ts +6 -0
- package/dist/src/cli/github-retry.js +47 -0
- package/dist/src/cli/harness-probes.d.ts +22 -0
- package/dist/src/cli/harness-probes.js +183 -0
- package/dist/src/cli/main.d.ts +7 -1
- package/dist/src/cli/main.js +39 -61
- package/dist/src/cli/phone-arguments.d.ts +14 -0
- package/dist/src/cli/phone-arguments.js +37 -0
- package/dist/src/cli/phone-client.d.ts +2 -0
- package/dist/src/cli/phone-client.js +32 -0
- package/dist/src/cli/phone-command.d.ts +13 -0
- package/dist/src/cli/phone-command.js +101 -0
- package/dist/src/cli/probe-command.d.ts +36 -0
- package/dist/src/cli/probe-command.js +59 -0
- package/dist/src/cli/project-settings.d.ts +4 -0
- package/dist/src/cli/project-settings.js +33 -0
- package/dist/src/cli/render.d.ts +3 -1
- package/dist/src/cli/render.js +102 -39
- package/dist/src/cli/report-github.d.ts +18 -0
- package/dist/src/cli/report-github.js +200 -0
- package/dist/src/cli/report.d.ts +17 -0
- package/dist/src/cli/report.js +192 -0
- package/dist/src/cli/repository-arguments.d.ts +5 -0
- package/dist/src/cli/repository-arguments.js +34 -0
- package/dist/src/cli/runtime-arguments.d.ts +4 -0
- package/dist/src/cli/runtime-arguments.js +15 -0
- package/dist/src/cli/runtime-directory.d.ts +6 -2
- package/dist/src/cli/runtime-directory.js +72 -14
- package/dist/src/cli/toolchain.d.ts +2 -0
- package/dist/src/cli/toolchain.js +22 -2
- package/dist/src/cli/usage-render.d.ts +5 -0
- package/dist/src/cli/usage-render.js +40 -1
- package/dist/src/cli/usage.d.ts +3 -3
- package/dist/src/cli/usage.js +74 -45
- package/dist/src/cli/watch-actions.d.ts +2 -0
- package/dist/src/cli/watch-actions.js +4 -4
- package/dist/src/cli/watch-board-view.d.ts +12 -1
- package/dist/src/cli/watch-board-view.js +64 -12
- package/dist/src/cli/watch-board.d.ts +7 -1
- package/dist/src/cli/watch-board.js +61 -16
- package/dist/src/cli/watch-card-forms.js +2 -2
- package/dist/src/cli/watch-client.d.ts +1 -1
- package/dist/src/cli/watch-client.js +12 -3
- package/dist/src/cli/watch-header-view.d.ts +27 -0
- package/dist/src/cli/watch-header-view.js +116 -0
- package/dist/src/cli/watch-model.d.ts +10 -4
- package/dist/src/cli/watch-model.js +49 -59
- package/dist/src/cli/watch-page.js +67 -14
- package/dist/src/cli/watch-phases.js +3 -3
- package/dist/src/cli/watch-phone-client.d.ts +1 -0
- package/dist/src/cli/watch-phone-client.js +84 -0
- package/dist/src/cli/watch-phone-view.d.ts +56 -0
- package/dist/src/cli/watch-phone-view.js +113 -0
- package/dist/src/cli/watch-phone.d.ts +5 -0
- package/dist/src/cli/watch-phone.js +53 -0
- package/dist/src/cli/watch-pr-command.d.ts +5 -2
- package/dist/src/cli/watch-pr-command.js +41 -4
- package/dist/src/cli/watch-pr-identity.d.ts +14 -2
- package/dist/src/cli/watch-pr-identity.js +25 -0
- package/dist/src/cli/watch-pr-observer.d.ts +1 -0
- package/dist/src/cli/watch-pr-observer.js +48 -6
- package/dist/src/cli/watch-pull-request.d.ts +12 -0
- package/dist/src/cli/watch-pull-request.js +134 -0
- package/dist/src/cli/watch-reads.d.ts +7 -1
- package/dist/src/cli/watch-reads.js +42 -20
- package/dist/src/cli/watch-render.d.ts +23 -2
- package/dist/src/cli/watch-render.js +2 -1
- package/dist/src/cli/watch-server.js +56 -7
- package/dist/src/cli/watch-turn.d.ts +4 -1
- package/dist/src/cli/watch-turn.js +38 -2
- package/dist/src/cli/watch-usage.js +5 -1
- package/dist/src/cli/watch-view.d.ts +10 -17
- package/dist/src/cli/watch-view.js +33 -77
- package/dist/src/cli.js +106 -23
- package/dist/src/command-settings.d.ts +16 -0
- package/dist/src/command-settings.js +42 -0
- package/dist/src/configuration-change.d.ts +11 -0
- package/dist/src/configuration-change.js +62 -0
- package/dist/src/configuration-display.d.ts +21 -0
- package/dist/src/configuration-display.js +69 -0
- package/dist/src/configuration-schema.d.ts +49 -0
- package/dist/src/configuration-schema.js +159 -0
- package/dist/src/daemon/claude-turn.d.ts +20 -5
- package/dist/src/daemon/claude-turn.js +116 -53
- package/dist/src/daemon/claude-worker.d.ts +3 -5
- package/dist/src/daemon/claude-worker.js +64 -80
- package/dist/src/daemon/command-journal.d.ts +5 -0
- package/dist/src/daemon/command-journal.js +50 -0
- package/dist/src/daemon/command-process.d.ts +28 -0
- package/dist/src/daemon/command-process.js +164 -0
- package/dist/src/daemon/command-worker.d.ts +19 -0
- package/dist/src/daemon/command-worker.js +182 -0
- package/dist/src/daemon/cursor-stream.d.ts +4 -0
- package/dist/src/daemon/cursor-stream.js +154 -0
- package/dist/src/daemon/daemon-adapters.d.ts +58 -0
- package/dist/src/daemon/daemon-adapters.js +102 -0
- package/dist/src/daemon/daemon-loops.d.ts +14 -0
- package/dist/src/daemon/daemon-loops.js +39 -0
- package/dist/src/daemon/daemon.d.ts +3 -30
- package/dist/src/daemon/daemon.js +132 -110
- package/dist/src/daemon/declared-input.d.ts +3 -0
- package/dist/src/daemon/declared-input.js +9 -0
- package/dist/src/daemon/delivery-router.js +7 -1
- package/dist/src/daemon/gemini-stream.d.ts +4 -0
- package/dist/src/daemon/gemini-stream.js +129 -0
- package/dist/src/daemon/github-calls.d.ts +4 -0
- package/dist/src/daemon/github-calls.js +16 -7
- package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
- package/dist/src/daemon/github-ci-rerun.js +92 -0
- package/dist/src/daemon/github-ci.d.ts +6 -0
- package/dist/src/daemon/github-ci.js +251 -0
- package/dist/src/daemon/github-merge-call.d.ts +16 -0
- package/dist/src/daemon/github-merge-call.js +73 -0
- package/dist/src/daemon/github-merge.d.ts +3 -5
- package/dist/src/daemon/github-merge.js +59 -98
- package/dist/src/daemon/github-methods.d.ts +28 -0
- package/dist/src/daemon/github-methods.js +90 -16
- package/dist/src/daemon/github-operation.d.ts +3 -0
- package/dist/src/daemon/github-retry.d.ts +6 -0
- package/dist/src/daemon/github-retry.js +13 -0
- package/dist/src/daemon/github-ticket-status.js +27 -1
- package/dist/src/daemon/github-worker.js +2 -1
- package/dist/src/daemon/handoff-worker.d.ts +10 -0
- package/dist/src/daemon/handoff-worker.js +232 -0
- package/dist/src/daemon/issue-queue.d.ts +2 -0
- package/dist/src/daemon/issue-queue.js +92 -63
- package/dist/src/daemon/notify-journal.d.ts +18 -0
- package/dist/src/daemon/notify-journal.js +108 -0
- package/dist/src/daemon/notify-message.js +2 -1
- package/dist/src/daemon/notify.js +177 -37
- package/dist/src/daemon/opencode-stream.d.ts +5 -0
- package/dist/src/daemon/opencode-stream.js +87 -0
- package/dist/src/daemon/queue-status.d.ts +4 -0
- package/dist/src/daemon/queue-status.js +38 -0
- package/dist/src/daemon/retry-worktree.d.ts +18 -0
- package/dist/src/daemon/retry-worktree.js +139 -0
- package/dist/src/daemon/retrying-turn.d.ts +5 -0
- package/dist/src/daemon/retrying-turn.js +145 -21
- package/dist/src/daemon/schedule-journal.d.ts +19 -0
- package/dist/src/daemon/schedule-journal.js +57 -0
- package/dist/src/daemon/text-output.d.ts +18 -0
- package/dist/src/daemon/text-output.js +44 -0
- package/dist/src/daemon/ticket-dependency-waits.d.ts +18 -0
- package/dist/src/daemon/ticket-dependency-waits.js +60 -0
- package/dist/src/daemon/ticket-registration.d.ts +10 -8
- package/dist/src/daemon/ticket-registration.js +146 -47
- package/dist/src/daemon/ticket-source.d.ts +4 -1
- package/dist/src/daemon/ticket-source.js +8 -2
- package/dist/src/daemon/turn-command.d.ts +10 -0
- package/dist/src/daemon/turn-command.js +33 -0
- package/dist/src/daemon/turn-report.d.ts +18 -0
- package/dist/src/daemon/turn-report.js +79 -0
- package/dist/src/daemon/work-tree.d.ts +2 -1
- package/dist/src/daemon/work-tree.js +15 -12
- package/dist/src/daemon/workflow-generations.d.ts +32 -0
- package/dist/src/daemon/workflow-generations.js +57 -0
- package/dist/src/daemon/workflow-replay.d.ts +16 -0
- package/dist/src/daemon/workflow-replay.js +58 -0
- package/dist/src/daemon/workflow-schedules.d.ts +27 -0
- package/dist/src/daemon/workflow-schedules.js +185 -0
- package/dist/src/decision-visibility.d.ts +2 -0
- package/dist/src/decision-visibility.js +10 -0
- package/dist/src/decision-wait.d.ts +1 -0
- package/dist/src/decision-wait.js +3 -0
- package/dist/src/delivery-backoff.d.ts +1 -0
- package/dist/src/delivery-backoff.js +3 -0
- package/dist/src/doctor-report.d.ts +24 -0
- package/dist/src/doctor-report.js +70 -0
- package/dist/src/execution-pin.d.ts +9 -0
- package/dist/src/execution-pin.js +86 -2
- package/dist/src/grok-result.d.ts +12 -0
- package/dist/src/grok-result.js +61 -0
- package/dist/src/harness-defaults.d.ts +35 -0
- package/dist/src/harness-defaults.js +121 -0
- package/dist/src/host/decision-resume.d.ts +35 -0
- package/dist/src/host/decision-resume.js +86 -0
- package/dist/src/host/gate-bridge.d.ts +48 -0
- package/dist/src/host/gate-bridge.js +124 -0
- package/dist/src/host/run-wait.d.ts +26 -0
- package/dist/src/host/run-wait.js +37 -0
- package/dist/src/host/start-delivery.d.ts +3 -2
- package/dist/src/host/start-delivery.js +11 -4
- package/dist/src/host/step-bridge-host.d.ts +6 -19
- package/dist/src/host/step-bridge-host.js +57 -55
- package/dist/src/host/world-reconciliation.d.ts +1 -0
- package/dist/src/host/world-reconciliation.js +3 -0
- package/dist/src/host/world-runs.js +5 -0
- package/dist/src/issue-identity.d.ts +6 -0
- package/dist/src/issue-identity.js +23 -0
- package/dist/src/merge-request.d.ts +19 -0
- package/dist/src/merge-request.js +32 -0
- package/dist/src/phone/canonical-json.d.ts +1 -0
- package/dist/src/phone/canonical-json.js +16 -0
- package/dist/src/phone/phone-link.d.ts +7 -0
- package/dist/src/phone/phone-link.js +21 -0
- package/dist/src/phone/qr-data.d.ts +8 -0
- package/dist/src/phone/qr-data.js +133 -0
- package/dist/src/phone/qr-matrix.d.ts +6 -0
- package/dist/src/phone/qr-matrix.js +175 -0
- package/dist/src/phone/qr-penalty.d.ts +3 -0
- package/dist/src/phone/qr-penalty.js +67 -0
- package/dist/src/phone/qr-picture.d.ts +5 -0
- package/dist/src/phone/qr-picture.js +24 -0
- package/dist/src/private-config.schema.json +263 -0
- package/dist/src/project-config.schema.json +65 -0
- package/dist/src/project-settings.d.ts +19 -0
- package/dist/src/project-settings.js +131 -0
- package/dist/src/relay/answer-check.d.ts +24 -0
- package/dist/src/relay/answer-check.js +145 -0
- package/dist/src/relay/answer-inbox.d.ts +15 -0
- package/dist/src/relay/answer-inbox.js +173 -0
- package/dist/src/relay/daemon-keys.d.ts +16 -0
- package/dist/src/relay/daemon-keys.js +75 -0
- package/dist/src/relay/decision-check.d.ts +3 -0
- package/dist/src/relay/decision-check.js +77 -0
- package/dist/src/relay/decision-close.d.ts +6 -0
- package/dist/src/relay/decision-close.js +72 -0
- package/dist/src/relay/decision-envelopes.d.ts +29 -0
- package/dist/src/relay/decision-envelopes.js +93 -0
- package/dist/src/relay/decision-watch.d.ts +14 -0
- package/dist/src/relay/decision-watch.js +68 -0
- package/dist/src/relay/envelope-post.d.ts +8 -0
- package/dist/src/relay/envelope-post.js +71 -0
- package/dist/src/relay/envelope.d.ts +28 -0
- package/dist/src/relay/envelope.js +53 -0
- package/dist/src/relay/hpke.d.ts +25 -0
- package/dist/src/relay/hpke.js +108 -0
- package/dist/src/relay/pairing-checks.d.ts +42 -0
- package/dist/src/relay/pairing-checks.js +172 -0
- package/dist/src/relay/pairing-follow.d.ts +8 -0
- package/dist/src/relay/pairing-follow.js +95 -0
- package/dist/src/relay/pairing-session.d.ts +29 -0
- package/dist/src/relay/pairing-session.js +87 -0
- package/dist/src/relay/phone-delivery.d.ts +51 -0
- package/dist/src/relay/phone-delivery.js +139 -0
- package/dist/src/relay/phone-devices.d.ts +36 -0
- package/dist/src/relay/phone-devices.js +46 -0
- package/dist/src/relay/phone-inbox.d.ts +18 -0
- package/dist/src/relay/phone-inbox.js +17 -0
- package/dist/src/relay/phone-operations.d.ts +18 -0
- package/dist/src/relay/phone-operations.js +121 -0
- package/dist/src/relay/phone-outbox.d.ts +21 -0
- package/dist/src/relay/phone-outbox.js +25 -0
- package/dist/src/relay/phone-socket.d.ts +6 -0
- package/dist/src/relay/phone-socket.js +63 -0
- package/dist/src/relay/relay-control.d.ts +7 -0
- package/dist/src/relay/relay-control.js +24 -0
- package/dist/src/relay/relay-files.d.ts +2 -0
- package/dist/src/relay/relay-files.js +23 -0
- package/dist/src/relay/relay-heartbeat.d.ts +17 -0
- package/dist/src/relay/relay-heartbeat.js +81 -0
- package/dist/src/relay/relay-http.d.ts +14 -0
- package/dist/src/relay/relay-http.js +63 -0
- package/dist/src/relay/relay-registration.d.ts +15 -0
- package/dist/src/relay/relay-registration.js +63 -0
- package/dist/src/relay/relay-service.d.ts +25 -0
- package/dist/src/relay/relay-service.js +216 -0
- package/dist/src/relay/relay-store.d.ts +48 -0
- package/dist/src/relay/relay-store.js +131 -0
- package/dist/src/relay/sealed-post.d.ts +25 -0
- package/dist/src/relay/sealed-post.js +52 -0
- package/dist/src/relay.d.ts +1 -0
- package/dist/src/relay.js +8 -0
- package/dist/src/report-statistics.d.ts +50 -0
- package/dist/src/report-statistics.js +70 -0
- package/dist/src/report.d.ts +171 -0
- package/dist/src/report.js +119 -0
- package/dist/src/repository-identity.d.ts +4 -0
- package/dist/src/repository-identity.js +4 -0
- package/dist/src/review-subject.d.ts +41 -0
- package/dist/src/review-subject.js +91 -0
- package/dist/src/run-wait.d.ts +23 -0
- package/dist/src/run-wait.js +20 -0
- package/dist/src/service/active-tickets.d.ts +4 -0
- package/dist/src/service/active-tickets.js +49 -0
- package/dist/src/service/command-effects.d.ts +4 -0
- package/dist/src/service/command-effects.js +16 -0
- package/dist/src/service/decision-handler.d.ts +4 -0
- package/dist/src/service/decision-handler.js +39 -4
- package/dist/src/service/gateway.js +18 -3
- package/dist/src/service/queue-runs.d.ts +3 -0
- package/dist/src/service/queue-runs.js +39 -0
- package/dist/src/service/registry.d.ts +22 -3
- package/dist/src/service/registry.js +51 -8
- package/dist/src/service/replies.d.ts +10 -0
- package/dist/src/service/replies.js +12 -0
- package/dist/src/service/run-handlers.js +45 -54
- package/dist/src/service/run-metadata.d.ts +8 -0
- package/dist/src/service/run-metadata.js +53 -0
- package/dist/src/service/run-waits.d.ts +3 -0
- package/dist/src/service/run-waits.js +41 -0
- package/dist/src/service/service.d.ts +21 -2
- package/dist/src/service/service.js +23 -5
- package/dist/src/service/submission-handler.js +70 -19
- package/dist/src/service/worker-port.d.ts +1 -0
- package/dist/src/service/worker-totals.js +10 -1
- package/dist/src/step-bridge.d.ts +32 -0
- package/dist/src/steps/decision-gate.d.ts +2 -1
- package/dist/src/steps/decision-gate.js +7 -0
- package/dist/src/steps/handoff.d.ts +2 -0
- package/dist/src/steps/handoff.js +13 -0
- package/dist/src/steps/merge-by-person.d.ts +2 -0
- package/dist/src/steps/merge-by-person.js +18 -0
- package/dist/src/steps/merge-when-green.d.ts +2 -0
- package/dist/src/steps/merge-when-green.js +62 -0
- package/dist/src/steps/review-by-agent.d.ts +5 -0
- package/dist/src/steps/review-by-agent.js +124 -0
- package/dist/src/steps/review-by-person.d.ts +4 -0
- package/dist/src/steps/review-by-person.js +16 -0
- package/dist/src/steps/review-subject.d.ts +2 -0
- package/dist/src/steps/review-subject.js +11 -0
- package/dist/src/steps/run-command.d.ts +2 -0
- package/dist/src/steps/run-command.js +15 -0
- package/dist/src/steps/sleep.d.ts +3 -0
- package/dist/src/steps/sleep.js +19 -0
- package/dist/src/steps/wait-for-decision.d.ts +2 -0
- package/dist/src/steps/wait-for-decision.js +71 -0
- package/dist/src/steps/wait-for-run.d.ts +5 -0
- package/dist/src/steps/wait-for-run.js +9 -0
- package/dist/src/storage/decision-snapshots.d.ts +1 -0
- package/dist/src/storage/decision-snapshots.js +7 -1
- package/dist/src/submission.d.ts +4 -0
- package/dist/src/submission.js +6 -2
- package/dist/src/testing.d.ts +29 -0
- package/dist/src/testing.js +264 -0
- package/dist/src/ticket-dependencies.d.ts +1 -0
- package/dist/src/ticket-dependencies.js +15 -0
- package/dist/src/ticket-status-stream.d.ts +9 -0
- package/dist/src/ticket-status-stream.js +94 -0
- package/dist/src/ticket-status.js +7 -4
- package/dist/src/token-prices.d.ts +14 -4
- package/dist/src/token-prices.js +56 -11
- package/dist/src/turn-profile.d.ts +1 -0
- package/dist/src/turn-profile.js +8 -1
- package/dist/src/worker-usage.d.ts +25 -0
- package/dist/src/worker-usage.js +58 -1
- package/dist/src/workflow-admission.d.ts +6 -0
- package/dist/src/workflow-candidate.d.ts +7 -2
- package/dist/src/workflow-candidate.js +48 -5
- package/dist/src/workflow-contracts.d.ts +2 -0
- package/dist/src/workflow-contracts.js +8 -3
- package/dist/src/workflow-declaration.d.ts +31 -2
- package/dist/src/workflow-declaration.js +140 -16
- package/dist/src/workflow-discovery.d.ts +19 -0
- package/dist/src/workflow-discovery.js +36 -0
- package/dist/src/workflow-refusals.d.ts +6 -0
- package/dist/src/workflow-refusals.js +42 -0
- package/dist/src/workflow-schedule.d.ts +22 -0
- package/dist/src/workflow-schedule.js +53 -0
- package/dist/src/workflows.d.ts +12 -1
- package/dist/src/workflows.js +9 -0
- package/dist/tools/admit-workflow.d.ts +14 -0
- package/dist/tools/admit-workflow.js +107 -0
- package/dist/tools/doctor-adoption.d.ts +1 -0
- package/dist/tools/doctor-adoption.js +11 -0
- package/dist/tools/project-configuration.d.ts +4 -0
- package/dist/tools/project-configuration.js +47 -0
- package/dist/tools/self-host-processes.d.ts +1 -0
- package/dist/tools/self-host-processes.js +33 -22
- package/dist/tools/self-host-project.d.ts +21 -0
- package/dist/tools/self-host-project.js +224 -0
- package/dist/tools/self-host-runtime.d.ts +16 -0
- package/dist/tools/self-host-runtime.js +60 -0
- package/dist/tools/self-host-workflows.d.ts +1 -0
- package/dist/tools/self-host-workflows.js +36 -1
- package/dist/tools/self-host.js +106 -135
- package/dist/tools/workflow-bundle-dependencies.d.ts +5 -0
- package/dist/tools/workflow-bundle-dependencies.js +93 -0
- package/dist/tools/workflow-bundles.d.ts +20 -0
- package/dist/tools/workflow-bundles.js +173 -0
- package/dist/tools/workflow-candidate-counts.d.ts +12 -0
- package/dist/tools/workflow-candidate-counts.js +266 -0
- package/dist/tools/workflow-candidate-fields.d.ts +5 -0
- package/dist/tools/workflow-candidate-fields.js +24 -0
- package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
- package/dist/tools/workflow-candidate-helper-counts.js +129 -0
- package/dist/tools/workflow-candidate-program.d.ts +13 -0
- package/dist/tools/workflow-candidate-program.js +106 -0
- package/dist/tools/workflow-candidate-source.d.ts +6 -0
- package/dist/tools/workflow-candidate-source.js +169 -0
- package/dist/tools/workflow-candidate-syntax.d.ts +21 -0
- package/dist/tools/workflow-candidate-syntax.js +263 -0
- package/dist/tools/workflow-command.d.ts +1 -0
- package/dist/tools/workflow-command.js +143 -0
- package/dist/tools/workflow-folder-capture.d.ts +18 -0
- package/dist/tools/workflow-folder-capture.js +261 -0
- package/dist/tools/workflow-folders.d.ts +49 -0
- package/dist/tools/workflow-folders.js +203 -0
- package/dist/tools/workflow-source-effects.d.ts +10 -0
- package/dist/tools/workflow-source-effects.js +213 -0
- package/dist/tools/workflow-test-hook.d.ts +7 -0
- package/dist/tools/workflow-test-hook.js +16 -0
- package/dist/tools/workflow-test-loader.d.ts +1 -0
- package/dist/tools/workflow-test-loader.js +10 -0
- package/dist/workflows/develop-prd.js +71 -3
- package/dist/workflows/develop-ticket.js +6 -1
- package/dist/workflows/ticket-prompts.js +17 -3
- package/package.json +66 -6
- package/templates/develop/README.md +78 -0
- package/templates/develop/develop/accept.ts +11 -0
- package/templates/develop/develop/flow-tests.ts +357 -0
- package/templates/develop/develop/local.ts +40 -0
- package/templates/develop/develop/option-tests.ts +174 -0
- package/templates/develop/develop/partial-choice.ts +29 -0
- package/templates/develop/develop/partial.ts +28 -0
- package/templates/develop/develop/pull.ts +152 -0
- package/templates/develop/develop/queue-partial.ts +39 -0
- package/templates/develop/develop/refusal-tests.ts +174 -0
- package/templates/develop/develop/report.ts +156 -0
- package/templates/develop/develop/round.ts +40 -0
- package/templates/develop/develop/scenarios.ts +87 -0
- package/templates/develop/develop/turn.ts +67 -0
- package/templates/develop/develop.declaration.json +24 -0
- package/templates/develop/develop.test.ts +287 -0
- package/templates/develop/develop.ts +30 -0
- package/templates/develop/template.json +153 -0
- package/dist/src/chats/analysis-batches.d.ts +0 -24
- package/dist/src/chats/analysis-batches.js +0 -83
- package/dist/src/chats/analysis-contract.d.ts +0 -80
- package/dist/src/chats/analysis-contract.js +0 -16
- package/dist/src/chats/analysis-data.d.ts +0 -3
- package/dist/src/chats/analysis-data.js +0 -85
- package/dist/src/chats/analysis-input.d.ts +0 -12
- package/dist/src/chats/analysis-input.js +0 -83
- package/dist/src/chats/analysis-links.d.ts +0 -2
- package/dist/src/chats/analysis-links.js +0 -25
- package/dist/src/chats/analysis-prompt.d.ts +0 -10
- package/dist/src/chats/analysis-prompt.js +0 -16
- package/dist/src/chats/analysis-proposal.d.ts +0 -2
- package/dist/src/chats/analysis-proposal.js +0 -32
- package/dist/src/chats/analysis-provenance.d.ts +0 -4
- package/dist/src/chats/analysis-provenance.js +0 -99
- package/dist/src/chats/analysis-shape.d.ts +0 -3
- package/dist/src/chats/analysis-shape.js +0 -228
- package/dist/src/chats/analysis.d.ts +0 -3
- package/dist/src/chats/analysis.js +0 -42
- package/dist/src/chats/corpus-input.d.ts +0 -5
- package/dist/src/chats/corpus-input.js +0 -288
- package/dist/src/chats/destination.d.ts +0 -4
- package/dist/src/chats/destination.js +0 -96
- package/dist/src/chats/import.d.ts +0 -15
- package/dist/src/chats/import.js +0 -243
- package/dist/src/chats/input-file.d.ts +0 -3
- package/dist/src/chats/input-file.js +0 -32
- package/dist/src/chats/normalize.d.ts +0 -29
- package/dist/src/chats/normalize.js +0 -155
- package/dist/src/chats/previous-import.d.ts +0 -5
- package/dist/src/chats/previous-import.js +0 -34
- package/dist/src/chats/reader.d.ts +0 -21
- package/dist/src/chats/reader.js +0 -118
- package/dist/src/chats/redact-import.d.ts +0 -14
- package/dist/src/chats/redact-import.js +0 -141
- package/dist/src/chats/redaction.d.ts +0 -41
- package/dist/src/chats/redaction.js +0 -161
- package/dist/src/chats/revision-input.d.ts +0 -3
- package/dist/src/chats/revision-input.js +0 -180
- package/dist/src/chats/revision.d.ts +0 -48
- package/dist/src/chats/revision.js +0 -94
- package/dist/src/chats/selection.d.ts +0 -25
- package/dist/src/chats/selection.js +0 -109
- package/dist/src/chats/source.d.ts +0 -23
- package/dist/src/chats/source.js +0 -135
- package/dist/src/chats/structure.d.ts +0 -57
- package/dist/src/chats/structure.js +0 -216
- package/dist/src/daemon/analysis-launch.d.ts +0 -5
- package/dist/src/daemon/analysis-launch.js +0 -81
- package/dist/src/daemon/analysis-token.d.ts +0 -6
- package/dist/src/daemon/analysis-token.js +0 -88
- package/dist/src/daemon/analysis-worker.d.ts +0 -22
- package/dist/src/daemon/analysis-worker.js +0 -219
- package/dist/src/daemon/chats-files.d.ts +0 -15
- package/dist/src/daemon/chats-files.js +0 -113
- package/dist/src/daemon/chats-worker.d.ts +0 -12
- package/dist/src/daemon/chats-worker.js +0 -200
- package/dist/workflows/analyze-chats.d.ts +0 -10
- package/dist/workflows/analyze-chats.declaration.json +0 -9
- package/dist/workflows/analyze-chats.js +0 -73
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
const ambientNames = new Set([
|
|
3
|
+
"globalThis",
|
|
4
|
+
"global",
|
|
5
|
+
"window",
|
|
6
|
+
"self",
|
|
7
|
+
"process",
|
|
8
|
+
"Date",
|
|
9
|
+
"performance",
|
|
10
|
+
"fetch",
|
|
11
|
+
"WebSocket",
|
|
12
|
+
"Worker",
|
|
13
|
+
"crypto",
|
|
14
|
+
"setTimeout",
|
|
15
|
+
"setInterval",
|
|
16
|
+
"setImmediate",
|
|
17
|
+
"queueMicrotask",
|
|
18
|
+
"eval",
|
|
19
|
+
"Function",
|
|
20
|
+
"require",
|
|
21
|
+
"console",
|
|
22
|
+
"navigator",
|
|
23
|
+
"Atomics",
|
|
24
|
+
"SharedArrayBuffer",
|
|
25
|
+
"WeakRef",
|
|
26
|
+
"FinalizationRegistry",
|
|
27
|
+
"Intl",
|
|
28
|
+
]);
|
|
29
|
+
const candidateNames = new Set([
|
|
30
|
+
"Buffer",
|
|
31
|
+
"document",
|
|
32
|
+
"screen",
|
|
33
|
+
"history",
|
|
34
|
+
"location",
|
|
35
|
+
"localStorage",
|
|
36
|
+
"sessionStorage",
|
|
37
|
+
"indexedDB",
|
|
38
|
+
"caches",
|
|
39
|
+
"Deno",
|
|
40
|
+
"Bun",
|
|
41
|
+
"__dirname",
|
|
42
|
+
"__filename",
|
|
43
|
+
"File",
|
|
44
|
+
"FileReader",
|
|
45
|
+
"readFile",
|
|
46
|
+
"writeFile",
|
|
47
|
+
"XMLHttpRequest",
|
|
48
|
+
"EventSource",
|
|
49
|
+
"WebTransport",
|
|
50
|
+
"BroadcastChannel",
|
|
51
|
+
"MessageChannel",
|
|
52
|
+
"MessagePort",
|
|
53
|
+
"postMessage",
|
|
54
|
+
"clearTimeout",
|
|
55
|
+
"clearInterval",
|
|
56
|
+
"clearImmediate",
|
|
57
|
+
"requestAnimationFrame",
|
|
58
|
+
"requestIdleCallback",
|
|
59
|
+
"cancelAnimationFrame",
|
|
60
|
+
"cancelIdleCallback",
|
|
61
|
+
"AbortSignal",
|
|
62
|
+
"Reflect",
|
|
63
|
+
"Proxy",
|
|
64
|
+
"constructor",
|
|
65
|
+
"WebAssembly",
|
|
66
|
+
]);
|
|
67
|
+
const reflectiveProperties = new Set(["constructor", "__proto__", "prototype"]);
|
|
68
|
+
const candidateProperties = new Set([
|
|
69
|
+
"getPrototypeOf",
|
|
70
|
+
"setPrototypeOf",
|
|
71
|
+
"getOwnPropertyDescriptor",
|
|
72
|
+
"getOwnPropertyDescriptors",
|
|
73
|
+
]);
|
|
74
|
+
const pureMathMembers = new Set([
|
|
75
|
+
"E",
|
|
76
|
+
"LN10",
|
|
77
|
+
"LN2",
|
|
78
|
+
"LOG10E",
|
|
79
|
+
"LOG2E",
|
|
80
|
+
"PI",
|
|
81
|
+
"SQRT1_2",
|
|
82
|
+
"SQRT2",
|
|
83
|
+
"abs",
|
|
84
|
+
"acos",
|
|
85
|
+
"acosh",
|
|
86
|
+
"asin",
|
|
87
|
+
"asinh",
|
|
88
|
+
"atan",
|
|
89
|
+
"atan2",
|
|
90
|
+
"atanh",
|
|
91
|
+
"cbrt",
|
|
92
|
+
"ceil",
|
|
93
|
+
"clz32",
|
|
94
|
+
"cos",
|
|
95
|
+
"cosh",
|
|
96
|
+
"exp",
|
|
97
|
+
"expm1",
|
|
98
|
+
"floor",
|
|
99
|
+
"fround",
|
|
100
|
+
"hypot",
|
|
101
|
+
"imul",
|
|
102
|
+
"log",
|
|
103
|
+
"log10",
|
|
104
|
+
"log1p",
|
|
105
|
+
"log2",
|
|
106
|
+
"max",
|
|
107
|
+
"min",
|
|
108
|
+
"pow",
|
|
109
|
+
"round",
|
|
110
|
+
"sign",
|
|
111
|
+
"sin",
|
|
112
|
+
"sinh",
|
|
113
|
+
"sqrt",
|
|
114
|
+
"tan",
|
|
115
|
+
"tanh",
|
|
116
|
+
"trunc",
|
|
117
|
+
]);
|
|
118
|
+
function localBinding(symbol) {
|
|
119
|
+
return (symbol.declarations ?? []).some((declaration) => !declaration.getSourceFile().isDeclarationFile &&
|
|
120
|
+
(ts.getCombinedModifierFlags(declaration) & ts.ModifierFlags.Ambient) ===
|
|
121
|
+
0);
|
|
122
|
+
}
|
|
123
|
+
export function referenceSymbol(node, context) {
|
|
124
|
+
const { parent, checker } = context;
|
|
125
|
+
if (parent &&
|
|
126
|
+
(ts.isPropertyAccessExpression(parent) ||
|
|
127
|
+
ts.isPropertyAssignment(parent)) &&
|
|
128
|
+
parent.name === node)
|
|
129
|
+
return undefined;
|
|
130
|
+
if (parent && ts.isShorthandPropertyAssignment(parent))
|
|
131
|
+
return checker.getShorthandAssignmentValueSymbol(parent);
|
|
132
|
+
return checker.getSymbolAtLocation(node);
|
|
133
|
+
}
|
|
134
|
+
function referenceIdentifier(node, parent) {
|
|
135
|
+
if (!ts.isIdentifier(node))
|
|
136
|
+
return false;
|
|
137
|
+
if (!parent)
|
|
138
|
+
return true;
|
|
139
|
+
if ((ts.isPropertyAccessExpression(parent) ||
|
|
140
|
+
ts.isPropertyAssignment(parent)) &&
|
|
141
|
+
parent.name === node)
|
|
142
|
+
return false;
|
|
143
|
+
return !ts.isImportSpecifier(parent);
|
|
144
|
+
}
|
|
145
|
+
function restrictedAmbientName(name, context) {
|
|
146
|
+
return (ambientNames.has(name) ||
|
|
147
|
+
name === "Math" ||
|
|
148
|
+
(context.profile === "candidate" && candidateNames.has(name)));
|
|
149
|
+
}
|
|
150
|
+
function pureMathAccess(node, parent) {
|
|
151
|
+
return (!!parent &&
|
|
152
|
+
ts.isPropertyAccessExpression(parent) &&
|
|
153
|
+
parent.expression === node &&
|
|
154
|
+
pureMathMembers.has(parent.name.text));
|
|
155
|
+
}
|
|
156
|
+
function ambientReference(node, context) {
|
|
157
|
+
const { parent } = context;
|
|
158
|
+
if (!referenceIdentifier(node, parent))
|
|
159
|
+
return false;
|
|
160
|
+
if (!restrictedAmbientName(node.text, context))
|
|
161
|
+
return false;
|
|
162
|
+
const candidate = context.profile === "candidate";
|
|
163
|
+
const symbol = referenceSymbol(node, context);
|
|
164
|
+
if ((!symbol && !candidate) || (symbol && localBinding(symbol)))
|
|
165
|
+
return false;
|
|
166
|
+
return node.text !== "Math" || !pureMathAccess(node, parent);
|
|
167
|
+
}
|
|
168
|
+
function reflectiveAccess(node, context) {
|
|
169
|
+
const candidate = context.profile === "candidate";
|
|
170
|
+
const restricted = (name) => reflectiveProperties.has(name) ||
|
|
171
|
+
(candidate && candidateProperties.has(name));
|
|
172
|
+
if (ts.isPropertyAccessExpression(node))
|
|
173
|
+
return restricted(node.name.text);
|
|
174
|
+
if (ts.isElementAccessExpression(node) &&
|
|
175
|
+
ts.isStringLiteralLike(node.argumentExpression))
|
|
176
|
+
return restricted(node.argumentExpression.text);
|
|
177
|
+
if (!candidate || !ts.isBindingElement(node))
|
|
178
|
+
return false;
|
|
179
|
+
const name = node.propertyName ?? node.name;
|
|
180
|
+
return ((ts.isIdentifier(name) || ts.isStringLiteralLike(name)) &&
|
|
181
|
+
restricted(name.text));
|
|
182
|
+
}
|
|
183
|
+
function dynamicCapability(node, checker) {
|
|
184
|
+
if (!ts.isElementAccessExpression(node))
|
|
185
|
+
return false;
|
|
186
|
+
const target = checker.getTypeAtLocation(node.expression);
|
|
187
|
+
return (target.getCallSignatures().length > 0 ||
|
|
188
|
+
target.getConstructSignatures().length > 0);
|
|
189
|
+
}
|
|
190
|
+
export function typeOnlyEffectNode(node) {
|
|
191
|
+
return ((ts.isTypeNode(node) && !ts.isExpressionWithTypeArguments(node)) ||
|
|
192
|
+
ts.isInterfaceDeclaration(node) ||
|
|
193
|
+
ts.isTypeAliasDeclaration(node));
|
|
194
|
+
}
|
|
195
|
+
export function restrictedEffect(node, context) {
|
|
196
|
+
return (ambientReference(node, context) ||
|
|
197
|
+
reflectiveAccess(node, context) ||
|
|
198
|
+
dynamicCapability(node, context.checker));
|
|
199
|
+
}
|
|
200
|
+
export function sourceEffectNodes(source, context) {
|
|
201
|
+
const findings = [];
|
|
202
|
+
function visit(node, parent) {
|
|
203
|
+
if (typeOnlyEffectNode(node))
|
|
204
|
+
return;
|
|
205
|
+
if (restrictedEffect(node, { ...context, parent }))
|
|
206
|
+
findings.push(node);
|
|
207
|
+
ts.forEachChild(node, (child) => {
|
|
208
|
+
visit(child, node);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
visit(source);
|
|
212
|
+
return findings;
|
|
213
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function workflowTestHook(input) {
|
|
2
|
+
const modules = Object.fromEntries(Object.entries(input.exports).map(([subpath, target]) => {
|
|
3
|
+
const path = target.import
|
|
4
|
+
.replace("./dist/", "./")
|
|
5
|
+
.replace(/\.js$/, input.extension);
|
|
6
|
+
return ["cloving" + subpath.slice(1), new URL(path, input.root).href];
|
|
7
|
+
}));
|
|
8
|
+
const hook = `import { registerHooks } from "node:module";
|
|
9
|
+
const modules = ${JSON.stringify(modules)};
|
|
10
|
+
registerHooks({
|
|
11
|
+
resolve(specifier, context, nextResolve) {
|
|
12
|
+
return nextResolve(modules[specifier] ?? specifier, context);
|
|
13
|
+
},
|
|
14
|
+
});`;
|
|
15
|
+
return "data:text/javascript," + encodeURIComponent(hook);
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function workflowTestLoader(): string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { extname } from "node:path";
|
|
2
|
+
import packageMetadata from "#package" with { type: "json" };
|
|
3
|
+
import { workflowTestHook } from "./workflow-test-hook.js";
|
|
4
|
+
export function workflowTestLoader() {
|
|
5
|
+
return workflowTestHook({
|
|
6
|
+
root: new URL("../", import.meta.url).href,
|
|
7
|
+
extension: extname(import.meta.filename),
|
|
8
|
+
exports: packageMetadata.exports,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { protectedEffect } from "cloving/workflows/steps/protected-effect";
|
|
2
|
+
import { handoff } from "cloving/workflows/steps/handoff";
|
|
2
3
|
const draft = "cloving-prd-draft.md";
|
|
3
4
|
const noCommit = "Do not commit and do not push. Work only in this work tree.";
|
|
4
5
|
function issueNumber(result) {
|
|
@@ -67,9 +68,76 @@ function requests(input) {
|
|
|
67
68
|
units: 1,
|
|
68
69
|
}));
|
|
69
70
|
}
|
|
71
|
+
function readyIssue(input, issueResult) {
|
|
72
|
+
const { number, result } = issueResult;
|
|
73
|
+
const created = JSON.parse(result ?? "null");
|
|
74
|
+
const url = typeof created === "object" && created !== null && "url" in created
|
|
75
|
+
? created.url
|
|
76
|
+
: undefined;
|
|
77
|
+
const issue = typeof url === "string"
|
|
78
|
+
? /^https?:\/\/[^/\s]+\/([\w.-]+)\/([\w.-]+)\/issues\/([1-9]\d*)$/.exec(url)
|
|
79
|
+
: null;
|
|
80
|
+
if (issue === null || Number(issue[3]) !== number)
|
|
81
|
+
throw new Error("invalid-issue-result");
|
|
82
|
+
return {
|
|
83
|
+
scope: { phase: "prd", operation: "github-ready", round: 1 },
|
|
84
|
+
capability: "github",
|
|
85
|
+
method: "label",
|
|
86
|
+
target: input.cycleId,
|
|
87
|
+
units: 1,
|
|
88
|
+
payload: JSON.stringify({
|
|
89
|
+
owner: issue[1],
|
|
90
|
+
repository: issue[2],
|
|
91
|
+
number,
|
|
92
|
+
add: ["cloving: ready"],
|
|
93
|
+
remove: [],
|
|
94
|
+
}),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async function handoffIssue(input, created) {
|
|
98
|
+
const { number } = created;
|
|
99
|
+
const outcome = {
|
|
100
|
+
kind: "handoff_requested",
|
|
101
|
+
cycleId: input.cycleId,
|
|
102
|
+
promotionId: `issue-${String(number)}`,
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
await handoff({
|
|
106
|
+
workflowId: "develop-issue",
|
|
107
|
+
input: { ticket: String(number) },
|
|
108
|
+
});
|
|
109
|
+
return outcome;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
const reason = handoffReason(error);
|
|
113
|
+
const queued = await protectedEffect(readyIssue(input, created));
|
|
114
|
+
return {
|
|
115
|
+
...outcome,
|
|
116
|
+
reason,
|
|
117
|
+
...(queued.kind === "completed" ? {} : { issueUpdate: "failed" }),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function handoffReason(error) {
|
|
122
|
+
const cause = typeof error === "object" && error !== null && "cause" in error
|
|
123
|
+
? error.cause
|
|
124
|
+
: error;
|
|
125
|
+
if (typeof cause !== "object" ||
|
|
126
|
+
cause === null ||
|
|
127
|
+
!("message" in cause) ||
|
|
128
|
+
typeof cause.message !== "string")
|
|
129
|
+
return "handoff-failed";
|
|
130
|
+
return /^[a-z][a-z0-9-]{0,127}$/.test(cause.message)
|
|
131
|
+
? cause.message
|
|
132
|
+
: "handoff-failed";
|
|
133
|
+
}
|
|
70
134
|
export async function developPrd(input) {
|
|
71
135
|
"use workflow";
|
|
72
|
-
let
|
|
136
|
+
let outcome = {
|
|
137
|
+
kind: "handoff_requested",
|
|
138
|
+
cycleId: input.cycleId,
|
|
139
|
+
promotionId: "",
|
|
140
|
+
};
|
|
73
141
|
for (const request of requests(input)) {
|
|
74
142
|
const result = await protectedEffect(request);
|
|
75
143
|
if (result.kind !== "completed")
|
|
@@ -91,7 +159,7 @@ export async function developPrd(input) {
|
|
|
91
159
|
reason: "invalid-issue-result",
|
|
92
160
|
evidenceId: request.scope.operation,
|
|
93
161
|
};
|
|
94
|
-
|
|
162
|
+
outcome = await handoffIssue(input, { number, result: result.result });
|
|
95
163
|
}
|
|
96
|
-
return
|
|
164
|
+
return outcome;
|
|
97
165
|
}
|
|
@@ -76,6 +76,11 @@ async function merged(input, done) {
|
|
|
76
76
|
cycleId: input.cycleId,
|
|
77
77
|
promotionId: `pull-request-${String(number)}`,
|
|
78
78
|
};
|
|
79
|
+
if (merge.result["reason"] === "ci-pending")
|
|
80
|
+
return blocked(input.cycleId, {
|
|
81
|
+
reason: `The merge has the result ci-pending: ${part(merge.result, "output")}. The pull request stays open: ${done.pull.url}`,
|
|
82
|
+
evidenceId: "github-merge",
|
|
83
|
+
});
|
|
79
84
|
if (done.round > lastFix)
|
|
80
85
|
return blocked(input.cycleId, {
|
|
81
86
|
reason: `The merge has the result ${merge.result["reason"]} in round ${String(done.round)}, and a run has at most ${String(lastFix)} fix rounds. The pull request stays open: ${done.pull.url}`,
|
|
@@ -185,7 +190,7 @@ export async function developTicket(input, decision) {
|
|
|
185
190
|
});
|
|
186
191
|
if (turn.kind !== "completed")
|
|
187
192
|
return blocked(cycleId, {
|
|
188
|
-
reason: `The
|
|
193
|
+
reason: `The worker turn has the result ${turn.kind}.`,
|
|
189
194
|
evidenceId: "claude-turn",
|
|
190
195
|
});
|
|
191
196
|
const gate = await decisionGate({
|
|
@@ -8,9 +8,10 @@ function instructions(repository) {
|
|
|
8
8
|
`If this work tree has no node_modules folder and the main repository has one, make a copy-on-write clone: cp -c -R ${repository}/node_modules node_modules`,
|
|
9
9
|
"Follow the instructions of the repository (AGENTS.md and CLAUDE.md).",
|
|
10
10
|
"Use test-driven development: write a test that fails, see it fail, then write the code.",
|
|
11
|
-
"Run the checks of the repository before you finish.",
|
|
11
|
+
"Run the checks of the repository before you finish. Commit your work before the report. If the repository provides npm run check:clean, run it after committing.",
|
|
12
|
+
"Treat a check time warning as work to do in the same ticket when your change made the check slower.",
|
|
12
13
|
"Commit your work on the current branch. Do not push. Do not change a different branch.",
|
|
13
|
-
"End with a short report: what you changed, the checks that you ran with their results, and what is not done. End the report with exactly one of the lines Ticket status: complete or Ticket status: partial. Before a partial status line, include Remaining: followed by a list with one item on each line, using a dash and a space before each item.",
|
|
14
|
+
"End with a short report: what you changed, the checks that you ran with their results, and what is not done. End the report with exactly one of the lines Ticket status: complete or Ticket status: partial. Before a partial status line, include Remaining: followed by a list with one item on each line, using a dash and a space before each item. Blank lines are allowed around and between list items.",
|
|
14
15
|
].join("\n");
|
|
15
16
|
}
|
|
16
17
|
function named(input) {
|
|
@@ -37,8 +38,12 @@ function denial(round) {
|
|
|
37
38
|
}
|
|
38
39
|
export function review(input, turnResult) {
|
|
39
40
|
const turn = fields(turnResult.result);
|
|
41
|
+
const harness = turn["harness"];
|
|
42
|
+
const worker = typeof harness === "string" && harness !== ""
|
|
43
|
+
? `the ${harness} worker`
|
|
44
|
+
: "the worker";
|
|
40
45
|
return [
|
|
41
|
-
`Review the work of
|
|
46
|
+
`Review the work of ${worker} for ${named(input)}.`,
|
|
42
47
|
`Round: ${String(turnResult.round)} of ${String(lastRound)}`,
|
|
43
48
|
`Branch: ${part(turn, "branch")}`,
|
|
44
49
|
`Work tree: ${part(turn, "worktree")}`,
|
|
@@ -95,6 +100,15 @@ export function turnPrompt(input, fix) {
|
|
|
95
100
|
"Reassess each remaining item before reporting Ticket status: complete. Keep every unfinished item in the next Remaining: list.",
|
|
96
101
|
].join("\n");
|
|
97
102
|
const ticket = pullPrompt(input) + continuation;
|
|
103
|
+
if (review["reason"] === "ci-failed")
|
|
104
|
+
return [
|
|
105
|
+
ticket,
|
|
106
|
+
"",
|
|
107
|
+
`This is round ${String(round)}. The CI checks of the pull request ${pull.url} failed.`,
|
|
108
|
+
"Fix the failed CI checks, including failures that the pull request did not cause, and commit the fix.",
|
|
109
|
+
"",
|
|
110
|
+
part(review, "output"),
|
|
111
|
+
].join("\n");
|
|
98
112
|
if (typeof review["reason"] === "string")
|
|
99
113
|
return [
|
|
100
114
|
ticket,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloving",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Local durable development workflow service",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -34,15 +34,73 @@
|
|
|
34
34
|
"./workflows/steps/decision-gate": {
|
|
35
35
|
"types": "./dist/src/steps/decision-gate.d.ts",
|
|
36
36
|
"import": "./dist/src/steps/decision-gate.js"
|
|
37
|
+
},
|
|
38
|
+
"./workflows/steps/review-subject": {
|
|
39
|
+
"types": "./dist/src/steps/review-subject.d.ts",
|
|
40
|
+
"import": "./dist/src/steps/review-subject.js"
|
|
41
|
+
},
|
|
42
|
+
"./workflows/steps/review-by-person": {
|
|
43
|
+
"types": "./dist/src/steps/review-by-person.d.ts",
|
|
44
|
+
"import": "./dist/src/steps/review-by-person.js"
|
|
45
|
+
},
|
|
46
|
+
"./workflows/steps/review-by-agent": {
|
|
47
|
+
"types": "./dist/src/steps/review-by-agent.d.ts",
|
|
48
|
+
"import": "./dist/src/steps/review-by-agent.js"
|
|
49
|
+
},
|
|
50
|
+
"./workflows/steps/merge-by-person": {
|
|
51
|
+
"types": "./dist/src/steps/merge-by-person.d.ts",
|
|
52
|
+
"import": "./dist/src/steps/merge-by-person.js"
|
|
53
|
+
},
|
|
54
|
+
"./workflows/steps/merge-when-green": {
|
|
55
|
+
"types": "./dist/src/steps/merge-when-green.d.ts",
|
|
56
|
+
"import": "./dist/src/steps/merge-when-green.js"
|
|
57
|
+
},
|
|
58
|
+
"./workflows/steps/wait-for-decision": {
|
|
59
|
+
"types": "./dist/src/steps/wait-for-decision.d.ts",
|
|
60
|
+
"import": "./dist/src/steps/wait-for-decision.js"
|
|
61
|
+
},
|
|
62
|
+
"./workflows/steps/handoff": {
|
|
63
|
+
"types": "./dist/src/steps/handoff.d.ts",
|
|
64
|
+
"import": "./dist/src/steps/handoff.js"
|
|
65
|
+
},
|
|
66
|
+
"./workflows/steps/wait-for-run": {
|
|
67
|
+
"types": "./dist/src/steps/wait-for-run.d.ts",
|
|
68
|
+
"import": "./dist/src/steps/wait-for-run.js"
|
|
69
|
+
},
|
|
70
|
+
"./workflows/steps/run-command": {
|
|
71
|
+
"types": "./dist/src/steps/run-command.d.ts",
|
|
72
|
+
"import": "./dist/src/steps/run-command.js"
|
|
73
|
+
},
|
|
74
|
+
"./workflows/testing": {
|
|
75
|
+
"types": "./dist/src/testing.d.ts",
|
|
76
|
+
"import": "./dist/src/testing.js"
|
|
77
|
+
},
|
|
78
|
+
"./workflows/steps/sleep": {
|
|
79
|
+
"types": "./dist/src/steps/sleep.d.ts",
|
|
80
|
+
"import": "./dist/src/steps/sleep.js"
|
|
37
81
|
}
|
|
38
82
|
},
|
|
39
83
|
"files": [
|
|
40
84
|
"dist/src",
|
|
41
85
|
"dist/tools",
|
|
42
|
-
"dist/workflows"
|
|
86
|
+
"dist/workflows",
|
|
87
|
+
"templates",
|
|
88
|
+
"assets/watch-fonts/fira-code-latin-400-normal.woff2",
|
|
89
|
+
"assets/watch-fonts/fira-code-latin-500-normal.woff2",
|
|
90
|
+
"assets/watch-fonts/fira-code-OFL.md",
|
|
91
|
+
"assets/watch-fonts/heebo-latin-500-normal.woff2",
|
|
92
|
+
"assets/watch-fonts/heebo-latin-700-normal.woff2",
|
|
93
|
+
"assets/watch-fonts/heebo-latin-800-normal.woff2",
|
|
94
|
+
"assets/watch-fonts/heebo-OFL.md",
|
|
95
|
+
"assets/watch-fonts/space-grotesk-latin-400-normal.woff2",
|
|
96
|
+
"assets/watch-fonts/space-grotesk-latin-500-normal.woff2",
|
|
97
|
+
"assets/watch-fonts/space-grotesk-latin-600-normal.woff2",
|
|
98
|
+
"assets/watch-fonts/space-grotesk-latin-700-normal.woff2",
|
|
99
|
+
"assets/watch-fonts/space-grotesk-OFL.md",
|
|
100
|
+
"assets/watch-fonts/manifest.json"
|
|
43
101
|
],
|
|
44
102
|
"engines": {
|
|
45
|
-
"node": ">=26.9.0 <27",
|
|
103
|
+
"node": ">=24.22.1 <25 || >=26.9.0 <27",
|
|
46
104
|
"npm": ">=11.19.1 <12"
|
|
47
105
|
},
|
|
48
106
|
"os": [
|
|
@@ -56,11 +114,13 @@
|
|
|
56
114
|
"scripts": {
|
|
57
115
|
"build": "tsc --project tsconfig.build.json && node tools/copy-workflow-declarations.ts workflows dist/workflows",
|
|
58
116
|
"build:workflows": "node tools/compile-workflows.ts",
|
|
59
|
-
"check:setup": "tsc --project tsconfig.json --noEmit",
|
|
117
|
+
"check:setup": "node tools/check-shells.ts && tsc --project tsconfig.json --noEmit",
|
|
60
118
|
"check:quality": "node tools/check-quality.ts",
|
|
119
|
+
"check:clean": "node tools/check-clean.ts",
|
|
61
120
|
"check:lint": "eslint src tools quality test eslint.config.mjs --max-warnings 0",
|
|
62
121
|
"check:format": "prettier --check src tools quality test eslint.config.mjs package.json tsconfig.json tsconfig.build.json",
|
|
63
122
|
"test:quality": "node --test test/quality/*.test.ts",
|
|
123
|
+
"record:test-durations": "node tools/record-test-durations.ts",
|
|
64
124
|
"test:scale": "node --test --test-concurrency=1 test/authority-opening-scale.benchmark.ts",
|
|
65
125
|
"check": "node tools/quality-pending.ts",
|
|
66
126
|
"test:concurrency": "node tools/quality-pending.ts"
|
|
@@ -76,7 +136,6 @@
|
|
|
76
136
|
"istanbul-lib-coverage": "3.2.2",
|
|
77
137
|
"jscpd": "5.4.0",
|
|
78
138
|
"prettier": "3.9.9",
|
|
79
|
-
"typescript": "6.0.3",
|
|
80
139
|
"typescript-eslint": "8.71.1"
|
|
81
140
|
},
|
|
82
141
|
"overrides": {
|
|
@@ -89,7 +148,8 @@
|
|
|
89
148
|
"@workflow/builders": "5.0.2",
|
|
90
149
|
"entities": "8.1.0",
|
|
91
150
|
"preact": "11.0.0",
|
|
92
|
-
"solid-objects": "0.
|
|
151
|
+
"solid-objects": "1.0.2",
|
|
152
|
+
"typescript": "6.0.3",
|
|
93
153
|
"workflow": "5.1.0"
|
|
94
154
|
}
|
|
95
155
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Develop template decisions
|
|
2
|
+
|
|
3
|
+
`template.json` describes the five decisions used by the develop template.
|
|
4
|
+
The default workflow in `develop.ts` accepts the declared ticket input, selects
|
|
5
|
+
from the queue, opens a pull request, waits for Greptile at 5/5, and calls
|
|
6
|
+
`mergeWhenGreen` with `check: "beforeMerge"`. Its declaration and helper files
|
|
7
|
+
pass folder admission, including compilation with the Workflow SDK in a packed
|
|
8
|
+
installation. Copy this directory's contents into a workflow folder.
|
|
9
|
+
|
|
10
|
+
The host supplies `{ cycleId, repository, input: { ticket: { id, text } } }`.
|
|
11
|
+
`develop/report.ts` extracts the resolved text and preserves the worker's ticket
|
|
12
|
+
status. `develop/round.ts` composes development, review and merge. A failed
|
|
13
|
+
review or repairable merge result gives its full output and remaining work to
|
|
14
|
+
the next worker turn. Review, local-check, conflict and CI fixes share a limit
|
|
15
|
+
of three fix rounds. Pending CI and an unconfigured check stop the run.
|
|
16
|
+
|
|
17
|
+
`develop.test.ts` and `develop/flow-tests.ts` test the default composition through the public fake
|
|
18
|
+
step bridge. The alternative configurations use `develop/option-tests.ts`, with the selected
|
|
19
|
+
point IDs in `develop/scenarios.ts`. For an edited copy, replace the default
|
|
20
|
+
`flowTests` and `refusalTests` imports in `develop.test.ts` with
|
|
21
|
+
`optionTests as flowTests`, then run every `flowTests` scenario. Keep the shared
|
|
22
|
+
turn and partial-helper tests. Package tests apply each source edit, validate
|
|
23
|
+
its requirements, and test seven complete configurations through the folder
|
|
24
|
+
loader and the installed package, covering every option.
|
|
25
|
+
|
|
26
|
+
`develop/turn.ts` implements the development turn for either a resolved
|
|
27
|
+
`ticket` or a task `prompt`. It calls the public protected effect helper and
|
|
28
|
+
returns the broker result unchanged. Its `feedback` takes the previous
|
|
29
|
+
result's `reason`, full `output`, and `remaining` items. Rounds 1 through 4
|
|
30
|
+
allow the initial turn and three fix turns; the workflow must stop after that.
|
|
31
|
+
`develop.test.ts` exercises this helper with `cloving/workflows/testing`.
|
|
32
|
+
The package tests also load small compositions of this helper through folder
|
|
33
|
+
admission for both input forms and test both forms in complete workflows.
|
|
34
|
+
|
|
35
|
+
`develop/partial.ts` implements the person's partial-work question.
|
|
36
|
+
`develop/partial-choice.ts` connects its answer to a development report and the
|
|
37
|
+
next round, or returns a blocked outcome without opening a review or merging. `reviewPartial`
|
|
38
|
+
opens a question with an identity scoped to the run and round. It returns
|
|
39
|
+
nonempty feedback from an explicit answer, or stops. It opens no question
|
|
40
|
+
after the initial turn and three fix turns. The separate `develop/queue-partial.ts`
|
|
41
|
+
helper, `queuePartial`, forwards the issue,
|
|
42
|
+
merged pull request and remaining items to the protected `partial-issue`
|
|
43
|
+
operation, preserving its result. The GitHub worker owns partial-run history
|
|
44
|
+
and requeues the first two runs, then blocks the ticket from the third.
|
|
45
|
+
Folder-admission tests cover both helpers in the checkout and packed install.
|
|
46
|
+
The default workflow calls `queuePartial` after merging partial work, closes
|
|
47
|
+
complete issues, and reports a failed issue update in its outcome.
|
|
48
|
+
The person-only composition needs no GitHub capability. `develop/local.ts`
|
|
49
|
+
implements its round: develop, ask about partial work, review the immutable
|
|
50
|
+
commit, and leave the branch for the person to merge. It refuses missing or
|
|
51
|
+
malformed commit IDs and reports of uncommitted work. `develop/accept.ts`
|
|
52
|
+
contains the editable pull-request acceptance call. `promptInput` in
|
|
53
|
+
`develop/report.ts` adapts task text without looking up a ticket.
|
|
54
|
+
Only resolved ticket input supplies an issue identity for lifecycle updates.
|
|
55
|
+
Task text keeps its full contents, including any issue-looking lines, without
|
|
56
|
+
selecting an issue to label, close or return to the queue.
|
|
57
|
+
|
|
58
|
+
The first option of each point is the default: ticket input, queue selection,
|
|
59
|
+
Greptile at 5/5, merge after checks, and return partial work to the queue.
|
|
60
|
+
Selecting `person` at selection, acceptance and partial work, with `local` at
|
|
61
|
+
merge, describes the existing reviewed local-branch process.
|
|
62
|
+
|
|
63
|
+
Each option has an `id`, `label`, `summary`, `change`, `requires` and `needs`.
|
|
64
|
+
`change` describes the step call or declaration edit for the setup agent.
|
|
65
|
+
It is guidance for editing source, rather than an executable patch.
|
|
66
|
+
|
|
67
|
+
`requires` maps another point ID to its allowed option IDs. All named points
|
|
68
|
+
must satisfy their requirement; any listed option for one point satisfies that
|
|
69
|
+
point. For example, `"merge": ["person", "green"]` requires either pull-request
|
|
70
|
+
merge option. An empty object imposes no additional requirement. Select exactly
|
|
71
|
+
one known option at each point and validate the complete selection after edits.
|
|
72
|
+
|
|
73
|
+
`needs` lists `cloving doctor` codes required by that option. The configured
|
|
74
|
+
workflow also needs the common runtime and harness checks reported by doctor.
|
|
75
|
+
|
|
76
|
+
Changing metadata does not change runtime behavior. The setup agent must apply
|
|
77
|
+
the source and declaration edits, run the workflow's scenario tests, and load
|
|
78
|
+
the edited configuration through folder admission before using it.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReviewSubject, ReviewResult } from "cloving/workflows";
|
|
2
|
+
import { reviewByAgent } from "cloving/workflows/steps/review-by-agent";
|
|
3
|
+
|
|
4
|
+
export async function acceptWork(
|
|
5
|
+
subject: ReviewSubject,
|
|
6
|
+
): Promise<ReviewResult> {
|
|
7
|
+
return await reviewByAgent({
|
|
8
|
+
subject: subject,
|
|
9
|
+
reviewer: { kind: "greptile" },
|
|
10
|
+
});
|
|
11
|
+
}
|