cyrus-ai 0.2.4 → 0.2.6
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/src/Application.d.ts +3 -3
- package/dist/src/Application.d.ts.map +1 -1
- package/dist/src/Application.js +6 -3
- package/dist/src/Application.js.map +1 -1
- package/dist/src/app.js +4 -4
- package/dist/src/app.js.map +1 -1
- package/dist/src/commands/StartCommand.d.ts.map +1 -1
- package/dist/src/commands/StartCommand.js +1 -0
- package/dist/src/commands/StartCommand.js.map +1 -1
- package/dist/src/services/ConfigService.d.ts +5 -0
- package/dist/src/services/ConfigService.d.ts.map +1 -1
- package/dist/src/services/ConfigService.js +30 -0
- package/dist/src/services/ConfigService.js.map +1 -1
- package/dist/src/services/WorkerService.d.ts +1 -1
- package/dist/src/services/WorkerService.d.ts.map +1 -1
- package/dist/src/services/WorkerService.js.map +1 -1
- package/package.json +64 -63
- package/LICENSE +0 -674
- package/dist/src/services/GitService.d.ts +0 -28
- package/dist/src/services/GitService.d.ts.map +0 -1
- package/dist/src/services/GitService.js +0 -339
- package/dist/src/services/GitService.js.map +0 -1
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { Issue } from "@linear/sdk";
|
|
2
|
-
import type { RepositoryConfig } from "cyrus-core";
|
|
3
|
-
import type { Workspace } from "../config/types.js";
|
|
4
|
-
import type { Logger } from "./Logger.js";
|
|
5
|
-
/**
|
|
6
|
-
* Service responsible for Git worktree operations
|
|
7
|
-
*/
|
|
8
|
-
export declare class GitService {
|
|
9
|
-
private logger;
|
|
10
|
-
constructor(logger: Logger);
|
|
11
|
-
/**
|
|
12
|
-
* Check if a branch exists locally or remotely
|
|
13
|
-
*/
|
|
14
|
-
branchExists(branchName: string, repoPath: string): Promise<boolean>;
|
|
15
|
-
/**
|
|
16
|
-
* Sanitize branch name by removing backticks to prevent command injection
|
|
17
|
-
*/
|
|
18
|
-
private sanitizeBranchName;
|
|
19
|
-
/**
|
|
20
|
-
* Run a setup script with proper error handling and logging
|
|
21
|
-
*/
|
|
22
|
-
private runSetupScript;
|
|
23
|
-
/**
|
|
24
|
-
* Create a git worktree for an issue
|
|
25
|
-
*/
|
|
26
|
-
createGitWorktree(issue: Issue, repository: RepositoryConfig, globalSetupScript?: string): Promise<Workspace>;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=GitService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GitService.d.ts","sourceRoot":"","sources":["../../../src/services/GitService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,qBAAa,UAAU;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAClC;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B1E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;YACW,cAAc;IA4F5B;;OAEG;IACG,iBAAiB,CACtB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,gBAAgB,EAC5B,iBAAiB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,SAAS,CAAC;CAoRrB"}
|
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
import { execSync } from "node:child_process";
|
|
2
|
-
import { existsSync, mkdirSync, statSync } from "node:fs";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { basename, join } from "node:path";
|
|
5
|
-
/**
|
|
6
|
-
* Service responsible for Git worktree operations
|
|
7
|
-
*/
|
|
8
|
-
export class GitService {
|
|
9
|
-
logger;
|
|
10
|
-
constructor(logger) {
|
|
11
|
-
this.logger = logger;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Check if a branch exists locally or remotely
|
|
15
|
-
*/
|
|
16
|
-
async branchExists(branchName, repoPath) {
|
|
17
|
-
try {
|
|
18
|
-
// Check if branch exists locally
|
|
19
|
-
execSync(`git rev-parse --verify "${branchName}"`, {
|
|
20
|
-
cwd: repoPath,
|
|
21
|
-
stdio: "pipe",
|
|
22
|
-
});
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
// Branch doesn't exist locally, check remote
|
|
27
|
-
try {
|
|
28
|
-
const remoteOutput = execSync(`git ls-remote --heads origin "${branchName}"`, {
|
|
29
|
-
cwd: repoPath,
|
|
30
|
-
stdio: "pipe",
|
|
31
|
-
});
|
|
32
|
-
// Check if output is non-empty (branch actually exists on remote)
|
|
33
|
-
return remoteOutput && remoteOutput.toString().trim().length > 0;
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Sanitize branch name by removing backticks to prevent command injection
|
|
42
|
-
*/
|
|
43
|
-
sanitizeBranchName(name) {
|
|
44
|
-
return name ? name.replace(/`/g, "") : name;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Run a setup script with proper error handling and logging
|
|
48
|
-
*/
|
|
49
|
-
async runSetupScript(scriptPath, scriptType, workspacePath, issue) {
|
|
50
|
-
// Expand ~ to home directory
|
|
51
|
-
const expandedPath = scriptPath.replace(/^~/, homedir());
|
|
52
|
-
// Check if script exists
|
|
53
|
-
if (!existsSync(expandedPath)) {
|
|
54
|
-
this.logger.warn(`⚠️ ${scriptType === "global" ? "Global" : "Repository"} setup script not found: ${scriptPath}`);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
// Check if script is executable (Unix only)
|
|
58
|
-
if (process.platform !== "win32") {
|
|
59
|
-
try {
|
|
60
|
-
const stats = statSync(expandedPath);
|
|
61
|
-
// Check if file has execute permission for the owner
|
|
62
|
-
if (!(stats.mode & 0o100)) {
|
|
63
|
-
this.logger.warn(`⚠️ ${scriptType === "global" ? "Global" : "Repository"} setup script is not executable: ${scriptPath}`);
|
|
64
|
-
this.logger.warn(` Run: chmod +x "${expandedPath}"`);
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
this.logger.warn(`⚠️ Cannot check permissions for ${scriptType} setup script: ${error.message}`);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
const scriptName = basename(expandedPath);
|
|
74
|
-
this.logger.info(`ℹ️ Running ${scriptType} setup script: ${scriptName}`);
|
|
75
|
-
try {
|
|
76
|
-
// Determine the command based on the script extension and platform
|
|
77
|
-
let command;
|
|
78
|
-
const isWindows = process.platform === "win32";
|
|
79
|
-
if (scriptPath.endsWith(".ps1")) {
|
|
80
|
-
command = `powershell -ExecutionPolicy Bypass -File "${expandedPath}"`;
|
|
81
|
-
}
|
|
82
|
-
else if (scriptPath.endsWith(".cmd") || scriptPath.endsWith(".bat")) {
|
|
83
|
-
command = `"${expandedPath}"`;
|
|
84
|
-
}
|
|
85
|
-
else if (isWindows) {
|
|
86
|
-
// On Windows, try to run with bash if available (Git Bash/WSL)
|
|
87
|
-
command = `bash "${expandedPath}"`;
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
// On Unix, run directly with bash
|
|
91
|
-
command = `bash "${expandedPath}"`;
|
|
92
|
-
}
|
|
93
|
-
execSync(command, {
|
|
94
|
-
cwd: workspacePath,
|
|
95
|
-
stdio: "inherit",
|
|
96
|
-
env: {
|
|
97
|
-
...process.env,
|
|
98
|
-
LINEAR_ISSUE_ID: issue.id,
|
|
99
|
-
LINEAR_ISSUE_IDENTIFIER: issue.identifier,
|
|
100
|
-
LINEAR_ISSUE_TITLE: issue.title || "",
|
|
101
|
-
},
|
|
102
|
-
timeout: 5 * 60 * 1000, // 5 minute timeout
|
|
103
|
-
});
|
|
104
|
-
this.logger.info(`✅ ${scriptType === "global" ? "Global" : "Repository"} setup script completed successfully`);
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
const errorMessage = error.signal === "SIGTERM"
|
|
108
|
-
? "Script execution timed out (exceeded 5 minutes)"
|
|
109
|
-
: error.message;
|
|
110
|
-
this.logger.error(`❌ ${scriptType === "global" ? "Global" : "Repository"} setup script failed: ${errorMessage}`);
|
|
111
|
-
// Log stderr if available
|
|
112
|
-
if (error.stderr) {
|
|
113
|
-
this.logger.error(" stderr:", error.stderr.toString());
|
|
114
|
-
}
|
|
115
|
-
// Continue execution despite setup script failure
|
|
116
|
-
this.logger.info(` Continuing with worktree creation...`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Create a git worktree for an issue
|
|
121
|
-
*/
|
|
122
|
-
async createGitWorktree(issue, repository, globalSetupScript) {
|
|
123
|
-
try {
|
|
124
|
-
// Verify this is a git repository
|
|
125
|
-
try {
|
|
126
|
-
execSync("git rev-parse --git-dir", {
|
|
127
|
-
cwd: repository.repositoryPath,
|
|
128
|
-
stdio: "pipe",
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
catch (_e) {
|
|
132
|
-
this.logger.error(`${repository.repositoryPath} is not a git repository`);
|
|
133
|
-
throw new Error("Not a git repository");
|
|
134
|
-
}
|
|
135
|
-
// Use Linear's preferred branch name, or generate one if not available
|
|
136
|
-
const rawBranchName = issue.branchName ||
|
|
137
|
-
`${issue.identifier}-${issue.title
|
|
138
|
-
?.toLowerCase()
|
|
139
|
-
.replace(/\s+/g, "-")
|
|
140
|
-
.substring(0, 30)}`;
|
|
141
|
-
const branchName = this.sanitizeBranchName(rawBranchName);
|
|
142
|
-
const workspacePath = join(repository.workspaceBaseDir, issue.identifier);
|
|
143
|
-
// Ensure workspace directory exists
|
|
144
|
-
mkdirSync(repository.workspaceBaseDir, { recursive: true });
|
|
145
|
-
// Check if worktree already exists
|
|
146
|
-
try {
|
|
147
|
-
const worktrees = execSync("git worktree list --porcelain", {
|
|
148
|
-
cwd: repository.repositoryPath,
|
|
149
|
-
encoding: "utf-8",
|
|
150
|
-
});
|
|
151
|
-
if (worktrees.includes(workspacePath)) {
|
|
152
|
-
this.logger.info(`Worktree already exists at ${workspacePath}, using existing`);
|
|
153
|
-
return {
|
|
154
|
-
path: workspacePath,
|
|
155
|
-
isGitWorktree: true,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
catch (_e) {
|
|
160
|
-
// git worktree command failed, continue with creation
|
|
161
|
-
}
|
|
162
|
-
// Check if branch already exists
|
|
163
|
-
let createBranch = true;
|
|
164
|
-
try {
|
|
165
|
-
execSync(`git rev-parse --verify "${branchName}"`, {
|
|
166
|
-
cwd: repository.repositoryPath,
|
|
167
|
-
stdio: "pipe",
|
|
168
|
-
});
|
|
169
|
-
createBranch = false;
|
|
170
|
-
}
|
|
171
|
-
catch (_e) {
|
|
172
|
-
// Branch doesn't exist, we'll create it
|
|
173
|
-
}
|
|
174
|
-
// Determine base branch for this issue
|
|
175
|
-
let baseBranch = repository.baseBranch;
|
|
176
|
-
// Check if issue has a parent
|
|
177
|
-
try {
|
|
178
|
-
const parent = await issue.parent;
|
|
179
|
-
if (parent) {
|
|
180
|
-
this.logger.info(`Issue ${issue.identifier} has parent: ${parent.identifier}`);
|
|
181
|
-
// Get parent's branch name
|
|
182
|
-
const parentRawBranchName = parent.branchName ||
|
|
183
|
-
`${parent.identifier}-${parent.title
|
|
184
|
-
?.toLowerCase()
|
|
185
|
-
.replace(/\s+/g, "-")
|
|
186
|
-
.substring(0, 30)}`;
|
|
187
|
-
const parentBranchName = this.sanitizeBranchName(parentRawBranchName);
|
|
188
|
-
// Check if parent branch exists
|
|
189
|
-
const parentBranchExists = await this.branchExists(parentBranchName, repository.repositoryPath);
|
|
190
|
-
if (parentBranchExists) {
|
|
191
|
-
baseBranch = parentBranchName;
|
|
192
|
-
this.logger.info(`Using parent issue branch '${parentBranchName}' as base for sub-issue ${issue.identifier}`);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
this.logger.info(`Parent branch '${parentBranchName}' not found, using default base branch '${repository.baseBranch}'`);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
catch (_error) {
|
|
200
|
-
// Parent field might not exist or couldn't be fetched, use default base branch
|
|
201
|
-
this.logger.info(`No parent issue found for ${issue.identifier}, using default base branch '${repository.baseBranch}'`);
|
|
202
|
-
}
|
|
203
|
-
// Fetch latest changes from remote
|
|
204
|
-
this.logger.info("Fetching latest changes from remote...");
|
|
205
|
-
let hasRemote = true;
|
|
206
|
-
try {
|
|
207
|
-
execSync("git fetch origin", {
|
|
208
|
-
cwd: repository.repositoryPath,
|
|
209
|
-
stdio: "pipe",
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
catch (e) {
|
|
213
|
-
this.logger.warn("Warning: git fetch failed, proceeding with local branch:", e.message);
|
|
214
|
-
hasRemote = false;
|
|
215
|
-
}
|
|
216
|
-
// Create the worktree - use determined base branch
|
|
217
|
-
let worktreeCmd;
|
|
218
|
-
if (createBranch) {
|
|
219
|
-
if (hasRemote) {
|
|
220
|
-
// Check if the base branch exists remotely
|
|
221
|
-
let useRemoteBranch = false;
|
|
222
|
-
try {
|
|
223
|
-
const remoteOutput = execSync(`git ls-remote --heads origin "${baseBranch}"`, {
|
|
224
|
-
cwd: repository.repositoryPath,
|
|
225
|
-
stdio: "pipe",
|
|
226
|
-
});
|
|
227
|
-
// Check if output is non-empty (branch actually exists on remote)
|
|
228
|
-
useRemoteBranch =
|
|
229
|
-
remoteOutput && remoteOutput.toString().trim().length > 0;
|
|
230
|
-
if (!useRemoteBranch) {
|
|
231
|
-
this.logger.info(`Base branch '${baseBranch}' not found on remote, checking locally...`);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
catch {
|
|
235
|
-
// Base branch doesn't exist remotely, use local or fall back to default
|
|
236
|
-
this.logger.info(`Base branch '${baseBranch}' not found on remote, checking locally...`);
|
|
237
|
-
}
|
|
238
|
-
if (useRemoteBranch) {
|
|
239
|
-
// Use remote version of base branch
|
|
240
|
-
const remoteBranch = `origin/${baseBranch}`;
|
|
241
|
-
this.logger.info(`Creating git worktree at ${workspacePath} from ${remoteBranch}`);
|
|
242
|
-
worktreeCmd = `git worktree add "${workspacePath}" -b "${branchName}" "${remoteBranch}"`;
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
// Check if base branch exists locally
|
|
246
|
-
try {
|
|
247
|
-
execSync(`git rev-parse --verify "${baseBranch}"`, {
|
|
248
|
-
cwd: repository.repositoryPath,
|
|
249
|
-
stdio: "pipe",
|
|
250
|
-
});
|
|
251
|
-
// Use local base branch
|
|
252
|
-
this.logger.info(`Creating git worktree at ${workspacePath} from local ${baseBranch}`);
|
|
253
|
-
worktreeCmd = `git worktree add "${workspacePath}" -b "${branchName}" "${baseBranch}"`;
|
|
254
|
-
}
|
|
255
|
-
catch {
|
|
256
|
-
// Base branch doesn't exist locally either, fall back to remote default
|
|
257
|
-
this.logger.info(`Base branch '${baseBranch}' not found locally, falling back to remote ${repository.baseBranch}`);
|
|
258
|
-
const defaultRemoteBranch = `origin/${repository.baseBranch}`;
|
|
259
|
-
worktreeCmd = `git worktree add "${workspacePath}" -b "${branchName}" "${defaultRemoteBranch}"`;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
264
|
-
// No remote, use local branch
|
|
265
|
-
this.logger.info(`Creating git worktree at ${workspacePath} from local ${baseBranch}`);
|
|
266
|
-
worktreeCmd = `git worktree add "${workspacePath}" -b "${branchName}" "${baseBranch}"`;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
// Branch already exists, just check it out
|
|
271
|
-
this.logger.info(`Creating git worktree at ${workspacePath} with existing branch ${branchName}`);
|
|
272
|
-
worktreeCmd = `git worktree add "${workspacePath}" "${branchName}"`;
|
|
273
|
-
}
|
|
274
|
-
execSync(worktreeCmd, {
|
|
275
|
-
cwd: repository.repositoryPath,
|
|
276
|
-
stdio: "pipe",
|
|
277
|
-
});
|
|
278
|
-
// First, run the global setup script if configured
|
|
279
|
-
if (globalSetupScript) {
|
|
280
|
-
await this.runSetupScript(globalSetupScript, "global", workspacePath, issue);
|
|
281
|
-
}
|
|
282
|
-
// Then, check for repository setup scripts (cross-platform)
|
|
283
|
-
const isWindows = process.platform === "win32";
|
|
284
|
-
const setupScripts = [
|
|
285
|
-
{
|
|
286
|
-
file: "cyrus-setup.sh",
|
|
287
|
-
platform: "unix",
|
|
288
|
-
},
|
|
289
|
-
{
|
|
290
|
-
file: "cyrus-setup.ps1",
|
|
291
|
-
platform: "windows",
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
file: "cyrus-setup.cmd",
|
|
295
|
-
platform: "windows",
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
file: "cyrus-setup.bat",
|
|
299
|
-
platform: "windows",
|
|
300
|
-
},
|
|
301
|
-
];
|
|
302
|
-
// Find the first available setup script for the current platform
|
|
303
|
-
const availableScript = setupScripts.find((script) => {
|
|
304
|
-
const scriptPath = join(repository.repositoryPath, script.file);
|
|
305
|
-
const isCompatible = isWindows
|
|
306
|
-
? script.platform === "windows"
|
|
307
|
-
: script.platform === "unix";
|
|
308
|
-
return existsSync(scriptPath) && isCompatible;
|
|
309
|
-
});
|
|
310
|
-
// Fallback: on Windows, try bash if no Windows scripts found (for Git Bash/WSL users)
|
|
311
|
-
const fallbackScript = !availableScript && isWindows
|
|
312
|
-
? setupScripts.find((script) => {
|
|
313
|
-
const scriptPath = join(repository.repositoryPath, script.file);
|
|
314
|
-
return script.platform === "unix" && existsSync(scriptPath);
|
|
315
|
-
})
|
|
316
|
-
: null;
|
|
317
|
-
const scriptToRun = availableScript || fallbackScript;
|
|
318
|
-
if (scriptToRun) {
|
|
319
|
-
const scriptPath = join(repository.repositoryPath, scriptToRun.file);
|
|
320
|
-
await this.runSetupScript(scriptPath, "repository", workspacePath, issue);
|
|
321
|
-
}
|
|
322
|
-
return {
|
|
323
|
-
path: workspacePath,
|
|
324
|
-
isGitWorktree: true,
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
catch (error) {
|
|
328
|
-
this.logger.error("Failed to create git worktree:", error.message);
|
|
329
|
-
// Fall back to regular directory if git worktree fails
|
|
330
|
-
const fallbackPath = join(repository.workspaceBaseDir, issue.identifier);
|
|
331
|
-
mkdirSync(fallbackPath, { recursive: true });
|
|
332
|
-
return {
|
|
333
|
-
path: fallbackPath,
|
|
334
|
-
isGitWorktree: false,
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
//# sourceMappingURL=GitService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GitService.js","sourceRoot":"","sources":["../../../src/services/GitService.ts"],"names":[],"mappings":"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"}
|