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.
Files changed (113) hide show
  1. package/README.md +1 -0
  2. package/bin/codekin.mjs +69 -6
  3. package/dist/assets/index-B0xIzdCK.js +187 -0
  4. package/dist/assets/index-Q2WSVlHo.css +1 -0
  5. package/dist/index.html +2 -2
  6. package/package.json +5 -5
  7. package/server/dist/auth-routes.js +6 -0
  8. package/server/dist/auth-routes.js.map +1 -1
  9. package/server/dist/claude-process.d.ts +1 -0
  10. package/server/dist/claude-process.js +7 -3
  11. package/server/dist/claude-process.js.map +1 -1
  12. package/server/dist/commit-event-handler.d.ts +16 -2
  13. package/server/dist/commit-event-handler.js +43 -10
  14. package/server/dist/commit-event-handler.js.map +1 -1
  15. package/server/dist/commit-event-hooks.d.ts +11 -0
  16. package/server/dist/commit-event-hooks.js +61 -11
  17. package/server/dist/commit-event-hooks.js.map +1 -1
  18. package/server/dist/config.d.ts +19 -0
  19. package/server/dist/config.js +43 -1
  20. package/server/dist/config.js.map +1 -1
  21. package/server/dist/docs-routes.js +4 -7
  22. package/server/dist/docs-routes.js.map +1 -1
  23. package/server/dist/json-parse.d.ts +8 -0
  24. package/server/dist/json-parse.js +9 -0
  25. package/server/dist/json-parse.js.map +1 -0
  26. package/server/dist/opencode-process.js +8 -1
  27. package/server/dist/opencode-process.js.map +1 -1
  28. package/server/dist/orchestrator-children.d.ts +41 -1
  29. package/server/dist/orchestrator-children.js +87 -1
  30. package/server/dist/orchestrator-children.js.map +1 -1
  31. package/server/dist/orchestrator-learning-router.d.ts +8 -0
  32. package/server/dist/orchestrator-learning-router.js +126 -0
  33. package/server/dist/orchestrator-learning-router.js.map +1 -0
  34. package/server/dist/orchestrator-learning.d.ts +0 -5
  35. package/server/dist/orchestrator-learning.js +2 -9
  36. package/server/dist/orchestrator-learning.js.map +1 -1
  37. package/server/dist/orchestrator-memory-router.d.ts +10 -0
  38. package/server/dist/orchestrator-memory-router.js +148 -0
  39. package/server/dist/orchestrator-memory-router.js.map +1 -0
  40. package/server/dist/orchestrator-memory.js +2 -1
  41. package/server/dist/orchestrator-memory.js.map +1 -1
  42. package/server/dist/orchestrator-monitor.d.ts +6 -0
  43. package/server/dist/orchestrator-monitor.js +27 -0
  44. package/server/dist/orchestrator-monitor.js.map +1 -1
  45. package/server/dist/orchestrator-notify.d.ts +29 -0
  46. package/server/dist/orchestrator-notify.js +27 -0
  47. package/server/dist/orchestrator-notify.js.map +1 -0
  48. package/server/dist/orchestrator-reports.d.ts +0 -4
  49. package/server/dist/orchestrator-reports.js +8 -10
  50. package/server/dist/orchestrator-reports.js.map +1 -1
  51. package/server/dist/orchestrator-routes.d.ts +2 -2
  52. package/server/dist/orchestrator-routes.js +11 -506
  53. package/server/dist/orchestrator-routes.js.map +1 -1
  54. package/server/dist/orchestrator-session-router.d.ts +13 -0
  55. package/server/dist/orchestrator-session-router.js +315 -0
  56. package/server/dist/orchestrator-session-router.js.map +1 -0
  57. package/server/dist/process-coordinator.d.ts +83 -0
  58. package/server/dist/process-coordinator.js +167 -0
  59. package/server/dist/process-coordinator.js.map +1 -0
  60. package/server/dist/prompt-router.js +2 -1
  61. package/server/dist/prompt-router.js.map +1 -1
  62. package/server/dist/session-archive.js +2 -1
  63. package/server/dist/session-archive.js.map +1 -1
  64. package/server/dist/session-lifecycle.d.ts +1 -0
  65. package/server/dist/session-lifecycle.js +15 -36
  66. package/server/dist/session-lifecycle.js.map +1 -1
  67. package/server/dist/session-manager.d.ts +34 -0
  68. package/server/dist/session-manager.js +161 -79
  69. package/server/dist/session-manager.js.map +1 -1
  70. package/server/dist/session-persistence.js +3 -1
  71. package/server/dist/session-persistence.js.map +1 -1
  72. package/server/dist/session-routes.d.ts +18 -0
  73. package/server/dist/session-routes.js +60 -12
  74. package/server/dist/session-routes.js.map +1 -1
  75. package/server/dist/stepflow-handler.js +5 -1
  76. package/server/dist/stepflow-handler.js.map +1 -1
  77. package/server/dist/stepflow-prompt.js +16 -12
  78. package/server/dist/stepflow-prompt.js.map +1 -1
  79. package/server/dist/tsconfig.tsbuildinfo +1 -1
  80. package/server/dist/types.d.ts +4 -0
  81. package/server/dist/types.js +1 -0
  82. package/server/dist/types.js.map +1 -1
  83. package/server/dist/upload-routes.d.ts +5 -0
  84. package/server/dist/upload-routes.js +81 -16
  85. package/server/dist/upload-routes.js.map +1 -1
  86. package/server/dist/version-check.js +3 -2
  87. package/server/dist/version-check.js.map +1 -1
  88. package/server/dist/webhook-rate-limiter.js +9 -1
  89. package/server/dist/webhook-rate-limiter.js.map +1 -1
  90. package/server/dist/webhook-workspace.d.ts +12 -0
  91. package/server/dist/webhook-workspace.js +126 -3
  92. package/server/dist/webhook-workspace.js.map +1 -1
  93. package/server/dist/workflow-engine.d.ts +81 -7
  94. package/server/dist/workflow-engine.js +234 -40
  95. package/server/dist/workflow-engine.js.map +1 -1
  96. package/server/dist/workflow-loader.d.ts +6 -1
  97. package/server/dist/workflow-loader.js +189 -35
  98. package/server/dist/workflow-loader.js.map +1 -1
  99. package/server/dist/workflow-routes.d.ts +13 -0
  100. package/server/dist/workflow-routes.js +140 -4
  101. package/server/dist/workflow-routes.js.map +1 -1
  102. package/server/dist/ws-message-handler.js +5 -1
  103. package/server/dist/ws-message-handler.js.map +1 -1
  104. package/server/dist/ws-origin-check.d.ts +11 -0
  105. package/server/dist/ws-origin-check.js +20 -0
  106. package/server/dist/ws-origin-check.js.map +1 -0
  107. package/server/dist/ws-rate-limit.d.ts +19 -0
  108. package/server/dist/ws-rate-limit.js +30 -0
  109. package/server/dist/ws-rate-limit.js.map +1 -0
  110. package/server/dist/ws-server.js +69 -32
  111. package/server/dist/ws-server.js.map +1 -1
  112. package/dist/assets/index-CxlBrS5y.js +0 -182
  113. 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 codekin/reports branch, push
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
- /** Parse a workflow MD file into a WorkflowDef. Throws if required fields are missing. */
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 Error(`Session ${sessionId} not found`);
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
- // Per-repo override: check {repoPath}/.codekin/workflows/{kind}.md
220
- const repoOverride = loadRepoOverride(repoPath, ctx.run.kind);
221
- const basePrompt = repoOverride ? repoOverride.prompt : def.prompt;
222
- const prompt = customPrompt
223
- ? `${basePrompt}\n\nAdditional focus areas:\n${customPrompt}`
224
- : basePrompt;
225
- if (repoOverride) {
226
- console.log(`[workflow:${def.kind}] Using per-repo prompt override from ${repoPath}`);
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
- writeFileSync(filePath, markdown, 'utf-8');
276
- console.log(`[workflow:${def.kind}] Saved report to ${filePath}`);
277
- // Commit on a dedicated branch so reports don't pollute the working branch.
278
- // Use a temporary git worktree to avoid stash/checkout races when
279
- // multiple workflow runs target the same repo concurrently.
280
- const REPORTS_BRANCH = 'codekin/reports';
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', REPORTS_BRANCH], { cwd: repoPath, timeout: 5_000, stdio: 'pipe' });
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 current branch
289
- execFileSync('git', ['branch', REPORTS_BRANCH], { cwd: repoPath, timeout: 5_000 });
290
- console.log(`[workflow:${def.kind}] Created branch ${REPORTS_BRANCH}`);
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, REPORTS_BRANCH], { cwd: repoPath, timeout: 10_000 });
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 ${REPORTS_BRANCH}`);
427
+ console.log(`[workflow:${def.kind}] Committed ${relativePath} on ${reportsBranch}`);
305
428
  // Push to remote
306
429
  try {
307
- execFileSync('git', ['push', 'origin', REPORTS_BRANCH], { cwd: wtDir, timeout: 30_000, stdio: 'pipe' });
308
- console.log(`[workflow:${def.kind}] Pushed ${REPORTS_BRANCH} to origin`);
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 ${REPORTS_BRANCH}: ${pushErr}`);
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
- res.json({ config });
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 {