oh-my-claude-sisyphus 3.8.15 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/README.md +9 -11
- package/agents/analyst.md +41 -0
- package/agents/architect.md +45 -0
- package/agents/critic.md +42 -0
- package/agents/deep-executor.md +193 -0
- package/agents/planner.md +82 -0
- package/bridge/mcp-server.cjs +1 -1
- package/commands/autopilot.md +2 -6
- package/commands/hud.md +7 -2
- package/commands/ralph.md +3 -3
- package/commands/ultrapilot.md +2 -6
- package/dist/__tests__/agent-registry.test.js +1 -1
- package/dist/__tests__/delegation-enforcement-levels.test.js +0 -1
- package/dist/__tests__/delegation-enforcement-levels.test.js.map +1 -1
- package/dist/__tests__/hooks/learner/parser.test.d.ts +5 -0
- package/dist/__tests__/hooks/learner/parser.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/learner/parser.test.js +201 -0
- package/dist/__tests__/hooks/learner/parser.test.js.map +1 -0
- package/dist/__tests__/hud/cwd.test.d.ts +2 -0
- package/dist/__tests__/hud/cwd.test.d.ts.map +1 -0
- package/dist/__tests__/hud/cwd.test.js +62 -0
- package/dist/__tests__/hud/cwd.test.js.map +1 -0
- package/dist/__tests__/hud/defaults.test.d.ts +2 -0
- package/dist/__tests__/hud/defaults.test.d.ts.map +1 -0
- package/dist/__tests__/hud/defaults.test.js +21 -0
- package/dist/__tests__/hud/defaults.test.js.map +1 -0
- package/dist/__tests__/hud/render.test.d.ts +2 -0
- package/dist/__tests__/hud/render.test.d.ts.map +1 -0
- package/dist/__tests__/hud/render.test.js +141 -0
- package/dist/__tests__/hud/render.test.js.map +1 -0
- package/dist/__tests__/hud/thinking.test.d.ts +2 -0
- package/dist/__tests__/hud/thinking.test.d.ts.map +1 -0
- package/dist/__tests__/hud/thinking.test.js +32 -0
- package/dist/__tests__/hud/thinking.test.js.map +1 -0
- package/dist/__tests__/installer.test.js +8 -8
- package/dist/__tests__/installer.test.js.map +1 -1
- package/dist/__tests__/mnemosyne/parser.test.js +1 -1
- package/dist/__tests__/mnemosyne/parser.test.js.map +1 -1
- package/dist/__tests__/omc-tools-server.test.js +2 -2
- package/dist/__tests__/omc-tools-server.test.js.map +1 -1
- package/dist/__tests__/skills.test.js +5 -4
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/agents/deep-executor.d.ts +15 -0
- package/dist/agents/deep-executor.d.ts.map +1 -0
- package/dist/agents/deep-executor.js +47 -0
- package/dist/agents/deep-executor.js.map +1 -0
- package/dist/agents/definitions.d.ts +15 -0
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +25 -0
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/doctor-conflicts.d.ts +55 -0
- package/dist/cli/commands/doctor-conflicts.d.ts.map +1 -0
- package/dist/cli/commands/doctor-conflicts.js +261 -0
- package/dist/cli/commands/doctor-conflicts.js.map +1 -0
- package/dist/cli/index.js +16 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/features/auto-update.d.ts +12 -0
- package/dist/features/auto-update.d.ts.map +1 -1
- package/dist/features/auto-update.js +4 -1
- package/dist/features/auto-update.js.map +1 -1
- package/dist/features/context-injector/types.d.ts +1 -1
- package/dist/features/context-injector/types.d.ts.map +1 -1
- package/dist/features/continuation-enforcement.js +1 -1
- package/dist/features/state-manager/index.d.ts.map +1 -1
- package/dist/features/state-manager/index.js +7 -4
- package/dist/features/state-manager/index.js.map +1 -1
- package/dist/features/verification/example.d.ts.map +1 -1
- package/dist/features/verification/example.js +4 -2
- package/dist/features/verification/example.js.map +1 -1
- package/dist/hooks/__tests__/bridge.test.d.ts +2 -0
- package/dist/hooks/__tests__/bridge.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/bridge.test.js +199 -0
- package/dist/hooks/__tests__/bridge.test.js.map +1 -0
- package/dist/hooks/beads-context/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/beads-context/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/beads-context/__tests__/index.test.js +150 -0
- package/dist/hooks/beads-context/__tests__/index.test.js.map +1 -0
- package/dist/hooks/beads-context/constants.d.ts +3 -0
- package/dist/hooks/beads-context/constants.d.ts.map +1 -0
- package/dist/hooks/beads-context/constants.js +35 -0
- package/dist/hooks/beads-context/constants.js.map +1 -0
- package/dist/hooks/beads-context/index.d.ts +21 -0
- package/dist/hooks/beads-context/index.d.ts.map +1 -0
- package/dist/hooks/beads-context/index.js +62 -0
- package/dist/hooks/beads-context/index.js.map +1 -0
- package/dist/hooks/beads-context/types.d.ts +7 -0
- package/dist/hooks/beads-context/types.d.ts.map +1 -0
- package/dist/hooks/beads-context/types.js +2 -0
- package/dist/hooks/beads-context/types.js.map +1 -0
- package/dist/hooks/bridge.d.ts +4 -0
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +80 -47
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +4 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/learner/parser.d.ts.map +1 -1
- package/dist/hooks/learner/parser.js +12 -5
- package/dist/hooks/learner/parser.js.map +1 -1
- package/dist/hooks/mode-registry/index.d.ts +2 -0
- package/dist/hooks/mode-registry/index.d.ts.map +1 -1
- package/dist/hooks/mode-registry/index.js +8 -19
- package/dist/hooks/mode-registry/index.js.map +1 -1
- package/dist/hooks/permission-handler/index.d.ts.map +1 -1
- package/dist/hooks/permission-handler/index.js +3 -1
- package/dist/hooks/permission-handler/index.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts +1 -1
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js +5 -33
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/ralph/index.d.ts +1 -1
- package/dist/hooks/ralph/index.d.ts.map +1 -1
- package/dist/hooks/ralph/index.js +1 -1
- package/dist/hooks/ralph/index.js.map +1 -1
- package/dist/hooks/ralph/loop.d.ts +1 -9
- package/dist/hooks/ralph/loop.d.ts.map +1 -1
- package/dist/hooks/ralph/loop.js +1 -37
- package/dist/hooks/ralph/loop.js.map +1 -1
- package/dist/hooks/ralph/prd.js +1 -1
- package/dist/hooks/ralph/verifier.d.ts +4 -5
- package/dist/hooks/ralph/verifier.d.ts.map +1 -1
- package/dist/hooks/ralph/verifier.js +7 -10
- package/dist/hooks/ralph/verifier.js.map +1 -1
- package/dist/hooks/session-end/index.d.ts +13 -0
- package/dist/hooks/session-end/index.d.ts.map +1 -1
- package/dist/hooks/session-end/index.js +69 -0
- package/dist/hooks/session-end/index.js.map +1 -1
- package/dist/hooks/setup/index.d.ts.map +1 -1
- package/dist/hooks/setup/index.js +12 -5
- package/dist/hooks/setup/index.js.map +1 -1
- package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
- package/dist/hooks/subagent-tracker/index.js +25 -9
- package/dist/hooks/subagent-tracker/index.js.map +1 -1
- package/dist/hooks/ultrawork/index.d.ts +2 -2
- package/dist/hooks/ultrawork/index.d.ts.map +1 -1
- package/dist/hooks/ultrawork/index.js +2 -46
- package/dist/hooks/ultrawork/index.js.map +1 -1
- package/dist/hud/elements/cwd.d.ts +15 -0
- package/dist/hud/elements/cwd.d.ts.map +1 -0
- package/dist/hud/elements/cwd.js +39 -0
- package/dist/hud/elements/cwd.js.map +1 -0
- package/dist/hud/elements/index.d.ts +1 -0
- package/dist/hud/elements/index.d.ts.map +1 -1
- package/dist/hud/elements/index.js +1 -0
- package/dist/hud/elements/index.js.map +1 -1
- package/dist/hud/elements/thinking.d.ts +7 -5
- package/dist/hud/elements/thinking.d.ts.map +1 -1
- package/dist/hud/elements/thinking.js +18 -6
- package/dist/hud/elements/thinking.js.map +1 -1
- package/dist/hud/index.js +5 -3
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/omc-state.d.ts +1 -1
- package/dist/hud/omc-state.d.ts.map +1 -1
- package/dist/hud/omc-state.js +14 -31
- package/dist/hud/omc-state.js.map +1 -1
- package/dist/hud/render.d.ts +9 -0
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +27 -7
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts +2 -2
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +4 -33
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/transcript.d.ts +4 -1
- package/dist/hud/transcript.d.ts.map +1 -1
- package/dist/hud/transcript.js +4 -9
- package/dist/hud/transcript.js.map +1 -1
- package/dist/hud/types.d.ts +20 -1
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +38 -9
- package/dist/hud/types.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/__tests__/claude-md-merge.test.d.ts +6 -0
- package/dist/installer/__tests__/claude-md-merge.test.d.ts.map +1 -0
- package/dist/installer/__tests__/claude-md-merge.test.js +220 -0
- package/dist/installer/__tests__/claude-md-merge.test.js.map +1 -0
- package/dist/installer/__tests__/safe-installer.test.d.ts +6 -0
- package/dist/installer/__tests__/safe-installer.test.d.ts.map +1 -0
- package/dist/installer/__tests__/safe-installer.test.js +172 -0
- package/dist/installer/__tests__/safe-installer.test.js.map +1 -0
- package/dist/installer/hooks.d.ts +1 -1
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +4 -2
- package/dist/installer/hooks.js.map +1 -1
- package/dist/installer/index.d.ts +27 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +209 -85
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/omc-tools-server.d.ts +1 -1
- package/dist/mcp/omc-tools-server.d.ts.map +1 -1
- package/dist/mcp/omc-tools-server.js +3 -3
- package/dist/mcp/omc-tools-server.js.map +1 -1
- package/dist/mcp/standalone-server.js +1 -1
- package/dist/mcp/standalone-server.js.map +1 -1
- package/dist/verification/tier-selector.d.ts +40 -0
- package/dist/verification/tier-selector.d.ts.map +1 -0
- package/dist/verification/tier-selector.js +95 -0
- package/dist/verification/tier-selector.js.map +1 -0
- package/dist/verification/tier-selector.test.d.ts +2 -0
- package/dist/verification/tier-selector.test.d.ts.map +1 -0
- package/dist/verification/tier-selector.test.js +282 -0
- package/dist/verification/tier-selector.test.js.map +1 -0
- package/docs/AGENTS.md +100 -0
- package/docs/ARCHITECTURE.md +11 -7
- package/docs/CLAUDE.md +89 -379
- package/docs/DELEGATION-ENFORCER.md +1 -2
- package/docs/MIGRATION.md +1 -1
- package/docs/REFERENCE.md +29 -9
- package/docs/SYNC-SYSTEM.md +0 -2
- package/docs/partials/agent-tiers.md +165 -0
- package/docs/partials/features.md +131 -0
- package/docs/partials/mode-hierarchy.md +120 -0
- package/docs/partials/mode-selection-guide.md +82 -0
- package/docs/partials/verification-tiers.md +107 -0
- package/docs/shared/agent-tiers.md +165 -0
- package/docs/shared/features.md +131 -0
- package/docs/shared/mode-hierarchy.md +120 -0
- package/docs/shared/mode-selection-guide.md +82 -0
- package/docs/shared/verification-tiers.md +107 -0
- package/package.json +4 -3
- package/scripts/compose-docs.mjs +44 -0
- package/scripts/keyword-detector.mjs +13 -3
- package/scripts/persistent-mode.mjs +78 -47
- package/scripts/test-mutual-exclusion.ts +3 -3
- package/skills/AGENTS.md +59 -44
- package/skills/autopilot/SKILL.md +0 -2
- package/skills/cancel/SKILL.md +13 -32
- package/skills/deep-executor/SKILL.md +50 -0
- package/skills/ecomode/SKILL.md +58 -104
- package/skills/hud/SKILL.md +3 -2
- package/skills/omc-setup/SKILL.md +197 -20
- package/skills/plan/SKILL.md +62 -0
- package/skills/project-session-manager/SKILL.md +87 -4
- package/skills/project-session-manager/lib/config.sh +54 -5
- package/skills/project-session-manager/lib/parse.sh +65 -11
- package/skills/project-session-manager/lib/providers/github.sh +52 -0
- package/skills/project-session-manager/lib/providers/interface.sh +76 -0
- package/skills/project-session-manager/lib/providers/jira.sh +79 -0
- package/skills/project-session-manager/lib/session.sh +49 -12
- package/skills/project-session-manager/lib/worktree.sh +37 -4
- package/skills/project-session-manager/psm.sh +116 -51
- package/skills/ralph/SKILL.md +48 -44
- package/skills/ultrawork/SKILL.md +56 -67
- package/templates/hooks/keyword-detector.mjs +21 -13
- package/templates/hooks/lib/stdin.mjs +62 -0
- package/templates/hooks/persistent-mode.mjs +75 -34
- package/templates/hooks/post-tool-use.mjs +8 -10
- package/templates/hooks/pre-tool-use.mjs +9 -6
- package/templates/hooks/session-start.mjs +7 -8
- package/agents/AGENTS.md +0 -144
|
@@ -73,10 +73,20 @@ function extractPrompt(input) {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
//
|
|
77
|
-
function
|
|
76
|
+
// Sanitize text to prevent false positives from code blocks, XML tags, URLs, and file paths
|
|
77
|
+
function sanitizeForKeywordDetection(text) {
|
|
78
78
|
return text
|
|
79
|
+
// 1. Strip XML-style tag blocks: <tag-name ...>...</tag-name> (multi-line, greedy on tag name)
|
|
80
|
+
.replace(/<(\w[\w-]*)[\s>][\s\S]*?<\/\1>/g, '')
|
|
81
|
+
// 2. Strip self-closing XML tags: <tag-name />, <tag-name attr="val" />
|
|
82
|
+
.replace(/<\w[\w-]*(?:\s[^>]*)?\s*\/>/g, '')
|
|
83
|
+
// 3. Strip URLs: http://... or https://... up to whitespace
|
|
84
|
+
.replace(/https?:\/\/[^\s)>\]]+/g, '')
|
|
85
|
+
// 4. Strip file paths: /foo/bar/baz or foo/bar/baz (using lookbehind to avoid consuming leading char)
|
|
86
|
+
.replace(/(?<=^|[\s"'`(])(?:\/)?(?:[\w.-]+\/)+[\w.-]+/gm, '')
|
|
87
|
+
// 5. Strip markdown code blocks (existing)
|
|
79
88
|
.replace(/```[\s\S]*?```/g, '')
|
|
89
|
+
// 6. Strip inline code (existing)
|
|
80
90
|
.replace(/`[^`]+`/g, '');
|
|
81
91
|
}
|
|
82
92
|
|
|
@@ -225,7 +235,7 @@ async function main() {
|
|
|
225
235
|
return;
|
|
226
236
|
}
|
|
227
237
|
|
|
228
|
-
const cleanPrompt =
|
|
238
|
+
const cleanPrompt = sanitizeForKeywordDetection(prompt).toLowerCase();
|
|
229
239
|
|
|
230
240
|
// Collect all matching keywords
|
|
231
241
|
const matches = [];
|
|
@@ -44,19 +44,37 @@ function writeJsonFile(path, data) {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
|
-
*
|
|
47
|
+
* Staleness threshold for mode states (2 hours in milliseconds).
|
|
48
|
+
* States older than this are treated as inactive to prevent stale state
|
|
49
|
+
* from causing the stop hook to malfunction in new sessions.
|
|
48
50
|
*/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
const STALE_STATE_THRESHOLD_MS = 2 * 60 * 60 * 1000; // 2 hours
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Check if a state is stale based on its timestamps.
|
|
55
|
+
* A state is considered stale if it hasn't been updated recently.
|
|
56
|
+
* We check both `last_checked_at` and `started_at` - using whichever is more recent.
|
|
57
|
+
*/
|
|
58
|
+
function isStaleState(state) {
|
|
59
|
+
if (!state) return true;
|
|
60
|
+
|
|
61
|
+
const lastChecked = state.last_checked_at ? new Date(state.last_checked_at).getTime() : 0;
|
|
62
|
+
const startedAt = state.started_at ? new Date(state.started_at).getTime() : 0;
|
|
63
|
+
const mostRecent = Math.max(lastChecked, startedAt);
|
|
52
64
|
|
|
53
|
-
|
|
54
|
-
if (state) return { state, path: localPath };
|
|
65
|
+
if (mostRecent === 0) return true; // No valid timestamps
|
|
55
66
|
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
const age = Date.now() - mostRecent;
|
|
68
|
+
return age > STALE_STATE_THRESHOLD_MS;
|
|
69
|
+
}
|
|
58
70
|
|
|
59
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Read state file from local location only.
|
|
73
|
+
*/
|
|
74
|
+
function readStateFile(stateDir, filename) {
|
|
75
|
+
const localPath = join(stateDir, filename);
|
|
76
|
+
const state = readJsonFile(localPath);
|
|
77
|
+
return { state, path: localPath };
|
|
60
78
|
}
|
|
61
79
|
|
|
62
80
|
/**
|
|
@@ -122,7 +140,6 @@ function countIncompleteTodos(sessionId, projectDir) {
|
|
|
122
140
|
function isContextLimitStop(data) {
|
|
123
141
|
const reason = (data.stop_reason || data.stopReason || '').toLowerCase();
|
|
124
142
|
|
|
125
|
-
// Known context-limit patterns (both confirmed and defensive)
|
|
126
143
|
const contextPatterns = [
|
|
127
144
|
'context_limit',
|
|
128
145
|
'context_window',
|
|
@@ -139,7 +156,6 @@ function isContextLimitStop(data) {
|
|
|
139
156
|
return true;
|
|
140
157
|
}
|
|
141
158
|
|
|
142
|
-
// Also check end_turn_reason (API-level field)
|
|
143
159
|
const endTurnReason = (data.end_turn_reason || data.endTurnReason || '').toLowerCase();
|
|
144
160
|
if (endTurnReason && contextPatterns.some(p => endTurnReason.includes(p))) {
|
|
145
161
|
return true;
|
|
@@ -173,7 +189,6 @@ async function main() {
|
|
|
173
189
|
const directory = data.directory || process.cwd();
|
|
174
190
|
const sessionId = data.sessionId || data.session_id || '';
|
|
175
191
|
const stateDir = join(directory, '.omc', 'state');
|
|
176
|
-
const globalStateDir = join(homedir(), '.omc', 'state');
|
|
177
192
|
|
|
178
193
|
// CRITICAL: Never block context-limit stops.
|
|
179
194
|
// Blocking these causes a deadlock where Claude Code cannot compact.
|
|
@@ -189,14 +204,14 @@ async function main() {
|
|
|
189
204
|
return;
|
|
190
205
|
}
|
|
191
206
|
|
|
192
|
-
// Read all mode states (local-
|
|
193
|
-
const ralph = readStateFile(stateDir,
|
|
194
|
-
const autopilot = readStateFile(stateDir,
|
|
195
|
-
const ultrapilot = readStateFile(stateDir,
|
|
196
|
-
const ultrawork = readStateFile(stateDir,
|
|
197
|
-
const ecomode = readStateFile(stateDir,
|
|
198
|
-
const ultraqa = readStateFile(stateDir,
|
|
199
|
-
const pipeline = readStateFile(stateDir,
|
|
207
|
+
// Read all mode states (local-only)
|
|
208
|
+
const ralph = readStateFile(stateDir, 'ralph-state.json');
|
|
209
|
+
const autopilot = readStateFile(stateDir, 'autopilot-state.json');
|
|
210
|
+
const ultrapilot = readStateFile(stateDir, 'ultrapilot-state.json');
|
|
211
|
+
const ultrawork = readStateFile(stateDir, 'ultrawork-state.json');
|
|
212
|
+
const ecomode = readStateFile(stateDir, 'ecomode-state.json');
|
|
213
|
+
const ultraqa = readStateFile(stateDir, 'ultraqa-state.json');
|
|
214
|
+
const pipeline = readStateFile(stateDir, 'pipeline-state.json');
|
|
200
215
|
|
|
201
216
|
// Swarm uses swarm-summary.json (not swarm-state.json) + marker file
|
|
202
217
|
const swarmMarker = existsSync(join(stateDir, 'swarm-active.marker'));
|
|
@@ -208,34 +223,37 @@ async function main() {
|
|
|
208
223
|
const totalIncomplete = taskCount + todoCount;
|
|
209
224
|
|
|
210
225
|
// Priority 1: Ralph Loop (explicit persistence mode)
|
|
211
|
-
if (
|
|
226
|
+
// Skip if state is stale (older than 2 hours) - prevents blocking new sessions
|
|
227
|
+
if (ralph.state?.active && !isStaleState(ralph.state)) {
|
|
212
228
|
const iteration = ralph.state.iteration || 1;
|
|
213
229
|
const maxIter = ralph.state.max_iterations || 100;
|
|
214
230
|
|
|
215
231
|
if (iteration < maxIter) {
|
|
216
232
|
ralph.state.iteration = iteration + 1;
|
|
233
|
+
ralph.state.last_checked_at = new Date().toISOString();
|
|
217
234
|
writeJsonFile(ralph.path, ralph.state);
|
|
218
235
|
|
|
219
236
|
console.log(JSON.stringify({
|
|
220
237
|
decision: 'block',
|
|
221
|
-
reason: `[RALPH LOOP - ITERATION ${iteration + 1}/${maxIter}] Work is NOT done. Continue
|
|
238
|
+
reason: `[RALPH LOOP - ITERATION ${iteration + 1}/${maxIter}] Work is NOT done. Continue working.\nWhen FULLY complete (after Architect verification), run /oh-my-claudecode:cancel to cleanly exit ralph mode and clean up all state files. If cancel fails, retry with /oh-my-claudecode:cancel --force.\n${ralph.state.prompt ? `Task: ${ralph.state.prompt}` : ''}`
|
|
222
239
|
}));
|
|
223
240
|
return;
|
|
224
241
|
}
|
|
225
242
|
}
|
|
226
243
|
|
|
227
244
|
// Priority 2: Autopilot (high-level orchestration)
|
|
228
|
-
if (autopilot.state?.active) {
|
|
245
|
+
if (autopilot.state?.active && !isStaleState(autopilot.state)) {
|
|
229
246
|
const phase = autopilot.state.phase || 'unknown';
|
|
230
247
|
if (phase !== 'complete') {
|
|
231
248
|
const newCount = (autopilot.state.reinforcement_count || 0) + 1;
|
|
232
249
|
if (newCount <= 20) {
|
|
233
250
|
autopilot.state.reinforcement_count = newCount;
|
|
251
|
+
autopilot.state.last_checked_at = new Date().toISOString();
|
|
234
252
|
writeJsonFile(autopilot.path, autopilot.state);
|
|
235
253
|
|
|
236
254
|
console.log(JSON.stringify({
|
|
237
255
|
decision: 'block',
|
|
238
|
-
reason: `[AUTOPILOT - Phase: ${phase}] Autopilot not complete. Continue working.`
|
|
256
|
+
reason: `[AUTOPILOT - Phase: ${phase}] Autopilot not complete. Continue working. When all phases are complete, run /oh-my-claudecode:cancel to cleanly exit and clean up state files. If cancel fails, retry with /oh-my-claudecode:cancel --force.`
|
|
239
257
|
}));
|
|
240
258
|
return;
|
|
241
259
|
}
|
|
@@ -243,18 +261,19 @@ async function main() {
|
|
|
243
261
|
}
|
|
244
262
|
|
|
245
263
|
// Priority 3: Ultrapilot (parallel autopilot)
|
|
246
|
-
if (ultrapilot.state?.active) {
|
|
264
|
+
if (ultrapilot.state?.active && !isStaleState(ultrapilot.state)) {
|
|
247
265
|
const workers = ultrapilot.state.workers || [];
|
|
248
266
|
const incomplete = workers.filter(w => w.status !== 'complete' && w.status !== 'failed').length;
|
|
249
267
|
if (incomplete > 0) {
|
|
250
268
|
const newCount = (ultrapilot.state.reinforcement_count || 0) + 1;
|
|
251
269
|
if (newCount <= 20) {
|
|
252
270
|
ultrapilot.state.reinforcement_count = newCount;
|
|
271
|
+
ultrapilot.state.last_checked_at = new Date().toISOString();
|
|
253
272
|
writeJsonFile(ultrapilot.path, ultrapilot.state);
|
|
254
273
|
|
|
255
274
|
console.log(JSON.stringify({
|
|
256
275
|
decision: 'block',
|
|
257
|
-
reason: `[ULTRAPILOT] ${incomplete} workers still running. Continue.`
|
|
276
|
+
reason: `[ULTRAPILOT] ${incomplete} workers still running. Continue working. When all workers complete, run /oh-my-claudecode:cancel to cleanly exit and clean up state files. If cancel fails, retry with /oh-my-claudecode:cancel --force.`
|
|
258
277
|
}));
|
|
259
278
|
return;
|
|
260
279
|
}
|
|
@@ -262,17 +281,18 @@ async function main() {
|
|
|
262
281
|
}
|
|
263
282
|
|
|
264
283
|
// Priority 4: Swarm (coordinated agents with SQLite)
|
|
265
|
-
if (swarmMarker && swarmSummary?.active) {
|
|
284
|
+
if (swarmMarker && swarmSummary?.active && !isStaleState(swarmSummary)) {
|
|
266
285
|
const pending = (swarmSummary.tasks_pending || 0) + (swarmSummary.tasks_claimed || 0);
|
|
267
286
|
if (pending > 0) {
|
|
268
287
|
const newCount = (swarmSummary.reinforcement_count || 0) + 1;
|
|
269
288
|
if (newCount <= 15) {
|
|
270
289
|
swarmSummary.reinforcement_count = newCount;
|
|
290
|
+
swarmSummary.last_checked_at = new Date().toISOString();
|
|
271
291
|
writeJsonFile(join(stateDir, 'swarm-summary.json'), swarmSummary);
|
|
272
292
|
|
|
273
293
|
console.log(JSON.stringify({
|
|
274
294
|
decision: 'block',
|
|
275
|
-
reason: `[SWARM ACTIVE] ${pending} tasks remain. Continue working.`
|
|
295
|
+
reason: `[SWARM ACTIVE] ${pending} tasks remain. Continue working. When all tasks are done, run /oh-my-claudecode:cancel to cleanly exit and clean up state files. If cancel fails, retry with /oh-my-claudecode:cancel --force.`
|
|
276
296
|
}));
|
|
277
297
|
return;
|
|
278
298
|
}
|
|
@@ -280,18 +300,19 @@ async function main() {
|
|
|
280
300
|
}
|
|
281
301
|
|
|
282
302
|
// Priority 5: Pipeline (sequential stages)
|
|
283
|
-
if (pipeline.state?.active) {
|
|
303
|
+
if (pipeline.state?.active && !isStaleState(pipeline.state)) {
|
|
284
304
|
const currentStage = pipeline.state.current_stage || 0;
|
|
285
305
|
const totalStages = pipeline.state.stages?.length || 0;
|
|
286
306
|
if (currentStage < totalStages) {
|
|
287
307
|
const newCount = (pipeline.state.reinforcement_count || 0) + 1;
|
|
288
308
|
if (newCount <= 15) {
|
|
289
309
|
pipeline.state.reinforcement_count = newCount;
|
|
310
|
+
pipeline.state.last_checked_at = new Date().toISOString();
|
|
290
311
|
writeJsonFile(pipeline.path, pipeline.state);
|
|
291
312
|
|
|
292
313
|
console.log(JSON.stringify({
|
|
293
314
|
decision: 'block',
|
|
294
|
-
reason: `[PIPELINE - Stage ${currentStage + 1}/${totalStages}] Pipeline not complete. Continue.`
|
|
315
|
+
reason: `[PIPELINE - Stage ${currentStage + 1}/${totalStages}] Pipeline not complete. Continue working. When all stages complete, run /oh-my-claudecode:cancel to cleanly exit and clean up state files. If cancel fails, retry with /oh-my-claudecode:cancel --force.`
|
|
295
316
|
}));
|
|
296
317
|
return;
|
|
297
318
|
}
|
|
@@ -299,16 +320,17 @@ async function main() {
|
|
|
299
320
|
}
|
|
300
321
|
|
|
301
322
|
// Priority 6: UltraQA (QA cycling)
|
|
302
|
-
if (ultraqa.state?.active) {
|
|
323
|
+
if (ultraqa.state?.active && !isStaleState(ultraqa.state)) {
|
|
303
324
|
const cycle = ultraqa.state.cycle || 1;
|
|
304
325
|
const maxCycles = ultraqa.state.max_cycles || 10;
|
|
305
326
|
if (cycle < maxCycles && !ultraqa.state.all_passing) {
|
|
306
327
|
ultraqa.state.cycle = cycle + 1;
|
|
328
|
+
ultraqa.state.last_checked_at = new Date().toISOString();
|
|
307
329
|
writeJsonFile(ultraqa.path, ultraqa.state);
|
|
308
330
|
|
|
309
331
|
console.log(JSON.stringify({
|
|
310
332
|
decision: 'block',
|
|
311
|
-
reason: `[ULTRAQA - Cycle ${cycle + 1}/${maxCycles}] Tests not all passing. Continue fixing.`
|
|
333
|
+
reason: `[ULTRAQA - Cycle ${cycle + 1}/${maxCycles}] Tests not all passing. Continue fixing. When all tests pass, run /oh-my-claudecode:cancel to cleanly exit and clean up state files. If cancel fails, retry with /oh-my-claudecode:cancel --force.`
|
|
312
334
|
}));
|
|
313
335
|
return;
|
|
314
336
|
}
|
|
@@ -316,7 +338,7 @@ async function main() {
|
|
|
316
338
|
|
|
317
339
|
// Priority 7: Ultrawork - ALWAYS continue while active (not just when tasks exist)
|
|
318
340
|
// This prevents false stops from bash errors, transient failures, etc.
|
|
319
|
-
if (ultrawork.state?.active) {
|
|
341
|
+
if (ultrawork.state?.active && !isStaleState(ultrawork.state)) {
|
|
320
342
|
const newCount = (ultrawork.state.reinforcement_count || 0) + 1;
|
|
321
343
|
const maxReinforcements = ultrawork.state.max_reinforcements || 50;
|
|
322
344
|
|
|
@@ -330,25 +352,29 @@ async function main() {
|
|
|
330
352
|
ultrawork.state.last_checked_at = new Date().toISOString();
|
|
331
353
|
writeJsonFile(ultrawork.path, ultrawork.state);
|
|
332
354
|
|
|
333
|
-
|
|
334
|
-
|
|
355
|
+
let reason = `[ULTRAWORK #${newCount}/${maxReinforcements}] Mode active.`;
|
|
356
|
+
|
|
335
357
|
if (totalIncomplete > 0) {
|
|
336
358
|
const itemType = taskCount > 0 ? 'Tasks' : 'todos';
|
|
337
|
-
reason
|
|
359
|
+
reason += ` ${totalIncomplete} incomplete ${itemType} remain. Continue working.`;
|
|
360
|
+
} else if (newCount >= 3) {
|
|
361
|
+
// Only suggest cancel after minimum iterations (guard against no-tasks-created scenario)
|
|
362
|
+
reason += ` If all work is complete, run /oh-my-claudecode:cancel to cleanly exit ultrawork mode and clean up state files. If cancel fails, retry with /oh-my-claudecode:cancel --force. Otherwise, continue working.`;
|
|
363
|
+
} else {
|
|
364
|
+
// Early iterations with no tasks yet - just tell LLM to continue
|
|
365
|
+
reason += ` Continue working - create Tasks to track your progress.`;
|
|
338
366
|
}
|
|
367
|
+
|
|
339
368
|
if (ultrawork.state.original_prompt) {
|
|
340
369
|
reason += `\nTask: ${ultrawork.state.original_prompt}`;
|
|
341
370
|
}
|
|
342
371
|
|
|
343
|
-
console.log(JSON.stringify({
|
|
344
|
-
decision: 'block',
|
|
345
|
-
reason: reason
|
|
346
|
-
}));
|
|
372
|
+
console.log(JSON.stringify({ decision: 'block', reason }));
|
|
347
373
|
return;
|
|
348
374
|
}
|
|
349
375
|
|
|
350
376
|
// Priority 8: Ecomode - ALWAYS continue while active
|
|
351
|
-
if (ecomode.state?.active) {
|
|
377
|
+
if (ecomode.state?.active && !isStaleState(ecomode.state)) {
|
|
352
378
|
const newCount = (ecomode.state.reinforcement_count || 0) + 1;
|
|
353
379
|
const maxReinforcements = ecomode.state.max_reinforcements || 50;
|
|
354
380
|
|
|
@@ -359,18 +385,23 @@ async function main() {
|
|
|
359
385
|
}
|
|
360
386
|
|
|
361
387
|
ecomode.state.reinforcement_count = newCount;
|
|
388
|
+
ecomode.state.last_checked_at = new Date().toISOString();
|
|
362
389
|
writeJsonFile(ecomode.path, ecomode.state);
|
|
363
390
|
|
|
364
|
-
let reason = `[ECOMODE #${newCount}] Mode active
|
|
391
|
+
let reason = `[ECOMODE #${newCount}/${maxReinforcements}] Mode active.`;
|
|
392
|
+
|
|
365
393
|
if (totalIncomplete > 0) {
|
|
366
394
|
const itemType = taskCount > 0 ? 'Tasks' : 'todos';
|
|
367
|
-
reason
|
|
395
|
+
reason += ` ${totalIncomplete} incomplete ${itemType} remain. Continue working.`;
|
|
396
|
+
} else if (newCount >= 3) {
|
|
397
|
+
// Only suggest cancel after minimum iterations (guard against no-tasks-created scenario)
|
|
398
|
+
reason += ` If all work is complete, run /oh-my-claudecode:cancel to cleanly exit ecomode and clean up state files. If cancel fails, retry with /oh-my-claudecode:cancel --force. Otherwise, continue working.`;
|
|
399
|
+
} else {
|
|
400
|
+
// Early iterations with no tasks yet - just tell LLM to continue
|
|
401
|
+
reason += ` Continue working - create Tasks to track your progress.`;
|
|
368
402
|
}
|
|
369
403
|
|
|
370
|
-
console.log(JSON.stringify({
|
|
371
|
-
decision: 'block',
|
|
372
|
-
reason: reason
|
|
373
|
-
}));
|
|
404
|
+
console.log(JSON.stringify({ decision: 'block', reason }));
|
|
374
405
|
return;
|
|
375
406
|
}
|
|
376
407
|
|
|
@@ -7,7 +7,7 @@ import { mkdirSync } from 'fs';
|
|
|
7
7
|
|
|
8
8
|
// Import the hooks
|
|
9
9
|
import { startUltraQA, clearUltraQAState, isRalphLoopActive } from '../src/hooks/ultraqa/index.js';
|
|
10
|
-
import { createRalphLoopHook, clearRalphState, isUltraQAActive } from '../src/hooks/ralph
|
|
10
|
+
import { createRalphLoopHook, clearRalphState, isUltraQAActive } from '../src/hooks/ralph/index.js';
|
|
11
11
|
|
|
12
12
|
// Test utilities
|
|
13
13
|
function printTest(testName: string, passed: boolean) {
|
|
@@ -36,7 +36,7 @@ async function runTests() {
|
|
|
36
36
|
const ralphStarted = ralphHook.startLoop(
|
|
37
37
|
'test-session-1',
|
|
38
38
|
'test task',
|
|
39
|
-
{ maxIterations: 5
|
|
39
|
+
{ maxIterations: 5 }
|
|
40
40
|
);
|
|
41
41
|
|
|
42
42
|
if (!ralphStarted) {
|
|
@@ -86,7 +86,7 @@ async function runTests() {
|
|
|
86
86
|
const ralphStarted2 = ralphHook2.startLoop(
|
|
87
87
|
'test-session-4',
|
|
88
88
|
'test task',
|
|
89
|
-
{ maxIterations: 5
|
|
89
|
+
{ maxIterations: 5 }
|
|
90
90
|
);
|
|
91
91
|
|
|
92
92
|
if (ralphStarted2) {
|
package/skills/AGENTS.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<!-- Parent: ../AGENTS.md -->
|
|
2
|
-
<!-- Generated: 2026-01-28 | Updated: 2026-01-
|
|
2
|
+
<!-- Generated: 2026-01-28 | Updated: 2026-01-31 -->
|
|
3
3
|
|
|
4
4
|
# skills
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
37 skill definitions for workflow automation and specialized behaviors.
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
@@ -15,62 +15,71 @@ Skills are reusable workflow templates that can be invoked via `/oh-my-claudecod
|
|
|
15
15
|
## Key Files
|
|
16
16
|
|
|
17
17
|
### Execution Mode Skills
|
|
18
|
+
|
|
18
19
|
| File | Skill | Purpose |
|
|
19
|
-
|
|
20
|
-
| `autopilot.md` | autopilot | Full autonomous execution from idea to working code |
|
|
21
|
-
| `ultrawork.md` | ultrawork | Maximum parallel agent execution |
|
|
22
|
-
| `ralph.md` | ralph | Persistence until verified complete |
|
|
23
|
-
| `ultrapilot.md` | ultrapilot | Parallel autopilot with file ownership |
|
|
24
|
-
| `swarm.md` | swarm | N coordinated agents with task claiming |
|
|
25
|
-
| `pipeline.md` | pipeline | Sequential agent chaining |
|
|
26
|
-
| `ecomode.md` | ecomode | Token-efficient parallel execution |
|
|
27
|
-
| `ultraqa.md` | ultraqa | QA cycling until goal met |
|
|
20
|
+
|-----------|-------|---------|
|
|
21
|
+
| `autopilot/SKILL.md` | autopilot | Full autonomous execution from idea to working code |
|
|
22
|
+
| `ultrawork/SKILL.md` | ultrawork | Maximum parallel agent execution |
|
|
23
|
+
| `ralph/SKILL.md` | ralph | Persistence until verified complete |
|
|
24
|
+
| `ultrapilot/SKILL.md` | ultrapilot | Parallel autopilot with file ownership |
|
|
25
|
+
| `swarm/SKILL.md` | swarm | N coordinated agents with task claiming |
|
|
26
|
+
| `pipeline/SKILL.md` | pipeline | Sequential agent chaining |
|
|
27
|
+
| `ecomode/SKILL.md` | ecomode | Token-efficient parallel execution |
|
|
28
|
+
| `ultraqa/SKILL.md` | ultraqa | QA cycling until goal met |
|
|
28
29
|
|
|
29
30
|
### Planning Skills
|
|
31
|
+
|
|
30
32
|
| File | Skill | Purpose |
|
|
31
|
-
|
|
32
|
-
| `plan.md` | plan | Strategic planning with interview workflow |
|
|
33
|
-
| `ralplan.md` | ralplan | Iterative planning (Planner+Architect+Critic) |
|
|
34
|
-
| `review.md` | review | Review plan with Critic |
|
|
35
|
-
| `analyze.md` | analyze | Deep analysis and investigation |
|
|
36
|
-
| `ralph-init.md` | ralph-init | Initialize PRD for structured ralph |
|
|
33
|
+
|-----------|-------|---------|
|
|
34
|
+
| `plan/SKILL.md` | plan | Strategic planning with interview workflow |
|
|
35
|
+
| `ralplan/SKILL.md` | ralplan | Iterative planning (Planner+Architect+Critic) |
|
|
36
|
+
| `review/SKILL.md` | review | Review plan with Critic |
|
|
37
|
+
| `analyze/SKILL.md` | analyze | Deep analysis and investigation |
|
|
38
|
+
| `ralph-init/SKILL.md` | ralph-init | Initialize PRD for structured ralph |
|
|
37
39
|
|
|
38
40
|
### Code Quality Skills
|
|
41
|
+
|
|
39
42
|
| File | Skill | Purpose |
|
|
40
|
-
|
|
41
|
-
| `code-review.md` | code-review | Comprehensive code review |
|
|
42
|
-
| `security-review.md` | security-review | Security vulnerability detection |
|
|
43
|
-
| `tdd.md` | tdd | Test-driven development workflow |
|
|
44
|
-
| `build-fix.md` | build-fix | Fix build and TypeScript errors |
|
|
43
|
+
|-----------|-------|---------|
|
|
44
|
+
| `code-review/SKILL.md` | code-review | Comprehensive code review |
|
|
45
|
+
| `security-review/SKILL.md` | security-review | Security vulnerability detection |
|
|
46
|
+
| `tdd/SKILL.md` | tdd | Test-driven development workflow |
|
|
47
|
+
| `build-fix/SKILL.md` | build-fix | Fix build and TypeScript errors |
|
|
45
48
|
|
|
46
49
|
### Exploration Skills
|
|
50
|
+
|
|
47
51
|
| File | Skill | Purpose |
|
|
48
|
-
|
|
49
|
-
| `deepsearch.md` | deepsearch | Thorough codebase search |
|
|
50
|
-
| `deepinit.md` | deepinit | Generate hierarchical AGENTS.md |
|
|
51
|
-
| `research.md` | research | Parallel scientist orchestration |
|
|
52
|
+
|-----------|-------|---------|
|
|
53
|
+
| `deepsearch/SKILL.md` | deepsearch | Thorough codebase search |
|
|
54
|
+
| `deepinit/SKILL.md` | deepinit | Generate hierarchical AGENTS.md |
|
|
55
|
+
| `research/SKILL.md` | research | Parallel scientist orchestration |
|
|
52
56
|
|
|
53
57
|
### Utility Skills
|
|
58
|
+
|
|
54
59
|
| File | Skill | Purpose |
|
|
55
|
-
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
60
|
+
|-----------|-------|---------|
|
|
61
|
+
| `orchestrate/SKILL.md` | orchestrate | Core multi-agent orchestration (always active) |
|
|
62
|
+
| `learner/SKILL.md` | learner | Extract reusable skill from session |
|
|
63
|
+
| `note/SKILL.md` | note | Save notes for compaction resilience |
|
|
64
|
+
| `cancel/SKILL.md` | cancel | Cancel any active OMC mode |
|
|
65
|
+
| `hud/SKILL.md` | hud | Configure HUD display |
|
|
66
|
+
| `doctor/SKILL.md` | doctor | Diagnose installation issues |
|
|
67
|
+
| `omc-setup/SKILL.md` | omc-setup | One-time setup wizard |
|
|
68
|
+
| `mcp-setup/SKILL.md` | mcp-setup | Configure MCP servers |
|
|
69
|
+
| `help/SKILL.md` | help | Usage guide |
|
|
70
|
+
| `learn-about-omc/SKILL.md` | learn-about-omc | Usage pattern analysis |
|
|
71
|
+
| `skill/SKILL.md` | skill | Manage local skills |
|
|
64
72
|
|
|
65
73
|
### Domain Skills
|
|
74
|
+
|
|
66
75
|
| File | Skill | Purpose |
|
|
67
|
-
|
|
68
|
-
| `frontend-ui-ux.md` | frontend-ui-ux | Designer-developer aesthetic |
|
|
69
|
-
| `git-master.md` | git-master | Git expertise, atomic commits |
|
|
70
|
-
| `project-session-manager.md` | psm | Isolated dev environments |
|
|
71
|
-
| `writer-memory.md` | writer-memory | Agentic memory for writers |
|
|
72
|
-
| `release.md` | release | Automated release workflow |
|
|
73
|
-
| `local-skills-setup.md` | local-skills-setup | Manage local skills |
|
|
76
|
+
|-----------|-------|---------|
|
|
77
|
+
| `frontend-ui-ux/SKILL.md` | frontend-ui-ux | Designer-developer aesthetic |
|
|
78
|
+
| `git-master/SKILL.md` | git-master | Git expertise, atomic commits |
|
|
79
|
+
| `project-session-manager/SKILL.md` | psm | Isolated dev environments |
|
|
80
|
+
| `writer-memory/SKILL.md` | writer-memory | Agentic memory for writers |
|
|
81
|
+
| `release/SKILL.md` | release | Automated release workflow |
|
|
82
|
+
| `local-skills-setup/SKILL.md` | local-skills-setup | Manage local skills |
|
|
74
83
|
|
|
75
84
|
## For AI Agents
|
|
76
85
|
|
|
@@ -121,10 +130,13 @@ Any configurable options.
|
|
|
121
130
|
|
|
122
131
|
#### Creating a New Skill
|
|
123
132
|
|
|
124
|
-
1. Create `new-skill.md` with YAML frontmatter
|
|
133
|
+
1. Create `new-skill/SKILL.md` directory and file with YAML frontmatter
|
|
125
134
|
2. Define purpose, workflow, and usage
|
|
126
135
|
3. Add to skill registry (auto-detected from frontmatter)
|
|
127
136
|
4. Optionally add activation triggers
|
|
137
|
+
5. Create corresponding `commands/new-skill.md` file (mirror)
|
|
138
|
+
6. Update `docs/REFERENCE.md` (Skills section, count)
|
|
139
|
+
7. If execution mode skill, also create `src/hooks/new-skill/` hook
|
|
128
140
|
|
|
129
141
|
### Common Patterns
|
|
130
142
|
|
|
@@ -148,7 +160,10 @@ Any configurable options.
|
|
|
148
160
|
|
|
149
161
|
### Testing Requirements
|
|
150
162
|
|
|
151
|
-
Skills are
|
|
163
|
+
- Skills are verified via integration tests
|
|
164
|
+
- Test skill invocation with `/oh-my-claudecode:skill-name`
|
|
165
|
+
- Verify trigger keywords activate correct skill
|
|
166
|
+
- For git-related skills, follow `templates/rules/git-workflow.md`
|
|
152
167
|
|
|
153
168
|
## Dependencies
|
|
154
169
|
|
|
@@ -161,8 +161,6 @@ rm -f .omc/state/autopilot-state.json
|
|
|
161
161
|
rm -f .omc/state/ralph-state.json
|
|
162
162
|
rm -f .omc/state/ultrawork-state.json
|
|
163
163
|
rm -f .omc/state/ultraqa-state.json
|
|
164
|
-
rm -f ~/.claude/ralph-state.json
|
|
165
|
-
rm -f ~/.claude/ultrawork-state.json
|
|
166
164
|
```
|
|
167
165
|
|
|
168
166
|
This ensures clean state for future sessions.
|