jonah-fleet 1.4.0 → 1.4.1
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/CHANGELOG.md +7 -0
- package/dist/commands/daemon.d.ts +2 -0
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/index.js +133 -59
- package/dist/lib/daemon.d.ts +11 -3
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/presets.d.ts +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,13 @@ All notable changes to `jonah-fleet` will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.4.1] - 2026-09-03
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Decoupled Multi-Cadence Daemon & Zero-Cost PR Preflight:
|
|
12
|
+
- Added independent scheduling in `jonah-fleet daemon` via `--review-interval` (default: 3m) and `--autowork-interval` (default: 30m).
|
|
13
|
+
- Added ultra-fast (~100ms) local PR preflight check (`countOpenReadyPRs`) in `src/lib/daemon.ts` that queries `gh pr list` and skips agent invocations with 0 token spend when 0 ready PRs are open.
|
|
14
|
+
|
|
8
15
|
## [1.4.0] - 2026-09-03
|
|
9
16
|
|
|
10
17
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FzG"}
|
package/dist/index.js
CHANGED
|
@@ -90,7 +90,7 @@ var ROUTINE_TO_WORKFLOW_MAP = {
|
|
|
90
90
|
"product-planning": [],
|
|
91
91
|
"analytics-review": []
|
|
92
92
|
};
|
|
93
|
-
var FLEET_VERSION = "1.4.
|
|
93
|
+
var FLEET_VERSION = "1.4.1";
|
|
94
94
|
var SCHEMA_URL = "https://raw.githubusercontent.com/juliendurandeu/jonah-fleet/main/schema.json";
|
|
95
95
|
|
|
96
96
|
// src/lib/manifest.ts
|
|
@@ -2509,8 +2509,10 @@ import pc11 from "picocolors";
|
|
|
2509
2509
|
// src/lib/daemon.ts
|
|
2510
2510
|
import fs12 from "fs";
|
|
2511
2511
|
import path12 from "path";
|
|
2512
|
-
import { spawn as spawn2 } from "child_process";
|
|
2512
|
+
import { spawn as spawn2, execFile as execFile3 } from "child_process";
|
|
2513
|
+
import { promisify as promisify3 } from "util";
|
|
2513
2514
|
import pc10 from "picocolors";
|
|
2515
|
+
var execFileAsync3 = promisify3(execFile3);
|
|
2514
2516
|
function getDaemonStatePath(repoRoot) {
|
|
2515
2517
|
return path12.join(repoRoot, ".jonah-fleet", "daemon.json");
|
|
2516
2518
|
}
|
|
@@ -2548,18 +2550,40 @@ function isDaemonRunning(repoRoot) {
|
|
|
2548
2550
|
return false;
|
|
2549
2551
|
}
|
|
2550
2552
|
}
|
|
2553
|
+
async function countOpenReadyPRs(repoRoot) {
|
|
2554
|
+
try {
|
|
2555
|
+
const { stdout } = await execFileAsync3(
|
|
2556
|
+
"gh",
|
|
2557
|
+
["pr", "list", "--state", "open", "--draft=false", "--json", "number", "--jq", "length"],
|
|
2558
|
+
{ cwd: repoRoot }
|
|
2559
|
+
);
|
|
2560
|
+
return parseInt(stdout.trim(), 10) || 0;
|
|
2561
|
+
} catch {
|
|
2562
|
+
return 0;
|
|
2563
|
+
}
|
|
2564
|
+
}
|
|
2551
2565
|
async function startBackgroundDaemon(repoRoot, options = {}) {
|
|
2552
2566
|
if (isDaemonRunning(repoRoot)) {
|
|
2553
2567
|
const existing = readDaemonState(repoRoot);
|
|
2554
2568
|
throw new Error(`Daemon is already running with PID ${existing?.pid}`);
|
|
2555
2569
|
}
|
|
2556
|
-
const
|
|
2557
|
-
const
|
|
2570
|
+
const reviewInterval = options.reviewInterval || 3;
|
|
2571
|
+
const autoworkInterval = options.autoworkInterval || options.interval || 30;
|
|
2572
|
+
const routines = options.routines || ["peer-review", "autowork"];
|
|
2558
2573
|
const logFilePath = path12.join(repoRoot, ".jonah-fleet", "daemon.log");
|
|
2559
2574
|
fs12.mkdirSync(path12.dirname(logFilePath), { recursive: true });
|
|
2560
2575
|
const logFd = fs12.openSync(logFilePath, "a");
|
|
2561
2576
|
const cliPath = process.argv[1];
|
|
2562
|
-
const args = [
|
|
2577
|
+
const args = [
|
|
2578
|
+
"daemon",
|
|
2579
|
+
"--foreground",
|
|
2580
|
+
"--review-interval",
|
|
2581
|
+
String(reviewInterval),
|
|
2582
|
+
"--autowork-interval",
|
|
2583
|
+
String(autoworkInterval),
|
|
2584
|
+
"--routines",
|
|
2585
|
+
routines.join(",")
|
|
2586
|
+
];
|
|
2563
2587
|
if (options.model) {
|
|
2564
2588
|
args.push("--model", options.model);
|
|
2565
2589
|
}
|
|
@@ -2573,7 +2597,8 @@ async function startBackgroundDaemon(repoRoot, options = {}) {
|
|
|
2573
2597
|
const state = {
|
|
2574
2598
|
pid: child.pid,
|
|
2575
2599
|
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2576
|
-
|
|
2600
|
+
reviewIntervalMinutes: reviewInterval,
|
|
2601
|
+
autoworkIntervalMinutes: autoworkInterval,
|
|
2577
2602
|
routines,
|
|
2578
2603
|
status: "idle"
|
|
2579
2604
|
};
|
|
@@ -2594,25 +2619,27 @@ async function stopDaemon(repoRoot) {
|
|
|
2594
2619
|
}
|
|
2595
2620
|
}
|
|
2596
2621
|
async function runDaemonLoop(repoRoot, options = {}) {
|
|
2597
|
-
const
|
|
2598
|
-
const
|
|
2599
|
-
const routines = options.routines || ["
|
|
2622
|
+
const reviewInterval = options.reviewInterval || 3;
|
|
2623
|
+
const autoworkInterval = options.autoworkInterval || options.interval || 30;
|
|
2624
|
+
const routines = options.routines || ["peer-review", "autowork"];
|
|
2600
2625
|
const state = {
|
|
2601
2626
|
pid: process.pid,
|
|
2602
2627
|
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2603
|
-
|
|
2628
|
+
reviewIntervalMinutes: reviewInterval,
|
|
2629
|
+
autoworkIntervalMinutes: autoworkInterval,
|
|
2604
2630
|
routines,
|
|
2605
2631
|
status: "idle"
|
|
2606
2632
|
};
|
|
2607
2633
|
writeDaemonState(repoRoot, state);
|
|
2608
2634
|
console.log(pc10.cyan(`
|
|
2609
|
-
\u{1F916} Jonah Fleet Local Agent Daemon Started`));
|
|
2635
|
+
\u{1F916} Jonah Fleet Multi-Cadence Local Agent Daemon Started`));
|
|
2610
2636
|
console.log(pc10.dim(` PID: ${process.pid}`));
|
|
2611
|
-
console.log(pc10.dim(`
|
|
2612
|
-
console.log(pc10.dim(`
|
|
2637
|
+
console.log(pc10.dim(` Peer Review Watchdog: Every ${reviewInterval} minutes (with zero-cost PR preflight)`));
|
|
2638
|
+
console.log(pc10.dim(` Autowork Backlog Scan: Every ${autoworkInterval} minutes`));
|
|
2613
2639
|
console.log(pc10.dim(` Working Directory: ${repoRoot}
|
|
2614
2640
|
`));
|
|
2615
2641
|
let isStopping = false;
|
|
2642
|
+
let isWorking = false;
|
|
2616
2643
|
const handleStop = async () => {
|
|
2617
2644
|
if (isStopping) return;
|
|
2618
2645
|
isStopping = true;
|
|
@@ -2624,45 +2651,85 @@ Stopping local agent daemon...`));
|
|
|
2624
2651
|
};
|
|
2625
2652
|
process.once("SIGINT", handleStop);
|
|
2626
2653
|
process.once("SIGTERM", handleStop);
|
|
2627
|
-
const
|
|
2628
|
-
if (isStopping) return;
|
|
2629
|
-
|
|
2630
|
-
state.lastCheckAt = now;
|
|
2654
|
+
const runReviewCheck = async () => {
|
|
2655
|
+
if (isStopping || isWorking) return;
|
|
2656
|
+
state.lastReviewCheckAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
2631
2657
|
writeDaemonState(repoRoot, state);
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
}
|
|
2654
|
-
console.
|
|
2655
|
-
}
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2658
|
+
const openPRCount = await countOpenReadyPRs(repoRoot);
|
|
2659
|
+
if (openPRCount === 0) {
|
|
2660
|
+
console.log(pc10.dim(`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}] Peer Review Watchdog: 0 ready PRs found (0 tokens used).`));
|
|
2661
|
+
return;
|
|
2662
|
+
}
|
|
2663
|
+
try {
|
|
2664
|
+
isWorking = true;
|
|
2665
|
+
state.status = "working";
|
|
2666
|
+
state.activeRoutine = "peer-review";
|
|
2667
|
+
writeDaemonState(repoRoot, state);
|
|
2668
|
+
console.log(pc10.cyan(`
|
|
2669
|
+
[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}] \u{1F50D} Peer Review Watchdog: Found ${openPRCount} ready PR(s). Starting review session...`));
|
|
2670
|
+
await cleanupStaleWorktrees(repoRoot);
|
|
2671
|
+
const result = await runLocalRoutine({
|
|
2672
|
+
targetDir: repoRoot,
|
|
2673
|
+
routine: "peer-review",
|
|
2674
|
+
model: options.model,
|
|
2675
|
+
noWorktree: false
|
|
2676
|
+
});
|
|
2677
|
+
if (result.success) {
|
|
2678
|
+
console.log(pc10.green(`\u2713 Local peer-review completed successfully.`));
|
|
2679
|
+
} else {
|
|
2680
|
+
console.warn(pc10.yellow(`\u26A0\uFE0F Local peer-review completed with code ${result.exitCode}.`));
|
|
2681
|
+
}
|
|
2682
|
+
} catch (err) {
|
|
2683
|
+
console.error(pc10.red(`\u2717 Error in peer-review: ${err.message}`));
|
|
2684
|
+
} finally {
|
|
2685
|
+
isWorking = false;
|
|
2686
|
+
state.status = "idle";
|
|
2687
|
+
state.activeRoutine = void 0;
|
|
2688
|
+
writeDaemonState(repoRoot, state);
|
|
2689
|
+
}
|
|
2690
|
+
};
|
|
2691
|
+
const runAutoworkCheck = async () => {
|
|
2692
|
+
if (isStopping || isWorking || !routines.includes("autowork")) return;
|
|
2693
|
+
state.lastAutoworkCheckAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
2694
|
+
writeDaemonState(repoRoot, state);
|
|
2695
|
+
try {
|
|
2696
|
+
isWorking = true;
|
|
2697
|
+
state.status = "working";
|
|
2698
|
+
state.activeRoutine = "autowork";
|
|
2699
|
+
writeDaemonState(repoRoot, state);
|
|
2700
|
+
console.log(pc10.cyan(`
|
|
2701
|
+
[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}] \u{1F680} Autowork Backlog Scan: Starting session...`));
|
|
2702
|
+
await cleanupStaleWorktrees(repoRoot);
|
|
2703
|
+
const result = await runLocalRoutine({
|
|
2704
|
+
targetDir: repoRoot,
|
|
2705
|
+
routine: "autowork",
|
|
2706
|
+
model: options.model,
|
|
2707
|
+
noWorktree: false
|
|
2708
|
+
});
|
|
2709
|
+
if (result.success) {
|
|
2710
|
+
console.log(pc10.green(`\u2713 Local autowork completed successfully.`));
|
|
2711
|
+
} else {
|
|
2712
|
+
console.warn(pc10.yellow(`\u26A0\uFE0F Local autowork completed with code ${result.exitCode}.`));
|
|
2660
2713
|
}
|
|
2714
|
+
} catch (err) {
|
|
2715
|
+
console.error(pc10.red(`\u2717 Error in autowork: ${err.message}`));
|
|
2716
|
+
} finally {
|
|
2717
|
+
isWorking = false;
|
|
2718
|
+
state.status = "idle";
|
|
2719
|
+
state.activeRoutine = void 0;
|
|
2720
|
+
writeDaemonState(repoRoot, state);
|
|
2661
2721
|
}
|
|
2662
|
-
console.log(pc10.dim(`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}] Sweep completed. Next run in ${intervalMinutes}m.`));
|
|
2663
2722
|
};
|
|
2664
|
-
|
|
2665
|
-
|
|
2723
|
+
if (routines.includes("peer-review")) {
|
|
2724
|
+
await runReviewCheck();
|
|
2725
|
+
}
|
|
2726
|
+
if (routines.includes("autowork")) {
|
|
2727
|
+
await runAutoworkCheck();
|
|
2728
|
+
}
|
|
2729
|
+
const reviewIntervalMs = reviewInterval * 60 * 1e3;
|
|
2730
|
+
const autoworkIntervalMs = autoworkInterval * 60 * 1e3;
|
|
2731
|
+
const reviewTimer = setInterval(runReviewCheck, reviewIntervalMs);
|
|
2732
|
+
const autoworkTimer = setInterval(runAutoworkCheck, autoworkIntervalMs);
|
|
2666
2733
|
await new Promise(() => {
|
|
2667
2734
|
});
|
|
2668
2735
|
}
|
|
@@ -2673,6 +2740,8 @@ async function runDaemonCommand(action, options = {}) {
|
|
|
2673
2740
|
const act = action?.toLowerCase() || (options.foreground ? "foreground" : "status");
|
|
2674
2741
|
const daemonOpts = {
|
|
2675
2742
|
interval: options.interval ? parseInt(options.interval, 10) : void 0,
|
|
2743
|
+
reviewInterval: options.reviewInterval ? parseInt(options.reviewInterval, 10) : void 0,
|
|
2744
|
+
autoworkInterval: options.autoworkInterval ? parseInt(options.autoworkInterval, 10) : options.interval ? parseInt(options.interval, 10) : void 0,
|
|
2676
2745
|
routines: options.routines ? options.routines.split(",").map((r) => r.trim()) : void 0,
|
|
2677
2746
|
model: options.model,
|
|
2678
2747
|
foreground: options.foreground
|
|
@@ -2687,7 +2756,8 @@ async function runDaemonCommand(action, options = {}) {
|
|
|
2687
2756
|
console.log(pc11.green(`
|
|
2688
2757
|
\u2713 Background agent daemon started successfully.`));
|
|
2689
2758
|
console.log(pc11.dim(` PID: ${state2.pid}`));
|
|
2690
|
-
console.log(pc11.dim(`
|
|
2759
|
+
console.log(pc11.dim(` Peer Review Watchdog: Every ${state2.reviewIntervalMinutes} minutes (zero-cost PR preflight)`));
|
|
2760
|
+
console.log(pc11.dim(` Autowork Backlog Scan: Every ${state2.autoworkIntervalMinutes} minutes`));
|
|
2691
2761
|
console.log(pc11.dim(` Routines: ${state2.routines.join(", ")}`));
|
|
2692
2762
|
console.log(pc11.dim(` Log file: .jonah-fleet/daemon.log`));
|
|
2693
2763
|
console.log(pc11.dim(` Run 'jonah-fleet daemon status' or 'jonah-fleet daemon stop' to manage.`));
|
|
@@ -2727,17 +2797,21 @@ Stopping background agent daemon (PID ${state2?.pid})...`));
|
|
|
2727
2797
|
\u{1F916} Jonah Fleet Local Daemon Status
|
|
2728
2798
|
`));
|
|
2729
2799
|
if (running && state) {
|
|
2730
|
-
console.log(` Status:
|
|
2731
|
-
console.log(` PID:
|
|
2732
|
-
console.log(` Started:
|
|
2733
|
-
console.log(`
|
|
2734
|
-
console.log(`
|
|
2735
|
-
console.log(`
|
|
2736
|
-
|
|
2737
|
-
|
|
2800
|
+
console.log(` Status: ${pc11.green(pc11.bold("RUNNING"))}`);
|
|
2801
|
+
console.log(` PID: ${state.pid}`);
|
|
2802
|
+
console.log(` Started: ${new Date(state.startedAt).toLocaleString()}`);
|
|
2803
|
+
console.log(` Peer Review Cadence: Every ${state.reviewIntervalMinutes} minutes (0-token fast preflight)`);
|
|
2804
|
+
console.log(` Autowork Cadence: Every ${state.autoworkIntervalMinutes} minutes`);
|
|
2805
|
+
console.log(` Routines: ${state.routines.join(", ")}`);
|
|
2806
|
+
console.log(` Current State: ${state.status === "working" ? pc11.yellow("WORKING on " + state.activeRoutine) : pc11.green("IDLE")}`);
|
|
2807
|
+
if (state.lastReviewCheckAt) {
|
|
2808
|
+
console.log(` Last Review Check: ${new Date(state.lastReviewCheckAt).toLocaleTimeString()}`);
|
|
2809
|
+
}
|
|
2810
|
+
if (state.lastAutoworkCheckAt) {
|
|
2811
|
+
console.log(` Last Autowork Check: ${new Date(state.lastAutoworkCheckAt).toLocaleTimeString()}`);
|
|
2738
2812
|
}
|
|
2739
2813
|
} else {
|
|
2740
|
-
console.log(` Status:
|
|
2814
|
+
console.log(` Status: ${pc11.gray("STOPPED")}`);
|
|
2741
2815
|
console.log(pc11.dim(` Run 'jonah-fleet daemon start' to start the local worker daemon.`));
|
|
2742
2816
|
}
|
|
2743
2817
|
console.log(`
|
|
@@ -2754,7 +2828,7 @@ program.name("jonah-fleet").description("Manage autonomous agent fleet, prompt r
|
|
|
2754
2828
|
program.command("run <routine>").description("Run a specific prompt routine locally in an isolated git worktree").option("-i, --issue <number>", "Targeted issue number for autowork").option("-p, --pr <number>", "Targeted pull request number for peer-review").option("-m, --model <model>", "LLM model override (defaults to gemini-3.7-flash-high)").option("--timeout <duration>", "CLI execution print timeout (default: 30m)").option("--no-worktree", "Execute directly in current directory without creating a git worktree").option("--keep-worktree", "Preserve the git worktree after routine execution completes").option("-d, --dry-run", "Preview prompt and execution parameters without launching agent").action(async (routine, options) => {
|
|
2755
2829
|
await runRoutineCommand(routine, options);
|
|
2756
2830
|
});
|
|
2757
|
-
program.command("daemon [action]").description("Manage background local worker daemon polling for unclaimed issues and pull requests").option("-i, --interval <minutes>", "
|
|
2831
|
+
program.command("daemon [action]").description("Manage background local worker daemon polling for unclaimed issues and pull requests").option("-i, --interval <minutes>", "Legacy global polling interval in minutes (default: 30)").option("--review-interval <minutes>", "Peer Review watchdog cadence in minutes (default: 3)").option("--autowork-interval <minutes>", "Autowork backlog cadence in minutes (default: 30)").option("-r, --routines <list>", "Comma-separated routines to run (default: peer-review,autowork)").option("-m, --model <model>", "LLM model override").option("--foreground", "Run daemon in foreground with live console logs").action(async (action, options) => {
|
|
2758
2832
|
await runDaemonCommand(action, options);
|
|
2759
2833
|
});
|
|
2760
2834
|
program.command("init").description("Initialize Jonah Fleet configuration, routines, workflows, and skills in the current repo").option("-p, --preset <preset>", "Preset profile to install (minimal | standard | full)", "standard").option("-f, --force", "Force overwrite existing files", false).option("--stack <stack>", "Override detected tech stack name").option("--package-manager <pm>", "Override package manager (npm, pnpm, yarn, bun, uv, poetry, cargo, go)").option("--test-cmd <cmd>", "Override test execution command").option("--build-cmd <cmd>", "Override build execution command").option("--interactive", "Force interactive prompts for stack configuration").option("--no-interactive", "Disable interactive prompts").action(async (options) => {
|
package/dist/lib/daemon.d.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
export interface DaemonState {
|
|
2
2
|
pid: number;
|
|
3
3
|
startedAt: string;
|
|
4
|
-
|
|
4
|
+
reviewIntervalMinutes: number;
|
|
5
|
+
autoworkIntervalMinutes: number;
|
|
5
6
|
routines: string[];
|
|
6
|
-
|
|
7
|
+
lastReviewCheckAt?: string;
|
|
8
|
+
lastAutoworkCheckAt?: string;
|
|
7
9
|
status: 'idle' | 'working' | 'stopped';
|
|
8
10
|
activeRoutine?: string;
|
|
9
11
|
activeWorktree?: string;
|
|
10
12
|
}
|
|
11
13
|
export interface DaemonOptions {
|
|
12
14
|
interval?: number;
|
|
15
|
+
reviewInterval?: number;
|
|
16
|
+
autoworkInterval?: number;
|
|
13
17
|
routines?: string[];
|
|
14
18
|
model?: string;
|
|
15
19
|
foreground?: boolean;
|
|
@@ -19,6 +23,10 @@ export declare function readDaemonState(repoRoot: string): DaemonState | null;
|
|
|
19
23
|
export declare function writeDaemonState(repoRoot: string, state: DaemonState): void;
|
|
20
24
|
export declare function clearDaemonState(repoRoot: string): void;
|
|
21
25
|
export declare function isDaemonRunning(repoRoot: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Fast pre-flight check to query number of open ready PRs in ~100ms with 0 token cost.
|
|
28
|
+
*/
|
|
29
|
+
export declare function countOpenReadyPRs(repoRoot: string): Promise<number>;
|
|
22
30
|
/**
|
|
23
31
|
* Starts the daemon in the background by detaching a child process.
|
|
24
32
|
*/
|
|
@@ -28,7 +36,7 @@ export declare function startBackgroundDaemon(repoRoot: string, options?: Daemon
|
|
|
28
36
|
*/
|
|
29
37
|
export declare function stopDaemon(repoRoot: string): Promise<boolean>;
|
|
30
38
|
/**
|
|
31
|
-
* Runs the polling daemon loop in the current process.
|
|
39
|
+
* Runs the multi-cadence polling daemon loop in the current process.
|
|
32
40
|
*/
|
|
33
41
|
export declare function runDaemonLoop(repoRoot: string, options?: DaemonOptions): Promise<void>;
|
|
34
42
|
//# sourceMappingURL=daemon.d.ts.map
|
package/dist/lib/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQpE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAI3E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CASvD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYzD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWzE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmD/G;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAanE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmIhG"}
|
package/dist/lib/presets.d.ts
CHANGED
|
@@ -47,6 +47,6 @@ export declare const PRESET_CONFIGS: Record<Exclude<PresetName, 'custom'>, {
|
|
|
47
47
|
}>;
|
|
48
48
|
export declare const ROUTINE_TO_WORKFLOW_MAP: Record<keyof FleetManifest['routines'], string[]>;
|
|
49
49
|
export declare const WORKFLOW_TO_ROUTINE_MAP: Record<string, keyof FleetManifest['routines'] | 'sync-fleet'>;
|
|
50
|
-
export declare const FLEET_VERSION = "1.4.
|
|
50
|
+
export declare const FLEET_VERSION = "1.4.1";
|
|
51
51
|
export declare const SCHEMA_URL = "https://raw.githubusercontent.com/juliendurandeu/jonah-fleet/main/schema.json";
|
|
52
52
|
//# sourceMappingURL=presets.d.ts.map
|
package/package.json
CHANGED