pi-goal-list-loop-audit 0.15.1 → 0.16.0
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/README.md +4 -1
- package/extensions/goal-loop-core.ts +3 -3
- package/extensions/loops/goal.ts +15 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -33,6 +33,7 @@ Four top-level commands, that's all:
|
|
|
33
33
|
/goal # drafting: agent grills, you Confirm
|
|
34
34
|
/goal "audit the repo" # no contract clause → agent grills you first (propose is gated on it)
|
|
35
35
|
/goal "Step 1. Step 2. Done when: tests pass." # has contract → starts now
|
|
36
|
+
/goal start "fix the flaky login test" # explicit skip-draft: starts now, no interview (auditor infers the contract)
|
|
36
37
|
/goal status # show state
|
|
37
38
|
/goal pause # pause
|
|
38
39
|
/goal resume # resume
|
|
@@ -69,7 +70,9 @@ your objectives can start with any verb.)
|
|
|
69
70
|
|
|
70
71
|
Drafting rules: **no-args drafts, args-without-a-`Done when:`-clause get
|
|
71
72
|
grilled by the agent (proposing is mechanically blocked until you have
|
|
72
|
-
replied at least once
|
|
73
|
+
replied at least once — typed chat or an answered `ask_user_question` dialog
|
|
74
|
+
both count), args-with-a-clause start instantly, `/goal start` skips the
|
|
75
|
+
interview by explicit command, a file path is
|
|
73
76
|
bulk direct.** A
|
|
74
77
|
sisyphus-style plan file (checklists, bullets, numbered, plain lines) imports
|
|
75
78
|
as-is — headings become nothing, items become goals. And the drafter itself
|
|
@@ -158,10 +158,10 @@ export interface Goal {
|
|
|
158
158
|
export type GoalRoute =
|
|
159
159
|
| { kind: "draft" }
|
|
160
160
|
| { kind: "set"; text: string }
|
|
161
|
-
| { kind: "sub"; name: "status" | "pause" | "resume" | "cancel" | "tweak" | "archive"; rest: string };
|
|
161
|
+
| { kind: "sub"; name: "status" | "pause" | "resume" | "cancel" | "tweak" | "archive" | "start"; rest: string };
|
|
162
162
|
|
|
163
163
|
const GOAL_EXACT_SUBS = new Set(["status", "pause", "resume", "cancel"]);
|
|
164
|
-
const GOAL_ARG_SUBS = new Set(["tweak", "archive"]);
|
|
164
|
+
const GOAL_ARG_SUBS = new Set(["tweak", "archive", "start"]);
|
|
165
165
|
|
|
166
166
|
export function routeGoalArgs(raw: string): GoalRoute {
|
|
167
167
|
const trimmed = raw.trim();
|
|
@@ -173,7 +173,7 @@ export function routeGoalArgs(raw: string): GoalRoute {
|
|
|
173
173
|
return { kind: "sub", name: first as "status" | "pause" | "resume" | "cancel", rest: "" };
|
|
174
174
|
}
|
|
175
175
|
if (GOAL_ARG_SUBS.has(first)) {
|
|
176
|
-
return { kind: "sub", name: first as "tweak" | "archive", rest };
|
|
176
|
+
return { kind: "sub", name: first as "tweak" | "archive" | "start", rest };
|
|
177
177
|
}
|
|
178
178
|
return { kind: "set", text: trimmed };
|
|
179
179
|
}
|
package/extensions/loops/goal.ts
CHANGED
|
@@ -434,7 +434,7 @@ async function startDrafting(ctx: ExtensionContext, target: "goal" | "list" | "l
|
|
|
434
434
|
const [file, label, tool] = prompts[target]!;
|
|
435
435
|
ctx.ui.notify(
|
|
436
436
|
seed
|
|
437
|
-
? `${label}: the objective has no "Done when:" clause — the agent will grill you about it first (nothing activates until you confirm)
|
|
437
|
+
? `${label}: the objective has no "Done when:" clause — the agent will grill you about it first (nothing activates until you confirm). Skip the interview entirely: /goal start <objective>.`
|
|
438
438
|
: `${label} started. The agent will grill until the contract is concrete, then ${tool} opens a Confirm dialog. No work begins before confirmation.`,
|
|
439
439
|
"info",
|
|
440
440
|
);
|
|
@@ -481,6 +481,16 @@ async function cmdGoal(args: string, ctx: ExtensionContext): Promise<void> {
|
|
|
481
481
|
if (route.name === "cancel") return cmdCancel(ctx);
|
|
482
482
|
if (route.name === "tweak") return cmdTweak(route.rest, ctx);
|
|
483
483
|
if (route.name === "archive") return cmdGoals(ctx);
|
|
484
|
+
// v0.16.0: /goal start <objective> — explicit skip-draft. Activates
|
|
485
|
+
// immediately, no interview, no "Done when:" heuristic. Symmetric
|
|
486
|
+
// with /loop start. The auditor infers the contract from the objective.
|
|
487
|
+
if (route.name === "start") {
|
|
488
|
+
if (!route.rest) {
|
|
489
|
+
ctx.ui.notify("Usage: /goal start <objective> — activates immediately, skipping the drafting interview. (Without start, an objective needs a 'Done when:' clause or it gets drafted first.)", "warning");
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
return cmdSet(route.rest, ctx, true);
|
|
493
|
+
}
|
|
484
494
|
}
|
|
485
495
|
return cmdSet(route.kind === "set" ? route.text : "", ctx);
|
|
486
496
|
}
|
|
@@ -489,7 +499,7 @@ async function cmdGoal(args: string, ctx: ExtensionContext): Promise<void> {
|
|
|
489
499
|
// /goal: bypass drafting, start now (the only entry in v0.1.0)
|
|
490
500
|
// =================================================================
|
|
491
501
|
|
|
492
|
-
async function cmdSet(args: string, ctx: ExtensionContext): Promise<void> {
|
|
502
|
+
async function cmdSet(args: string, ctx: ExtensionContext, skipDraft = false): Promise<void> {
|
|
493
503
|
let raw = args.trim();
|
|
494
504
|
// Users naturally quote the objective ("/goal \"do X\""); strip one layer of
|
|
495
505
|
// surrounding matching quotes so they don't leak into the goal text.
|
|
@@ -507,7 +517,8 @@ async function cmdSet(args: string, ctx: ExtensionContext): Promise<void> {
|
|
|
507
517
|
// v0.11.0: a contract-less objective gets drafted, not activated raw —
|
|
508
518
|
// the pi-goal-x lesson: arg + Enter is worse than a 5-minute draft.
|
|
509
519
|
// Include an explicit "Done when: …" clause to activate instantly.
|
|
510
|
-
|
|
520
|
+
// v0.16.0: /goal start bypasses this by explicit user command.
|
|
521
|
+
if (!skipDraft && goalArgsNeedDrafting(raw)) {
|
|
511
522
|
await startDrafting(ctx, "goal", raw);
|
|
512
523
|
return;
|
|
513
524
|
}
|
|
@@ -2149,7 +2160,7 @@ export default function (pi: ExtensionAPI): void {
|
|
|
2149
2160
|
// /loop — the metric loop (draft|start|status|stop)
|
|
2150
2161
|
// /gla — the settings UI (+ scriptable key=value)
|
|
2151
2162
|
pi.registerCommand("goal", {
|
|
2152
|
-
description: "Set/draft a goal, or /goal status|pause|resume|cancel|tweak <text>|archive
|
|
2163
|
+
description: "Set/draft a goal, or /goal status|pause|resume|cancel|tweak <text>|archive|start <objective>. Objectives without a 'Done when:' clause are grilled into a contract first; include the clause or use /goal start to skip the interview and activate instantly.",
|
|
2153
2164
|
handler: (args: string, ctx: ExtensionContext) => { rememberCtx(ctx); return cmdGoal(args, ctx); },
|
|
2154
2165
|
});
|
|
2155
2166
|
const settingsHandler = (args: string, ctx: ExtensionContext) => { rememberCtx(ctx); return cmdSettings(args, ctx); };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-goal-list-loop-audit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Goal. Loop. Audit. Done. — a pi-coding-agent extension that supervises long-running work, with isolated auditor on each completion. Beat bamboozling by design: the auditor runs in a fresh session with no extensions, no skills, no editor — only the read tools needed to verify your goal.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "dracon",
|