(method, modernArgs, legacyArgs)
| 358 | job.includeFiles = [...new Set(job.includeFiles)]; |
| 359 | job.goalAcceptance = [...new Set(job.goalAcceptance || [])]; |
| 360 | job.goalChecks = [...new Set(job.goalChecks || [])]; |
| 361 | if (String(job.kind || "").toLowerCase() === "goal") { |
| 362 | job.name = job.name || "goal"; |
| 363 | job.goalStatus = job.goalStatus || "active"; |
| 364 | job.safe = job.safe !== false; |
| 365 | job.askNever = job.askNever !== false; |
| 366 | job.noOverlap = job.noOverlap !== false; |
| 367 | job.goalRequireEvidence = job.goalRequireEvidence !== false; |
| 368 | job.goalRequireChecksPass = job.goalRequireChecksPass ?? job.goalChecks.length > 0; |
| 369 | job.maxNoProgress = job.maxNoProgress ?? DEFAULT_GOAL_MAX_NO_PROGRESS; |
| 370 | } |
| 371 | job.lastRunAt = job.immediate ? 0 : now(); |
| 372 | if (!job.action && !job.promptFile && !job.goalFile) |
| 373 | return { ok: false, error: "Missing action. Example: /loop 0s continue from progress.md, /loop-goal ship the feature, or /loop 0s --prompt-file loop-prompt.md" }; |
| 374 | return { ok: true, job }; |
| 375 | } |
| 376 | |
| 377 | // src/source/core/process.js |
| 378 | import { promises as fs2 } from "fs"; |
| 379 | import path2 from "path"; |
| 380 | import { spawn } from "child_process"; |
| 381 | |
| 382 | // src/source/core/state.js |
| 383 | import { promises as fs } from "fs"; |
| 384 | import os from "os"; |
no test coverage detected