summaryrefslogtreecommitdiffhomepage
path: root/packages/cli/src/args.test.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-05 21:20:34 +0900
committerAdam Malczewski <[email protected]>2026-06-05 21:20:34 +0900
commit552c22d74e5df915088d9e9ff4a286c96c2a54d6 (patch)
tree7d9db1052bab91ef994446d80efc3bfc38026cad /packages/cli/src/args.test.ts
parent7fb3269c698ae583ea7997ce206c4ae252fd3218 (diff)
downloaddispatch-552c22d74e5df915088d9e9ff4a286c96c2a54d6.tar.gz
dispatch-552c22d74e5df915088d9e9ff4a286c96c2a54d6.zip
feat(cli): one-shot terminal client (models, chat, --text/--file/--cwd/--conversation)
HTTP client of transport-contract; pure-core arg/render/ndjson + injected fetch/fs shell. Docs: GLOSSARY (credential/key/model name/model catalog), tasks.md milestone, ORCHESTRATOR geography.
Diffstat (limited to 'packages/cli/src/args.test.ts')
-rw-r--r--packages/cli/src/args.test.ts140
1 files changed, 140 insertions, 0 deletions
diff --git a/packages/cli/src/args.test.ts b/packages/cli/src/args.test.ts
new file mode 100644
index 0000000..02b9e9b
--- /dev/null
+++ b/packages/cli/src/args.test.ts
@@ -0,0 +1,140 @@
+import { describe, expect, it } from "vitest";
+import { parseArgs } from "./args.js";
+
+const defaultServer = "http://localhost:24203";
+
+describe("parseArgs", () => {
+ it("returns help for empty argv", () => {
+ expect(parseArgs([], { defaultServer })).toEqual({ kind: "help" });
+ });
+
+ it("returns help for --help", () => {
+ expect(parseArgs(["--help"], { defaultServer })).toEqual({ kind: "help" });
+ });
+
+ it("returns help for -h", () => {
+ expect(parseArgs(["-h"], { defaultServer })).toEqual({ kind: "help" });
+ });
+
+ describe("models", () => {
+ it("parses 'models' with default server", () => {
+ expect(parseArgs(["models"], { defaultServer })).toEqual({
+ kind: "models",
+ server: "http://localhost:24203",
+ });
+ });
+
+ it("parses 'models --server <url>'", () => {
+ expect(parseArgs(["models", "--server", "http://example.com"], { defaultServer })).toEqual({
+ kind: "models",
+ server: "http://example.com",
+ });
+ });
+
+ it("errors on unknown argument for models", () => {
+ const result = parseArgs(["models", "--foo"], { defaultServer });
+ expect(result.kind).toBe("error");
+ if (result.kind === "error") expect(result.message).toContain("Unknown argument");
+ });
+ });
+
+ describe("chat", () => {
+ it("parses a chat with --text", () => {
+ const result = parseArgs(["my-model", "--text", "hello"], { defaultServer });
+ expect(result).toEqual({
+ kind: "chat",
+ server: "http://localhost:24203",
+ modelName: "my-model",
+ text: "hello",
+ file: undefined,
+ cwd: undefined,
+ conversationId: undefined,
+ showReasoning: false,
+ });
+ });
+
+ it("parses a chat with --file", () => {
+ const result = parseArgs(["my-model", "--file", "foo.txt"], { defaultServer });
+ expect(result).toEqual({
+ kind: "chat",
+ server: "http://localhost:24203",
+ modelName: "my-model",
+ text: undefined,
+ file: "foo.txt",
+ cwd: undefined,
+ conversationId: undefined,
+ showReasoning: false,
+ });
+ });
+
+ it("parses a chat with both --text and --file", () => {
+ const result = parseArgs(["m", "--text", "hi", "--file", "f.txt"], { defaultServer });
+ expect(result).toMatchObject({ kind: "chat", text: "hi", file: "f.txt" });
+ });
+
+ it("parses --cwd, --conversation, --server, --show-reasoning", () => {
+ const result = parseArgs(
+ [
+ "m",
+ "--text",
+ "x",
+ "--cwd",
+ "/tmp",
+ "--conversation",
+ "abc",
+ "--server",
+ "http://s",
+ "--show-reasoning",
+ ],
+ { defaultServer },
+ );
+ expect(result).toEqual({
+ kind: "chat",
+ server: "http://s",
+ modelName: "m",
+ text: "x",
+ file: undefined,
+ cwd: "/tmp",
+ conversationId: "abc",
+ showReasoning: true,
+ });
+ });
+
+ it("errors when text and file are both missing", () => {
+ const result = parseArgs(["my-model"], { defaultServer });
+ expect(result.kind).toBe("error");
+ if (result.kind === "error") expect(result.message).toContain("--text or --file");
+ });
+
+ it("errors on unknown flag", () => {
+ const result = parseArgs(["my-model", "--text", "hi", "--bogus"], { defaultServer });
+ expect(result.kind).toBe("error");
+ if (result.kind === "error") expect(result.message).toContain("Unknown flag");
+ });
+
+ it("errors when --text has no value", () => {
+ const result = parseArgs(["m", "--text"], { defaultServer });
+ expect(result.kind).toBe("error");
+ });
+
+ it("errors when --file has no value", () => {
+ const result = parseArgs(["m", "--file"], { defaultServer });
+ expect(result.kind).toBe("error");
+ });
+
+ it("errors when --server has no value", () => {
+ const result = parseArgs(["models", "--server"], { defaultServer });
+ expect(result.kind).toBe("error");
+ });
+
+ it("errors when --cwd has no value", () => {
+ const result = parseArgs(["m", "--text", "x", "--cwd"], { defaultServer });
+ expect(result.kind).toBe("error");
+ });
+
+ it("errors when --conversation has no value", () => {
+ const result = parseArgs(["m", "--text", "x", "--conversation"], { defaultServer });
+ expect(result.kind).toBe("error");
+ });
+ });
+});