mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-15 17:00:59 +00:00
Breaking changes: - Settings: 'hooks' and 'customTools' arrays replaced with 'extensions' - CLI: '--hook' and '--tool' flags replaced with '--extension' / '-e' - API: HookMessage renamed to CustomMessage, role 'hookMessage' to 'custom' - API: FileSlashCommand renamed to PromptTemplate - API: discoverSlashCommands() renamed to discoverPromptTemplates() - Directories: commands/ renamed to prompts/ for prompt templates Migration: - Session version bumped to 3 (auto-migrates v2 sessions) - Old 'hookMessage' role entries converted to 'custom' Structural changes: - src/core/hooks/ and src/core/custom-tools/ merged into src/core/extensions/ - src/core/slash-commands.ts renamed to src/core/prompt-templates.ts - examples/hooks/ and examples/custom-tools/ merged into examples/extensions/ - docs/hooks.md and docs/custom-tools.md merged into docs/extensions.md New test coverage: - test/extensions-runner.test.ts (10 tests) - test/extensions-discovery.test.ts (26 tests) - test/prompt-templates.test.ts
197 lines
5.6 KiB
TypeScript
197 lines
5.6 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
import { parseArgs } from "../src/cli/args.js";
|
|
|
|
describe("parseArgs", () => {
|
|
describe("--version flag", () => {
|
|
test("parses --version flag", () => {
|
|
const result = parseArgs(["--version"]);
|
|
expect(result.version).toBe(true);
|
|
});
|
|
|
|
test("parses -v shorthand", () => {
|
|
const result = parseArgs(["-v"]);
|
|
expect(result.version).toBe(true);
|
|
});
|
|
|
|
test("--version takes precedence over other args", () => {
|
|
const result = parseArgs(["--version", "--help", "some message"]);
|
|
expect(result.version).toBe(true);
|
|
expect(result.help).toBe(true);
|
|
expect(result.messages).toContain("some message");
|
|
});
|
|
});
|
|
|
|
describe("--help flag", () => {
|
|
test("parses --help flag", () => {
|
|
const result = parseArgs(["--help"]);
|
|
expect(result.help).toBe(true);
|
|
});
|
|
|
|
test("parses -h shorthand", () => {
|
|
const result = parseArgs(["-h"]);
|
|
expect(result.help).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("--print flag", () => {
|
|
test("parses --print flag", () => {
|
|
const result = parseArgs(["--print"]);
|
|
expect(result.print).toBe(true);
|
|
});
|
|
|
|
test("parses -p shorthand", () => {
|
|
const result = parseArgs(["-p"]);
|
|
expect(result.print).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("--continue flag", () => {
|
|
test("parses --continue flag", () => {
|
|
const result = parseArgs(["--continue"]);
|
|
expect(result.continue).toBe(true);
|
|
});
|
|
|
|
test("parses -c shorthand", () => {
|
|
const result = parseArgs(["-c"]);
|
|
expect(result.continue).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("--resume flag", () => {
|
|
test("parses --resume flag", () => {
|
|
const result = parseArgs(["--resume"]);
|
|
expect(result.resume).toBe(true);
|
|
});
|
|
|
|
test("parses -r shorthand", () => {
|
|
const result = parseArgs(["-r"]);
|
|
expect(result.resume).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("flags with values", () => {
|
|
test("parses --provider", () => {
|
|
const result = parseArgs(["--provider", "openai"]);
|
|
expect(result.provider).toBe("openai");
|
|
});
|
|
|
|
test("parses --model", () => {
|
|
const result = parseArgs(["--model", "gpt-4o"]);
|
|
expect(result.model).toBe("gpt-4o");
|
|
});
|
|
|
|
test("parses --api-key", () => {
|
|
const result = parseArgs(["--api-key", "sk-test-key"]);
|
|
expect(result.apiKey).toBe("sk-test-key");
|
|
});
|
|
|
|
test("parses --system-prompt", () => {
|
|
const result = parseArgs(["--system-prompt", "You are a helpful assistant"]);
|
|
expect(result.systemPrompt).toBe("You are a helpful assistant");
|
|
});
|
|
|
|
test("parses --append-system-prompt", () => {
|
|
const result = parseArgs(["--append-system-prompt", "Additional context"]);
|
|
expect(result.appendSystemPrompt).toBe("Additional context");
|
|
});
|
|
|
|
test("parses --mode", () => {
|
|
const result = parseArgs(["--mode", "json"]);
|
|
expect(result.mode).toBe("json");
|
|
});
|
|
|
|
test("parses --mode rpc", () => {
|
|
const result = parseArgs(["--mode", "rpc"]);
|
|
expect(result.mode).toBe("rpc");
|
|
});
|
|
|
|
test("parses --session", () => {
|
|
const result = parseArgs(["--session", "/path/to/session.jsonl"]);
|
|
expect(result.session).toBe("/path/to/session.jsonl");
|
|
});
|
|
|
|
test("parses --export", () => {
|
|
const result = parseArgs(["--export", "session.jsonl"]);
|
|
expect(result.export).toBe("session.jsonl");
|
|
});
|
|
|
|
test("parses --thinking", () => {
|
|
const result = parseArgs(["--thinking", "high"]);
|
|
expect(result.thinking).toBe("high");
|
|
});
|
|
|
|
test("parses --models as comma-separated list", () => {
|
|
const result = parseArgs(["--models", "gpt-4o,claude-sonnet,gemini-pro"]);
|
|
expect(result.models).toEqual(["gpt-4o", "claude-sonnet", "gemini-pro"]);
|
|
});
|
|
});
|
|
|
|
describe("--no-session flag", () => {
|
|
test("parses --no-session flag", () => {
|
|
const result = parseArgs(["--no-session"]);
|
|
expect(result.noSession).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("--extension flag", () => {
|
|
test("parses single --extension", () => {
|
|
const result = parseArgs(["--extension", "./my-extension.ts"]);
|
|
expect(result.extensions).toEqual(["./my-extension.ts"]);
|
|
});
|
|
|
|
test("parses -e shorthand", () => {
|
|
const result = parseArgs(["-e", "./my-extension.ts"]);
|
|
expect(result.extensions).toEqual(["./my-extension.ts"]);
|
|
});
|
|
|
|
test("parses multiple --extension flags", () => {
|
|
const result = parseArgs(["--extension", "./ext1.ts", "-e", "./ext2.ts"]);
|
|
expect(result.extensions).toEqual(["./ext1.ts", "./ext2.ts"]);
|
|
});
|
|
});
|
|
|
|
describe("messages and file args", () => {
|
|
test("parses plain text messages", () => {
|
|
const result = parseArgs(["hello", "world"]);
|
|
expect(result.messages).toEqual(["hello", "world"]);
|
|
});
|
|
|
|
test("parses @file arguments", () => {
|
|
const result = parseArgs(["@README.md", "@src/main.ts"]);
|
|
expect(result.fileArgs).toEqual(["README.md", "src/main.ts"]);
|
|
});
|
|
|
|
test("parses mixed messages and file args", () => {
|
|
const result = parseArgs(["@file.txt", "explain this", "@image.png"]);
|
|
expect(result.fileArgs).toEqual(["file.txt", "image.png"]);
|
|
expect(result.messages).toEqual(["explain this"]);
|
|
});
|
|
|
|
test("ignores unknown flags starting with -", () => {
|
|
const result = parseArgs(["--unknown-flag", "message"]);
|
|
expect(result.messages).toEqual(["message"]);
|
|
});
|
|
});
|
|
|
|
describe("complex combinations", () => {
|
|
test("parses multiple flags together", () => {
|
|
const result = parseArgs([
|
|
"--provider",
|
|
"anthropic",
|
|
"--model",
|
|
"claude-sonnet",
|
|
"--print",
|
|
"--thinking",
|
|
"high",
|
|
"@prompt.md",
|
|
"Do the task",
|
|
]);
|
|
expect(result.provider).toBe("anthropic");
|
|
expect(result.model).toBe("claude-sonnet");
|
|
expect(result.print).toBe(true);
|
|
expect(result.thinking).toBe("high");
|
|
expect(result.fileArgs).toEqual(["prompt.md"]);
|
|
expect(result.messages).toEqual(["Do the task"]);
|
|
});
|
|
});
|
|
});
|