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 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), args-with-a-clause start instantly, a file path is
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
  }
@@ -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
- if (goalArgsNeedDrafting(raw)) {
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. Objectives without a 'Done when:' clause are grilled into a contract first (nothing activates until you confirm); include the clause to start instantly.",
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.15.1",
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",