oh-my-claude-sisyphus 1.8.0 → 1.10.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/dist/cli/index.js +0 -0
- package/dist/features/builtin-skills/skills.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.js +2285 -219
- package/dist/features/builtin-skills/skills.js.map +1 -1
- package/dist/hooks/bridge.d.ts +1 -1
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +71 -0
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +12 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts +40 -0
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -0
- package/dist/hooks/persistent-mode/index.js +200 -0
- package/dist/hooks/persistent-mode/index.js.map +1 -0
- package/dist/hooks/plugin-patterns/index.d.ts +107 -0
- package/dist/hooks/plugin-patterns/index.d.ts.map +1 -0
- package/dist/hooks/plugin-patterns/index.js +286 -0
- package/dist/hooks/plugin-patterns/index.js.map +1 -0
- package/dist/hooks/ralph-verifier/index.d.ts +72 -0
- package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
- package/dist/hooks/ralph-verifier/index.js +223 -0
- package/dist/hooks/ralph-verifier/index.js.map +1 -0
- package/dist/hooks/ultrawork-state/index.d.ts +60 -0
- package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
- package/dist/hooks/ultrawork-state/index.js +207 -0
- package/dist/hooks/ultrawork-state/index.js.map +1 -0
- package/dist/installer/hooks.d.ts +38 -2
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +599 -8
- package/dist/installer/hooks.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +1823 -292
- package/dist/installer/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Popular Plugin Patterns
|
|
3
|
+
*
|
|
4
|
+
* Common hook patterns from the Claude Code community:
|
|
5
|
+
* - Auto-format on file save
|
|
6
|
+
* - Lint validation before commit
|
|
7
|
+
* - Commit message validation
|
|
8
|
+
* - Test runner before commit
|
|
9
|
+
* - Type checking enforcement
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync } from 'fs';
|
|
12
|
+
import { join, extname } from 'path';
|
|
13
|
+
import { execSync } from 'child_process';
|
|
14
|
+
const DEFAULT_FORMATTERS = {
|
|
15
|
+
'.ts': 'prettier --write',
|
|
16
|
+
'.tsx': 'prettier --write',
|
|
17
|
+
'.js': 'prettier --write',
|
|
18
|
+
'.jsx': 'prettier --write',
|
|
19
|
+
'.json': 'prettier --write',
|
|
20
|
+
'.css': 'prettier --write',
|
|
21
|
+
'.scss': 'prettier --write',
|
|
22
|
+
'.md': 'prettier --write',
|
|
23
|
+
'.py': 'black',
|
|
24
|
+
'.go': 'gofmt -w',
|
|
25
|
+
'.rs': 'rustfmt'
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Get formatter command for a file extension
|
|
29
|
+
*/
|
|
30
|
+
export function getFormatter(ext) {
|
|
31
|
+
return DEFAULT_FORMATTERS[ext] || null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if a formatter is available
|
|
35
|
+
*/
|
|
36
|
+
export function isFormatterAvailable(command) {
|
|
37
|
+
try {
|
|
38
|
+
const binary = command.split(' ')[0];
|
|
39
|
+
execSync(`which ${binary}`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Format a file using the appropriate formatter
|
|
48
|
+
*/
|
|
49
|
+
export function formatFile(filePath) {
|
|
50
|
+
const ext = extname(filePath);
|
|
51
|
+
const formatter = getFormatter(ext);
|
|
52
|
+
if (!formatter) {
|
|
53
|
+
return { success: true, message: `No formatter configured for ${ext}` };
|
|
54
|
+
}
|
|
55
|
+
if (!isFormatterAvailable(formatter)) {
|
|
56
|
+
return { success: true, message: `Formatter ${formatter} not available` };
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
execSync(`${formatter} "${filePath}"`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
60
|
+
return { success: true, message: `Formatted ${filePath}` };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return { success: false, message: `Format failed: ${error}` };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const DEFAULT_LINTERS = {
|
|
67
|
+
'.ts': 'eslint --fix',
|
|
68
|
+
'.tsx': 'eslint --fix',
|
|
69
|
+
'.js': 'eslint --fix',
|
|
70
|
+
'.jsx': 'eslint --fix',
|
|
71
|
+
'.py': 'ruff check --fix',
|
|
72
|
+
'.go': 'golangci-lint run',
|
|
73
|
+
'.rs': 'cargo clippy'
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Get linter command for a file extension
|
|
77
|
+
*/
|
|
78
|
+
export function getLinter(ext) {
|
|
79
|
+
return DEFAULT_LINTERS[ext] || null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Run linter on a file
|
|
83
|
+
*/
|
|
84
|
+
export function lintFile(filePath) {
|
|
85
|
+
const ext = extname(filePath);
|
|
86
|
+
const linter = getLinter(ext);
|
|
87
|
+
if (!linter) {
|
|
88
|
+
return { success: true, message: `No linter configured for ${ext}` };
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const binary = linter.split(' ')[0];
|
|
92
|
+
execSync(`which ${binary}`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { success: true, message: `Linter ${linter} not available` };
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
execSync(`${linter} "${filePath}"`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
99
|
+
return { success: true, message: `Lint passed for ${filePath}` };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return { success: false, message: `Lint errors in ${filePath}` };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const DEFAULT_COMMIT_TYPES = [
|
|
106
|
+
'feat', // New feature
|
|
107
|
+
'fix', // Bug fix
|
|
108
|
+
'docs', // Documentation
|
|
109
|
+
'style', // Formatting, no code change
|
|
110
|
+
'refactor', // Refactoring
|
|
111
|
+
'perf', // Performance improvement
|
|
112
|
+
'test', // Adding tests
|
|
113
|
+
'build', // Build system changes
|
|
114
|
+
'ci', // CI configuration
|
|
115
|
+
'chore', // Maintenance
|
|
116
|
+
'revert' // Revert previous commit
|
|
117
|
+
];
|
|
118
|
+
const CONVENTIONAL_COMMIT_REGEX = /^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\([a-z0-9-]+\))?(!)?:\s.+$/;
|
|
119
|
+
/**
|
|
120
|
+
* Validate a commit message against conventional commit format
|
|
121
|
+
*/
|
|
122
|
+
export function validateCommitMessage(message, config) {
|
|
123
|
+
const errors = [];
|
|
124
|
+
const lines = message.trim().split('\n');
|
|
125
|
+
const subject = lines[0];
|
|
126
|
+
// Check subject line
|
|
127
|
+
if (!subject) {
|
|
128
|
+
errors.push('Commit message cannot be empty');
|
|
129
|
+
return { valid: false, errors };
|
|
130
|
+
}
|
|
131
|
+
// Check conventional commit format
|
|
132
|
+
if (!CONVENTIONAL_COMMIT_REGEX.test(subject)) {
|
|
133
|
+
errors.push('Subject must follow conventional commit format: type(scope?): description');
|
|
134
|
+
errors.push(`Allowed types: ${DEFAULT_COMMIT_TYPES.join(', ')}`);
|
|
135
|
+
}
|
|
136
|
+
// Check subject length
|
|
137
|
+
const maxLength = config?.maxSubjectLength || 72;
|
|
138
|
+
if (subject.length > maxLength) {
|
|
139
|
+
errors.push(`Subject line exceeds ${maxLength} characters`);
|
|
140
|
+
}
|
|
141
|
+
// Check for scope if required
|
|
142
|
+
if (config?.requireScope) {
|
|
143
|
+
const hasScope = /\([a-z0-9-]+\)/.test(subject);
|
|
144
|
+
if (!hasScope) {
|
|
145
|
+
errors.push('Scope is required in commit message');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Check for body if required
|
|
149
|
+
if (config?.requireBody) {
|
|
150
|
+
if (lines.length < 3 || !lines[2]) {
|
|
151
|
+
errors.push('Commit body is required');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { valid: errors.length === 0, errors };
|
|
155
|
+
}
|
|
156
|
+
// =============================================================================
|
|
157
|
+
// TYPE CHECKING PATTERN
|
|
158
|
+
// =============================================================================
|
|
159
|
+
/**
|
|
160
|
+
* Run TypeScript type checking
|
|
161
|
+
*/
|
|
162
|
+
export function runTypeCheck(directory) {
|
|
163
|
+
const tsconfigPath = join(directory, 'tsconfig.json');
|
|
164
|
+
if (!existsSync(tsconfigPath)) {
|
|
165
|
+
return { success: true, message: 'No tsconfig.json found' };
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
execSync('which tsc', { encoding: 'utf-8', stdio: 'pipe' });
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return { success: true, message: 'TypeScript not installed' };
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
execSync('tsc --noEmit', { cwd: directory, encoding: 'utf-8', stdio: 'pipe' });
|
|
175
|
+
return { success: true, message: 'Type check passed' };
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
return { success: false, message: 'Type errors found' };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// =============================================================================
|
|
182
|
+
// TEST RUNNER PATTERN
|
|
183
|
+
// =============================================================================
|
|
184
|
+
/**
|
|
185
|
+
* Detect and run tests for a project
|
|
186
|
+
*/
|
|
187
|
+
export function runTests(directory) {
|
|
188
|
+
const packageJsonPath = join(directory, 'package.json');
|
|
189
|
+
if (existsSync(packageJsonPath)) {
|
|
190
|
+
try {
|
|
191
|
+
const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
192
|
+
if (pkg.scripts?.test) {
|
|
193
|
+
execSync('npm test', { cwd: directory, encoding: 'utf-8', stdio: 'pipe' });
|
|
194
|
+
return { success: true, message: 'Tests passed' };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return { success: false, message: 'Tests failed' };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Check for pytest
|
|
202
|
+
if (existsSync(join(directory, 'pytest.ini')) || existsSync(join(directory, 'pyproject.toml'))) {
|
|
203
|
+
try {
|
|
204
|
+
execSync('pytest', { cwd: directory, encoding: 'utf-8', stdio: 'pipe' });
|
|
205
|
+
return { success: true, message: 'Tests passed' };
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return { success: false, message: 'Tests failed' };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return { success: true, message: 'No test runner found' };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Run all pre-commit checks
|
|
215
|
+
*/
|
|
216
|
+
export function runPreCommitChecks(directory, commitMessage) {
|
|
217
|
+
const checks = [];
|
|
218
|
+
// Type checking
|
|
219
|
+
const typeCheck = runTypeCheck(directory);
|
|
220
|
+
checks.push({
|
|
221
|
+
name: 'Type Check',
|
|
222
|
+
passed: typeCheck.success,
|
|
223
|
+
message: typeCheck.message
|
|
224
|
+
});
|
|
225
|
+
// Commit message validation
|
|
226
|
+
if (commitMessage) {
|
|
227
|
+
const commitCheck = validateCommitMessage(commitMessage);
|
|
228
|
+
checks.push({
|
|
229
|
+
name: 'Commit Message',
|
|
230
|
+
passed: commitCheck.valid,
|
|
231
|
+
message: commitCheck.valid ? 'Valid format' : commitCheck.errors.join('; ')
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// All checks must pass
|
|
235
|
+
const canCommit = checks.every(c => c.passed);
|
|
236
|
+
return { canCommit, checks };
|
|
237
|
+
}
|
|
238
|
+
// =============================================================================
|
|
239
|
+
// HOOK MESSAGE GENERATORS
|
|
240
|
+
// =============================================================================
|
|
241
|
+
/**
|
|
242
|
+
* Generate pre-commit check reminder message
|
|
243
|
+
*/
|
|
244
|
+
export function getPreCommitReminderMessage(result) {
|
|
245
|
+
if (result.canCommit) {
|
|
246
|
+
return '';
|
|
247
|
+
}
|
|
248
|
+
const failedChecks = result.checks.filter(c => !c.passed);
|
|
249
|
+
return `<pre-commit-validation>
|
|
250
|
+
|
|
251
|
+
[PRE-COMMIT CHECKS FAILED]
|
|
252
|
+
|
|
253
|
+
The following checks did not pass:
|
|
254
|
+
${failedChecks.map(c => `- ${c.name}: ${c.message}`).join('\n')}
|
|
255
|
+
|
|
256
|
+
Please fix these issues before committing.
|
|
257
|
+
|
|
258
|
+
</pre-commit-validation>
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
`;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Generate auto-format reminder message
|
|
266
|
+
*/
|
|
267
|
+
export function getAutoFormatMessage(filePath, result) {
|
|
268
|
+
if (result.success) {
|
|
269
|
+
return '';
|
|
270
|
+
}
|
|
271
|
+
return `<auto-format>
|
|
272
|
+
|
|
273
|
+
[FORMAT WARNING]
|
|
274
|
+
|
|
275
|
+
File ${filePath} could not be auto-formatted:
|
|
276
|
+
${result.message}
|
|
277
|
+
|
|
278
|
+
Please check the file manually.
|
|
279
|
+
|
|
280
|
+
</auto-format>
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
`;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/plugin-patterns/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ralph Loop Verifier
|
|
3
|
+
*
|
|
4
|
+
* Adds oracle verification to ralph-loop completion claims.
|
|
5
|
+
* When ralph-loop outputs a completion promise, instead of immediately
|
|
6
|
+
* accepting it, we trigger an oracle verification phase.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* 1. Ralph-loop outputs <promise>TASK_COMPLETE</promise>
|
|
10
|
+
* 2. System detects this and enters verification mode
|
|
11
|
+
* 3. Oracle agent is invoked to verify the work
|
|
12
|
+
* 4. If oracle approves -> truly complete
|
|
13
|
+
* 5. If oracle finds flaws -> continue ralph-loop with oracle feedback
|
|
14
|
+
*/
|
|
15
|
+
export interface VerificationState {
|
|
16
|
+
/** Whether verification is pending */
|
|
17
|
+
pending: boolean;
|
|
18
|
+
/** The completion claim that triggered verification */
|
|
19
|
+
completion_claim: string;
|
|
20
|
+
/** Number of verification attempts */
|
|
21
|
+
verification_attempts: number;
|
|
22
|
+
/** Max verification attempts before force-accepting */
|
|
23
|
+
max_verification_attempts: number;
|
|
24
|
+
/** Oracle feedback from last verification */
|
|
25
|
+
oracle_feedback?: string;
|
|
26
|
+
/** Whether oracle approved */
|
|
27
|
+
oracle_approved?: boolean;
|
|
28
|
+
/** Timestamp of verification request */
|
|
29
|
+
requested_at: string;
|
|
30
|
+
/** Original ralph-loop task */
|
|
31
|
+
original_task: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Read verification state
|
|
35
|
+
*/
|
|
36
|
+
export declare function readVerificationState(directory: string): VerificationState | null;
|
|
37
|
+
/**
|
|
38
|
+
* Write verification state
|
|
39
|
+
*/
|
|
40
|
+
export declare function writeVerificationState(directory: string, state: VerificationState): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Clear verification state
|
|
43
|
+
*/
|
|
44
|
+
export declare function clearVerificationState(directory: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Start verification process
|
|
47
|
+
*/
|
|
48
|
+
export declare function startVerification(directory: string, completionClaim: string, originalTask: string): VerificationState;
|
|
49
|
+
/**
|
|
50
|
+
* Record oracle feedback
|
|
51
|
+
*/
|
|
52
|
+
export declare function recordOracleFeedback(directory: string, approved: boolean, feedback: string): VerificationState | null;
|
|
53
|
+
/**
|
|
54
|
+
* Generate oracle verification prompt
|
|
55
|
+
*/
|
|
56
|
+
export declare function getOracleVerificationPrompt(state: VerificationState): string;
|
|
57
|
+
/**
|
|
58
|
+
* Generate continuation prompt after oracle rejection
|
|
59
|
+
*/
|
|
60
|
+
export declare function getOracleRejectionContinuationPrompt(state: VerificationState): string;
|
|
61
|
+
/**
|
|
62
|
+
* Check if text contains oracle approval
|
|
63
|
+
*/
|
|
64
|
+
export declare function detectOracleApproval(text: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Check if text contains oracle rejection indicators
|
|
67
|
+
*/
|
|
68
|
+
export declare function detectOracleRejection(text: string): {
|
|
69
|
+
rejected: boolean;
|
|
70
|
+
feedback: string;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/ralph-verifier/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,yBAAyB,EAAE,MAAM,CAAC;IAClC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAWD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAUjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAkB3F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAWjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,iBAAiB,CAYnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,MAAM,GACf,iBAAiB,GAAG,IAAI,CAyB1B;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAwC5E;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA2BrF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAuB3F"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ralph Loop Verifier
|
|
3
|
+
*
|
|
4
|
+
* Adds oracle verification to ralph-loop completion claims.
|
|
5
|
+
* When ralph-loop outputs a completion promise, instead of immediately
|
|
6
|
+
* accepting it, we trigger an oracle verification phase.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* 1. Ralph-loop outputs <promise>TASK_COMPLETE</promise>
|
|
10
|
+
* 2. System detects this and enters verification mode
|
|
11
|
+
* 3. Oracle agent is invoked to verify the work
|
|
12
|
+
* 4. If oracle approves -> truly complete
|
|
13
|
+
* 5. If oracle finds flaws -> continue ralph-loop with oracle feedback
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'fs';
|
|
16
|
+
import { join } from 'path';
|
|
17
|
+
const DEFAULT_MAX_VERIFICATION_ATTEMPTS = 3;
|
|
18
|
+
/**
|
|
19
|
+
* Get verification state file path
|
|
20
|
+
*/
|
|
21
|
+
function getVerificationStatePath(directory) {
|
|
22
|
+
return join(directory, '.sisyphus', 'ralph-verification.json');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read verification state
|
|
26
|
+
*/
|
|
27
|
+
export function readVerificationState(directory) {
|
|
28
|
+
const statePath = getVerificationStatePath(directory);
|
|
29
|
+
if (!existsSync(statePath)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Write verification state
|
|
41
|
+
*/
|
|
42
|
+
export function writeVerificationState(directory, state) {
|
|
43
|
+
const statePath = getVerificationStatePath(directory);
|
|
44
|
+
const stateDir = join(directory, '.sisyphus');
|
|
45
|
+
if (!existsSync(stateDir)) {
|
|
46
|
+
try {
|
|
47
|
+
mkdirSync(stateDir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
writeFileSync(statePath, JSON.stringify(state, null, 2));
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Clear verification state
|
|
63
|
+
*/
|
|
64
|
+
export function clearVerificationState(directory) {
|
|
65
|
+
const statePath = getVerificationStatePath(directory);
|
|
66
|
+
if (existsSync(statePath)) {
|
|
67
|
+
try {
|
|
68
|
+
unlinkSync(statePath);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Start verification process
|
|
79
|
+
*/
|
|
80
|
+
export function startVerification(directory, completionClaim, originalTask) {
|
|
81
|
+
const state = {
|
|
82
|
+
pending: true,
|
|
83
|
+
completion_claim: completionClaim,
|
|
84
|
+
verification_attempts: 0,
|
|
85
|
+
max_verification_attempts: DEFAULT_MAX_VERIFICATION_ATTEMPTS,
|
|
86
|
+
requested_at: new Date().toISOString(),
|
|
87
|
+
original_task: originalTask
|
|
88
|
+
};
|
|
89
|
+
writeVerificationState(directory, state);
|
|
90
|
+
return state;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Record oracle feedback
|
|
94
|
+
*/
|
|
95
|
+
export function recordOracleFeedback(directory, approved, feedback) {
|
|
96
|
+
const state = readVerificationState(directory);
|
|
97
|
+
if (!state) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
state.verification_attempts += 1;
|
|
101
|
+
state.oracle_approved = approved;
|
|
102
|
+
state.oracle_feedback = feedback;
|
|
103
|
+
if (approved) {
|
|
104
|
+
// Clear state on approval
|
|
105
|
+
clearVerificationState(directory);
|
|
106
|
+
return { ...state, pending: false };
|
|
107
|
+
}
|
|
108
|
+
// Check if max attempts reached
|
|
109
|
+
if (state.verification_attempts >= state.max_verification_attempts) {
|
|
110
|
+
clearVerificationState(directory);
|
|
111
|
+
return { ...state, pending: false };
|
|
112
|
+
}
|
|
113
|
+
// Continue verification loop
|
|
114
|
+
writeVerificationState(directory, state);
|
|
115
|
+
return state;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate oracle verification prompt
|
|
119
|
+
*/
|
|
120
|
+
export function getOracleVerificationPrompt(state) {
|
|
121
|
+
return `<ralph-verification>
|
|
122
|
+
|
|
123
|
+
[ORACLE VERIFICATION REQUIRED - Attempt ${state.verification_attempts + 1}/${state.max_verification_attempts}]
|
|
124
|
+
|
|
125
|
+
The agent claims the task is complete. Before accepting, YOU MUST verify with Oracle.
|
|
126
|
+
|
|
127
|
+
**Original Task:**
|
|
128
|
+
${state.original_task}
|
|
129
|
+
|
|
130
|
+
**Completion Claim:**
|
|
131
|
+
${state.completion_claim}
|
|
132
|
+
|
|
133
|
+
${state.oracle_feedback ? `**Previous Oracle Feedback (rejected):**\n${state.oracle_feedback}\n` : ''}
|
|
134
|
+
|
|
135
|
+
## MANDATORY VERIFICATION STEPS
|
|
136
|
+
|
|
137
|
+
1. **Spawn Oracle Agent** for verification:
|
|
138
|
+
\`\`\`
|
|
139
|
+
Task(subagent_type="oracle", prompt="Verify this task completion claim...")
|
|
140
|
+
\`\`\`
|
|
141
|
+
|
|
142
|
+
2. **Oracle must check:**
|
|
143
|
+
- Are ALL requirements from the original task met?
|
|
144
|
+
- Is the implementation complete, not partial?
|
|
145
|
+
- Are there any obvious bugs or issues?
|
|
146
|
+
- Does the code compile/run without errors?
|
|
147
|
+
- Are tests passing (if applicable)?
|
|
148
|
+
|
|
149
|
+
3. **Based on Oracle's response:**
|
|
150
|
+
- If APPROVED: Output \`<oracle-approved>VERIFIED_COMPLETE</oracle-approved>\`
|
|
151
|
+
- If REJECTED: Continue working on the identified issues
|
|
152
|
+
|
|
153
|
+
DO NOT output the completion promise again until Oracle approves.
|
|
154
|
+
|
|
155
|
+
</ralph-verification>
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Generate continuation prompt after oracle rejection
|
|
163
|
+
*/
|
|
164
|
+
export function getOracleRejectionContinuationPrompt(state) {
|
|
165
|
+
return `<ralph-continuation-after-rejection>
|
|
166
|
+
|
|
167
|
+
[ORACLE REJECTED - Continue Working]
|
|
168
|
+
|
|
169
|
+
Oracle found issues with your completion claim. You must address them.
|
|
170
|
+
|
|
171
|
+
**Oracle Feedback:**
|
|
172
|
+
${state.oracle_feedback}
|
|
173
|
+
|
|
174
|
+
**Original Task:**
|
|
175
|
+
${state.original_task}
|
|
176
|
+
|
|
177
|
+
## INSTRUCTIONS
|
|
178
|
+
|
|
179
|
+
1. Address ALL issues identified by Oracle
|
|
180
|
+
2. Do NOT claim completion again until issues are fixed
|
|
181
|
+
3. When truly done, output the completion promise again
|
|
182
|
+
4. Another Oracle verification will be triggered
|
|
183
|
+
|
|
184
|
+
Continue working now.
|
|
185
|
+
|
|
186
|
+
</ralph-continuation-after-rejection>
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
`;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if text contains oracle approval
|
|
194
|
+
*/
|
|
195
|
+
export function detectOracleApproval(text) {
|
|
196
|
+
return /<oracle-approved>.*?VERIFIED_COMPLETE.*?<\/oracle-approved>/is.test(text);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Check if text contains oracle rejection indicators
|
|
200
|
+
*/
|
|
201
|
+
export function detectOracleRejection(text) {
|
|
202
|
+
// Look for explicit rejection patterns
|
|
203
|
+
const rejectionPatterns = [
|
|
204
|
+
/oracle.*?(rejected|found issues|not complete|incomplete)/i,
|
|
205
|
+
/issues? (found|identified|detected)/i,
|
|
206
|
+
/not yet complete/i,
|
|
207
|
+
/missing.*?(implementation|feature|test)/i,
|
|
208
|
+
/bug.*?(found|detected|identified)/i,
|
|
209
|
+
/error.*?(found|detected|identified)/i
|
|
210
|
+
];
|
|
211
|
+
for (const pattern of rejectionPatterns) {
|
|
212
|
+
if (pattern.test(text)) {
|
|
213
|
+
// Extract feedback (rough heuristic)
|
|
214
|
+
const feedbackMatch = text.match(/(?:oracle|feedback|issue|problem|error|bug)[:\s]+([^.]+\.)/i);
|
|
215
|
+
return {
|
|
216
|
+
rejected: true,
|
|
217
|
+
feedback: feedbackMatch ? feedbackMatch[1] : 'Oracle found issues with the implementation.'
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return { rejected: false, feedback: '' };
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/ralph-verifier/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ultrawork State Management
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent ultrawork mode state across sessions.
|
|
5
|
+
* When ultrawork is activated and todos remain incomplete,
|
|
6
|
+
* this module ensures the mode persists until all work is done.
|
|
7
|
+
*/
|
|
8
|
+
export interface UltraworkState {
|
|
9
|
+
/** Whether ultrawork mode is currently active */
|
|
10
|
+
active: boolean;
|
|
11
|
+
/** When ultrawork was activated */
|
|
12
|
+
started_at: string;
|
|
13
|
+
/** The original prompt that triggered ultrawork */
|
|
14
|
+
original_prompt: string;
|
|
15
|
+
/** Session ID the mode is bound to */
|
|
16
|
+
session_id?: string;
|
|
17
|
+
/** Number of times the mode has been reinforced (for metrics) */
|
|
18
|
+
reinforcement_count: number;
|
|
19
|
+
/** Last time the mode was checked/reinforced */
|
|
20
|
+
last_checked_at: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Read Ultrawork state from disk (checks both local and global)
|
|
24
|
+
*/
|
|
25
|
+
export declare function readUltraworkState(directory?: string): UltraworkState | null;
|
|
26
|
+
/**
|
|
27
|
+
* Write Ultrawork state to disk (both local and global for redundancy)
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeUltraworkState(state: UltraworkState, directory?: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Activate ultrawork mode
|
|
32
|
+
*/
|
|
33
|
+
export declare function activateUltrawork(prompt: string, sessionId?: string, directory?: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Deactivate ultrawork mode
|
|
36
|
+
*/
|
|
37
|
+
export declare function deactivateUltrawork(directory?: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Increment reinforcement count (called when mode is reinforced on stop)
|
|
40
|
+
*/
|
|
41
|
+
export declare function incrementReinforcement(directory?: string): UltraworkState | null;
|
|
42
|
+
/**
|
|
43
|
+
* Check if ultrawork should be reinforced (active with pending todos)
|
|
44
|
+
*/
|
|
45
|
+
export declare function shouldReinforceUltrawork(sessionId?: string, directory?: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Get ultrawork persistence message for injection
|
|
48
|
+
*/
|
|
49
|
+
export declare function getUltraworkPersistenceMessage(state: UltraworkState): string;
|
|
50
|
+
/**
|
|
51
|
+
* Create an Ultrawork State hook instance
|
|
52
|
+
*/
|
|
53
|
+
export declare function createUltraworkStateHook(directory: string): {
|
|
54
|
+
activate: (prompt: string, sessionId?: string) => boolean;
|
|
55
|
+
deactivate: () => boolean;
|
|
56
|
+
getState: () => UltraworkState | null;
|
|
57
|
+
shouldReinforce: (sessionId?: string) => boolean;
|
|
58
|
+
incrementReinforcement: () => UltraworkState | null;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/ultrawork-state/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;CACzB;AA+CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAwB5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAgBtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAuB/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAehF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAuB5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM;uBAEnC,MAAM,cAAc,MAAM;;;kCAIf,MAAM;;EAIvC"}
|