oh-my-claude-sisyphus 3.0.11 → 3.2.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/README.md +26 -2
- package/agents/build-fixer-low.md +83 -0
- package/agents/build-fixer.md +160 -0
- package/agents/code-reviewer-low.md +82 -0
- package/agents/code-reviewer.md +115 -0
- package/agents/planner.md +83 -0
- package/agents/security-reviewer-low.md +83 -0
- package/agents/security-reviewer.md +186 -0
- package/agents/tdd-guide-low.md +81 -0
- package/agents/tdd-guide.md +165 -0
- package/commands/autopilot.md +131 -0
- package/commands/build-fix.md +55 -0
- package/commands/cancel-autopilot.md +35 -0
- package/commands/code-review.md +47 -0
- package/commands/ralph.md +9 -0
- package/commands/security-review.md +47 -0
- package/commands/tdd.md +54 -0
- package/dist/__tests__/hud-agents.test.js +13 -10
- package/dist/__tests__/hud-agents.test.js.map +1 -1
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/skills.test.js +8 -4
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/agents/definitions.d.ts +32 -0
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +93 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/delegation-validator.d.ts +31 -0
- package/dist/agents/delegation-validator.d.ts.map +1 -0
- package/dist/agents/delegation-validator.js +75 -0
- package/dist/agents/delegation-validator.js.map +1 -0
- package/dist/agents/prompt-generator.d.ts +95 -0
- package/dist/agents/prompt-generator.d.ts.map +1 -0
- package/dist/agents/prompt-generator.js +140 -0
- package/dist/agents/prompt-generator.js.map +1 -0
- package/dist/agents/prompt-sections/index.d.ts +44 -0
- package/dist/agents/prompt-sections/index.d.ts.map +1 -0
- package/dist/agents/prompt-sections/index.js +194 -0
- package/dist/agents/prompt-sections/index.js.map +1 -0
- package/dist/agents/types.d.ts +2 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.js.map +1 -1
- package/dist/features/background-agent/manager.d.ts +10 -1
- package/dist/features/background-agent/manager.d.ts.map +1 -1
- package/dist/features/background-agent/manager.js +79 -11
- package/dist/features/background-agent/manager.js.map +1 -1
- package/dist/features/background-agent/types.d.ts +30 -1
- package/dist/features/background-agent/types.d.ts.map +1 -1
- package/dist/features/delegation-categories/index.d.ts +116 -0
- package/dist/features/delegation-categories/index.d.ts.map +1 -0
- package/dist/features/delegation-categories/index.js +287 -0
- package/dist/features/delegation-categories/index.js.map +1 -0
- package/dist/features/delegation-categories/test-categories.d.ts +7 -0
- package/dist/features/delegation-categories/test-categories.d.ts.map +1 -0
- package/dist/features/delegation-categories/test-categories.js +88 -0
- package/dist/features/delegation-categories/test-categories.js.map +1 -0
- package/dist/features/delegation-categories/types.d.ts +51 -0
- package/dist/features/delegation-categories/types.d.ts.map +1 -0
- package/dist/features/delegation-categories/types.js +8 -0
- package/dist/features/delegation-categories/types.js.map +1 -0
- package/dist/features/index.d.ts +2 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +10 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/model-routing/prompts/index.d.ts +2 -0
- package/dist/features/model-routing/prompts/index.d.ts.map +1 -1
- package/dist/features/model-routing/prompts/index.js +6 -0
- package/dist/features/model-routing/prompts/index.js.map +1 -1
- package/dist/features/notepad-wisdom/extractor.d.ts +30 -0
- package/dist/features/notepad-wisdom/extractor.d.ts.map +1 -0
- package/dist/features/notepad-wisdom/extractor.js +68 -0
- package/dist/features/notepad-wisdom/extractor.js.map +1 -0
- package/dist/features/notepad-wisdom/index.d.ts +39 -0
- package/dist/features/notepad-wisdom/index.d.ts.map +1 -0
- package/dist/features/notepad-wisdom/index.js +169 -0
- package/dist/features/notepad-wisdom/index.js.map +1 -0
- package/dist/features/notepad-wisdom/types.d.ts +18 -0
- package/dist/features/notepad-wisdom/types.d.ts.map +1 -0
- package/dist/features/notepad-wisdom/types.js +7 -0
- package/dist/features/notepad-wisdom/types.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/cancel.test.d.ts +2 -0
- package/dist/hooks/autopilot/__tests__/cancel.test.d.ts.map +1 -0
- package/dist/hooks/autopilot/__tests__/cancel.test.js +397 -0
- package/dist/hooks/autopilot/__tests__/cancel.test.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/prompts.test.d.ts +2 -0
- package/dist/hooks/autopilot/__tests__/prompts.test.d.ts.map +1 -0
- package/dist/hooks/autopilot/__tests__/prompts.test.js +74 -0
- package/dist/hooks/autopilot/__tests__/prompts.test.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/state.test.d.ts +2 -0
- package/dist/hooks/autopilot/__tests__/state.test.d.ts.map +1 -0
- package/dist/hooks/autopilot/__tests__/state.test.js +75 -0
- package/dist/hooks/autopilot/__tests__/state.test.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/summary.test.d.ts +2 -0
- package/dist/hooks/autopilot/__tests__/summary.test.d.ts.map +1 -0
- package/dist/hooks/autopilot/__tests__/summary.test.js +289 -0
- package/dist/hooks/autopilot/__tests__/summary.test.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/transition.test.d.ts +2 -0
- package/dist/hooks/autopilot/__tests__/transition.test.d.ts.map +1 -0
- package/dist/hooks/autopilot/__tests__/transition.test.js +59 -0
- package/dist/hooks/autopilot/__tests__/transition.test.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/validation.test.d.ts +2 -0
- package/dist/hooks/autopilot/__tests__/validation.test.d.ts.map +1 -0
- package/dist/hooks/autopilot/__tests__/validation.test.js +450 -0
- package/dist/hooks/autopilot/__tests__/validation.test.js.map +1 -0
- package/dist/hooks/autopilot/cancel.d.ts +42 -0
- package/dist/hooks/autopilot/cancel.d.ts.map +1 -0
- package/dist/hooks/autopilot/cancel.js +156 -0
- package/dist/hooks/autopilot/cancel.js.map +1 -0
- package/dist/hooks/autopilot/index.d.ts +15 -0
- package/dist/hooks/autopilot/index.d.ts.map +1 -0
- package/dist/hooks/autopilot/index.js +20 -0
- package/dist/hooks/autopilot/index.js.map +1 -0
- package/dist/hooks/autopilot/prompts.d.ts +37 -0
- package/dist/hooks/autopilot/prompts.d.ts.map +1 -0
- package/dist/hooks/autopilot/prompts.js +353 -0
- package/dist/hooks/autopilot/prompts.js.map +1 -0
- package/dist/hooks/autopilot/state.d.ts +67 -0
- package/dist/hooks/autopilot/state.d.ts.map +1 -0
- package/dist/hooks/autopilot/state.js +244 -0
- package/dist/hooks/autopilot/state.js.map +1 -0
- package/dist/hooks/autopilot/summary.d.ts +27 -0
- package/dist/hooks/autopilot/summary.d.ts.map +1 -0
- package/dist/hooks/autopilot/summary.js +160 -0
- package/dist/hooks/autopilot/summary.js.map +1 -0
- package/dist/hooks/autopilot/transition.d.ts +39 -0
- package/dist/hooks/autopilot/transition.d.ts.map +1 -0
- package/dist/hooks/autopilot/transition.js +216 -0
- package/dist/hooks/autopilot/transition.js.map +1 -0
- package/dist/hooks/autopilot/types.d.ts +211 -0
- package/dist/hooks/autopilot/types.d.ts.map +1 -0
- package/dist/hooks/autopilot/types.js +30 -0
- package/dist/hooks/autopilot/types.js.map +1 -0
- package/dist/hooks/autopilot/validation.d.ts +43 -0
- package/dist/hooks/autopilot/validation.d.ts.map +1 -0
- package/dist/hooks/autopilot/validation.js +191 -0
- package/dist/hooks/autopilot/validation.js.map +1 -0
- package/dist/hooks/bridge.d.ts +1 -1
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +79 -6
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/keyword-detector/index.d.ts +1 -1
- package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
- package/dist/hooks/keyword-detector/index.js +39 -2
- package/dist/hooks/keyword-detector/index.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts +2 -1
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js +13 -3
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/ralph-loop/index.d.ts +0 -20
- package/dist/hooks/ralph-loop/index.d.ts.map +1 -1
- package/dist/hooks/ralph-loop/index.js +6 -40
- package/dist/hooks/ralph-loop/index.js.map +1 -1
- package/dist/hooks/todo-continuation/index.d.ts +31 -1
- package/dist/hooks/todo-continuation/index.d.ts.map +1 -1
- package/dist/hooks/todo-continuation/index.js +38 -1
- package/dist/hooks/todo-continuation/index.js.map +1 -1
- package/dist/hooks/ultrawork-state/index.d.ts +3 -1
- package/dist/hooks/ultrawork-state/index.d.ts.map +1 -1
- package/dist/hooks/ultrawork-state/index.js +3 -2
- package/dist/hooks/ultrawork-state/index.js.map +1 -1
- package/dist/hud/elements/autopilot.d.ts +29 -0
- package/dist/hud/elements/autopilot.d.ts.map +1 -0
- package/dist/hud/elements/autopilot.js +97 -0
- package/dist/hud/elements/autopilot.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/limits.d.ts +1 -1
- package/dist/hud/elements/limits.d.ts.map +1 -1
- package/dist/hud/elements/limits.js +35 -2
- package/dist/hud/elements/limits.js.map +1 -1
- package/dist/hud/elements/todos.d.ts +1 -1
- package/dist/hud/elements/todos.js +3 -3
- package/dist/hud/elements/todos.js.map +1 -1
- package/dist/hud/render.js +6 -6
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/types.d.ts +4 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/dist/hud/usage-api.d.ts.map +1 -1
- package/dist/hud/usage-api.js +32 -6
- package/dist/hud/usage-api.js.map +1 -1
- package/dist/installer/hooks.d.ts +5 -0
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +20 -0
- package/dist/installer/hooks.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.js +2 -2
- package/dist/installer/index.js.map +1 -1
- package/dist/tools/diagnostics/index.d.ts +29 -0
- package/dist/tools/diagnostics/index.d.ts.map +1 -0
- package/dist/tools/diagnostics/index.js +118 -0
- package/dist/tools/diagnostics/index.js.map +1 -0
- package/dist/tools/diagnostics/lsp-aggregator.d.ts +26 -0
- package/dist/tools/diagnostics/lsp-aggregator.d.ts.map +1 -0
- package/dist/tools/diagnostics/lsp-aggregator.js +99 -0
- package/dist/tools/diagnostics/lsp-aggregator.js.map +1 -0
- package/dist/tools/diagnostics/tsc-runner.d.ts +26 -0
- package/dist/tools/diagnostics/tsc-runner.d.ts.map +1 -0
- package/dist/tools/diagnostics/tsc-runner.js +70 -0
- package/dist/tools/diagnostics/tsc-runner.js.map +1 -0
- package/dist/tools/lsp-tools.d.ts +10 -0
- package/dist/tools/lsp-tools.d.ts.map +1 -1
- package/dist/tools/lsp-tools.js +43 -1
- package/dist/tools/lsp-tools.js.map +1 -1
- package/dist/tools/resume-session.d.ts +63 -0
- package/dist/tools/resume-session.d.ts.map +1 -0
- package/dist/tools/resume-session.js +106 -0
- package/dist/tools/resume-session.js.map +1 -0
- package/dist/utils/__tests__/paths.test.d.ts +2 -0
- package/dist/utils/__tests__/paths.test.d.ts.map +1 -0
- package/dist/utils/__tests__/paths.test.js +88 -0
- package/dist/utils/__tests__/paths.test.js.map +1 -0
- package/dist/utils/paths.d.ts +32 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +55 -0
- package/dist/utils/paths.js.map +1 -0
- package/docs/ARCHITECTURE.md +80 -1
- package/docs/CLAUDE.md +97 -3
- package/docs/FEATURES.md +2167 -0
- package/docs/FULL-README.md +69 -1
- package/package.json +1 -1
- package/skills/autopilot/SKILL.md +168 -0
- package/skills/cancel-autopilot/SKILL.md +53 -0
- package/skills/omc-setup/SKILL.md +95 -0
- package/skills/ralph/SKILL.md +9 -0
- package/skills/ultrawork/SKILL.md +9 -5
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resume Session Tool
|
|
3
|
+
*
|
|
4
|
+
* Wrapper tool to resume a previous background agent session.
|
|
5
|
+
* Returns context for the orchestrator to include in the next Task delegation.
|
|
6
|
+
*
|
|
7
|
+
* Since Claude Code's native Task tool cannot be extended, this tool provides
|
|
8
|
+
* a convenient way to retrieve session context and build continuation prompts.
|
|
9
|
+
*/
|
|
10
|
+
import { getBackgroundManager } from '../features/background-agent/manager.js';
|
|
11
|
+
/**
|
|
12
|
+
* Resume a background agent session
|
|
13
|
+
*
|
|
14
|
+
* This tool retrieves the context from a previous background session and
|
|
15
|
+
* prepares a continuation prompt that can be used when delegating to the
|
|
16
|
+
* Task tool again.
|
|
17
|
+
*
|
|
18
|
+
* @param input - Session ID to resume
|
|
19
|
+
* @returns Resume context or error
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const result = resumeSession({ sessionId: 'ses_abc123' });
|
|
24
|
+
* if (result.success && result.context) {
|
|
25
|
+
* // Use result.context.continuationPrompt in your next Task delegation
|
|
26
|
+
* Task({
|
|
27
|
+
* subagent_type: "oh-my-claudecode:executor",
|
|
28
|
+
* model: "sonnet",
|
|
29
|
+
* prompt: result.context.continuationPrompt
|
|
30
|
+
* });
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function resumeSession(input) {
|
|
35
|
+
try {
|
|
36
|
+
const manager = getBackgroundManager();
|
|
37
|
+
const context = manager.getResumeContext(input.sessionId);
|
|
38
|
+
if (!context) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
error: `Session not found: ${input.sessionId}`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Build continuation prompt
|
|
45
|
+
const continuationPrompt = buildContinuationPrompt(context);
|
|
46
|
+
return {
|
|
47
|
+
success: true,
|
|
48
|
+
context: {
|
|
49
|
+
previousPrompt: context.previousPrompt,
|
|
50
|
+
toolCallCount: context.toolCallCount,
|
|
51
|
+
lastToolUsed: context.lastToolUsed,
|
|
52
|
+
lastOutputSummary: context.lastOutputSummary,
|
|
53
|
+
continuationPrompt,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: error instanceof Error ? error.message : String(error),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build a formatted continuation prompt from resume context
|
|
66
|
+
*
|
|
67
|
+
* @param context - Resume context from background manager
|
|
68
|
+
* @returns Formatted prompt for next Task delegation
|
|
69
|
+
*/
|
|
70
|
+
function buildContinuationPrompt(context) {
|
|
71
|
+
const parts = [];
|
|
72
|
+
// Add session context header
|
|
73
|
+
parts.push('# Resuming Background Session');
|
|
74
|
+
parts.push('');
|
|
75
|
+
parts.push(`Session ID: ${context.sessionId}`);
|
|
76
|
+
parts.push(`Started: ${context.startedAt.toISOString()}`);
|
|
77
|
+
parts.push(`Last Activity: ${context.lastActivityAt.toISOString()}`);
|
|
78
|
+
parts.push('');
|
|
79
|
+
// Add original task
|
|
80
|
+
parts.push('## Original Task');
|
|
81
|
+
parts.push('');
|
|
82
|
+
parts.push(context.previousPrompt);
|
|
83
|
+
parts.push('');
|
|
84
|
+
// Add progress information
|
|
85
|
+
parts.push('## Progress So Far');
|
|
86
|
+
parts.push('');
|
|
87
|
+
parts.push(`Tool calls executed: ${context.toolCallCount}`);
|
|
88
|
+
if (context.lastToolUsed) {
|
|
89
|
+
parts.push(`Last tool used: ${context.lastToolUsed}`);
|
|
90
|
+
}
|
|
91
|
+
if (context.lastOutputSummary) {
|
|
92
|
+
parts.push('');
|
|
93
|
+
parts.push('Last output:');
|
|
94
|
+
parts.push('```');
|
|
95
|
+
parts.push(context.lastOutputSummary);
|
|
96
|
+
parts.push('```');
|
|
97
|
+
}
|
|
98
|
+
parts.push('');
|
|
99
|
+
// Add continuation instruction
|
|
100
|
+
parts.push('## Instructions');
|
|
101
|
+
parts.push('');
|
|
102
|
+
parts.push('Continue working on the task from where you left off.');
|
|
103
|
+
parts.push('Review the progress above and complete any remaining work.');
|
|
104
|
+
return parts.join('\n');
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=resume-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-session.js","sourceRoot":"","sources":["../../src/tools/resume-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/paths.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import { toForwardSlash, toShellPath, getDataDir, getConfigDir } from '../paths.js';
|
|
3
|
+
describe('cross-platform path utilities', () => {
|
|
4
|
+
describe('toForwardSlash', () => {
|
|
5
|
+
it('should convert backslashes to forward slashes', () => {
|
|
6
|
+
expect(toForwardSlash('C:\\Users\\test\\.claude')).toBe('C:/Users/test/.claude');
|
|
7
|
+
});
|
|
8
|
+
it('should leave forward slashes unchanged', () => {
|
|
9
|
+
expect(toForwardSlash('/home/user/.claude')).toBe('/home/user/.claude');
|
|
10
|
+
});
|
|
11
|
+
it('should handle mixed slashes', () => {
|
|
12
|
+
expect(toForwardSlash('C:\\Users/test\\.claude')).toBe('C:/Users/test/.claude');
|
|
13
|
+
});
|
|
14
|
+
it('should handle empty string', () => {
|
|
15
|
+
expect(toForwardSlash('')).toBe('');
|
|
16
|
+
});
|
|
17
|
+
it('should handle UNC paths', () => {
|
|
18
|
+
expect(toForwardSlash('\\\\server\\share\\path')).toBe('//server/share/path');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('toShellPath', () => {
|
|
22
|
+
it('should convert backslashes to forward slashes', () => {
|
|
23
|
+
expect(toShellPath('C:\\Users\\test')).toBe('C:/Users/test');
|
|
24
|
+
});
|
|
25
|
+
it('should quote paths with spaces', () => {
|
|
26
|
+
expect(toShellPath('/path/with spaces/file')).toBe('"/path/with spaces/file"');
|
|
27
|
+
});
|
|
28
|
+
it('should quote Windows paths with spaces', () => {
|
|
29
|
+
expect(toShellPath('C:\\Program Files\\app')).toBe('"C:/Program Files/app"');
|
|
30
|
+
});
|
|
31
|
+
it('should not quote paths without spaces', () => {
|
|
32
|
+
expect(toShellPath('/simple/path')).toBe('/simple/path');
|
|
33
|
+
});
|
|
34
|
+
it('should handle empty string', () => {
|
|
35
|
+
expect(toShellPath('')).toBe('');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('getDataDir', () => {
|
|
39
|
+
const originalPlatform = process.platform;
|
|
40
|
+
const originalEnv = { ...process.env };
|
|
41
|
+
afterEach(() => {
|
|
42
|
+
Object.defineProperty(process, 'platform', { value: originalPlatform });
|
|
43
|
+
process.env = { ...originalEnv };
|
|
44
|
+
});
|
|
45
|
+
it('should use LOCALAPPDATA on Windows when set', () => {
|
|
46
|
+
Object.defineProperty(process, 'platform', { value: 'win32' });
|
|
47
|
+
process.env.LOCALAPPDATA = 'C:\\Users\\Test\\AppData\\Local';
|
|
48
|
+
expect(getDataDir()).toBe('C:\\Users\\Test\\AppData\\Local');
|
|
49
|
+
});
|
|
50
|
+
it('should use XDG_DATA_HOME on Unix when set', () => {
|
|
51
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
52
|
+
process.env.XDG_DATA_HOME = '/custom/data';
|
|
53
|
+
expect(getDataDir()).toBe('/custom/data');
|
|
54
|
+
});
|
|
55
|
+
it('should fall back to .local/share on Unix when XDG not set', () => {
|
|
56
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
57
|
+
delete process.env.XDG_DATA_HOME;
|
|
58
|
+
const result = getDataDir();
|
|
59
|
+
expect(result).toContain('.local');
|
|
60
|
+
expect(result).toContain('share');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('getConfigDir', () => {
|
|
64
|
+
const originalPlatform = process.platform;
|
|
65
|
+
const originalEnv = { ...process.env };
|
|
66
|
+
afterEach(() => {
|
|
67
|
+
Object.defineProperty(process, 'platform', { value: originalPlatform });
|
|
68
|
+
process.env = { ...originalEnv };
|
|
69
|
+
});
|
|
70
|
+
it('should use APPDATA on Windows when set', () => {
|
|
71
|
+
Object.defineProperty(process, 'platform', { value: 'win32' });
|
|
72
|
+
process.env.APPDATA = 'C:\\Users\\Test\\AppData\\Roaming';
|
|
73
|
+
expect(getConfigDir()).toBe('C:\\Users\\Test\\AppData\\Roaming');
|
|
74
|
+
});
|
|
75
|
+
it('should use XDG_CONFIG_HOME on Unix when set', () => {
|
|
76
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
77
|
+
process.env.XDG_CONFIG_HOME = '/custom/config';
|
|
78
|
+
expect(getConfigDir()).toBe('/custom/config');
|
|
79
|
+
});
|
|
80
|
+
it('should fall back to .config on Unix when XDG not set', () => {
|
|
81
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
82
|
+
delete process.env.XDG_CONFIG_HOME;
|
|
83
|
+
const result = getConfigDir();
|
|
84
|
+
expect(result).toContain('.config');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=paths.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/paths.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Platform Path Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utility functions for handling paths across Windows, macOS, and Linux.
|
|
5
|
+
* These utilities ensure paths in configuration files use forward slashes
|
|
6
|
+
* (which work universally) and handle platform-specific directory conventions.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Convert a path to use forward slashes (for JSON/config files)
|
|
10
|
+
* This is necessary because settings.json commands are executed
|
|
11
|
+
* by shells that expect forward slashes even on Windows
|
|
12
|
+
*/
|
|
13
|
+
export declare function toForwardSlash(path: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Get Claude config directory path
|
|
16
|
+
*/
|
|
17
|
+
export declare function getClaudeConfigDir(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get a path suitable for use in shell commands
|
|
20
|
+
* Converts backslashes to forward slashes for cross-platform compatibility
|
|
21
|
+
*/
|
|
22
|
+
export declare function toShellPath(path: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Get Windows-appropriate data directory
|
|
25
|
+
* Falls back to sensible locations instead of XDG paths
|
|
26
|
+
*/
|
|
27
|
+
export declare function getDataDir(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Get Windows-appropriate config directory
|
|
30
|
+
*/
|
|
31
|
+
export declare function getConfigDir(): string;
|
|
32
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAKrC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Platform Path Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utility functions for handling paths across Windows, macOS, and Linux.
|
|
5
|
+
* These utilities ensure paths in configuration files use forward slashes
|
|
6
|
+
* (which work universally) and handle platform-specific directory conventions.
|
|
7
|
+
*/
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
/**
|
|
11
|
+
* Convert a path to use forward slashes (for JSON/config files)
|
|
12
|
+
* This is necessary because settings.json commands are executed
|
|
13
|
+
* by shells that expect forward slashes even on Windows
|
|
14
|
+
*/
|
|
15
|
+
export function toForwardSlash(path) {
|
|
16
|
+
return path.replace(/\\/g, '/');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get Claude config directory path
|
|
20
|
+
*/
|
|
21
|
+
export function getClaudeConfigDir() {
|
|
22
|
+
return join(homedir(), '.claude');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get a path suitable for use in shell commands
|
|
26
|
+
* Converts backslashes to forward slashes for cross-platform compatibility
|
|
27
|
+
*/
|
|
28
|
+
export function toShellPath(path) {
|
|
29
|
+
const normalized = toForwardSlash(path);
|
|
30
|
+
// Windows paths with spaces need quoting
|
|
31
|
+
if (normalized.includes(' ')) {
|
|
32
|
+
return `"${normalized}"`;
|
|
33
|
+
}
|
|
34
|
+
return normalized;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get Windows-appropriate data directory
|
|
38
|
+
* Falls back to sensible locations instead of XDG paths
|
|
39
|
+
*/
|
|
40
|
+
export function getDataDir() {
|
|
41
|
+
if (process.platform === 'win32') {
|
|
42
|
+
return process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local');
|
|
43
|
+
}
|
|
44
|
+
return process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get Windows-appropriate config directory
|
|
48
|
+
*/
|
|
49
|
+
export function getConfigDir() {
|
|
50
|
+
if (process.platform === 'win32') {
|
|
51
|
+
return process.env.APPDATA || join(homedir(), 'AppData', 'Roaming');
|
|
52
|
+
}
|
|
53
|
+
return process.env.XDG_CONFIG_HOME || join(homedir(), '.config');
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,yCAAyC;IACzC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,UAAU,GAAG,CAAC;IAC3B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC"}
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -383,4 +383,83 @@ The skill layer architecture transforms a constraint into a feature, providing a
|
|
|
383
383
|
|
|
384
384
|
- [Oh-My-OpenCode](https://github.com/code-yeongyu/oh-my-opencode) - Original multi-agent system
|
|
385
385
|
- [Claude Code Skills](https://docs.anthropic.com/claude-code/skills) - Skill documentation
|
|
386
|
-
- [Intelligent Skill Activation](
|
|
386
|
+
- [Intelligent Skill Activation](../README.md#intelligent-skill-activation-beta) - Beta feature docs
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## v3.1 Feature Architecture
|
|
391
|
+
|
|
392
|
+
### Delegation Categories Flow
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
Task Prompt Category Detection Model Selection
|
|
396
|
+
─────────── ────────────────── ───────────────
|
|
397
|
+
│ │ │
|
|
398
|
+
▼ ▼ ▼
|
|
399
|
+
┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
|
400
|
+
│ "Design a │ │ detectCategory │ │ ComplexityTier │
|
|
401
|
+
│ beautiful │──────────▶│ FromPrompt() │─────────▶│ │
|
|
402
|
+
│ dashboard" │ │ │ │ HIGH → opus │
|
|
403
|
+
└─────────────┘ │ Keywords: │ │ MEDIUM → sonnet │
|
|
404
|
+
│ - design ✓ │ │ LOW → haiku │
|
|
405
|
+
│ - dashboard ✓ │ └─────────────────┘
|
|
406
|
+
│ │ │
|
|
407
|
+
│ Category: │ ▼
|
|
408
|
+
│ visual-engineering│ ┌─────────────────┐
|
|
409
|
+
└──────────────────┘ │ Config Applied │
|
|
410
|
+
│ tier: HIGH │
|
|
411
|
+
│ temp: 0.7 │
|
|
412
|
+
│ thinking: high │
|
|
413
|
+
└─────────────────┘
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Notepad Wisdom Storage Structure
|
|
417
|
+
|
|
418
|
+
```
|
|
419
|
+
.omc/
|
|
420
|
+
└── notepads/
|
|
421
|
+
└── {plan-name}/
|
|
422
|
+
├── learnings.md # Technical discoveries
|
|
423
|
+
├── decisions.md # Architectural choices
|
|
424
|
+
├── issues.md # Known issues + workarounds
|
|
425
|
+
└── problems.md # Blockers requiring resolution
|
|
426
|
+
|
|
427
|
+
Entry Format:
|
|
428
|
+
┌─────────────────────────────────────────┐
|
|
429
|
+
│ ## 2024-01-15 14:30:00 │
|
|
430
|
+
│ │
|
|
431
|
+
│ Content of the wisdom entry... │
|
|
432
|
+
└─────────────────────────────────────────┘
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Directory Diagnostics Strategy Selection
|
|
436
|
+
|
|
437
|
+
```
|
|
438
|
+
┌──────────────────┐
|
|
439
|
+
│ runDirectory │
|
|
440
|
+
│ Diagnostics() │
|
|
441
|
+
└────────┬─────────┘
|
|
442
|
+
│
|
|
443
|
+
┌──────────────┴──────────────┐
|
|
444
|
+
│ strategy = ? │
|
|
445
|
+
└──────────────┬──────────────┘
|
|
446
|
+
│
|
|
447
|
+
┌───────────────────┼───────────────────┐
|
|
448
|
+
│ │ │
|
|
449
|
+
strategy='tsc' strategy='auto' strategy='lsp'
|
|
450
|
+
│ │ │
|
|
451
|
+
▼ ▼ ▼
|
|
452
|
+
┌───────────┐ ┌───────────┐ ┌───────────┐
|
|
453
|
+
│ tsc │ │ tsconfig │ │ LSP │
|
|
454
|
+
│ --noEmit │ │ exists? │ │ Iteration │
|
|
455
|
+
│ (fast) │ │ │ │ (fallback)│
|
|
456
|
+
└───────────┘ └─────┬─────┘ └───────────┘
|
|
457
|
+
│
|
|
458
|
+
┌───────┴───────┐
|
|
459
|
+
│ YES NO │
|
|
460
|
+
└───────┬───────┘
|
|
461
|
+
│
|
|
462
|
+
┌─────────┴─────────┐
|
|
463
|
+
▼ ▼
|
|
464
|
+
Use tsc Use LSP
|
|
465
|
+
```
|
package/docs/CLAUDE.md
CHANGED
|
@@ -42,6 +42,7 @@ When you detect these patterns, you MUST invoke the corresponding skill:
|
|
|
42
42
|
|
|
43
43
|
| Pattern Detected | MUST Invoke Skill |
|
|
44
44
|
|------------------|-------------------|
|
|
45
|
+
| "autopilot", "build me", "I want a" | `autopilot` |
|
|
45
46
|
| Broad/vague request | `planner` (after explore for context) |
|
|
46
47
|
| "don't stop", "must complete", "ralph" | `ralph` |
|
|
47
48
|
| "fast", "parallel", "ulw", "ultrawork" | `ultrawork` |
|
|
@@ -67,6 +68,19 @@ When you detect these patterns, you MUST invoke the corresponding skill:
|
|
|
67
68
|
|
|
68
69
|
## PART 2: USER EXPERIENCE
|
|
69
70
|
|
|
71
|
+
### Autopilot: The Default Experience
|
|
72
|
+
|
|
73
|
+
**Autopilot** is the flagship feature and recommended starting point for new users. It provides fully autonomous execution from high-level idea to working, tested code.
|
|
74
|
+
|
|
75
|
+
When you detect phrases like "autopilot", "build me", or "I want a", activate autopilot mode. This engages:
|
|
76
|
+
- Automatic planning and requirements gathering
|
|
77
|
+
- Parallel execution with multiple specialized agents
|
|
78
|
+
- Continuous verification and testing
|
|
79
|
+
- Self-correction until completion
|
|
80
|
+
- No manual intervention required
|
|
81
|
+
|
|
82
|
+
Autopilot combines the best of ralph (persistence), ultrawork (parallelism), and planner (strategic thinking) into a single streamlined experience.
|
|
83
|
+
|
|
70
84
|
### Zero Learning Curve
|
|
71
85
|
|
|
72
86
|
Users don't need to learn commands. You detect intent and activate behaviors automatically.
|
|
@@ -75,6 +89,7 @@ Users don't need to learn commands. You detect intent and activate behaviors aut
|
|
|
75
89
|
|
|
76
90
|
| When User Says... | You Automatically... |
|
|
77
91
|
|-------------------|---------------------|
|
|
92
|
+
| "autopilot", "build me", "I want a" | Activate autopilot for full autonomous execution |
|
|
78
93
|
| Complex task | Delegate to specialist agents in parallel |
|
|
79
94
|
| "plan this" / broad request | Start planning interview via planner |
|
|
80
95
|
| "don't stop until done" | Activate ralph-loop for persistence |
|
|
@@ -86,6 +101,7 @@ Users don't need to learn commands. You detect intent and activate behaviors aut
|
|
|
86
101
|
|
|
87
102
|
| Keyword | Effect | Example |
|
|
88
103
|
|---------|--------|---------|
|
|
104
|
+
| `autopilot` | Full autonomous execution | "autopilot: build a todo app" |
|
|
89
105
|
| `ralph` | Persistence mode | "ralph: refactor auth" |
|
|
90
106
|
| `ulw` | Maximum parallelism | "ulw fix all errors" |
|
|
91
107
|
| `plan` | Planning interview | "plan the new API" |
|
|
@@ -96,6 +112,7 @@ Users don't need to learn commands. You detect intent and activate behaviors aut
|
|
|
96
112
|
### Stopping and Cancelling
|
|
97
113
|
|
|
98
114
|
User says "stop", "cancel", "abort" → You determine what to stop:
|
|
115
|
+
- In autopilot → invoke `cancel-autopilot`
|
|
99
116
|
- In ralph-loop → invoke `cancel-ralph`
|
|
100
117
|
- In ultrawork → invoke `cancel-ultrawork`
|
|
101
118
|
- In ultraqa → invoke `cancel-ultraqa`
|
|
@@ -106,10 +123,11 @@ User says "stop", "cancel", "abort" → You determine what to stop:
|
|
|
106
123
|
|
|
107
124
|
## PART 3: COMPLETE REFERENCE
|
|
108
125
|
|
|
109
|
-
### All
|
|
126
|
+
### All Skills
|
|
110
127
|
|
|
111
128
|
| Skill | Purpose | Auto-Trigger | Manual |
|
|
112
129
|
|-------|---------|--------------|--------|
|
|
130
|
+
| `autopilot` | Full autonomous execution from idea to working code | "autopilot", "build me", "I want a" | `/autopilot` |
|
|
113
131
|
| `orchestrate` | Core multi-agent orchestration | Always active | - |
|
|
114
132
|
| `ralph` | Persistence until verified complete | "don't stop", "must complete" | `/ralph` |
|
|
115
133
|
| `ultrawork` | Maximum parallel execution | "fast", "parallel", "ulw" | `/ultrawork` |
|
|
@@ -133,11 +151,12 @@ User says "stop", "cancel", "abort" → You determine what to stop:
|
|
|
133
151
|
| `omc-default-global` | Configure global settings | - | (internal) |
|
|
134
152
|
| `ralph-init` | Initialize PRD for structured ralph | - | `/ralph-init` |
|
|
135
153
|
| `release` | Automated release workflow | - | `/release` |
|
|
154
|
+
| `cancel-autopilot` | Cancel active autopilot session | "stop autopilot", "cancel autopilot" | `/cancel-autopilot` |
|
|
136
155
|
| `cancel-ralph` | Cancel active ralph loop | "stop" in ralph | `/cancel-ralph` |
|
|
137
156
|
| `cancel-ultrawork` | Cancel ultrawork mode | "stop" in ultrawork | `/cancel-ultrawork` |
|
|
138
157
|
| `cancel-ultraqa` | Cancel ultraqa workflow | "stop" in ultraqa | `/cancel-ultraqa` |
|
|
139
158
|
|
|
140
|
-
### All
|
|
159
|
+
### All 28 Agents
|
|
141
160
|
|
|
142
161
|
Always use `oh-my-claudecode:` prefix when calling via Task tool.
|
|
143
162
|
|
|
@@ -153,7 +172,11 @@ Always use `oh-my-claudecode:` prefix when calling via Task tool.
|
|
|
153
172
|
| **Planning** | - | - | `planner` |
|
|
154
173
|
| **Critique** | - | - | `critic` |
|
|
155
174
|
| **Pre-Planning** | - | - | `analyst` |
|
|
156
|
-
| **Testing** | - | `qa-tester` | - |
|
|
175
|
+
| **Testing** | - | `qa-tester` | `qa-tester-high` |
|
|
176
|
+
| **Security** | `security-reviewer-low` | - | `security-reviewer` |
|
|
177
|
+
| **Build** | `build-fixer-low` | `build-fixer` | - |
|
|
178
|
+
| **TDD** | `tdd-guide-low` | `tdd-guide` | - |
|
|
179
|
+
| **Code Review** | `code-reviewer-low` | - | `code-reviewer` |
|
|
157
180
|
|
|
158
181
|
### Agent Selection Guide
|
|
159
182
|
|
|
@@ -175,6 +198,62 @@ Always use `oh-my-claudecode:` prefix when calling via Task tool.
|
|
|
175
198
|
| Review/critique plan | `critic` | opus |
|
|
176
199
|
| Pre-planning analysis | `analyst` | opus |
|
|
177
200
|
| Test CLI interactively | `qa-tester` | sonnet |
|
|
201
|
+
| Security review | `security-reviewer` | opus |
|
|
202
|
+
| Quick security scan | `security-reviewer-low` | haiku |
|
|
203
|
+
| Fix build errors | `build-fixer` | sonnet |
|
|
204
|
+
| Simple build fix | `build-fixer-low` | haiku |
|
|
205
|
+
| TDD workflow | `tdd-guide` | sonnet |
|
|
206
|
+
| Quick test suggestions | `tdd-guide-low` | haiku |
|
|
207
|
+
| Code review | `code-reviewer` | opus |
|
|
208
|
+
| Quick code check | `code-reviewer-low` | haiku |
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## PART 3.5: NEW FEATURES (v3.1)
|
|
213
|
+
|
|
214
|
+
### Notepad Wisdom System
|
|
215
|
+
|
|
216
|
+
Plan-scoped wisdom capture for learnings, decisions, issues, and problems.
|
|
217
|
+
|
|
218
|
+
**Location:** `.omc/notepads/{plan-name}/`
|
|
219
|
+
|
|
220
|
+
| File | Purpose |
|
|
221
|
+
|------|---------|
|
|
222
|
+
| `learnings.md` | Technical discoveries and patterns |
|
|
223
|
+
| `decisions.md` | Architectural and design decisions |
|
|
224
|
+
| `issues.md` | Known issues and workarounds |
|
|
225
|
+
| `problems.md` | Blockers and challenges |
|
|
226
|
+
|
|
227
|
+
**API:** `initPlanNotepad()`, `addLearning()`, `addDecision()`, `addIssue()`, `addProblem()`, `getWisdomSummary()`, `readPlanWisdom()`
|
|
228
|
+
|
|
229
|
+
### Delegation Categories
|
|
230
|
+
|
|
231
|
+
Semantic task categorization that auto-maps to model tier, temperature, and thinking budget.
|
|
232
|
+
|
|
233
|
+
| Category | Tier | Temperature | Thinking | Use For |
|
|
234
|
+
|----------|------|-------------|----------|---------|
|
|
235
|
+
| `visual-engineering` | HIGH | 0.7 | high | UI/UX, frontend, design systems |
|
|
236
|
+
| `ultrabrain` | HIGH | 0.3 | max | Complex reasoning, architecture, deep debugging |
|
|
237
|
+
| `artistry` | MEDIUM | 0.9 | medium | Creative solutions, brainstorming |
|
|
238
|
+
| `quick` | LOW | 0.1 | low | Simple lookups, basic operations |
|
|
239
|
+
| `writing` | MEDIUM | 0.5 | medium | Documentation, technical writing |
|
|
240
|
+
|
|
241
|
+
**Auto-detection:** Categories detect from prompt keywords automatically.
|
|
242
|
+
|
|
243
|
+
### Directory Diagnostics Tool
|
|
244
|
+
|
|
245
|
+
Project-level type checking via `lsp_diagnostics_directory` tool.
|
|
246
|
+
|
|
247
|
+
**Strategies:**
|
|
248
|
+
- `auto` (default) - Auto-selects best strategy, prefers tsc when tsconfig.json exists
|
|
249
|
+
- `tsc` - Fast, uses TypeScript compiler
|
|
250
|
+
- `lsp` - Fallback, iterates files via Language Server
|
|
251
|
+
|
|
252
|
+
**Usage:** Check entire project for errors before commits or after refactoring.
|
|
253
|
+
|
|
254
|
+
### Session Resume
|
|
255
|
+
|
|
256
|
+
Background agents can be resumed with full context via `resume-session` tool.
|
|
178
257
|
|
|
179
258
|
---
|
|
180
259
|
|
|
@@ -257,6 +336,8 @@ Before concluding ANY session, verify:
|
|
|
257
336
|
|
|
258
337
|
When you activate a major behavior, announce it:
|
|
259
338
|
|
|
339
|
+
> "I'm activating **autopilot** for full autonomous execution from idea to working code."
|
|
340
|
+
|
|
260
341
|
> "I'm activating **ralph-loop** to ensure this task completes fully."
|
|
261
342
|
|
|
262
343
|
> "I'm activating **ultrawork** for maximum parallel execution."
|
|
@@ -282,6 +363,17 @@ Say "setup omc" or run `/oh-my-claudecode:omc-setup` to configure. After that, e
|
|
|
282
363
|
|
|
283
364
|
---
|
|
284
365
|
|
|
366
|
+
## Quick Start for New Users
|
|
367
|
+
|
|
368
|
+
**Just say what you want to build:**
|
|
369
|
+
- "I want a REST API for managing tasks"
|
|
370
|
+
- "Build me a React dashboard with charts"
|
|
371
|
+
- "Create a CLI tool that processes CSV files"
|
|
372
|
+
|
|
373
|
+
Autopilot activates automatically and handles the rest. No commands needed.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
285
377
|
## Migration from 2.x
|
|
286
378
|
|
|
287
379
|
All old commands still work:
|
|
@@ -290,3 +382,5 @@ All old commands still work:
|
|
|
290
382
|
- `/planner "task"` → Still works (or just say "plan this")
|
|
291
383
|
|
|
292
384
|
The difference? You don't NEED them anymore. Everything auto-activates.
|
|
385
|
+
|
|
386
|
+
**New in 3.x:** Autopilot mode provides the ultimate hands-off experience.
|