@jwilger/pi-development-system 0.67.0 → 0.69.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jwilger/pi-development-system",
3
- "version": "0.67.0",
3
+ "version": "0.69.0",
4
4
  "description": "A pi extension package representing a seasoned approach to software development using a full AI SDLC.",
5
5
  "keywords": [
6
6
  "pi-package"
@@ -8,5 +8,5 @@ Write the plan for the current work with the work-intake-and-slicing skill.
8
8
  2. Write `docs/plan/<slug>.md` with these sections: Goal and why; Constraints (what must not change); Increments, each shippable on its own and small enough to release, each with an **Acceptance** list (observable checks that say the increment is done) and a final Release step (commit, push, CI green, publish, update) followed by a STOP for the user; for every task a task record whose header is `## <id> — <title>` and whose sections are written exactly as `**Goal:**`, `**Files:**`, `**Interfaces:**`, `**First failing test:**`, `**Steps:**`, `**Run:**`, `**Expected:**`, `**Out of scope:**` (label and colon inside the bold, one section per label); a Progress checklist with one box per increment.
9
9
  3. Write each task so that someone who sees only that task could finish it. Never write `TBD`.
10
10
  4. Run `devsys_task_check` on every task record you wrote and fix each one until it says ready. Split any that come back too-big.
11
- 5. If a `create_goal` tool exists in this session, call it with the objective "complete docs/plan/<slug>.md honouring its Constraints and Progress checklist, one increment at a time, stopping after each increment's Release step". Otherwise tell the user the plan path so they can start a goal on it. Do not depend on any goal tool's file format.
12
- 6. Stop and ask the user to review the plan before any implementation starts.
11
+ 5. Stop and ask the user to review the plan before any implementation starts. Do not start a goal yet: a goal tool may continue on its own and begin implementing before the review.
12
+ 6. Only after the user approves the plan: if a `create_goal` tool exists in this session, call it with the objective "complete docs/plan/<slug>.md honouring its Constraints and Progress checklist, one increment at a time, stopping after each increment's Release step". Otherwise tell the user the plan path so they can start a goal on it. Do not depend on any goal tool's file format.
@@ -54,4 +54,4 @@ Use `devsys_work_item` for the backlog. It reads `[tracker] kind` from `.develop
54
54
 
55
55
  ## Handing off
56
56
 
57
- `/devsys-plan <slug>` writes `docs/plan/<slug>.md` in this structure and, when a goal tool is available, starts a goal to complete it. Review the plan with the user before any implementation.
57
+ `/devsys-plan <slug>` writes `docs/plan/<slug>.md` in this structure and checks every task record. Then it stops for the user to review the plan. Only after they approve does it start a goal to complete the plan, when a goal tool is available: a goal can begin implementing on its own, so it must not exist before the review.
@@ -29,6 +29,15 @@ const insideRepo = (cwd: string, target: string): boolean => {
29
29
  return rel !== "" && !rel.startsWith("..") && !isAbsolute(rel);
30
30
  };
31
31
 
32
+ /** Jev's aspect keys, named as the record's own sections so the author knows what to edit. */
33
+ const SECTION_OF: Readonly<Record<string, string>> = {
34
+ goal: "Goal",
35
+ interfaces: "Interfaces",
36
+ firstFailingTest: "First failing test",
37
+ steps: "Steps",
38
+ check: "Run and Expected",
39
+ };
40
+
32
41
  /** `devsys_task_check`: structural readiness is deterministic; Jev adds "specific enough" and "one task". */
33
42
  export function createTaskCheckTool(deps: {
34
43
  jev: (ctx: ExtensionContext) => Jev;
@@ -72,7 +81,8 @@ export function createTaskCheckTool(deps: {
72
81
  `${record.id}: too-big. Split it into task records that each need one failing test, then check each.`,
73
82
  );
74
83
  }
75
- return reply(`${record.id}: needs-detail. Make these more specific: ${missing.join(", ")}.`);
84
+ const named = missing.map((m) => SECTION_OF[m] ?? m).join(", ");
85
+ return reply(`${record.id}: needs-detail. Make these more specific: ${named}.`);
76
86
  },
77
87
  };
78
88
  }
@@ -176,7 +176,7 @@ function problemsOf(markdown: string, split: Sections): string[] {
176
176
  }
177
177
  const missing = SECTIONS.filter((s) => got(sections, s) === "");
178
178
  if (missing.length > 0) problems.push(`missing section: ${missing.join(", ")}`);
179
- if (/\bTBD\b/.test(markdown)) problems.push("contains TBD; decide it or split the task");
179
+ if (/\bTBD\b/i.test(markdown)) problems.push("contains TBD; decide it or split the task");
180
180
  const steps = stepsOf(get(sections, "Steps"));
181
181
  if (!missing.includes("Steps") && (steps.length < STEPS_MIN || steps.length > STEPS_MAX)) {
182
182
  problems.push(`Steps must be ${STEPS_MIN}-${STEPS_MAX} steps, found ${steps.length}`);