episoda 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/commands/auth.d.ts +22 -0
  2. package/dist/commands/auth.d.ts.map +1 -0
  3. package/dist/commands/auth.js +384 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/dev.d.ts +20 -0
  6. package/dist/commands/dev.d.ts.map +1 -0
  7. package/dist/commands/dev.js +305 -0
  8. package/dist/commands/dev.js.map +1 -0
  9. package/dist/commands/status.d.ts +9 -0
  10. package/dist/commands/status.d.ts.map +1 -0
  11. package/dist/commands/status.js +75 -0
  12. package/dist/commands/status.js.map +1 -0
  13. package/dist/commands/stop.d.ts +17 -0
  14. package/dist/commands/stop.d.ts.map +1 -0
  15. package/dist/commands/stop.js +81 -0
  16. package/dist/commands/stop.js.map +1 -0
  17. package/dist/core/auth.d.ts +26 -0
  18. package/dist/core/auth.d.ts.map +1 -0
  19. package/dist/core/auth.js +113 -0
  20. package/dist/core/auth.js.map +1 -0
  21. package/dist/core/command-protocol.d.ts +262 -0
  22. package/dist/core/command-protocol.d.ts.map +1 -0
  23. package/dist/core/command-protocol.js +13 -0
  24. package/dist/core/command-protocol.js.map +1 -0
  25. package/dist/core/connection-manager.d.ts +58 -0
  26. package/dist/core/connection-manager.d.ts.map +1 -0
  27. package/dist/core/connection-manager.js +215 -0
  28. package/dist/core/connection-manager.js.map +1 -0
  29. package/dist/core/errors.d.ts +18 -0
  30. package/dist/core/errors.d.ts.map +1 -0
  31. package/dist/core/errors.js +55 -0
  32. package/dist/core/errors.js.map +1 -0
  33. package/dist/core/git-executor.d.ts +157 -0
  34. package/dist/core/git-executor.d.ts.map +1 -0
  35. package/dist/core/git-executor.js +1605 -0
  36. package/dist/core/git-executor.js.map +1 -0
  37. package/dist/core/git-parser.d.ts +40 -0
  38. package/dist/core/git-parser.d.ts.map +1 -0
  39. package/dist/core/git-parser.js +194 -0
  40. package/dist/core/git-parser.js.map +1 -0
  41. package/dist/core/git-validator.d.ts +42 -0
  42. package/dist/core/git-validator.d.ts.map +1 -0
  43. package/dist/core/git-validator.js +102 -0
  44. package/dist/core/git-validator.js.map +1 -0
  45. package/dist/core/index.d.ts +17 -0
  46. package/dist/core/index.d.ts.map +1 -0
  47. package/dist/core/index.js +41 -0
  48. package/dist/core/index.js.map +1 -0
  49. package/dist/core/version.d.ts +9 -0
  50. package/dist/core/version.d.ts.map +1 -0
  51. package/dist/core/version.js +19 -0
  52. package/dist/core/version.js.map +1 -0
  53. package/dist/core/websocket-client.d.ts +122 -0
  54. package/dist/core/websocket-client.d.ts.map +1 -0
  55. package/dist/core/websocket-client.js +438 -0
  56. package/dist/core/websocket-client.js.map +1 -0
  57. package/dist/daemon/daemon-manager.d.ts +71 -0
  58. package/dist/daemon/daemon-manager.d.ts.map +1 -0
  59. package/dist/daemon/daemon-manager.js +289 -0
  60. package/dist/daemon/daemon-manager.js.map +1 -0
  61. package/dist/daemon/daemon-process.d.ts +13 -0
  62. package/dist/daemon/daemon-process.d.ts.map +1 -0
  63. package/dist/daemon/daemon-process.js +608 -0
  64. package/dist/daemon/daemon-process.js.map +1 -0
  65. package/dist/daemon/machine-id.d.ts +36 -0
  66. package/dist/daemon/machine-id.d.ts.map +1 -0
  67. package/dist/daemon/machine-id.js +195 -0
  68. package/dist/daemon/machine-id.js.map +1 -0
  69. package/dist/daemon/project-tracker.d.ts +92 -0
  70. package/dist/daemon/project-tracker.d.ts.map +1 -0
  71. package/dist/daemon/project-tracker.js +259 -0
  72. package/dist/daemon/project-tracker.js.map +1 -0
  73. package/dist/dev-wrapper.d.ts +88 -0
  74. package/dist/dev-wrapper.d.ts.map +1 -0
  75. package/dist/dev-wrapper.js +288 -0
  76. package/dist/dev-wrapper.js.map +1 -0
  77. package/dist/framework-detector.d.ts +29 -0
  78. package/dist/framework-detector.d.ts.map +1 -0
  79. package/dist/framework-detector.js +276 -0
  80. package/dist/framework-detector.js.map +1 -0
  81. package/dist/git-helpers/git-credential-helper.d.ts +29 -0
  82. package/dist/git-helpers/git-credential-helper.d.ts.map +1 -0
  83. package/dist/git-helpers/git-credential-helper.js +349 -0
  84. package/dist/git-helpers/git-credential-helper.js.map +1 -0
  85. package/dist/hooks/post-checkout +296 -0
  86. package/dist/hooks/pre-commit +139 -0
  87. package/dist/index.d.ts +8 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +102 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/ipc/ipc-client.d.ts +95 -0
  92. package/dist/ipc/ipc-client.d.ts.map +1 -0
  93. package/dist/ipc/ipc-client.js +204 -0
  94. package/dist/ipc/ipc-client.js.map +1 -0
  95. package/dist/ipc/ipc-server.d.ts +55 -0
  96. package/dist/ipc/ipc-server.d.ts.map +1 -0
  97. package/dist/ipc/ipc-server.js +177 -0
  98. package/dist/ipc/ipc-server.js.map +1 -0
  99. package/dist/output.d.ts +48 -0
  100. package/dist/output.d.ts.map +1 -0
  101. package/dist/output.js +129 -0
  102. package/dist/output.js.map +1 -0
  103. package/dist/utils/port-check.d.ts +15 -0
  104. package/dist/utils/port-check.d.ts.map +1 -0
  105. package/dist/utils/port-check.js +79 -0
  106. package/dist/utils/port-check.js.map +1 -0
  107. package/dist/utils/update-checker.d.ts +23 -0
  108. package/dist/utils/update-checker.d.ts.map +1 -0
  109. package/dist/utils/update-checker.js +95 -0
  110. package/dist/utils/update-checker.js.map +1 -0
  111. package/package.json +51 -0
@@ -0,0 +1,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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"}
@@ -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
+ }