@jwilger/pi-development-system 0.26.0 → 0.27.1

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.26.0",
3
+ "version": "0.27.1",
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"
@@ -22,7 +22,8 @@ Review is a soft gate (`review.unsatisfied`): skipping it needs a recorded depar
22
22
  round in one call). A packet is recorded once, in the round its header names;
23
23
  if the diff changed since the start, the round is refused: start again.
24
24
  4. Read the reply: `review: N/R clean` and `next:`.
25
- - `fix-findings`: fix every blocking and should-fix finding, then start a new round.
25
+ - `fix-findings`: fix every blocking and should-fix finding, then start a new round
26
+ (starting again on an unchanged diff is refused).
26
27
  - `review`: the streak is short (or the diff changed with findings); start another round.
27
28
  - `stale-diff`: the diff changed after a satisfied review; one more round.
28
29
  - `done`: commit.
@@ -60,7 +61,9 @@ commit keeps the clean rounds already earned unless findings come back.
60
61
  ## Rules of thumb
61
62
 
62
63
  - Fix the findings before the next round. Do not argue a finding away; if it is
63
- wrong, the reviewer marks it a false positive with evidence (Jev can only suggest).
64
+ wrong, record a `review.unsatisfied` departure with the evidence
65
+ (`devsys_record_departure`). Starting a round again on an unchanged diff after
66
+ findings is refused, so a finding is cleared by a fix, never by a re-roll.
64
67
  - Do not widen a review into an audit of the tree. The reviewer reads the diff and
65
68
  what it depends on.
66
69
  - Never edit the packet to make it pass.
@@ -70,7 +70,8 @@ export function splitDiffByFile(diff: string): Record<string, string> {
70
70
  const flush = () => {
71
71
  if (path !== undefined) out[path] = lines.join("\n");
72
72
  };
73
- for (const line of diff.split("\n")) {
73
+ // git ends its output with a newline: drop it so the last section digests like any other.
74
+ for (const line of diff.replace(/\n$/, "").split("\n")) {
74
75
  // Git quotes unusual paths ("b/na\303\257ve.md"); strip the quotes rather than lose the section.
75
76
  const header = /^diff --git "?a\/.*?"? "?b\/(.*?)"?$/.exec(line);
76
77
  if (header !== null) {
@@ -156,7 +157,7 @@ export function reviewerTask(input: {
156
157
  const lenses = input.lenses.join(", ");
157
158
  return [
158
159
  `Review slice ${input.slice}, round ${input.round}, through these lenses: ${lenses}.`,
159
- `See the change with \`git diff ${input.diffRange}\` (and \`git diff --stat ${input.diffRange}\`), plus any untracked files listed by \`git status --short\` (git diff does not show them; read them directly). Read the callers, callees and tests it depends on, no more.`,
160
+ `See the change with \`git diff ${input.diffRange}\` (and \`git diff --stat ${input.diffRange}\`), plus any untracked files listed by \`git ls-files --others --exclude-standard\` (git diff does not show them; read them directly). Read the callers, callees and tests it depends on, no more.`,
160
161
  "Do not modify files; report demonstrable defects with a realistic trigger and the smallest local repair.",
161
162
  "Return exactly the review packet from your instructions, with exactly this header (slice and round must not change):",
162
163
  "",
@@ -46,6 +46,8 @@ export async function snapshotDiff(
46
46
  // can hide an edit whose converted text is unchanged.
47
47
  "--submodule=short",
48
48
  "--no-textconv",
49
+ // diff.ignoreSubmodules=all would hide a bump that `git add` still stages.
50
+ "--ignore-submodules=dirty",
49
51
  ];
50
52
  const [diff, stat, others] = await Promise.all([
51
53
  exec("git", [...plain, "--full-index", "--no-renames", range], { cwd, timeout: 15_000 }),