oh-my-claude-sisyphus 1.9.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.
Files changed (84) hide show
  1. package/dist/cli/index.js +0 -0
  2. package/dist/features/builtin-skills/skills.d.ts.map +1 -1
  3. package/dist/features/builtin-skills/skills.js +144 -11
  4. package/dist/features/builtin-skills/skills.js.map +1 -1
  5. package/dist/hooks/bridge.d.ts +1 -1
  6. package/dist/hooks/bridge.d.ts.map +1 -1
  7. package/dist/hooks/bridge.js +71 -0
  8. package/dist/hooks/bridge.js.map +1 -1
  9. package/dist/hooks/index.d.ts +4 -0
  10. package/dist/hooks/index.d.ts.map +1 -1
  11. package/dist/hooks/index.js +12 -0
  12. package/dist/hooks/index.js.map +1 -1
  13. package/dist/hooks/persistent-mode/index.d.ts +40 -0
  14. package/dist/hooks/persistent-mode/index.d.ts.map +1 -0
  15. package/dist/hooks/persistent-mode/index.js +200 -0
  16. package/dist/hooks/persistent-mode/index.js.map +1 -0
  17. package/dist/hooks/plugin-patterns/index.d.ts +107 -0
  18. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -0
  19. package/dist/hooks/plugin-patterns/index.js +286 -0
  20. package/dist/hooks/plugin-patterns/index.js.map +1 -0
  21. package/dist/hooks/ralph-verifier/index.d.ts +72 -0
  22. package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
  23. package/dist/hooks/ralph-verifier/index.js +223 -0
  24. package/dist/hooks/ralph-verifier/index.js.map +1 -0
  25. package/dist/hooks/ultrawork-state/index.d.ts +60 -0
  26. package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
  27. package/dist/hooks/ultrawork-state/index.js +207 -0
  28. package/dist/hooks/ultrawork-state/index.js.map +1 -0
  29. package/dist/installer/hooks.d.ts +38 -2
  30. package/dist/installer/hooks.d.ts.map +1 -1
  31. package/dist/installer/hooks.js +599 -8
  32. package/dist/installer/hooks.js.map +1 -1
  33. package/dist/installer/index.d.ts.map +1 -1
  34. package/dist/installer/index.js +123 -7
  35. package/dist/installer/index.js.map +1 -1
  36. package/package.json +1 -1
  37. package/dist/agents/model-lists.d.ts +0 -26
  38. package/dist/agents/model-lists.d.ts.map +0 -1
  39. package/dist/agents/model-lists.js +0 -62
  40. package/dist/agents/model-lists.js.map +0 -1
  41. package/dist/auth/index.d.ts +0 -10
  42. package/dist/auth/index.d.ts.map +0 -1
  43. package/dist/auth/index.js +0 -13
  44. package/dist/auth/index.js.map +0 -1
  45. package/dist/auth/manager.d.ts +0 -54
  46. package/dist/auth/manager.d.ts.map +0 -1
  47. package/dist/auth/manager.js +0 -248
  48. package/dist/auth/manager.js.map +0 -1
  49. package/dist/auth/oauth-google.d.ts +0 -47
  50. package/dist/auth/oauth-google.d.ts.map +0 -1
  51. package/dist/auth/oauth-google.js +0 -280
  52. package/dist/auth/oauth-google.js.map +0 -1
  53. package/dist/auth/oauth-openai.d.ts +0 -46
  54. package/dist/auth/oauth-openai.d.ts.map +0 -1
  55. package/dist/auth/oauth-openai.js +0 -264
  56. package/dist/auth/oauth-openai.js.map +0 -1
  57. package/dist/auth/pkce.d.ts +0 -14
  58. package/dist/auth/pkce.d.ts.map +0 -1
  59. package/dist/auth/pkce.js +0 -35
  60. package/dist/auth/pkce.js.map +0 -1
  61. package/dist/auth/storage.d.ts +0 -52
  62. package/dist/auth/storage.d.ts.map +0 -1
  63. package/dist/auth/storage.js +0 -230
  64. package/dist/auth/storage.js.map +0 -1
  65. package/dist/auth/types.d.ts +0 -76
  66. package/dist/auth/types.d.ts.map +0 -1
  67. package/dist/auth/types.js +0 -5
  68. package/dist/auth/types.js.map +0 -1
  69. package/dist/providers/index.d.ts +0 -8
  70. package/dist/providers/index.d.ts.map +0 -1
  71. package/dist/providers/index.js +0 -10
  72. package/dist/providers/index.js.map +0 -1
  73. package/dist/providers/registry.d.ts +0 -29
  74. package/dist/providers/registry.d.ts.map +0 -1
  75. package/dist/providers/registry.js +0 -162
  76. package/dist/providers/registry.js.map +0 -1
  77. package/dist/providers/router.d.ts +0 -40
  78. package/dist/providers/router.d.ts.map +0 -1
  79. package/dist/providers/router.js +0 -88
  80. package/dist/providers/router.js.map +0 -1
  81. package/dist/providers/types.d.ts +0 -92
  82. package/dist/providers/types.d.ts.map +0 -1
  83. package/dist/providers/types.js +0 -27
  84. package/dist/providers/types.js.map +0 -1
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Persistent Mode Hook
3
+ *
4
+ * Unified handler for persistent work modes: ultrawork, ralph-loop, and todo-continuation.
5
+ * This hook intercepts Stop events and enforces work continuation based on:
6
+ * 1. Active ultrawork mode with pending todos
7
+ * 2. Active ralph-loop with incomplete promise
8
+ * 3. Any pending todos (general enforcement)
9
+ *
10
+ * Priority order: Ralph Loop > Ultrawork > Todo Continuation
11
+ */
12
+ import { readUltraworkState, incrementReinforcement, deactivateUltrawork, getUltraworkPersistenceMessage } from '../ultrawork-state/index.js';
13
+ import { readRalphState, incrementRalphIteration, clearRalphState, detectCompletionPromise } from '../ralph-loop/index.js';
14
+ import { checkIncompleteTodos, getNextPendingTodo } from '../todo-continuation/index.js';
15
+ import { TODO_CONTINUATION_PROMPT } from '../../installer/hooks.js';
16
+ /**
17
+ * Check Ralph Loop state and determine if it should continue
18
+ */
19
+ async function checkRalphLoop(sessionId, directory) {
20
+ const state = readRalphState(directory || process.cwd());
21
+ if (!state || !state.active) {
22
+ return null;
23
+ }
24
+ // Check if this is the right session
25
+ if (state.session_id && sessionId && state.session_id !== sessionId) {
26
+ return null;
27
+ }
28
+ // Check for completion promise in transcript
29
+ const completed = detectCompletionPromise(sessionId || '', state.completion_promise);
30
+ if (completed) {
31
+ clearRalphState(directory || process.cwd());
32
+ return {
33
+ shouldBlock: false,
34
+ message: `[RALPH LOOP COMPLETE] Task completed after ${state.iteration} iteration(s). Great work!`,
35
+ mode: 'none'
36
+ };
37
+ }
38
+ // Check max iterations
39
+ if (state.iteration >= state.max_iterations) {
40
+ clearRalphState(directory || process.cwd());
41
+ return {
42
+ shouldBlock: false,
43
+ message: `[RALPH LOOP STOPPED] Max iterations (${state.max_iterations}) reached without completion promise. Consider reviewing the task requirements.`,
44
+ mode: 'none'
45
+ };
46
+ }
47
+ // Increment and continue
48
+ const newState = incrementRalphIteration(directory || process.cwd());
49
+ if (!newState) {
50
+ return null;
51
+ }
52
+ const continuationPrompt = `<ralph-loop-continuation>
53
+
54
+ [RALPH LOOP - ITERATION ${newState.iteration}/${newState.max_iterations}]
55
+
56
+ Your previous attempt did not output the completion promise. The work is NOT done yet.
57
+
58
+ CRITICAL INSTRUCTIONS:
59
+ 1. Review your progress and the original task
60
+ 2. Check your todo list - are ALL items marked complete?
61
+ 3. Continue from where you left off
62
+ 4. When FULLY complete, output: <promise>${newState.completion_promise}</promise>
63
+ 5. Do NOT stop until the task is truly done
64
+
65
+ ${newState.prompt ? `Original task: ${newState.prompt}` : ''}
66
+
67
+ </ralph-loop-continuation>
68
+
69
+ ---
70
+
71
+ `;
72
+ return {
73
+ shouldBlock: true,
74
+ message: continuationPrompt,
75
+ mode: 'ralph-loop',
76
+ metadata: {
77
+ iteration: newState.iteration,
78
+ maxIterations: newState.max_iterations
79
+ }
80
+ };
81
+ }
82
+ /**
83
+ * Check Ultrawork state and determine if it should reinforce
84
+ */
85
+ async function checkUltrawork(sessionId, directory, hasIncompleteTodos) {
86
+ const state = readUltraworkState(directory);
87
+ if (!state || !state.active) {
88
+ return null;
89
+ }
90
+ // If bound to a session, only reinforce for that session
91
+ if (state.session_id && sessionId && state.session_id !== sessionId) {
92
+ return null;
93
+ }
94
+ // If no incomplete todos, ultrawork can complete
95
+ if (!hasIncompleteTodos) {
96
+ deactivateUltrawork(directory);
97
+ return {
98
+ shouldBlock: false,
99
+ message: `[ULTRAWORK COMPLETE] All tasks finished. Ultrawork mode deactivated. Well done!`,
100
+ mode: 'none'
101
+ };
102
+ }
103
+ // Reinforce ultrawork mode
104
+ const newState = incrementReinforcement(directory);
105
+ if (!newState) {
106
+ return null;
107
+ }
108
+ const message = getUltraworkPersistenceMessage(newState);
109
+ return {
110
+ shouldBlock: true,
111
+ message,
112
+ mode: 'ultrawork',
113
+ metadata: {
114
+ reinforcementCount: newState.reinforcement_count
115
+ }
116
+ };
117
+ }
118
+ /**
119
+ * Check for incomplete todos (baseline enforcement)
120
+ */
121
+ async function checkTodoContinuation(sessionId, directory) {
122
+ const result = await checkIncompleteTodos(sessionId, directory);
123
+ if (result.count === 0) {
124
+ return null;
125
+ }
126
+ const nextTodo = getNextPendingTodo(result);
127
+ const nextTaskInfo = nextTodo
128
+ ? `\n\nNext task: "${nextTodo.content}" (${nextTodo.status})`
129
+ : '';
130
+ const message = `<todo-continuation>
131
+
132
+ ${TODO_CONTINUATION_PROMPT}
133
+
134
+ [Status: ${result.count} of ${result.total} tasks remaining]${nextTaskInfo}
135
+
136
+ </todo-continuation>
137
+
138
+ ---
139
+
140
+ `;
141
+ return {
142
+ shouldBlock: true,
143
+ message,
144
+ mode: 'todo-continuation',
145
+ metadata: {
146
+ todoCount: result.count
147
+ }
148
+ };
149
+ }
150
+ /**
151
+ * Main persistent mode checker
152
+ * Checks all persistent modes in priority order and returns appropriate action
153
+ */
154
+ export async function checkPersistentModes(sessionId, directory) {
155
+ const workingDir = directory || process.cwd();
156
+ // First, check for incomplete todos (we need this info for ultrawork)
157
+ const todoResult = await checkIncompleteTodos(sessionId, workingDir);
158
+ const hasIncompleteTodos = todoResult.count > 0;
159
+ // Priority 1: Ralph Loop (explicit loop mode)
160
+ const ralphResult = await checkRalphLoop(sessionId, workingDir);
161
+ if (ralphResult?.shouldBlock) {
162
+ return ralphResult;
163
+ }
164
+ // Priority 2: Ultrawork Mode (performance mode with persistence)
165
+ const ultraworkResult = await checkUltrawork(sessionId, workingDir, hasIncompleteTodos);
166
+ if (ultraworkResult?.shouldBlock) {
167
+ return ultraworkResult;
168
+ }
169
+ // Priority 3: Todo Continuation (baseline enforcement)
170
+ if (hasIncompleteTodos) {
171
+ const todoContResult = await checkTodoContinuation(sessionId, workingDir);
172
+ if (todoContResult?.shouldBlock) {
173
+ return todoContResult;
174
+ }
175
+ }
176
+ // No blocking needed
177
+ return {
178
+ shouldBlock: false,
179
+ message: '',
180
+ mode: 'none'
181
+ };
182
+ }
183
+ /**
184
+ * Create hook output for Claude Code
185
+ */
186
+ export function createHookOutput(result) {
187
+ if (!result.shouldBlock) {
188
+ // Allow stop, but optionally inject completion message
189
+ return {
190
+ continue: true,
191
+ message: result.message || undefined
192
+ };
193
+ }
194
+ // Block stop and inject continuation message
195
+ return {
196
+ continue: false,
197
+ reason: result.message
198
+ };
199
+ }
200
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/persistent-mode/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
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
+ export interface FormatConfig {
12
+ /** File extensions to format */
13
+ extensions: string[];
14
+ /** Formatter command (e.g., 'prettier --write', 'black') */
15
+ command: string;
16
+ /** Whether to run on file save */
17
+ enabled: boolean;
18
+ }
19
+ /**
20
+ * Get formatter command for a file extension
21
+ */
22
+ export declare function getFormatter(ext: string): string | null;
23
+ /**
24
+ * Check if a formatter is available
25
+ */
26
+ export declare function isFormatterAvailable(command: string): boolean;
27
+ /**
28
+ * Format a file using the appropriate formatter
29
+ */
30
+ export declare function formatFile(filePath: string): {
31
+ success: boolean;
32
+ message: string;
33
+ };
34
+ export interface LintConfig {
35
+ /** Lint command to run */
36
+ command: string;
37
+ /** File patterns to lint */
38
+ patterns: string[];
39
+ /** Whether to block on lint errors */
40
+ blocking: boolean;
41
+ }
42
+ /**
43
+ * Get linter command for a file extension
44
+ */
45
+ export declare function getLinter(ext: string): string | null;
46
+ /**
47
+ * Run linter on a file
48
+ */
49
+ export declare function lintFile(filePath: string): {
50
+ success: boolean;
51
+ message: string;
52
+ };
53
+ export interface CommitConfig {
54
+ /** Conventional commit types allowed */
55
+ types: string[];
56
+ /** Maximum subject length */
57
+ maxSubjectLength: number;
58
+ /** Require scope */
59
+ requireScope: boolean;
60
+ /** Require body */
61
+ requireBody: boolean;
62
+ }
63
+ /**
64
+ * Validate a commit message against conventional commit format
65
+ */
66
+ export declare function validateCommitMessage(message: string, config?: Partial<CommitConfig>): {
67
+ valid: boolean;
68
+ errors: string[];
69
+ };
70
+ /**
71
+ * Run TypeScript type checking
72
+ */
73
+ export declare function runTypeCheck(directory: string): {
74
+ success: boolean;
75
+ message: string;
76
+ };
77
+ /**
78
+ * Detect and run tests for a project
79
+ */
80
+ export declare function runTests(directory: string): {
81
+ success: boolean;
82
+ message: string;
83
+ };
84
+ export interface PreCommitResult {
85
+ canCommit: boolean;
86
+ checks: Array<{
87
+ name: string;
88
+ passed: boolean;
89
+ message: string;
90
+ }>;
91
+ }
92
+ /**
93
+ * Run all pre-commit checks
94
+ */
95
+ export declare function runPreCommitChecks(directory: string, commitMessage?: string): PreCommitResult;
96
+ /**
97
+ * Generate pre-commit check reminder message
98
+ */
99
+ export declare function getPreCommitReminderMessage(result: PreCommitResult): string;
100
+ /**
101
+ * Generate auto-format reminder message
102
+ */
103
+ export declare function getAutoFormatMessage(filePath: string, result: {
104
+ success: boolean;
105
+ message: string;
106
+ }): string;
107
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/plugin-patterns/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB;AAgBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAkBlF;AAMD,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqBhF;AAMD,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAkBD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAyCtC;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmBrF;AAMD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0BjF;AAMD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,eAAe,CAyBjB;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAqB3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAmB5G"}
@@ -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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"}