@vibecodr/cli 1.0.10 → 1.0.13
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/CHANGELOG.md +23 -0
- package/README.md +1 -1
- package/dist/app/help.js +1 -1
- package/dist/app/help.js.map +1 -1
- package/dist/legacy/cli/run.js +138 -24
- package/dist/legacy/cli/run.js.map +1 -1
- package/dist/legacy/core/version.d.ts +2 -2
- package/dist/legacy/core/version.js +1 -1
- package/docs/API-CONTRACT.md +13 -4
- package/docs/RELEASE-CHECKLIST.md +1 -1
- package/docs/VALIDATION-MATRIX.md +3 -3
- package/docs/commands.md +12 -11
- package/package.json +3 -1
- package/dist/dryrun/README.md +0 -1
- package/dist/dryrun/worker.js +0 -39892
- package/dist/dryrun/worker.js.map +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
Pre-1.0.0 history for the `@vibecodr/cli@0.2.x` and `0.1.x` lines lives at [`docs/legacy/CHANGELOG-mcp-cli.md`](docs/legacy/CHANGELOG-mcp-cli.md). The `@vibecodr/vc-tools@0.1.x` line was the other half of the May 2026 merge; its source history is preserved in the archived [`BradenHartsell/vc-tools`](https://github.com/BradenHartsell/vc-tools) repository.
|
|
4
4
|
|
|
5
|
+
## 1.0.13
|
|
6
|
+
|
|
7
|
+
Makes `browser snapshot` a plain capture command instead of a confusing ask-style lane.
|
|
8
|
+
|
|
9
|
+
- `vibecodr browser snapshot <url>` no longer advertises or accepts `--instructions`; the help text now says plainly that snapshot captures page state and does not prompt an agent or model.
|
|
10
|
+
- `vibecodr browser ask` is kept as an advanced compatibility alias, but its visible flag is now `--note`, and the help text says it saves that note with the snapshot rather than answering like chat.
|
|
11
|
+
- The hosted MCP `browser.snapshot` tool schema no longer exposes `instructions` or `actions`; raw `browser.agent_task` remains the lower-level compatibility capability for advanced callers.
|
|
12
|
+
|
|
13
|
+
## 1.0.12
|
|
14
|
+
|
|
15
|
+
Makes hosted Agent Computer outputs visible and easy to save from the first command result.
|
|
16
|
+
|
|
17
|
+
- `vibecodr browser ...`, `vibecodr computer ...`, and `vibecodr work follow` now accept `--local`, which waits for the hosted job and saves the completed artifact into `./vibecodr-proof`.
|
|
18
|
+
- Completed output now includes the artifact handle plus ready-to-run `vibecodr proof show` and `vibecodr proof save` commands instead of returning only `{ "status": "completed" }`.
|
|
19
|
+
- Root help, command help, docs, fixtures, and tests now advertise and lock the `--local` path for the simplest user flow.
|
|
20
|
+
|
|
21
|
+
## 1.0.11
|
|
22
|
+
|
|
23
|
+
Supersedes 1.0.10 with the same CLI auth guidance plus a release-packaging guard.
|
|
24
|
+
|
|
25
|
+
- `prepack`, `publish:release`, and `verify:artifact` now remove and forbid `dist/dryrun/` so Wrangler dry-run output can never be swept into the npm package.
|
|
26
|
+
- Published after the `vc-tools-api` worker read back `1.0.10`; the runtime behavior remains the first-run guidance from 1.0.10.
|
|
27
|
+
|
|
5
28
|
## 1.0.10
|
|
6
29
|
|
|
7
30
|
Aligns the CLI first-run guidance with the Vibecodr CLI product pages without renaming Agent Computer, MCP Gateway, or the underlying credential lanes.
|
package/README.md
CHANGED
|
@@ -58,7 +58,7 @@ vibecodr install codex
|
|
|
58
58
|
|
|
59
59
|
# 3. Set up the hosted Agent Computer when you want browser/computer work.
|
|
60
60
|
vibecodr start
|
|
61
|
-
vibecodr browser screenshot https://example.com --
|
|
61
|
+
vibecodr browser screenshot https://example.com --local
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
Power users and automation should prefer the explicit surfaces and stable JSON:
|
package/dist/app/help.js
CHANGED
|
@@ -44,7 +44,7 @@ export function rootHelpText() {
|
|
|
44
44
|
"",
|
|
45
45
|
"Do useful things:",
|
|
46
46
|
" vibecodr browser read https://example.com",
|
|
47
|
-
" vibecodr browser screenshot https://example.com --
|
|
47
|
+
" vibecodr browser screenshot https://example.com --local",
|
|
48
48
|
" vibecodr upload --zip ./project.zip",
|
|
49
49
|
" vibecodr pulse list",
|
|
50
50
|
" vibecodr feedback \"This part was confusing\"",
|
package/dist/app/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/app/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,MAAM,iBAAiB,GAAgC,IAAI,GAAG,CAAC;IAC7D,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,QAAQ,EAAE,OAAO,CAAC;IACnB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,SAAS,EAAE,UAAU,CAAC;IACvB,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1B,CAAC,QAAQ,EAAE,UAAU,CAAC;IACtB,CAAC,SAAS,EAAE,eAAe,CAAC;IAC5B,CAAC,KAAK,EAAE,QAAQ,CAAC;IACjB,CAAC,YAAY,EAAE,oBAAoB,CAAC;IACpC,CAAC,MAAM,EAAE,cAAc,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAgC,IAAI,GAAG,CAAC;IAC1D,CAAC,MAAM,EAAE,OAAO,CAAC;IACjB,CAAC,MAAM,EAAE,OAAO,CAAC;IACjB,CAAC,UAAU,EAAE,OAAO,CAAC;IACrB,CAAC,QAAQ,EAAE,OAAO,CAAC;IACnB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,KAAK,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,cAAc;QACd,qCAAqC;QACrC,EAAE;QACF,aAAa;QACb,2EAA2E;QAC3E,sEAAsE;QACtE,yEAAyE;QACzE,+GAA+G;QAC/G,4FAA4F;QAC5F,EAAE;QACF,mBAAmB;QACnB,6CAA6C;QAC7C,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/app/help.ts"],"names":[],"mappings":"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"}
|
package/dist/legacy/cli/run.js
CHANGED
|
@@ -16,7 +16,7 @@ const VERSION = VC_TOOLS_VERSION;
|
|
|
16
16
|
const MAX_CREDENTIAL_BYTES = 64 * 1024;
|
|
17
17
|
const DEFAULT_AUTH_API_URL = "https://api.vibecodr.space";
|
|
18
18
|
const GRANT_REFRESH_SKEW_SECONDS = 60;
|
|
19
|
-
const ARTIFACT_OUTPUT_WORKSPACE_MESSAGE = "Artifact output is workspace-bounded so downloaded bytes can only be written to files you intentionally target inside this workspace. Use --out ./artifacts, --out ./artifacts/report.pdf, or cd to the intended workspace and use --out .";
|
|
19
|
+
const ARTIFACT_OUTPUT_WORKSPACE_MESSAGE = "Artifact output is workspace-bounded so downloaded bytes can only be written to files you intentionally target inside this workspace. Use --local for ./vibecodr-proof, --out ./artifacts, --out ./artifacts/report.pdf, or cd to the intended workspace and use --out .";
|
|
20
20
|
const ARTIFACT_INPUT_WORKSPACE_MESSAGE = "Artifact upload sources are workspace-bounded so the CLI only reads files you intentionally target inside this workspace. Move the file into this workspace, or cd to the workspace that contains it.";
|
|
21
21
|
export async function runCli(argv, options = {}) {
|
|
22
22
|
const stdout = options.stdout ?? process.stdout;
|
|
@@ -646,13 +646,16 @@ async function commandBrowser(context, subcommand, rest) {
|
|
|
646
646
|
return submitHostedCapability(context, "browser.pdf", parsed, "Asked the hosted Browser to create a PDF.", { autoFollow: true });
|
|
647
647
|
case "crawl":
|
|
648
648
|
return submitHostedCapability(context, "browser.crawl", parsed, "Asked the hosted Browser to crawl the public site.", { autoFollow: true });
|
|
649
|
-
case "snapshot":
|
|
649
|
+
case "snapshot": {
|
|
650
|
+
const normalized = normalizeBrowserSnapshotOptions(parsed);
|
|
651
|
+
return submitHostedCapability(context, "browser.snapshot", normalized, "Captured a hosted Browser snapshot.", { autoFollow: true });
|
|
652
|
+
}
|
|
650
653
|
case "ask": {
|
|
651
654
|
const normalized = normalizeBrowserAskOptions(parsed);
|
|
652
|
-
return submitHostedCapability(context, "browser.ask", normalized, "
|
|
655
|
+
return submitHostedCapability(context, "browser.ask", normalized, "Captured a hosted Browser snapshot with your note attached.", { autoFollow: true });
|
|
653
656
|
}
|
|
654
657
|
default:
|
|
655
|
-
throw unknownSubcommandError("browser", subcommand, ["render", "screenshot", "read", "markdown", "pdf", "crawl", "snapshot", "ask"], "Use vibecodr browser screenshot <https-url>, browser read <https-url>, or browser snapshot <https-url> --
|
|
658
|
+
throw unknownSubcommandError("browser", subcommand, ["render", "screenshot", "read", "markdown", "pdf", "crawl", "snapshot", "ask"], "Use vibecodr browser screenshot <https-url>, browser read <https-url>, or browser snapshot <https-url> --local.");
|
|
656
659
|
}
|
|
657
660
|
}
|
|
658
661
|
async function commandComputer(context, subcommand, rest) {
|
|
@@ -725,8 +728,12 @@ async function commandToolsTest(context, parsed) {
|
|
|
725
728
|
}
|
|
726
729
|
return submitHostedCapability(context, capabilityInput, { positionals: target === undefined ? [] : [target], flags: parsed.flags });
|
|
727
730
|
}
|
|
731
|
+
const DEFAULT_LOCAL_PROOF_DIR = "vibecodr-proof";
|
|
728
732
|
async function submitHostedCapability(context, capabilityInput, parsed, successMessage, options = {}) {
|
|
729
733
|
const capability = normalizeCapabilityName(capabilityInput);
|
|
734
|
+
if (getBooleanFlag(parsed.flags, "local") && shouldSkipWait(parsed)) {
|
|
735
|
+
throw new CliError("input.local_requires_wait", "--local saves the completed output, so it cannot be combined with --no-wait.", 2);
|
|
736
|
+
}
|
|
730
737
|
const payload = buildToolTestPayload(capability, parsed.positionals[0], parsed, context.globals.timeoutMs === 30_000 ? undefined : context.globals.timeoutMs);
|
|
731
738
|
const { profile } = await context.store.getProfile(context.globals.profile);
|
|
732
739
|
const client = createClient(context, profile, await resolveToken(context, true));
|
|
@@ -757,8 +764,8 @@ async function followSubmittedWork(context, client, capability, submitted, parse
|
|
|
757
764
|
? submitted
|
|
758
765
|
: await pollWorkUntilTerminal(client, jobId, parsed);
|
|
759
766
|
const artifactId = artifactIdFromWork(terminal);
|
|
760
|
-
const proof = artifactId &&
|
|
761
|
-
? await saveArtifact(context, client, artifactId, parsed)
|
|
767
|
+
const proof = artifactId && shouldSaveArtifact(parsed)
|
|
768
|
+
? await saveArtifact(context, client, artifactId, parsedWithLocalOutput(parsed))
|
|
762
769
|
: undefined;
|
|
763
770
|
return {
|
|
764
771
|
message: formatCompletedWorkMessage(capability, terminal, proof),
|
|
@@ -772,8 +779,8 @@ async function commandWorkFollow(context, parsed) {
|
|
|
772
779
|
const client = createClient(context, profile, await resolveToken(context, true));
|
|
773
780
|
const job = await pollWorkUntilTerminal(client, jobId, parsed);
|
|
774
781
|
const artifactId = artifactIdFromWork(job);
|
|
775
|
-
const proof = artifactId &&
|
|
776
|
-
? await saveArtifact(context, client, artifactId, parsed)
|
|
782
|
+
const proof = artifactId && shouldSaveArtifact(parsed)
|
|
783
|
+
? await saveArtifact(context, client, artifactId, parsedWithLocalOutput(parsed))
|
|
777
784
|
: undefined;
|
|
778
785
|
return {
|
|
779
786
|
message: formatCompletedWorkMessage(undefined, job, proof),
|
|
@@ -828,11 +835,69 @@ function artifactIdFromWork(value) {
|
|
|
828
835
|
}
|
|
829
836
|
return undefined;
|
|
830
837
|
}
|
|
838
|
+
function workArtifactSummary(value) {
|
|
839
|
+
if (!isRecord(value)) {
|
|
840
|
+
return undefined;
|
|
841
|
+
}
|
|
842
|
+
const source = isRecord(value.result) && typeof value.result.artifactId === "string"
|
|
843
|
+
? value.result
|
|
844
|
+
: typeof value.artifactId === "string"
|
|
845
|
+
? value
|
|
846
|
+
: undefined;
|
|
847
|
+
if (source) {
|
|
848
|
+
return {
|
|
849
|
+
id: String(source.artifactId),
|
|
850
|
+
...(typeof source.kind === "string" ? { kind: source.kind } : {}),
|
|
851
|
+
...(typeof source.contentType === "string" ? { contentType: source.contentType } : {}),
|
|
852
|
+
...(typeof source.bytes === "number" ? { bytes: source.bytes } : {})
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
if (Array.isArray(value.artifacts)) {
|
|
856
|
+
const first = value.artifacts.find((item) => isRecord(item) && typeof item.id === "string");
|
|
857
|
+
if (isRecord(first) && typeof first.id === "string") {
|
|
858
|
+
return {
|
|
859
|
+
id: first.id,
|
|
860
|
+
...(typeof first.kind === "string" ? { kind: first.kind } : {}),
|
|
861
|
+
...(typeof first.contentType === "string" ? { contentType: first.contentType } : {}),
|
|
862
|
+
...(typeof first.bytes === "number" ? { bytes: first.bytes } : {})
|
|
863
|
+
};
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
return undefined;
|
|
867
|
+
}
|
|
868
|
+
function shouldSaveArtifact(parsed) {
|
|
869
|
+
return getStringFlag(parsed.flags, "out") !== undefined || getBooleanFlag(parsed.flags, "local");
|
|
870
|
+
}
|
|
871
|
+
function parsedWithLocalOutput(parsed) {
|
|
872
|
+
if (getStringFlag(parsed.flags, "out") !== undefined || !getBooleanFlag(parsed.flags, "local")) {
|
|
873
|
+
return parsed;
|
|
874
|
+
}
|
|
875
|
+
return {
|
|
876
|
+
...parsed,
|
|
877
|
+
flags: {
|
|
878
|
+
...parsed.flags,
|
|
879
|
+
out: DEFAULT_LOCAL_PROOF_DIR
|
|
880
|
+
}
|
|
881
|
+
};
|
|
882
|
+
}
|
|
831
883
|
function formatCompletedWorkMessage(capability, work, proof) {
|
|
832
884
|
const status = workStatus(work) ?? "completed";
|
|
833
885
|
if (status === "completed") {
|
|
834
|
-
|
|
835
|
-
|
|
886
|
+
if (proof) {
|
|
887
|
+
return `${completedCapabilityMessage(capability)}\nSaved output: ${proof.path}`;
|
|
888
|
+
}
|
|
889
|
+
const artifact = workArtifactSummary(work);
|
|
890
|
+
if (artifact) {
|
|
891
|
+
const details = [artifact.kind, formatByteCount(artifact.bytes)].filter(Boolean).join(", ");
|
|
892
|
+
return [
|
|
893
|
+
completedCapabilityMessage(capability),
|
|
894
|
+
`Output ready${details ? `: ${details}` : "."}`,
|
|
895
|
+
`View it: vibecodr proof show ${artifact.id}`,
|
|
896
|
+
`Save it: vibecodr proof save ${artifact.id} --out ./${DEFAULT_LOCAL_PROOF_DIR}`,
|
|
897
|
+
`Next time: add --local to save it automatically.`
|
|
898
|
+
].join("\n");
|
|
899
|
+
}
|
|
900
|
+
return completedCapabilityMessage(capability);
|
|
836
901
|
}
|
|
837
902
|
if (status === "queued" || status === "running") {
|
|
838
903
|
const id = jobIdFromWork(work);
|
|
@@ -866,16 +931,42 @@ function completedCapabilityMessage(capability) {
|
|
|
866
931
|
return "Hosted work completed.";
|
|
867
932
|
}
|
|
868
933
|
}
|
|
934
|
+
function formatByteCount(bytes) {
|
|
935
|
+
if (bytes === undefined || !Number.isFinite(bytes)) {
|
|
936
|
+
return undefined;
|
|
937
|
+
}
|
|
938
|
+
if (bytes < 1024) {
|
|
939
|
+
return `${bytes} B`;
|
|
940
|
+
}
|
|
941
|
+
const kib = bytes / 1024;
|
|
942
|
+
if (kib < 1024) {
|
|
943
|
+
return `${Math.round(kib * 10) / 10} KB`;
|
|
944
|
+
}
|
|
945
|
+
const mib = kib / 1024;
|
|
946
|
+
return `${Math.round(mib * 10) / 10} MB`;
|
|
947
|
+
}
|
|
869
948
|
function publicWorkResult(capability, work, parsed, proof) {
|
|
870
949
|
const details = getBooleanFlag(parsed.flags, "details");
|
|
950
|
+
const artifact = workArtifactSummary(work);
|
|
871
951
|
const result = {
|
|
872
952
|
status: workStatus(work) ?? "completed"
|
|
873
953
|
};
|
|
874
954
|
if (capability) {
|
|
875
955
|
result.tool = userToolName(capability);
|
|
876
956
|
}
|
|
957
|
+
if (artifact) {
|
|
958
|
+
result.artifact = {
|
|
959
|
+
id: artifact.id,
|
|
960
|
+
...(artifact.kind ? { kind: artifact.kind } : {}),
|
|
961
|
+
...(artifact.contentType ? { contentType: artifact.contentType } : {}),
|
|
962
|
+
...(artifact.bytes !== undefined ? { bytes: artifact.bytes } : {}),
|
|
963
|
+
showCommand: `vibecodr proof show ${artifact.id}`,
|
|
964
|
+
saveCommand: `vibecodr proof save ${artifact.id} --out ./${DEFAULT_LOCAL_PROOF_DIR}`
|
|
965
|
+
};
|
|
966
|
+
}
|
|
877
967
|
if (proof) {
|
|
878
968
|
result.proof = {
|
|
969
|
+
artifactId: proof.artifactId,
|
|
879
970
|
path: proof.path,
|
|
880
971
|
bytes: proof.bytes,
|
|
881
972
|
contentType: proof.contentType
|
|
@@ -905,12 +996,31 @@ function userToolName(capability) {
|
|
|
905
996
|
return "computer.test";
|
|
906
997
|
return capability;
|
|
907
998
|
}
|
|
999
|
+
function normalizeBrowserSnapshotOptions(parsed) {
|
|
1000
|
+
const [url, ...extraParts] = parsed.positionals;
|
|
1001
|
+
if (extraParts.length > 0 || parsed.flags.instructions !== undefined || parsed.flags.note !== undefined) {
|
|
1002
|
+
throw new CliError("input.snapshot_is_not_prompted", "browser snapshot captures the page state; it does not prompt an agent or model. Remove the note/instructions, or use `vibecodr browser ask <url> --note \"...\"` for the advanced compatibility lane.", 2);
|
|
1003
|
+
}
|
|
1004
|
+
return {
|
|
1005
|
+
positionals: url === undefined ? [] : [url],
|
|
1006
|
+
flags: parsed.flags
|
|
1007
|
+
};
|
|
1008
|
+
}
|
|
908
1009
|
function normalizeBrowserAskOptions(parsed) {
|
|
909
1010
|
const [url, ...instructionParts] = parsed.positionals;
|
|
910
1011
|
const flags = { ...parsed.flags };
|
|
1012
|
+
const note = getStringFlag(flags, "note");
|
|
1013
|
+
const instructions = getStringFlag(flags, "instructions");
|
|
1014
|
+
if (instructions === undefined && note !== undefined) {
|
|
1015
|
+
flags.instructions = note;
|
|
1016
|
+
}
|
|
1017
|
+
delete flags.note;
|
|
911
1018
|
if (getStringFlag(flags, "instructions") === undefined && instructionParts.length > 0) {
|
|
912
1019
|
flags.instructions = instructionParts.join(" ");
|
|
913
1020
|
}
|
|
1021
|
+
if (getStringFlag(flags, "instructions") === undefined) {
|
|
1022
|
+
throw new CliError("input.ask_note_required", "browser ask is an advanced compatibility alias and needs a note. For a normal capture, use `vibecodr browser snapshot <url> --local`.", 2);
|
|
1023
|
+
}
|
|
914
1024
|
return {
|
|
915
1025
|
positionals: url === undefined ? [] : [url],
|
|
916
1026
|
flags
|
|
@@ -2586,9 +2696,9 @@ Examples:
|
|
|
2586
2696
|
vibecodr try
|
|
2587
2697
|
vibecodr agent connect --client codex
|
|
2588
2698
|
vibecodr computer status
|
|
2589
|
-
vibecodr browser screenshot https://example.com --format png --
|
|
2699
|
+
vibecodr browser screenshot https://example.com --format png --local
|
|
2590
2700
|
vibecodr browser read https://example.com
|
|
2591
|
-
vibecodr computer run "npm test" --
|
|
2701
|
+
vibecodr computer run "npm test" --local
|
|
2592
2702
|
vibecodr work follow job_123
|
|
2593
2703
|
vibecodr proof save art_123 --out ./artifacts
|
|
2594
2704
|
|
|
@@ -2602,7 +2712,7 @@ Commands:
|
|
|
2602
2712
|
try Run a small browser, computer, proof, and usage check.
|
|
2603
2713
|
agent Connect an agent to the hosted computer or check readiness.
|
|
2604
2714
|
computer Start/status/run commands on the hosted Agent Computer.
|
|
2605
|
-
browser
|
|
2715
|
+
browser Capture, read, render, crawl, or inspect public HTTPS pages with the hosted Browser.
|
|
2606
2716
|
work List, follow, show, or cancel hosted work.
|
|
2607
2717
|
proof List, show, save, or delete saved outputs and artifacts.
|
|
2608
2718
|
usage Show account-scoped Agent Computer capacity and quota progress.
|
|
@@ -2684,8 +2794,8 @@ Public HTTP(S) package/docs access is available by default; private, local, and
|
|
|
2684
2794
|
Usage:
|
|
2685
2795
|
vibecodr computer start
|
|
2686
2796
|
vibecodr computer status
|
|
2687
|
-
vibecodr computer run "<command>" [--timeout-ms <ms>] [--network public|off] [--out ./proof] [--no-wait] [--details]
|
|
2688
|
-
vibecodr computer test "<command>" [--timeout-ms <ms>] [--network public|off] [--out ./proof] [--no-wait] [--details]
|
|
2797
|
+
vibecodr computer run "<command>" [--timeout-ms <ms>] [--network public|off] [--local|--out ./proof] [--no-wait] [--details]
|
|
2798
|
+
vibecodr computer test "<command>" [--timeout-ms <ms>] [--network public|off] [--local|--out ./proof] [--no-wait] [--details]
|
|
2689
2799
|
`;
|
|
2690
2800
|
case "browser":
|
|
2691
2801
|
return `vibecodr browser
|
|
@@ -2693,16 +2803,20 @@ Usage:
|
|
|
2693
2803
|
Use the hosted Browser against public HTTPS pages. Localhost, private networks, URL credentials, and internal hosts are blocked before hosted work is submitted.
|
|
2694
2804
|
|
|
2695
2805
|
Usage:
|
|
2696
|
-
vibecodr browser screenshot <https-url> [--format png] [--out ./proof] [--no-wait] [--details]
|
|
2697
|
-
vibecodr browser read <https-url> [--out ./proof] [--no-wait] [--details]
|
|
2698
|
-
vibecodr browser render <https-url> [--out ./proof] [--no-wait] [--details]
|
|
2699
|
-
vibecodr browser pdf <https-url> [--out ./proof] [--no-wait] [--details]
|
|
2700
|
-
vibecodr browser crawl <https-url> [--max-pages n] [--max-depth n]
|
|
2701
|
-
vibecodr browser snapshot <https-url> [--
|
|
2702
|
-
|
|
2806
|
+
vibecodr browser screenshot <https-url> [--format png] [--local|--out ./proof] [--no-wait] [--details]
|
|
2807
|
+
vibecodr browser read <https-url> [--local|--out ./proof] [--no-wait] [--details]
|
|
2808
|
+
vibecodr browser render <https-url> [--local|--out ./proof] [--no-wait] [--details]
|
|
2809
|
+
vibecodr browser pdf <https-url> [--local|--out ./proof] [--no-wait] [--details]
|
|
2810
|
+
vibecodr browser crawl <https-url> [--max-pages n] [--max-depth n] [--local|--out ./proof]
|
|
2811
|
+
vibecodr browser snapshot <https-url> [--local|--out ./proof]
|
|
2812
|
+
|
|
2813
|
+
Advanced compatibility:
|
|
2814
|
+
vibecodr browser ask <https-url> --note <text> [--local|--out ./proof]
|
|
2703
2815
|
|
|
2704
2816
|
Notes:
|
|
2705
|
-
|
|
2817
|
+
Add --local to save completed output into ./vibecodr-proof automatically.
|
|
2818
|
+
browser snapshot captures page state; it does not prompt an agent or model.
|
|
2819
|
+
browser ask saves your note with the snapshot; it is not a chat answerer.
|
|
2706
2820
|
`;
|
|
2707
2821
|
case "work":
|
|
2708
2822
|
return `vibecodr work
|
|
@@ -2712,7 +2826,7 @@ Inspect hosted work the agent has submitted.
|
|
|
2712
2826
|
Usage:
|
|
2713
2827
|
vibecodr work list [--limit 20]
|
|
2714
2828
|
vibecodr work show <jobId>
|
|
2715
|
-
vibecodr work follow <jobId> [--out ./proof] [--details]
|
|
2829
|
+
vibecodr work follow <jobId> [--local|--out ./proof] [--details]
|
|
2716
2830
|
vibecodr work cancel <jobId> --yes
|
|
2717
2831
|
`;
|
|
2718
2832
|
case "proof":
|