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.
- package/dist/commands/auth.d.ts +22 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +384 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/dev.d.ts +20 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +305 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +75 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +17 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +81 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/core/auth.d.ts +26 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +113 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/command-protocol.d.ts +262 -0
- package/dist/core/command-protocol.d.ts.map +1 -0
- package/dist/core/command-protocol.js +13 -0
- package/dist/core/command-protocol.js.map +1 -0
- package/dist/core/connection-manager.d.ts +58 -0
- package/dist/core/connection-manager.d.ts.map +1 -0
- package/dist/core/connection-manager.js +215 -0
- package/dist/core/connection-manager.js.map +1 -0
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +55 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/git-executor.d.ts +157 -0
- package/dist/core/git-executor.d.ts.map +1 -0
- package/dist/core/git-executor.js +1605 -0
- package/dist/core/git-executor.js.map +1 -0
- package/dist/core/git-parser.d.ts +40 -0
- package/dist/core/git-parser.d.ts.map +1 -0
- package/dist/core/git-parser.js +194 -0
- package/dist/core/git-parser.js.map +1 -0
- package/dist/core/git-validator.d.ts +42 -0
- package/dist/core/git-validator.d.ts.map +1 -0
- package/dist/core/git-validator.js +102 -0
- package/dist/core/git-validator.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +41 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/version.d.ts +9 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +19 -0
- package/dist/core/version.js.map +1 -0
- package/dist/core/websocket-client.d.ts +122 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +438 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/daemon/daemon-manager.d.ts +71 -0
- package/dist/daemon/daemon-manager.d.ts.map +1 -0
- package/dist/daemon/daemon-manager.js +289 -0
- package/dist/daemon/daemon-manager.js.map +1 -0
- package/dist/daemon/daemon-process.d.ts +13 -0
- package/dist/daemon/daemon-process.d.ts.map +1 -0
- package/dist/daemon/daemon-process.js +608 -0
- package/dist/daemon/daemon-process.js.map +1 -0
- package/dist/daemon/machine-id.d.ts +36 -0
- package/dist/daemon/machine-id.d.ts.map +1 -0
- package/dist/daemon/machine-id.js +195 -0
- package/dist/daemon/machine-id.js.map +1 -0
- package/dist/daemon/project-tracker.d.ts +92 -0
- package/dist/daemon/project-tracker.d.ts.map +1 -0
- package/dist/daemon/project-tracker.js +259 -0
- package/dist/daemon/project-tracker.js.map +1 -0
- package/dist/dev-wrapper.d.ts +88 -0
- package/dist/dev-wrapper.d.ts.map +1 -0
- package/dist/dev-wrapper.js +288 -0
- package/dist/dev-wrapper.js.map +1 -0
- package/dist/framework-detector.d.ts +29 -0
- package/dist/framework-detector.d.ts.map +1 -0
- package/dist/framework-detector.js +276 -0
- package/dist/framework-detector.js.map +1 -0
- package/dist/git-helpers/git-credential-helper.d.ts +29 -0
- package/dist/git-helpers/git-credential-helper.d.ts.map +1 -0
- package/dist/git-helpers/git-credential-helper.js +349 -0
- package/dist/git-helpers/git-credential-helper.js.map +1 -0
- package/dist/hooks/post-checkout +296 -0
- package/dist/hooks/pre-commit +139 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/ipc-client.d.ts +95 -0
- package/dist/ipc/ipc-client.d.ts.map +1 -0
- package/dist/ipc/ipc-client.js +204 -0
- package/dist/ipc/ipc-client.js.map +1 -0
- package/dist/ipc/ipc-server.d.ts +55 -0
- package/dist/ipc/ipc-server.d.ts.map +1 -0
- package/dist/ipc/ipc-server.js +177 -0
- package/dist/ipc/ipc-server.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +129 -0
- package/dist/output.js.map +1 -0
- package/dist/utils/port-check.d.ts +15 -0
- package/dist/utils/port-check.d.ts.map +1 -0
- package/dist/utils/port-check.js +79 -0
- package/dist/utils/port-check.js.map +1 -0
- package/dist/utils/update-checker.d.ts +23 -0
- package/dist/utils/update-checker.d.ts.map +1 -0
- package/dist/utils/update-checker.js +95 -0
- package/dist/utils/update-checker.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,305 @@
|
|
|
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("../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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
*/
|
|
8
|
+
export declare function statusCommand(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiEnD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.statusCommand = statusCommand;
|
|
11
|
+
const core_1 = require("../core");
|
|
12
|
+
const ipc_client_1 = require("../ipc/ipc-client");
|
|
13
|
+
const output_1 = require("../output");
|
|
14
|
+
async function statusCommand() {
|
|
15
|
+
output_1.status.info('Checking CLI status...');
|
|
16
|
+
output_1.status.info('');
|
|
17
|
+
// Check if config exists
|
|
18
|
+
const config = await (0, core_1.loadConfig)();
|
|
19
|
+
if (!config) {
|
|
20
|
+
output_1.status.error('✗ CLI not initialized');
|
|
21
|
+
output_1.status.info('');
|
|
22
|
+
output_1.status.info('Run the following to initialize:');
|
|
23
|
+
output_1.status.info(' episoda init --project <project_id> --token <setup_token>');
|
|
24
|
+
output_1.status.info('');
|
|
25
|
+
output_1.status.info('Get a setup token from: Settings > Local Development');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Show config details
|
|
29
|
+
output_1.status.success('✓ CLI initialized');
|
|
30
|
+
output_1.status.info('');
|
|
31
|
+
output_1.status.info('Configuration:');
|
|
32
|
+
output_1.status.info(` Project ID: ${config.project_id}`);
|
|
33
|
+
output_1.status.info(` API URL: ${config.api_url}`);
|
|
34
|
+
output_1.status.info(` CLI Version: ${config.cli_version}`);
|
|
35
|
+
output_1.status.info(` Config file: ${(0, core_1.getConfigPath)()}`);
|
|
36
|
+
output_1.status.info('');
|
|
37
|
+
if (!config.access_token || config.access_token === '') {
|
|
38
|
+
output_1.status.warning('⚠ Not authenticated');
|
|
39
|
+
output_1.status.info(' Run "episoda auth" to authenticate.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// EP738: Query daemon via IPC instead of HTTP
|
|
43
|
+
let daemonStatus = null;
|
|
44
|
+
try {
|
|
45
|
+
daemonStatus = await (0, ipc_client_1.getStatus)();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Daemon not running or IPC failed
|
|
49
|
+
}
|
|
50
|
+
if (!daemonStatus) {
|
|
51
|
+
output_1.status.warning('⚠ Daemon not running');
|
|
52
|
+
output_1.status.info(' Run "episoda dev" to start the daemon.');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Check if any project is connected
|
|
56
|
+
const connectedProject = daemonStatus.projects.find(p => p.connected);
|
|
57
|
+
if (connectedProject) {
|
|
58
|
+
output_1.status.success('✓ Connected to server');
|
|
59
|
+
output_1.status.info(` Device: ${daemonStatus.hostname}`);
|
|
60
|
+
output_1.status.info(` Platform: ${daemonStatus.platform}/${daemonStatus.arch}`);
|
|
61
|
+
output_1.status.info(` Project: ${connectedProject.name}`);
|
|
62
|
+
}
|
|
63
|
+
else if (daemonStatus.projects.length > 0) {
|
|
64
|
+
output_1.status.warning('⚠ Daemon running but not connected');
|
|
65
|
+
output_1.status.info(` Device: ${daemonStatus.hostname}`);
|
|
66
|
+
output_1.status.info(` Platform: ${daemonStatus.platform}/${daemonStatus.arch}`);
|
|
67
|
+
output_1.status.info(' Run "episoda dev" in a project directory to connect.');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
output_1.status.warning('⚠ Daemon running but no projects registered');
|
|
71
|
+
output_1.status.info(` Device: ${daemonStatus.hostname}`);
|
|
72
|
+
output_1.status.info(' Run "episoda dev" in a project directory to connect.');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication utilities
|
|
3
|
+
*/
|
|
4
|
+
import { EpisodaConfig } from './command-protocol';
|
|
5
|
+
/**
|
|
6
|
+
* Get the config directory path
|
|
7
|
+
* Supports EPISODA_CONFIG_DIR env var for running multiple environments
|
|
8
|
+
*/
|
|
9
|
+
export declare function getConfigDir(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Get the full path to the config file
|
|
12
|
+
*/
|
|
13
|
+
export declare function getConfigPath(configPath?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Load configuration from .episoda/config.json
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadConfig(configPath?: string): Promise<EpisodaConfig | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Save configuration to .episoda/config.json
|
|
20
|
+
*/
|
|
21
|
+
export declare function saveConfig(config: EpisodaConfig, configPath?: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Validate an access token
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateToken(token: string): Promise<boolean>;
|
|
26
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIlD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzD;AAYD;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAenF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAInE"}
|