fission-worker 0.2.1 → 0.2.2
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 +1 -1
- package/dist/docker.js +66 -57
- package/dist/docker.js.map +1 -1
- package/package.json +1 -1
package/dist/docker.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export interface PipelineJob {
|
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* Start a pipeline session on the host machine (no Docker).
|
|
19
|
-
* Clones repo to a temp workspace, runs
|
|
19
|
+
* Clones repo to a temp workspace, runs the pipeline engine directly,
|
|
20
20
|
* cleans up when done. Uses the host's Claude subscription auth.
|
|
21
21
|
*/
|
|
22
22
|
export declare function startSession(job: PipelineJob, config: WorkerConfig, activeSessions: Map<string, ChildProcess>): void;
|
package/dist/docker.js
CHANGED
|
@@ -6,7 +6,7 @@ const fs_1 = require("fs");
|
|
|
6
6
|
const path_1 = require("path");
|
|
7
7
|
/**
|
|
8
8
|
* Start a pipeline session on the host machine (no Docker).
|
|
9
|
-
* Clones repo to a temp workspace, runs
|
|
9
|
+
* Clones repo to a temp workspace, runs the pipeline engine directly,
|
|
10
10
|
* cleans up when done. Uses the host's Claude subscription auth.
|
|
11
11
|
*/
|
|
12
12
|
function startSession(job, config, activeSessions) {
|
|
@@ -44,45 +44,62 @@ function startSession(job, config, activeSessions) {
|
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
console.log(`[${tag}] Clone complete, starting pipeline...`);
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
47
|
+
// Find the pipeline runner script (built from Fission repo)
|
|
48
|
+
const runnerScript = findRunnerScript();
|
|
49
|
+
// Environment for the pipeline process
|
|
50
|
+
const pipelineEnv = {
|
|
51
|
+
...process.env,
|
|
52
|
+
FISSION_API_URL: config.fissionUrl,
|
|
53
|
+
FISSION_API_KEY: config.apiKey,
|
|
54
|
+
SESSION_ID: job.sessionId,
|
|
55
|
+
PROJECT_ID: job.projectId,
|
|
56
|
+
REPO_URL: repo.repoUrl,
|
|
57
|
+
REPO_BRANCH: repo.branch || "main",
|
|
58
|
+
GITHUB_TOKEN: gitToken || "",
|
|
59
|
+
// Override workspace for the runner — it clones again but we already did it
|
|
60
|
+
FISSION_REPO_PATH: repoDir,
|
|
61
|
+
};
|
|
62
|
+
let proc;
|
|
63
|
+
if (runnerScript) {
|
|
64
|
+
// Full pipeline engine — runs CTO → Tech Lead → Workers loop
|
|
65
|
+
console.log(`[${tag}] Using pipeline runner: ${runnerScript}`);
|
|
66
|
+
proc = (0, child_process_1.spawn)("node", [runnerScript], {
|
|
67
|
+
cwd: repoDir,
|
|
68
|
+
env: pipelineEnv,
|
|
69
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Fallback — run Claude directly with a comprehensive prompt
|
|
74
|
+
console.log(`[${tag}] Pipeline runner not found, using Claude directly`);
|
|
75
|
+
const prompt = `You are an autonomous R&D pipeline. Analyze this codebase and do the following:\n\n` +
|
|
76
|
+
`1. REVIEW: Scan for the top 3-5 issues (bugs, security, performance, improvements)\n` +
|
|
77
|
+
`2. PLAN: For each issue, create a concrete implementation task\n` +
|
|
78
|
+
`3. BUILD: Implement the highest priority task — make the changes and commit\n` +
|
|
79
|
+
`4. REVIEW: Check your work for correctness\n\n` +
|
|
80
|
+
`Work autonomously. Make real code changes and commit them with descriptive messages.\n` +
|
|
81
|
+
`When done, report what you accomplished as JSON:\n` +
|
|
82
|
+
`{summary: string, tasksCompleted: string[], filesChanged: string[], commits: string[]}\n` +
|
|
83
|
+
`Return ONLY valid JSON.`;
|
|
84
|
+
proc = (0, child_process_1.spawn)("claude", ["-p", prompt, "--output-format", "json", "--verbose"], {
|
|
85
|
+
cwd: repoDir,
|
|
86
|
+
env: pipelineEnv,
|
|
87
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
72
90
|
activeSessions.set(job.sessionId, proc);
|
|
73
91
|
let stdout = "";
|
|
74
92
|
proc.stdout?.on("data", (chunk) => {
|
|
93
|
+
const text = chunk.toString().trim();
|
|
75
94
|
stdout += chunk.toString();
|
|
95
|
+
if (text)
|
|
96
|
+
console.log(`[${tag}] ${text.slice(0, 300)}`);
|
|
76
97
|
});
|
|
77
98
|
proc.stderr?.on("data", (chunk) => {
|
|
78
99
|
const text = chunk.toString().trim();
|
|
79
100
|
if (text) {
|
|
80
101
|
console.log(`[${tag}] ${text.slice(0, 200)}`);
|
|
81
|
-
|
|
82
|
-
emitEvent(config, job.projectId, "claude_output", {
|
|
83
|
-
text,
|
|
84
|
-
phase: "BUILD",
|
|
85
|
-
});
|
|
102
|
+
emitEvent(config, job.projectId, "claude_output", { text, phase: "BUILD" });
|
|
86
103
|
}
|
|
87
104
|
});
|
|
88
105
|
proc.on("close", (code) => {
|
|
@@ -90,9 +107,7 @@ function startSession(job, config, activeSessions) {
|
|
|
90
107
|
activeSessions.delete(job.sessionId);
|
|
91
108
|
// Push commits back to GitHub (if any were made)
|
|
92
109
|
try {
|
|
93
|
-
const hasCommits = (0, child_process_1.execSync)("git log --oneline
|
|
94
|
-
cwd: repoDir, encoding: "utf-8",
|
|
95
|
-
}).trim();
|
|
110
|
+
const hasCommits = (0, child_process_1.execSync)("git log --oneline @{u}..HEAD 2>/dev/null || echo ''", { cwd: repoDir, encoding: "utf-8" }).trim();
|
|
96
111
|
if (hasCommits) {
|
|
97
112
|
console.log(`[${tag}] Pushing ${hasCommits.split("\n").length} commit(s)...`);
|
|
98
113
|
(0, child_process_1.execSync)("git push", { cwd: repoDir, stdio: "pipe" });
|
|
@@ -102,34 +117,28 @@ function startSession(job, config, activeSessions) {
|
|
|
102
117
|
catch (pushErr) {
|
|
103
118
|
console.error(`[${tag}] Push failed: ${pushErr}`);
|
|
104
119
|
}
|
|
105
|
-
// Try to parse and report results
|
|
106
|
-
try {
|
|
107
|
-
const jsonStart = stdout.indexOf("{");
|
|
108
|
-
const jsonEnd = stdout.lastIndexOf("}");
|
|
109
|
-
if (jsonStart !== -1 && jsonEnd > jsonStart) {
|
|
110
|
-
const result = JSON.parse(stdout.slice(jsonStart, jsonEnd + 1));
|
|
111
|
-
console.log(`[${tag}] Summary: ${result.summary || "No summary"}`);
|
|
112
|
-
emitEvent(config, job.projectId, "pipeline_summary", {
|
|
113
|
-
sessionId: job.sessionId,
|
|
114
|
-
summary: {
|
|
115
|
-
sessionId: job.sessionId,
|
|
116
|
-
projectName: job.project.name,
|
|
117
|
-
duration: "unknown",
|
|
118
|
-
tasksCompleted: (result.tasksCompleted || []).map((t) => ({ title: t })),
|
|
119
|
-
tasksFailed: [],
|
|
120
|
-
findingsCreated: 0,
|
|
121
|
-
filesChanged: result.filesChanged || [],
|
|
122
|
-
commitMessages: result.commits || [],
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
catch { /* ignore parse errors */ }
|
|
128
120
|
emitEvent(config, job.projectId, "pipeline_complete", { sessionId: job.sessionId });
|
|
129
121
|
cleanup(workspaceDir);
|
|
130
122
|
reportCompletion(config, job.sessionId, code ?? 1);
|
|
131
123
|
});
|
|
132
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Find the built pipeline-runner script on the host.
|
|
127
|
+
*/
|
|
128
|
+
function findRunnerScript() {
|
|
129
|
+
const home = process.env.HOME || "";
|
|
130
|
+
const candidates = [
|
|
131
|
+
(0, path_1.join)(home, "Documents/GitHub/fission/dist-runner/pipeline-runner/index.js"),
|
|
132
|
+
(0, path_1.join)(home, "Documents/GitHub/Fission/dist-runner/pipeline-runner/index.js"),
|
|
133
|
+
(0, path_1.join)(home, ".fission/runner/pipeline-runner/index.js"),
|
|
134
|
+
(0, path_1.join)(home, "fission/dist-runner/pipeline-runner/index.js"),
|
|
135
|
+
];
|
|
136
|
+
for (const candidate of candidates) {
|
|
137
|
+
if ((0, fs_1.existsSync)(candidate))
|
|
138
|
+
return candidate;
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
133
142
|
function emitEvent(config, projectId, type, data) {
|
|
134
143
|
fetch(`${config.fissionUrl}/api/v1/worker/events`, {
|
|
135
144
|
method: "POST",
|
package/dist/docker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":";;AAoBA,
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
|