fix(start-work): fall back to sisyphus without atlas

/start-work should leave plan mode even when Atlas is unavailable. This prevents Prometheus from being persisted into boulder state and keeping resumed work sessions in md-only mode.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-03-31 18:52:09 -07:00
parent dc1c410405
commit a3f9eb1337
2 changed files with 78 additions and 9 deletions
+64 -1
View File
@@ -1,7 +1,7 @@
import { describe, expect, test, beforeEach, afterEach, spyOn } from "bun:test"
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs"
import { join } from "node:path"
import { tmpdir, homedir } from "node:os"
import { tmpdir } from "node:os"
import { randomUUID } from "node:crypto"
import { createStartWorkHook } from "./index"
import {
@@ -448,6 +448,69 @@ describe("start-work hook", () => {
expect(output.message.agent).toBe("Sisyphus (Ultraworker)")
expect(sessionState.getSessionAgent("ses-prometheus-to-sisyphus")).toBe("sisyphus")
})
test("should fall back to Sisyphus instead of keeping Prometheus when Atlas is unavailable", async () => {
// given
sessionState._resetForTesting()
sessionState.registerAgentName("prometheus")
sessionState.registerAgentName("sisyphus")
sessionState.updateSessionAgent("ses-prometheus-to-worker", "prometheus")
const plansDir = join(testDir, ".sisyphus", "plans")
mkdirSync(plansDir, { recursive: true })
writeFileSync(join(plansDir, "worker-plan.md"), "# Plan\n- [ ] Task 1")
const hook = createStartWorkHook(createMockPluginInput())
const output = {
message: {} as Record<string, unknown>,
parts: [{ type: "text", text: "<session-context></session-context>" }],
}
// when
await hook["chat.message"](
{ sessionID: "ses-prometheus-to-worker" },
output
)
// then
expect(output.message.agent).toBe("Sisyphus (Ultraworker)")
expect(sessionState.getSessionAgent("ses-prometheus-to-worker")).toBe("sisyphus")
expect(readBoulderState(testDir)?.agent).toBe("sisyphus")
})
test("should rewrite stale Prometheus boulder state to Sisyphus when resuming without Atlas", async () => {
// given
sessionState._resetForTesting()
sessionState.registerAgentName("prometheus")
sessionState.registerAgentName("sisyphus")
sessionState.updateSessionAgent("ses-prometheus-resume", "prometheus")
const planPath = join(testDir, "resume-plan.md")
writeFileSync(planPath, "# Plan\n- [ ] Task 1")
writeBoulderState(testDir, {
active_plan: planPath,
started_at: "2026-01-02T10:00:00Z",
session_ids: ["old-session"],
plan_name: "resume-plan",
agent: "prometheus",
})
const hook = createStartWorkHook(createMockPluginInput())
const output = {
message: {} as Record<string, unknown>,
parts: [{ type: "text", text: "<session-context></session-context>" }],
}
// when
await hook["chat.message"](
{ sessionID: "ses-prometheus-resume" },
output
)
// then
expect(output.message.agent).toBe("Sisyphus (Ultraworker)")
expect(readBoulderState(testDir)?.agent).toBe("sisyphus")
})
})
describe("worktree support", () => {