clean: remove framework files, calvana project only
This commit is contained in:
@@ -1,84 +0,0 @@
|
||||
/**
|
||||
* Purpose Gate — Forces the engineer to declare intent before working
|
||||
*
|
||||
* On session start, immediately asks "What is the purpose of this agent?"
|
||||
* via a text input dialog. A persistent widget shows the purpose for the
|
||||
* rest of the session, keeping focus. Blocks all prompts until answered.
|
||||
*
|
||||
* Usage: pi -e extensions/purpose-gate.ts
|
||||
*/
|
||||
|
||||
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
||||
import { Text, truncateToWidth } from "@mariozechner/pi-tui";
|
||||
import { applyExtensionDefaults } from "./themeMap.ts";
|
||||
|
||||
// synthwave: bgWarm #4a1e6a → rgb(74,30,106)
|
||||
function bg(s: string): string {
|
||||
return `\x1b[48;2;74;30;106m${s}\x1b[49m`;
|
||||
}
|
||||
|
||||
// synthwave: pink #ff7edb
|
||||
function pink(s: string): string {
|
||||
return `\x1b[38;2;255;126;219m${s}\x1b[39m`;
|
||||
}
|
||||
|
||||
// synthwave: cyan #36f9f6
|
||||
function cyan(s: string): string {
|
||||
return `\x1b[38;2;54;249;246m${s}\x1b[39m`;
|
||||
}
|
||||
|
||||
function bold(s: string): string {
|
||||
return `\x1b[1m${s}\x1b[22m`;
|
||||
}
|
||||
|
||||
export default function (pi: ExtensionAPI) {
|
||||
let purpose: string | undefined;
|
||||
|
||||
async function askForPurpose(ctx: any) {
|
||||
while (!purpose) {
|
||||
const answer = await ctx.ui.input(
|
||||
"What is the purpose of this agent?",
|
||||
"e.g. Refactor the auth module to use JWT"
|
||||
);
|
||||
|
||||
if (answer && answer.trim()) {
|
||||
purpose = answer.trim();
|
||||
} else {
|
||||
ctx.ui.notify("Purpose is required.", "warning");
|
||||
}
|
||||
}
|
||||
|
||||
ctx.ui.setWidget("purpose", () => {
|
||||
return {
|
||||
render(width: number): string[] {
|
||||
const pad = bg(" ".repeat(width));
|
||||
const label = pink(bold(" PURPOSE: "));
|
||||
const msg = cyan(bold(purpose!));
|
||||
const content = bg(truncateToWidth(label + msg + " ".repeat(width), width, ""));
|
||||
return [pad, content, pad];
|
||||
},
|
||||
invalidate() {},
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
pi.on("session_start", async (_event, ctx) => {
|
||||
applyExtensionDefaults(import.meta.url, ctx);
|
||||
void askForPurpose(ctx);
|
||||
});
|
||||
|
||||
pi.on("before_agent_start", async (event) => {
|
||||
if (!purpose) return;
|
||||
return {
|
||||
systemPrompt: event.systemPrompt + `\n\n<purpose>\nYour singular purpose this session: ${purpose}\nStay focused on this goal. If a request drifts from this purpose, gently remind the user.\n</purpose>`,
|
||||
};
|
||||
});
|
||||
|
||||
pi.on("input", async (_event, ctx) => {
|
||||
if (!purpose) {
|
||||
ctx.ui.notify("Set a purpose first.", "warning");
|
||||
return { action: "handled" as const };
|
||||
}
|
||||
return { action: "continue" as const };
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user