sylas-ai 0.2.21

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.

Potentially problematic release.


This version of sylas-ai might be problematic. Click here for more details.

Files changed (126) hide show
  1. package/README.md +52 -0
  2. package/dist/Application.d.ts +75 -0
  3. package/dist/Application.d.ts.map +1 -0
  4. package/dist/Application.js +289 -0
  5. package/dist/Application.js.map +1 -0
  6. package/dist/app.d.ts +3 -0
  7. package/dist/app.d.ts.map +1 -0
  8. package/dist/app.js +93 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/commands/AuthCommand.d.ts +8 -0
  11. package/dist/commands/AuthCommand.d.ts.map +1 -0
  12. package/dist/commands/AuthCommand.js +70 -0
  13. package/dist/commands/AuthCommand.js.map +1 -0
  14. package/dist/commands/CheckTokensCommand.d.ts +8 -0
  15. package/dist/commands/CheckTokensCommand.d.ts.map +1 -0
  16. package/dist/commands/CheckTokensCommand.js +53 -0
  17. package/dist/commands/CheckTokensCommand.js.map +1 -0
  18. package/dist/commands/ICommand.d.ts +38 -0
  19. package/dist/commands/ICommand.d.ts.map +1 -0
  20. package/dist/commands/ICommand.js +37 -0
  21. package/dist/commands/ICommand.js.map +1 -0
  22. package/dist/commands/RefreshTokenCommand.d.ts +8 -0
  23. package/dist/commands/RefreshTokenCommand.d.ts.map +1 -0
  24. package/dist/commands/RefreshTokenCommand.js +152 -0
  25. package/dist/commands/RefreshTokenCommand.js.map +1 -0
  26. package/dist/commands/SelfAddRepoCommand.d.ts +17 -0
  27. package/dist/commands/SelfAddRepoCommand.d.ts.map +1 -0
  28. package/dist/commands/SelfAddRepoCommand.js +164 -0
  29. package/dist/commands/SelfAddRepoCommand.js.map +1 -0
  30. package/dist/commands/SelfAuthCommand.d.ts +16 -0
  31. package/dist/commands/SelfAuthCommand.d.ts.map +1 -0
  32. package/dist/commands/SelfAuthCommand.js +213 -0
  33. package/dist/commands/SelfAuthCommand.js.map +1 -0
  34. package/dist/commands/StartCommand.d.ts +8 -0
  35. package/dist/commands/StartCommand.d.ts.map +1 -0
  36. package/dist/commands/StartCommand.js +76 -0
  37. package/dist/commands/StartCommand.js.map +1 -0
  38. package/dist/config/constants.d.ts +12 -0
  39. package/dist/config/constants.d.ts.map +1 -0
  40. package/dist/config/constants.js +19 -0
  41. package/dist/config/constants.js.map +1 -0
  42. package/dist/config/types.d.ts +21 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +2 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/services/ConfigService.d.ts +37 -0
  47. package/dist/services/ConfigService.d.ts.map +1 -0
  48. package/dist/services/ConfigService.js +121 -0
  49. package/dist/services/ConfigService.js.map +1 -0
  50. package/dist/services/Logger.d.ts +77 -0
  51. package/dist/services/Logger.d.ts.map +1 -0
  52. package/dist/services/Logger.js +100 -0
  53. package/dist/services/Logger.js.map +1 -0
  54. package/dist/services/WorkerService.d.ts +59 -0
  55. package/dist/services/WorkerService.d.ts.map +1 -0
  56. package/dist/services/WorkerService.js +220 -0
  57. package/dist/services/WorkerService.js.map +1 -0
  58. package/dist/src/Application.d.ts +75 -0
  59. package/dist/src/Application.d.ts.map +1 -0
  60. package/dist/src/Application.js +289 -0
  61. package/dist/src/Application.js.map +1 -0
  62. package/dist/src/app.d.ts +3 -0
  63. package/dist/src/app.d.ts.map +1 -0
  64. package/dist/src/app.js +93 -0
  65. package/dist/src/app.js.map +1 -0
  66. package/dist/src/commands/AuthCommand.d.ts +8 -0
  67. package/dist/src/commands/AuthCommand.d.ts.map +1 -0
  68. package/dist/src/commands/AuthCommand.js +70 -0
  69. package/dist/src/commands/AuthCommand.js.map +1 -0
  70. package/dist/src/commands/CheckTokensCommand.d.ts +8 -0
  71. package/dist/src/commands/CheckTokensCommand.d.ts.map +1 -0
  72. package/dist/src/commands/CheckTokensCommand.js +53 -0
  73. package/dist/src/commands/CheckTokensCommand.js.map +1 -0
  74. package/dist/src/commands/ICommand.d.ts +38 -0
  75. package/dist/src/commands/ICommand.d.ts.map +1 -0
  76. package/dist/src/commands/ICommand.js +37 -0
  77. package/dist/src/commands/ICommand.js.map +1 -0
  78. package/dist/src/commands/RefreshTokenCommand.d.ts +8 -0
  79. package/dist/src/commands/RefreshTokenCommand.d.ts.map +1 -0
  80. package/dist/src/commands/RefreshTokenCommand.js +152 -0
  81. package/dist/src/commands/RefreshTokenCommand.js.map +1 -0
  82. package/dist/src/commands/SelfAddRepoCommand.d.ts +17 -0
  83. package/dist/src/commands/SelfAddRepoCommand.d.ts.map +1 -0
  84. package/dist/src/commands/SelfAddRepoCommand.js +164 -0
  85. package/dist/src/commands/SelfAddRepoCommand.js.map +1 -0
  86. package/dist/src/commands/SelfAuthCommand.d.ts +16 -0
  87. package/dist/src/commands/SelfAuthCommand.d.ts.map +1 -0
  88. package/dist/src/commands/SelfAuthCommand.js +213 -0
  89. package/dist/src/commands/SelfAuthCommand.js.map +1 -0
  90. package/dist/src/commands/StartCommand.d.ts +8 -0
  91. package/dist/src/commands/StartCommand.d.ts.map +1 -0
  92. package/dist/src/commands/StartCommand.js +76 -0
  93. package/dist/src/commands/StartCommand.js.map +1 -0
  94. package/dist/src/config/constants.d.ts +12 -0
  95. package/dist/src/config/constants.d.ts.map +1 -0
  96. package/dist/src/config/constants.js +19 -0
  97. package/dist/src/config/constants.js.map +1 -0
  98. package/dist/src/config/types.d.ts +21 -0
  99. package/dist/src/config/types.d.ts.map +1 -0
  100. package/dist/src/config/types.js +2 -0
  101. package/dist/src/config/types.js.map +1 -0
  102. package/dist/src/services/ConfigService.d.ts +37 -0
  103. package/dist/src/services/ConfigService.d.ts.map +1 -0
  104. package/dist/src/services/ConfigService.js +121 -0
  105. package/dist/src/services/ConfigService.js.map +1 -0
  106. package/dist/src/services/Logger.d.ts +77 -0
  107. package/dist/src/services/Logger.d.ts.map +1 -0
  108. package/dist/src/services/Logger.js +100 -0
  109. package/dist/src/services/Logger.js.map +1 -0
  110. package/dist/src/services/WorkerService.d.ts +59 -0
  111. package/dist/src/services/WorkerService.d.ts.map +1 -0
  112. package/dist/src/services/WorkerService.js +220 -0
  113. package/dist/src/services/WorkerService.js.map +1 -0
  114. package/dist/src/ui/CLIPrompts.d.ts +18 -0
  115. package/dist/src/ui/CLIPrompts.d.ts.map +1 -0
  116. package/dist/src/ui/CLIPrompts.js +53 -0
  117. package/dist/src/ui/CLIPrompts.js.map +1 -0
  118. package/dist/ui/CLIPrompts.d.ts +18 -0
  119. package/dist/ui/CLIPrompts.d.ts.map +1 -0
  120. package/dist/ui/CLIPrompts.js +53 -0
  121. package/dist/ui/CLIPrompts.js.map +1 -0
  122. package/dist/vitest.config.d.ts +3 -0
  123. package/dist/vitest.config.d.ts.map +1 -0
  124. package/dist/vitest.config.js +13 -0
  125. package/dist/vitest.config.js.map +1 -0
  126. package/package.json +63 -0
@@ -0,0 +1,289 @@
1
+ import { existsSync, mkdirSync, watch } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import dotenv from "dotenv";
4
+ import { DEFAULT_PROXY_URL, DEFAULT_WORKTREES_DIR, } from "sylas-core";
5
+ import { GitService, SharedApplicationServer } from "sylas-edge-worker";
6
+ import { DEFAULT_SERVER_PORT, parsePort } from "./config/constants.js";
7
+ import { ConfigService } from "./services/ConfigService.js";
8
+ import { Logger } from "./services/Logger.js";
9
+ import { WorkerService } from "./services/WorkerService.js";
10
+ /**
11
+ * Main application context providing access to services
12
+ */
13
+ export class Application {
14
+ sylasHome;
15
+ config;
16
+ git;
17
+ worker;
18
+ logger;
19
+ version;
20
+ envWatcher;
21
+ configWatcher;
22
+ isInSetupWaitingMode = false;
23
+ isInIdleMode = false;
24
+ envFilePath;
25
+ constructor(sylasHome, customEnvPath, version) {
26
+ this.sylasHome = sylasHome;
27
+ // Initialize logger first
28
+ this.logger = new Logger();
29
+ // Store version
30
+ this.version = version || "unknown";
31
+ // Determine the env file path: use custom path if provided, otherwise default to ~/.sylas/.env
32
+ this.envFilePath = customEnvPath || join(sylasHome, ".env");
33
+ // Ensure required directories exist
34
+ this.ensureRequiredDirectories();
35
+ // Load environment variables from the determined env file path
36
+ this.loadEnvFile();
37
+ // Watch .env file for changes and reload
38
+ this.setupEnvFileWatcher();
39
+ // Initialize services
40
+ this.config = new ConfigService(sylasHome, this.logger);
41
+ this.git = new GitService(this.logger);
42
+ this.worker = new WorkerService(this.config, this.git, sylasHome, this.logger, this.version);
43
+ }
44
+ /**
45
+ * Load environment variables from the configured env file path
46
+ */
47
+ loadEnvFile() {
48
+ if (existsSync(this.envFilePath)) {
49
+ dotenv.config({ path: this.envFilePath, override: true });
50
+ this.logger.info(`🔧 Loaded environment variables from ${this.envFilePath}`);
51
+ }
52
+ }
53
+ /**
54
+ * Setup file watcher for .env file to reload on changes
55
+ */
56
+ setupEnvFileWatcher() {
57
+ // Only watch if file exists
58
+ if (!existsSync(this.envFilePath)) {
59
+ return;
60
+ }
61
+ try {
62
+ this.envWatcher = watch(this.envFilePath, (eventType) => {
63
+ if (eventType === "change") {
64
+ this.logger.info("🔄 .env file changed, reloading...");
65
+ this.loadEnvFile();
66
+ }
67
+ });
68
+ this.logger.info(`👀 Watching .env file for changes: ${this.envFilePath}`);
69
+ }
70
+ catch (error) {
71
+ this.logger.error(`❌ Failed to watch .env file: ${error}`);
72
+ }
73
+ }
74
+ /**
75
+ * Ensure required Sylas directories exist
76
+ * Creates: ~/.sylas/repos, ~/.sylas/worktrees, ~/.sylas/mcp-configs
77
+ */
78
+ ensureRequiredDirectories() {
79
+ const requiredDirs = ["repos", DEFAULT_WORKTREES_DIR, "mcp-configs"];
80
+ for (const dir of requiredDirs) {
81
+ const dirPath = join(this.sylasHome, dir);
82
+ if (!existsSync(dirPath)) {
83
+ try {
84
+ mkdirSync(dirPath, { recursive: true });
85
+ this.logger.info(`📁 Created directory: ${dirPath}`);
86
+ }
87
+ catch (error) {
88
+ this.logger.error(`❌ Failed to create directory ${dirPath}: ${error}`);
89
+ throw error;
90
+ }
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Get proxy URL from environment or use default
96
+ */
97
+ getProxyUrl() {
98
+ return process.env.PROXY_URL || DEFAULT_PROXY_URL;
99
+ }
100
+ /**
101
+ * Check if using default proxy
102
+ */
103
+ isUsingDefaultProxy() {
104
+ return this.getProxyUrl() === DEFAULT_PROXY_URL;
105
+ }
106
+ /**
107
+ * Create a temporary SharedApplicationServer for OAuth
108
+ */
109
+ async createTempServer() {
110
+ const serverPort = parsePort(process.env.SYLAS_SERVER_PORT, DEFAULT_SERVER_PORT);
111
+ return new SharedApplicationServer(serverPort);
112
+ }
113
+ /**
114
+ * Enable setup waiting mode and start watching config.json for repositories
115
+ */
116
+ enableSetupWaitingMode() {
117
+ this.isInSetupWaitingMode = true;
118
+ this.startConfigWatcher();
119
+ }
120
+ /**
121
+ * Enable idle mode (post-onboarding, no repositories) and start watching config.json
122
+ */
123
+ enableIdleMode() {
124
+ this.isInIdleMode = true;
125
+ this.startConfigWatcher();
126
+ }
127
+ /**
128
+ * Setup file watcher for config.json to detect when repositories are added
129
+ */
130
+ startConfigWatcher() {
131
+ const configPath = this.config.getConfigPath();
132
+ // Create empty config file if it doesn't exist
133
+ if (!existsSync(configPath)) {
134
+ try {
135
+ const configDir = dirname(configPath);
136
+ if (!existsSync(configDir)) {
137
+ mkdirSync(configDir, { recursive: true });
138
+ }
139
+ // Create empty config with empty repositories array
140
+ this.config.save({ repositories: [] });
141
+ this.logger.info(`📝 Created empty config file: ${configPath}`);
142
+ }
143
+ catch (error) {
144
+ this.logger.error(`❌ Failed to create config file: ${error}`);
145
+ return;
146
+ }
147
+ }
148
+ try {
149
+ this.configWatcher = watch(configPath, async (eventType) => {
150
+ if (eventType === "change" &&
151
+ (this.isInSetupWaitingMode || this.isInIdleMode)) {
152
+ this.logger.info("🔄 Configuration file changed, checking for repositories...");
153
+ // Reload config and check if repositories were added
154
+ const edgeConfig = this.config.load();
155
+ const repositories = edgeConfig.repositories || [];
156
+ if (repositories.length > 0) {
157
+ this.logger.success("✅ Configuration received!");
158
+ this.logger.info(`📦 Starting edge worker with ${repositories.length} repository(ies)...`);
159
+ // Remove SYLAS_SETUP_PENDING flag from .env (only in setup waiting mode)
160
+ if (this.isInSetupWaitingMode) {
161
+ await this.removeSetupPendingFlag();
162
+ }
163
+ // Transition to normal operation mode
164
+ await this.transitionToNormalMode(repositories);
165
+ }
166
+ }
167
+ });
168
+ this.logger.info(`👀 Watching config.json for repository configuration: ${configPath}`);
169
+ }
170
+ catch (error) {
171
+ this.logger.error(`❌ Failed to watch config.json: ${error}`);
172
+ }
173
+ }
174
+ /**
175
+ * Remove SYLAS_SETUP_PENDING flag from .env file
176
+ */
177
+ async removeSetupPendingFlag() {
178
+ const { readFile, writeFile } = await import("node:fs/promises");
179
+ const envPath = join(this.sylasHome, ".env");
180
+ if (!existsSync(envPath)) {
181
+ return;
182
+ }
183
+ try {
184
+ const envContent = await readFile(envPath, "utf-8");
185
+ const updatedContent = envContent
186
+ .split("\n")
187
+ .filter((line) => !line.startsWith("SYLAS_SETUP_PENDING="))
188
+ .join("\n");
189
+ await writeFile(envPath, updatedContent, "utf-8");
190
+ this.logger.info("✅ Removed SYLAS_SETUP_PENDING flag from .env");
191
+ // Reload environment variables
192
+ this.loadEnvFile();
193
+ }
194
+ catch (error) {
195
+ this.logger.error(`❌ Failed to remove SYLAS_SETUP_PENDING flag: ${error}`);
196
+ }
197
+ }
198
+ /**
199
+ * Transition from setup waiting mode to normal operation
200
+ */
201
+ async transitionToNormalMode(repositories) {
202
+ try {
203
+ this.isInSetupWaitingMode = false;
204
+ this.isInIdleMode = false;
205
+ // Close config watcher
206
+ if (this.configWatcher) {
207
+ this.configWatcher.close();
208
+ this.configWatcher = undefined;
209
+ }
210
+ // Stop the setup waiting mode or idle mode server before starting EdgeWorker
211
+ await this.worker.stopWaitingServer();
212
+ // Start the EdgeWorker with the new configuration
213
+ await this.worker.startEdgeWorker({
214
+ repositories,
215
+ });
216
+ // Display server information
217
+ const serverPort = this.worker.getServerPort();
218
+ this.logger.raw("");
219
+ this.logger.divider(70);
220
+ this.logger.success("Edge worker started successfully");
221
+ this.logger.info(`📌 Version: ${this.version}`);
222
+ this.logger.info(`🔗 Server running on port ${serverPort}`);
223
+ if (process.env.CLOUDFLARE_TOKEN) {
224
+ this.logger.info("🌩️ Cloudflare tunnel: Active");
225
+ }
226
+ this.logger.info(`\n📦 Managing ${repositories.length} repositories:`);
227
+ repositories.forEach((repo) => {
228
+ this.logger.info(` • ${repo.name} (${repo.repositoryPath})`);
229
+ });
230
+ this.logger.divider(70);
231
+ }
232
+ catch (error) {
233
+ this.logger.error(`❌ Failed to transition to normal mode: ${error}`);
234
+ process.exit(1);
235
+ }
236
+ }
237
+ /**
238
+ * Handle graceful shutdown
239
+ */
240
+ async shutdown() {
241
+ // Close .env file watcher
242
+ if (this.envWatcher) {
243
+ this.envWatcher.close();
244
+ }
245
+ // Close config file watcher
246
+ if (this.configWatcher) {
247
+ this.configWatcher.close();
248
+ }
249
+ await this.worker.stop();
250
+ process.exit(0);
251
+ }
252
+ /**
253
+ * Setup process signal handlers
254
+ */
255
+ setupSignalHandlers() {
256
+ process.on("SIGINT", () => {
257
+ this.logger.info("\nReceived SIGINT, shutting down gracefully...");
258
+ void this.shutdown();
259
+ });
260
+ process.on("SIGTERM", () => {
261
+ this.logger.info("\nReceived SIGTERM, shutting down gracefully...");
262
+ void this.shutdown();
263
+ });
264
+ // Handle uncaught exceptions and unhandled promise rejections
265
+ process.on("uncaughtException", (error) => {
266
+ this.logger.error(`🚨 Uncaught Exception: ${error.message}`);
267
+ this.logger.error(`Error type: ${error.constructor.name}`);
268
+ this.logger.error(`Stack: ${error.stack}`);
269
+ this.logger.error("This error was caught by the global handler, preventing application crash");
270
+ // Attempt graceful shutdown but don't wait indefinitely
271
+ this.shutdown().finally(() => {
272
+ this.logger.error("Process exiting due to uncaught exception");
273
+ process.exit(1);
274
+ });
275
+ });
276
+ process.on("unhandledRejection", (reason, promise) => {
277
+ this.logger.error(`🚨 Unhandled Promise Rejection at: ${promise}`);
278
+ this.logger.error(`Reason: ${reason}`);
279
+ this.logger.error("This rejection was caught by the global handler, continuing operation");
280
+ // Log stack trace if reason is an Error
281
+ if (reason instanceof Error && reason.stack) {
282
+ this.logger.error(`Stack: ${reason.stack}`);
283
+ }
284
+ // Log the error but don't exit the process for promise rejections
285
+ // as they might be recoverable
286
+ });
287
+ }
288
+ }
289
+ //# sourceMappingURL=Application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Application.js","sourceRoot":"","sources":["../../src/Application.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { Command } from "commander";
7
+ import { Application } from "./Application.js";
8
+ import { AuthCommand } from "./commands/AuthCommand.js";
9
+ import { CheckTokensCommand } from "./commands/CheckTokensCommand.js";
10
+ import { RefreshTokenCommand } from "./commands/RefreshTokenCommand.js";
11
+ import { SelfAddRepoCommand } from "./commands/SelfAddRepoCommand.js";
12
+ import { SelfAuthCommand } from "./commands/SelfAuthCommand.js";
13
+ import { StartCommand } from "./commands/StartCommand.js";
14
+ // Get the directory of the current module for reading package.json
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ // Read package.json to get the actual version
18
+ // When compiled, this is in dist/src/, so we need to go up two levels
19
+ const packageJsonPath = resolve(__dirname, "..", "..", "package.json");
20
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
21
+ // Setup Commander program
22
+ const program = new Command();
23
+ program
24
+ .name("sylas")
25
+ .description("AI-powered Linear issue automation using Claude")
26
+ .version(packageJson.version)
27
+ .option("--sylas-home <path>", "Specify custom Sylas config directory", resolve(homedir(), ".sylas"))
28
+ .option("--env-file <path>", "Path to environment variables file");
29
+ // Start command (default)
30
+ program
31
+ .command("start", { isDefault: true })
32
+ .description("Start the edge worker")
33
+ .action(async () => {
34
+ const opts = program.opts();
35
+ const app = new Application(opts.sylasHome, opts.envFile, packageJson.version);
36
+ await new StartCommand(app).execute([]);
37
+ });
38
+ // Auth command
39
+ program
40
+ .command("auth <auth-key>")
41
+ .description("Authenticate with Sylas using auth key")
42
+ .action(async (authKey) => {
43
+ const opts = program.opts();
44
+ const app = new Application(opts.sylasHome, opts.envFile, packageJson.version);
45
+ await new AuthCommand(app).execute([authKey]);
46
+ });
47
+ // Check tokens command
48
+ program
49
+ .command("check-tokens")
50
+ .description("Check the status of all Linear tokens")
51
+ .action(async () => {
52
+ const opts = program.opts();
53
+ const app = new Application(opts.sylasHome, opts.envFile, packageJson.version);
54
+ await new CheckTokensCommand(app).execute([]);
55
+ });
56
+ // Refresh token command
57
+ program
58
+ .command("refresh-token")
59
+ .description("Refresh a specific Linear token")
60
+ .action(async () => {
61
+ const opts = program.opts();
62
+ const app = new Application(opts.sylasHome, opts.envFile, packageJson.version);
63
+ await new RefreshTokenCommand(app).execute([]);
64
+ });
65
+ // Self-auth command - Linear OAuth directly from CLI
66
+ program
67
+ .command("self-auth")
68
+ .description("Authenticate with Linear OAuth directly")
69
+ .action(async () => {
70
+ const opts = program.opts();
71
+ const app = new Application(opts.sylasHome, opts.envFile, packageJson.version);
72
+ await new SelfAuthCommand(app).execute([]);
73
+ });
74
+ // Self-add-repo command - Clone and add repository
75
+ program
76
+ .command("self-add-repo [url] [workspace]")
77
+ .description('Clone a repo and add it to config. URL accepts any valid git clone address (e.g., "https://github.com/org/repo.git"). Workspace is the display name of the Linear workspace (e.g., "My Workspace") - not a UUID.')
78
+ .action(async (url, workspace) => {
79
+ const opts = program.opts();
80
+ const app = new Application(opts.sylasHome, opts.envFile, packageJson.version);
81
+ await new SelfAddRepoCommand(app).execute([url, workspace].filter(Boolean));
82
+ });
83
+ // Parse and execute
84
+ (async () => {
85
+ try {
86
+ await program.parseAsync(process.argv);
87
+ }
88
+ catch (error) {
89
+ console.error("Fatal error:", error);
90
+ process.exit(1);
91
+ }
92
+ })();
93
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { BaseCommand } from "./ICommand.js";
2
+ /**
3
+ * Auth command - authenticate with Sylas Pro plan using auth key
4
+ */
5
+ export declare class AuthCommand extends BaseCommand {
6
+ execute(args: string[]): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=AuthCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/AuthCommand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;IACrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAiF5C"}
@@ -0,0 +1,70 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { getSylasAppUrl } from "sylas-cloudflare-tunnel-client";
4
+ import { BaseCommand } from "./ICommand.js";
5
+ /**
6
+ * Auth command - authenticate with Sylas Pro plan using auth key
7
+ */
8
+ export class AuthCommand extends BaseCommand {
9
+ async execute(args) {
10
+ // Get auth key from command line arguments
11
+ const authKey = args[0];
12
+ if (!authKey ||
13
+ typeof authKey !== "string" ||
14
+ authKey.trim().length === 0) {
15
+ this.logError("Error: Auth key is required");
16
+ console.log("\nUsage: sylas auth <auth-key>");
17
+ console.log(`\nGet your auth key from: ${getSylasAppUrl()}/onboarding/auth-sylas`);
18
+ process.exit(1);
19
+ }
20
+ console.log("\n🔑 Authenticating with Sylas...");
21
+ this.logDivider();
22
+ try {
23
+ // Import ConfigApiClient
24
+ const { ConfigApiClient } = await import("sylas-cloudflare-tunnel-client");
25
+ // Call the config API to get credentials
26
+ console.log("Validating auth key...");
27
+ const configResponse = await ConfigApiClient.getConfig(authKey);
28
+ if (!ConfigApiClient.isValid(configResponse)) {
29
+ this.logError("Authentication failed");
30
+ console.error(configResponse.error || "Invalid response from server");
31
+ console.log("\nPlease verify your auth key is correct.");
32
+ console.log(`Get your auth key from: ${getSylasAppUrl()}/onboarding/auth-sylas`);
33
+ process.exit(1);
34
+ }
35
+ this.logSuccess("Authentication successful!");
36
+ // Ensure SYLAS_HOME directory exists
37
+ if (!existsSync(this.app.sylasHome)) {
38
+ mkdirSync(this.app.sylasHome, { recursive: true });
39
+ }
40
+ // Store tokens in ~/.sylas/.env file
41
+ const envPath = resolve(this.app.sylasHome, ".env");
42
+ const envContent = `# Sylas Authentication Credentials
43
+ # Generated on ${new Date().toISOString()}
44
+ CLOUDFLARE_TOKEN=${configResponse.config.cloudflareToken}
45
+ SYLAS_API_KEY=${configResponse.config.apiKey}
46
+ SYLAS_SETUP_PENDING=true
47
+ `;
48
+ writeFileSync(envPath, envContent, "utf-8");
49
+ this.logSuccess(`Credentials saved to ${envPath}`);
50
+ // Reload environment variables to pick up SYLAS_SETUP_PENDING
51
+ const dotenv = await import("dotenv");
52
+ dotenv.config({ path: envPath, override: true });
53
+ console.log("\n✨ Setup complete! Starting Sylas...");
54
+ this.logDivider();
55
+ console.log();
56
+ // Start the edge app with the new configuration
57
+ // Import StartCommand to avoid circular dependency
58
+ const { StartCommand } = await import("./StartCommand.js");
59
+ const startCommand = new StartCommand(this.app);
60
+ await startCommand.execute([]);
61
+ }
62
+ catch (error) {
63
+ this.logError("Authentication failed:");
64
+ console.error(error.message);
65
+ console.log("\nPlease try again or contact support if the issue persists.");
66
+ process.exit(1);
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=AuthCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthCommand.js","sourceRoot":"","sources":["../../../src/commands/AuthCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC3C,KAAK,CAAC,OAAO,CAAC,IAAc;QAC3B,2CAA2C;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAExB,IACC,CAAC,OAAO;YACR,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC1B,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CACV,6BAA6B,cAAc,EAAE,wBAAwB,CACrE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC;YACJ,yBAAyB;YACzB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CACvC,gCAAgC,CAChC,CAAC;YAEF,yCAAyC;YACzC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAEhE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBACvC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CACV,2BAA2B,cAAc,EAAE,wBAAwB,CACnE,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC;YAE9C,qCAAqC;YACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,qCAAqC;YACrC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG;iBACL,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;mBACtB,cAAc,CAAC,MAAO,CAAC,eAAe;gBACzC,cAAc,CAAC,MAAO,CAAC,MAAM;;CAE5C,CAAC;YAEC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,UAAU,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;YAEnD,8DAA8D;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAEjD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,gDAAgD;YAChD,mDAAmD;YACnD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CACV,8DAA8D,CAC9D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ import { BaseCommand } from "./ICommand.js";
2
+ /**
3
+ * Check tokens command - check the status of all Linear tokens
4
+ */
5
+ export declare class CheckTokensCommand extends BaseCommand {
6
+ execute(_args: string[]): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=CheckTokensCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckTokensCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/CheckTokensCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAmC5C;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;IAC5C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB7C"}
@@ -0,0 +1,53 @@
1
+ import { BaseCommand } from "./ICommand.js";
2
+ /**
3
+ * Helper function to check Linear token status
4
+ */
5
+ async function checkLinearToken(token) {
6
+ try {
7
+ const response = await fetch("https://api.linear.app/graphql", {
8
+ method: "POST",
9
+ headers: {
10
+ "Content-Type": "application/json",
11
+ Authorization: token,
12
+ },
13
+ body: JSON.stringify({
14
+ query: "{ viewer { id email name } }",
15
+ }),
16
+ });
17
+ const data = (await response.json());
18
+ if (data.errors) {
19
+ return {
20
+ valid: false,
21
+ error: data.errors[0]?.message || "Unknown error",
22
+ };
23
+ }
24
+ return { valid: true };
25
+ }
26
+ catch (error) {
27
+ return { valid: false, error: error.message };
28
+ }
29
+ }
30
+ /**
31
+ * Check tokens command - check the status of all Linear tokens
32
+ */
33
+ export class CheckTokensCommand extends BaseCommand {
34
+ async execute(_args) {
35
+ if (!this.app.config.exists()) {
36
+ this.logError("No edge configuration found. Please run setup first.");
37
+ process.exit(1);
38
+ }
39
+ const config = this.app.config.load();
40
+ console.log("Checking Linear tokens...\n");
41
+ for (const repo of config.repositories) {
42
+ process.stdout.write(`${repo.name} (${repo.linearWorkspaceName}): `);
43
+ const result = await checkLinearToken(repo.linearToken);
44
+ if (result.valid) {
45
+ console.log("✅ Valid");
46
+ }
47
+ else {
48
+ console.log(`❌ Invalid - ${result.error}`);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=CheckTokensCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckTokensCommand.js","sourceRoot":"","sources":["../../../src/commands/CheckTokensCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC9B,KAAa;IAEb,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gCAAgC,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,KAAK;aACpB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,KAAK,EAAE,8BAA8B;aACrC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAE5C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;gBACN,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,eAAe;aACjD,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC;IAC1D,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IAClD,KAAK,CAAC,OAAO,CAAC,KAAe;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,sDAAsD,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB,KAAK,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAExD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5C,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,38 @@
1
+ import type { Application } from "../Application.js";
2
+ import type { Logger } from "../services/Logger.js";
3
+ /**
4
+ * Interface for all CLI commands
5
+ */
6
+ export interface ICommand {
7
+ /**
8
+ * Execute the command
9
+ * @param args Command-line arguments
10
+ */
11
+ execute(args: string[]): Promise<void>;
12
+ }
13
+ /**
14
+ * Base class for commands with common functionality
15
+ */
16
+ export declare abstract class BaseCommand implements ICommand {
17
+ protected app: Application;
18
+ protected logger: Logger;
19
+ constructor(app: Application);
20
+ abstract execute(args: string[]): Promise<void>;
21
+ /**
22
+ * Helper to exit with error
23
+ */
24
+ protected exitWithError(message: string, code?: number): never;
25
+ /**
26
+ * Helper to log success
27
+ */
28
+ protected logSuccess(message: string): void;
29
+ /**
30
+ * Helper to log error
31
+ */
32
+ protected logError(message: string): void;
33
+ /**
34
+ * Helper to log section divider
35
+ */
36
+ protected logDivider(): void;
37
+ }
38
+ //# sourceMappingURL=ICommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ICommand.d.ts","sourceRoot":"","sources":["../../../src/commands/ICommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,8BAAsB,WAAY,YAAW,QAAQ;IAGxC,SAAS,CAAC,GAAG,EAAE,WAAW;IAFtC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEH,GAAG,EAAE,WAAW;IAItC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/C;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,KAAK;IAKzD;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,SAAS,CAAC,UAAU,IAAI,IAAI;CAG5B"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Base class for commands with common functionality
3
+ */
4
+ export class BaseCommand {
5
+ app;
6
+ logger;
7
+ constructor(app) {
8
+ this.app = app;
9
+ this.logger = app.logger;
10
+ }
11
+ /**
12
+ * Helper to exit with error
13
+ */
14
+ exitWithError(message, code = 1) {
15
+ this.logger.error(message);
16
+ process.exit(code);
17
+ }
18
+ /**
19
+ * Helper to log success
20
+ */
21
+ logSuccess(message) {
22
+ this.logger.success(message);
23
+ }
24
+ /**
25
+ * Helper to log error
26
+ */
27
+ logError(message) {
28
+ this.logger.error(message);
29
+ }
30
+ /**
31
+ * Helper to log section divider
32
+ */
33
+ logDivider() {
34
+ this.logger.divider(50);
35
+ }
36
+ }
37
+ //# sourceMappingURL=ICommand.js.map