docs(workspace): document omo workspace paths
This commit is contained in:
@@ -282,15 +282,15 @@ Once all three gates pass:
|
||||
gh pr merge "$PR_NUMBER" --squash --delete-branch
|
||||
```
|
||||
|
||||
### Sync .sisyphus state back to main repo
|
||||
### Sync .omo state back to main repo
|
||||
|
||||
Before removing the worktree, copy `.sisyphus/` state back. When `.sisyphus/` is gitignored, files written there during worktree execution are not committed or merged — they would be lost on worktree removal.
|
||||
Before removing the worktree, copy `.omo/` state back. When `.omo/` is gitignored, files written there during worktree execution are not committed or merged — they would be lost on worktree removal.
|
||||
|
||||
```bash
|
||||
# Sync .sisyphus state from worktree to main repo (preserves task state, plans, notepads)
|
||||
if [ -d "$WORKTREE_PATH/.sisyphus" ]; then
|
||||
mkdir -p "$ORIGINAL_DIR/.sisyphus"
|
||||
cp -r "$WORKTREE_PATH/.sisyphus/"* "$ORIGINAL_DIR/.sisyphus/" 2>/dev/null || true
|
||||
# Sync .omo state from worktree to main repo (preserves task state, plans, notepads)
|
||||
if [ -d "$WORKTREE_PATH/.omo" ]; then
|
||||
mkdir -p "$ORIGINAL_DIR/.omo"
|
||||
cp -r "$WORKTREE_PATH/.omo/"* "$ORIGINAL_DIR/.omo/" 2>/dev/null || true
|
||||
fi
|
||||
```
|
||||
|
||||
|
||||
@@ -282,15 +282,15 @@ Once all three gates pass:
|
||||
gh pr merge "$PR_NUMBER" --squash --delete-branch
|
||||
```
|
||||
|
||||
### Sync .sisyphus state back to main repo
|
||||
### Sync .omo state back to main repo
|
||||
|
||||
Before removing the worktree, copy `.sisyphus/` state back. When `.sisyphus/` is gitignored, files written there during worktree execution are not committed or merged — they would be lost on worktree removal.
|
||||
Before removing the worktree, copy `.omo/` state back. When `.omo/` is gitignored, files written there during worktree execution are not committed or merged — they would be lost on worktree removal.
|
||||
|
||||
```bash
|
||||
# Sync .sisyphus state from worktree to main repo (preserves task state, plans, notepads)
|
||||
if [ -d "$WORKTREE_PATH/.sisyphus" ]; then
|
||||
mkdir -p "$ORIGINAL_DIR/.sisyphus"
|
||||
cp -r "$WORKTREE_PATH/.sisyphus/"* "$ORIGINAL_DIR/.sisyphus/" 2>/dev/null || true
|
||||
# Sync .omo state from worktree to main repo (preserves task state, plans, notepads)
|
||||
if [ -d "$WORKTREE_PATH/.omo" ]; then
|
||||
mkdir -p "$ORIGINAL_DIR/.omo"
|
||||
cp -r "$WORKTREE_PATH/.omo/"* "$ORIGINAL_DIR/.omo/" 2>/dev/null || true
|
||||
fi
|
||||
```
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ oh-my-opencode/
|
||||
├── bun-test.d.ts # Custom bun:test type augmentations
|
||||
├── .opencode/ # Project-scope skills + commands (skills/, command/) + background-tasks state
|
||||
├── .agents/ # Mirrored project-scope skills + commands (recent migration target)
|
||||
├── .sisyphus/ # AI agent workspace (run-continuation/, plans/, tasks/, notepads/)
|
||||
├── .omo/ # AI agent workspace (run-continuation/, plans/, tasks/, notepads/)
|
||||
└── .local-ignore/ # Dev-only test fixtures + PR worktrees
|
||||
```
|
||||
|
||||
@@ -254,7 +254,7 @@ bunx oh-my-opencode mcp-oauth login <server-url> # Tier-3 MCP OAuth (PKCE + DCR
|
||||
- **Build:** `bun build` (ESM) + `tsc --emitDeclarationOnly`, externals: `@ast-grep/napi`, `zod`.
|
||||
- **CI tests:** root tests run through plain `bun test`; `web/**` has its own package-level CI workflow.
|
||||
- **122 barrel `index.ts` files** establish module boundaries.
|
||||
- **Architecture rules** enforced via `.sisyphus/rules/modular-code-enforcement.md` (when present in workspace).
|
||||
- **Architecture rules** enforced via `.omo/rules/modular-code-enforcement.md` (when present in workspace).
|
||||
- **Windows builds:** run on `windows-latest` (not cross-compiled) to avoid Bun segfaults.
|
||||
- **Platform binaries:** detect AVX2 + libc family at runtime, fallback to baseline if needed.
|
||||
- **IntentGate (`keyword-detector`):** classifies user intent (`ultrawork`/`ulw`, `search`, `analyze`, `team`) and injects mode-specific prompts.
|
||||
|
||||
+2
-2
@@ -22,14 +22,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
- `prompt-async-gate`: dispatch timeout via `Promise.race` with a default 30s window. Previously a hung `promptAsync` deadlocked the gate for that sessionID until process restart. (BLOCKER-1)
|
||||
- `prompt-async-gate`: post-dispatch failure now keeps the reservation hold regardless of whether `promptAsync` resolved or threw. AGENTS.md's documented race window ("returns before durably accepted, later failures arrive as `session.error`") is now covered. (BLOCKER-2)
|
||||
- `prompt-async-gate.test.ts`: replaced `setTimeout`-based synchronization with event-driven patterns to comply with the new `.sisyphus/rules/test-discipline.md` rule. (BLOCKER-3)
|
||||
- `prompt-async-gate.test.ts`: replaced `setTimeout`-based synchronization with event-driven patterns to comply with the new `.omo/rules/test-discipline.md` rule. (BLOCKER-3)
|
||||
- `model-suggestion-retry`: releases the reservation before the suggested-model retry so the second attempt can dispatch immediately. Without this, BLOCKER-2's post-dispatch hold trapped the retry path.
|
||||
|
||||
### Internal
|
||||
|
||||
- `prompt-async-route-audit.test.ts` migrated to TypeScript compiler API for AST-based detection. Catches destructuring, bracket access, optional chaining, and type-cast aliasing bypass patterns. Two existing production callers are documented in `RAW_PROMPT_ALLOWLIST` with justifications: `src/plugin/event.ts` (team-idle-wake-hint client facade) and `src/hooks/session-recovery/recover-unavailable-tool.ts` (capability check before gate-routed dispatch). (HIGH-5)
|
||||
- New `mock-module-lifecycle-audit.test.ts` enforces cleanup pairing for `mock.module(...)` calls in test files; existing offenders allowlisted with TODO references. (HIGH-10)
|
||||
- `.sisyphus/rules/test-discipline.md` added in this release window forbidding `setTimeout(resolve, N)` and `await sleep(N)` in test bodies unless time is the SUT. Several CI sharding commits earlier in the window were superseded by removing the sharded runner in favor of the rule.
|
||||
- `.omo/rules/test-discipline.md` added in this release window forbidding `setTimeout(resolve, N)` and `await sleep(N)` in test bodies unless time is the SUT. Several CI sharding commits earlier in the window were superseded by removing the sharded runner in favor of the rule.
|
||||
|
||||
### Known Issues
|
||||
|
||||
|
||||
+10
-10
@@ -55,7 +55,7 @@ flowchart TB
|
||||
User -->|"Describe work"| Prometheus
|
||||
Prometheus -->|"Consult"| Metis
|
||||
Prometheus -->|"Interview"| User
|
||||
Prometheus -->|"Generate plan"| Plan[".sisyphus/plans/*.md"]
|
||||
Prometheus -->|"Generate plan"| Plan[".omo/plans/*.md"]
|
||||
Plan -->|"High accuracy?"| Momus
|
||||
Momus -->|"OKAY / REJECT"| Prometheus
|
||||
|
||||
@@ -105,7 +105,7 @@ Mode distinction:
|
||||
|
||||
### Prometheus: Your Strategic Consultant
|
||||
|
||||
Prometheus is not just a planner, it's an intelligent interviewer that helps you think through what you actually need. It is **READ-ONLY** - can only create or modify markdown files within `.sisyphus/` directory.
|
||||
Prometheus is not just a planner, it's an intelligent interviewer that helps you think through what you actually need. It is **READ-ONLY** - can only create or modify markdown files within `.omo/` directory.
|
||||
|
||||
**The Interview Process:**
|
||||
|
||||
@@ -244,7 +244,7 @@ This prevents repeating mistakes and ensures consistent patterns.
|
||||
**Notepad System:**
|
||||
|
||||
```
|
||||
.sisyphus/notepads/{plan-name}/
|
||||
.omo/notepads/{plan-name}/
|
||||
├── learnings.md # Patterns, conventions, successful approaches
|
||||
├── decisions.md # Architectural choices and rationales
|
||||
├── issues.md # Problems, blockers, gotchas encountered
|
||||
@@ -379,7 +379,7 @@ For `subagent_type` team members, current eligibility is:
|
||||
Why `oracle`/`prometheus` are rejected in team members:
|
||||
|
||||
- Oracle is read-only (cannot write/edit/patch/delegate)
|
||||
- Prometheus is constrained to `.sisyphus/*.md` writes by the `prometheus-md-only` hook
|
||||
- Prometheus is constrained to `.omo/*.md` writes by the `prometheus-md-only` hook
|
||||
|
||||
---
|
||||
|
||||
@@ -394,7 +394,7 @@ Why `oracle`/`prometheus` are rejected in team members:
|
||||
2. Select "Prometheus" from the agent list
|
||||
3. Describe your work: "I want to refactor the auth system"
|
||||
4. Answer interview questions
|
||||
5. Prometheus creates plan in .sisyphus/plans/{name}.md
|
||||
5. Prometheus creates plan in .omo/plans/{name}.md
|
||||
```
|
||||
|
||||
**Method 2: Use @plan Command (in Sisyphus)**
|
||||
@@ -404,7 +404,7 @@ Why `oracle`/`prometheus` are rejected in team members:
|
||||
2. Type: @plan "I want to refactor the auth system"
|
||||
3. The @plan command automatically switches to Prometheus
|
||||
4. Answer interview questions
|
||||
5. Prometheus creates plan in .sisyphus/plans/{name}.md
|
||||
5. Prometheus creates plan in .omo/plans/{name}.md
|
||||
```
|
||||
|
||||
**Which Should You Use?**
|
||||
@@ -427,7 +427,7 @@ User: /start-work
|
||||
↓
|
||||
[start-work hook activates]
|
||||
↓
|
||||
Check: Does .sisyphus/boulder.json exist?
|
||||
Check: Does .omo/boulder.json exist?
|
||||
↓
|
||||
├─ YES (existing work) → RESUME MODE
|
||||
│ - Read the existing boulder state
|
||||
@@ -436,7 +436,7 @@ Check: Does .sisyphus/boulder.json exist?
|
||||
│ - Atlas continues where you left off
|
||||
│
|
||||
└─ NO (fresh start) → INIT MODE
|
||||
- Find the most recent plan in .sisyphus/plans/
|
||||
- Find the most recent plan in .omo/plans/
|
||||
- Create new boulder.json tracking this plan
|
||||
- Switch session agent to Atlas
|
||||
- Begin execution from task 1
|
||||
@@ -563,8 +563,8 @@ Prometheus enters interview mode by default. It will ask you questions about you
|
||||
|
||||
Either:
|
||||
|
||||
- No plans exist in `.sisyphus/plans/` → Create one with Prometheus first
|
||||
- Plans exist but boulder.json points elsewhere → Delete `.sisyphus/boulder.json` and retry
|
||||
- No plans exist in `.omo/plans/` → Create one with Prometheus first
|
||||
- Plans exist but boulder.json points elsewhere → Delete `.omo/boulder.json` and retry
|
||||
|
||||
### "I'm in Atlas but I want to switch back to normal mode"
|
||||
|
||||
|
||||
@@ -146,4 +146,4 @@ When enabled, each member gets a dedicated tmux pane attached to that member's s
|
||||
|
||||
## Reference
|
||||
|
||||
Full design: `.sisyphus/plans/team-mode.md`.
|
||||
Full design: `.omo/plans/team-mode.md`.
|
||||
|
||||
@@ -451,7 +451,7 @@ The `sisyphus.tasks` section configures **storage options** only:
|
||||
{
|
||||
"sisyphus": {
|
||||
"tasks": {
|
||||
"storage_path": ".sisyphus/tasks",
|
||||
"storage_path": ".omo/tasks",
|
||||
"claude_code_compat": false
|
||||
}
|
||||
}
|
||||
@@ -460,7 +460,7 @@ The `sisyphus.tasks` section configures **storage options** only:
|
||||
|
||||
| Option | Default | Description |
|
||||
| -------------------- | ----------------- | ------------------------------------------ |
|
||||
| `storage_path` | `.sisyphus/tasks` | Storage path (relative to project root) |
|
||||
| `storage_path` | `.omo/tasks` | Storage path (relative to project root) |
|
||||
| `task_list_id` | - | Force task list ID (alternative to env `ULTRAWORK_TASK_LIST_ID`) |
|
||||
| `claude_code_compat` | `false` | Enable Claude Code path compatibility mode |
|
||||
|
||||
|
||||
@@ -707,7 +707,7 @@ TaskUpdate({ id: "T-002", status: "completed" });
|
||||
// T-003 now unblocked
|
||||
```
|
||||
|
||||
**Storage**: Tasks are stored as JSON files in `.sisyphus/tasks/`.
|
||||
**Storage**: Tasks are stored as JSON files in `.omo/tasks/`.
|
||||
|
||||
**Difference from TodoWrite**:
|
||||
|
||||
|
||||
@@ -231,7 +231,7 @@ for their trigger. Static policy alone is not enough.
|
||||
- PR #3866 -> PR #4053: schema-compatible synthetic tool results for
|
||||
post-compaction recovery, related to safe recovery dispatch.
|
||||
- Root `AGENTS.md`: section "Internal message injection is dangerous".
|
||||
- `.sisyphus/rules/test-discipline.md`: forbids `setTimeout(resolve, N)` and
|
||||
- `.omo/rules/test-discipline.md`: forbids `setTimeout(resolve, N)` and
|
||||
`await sleep(N)` in tests unless time itself is the system under test.
|
||||
- Implementation: `src/shared/prompt-async-gate.ts`.
|
||||
- Audit: `src/shared/prompt-async-route-audit.test.ts`.
|
||||
|
||||
@@ -31,7 +31,7 @@ description: Developer reference for the Prometheus strategic planner agent —
|
||||
- May ONLY create/edit `.md` files (enforced by hook)
|
||||
- FORBIDDEN paths: `src/`, `package.json`, config files
|
||||
- Must explore codebase before planning (NEVER plan blind)
|
||||
- Plans saved to `.sisyphus/plans/`
|
||||
- Plans saved to `.omo/plans/`
|
||||
- Acceptance criteria requiring "user manually tests" are FORBIDDEN
|
||||
|
||||
## PLAN OUTPUT FORMAT
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ Commander.js CLI with 7 commands. Entry: `index.ts` → `runCli()` in `cli-progr
|
||||
| `get-local-version` | Version detection | Installed vs npm latest |
|
||||
| `mcp-oauth` | OAuth token management | login (PKCE), logout, status |
|
||||
| `refresh-model-capabilities` | Refresh models.dev cache | Model capabilities refresh |
|
||||
| `boulder` | Boulder state inspector | Format work-state + tasks from `.sisyphus/boulder-state/` |
|
||||
| `boulder` | Boulder state inspector | Format work-state + tasks from `.omo/boulder-state/` |
|
||||
|
||||
## STRUCTURE
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ interface Task {
|
||||
|
||||
## STORAGE
|
||||
|
||||
- Location: `.sisyphus/tasks/` directory
|
||||
- Location: `.omo/tasks/` directory
|
||||
- Format: JSON files, one per task
|
||||
- Atomic writes: temp file → rename
|
||||
- Locking: file-based lock for concurrent access
|
||||
|
||||
@@ -42,7 +42,7 @@ session.idle event
|
||||
| `session-last-agent.ts` | Determine which agent owns the session |
|
||||
| `recent-model-resolver.ts` | Resolve model used in recent messages |
|
||||
| `subagent-session-id.ts` | Detect if session is a subagent session |
|
||||
| `sisyphus-path.ts` | Resolve `.sisyphus/` directory path |
|
||||
| `omo-path.ts` | Resolve `.omo/` directory path |
|
||||
| `is-abort-error.ts` | Detect abort signals in session output |
|
||||
| `types.ts` | `SessionState`, `AtlasHookOptions`, `AtlasContext` |
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
```
|
||||
/ralph-loop → startLoop(sessionID, prompt, options)
|
||||
→ loopState.startLoop() → persists state to .sisyphus/ralph-loop.local.md
|
||||
→ loopState.startLoop() → persists state to .omo/ralph-loop.local.md
|
||||
→ session.idle events → createRalphLoopEventHandler()
|
||||
→ completionPromiseDetector: scan output for <promise>DONE</promise>
|
||||
→ if not done: inject continuation prompt → loop
|
||||
@@ -28,7 +28,7 @@
|
||||
| `completion-promise-detector.ts` | Scan session transcript for `<promise>DONE</promise>` |
|
||||
| `continuation-prompt-builder.ts` | Build continuation message for next iteration |
|
||||
| `continuation-prompt-injector.ts` | Inject built prompt into active session |
|
||||
| `storage.ts` | Read/write `.sisyphus/ralph-loop.local.md` state file |
|
||||
| `storage.ts` | Read/write `.omo/ralph-loop.local.md` state file |
|
||||
| `message-storage-directory.ts` | Temp dir for prompt injection |
|
||||
| `with-timeout.ts` | API call wrapper with timeout (default 5000ms) |
|
||||
| `types.ts` | `RalphLoopState`, `RalphLoopOptions`, loop iteration types |
|
||||
@@ -36,7 +36,7 @@
|
||||
## STATE FILE
|
||||
|
||||
```
|
||||
.sisyphus/ralph-loop.local.md (gitignored)
|
||||
.omo/ralph-loop.local.md (gitignored)
|
||||
→ sessionID, prompt, iteration count, maxIterations, completionPromise, ultrawork flag
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user