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,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IPC Server - Runs in daemon process
|
|
4
|
+
*
|
|
5
|
+
* Listens for commands from CLI via Unix domain socket.
|
|
6
|
+
* Handles command routing and response sending.
|
|
7
|
+
*
|
|
8
|
+
* Socket location: ~/.episoda/daemon.sock
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.IPCServer = void 0;
|
|
45
|
+
const net = __importStar(require("net"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const core_1 = require("../core");
|
|
49
|
+
const getSocketPath = () => path.join((0, core_1.getConfigDir)(), 'daemon.sock');
|
|
50
|
+
/**
|
|
51
|
+
* IPC Server
|
|
52
|
+
*
|
|
53
|
+
* Listens on Unix socket for CLI commands.
|
|
54
|
+
*/
|
|
55
|
+
class IPCServer {
|
|
56
|
+
constructor() {
|
|
57
|
+
this.server = null;
|
|
58
|
+
this.handlers = new Map();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Register a command handler
|
|
62
|
+
*
|
|
63
|
+
* @param command Command name
|
|
64
|
+
* @param handler Async function to handle command
|
|
65
|
+
*/
|
|
66
|
+
on(command, handler) {
|
|
67
|
+
this.handlers.set(command, handler);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Start the IPC server
|
|
71
|
+
*
|
|
72
|
+
* Creates Unix socket and listens for connections.
|
|
73
|
+
*/
|
|
74
|
+
async start() {
|
|
75
|
+
const socketPath = getSocketPath();
|
|
76
|
+
// Clean up existing socket if it exists
|
|
77
|
+
if (fs.existsSync(socketPath)) {
|
|
78
|
+
fs.unlinkSync(socketPath);
|
|
79
|
+
}
|
|
80
|
+
// Ensure config directory exists
|
|
81
|
+
const dir = path.dirname(socketPath);
|
|
82
|
+
if (!fs.existsSync(dir)) {
|
|
83
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
this.server = net.createServer(socket => {
|
|
86
|
+
this.handleConnection(socket);
|
|
87
|
+
});
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
this.server.listen(socketPath, () => {
|
|
90
|
+
// Set socket permissions (owner only)
|
|
91
|
+
fs.chmodSync(socketPath, 0o600);
|
|
92
|
+
resolve();
|
|
93
|
+
});
|
|
94
|
+
this.server.on('error', reject);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Stop the IPC server
|
|
99
|
+
*/
|
|
100
|
+
async stop() {
|
|
101
|
+
if (!this.server)
|
|
102
|
+
return;
|
|
103
|
+
const socketPath = getSocketPath();
|
|
104
|
+
return new Promise((resolve) => {
|
|
105
|
+
this.server.close(() => {
|
|
106
|
+
// Clean up socket file
|
|
107
|
+
if (fs.existsSync(socketPath)) {
|
|
108
|
+
fs.unlinkSync(socketPath);
|
|
109
|
+
}
|
|
110
|
+
resolve();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Handle incoming client connection
|
|
116
|
+
*/
|
|
117
|
+
handleConnection(socket) {
|
|
118
|
+
let buffer = '';
|
|
119
|
+
socket.on('data', async (chunk) => {
|
|
120
|
+
buffer += chunk.toString();
|
|
121
|
+
// Check if we have a complete message (delimited by newline)
|
|
122
|
+
const newlineIndex = buffer.indexOf('\n');
|
|
123
|
+
if (newlineIndex === -1)
|
|
124
|
+
return;
|
|
125
|
+
// Extract message
|
|
126
|
+
const message = buffer.slice(0, newlineIndex);
|
|
127
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
128
|
+
try {
|
|
129
|
+
const request = JSON.parse(message);
|
|
130
|
+
const response = await this.handleRequest(request);
|
|
131
|
+
// Send response
|
|
132
|
+
socket.write(JSON.stringify(response) + '\n');
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const errorResponse = {
|
|
136
|
+
id: 'unknown',
|
|
137
|
+
success: false,
|
|
138
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
139
|
+
};
|
|
140
|
+
socket.write(JSON.stringify(errorResponse) + '\n');
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
socket.on('error', (error) => {
|
|
144
|
+
console.error('[IPC Server] Socket error:', error);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Handle IPC request
|
|
149
|
+
*/
|
|
150
|
+
async handleRequest(request) {
|
|
151
|
+
const handler = this.handlers.get(request.command);
|
|
152
|
+
if (!handler) {
|
|
153
|
+
return {
|
|
154
|
+
id: request.id,
|
|
155
|
+
success: false,
|
|
156
|
+
error: `Unknown command: ${request.command}`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const data = await handler(request.params);
|
|
161
|
+
return {
|
|
162
|
+
id: request.id,
|
|
163
|
+
success: true,
|
|
164
|
+
data,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
return {
|
|
169
|
+
id: request.id,
|
|
170
|
+
success: false,
|
|
171
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.IPCServer = IPCServer;
|
|
177
|
+
//# sourceMappingURL=ipc-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-server.js","sourceRoot":"","sources":["../../src/ipc/ipc-server.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Output Formatting (CLI-specific)
|
|
3
|
+
*
|
|
4
|
+
* This module handles terminal output formatting.
|
|
5
|
+
* CLI-specific - not exported from core/index.ts
|
|
6
|
+
*/
|
|
7
|
+
import { Ora } from 'ora';
|
|
8
|
+
import { ErrorCode, ExecutionResult } from './core';
|
|
9
|
+
/**
|
|
10
|
+
* Format a git execution result for terminal output
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatResult(result: ExecutionResult): string;
|
|
13
|
+
/**
|
|
14
|
+
* Format an error code with details for terminal output
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatError(code: ErrorCode, details?: Record<string, any>): string;
|
|
17
|
+
/**
|
|
18
|
+
* Create a spinner for long-running operations
|
|
19
|
+
*/
|
|
20
|
+
export declare function createSpinner(text: string): Ora;
|
|
21
|
+
/**
|
|
22
|
+
* Print status messages
|
|
23
|
+
*/
|
|
24
|
+
export declare const status: {
|
|
25
|
+
success: (message: string) => void;
|
|
26
|
+
error: (message: string) => void;
|
|
27
|
+
warning: (message: string) => void;
|
|
28
|
+
info: (message: string) => void;
|
|
29
|
+
debug: (message: string) => void;
|
|
30
|
+
progress: (message: string) => void;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Print a header with framework detection info
|
|
34
|
+
*/
|
|
35
|
+
export declare function printFrameworkDetection(framework: string, command: string[], confidence: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Print connection status
|
|
38
|
+
*/
|
|
39
|
+
export declare function printConnectionStatus(connected: boolean, projectId?: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Print dev server status
|
|
42
|
+
*/
|
|
43
|
+
export declare function printDevServerStatus(running: boolean, pid?: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* Print git command execution
|
|
46
|
+
*/
|
|
47
|
+
export declare function printGitCommand(command: string): void;
|
|
48
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAEnD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAU5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CA+BlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAE/C;AAED;;GAEG;AACH,eAAO,MAAM,MAAM;uBACE,MAAM;qBACR,MAAM;uBACJ,MAAM;oBACT,MAAM;qBACL,MAAM;wBAMH,MAAM;CAG3B,CAAA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,QAM/F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAM3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,QAMlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,QAE9C"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Terminal Output Formatting (CLI-specific)
|
|
4
|
+
*
|
|
5
|
+
* This module handles terminal output formatting.
|
|
6
|
+
* CLI-specific - not exported from core/index.ts
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.status = void 0;
|
|
13
|
+
exports.formatResult = formatResult;
|
|
14
|
+
exports.formatError = formatError;
|
|
15
|
+
exports.createSpinner = createSpinner;
|
|
16
|
+
exports.printFrameworkDetection = printFrameworkDetection;
|
|
17
|
+
exports.printConnectionStatus = printConnectionStatus;
|
|
18
|
+
exports.printDevServerStatus = printDevServerStatus;
|
|
19
|
+
exports.printGitCommand = printGitCommand;
|
|
20
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
21
|
+
const ora_1 = __importDefault(require("ora"));
|
|
22
|
+
/**
|
|
23
|
+
* Format a git execution result for terminal output
|
|
24
|
+
*/
|
|
25
|
+
function formatResult(result) {
|
|
26
|
+
if (result.success) {
|
|
27
|
+
return chalk_1.default.green('✓ ' + (result.output || 'Success'));
|
|
28
|
+
}
|
|
29
|
+
let message = chalk_1.default.red('✗ Failed');
|
|
30
|
+
if (result.error) {
|
|
31
|
+
message += `: ${formatError(result.error, result.details)}`;
|
|
32
|
+
}
|
|
33
|
+
return message;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format an error code with details for terminal output
|
|
37
|
+
*/
|
|
38
|
+
function formatError(code, details) {
|
|
39
|
+
const errorMessages = {
|
|
40
|
+
GIT_NOT_INSTALLED: 'Git is not installed',
|
|
41
|
+
NOT_GIT_REPO: 'Not a git repository',
|
|
42
|
+
MERGE_CONFLICT: 'Merge conflict detected',
|
|
43
|
+
REBASE_CONFLICT: 'Rebase conflict - resolve conflicts or abort rebase',
|
|
44
|
+
UNCOMMITTED_CHANGES: 'You have uncommitted changes',
|
|
45
|
+
NETWORK_ERROR: 'Network error',
|
|
46
|
+
AUTH_FAILURE: 'Authentication failed',
|
|
47
|
+
BRANCH_NOT_FOUND: 'Branch not found',
|
|
48
|
+
BRANCH_ALREADY_EXISTS: 'Branch already exists',
|
|
49
|
+
PUSH_REJECTED: 'Push rejected',
|
|
50
|
+
COMMAND_TIMEOUT: 'Command timed out',
|
|
51
|
+
UNKNOWN_ERROR: 'Unknown error'
|
|
52
|
+
};
|
|
53
|
+
let message = chalk_1.default.red(errorMessages[code] || code);
|
|
54
|
+
if (details) {
|
|
55
|
+
if (details.uncommittedFiles && details.uncommittedFiles.length > 0) {
|
|
56
|
+
message += chalk_1.default.yellow('\n Uncommitted files: ' + details.uncommittedFiles.join(', '));
|
|
57
|
+
}
|
|
58
|
+
if (details.conflictingFiles && details.conflictingFiles.length > 0) {
|
|
59
|
+
message += chalk_1.default.yellow('\n Conflicting files: ' + details.conflictingFiles.join(', '));
|
|
60
|
+
}
|
|
61
|
+
if (details.branchName) {
|
|
62
|
+
message += chalk_1.default.cyan('\n Branch: ' + details.branchName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return message;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a spinner for long-running operations
|
|
69
|
+
*/
|
|
70
|
+
function createSpinner(text) {
|
|
71
|
+
return (0, ora_1.default)(text);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Print status messages
|
|
75
|
+
*/
|
|
76
|
+
exports.status = {
|
|
77
|
+
success: (message) => console.log(chalk_1.default.green('✓'), message),
|
|
78
|
+
error: (message) => console.log(chalk_1.default.red('✗'), message),
|
|
79
|
+
warning: (message) => console.log(chalk_1.default.yellow('⚠'), message),
|
|
80
|
+
info: (message) => console.log(chalk_1.default.blue('ℹ'), message),
|
|
81
|
+
debug: (message) => {
|
|
82
|
+
if (process.env.DEBUG) {
|
|
83
|
+
console.log(chalk_1.default.gray('⚙'), chalk_1.default.gray(message));
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
// EP606: Progress indicator that overwrites the current line
|
|
87
|
+
progress: (message) => {
|
|
88
|
+
process.stdout.write(`\r${chalk_1.default.blue('⏳')} ${message}`);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Print a header with framework detection info
|
|
93
|
+
*/
|
|
94
|
+
function printFrameworkDetection(framework, command, confidence) {
|
|
95
|
+
console.log(chalk_1.default.bold('\n🔍 Framework Detection'));
|
|
96
|
+
console.log(chalk_1.default.cyan(' Framework:'), framework);
|
|
97
|
+
console.log(chalk_1.default.cyan(' Command:'), command.join(' '));
|
|
98
|
+
console.log(chalk_1.default.cyan(' Confidence:'), confidence);
|
|
99
|
+
console.log();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Print connection status
|
|
103
|
+
*/
|
|
104
|
+
function printConnectionStatus(connected, projectId) {
|
|
105
|
+
if (connected) {
|
|
106
|
+
exports.status.success(`Connected to episoda.dev${projectId ? ` (${projectId})` : ''}`);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
exports.status.warning('Not connected to episoda.dev');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Print dev server status
|
|
114
|
+
*/
|
|
115
|
+
function printDevServerStatus(running, pid) {
|
|
116
|
+
if (running) {
|
|
117
|
+
exports.status.success(`Dev server running${pid ? ` (PID: ${pid})` : ''}`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
exports.status.warning('Dev server stopped');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Print git command execution
|
|
125
|
+
*/
|
|
126
|
+
function printGitCommand(command) {
|
|
127
|
+
exports.status.info(chalk_1.default.gray(`Executing: ${command}`));
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port availability checker
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if a port is in use
|
|
6
|
+
* @param port Port number to check
|
|
7
|
+
* @returns true if port is in use, false otherwise
|
|
8
|
+
*/
|
|
9
|
+
export declare function isPortInUse(port: number): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Get the server port from config or default
|
|
12
|
+
* @returns Port number
|
|
13
|
+
*/
|
|
14
|
+
export declare function getServerPort(): number;
|
|
15
|
+
//# sourceMappingURL=port-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-check.d.ts","sourceRoot":"","sources":["../../src/utils/port-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBhE;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAQtC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Port availability checker
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.isPortInUse = isPortInUse;
|
|
40
|
+
exports.getServerPort = getServerPort;
|
|
41
|
+
const net = __importStar(require("net"));
|
|
42
|
+
/**
|
|
43
|
+
* Check if a port is in use
|
|
44
|
+
* @param port Port number to check
|
|
45
|
+
* @returns true if port is in use, false otherwise
|
|
46
|
+
*/
|
|
47
|
+
async function isPortInUse(port) {
|
|
48
|
+
return new Promise((resolve) => {
|
|
49
|
+
const server = net.createServer();
|
|
50
|
+
server.once('error', (err) => {
|
|
51
|
+
if (err.code === 'EADDRINUSE') {
|
|
52
|
+
resolve(true);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
resolve(false);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
server.once('listening', () => {
|
|
59
|
+
server.close();
|
|
60
|
+
resolve(false);
|
|
61
|
+
});
|
|
62
|
+
// Don't specify host - bind to all interfaces to detect any listener
|
|
63
|
+
// This matches how Next.js and other dev servers bind
|
|
64
|
+
server.listen(port);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the server port from config or default
|
|
69
|
+
* @returns Port number
|
|
70
|
+
*/
|
|
71
|
+
function getServerPort() {
|
|
72
|
+
// Check environment variable
|
|
73
|
+
if (process.env.PORT) {
|
|
74
|
+
return parseInt(process.env.PORT, 10);
|
|
75
|
+
}
|
|
76
|
+
// Default to 3000 (Next.js default)
|
|
77
|
+
return 3000;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=port-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-check.js","sourceRoot":"","sources":["../../src/utils/port-check.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASH,kCAqBC;AAMD,sCAQC;AA1CD,yCAA0B;AAE1B;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAA;QAEjC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,EAAE;YAChC,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAA;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAA;YACd,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;QAEF,qEAAqE;QACrE,sDAAsD;QACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa;IAC3B,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACvC,CAAC;IAED,oCAAoC;IACpC,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Auto-Update Checker
|
|
3
|
+
* EP783: Check for updates on daemon startup and auto-update in background
|
|
4
|
+
*
|
|
5
|
+
* This module provides non-blocking update checking and background updates
|
|
6
|
+
* to ensure users always have the latest CLI version with correct git hooks.
|
|
7
|
+
*/
|
|
8
|
+
export interface UpdateCheckResult {
|
|
9
|
+
currentVersion: string;
|
|
10
|
+
latestVersion: string;
|
|
11
|
+
updateAvailable: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check npm registry for latest version
|
|
15
|
+
* Non-blocking - fails silently on network errors
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkForUpdates(currentVersion: string): Promise<UpdateCheckResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Run npm update in background (detached process)
|
|
20
|
+
* The update runs independently of the daemon process
|
|
21
|
+
*/
|
|
22
|
+
export declare function performBackgroundUpdate(): void;
|
|
23
|
+
//# sourceMappingURL=update-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/utils/update-checker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0BxF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAY9C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI Auto-Update Checker
|
|
4
|
+
* EP783: Check for updates on daemon startup and auto-update in background
|
|
5
|
+
*
|
|
6
|
+
* This module provides non-blocking update checking and background updates
|
|
7
|
+
* to ensure users always have the latest CLI version with correct git hooks.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.checkForUpdates = checkForUpdates;
|
|
44
|
+
exports.performBackgroundUpdate = performBackgroundUpdate;
|
|
45
|
+
const child_process_1 = require("child_process");
|
|
46
|
+
const semver = __importStar(require("semver"));
|
|
47
|
+
const PACKAGE_NAME = 'episoda';
|
|
48
|
+
const NPM_REGISTRY = 'https://registry.npmjs.org';
|
|
49
|
+
/**
|
|
50
|
+
* Check npm registry for latest version
|
|
51
|
+
* Non-blocking - fails silently on network errors
|
|
52
|
+
*/
|
|
53
|
+
async function checkForUpdates(currentVersion) {
|
|
54
|
+
try {
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout
|
|
57
|
+
const response = await fetch(`${NPM_REGISTRY}/${PACKAGE_NAME}/latest`, {
|
|
58
|
+
signal: controller.signal
|
|
59
|
+
});
|
|
60
|
+
clearTimeout(timeoutId);
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
return { currentVersion, latestVersion: currentVersion, updateAvailable: false };
|
|
63
|
+
}
|
|
64
|
+
const data = await response.json();
|
|
65
|
+
const latestVersion = data.version;
|
|
66
|
+
return {
|
|
67
|
+
currentVersion,
|
|
68
|
+
latestVersion,
|
|
69
|
+
updateAvailable: semver.gt(latestVersion, currentVersion)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
// Non-blocking - fail silently on network errors or timeouts
|
|
74
|
+
return { currentVersion, latestVersion: currentVersion, updateAvailable: false };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Run npm update in background (detached process)
|
|
79
|
+
* The update runs independently of the daemon process
|
|
80
|
+
*/
|
|
81
|
+
function performBackgroundUpdate() {
|
|
82
|
+
try {
|
|
83
|
+
const child = (0, child_process_1.spawn)('npm', ['update', '-g', PACKAGE_NAME], {
|
|
84
|
+
detached: true,
|
|
85
|
+
stdio: 'ignore',
|
|
86
|
+
// Use shell on Windows for proper npm execution
|
|
87
|
+
shell: process.platform === 'win32'
|
|
88
|
+
});
|
|
89
|
+
child.unref(); // Allow parent to exit independently
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
// Silently ignore spawn errors
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=update-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/utils/update-checker.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBH,0CA0BC;AAMD,0DAYC;AA5DD,iDAAqC;AACrC,+CAAgC;AAEhC,MAAM,YAAY,GAAG,SAAS,CAAA;AAC9B,MAAM,YAAY,GAAG,4BAA4B,CAAA;AAQjD;;;GAGG;AACI,KAAK,UAAU,eAAe,CAAC,cAAsB;IAC1D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA,CAAC,aAAa;QAE1E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,IAAI,YAAY,SAAS,EAAE;YACrE,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;QACF,YAAY,CAAC,SAAS,CAAC,CAAA;QAEvB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,CAAA;QAClF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyB,CAAA;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAA;QAElC,OAAO;YACL,cAAc;YACd,aAAa;YACb,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;SAC1D,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6DAA6D;QAC7D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,CAAA;IAClF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE;YACzD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,gDAAgD;YAChD,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAA;QACF,KAAK,CAAC,KAAK,EAAE,CAAA,CAAC,qCAAqC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "episoda",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "CLI tool for Episoda local development workflow orchestration",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"episoda": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc && chmod +x dist/index.js && mkdir -p dist/hooks && cp src/hooks/* dist/hooks/ && chmod +x dist/hooks/*",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"clean": "rm -rf dist",
|
|
14
|
+
"typecheck": "tsc --noEmit"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"episoda",
|
|
18
|
+
"cli",
|
|
19
|
+
"git",
|
|
20
|
+
"workflow",
|
|
21
|
+
"development"
|
|
22
|
+
],
|
|
23
|
+
"author": "Episoda",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"chalk": "^4.1.2",
|
|
27
|
+
"commander": "^11.1.0",
|
|
28
|
+
"ora": "^5.4.1",
|
|
29
|
+
"semver": "7.7.3",
|
|
30
|
+
"ws": "^8.18.0",
|
|
31
|
+
"zod": "^4.0.10"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^20.11.24",
|
|
35
|
+
"@types/semver": "7.7.1",
|
|
36
|
+
"@types/ws": "^8.5.10",
|
|
37
|
+
"typescript": "^5.3.3"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"README.md"
|
|
45
|
+
],
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "https://github.com/v20x/episoda.git",
|
|
49
|
+
"directory": "packages/episoda"
|
|
50
|
+
}
|
|
51
|
+
}
|