feat(ui): ralpi-style chat progress and pipeline-overview footer

phases.ts becomes a live chat widget (spinner + tool-call tree) and the
check-runner posts per-agent tool-call summaries and an expandable
completion tree through a custom message renderer; footer.ts adds the
static pipeline-overview status strip for single checks and /pygienium-all.
This commit is contained in:
2026-08-09 16:45:29 -04:00
parent d0e8ad5571
commit 5f8a5cbe5f
10 changed files with 1165 additions and 55 deletions

View File

@@ -9,10 +9,7 @@
* @module pygienium/commands
*/
import type {
ExtensionCommandContext,
ExtensionUIContext,
} from "@earendil-works/pi-coding-agent";
import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
import { resolve } from "node:path";
import {
getAllChecks,
@@ -20,6 +17,9 @@ import {
type CheckDefinition,
} from "./checks/registry.js";
import { runCheck, parseCheckArgs } from "./modes/check-runner.js";
import {
runCheck,
parseCheckArgs,
import { parseAllArgs, runAllChecks, allSummaryPath } from "./modes/all.js";
import { buildPygieniumHelpLines } from "./help.js";
import {
@@ -38,12 +38,16 @@ import {
exportBundlePath,
type ExportFilters,
} from "./export.js";
import type { SendChatMessage } from "./phases.js";
/** Narrow context slice handlers need (a subset of `ExtensionCommandContext`). */
export type PygieniumCtx = Pick<
ExtensionCommandContext,
"cwd" | "mode" | "hasUI" | "ui"
>;
> & {
/** Optional callback to post messages to the chat window. */
sendChatMessage?: SendChatMessage;
};
function print(ctx: PygieniumCtx, line: string): void {
// In TUI mode, also surface the first line as a notification.
@@ -162,6 +166,7 @@ export async function handleAllCommand(
only: parsed.only,
ui: ctx.ui,
hasUI: ctx.hasUI,
sendChatMessage: ctx.sendChatMessage,
});
const giNote = outcome.gitignoreAppended
? " · .pygienium/ added to .gitignore"
@@ -341,6 +346,3 @@ export function registerPygieniumCommands(register: RegisterCommandFn): void {
handler: handleExportCommand,
});
}
/** Re-export for index.ts convenience. */
export type { ExtensionUIContext };