humanish 0.107.0 → 0.109.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/ARCHITECTURE.md +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
|
@@ -5,7 +5,7 @@ import { analyzeRun, correctAnalysis, dryRunBundleRefusal, showAnalysis, } from
|
|
|
5
5
|
import { listAnalyses } from "../../analysis/store.js";
|
|
6
6
|
import { listAnalysisExecutions } from "../../analysis/store-executions.js";
|
|
7
7
|
import { resolveRunPath } from "../../run/locate.js";
|
|
8
|
-
import { discoverCliKeys, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
|
|
8
|
+
import { CWD_OPTION_DESCRIPTION, discoverCliKeys, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, writeResult, humanError, } from "../io.js";
|
|
9
9
|
import { resolvePhysicalCwd } from "../../run/paths.js";
|
|
10
10
|
/** Commander may collect a shared flag on the parent; only explicit values override leaf defaults. */
|
|
11
11
|
function analysisSelection(options, command) {
|
|
@@ -24,11 +24,11 @@ export function registerAnalyzeCommand(parent, io) {
|
|
|
24
24
|
.command("analyze")
|
|
25
25
|
.enablePositionalOptions()
|
|
26
26
|
.description("Analyze retained participant evidence into versioned findings. Selected text and captures go to the chosen remote analyst. Opening Observer never starts analysis.")
|
|
27
|
-
.summary("
|
|
28
|
-
.option("--run <id>",
|
|
29
|
-
.option("--cwd <path>",
|
|
27
|
+
.summary("Analyze a live run into evidence-linked findings.")
|
|
28
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
29
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
30
30
|
.option("--provider <name>", "Analyst: openai (default) or restricted codex account. No provider fallback.")
|
|
31
|
-
.option("--max-cost <usd>", "Required for OpenAI,
|
|
31
|
+
.option("--max-cost <usd>", "Required for OpenAI, also with --dry-run: send nothing when the estimated cost in USD is above this. The estimate is not a billing cap. Unsupported for Codex.")
|
|
32
32
|
.option("--model <id>", "Supported vision model. OpenAI uses high effort; qualified Codex account analysis uses low effort.", DEFAULT_ANALYSIS_MODEL)
|
|
33
33
|
.option("--question <text>", "Additional reviewer question; does not change participant instructions.")
|
|
34
34
|
.option("--timeout-ms <ms>", "Request timeout, at most 600000 ms.", String(DEFAULT_ANALYSIS_TIMEOUT_MS))
|
|
@@ -40,23 +40,23 @@ export function registerAnalyzeCommand(parent, io) {
|
|
|
40
40
|
analyze
|
|
41
41
|
.command("list")
|
|
42
42
|
.description("List immutable analysis versions, including failed attempts.")
|
|
43
|
-
.option("--run <id>",
|
|
44
|
-
.option("--cwd <path>",
|
|
43
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
44
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
45
45
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
46
46
|
.action((options, command) => handleAnalyzeList(io, options, command));
|
|
47
47
|
analyze
|
|
48
48
|
.command("show")
|
|
49
49
|
.description("Read validated analysis and correction history. Defaults to the latest usable version.")
|
|
50
|
-
.option("--run <id>",
|
|
50
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
51
51
|
.option("--id <id>", "Exact analysis version.")
|
|
52
|
-
.option("--cwd <path>",
|
|
52
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
53
53
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
54
54
|
.action((options, command) => handleAnalyzeShow(io, options, command));
|
|
55
55
|
analyze
|
|
56
56
|
.command("correct")
|
|
57
57
|
.description("Append a human review note bound to one exact finding version; original claims remain intact.")
|
|
58
|
-
.option("--run <id>",
|
|
59
|
-
.option("--cwd <path>",
|
|
58
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
59
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
60
60
|
.requiredOption("--analysis <id>", "Analysis version to review.")
|
|
61
61
|
.requiredOption("--finding <id>", "Finding to review.")
|
|
62
62
|
.addOption(new Option("--status <status>", "Review disposition.")
|
|
@@ -83,7 +83,7 @@ async function handleAnalyze(io, options, command) {
|
|
|
83
83
|
if (!selected.ok || !selected.config) {
|
|
84
84
|
const refusal = await dryRunBundleRefusal(await resolvePhysicalCwd(options.cwd), options.run, options.dryRun === true);
|
|
85
85
|
if (refusal) {
|
|
86
|
-
writeResult(command, io, refusal, (value) =>
|
|
86
|
+
writeResult(command, io, refusal, (value) => humanError(value.error));
|
|
87
87
|
io.setExitCode(2);
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
@@ -99,7 +99,7 @@ async function handleAnalyze(io, options, command) {
|
|
|
99
99
|
message: selected.ok ? "Analysis is disabled." : selected.message,
|
|
100
100
|
},
|
|
101
101
|
};
|
|
102
|
-
writeResult(command, io, result, (value) =>
|
|
102
|
+
writeResult(command, io, result, (value) => humanError(value.error));
|
|
103
103
|
io.setExitCode(2);
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
@@ -126,8 +126,6 @@ async function handleAnalyze(io, options, command) {
|
|
|
126
126
|
if (value.ok && value.dryRun)
|
|
127
127
|
return `Admission estimate: $${value.admission?.estimatedCostUsd ?? "unknown"}; output allowance: ${value.admission?.outputTokenAllowance ?? "unknown"} tokens including reasoning. No request sent.\n`;
|
|
128
128
|
const lines = [];
|
|
129
|
-
if (!value.ok)
|
|
130
|
-
lines.push(value.error?.message ?? "Analysis unavailable.", value.error?.code ?? "");
|
|
131
129
|
if (value.artifactPath)
|
|
132
130
|
lines.push(`${value.reused ? "Reused" : "Saved"} ${value.status} analysis: ${value.artifactPath}`);
|
|
133
131
|
if (value.executionReceiptPath)
|
|
@@ -141,7 +139,12 @@ async function handleAnalyze(io, options, command) {
|
|
|
141
139
|
if (value.reused)
|
|
142
140
|
lines.push("No new request sent.");
|
|
143
141
|
lines.push(...value.warnings);
|
|
144
|
-
|
|
142
|
+
const stdout = lines.length === 0 ? "" : forTerminal(lines.join("\n") + "\n");
|
|
143
|
+
// A failed analysis keeps its artifact and usage lines on stdout; the error goes to stderr.
|
|
144
|
+
if (value.ok)
|
|
145
|
+
return stdout;
|
|
146
|
+
const error = value.error ?? { message: "Analysis unavailable." };
|
|
147
|
+
return { ...(stdout ? { stdout } : {}), error };
|
|
145
148
|
});
|
|
146
149
|
io.setExitCode(result.ok ? 0 : 2);
|
|
147
150
|
}
|
|
@@ -3,22 +3,23 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { Command, Option } from "commander";
|
|
4
4
|
import { startCodexAppServerUi } from "../../actors/codex/app-server-ui.js";
|
|
5
5
|
import { redactText } from "../../evidence/redaction.js";
|
|
6
|
-
import { JSON_OPTION_DESCRIPTION, parseObserverPort, parseTimeoutMs, writeResult, } from "../io.js";
|
|
6
|
+
import { CWD_OPTION_DESCRIPTION, freePortOption, JSON_OPTION_DESCRIPTION, parseObserverPort, parseTimeoutMs, writeResult, humanError, } from "../io.js";
|
|
7
7
|
export function registerCodexCommands(parent, io) {
|
|
8
|
+
// Hidden from --help and the CLI reference: it drives a Codex app-server session directly and
|
|
9
|
+
// is not a step in running or reviewing a study.
|
|
8
10
|
const codex = parent
|
|
9
|
-
.command("codex")
|
|
10
|
-
.description("Run Codex-native humanish integration surfaces.")
|
|
11
|
-
.summary("Run Codex-native humanish integration surfaces.");
|
|
11
|
+
.command("codex", { hidden: true })
|
|
12
|
+
.description("Run Codex-native humanish integration surfaces.");
|
|
12
13
|
codex
|
|
13
14
|
.command("app-server")
|
|
14
15
|
.description("Run a browser-visible Codex app-server actor surface and write redacted protocol artifacts.")
|
|
15
|
-
.option("--cwd <path>",
|
|
16
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
16
17
|
.option("--prompt <text>", "Prompt to submit to Codex app-server.")
|
|
17
18
|
.option("--prompt-file <path>", "Read the Codex app-server prompt from a file.")
|
|
18
19
|
.option("--run-root <path>", "Artifact directory for redacted app-server evidence.")
|
|
19
20
|
.option("--state-file <path>", "State JSON file for external observers.")
|
|
20
21
|
.option("--timeout-ms <ms>", "Actor timeout in milliseconds.", String(900_000))
|
|
21
|
-
.
|
|
22
|
+
.addOption(freePortOption())
|
|
22
23
|
.option("--model <model>", "Optional Codex model override.")
|
|
23
24
|
.addOption(new Option("--sandbox <mode>", "Turn sandbox policy.")
|
|
24
25
|
.choices(["read-only", "workspace-write", "danger-full-access"])
|
|
@@ -101,9 +102,8 @@ export function registerCodexCommands(parent, io) {
|
|
|
101
102
|
});
|
|
102
103
|
}
|
|
103
104
|
function formatCodexAppServerUiHuman(result) {
|
|
104
|
-
if (!result.ok)
|
|
105
|
-
return
|
|
106
|
-
}
|
|
105
|
+
if (!result.ok)
|
|
106
|
+
return humanError(result.error);
|
|
107
107
|
return ([
|
|
108
108
|
"humanish codex app-server",
|
|
109
109
|
`url: ${result.url ?? "not-started"}`,
|
|
@@ -3,18 +3,18 @@ import { Command } from "commander";
|
|
|
3
3
|
import { COMMS_PROVIDERS, saveCommsConnection } from "../../comms/connections.js";
|
|
4
4
|
import { catchTokenRefusal } from "../../comms/external-evidence.js";
|
|
5
5
|
import { readCommsSetup } from "../../comms/setup.js";
|
|
6
|
-
import { checkCommsConnection,
|
|
6
|
+
import { checkCommsConnection, configureCommsStudy } from "../../comms/setup.js";
|
|
7
7
|
import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
|
|
8
8
|
import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
|
|
9
|
-
import {
|
|
9
|
+
import { resolveStudyManifest } from "../../study/discover.js";
|
|
10
10
|
import { runCommsCatchHost } from "../../comms/catch-host.js";
|
|
11
11
|
import { DEFAULT_SANDBOX_CATCH_PORT } from "../../comms/sandbox-catch.js";
|
|
12
|
-
import { applyEnvFileOption, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
|
|
12
|
+
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, PORT_OPTION_DESCRIPTION, writeResult, messageOutput, } from "../io.js";
|
|
13
13
|
export function registerCommsCommands(parent, io) {
|
|
14
14
|
const comms = parent
|
|
15
15
|
.command("comms")
|
|
16
16
|
.description("Local email capture, real receiving connections, checks and cleanup recovery.")
|
|
17
|
-
.summary("
|
|
17
|
+
.summary("Catch the email an app sends, for email-gated flows.");
|
|
18
18
|
comms
|
|
19
19
|
.command("providers")
|
|
20
20
|
.description("List installed communication provider capabilities. No network requests.")
|
|
@@ -22,61 +22,61 @@ export function registerCommsCommands(parent, io) {
|
|
|
22
22
|
.action((_options, command) => handleCommsProviders(io, _options, command));
|
|
23
23
|
const connections = comms
|
|
24
24
|
.command("connections")
|
|
25
|
-
.description("Manage project-local non-secret connection profiles. A
|
|
25
|
+
.description("Manage project-local non-secret connection profiles. A study explicitly selects its receiving connection.");
|
|
26
26
|
connections
|
|
27
27
|
.command("list")
|
|
28
28
|
.description("Show saved connections and local credential status; does not authenticate with a provider.")
|
|
29
|
-
.option("--cwd <path>",
|
|
30
|
-
.option("--env-file <path>",
|
|
29
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
30
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
31
31
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
32
32
|
.action((options, command) => handleCommsList(io, options, command));
|
|
33
33
|
connections
|
|
34
34
|
.command("add")
|
|
35
35
|
.argument("[name]", "Project connection name.", "agentmail")
|
|
36
|
-
.description("Save an AgentMail connection profile. Does not write a key, alter a
|
|
37
|
-
.option("--cwd <path>",
|
|
36
|
+
.description("Save an AgentMail connection profile. Does not write a key, alter a study or contact the provider.")
|
|
37
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
38
38
|
.option("--provider <id>", "Installed provider id.", "agentmail")
|
|
39
|
-
.option("--api-key-env <name>", "
|
|
39
|
+
.option("--api-key-env <name>", "The name of an environment variable, never its value.", "AGENTMAIL_API_KEY")
|
|
40
40
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
41
41
|
.action((name, options, command) => handleCommsAdd(io, name, options, command));
|
|
42
42
|
comms
|
|
43
43
|
.command("check")
|
|
44
44
|
.description("Check connection and credential presence; --online authenticates without creating inboxes.")
|
|
45
|
-
.option("--cwd <path>",
|
|
45
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
46
46
|
.option("--connection <name>", "Saved connection name.", "agentmail")
|
|
47
|
-
.option("--
|
|
47
|
+
.option("--study <path>", "Check the connection this study selects.")
|
|
48
48
|
.option("--online", "Make a read-only provider authentication request.")
|
|
49
|
-
.option("--env-file <path>",
|
|
49
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
50
50
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
51
51
|
.action((options, command) => handleCommsCheck(io, options, command));
|
|
52
52
|
comms
|
|
53
53
|
.command("configure")
|
|
54
|
-
.description("Preview or save a local receiving-enabled copy of a supported
|
|
55
|
-
.requiredOption("--
|
|
56
|
-
.option("--cwd <path>",
|
|
54
|
+
.description("Preview or save a local receiving-enabled copy of a supported study. No provider requests.")
|
|
55
|
+
.requiredOption("--study <path>", "Source study path or name. Required.")
|
|
56
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
57
57
|
.option("--connection <name>", "Saved connection name.", "agentmail")
|
|
58
|
-
.option("--apply", "Save the local copy;
|
|
58
|
+
.option("--apply", "Save the local copy; the source study stays unchanged.")
|
|
59
59
|
.option("--plan-token <digest>", "Require the source and destination to match a previous preview.")
|
|
60
60
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
61
61
|
.action((options, command) => handleCommsConfigure(io, options, command));
|
|
62
62
|
comms
|
|
63
63
|
.command("recover")
|
|
64
64
|
.description("Inspect interrupted email leases; --apply deletes only privately recorded resources owned by this project and account.")
|
|
65
|
-
.option("--cwd <path>",
|
|
65
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
66
66
|
.option("--run <id>", "One run to inspect or recover.")
|
|
67
67
|
.option("--apply", "Recover the selected inactive run and verify mailbox deletion.")
|
|
68
|
-
.option("--env-file <path>",
|
|
68
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
69
69
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
70
70
|
.action((options, command) => handleCommsRecover(io, options, command));
|
|
71
71
|
comms
|
|
72
72
|
.command("catch")
|
|
73
|
-
.description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your
|
|
74
|
-
.summary("Run the
|
|
75
|
-
.option("--port <port>",
|
|
73
|
+
.description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your study's comms.email.external.catchBaseUrl at this server.")
|
|
74
|
+
.summary("Run the email catch on this host.")
|
|
75
|
+
.option("--port <port>", PORT_OPTION_DESCRIPTION, String(DEFAULT_SANDBOX_CATCH_PORT))
|
|
76
76
|
.option("--dir <path>", "Directory for the deliveries log and rendered inbox.", ".humanish/comms-catch")
|
|
77
77
|
.option("--token <value>", "Require this bearer token, at least 16 characters, on GET /deliveries (recommended when reachable off-host).")
|
|
78
78
|
.option("--smtp-port <port>", "Also capture SMTP mail on 127.0.0.1:<port>. Point your app's SMTP transport here.")
|
|
79
|
-
.option("--inbox-port <port>", "Also serve a
|
|
79
|
+
.option("--inbox-port <port>", "Also serve a read-only inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
|
|
80
80
|
.option("--recipient <address>", "Only render mail sent to this address (repeatable). Default: render whatever the app actually mailed.", (value, previous) => [...(previous ?? []), value])
|
|
81
81
|
.action((options) => handleCommsCatch(io, options));
|
|
82
82
|
}
|
|
@@ -102,25 +102,32 @@ async function handleCommsAdd(io, name, options, command) {
|
|
|
102
102
|
? await saveCommsConnection(resolve(options.cwd), name, options.apiKeyEnv)
|
|
103
103
|
: { ok: false, message: "Only AgentMail connection setup is currently available." }),
|
|
104
104
|
};
|
|
105
|
-
writeResult(command, io, result,
|
|
105
|
+
writeResult(command, io, result, messageOutput);
|
|
106
106
|
io.setExitCode(result.ok ? 0 : 2);
|
|
107
107
|
}
|
|
108
108
|
async function handleCommsCheck(io, options, command) {
|
|
109
109
|
if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
|
|
110
110
|
return;
|
|
111
111
|
let connection = options.connection;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
const study = options.study;
|
|
113
|
+
if (study) {
|
|
114
|
+
const resolved = await resolveStudyManifest(options.cwd, study);
|
|
115
|
+
if (!resolved.ok || resolved.config.comms?.email?.kind !== "real") {
|
|
116
|
+
// A file humanish no longer reads gets discovery's message, which names the fix.
|
|
117
|
+
const named = !resolved.ok &&
|
|
118
|
+
(resolved.error.code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
|
|
119
|
+
resolved.error.code === "HUMANISH_STUDY_RETIRED_DIRECTORY");
|
|
115
120
|
const result = {
|
|
116
121
|
ok: false,
|
|
117
|
-
message:
|
|
122
|
+
message: named
|
|
123
|
+
? resolved.error.message
|
|
124
|
+
: "This study does not select a real email connection.",
|
|
118
125
|
};
|
|
119
|
-
writeResult(command, io, result,
|
|
126
|
+
writeResult(command, io, result, messageOutput);
|
|
120
127
|
io.setExitCode(2);
|
|
121
128
|
return;
|
|
122
129
|
}
|
|
123
|
-
connection =
|
|
130
|
+
connection = resolved.config.comms.email.connection;
|
|
124
131
|
}
|
|
125
132
|
const result = await checkCommsConnection({
|
|
126
133
|
cwd: resolve(options.cwd),
|
|
@@ -128,12 +135,18 @@ async function handleCommsCheck(io, options, command) {
|
|
|
128
135
|
env: process.env,
|
|
129
136
|
online: options.online === true,
|
|
130
137
|
});
|
|
131
|
-
writeResult(command, io, result,
|
|
138
|
+
writeResult(command, io, result, messageOutput);
|
|
132
139
|
io.setExitCode(result.ok ? 0 : 2);
|
|
133
140
|
}
|
|
134
141
|
async function handleCommsConfigure(io, options, command) {
|
|
135
|
-
const result = await
|
|
136
|
-
|
|
142
|
+
const result = await configureCommsStudy({
|
|
143
|
+
cwd: resolve(options.cwd),
|
|
144
|
+
study: options.study,
|
|
145
|
+
connection: options.connection,
|
|
146
|
+
...(options.apply === undefined ? {} : { apply: options.apply }),
|
|
147
|
+
...(options.planToken === undefined ? {} : { planToken: options.planToken }),
|
|
148
|
+
});
|
|
149
|
+
writeResult(command, io, result, messageOutput);
|
|
137
150
|
io.setExitCode(result.ok ? 0 : 2);
|
|
138
151
|
}
|
|
139
152
|
async function handleCommsRecover(io, options, command) {
|
|
@@ -165,7 +178,7 @@ async function handleCommsRecover(io, options, command) {
|
|
|
165
178
|
adapter,
|
|
166
179
|
})),
|
|
167
180
|
};
|
|
168
|
-
writeResult(command, io, result,
|
|
181
|
+
writeResult(command, io, result, messageOutput);
|
|
169
182
|
io.setExitCode(result.ok ? 0 : 2);
|
|
170
183
|
}
|
|
171
184
|
catch {
|
|
@@ -174,7 +187,7 @@ async function handleCommsRecover(io, options, command) {
|
|
|
174
187
|
ok: false,
|
|
175
188
|
message: "Recovery could not complete. Select one recorded run with --run, check its connection, and retry. No unrecorded resources are eligible.",
|
|
176
189
|
};
|
|
177
|
-
writeResult(command, io, result,
|
|
190
|
+
writeResult(command, io, result, messageOutput);
|
|
178
191
|
io.setExitCode(2);
|
|
179
192
|
}
|
|
180
193
|
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { draftFeedback, listFeedback, renderIssueMarkdown, renderIssueUrl, verifyFeedback, } from "../../feedback/feedback.js";
|
|
3
|
-
import { candidateOption, JSON_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
|
|
3
|
+
import { candidateOption, CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, humanError, writeHuman, } from "../io.js";
|
|
4
4
|
export function registerFeedbackCommands(parent, io) {
|
|
5
5
|
const feedback = parent
|
|
6
6
|
.command("feedback")
|
|
7
|
-
.description("
|
|
8
|
-
.summary("
|
|
7
|
+
.description("Draft public-safe feedback issues from a run. humanish never calls the GitHub API.")
|
|
8
|
+
.summary("Draft public-safe feedback issues from a run.");
|
|
9
9
|
feedback
|
|
10
10
|
.command("list")
|
|
11
11
|
.description("List recorded feedback candidates and any saved draft.")
|
|
12
|
-
.addHelpText("after", "\nWith no candidates, feedback draft and feedback issue
|
|
13
|
-
.option("--run <id>",
|
|
14
|
-
.option("--cwd <path>",
|
|
12
|
+
.addHelpText("after", "\nWith no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready. A dry run gets no draft.\n")
|
|
13
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
14
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
15
15
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
16
16
|
.action((options, command) => handleFeedbackList(io, options, command));
|
|
17
17
|
feedback
|
|
18
18
|
.command("draft")
|
|
19
19
|
.description("Generate a public-safe feedback draft from verified evidence.")
|
|
20
|
-
.option("--run <id>",
|
|
21
|
-
.option("--cwd <path>",
|
|
20
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
21
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
22
22
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
23
23
|
.option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
|
|
24
24
|
.option("--candidate <id>", "Which finding to draft (ids from `feedback list`); default: the first.")
|
|
@@ -27,8 +27,8 @@ export function registerFeedbackCommands(parent, io) {
|
|
|
27
27
|
feedback
|
|
28
28
|
.command("verify")
|
|
29
29
|
.description("Verify the feedback draft for public issue eligibility.")
|
|
30
|
-
.option("--run <id>",
|
|
31
|
-
.option("--cwd <path>",
|
|
30
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
31
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
32
32
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
33
33
|
.option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
|
|
34
34
|
.option("--candidate <id>", "Which finding to verify (ids from `feedback list`); default: the first.")
|
|
@@ -37,8 +37,8 @@ export function registerFeedbackCommands(parent, io) {
|
|
|
37
37
|
feedback
|
|
38
38
|
.command("issue")
|
|
39
39
|
.description("Print Markdown for a public GitHub issue. Does not mutate GitHub.")
|
|
40
|
-
.option("--run <id>",
|
|
41
|
-
.option("--cwd <path>",
|
|
40
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
41
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
42
42
|
.requiredOption("--repo <owner/repo>", "Repository slug used in rendered filing instructions.")
|
|
43
43
|
.option("--format <format>", "Output format.", "markdown")
|
|
44
44
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
@@ -49,8 +49,8 @@ export function registerFeedbackCommands(parent, io) {
|
|
|
49
49
|
feedback
|
|
50
50
|
.command("issue-url")
|
|
51
51
|
.description("Print a prefilled public issue URL. Does not mutate GitHub.")
|
|
52
|
-
.option("--run <id>",
|
|
53
|
-
.option("--cwd <path>",
|
|
52
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
53
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
54
54
|
.requiredOption("--repo <owner/repo>", "Repository slug used in the generated URL.")
|
|
55
55
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
56
56
|
.option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
|
|
@@ -87,7 +87,7 @@ async function handleFeedbackIssue(io, options, command) {
|
|
|
87
87
|
io.writeOut(result.issueMarkdown);
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
90
|
-
io
|
|
90
|
+
writeHuman(command, io, formatFeedbackHuman(result));
|
|
91
91
|
}
|
|
92
92
|
io.setExitCode(result.ok ? 0 : 2);
|
|
93
93
|
}
|
|
@@ -100,14 +100,13 @@ async function handleFeedbackIssueUrl(io, options, command) {
|
|
|
100
100
|
io.writeOut(`${result.issueUrl}\n`);
|
|
101
101
|
}
|
|
102
102
|
else {
|
|
103
|
-
io
|
|
103
|
+
writeHuman(command, io, formatFeedbackHuman(result));
|
|
104
104
|
}
|
|
105
105
|
io.setExitCode(result.ok ? 0 : 2);
|
|
106
106
|
}
|
|
107
107
|
function formatFeedbackHuman(result) {
|
|
108
|
-
if (!result.ok)
|
|
109
|
-
return
|
|
110
|
-
}
|
|
108
|
+
if (!result.ok)
|
|
109
|
+
return humanError(result.error);
|
|
111
110
|
const candidates = result.candidates ?? [];
|
|
112
111
|
const noCandidates = result.candidates !== undefined && candidates.length === 0;
|
|
113
112
|
return ([
|
|
@@ -123,11 +122,11 @@ function formatFeedbackHuman(result) {
|
|
|
123
122
|
...(noCandidates
|
|
124
123
|
? [
|
|
125
124
|
"candidates: none recorded",
|
|
126
|
-
"With no candidates, feedback draft and feedback issue
|
|
125
|
+
"With no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready.",
|
|
127
126
|
...(result.draft ? [`summary: ${result.draft.summary}`] : []),
|
|
128
127
|
]
|
|
129
128
|
: []),
|
|
130
|
-
// Every finding the run produced, so the second and third are one flag away
|
|
129
|
+
// Every finding the run produced, so the second and third are one flag away.
|
|
131
130
|
...(candidates.length > 1 || (candidates.length === 1 && result.draft === undefined)
|
|
132
131
|
? [
|
|
133
132
|
`candidates (${candidates.length}; choose one with --candidate <id>):`,
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { migrateStudies } from "../../study/migrate.js";
|
|
2
|
+
import { CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
|
|
3
|
+
function formatValue(value) {
|
|
4
|
+
const text = JSON.stringify(value);
|
|
5
|
+
return text.length > 80 ? `${text.slice(0, 77)}...` : text;
|
|
6
|
+
}
|
|
7
|
+
/** Each file's source, destination, moved keys and dropped keys, printed before any write. */
|
|
8
|
+
function formatMigratePlan(files) {
|
|
9
|
+
const lines = [];
|
|
10
|
+
for (const file of files) {
|
|
11
|
+
if (file.action === "skip") {
|
|
12
|
+
lines.push(`${file.source}: already humanish.study.v3, skipped`);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const where = file.action === "move" ? `-> ${file.destination}` : "(rewritten in place)";
|
|
16
|
+
lines.push(`${file.source} ${where} (route: ${file.route})`);
|
|
17
|
+
if (file.moved.length > 0)
|
|
18
|
+
lines.push(` moved: ${file.moved.map((key) => `${key.from} -> ${key.to}`).join(", ")}`);
|
|
19
|
+
for (const key of file.dropped) {
|
|
20
|
+
lines.push(` dropped ${key.path}: ${formatValue(key.value)} (the ${file.route} route never reads it)`);
|
|
21
|
+
if (key.comments)
|
|
22
|
+
lines.push(` its comment: ${key.comments.replace(/\n/g, " ")}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return lines.length > 0 ? `${lines.join("\n")}\n` : "No study files to convert.\n";
|
|
26
|
+
}
|
|
27
|
+
function formatMigrateOutcome(result) {
|
|
28
|
+
if (result.error) {
|
|
29
|
+
const where = result.error.file ? ` ${result.error.file}` : "";
|
|
30
|
+
return `${result.error.code} (${result.error.phase})${where}: ${result.error.message}\n`;
|
|
31
|
+
}
|
|
32
|
+
const written = result.files.filter((file) => file.action !== "skip").length;
|
|
33
|
+
const files = written === 1 ? "1 study file" : `${written} study files`;
|
|
34
|
+
if (result.dryRun)
|
|
35
|
+
return `Dry run: nothing was written. ${files} would change.\n`;
|
|
36
|
+
return written === 0 ? "No v2 study files to convert.\n" : `Converted ${files}.\n`;
|
|
37
|
+
}
|
|
38
|
+
/** `humanish migrate`. */
|
|
39
|
+
export function registerMigrateCommand(parent, io) {
|
|
40
|
+
parent
|
|
41
|
+
.command("migrate")
|
|
42
|
+
.description("Convert humanish.lab.v2 study files to humanish.study.v3. A file under a labs/ directory moves to the matching studies/ directory; any other file is rewritten in place. An original that a failure leaves out of place is kept as <name>.v2.bak. Pass the files to convert; without any, the six study directories are scanned. Every destination, moved key and dropped key is printed before anything is written. A file that changes during the run is kept and listed.")
|
|
43
|
+
.summary("Convert v2 study files to v3.")
|
|
44
|
+
// The paths are read from the command's arguments without a declared argument, so the root
|
|
45
|
+
// --help row stays `migrate [options]` and fits its column; this command's own help shows them.
|
|
46
|
+
.usage("[options] [path...]")
|
|
47
|
+
.allowExcessArguments(true)
|
|
48
|
+
.option("--dry-run", "Print what would change and write nothing.")
|
|
49
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
50
|
+
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
51
|
+
.action(async (options, command) => {
|
|
52
|
+
const paths = command.args;
|
|
53
|
+
const json = wantsJson(command);
|
|
54
|
+
const result = await migrateStudies({
|
|
55
|
+
cwd: options.cwd,
|
|
56
|
+
paths,
|
|
57
|
+
dryRun: options.dryRun === true,
|
|
58
|
+
// The plan is printed before anything is written; with --json it goes to stderr, so stdout
|
|
59
|
+
// stays one JSON document.
|
|
60
|
+
onPlan: (files) => (json ? io.writeErr : io.writeOut)(formatMigratePlan(files)),
|
|
61
|
+
});
|
|
62
|
+
writeResult(command, io, result, formatMigrateOutcome);
|
|
63
|
+
io.setExitCode(result.ok ? 0 : 2);
|
|
64
|
+
});
|
|
65
|
+
}
|