Skip to content
Closed
51 changes: 51 additions & 0 deletions packages/types/src/__tests__/context-handoff.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { contextHandoffSummarySchema } from "../context-handoff.js"

describe("ContextHandoffSummary schema", () => {
it("validates a complete summary", () => {
const summary = {
mode: "code",
filesModified: ["src/app.ts", "src/utils.ts"],
filesRead: ["src/config.ts"],
commandsExecuted: ["npm test"],
toolUsageCounts: { write_to_file: 2, read_file: 1 },
apiRequestCount: 5,
result: "Task completed successfully",
}
const result = contextHandoffSummarySchema.safeParse(summary)
expect(result.success).toBe(true)
if (result.success) {
expect(result.data.filesModified).toEqual(["src/app.ts", "src/utils.ts"])
expect(result.data.mode).toBe("code")
}
})

it("accepts minimal summary with only result", () => {
const summary = { result: "Done" }
const result = contextHandoffSummarySchema.safeParse(summary)
expect(result.success).toBe(true)
if (result.success) {
expect(result.data.filesModified).toEqual([])
expect(result.data.filesRead).toEqual([])
expect(result.data.commandsExecuted).toEqual([])
expect(result.data.toolUsageCounts).toEqual({})
expect(result.data.apiRequestCount).toBe(0)
}
})

it("rejects summary without result", () => {
const summary = { mode: "code", filesModified: [] }
const result = contextHandoffSummarySchema.safeParse(summary)
expect(result.success).toBe(false)
})

it("applies defaults for optional array fields", () => {
const summary = { result: "Done", mode: "debug" }
const result = contextHandoffSummarySchema.safeParse(summary)
expect(result.success).toBe(true)
if (result.success) {
expect(result.data.mode).toBe("debug")
expect(result.data.filesModified).toEqual([])
expect(result.data.commandsExecuted).toEqual([])
}
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { DEFAULT_MODES } from "../mode.js"

describe("Orchestrator context handoff prompt", () => {
const orchestratorMode = DEFAULT_MODES.find((m: { slug: string }) => m.slug === "orchestrator")

it("should have an orchestrator mode", () => {
expect(orchestratorMode).toBeDefined()
})

it("should include context handoff guidance in customInstructions", () => {
expect(orchestratorMode!.customInstructions).toContain("structured context handoff summary")
})

it("should mention files modified in context handoff guidance", () => {
expect(orchestratorMode!.customInstructions).toContain("files modified")
})

it("should mention passing context to subsequent subtasks", () => {
expect(orchestratorMode!.customInstructions).toContain("subsequent subtasks")
})

it("should mention identifying potential conflicts", () => {
expect(orchestratorMode!.customInstructions).toContain("potential conflicts")
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { describe, it, expect } from "vitest"
import { DEFAULT_MODES } from "../mode.js"
import type { ModeConfig } from "../mode.js"

describe("Orchestrator mode - permissions prompt guidance", () => {
const orchestratorMode = DEFAULT_MODES.find((m: ModeConfig) => m.slug === "orchestrator")

it("should have the orchestrator mode defined", () => {
expect(orchestratorMode).toBeDefined()
})

it("should include permissions guidance in customInstructions", () => {
expect(orchestratorMode!.customInstructions).toContain("permissions")
expect(orchestratorMode!.customInstructions).toContain("filePatterns")
expect(orchestratorMode!.customInstructions).toContain("commandPatterns")
expect(orchestratorMode!.customInstructions).toContain("allowedTools")
expect(orchestratorMode!.customInstructions).toContain("deniedTools")
})

it("should mention most-restrictive-wins semantics", () => {
expect(orchestratorMode!.customInstructions).toContain("most-restrictive-wins")
})

it("should provide example use cases for permissions", () => {
// Guidance about restricting file access
expect(orchestratorMode!.customInstructions).toContain("specific directory")
// Guidance about read-only research tasks
expect(orchestratorMode!.customInstructions).toContain("read-only research")
// Guidance about blocking shell access
expect(orchestratorMode!.customInstructions).toContain("shell access")
})
})
Loading
Loading