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/examples/scorer/run.mjs
CHANGED
|
@@ -5,27 +5,26 @@ import { tmpdir } from "node:os";
|
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { promisify } from "node:util";
|
|
8
|
-
import {
|
|
8
|
+
import { STUDY_SCHEMA, parseStudy, runStudy, verifyRun } from "humanish";
|
|
9
9
|
import { score } from "./scorer.mjs";
|
|
10
10
|
|
|
11
|
-
// One scorer module, attached two ways to a dry run of a computer-use
|
|
11
|
+
// One scorer module, attached two ways to a dry run of a computer-use study: as library hooks and
|
|
12
12
|
// through the CLI's --scorer flag. A dry run needs no keys, desktop or running app.
|
|
13
|
-
const
|
|
14
|
-
schema:
|
|
13
|
+
const study = {
|
|
14
|
+
schema: STUDY_SCHEMA,
|
|
15
15
|
id: "scorer-example",
|
|
16
16
|
title: "Score a dry run",
|
|
17
|
+
route: "computer-use",
|
|
17
18
|
subject: { source: "app-url", appUrl: "http://127.0.0.1:3000/" },
|
|
18
|
-
|
|
19
|
-
{ type: "openai-computer-use", persona: "pixel-pat", mission: "Find the pricing page." },
|
|
20
|
-
],
|
|
19
|
+
actor: { type: "openai-computer-use", persona: "pixel-pat", mission: "Find the pricing page." },
|
|
21
20
|
execution: { target: "e2b-desktop" },
|
|
22
21
|
review: { analysis: false },
|
|
23
22
|
};
|
|
24
23
|
|
|
25
24
|
// A throwaway project directory; both runs write their bundles under its .humanish/runs/.
|
|
26
25
|
const project = await mkdtemp(join(tmpdir(), "humanish-scorer-example-"));
|
|
27
|
-
// JSON is valid YAML, so the CLI reads the same
|
|
28
|
-
await writeFile(join(project, "
|
|
26
|
+
// JSON is valid YAML, so the CLI reads the same study file the library call uses.
|
|
27
|
+
await writeFile(join(project, "study.yaml"), `${JSON.stringify(study, null, 2)}\n`);
|
|
29
28
|
await copyFile(new URL("./scorer.mjs", import.meta.url), join(project, "scorer.mjs"));
|
|
30
29
|
|
|
31
30
|
/** @param {string} runId */
|
|
@@ -37,9 +36,9 @@ async function scored(runId) {
|
|
|
37
36
|
return { runId, adapterScore: bundle.adapterScore, verified: verification.ok };
|
|
38
37
|
}
|
|
39
38
|
|
|
40
|
-
const parsed =
|
|
39
|
+
const parsed = parseStudy(study);
|
|
41
40
|
if (!parsed.ok) throw new Error(parsed.error.message);
|
|
42
|
-
const outcome = await
|
|
41
|
+
const outcome = await runStudy(parsed.config, { cwd: project, dryRun: true, scorer: { score } });
|
|
43
42
|
if (outcome.route !== "computer-use" || !outcome.result.ok) {
|
|
44
43
|
throw new Error(`Library dry run failed: ${JSON.stringify(outcome.result)}`);
|
|
45
44
|
}
|
|
@@ -49,7 +48,7 @@ const library = await scored(outcome.result.runId);
|
|
|
49
48
|
const bin = fileURLToPath(new URL("./cli.js", import.meta.resolve("humanish")));
|
|
50
49
|
const { stdout } = await promisify(execFile)(
|
|
51
50
|
process.execPath,
|
|
52
|
-
[bin, "
|
|
51
|
+
[bin, "run", "study.yaml", "--dry-run", "--no-open", "--scorer", "scorer.mjs", "--json"],
|
|
53
52
|
{ cwd: project },
|
|
54
53
|
);
|
|
55
54
|
const cli = await scored(JSON.parse(stdout).runId);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
// A scorer module: humanish calls `score` over the finished evidence of a computer-use,
|
|
3
3
|
// shared-world or terminal run and stores the result, under your namespace, as
|
|
4
|
-
// `bundle.adapterScore`. The same file works with `humanish
|
|
5
|
-
// from a library caller, as the scorer hooks passed to `
|
|
4
|
+
// `bundle.adapterScore`. The same file works with `humanish run <study> --scorer scorer.mjs` and,
|
|
5
|
+
// from a library caller, as the scorer hooks passed to `runStudy`.
|
|
6
6
|
|
|
7
7
|
/** @type {NonNullable<import("humanish").AdapterScorerModule["score"]>} */
|
|
8
8
|
export function score(ctx) {
|
|
@@ -14,7 +14,7 @@ export function score(ctx) {
|
|
|
14
14
|
// A dry run has no participant behavior to judge, so this rubric withholds a pass.
|
|
15
15
|
status: dryRun ? "partial" : "pass",
|
|
16
16
|
score: dryRun ? 50 : 100,
|
|
17
|
-
summary: `${participants} participant stream(s) in ${ctx.
|
|
17
|
+
summary: `${participants} participant stream(s) in ${ctx.studyId}${dryRun ? " (dry run)" : ""}.`,
|
|
18
18
|
data: { participants, runId: ctx.runId },
|
|
19
19
|
};
|
|
20
20
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "humanish",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.109.0",
|
|
4
|
+
"description": "Synthetic user research for apps, CLIs, and agent-facing product flows.",
|
|
5
5
|
"keywords": [
|
|
6
|
-
"agent-harness",
|
|
7
6
|
"cli",
|
|
8
|
-
"
|
|
7
|
+
"computer-use",
|
|
8
|
+
"synthetic-users",
|
|
9
9
|
"ui-testing",
|
|
10
|
+
"usability-testing",
|
|
11
|
+
"user-research",
|
|
10
12
|
"ux-research"
|
|
11
13
|
],
|
|
12
14
|
"homepage": "https://github.com/danielgwilson/humanish#readme",
|
|
@@ -23,25 +25,19 @@
|
|
|
23
25
|
"humanish": "./dist/cli.js"
|
|
24
26
|
},
|
|
25
27
|
"files": [
|
|
26
|
-
"AGENTS.md",
|
|
27
28
|
"CHANGELOG.md",
|
|
28
29
|
"dist",
|
|
30
|
+
"docs/README.md",
|
|
29
31
|
"docs/architecture",
|
|
30
|
-
"docs/assets",
|
|
31
32
|
"docs/contracts",
|
|
32
33
|
"docs/decisions",
|
|
33
|
-
"docs/goals/current.md",
|
|
34
34
|
"docs/principles",
|
|
35
35
|
"docs/product",
|
|
36
|
-
"docs/ramp",
|
|
37
|
-
"docs/release",
|
|
38
|
-
"docs/roadmap",
|
|
39
36
|
"examples",
|
|
40
37
|
"skills",
|
|
41
38
|
"README.md",
|
|
42
39
|
"LICENSE",
|
|
43
40
|
"SECURITY.md",
|
|
44
|
-
"CONTRIBUTING.md",
|
|
45
41
|
"ARCHITECTURE.md",
|
|
46
42
|
"CONTEXT.md",
|
|
47
43
|
"TELEMETRY.md"
|
|
@@ -60,7 +56,7 @@
|
|
|
60
56
|
},
|
|
61
57
|
"scripts": {
|
|
62
58
|
"build": "tsc -p tsconfig.build.json && pnpm --filter humanish-observer build && pnpm --filter humanish-tui build && node scripts/finish-build.mjs",
|
|
63
|
-
"check": "pnpm format:check && pnpm lint && pnpm knip && pnpm prose:check && pnpm vocabulary:check && pnpm typecheck && pnpm test && pnpm tui:test && pnpm build && pnpm guest-media:startup:proof && pnpm cli:startup:test && pnpm cli:preflight:test && pnpm tui:smoke",
|
|
59
|
+
"check": "pnpm format:check && pnpm lint && pnpm knip && pnpm prose:check && pnpm vocabulary:check && pnpm site-css:check && pnpm typecheck && pnpm test && pnpm tui:test && pnpm build && pnpm guest-media:startup:proof && pnpm cli:startup:test && pnpm cli:preflight:test && pnpm tui:smoke",
|
|
64
60
|
"cli:startup:test": "node scripts/terminal-startup-exit-proof.mjs",
|
|
65
61
|
"cli:preflight:test": "node scripts/task-route-preflight-proof.mjs",
|
|
66
62
|
"humanish": "tsx src/cli.ts",
|
|
@@ -69,7 +65,7 @@
|
|
|
69
65
|
"public-surface:scan": "node scripts/public-surface-scan.mjs",
|
|
70
66
|
"api:proof": "node scripts/public-api-proof.mjs",
|
|
71
67
|
"release:check": "pnpm check && pnpm api:proof && pnpm public-surface:scan && pnpm skill:check && npm pack --dry-run",
|
|
72
|
-
"skill:check": "DISABLE_TELEMETRY=1
|
|
68
|
+
"skill:check": "DISABLE_TELEMETRY=1 pnpm exec skills add . --list",
|
|
73
69
|
"test": "vitest run",
|
|
74
70
|
"typecheck": "tsc -p tsconfig.json --noEmit && pnpm --filter humanish-observer typecheck && pnpm --filter humanish-tui typecheck",
|
|
75
71
|
"tui:typecheck": "pnpm --filter humanish-tui typecheck",
|
|
@@ -80,7 +76,7 @@
|
|
|
80
76
|
"docs:generate": "tsx scripts/generate-cli-docs.ts",
|
|
81
77
|
"docs:check": "tsx scripts/generate-cli-docs.ts --check && tsx scripts/check-doc-paths.ts && tsx scripts/check-doc-symbols.ts && tsx scripts/check-doc-comments.ts",
|
|
82
78
|
"observer:browser:proof": "node scripts/observer-browser-proof.mjs",
|
|
83
|
-
"observer:iframe:proof": "node scripts/observer-iframe-proof.mjs",
|
|
79
|
+
"observer:iframe:proof": "node --import tsx scripts/observer-iframe-proof.mjs",
|
|
84
80
|
"observer:chrome:proof": "node scripts/observer-chrome-proof.mjs",
|
|
85
81
|
"observer:reliability:proof": "node scripts/observer-reliability-proof.mjs",
|
|
86
82
|
"tui:connections:proof": "python3 scripts/tui-connections-proof.py",
|
|
@@ -90,10 +86,12 @@
|
|
|
90
86
|
"comms:agentmail:contract": "node --import tsx scripts/agentmail-contract-check.mjs",
|
|
91
87
|
"format": "oxfmt",
|
|
92
88
|
"format:check": "oxfmt --check",
|
|
93
|
-
"lint": "node scripts/check-lint-cap.mjs --max-warnings=
|
|
89
|
+
"lint": "node scripts/check-lint-cap.mjs --max-warnings=440",
|
|
94
90
|
"knip": "knip",
|
|
95
|
-
"prose:check": "node scripts/check-code-prose.mjs
|
|
96
|
-
"vocabulary:check": "tsx scripts/check-retired-words.ts
|
|
91
|
+
"prose:check": "node scripts/check-code-prose.mjs",
|
|
92
|
+
"vocabulary:check": "tsx scripts/check-retired-words.ts",
|
|
93
|
+
"site-css:check": "node scripts/check-site-css.mjs",
|
|
94
|
+
"site:hero:proof": "node scripts/site-hero-wrap-proof.mjs"
|
|
97
95
|
},
|
|
98
96
|
"dependencies": {
|
|
99
97
|
"commander": "^15.0.0",
|
|
@@ -114,6 +112,7 @@
|
|
|
114
112
|
"oxfmt": "0.71.0",
|
|
115
113
|
"oxlint": "1.86.0",
|
|
116
114
|
"oxlint-tsgolint": "7.0.2003",
|
|
115
|
+
"skills": "1.7.0",
|
|
117
116
|
"tsx": "^4.23.15",
|
|
118
117
|
"typescript": "catalog:",
|
|
119
118
|
"vitest": "catalog:"
|
package/skills/humanish/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: humanish
|
|
3
|
-
description: Install and configure humanish CLI in a JavaScript app
|
|
3
|
+
description: Synthetic user research for apps, CLIs, and agent-facing product flows. Install and configure the humanish CLI in a JavaScript app. Use when an agent needs to add humanish, run safe first setup, create synthetic personas or scenarios, configure env var names without values, capture the email an app sends so a persona can complete an email-gated flow (e.g. a signup verification link or one-time code), run verification and Observer commands, or draft public-safe feedback issues without GitHub mutation.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# humanish CLI
|
|
@@ -32,9 +32,9 @@ Everything it shows has a machine-readable equivalent, which is what you want:
|
|
|
32
32
|
|
|
33
33
|
| Instead of the TUI | Use |
|
|
34
34
|
| ------------------- | -------------------------------------------------------------------------------------- |
|
|
35
|
-
| browsing
|
|
35
|
+
| browsing studies | `npx humanish study list --json` |
|
|
36
36
|
| browsing runs | `npx humanish runs --json` |
|
|
37
|
-
| starting a run | `npx humanish
|
|
37
|
+
| starting a run | `npx humanish run <study> --json --no-open` |
|
|
38
38
|
| a run's outcome | `npx humanish review --run <id> --json` |
|
|
39
39
|
| communication setup | `npx humanish comms providers --json` and `npx humanish comms connections list --json` |
|
|
40
40
|
|
|
@@ -51,7 +51,7 @@ authorized credential source), followed by
|
|
|
51
51
|
and `HUMANISH_STRICT_KEYS=1` still apply. Read installed provider capabilities:
|
|
52
52
|
use `humanish comms check --online --json` for read-only authentication.
|
|
53
53
|
Authentication does not establish mailbox permissions, capacity or delivery.
|
|
54
|
-
`humanish comms configure --
|
|
54
|
+
`humanish comms configure --study <path> --json` previews an ignored study copy;
|
|
55
55
|
add `--apply --plan-token <digest>` to save the reviewed version. Launch its
|
|
56
56
|
exact returned path, not a basename that could resolve to another manifest.
|
|
57
57
|
|
|
@@ -87,9 +87,9 @@ exact returned path, not a basename that could resolve to another manifest.
|
|
|
87
87
|
5. Confirm the layout:
|
|
88
88
|
- commit `humanish/` source files;
|
|
89
89
|
- ignore `.humanish/` runtime artifacts;
|
|
90
|
-
- keep committed
|
|
91
|
-
- keep private/local
|
|
92
|
-
`.humanish/local/
|
|
90
|
+
- keep committed studies under `humanish/studies/*.yaml`;
|
|
91
|
+
- keep private/local studies under ignored `.humanish/studies/*.yaml` or
|
|
92
|
+
`.humanish/local/studies/*.yaml`;
|
|
93
93
|
- keep `.env.example` commit-safe and value-free;
|
|
94
94
|
- never commit generated run bundles.
|
|
95
95
|
|
|
@@ -109,34 +109,34 @@ Do not pass numeric `maxCostUsd`/`maxOutputTokens` or their CLI flags to the
|
|
|
109
109
|
account branch. It cannot enforce those ceilings and rejects them. Account dollar
|
|
110
110
|
cost remains unknown even when token usage is reported. There is no fallback to
|
|
111
111
|
an API key or another provider. `analyze --dry-run --provider codex` validates
|
|
112
|
-
local evidence/configuration only; `doctor --
|
|
112
|
+
local evidence/configuration only; `doctor --study` checks setup without a model
|
|
113
113
|
request. Inspect a failed attempt before explicitly retrying `--provider codex
|
|
114
114
|
--rerun`. Opening Observer never starts analysis.
|
|
115
115
|
|
|
116
116
|
## Local browser setup
|
|
117
117
|
|
|
118
118
|
On Linux x64 with local rootful Docker, KVM and TUN, or a supported M3-or-newer
|
|
119
|
-
Mac with native ARM64 Node and Lima 2.2+, an `app-url`
|
|
119
|
+
Mac with native ARM64 Node and Lima 2.2+, an `app-url` study can set `execution.target: local` and `actor.type: local-agent` with
|
|
120
120
|
`localAgent: codex`. It uses the supported Codex ChatGPT login, not E2B or an
|
|
121
121
|
OpenAI API key. Inference is remote and consumes account quota. Existing hosted
|
|
122
|
-
|
|
122
|
+
studies stay hosted; never silently change their execution or billing provider.
|
|
123
123
|
|
|
124
|
-
Use `humanish runtime status --json` and `humanish doctor --
|
|
124
|
+
Use `humanish runtime status --json` and `humanish doctor --study <path> --json`
|
|
125
125
|
for read-only setup inspection. `humanish runtime setup` downloads and verifies
|
|
126
126
|
the pinned runtime; a live local run also prepares it automatically. The normal
|
|
127
|
-
`humanish
|
|
128
|
-
See [the complete example and limits](
|
|
127
|
+
`humanish run <path>` command and TUI use the same study runner and Observer.
|
|
128
|
+
See [the complete example and limits](https://humanish.dev/docs/local-browser).
|
|
129
129
|
|
|
130
130
|
Local browsers currently require a loopback app URL with an explicit port above
|
|
131
131
|
1023 and use a 960×720 Chromium desktop. For email-gated local apps, start
|
|
132
132
|
`humanish comms catch`, point the app's email sends at it, and declare
|
|
133
|
-
`comms.email.external.catchBaseUrl`. Use `doctor --
|
|
133
|
+
`comms.email.external.catchBaseUrl`. Use `doctor --study` to check its recipient
|
|
134
134
|
routes. This captures app sends without mailbox-provider credentials; it does
|
|
135
135
|
not receive arbitrary internet email. Each participant gets only its assigned
|
|
136
136
|
inbox through the local desktop. Real receiving still needs a supported hosted
|
|
137
|
-
route. See [captured inbox setup](
|
|
137
|
+
route. See [captured inbox setup](https://humanish.dev/docs/comms-inbox#local-browser-studies).
|
|
138
138
|
Optional camera and spoken conversation require a separate media
|
|
139
|
-
runtime; follow [participant media](
|
|
139
|
+
runtime; follow [participant media](https://humanish.dev/docs/participant-media)
|
|
140
140
|
for setup and provider limits. Speech uses the same continuing Codex participant,
|
|
141
141
|
not a second conversation. Do not claim that installing the CLI also installs
|
|
142
142
|
Docker or Lima, or qualifies a machine for arbitrary participant counts.
|
|
@@ -144,14 +144,14 @@ Docker or Lima, or qualifies a machine for arbitrary participant counts.
|
|
|
144
144
|
For continuous desktop playback, independent computer-use participants can opt into
|
|
145
145
|
`execution.desktop.recording: { audio: true }` (`false` for screen-only video).
|
|
146
146
|
Screenshots remain the default. Recording does not enable camera or speech;
|
|
147
|
-
the raw media stays local-only. See [desktop recording](
|
|
147
|
+
the raw media stays local-only. See [desktop recording](https://humanish.dev/docs/desktop-recording)
|
|
148
148
|
for runtime requirements and export limits.
|
|
149
149
|
|
|
150
150
|
## Format Stack
|
|
151
151
|
|
|
152
152
|
When creating or editing humanish files:
|
|
153
153
|
|
|
154
|
-
- use `.yaml` for human-authored humanish source:
|
|
154
|
+
- use `.yaml` for human-authored humanish source: studies, personas and scenarios;
|
|
155
155
|
- use `.mjs` for executable adopter scorers named by `review.scorer.ref`;
|
|
156
156
|
- use `.json` or `.ndjson` for generated machine artifacts, Observer data, run
|
|
157
157
|
bundles, event streams, and synthetic fixtures.
|
|
@@ -188,9 +188,9 @@ background: |
|
|
|
188
188
|
A profile with `background` receives only explicitly declared trait directives.
|
|
189
189
|
Legacy profiles without it retain medium defaults for missing patience and
|
|
190
190
|
technical confidence. Avoid contradictory prose and traits; inspect the compiled
|
|
191
|
-
brief with `humanish
|
|
191
|
+
brief with `humanish study show <study> --json` before running.
|
|
192
192
|
|
|
193
|
-
For an autonomous participant study, use a computer-use/local-agent
|
|
193
|
+
For an autonomous participant study, use a computer-use/local-agent study and write
|
|
194
194
|
its `mission` as a believable situation and desired outcome. Supply fixture facts
|
|
195
195
|
needed to act, but do not supply selectors, click sequences, hidden success rules,
|
|
196
196
|
expected defects or recovery tricks. For example: “Saturday's event needs two
|
|
@@ -230,42 +230,46 @@ and `waitForSelector`. Supported expectations are `text`, `selectorVisible`,
|
|
|
230
230
|
values only. Do not write real emails, names, customer data, tickets, logs, or
|
|
231
231
|
tokens into scenario files.
|
|
232
232
|
|
|
233
|
-
## Authoring
|
|
233
|
+
## Authoring Studies
|
|
234
234
|
|
|
235
|
-
|
|
235
|
+
Write reusable studies as `.yaml` study files (`humanish.study.v3`):
|
|
236
236
|
|
|
237
237
|
```yaml
|
|
238
|
-
schema: humanish.
|
|
238
|
+
schema: humanish.study.v3
|
|
239
239
|
id: first-run
|
|
240
240
|
title: First-run synthetic Observer
|
|
241
|
+
route: preview
|
|
242
|
+
mode: dry-run
|
|
241
243
|
subject:
|
|
242
244
|
source: this-repo
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
scenario:
|
|
247
|
-
mode: dry-run
|
|
245
|
+
actor:
|
|
246
|
+
type: synthetic-persona
|
|
247
|
+
participants: 4
|
|
248
248
|
defaults:
|
|
249
249
|
open: true
|
|
250
250
|
```
|
|
251
251
|
|
|
252
|
-
A
|
|
253
|
-
`
|
|
254
|
-
`
|
|
255
|
-
|
|
252
|
+
A study declares its `route` (`preview`, `computer-use`, `shared-world`, `terminal` or
|
|
253
|
+
`scripted`) and composes `subject`, `actor`, `participants`, `caps`, `execution` and
|
|
254
|
+
`policies` for it; a key the route does not read is a parse error that names the route.
|
|
255
|
+
Run `npx humanish study show <study>` to see how a study file parses. humanish
|
|
256
|
+
no longer runs a `humanish.lab.v2` file from 0.107: it fails with
|
|
257
|
+
`HUMANISH_STUDY_V2_UNSUPPORTED`. `npx humanish migrate` rewrites every v2 file as v3
|
|
258
|
+
under `studies/`, and `--dry-run` lists them first. A v3 file left in a `labs/` folder
|
|
259
|
+
fails with `HUMANISH_STUDY_RETIRED_DIRECTORY`; move it to the matching `studies/` folder.
|
|
256
260
|
|
|
257
261
|
### Many actors at once (fan-out, shared worlds, concurrency)
|
|
258
262
|
|
|
259
|
-
- **Every declared participant runs live at once by default.** A 6-
|
|
260
|
-
|
|
263
|
+
- **Every declared participant runs live at once by default.** A 6-entry
|
|
264
|
+
`participants` list is 6 simultaneous actors; total sessions and spend are the same either
|
|
261
265
|
way, only wall-clock and simultaneity differ. `execution.concurrency` is a
|
|
262
266
|
CAP, not a mode: declare it only to bound simultaneous paid desktops, and
|
|
263
267
|
expect a parse warning when the cap makes participants run in waves (a green
|
|
264
268
|
waved run looks identical to the all-live run you meant, so the harness says
|
|
265
269
|
so up front).
|
|
266
270
|
- **Separate worlds (`per-lane-worlds`) vs one shared world.** A plain
|
|
267
|
-
multi-participant computer-use
|
|
268
|
-
(independent studies in parallel).
|
|
271
|
+
multi-participant computer-use study gives each actor its OWN app instance
|
|
272
|
+
(independent studies in parallel). Declare `route: shared-world` for N
|
|
269
273
|
actors in ONE world (a lobby, a shared DB, actors seeing each other's
|
|
270
274
|
changes). Shared-world participants run at once; `execution.concurrency` must
|
|
271
275
|
be at least 2 there.
|
|
@@ -274,8 +278,8 @@ warnings for fields the engine does not consume yet.
|
|
|
274
278
|
run looks like idle tiles — another reason to leave the cap out unless you
|
|
275
279
|
need it.
|
|
276
280
|
|
|
277
|
-
Use committed `humanish/
|
|
278
|
-
ignored `.humanish/
|
|
281
|
+
Use committed `humanish/studies/*.yaml` for public-safe, reproducible studies. Use
|
|
282
|
+
ignored `.humanish/studies/*.yaml` or `.humanish/local/studies/*.yaml` for private repo
|
|
279
283
|
targets, local-only dogfood, or machine-specific settings. Never commit private
|
|
280
284
|
repo names, stream URLs, credential values, screenshots, logs, source snippets,
|
|
281
285
|
or operational details.
|
|
@@ -283,10 +287,10 @@ or operational details.
|
|
|
283
287
|
Useful commands:
|
|
284
288
|
|
|
285
289
|
```bash
|
|
286
|
-
npx humanish
|
|
287
|
-
npx humanish
|
|
290
|
+
npx humanish study list
|
|
291
|
+
npx humanish study show first-run
|
|
288
292
|
npx humanish watch first-run
|
|
289
|
-
npx humanish
|
|
293
|
+
npx humanish run first-run --json --no-open
|
|
290
294
|
```
|
|
291
295
|
|
|
292
296
|
### Off-app email verification (comms)
|
|
@@ -316,7 +320,7 @@ and model charges are separate. Use `humanish comms recover --json` after an
|
|
|
316
320
|
interrupted run, then `humanish comms recover --run <id> --apply --json` for its
|
|
317
321
|
privately recorded resources. Never derive deletion authority from run artifacts.
|
|
318
322
|
SMS, participant sending, borrowed inboxes and other providers remain unavailable.
|
|
319
|
-
See
|
|
323
|
+
See [real email receiving](https://humanish.dev/docs/email-receiving) for limits and recovery.
|
|
320
324
|
|
|
321
325
|
The following configuration selects **local capture**:
|
|
322
326
|
|
|
@@ -341,9 +345,9 @@ customize addresses or limit which participants do email:
|
|
|
341
345
|
|
|
342
346
|
```yaml
|
|
343
347
|
recipients:
|
|
344
|
-
- lane: signup-01 # this
|
|
345
|
-
# generated lane-01..lane-NN names when you use
|
|
346
|
-
# is a hard parse error listing the
|
|
348
|
+
- lane: signup-01 # this study's REAL participant id: a `participants` entry's `id`,
|
|
349
|
+
# or the generated lane-01..lane-NN names when you use a count. An unknown id
|
|
350
|
+
# is a hard parse error listing the study's actual participant ids (a mismatch
|
|
347
351
|
# would silently disable the funnel for that participant, which is how a
|
|
348
352
|
# 6-actor field run lost every inbox at once). Participants you leave out get
|
|
349
353
|
# no inbox and are never told one exists — the parser warns which.
|
|
@@ -372,8 +376,8 @@ inbox page. See `docs/contracts/schemas.md` for the full `comms:` shape and
|
|
|
372
376
|
|
|
373
377
|
## First Proof Run
|
|
374
378
|
|
|
375
|
-
Run the no-credentials path first.
|
|
376
|
-
target app behavior:
|
|
379
|
+
Run the no-credentials path first. It is a dry run: humanish writes a synthetic
|
|
380
|
+
run bundle and tests no target app behavior:
|
|
377
381
|
|
|
378
382
|
```bash
|
|
379
383
|
npx humanish doctor
|
|
@@ -386,7 +390,7 @@ For CI or non-interactive proof:
|
|
|
386
390
|
|
|
387
391
|
```bash
|
|
388
392
|
npx humanish watch --json --no-open
|
|
389
|
-
npx humanish
|
|
393
|
+
npx humanish run first-run --json --no-open
|
|
390
394
|
```
|
|
391
395
|
|
|
392
396
|
The feedback command prints a public-safe Markdown draft. It must not call the
|
|
@@ -394,31 +398,31 @@ GitHub API, require a token, update Projects, use provider credits, or claim
|
|
|
394
398
|
product behavior proof from a dry run.
|
|
395
399
|
|
|
396
400
|
When the target app can run locally, prove a known browser path with a
|
|
397
|
-
scripted-browser
|
|
401
|
+
scripted-browser study after starting the app on loopback. The study replays a
|
|
398
402
|
`browser.steps` scenario (see above) on a desktop surface, plus a mobile one
|
|
399
403
|
with `count: 2`. The scripted steps make no model requests. Post-run analysis
|
|
400
404
|
still runs by default when `OPENAI_API_KEY` is set, with a $3 cap; keep
|
|
401
405
|
`review.analysis: false` to skip it. Copy the shape of
|
|
402
|
-
[`humanish/
|
|
406
|
+
[`humanish/studies/scripted-demo.yaml`](https://github.com/danielgwilson/humanish/blob/main/humanish/studies/scripted-demo.yaml)
|
|
403
407
|
or the example in the
|
|
404
|
-
[
|
|
405
|
-
set `subject.appUrl` to the loopback URL, `scenario
|
|
406
|
-
and `
|
|
408
|
+
[study file reference](https://humanish.dev/docs/study-files#scripted-browser-scenarios):
|
|
409
|
+
set `subject.appUrl` to the loopback URL, `scenario` to the scenario id,
|
|
410
|
+
and `mode: live`. Without `mode: live` the study is a dry run that opens
|
|
407
411
|
no browser.
|
|
408
412
|
|
|
409
413
|
```bash
|
|
410
414
|
# in another terminal, start the target app on 127.0.0.1 or localhost
|
|
411
|
-
npx humanish
|
|
412
|
-
npx humanish
|
|
415
|
+
npx humanish study show <study> --json
|
|
416
|
+
npx humanish run <study> --json --no-open
|
|
413
417
|
npx humanish verify --run latest --json
|
|
414
|
-
npx humanish
|
|
418
|
+
npx humanish observe --run latest --open # for a person; it serves until Ctrl-C
|
|
415
419
|
```
|
|
416
420
|
|
|
417
421
|
Do not use `humanish watch --count ...` as a substitute for a scripted-browser
|
|
418
|
-
|
|
419
|
-
captures desktop and mobile browser evidence against a running app.
|
|
422
|
+
study. `watch` without a study starts a preview run for the Observer; a live scripted-browser
|
|
423
|
+
study captures desktop and mobile browser evidence against a running app.
|
|
420
424
|
|
|
421
|
-
## Optional Live E2B
|
|
425
|
+
## Optional Live E2B Study
|
|
422
426
|
|
|
423
427
|
Live headed E2B desktop participants are optional. Add the substrate dependency only
|
|
424
428
|
when the user explicitly wants live E2B execution:
|
|
@@ -438,7 +442,7 @@ Do not paste values into files, prompts, run bundles, issue drafts, or logs.
|
|
|
438
442
|
Load local values only at invocation time:
|
|
439
443
|
|
|
440
444
|
```bash
|
|
441
|
-
npx humanish watch .humanish/
|
|
445
|
+
npx humanish watch .humanish/studies/local-live.yaml --env-file .humanish/local/provider.env
|
|
442
446
|
```
|
|
443
447
|
|
|
444
448
|
When choosing dogfood targets, prefer apps, CLIs, or agent-facing tools with a
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: "humanish CLI"
|
|
3
3
|
short_description: "Set up public-safe persona simulation"
|
|
4
|
-
default_prompt: "Use $humanish to install humanish in this repo, scaffold synthetic personas and scenarios, run the safe Observer proof, and report the public-safe artifacts. If the app can run locally, start it on loopback and run a live scripted
|
|
4
|
+
default_prompt: "Use $humanish to install humanish in this repo, scaffold synthetic personas and scenarios, run the safe Observer proof, and report the public-safe artifacts. If the app can run locally, start it on loopback and run a live scripted study (see https://humanish.dev/docs/study-files#scripted-browser-scenarios; set `mode: live` and keep `review.analysis: false`) before opening the Observer with `humanish observe --run latest`; do not treat `watch --count` as app behavior proof."
|
|
5
5
|
|
|
6
6
|
policy:
|
|
7
7
|
allow_implicit_invocation: true
|
package/AGENTS.md
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# AGENTS.md
|
|
2
|
-
|
|
3
|
-
humanish runs persona studies: AI participants use a target app, CLI or agent-facing flow on
|
|
4
|
-
hosted or local desktops, and every run leaves a verifiable evidence bundle. Run bundles are the
|
|
5
|
-
source of truth; the Observer is their review surface.
|
|
6
|
-
|
|
7
|
-
Sub-guides take precedence inside their directories: [observer/](https://github.com/danielgwilson/humanish/blob/main/observer/AGENTS.md),
|
|
8
|
-
[tui/](https://github.com/danielgwilson/humanish/blob/main/tui/AGENTS.md), [site/](https://github.com/danielgwilson/humanish/blob/main/site/AGENTS.md). The reasoning behind the rules below is in
|
|
9
|
-
[docs/principles/engineering.md](docs/principles/engineering.md). [CONTEXT.md](CONTEXT.md) defines
|
|
10
|
-
the domain terms, and [docs/decisions/](docs/decisions/README.md) records the decisions that
|
|
11
|
-
shape the code.
|
|
12
|
-
|
|
13
|
-
## Commands
|
|
14
|
-
|
|
15
|
-
Node >= 22.19.0, pnpm 12 (`packageManager` pins the version).
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
pnpm install
|
|
19
|
-
pnpm humanish <command> # run the CLI from source (tsx src/cli.ts)
|
|
20
|
-
pnpm vitest run tests/<file> # one test file
|
|
21
|
-
pnpm format # oxfmt; run before every commit
|
|
22
|
-
pnpm check # the full local gate (below)
|
|
23
|
-
pnpm release:check # check + API proof + public-surface scan + skill check + pack; CI runs this
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
`pnpm check` runs format:check, lint (oxlint, type-aware), knip, prose:check, vocabulary:check,
|
|
27
|
-
typecheck, the vitest suite, the TUI tests, build, the startup proofs and a TUI smoke test. After
|
|
28
|
-
changing a CLI option, run `pnpm docs:generate`; CI fails on a stale `site/content/docs/cli.mdx`.
|
|
29
|
-
Observer changes also need `pnpm build` and the four `observer:*:proof` scripts, which CI's observer
|
|
30
|
-
job runs in Chromium. `pnpm api:proof` (after `pnpm build`) installs the packed tarball in a
|
|
31
|
-
temporary project, compares its export names with `tests/golden/public-api.json` and runs
|
|
32
|
-
`examples/`. After an intended export change, run `pnpm api:proof --update` and review the golden
|
|
33
|
-
diff.
|
|
34
|
-
|
|
35
|
-
Three counts are held to caps in package.json: oxlint warnings (`lint`, `--max-warnings`), comment
|
|
36
|
-
prose (`prose:check`) and the retired words lane, seat, role, sim and study in `src/` identifiers
|
|
37
|
-
and file names (`vocabulary:check`). Each checker fails when a count is above its cap or below it,
|
|
38
|
-
so the PR that reduces a count lowers its cap to the new count; the failure names the flag and the
|
|
39
|
-
value. CI's `caps` workflow fails a PR that raises or removes a cap against the base branch, unless
|
|
40
|
-
the PR has the `raise-cap` label and a `Cap raise:` line in its body that says why.
|
|
41
|
-
|
|
42
|
-
## Layout
|
|
43
|
-
|
|
44
|
-
[ARCHITECTURE.md](ARCHITECTURE.md#find-the-code-for-each-part-of-the-system) maps each folder to
|
|
45
|
-
the file to read first. Keep these layout rules:
|
|
46
|
-
|
|
47
|
-
- `src/index.ts` is the package's only library export surface. `src/cli.ts` is its bin.
|
|
48
|
-
- `src/guest-runtime-main.ts`, `src/guest-runtime-revision.ts` and `src/guest-media-worker.ts`
|
|
49
|
-
stay at the root of `src/`. `scripts/guest-runtime-package.mjs` and the image recipes in
|
|
50
|
-
`runtime/` address their `dist/` output by file name. The rest of the guest runtime is in
|
|
51
|
-
`src/guest/`.
|
|
52
|
-
|
|
53
|
-
## Conventions
|
|
54
|
-
|
|
55
|
-
- TypeScript ESM with strict settings. No `any`; narrow `unknown` at the boundary.
|
|
56
|
-
- Keep files under about 700 lines and functions under about 150 (oxlint warns past both). Split
|
|
57
|
-
when it helps a reader; do not add to `src/routes/computer-use/route.ts` or
|
|
58
|
-
`src/actors/computer-use/loop.ts` when a smaller module fits.
|
|
59
|
-
- Comments say why the code is the way it is. History, incident narratives, issue archaeology and
|
|
60
|
-
PR numbers go in the commit message. `TODO(#123)` may link an open issue. No all-caps emphasis.
|
|
61
|
-
`prose:check` counts violations in `src/`.
|
|
62
|
-
- Tests assert behavior. Do not pin prose in docs or comments with `toContain`. The default test
|
|
63
|
-
timeout is 20 s. Provider-API fixtures come from captured wire shapes.
|
|
64
|
-
- New dependencies go in the pnpm catalog (`pnpm-workspace.yaml`) when more than one workspace
|
|
65
|
-
uses them. Stay on the latest release; a comment next to the entry gives the reason for any
|
|
66
|
-
older pin. knip fails on unused files, dependencies and exports.
|
|
67
|
-
- CLI results are truthful: reject unsupported execution before side effects, and keep useful
|
|
68
|
-
evidence when a run is interrupted. Documented bundle schemas and artifact paths are contracts.
|
|
69
|
-
|
|
70
|
-
## Public Boundary
|
|
71
|
-
|
|
72
|
-
Assume this repository is public.
|
|
73
|
-
|
|
74
|
-
- Never commit or publish secrets, PII/PHI, private customer data, private source, or raw
|
|
75
|
-
private transcripts or screenshots. Public examples are synthetic or redacted. Do not copy
|
|
76
|
-
credential files or secret values into evidence, comments, docs, issues or PRs.
|
|
77
|
-
- Authorized local studies may keep private evidence in gitignored `.humanish/` under the
|
|
78
|
-
capture and redaction rules. Local capture is not publication permission. See the
|
|
79
|
-
[invariants](docs/principles/invariants-and-defaults.md) and the
|
|
80
|
-
[public-readiness standard](docs/release/public-readiness-standard.md).
|
|
81
|
-
- Do not commit `.env*`, `.npmrc`, run bundles, runtime caches or packed tarballs.
|
|
82
|
-
- Naming the owner's other projects, products or domains in public material needs explicit
|
|
83
|
-
sign-off. Use fictional examples. Named public third-party OSS study subjects are fine.
|
|
84
|
-
|
|
85
|
-
## Working
|
|
86
|
-
|
|
87
|
-
- Read the files in [CONTRIBUTING.md's reading order](CONTRIBUTING.md#read-these-in-order), then
|
|
88
|
-
the current task; read the contract for the boundary you are changing. Historical plans do not
|
|
89
|
-
authorize work.
|
|
90
|
-
- Keep `main` clean: one worktree and branch per task, reviewable commits, squash merges.
|
|
91
|
-
- Before adding a service, protocol, mode or framework, state the concrete need in the PR.
|
|
92
|
-
Prefer removing an unnecessary mechanism to documenting around it.
|
|
93
|
-
- Verify in proportion to the change. Runtime changes need an execution check; claims of live
|
|
94
|
-
behavior need a retained run bundle, since dry runs do not establish live behavior. PRs say
|
|
95
|
-
what changed, what was checked and what was not.
|
|
96
|
-
- With shipping authority: push, open the PR, address checks, merge when green, fast-forward
|
|
97
|
-
main and remove the worktree and branch. Releases follow the
|
|
98
|
-
[release procedure](docs/release/open-source-readiness.md). Stay on `0.x` until the maintainer
|
|
99
|
-
chooses 1.0; the minor after `0.99.0` is `0.100.0`.
|