-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Expand file tree
/
Copy pathrun-job.ts
More file actions
62 lines (54 loc) · 1.91 KB
/
run-job.ts
File metadata and controls
62 lines (54 loc) · 1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env bun
/**
* Manually run a specific Pulse job by name.
* Usage: bun run run-job.ts <job-name>
*/
import { join } from "path"
import { readFileSync } from "fs"
// Load .env
const envPath = join(process.env.HOME ?? "~", ".claude", ".env")
try {
const envContent = readFileSync(envPath, "utf-8")
for (const line of envContent.split("\n")) {
const trimmed = line.trim()
if (!trimmed || trimmed.startsWith("#")) continue
const eqIdx = trimmed.indexOf("=")
if (eqIdx === -1) continue
const key = trimmed.slice(0, eqIdx).trim()
let value = trimmed.slice(eqIdx + 1).trim()
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'")))
value = value.slice(1, -1)
if (!process.env[key]) process.env[key] = value
}
} catch {}
import { loadConfig, spawnClaude, spawnScript, dispatch, isSentinel, log } from "./lib"
const jobName = process.argv[2]
if (!jobName) {
console.error("Usage: bun run run-job.ts <job-name>")
process.exit(1)
}
const PULSE_DIR = join(process.env.HOME ?? "~", ".claude", "PAI", "PULSE")
const config = await loadConfig(PULSE_DIR)
const job = config.jobs.find((j) => j.name === jobName)
if (!job) {
console.error(`Job "${jobName}" not found. Available: ${config.jobs.map((j) => j.name).join(", ")}`)
process.exit(1)
}
log("info", `Manual run: ${job.name}`, { type: job.type })
const start = Date.now()
let output: string
if (job.type === "claude") {
output = await spawnClaude(job.prompt!, { model: job.model ?? "sonnet" })
} else {
output = await spawnScript(job.command!)
}
const durationMs = Date.now() - start
if (isSentinel(output)) {
log("info", `${job.name} — nothing to report`, { durationMs })
} else {
console.log("\n--- OUTPUT ---\n")
console.log(output)
console.log("\n--- DISPATCHING ---\n")
await dispatch(output, job.output, job.name)
log("info", `${job.name} — dispatched`, { durationMs })
}