test(start-work): batch 11 (2 files)
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
/// <reference path="../../../bun-test.d.ts" />
|
||||
|
||||
import { describe, expect, test } from "bun:test"
|
||||
import { createBuiltinSkills } from "../../features/builtin-skills"
|
||||
import type { LoadedSkill } from "../../features/opencode-skill-loader"
|
||||
import { executeSlashCommand } from "./executor"
|
||||
|
||||
function asLoadedSkill(name: string): LoadedSkill {
|
||||
const skill = createBuiltinSkills().find((candidate) => candidate.name === name)
|
||||
if (!skill) {
|
||||
throw new Error(`missing builtin skill: ${name}`)
|
||||
}
|
||||
|
||||
return {
|
||||
name: skill.name,
|
||||
definition: {
|
||||
name: skill.name,
|
||||
description: skill.description,
|
||||
template: skill.template,
|
||||
argumentHint: skill.argumentHint,
|
||||
},
|
||||
scope: "builtin",
|
||||
}
|
||||
}
|
||||
|
||||
describe("init-deep slash surface", () => {
|
||||
test("#given init-deep builtin skill #when slash command executes #then it renders skill instructions with arguments", async () => {
|
||||
// given
|
||||
const skills = [asLoadedSkill("init-deep")]
|
||||
|
||||
// when
|
||||
const result = await executeSlashCommand(
|
||||
{ command: "init-deep", args: "--max-depth=2", raw: "/init-deep --max-depth=2" },
|
||||
{ skills, pluginsEnabled: false },
|
||||
)
|
||||
|
||||
// then
|
||||
expect(result.success).toBe(true)
|
||||
expect(result.replacementText).toContain("**Scope**: skill")
|
||||
expect(result.replacementText).toContain("--max-depth=2")
|
||||
expect(result.replacementText).toContain("Generate hierarchical AGENTS.md files")
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,58 @@
|
||||
/// <reference types="bun-types" />
|
||||
|
||||
import { describe, expect, test, beforeEach, afterEach } from "bun:test"
|
||||
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs"
|
||||
import { join } from "node:path"
|
||||
import { tmpdir } from "node:os"
|
||||
import { randomUUID } from "node:crypto"
|
||||
import { readBoulderState, clearBoulderState } from "../../features/boulder-state"
|
||||
import { unsafeTestValue } from "../../../test-support/unsafe-test-value"
|
||||
import { createStartWorkHook } from "./start-work-hook"
|
||||
|
||||
describe("start-work hook platform session ids", () => {
|
||||
let testDir: string
|
||||
|
||||
function createStartWorkPrompt(): string {
|
||||
return `<command-instruction>
|
||||
You are starting a Sisyphus work session.
|
||||
</command-instruction>
|
||||
|
||||
<session-context></session-context>`
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
testDir = join(tmpdir(), `start-work-hook-session-prefix-${randomUUID()}`)
|
||||
mkdirSync(join(testDir, ".omo", "plans"), { recursive: true })
|
||||
clearBoulderState(testDir)
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
clearBoulderState(testDir)
|
||||
if (existsSync(testDir)) {
|
||||
rmSync(testDir, { recursive: true, force: true })
|
||||
}
|
||||
})
|
||||
|
||||
test("#given raw chat session id #when processing start-work template #then boulder stores opencode-prefixed id", async () => {
|
||||
// given
|
||||
writeFileSync(join(testDir, ".omo", "plans", "work.md"), "# Work\n- [ ] First task\n")
|
||||
const hook = createStartWorkHook(unsafeTestValue<Parameters<typeof createStartWorkHook>[0]>({
|
||||
directory: testDir,
|
||||
client: {
|
||||
session: {
|
||||
messages: async () => ({ data: [] }),
|
||||
},
|
||||
},
|
||||
}))
|
||||
const output = {
|
||||
parts: [{ type: "text", text: createStartWorkPrompt() }],
|
||||
}
|
||||
|
||||
// when
|
||||
await hook["chat.message"]({ sessionID: "raw-sess" }, output)
|
||||
const state = readBoulderState(testDir)
|
||||
|
||||
// then
|
||||
expect(state?.session_ids).toEqual(["opencode:raw-sess"])
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user