episoda 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/commands/auth.d.ts +22 -0
  2. package/dist/commands/auth.d.ts.map +1 -0
  3. package/dist/commands/auth.js +384 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/dev.d.ts +20 -0
  6. package/dist/commands/dev.d.ts.map +1 -0
  7. package/dist/commands/dev.js +305 -0
  8. package/dist/commands/dev.js.map +1 -0
  9. package/dist/commands/status.d.ts +9 -0
  10. package/dist/commands/status.d.ts.map +1 -0
  11. package/dist/commands/status.js +75 -0
  12. package/dist/commands/status.js.map +1 -0
  13. package/dist/commands/stop.d.ts +17 -0
  14. package/dist/commands/stop.d.ts.map +1 -0
  15. package/dist/commands/stop.js +81 -0
  16. package/dist/commands/stop.js.map +1 -0
  17. package/dist/core/auth.d.ts +26 -0
  18. package/dist/core/auth.d.ts.map +1 -0
  19. package/dist/core/auth.js +113 -0
  20. package/dist/core/auth.js.map +1 -0
  21. package/dist/core/command-protocol.d.ts +262 -0
  22. package/dist/core/command-protocol.d.ts.map +1 -0
  23. package/dist/core/command-protocol.js +13 -0
  24. package/dist/core/command-protocol.js.map +1 -0
  25. package/dist/core/connection-manager.d.ts +58 -0
  26. package/dist/core/connection-manager.d.ts.map +1 -0
  27. package/dist/core/connection-manager.js +215 -0
  28. package/dist/core/connection-manager.js.map +1 -0
  29. package/dist/core/errors.d.ts +18 -0
  30. package/dist/core/errors.d.ts.map +1 -0
  31. package/dist/core/errors.js +55 -0
  32. package/dist/core/errors.js.map +1 -0
  33. package/dist/core/git-executor.d.ts +157 -0
  34. package/dist/core/git-executor.d.ts.map +1 -0
  35. package/dist/core/git-executor.js +1605 -0
  36. package/dist/core/git-executor.js.map +1 -0
  37. package/dist/core/git-parser.d.ts +40 -0
  38. package/dist/core/git-parser.d.ts.map +1 -0
  39. package/dist/core/git-parser.js +194 -0
  40. package/dist/core/git-parser.js.map +1 -0
  41. package/dist/core/git-validator.d.ts +42 -0
  42. package/dist/core/git-validator.d.ts.map +1 -0
  43. package/dist/core/git-validator.js +102 -0
  44. package/dist/core/git-validator.js.map +1 -0
  45. package/dist/core/index.d.ts +17 -0
  46. package/dist/core/index.d.ts.map +1 -0
  47. package/dist/core/index.js +41 -0
  48. package/dist/core/index.js.map +1 -0
  49. package/dist/core/version.d.ts +9 -0
  50. package/dist/core/version.d.ts.map +1 -0
  51. package/dist/core/version.js +19 -0
  52. package/dist/core/version.js.map +1 -0
  53. package/dist/core/websocket-client.d.ts +122 -0
  54. package/dist/core/websocket-client.d.ts.map +1 -0
  55. package/dist/core/websocket-client.js +438 -0
  56. package/dist/core/websocket-client.js.map +1 -0
  57. package/dist/daemon/daemon-manager.d.ts +71 -0
  58. package/dist/daemon/daemon-manager.d.ts.map +1 -0
  59. package/dist/daemon/daemon-manager.js +289 -0
  60. package/dist/daemon/daemon-manager.js.map +1 -0
  61. package/dist/daemon/daemon-process.d.ts +13 -0
  62. package/dist/daemon/daemon-process.d.ts.map +1 -0
  63. package/dist/daemon/daemon-process.js +608 -0
  64. package/dist/daemon/daemon-process.js.map +1 -0
  65. package/dist/daemon/machine-id.d.ts +36 -0
  66. package/dist/daemon/machine-id.d.ts.map +1 -0
  67. package/dist/daemon/machine-id.js +195 -0
  68. package/dist/daemon/machine-id.js.map +1 -0
  69. package/dist/daemon/project-tracker.d.ts +92 -0
  70. package/dist/daemon/project-tracker.d.ts.map +1 -0
  71. package/dist/daemon/project-tracker.js +259 -0
  72. package/dist/daemon/project-tracker.js.map +1 -0
  73. package/dist/dev-wrapper.d.ts +88 -0
  74. package/dist/dev-wrapper.d.ts.map +1 -0
  75. package/dist/dev-wrapper.js +288 -0
  76. package/dist/dev-wrapper.js.map +1 -0
  77. package/dist/framework-detector.d.ts +29 -0
  78. package/dist/framework-detector.d.ts.map +1 -0
  79. package/dist/framework-detector.js +276 -0
  80. package/dist/framework-detector.js.map +1 -0
  81. package/dist/git-helpers/git-credential-helper.d.ts +29 -0
  82. package/dist/git-helpers/git-credential-helper.d.ts.map +1 -0
  83. package/dist/git-helpers/git-credential-helper.js +349 -0
  84. package/dist/git-helpers/git-credential-helper.js.map +1 -0
  85. package/dist/hooks/post-checkout +296 -0
  86. package/dist/hooks/pre-commit +139 -0
  87. package/dist/index.d.ts +8 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +102 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/ipc/ipc-client.d.ts +95 -0
  92. package/dist/ipc/ipc-client.d.ts.map +1 -0
  93. package/dist/ipc/ipc-client.js +204 -0
  94. package/dist/ipc/ipc-client.js.map +1 -0
  95. package/dist/ipc/ipc-server.d.ts +55 -0
  96. package/dist/ipc/ipc-server.d.ts.map +1 -0
  97. package/dist/ipc/ipc-server.js +177 -0
  98. package/dist/ipc/ipc-server.js.map +1 -0
  99. package/dist/output.d.ts +48 -0
  100. package/dist/output.d.ts.map +1 -0
  101. package/dist/output.js +129 -0
  102. package/dist/output.js.map +1 -0
  103. package/dist/utils/port-check.d.ts +15 -0
  104. package/dist/utils/port-check.d.ts.map +1 -0
  105. package/dist/utils/port-check.js +79 -0
  106. package/dist/utils/port-check.js.map +1 -0
  107. package/dist/utils/update-checker.d.ts +23 -0
  108. package/dist/utils/update-checker.d.ts.map +1 -0
  109. package/dist/utils/update-checker.js +95 -0
  110. package/dist/utils/update-checker.js.map +1 -0
  111. package/package.json +51 -0
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ /**
3
+ * Daemon lifecycle management
4
+ *
5
+ * Manages the Episoda daemon process lifecycle:
6
+ * - Spawning daemon in detached mode
7
+ * - Checking daemon status
8
+ * - Stopping daemon gracefully
9
+ * - PID file management
10
+ *
11
+ * Ensures only one daemon runs per user.
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.killAllEpisodaProcesses = killAllEpisodaProcesses;
48
+ exports.getPidFilePath = getPidFilePath;
49
+ exports.isDaemonRunning = isDaemonRunning;
50
+ exports.startDaemon = startDaemon;
51
+ exports.stopDaemon = stopDaemon;
52
+ exports.restartDaemon = restartDaemon;
53
+ exports.getDaemonStatus = getDaemonStatus;
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const child_process_1 = require("child_process");
57
+ const core_1 = require("../core");
58
+ /**
59
+ * EP734: Kill all stale Episoda processes
60
+ *
61
+ * Finds and kills any existing episoda-related processes to ensure
62
+ * a clean slate before starting a new daemon. This prevents:
63
+ * - Multiple daemon processes running simultaneously
64
+ * - Stale `episoda dev` foreground processes from previous sessions
65
+ * - Orphaned node processes running daemon-process.js
66
+ *
67
+ * @returns Number of processes killed
68
+ */
69
+ function killAllEpisodaProcesses() {
70
+ const currentPid = process.pid;
71
+ let killedCount = 0;
72
+ // EP734: Windows not supported for process cleanup - skip with warning
73
+ if (process.platform === 'win32') {
74
+ console.warn('[Cleanup] Process cleanup not supported on Windows - skipping');
75
+ return 0;
76
+ }
77
+ try {
78
+ // Find all episoda-related processes using ps (Unix/macOS only)
79
+ // Patterns: 'episoda dev', 'daemon-process.js', 'episoda status', 'ws-server.js'
80
+ // EP797: Added ws-server.js to catch orphaned WebSocket server processes
81
+ const psOutput = (0, child_process_1.execSync)('ps aux | grep -E "(episoda (dev|status|stop)|daemon-process\\.js|node ws-server\\.js)" | grep -v grep || true', { encoding: 'utf-8', timeout: 5000 });
82
+ const lines = psOutput.trim().split('\n').filter(line => line.length > 0);
83
+ for (const line of lines) {
84
+ // Parse PID from ps aux output (second column)
85
+ const parts = line.trim().split(/\s+/);
86
+ if (parts.length < 2)
87
+ continue;
88
+ const pid = parseInt(parts[1], 10);
89
+ if (isNaN(pid) || pid === currentPid)
90
+ continue;
91
+ try {
92
+ process.kill(pid, 'SIGTERM');
93
+ killedCount++;
94
+ console.log(`[Cleanup] Killed stale process PID ${pid}`);
95
+ }
96
+ catch (err) {
97
+ // Process might have already exited, ignore
98
+ }
99
+ }
100
+ // Give processes a moment to terminate
101
+ if (killedCount > 0) {
102
+ (0, child_process_1.execSync)('sleep 0.5', { timeout: 2000 });
103
+ }
104
+ // Clean up stale files
105
+ const configDir = (0, core_1.getConfigDir)();
106
+ const pidPath = path.join(configDir, 'daemon.pid');
107
+ const sockPath = path.join(configDir, 'daemon.sock');
108
+ if (fs.existsSync(pidPath)) {
109
+ fs.unlinkSync(pidPath);
110
+ }
111
+ if (fs.existsSync(sockPath)) {
112
+ fs.unlinkSync(sockPath);
113
+ }
114
+ }
115
+ catch (error) {
116
+ // Non-fatal - best effort cleanup
117
+ console.warn('[Cleanup] Error during process cleanup:', error instanceof Error ? error.message : error);
118
+ }
119
+ return killedCount;
120
+ }
121
+ /**
122
+ * Get path to daemon PID file
123
+ */
124
+ function getPidFilePath() {
125
+ return path.join((0, core_1.getConfigDir)(), 'daemon.pid');
126
+ }
127
+ /**
128
+ * Check if daemon is running
129
+ *
130
+ * Reads PID from file and checks if process exists.
131
+ *
132
+ * @returns PID if running, null if not
133
+ */
134
+ function isDaemonRunning() {
135
+ const pidPath = getPidFilePath();
136
+ try {
137
+ if (!fs.existsSync(pidPath)) {
138
+ return null;
139
+ }
140
+ const pidStr = fs.readFileSync(pidPath, 'utf-8').trim();
141
+ const pid = parseInt(pidStr, 10);
142
+ if (isNaN(pid)) {
143
+ // Invalid PID, clean up file
144
+ fs.unlinkSync(pidPath);
145
+ return null;
146
+ }
147
+ // Check if process exists
148
+ try {
149
+ // Sending signal 0 checks existence without killing
150
+ process.kill(pid, 0);
151
+ return pid;
152
+ }
153
+ catch (error) {
154
+ // Process doesn't exist, clean up stale PID file
155
+ fs.unlinkSync(pidPath);
156
+ return null;
157
+ }
158
+ }
159
+ catch (error) {
160
+ console.error('Error checking daemon status:', error);
161
+ return null;
162
+ }
163
+ }
164
+ /**
165
+ * Start the daemon process
166
+ *
167
+ * Spawns daemon in detached mode. Daemon survives terminal close.
168
+ *
169
+ * @throws Error if daemon already running or spawn fails
170
+ */
171
+ async function startDaemon() {
172
+ // Check if already running
173
+ const existingPid = isDaemonRunning();
174
+ if (existingPid) {
175
+ throw new Error(`Daemon already running (PID: ${existingPid})`);
176
+ }
177
+ // Ensure config directory exists
178
+ const configDir = (0, core_1.getConfigDir)();
179
+ if (!fs.existsSync(configDir)) {
180
+ fs.mkdirSync(configDir, { recursive: true });
181
+ }
182
+ // Path to daemon entry point
183
+ // When built: dist/daemon/daemon-process.js
184
+ // For now, assume we're in development and can run via ts-node or compiled version
185
+ const daemonScript = path.join(__dirname, 'daemon-process.js');
186
+ if (!fs.existsSync(daemonScript)) {
187
+ throw new Error(`Daemon script not found: ${daemonScript}. Make sure CLI is built.`);
188
+ }
189
+ // Spawn daemon as detached process
190
+ const child = (0, child_process_1.spawn)('node', [daemonScript], {
191
+ detached: true, // Run independently of parent
192
+ stdio: 'ignore', // Don't inherit stdio (prevents hanging)
193
+ env: {
194
+ ...process.env,
195
+ EPISODA_DAEMON_MODE: '1', // Signal to daemon it's running in daemon mode
196
+ },
197
+ });
198
+ // Detach from parent process
199
+ child.unref();
200
+ const pid = child.pid;
201
+ // Save PID to file
202
+ const pidPath = getPidFilePath();
203
+ fs.writeFileSync(pidPath, pid.toString(), 'utf-8');
204
+ // Give daemon a moment to start
205
+ await new Promise(resolve => setTimeout(resolve, 500));
206
+ // Verify daemon actually started
207
+ const runningPid = isDaemonRunning();
208
+ if (!runningPid) {
209
+ throw new Error('Daemon failed to start');
210
+ }
211
+ return pid;
212
+ }
213
+ /**
214
+ * Stop the daemon process
215
+ *
216
+ * Sends SIGTERM for graceful shutdown. If daemon doesn't stop
217
+ * within timeout, sends SIGKILL.
218
+ *
219
+ * @param timeout Milliseconds to wait before SIGKILL (default: 5000)
220
+ * @returns true if stopped, false if wasn't running
221
+ */
222
+ async function stopDaemon(timeout = 5000) {
223
+ const pid = isDaemonRunning();
224
+ if (!pid) {
225
+ // Clean up PID file just in case
226
+ const pidPath = getPidFilePath();
227
+ if (fs.existsSync(pidPath)) {
228
+ fs.unlinkSync(pidPath);
229
+ }
230
+ return false;
231
+ }
232
+ try {
233
+ // Send SIGTERM for graceful shutdown
234
+ process.kill(pid, 'SIGTERM');
235
+ // Wait for process to exit
236
+ const startTime = Date.now();
237
+ while (Date.now() - startTime < timeout) {
238
+ try {
239
+ process.kill(pid, 0); // Check if still alive
240
+ await new Promise(resolve => setTimeout(resolve, 100));
241
+ }
242
+ catch (error) {
243
+ // Process exited
244
+ const pidPath = getPidFilePath();
245
+ if (fs.existsSync(pidPath)) {
246
+ fs.unlinkSync(pidPath);
247
+ }
248
+ return true;
249
+ }
250
+ }
251
+ // Timeout reached, force kill
252
+ console.warn(`Daemon didn't stop gracefully, forcing shutdown (PID: ${pid})`);
253
+ process.kill(pid, 'SIGKILL');
254
+ // Clean up PID file
255
+ const pidPath = getPidFilePath();
256
+ if (fs.existsSync(pidPath)) {
257
+ fs.unlinkSync(pidPath);
258
+ }
259
+ return true;
260
+ }
261
+ catch (error) {
262
+ console.error('Error stopping daemon:', error);
263
+ return false;
264
+ }
265
+ }
266
+ /**
267
+ * Restart the daemon
268
+ *
269
+ * Stops existing daemon and starts new one.
270
+ *
271
+ * @returns PID of new daemon
272
+ */
273
+ async function restartDaemon() {
274
+ await stopDaemon();
275
+ return startDaemon();
276
+ }
277
+ /**
278
+ * Get daemon status information
279
+ *
280
+ * @returns Status object with running state and PID
281
+ */
282
+ function getDaemonStatus() {
283
+ const pid = isDaemonRunning();
284
+ return {
285
+ running: pid !== null,
286
+ pid,
287
+ };
288
+ }
289
+ //# sourceMappingURL=daemon-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../../src/daemon/daemon-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Episoda Daemon Process
3
+ *
4
+ * Main entry point for the persistent daemon that:
5
+ * - Maintains WebSocket connections to multiple projects
6
+ * - Listens for IPC commands from CLI
7
+ * - Handles graceful shutdown
8
+ * - Survives terminal close
9
+ *
10
+ * This file is spawned by daemon-manager.ts in detached mode.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=daemon-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-process.d.ts","sourceRoot":"","sources":["../../src/daemon/daemon-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}