feat(workspace): store runtime state under omo

This commit is contained in:
YeonGyu-Kim
2026-05-16 17:40:11 +09:00
parent 5dca1a5742
commit a86221b1a9
13 changed files with 137 additions and 137 deletions
+2 -2
View File
@@ -10,7 +10,7 @@ function createTempDirectory(): string {
}
function seedPlanAndState(directory: string): void {
const planDirectory = join(directory, ".sisyphus", "plans")
const planDirectory = join(directory, ".omo", "plans")
mkdirSync(planDirectory, { recursive: true })
const planAPath = join(planDirectory, "alpha.md")
@@ -35,7 +35,7 @@ function seedPlanAndState(directory: string): void {
"utf-8",
)
const boulderDirectory = join(directory, ".sisyphus")
const boulderDirectory = join(directory, ".omo")
mkdirSync(boulderDirectory, { recursive: true })
writeFileSync(
+38 -38
View File
@@ -53,10 +53,10 @@ function writeBoulderStateFile(
sessionIDs: string[],
sessionOrigins?: Record<string, "direct" | "appended">,
): void {
const sisyphusDir = join(directory, ".sisyphus")
mkdirSync(sisyphusDir, { recursive: true })
const omoDir = join(directory, ".omo")
mkdirSync(omoDir, { recursive: true })
writeFileSync(
join(sisyphusDir, "boulder.json"),
join(omoDir, "boulder.json"),
JSON.stringify({
active_plan: activePlanPath,
started_at: new Date().toISOString(),
@@ -74,8 +74,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "active-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "active-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] incomplete task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["test-session"])
const ctx = createMockContext(directory)
@@ -92,8 +92,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "done-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "done-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [x] completed task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["test-session"])
const ctx = createMockContext(directory)
@@ -110,17 +110,17 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const mainPlanPath = join(directory, ".sisyphus", "plans", "done-in-worktree-plan.md")
const mainPlanPath = join(directory, ".omo", "plans", "done-in-worktree-plan.md")
const worktreeDirectory = createTempDir()
const worktreePlanPath = join(worktreeDirectory, ".sisyphus", "plans", "done-in-worktree-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
mkdirSync(join(worktreeDirectory, ".sisyphus", "plans"), { recursive: true })
const worktreePlanPath = join(worktreeDirectory, ".omo", "plans", "done-in-worktree-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
mkdirSync(join(worktreeDirectory, ".omo", "plans"), { recursive: true })
writeFileSync(mainPlanPath, "- [ ] stale main repo task\n", "utf-8")
writeFileSync(worktreePlanPath, "- [x] completed worktree task\n", "utf-8")
const sisyphusDir = join(directory, ".sisyphus")
mkdirSync(sisyphusDir, { recursive: true })
const omoDir = join(directory, ".omo")
mkdirSync(omoDir, { recursive: true })
writeFileSync(
join(sisyphusDir, "boulder.json"),
join(omoDir, "boulder.json"),
JSON.stringify({
active_plan: mainPlanPath,
started_at: new Date().toISOString(),
@@ -145,8 +145,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "active-descendant-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "active-descendant-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["root-session", "child-session"], {
"root-session": "direct",
@@ -181,8 +181,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "lineage-non-subagent-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "lineage-non-subagent-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["root-session"])
@@ -209,8 +209,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "lineage-agent-mismatch-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "lineage-agent-mismatch-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["root-session", "mismatch-subagent-session"], {
"root-session": "direct",
@@ -244,8 +244,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "appended-mismatch-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "appended-mismatch-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["root-session", "appended-mismatch-session"], {
"root-session": "direct",
@@ -279,8 +279,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "appended-unresolved-lineage-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "appended-unresolved-lineage-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["root-session", "ses_appended_descendant"], {
"root-session": "direct",
@@ -311,8 +311,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "direct-tracked-child-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "direct-tracked-child-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["ses_direct_child"])
@@ -338,8 +338,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "multi-tracked-direct-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "multi-tracked-direct-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["ses_other_tracked", "ses_direct_tracked"], {
"ses_other_tracked": "direct",
@@ -368,8 +368,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "unknown-origin-multi-session-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "unknown-origin-multi-session-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["ses_root_tracked", "ses_unknown_child"])
@@ -392,8 +392,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "multi-tracked-direct-child-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "multi-tracked-direct-child-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["ses_root_tracked", "ses_direct_child"], {
"ses_root_tracked": "direct",
@@ -427,8 +427,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "compaction-descendant-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "compaction-descendant-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["root-session", "ses_child_after_compaction"], {
"root-session": "direct",
@@ -466,8 +466,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "sqlite-ordered-descendant-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "sqlite-ordered-descendant-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["root-session"])
@@ -502,8 +502,8 @@ describe("checkCompletionConditions continuation coverage", () => {
// given
spyOn(console, "log").mockImplementation(() => {})
const directory = createTempDir()
const planPath = join(directory, ".sisyphus", "plans", "session-agent-fallback-plan.md")
mkdirSync(join(directory, ".sisyphus", "plans"), { recursive: true })
const planPath = join(directory, ".omo", "plans", "session-agent-fallback-plan.md")
mkdirSync(join(directory, ".omo", "plans"), { recursive: true })
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
writeBoulderStateFile(directory, planPath, ["ses_root_tracked", "ses_appended_child"], {
"ses_root_tracked": "direct",
@@ -68,12 +68,12 @@ describe("getContinuationState JSON backend descendant coverage", () => {
test("returns active boulder for explicitly tracked appended descendant on JSON message storage backend", async () => {
// given
const directory = createTempDir()
const plansDir = join(directory, ".sisyphus", "plans")
const plansDir = join(directory, ".omo", "plans")
mkdirSync(plansDir, { recursive: true })
const planPath = join(plansDir, "json-descendant-plan.md")
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
mkdirSync(join(directory, ".sisyphus"), { recursive: true })
writeFileSync(join(directory, ".sisyphus", "boulder.json"), JSON.stringify({
mkdirSync(join(directory, ".omo"), { recursive: true })
writeFileSync(join(directory, ".omo", "boulder.json"), JSON.stringify({
active_plan: planPath,
started_at: new Date().toISOString(),
session_ids: ["ses_root_session", "ses_child_session"],
@@ -134,12 +134,12 @@ describe("getContinuationState JSON backend descendant coverage", () => {
test("prefers newest JSON agent by time.created even when filenames look reversed and timestamps tie-break by filename only", async () => {
// given
const directory = createTempDir()
const plansDir = join(directory, ".sisyphus", "plans")
const plansDir = join(directory, ".omo", "plans")
mkdirSync(plansDir, { recursive: true })
const planPath = join(plansDir, "json-random-id-plan.md")
writeFileSync(planPath, "- [ ] unfinished task\n", "utf-8")
mkdirSync(join(directory, ".sisyphus"), { recursive: true })
writeFileSync(join(directory, ".sisyphus", "boulder.json"), JSON.stringify({
mkdirSync(join(directory, ".omo"), { recursive: true })
writeFileSync(join(directory, ".omo", "boulder.json"), JSON.stringify({
active_plan: planPath,
started_at: new Date().toISOString(),
session_ids: ["ses_root_random"],