episoda 0.2.5 → 0.2.7
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.
- package/dist/index.d.ts +0 -7
- package/dist/index.js +3736 -82
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/dist/commands/auth.d.ts +0 -22
- package/dist/commands/auth.d.ts.map +0 -1
- package/dist/commands/auth.js +0 -384
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/dev.d.ts +0 -20
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -305
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/status.d.ts +0 -13
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -102
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/stop.d.ts +0 -17
- package/dist/commands/stop.d.ts.map +0 -1
- package/dist/commands/stop.js +0 -81
- package/dist/commands/stop.js.map +0 -1
- package/dist/daemon/daemon-manager.d.ts +0 -71
- package/dist/daemon/daemon-manager.d.ts.map +0 -1
- package/dist/daemon/daemon-manager.js +0 -289
- package/dist/daemon/daemon-manager.js.map +0 -1
- package/dist/daemon/daemon-process.d.ts +0 -13
- package/dist/daemon/daemon-process.d.ts.map +0 -1
- package/dist/daemon/daemon-process.js +0 -662
- package/dist/daemon/daemon-process.js.map +0 -1
- package/dist/daemon/identity-server.d.ts +0 -51
- package/dist/daemon/identity-server.d.ts.map +0 -1
- package/dist/daemon/identity-server.js +0 -162
- package/dist/daemon/identity-server.js.map +0 -1
- package/dist/daemon/machine-id.d.ts +0 -36
- package/dist/daemon/machine-id.d.ts.map +0 -1
- package/dist/daemon/machine-id.js +0 -195
- package/dist/daemon/machine-id.js.map +0 -1
- package/dist/daemon/project-tracker.d.ts +0 -92
- package/dist/daemon/project-tracker.d.ts.map +0 -1
- package/dist/daemon/project-tracker.js +0 -259
- package/dist/daemon/project-tracker.js.map +0 -1
- package/dist/dev-wrapper.d.ts +0 -88
- package/dist/dev-wrapper.d.ts.map +0 -1
- package/dist/dev-wrapper.js +0 -288
- package/dist/dev-wrapper.js.map +0 -1
- package/dist/framework-detector.d.ts +0 -29
- package/dist/framework-detector.d.ts.map +0 -1
- package/dist/framework-detector.js +0 -276
- package/dist/framework-detector.js.map +0 -1
- package/dist/git-helpers/git-credential-helper.d.ts +0 -29
- package/dist/git-helpers/git-credential-helper.d.ts.map +0 -1
- package/dist/git-helpers/git-credential-helper.js +0 -349
- package/dist/git-helpers/git-credential-helper.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/ipc/ipc-client.d.ts +0 -116
- package/dist/ipc/ipc-client.d.ts.map +0 -1
- package/dist/ipc/ipc-client.js +0 -216
- package/dist/ipc/ipc-client.js.map +0 -1
- package/dist/ipc/ipc-server.d.ts +0 -55
- package/dist/ipc/ipc-server.d.ts.map +0 -1
- package/dist/ipc/ipc-server.js +0 -177
- package/dist/ipc/ipc-server.js.map +0 -1
- package/dist/output.d.ts +0 -48
- package/dist/output.d.ts.map +0 -1
- package/dist/output.js +0 -129
- package/dist/output.js.map +0 -1
- package/dist/utils/port-check.d.ts +0 -15
- package/dist/utils/port-check.d.ts.map +0 -1
- package/dist/utils/port-check.js +0 -79
- package/dist/utils/port-check.js.map +0 -1
- package/dist/utils/update-checker.d.ts +0 -23
- package/dist/utils/update-checker.d.ts.map +0 -1
- package/dist/utils/update-checker.js +0 -95
- package/dist/utils/update-checker.js.map +0 -1
package/dist/commands/dev.js
DELETED
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* `episoda dev` command
|
|
4
|
-
*
|
|
5
|
-
* K722 Architecture:
|
|
6
|
-
* - Ensures daemon is running
|
|
7
|
-
* - Adds project to daemon for WebSocket connection
|
|
8
|
-
* - Optionally wraps user's dev server command
|
|
9
|
-
* - Daemon handles WebSocket persistence across terminal sessions
|
|
10
|
-
*/
|
|
11
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
-
if (k2 === undefined) k2 = k;
|
|
13
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
-
}
|
|
17
|
-
Object.defineProperty(o, k2, desc);
|
|
18
|
-
}) : (function(o, m, k, k2) {
|
|
19
|
-
if (k2 === undefined) k2 = k;
|
|
20
|
-
o[k2] = m[k];
|
|
21
|
-
}));
|
|
22
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
-
}) : function(o, v) {
|
|
25
|
-
o["default"] = v;
|
|
26
|
-
});
|
|
27
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
-
var ownKeys = function(o) {
|
|
29
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
-
var ar = [];
|
|
31
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
-
return ar;
|
|
33
|
-
};
|
|
34
|
-
return ownKeys(o);
|
|
35
|
-
};
|
|
36
|
-
return function (mod) {
|
|
37
|
-
if (mod && mod.__esModule) return mod;
|
|
38
|
-
var result = {};
|
|
39
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
-
__setModuleDefault(result, mod);
|
|
41
|
-
return result;
|
|
42
|
-
};
|
|
43
|
-
})();
|
|
44
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.devCommand = devCommand;
|
|
46
|
-
const core_1 = require("@episoda/core");
|
|
47
|
-
const framework_detector_1 = require("../framework-detector");
|
|
48
|
-
const output_1 = require("../output");
|
|
49
|
-
const daemon_manager_1 = require("../daemon/daemon-manager");
|
|
50
|
-
const ipc_client_1 = require("../ipc/ipc-client");
|
|
51
|
-
const child_process_1 = require("child_process");
|
|
52
|
-
const path = __importStar(require("path"));
|
|
53
|
-
const port_check_1 = require("../utils/port-check");
|
|
54
|
-
// EP734: Connection retry configuration (polling removed - now event-driven)
|
|
55
|
-
const CONNECTION_MAX_RETRIES = 3; // Retry up to 3 times on failure
|
|
56
|
-
/**
|
|
57
|
-
* EP593: Find the git repository root directory
|
|
58
|
-
* This ensures we always use the same project path regardless of where episoda dev is run
|
|
59
|
-
*/
|
|
60
|
-
function findGitRoot(startDir) {
|
|
61
|
-
try {
|
|
62
|
-
const result = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
|
63
|
-
cwd: startDir,
|
|
64
|
-
encoding: 'utf-8',
|
|
65
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
66
|
-
});
|
|
67
|
-
return result.trim();
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Execute the `episoda dev` command
|
|
75
|
-
* @param options - Command options
|
|
76
|
-
*/
|
|
77
|
-
async function devCommand(options = {}) {
|
|
78
|
-
try {
|
|
79
|
-
// K722: Load existing config (created by /api/start OAuth flow)
|
|
80
|
-
const config = await (0, core_1.loadConfig)();
|
|
81
|
-
if (!config || !config.access_token || !config.project_id) {
|
|
82
|
-
output_1.status.error('No authentication found. Please run:');
|
|
83
|
-
output_1.status.info('');
|
|
84
|
-
output_1.status.info(' episoda auth');
|
|
85
|
-
output_1.status.info('');
|
|
86
|
-
output_1.status.info('This will authenticate with episoda.dev and configure the CLI.');
|
|
87
|
-
process.exit(1);
|
|
88
|
-
}
|
|
89
|
-
// EP734: Clean up any stale episoda processes before starting
|
|
90
|
-
// This ensures only one daemon runs per device
|
|
91
|
-
const killedCount = (0, daemon_manager_1.killAllEpisodaProcesses)();
|
|
92
|
-
if (killedCount > 0) {
|
|
93
|
-
output_1.status.info(`Cleaned up ${killedCount} stale process${killedCount > 1 ? 'es' : ''}`);
|
|
94
|
-
}
|
|
95
|
-
// EP734: Determine project path using cached settings (avoids network call)
|
|
96
|
-
// Priority: 1. Cached settings (if fresh), 2. Git root detection, 3. Current working directory
|
|
97
|
-
const serverUrl = config.api_url || process.env.EPISODA_API_URL || 'https://episoda.dev';
|
|
98
|
-
let projectPath;
|
|
99
|
-
// EP734: Check if we have fresh cached settings (< 24 hours old)
|
|
100
|
-
const SETTINGS_CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours in ms
|
|
101
|
-
const cachedSettings = config.project_settings;
|
|
102
|
-
const isCacheFresh = cachedSettings?.cached_at &&
|
|
103
|
-
(Date.now() - cachedSettings.cached_at) < SETTINGS_CACHE_TTL;
|
|
104
|
-
if (isCacheFresh && cachedSettings?.local_project_path) {
|
|
105
|
-
// Use cached project path
|
|
106
|
-
projectPath = cachedSettings.local_project_path;
|
|
107
|
-
output_1.status.debug(`Using cached project path: ${projectPath}`);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
// No cache or stale - detect git root locally (no network call)
|
|
111
|
-
const detectedRoot = findGitRoot(options.cwd || process.cwd());
|
|
112
|
-
projectPath = detectedRoot || path.resolve(options.cwd || process.cwd());
|
|
113
|
-
if (detectedRoot) {
|
|
114
|
-
output_1.status.debug(`Detected project root: ${projectPath}`);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
output_1.status.warning(`Could not detect git root, using: ${projectPath}`);
|
|
118
|
-
}
|
|
119
|
-
// Cache the detected path locally
|
|
120
|
-
const updatedConfig = {
|
|
121
|
-
...config,
|
|
122
|
-
project_settings: {
|
|
123
|
-
...cachedSettings,
|
|
124
|
-
local_project_path: projectPath,
|
|
125
|
-
cached_at: Date.now()
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
await (0, core_1.saveConfig)(updatedConfig);
|
|
129
|
-
output_1.status.debug('Cached project settings locally');
|
|
130
|
-
// Background: Save to server (don't await - fire and forget)
|
|
131
|
-
const settingsUrl = `${serverUrl}/api/projects/${config.project_id}/settings`;
|
|
132
|
-
fetch(settingsUrl, {
|
|
133
|
-
method: 'PATCH',
|
|
134
|
-
headers: {
|
|
135
|
-
'Authorization': `Bearer ${config.access_token}`,
|
|
136
|
-
'Content-Type': 'application/json'
|
|
137
|
-
},
|
|
138
|
-
body: JSON.stringify({ local_project_path: projectPath })
|
|
139
|
-
}).catch(() => { }); // Ignore errors - server sync is best-effort
|
|
140
|
-
}
|
|
141
|
-
// K722: Ensure daemon is running
|
|
142
|
-
let daemonPid = (0, daemon_manager_1.isDaemonRunning)();
|
|
143
|
-
if (!daemonPid) {
|
|
144
|
-
output_1.status.info('Starting Episoda daemon...');
|
|
145
|
-
try {
|
|
146
|
-
daemonPid = await (0, daemon_manager_1.startDaemon)();
|
|
147
|
-
output_1.status.success(`Daemon started (PID: ${daemonPid})`);
|
|
148
|
-
}
|
|
149
|
-
catch (error) {
|
|
150
|
-
output_1.status.error(`Failed to start daemon: ${error instanceof Error ? error.message : String(error)}`);
|
|
151
|
-
process.exit(1);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
output_1.status.debug(`Daemon already running (PID: ${daemonPid})`);
|
|
156
|
-
}
|
|
157
|
-
// Verify daemon is reachable via IPC
|
|
158
|
-
const reachable = await (0, ipc_client_1.isDaemonReachable)();
|
|
159
|
-
if (!reachable) {
|
|
160
|
-
output_1.status.error('Daemon is running but not responding. Try: episoda stop && episoda dev');
|
|
161
|
-
process.exit(1);
|
|
162
|
-
}
|
|
163
|
-
// EP734: Add project to daemon - now blocking (no more polling)
|
|
164
|
-
// The addProject IPC call waits for WebSocket connection to complete
|
|
165
|
-
output_1.status.info(`Connecting project to Episoda...`);
|
|
166
|
-
let connected = false;
|
|
167
|
-
let lastError;
|
|
168
|
-
for (let retry = 0; retry < CONNECTION_MAX_RETRIES && !connected; retry++) {
|
|
169
|
-
if (retry > 0) {
|
|
170
|
-
output_1.status.info(`Retrying connection (attempt ${retry + 1}/${CONNECTION_MAX_RETRIES})...`);
|
|
171
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
172
|
-
}
|
|
173
|
-
try {
|
|
174
|
-
// EP734: Blocking call - waits for connection to complete
|
|
175
|
-
const result = await (0, ipc_client_1.addProject)(config.project_id, projectPath);
|
|
176
|
-
if (result.connected) {
|
|
177
|
-
connected = true;
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
lastError = result.error || 'Connection failed';
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
lastError = error instanceof Error ? error.message : String(error);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (!connected) {
|
|
188
|
-
output_1.status.error(`Failed to connect: ${lastError}`);
|
|
189
|
-
output_1.status.info('Check server status at https://episoda.dev/api/system/health');
|
|
190
|
-
process.exit(1);
|
|
191
|
-
}
|
|
192
|
-
output_1.status.success('Connected to Episoda');
|
|
193
|
-
// Determine if we should start a dev server or just connect
|
|
194
|
-
let command;
|
|
195
|
-
let detection;
|
|
196
|
-
let connectionOnlyMode = false;
|
|
197
|
-
// Check if user explicitly requested connection-only mode
|
|
198
|
-
if (options.command && options.command.length === 0) {
|
|
199
|
-
connectionOnlyMode = true;
|
|
200
|
-
output_1.status.debug('Connection-only mode (explicit)');
|
|
201
|
-
}
|
|
202
|
-
else if (!options.command) {
|
|
203
|
-
// Auto-detect: Check if server is already running
|
|
204
|
-
const serverPort = (0, port_check_1.getServerPort)();
|
|
205
|
-
const portInUse = await (0, port_check_1.isPortInUse)(serverPort);
|
|
206
|
-
if (portInUse) {
|
|
207
|
-
connectionOnlyMode = true;
|
|
208
|
-
output_1.status.info(`Server already running on port ${serverPort}`);
|
|
209
|
-
output_1.status.info('Connecting to existing server...');
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
// Resolve dev command if not in connection-only mode
|
|
213
|
-
if (!connectionOnlyMode) {
|
|
214
|
-
try {
|
|
215
|
-
const result = await (0, framework_detector_1.resolveDevCommand)(options.command || null, projectPath);
|
|
216
|
-
command = result.command;
|
|
217
|
-
detection = result.detection;
|
|
218
|
-
// Show framework detection if auto-detected
|
|
219
|
-
if (detection && !options.command) {
|
|
220
|
-
(0, output_1.printFrameworkDetection)(detection.framework, detection.command, detection.confidence);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
catch (error) {
|
|
224
|
-
// No command detected
|
|
225
|
-
output_1.status.debug('No dev command detected');
|
|
226
|
-
command = undefined;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
// If dev command provided, wrap it
|
|
230
|
-
if (command && command.length > 0) {
|
|
231
|
-
await runDevServer(command, projectPath, options.autoRestart ?? false);
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
// Connection-only mode
|
|
235
|
-
output_1.status.info('');
|
|
236
|
-
output_1.status.info('Connected! Git operations will be executed by Episoda.');
|
|
237
|
-
output_1.status.info('Press Ctrl+C to disconnect.');
|
|
238
|
-
output_1.status.info('');
|
|
239
|
-
// Keep process alive
|
|
240
|
-
await new Promise(() => { });
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
catch (error) {
|
|
244
|
-
output_1.status.error(`Failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
245
|
-
process.exit(1);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Run dev server process
|
|
250
|
-
*/
|
|
251
|
-
async function runDevServer(command, cwd, autoRestart) {
|
|
252
|
-
let devProcess;
|
|
253
|
-
let restartCount = 0;
|
|
254
|
-
let shuttingDown = false;
|
|
255
|
-
const startServer = () => {
|
|
256
|
-
output_1.status.info(`Starting dev server: ${command.join(' ')}`);
|
|
257
|
-
devProcess = (0, child_process_1.spawn)(command[0], command.slice(1), {
|
|
258
|
-
cwd,
|
|
259
|
-
stdio: ['inherit', 'inherit', 'inherit'],
|
|
260
|
-
shell: true
|
|
261
|
-
});
|
|
262
|
-
devProcess.on('exit', (code, signal) => {
|
|
263
|
-
if (shuttingDown) {
|
|
264
|
-
output_1.status.info('Dev server stopped');
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
if (code === 0) {
|
|
268
|
-
output_1.status.success('Dev server exited successfully');
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
output_1.status.error(`Dev server exited with code ${code}${signal ? ` (signal: ${signal})` : ''}`);
|
|
272
|
-
}
|
|
273
|
-
// Auto-restart if enabled
|
|
274
|
-
if (autoRestart && !shuttingDown) {
|
|
275
|
-
restartCount++;
|
|
276
|
-
output_1.status.info(`Auto-restarting dev server (attempt ${restartCount})...`);
|
|
277
|
-
setTimeout(() => {
|
|
278
|
-
startServer();
|
|
279
|
-
}, 2000);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
devProcess.on('error', (error) => {
|
|
283
|
-
output_1.status.error(`Dev server error: ${error.message}`);
|
|
284
|
-
});
|
|
285
|
-
};
|
|
286
|
-
// Setup shutdown handler
|
|
287
|
-
const shutdownHandler = async (signal) => {
|
|
288
|
-
if (shuttingDown)
|
|
289
|
-
return;
|
|
290
|
-
shuttingDown = true;
|
|
291
|
-
output_1.status.info(`\nReceived ${signal}, shutting down...`);
|
|
292
|
-
if (devProcess) {
|
|
293
|
-
devProcess.kill('SIGTERM');
|
|
294
|
-
}
|
|
295
|
-
// Note: Daemon keeps running in background
|
|
296
|
-
output_1.status.info('Dev server stopped. Daemon continues running in background.');
|
|
297
|
-
process.exit(0);
|
|
298
|
-
};
|
|
299
|
-
process.on('SIGTERM', () => shutdownHandler('SIGTERM'));
|
|
300
|
-
process.on('SIGINT', () => shutdownHandler('SIGINT'));
|
|
301
|
-
startServer();
|
|
302
|
-
// Keep process alive
|
|
303
|
-
await new Promise(() => { });
|
|
304
|
-
}
|
|
305
|
-
//# sourceMappingURL=dev.js.map
|
package/dist/commands/dev.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `episoda status` command
|
|
3
|
-
*
|
|
4
|
-
* Shows the current CLI connection status and configuration details.
|
|
5
|
-
* EP734: Simplified to only check local daemon state (removed server comparison).
|
|
6
|
-
* EP738: Now uses IPC instead of HTTP (localhost:3002 server removed).
|
|
7
|
-
* EP805: Added --verify flag for explicit connection health check.
|
|
8
|
-
*/
|
|
9
|
-
export interface StatusOptions {
|
|
10
|
-
verify?: boolean;
|
|
11
|
-
}
|
|
12
|
-
export declare function statusCommand(options?: StatusOptions): Promise<void>;
|
|
13
|
-
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2F9E"}
|
package/dist/commands/status.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* `episoda status` command
|
|
4
|
-
*
|
|
5
|
-
* Shows the current CLI connection status and configuration details.
|
|
6
|
-
* EP734: Simplified to only check local daemon state (removed server comparison).
|
|
7
|
-
* EP738: Now uses IPC instead of HTTP (localhost:3002 server removed).
|
|
8
|
-
* EP805: Added --verify flag for explicit connection health check.
|
|
9
|
-
*/
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.statusCommand = statusCommand;
|
|
12
|
-
const core_1 = require("@episoda/core");
|
|
13
|
-
const ipc_client_1 = require("../ipc/ipc-client");
|
|
14
|
-
const output_1 = require("../output");
|
|
15
|
-
async function statusCommand(options = {}) {
|
|
16
|
-
output_1.status.info('Checking CLI status...');
|
|
17
|
-
output_1.status.info('');
|
|
18
|
-
// Check if config exists
|
|
19
|
-
const config = await (0, core_1.loadConfig)();
|
|
20
|
-
if (!config) {
|
|
21
|
-
output_1.status.error('✗ CLI not initialized');
|
|
22
|
-
output_1.status.info('');
|
|
23
|
-
output_1.status.info('Run the following to initialize:');
|
|
24
|
-
output_1.status.info(' episoda init --project <project_id> --token <setup_token>');
|
|
25
|
-
output_1.status.info('');
|
|
26
|
-
output_1.status.info('Get a setup token from: Settings > Local Development');
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
// Show config details
|
|
30
|
-
output_1.status.success('✓ CLI initialized');
|
|
31
|
-
output_1.status.info('');
|
|
32
|
-
output_1.status.info('Configuration:');
|
|
33
|
-
output_1.status.info(` Project ID: ${config.project_id}`);
|
|
34
|
-
output_1.status.info(` API URL: ${config.api_url}`);
|
|
35
|
-
output_1.status.info(` CLI Version: ${config.cli_version}`);
|
|
36
|
-
output_1.status.info(` Config file: ${(0, core_1.getConfigPath)()}`);
|
|
37
|
-
output_1.status.info('');
|
|
38
|
-
if (!config.access_token || config.access_token === '') {
|
|
39
|
-
output_1.status.warning('⚠ Not authenticated');
|
|
40
|
-
output_1.status.info(' Run "episoda auth" to authenticate.');
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
// EP738: Query daemon via IPC instead of HTTP
|
|
44
|
-
let daemonStatus = null;
|
|
45
|
-
try {
|
|
46
|
-
daemonStatus = await (0, ipc_client_1.getStatus)();
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// Daemon not running or IPC failed
|
|
50
|
-
}
|
|
51
|
-
if (!daemonStatus) {
|
|
52
|
-
output_1.status.warning('⚠ Daemon not running');
|
|
53
|
-
output_1.status.info(' Run "episoda dev" to start the daemon.');
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
// Check if any project is connected
|
|
57
|
-
const connectedProject = daemonStatus.projects.find(p => p.connected);
|
|
58
|
-
if (connectedProject) {
|
|
59
|
-
output_1.status.success('✓ Connected to server');
|
|
60
|
-
output_1.status.info(` Device: ${daemonStatus.hostname}`);
|
|
61
|
-
output_1.status.info(` Platform: ${daemonStatus.platform}/${daemonStatus.arch}`);
|
|
62
|
-
output_1.status.info(` Project: ${connectedProject.name}`);
|
|
63
|
-
}
|
|
64
|
-
else if (daemonStatus.projects.length > 0) {
|
|
65
|
-
output_1.status.warning('⚠ Daemon running but not connected');
|
|
66
|
-
output_1.status.info(` Device: ${daemonStatus.hostname}`);
|
|
67
|
-
output_1.status.info(` Platform: ${daemonStatus.platform}/${daemonStatus.arch}`);
|
|
68
|
-
output_1.status.info(' Run "episoda dev" in a project directory to connect.');
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
output_1.status.warning('⚠ Daemon running but no projects registered');
|
|
72
|
-
output_1.status.info(` Device: ${daemonStatus.hostname}`);
|
|
73
|
-
output_1.status.info(' Run "episoda dev" in a project directory to connect.');
|
|
74
|
-
}
|
|
75
|
-
// EP805: Verify connection health if --verify flag is set
|
|
76
|
-
if (options.verify) {
|
|
77
|
-
output_1.status.info('');
|
|
78
|
-
output_1.status.info('Connection Health Check:');
|
|
79
|
-
try {
|
|
80
|
-
const health = await (0, ipc_client_1.verifyHealth)();
|
|
81
|
-
if (health.staleConnections > 0) {
|
|
82
|
-
output_1.status.warning(` ⚠ ${health.staleConnections} stale connection(s) detected`);
|
|
83
|
-
for (const project of health.projects) {
|
|
84
|
-
if (project.inConnectionsMap && !project.inLiveConnections) {
|
|
85
|
-
output_1.status.warning(` - ${project.name}: in Map but WebSocket dead`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
output_1.status.info(' Stale connections will be cleaned up on next connect attempt.');
|
|
89
|
-
}
|
|
90
|
-
else if (health.healthyConnections > 0) {
|
|
91
|
-
output_1.status.success(` ✓ All ${health.healthyConnections} connection(s) healthy`);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
output_1.status.info(' No active connections to verify.');
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
output_1.status.error(` ✗ Health check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/stop.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `episoda stop` command
|
|
3
|
-
*
|
|
4
|
-
* K722: Stop the Episoda daemon
|
|
5
|
-
* - Sends shutdown signal to daemon via IPC
|
|
6
|
-
* - Waits for daemon to stop gracefully
|
|
7
|
-
* - Falls back to forceful shutdown if needed
|
|
8
|
-
*/
|
|
9
|
-
export interface StopCommandOptions {
|
|
10
|
-
force?: boolean;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Execute the `episoda stop` command
|
|
14
|
-
* @param options - Command options
|
|
15
|
-
*/
|
|
16
|
-
export declare function stopCommand(options?: StopCommandOptions): Promise<void>;
|
|
17
|
-
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDjF"}
|
package/dist/commands/stop.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* `episoda stop` command
|
|
4
|
-
*
|
|
5
|
-
* K722: Stop the Episoda daemon
|
|
6
|
-
* - Sends shutdown signal to daemon via IPC
|
|
7
|
-
* - Waits for daemon to stop gracefully
|
|
8
|
-
* - Falls back to forceful shutdown if needed
|
|
9
|
-
*/
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.stopCommand = stopCommand;
|
|
12
|
-
const output_1 = require("../output");
|
|
13
|
-
const daemon_manager_1 = require("../daemon/daemon-manager");
|
|
14
|
-
const ipc_client_1 = require("../ipc/ipc-client");
|
|
15
|
-
/**
|
|
16
|
-
* Execute the `episoda stop` command
|
|
17
|
-
* @param options - Command options
|
|
18
|
-
*/
|
|
19
|
-
async function stopCommand(options = {}) {
|
|
20
|
-
try {
|
|
21
|
-
// Check if daemon is running
|
|
22
|
-
const pid = (0, daemon_manager_1.isDaemonRunning)();
|
|
23
|
-
if (!pid) {
|
|
24
|
-
output_1.status.info('Daemon is not running');
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
output_1.status.info(`Stopping daemon (PID: ${pid})...`);
|
|
28
|
-
if (options.force) {
|
|
29
|
-
// Force kill
|
|
30
|
-
const stopped = await (0, daemon_manager_1.stopDaemon)(1000); // 1 second timeout before SIGKILL
|
|
31
|
-
if (stopped) {
|
|
32
|
-
output_1.status.success('Daemon force-stopped');
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
output_1.status.error('Failed to stop daemon');
|
|
36
|
-
process.exit(1);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
// Graceful shutdown via IPC
|
|
41
|
-
try {
|
|
42
|
-
// Check if daemon is reachable
|
|
43
|
-
const reachable = await (0, ipc_client_1.isDaemonReachable)();
|
|
44
|
-
if (reachable) {
|
|
45
|
-
// Send shutdown command
|
|
46
|
-
await (0, ipc_client_1.shutdownDaemon)();
|
|
47
|
-
output_1.status.success('Daemon stopped');
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
// Daemon not reachable, force stop
|
|
51
|
-
output_1.status.warning('Daemon not responding, forcing shutdown...');
|
|
52
|
-
const stopped = await (0, daemon_manager_1.stopDaemon)(1000);
|
|
53
|
-
if (stopped) {
|
|
54
|
-
output_1.status.success('Daemon stopped');
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
output_1.status.error('Failed to stop daemon');
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
// IPC failed, try direct stop
|
|
64
|
-
output_1.status.warning('Failed to communicate with daemon, trying direct shutdown...');
|
|
65
|
-
const stopped = await (0, daemon_manager_1.stopDaemon)(5000);
|
|
66
|
-
if (stopped) {
|
|
67
|
-
output_1.status.success('Daemon stopped');
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
output_1.status.error(`Failed to stop daemon: ${error instanceof Error ? error.message : String(error)}`);
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
output_1.status.error(`Failed to stop daemon: ${error instanceof Error ? error.message : String(error)}`);
|
|
78
|
-
process.exit(1);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=stop.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAcH,kCAwDC;AApED,sCAAkC;AAClC,6DAAsE;AACtE,kDAAqE;AAMrE;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,UAA8B,EAAE;IAChE,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,GAAG,GAAG,IAAA,gCAAe,GAAE,CAAA;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;YACpC,OAAM;QACR,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,CAAA;QAE/C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,aAAa;YACb,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,IAAI,CAAC,CAAA,CAAC,kCAAkC;YACzE,IAAI,OAAO,EAAE,CAAC;gBACZ,eAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,IAAI,CAAC;gBACH,+BAA+B;gBAC/B,MAAM,SAAS,GAAG,MAAM,IAAA,8BAAiB,GAAE,CAAA;gBAC3C,IAAI,SAAS,EAAE,CAAC;oBACd,wBAAwB;oBACxB,MAAM,IAAA,2BAAc,GAAE,CAAA;oBACtB,eAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;gBAClC,CAAC;qBAAM,CAAC;oBACN,mCAAmC;oBACnC,eAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAA;oBAC5D,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,IAAI,CAAC,CAAA;oBACtC,IAAI,OAAO,EAAE,CAAC;wBACZ,eAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;oBAClC,CAAC;yBAAM,CAAC;wBACN,eAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;wBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8BAA8B;gBAC9B,eAAM,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAA;gBAC9E,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAU,EAAC,IAAI,CAAC,CAAA;gBACtC,IAAI,OAAO,EAAE,CAAC;oBACZ,eAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;gBAClC,CAAC;qBAAM,CAAC;oBACN,eAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;oBAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Daemon lifecycle management
|
|
3
|
-
*
|
|
4
|
-
* Manages the Episoda daemon process lifecycle:
|
|
5
|
-
* - Spawning daemon in detached mode
|
|
6
|
-
* - Checking daemon status
|
|
7
|
-
* - Stopping daemon gracefully
|
|
8
|
-
* - PID file management
|
|
9
|
-
*
|
|
10
|
-
* Ensures only one daemon runs per user.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* EP734: Kill all stale Episoda processes
|
|
14
|
-
*
|
|
15
|
-
* Finds and kills any existing episoda-related processes to ensure
|
|
16
|
-
* a clean slate before starting a new daemon. This prevents:
|
|
17
|
-
* - Multiple daemon processes running simultaneously
|
|
18
|
-
* - Stale `episoda dev` foreground processes from previous sessions
|
|
19
|
-
* - Orphaned node processes running daemon-process.js
|
|
20
|
-
*
|
|
21
|
-
* @returns Number of processes killed
|
|
22
|
-
*/
|
|
23
|
-
export declare function killAllEpisodaProcesses(): number;
|
|
24
|
-
/**
|
|
25
|
-
* Get path to daemon PID file
|
|
26
|
-
*/
|
|
27
|
-
export declare function getPidFilePath(): string;
|
|
28
|
-
/**
|
|
29
|
-
* Check if daemon is running
|
|
30
|
-
*
|
|
31
|
-
* Reads PID from file and checks if process exists.
|
|
32
|
-
*
|
|
33
|
-
* @returns PID if running, null if not
|
|
34
|
-
*/
|
|
35
|
-
export declare function isDaemonRunning(): number | null;
|
|
36
|
-
/**
|
|
37
|
-
* Start the daemon process
|
|
38
|
-
*
|
|
39
|
-
* Spawns daemon in detached mode. Daemon survives terminal close.
|
|
40
|
-
*
|
|
41
|
-
* @throws Error if daemon already running or spawn fails
|
|
42
|
-
*/
|
|
43
|
-
export declare function startDaemon(): Promise<number>;
|
|
44
|
-
/**
|
|
45
|
-
* Stop the daemon process
|
|
46
|
-
*
|
|
47
|
-
* Sends SIGTERM for graceful shutdown. If daemon doesn't stop
|
|
48
|
-
* within timeout, sends SIGKILL.
|
|
49
|
-
*
|
|
50
|
-
* @param timeout Milliseconds to wait before SIGKILL (default: 5000)
|
|
51
|
-
* @returns true if stopped, false if wasn't running
|
|
52
|
-
*/
|
|
53
|
-
export declare function stopDaemon(timeout?: number): Promise<boolean>;
|
|
54
|
-
/**
|
|
55
|
-
* Restart the daemon
|
|
56
|
-
*
|
|
57
|
-
* Stops existing daemon and starts new one.
|
|
58
|
-
*
|
|
59
|
-
* @returns PID of new daemon
|
|
60
|
-
*/
|
|
61
|
-
export declare function restartDaemon(): Promise<number>;
|
|
62
|
-
/**
|
|
63
|
-
* Get daemon status information
|
|
64
|
-
*
|
|
65
|
-
* @returns Status object with running state and PID
|
|
66
|
-
*/
|
|
67
|
-
export declare function getDaemonStatus(): {
|
|
68
|
-
running: boolean;
|
|
69
|
-
pid: number | null;
|
|
70
|
-
};
|
|
71
|
-
//# sourceMappingURL=daemon-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-manager.d.ts","sourceRoot":"","sources":["../../src/daemon/daemon-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CA6DhD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CA+B/C;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAmDnD;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CA8CzE;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAGrD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAM1E"}
|