fission-worker 0.1.6 → 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/docker.d.ts +5 -0
- package/dist/docker.js +100 -57
- package/dist/docker.js.map +1 -1
- package/package.json +1 -1
package/dist/docker.d.ts
CHANGED
|
@@ -14,4 +14,9 @@ export interface PipelineJob {
|
|
|
14
14
|
};
|
|
15
15
|
githubToken?: string | null;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Start a pipeline session on the host machine (no Docker).
|
|
19
|
+
* Clones repo to a temp workspace, runs Claude CLI directly,
|
|
20
|
+
* cleans up when done. Uses the host's Claude subscription auth.
|
|
21
|
+
*/
|
|
17
22
|
export declare function startSession(job: PipelineJob, config: WorkerConfig, activeSessions: Map<string, ChildProcess>): void;
|
package/dist/docker.js
CHANGED
|
@@ -3,92 +3,135 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.startSession = startSession;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
/**
|
|
8
|
+
* Start a pipeline session on the host machine (no Docker).
|
|
9
|
+
* Clones repo to a temp workspace, runs Claude CLI directly,
|
|
10
|
+
* cleans up when done. Uses the host's Claude subscription auth.
|
|
11
|
+
*/
|
|
6
12
|
function startSession(job, config, activeSessions) {
|
|
7
|
-
const
|
|
8
|
-
(0, child_process_1.execSync)(`mkdir -p ${cacheDir}`);
|
|
9
|
-
const claudeHome = `${process.env.HOME}/.claude`;
|
|
13
|
+
const tag = job.sessionId.slice(0, 8);
|
|
10
14
|
const repo = job.project.repos[0];
|
|
11
15
|
if (!repo) {
|
|
12
|
-
console.error(`[${
|
|
16
|
+
console.error(`[${tag}] No repository found for project — skipping`);
|
|
13
17
|
reportCompletion(config, job.sessionId, 1);
|
|
14
18
|
return;
|
|
15
19
|
}
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
const workspaceDir = (0, path_1.join)(config.cacheDir, "..", "workspaces", tag);
|
|
21
|
+
const repoDir = (0, path_1.join)(workspaceDir, "repo");
|
|
22
|
+
// Create workspace
|
|
23
|
+
(0, fs_1.mkdirSync)(workspaceDir, { recursive: true });
|
|
24
|
+
// Clone the repo
|
|
25
|
+
const gitToken = job.githubToken || config.githubToken;
|
|
26
|
+
let cloneUrl;
|
|
27
|
+
if (gitToken && repo.repoUrl.startsWith("https://")) {
|
|
28
|
+
cloneUrl = repo.repoUrl.replace("https://", `https://x-access-token:${gitToken}@`);
|
|
29
|
+
}
|
|
30
|
+
else if (gitToken && !repo.repoUrl.startsWith("https://")) {
|
|
31
|
+
cloneUrl = `https://x-access-token:${gitToken}@github.com/${repo.repoUrl}.git`;
|
|
21
32
|
}
|
|
22
|
-
|
|
23
|
-
|
|
33
|
+
else {
|
|
34
|
+
cloneUrl = repo.repoUrl;
|
|
24
35
|
}
|
|
36
|
+
console.log(`[${tag}] Cloning ${repo.repoUrl} (branch: ${repo.branch || "main"})...`);
|
|
25
37
|
try {
|
|
26
|
-
|
|
27
|
-
const createArgs = [
|
|
28
|
-
"create",
|
|
29
|
-
"--name", containerName,
|
|
30
|
-
"-e", `FISSION_API_URL=${config.fissionUrl}`,
|
|
31
|
-
"-e", `FISSION_API_KEY=${config.apiKey}`,
|
|
32
|
-
"-e", `SESSION_ID=${job.sessionId}`,
|
|
33
|
-
"-e", `PROJECT_ID=${job.projectId}`,
|
|
34
|
-
"-e", `REPO_URL=${repo.repoUrl}`,
|
|
35
|
-
"-e", `REPO_BRANCH=${repo.branch || "main"}`,
|
|
36
|
-
"-e", `GITHUB_TOKEN=${job.githubToken || config.githubToken || ""}`,
|
|
37
|
-
IMAGE,
|
|
38
|
-
];
|
|
39
|
-
(0, child_process_1.execSync)(`docker ${createArgs.join(" ")}`, { stdio: "pipe" });
|
|
40
|
-
// Copy Claude auth config into the container (CLI is pre-installed in image)
|
|
41
|
-
console.log(`[${containerName}] Copying Claude auth into container...`);
|
|
42
|
-
(0, child_process_1.execSync)(`docker cp "${claudeHome}" ${containerName}:/root/.claude`, { stdio: "pipe" });
|
|
43
|
-
// Set up git credentials inside the container for private repo access
|
|
44
|
-
// Prefer API-provided token (from GitHub App installation) over config token
|
|
45
|
-
const gitToken = job.githubToken || config.githubToken;
|
|
46
|
-
if (gitToken) {
|
|
47
|
-
const tmpGitCreds = `/tmp/fission-git-creds-${job.sessionId.slice(0, 8)}`;
|
|
48
|
-
const tmpGitConfig = `/tmp/fission-gitconfig-${job.sessionId.slice(0, 8)}`;
|
|
49
|
-
(0, fs_1.writeFileSync)(tmpGitCreds, `https://x-access-token:${gitToken}@github.com\n`);
|
|
50
|
-
(0, fs_1.writeFileSync)(tmpGitConfig, `[credential]\n\thelper = store\n`);
|
|
51
|
-
(0, child_process_1.execSync)(`docker cp "${tmpGitCreds}" ${containerName}:/root/.git-credentials`, { stdio: "pipe" });
|
|
52
|
-
(0, child_process_1.execSync)(`docker cp "${tmpGitConfig}" ${containerName}:/root/.gitconfig`, { stdio: "pipe" });
|
|
53
|
-
(0, fs_1.unlinkSync)(tmpGitCreds);
|
|
54
|
-
(0, fs_1.unlinkSync)(tmpGitConfig);
|
|
55
|
-
}
|
|
38
|
+
(0, child_process_1.execSync)(`git clone --depth=50 -b ${repo.branch || "main"} "${cloneUrl}" "${repoDir}"`, { stdio: "pipe" });
|
|
56
39
|
}
|
|
57
40
|
catch (err) {
|
|
58
|
-
console.error(`[${
|
|
59
|
-
|
|
60
|
-
(0, child_process_1.execSync)(`docker rm -f ${containerName}`, { stdio: "pipe" });
|
|
61
|
-
}
|
|
62
|
-
catch { }
|
|
41
|
+
console.error(`[${tag}] Clone failed: ${err}`);
|
|
42
|
+
cleanup(workspaceDir);
|
|
63
43
|
reportCompletion(config, job.sessionId, 1);
|
|
64
44
|
return;
|
|
65
45
|
}
|
|
66
|
-
|
|
67
|
-
|
|
46
|
+
console.log(`[${tag}] Clone complete, starting pipeline...`);
|
|
47
|
+
// Emit initial progress to the dashboard
|
|
48
|
+
emitEvent(config, job.projectId, "phase_changed", {
|
|
49
|
+
sessionId: job.sessionId,
|
|
50
|
+
phase: "REVIEW",
|
|
51
|
+
reason: "Worker starting pipeline",
|
|
52
|
+
});
|
|
53
|
+
// Run Claude in the cloned repo — uses host's Claude subscription
|
|
54
|
+
const prompt = `You are an autonomous R&D pipeline. Analyze this codebase and do the following:\n\n` +
|
|
55
|
+
`1. REVIEW: Scan for the top 3-5 issues (bugs, security, performance, improvements)\n` +
|
|
56
|
+
`2. PLAN: For each issue, create a concrete implementation task\n` +
|
|
57
|
+
`3. BUILD: Implement the highest priority task — make the changes and commit\n` +
|
|
58
|
+
`4. REVIEW: Check your work for correctness\n\n` +
|
|
59
|
+
`Work autonomously. Make real code changes and commit them with descriptive messages.\n` +
|
|
60
|
+
`When done, report what you accomplished as JSON:\n` +
|
|
61
|
+
`{summary: string, tasksCompleted: string[], filesChanged: string[], commits: string[]}\n` +
|
|
62
|
+
`Return ONLY valid JSON.`;
|
|
63
|
+
const proc = (0, child_process_1.spawn)("claude", [
|
|
64
|
+
"-p", prompt,
|
|
65
|
+
"--output-format", "json",
|
|
66
|
+
"--verbose",
|
|
67
|
+
], {
|
|
68
|
+
cwd: repoDir,
|
|
69
|
+
env: { ...process.env },
|
|
68
70
|
stdio: ["ignore", "pipe", "pipe"],
|
|
69
71
|
});
|
|
70
72
|
activeSessions.set(job.sessionId, proc);
|
|
73
|
+
let stdout = "";
|
|
71
74
|
proc.stdout?.on("data", (chunk) => {
|
|
72
|
-
|
|
73
|
-
if (text)
|
|
74
|
-
console.log(`[${job.sessionId.slice(0, 8)}] ${text}`);
|
|
75
|
+
stdout += chunk.toString();
|
|
75
76
|
});
|
|
76
77
|
proc.stderr?.on("data", (chunk) => {
|
|
77
78
|
const text = chunk.toString().trim();
|
|
78
|
-
if (text)
|
|
79
|
-
console.
|
|
79
|
+
if (text) {
|
|
80
|
+
console.log(`[${tag}] ${text.slice(0, 200)}`);
|
|
81
|
+
// Stream Claude's activity to the dashboard
|
|
82
|
+
emitEvent(config, job.projectId, "claude_output", {
|
|
83
|
+
text,
|
|
84
|
+
phase: "BUILD",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
80
87
|
});
|
|
81
88
|
proc.on("close", (code) => {
|
|
82
|
-
console.log(`[${
|
|
89
|
+
console.log(`[${tag}] Pipeline exited with code ${code}`);
|
|
83
90
|
activeSessions.delete(job.sessionId);
|
|
84
|
-
//
|
|
91
|
+
// Try to parse and report results
|
|
85
92
|
try {
|
|
86
|
-
|
|
93
|
+
const jsonStart = stdout.indexOf("{");
|
|
94
|
+
const jsonEnd = stdout.lastIndexOf("}");
|
|
95
|
+
if (jsonStart !== -1 && jsonEnd > jsonStart) {
|
|
96
|
+
const result = JSON.parse(stdout.slice(jsonStart, jsonEnd + 1));
|
|
97
|
+
console.log(`[${tag}] Summary: ${result.summary || "No summary"}`);
|
|
98
|
+
emitEvent(config, job.projectId, "pipeline_summary", {
|
|
99
|
+
sessionId: job.sessionId,
|
|
100
|
+
summary: {
|
|
101
|
+
sessionId: job.sessionId,
|
|
102
|
+
projectName: job.project.name,
|
|
103
|
+
duration: "unknown",
|
|
104
|
+
tasksCompleted: (result.tasksCompleted || []).map((t) => ({ title: t })),
|
|
105
|
+
tasksFailed: [],
|
|
106
|
+
findingsCreated: 0,
|
|
107
|
+
filesChanged: result.filesChanged || [],
|
|
108
|
+
commitMessages: result.commits || [],
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
87
112
|
}
|
|
88
|
-
catch { /* ignore */ }
|
|
113
|
+
catch { /* ignore parse errors */ }
|
|
114
|
+
emitEvent(config, job.projectId, "pipeline_complete", { sessionId: job.sessionId });
|
|
115
|
+
cleanup(workspaceDir);
|
|
89
116
|
reportCompletion(config, job.sessionId, code ?? 1);
|
|
90
117
|
});
|
|
91
118
|
}
|
|
119
|
+
function emitEvent(config, projectId, type, data) {
|
|
120
|
+
fetch(`${config.fissionUrl}/api/v1/worker/events`, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: {
|
|
123
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
124
|
+
"Content-Type": "application/json",
|
|
125
|
+
},
|
|
126
|
+
body: JSON.stringify({ projectId, type, data }),
|
|
127
|
+
}).catch(() => { });
|
|
128
|
+
}
|
|
129
|
+
function cleanup(workspaceDir) {
|
|
130
|
+
try {
|
|
131
|
+
(0, fs_1.rmSync)(workspaceDir, { recursive: true, force: true });
|
|
132
|
+
}
|
|
133
|
+
catch { /* best effort */ }
|
|
134
|
+
}
|
|
92
135
|
function reportCompletion(config, sessionId, exitCode) {
|
|
93
136
|
fetch(`${config.fissionUrl}/api/v1/worker/sessions/${sessionId}/complete`, {
|
|
94
137
|
method: "POST",
|
package/dist/docker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
|