codekin 0.6.3 → 0.6.5
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/README.md +1 -0
- package/bin/codekin.mjs +69 -6
- package/dist/assets/index-B0xIzdCK.js +187 -0
- package/dist/assets/index-Q2WSVlHo.css +1 -0
- package/dist/index.html +2 -2
- package/package.json +5 -5
- package/server/dist/auth-routes.js +6 -0
- package/server/dist/auth-routes.js.map +1 -1
- package/server/dist/claude-process.d.ts +1 -0
- package/server/dist/claude-process.js +7 -3
- package/server/dist/claude-process.js.map +1 -1
- package/server/dist/commit-event-handler.d.ts +16 -2
- package/server/dist/commit-event-handler.js +43 -10
- package/server/dist/commit-event-handler.js.map +1 -1
- package/server/dist/commit-event-hooks.d.ts +11 -0
- package/server/dist/commit-event-hooks.js +61 -11
- package/server/dist/commit-event-hooks.js.map +1 -1
- package/server/dist/config.d.ts +19 -0
- package/server/dist/config.js +43 -1
- package/server/dist/config.js.map +1 -1
- package/server/dist/docs-routes.js +4 -7
- package/server/dist/docs-routes.js.map +1 -1
- package/server/dist/json-parse.d.ts +8 -0
- package/server/dist/json-parse.js +9 -0
- package/server/dist/json-parse.js.map +1 -0
- package/server/dist/opencode-process.js +8 -1
- package/server/dist/opencode-process.js.map +1 -1
- package/server/dist/orchestrator-children.d.ts +41 -1
- package/server/dist/orchestrator-children.js +87 -1
- package/server/dist/orchestrator-children.js.map +1 -1
- package/server/dist/orchestrator-learning-router.d.ts +8 -0
- package/server/dist/orchestrator-learning-router.js +126 -0
- package/server/dist/orchestrator-learning-router.js.map +1 -0
- package/server/dist/orchestrator-learning.d.ts +0 -5
- package/server/dist/orchestrator-learning.js +2 -9
- package/server/dist/orchestrator-learning.js.map +1 -1
- package/server/dist/orchestrator-memory-router.d.ts +10 -0
- package/server/dist/orchestrator-memory-router.js +148 -0
- package/server/dist/orchestrator-memory-router.js.map +1 -0
- package/server/dist/orchestrator-memory.js +2 -1
- package/server/dist/orchestrator-memory.js.map +1 -1
- package/server/dist/orchestrator-monitor.d.ts +6 -0
- package/server/dist/orchestrator-monitor.js +27 -0
- package/server/dist/orchestrator-monitor.js.map +1 -1
- package/server/dist/orchestrator-notify.d.ts +29 -0
- package/server/dist/orchestrator-notify.js +27 -0
- package/server/dist/orchestrator-notify.js.map +1 -0
- package/server/dist/orchestrator-reports.d.ts +0 -4
- package/server/dist/orchestrator-reports.js +8 -10
- package/server/dist/orchestrator-reports.js.map +1 -1
- package/server/dist/orchestrator-routes.d.ts +2 -2
- package/server/dist/orchestrator-routes.js +11 -506
- package/server/dist/orchestrator-routes.js.map +1 -1
- package/server/dist/orchestrator-session-router.d.ts +13 -0
- package/server/dist/orchestrator-session-router.js +315 -0
- package/server/dist/orchestrator-session-router.js.map +1 -0
- package/server/dist/process-coordinator.d.ts +83 -0
- package/server/dist/process-coordinator.js +167 -0
- package/server/dist/process-coordinator.js.map +1 -0
- package/server/dist/prompt-router.js +2 -1
- package/server/dist/prompt-router.js.map +1 -1
- package/server/dist/session-archive.js +2 -1
- package/server/dist/session-archive.js.map +1 -1
- package/server/dist/session-lifecycle.d.ts +1 -0
- package/server/dist/session-lifecycle.js +15 -36
- package/server/dist/session-lifecycle.js.map +1 -1
- package/server/dist/session-manager.d.ts +34 -0
- package/server/dist/session-manager.js +161 -79
- package/server/dist/session-manager.js.map +1 -1
- package/server/dist/session-persistence.js +3 -1
- package/server/dist/session-persistence.js.map +1 -1
- package/server/dist/session-routes.d.ts +18 -0
- package/server/dist/session-routes.js +60 -12
- package/server/dist/session-routes.js.map +1 -1
- package/server/dist/stepflow-handler.js +5 -1
- package/server/dist/stepflow-handler.js.map +1 -1
- package/server/dist/stepflow-prompt.js +16 -12
- package/server/dist/stepflow-prompt.js.map +1 -1
- package/server/dist/tsconfig.tsbuildinfo +1 -1
- package/server/dist/types.d.ts +4 -0
- package/server/dist/types.js +1 -0
- package/server/dist/types.js.map +1 -1
- package/server/dist/upload-routes.d.ts +5 -0
- package/server/dist/upload-routes.js +81 -16
- package/server/dist/upload-routes.js.map +1 -1
- package/server/dist/version-check.js +3 -2
- package/server/dist/version-check.js.map +1 -1
- package/server/dist/webhook-rate-limiter.js +9 -1
- package/server/dist/webhook-rate-limiter.js.map +1 -1
- package/server/dist/webhook-workspace.d.ts +12 -0
- package/server/dist/webhook-workspace.js +126 -3
- package/server/dist/webhook-workspace.js.map +1 -1
- package/server/dist/workflow-engine.d.ts +81 -7
- package/server/dist/workflow-engine.js +234 -40
- package/server/dist/workflow-engine.js.map +1 -1
- package/server/dist/workflow-loader.d.ts +6 -1
- package/server/dist/workflow-loader.js +189 -35
- package/server/dist/workflow-loader.js.map +1 -1
- package/server/dist/workflow-routes.d.ts +13 -0
- package/server/dist/workflow-routes.js +140 -4
- package/server/dist/workflow-routes.js.map +1 -1
- package/server/dist/ws-message-handler.js +5 -1
- package/server/dist/ws-message-handler.js.map +1 -1
- package/server/dist/ws-origin-check.d.ts +11 -0
- package/server/dist/ws-origin-check.js +20 -0
- package/server/dist/ws-origin-check.js.map +1 -0
- package/server/dist/ws-rate-limit.d.ts +19 -0
- package/server/dist/ws-rate-limit.js +30 -0
- package/server/dist/ws-rate-limit.js.map +1 -0
- package/server/dist/ws-server.js +69 -32
- package/server/dist/ws-server.js.map +1 -1
- package/dist/assets/index-CxlBrS5y.js +0 -182
- package/dist/assets/index-DgeUVGjz.css +0 -1
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* 1. validate_repo — verify path exists, is a git repo, check staleness
|
|
10
10
|
* 2. create_session — create a Codekin session for the run
|
|
11
11
|
* 3. run_prompt — start Claude, send the prompt, wait for result
|
|
12
|
-
* 4. save_report — write Markdown output to outputDir, commit on
|
|
12
|
+
* 4. save_report — write Markdown output to outputDir, commit on a fresh
|
|
13
|
+
* audit/<kind>-<YYYY-MM-DD> branch, push
|
|
13
14
|
*
|
|
14
15
|
* MD file format — YAML frontmatter followed by the Claude prompt:
|
|
15
16
|
*
|
|
@@ -30,13 +31,33 @@
|
|
|
30
31
|
*/
|
|
31
32
|
import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, writeFileSync } from 'fs';
|
|
32
33
|
import { execFileSync } from 'child_process';
|
|
33
|
-
import { dirname, join, sep } from 'path';
|
|
34
|
+
import { dirname, isAbsolute, join, resolve, sep } from 'path';
|
|
34
35
|
import { REPOS_ROOT } from './config.js';
|
|
35
36
|
import { fileURLToPath } from 'url';
|
|
37
|
+
import { SessionGoneError } from './workflow-engine.js';
|
|
36
38
|
// ---------------------------------------------------------------------------
|
|
37
39
|
// MD parser
|
|
38
40
|
// ---------------------------------------------------------------------------
|
|
39
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* Validate a relative path that came from untrusted MD frontmatter.
|
|
43
|
+
*
|
|
44
|
+
* `outputDir` and `filenameSuffix` are joined with `repoPath` and written to
|
|
45
|
+
* disk by the save_report step. A repo workflow author who set
|
|
46
|
+
* `outputDir: /etc` or `outputDir: ../../foo` could otherwise smuggle the
|
|
47
|
+
* write outside the repo. We reject absolute paths and any segment equal to
|
|
48
|
+
* `..`; the runtime check in save_report enforces the boundary defensively.
|
|
49
|
+
*/
|
|
50
|
+
function assertSafeRelativePath(value, field, sourcePath) {
|
|
51
|
+
if (isAbsolute(value)) {
|
|
52
|
+
throw new Error(`Invalid ${field} in ${sourcePath}: absolute paths are not allowed`);
|
|
53
|
+
}
|
|
54
|
+
// Normalize backslashes so a Windows-style ..\\ is caught the same as ../
|
|
55
|
+
const segments = value.split(/[/\\]/);
|
|
56
|
+
if (segments.some(s => s === '..')) {
|
|
57
|
+
throw new Error(`Invalid ${field} in ${sourcePath}: path traversal segments ('..') are not allowed`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Parse a workflow MD file into a WorkflowDef. Throws if required fields are missing or unsafe. */
|
|
40
61
|
function parseMdWorkflow(content, sourcePath) {
|
|
41
62
|
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/m);
|
|
42
63
|
if (!fmMatch)
|
|
@@ -55,6 +76,11 @@ function parseMdWorkflow(content, sourcePath) {
|
|
|
55
76
|
if (!meta[key])
|
|
56
77
|
throw new Error(`Missing frontmatter field "${key}" in ${sourcePath}`);
|
|
57
78
|
}
|
|
79
|
+
// Reject path-traversal in any frontmatter field that is later joined with
|
|
80
|
+
// repoPath at save time. Failing here prevents an unsafe def from being
|
|
81
|
+
// registered at all.
|
|
82
|
+
assertSafeRelativePath(meta.outputDir, 'outputDir', sourcePath);
|
|
83
|
+
assertSafeRelativePath(meta.filenameSuffix, 'filenameSuffix', sourcePath);
|
|
58
84
|
return {
|
|
59
85
|
kind: meta.kind,
|
|
60
86
|
name: meta.name,
|
|
@@ -115,14 +141,17 @@ function loadRepoOverride(repoPath, kind) {
|
|
|
115
141
|
// Shared polling helper
|
|
116
142
|
// ---------------------------------------------------------------------------
|
|
117
143
|
async function waitForSessionResult(sessions, sessionId, opts = {}) {
|
|
118
|
-
const { timeoutMs = 600_000, pollMs = 2000, abortSignal } = opts;
|
|
144
|
+
const { timeoutMs = 600_000, pollMs = 2000, abortSignal, runId, stepKey } = opts;
|
|
119
145
|
const deadline = Date.now() + timeoutMs;
|
|
146
|
+
let lastSeen = null;
|
|
120
147
|
while (Date.now() < deadline) {
|
|
121
148
|
if (abortSignal?.aborted)
|
|
122
149
|
throw new Error('Aborted');
|
|
123
150
|
const session = sessions.get(sessionId);
|
|
124
|
-
if (!session)
|
|
125
|
-
throw new
|
|
151
|
+
if (!session) {
|
|
152
|
+
throw new SessionGoneError(runId ?? 'unknown', stepKey ?? 'run_prompt', sessionId, lastSeen);
|
|
153
|
+
}
|
|
154
|
+
lastSeen = new Date().toISOString();
|
|
126
155
|
const resultMsg = session.outputHistory.find(m => m.type === 'result');
|
|
127
156
|
if (resultMsg) {
|
|
128
157
|
const assistantText = session.outputHistory
|
|
@@ -147,6 +176,34 @@ async function waitForSessionResult(sessions, sessionId, opts = {}) {
|
|
|
147
176
|
throw new Error(`Timed out waiting for session result after ${timeoutMs}ms`);
|
|
148
177
|
}
|
|
149
178
|
// ---------------------------------------------------------------------------
|
|
179
|
+
// Prompt guard
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Prepended to every workflow prompt so Claude does not duplicate the report.
|
|
183
|
+
* The save_report step writes Claude's response text to the configured outputDir;
|
|
184
|
+
* if Claude also uses the Write tool (per CLAUDE.md guidance), two files appear
|
|
185
|
+
* — one substantive file under whatever category Claude chose, and one stub
|
|
186
|
+
* (the conversational reply) under the configured outputDir.
|
|
187
|
+
*/
|
|
188
|
+
const WORKFLOW_PROMPT_GUARD = [
|
|
189
|
+
'IMPORTANT: You are running as part of an automated Codekin workflow.',
|
|
190
|
+
'The workflow runner will save your entire response as the report file.',
|
|
191
|
+
'Do NOT use the Write or Edit tools to create the report yourself — that produces a duplicate file.',
|
|
192
|
+
'Respond with the report Markdown directly, with no preamble.',
|
|
193
|
+
'Disregard any conflicting guidance in CLAUDE.md about writing audit reports to disk; the workflow handles saving and committing.',
|
|
194
|
+
].join(' ');
|
|
195
|
+
/** Branch name for the per-run report commit. Kept short and stable per (kind, date). */
|
|
196
|
+
export function reportBranchName(kind, dateStr) {
|
|
197
|
+
return `audit/${kind}-${dateStr}`;
|
|
198
|
+
}
|
|
199
|
+
/** True when a branch name is one a workflow run produces (or used to produce). */
|
|
200
|
+
export function isWorkflowReportsBranch(branch) {
|
|
201
|
+
// Accept the legacy long-lived branch and the new per-run audit/<kind>-<date> form.
|
|
202
|
+
if (branch === 'codekin/reports')
|
|
203
|
+
return true;
|
|
204
|
+
return /^audit\/[^/]+-\d{4}-\d{2}-\d{2}$/.test(branch);
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
150
207
|
// Workflow registration
|
|
151
208
|
// ---------------------------------------------------------------------------
|
|
152
209
|
function registerWorkflow(engine, sessions, def) {
|
|
@@ -202,6 +259,9 @@ function registerWorkflow(engine, sessions, def) {
|
|
|
202
259
|
provider,
|
|
203
260
|
allowedTools: ['Bash(gh pr:*)'],
|
|
204
261
|
});
|
|
262
|
+
// Persist the session id on the run BEFORE returning so a server crash
|
|
263
|
+
// between this step and `run_prompt` can still locate the session.
|
|
264
|
+
ctx.recordSessionId?.(session.id);
|
|
205
265
|
console.log(`[workflow:${def.kind}] Created session ${session.id} for ${repoName} (run ${ctx.runId})`);
|
|
206
266
|
return { sessionId: session.id, repoPath, repoName, branch: input.branch, lastCommit: input.lastCommit };
|
|
207
267
|
},
|
|
@@ -214,22 +274,58 @@ function registerWorkflow(engine, sessions, def) {
|
|
|
214
274
|
const repoName = input.repoName;
|
|
215
275
|
const repoPath = input.repoPath;
|
|
216
276
|
const customPrompt = input.customPrompt;
|
|
277
|
+
// If the session is already gone, fail with a typed error before doing any work —
|
|
278
|
+
// gives a much clearer signal than a downstream "Session X not found" stack trace.
|
|
279
|
+
if (!sessions.get(sessionId)) {
|
|
280
|
+
throw new SessionGoneError(ctx.runId, 'run_prompt', sessionId, ctx.run.lastStepAt ?? null);
|
|
281
|
+
}
|
|
217
282
|
sessions.startClaude(sessionId);
|
|
218
283
|
await sessions.waitForReady(sessionId);
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
284
|
+
if (ctx.resumed) {
|
|
285
|
+
// The prompt was already sent in the original run before the server crashed.
|
|
286
|
+
// Just wait for the result Claude is (still) producing — sending again would
|
|
287
|
+
// duplicate the prompt and fork the conversation.
|
|
288
|
+
console.log(`[workflow:${def.kind}] Resuming run ${ctx.runId}: re-attaching to session ${sessionId} (no re-send)`);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
// Per-repo override: check {repoPath}/.codekin/workflows/{kind}.md
|
|
292
|
+
const repoOverride = loadRepoOverride(repoPath, ctx.run.kind);
|
|
293
|
+
const basePrompt = repoOverride ? repoOverride.prompt : def.prompt;
|
|
294
|
+
const userPrompt = customPrompt
|
|
295
|
+
? `${basePrompt}\n\nAdditional focus areas:\n${customPrompt}`
|
|
296
|
+
: basePrompt;
|
|
297
|
+
// If the run carries sanitized commit fields, prepend them as
|
|
298
|
+
// XML-delimited context so injected text cannot escape its data
|
|
299
|
+
// context. Fields are sanitized upstream in commit-event-handler.ts.
|
|
300
|
+
const commitMessage = input.commitMessage;
|
|
301
|
+
const commitBranch = input.branch;
|
|
302
|
+
const commitAuthor = input.author;
|
|
303
|
+
let commitContext = '';
|
|
304
|
+
if (commitMessage !== undefined) {
|
|
305
|
+
commitContext = [
|
|
306
|
+
'<commit-message>',
|
|
307
|
+
commitMessage,
|
|
308
|
+
'</commit-message>',
|
|
309
|
+
`<branch>${commitBranch ?? 'unknown'}</branch>`,
|
|
310
|
+
`<author>${commitAuthor ?? 'unknown'}</author>`,
|
|
311
|
+
'',
|
|
312
|
+
'',
|
|
313
|
+
].join('\n');
|
|
314
|
+
}
|
|
315
|
+
// Prepend the guard to suppress Claude's CLAUDE.md-driven file-write
|
|
316
|
+
// behavior, which otherwise creates a duplicate report file.
|
|
317
|
+
const prompt = `${WORKFLOW_PROMPT_GUARD}\n\n${commitContext}${userPrompt}`;
|
|
318
|
+
if (repoOverride) {
|
|
319
|
+
console.log(`[workflow:${def.kind}] Using per-repo prompt override from ${repoPath}`);
|
|
320
|
+
}
|
|
321
|
+
sessions.sendInput(sessionId, prompt);
|
|
322
|
+
console.log(`[workflow:${def.kind}] Sent prompt to session ${sessionId} for ${repoName}`);
|
|
227
323
|
}
|
|
228
|
-
sessions.sendInput(sessionId, prompt);
|
|
229
|
-
console.log(`[workflow:${def.kind}] Sent prompt to session ${sessionId} for ${repoName}`);
|
|
230
324
|
const result = await waitForSessionResult(sessions, sessionId, {
|
|
231
325
|
timeoutMs: 600_000,
|
|
232
326
|
abortSignal: ctx.abortSignal,
|
|
327
|
+
runId: ctx.runId,
|
|
328
|
+
stepKey: 'run_prompt',
|
|
233
329
|
});
|
|
234
330
|
console.log(`[workflow:${def.kind}] Completed for ${repoName} (${result.text.length} chars)`);
|
|
235
331
|
return {
|
|
@@ -267,32 +363,59 @@ function registerWorkflow(engine, sessions, def) {
|
|
|
267
363
|
reportText,
|
|
268
364
|
].join('\n');
|
|
269
365
|
const reportsDir = join(repoPath, def.outputDir);
|
|
270
|
-
if (!existsSync(reportsDir)) {
|
|
271
|
-
mkdirSync(reportsDir, { recursive: true });
|
|
272
|
-
}
|
|
273
366
|
const filename = `${dateStr}${def.filenameSuffix}`;
|
|
274
367
|
const filePath = join(reportsDir, filename);
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
//
|
|
278
|
-
//
|
|
279
|
-
|
|
280
|
-
const
|
|
368
|
+
// Defense in depth — even though parseMdWorkflow rejects unsafe
|
|
369
|
+
// outputDir/filenameSuffix at load, re-verify the resolved write
|
|
370
|
+
// target is under the repo. realpath the parent so a symlinked
|
|
371
|
+
// outputDir cannot escape; the file itself does not exist yet.
|
|
372
|
+
const repoRealRoot = existsSync(repoPath) ? realpathSync(repoPath) : resolve(repoPath);
|
|
373
|
+
const reportsRealRoot = existsSync(reportsDir) ? realpathSync(reportsDir) : resolve(reportsDir);
|
|
374
|
+
if (!reportsRealRoot.startsWith(repoRealRoot + sep) &&
|
|
375
|
+
reportsRealRoot !== repoRealRoot) {
|
|
376
|
+
throw new Error(`Refusing to write report outside repo: ${reportsRealRoot} is not under ${repoRealRoot}`);
|
|
377
|
+
}
|
|
378
|
+
const resolvedFilePath = resolve(reportsRealRoot, filename);
|
|
379
|
+
if (!resolvedFilePath.startsWith(reportsRealRoot + sep) &&
|
|
380
|
+
resolvedFilePath !== reportsRealRoot) {
|
|
381
|
+
throw new Error(`Refusing to write report outside outputDir: ${resolvedFilePath} is not under ${reportsRealRoot}`);
|
|
382
|
+
}
|
|
383
|
+
console.log(`[workflow:${def.kind}] Writing report to ${filePath}`);
|
|
384
|
+
// Commit on a fresh per-run branch (audit/<kind>-<YYYY-MM-DD>) so each
|
|
385
|
+
// audit gets its own PR and we never append to a stale, long-lived
|
|
386
|
+
// reports branch. Use a temporary git worktree to avoid stash/checkout
|
|
387
|
+
// races when multiple workflow runs target the same repo concurrently.
|
|
388
|
+
const reportsBranch = reportBranchName(def.kind, dateStr);
|
|
281
389
|
try {
|
|
282
390
|
const relativePath = `${def.outputDir}/${filename}`;
|
|
283
|
-
// Ensure the reports branch exists (create if needed)
|
|
391
|
+
// Ensure the reports branch exists (create if needed). For same-day
|
|
392
|
+
// reruns of the same kind we reuse the existing daily branch and
|
|
393
|
+
// append a new commit.
|
|
284
394
|
try {
|
|
285
|
-
execFileSync('git', ['rev-parse', '--verify',
|
|
395
|
+
execFileSync('git', ['rev-parse', '--verify', reportsBranch], { cwd: repoPath, timeout: 5_000, stdio: 'pipe' });
|
|
286
396
|
}
|
|
287
397
|
catch {
|
|
288
|
-
// Branch doesn't exist yet — create it from the
|
|
289
|
-
|
|
290
|
-
|
|
398
|
+
// Branch doesn't exist yet — create it from origin/main so the audit
|
|
399
|
+
// always forks from the latest upstream commit, even if the local HEAD
|
|
400
|
+
// is stale or sitting on a previous audit branch.
|
|
401
|
+
let fetchOk = false;
|
|
402
|
+
try {
|
|
403
|
+
execFileSync('git', ['fetch', 'origin', 'main'], { cwd: repoPath, timeout: 30_000, stdio: 'pipe' });
|
|
404
|
+
fetchOk = true;
|
|
405
|
+
}
|
|
406
|
+
catch (fetchErr) {
|
|
407
|
+
console.warn(`[workflow:${def.kind}] git fetch origin main failed (will fork from local HEAD): ${fetchErr}`);
|
|
408
|
+
}
|
|
409
|
+
const branchArgs = ['branch', reportsBranch];
|
|
410
|
+
if (fetchOk)
|
|
411
|
+
branchArgs.push('origin/main');
|
|
412
|
+
execFileSync('git', branchArgs, { cwd: repoPath, timeout: 5_000 });
|
|
413
|
+
console.log(`[workflow:${def.kind}] Created branch ${reportsBranch}${fetchOk ? ' from origin/main' : ' from current HEAD (fetch failed)'}`);
|
|
291
414
|
}
|
|
292
415
|
// Create a temporary worktree on the reports branch
|
|
293
416
|
const wtDir = join(repoPath, '..', `.codekin-wt-report-${ctx.runId}`);
|
|
294
417
|
try {
|
|
295
|
-
execFileSync('git', ['worktree', 'add', wtDir,
|
|
418
|
+
execFileSync('git', ['worktree', 'add', wtDir, reportsBranch], { cwd: repoPath, timeout: 10_000 });
|
|
296
419
|
// Write the report file in the worktree
|
|
297
420
|
const reportsDirInWt = join(wtDir, def.outputDir);
|
|
298
421
|
if (!existsSync(reportsDirInWt)) {
|
|
@@ -301,14 +424,14 @@ function registerWorkflow(engine, sessions, def) {
|
|
|
301
424
|
writeFileSync(join(reportsDirInWt, filename), markdown, 'utf-8');
|
|
302
425
|
execFileSync('git', ['add', relativePath], { cwd: wtDir, timeout: 10_000 });
|
|
303
426
|
execFileSync('git', ['commit', '-m', `${def.commitMessage} ${dateStr}`], { cwd: wtDir, timeout: 15_000 });
|
|
304
|
-
console.log(`[workflow:${def.kind}] Committed ${relativePath} on ${
|
|
427
|
+
console.log(`[workflow:${def.kind}] Committed ${relativePath} on ${reportsBranch}`);
|
|
305
428
|
// Push to remote
|
|
306
429
|
try {
|
|
307
|
-
execFileSync('git', ['push', 'origin',
|
|
308
|
-
console.log(`[workflow:${def.kind}] Pushed ${
|
|
430
|
+
execFileSync('git', ['push', 'origin', reportsBranch], { cwd: wtDir, timeout: 30_000, stdio: 'pipe' });
|
|
431
|
+
console.log(`[workflow:${def.kind}] Pushed ${reportsBranch} to origin`);
|
|
309
432
|
}
|
|
310
433
|
catch (pushErr) {
|
|
311
|
-
console.warn(`[workflow:${def.kind}] Could not push ${
|
|
434
|
+
console.warn(`[workflow:${def.kind}] Could not push ${reportsBranch}: ${pushErr}`);
|
|
312
435
|
}
|
|
313
436
|
}
|
|
314
437
|
finally {
|
|
@@ -341,6 +464,24 @@ function registerWorkflow(engine, sessions, def) {
|
|
|
341
464
|
catch {
|
|
342
465
|
// Ignore cleanup errors
|
|
343
466
|
}
|
|
467
|
+
// Guard: the audit session runs directly in repoPath (no worktree isolation),
|
|
468
|
+
// so the Claude agent can check out the audit branch while following CLAUDE.md's
|
|
469
|
+
// instruction to commit reports on a branch. Restore the original branch so the
|
|
470
|
+
// next run does not fork its audit branch from a stale, audit-branch HEAD.
|
|
471
|
+
const repoPath = run.output?.repoPath;
|
|
472
|
+
const branch = run.output?.branch;
|
|
473
|
+
if (repoPath && branch) {
|
|
474
|
+
try {
|
|
475
|
+
const current = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: repoPath, timeout: 5_000, stdio: 'pipe' }).toString().trim();
|
|
476
|
+
if (current !== branch) {
|
|
477
|
+
console.warn(`[workflow:${def.kind}] Main checkout is on '${current}' instead of '${branch}' — restoring`);
|
|
478
|
+
execFileSync('git', ['checkout', branch], { cwd: repoPath, timeout: 10_000, stdio: 'pipe' });
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
catch (err) {
|
|
482
|
+
console.warn(`[workflow:${def.kind}] Could not restore branch to ${branch}: ${err}`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
344
485
|
},
|
|
345
486
|
});
|
|
346
487
|
}
|
|
@@ -429,6 +570,19 @@ export function loadMdWorkflows(engine, sessions) {
|
|
|
429
570
|
for (const def of defs) {
|
|
430
571
|
registerWorkflow(engine, sessions, def);
|
|
431
572
|
}
|
|
573
|
+
// Let the engine consult the session manager when deciding whether an interrupted
|
|
574
|
+
// run is still resumable. Returning null tells the engine the session has gone and
|
|
575
|
+
// the run should fail with a clear, typed reason instead of being skipped silently.
|
|
576
|
+
// (Defensive optional-call so older test doubles without setSessionResolver still pass.)
|
|
577
|
+
engine.setSessionResolver?.((sessionId) => {
|
|
578
|
+
const session = sessions.get(sessionId);
|
|
579
|
+
if (!session)
|
|
580
|
+
return null;
|
|
581
|
+
const lastActivityAt = session._lastActivityAt
|
|
582
|
+
? new Date(session._lastActivityAt).toISOString()
|
|
583
|
+
: null;
|
|
584
|
+
return { lastActivityAt };
|
|
585
|
+
});
|
|
432
586
|
console.log(`[workflow-loader] Loaded ${defs.length} workflow(s) from MD definitions`);
|
|
433
587
|
}
|
|
434
588
|
//# sourceMappingURL=workflow-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-loader.js","sourceRoot":"","sources":["../workflow-loader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflow-loader.js","sourceRoot":"","sources":["../workflow-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,21 @@ import { Router } from 'express';
|
|
|
8
8
|
import type { Request } from 'express';
|
|
9
9
|
import type { CommitEventHandler } from './commit-event-handler.js';
|
|
10
10
|
import type { SessionManager } from './session-manager.js';
|
|
11
|
+
/**
|
|
12
|
+
* Parse a GitHub `owner/repo` slug from a git remote URL.
|
|
13
|
+
* Supports SSH (git@github.com:owner/repo.git) and HTTPS (https://github.com/owner/repo.git).
|
|
14
|
+
* Returns null for non-GitHub remotes.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseGitHubSlug(remoteUrl: string): string | null;
|
|
17
|
+
export interface WebhookSetupResult {
|
|
18
|
+
status: 'created' | 'updated' | 'already_configured' | 'failed';
|
|
19
|
+
message: string;
|
|
20
|
+
repo?: string;
|
|
21
|
+
}
|
|
11
22
|
type VerifyFn = (token: string | undefined) => boolean;
|
|
12
23
|
type ExtractFn = (req: Request) => string | undefined;
|
|
24
|
+
/** Validate a 5-field cron expression. Returns true if the format is valid. */
|
|
25
|
+
export declare function isValidCron(expr: string): boolean;
|
|
13
26
|
/**
|
|
14
27
|
* Sync cron schedules with the current workflow config.
|
|
15
28
|
* When `sessions` is provided, also registers any standalone repo workflows.
|
|
@@ -5,13 +5,99 @@
|
|
|
5
5
|
* runs, schedules, and repo config. All routes require auth.
|
|
6
6
|
*/
|
|
7
7
|
import { Router } from 'express';
|
|
8
|
+
import { execFile } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
8
10
|
import { getWorkflowEngine } from './workflow-engine.js';
|
|
9
11
|
import { loadWorkflowConfig, addReviewRepo, removeReviewRepo, updateReviewRepo, } from './workflow-config.js';
|
|
10
12
|
import { listAvailableKinds, ensureRepoWorkflowsRegistered } from './workflow-loader.js';
|
|
11
13
|
import { syncCommitHooks } from './commit-event-hooks.js';
|
|
14
|
+
import { resolveRepoPathInRoot } from './config.js';
|
|
12
15
|
import { VALID_PROVIDERS } from './types.js';
|
|
16
|
+
import { previewWebhookSetup, createRepoWebhook, updateRepoWebhook, } from './webhook-github-setup.js';
|
|
17
|
+
import { loadWebhookConfig, generateWebhookSecret, saveWebhookConfig } from './webhook-config.js';
|
|
18
|
+
const execFileAsync = promisify(execFile);
|
|
19
|
+
/**
|
|
20
|
+
* Parse a GitHub `owner/repo` slug from a git remote URL.
|
|
21
|
+
* Supports SSH (git@github.com:owner/repo.git) and HTTPS (https://github.com/owner/repo.git).
|
|
22
|
+
* Returns null for non-GitHub remotes.
|
|
23
|
+
*/
|
|
24
|
+
export function parseGitHubSlug(remoteUrl) {
|
|
25
|
+
const url = remoteUrl.trim();
|
|
26
|
+
// SSH form: strictly anchored so "notgithub.com:..." cannot match.
|
|
27
|
+
const sshMatch = url.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
28
|
+
if (sshMatch)
|
|
29
|
+
return `${sshMatch[1]}/${sshMatch[2]}`;
|
|
30
|
+
// HTTPS form: use the URL constructor so the hostname is checked exactly,
|
|
31
|
+
// preventing substring matches like "evil.com/github.com/...".
|
|
32
|
+
try {
|
|
33
|
+
const parsed = new URL(url);
|
|
34
|
+
if (parsed.hostname !== 'github.com' && parsed.hostname !== 'www.github.com')
|
|
35
|
+
return null;
|
|
36
|
+
const parts = parsed.pathname.replace(/\.git$/, '').split('/').filter(Boolean);
|
|
37
|
+
if (parts.length < 2)
|
|
38
|
+
return null;
|
|
39
|
+
return `${parts[0]}/${parts[1]}`;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Derive the GitHub `owner/repo` slug from a local repo path
|
|
47
|
+
* by parsing the git remote origin URL.
|
|
48
|
+
*/
|
|
49
|
+
async function getGitHubSlug(repoPath) {
|
|
50
|
+
try {
|
|
51
|
+
const { stdout } = await execFileAsync('git', ['-C', repoPath, 'remote', 'get-url', 'origin'], { timeout: 5000 });
|
|
52
|
+
return parseGitHubSlug(stdout);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Auto-setup the GitHub webhook for a PR review workflow.
|
|
60
|
+
* Ensures the webhook config has a secret and is enabled, then
|
|
61
|
+
* creates/updates the webhook on the GitHub repo.
|
|
62
|
+
*/
|
|
63
|
+
async function autoSetupPrWebhook(repoPath, webhookUrl) {
|
|
64
|
+
const slug = await getGitHubSlug(repoPath);
|
|
65
|
+
if (!slug) {
|
|
66
|
+
return {
|
|
67
|
+
status: 'failed',
|
|
68
|
+
message: `Could not determine GitHub repository from ${repoPath}. Please set up the webhook manually in Settings.`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const preview = await previewWebhookSetup(slug, webhookUrl);
|
|
72
|
+
if (preview.action === 'none') {
|
|
73
|
+
return { status: 'already_configured', message: 'GitHub webhook is already configured.', repo: slug };
|
|
74
|
+
}
|
|
75
|
+
// Ensure server webhook config has a secret and is enabled
|
|
76
|
+
let config = loadWebhookConfig();
|
|
77
|
+
const configUpdates = {};
|
|
78
|
+
if (!config.secret)
|
|
79
|
+
configUpdates.secret = generateWebhookSecret();
|
|
80
|
+
if (!config.enabled)
|
|
81
|
+
configUpdates.enabled = true;
|
|
82
|
+
if (Object.keys(configUpdates).length > 0) {
|
|
83
|
+
saveWebhookConfig(configUpdates);
|
|
84
|
+
config = loadWebhookConfig();
|
|
85
|
+
}
|
|
86
|
+
if (preview.action === 'create') {
|
|
87
|
+
await createRepoWebhook(slug, webhookUrl, config.secret, preview.proposed.events);
|
|
88
|
+
return { status: 'created', message: `GitHub webhook created on ${slug}.`, repo: slug };
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
await updateRepoWebhook(slug, preview.existing.id, {
|
|
92
|
+
events: preview.proposed.events,
|
|
93
|
+
active: true,
|
|
94
|
+
secret: config.secret,
|
|
95
|
+
});
|
|
96
|
+
return { status: 'updated', message: `GitHub webhook updated on ${slug}.`, repo: slug };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
13
99
|
/** Validate a 5-field cron expression. Returns true if the format is valid. */
|
|
14
|
-
function isValidCron(expr) {
|
|
100
|
+
export function isValidCron(expr) {
|
|
15
101
|
const parts = expr.trim().split(/\s+/);
|
|
16
102
|
if (parts.length !== 5)
|
|
17
103
|
return false;
|
|
@@ -26,6 +112,11 @@ function isValidCron(expr) {
|
|
|
26
112
|
const [min, max] = ranges[i];
|
|
27
113
|
return part.split(',').every(segment => {
|
|
28
114
|
const stepMatch = segment.match(/^(.+)\/(\d+)$/);
|
|
115
|
+
if (stepMatch) {
|
|
116
|
+
const step = parseInt(stepMatch[2], 10);
|
|
117
|
+
if (isNaN(step) || step < 1)
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
29
120
|
const range = stepMatch ? stepMatch[1] : segment;
|
|
30
121
|
if (range === '*')
|
|
31
122
|
return true;
|
|
@@ -106,6 +197,9 @@ export function createWorkflowRouter(verifyToken, extractToken, sessions, commit
|
|
|
106
197
|
if (!repoPath || !branch || !commitHash || !commitMessage) {
|
|
107
198
|
return res.status(400).json({ error: 'Missing required fields: repoPath, branch, commitHash, commitMessage' });
|
|
108
199
|
}
|
|
200
|
+
if (!resolveRepoPathInRoot(repoPath)) {
|
|
201
|
+
return res.status(400).json({ error: 'Invalid repoPath: must be an existing directory under the configured repos root' });
|
|
202
|
+
}
|
|
109
203
|
const result = await handler.handle({
|
|
110
204
|
repoPath,
|
|
111
205
|
branch,
|
|
@@ -132,6 +226,9 @@ export function createWorkflowRouter(verifyToken, extractToken, sessions, commit
|
|
|
132
226
|
// -------------------------------------------------------------------------
|
|
133
227
|
router.get('/kinds', (req, res) => {
|
|
134
228
|
const repoPath = req.query.repoPath;
|
|
229
|
+
if (repoPath && !resolveRepoPathInRoot(repoPath)) {
|
|
230
|
+
return res.status(400).json({ error: 'Invalid repoPath: must be an existing directory under the configured repos root' });
|
|
231
|
+
}
|
|
135
232
|
const kinds = listAvailableKinds(repoPath);
|
|
136
233
|
res.json({ kinds });
|
|
137
234
|
});
|
|
@@ -220,6 +317,9 @@ export function createWorkflowRouter(verifyToken, extractToken, sessions, commit
|
|
|
220
317
|
const existing = engine.getSchedule(req.params.id);
|
|
221
318
|
if (!existing)
|
|
222
319
|
return res.status(404).json({ error: 'Schedule not found' });
|
|
320
|
+
if (req.body.cronExpression !== undefined && !isValidCron(req.body.cronExpression)) {
|
|
321
|
+
return res.status(400).json({ error: 'Invalid cron expression' });
|
|
322
|
+
}
|
|
223
323
|
const schedule = engine.upsertSchedule({
|
|
224
324
|
id: existing.id,
|
|
225
325
|
kind: existing.kind,
|
|
@@ -256,14 +356,20 @@ export function createWorkflowRouter(verifyToken, extractToken, sessions, commit
|
|
|
256
356
|
router.get('/config', (_req, res) => {
|
|
257
357
|
res.json({ config: loadWorkflowConfig() });
|
|
258
358
|
});
|
|
259
|
-
router.post('/config/repos', (req, res) => {
|
|
260
|
-
const { id, name, repoPath, cronExpression, enabled, customPrompt, kind, model, provider } = req.body;
|
|
359
|
+
router.post('/config/repos', async (req, res) => {
|
|
360
|
+
const { id, name, repoPath, cronExpression, enabled, customPrompt, kind, model, provider, webhookUrl } = req.body;
|
|
261
361
|
if (!id || !name || !repoPath || !cronExpression) {
|
|
262
362
|
return res.status(400).json({ error: 'Missing required fields: id, name, repoPath, cronExpression' });
|
|
263
363
|
}
|
|
364
|
+
if (cronExpression !== 'event' && !isValidCron(cronExpression)) {
|
|
365
|
+
return res.status(400).json({ error: 'Invalid cron expression' });
|
|
366
|
+
}
|
|
264
367
|
if (provider && !VALID_PROVIDERS.has(provider)) {
|
|
265
368
|
return res.status(400).json({ error: `Invalid provider: ${provider}` });
|
|
266
369
|
}
|
|
370
|
+
if (!resolveRepoPathInRoot(repoPath)) {
|
|
371
|
+
return res.status(400).json({ error: 'Invalid repoPath: must be an existing directory under the configured repos root' });
|
|
372
|
+
}
|
|
267
373
|
// Register any standalone repo workflows before saving config
|
|
268
374
|
if (sessions) {
|
|
269
375
|
try {
|
|
@@ -290,9 +396,39 @@ export function createWorkflowRouter(verifyToken, extractToken, sessions, commit
|
|
|
290
396
|
catch {
|
|
291
397
|
// Engine might not be ready yet
|
|
292
398
|
}
|
|
293
|
-
|
|
399
|
+
// Auto-setup GitHub webhook for pr-review workflows
|
|
400
|
+
let webhookSetup;
|
|
401
|
+
if (kind === 'pr-review' && webhookUrl) {
|
|
402
|
+
try {
|
|
403
|
+
webhookSetup = await autoSetupPrWebhook(repoPath, webhookUrl);
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
webhookSetup = {
|
|
407
|
+
status: 'failed',
|
|
408
|
+
message: err instanceof Error ? err.message : 'Webhook setup failed. Please configure it manually in Settings.',
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else if (kind === 'pr-review' && !webhookUrl) {
|
|
413
|
+
webhookSetup = {
|
|
414
|
+
status: 'failed',
|
|
415
|
+
message: 'Webhook URL not provided. Please configure the GitHub webhook manually in Settings.',
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
res.json({ config, webhookSetup });
|
|
294
419
|
});
|
|
295
420
|
router.patch('/config/repos/:id', (req, res) => {
|
|
421
|
+
if (req.body.repoPath !== undefined && !resolveRepoPathInRoot(req.body.repoPath)) {
|
|
422
|
+
return res.status(400).json({ error: 'Invalid repoPath: must be an existing directory under the configured repos root' });
|
|
423
|
+
}
|
|
424
|
+
if (req.body.cronExpression !== undefined &&
|
|
425
|
+
req.body.cronExpression !== 'event' &&
|
|
426
|
+
!isValidCron(req.body.cronExpression)) {
|
|
427
|
+
return res.status(400).json({ error: 'Invalid cron expression' });
|
|
428
|
+
}
|
|
429
|
+
if (req.body.provider !== undefined && !VALID_PROVIDERS.has(req.body.provider)) {
|
|
430
|
+
return res.status(400).json({ error: `Invalid provider: ${req.body.provider}` });
|
|
431
|
+
}
|
|
296
432
|
try {
|
|
297
433
|
const config = updateReviewRepo(req.params.id, req.body);
|
|
298
434
|
try {
|