oh-my-claude-sisyphus 3.6.0 → 3.6.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 (49) hide show
  1. package/commands/omc-setup.md +3 -3
  2. package/commands/psm.md +180 -0
  3. package/commands/release.md +1 -1
  4. package/dist/__tests__/analytics/transcript-scanner.test.js +69 -27
  5. package/dist/__tests__/analytics/transcript-scanner.test.js.map +1 -1
  6. package/dist/__tests__/installer.test.js +2 -1
  7. package/dist/__tests__/installer.test.js.map +1 -1
  8. package/dist/analytics/session-manager.d.ts +24 -0
  9. package/dist/analytics/session-manager.d.ts.map +1 -1
  10. package/dist/analytics/session-manager.js +98 -9
  11. package/dist/analytics/session-manager.js.map +1 -1
  12. package/dist/analytics/transcript-scanner.d.ts +9 -8
  13. package/dist/analytics/transcript-scanner.d.ts.map +1 -1
  14. package/dist/analytics/transcript-scanner.js +146 -16
  15. package/dist/analytics/transcript-scanner.js.map +1 -1
  16. package/dist/hooks/empty-message-sanitizer/__tests__/index.test.d.ts +2 -0
  17. package/dist/hooks/empty-message-sanitizer/__tests__/index.test.d.ts.map +1 -0
  18. package/dist/hooks/empty-message-sanitizer/__tests__/index.test.js +416 -0
  19. package/dist/hooks/empty-message-sanitizer/__tests__/index.test.js.map +1 -0
  20. package/dist/hooks/keyword-detector/__tests__/index.test.d.ts +2 -0
  21. package/dist/hooks/keyword-detector/__tests__/index.test.d.ts.map +1 -0
  22. package/dist/hooks/keyword-detector/__tests__/index.test.js +427 -0
  23. package/dist/hooks/keyword-detector/__tests__/index.test.js.map +1 -0
  24. package/dist/hooks/subagent-tracker/index.d.ts +83 -0
  25. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -0
  26. package/dist/hooks/subagent-tracker/index.js +207 -0
  27. package/dist/hooks/subagent-tracker/index.js.map +1 -0
  28. package/dist/hooks/think-mode/__tests__/index.test.d.ts +2 -0
  29. package/dist/hooks/think-mode/__tests__/index.test.d.ts.map +1 -0
  30. package/dist/hooks/think-mode/__tests__/index.test.js +556 -0
  31. package/dist/hooks/think-mode/__tests__/index.test.js.map +1 -0
  32. package/dist/installer/index.d.ts.map +1 -1
  33. package/dist/installer/index.js +8 -0
  34. package/dist/installer/index.js.map +1 -1
  35. package/docs/design/project-session-manager.md +1033 -0
  36. package/package.json +1 -1
  37. package/skills/omc-setup/SKILL.md +27 -3
  38. package/skills/project-session-manager/SKILL.md +410 -0
  39. package/skills/project-session-manager/lib/config.sh +86 -0
  40. package/skills/project-session-manager/lib/parse.sh +121 -0
  41. package/skills/project-session-manager/lib/session.sh +132 -0
  42. package/skills/project-session-manager/lib/tmux.sh +103 -0
  43. package/skills/project-session-manager/lib/worktree.sh +171 -0
  44. package/skills/project-session-manager/psm.sh +629 -0
  45. package/skills/project-session-manager/templates/feature.md +56 -0
  46. package/skills/project-session-manager/templates/issue-fix.md +57 -0
  47. package/skills/project-session-manager/templates/pr-review.md +65 -0
  48. package/skills/project-session-manager/templates/projects.json +19 -0
  49. package/skills/release/SKILL.md +1 -1
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Subagent Tracker Hook
3
+ *
4
+ * Tracks SubagentStart and SubagentStop events to maintain state of active agents.
5
+ * Useful for monitoring parallel execution in ultrapilot, swarm, and other multi-agent modes.
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
8
+ import { join } from 'path';
9
+ // ============================================================================
10
+ // State File Management
11
+ // ============================================================================
12
+ /**
13
+ * Get the path to the subagent tracking state file.
14
+ */
15
+ export function getStateFilePath(directory) {
16
+ return join(directory, '.omc', 'state', 'subagent-tracking.json');
17
+ }
18
+ /**
19
+ * Read the current subagent tracking state.
20
+ */
21
+ export function readTrackingState(directory) {
22
+ const filePath = getStateFilePath(directory);
23
+ if (!existsSync(filePath)) {
24
+ return null;
25
+ }
26
+ try {
27
+ const content = readFileSync(filePath, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch (error) {
31
+ console.error('[subagent-tracker] Failed to read state:', error);
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Write subagent tracking state to disk.
37
+ */
38
+ export function writeTrackingState(directory, state) {
39
+ const filePath = getStateFilePath(directory);
40
+ const stateDir = join(directory, '.omc', 'state');
41
+ if (!existsSync(stateDir)) {
42
+ mkdirSync(stateDir, { recursive: true });
43
+ }
44
+ try {
45
+ writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');
46
+ }
47
+ catch (error) {
48
+ console.error('[subagent-tracker] Failed to write state:', error);
49
+ }
50
+ }
51
+ /**
52
+ * Get or initialize tracking state.
53
+ */
54
+ function getOrInitState(directory) {
55
+ const existing = readTrackingState(directory);
56
+ if (existing) {
57
+ return existing;
58
+ }
59
+ return {
60
+ active_agents: {},
61
+ completed_agents: {},
62
+ total_spawned: 0,
63
+ total_completed: 0,
64
+ };
65
+ }
66
+ // ============================================================================
67
+ // Hook Event Processors
68
+ // ============================================================================
69
+ /**
70
+ * Process SubagentStart event - track new agent spawn.
71
+ */
72
+ export function processSubagentStart(input) {
73
+ const { cwd, agent_id, agent_type } = input;
74
+ try {
75
+ const state = getOrInitState(cwd);
76
+ // Add to active agents
77
+ state.active_agents[agent_id] = {
78
+ agent_id,
79
+ agent_type,
80
+ started_at: new Date().toISOString(),
81
+ };
82
+ state.total_spawned++;
83
+ writeTrackingState(cwd, state);
84
+ return {
85
+ status: 'success',
86
+ message: `Tracking started for agent ${agent_id} (${agent_type})`,
87
+ data: { agent_id, agent_type },
88
+ };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ status: 'error',
93
+ message: `Failed to process SubagentStart: ${error}`,
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * Process SubagentStop event - mark agent as completed.
99
+ */
100
+ export function processSubagentStop(input) {
101
+ const { cwd, agent_id, agent_transcript_path } = input;
102
+ try {
103
+ const state = getOrInitState(cwd);
104
+ // Find the active agent
105
+ const activeAgent = state.active_agents[agent_id];
106
+ if (!activeAgent) {
107
+ return {
108
+ status: 'error',
109
+ message: `Agent ${agent_id} not found in active agents`,
110
+ };
111
+ }
112
+ // Calculate duration
113
+ const startTime = new Date(activeAgent.started_at).getTime();
114
+ const endTime = Date.now();
115
+ const duration_ms = endTime - startTime;
116
+ // Move to completed agents
117
+ state.completed_agents[agent_id] = {
118
+ agent_id,
119
+ agent_type: activeAgent.agent_type,
120
+ duration_ms,
121
+ success: true, // Default to true; could be enhanced with exit code
122
+ output_summary: agent_transcript_path,
123
+ };
124
+ // Remove from active agents
125
+ delete state.active_agents[agent_id];
126
+ state.total_completed++;
127
+ writeTrackingState(cwd, state);
128
+ return {
129
+ status: 'success',
130
+ message: `Agent ${agent_id} completed in ${duration_ms}ms`,
131
+ data: { agent_id, duration_ms },
132
+ };
133
+ }
134
+ catch (error) {
135
+ return {
136
+ status: 'error',
137
+ message: `Failed to process SubagentStop: ${error}`,
138
+ };
139
+ }
140
+ }
141
+ // ============================================================================
142
+ // Utility Functions
143
+ // ============================================================================
144
+ /**
145
+ * Remove agents that have been active for longer than maxAgeMs.
146
+ * Useful for cleaning up stale agents that may have crashed.
147
+ */
148
+ export function cleanupStaleAgents(directory, maxAgeMs = 300000 // 5 minutes default
149
+ ) {
150
+ const state = readTrackingState(directory);
151
+ if (!state) {
152
+ return;
153
+ }
154
+ const now = Date.now();
155
+ let cleaned = 0;
156
+ for (const [agent_id, info] of Object.entries(state.active_agents)) {
157
+ const startTime = new Date(info.started_at).getTime();
158
+ const age = now - startTime;
159
+ if (age > maxAgeMs) {
160
+ // Move to completed as failed
161
+ state.completed_agents[agent_id] = {
162
+ agent_id,
163
+ agent_type: info.agent_type,
164
+ duration_ms: age,
165
+ success: false,
166
+ output_summary: 'Cleaned up as stale',
167
+ };
168
+ delete state.active_agents[agent_id];
169
+ state.total_completed++;
170
+ cleaned++;
171
+ }
172
+ }
173
+ if (cleaned > 0) {
174
+ writeTrackingState(directory, state);
175
+ console.log(`[subagent-tracker] Cleaned up ${cleaned} stale agent(s)`);
176
+ }
177
+ }
178
+ /**
179
+ * Get the count of currently active agents.
180
+ */
181
+ export function getActiveAgentCount(directory) {
182
+ const state = readTrackingState(directory);
183
+ if (!state) {
184
+ return 0;
185
+ }
186
+ return Object.keys(state.active_agents).length;
187
+ }
188
+ /**
189
+ * Get a count of agents by type (both active and completed).
190
+ */
191
+ export function getAgentsByType(directory) {
192
+ const state = readTrackingState(directory);
193
+ if (!state) {
194
+ return {};
195
+ }
196
+ const counts = {};
197
+ // Count active agents
198
+ for (const info of Object.values(state.active_agents)) {
199
+ counts[info.agent_type] = (counts[info.agent_type] || 0) + 1;
200
+ }
201
+ // Count completed agents
202
+ for (const info of Object.values(state.completed_agents)) {
203
+ counts[info.agent_type] = (counts[info.agent_type] || 0) + 1;
204
+ }
205
+ return counts;
206
+ }
207
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/subagent-tracker/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/hooks/think-mode/__tests__/index.test.ts"],"names":[],"mappings":""}