oh-my-claude-sisyphus 3.6.3 → 3.7.2

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 (163) hide show
  1. package/README.md +40 -1
  2. package/commands/hud.md +37 -5
  3. package/commands/omc-setup.md +105 -0
  4. package/dist/__tests__/delegation-enforcement-levels.test.d.ts +9 -0
  5. package/dist/__tests__/delegation-enforcement-levels.test.d.ts.map +1 -0
  6. package/dist/__tests__/delegation-enforcement-levels.test.js +550 -0
  7. package/dist/__tests__/delegation-enforcement-levels.test.js.map +1 -0
  8. package/dist/__tests__/hud/analytics-display.test.js +137 -1
  9. package/dist/__tests__/hud/analytics-display.test.js.map +1 -1
  10. package/dist/__tests__/hud-windows.test.d.ts +2 -0
  11. package/dist/__tests__/hud-windows.test.d.ts.map +1 -0
  12. package/dist/__tests__/hud-windows.test.js +91 -0
  13. package/dist/__tests__/hud-windows.test.js.map +1 -0
  14. package/dist/__tests__/installer.test.js +1 -1
  15. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts +5 -0
  16. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts.map +1 -0
  17. package/dist/__tests__/rate-limit-wait/daemon.test.js +313 -0
  18. package/dist/__tests__/rate-limit-wait/daemon.test.js.map +1 -0
  19. package/dist/__tests__/rate-limit-wait/integration.test.d.ts +8 -0
  20. package/dist/__tests__/rate-limit-wait/integration.test.d.ts.map +1 -0
  21. package/dist/__tests__/rate-limit-wait/integration.test.js +329 -0
  22. package/dist/__tests__/rate-limit-wait/integration.test.js.map +1 -0
  23. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts +5 -0
  24. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts.map +1 -0
  25. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js +167 -0
  26. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js.map +1 -0
  27. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts +5 -0
  28. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts.map +1 -0
  29. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js +295 -0
  30. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js.map +1 -0
  31. package/dist/cli/commands/wait.d.ts +52 -0
  32. package/dist/cli/commands/wait.d.ts.map +1 -0
  33. package/dist/cli/commands/wait.js +229 -0
  34. package/dist/cli/commands/wait.js.map +1 -0
  35. package/dist/cli/index.js +54 -0
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/features/rate-limit-wait/daemon.d.ts +52 -0
  38. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -0
  39. package/dist/features/rate-limit-wait/daemon.js +585 -0
  40. package/dist/features/rate-limit-wait/daemon.js.map +1 -0
  41. package/dist/features/rate-limit-wait/index.d.ts +16 -0
  42. package/dist/features/rate-limit-wait/index.d.ts.map +1 -0
  43. package/dist/features/rate-limit-wait/index.js +18 -0
  44. package/dist/features/rate-limit-wait/index.js.map +1 -0
  45. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts +22 -0
  46. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts.map +1 -0
  47. package/dist/features/rate-limit-wait/rate-limit-monitor.js +99 -0
  48. package/dist/features/rate-limit-wait/rate-limit-monitor.js.map +1 -0
  49. package/dist/features/rate-limit-wait/tmux-detector.d.ts +59 -0
  50. package/dist/features/rate-limit-wait/tmux-detector.d.ts.map +1 -0
  51. package/dist/features/rate-limit-wait/tmux-detector.js +304 -0
  52. package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -0
  53. package/dist/features/rate-limit-wait/types.d.ts +121 -0
  54. package/dist/features/rate-limit-wait/types.d.ts.map +1 -0
  55. package/dist/features/rate-limit-wait/types.js +8 -0
  56. package/dist/features/rate-limit-wait/types.js.map +1 -0
  57. package/dist/features/state-manager/index.d.ts.map +1 -1
  58. package/dist/features/state-manager/index.js +4 -1
  59. package/dist/features/state-manager/index.js.map +1 -1
  60. package/dist/hooks/bridge.d.ts +1 -1
  61. package/dist/hooks/bridge.d.ts.map +1 -1
  62. package/dist/hooks/bridge.js +50 -4
  63. package/dist/hooks/bridge.js.map +1 -1
  64. package/dist/hooks/index.d.ts +5 -0
  65. package/dist/hooks/index.d.ts.map +1 -1
  66. package/dist/hooks/index.js +15 -0
  67. package/dist/hooks/index.js.map +1 -1
  68. package/dist/hooks/omc-orchestrator/audit.d.ts +2 -1
  69. package/dist/hooks/omc-orchestrator/audit.d.ts.map +1 -1
  70. package/dist/hooks/omc-orchestrator/audit.js.map +1 -1
  71. package/dist/hooks/omc-orchestrator/index.d.ts +7 -0
  72. package/dist/hooks/omc-orchestrator/index.d.ts.map +1 -1
  73. package/dist/hooks/omc-orchestrator/index.js +95 -8
  74. package/dist/hooks/omc-orchestrator/index.js.map +1 -1
  75. package/dist/hooks/permission-handler/__tests__/index.test.d.ts +2 -0
  76. package/dist/hooks/permission-handler/__tests__/index.test.d.ts.map +1 -0
  77. package/dist/hooks/permission-handler/__tests__/index.test.js +291 -0
  78. package/dist/hooks/permission-handler/__tests__/index.test.js.map +1 -0
  79. package/dist/hooks/permission-handler/index.d.ts +42 -0
  80. package/dist/hooks/permission-handler/index.d.ts.map +1 -0
  81. package/dist/hooks/permission-handler/index.js +107 -0
  82. package/dist/hooks/permission-handler/index.js.map +1 -0
  83. package/dist/hooks/plugin-patterns/index.d.ts +5 -0
  84. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
  85. package/dist/hooks/plugin-patterns/index.js +26 -1
  86. package/dist/hooks/plugin-patterns/index.js.map +1 -1
  87. package/dist/hooks/pre-compact/index.d.ts +82 -0
  88. package/dist/hooks/pre-compact/index.d.ts.map +1 -0
  89. package/dist/hooks/pre-compact/index.js +265 -0
  90. package/dist/hooks/pre-compact/index.js.map +1 -0
  91. package/dist/hooks/session-end/index.d.ts +42 -0
  92. package/dist/hooks/session-end/index.d.ts.map +1 -0
  93. package/dist/hooks/session-end/index.js +200 -0
  94. package/dist/hooks/session-end/index.js.map +1 -0
  95. package/dist/hooks/setup/index.d.ts +66 -0
  96. package/dist/hooks/setup/index.d.ts.map +1 -0
  97. package/dist/hooks/setup/index.js +299 -0
  98. package/dist/hooks/setup/index.js.map +1 -0
  99. package/dist/hooks/setup/types.d.ts +25 -0
  100. package/dist/hooks/setup/types.d.ts.map +1 -0
  101. package/dist/hooks/setup/types.js +5 -0
  102. package/dist/hooks/setup/types.js.map +1 -0
  103. package/dist/hooks/subagent-tracker/index.d.ts +68 -29
  104. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
  105. package/dist/hooks/subagent-tracker/index.js +316 -131
  106. package/dist/hooks/subagent-tracker/index.js.map +1 -1
  107. package/dist/hud/analytics-display.d.ts +16 -0
  108. package/dist/hud/analytics-display.d.ts.map +1 -1
  109. package/dist/hud/analytics-display.js +35 -9
  110. package/dist/hud/analytics-display.js.map +1 -1
  111. package/dist/hud/render.d.ts.map +1 -1
  112. package/dist/hud/render.js +49 -18
  113. package/dist/hud/render.js.map +1 -1
  114. package/dist/hud/types.d.ts +2 -0
  115. package/dist/hud/types.d.ts.map +1 -1
  116. package/dist/hud/types.js +14 -0
  117. package/dist/hud/types.js.map +1 -1
  118. package/dist/installer/index.d.ts +1 -1
  119. package/dist/installer/index.d.ts.map +1 -1
  120. package/dist/installer/index.js +4 -3
  121. package/dist/installer/index.js.map +1 -1
  122. package/hooks/hooks.json +83 -1
  123. package/hooks/keyword-detector.sh +4 -4
  124. package/hooks/persistent-mode.sh +10 -10
  125. package/hooks/session-start.sh +4 -4
  126. package/package.json +3 -1
  127. package/scripts/keyword-detector.mjs +4 -4
  128. package/scripts/permission-handler.mjs +23 -0
  129. package/scripts/persistent-mode.mjs +6 -6
  130. package/scripts/persistent-mode.sh +10 -10
  131. package/scripts/pre-compact.mjs +23 -0
  132. package/scripts/session-end.mjs +23 -0
  133. package/scripts/session-start.mjs +4 -4
  134. package/scripts/setup-init.mjs +23 -0
  135. package/scripts/setup-maintenance.mjs +23 -0
  136. package/scripts/subagent-tracker.mjs +35 -0
  137. package/skills/hud/SKILL.md +37 -5
  138. package/skills/omc-setup/SKILL.md +162 -4
  139. package/skills/writer-memory/SKILL.md +443 -0
  140. package/skills/writer-memory/lib/character-tracker.ts +338 -0
  141. package/skills/writer-memory/lib/memory-manager.ts +804 -0
  142. package/skills/writer-memory/lib/relationship-graph.ts +400 -0
  143. package/skills/writer-memory/lib/scene-organizer.ts +544 -0
  144. package/skills/writer-memory/lib/synopsis-builder.ts +339 -0
  145. package/skills/writer-memory/templates/synopsis-template.md +46 -0
  146. package/templates/hooks/keyword-detector.mjs +198 -0
  147. package/templates/hooks/keyword-detector.sh +102 -0
  148. package/templates/hooks/persistent-mode.mjs +249 -0
  149. package/templates/hooks/persistent-mode.sh +187 -0
  150. package/templates/hooks/post-tool-use.mjs +133 -0
  151. package/templates/hooks/post-tool-use.sh +90 -0
  152. package/templates/hooks/pre-tool-use.mjs +145 -0
  153. package/templates/hooks/pre-tool-use.sh +113 -0
  154. package/templates/hooks/session-start.mjs +100 -0
  155. package/templates/hooks/session-start.sh +62 -0
  156. package/templates/hooks/stop-continuation.mjs +80 -0
  157. package/templates/hooks/stop-continuation.sh +40 -0
  158. package/templates/rules/README.md +40 -0
  159. package/templates/rules/coding-style.md +74 -0
  160. package/templates/rules/git-workflow.md +41 -0
  161. package/templates/rules/performance.md +40 -0
  162. package/templates/rules/security.md +41 -0
  163. package/templates/rules/testing.md +42 -0
@@ -0,0 +1,550 @@
1
+ /**
2
+ * Comprehensive tests for delegation enforcement hook implementation
3
+ *
4
+ * Tests: suggestAgentForFile, getEnforcementLevel (via processOrchestratorPreTool),
5
+ * processOrchestratorPreTool enforcement levels, AuditEntry interface, and
6
+ * processPreToolUse integration in bridge.ts
7
+ */
8
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
9
+ import { processOrchestratorPreTool, isAllowedPath, isSourceFile, isWriteEditTool, clearEnforcementCache, } from '../hooks/omc-orchestrator/index.js';
10
+ // Mock fs module
11
+ vi.mock('fs', async () => {
12
+ const actual = await vi.importActual('fs');
13
+ return {
14
+ ...actual,
15
+ existsSync: vi.fn(),
16
+ readFileSync: vi.fn(),
17
+ mkdirSync: vi.fn(),
18
+ appendFileSync: vi.fn(),
19
+ };
20
+ });
21
+ // Mock os module
22
+ vi.mock('os', async () => {
23
+ const actual = await vi.importActual('os');
24
+ return {
25
+ ...actual,
26
+ homedir: vi.fn(() => '/mock/home'),
27
+ };
28
+ });
29
+ // Mock boulder-state to avoid side effects
30
+ vi.mock('../features/boulder-state/index.js', () => ({
31
+ readBoulderState: vi.fn(() => null),
32
+ getPlanProgress: vi.fn(() => ({ total: 0, completed: 0, isComplete: true })),
33
+ }));
34
+ // Mock notepad to avoid side effects
35
+ vi.mock('../hooks/notepad/index.js', () => ({
36
+ addWorkingMemoryEntry: vi.fn(),
37
+ setPriorityContext: vi.fn(),
38
+ }));
39
+ import { existsSync, readFileSync } from 'fs';
40
+ const mockExistsSync = vi.mocked(existsSync);
41
+ const mockReadFileSync = vi.mocked(readFileSync);
42
+ describe('delegation-enforcement-levels', () => {
43
+ beforeEach(() => {
44
+ vi.clearAllMocks();
45
+ clearEnforcementCache();
46
+ // Default: no config files exist
47
+ mockExistsSync.mockReturnValue(false);
48
+ });
49
+ // ─── 1. suggestAgentForFile (tested indirectly via warning messages) ───
50
+ describe('suggestAgentForFile via warning messages', () => {
51
+ // Helper: trigger a warn-level enforcement on a file and check agent suggestion in message
52
+ function getWarningForFile(filename) {
53
+ mockExistsSync.mockReturnValue(false); // default warn
54
+ const result = processOrchestratorPreTool({
55
+ toolName: 'Write',
56
+ toolInput: { filePath: `src/${filename}` },
57
+ directory: '/tmp/test-project',
58
+ });
59
+ return result.message;
60
+ }
61
+ const extensionToAgent = [
62
+ ['file.ts', 'executor-low (simple) or executor (complex)'],
63
+ ['file.tsx', 'designer-low (simple) or designer (complex UI)'],
64
+ ['file.js', 'executor-low'],
65
+ ['file.jsx', 'designer-low'],
66
+ ['file.py', 'executor-low (simple) or executor (complex)'],
67
+ ['file.vue', 'designer'],
68
+ ['file.svelte', 'designer'],
69
+ ['file.css', 'designer-low'],
70
+ ['file.scss', 'designer-low'],
71
+ ['file.md', 'writer (documentation)'],
72
+ ['file.json', 'executor-low'],
73
+ ];
74
+ it.each(extensionToAgent)('suggests correct agent for %s', (filename, expectedAgent) => {
75
+ const msg = getWarningForFile(filename);
76
+ expect(msg).toBeDefined();
77
+ expect(msg).toContain(`Suggested agent: ${expectedAgent}`);
78
+ });
79
+ it('falls back to executor for unknown extension', () => {
80
+ const msg = getWarningForFile('file.xyz');
81
+ // .xyz is not in WARNED_EXTENSIONS, so isSourceFile returns false
82
+ // but it's also not an allowed path, so it still gets warned
83
+ // The suggestion should be 'executor' (the fallback)
84
+ expect(msg).toBeDefined();
85
+ expect(msg).toContain('Suggested agent: executor');
86
+ });
87
+ it('handles empty path by allowing it (no warning)', () => {
88
+ const result = processOrchestratorPreTool({
89
+ toolName: 'Write',
90
+ toolInput: { filePath: '' },
91
+ directory: '/tmp/test-project',
92
+ });
93
+ // Empty path -> isAllowedPath returns true -> no warning
94
+ expect(result.continue).toBe(true);
95
+ expect(result.message).toBeUndefined();
96
+ });
97
+ });
98
+ // ─── 2. getEnforcementLevel (via processOrchestratorPreTool behavior) ───
99
+ describe('getEnforcementLevel via processOrchestratorPreTool', () => {
100
+ const sourceFileInput = {
101
+ toolName: 'Write',
102
+ toolInput: { filePath: 'src/app.ts' },
103
+ directory: '/tmp/test-project',
104
+ };
105
+ it('defaults to warn when no config file exists', () => {
106
+ mockExistsSync.mockReturnValue(false);
107
+ const result = processOrchestratorPreTool(sourceFileInput);
108
+ // warn = continue: true with message
109
+ expect(result.continue).toBe(true);
110
+ expect(result.message).toBeDefined();
111
+ expect(result.message).toContain('DELEGATION REQUIRED');
112
+ });
113
+ it('local config overrides global config', () => {
114
+ // Local config exists with 'off', global has 'strict'
115
+ mockExistsSync.mockImplementation((p) => {
116
+ const s = String(p);
117
+ if (s.includes('/tmp/test-project/.omc/config.json'))
118
+ return true;
119
+ if (s.includes('/mock/home/.claude/.omc-config.json'))
120
+ return true;
121
+ return false;
122
+ });
123
+ mockReadFileSync.mockImplementation((p) => {
124
+ const s = String(p);
125
+ if (s.includes('/tmp/test-project/.omc/config.json')) {
126
+ return JSON.stringify({ delegationEnforcementLevel: 'off' });
127
+ }
128
+ if (s.includes('/mock/home/.claude/.omc-config.json')) {
129
+ return JSON.stringify({ delegationEnforcementLevel: 'strict' });
130
+ }
131
+ return '';
132
+ });
133
+ const result = processOrchestratorPreTool(sourceFileInput);
134
+ // 'off' means early exit, continue with no message
135
+ expect(result.continue).toBe(true);
136
+ expect(result.message).toBeUndefined();
137
+ });
138
+ it('falls back to global config when no local config', () => {
139
+ mockExistsSync.mockImplementation((p) => {
140
+ const s = String(p);
141
+ if (s.includes('/mock/home/.claude/.omc-config.json'))
142
+ return true;
143
+ return false;
144
+ });
145
+ mockReadFileSync.mockImplementation((p) => {
146
+ const s = String(p);
147
+ if (s.includes('/mock/home/.claude/.omc-config.json')) {
148
+ return JSON.stringify({ delegationEnforcementLevel: 'strict' });
149
+ }
150
+ return '';
151
+ });
152
+ const result = processOrchestratorPreTool(sourceFileInput);
153
+ // strict = blocked
154
+ expect(result.continue).toBe(false);
155
+ expect(result.reason).toBe('DELEGATION_REQUIRED');
156
+ });
157
+ it('falls back to warn on invalid enforcement level in config', () => {
158
+ mockExistsSync.mockImplementation((p) => {
159
+ const s = String(p);
160
+ if (s.includes('/tmp/test-project/.omc/config.json'))
161
+ return true;
162
+ return false;
163
+ });
164
+ mockReadFileSync.mockImplementation(() => {
165
+ return JSON.stringify({ delegationEnforcementLevel: 'invalid-value' });
166
+ });
167
+ const result = processOrchestratorPreTool(sourceFileInput);
168
+ // Should fall back to 'warn'
169
+ expect(result.continue).toBe(true);
170
+ expect(result.message).toBeDefined();
171
+ });
172
+ it('falls back to warn on malformed JSON config', () => {
173
+ mockExistsSync.mockImplementation((p) => {
174
+ const s = String(p);
175
+ if (s.includes('/tmp/test-project/.omc/config.json'))
176
+ return true;
177
+ return false;
178
+ });
179
+ mockReadFileSync.mockImplementation(() => {
180
+ return 'not valid json {{{';
181
+ });
182
+ const result = processOrchestratorPreTool(sourceFileInput);
183
+ // Malformed JSON -> catch block -> continue to next config -> default warn
184
+ expect(result.continue).toBe(true);
185
+ expect(result.message).toBeDefined();
186
+ });
187
+ it('supports enforcementLevel key as alternative', () => {
188
+ mockExistsSync.mockImplementation((p) => {
189
+ const s = String(p);
190
+ if (s.includes('/tmp/test-project/.omc/config.json'))
191
+ return true;
192
+ return false;
193
+ });
194
+ mockReadFileSync.mockImplementation(() => {
195
+ return JSON.stringify({ enforcementLevel: 'strict' });
196
+ });
197
+ const result = processOrchestratorPreTool(sourceFileInput);
198
+ expect(result.continue).toBe(false);
199
+ expect(result.reason).toBe('DELEGATION_REQUIRED');
200
+ });
201
+ });
202
+ // ─── 3. processOrchestratorPreTool enforcement levels ───
203
+ describe('processOrchestratorPreTool enforcement levels', () => {
204
+ function setEnforcement(level) {
205
+ mockExistsSync.mockImplementation((p) => {
206
+ const s = String(p);
207
+ if (s.includes('.omc/config.json'))
208
+ return true;
209
+ return false;
210
+ });
211
+ mockReadFileSync.mockImplementation(() => {
212
+ return JSON.stringify({ delegationEnforcementLevel: level });
213
+ });
214
+ }
215
+ describe('enforcement=off', () => {
216
+ it('write to source file continues with no message', () => {
217
+ setEnforcement('off');
218
+ const result = processOrchestratorPreTool({
219
+ toolName: 'Write',
220
+ toolInput: { filePath: 'src/app.ts' },
221
+ directory: '/tmp/test-project',
222
+ });
223
+ expect(result.continue).toBe(true);
224
+ expect(result.message).toBeUndefined();
225
+ expect(result.reason).toBeUndefined();
226
+ });
227
+ });
228
+ describe('enforcement=warn', () => {
229
+ it('write to source file continues with warning message and agent suggestion', () => {
230
+ setEnforcement('warn');
231
+ const result = processOrchestratorPreTool({
232
+ toolName: 'Write',
233
+ toolInput: { filePath: 'src/app.ts' },
234
+ directory: '/tmp/test-project',
235
+ });
236
+ expect(result.continue).toBe(true);
237
+ expect(result.message).toBeDefined();
238
+ expect(result.message).toContain('DELEGATION REQUIRED');
239
+ expect(result.message).toContain('src/app.ts');
240
+ expect(result.message).toContain('Suggested agent:');
241
+ });
242
+ });
243
+ describe('enforcement=strict', () => {
244
+ it('write to source file blocks with continue=false, reason, and message', () => {
245
+ setEnforcement('strict');
246
+ const result = processOrchestratorPreTool({
247
+ toolName: 'Write',
248
+ toolInput: { filePath: 'src/app.ts' },
249
+ directory: '/tmp/test-project',
250
+ });
251
+ expect(result.continue).toBe(false);
252
+ expect(result.reason).toBe('DELEGATION_REQUIRED');
253
+ expect(result.message).toBeDefined();
254
+ expect(result.message).toContain('DELEGATION REQUIRED');
255
+ expect(result.message).toContain('Suggested agent:');
256
+ });
257
+ });
258
+ describe('allowed paths always continue', () => {
259
+ const allowedPaths = [
260
+ '.omc/plans/test.md',
261
+ '.claude/settings.json',
262
+ 'docs/CLAUDE.md',
263
+ 'AGENTS.md',
264
+ ];
265
+ it.each(allowedPaths)('allows %s regardless of enforcement level', (filePath) => {
266
+ setEnforcement('strict');
267
+ const result = processOrchestratorPreTool({
268
+ toolName: 'Write',
269
+ toolInput: { filePath },
270
+ directory: '/tmp/test-project',
271
+ });
272
+ expect(result.continue).toBe(true);
273
+ expect(result.reason).toBeUndefined();
274
+ });
275
+ });
276
+ describe('non-write tools always continue', () => {
277
+ it.each(['Read', 'Bash', 'Glob', 'Grep', 'Task'])('%s tool continues regardless of enforcement level', (toolName) => {
278
+ setEnforcement('strict');
279
+ const result = processOrchestratorPreTool({
280
+ toolName,
281
+ toolInput: { filePath: 'src/app.ts' },
282
+ directory: '/tmp/test-project',
283
+ });
284
+ expect(result.continue).toBe(true);
285
+ expect(result.message).toBeUndefined();
286
+ });
287
+ });
288
+ it('warning message includes agent suggestion text', () => {
289
+ setEnforcement('warn');
290
+ const result = processOrchestratorPreTool({
291
+ toolName: 'Edit',
292
+ toolInput: { filePath: 'src/component.tsx' },
293
+ directory: '/tmp/test-project',
294
+ });
295
+ expect(result.message).toContain('Suggested agent: designer-low (simple) or designer (complex UI)');
296
+ });
297
+ it('handles filePath in different input keys', () => {
298
+ setEnforcement('warn');
299
+ // toolInput.path
300
+ const result1 = processOrchestratorPreTool({
301
+ toolName: 'Write',
302
+ toolInput: { path: 'src/app.py' },
303
+ directory: '/tmp/test-project',
304
+ });
305
+ expect(result1.message).toBeDefined();
306
+ expect(result1.message).toContain('src/app.py');
307
+ // toolInput.file
308
+ const result2 = processOrchestratorPreTool({
309
+ toolName: 'Write',
310
+ toolInput: { file: 'src/app.go' },
311
+ directory: '/tmp/test-project',
312
+ });
313
+ expect(result2.message).toBeDefined();
314
+ expect(result2.message).toContain('src/app.go');
315
+ });
316
+ it('handles undefined toolInput gracefully', () => {
317
+ setEnforcement('warn');
318
+ const result = processOrchestratorPreTool({
319
+ toolName: 'Write',
320
+ toolInput: undefined,
321
+ directory: '/tmp/test-project',
322
+ });
323
+ // No filePath extracted -> isAllowedPath(undefined) -> true -> continue
324
+ expect(result.continue).toBe(true);
325
+ });
326
+ });
327
+ // ─── 4. AuditEntry interface ───
328
+ describe('AuditEntry interface', () => {
329
+ it('accepts blocked decision', () => {
330
+ const entry = {
331
+ timestamp: new Date().toISOString(),
332
+ tool: 'Write',
333
+ filePath: 'src/app.ts',
334
+ decision: 'blocked',
335
+ reason: 'source_file',
336
+ enforcementLevel: 'strict',
337
+ sessionId: 'test-session',
338
+ };
339
+ expect(entry.decision).toBe('blocked');
340
+ expect(entry.enforcementLevel).toBe('strict');
341
+ });
342
+ it('accepts warned decision', () => {
343
+ const entry = {
344
+ timestamp: new Date().toISOString(),
345
+ tool: 'Edit',
346
+ filePath: 'src/app.ts',
347
+ decision: 'warned',
348
+ reason: 'source_file',
349
+ enforcementLevel: 'warn',
350
+ };
351
+ expect(entry.decision).toBe('warned');
352
+ expect(entry.enforcementLevel).toBe('warn');
353
+ });
354
+ it('accepts allowed decision without enforcementLevel', () => {
355
+ const entry = {
356
+ timestamp: new Date().toISOString(),
357
+ tool: 'Write',
358
+ filePath: '.omc/plans/test.md',
359
+ decision: 'allowed',
360
+ reason: 'allowed_path',
361
+ };
362
+ expect(entry.decision).toBe('allowed');
363
+ expect(entry.enforcementLevel).toBeUndefined();
364
+ });
365
+ it('enforcementLevel field is present in logged entries for warned/blocked', () => {
366
+ const entry = {
367
+ timestamp: new Date().toISOString(),
368
+ tool: 'Write',
369
+ filePath: 'src/app.ts',
370
+ decision: 'blocked',
371
+ reason: 'source_file',
372
+ enforcementLevel: 'strict',
373
+ };
374
+ expect('enforcementLevel' in entry).toBe(true);
375
+ expect(entry.enforcementLevel).toBeDefined();
376
+ });
377
+ });
378
+ // ─── 5. processPreToolUse integration (bridge.ts) ───
379
+ describe('processPreToolUse integration via processHook', () => {
380
+ // We test the bridge by importing processHook
381
+ // Need to dynamically import to get fresh mocks
382
+ let processHook;
383
+ beforeEach(async () => {
384
+ // Mock additional bridge dependencies
385
+ vi.mock('../hud/background-tasks.js', () => ({
386
+ addBackgroundTask: vi.fn(),
387
+ completeBackgroundTask: vi.fn(),
388
+ }));
389
+ vi.mock('../hooks/ralph/index.js', () => ({
390
+ readRalphState: vi.fn(() => null),
391
+ incrementRalphIteration: vi.fn(),
392
+ clearRalphState: vi.fn(),
393
+ detectCompletionPromise: vi.fn(),
394
+ createRalphLoopHook: vi.fn(() => ({ startLoop: vi.fn() })),
395
+ readVerificationState: vi.fn(() => null),
396
+ startVerification: vi.fn(),
397
+ getArchitectVerificationPrompt: vi.fn(),
398
+ clearVerificationState: vi.fn(),
399
+ }));
400
+ vi.mock('../hooks/keyword-detector/index.js', () => ({
401
+ detectKeywordsWithType: vi.fn(() => []),
402
+ removeCodeBlocks: vi.fn((t) => t),
403
+ }));
404
+ vi.mock('../hooks/todo-continuation/index.js', () => ({
405
+ checkIncompleteTodos: vi.fn(async () => ({ count: 0 })),
406
+ }));
407
+ vi.mock('../hooks/persistent-mode/index.js', () => ({
408
+ checkPersistentModes: vi.fn(async () => ({ shouldContinue: true })),
409
+ createHookOutput: vi.fn(() => ({ continue: true })),
410
+ }));
411
+ vi.mock('../hooks/ultrawork/index.js', () => ({
412
+ activateUltrawork: vi.fn(),
413
+ readUltraworkState: vi.fn(() => null),
414
+ }));
415
+ vi.mock('../hooks/autopilot/index.js', () => ({
416
+ readAutopilotState: vi.fn(() => null),
417
+ isAutopilotActive: vi.fn(() => false),
418
+ getPhasePrompt: vi.fn(),
419
+ transitionPhase: vi.fn(),
420
+ formatCompactSummary: vi.fn(),
421
+ }));
422
+ vi.mock('../installer/hooks.js', () => ({
423
+ ULTRAWORK_MESSAGE: 'ultrawork',
424
+ ULTRATHINK_MESSAGE: 'ultrathink',
425
+ SEARCH_MESSAGE: 'search',
426
+ ANALYZE_MESSAGE: 'analyze',
427
+ TODO_CONTINUATION_PROMPT: 'continue',
428
+ RALPH_MESSAGE: 'ralph',
429
+ }));
430
+ const bridge = await import('../hooks/bridge.js');
431
+ processHook = bridge.processHook;
432
+ });
433
+ it('calls enforcement before HUD tracking', async () => {
434
+ // With strict enforcement, a Write to source should be blocked
435
+ // before any HUD tracking happens
436
+ mockExistsSync.mockImplementation((p) => {
437
+ const s = String(p);
438
+ if (s.includes('.omc/config.json'))
439
+ return true;
440
+ return false;
441
+ });
442
+ mockReadFileSync.mockImplementation(() => {
443
+ return JSON.stringify({ delegationEnforcementLevel: 'strict' });
444
+ });
445
+ const result = await processHook('pre-tool-use', {
446
+ toolName: 'Write',
447
+ toolInput: { filePath: 'src/app.ts' },
448
+ directory: '/tmp/test-project',
449
+ });
450
+ expect(result.continue).toBe(false);
451
+ expect(result.reason).toBe('DELEGATION_REQUIRED');
452
+ });
453
+ it('blocks propagated from enforcement', async () => {
454
+ mockExistsSync.mockImplementation((p) => {
455
+ const s = String(p);
456
+ if (s.includes('.omc/config.json'))
457
+ return true;
458
+ return false;
459
+ });
460
+ mockReadFileSync.mockImplementation(() => {
461
+ return JSON.stringify({ delegationEnforcementLevel: 'strict' });
462
+ });
463
+ const result = await processHook('pre-tool-use', {
464
+ toolName: 'Edit',
465
+ toolInput: { filePath: 'src/component.tsx' },
466
+ directory: '/tmp/test-project',
467
+ });
468
+ expect(result.continue).toBe(false);
469
+ expect(result.message).toContain('DELEGATION REQUIRED');
470
+ });
471
+ it('warnings propagated from enforcement', async () => {
472
+ mockExistsSync.mockReturnValue(false); // default warn
473
+ const result = await processHook('pre-tool-use', {
474
+ toolName: 'Write',
475
+ toolInput: { filePath: 'src/index.ts' },
476
+ directory: '/tmp/test-project',
477
+ });
478
+ expect(result.continue).toBe(true);
479
+ expect(result.message).toBeDefined();
480
+ expect(result.message).toContain('DELEGATION REQUIRED');
481
+ });
482
+ it('Task tool tracking still works when enforcement passes', async () => {
483
+ const { addBackgroundTask } = await import('../hud/background-tasks.js');
484
+ const mockAddTask = vi.mocked(addBackgroundTask);
485
+ mockExistsSync.mockReturnValue(false); // default warn, but Task is not a write tool
486
+ const result = await processHook('pre-tool-use', {
487
+ toolName: 'Task',
488
+ toolInput: {
489
+ description: 'Test task',
490
+ prompt: 'do stuff',
491
+ subagent_type: 'executor',
492
+ },
493
+ directory: '/tmp/test-project',
494
+ });
495
+ expect(result.continue).toBe(true);
496
+ expect(mockAddTask).toHaveBeenCalledWith(expect.stringContaining('task-'), 'Test task', 'executor', '/tmp/test-project');
497
+ });
498
+ });
499
+ // ─── Helper function unit tests ───
500
+ describe('isAllowedPath', () => {
501
+ it('returns true for .omc/ paths', () => {
502
+ expect(isAllowedPath('.omc/plans/test.md')).toBe(true);
503
+ });
504
+ it('returns true for .claude/ paths', () => {
505
+ expect(isAllowedPath('.claude/settings.json')).toBe(true);
506
+ });
507
+ it('returns true for CLAUDE.md', () => {
508
+ expect(isAllowedPath('CLAUDE.md')).toBe(true);
509
+ expect(isAllowedPath('docs/CLAUDE.md')).toBe(true);
510
+ });
511
+ it('returns true for AGENTS.md', () => {
512
+ expect(isAllowedPath('AGENTS.md')).toBe(true);
513
+ });
514
+ it('returns false for source files', () => {
515
+ expect(isAllowedPath('src/app.ts')).toBe(false);
516
+ });
517
+ it('returns true for empty/falsy path', () => {
518
+ expect(isAllowedPath('')).toBe(true);
519
+ });
520
+ });
521
+ describe('isSourceFile', () => {
522
+ it('returns true for source extensions', () => {
523
+ expect(isSourceFile('app.ts')).toBe(true);
524
+ expect(isSourceFile('app.py')).toBe(true);
525
+ expect(isSourceFile('app.go')).toBe(true);
526
+ expect(isSourceFile('app.rs')).toBe(true);
527
+ });
528
+ it('returns false for non-source extensions', () => {
529
+ expect(isSourceFile('readme.txt')).toBe(false);
530
+ expect(isSourceFile('data.yaml')).toBe(false);
531
+ });
532
+ it('returns false for empty path', () => {
533
+ expect(isSourceFile('')).toBe(false);
534
+ });
535
+ });
536
+ describe('isWriteEditTool', () => {
537
+ it('returns true for write/edit tools', () => {
538
+ expect(isWriteEditTool('Write')).toBe(true);
539
+ expect(isWriteEditTool('Edit')).toBe(true);
540
+ expect(isWriteEditTool('write')).toBe(true);
541
+ expect(isWriteEditTool('edit')).toBe(true);
542
+ });
543
+ it('returns false for other tools', () => {
544
+ expect(isWriteEditTool('Read')).toBe(false);
545
+ expect(isWriteEditTool('Bash')).toBe(false);
546
+ expect(isWriteEditTool('Task')).toBe(false);
547
+ });
548
+ });
549
+ });
550
+ //# sourceMappingURL=delegation-enforcement-levels.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation-enforcement-levels.test.js","sourceRoot":"","sources":["../../src/__tests__/delegation-enforcement-levels.test.ts"],"names":[],"mappings":"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"}