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,82 @@
1
+ /**
2
+ * PreCompact Hook - State Preservation Before Context Compaction
3
+ *
4
+ * Creates checkpoints before compaction to preserve critical state including:
5
+ * - Active mode states (autopilot, ralph, ultrawork, swarm)
6
+ * - TODO summary
7
+ * - Wisdom from notepads
8
+ *
9
+ * This ensures no critical information is lost during context window compaction.
10
+ */
11
+ export interface PreCompactInput {
12
+ session_id: string;
13
+ transcript_path: string;
14
+ cwd: string;
15
+ permission_mode: string;
16
+ hook_event_name: 'PreCompact';
17
+ trigger: 'manual' | 'auto';
18
+ custom_instructions?: string;
19
+ }
20
+ export interface CompactCheckpoint {
21
+ created_at: string;
22
+ trigger: 'manual' | 'auto';
23
+ active_modes: {
24
+ autopilot?: {
25
+ phase: string;
26
+ originalIdea: string;
27
+ };
28
+ ralph?: {
29
+ iteration: number;
30
+ prompt: string;
31
+ };
32
+ ultrawork?: {
33
+ original_prompt: string;
34
+ };
35
+ swarm?: {
36
+ session_id: string;
37
+ task_count: number;
38
+ };
39
+ };
40
+ todo_summary: {
41
+ pending: number;
42
+ in_progress: number;
43
+ completed: number;
44
+ };
45
+ wisdom_exported: boolean;
46
+ }
47
+ export interface HookOutput {
48
+ continue: boolean;
49
+ hookSpecificOutput: {
50
+ hookEventName: 'PreCompact';
51
+ additionalContext: string;
52
+ };
53
+ }
54
+ /**
55
+ * Get the checkpoint directory path
56
+ */
57
+ export declare function getCheckpointPath(directory: string): string;
58
+ /**
59
+ * Export wisdom from notepads to checkpoint
60
+ */
61
+ export declare function exportWisdomToNotepad(directory: string): Promise<{
62
+ wisdom: string;
63
+ exported: boolean;
64
+ }>;
65
+ /**
66
+ * Save summary of active modes
67
+ */
68
+ export declare function saveModeSummary(directory: string): Record<string, unknown>;
69
+ /**
70
+ * Create a compact checkpoint
71
+ */
72
+ export declare function createCompactCheckpoint(directory: string, trigger: 'manual' | 'auto'): CompactCheckpoint;
73
+ /**
74
+ * Format checkpoint summary for context injection
75
+ */
76
+ export declare function formatCompactSummary(checkpoint: CompactCheckpoint): string;
77
+ /**
78
+ * Main handler for PreCompact hook
79
+ */
80
+ export declare function processPreCompact(input: PreCompactInput): Promise<HookOutput>;
81
+ export default processPreCompact;
82
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/pre-compact/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,YAAY,CAAC;IAC9B,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,YAAY,EAAE;QACZ,SAAS,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QACpD,KAAK,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,SAAS,CAAC,EAAE;YAAE,eAAe,EAAE,MAAM,CAAA;SAAE,CAAC;QACxC,KAAK,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC;KACpD,CAAC;IACF,YAAY,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE;QAClB,aAAa,EAAE,YAAY,CAAC;QAC5B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAYD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAyC7G;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoE1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,iBAAiB,CAkBxG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAoE1E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAyCnF;AAMD,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,265 @@
1
+ /**
2
+ * PreCompact Hook - State Preservation Before Context Compaction
3
+ *
4
+ * Creates checkpoints before compaction to preserve critical state including:
5
+ * - Active mode states (autopilot, ralph, ultrawork, swarm)
6
+ * - TODO summary
7
+ * - Wisdom from notepads
8
+ *
9
+ * This ensures no critical information is lost during context window compaction.
10
+ */
11
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from 'fs';
12
+ import { join } from 'path';
13
+ // ============================================================================
14
+ // Constants
15
+ // ============================================================================
16
+ const CHECKPOINT_DIR = 'checkpoints';
17
+ // ============================================================================
18
+ // Helper Functions
19
+ // ============================================================================
20
+ /**
21
+ * Get the checkpoint directory path
22
+ */
23
+ export function getCheckpointPath(directory) {
24
+ const checkpointDir = join(directory, '.omc', 'state', CHECKPOINT_DIR);
25
+ if (!existsSync(checkpointDir)) {
26
+ mkdirSync(checkpointDir, { recursive: true });
27
+ }
28
+ return checkpointDir;
29
+ }
30
+ /**
31
+ * Export wisdom from notepads to checkpoint
32
+ */
33
+ export async function exportWisdomToNotepad(directory) {
34
+ const notepadsDir = join(directory, '.omc', 'notepads');
35
+ if (!existsSync(notepadsDir)) {
36
+ return { wisdom: '', exported: false };
37
+ }
38
+ const wisdomParts = [];
39
+ let hasWisdom = false;
40
+ try {
41
+ // Read all plan directories
42
+ const planDirs = readdirSync(notepadsDir).filter(name => {
43
+ const path = join(notepadsDir, name);
44
+ return statSync(path).isDirectory();
45
+ });
46
+ for (const planDir of planDirs) {
47
+ const planPath = join(notepadsDir, planDir);
48
+ const wisdomFiles = ['learnings.md', 'decisions.md', 'issues.md', 'problems.md'];
49
+ for (const wisdomFile of wisdomFiles) {
50
+ const wisdomPath = join(planPath, wisdomFile);
51
+ if (existsSync(wisdomPath)) {
52
+ const content = readFileSync(wisdomPath, 'utf-8').trim();
53
+ if (content) {
54
+ wisdomParts.push(`### ${planDir}/${wisdomFile}\n${content}`);
55
+ hasWisdom = true;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ catch (error) {
62
+ console.error('[PreCompact] Error reading wisdom files:', error);
63
+ }
64
+ const wisdom = wisdomParts.length > 0
65
+ ? `## Plan Wisdom\n\n${wisdomParts.join('\n\n')}`
66
+ : '';
67
+ return { wisdom, exported: hasWisdom };
68
+ }
69
+ /**
70
+ * Save summary of active modes
71
+ */
72
+ export function saveModeSummary(directory) {
73
+ const stateDir = join(directory, '.omc', 'state');
74
+ const modes = {};
75
+ // Check autopilot
76
+ const autopilotPath = join(stateDir, 'autopilot-state.json');
77
+ if (existsSync(autopilotPath)) {
78
+ try {
79
+ const autopilotState = JSON.parse(readFileSync(autopilotPath, 'utf-8'));
80
+ if (autopilotState.active) {
81
+ modes.autopilot = {
82
+ phase: autopilotState.phase || 'unknown',
83
+ originalIdea: autopilotState.originalIdea || ''
84
+ };
85
+ }
86
+ }
87
+ catch (error) {
88
+ console.error('[PreCompact] Error reading autopilot state:', error);
89
+ }
90
+ }
91
+ // Check ralph
92
+ const ralphPath = join(stateDir, 'ralph-state.json');
93
+ if (existsSync(ralphPath)) {
94
+ try {
95
+ const ralphState = JSON.parse(readFileSync(ralphPath, 'utf-8'));
96
+ if (ralphState.active) {
97
+ modes.ralph = {
98
+ iteration: ralphState.iteration || 0,
99
+ prompt: ralphState.originalPrompt || ralphState.prompt || ''
100
+ };
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error('[PreCompact] Error reading ralph state:', error);
105
+ }
106
+ }
107
+ // Check ultrawork
108
+ const ultraworkPath = join(stateDir, 'ultrawork-state.json');
109
+ if (existsSync(ultraworkPath)) {
110
+ try {
111
+ const ultraworkState = JSON.parse(readFileSync(ultraworkPath, 'utf-8'));
112
+ if (ultraworkState.active) {
113
+ modes.ultrawork = {
114
+ original_prompt: ultraworkState.original_prompt || ultraworkState.prompt || ''
115
+ };
116
+ }
117
+ }
118
+ catch (error) {
119
+ console.error('[PreCompact] Error reading ultrawork state:', error);
120
+ }
121
+ }
122
+ // Check swarm (SQLite database)
123
+ const swarmPath = join(stateDir, 'swarm.db');
124
+ if (existsSync(swarmPath)) {
125
+ try {
126
+ const stats = statSync(swarmPath);
127
+ if (stats.size > 0) {
128
+ modes.swarm = {
129
+ session_id: 'active',
130
+ task_count: 0 // Can't read SQLite without a library
131
+ };
132
+ }
133
+ }
134
+ catch (error) {
135
+ console.error('[PreCompact] Error checking swarm state:', error);
136
+ }
137
+ }
138
+ return modes;
139
+ }
140
+ /**
141
+ * Create a compact checkpoint
142
+ */
143
+ export function createCompactCheckpoint(directory, trigger) {
144
+ const activeModes = saveModeSummary(directory);
145
+ // TODO summary - basic implementation
146
+ // In a real implementation, this would read from TodoWrite state
147
+ const todoSummary = {
148
+ pending: 0,
149
+ in_progress: 0,
150
+ completed: 0
151
+ };
152
+ return {
153
+ created_at: new Date().toISOString(),
154
+ trigger,
155
+ active_modes: activeModes,
156
+ todo_summary: todoSummary,
157
+ wisdom_exported: false
158
+ };
159
+ }
160
+ /**
161
+ * Format checkpoint summary for context injection
162
+ */
163
+ export function formatCompactSummary(checkpoint) {
164
+ const lines = [
165
+ '# PreCompact Checkpoint',
166
+ '',
167
+ `Created: ${checkpoint.created_at}`,
168
+ `Trigger: ${checkpoint.trigger}`,
169
+ ''
170
+ ];
171
+ // Active modes
172
+ const modeCount = Object.keys(checkpoint.active_modes).length;
173
+ if (modeCount > 0) {
174
+ lines.push('## Active Modes');
175
+ lines.push('');
176
+ if (checkpoint.active_modes.autopilot) {
177
+ const ap = checkpoint.active_modes.autopilot;
178
+ lines.push(`- **Autopilot** (Phase: ${ap.phase})`);
179
+ lines.push(` Original Idea: ${ap.originalIdea}`);
180
+ }
181
+ if (checkpoint.active_modes.ralph) {
182
+ const ralph = checkpoint.active_modes.ralph;
183
+ lines.push(`- **Ralph** (Iteration: ${ralph.iteration})`);
184
+ lines.push(` Prompt: ${ralph.prompt}`);
185
+ }
186
+ if (checkpoint.active_modes.ultrawork) {
187
+ const uw = checkpoint.active_modes.ultrawork;
188
+ lines.push(`- **Ultrawork**`);
189
+ lines.push(` Prompt: ${uw.original_prompt}`);
190
+ }
191
+ if (checkpoint.active_modes.swarm) {
192
+ const swarm = checkpoint.active_modes.swarm;
193
+ lines.push(`- **Swarm** (Session: ${swarm.session_id}, Tasks: ${swarm.task_count})`);
194
+ }
195
+ lines.push('');
196
+ }
197
+ // TODO summary
198
+ const total = checkpoint.todo_summary.pending +
199
+ checkpoint.todo_summary.in_progress +
200
+ checkpoint.todo_summary.completed;
201
+ if (total > 0) {
202
+ lines.push('## TODO Summary');
203
+ lines.push('');
204
+ lines.push(`- Pending: ${checkpoint.todo_summary.pending}`);
205
+ lines.push(`- In Progress: ${checkpoint.todo_summary.in_progress}`);
206
+ lines.push(`- Completed: ${checkpoint.todo_summary.completed}`);
207
+ lines.push('');
208
+ }
209
+ // Wisdom status
210
+ if (checkpoint.wisdom_exported) {
211
+ lines.push('## Wisdom');
212
+ lines.push('');
213
+ lines.push('Plan wisdom has been preserved in checkpoint.');
214
+ lines.push('');
215
+ }
216
+ lines.push('---');
217
+ lines.push('**Note:** This checkpoint preserves critical state before compaction.');
218
+ lines.push('Review active modes to ensure continuity after compaction.');
219
+ return lines.join('\n');
220
+ }
221
+ /**
222
+ * Main handler for PreCompact hook
223
+ */
224
+ export async function processPreCompact(input) {
225
+ const directory = input.cwd;
226
+ // Create checkpoint
227
+ const checkpoint = createCompactCheckpoint(directory, input.trigger);
228
+ // Export wisdom
229
+ const { wisdom, exported } = await exportWisdomToNotepad(directory);
230
+ checkpoint.wisdom_exported = exported;
231
+ // Save checkpoint
232
+ const checkpointPath = getCheckpointPath(directory);
233
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
234
+ const checkpointFile = join(checkpointPath, `checkpoint-${timestamp}.json`);
235
+ try {
236
+ writeFileSync(checkpointFile, JSON.stringify(checkpoint, null, 2), 'utf-8');
237
+ }
238
+ catch (error) {
239
+ console.error('[PreCompact] Error saving checkpoint:', error);
240
+ }
241
+ // Save wisdom separately if exported
242
+ if (exported && wisdom) {
243
+ const wisdomFile = join(checkpointPath, `wisdom-${timestamp}.md`);
244
+ try {
245
+ writeFileSync(wisdomFile, wisdom, 'utf-8');
246
+ }
247
+ catch (error) {
248
+ console.error('[PreCompact] Error saving wisdom:', error);
249
+ }
250
+ }
251
+ // Format summary for context injection
252
+ const summary = formatCompactSummary(checkpoint);
253
+ return {
254
+ continue: true,
255
+ hookSpecificOutput: {
256
+ hookEventName: 'PreCompact',
257
+ additionalContext: summary
258
+ }
259
+ };
260
+ }
261
+ // ============================================================================
262
+ // Exports
263
+ // ============================================================================
264
+ export default processPreCompact;
265
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/pre-compact/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface SessionEndInput {
2
+ session_id: string;
3
+ transcript_path: string;
4
+ cwd: string;
5
+ permission_mode: string;
6
+ hook_event_name: 'SessionEnd';
7
+ reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other';
8
+ }
9
+ export interface SessionMetrics {
10
+ session_id: string;
11
+ started_at?: string;
12
+ ended_at: string;
13
+ reason: string;
14
+ duration_ms?: number;
15
+ agents_spawned: number;
16
+ agents_completed: number;
17
+ modes_used: string[];
18
+ }
19
+ export interface HookOutput {
20
+ continue: boolean;
21
+ }
22
+ /**
23
+ * Record session metrics
24
+ */
25
+ export declare function recordSessionMetrics(directory: string, input: SessionEndInput): SessionMetrics;
26
+ /**
27
+ * Clean up transient state files
28
+ */
29
+ export declare function cleanupTransientState(directory: string): number;
30
+ /**
31
+ * Export session summary to .omc/sessions/
32
+ */
33
+ export declare function exportSessionSummary(directory: string, metrics: SessionMetrics): void;
34
+ /**
35
+ * Process session end
36
+ */
37
+ export declare function processSessionEnd(input: SessionEndInput): HookOutput;
38
+ /**
39
+ * Main hook entry point
40
+ */
41
+ export declare function handleSessionEnd(input: SessionEndInput): Promise<HookOutput>;
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/session-end/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,YAAY,CAAC;IAC9B,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,mBAAmB,GAAG,OAAO,CAAC;CAC5D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAqFD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,cAAc,CA4B9F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAgE/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAgBrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAUpE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF"}
@@ -0,0 +1,200 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /**
4
+ * Read agent tracking to get spawn/completion counts
5
+ */
6
+ function getAgentCounts(directory) {
7
+ const trackingPath = path.join(directory, '.omc', 'state', 'subagent-tracking.json');
8
+ if (!fs.existsSync(trackingPath)) {
9
+ return { spawned: 0, completed: 0 };
10
+ }
11
+ try {
12
+ const content = fs.readFileSync(trackingPath, 'utf-8');
13
+ const tracking = JSON.parse(content);
14
+ const spawned = tracking.agents?.length || 0;
15
+ const completed = tracking.agents?.filter((a) => a.status === 'completed').length || 0;
16
+ return { spawned, completed };
17
+ }
18
+ catch (error) {
19
+ return { spawned: 0, completed: 0 };
20
+ }
21
+ }
22
+ /**
23
+ * Detect which modes were used during the session
24
+ */
25
+ function getModesUsed(directory) {
26
+ const stateDir = path.join(directory, '.omc', 'state');
27
+ const modes = [];
28
+ if (!fs.existsSync(stateDir)) {
29
+ return modes;
30
+ }
31
+ const modeStateFiles = [
32
+ { file: 'autopilot-state.json', mode: 'autopilot' },
33
+ { file: 'ultrapilot-state.json', mode: 'ultrapilot' },
34
+ { file: 'ralph-state.json', mode: 'ralph' },
35
+ { file: 'ultrawork-state.json', mode: 'ultrawork' },
36
+ { file: 'ecomode-state.json', mode: 'ecomode' },
37
+ { file: 'swarm-state.json', mode: 'swarm' },
38
+ { file: 'pipeline-state.json', mode: 'pipeline' },
39
+ ];
40
+ for (const { file, mode } of modeStateFiles) {
41
+ const statePath = path.join(stateDir, file);
42
+ if (fs.existsSync(statePath)) {
43
+ modes.push(mode);
44
+ }
45
+ }
46
+ return modes;
47
+ }
48
+ /**
49
+ * Get session start time from state files
50
+ */
51
+ function getSessionStartTime(directory) {
52
+ const stateDir = path.join(directory, '.omc', 'state');
53
+ if (!fs.existsSync(stateDir)) {
54
+ return undefined;
55
+ }
56
+ const stateFiles = fs.readdirSync(stateDir).filter(f => f.endsWith('.json'));
57
+ for (const file of stateFiles) {
58
+ try {
59
+ const statePath = path.join(stateDir, file);
60
+ const content = fs.readFileSync(statePath, 'utf-8');
61
+ const state = JSON.parse(content);
62
+ if (state.started_at) {
63
+ return state.started_at;
64
+ }
65
+ }
66
+ catch (error) {
67
+ continue;
68
+ }
69
+ }
70
+ return undefined;
71
+ }
72
+ /**
73
+ * Record session metrics
74
+ */
75
+ export function recordSessionMetrics(directory, input) {
76
+ const endedAt = new Date().toISOString();
77
+ const startedAt = getSessionStartTime(directory);
78
+ const { spawned, completed } = getAgentCounts(directory);
79
+ const modesUsed = getModesUsed(directory);
80
+ const metrics = {
81
+ session_id: input.session_id,
82
+ started_at: startedAt,
83
+ ended_at: endedAt,
84
+ reason: input.reason,
85
+ agents_spawned: spawned,
86
+ agents_completed: completed,
87
+ modes_used: modesUsed,
88
+ };
89
+ // Calculate duration if start time is available
90
+ if (startedAt) {
91
+ try {
92
+ const startTime = new Date(startedAt).getTime();
93
+ const endTime = new Date(endedAt).getTime();
94
+ metrics.duration_ms = endTime - startTime;
95
+ }
96
+ catch (error) {
97
+ // Invalid date, skip duration
98
+ }
99
+ }
100
+ return metrics;
101
+ }
102
+ /**
103
+ * Clean up transient state files
104
+ */
105
+ export function cleanupTransientState(directory) {
106
+ let filesRemoved = 0;
107
+ const omcDir = path.join(directory, '.omc');
108
+ if (!fs.existsSync(omcDir)) {
109
+ return filesRemoved;
110
+ }
111
+ // Remove transient agent tracking
112
+ const trackingPath = path.join(omcDir, 'state', 'subagent-tracking.json');
113
+ if (fs.existsSync(trackingPath)) {
114
+ try {
115
+ fs.unlinkSync(trackingPath);
116
+ filesRemoved++;
117
+ }
118
+ catch (error) {
119
+ // Ignore removal errors
120
+ }
121
+ }
122
+ // Clean stale checkpoints (older than 24 hours)
123
+ const checkpointsDir = path.join(omcDir, 'checkpoints');
124
+ if (fs.existsSync(checkpointsDir)) {
125
+ const now = Date.now();
126
+ const oneDayAgo = now - 24 * 60 * 60 * 1000;
127
+ try {
128
+ const files = fs.readdirSync(checkpointsDir);
129
+ for (const file of files) {
130
+ const filePath = path.join(checkpointsDir, file);
131
+ const stats = fs.statSync(filePath);
132
+ if (stats.mtimeMs < oneDayAgo) {
133
+ fs.unlinkSync(filePath);
134
+ filesRemoved++;
135
+ }
136
+ }
137
+ }
138
+ catch (error) {
139
+ // Ignore cleanup errors
140
+ }
141
+ }
142
+ // Remove .tmp files in .omc/
143
+ const removeTmpFiles = (dir) => {
144
+ try {
145
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
146
+ for (const entry of entries) {
147
+ const fullPath = path.join(dir, entry.name);
148
+ if (entry.isDirectory()) {
149
+ removeTmpFiles(fullPath);
150
+ }
151
+ else if (entry.name.endsWith('.tmp')) {
152
+ fs.unlinkSync(fullPath);
153
+ filesRemoved++;
154
+ }
155
+ }
156
+ }
157
+ catch (error) {
158
+ // Ignore errors
159
+ }
160
+ };
161
+ removeTmpFiles(omcDir);
162
+ return filesRemoved;
163
+ }
164
+ /**
165
+ * Export session summary to .omc/sessions/
166
+ */
167
+ export function exportSessionSummary(directory, metrics) {
168
+ const sessionsDir = path.join(directory, '.omc', 'sessions');
169
+ // Create sessions directory if it doesn't exist
170
+ if (!fs.existsSync(sessionsDir)) {
171
+ fs.mkdirSync(sessionsDir, { recursive: true });
172
+ }
173
+ // Write session summary
174
+ const sessionFile = path.join(sessionsDir, `${metrics.session_id}.json`);
175
+ try {
176
+ fs.writeFileSync(sessionFile, JSON.stringify(metrics, null, 2), 'utf-8');
177
+ }
178
+ catch (error) {
179
+ // Ignore write errors
180
+ }
181
+ }
182
+ /**
183
+ * Process session end
184
+ */
185
+ export function processSessionEnd(input) {
186
+ // Record and export session metrics to disk
187
+ const metrics = recordSessionMetrics(input.cwd, input);
188
+ exportSessionSummary(input.cwd, metrics);
189
+ // Clean up transient state files
190
+ cleanupTransientState(input.cwd);
191
+ // Return simple response - metrics are persisted to .omc/sessions/
192
+ return { continue: true };
193
+ }
194
+ /**
195
+ * Main hook entry point
196
+ */
197
+ export async function handleSessionEnd(input) {
198
+ return processSessionEnd(input);
199
+ }
200
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/session-end/index.ts"],"names":[],"mappings":"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"}