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
package/dist/cli/io.js
CHANGED
|
@@ -3,10 +3,11 @@ import { DEFAULT_ANALYSIS_MAX_COST_USD } from "../analysis/automatic-config.js";
|
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
4
|
import { dirname, resolve } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import { Command } from "commander";
|
|
6
|
+
import { Command, Option } from "commander";
|
|
7
7
|
import { loadEnvFile } from "../keys/env-file.js";
|
|
8
8
|
import { discoverProviderKeys } from "../keys/key-resolution.js";
|
|
9
9
|
import { deriveRunFacts } from "./telemetry.js";
|
|
10
|
+
import { withQueuedWarnings } from "./deprecations.js";
|
|
10
11
|
import { forTerminal } from "../routes/terminal/encoding.js";
|
|
11
12
|
export const CLI_RESPONSE_SCHEMA = "humanish.cli-response.v1";
|
|
12
13
|
function readCliVersion() {
|
|
@@ -17,11 +18,19 @@ function readCliVersion() {
|
|
|
17
18
|
: "0.0.0";
|
|
18
19
|
}
|
|
19
20
|
export const CLI_VERSION = readCliVersion();
|
|
20
|
-
//
|
|
21
|
-
//
|
|
21
|
+
// One text per shared flag, so the same flag reads the same on every command.
|
|
22
|
+
// tests/cli/shared-options.test.ts walks the program and holds every use to these.
|
|
22
23
|
export const JSON_OPTION_DESCRIPTION = "Print a machine-readable JSON response.";
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
export const CWD_OPTION_DESCRIPTION = "Project directory.";
|
|
25
|
+
export const RUN_OPTION_DESCRIPTION = "Run id, or latest.";
|
|
26
|
+
export const ENV_FILE_OPTION_DESCRIPTION = "Load unset variables from this env file. Values are never printed or saved.";
|
|
27
|
+
export const PORT_OPTION_DESCRIPTION = "Port to listen on at 127.0.0.1.";
|
|
28
|
+
/** `--port` for a loopback server whose default, 0, lets the OS pick a free port. */
|
|
29
|
+
export function freePortOption() {
|
|
30
|
+
return new Option("--port <port>", PORT_OPTION_DESCRIPTION).default("0", "a free port");
|
|
31
|
+
}
|
|
32
|
+
// Transcode only for a terminal. A pipe carries bytes to another program, and mangling those would
|
|
33
|
+
// corrupt a JSON payload for a reader that handles UTF-8 perfectly well, while a TTY carries them
|
|
25
34
|
// to a font, through a locale that may not decode them. See src/routes/terminal/encoding.ts for what a
|
|
26
35
|
// participant actually read back off the screen.
|
|
27
36
|
const forStream = (stream, text) => stream.isTTY === true ? forTerminal(text) : text;
|
|
@@ -37,7 +46,7 @@ export const defaultIo = {
|
|
|
37
46
|
// of the invocation (a fresh object every createProgram() call) rather than a
|
|
38
47
|
// module-level boolean, so tests that construct multiple `createProgram()`
|
|
39
48
|
// instances in the same process never see one instance's writes bleed into
|
|
40
|
-
// another's, and nothing needs explicit cleanup
|
|
49
|
+
// another's, and nothing needs explicit cleanup: the entry is released once
|
|
41
50
|
// that Command tree is garbage collected.
|
|
42
51
|
const invocationEnvelopeWritten = new WeakSet();
|
|
43
52
|
function rootCommandOf(command) {
|
|
@@ -77,7 +86,7 @@ export async function applyEnvFileOption(args) {
|
|
|
77
86
|
return true;
|
|
78
87
|
}
|
|
79
88
|
/**
|
|
80
|
-
* Provider-key discovery
|
|
89
|
+
* Provider-key discovery: fill still-missing keys from the documented project overlay, the
|
|
81
90
|
* owning vendors' native stores, and the humanish user store. It is fill-only (an explicit
|
|
82
91
|
* --env-file or process env always wins), and each fill is announced by name and source on
|
|
83
92
|
* stderr, never by value. HUMANISH_STRICT_KEYS=1 restores env-only behavior.
|
|
@@ -97,7 +106,7 @@ export async function discoverCliKeys(args) {
|
|
|
97
106
|
// Discovery must never break a command; a rung that fails to read is a miss, not an error.
|
|
98
107
|
}
|
|
99
108
|
}
|
|
100
|
-
export function
|
|
109
|
+
export function parseStudyCount(value, fallback) {
|
|
101
110
|
return value === undefined ? fallback : parsePositiveInteger(value);
|
|
102
111
|
}
|
|
103
112
|
export function parseParticipantIds(value) {
|
|
@@ -115,21 +124,60 @@ export function parseParticipantIds(value) {
|
|
|
115
124
|
}
|
|
116
125
|
return participantIds;
|
|
117
126
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
127
|
+
/**
|
|
128
|
+
* The command to run next, by code. A code is listed only when its messages do not already name a
|
|
129
|
+
* command: the run-not-found and missing-study messages do.
|
|
130
|
+
*/
|
|
131
|
+
const NEXT_COMMAND = {
|
|
132
|
+
HUMANISH_STUDY_NOT_FOUND: "humanish study list",
|
|
133
|
+
};
|
|
134
|
+
/** `<command> failed: <message>`, then `code: <CODE>`, then `next: <command>` when one is known. */
|
|
135
|
+
export function formatCliError(command, error) {
|
|
136
|
+
const next = error.code === undefined ? undefined : NEXT_COMMAND[error.code];
|
|
137
|
+
return ([
|
|
138
|
+
`${command} failed: ${error.message}`,
|
|
139
|
+
...(error.code === undefined ? [] : [`code: ${error.code}`]),
|
|
140
|
+
...(next === undefined ? [] : [`next: ${next}`]),
|
|
141
|
+
].join("\n") + "\n");
|
|
142
|
+
}
|
|
143
|
+
/** A result whose human output is its message: stdout when it passed, stderr when it failed. */
|
|
144
|
+
export function messageOutput(value) {
|
|
145
|
+
return value.ok ? `${value.message}\n` : { error: { message: value.message } };
|
|
146
|
+
}
|
|
147
|
+
/** A failed result's human output: its error on stderr and nothing on stdout. */
|
|
148
|
+
export function humanError(error) {
|
|
149
|
+
return { error: error ?? { message: "the command failed without a recorded error" } };
|
|
150
|
+
}
|
|
151
|
+
/** "humanish study show": the command's path as a person types it. */
|
|
152
|
+
function commandLabel(command) {
|
|
153
|
+
const names = [];
|
|
154
|
+
for (let current = command; current !== null; current = current.parent)
|
|
155
|
+
names.unshift(current.name());
|
|
156
|
+
return names.join(" ");
|
|
157
|
+
}
|
|
158
|
+
/** Prints a human formatter's output: text to stdout, an error to stderr through formatCliError. */
|
|
159
|
+
export function writeHuman(command, io, human) {
|
|
160
|
+
if (typeof human === "string") {
|
|
161
|
+
io.writeOut(human);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (human.stdout)
|
|
165
|
+
io.writeOut(human.stdout);
|
|
166
|
+
if (human.error)
|
|
167
|
+
io.writeErr(formatCliError(commandLabel(command), human.error));
|
|
168
|
+
}
|
|
122
169
|
export function writeResult(command, io, result, formatHuman) {
|
|
123
170
|
const output = automaticAnalysisEnvelope(result);
|
|
124
171
|
if (wantsJson(command)) {
|
|
125
|
-
|
|
172
|
+
// Queued warnings are on stderr already; a JSON caller gets them in warnings[] as well.
|
|
173
|
+
io.writeOut(`${JSON.stringify(withQueuedWarnings(command, output), null, 2)}\n`);
|
|
126
174
|
}
|
|
127
175
|
else {
|
|
128
|
-
io
|
|
176
|
+
writeHuman(command, io, formatHuman(output));
|
|
129
177
|
if (output !== null && typeof output === "object" && "automaticAnalysis" in output) {
|
|
130
178
|
const analysis = output.automaticAnalysis;
|
|
131
179
|
if (analysis)
|
|
132
|
-
io.writeOut(`analysis: ${
|
|
180
|
+
io.writeOut(`analysis: ${analysisOutcomeText(analysis)}\n`);
|
|
133
181
|
const rejected = analysis?.result?.rejectedOutputPath;
|
|
134
182
|
if (rejected)
|
|
135
183
|
io.writeOut(`analysis: ${analysis.result?.error?.code ?? "rejected"}; the rejected output is kept locally at ${rejected}\n`);
|
|
@@ -139,7 +187,7 @@ export function writeResult(command, io, result, formatHuman) {
|
|
|
139
187
|
}
|
|
140
188
|
markInvocationEnvelopeWritten(command);
|
|
141
189
|
// Every backend's result passes through here, so this is where a study's facts get read for
|
|
142
|
-
// telemetry
|
|
190
|
+
// telemetry. Reading them in each route instead is how they went unreported for two releases.
|
|
143
191
|
noteRunFacts(command, deriveRunFacts(result));
|
|
144
192
|
}
|
|
145
193
|
const runFactsByCommand = new WeakMap();
|
|
@@ -152,10 +200,10 @@ export function noteRunFacts(command, facts) {
|
|
|
152
200
|
export function runFactsFor(command) {
|
|
153
201
|
return { ...runFactsByCommand.get(command) };
|
|
154
202
|
}
|
|
203
|
+
/** A run result, or the preview route's study result: they differ only in `schema`. */
|
|
155
204
|
export function formatRunHuman(result) {
|
|
156
|
-
if (!result.ok)
|
|
157
|
-
return
|
|
158
|
-
}
|
|
205
|
+
if (!result.ok)
|
|
206
|
+
return humanError(result.error);
|
|
159
207
|
return ([
|
|
160
208
|
`humanish run ${result.mode}`,
|
|
161
209
|
`run: ${result.runId}`,
|
|
@@ -166,9 +214,8 @@ export function formatRunHuman(result) {
|
|
|
166
214
|
].join("\n") + "\n");
|
|
167
215
|
}
|
|
168
216
|
function formatEnvFileHuman(result) {
|
|
169
|
-
if (!result.ok)
|
|
170
|
-
return
|
|
171
|
-
}
|
|
217
|
+
if (!result.ok)
|
|
218
|
+
return humanError(result.error);
|
|
172
219
|
return ([
|
|
173
220
|
"humanish env-file loaded",
|
|
174
221
|
`env-file: ${result.envFile}`,
|
|
@@ -205,7 +252,7 @@ export function candidateOption(options) {
|
|
|
205
252
|
...(options.finding === undefined ? {} : { finding: options.finding }),
|
|
206
253
|
};
|
|
207
254
|
}
|
|
208
|
-
export function collectRepeated(value, previous) {
|
|
255
|
+
export function collectRepeated(value, previous = []) {
|
|
209
256
|
return [...previous, value];
|
|
210
257
|
}
|
|
211
258
|
export function wantsJson(command) {
|
|
@@ -218,6 +265,34 @@ export function wantsJson(command) {
|
|
|
218
265
|
}
|
|
219
266
|
return false;
|
|
220
267
|
}
|
|
268
|
+
/** What the automatic analysis did, in words; JSON output keeps the reason code. */
|
|
269
|
+
const ANALYSIS_REASON_TEXT = {
|
|
270
|
+
AUTOMATIC_ANALYSIS_DRY_RUN: "skipped for dry runs",
|
|
271
|
+
AUTOMATIC_ANALYSIS_KEY_MISSING: "skipped because OPENAI_API_KEY is not set",
|
|
272
|
+
AUTOMATIC_ANALYSIS_NO_PARTICIPANT_EVIDENCE: "skipped because no participant left evidence",
|
|
273
|
+
AUTOMATIC_ANALYSIS_ACTOR_CANCELLED: "skipped because the run stopped before its participants finished",
|
|
274
|
+
AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE: "skipped because the run's evidence could not be read",
|
|
275
|
+
AUTOMATIC_ANALYSIS_ALREADY_REQUESTED: "skipped because this run's analysis was already requested",
|
|
276
|
+
AUTOMATIC_ANALYSIS_BUSY: "skipped because another analysis is running",
|
|
277
|
+
AUTOMATIC_ANALYSIS_ADMISSION_REFUSED: "not started because its configuration or question was refused",
|
|
278
|
+
AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED: "not started because the run's cleanup was not confirmed",
|
|
279
|
+
AUTOMATIC_ANALYSIS_REUSED: "complete, reusing an earlier analysis of the same evidence",
|
|
280
|
+
AUTOMATIC_ANALYSIS_LIMITATIONS: "partial, because it covered only part of the evidence",
|
|
281
|
+
AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED: "partial, because it went over its estimated cost or output",
|
|
282
|
+
AUTOMATIC_ANALYSIS_FAILED: "failed",
|
|
283
|
+
AUTOMATIC_ANALYSIS_CANCELLED: "cancelled",
|
|
284
|
+
AUTOMATIC_ANALYSIS_CODEX_UNAVAILABLE: "failed because the Codex analyst could not run",
|
|
285
|
+
AUTOMATIC_ANALYSIS_PUBLICATION_FAILED: "failed because the report could not be saved",
|
|
286
|
+
AUTOMATIC_ANALYSIS_SOURCE_CHANGED: "failed because the run's evidence changed during analysis",
|
|
287
|
+
AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE: "outcome unknown: a cancellation could not be recorded",
|
|
288
|
+
AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE: "outcome unknown: analysis storage is unavailable",
|
|
289
|
+
AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN: "outcome unknown",
|
|
290
|
+
};
|
|
291
|
+
export function analysisOutcomeText(analysis) {
|
|
292
|
+
if (analysis.reason === null)
|
|
293
|
+
return analysis.state;
|
|
294
|
+
return ANALYSIS_REASON_TEXT[analysis.reason] ?? `${analysis.state} (${analysis.reason})`;
|
|
295
|
+
}
|
|
221
296
|
/** Preserve the run's own result while making requested post-processing failures machine-visible. */
|
|
222
297
|
function overBudgetAnalysisHint(result) {
|
|
223
298
|
const estimate = result.automaticAnalysis?.result?.admission?.estimatedCostUsd ?? null;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import type { ObserverResult, ObserverServer } from "../observer/render.js";
|
|
3
3
|
import type { ExposureRequest } from "../observer/exposure.js";
|
|
4
|
-
import { type CliIo, type
|
|
4
|
+
import { type CliIo, type StudyCommandOptions, type HumanOutput } from "./io.js";
|
|
5
5
|
/** How a command shows an Observer, decided before the run it shows starts. */
|
|
6
6
|
export interface ObserverPlan {
|
|
7
7
|
port: number;
|
|
@@ -31,7 +31,7 @@ export declare function showObserver(args: {
|
|
|
31
31
|
rendered: ObserverResult;
|
|
32
32
|
}): Promise<void>;
|
|
33
33
|
export declare function withObserverServer(rendered: ObserverResult, server: ObserverServer): ObserverResult;
|
|
34
|
-
export declare function formatObserverHuman(result: ObserverResult):
|
|
34
|
+
export declare function formatObserverHuman(result: ObserverResult): HumanOutput;
|
|
35
35
|
export type WatchStopSignal = "SIGINT" | "SIGTERM" | "SIGHUP";
|
|
36
36
|
interface WatchSignalTarget {
|
|
37
37
|
once(event: WatchStopSignal, listener: () => void): unknown;
|
|
@@ -52,5 +52,5 @@ export declare function watchExposeRequested(o: {
|
|
|
52
52
|
allowDomain?: string[] | undefined;
|
|
53
53
|
publicUrl?: string | undefined;
|
|
54
54
|
}): boolean;
|
|
55
|
-
export declare function exposureRequestFromOptions(options:
|
|
55
|
+
export declare function exposureRequestFromOptions(options: StudyCommandOptions): ExposureRequest;
|
|
56
56
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { serveObserver } from "../observer/render.js";
|
|
3
|
-
import { formatRunHuman, parseObserverPort, wantsJson, writeResult, } from "./io.js";
|
|
3
|
+
import { formatRunHuman, parseObserverPort, wantsJson, writeResult, humanError, } from "./io.js";
|
|
4
4
|
/**
|
|
5
5
|
* Parse --port and decide open and follow. On an invalid port it writes the failure, sets exit
|
|
6
6
|
* code 2 and returns null, so a caller refuses before starting a run.
|
|
@@ -64,9 +64,8 @@ export function withObserverServer(rendered, server) {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
export function formatObserverHuman(result) {
|
|
67
|
-
if (!result.ok)
|
|
68
|
-
return
|
|
69
|
-
}
|
|
67
|
+
if (!result.ok)
|
|
68
|
+
return humanError(result.error);
|
|
70
69
|
return ([
|
|
71
70
|
"humanish observer rendered",
|
|
72
71
|
`run: ${result.run}`,
|
|
@@ -134,8 +133,8 @@ export function exitCodeForSignal(signal) {
|
|
|
134
133
|
}
|
|
135
134
|
}
|
|
136
135
|
// True when any tunnel-edge exposure flag is present (not --safe, which is an orthogonal filter).
|
|
137
|
-
//
|
|
138
|
-
// desktop to stream.
|
|
136
|
+
// Callers refuse exposure with it on the watch path without a study and on non-computer-use routes, where
|
|
137
|
+
// there is no live desktop to stream.
|
|
139
138
|
export function watchExposeRequested(o) {
|
|
140
139
|
return (o.expose === true ||
|
|
141
140
|
o.tunnel !== undefined ||
|
|
@@ -145,7 +144,7 @@ export function watchExposeRequested(o) {
|
|
|
145
144
|
(o.allowDomain?.length ?? 0) > 0 ||
|
|
146
145
|
o.publicUrl !== undefined);
|
|
147
146
|
}
|
|
148
|
-
// Map
|
|
147
|
+
// Map StudyCommandOptions onto the shared exposure validator input.
|
|
149
148
|
export function exposureRequestFromOptions(options) {
|
|
150
149
|
return {
|
|
151
150
|
expose: options.expose === true,
|
|
@@ -3,14 +3,14 @@ export interface OrientationState {
|
|
|
3
3
|
schema: typeof ORIENTATION_SCHEMA;
|
|
4
4
|
/** Whether this project has a committed `humanish/` source plane. */
|
|
5
5
|
initialized: boolean;
|
|
6
|
-
/** Committed
|
|
7
|
-
|
|
8
|
-
/** Ids of a few
|
|
9
|
-
|
|
6
|
+
/** Committed and gitignored study files found in this project. */
|
|
7
|
+
studyCount: number;
|
|
8
|
+
/** Ids of a few studies worth naming in a suggestion. */
|
|
9
|
+
studyIds: string[];
|
|
10
10
|
/** Runs already on disk, and the most recent one if there is one. */
|
|
11
11
|
runCount: number;
|
|
12
12
|
latestRunId?: string;
|
|
13
|
-
/** The commands that make sense from
|
|
13
|
+
/** The commands that make sense from here, most useful first. */
|
|
14
14
|
nextCommands: OrientationCommand[];
|
|
15
15
|
}
|
|
16
16
|
interface OrientationCommand {
|
|
@@ -19,9 +19,12 @@ interface OrientationCommand {
|
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Read the project's state. Pure-ish: it only reads, never writes, and never touches the network or
|
|
22
|
-
* a provider
|
|
22
|
+
* a provider: bare invocation must not be able to spend money or mutate a repo.
|
|
23
23
|
*/
|
|
24
|
-
export declare function readOrientation(cwd: string
|
|
24
|
+
export declare function readOrientation(cwd: string, host?: {
|
|
25
|
+
platform: NodeJS.Platform;
|
|
26
|
+
arch: string;
|
|
27
|
+
}): Promise<OrientationState>;
|
|
25
28
|
/**
|
|
26
29
|
* The human rendering. Says where you are before it says what to do, because "what should I run"
|
|
27
30
|
* has no answer that is true in every project.
|
package/dist/cli/orientation.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// What `humanish` says when you run it with no arguments
|
|
1
|
+
// What `humanish` says when you run it with no arguments.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// Commander's help would print sixteen subcommands before any value, identical whether you
|
|
4
4
|
// had never run the tool or had a finished study sitting on disk. That is a poor first contact for
|
|
5
|
-
// a human, and it is worse for a coding agent, which needs to know
|
|
6
|
-
// a command
|
|
5
|
+
// a human, and it is worse for a coding agent, which needs to know where it is before it can choose
|
|
6
|
+
// a command; help is a menu, not an orientation.
|
|
7
7
|
//
|
|
8
8
|
// So bare invocation answers three questions instead: what is this, what state is this project in,
|
|
9
9
|
// and what should I run next. The answer is derived from the project rather than fixed, so it is
|
|
@@ -12,96 +12,138 @@
|
|
|
12
12
|
// Both audiences are served by the same data (docs/principles/three-roles.md). A human on a
|
|
13
13
|
// terminal gets prose and an offer to set things up; an agent gets the same facts as stable text,
|
|
14
14
|
// or as JSON with `--json`. Neither is a special case of the other bolted on afterwards.
|
|
15
|
-
import {
|
|
15
|
+
import { listStudyManifests } from "../study/discover.js";
|
|
16
16
|
import { listRuns } from "../run/stored-runs.js";
|
|
17
|
+
import { plural } from "../run/text.js";
|
|
18
|
+
import { supportsLocalBrowser } from "./first-run-path.js";
|
|
19
|
+
import { PRODUCT_SENTENCE } from "./product-sentence.js";
|
|
17
20
|
export const ORIENTATION_SCHEMA = "humanish.orientation.v1";
|
|
18
21
|
/**
|
|
19
22
|
* Read the project's state. Pure-ish: it only reads, never writes, and never touches the network or
|
|
20
|
-
* a provider
|
|
23
|
+
* a provider: bare invocation must not be able to spend money or mutate a repo.
|
|
21
24
|
*/
|
|
22
|
-
export async function readOrientation(cwd) {
|
|
23
|
-
const [
|
|
24
|
-
|
|
25
|
+
export async function readOrientation(cwd, host = process) {
|
|
26
|
+
const [found, runs] = await Promise.all([
|
|
27
|
+
listStudyManifests(cwd).catch(() => undefined),
|
|
25
28
|
listRuns(cwd).catch(() => undefined),
|
|
26
29
|
]);
|
|
27
|
-
const
|
|
28
|
-
.map((
|
|
30
|
+
const studyIds = (found?.studies ?? [])
|
|
31
|
+
.map((study) => study.id)
|
|
29
32
|
.filter((id) => typeof id === "string");
|
|
30
33
|
const runIds = (runs?.runs ?? [])
|
|
31
34
|
.map((run) => run.runId)
|
|
32
35
|
.filter((id) => typeof id === "string");
|
|
33
36
|
const latest = typeof runs?.latest === "string" ? runs.latest : runIds[0];
|
|
34
|
-
const
|
|
37
|
+
const retiredFiles = found?.retired ?? [];
|
|
38
|
+
const retired = {
|
|
39
|
+
v2: retiredFiles.filter((file) => file.code === "HUMANISH_STUDY_V2_UNSUPPORTED").length,
|
|
40
|
+
moved: retiredFiles.filter((file) => file.code === "HUMANISH_STUDY_RETIRED_DIRECTORY").length,
|
|
41
|
+
};
|
|
42
|
+
const initialized = (found?.studies ?? []).some((study) => study.origin === "committed") ||
|
|
43
|
+
studyIds.length > 0 ||
|
|
44
|
+
retiredFiles.length > 0;
|
|
35
45
|
return {
|
|
36
46
|
schema: ORIENTATION_SCHEMA,
|
|
37
47
|
initialized,
|
|
38
|
-
|
|
39
|
-
|
|
48
|
+
studyCount: studyIds.length,
|
|
49
|
+
studyIds: studyIds.slice(0, 3),
|
|
40
50
|
runCount: runIds.length,
|
|
41
51
|
...(latest === undefined ? {} : { latestRunId: latest }),
|
|
42
|
-
nextCommands: nextCommandsFor({
|
|
52
|
+
nextCommands: nextCommandsFor({
|
|
53
|
+
initialized,
|
|
54
|
+
studyIds,
|
|
55
|
+
retired,
|
|
56
|
+
hasRun: runIds.length > 0,
|
|
57
|
+
host,
|
|
58
|
+
}),
|
|
43
59
|
};
|
|
44
60
|
}
|
|
45
61
|
/**
|
|
46
62
|
* The two or three commands worth running from this state. Deliberately short: a list of everything
|
|
47
|
-
* is
|
|
63
|
+
* is commander's help, which nobody reads.
|
|
48
64
|
*/
|
|
49
65
|
function nextCommandsFor(args) {
|
|
66
|
+
const { v2, moved } = args.retired;
|
|
67
|
+
const fixes = [
|
|
68
|
+
...(v2 === 0
|
|
69
|
+
? []
|
|
70
|
+
: [
|
|
71
|
+
{
|
|
72
|
+
command: "humanish migrate --dry-run",
|
|
73
|
+
why: `${plural(v2, "study file")} ${v2 === 1 ? "uses" : "use"} humanish.lab.v2, which humanish no longer reads; this lists the conversion, and humanish migrate writes it`,
|
|
74
|
+
},
|
|
75
|
+
]),
|
|
76
|
+
...(moved === 0
|
|
77
|
+
? []
|
|
78
|
+
: [
|
|
79
|
+
{
|
|
80
|
+
command: "humanish study list",
|
|
81
|
+
why: `${plural(moved, "study file")} ${moved === 1 ? "is" : "are"} in a labs/ directory, which humanish no longer reads; this names each one and the studies/ directory to move it to`,
|
|
82
|
+
},
|
|
83
|
+
]),
|
|
84
|
+
];
|
|
85
|
+
// A fix that is already `humanish study list` replaces the plain suggestion of the same command.
|
|
86
|
+
const named = new Set(fixes.map((fix) => fix.command));
|
|
87
|
+
return [...fixes, ...nextCommandsForStudies(args).filter((next) => !named.has(next.command))];
|
|
88
|
+
}
|
|
89
|
+
function nextCommandsForStudies(args) {
|
|
90
|
+
const dryRun = {
|
|
91
|
+
command: "humanish run first-run",
|
|
92
|
+
why: "a dry run: no browser or model runs, no keys, no spend",
|
|
93
|
+
};
|
|
50
94
|
if (!args.initialized) {
|
|
51
95
|
return [
|
|
52
|
-
{ command: "humanish init", why: "create humanish/ with a starter lab and persona" },
|
|
53
96
|
{
|
|
54
|
-
command: "humanish
|
|
55
|
-
why: "
|
|
97
|
+
command: "humanish init --yes",
|
|
98
|
+
why: "write starter studies, personas and an AGENTS.md (--dry-run lists every file first)",
|
|
56
99
|
},
|
|
100
|
+
dryRun,
|
|
57
101
|
];
|
|
58
102
|
}
|
|
59
|
-
|
|
60
|
-
|
|
103
|
+
// The starter live study this host can run. The other starter studies are templates whose subject
|
|
104
|
+
// still names your-org/your-app, so they are never suggested.
|
|
105
|
+
const liveStudy = (supportsLocalBrowser(args.host.platform, args.host.arch)
|
|
106
|
+
? ["local-browser", "try-live"]
|
|
107
|
+
: ["try-live"]).find((id) => args.studyIds.includes(id));
|
|
108
|
+
if (!args.hasRun) {
|
|
109
|
+
return [
|
|
110
|
+
dryRun,
|
|
111
|
+
liveStudy === undefined
|
|
112
|
+
? { command: "humanish study list", why: "see the studies this project declares" }
|
|
113
|
+
: {
|
|
114
|
+
command: `humanish doctor --study ${liveStudy}`,
|
|
115
|
+
why: `check what the ${liveStudy} study still needs before a live run`,
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
return [
|
|
120
|
+
...(liveStudy === undefined
|
|
121
|
+
? []
|
|
122
|
+
: [{ command: `humanish run ${liveStudy}`, why: "run a real participant against an app" }]),
|
|
61
123
|
{
|
|
62
|
-
command: suggestedLab ? `humanish watch ${suggestedLab}` : "humanish watch",
|
|
63
|
-
why: "run a lab and open the Observer while it goes",
|
|
64
|
-
},
|
|
65
|
-
];
|
|
66
|
-
if (args.hasRun) {
|
|
67
|
-
commands.push({
|
|
68
124
|
command: "humanish verify --run latest",
|
|
69
125
|
why: "check the last run's evidence and public-safety gates",
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
why: "reopen the last run's Observer",
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
commands.push({ command: "humanish lab list", why: "see the labs this project declares" });
|
|
78
|
-
commands.push({
|
|
79
|
-
command: "humanish doctor",
|
|
80
|
-
why: "check what this project still needs before a live run",
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
return commands;
|
|
126
|
+
},
|
|
127
|
+
{ command: "humanish observe --run latest", why: "reopen the last run's Observer" },
|
|
128
|
+
];
|
|
84
129
|
}
|
|
85
130
|
/**
|
|
86
131
|
* The human rendering. Says where you are before it says what to do, because "what should I run"
|
|
87
132
|
* has no answer that is true in every project.
|
|
88
133
|
*/
|
|
89
134
|
export function formatOrientationHuman(state) {
|
|
90
|
-
const lines = [
|
|
91
|
-
"humanish — run realistic synthetic personas against your app and keep the evidence.",
|
|
92
|
-
"",
|
|
93
|
-
];
|
|
135
|
+
const lines = [`humanish: ${PRODUCT_SENTENCE}`, ""];
|
|
94
136
|
if (!state.initialized) {
|
|
95
137
|
lines.push("This project is not set up yet.");
|
|
96
138
|
}
|
|
97
139
|
else {
|
|
98
|
-
const
|
|
140
|
+
const studies = state.studyCount === 1 ? "1 study" : `${state.studyCount} studies`;
|
|
99
141
|
const runs = state.runCount === 0
|
|
100
142
|
? "no runs yet"
|
|
101
143
|
: state.runCount === 1
|
|
102
144
|
? "1 run"
|
|
103
145
|
: `${state.runCount} runs`;
|
|
104
|
-
lines.push(`This project has ${
|
|
146
|
+
lines.push(`This project has ${studies} and ${runs}${state.latestRunId ? ` (latest: ${state.latestRunId})` : ""}.`);
|
|
105
147
|
}
|
|
106
148
|
lines.push("");
|
|
107
149
|
for (const next of state.nextCommands) {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The product in one sentence. Line 3 of `README.md`, package.json's description, `humanish --help`,
|
|
3
|
+
* bare `humanish` and the humanish skill all use it; tests/cli/product-sentence.test.ts holds them
|
|
4
|
+
* equal.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PRODUCT_SENTENCE = "Synthetic user research for apps, CLIs, and agent-facing product flows.";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The product in one sentence. Line 3 of `README.md`, package.json's description, `humanish --help`,
|
|
3
|
+
* bare `humanish` and the humanish skill all use it; tests/cli/product-sentence.test.ts holds them
|
|
4
|
+
* equal.
|
|
5
|
+
*/
|
|
6
|
+
export const PRODUCT_SENTENCE = "Synthetic user research for apps, CLIs, and agent-facing product flows.";
|
package/dist/cli/program.d.ts
CHANGED
|
@@ -4,12 +4,17 @@ import { type CliIo } from "./io.js";
|
|
|
4
4
|
/**
|
|
5
5
|
* Enrich commander's flag rejections with where the flag actually lives. A bare "unknown option"
|
|
6
6
|
* is accurate and unhelpful in the same way `no labs here yet` was: it reports a fact about this
|
|
7
|
-
* command and says nothing the reader can act on. Silence is preserved when no sibling has it
|
|
7
|
+
* command and says nothing the reader can act on. Silence is preserved when no sibling has it:
|
|
8
8
|
* inventing a suggestion would be worse than none.
|
|
9
9
|
*/
|
|
10
10
|
export declare function withSiblingFlagHint(text: string, root: Command): string;
|
|
11
11
|
/** Drop the literal `--` that `pnpm <script> -- <args>` puts before the CLI's own arguments. */
|
|
12
12
|
export declare function normalizeCliArgv(argv: string[]): string[];
|
|
13
|
+
/**
|
|
14
|
+
* The root help's examples, in the order a newcomer runs them. Each passes on a freshly
|
|
15
|
+
* initialized project (tests/cli/root-help-examples.test.ts).
|
|
16
|
+
*/
|
|
17
|
+
export declare const ROOT_HELP_EXAMPLES: readonly ["humanish init --yes", "humanish run first-run", "humanish observe --run latest --open", "humanish doctor --study try-live", "humanish run try-live", "humanish verify --json"];
|
|
13
18
|
export declare function createProgram(io?: Partial<CliIo> & {
|
|
14
19
|
tuiRuntime?: Partial<TuiRuntime>;
|
|
15
20
|
}): Command;
|