@dunnewold-labs/mr-manager 0.4.28 → 0.4.30
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/dist/index.mjs +7 -17
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -185,7 +185,7 @@ import { fileURLToPath } from "url";
|
|
|
185
185
|
// cli/package.json
|
|
186
186
|
var package_default = {
|
|
187
187
|
name: "@dunnewold-labs/mr-manager",
|
|
188
|
-
version: "0.4.
|
|
188
|
+
version: "0.4.30",
|
|
189
189
|
description: "Mr. Manager - Task and project management CLI",
|
|
190
190
|
bin: {
|
|
191
191
|
mr: "./dist/index.mjs"
|
|
@@ -2619,14 +2619,13 @@ function spawnAgent(agent, repoDir, prompt2, prefix, onActivity, sessionId, name
|
|
|
2619
2619
|
}
|
|
2620
2620
|
var watchCommand = new Command8("watch").description(
|
|
2621
2621
|
"Watch for in-progress tasks and autonomously dispatch an AI coding agent to work on them"
|
|
2622
|
-
).option("--interval <seconds>", "Polling interval in seconds", "15").option("--dry-run", "Show what would be dispatched without spawning the agent", false).option("--plan-approval", "Show the agent's plan and ask for approval before executing", false).option("--root <dir>", "Root directory filter for linked repos (default: cwd)").option("--agent <agent>", "AI agent to use: claude, codex, or gemini", "claude").option("--scan-at <HH:MM>", "Run a product scan daily at this time (e.g., 02:00)").
|
|
2622
|
+
).option("--interval <seconds>", "Polling interval in seconds", "15").option("--dry-run", "Show what would be dispatched without spawning the agent", false).option("--plan-approval", "Show the agent's plan and ask for approval before executing", false).option("--root <dir>", "Root directory filter for linked repos (default: cwd)").option("--agent <agent>", "AI agent to use: claude, codex, or gemini", "claude").option("--scan-at <HH:MM>", "Run a product scan daily at this time (e.g., 02:00)").action(async (opts) => {
|
|
2623
2623
|
const intervalMs = parseInt(opts.interval, 10) * 1e3;
|
|
2624
2624
|
const dryRun = opts.dryRun;
|
|
2625
2625
|
const planApproval = opts.planApproval;
|
|
2626
2626
|
const rootDir = opts.root ? resolve2(opts.root) : process.cwd();
|
|
2627
2627
|
const agent = opts.agent === "codex" ? "codex" : opts.agent === "gemini" ? "gemini" : "claude";
|
|
2628
2628
|
const scanAt = opts.scanAt;
|
|
2629
|
-
const globalQuietMode = opts.quiet;
|
|
2630
2629
|
const taskStallTimeoutMs = getTaskStallTimeoutMs();
|
|
2631
2630
|
const hungTaskTimeoutMinutes = Math.max(5, parseInt(process.env.MR_WATCH_HUNG_TASK_TIMEOUT_MINUTES ?? "60", 10) || 60);
|
|
2632
2631
|
const hungTaskTimeoutMs = hungTaskTimeoutMinutes * 6e4;
|
|
@@ -2647,7 +2646,6 @@ var watchCommand = new Command8("watch").description(
|
|
|
2647
2646
|
`stall-timeout=${paint("cyan", formatTimeoutMinutes(taskStallTimeoutMs))}`,
|
|
2648
2647
|
...planApproval ? [paint("yellow", "plan-approval")] : [],
|
|
2649
2648
|
...dryRun ? [paint("yellow", "dry-run")] : [],
|
|
2650
|
-
...globalQuietMode ? [paint("yellow", "quiet")] : [],
|
|
2651
2649
|
...scanAt ? [`scan-at=${paint("cyan", scanAt)}`] : [],
|
|
2652
2650
|
`hung-timeout=${paint("cyan", `${hungTaskTimeoutMinutes}m`)}`
|
|
2653
2651
|
].join(" ");
|
|
@@ -2772,9 +2770,8 @@ var watchCommand = new Command8("watch").description(
|
|
|
2772
2770
|
const legacyBranchName = `mr/${sid}/${slug}`;
|
|
2773
2771
|
const prefix = taskTag(sid);
|
|
2774
2772
|
const vcs = detectVcs(repoDir)?.provider ?? "github";
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
await postTaskUpdate(task.id, `Agent dispatched${taskIsQuiet ? " (quiet mode)" : ""} \u2014 starting work on "${task.title}"`, "system");
|
|
2773
|
+
logDispatch(prefix, `"${paint("bold", task.title)}" ${paint("gray", repoDir)} ${paint("dim", `[${vcs}]`)}`);
|
|
2774
|
+
await postTaskUpdate(task.id, `Agent dispatched \u2014 starting work on "${task.title}"`, "system");
|
|
2778
2775
|
let subtasks = [];
|
|
2779
2776
|
try {
|
|
2780
2777
|
subtasks = await api.get(`/api/tasks/${task.id}/subtasks`);
|
|
@@ -2840,7 +2837,6 @@ var watchCommand = new Command8("watch").description(
|
|
|
2840
2837
|
);
|
|
2841
2838
|
}
|
|
2842
2839
|
const prompt2 = buildExecutionPrompt(task, repoDir, subtasks, vcs, protoRefs, feedbackUpdates, existingResources, skillRefs, executionDir, startWithoutWorktree, !startWithoutWorktree && isGitRepo(repoDir) ? branchName : void 0);
|
|
2843
|
-
const taskIsQuietForEntry = task.quietMode || globalQuietMode;
|
|
2844
2840
|
const activeEntry = {
|
|
2845
2841
|
process: void 0,
|
|
2846
2842
|
title: task.title,
|
|
@@ -2849,8 +2845,7 @@ var watchCommand = new Command8("watch").description(
|
|
|
2849
2845
|
cleanupWorktreePath,
|
|
2850
2846
|
startedAt: Date.now(),
|
|
2851
2847
|
lastActivityAt: Date.now(),
|
|
2852
|
-
outputBytes: 0
|
|
2853
|
-
quietMode: taskIsQuietForEntry
|
|
2848
|
+
outputBytes: 0
|
|
2854
2849
|
};
|
|
2855
2850
|
const touchActivity = () => {
|
|
2856
2851
|
activeEntry.lastActivityAt = Date.now();
|
|
@@ -2879,12 +2874,8 @@ var watchCommand = new Command8("watch").description(
|
|
|
2879
2874
|
const shouldResumeClaudeSession = attemptAgent === "claude" && !!task.claudeSessionId && !resumeAlreadyRetried && (hasFeedback || pausedForNetwork?.resumeSession === true);
|
|
2880
2875
|
const sessionId = attemptAgent === "claude" ? shouldResumeClaudeSession ? task.claudeSessionId : randomUUID() : void 0;
|
|
2881
2876
|
const effectiveClaudeModel = attemptAgent === "claude" ? taskClaudeModel : void 0;
|
|
2882
|
-
const
|
|
2883
|
-
const systemSections = isQuiet ? ["quiet-mode", ...EXECUTION_SYSTEM_SECTIONS] : [...EXECUTION_SYSTEM_SECTIONS];
|
|
2877
|
+
const systemSections = ["quiet-mode", ...EXECUTION_SYSTEM_SECTIONS];
|
|
2884
2878
|
const executionSystemPrompt = composeSystemPrompt(systemSections);
|
|
2885
|
-
if (isQuiet) {
|
|
2886
|
-
logInfo(prefix, `${paint("yellow", "quiet mode")} \u2014 agent will suppress conversational output`);
|
|
2887
|
-
}
|
|
2888
2879
|
const child = spawnAgent(
|
|
2889
2880
|
attemptAgent,
|
|
2890
2881
|
executionDir,
|
|
@@ -2958,10 +2949,9 @@ var watchCommand = new Command8("watch").description(
|
|
|
2958
2949
|
}
|
|
2959
2950
|
finishing.add(task.id);
|
|
2960
2951
|
const elapsedMs = Date.now() - activeEntry.startedAt;
|
|
2961
|
-
const modeLabel = activeEntry.quietMode ? "quiet" : "standard";
|
|
2962
2952
|
const outputTokenEstimate = Math.ceil(activeEntry.outputBytes / 4);
|
|
2963
2953
|
console.log(
|
|
2964
|
-
`${timestamp()} ${prefix} ${paint("dim", `[output]
|
|
2954
|
+
`${timestamp()} ${prefix} ${paint("dim", `[output] output=~${formatTokenCount(outputTokenEstimate)} elapsed=${Math.round(elapsedMs / 1e3)}s exit=${code}`)}`
|
|
2965
2955
|
);
|
|
2966
2956
|
try {
|
|
2967
2957
|
if (code === 0) {
|