oh-my-claude-sisyphus 3.8.14 → 3.8.16

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 (150) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +9 -11
  4. package/bridge/mcp-server.cjs +180 -180
  5. package/commands/autopilot.md +2 -6
  6. package/commands/hud.md +7 -2
  7. package/commands/ralph.md +3 -3
  8. package/commands/ultrapilot.md +2 -6
  9. package/dist/__tests__/delegation-enforcement-levels.test.js +0 -1
  10. package/dist/__tests__/delegation-enforcement-levels.test.js.map +1 -1
  11. package/dist/__tests__/hooks/learner/parser.test.d.ts +5 -0
  12. package/dist/__tests__/hooks/learner/parser.test.d.ts.map +1 -0
  13. package/dist/__tests__/hooks/learner/parser.test.js +201 -0
  14. package/dist/__tests__/hooks/learner/parser.test.js.map +1 -0
  15. package/dist/__tests__/hud/cwd.test.d.ts +2 -0
  16. package/dist/__tests__/hud/cwd.test.d.ts.map +1 -0
  17. package/dist/__tests__/hud/cwd.test.js +62 -0
  18. package/dist/__tests__/hud/cwd.test.js.map +1 -0
  19. package/dist/__tests__/hud/defaults.test.d.ts +2 -0
  20. package/dist/__tests__/hud/defaults.test.d.ts.map +1 -0
  21. package/dist/__tests__/hud/defaults.test.js +21 -0
  22. package/dist/__tests__/hud/defaults.test.js.map +1 -0
  23. package/dist/__tests__/hud/render.test.d.ts +2 -0
  24. package/dist/__tests__/hud/render.test.d.ts.map +1 -0
  25. package/dist/__tests__/hud/render.test.js +141 -0
  26. package/dist/__tests__/hud/render.test.js.map +1 -0
  27. package/dist/__tests__/hud/thinking.test.d.ts +2 -0
  28. package/dist/__tests__/hud/thinking.test.d.ts.map +1 -0
  29. package/dist/__tests__/hud/thinking.test.js +32 -0
  30. package/dist/__tests__/hud/thinking.test.js.map +1 -0
  31. package/dist/__tests__/mnemosyne/parser.test.js +1 -1
  32. package/dist/__tests__/mnemosyne/parser.test.js.map +1 -1
  33. package/dist/features/continuation-enforcement.js +1 -1
  34. package/dist/features/state-manager/index.d.ts.map +1 -1
  35. package/dist/features/state-manager/index.js +7 -4
  36. package/dist/features/state-manager/index.js.map +1 -1
  37. package/dist/features/verification/example.d.ts.map +1 -1
  38. package/dist/features/verification/example.js +4 -2
  39. package/dist/features/verification/example.js.map +1 -1
  40. package/dist/hooks/bridge.d.ts.map +1 -1
  41. package/dist/hooks/bridge.js +4 -24
  42. package/dist/hooks/bridge.js.map +1 -1
  43. package/dist/hooks/index.d.ts +1 -1
  44. package/dist/hooks/index.d.ts.map +1 -1
  45. package/dist/hooks/index.js +1 -1
  46. package/dist/hooks/index.js.map +1 -1
  47. package/dist/hooks/learner/parser.d.ts.map +1 -1
  48. package/dist/hooks/learner/parser.js +12 -5
  49. package/dist/hooks/learner/parser.js.map +1 -1
  50. package/dist/hooks/mode-registry/index.d.ts +2 -0
  51. package/dist/hooks/mode-registry/index.d.ts.map +1 -1
  52. package/dist/hooks/mode-registry/index.js +8 -19
  53. package/dist/hooks/mode-registry/index.js.map +1 -1
  54. package/dist/hooks/persistent-mode/index.d.ts +1 -1
  55. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  56. package/dist/hooks/persistent-mode/index.js +5 -33
  57. package/dist/hooks/persistent-mode/index.js.map +1 -1
  58. package/dist/hooks/ralph/index.d.ts +1 -1
  59. package/dist/hooks/ralph/index.d.ts.map +1 -1
  60. package/dist/hooks/ralph/index.js +1 -1
  61. package/dist/hooks/ralph/index.js.map +1 -1
  62. package/dist/hooks/ralph/loop.d.ts +1 -9
  63. package/dist/hooks/ralph/loop.d.ts.map +1 -1
  64. package/dist/hooks/ralph/loop.js +1 -37
  65. package/dist/hooks/ralph/loop.js.map +1 -1
  66. package/dist/hooks/ralph/prd.js +1 -1
  67. package/dist/hooks/ralph/verifier.d.ts +4 -5
  68. package/dist/hooks/ralph/verifier.d.ts.map +1 -1
  69. package/dist/hooks/ralph/verifier.js +7 -10
  70. package/dist/hooks/ralph/verifier.js.map +1 -1
  71. package/dist/hooks/session-end/index.d.ts +13 -0
  72. package/dist/hooks/session-end/index.d.ts.map +1 -1
  73. package/dist/hooks/session-end/index.js +69 -0
  74. package/dist/hooks/session-end/index.js.map +1 -1
  75. package/dist/hooks/ultrawork/index.d.ts +2 -2
  76. package/dist/hooks/ultrawork/index.d.ts.map +1 -1
  77. package/dist/hooks/ultrawork/index.js +2 -46
  78. package/dist/hooks/ultrawork/index.js.map +1 -1
  79. package/dist/hud/elements/cwd.d.ts +15 -0
  80. package/dist/hud/elements/cwd.d.ts.map +1 -0
  81. package/dist/hud/elements/cwd.js +39 -0
  82. package/dist/hud/elements/cwd.js.map +1 -0
  83. package/dist/hud/elements/index.d.ts +1 -0
  84. package/dist/hud/elements/index.d.ts.map +1 -1
  85. package/dist/hud/elements/index.js +1 -0
  86. package/dist/hud/elements/index.js.map +1 -1
  87. package/dist/hud/elements/thinking.d.ts +7 -5
  88. package/dist/hud/elements/thinking.d.ts.map +1 -1
  89. package/dist/hud/elements/thinking.js +18 -6
  90. package/dist/hud/elements/thinking.js.map +1 -1
  91. package/dist/hud/index.js +5 -3
  92. package/dist/hud/index.js.map +1 -1
  93. package/dist/hud/omc-state.d.ts +1 -1
  94. package/dist/hud/omc-state.d.ts.map +1 -1
  95. package/dist/hud/omc-state.js +14 -31
  96. package/dist/hud/omc-state.js.map +1 -1
  97. package/dist/hud/render.d.ts +9 -0
  98. package/dist/hud/render.d.ts.map +1 -1
  99. package/dist/hud/render.js +27 -7
  100. package/dist/hud/render.js.map +1 -1
  101. package/dist/hud/state.d.ts +2 -2
  102. package/dist/hud/state.d.ts.map +1 -1
  103. package/dist/hud/state.js +4 -33
  104. package/dist/hud/state.js.map +1 -1
  105. package/dist/hud/transcript.d.ts +4 -1
  106. package/dist/hud/transcript.d.ts.map +1 -1
  107. package/dist/hud/transcript.js +4 -9
  108. package/dist/hud/transcript.js.map +1 -1
  109. package/dist/hud/types.d.ts +20 -1
  110. package/dist/hud/types.d.ts.map +1 -1
  111. package/dist/hud/types.js +38 -9
  112. package/dist/hud/types.js.map +1 -1
  113. package/dist/installer/hooks.d.ts +1 -1
  114. package/dist/installer/hooks.d.ts.map +1 -1
  115. package/dist/installer/hooks.js +1 -1
  116. package/docs/AGENTS.md +100 -0
  117. package/docs/ARCHITECTURE.md +11 -7
  118. package/docs/CLAUDE.md +1 -3
  119. package/docs/DELEGATION-ENFORCER.md +1 -2
  120. package/docs/MIGRATION.md +1 -1
  121. package/docs/REFERENCE.md +29 -9
  122. package/docs/SYNC-SYSTEM.md +0 -2
  123. package/package.json +1 -1
  124. package/scripts/persistent-mode.mjs +88 -61
  125. package/scripts/test-mutual-exclusion.ts +3 -3
  126. package/skills/AGENTS.md +59 -44
  127. package/skills/autopilot/SKILL.md +0 -2
  128. package/skills/cancel/SKILL.md +13 -32
  129. package/skills/ecomode/SKILL.md +0 -1
  130. package/skills/hud/SKILL.md +3 -2
  131. package/skills/ralph/SKILL.md +9 -19
  132. package/skills/ultrawork/SKILL.md +0 -1
  133. package/templates/hooks/persistent-mode.mjs +78 -40
  134. package/agents/AGENTS.md +0 -144
  135. package/dist/hooks/clear-suggestions/constants.d.ts +0 -54
  136. package/dist/hooks/clear-suggestions/constants.d.ts.map +0 -1
  137. package/dist/hooks/clear-suggestions/constants.js +0 -102
  138. package/dist/hooks/clear-suggestions/constants.js.map +0 -1
  139. package/dist/hooks/clear-suggestions/index.d.ts +0 -61
  140. package/dist/hooks/clear-suggestions/index.d.ts.map +0 -1
  141. package/dist/hooks/clear-suggestions/index.js +0 -282
  142. package/dist/hooks/clear-suggestions/index.js.map +0 -1
  143. package/dist/hooks/clear-suggestions/triggers.d.ts +0 -65
  144. package/dist/hooks/clear-suggestions/triggers.d.ts.map +0 -1
  145. package/dist/hooks/clear-suggestions/triggers.js +0 -222
  146. package/dist/hooks/clear-suggestions/triggers.js.map +0 -1
  147. package/dist/hooks/clear-suggestions/types.d.ts +0 -92
  148. package/dist/hooks/clear-suggestions/types.d.ts.map +0 -1
  149. package/dist/hooks/clear-suggestions/types.js +0 -9
  150. package/dist/hooks/clear-suggestions/types.js.map +0 -1
@@ -1,61 +0,0 @@
1
- /**
2
- * Clear Suggestions Hook
3
- *
4
- * Adaptive /clear suggestions system that intelligently recommends session
5
- * resets when it would improve reliability and performance.
6
- *
7
- * Features:
8
- * - 5 semantic triggers for context-aware suggestions
9
- * - 5-minute cooldown between suggestions
10
- * - Maximum 2 suggestions per session
11
- * - Non-intrusive messaging explaining WHY clearing helps
12
- * - Lists preserved artifacts (plans, notes, decisions)
13
- *
14
- * Complements (doesn't replace) existing /compact suggestions.
15
- */
16
- import type { ClearSuggestionState, ClearSuggestionConfig, ClearSuggestionResult, ClearSuggestionInput } from './types.js';
17
- /**
18
- * Main check function - evaluates all triggers and returns suggestion if appropriate
19
- */
20
- export declare function checkClearSuggestion(input: ClearSuggestionInput, config?: ClearSuggestionConfig): ClearSuggestionResult;
21
- /**
22
- * Mark planning as just completed (called by plan/ralplan skills)
23
- */
24
- export declare function markPlanningComplete(sessionId: string): void;
25
- /**
26
- * Reset session state (called on /clear)
27
- */
28
- export declare function resetClearSuggestionState(sessionId: string): void;
29
- /**
30
- * Get current session stats (for debugging)
31
- */
32
- export declare function getClearSuggestionStats(sessionId: string): ClearSuggestionState | null;
33
- /**
34
- * Clean up stale sessions (older than 30 minutes)
35
- */
36
- export declare function cleanupStaleSessions(): void;
37
- /**
38
- * Create a clear suggestion hook instance
39
- */
40
- export declare function createClearSuggestionHook(config?: ClearSuggestionConfig): {
41
- /**
42
- * PostToolUse - Check if we should suggest /clear
43
- */
44
- postToolUse: (input: {
45
- tool_name: string;
46
- session_id: string;
47
- directory: string;
48
- tool_response?: string;
49
- context_usage_ratio?: number;
50
- }) => string | null;
51
- /**
52
- * Stop event - Reset failure tracking
53
- */
54
- stop: (input: {
55
- session_id: string;
56
- }) => void;
57
- };
58
- export type { ClearSuggestionTrigger, ClearSuggestionState, ClearSuggestionConfig, ClearSuggestionResult, ClearSuggestionInput, PreservedArtifact, } from './types.js';
59
- export { CLEAR_SUGGESTION_COOLDOWN_MS, MAX_CLEAR_SUGGESTIONS, CONTEXT_THRESHOLD, FAILURE_THRESHOLD, } from './constants.js';
60
- export { detectWorkflowComplete, detectArchitectVerified, detectPlanningComplete, detectContextWithArtifacts, detectDegradationSignals, isToolFailure, discoverPreservedArtifacts, checkModeJustCompleted, checkArchitectJustVerified, } from './triggers.js';
61
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAEV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AA8JpB;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,CAAC,EAAE,qBAAqB,GAC7B,qBAAqB,CAmGvB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAEtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAS3C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,qBAAqB;IAEpE;;OAEG;yBACkB;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,KAAG,MAAM,GAAG,IAAI;IAmBjB;;OAEG;kBACW;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,KAAG,IAAI;EAI9C;AAGD,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,0BAA0B,EAC1B,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC"}
@@ -1,282 +0,0 @@
1
- /**
2
- * Clear Suggestions Hook
3
- *
4
- * Adaptive /clear suggestions system that intelligently recommends session
5
- * resets when it would improve reliability and performance.
6
- *
7
- * Features:
8
- * - 5 semantic triggers for context-aware suggestions
9
- * - 5-minute cooldown between suggestions
10
- * - Maximum 2 suggestions per session
11
- * - Non-intrusive messaging explaining WHY clearing helps
12
- * - Lists preserved artifacts (plans, notes, decisions)
13
- *
14
- * Complements (doesn't replace) existing /compact suggestions.
15
- */
16
- import { CLEAR_SUGGESTION_COOLDOWN_MS, MAX_CLEAR_SUGGESTIONS, WORKFLOW_COMPLETE_MESSAGE, ARCHITECT_VERIFIED_MESSAGE, PLANNING_COMPLETE_MESSAGE, CONTEXT_ARTIFACTS_MESSAGE, DEGRADATION_SIGNALS_MESSAGE, formatPreservedArtifacts, } from './constants.js';
17
- import { detectWorkflowComplete, detectArchitectVerified, detectPlanningComplete, detectContextWithArtifacts, detectDegradationSignals, isToolFailure, discoverPreservedArtifacts, checkModeJustCompleted, checkArchitectJustVerified, } from './triggers.js';
18
- import { isAnyModeActive } from '../mode-registry/index.js';
19
- /**
20
- * In-memory session state tracking
21
- */
22
- const sessionStates = new Map();
23
- /**
24
- * Get or create session state
25
- */
26
- function getSessionState(sessionId) {
27
- let state = sessionStates.get(sessionId);
28
- if (!state) {
29
- state = {
30
- sessionId,
31
- lastSuggestionTime: 0,
32
- suggestionCount: 0,
33
- consecutiveFailures: 0,
34
- failureTimestamps: [],
35
- };
36
- sessionStates.set(sessionId, state);
37
- }
38
- return state;
39
- }
40
- /**
41
- * Update session state
42
- */
43
- function updateSessionState(sessionId, updates) {
44
- const state = getSessionState(sessionId);
45
- Object.assign(state, updates);
46
- }
47
- /**
48
- * Record a suggestion was shown
49
- */
50
- function recordSuggestion(sessionId) {
51
- const state = getSessionState(sessionId);
52
- state.lastSuggestionTime = Date.now();
53
- state.suggestionCount++;
54
- // Clear one-time flags
55
- state.workflowJustCompleted = undefined;
56
- state.architectJustVerified = undefined;
57
- state.planningJustCompleted = undefined;
58
- }
59
- /**
60
- * Record a tool failure
61
- */
62
- function recordFailure(sessionId) {
63
- const state = getSessionState(sessionId);
64
- state.consecutiveFailures++;
65
- state.failureTimestamps.push(Date.now());
66
- // Keep only recent timestamps (last 10)
67
- if (state.failureTimestamps.length > 10) {
68
- state.failureTimestamps = state.failureTimestamps.slice(-10);
69
- }
70
- }
71
- /**
72
- * Reset failure count (called on successful tool execution)
73
- */
74
- function resetFailures(sessionId) {
75
- const state = getSessionState(sessionId);
76
- state.consecutiveFailures = 0;
77
- }
78
- /**
79
- * Check if cooldown has elapsed
80
- */
81
- function isCooldownElapsed(sessionId, config) {
82
- const state = getSessionState(sessionId);
83
- const cooldownMs = config?.cooldownMs ?? CLEAR_SUGGESTION_COOLDOWN_MS;
84
- const elapsed = Date.now() - state.lastSuggestionTime;
85
- return elapsed >= cooldownMs;
86
- }
87
- /**
88
- * Check if max suggestions reached
89
- */
90
- function isMaxSuggestionsReached(sessionId, config) {
91
- const state = getSessionState(sessionId);
92
- const maxSuggestions = config?.maxSuggestions ?? MAX_CLEAR_SUGGESTIONS;
93
- return state.suggestionCount >= maxSuggestions;
94
- }
95
- /**
96
- * Generate message for a trigger
97
- */
98
- function generateMessage(trigger, artifacts, state, contextUsageRatio) {
99
- const artifactsText = formatPreservedArtifacts(artifacts.map(a => ({ type: a.type, description: a.description })));
100
- switch (trigger) {
101
- case 'workflow_complete': {
102
- const modeName = state.workflowJustCompleted || 'workflow';
103
- const modeDisplayNames = {
104
- ralph: 'Ralph',
105
- autopilot: 'Autopilot',
106
- ultrawork: 'Ultrawork',
107
- ultraqa: 'UltraQA',
108
- ultrapilot: 'Ultrapilot',
109
- swarm: 'Swarm',
110
- pipeline: 'Pipeline',
111
- ecomode: 'Ecomode',
112
- };
113
- const displayName = modeDisplayNames[modeName] || modeName;
114
- return WORKFLOW_COMPLETE_MESSAGE(displayName, artifactsText);
115
- }
116
- case 'architect_verified':
117
- return ARCHITECT_VERIFIED_MESSAGE(artifactsText);
118
- case 'planning_complete':
119
- return PLANNING_COMPLETE_MESSAGE(artifactsText);
120
- case 'context_artifacts': {
121
- const usagePct = Math.round((contextUsageRatio ?? 0.5) * 100);
122
- return CONTEXT_ARTIFACTS_MESSAGE(usagePct, artifactsText);
123
- }
124
- case 'degradation_signals': {
125
- const failureCount = state.consecutiveFailures;
126
- return DEGRADATION_SIGNALS_MESSAGE(failureCount, artifactsText);
127
- }
128
- default:
129
- return '';
130
- }
131
- }
132
- /**
133
- * Main check function - evaluates all triggers and returns suggestion if appropriate
134
- */
135
- export function checkClearSuggestion(input, config) {
136
- const { sessionId, directory, toolName, toolOutput, contextUsageRatio } = input;
137
- // Check if disabled
138
- if (config?.enabled === false) {
139
- return { shouldSuggest: false, skipReason: 'disabled' };
140
- }
141
- // Don't suggest /clear while an OMC mode is actively running
142
- // Only suggest after the mode completes
143
- if (isAnyModeActive(directory)) {
144
- return { shouldSuggest: false, skipReason: 'mode_active' };
145
- }
146
- // Check max suggestions
147
- if (isMaxSuggestionsReached(sessionId, config)) {
148
- return { shouldSuggest: false, skipReason: 'max_suggestions_reached' };
149
- }
150
- // Check cooldown
151
- if (!isCooldownElapsed(sessionId, config)) {
152
- return { shouldSuggest: false, skipReason: 'cooldown_active' };
153
- }
154
- // Get session state
155
- const state = getSessionState(sessionId);
156
- // Track tool failures/successes
157
- if (toolName && toolOutput) {
158
- if (isToolFailure(toolName, toolOutput)) {
159
- recordFailure(sessionId);
160
- }
161
- else {
162
- resetFailures(sessionId);
163
- }
164
- }
165
- // Check for mode completions
166
- const completedModes = ['ralph', 'autopilot', 'ultrawork', 'ultraqa'];
167
- for (const mode of completedModes) {
168
- if (checkModeJustCompleted(directory, mode)) {
169
- updateSessionState(sessionId, { workflowJustCompleted: mode });
170
- break;
171
- }
172
- }
173
- // Check for architect verification
174
- if (checkArchitectJustVerified(directory)) {
175
- updateSessionState(sessionId, { architectJustVerified: true });
176
- }
177
- // Discover preserved artifacts
178
- const artifacts = discoverPreservedArtifacts(directory);
179
- // Evaluate triggers in priority order
180
- // Priority: workflow_complete > architect_verified > planning_complete > context_artifacts > degradation_signals
181
- let trigger = null;
182
- // 1. Workflow complete (highest priority - clear win)
183
- trigger = detectWorkflowComplete(state);
184
- if (trigger) {
185
- const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
186
- recordSuggestion(sessionId);
187
- return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
188
- }
189
- // 2. Architect verified
190
- trigger = detectArchitectVerified(state);
191
- if (trigger) {
192
- const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
193
- recordSuggestion(sessionId);
194
- return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
195
- }
196
- // 3. Planning complete
197
- trigger = detectPlanningComplete(state);
198
- if (trigger) {
199
- const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
200
- recordSuggestion(sessionId);
201
- return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
202
- }
203
- // 4. Context >50% with artifacts
204
- trigger = detectContextWithArtifacts(contextUsageRatio, artifacts, config);
205
- if (trigger) {
206
- const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
207
- recordSuggestion(sessionId);
208
- return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
209
- }
210
- // 5. Degradation signals (lowest priority - only if nothing else triggered)
211
- trigger = detectDegradationSignals(state, config);
212
- if (trigger) {
213
- const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
214
- recordSuggestion(sessionId);
215
- return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
216
- }
217
- return { shouldSuggest: false, skipReason: 'no_triggers_fired' };
218
- }
219
- /**
220
- * Mark planning as just completed (called by plan/ralplan skills)
221
- */
222
- export function markPlanningComplete(sessionId) {
223
- updateSessionState(sessionId, { planningJustCompleted: true });
224
- }
225
- /**
226
- * Reset session state (called on /clear)
227
- */
228
- export function resetClearSuggestionState(sessionId) {
229
- sessionStates.delete(sessionId);
230
- }
231
- /**
232
- * Get current session stats (for debugging)
233
- */
234
- export function getClearSuggestionStats(sessionId) {
235
- return sessionStates.get(sessionId) ?? null;
236
- }
237
- /**
238
- * Clean up stale sessions (older than 30 minutes)
239
- */
240
- export function cleanupStaleSessions() {
241
- const now = Date.now();
242
- const maxAge = 30 * 60 * 1000; // 30 minutes
243
- for (const [sessionId, state] of sessionStates) {
244
- if (state.lastSuggestionTime > 0 && now - state.lastSuggestionTime > maxAge) {
245
- sessionStates.delete(sessionId);
246
- }
247
- }
248
- }
249
- /**
250
- * Create a clear suggestion hook instance
251
- */
252
- export function createClearSuggestionHook(config) {
253
- return {
254
- /**
255
- * PostToolUse - Check if we should suggest /clear
256
- */
257
- postToolUse: (input) => {
258
- const result = checkClearSuggestion({
259
- sessionId: input.session_id,
260
- directory: input.directory,
261
- toolName: input.tool_name,
262
- toolOutput: input.tool_response,
263
- contextUsageRatio: input.context_usage_ratio,
264
- }, config);
265
- if (result.shouldSuggest && result.message) {
266
- return result.message;
267
- }
268
- return null;
269
- },
270
- /**
271
- * Stop event - Reset failure tracking
272
- */
273
- stop: (input) => {
274
- resetFailures(input.session_id);
275
- },
276
- };
277
- }
278
- // Re-export constants
279
- export { CLEAR_SUGGESTION_COOLDOWN_MS, MAX_CLEAR_SUGGESTIONS, CONTEXT_THRESHOLD, FAILURE_THRESHOLD, } from './constants.js';
280
- // Re-export trigger functions for testing
281
- export { detectWorkflowComplete, detectArchitectVerified, detectPlanningComplete, detectContextWithArtifacts, detectDegradationSignals, isToolFailure, discoverPreservedArtifacts, checkModeJustCompleted, checkArchitectJustVerified, } from './triggers.js';
282
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/index.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- /**
2
- * Clear Suggestions Trigger Detection
3
- *
4
- * Implements the 5 semantic triggers that determine when to suggest /clear:
5
- * 1. Workflow complete - ralph/autopilot/ultrawork finished
6
- * 2. Architect verified - architect approval passed
7
- * 3. Planning complete - ralplan/plan skill completed
8
- * 4. Context >50% + artifacts - high context but plan files exist
9
- * 5. Degradation signals - 3+ consecutive failures
10
- */
11
- import type { ClearSuggestionTrigger, ClearSuggestionState, ClearSuggestionConfig, PreservedArtifact } from './types.js';
12
- /**
13
- * Detect if a workflow (ralph/autopilot/ultrawork) just completed.
14
- *
15
- * Checks state files for modes that transitioned from active to inactive
16
- * within the current hook call.
17
- */
18
- export declare function detectWorkflowComplete(state: ClearSuggestionState): ClearSuggestionTrigger | null;
19
- /**
20
- * Detect if architect verification just passed.
21
- *
22
- * Reads ralph verification state to see if architect approved.
23
- */
24
- export declare function detectArchitectVerified(state: ClearSuggestionState): ClearSuggestionTrigger | null;
25
- /**
26
- * Detect if planning just completed.
27
- *
28
- * Checks if a plan skill or ralplan skill just finished.
29
- */
30
- export declare function detectPlanningComplete(state: ClearSuggestionState): ClearSuggestionTrigger | null;
31
- /**
32
- * Detect if context is above threshold and artifacts exist to reload.
33
- *
34
- * This trigger fires when context is high but the user has saved artifacts
35
- * (plans, PRDs, notes) that would automatically reload after /clear.
36
- */
37
- export declare function detectContextWithArtifacts(contextUsageRatio: number | undefined, artifacts: PreservedArtifact[], config?: ClearSuggestionConfig): ClearSuggestionTrigger | null;
38
- /**
39
- * Detect degradation signals from consecutive failures.
40
- *
41
- * Tracks recent tool failures and triggers when the threshold is exceeded.
42
- */
43
- export declare function detectDegradationSignals(state: ClearSuggestionState, config?: ClearSuggestionConfig): ClearSuggestionTrigger | null;
44
- /**
45
- * Check if a tool output indicates a failure
46
- */
47
- export declare function isToolFailure(toolName: string, toolOutput: string): boolean;
48
- /**
49
- * Discover preserved artifacts in the project directory.
50
- *
51
- * Scans for plans, PRDs, specs, progress files, notepads, and wisdom files
52
- * that would survive a /clear and be available in the new session.
53
- */
54
- export declare function discoverPreservedArtifacts(directory: string): PreservedArtifact[];
55
- /**
56
- * Check if a mode just completed by comparing current state with previous state.
57
- *
58
- * Reads mode state files to detect transitions from active to inactive.
59
- */
60
- export declare function checkModeJustCompleted(directory: string, modeName: string): boolean;
61
- /**
62
- * Check if architect verification just passed
63
- */
64
- export declare function checkArchitectJustVerified(directory: string): boolean;
65
- //# sourceMappingURL=triggers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGzH;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,GAC1B,sBAAsB,GAAG,IAAI,CAK/B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,sBAAsB,GAAG,IAAI,CAK/B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,GAC1B,sBAAsB,GAAG,IAAI,CAK/B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,MAAM,CAAC,EAAE,qBAAqB,GAC7B,sBAAsB,GAAG,IAAI,CAa/B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,CAAC,EAAE,qBAAqB,GAC7B,sBAAsB,GAAG,IAAI,CAc/B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAyC3E;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwCjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAsCT;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAmBrE"}
@@ -1,222 +0,0 @@
1
- /**
2
- * Clear Suggestions Trigger Detection
3
- *
4
- * Implements the 5 semantic triggers that determine when to suggest /clear:
5
- * 1. Workflow complete - ralph/autopilot/ultrawork finished
6
- * 2. Architect verified - architect approval passed
7
- * 3. Planning complete - ralplan/plan skill completed
8
- * 4. Context >50% + artifacts - high context but plan files exist
9
- * 5. Degradation signals - 3+ consecutive failures
10
- */
11
- import { existsSync, readFileSync } from 'fs';
12
- import { join } from 'path';
13
- import { CONTEXT_THRESHOLD, FAILURE_THRESHOLD, FAILURE_WINDOW_MS } from './constants.js';
14
- /**
15
- * Detect if a workflow (ralph/autopilot/ultrawork) just completed.
16
- *
17
- * Checks state files for modes that transitioned from active to inactive
18
- * within the current hook call.
19
- */
20
- export function detectWorkflowComplete(state) {
21
- if (state.workflowJustCompleted) {
22
- return 'workflow_complete';
23
- }
24
- return null;
25
- }
26
- /**
27
- * Detect if architect verification just passed.
28
- *
29
- * Reads ralph verification state to see if architect approved.
30
- */
31
- export function detectArchitectVerified(state) {
32
- if (state.architectJustVerified) {
33
- return 'architect_verified';
34
- }
35
- return null;
36
- }
37
- /**
38
- * Detect if planning just completed.
39
- *
40
- * Checks if a plan skill or ralplan skill just finished.
41
- */
42
- export function detectPlanningComplete(state) {
43
- if (state.planningJustCompleted) {
44
- return 'planning_complete';
45
- }
46
- return null;
47
- }
48
- /**
49
- * Detect if context is above threshold and artifacts exist to reload.
50
- *
51
- * This trigger fires when context is high but the user has saved artifacts
52
- * (plans, PRDs, notes) that would automatically reload after /clear.
53
- */
54
- export function detectContextWithArtifacts(contextUsageRatio, artifacts, config) {
55
- const threshold = config?.contextThreshold ?? CONTEXT_THRESHOLD;
56
- if (contextUsageRatio === undefined || contextUsageRatio < threshold) {
57
- return null;
58
- }
59
- // Only suggest if there are artifacts to reload
60
- if (artifacts.length === 0) {
61
- return null;
62
- }
63
- return 'context_artifacts';
64
- }
65
- /**
66
- * Detect degradation signals from consecutive failures.
67
- *
68
- * Tracks recent tool failures and triggers when the threshold is exceeded.
69
- */
70
- export function detectDegradationSignals(state, config) {
71
- const threshold = config?.failureThreshold ?? FAILURE_THRESHOLD;
72
- const now = Date.now();
73
- // Filter to recent failures only
74
- const recentFailures = state.failureTimestamps.filter(ts => now - ts < FAILURE_WINDOW_MS);
75
- if (recentFailures.length >= threshold) {
76
- return 'degradation_signals';
77
- }
78
- return null;
79
- }
80
- /**
81
- * Check if a tool output indicates a failure
82
- */
83
- export function isToolFailure(toolName, toolOutput) {
84
- if (!toolOutput)
85
- return false;
86
- const output = toolOutput.toLowerCase();
87
- // Bash failures
88
- if (toolName === 'Bash' || toolName === 'bash') {
89
- const failurePatterns = [
90
- /error:/i,
91
- /failed/i,
92
- /exit code: [1-9]/i,
93
- /exit status [1-9]/i,
94
- /fatal:/i,
95
- /command not found/i,
96
- ];
97
- return failurePatterns.some(p => p.test(toolOutput));
98
- }
99
- // Edit failures
100
- if (toolName === 'Edit' || toolName === 'edit') {
101
- const editFailures = [
102
- 'old_string not found',
103
- 'not unique',
104
- 'no match',
105
- 'failed to edit',
106
- ];
107
- return editFailures.some(f => output.includes(f));
108
- }
109
- // Task failures
110
- if (toolName === 'Task' || toolName === 'task') {
111
- const taskFailures = [
112
- 'error',
113
- 'failed',
114
- 'timeout',
115
- 'agent error',
116
- ];
117
- return taskFailures.some(f => output.includes(f));
118
- }
119
- return false;
120
- }
121
- /**
122
- * Discover preserved artifacts in the project directory.
123
- *
124
- * Scans for plans, PRDs, specs, progress files, notepads, and wisdom files
125
- * that would survive a /clear and be available in the new session.
126
- */
127
- export function discoverPreservedArtifacts(directory) {
128
- const artifacts = [];
129
- const candidates = [
130
- // Plans
131
- { type: 'plan', relativePath: '.omc/plans', description: 'Implementation plans (.omc/plans/)' },
132
- // PRD
133
- { type: 'prd', relativePath: '.omc/prd.json', description: 'Product Requirements Document (.omc/prd.json)' },
134
- { type: 'prd', relativePath: 'prd.json', description: 'Product Requirements Document (prd.json)' },
135
- // Spec
136
- { type: 'spec', relativePath: '.omc/autopilot/spec.md', description: 'Autopilot specification (.omc/autopilot/spec.md)' },
137
- // Progress
138
- { type: 'progress', relativePath: '.omc/progress.txt', description: 'Progress log (.omc/progress.txt)' },
139
- { type: 'progress', relativePath: 'progress.txt', description: 'Progress log (progress.txt)' },
140
- // Notepad
141
- { type: 'notepad', relativePath: '.omc/notepad.md', description: 'Notepad memory (.omc/notepad.md)' },
142
- // Wisdom files
143
- { type: 'learning', relativePath: '.omc/notepads', description: 'Wisdom entries (.omc/notepads/)' },
144
- // AGENTS.md
145
- { type: 'decision', relativePath: 'AGENTS.md', description: 'Agent documentation (AGENTS.md)' },
146
- // CLAUDE.md
147
- { type: 'decision', relativePath: '.claude/CLAUDE.md', description: 'Project instructions (.claude/CLAUDE.md)' },
148
- ];
149
- for (const candidate of candidates) {
150
- const fullPath = join(directory, candidate.relativePath);
151
- if (existsSync(fullPath)) {
152
- artifacts.push({
153
- type: candidate.type,
154
- path: fullPath,
155
- description: candidate.description,
156
- });
157
- }
158
- }
159
- return artifacts;
160
- }
161
- /**
162
- * Check if a mode just completed by comparing current state with previous state.
163
- *
164
- * Reads mode state files to detect transitions from active to inactive.
165
- */
166
- export function checkModeJustCompleted(directory, modeName) {
167
- const stateDir = join(directory, '.omc', 'state');
168
- // Map mode names to their state files
169
- const stateFiles = {
170
- ralph: 'ralph-state.json',
171
- autopilot: 'autopilot-state.json',
172
- ultrawork: 'ultrawork-state.json',
173
- ultraqa: 'ultraqa-state.json',
174
- };
175
- const stateFile = stateFiles[modeName];
176
- if (!stateFile)
177
- return false;
178
- const filePath = join(stateDir, stateFile);
179
- if (!existsSync(filePath))
180
- return false;
181
- try {
182
- const content = readFileSync(filePath, 'utf-8');
183
- const state = JSON.parse(content);
184
- // Check for completed state: active=false with a completed_at timestamp
185
- if (state.active === false && state.completed_at) {
186
- // Only trigger if completed recently (within last 30 seconds)
187
- const completedAt = new Date(state.completed_at).getTime();
188
- const age = Date.now() - completedAt;
189
- return age < 30_000;
190
- }
191
- // For autopilot, check phase === 'complete'
192
- if (state.phase === 'complete' && state.active === false) {
193
- return true;
194
- }
195
- }
196
- catch {
197
- // State file unreadable
198
- }
199
- return false;
200
- }
201
- /**
202
- * Check if architect verification just passed
203
- */
204
- export function checkArchitectJustVerified(directory) {
205
- const verificationFile = join(directory, '.omc', 'state', 'ralph-verification.json');
206
- if (!existsSync(verificationFile))
207
- return false;
208
- try {
209
- const content = readFileSync(verificationFile, 'utf-8');
210
- const state = JSON.parse(content);
211
- if (state.status === 'approved' && state.completed_at) {
212
- const completedAt = new Date(state.completed_at).getTime();
213
- const age = Date.now() - completedAt;
214
- return age < 30_000;
215
- }
216
- }
217
- catch {
218
- // Verification file unreadable
219
- }
220
- return false;
221
- }
222
- //# sourceMappingURL=triggers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/triggers.ts"],"names":[],"mappings":"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"}