Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
3854fc7
feature(agent-neutral-shell-copy): Use Agent in shared dashboard mess…
Christoph Jul 20, 2026
cc19993
chore(iterator): record feature commit
Christoph Jul 20, 2026
79791c2
chore(iterator): record feature commits and memory updates
Christoph Jul 20, 2026
bbb2be9
feature(review-exact-red-test-source): Review exact red test source b…
Christoph Jul 20, 2026
a0081a0
chore(iterator): record feature commit
Christoph Jul 20, 2026
d539f33
chore(iterator): record feature commits and memory updates
Christoph Jul 20, 2026
9544c69
feature(agent-neutral-workflow-copy): Use Agent wording across workfl…
Christoph Jul 20, 2026
900c993
chore(iterator): record feature commit
Christoph Jul 20, 2026
54f09fb
chore(iterator): record feature commits and memory updates
Christoph Jul 20, 2026
ce7fee4
feature(persistent-budget-prices): Persist project-wide budget prices
Christoph Jul 20, 2026
2d1b15d
chore(iterator): record feature commit
Christoph Jul 20, 2026
8c1ac8d
feature(persistent-budget-prices): Keep budget prices on the dedicate…
Christoph Jul 20, 2026
08c6bbd
chore(iterator): record feature commit
Christoph Jul 20, 2026
1de87f1
chore(iterator): record feature commits and memory updates
Christoph Jul 20, 2026
a0f4243
feature(finalize-auto-plan-review): Finalize auto mode after plan review
Christoph Jul 20, 2026
545b9cb
chore(iterator): record feature commit
Christoph Jul 20, 2026
8796007
feature(finalize-auto-plan-review): Honor retire prompt on auto compl…
Christoph Jul 20, 2026
99fe0fd
chore(iterator): record feature commit
Christoph Jul 20, 2026
dd4f6ca
chore(iterator): record feature commits and memory updates
Christoph Jul 20, 2026
88c33d1
fixes
Christoph Jul 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions extensions/iterator.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import {
actionToCommand,
activityTextFromMessage,
attributionFromInput,
autoCompleteMessage,
AUTO_PHASE_FOR_STEP,
bundleExists,
featuresDirEntries,
Expand Down Expand Up @@ -821,11 +822,7 @@ export default function iteratorExtension(pi) {
});
autoSteps = 0;
await restoreModel();
notifyUi(
sess.settings?.auto_retire_prompt === "on"
? "auto mode: plan complete — every feature landed. Consider retiring the plan from the dashboard."
: "auto mode: plan complete — every feature landed.",
);
notifyUi(autoCompleteMessage(sess.settings));
await refreshHub(cwd);
return;
}
Expand Down Expand Up @@ -1161,7 +1158,7 @@ export default function iteratorExtension(pi) {
}
const cmd = actionToCommand(result);
if (!cmd) return;
session.showWorking(`Dispatched ${cmd} — Claude is working…`);
session.showWorking(`Dispatched ${cmd} — Agent is working…`);
dispatch(cmd);
},
onControl,
Expand Down Expand Up @@ -1411,6 +1408,17 @@ export default function iteratorExtension(pi) {
// Work so their paths and target state are immediately visible.
void refreshHub(ctx.cwd, { activateWork: true });
}
if (result?.autoCompleted) {
// The agent plan-review writer already made the terminal state
// durable. Converge the local UI now instead of waiting for an
// agent-end callback that may race an iframe refresh.
autoSteps = 0;
await restoreModel();
session?.clearWorking?.();
const { settings } = await gatherSession(ctx.cwd);
notifyUi(autoCompleteMessage(settings));
await refreshHub(ctx.cwd, { activateWork: true });
}
if (approved) {
void refreshHub(ctx.cwd, { activateWork: true });
try {
Expand Down
10 changes: 7 additions & 3 deletions lib/gather.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
import { isAbsolute, join, relative, resolve } from "node:path";
import { git } from "./git.mjs";
import { effectiveSettings, parseState } from "./settings.mjs";
import { effectiveSettings, parseState, SETTINGS_DEFS } from "./settings.mjs";
import { planStage, readiness, satisfiedSet } from "./status.mjs";
import {
backlogItems,
Expand Down Expand Up @@ -934,7 +934,9 @@ export function gatherUsage(startDir) {
const b = loadBundle(startDir);
const data = usageDataAt(join(b.memDir, "usage.md"));
const totals = data?.totals || { steps: {}, features: {}, featureModels: {} };
const prices = data?.prices || {};
// A non-null project catalog is authoritative, including an explicit empty
// table. Older active ledgers keep working only until Budget saves a catalog.
const prices = b.settings.usage_prices ?? data?.prices ?? {};
return {
step: "usage",
branch: b.branch,
Expand Down Expand Up @@ -1068,7 +1070,9 @@ export function gatherSettings(startDir) {
plan: b.plan?.fm.title || null,
// Effective values (defaults merged) — the view renders and edits these;
// `defined` says whether memory/settings.md exists yet.
settings: b.settings,
settings: Object.fromEntries(
Object.entries(b.settings).filter(([key]) => !SETTINGS_DEFS[key]?.hidden),
),
defined: b.settingsDefined,
state: b.state,
};
Expand Down
7 changes: 7 additions & 0 deletions lib/pi-tools.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,13 @@ export const AUTO_PHASE_FOR_STEP = {
"plan-review": "reviewing",
};

/** The shared terminal notification for both normal and immediate auto completion. */
export function autoCompleteMessage(settings) {
return settings?.auto_retire_prompt === "on"
? "auto mode: plan complete — every feature landed. Consider retiring the plan from the dashboard."
: "auto mode: plan complete — every feature landed.";
}

/** Preserve the active item when a ready wave is paused mid-turn. */
export function pauseFeatureWave(wave) {
if (!wave || !Array.isArray(wave.queue) || !Array.isArray(wave.results))
Expand Down
Loading
Loading