agentskeptic 0.1.1 → 0.1.3

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.
Files changed (43) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +342 -342
  3. package/dist/cli.js +157 -157
  4. package/dist/debug-ui/app.css +188 -188
  5. package/dist/debug-ui/app.js +245 -245
  6. package/dist/debug-ui/index.html +79 -79
  7. package/dist/enforceCli.js +11 -11
  8. package/dist/planTransition.test.js +235 -235
  9. package/dist/planTransitionPathHarvest.test.js +116 -116
  10. package/dist/quickVerify/postgresCatalog.js +53 -53
  11. package/package.json +1 -1
  12. package/schemas/agent-run-record-v1.schema.json +51 -51
  13. package/schemas/agent-run-record-v2.schema.json +61 -61
  14. package/schemas/assurance-manifest-v1.schema.json +28 -28
  15. package/schemas/assurance-run-report-v1.schema.json +28 -28
  16. package/schemas/ci-lock-v1.schema.json +163 -163
  17. package/schemas/cli-error-envelope.schema.json +48 -48
  18. package/schemas/event.schema.json +111 -111
  19. package/schemas/execution-trace-view.schema.json +122 -122
  20. package/schemas/plan-validation-core.schema.json +95 -95
  21. package/schemas/quick-verify-report.schema.json +251 -251
  22. package/schemas/registry-validation-result.schema.json +99 -99
  23. package/schemas/run-comparison-report.schema.json +513 -513
  24. package/schemas/tools-registry-export.schema.json +9 -9
  25. package/schemas/tools-registry.schema.json +284 -284
  26. package/schemas/workflow-engine-result.schema.json +591 -591
  27. package/schemas/workflow-result-compare-input.schema.json +15 -15
  28. package/schemas/workflow-result-signature.schema.json +20 -20
  29. package/schemas/workflow-result-v9.schema.json +85 -85
  30. package/schemas/workflow-result.schema.json +80 -80
  31. package/schemas/workflow-truth-report.schema.json +761 -761
  32. package/dist/failureOriginSchemaEnum.test.d.ts +0 -2
  33. package/dist/failureOriginSchemaEnum.test.d.ts.map +0 -1
  34. package/dist/failureOriginSchemaEnum.test.js +0 -21
  35. package/dist/failureOriginSchemaEnum.test.js.map +0 -1
  36. package/dist/failureOriginSchemaParity.test.d.ts +0 -2
  37. package/dist/failureOriginSchemaParity.test.d.ts.map +0 -1
  38. package/dist/failureOriginSchemaParity.test.js +0 -33
  39. package/dist/failureOriginSchemaParity.test.js.map +0 -1
  40. package/dist/slice6.compare.ac.test.d.ts +0 -2
  41. package/dist/slice6.compare.ac.test.d.ts.map +0 -1
  42. package/dist/slice6.compare.ac.test.js +0 -81
  43. package/dist/slice6.compare.ac.test.js.map +0 -1
@@ -10,17 +10,17 @@ function writeCliError(code, message) {
10
10
  console.error(cliErrorEnvelope(code, message));
11
11
  }
12
12
  function usageEnforce() {
13
- return `Usage:
14
- agentskeptic enforce batch (--expect-lock <path> | --output-lock <path>) <same flags as batch verify>
15
- agentskeptic enforce quick (--expect-lock <path> | --output-lock <path>) <same flags as quick>
16
-
17
- Exactly one of --expect-lock or --output-lock is required.
18
-
19
- Exit codes (batch): same as batch verify for 0–2; 3 operational; 4 lock mismatch (--expect-lock only).
20
- Exit codes (quick): same as quick for 0–2; 3 operational; 4 lock mismatch (--expect-lock only).
21
-
22
- See docs/ci-enforcement.md and docs/agentskeptic.md.
23
-
13
+ return `Usage:
14
+ agentskeptic enforce batch (--expect-lock <path> | --output-lock <path>) <same flags as batch verify>
15
+ agentskeptic enforce quick (--expect-lock <path> | --output-lock <path>) <same flags as quick>
16
+
17
+ Exactly one of --expect-lock or --output-lock is required.
18
+
19
+ Exit codes (batch): same as batch verify for 0–2; 3 operational; 4 lock mismatch (--expect-lock only).
20
+ Exit codes (quick): same as quick for 0–2; 3 operational; 4 lock mismatch (--expect-lock only).
21
+
22
+ See docs/ci-enforcement.md and docs/agentskeptic.md.
23
+
24
24
  --help, -h print this message and exit 0`;
25
25
  }
26
26
  async function runEnforceBatch(restArgs) {
@@ -220,16 +220,16 @@ describe("planTransition", () => {
220
220
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
221
221
  execFileSync("git", ["-C", dir, "commit", "-m", "chg"], { windowsHide: true });
222
222
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
223
- const planBody = `---
224
- planValidation:
225
- schemaVersion: 1
226
- rules:
227
- - id: must_modify
228
- kind: matchingRowsMustHaveRowKinds
229
- pattern: "src/x.txt"
230
- rowKinds: [modify]
231
- ---
232
- # Plan
223
+ const planBody = `---
224
+ planValidation:
225
+ schemaVersion: 1
226
+ rules:
227
+ - id: must_modify
228
+ kind: matchingRowsMustHaveRowKinds
229
+ pattern: "src/x.txt"
230
+ rowKinds: [modify]
231
+ ---
232
+ # Plan
233
233
  `;
234
234
  const planPath = path.join(dir, "Plan.md");
235
235
  writeFileSync(planPath, planBody, "utf8");
@@ -277,16 +277,16 @@ planValidation:
277
277
  execFileSync("git", ["-C", dir, "mv", "old.txt", "new.txt"], { windowsHide: true });
278
278
  execFileSync("git", ["-C", dir, "commit", "-m", "mv"], { windowsHide: true });
279
279
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
280
- const planBody = `---
281
- planValidation:
282
- schemaVersion: 1
283
- rules:
284
- - id: renamed
285
- kind: requireRenameFromTo
286
- fromPattern: "old.txt"
287
- toPattern: "new.txt"
288
- includeCopy: false
289
- ---
280
+ const planBody = `---
281
+ planValidation:
282
+ schemaVersion: 1
283
+ rules:
284
+ - id: renamed
285
+ kind: requireRenameFromTo
286
+ fromPattern: "old.txt"
287
+ toPattern: "new.txt"
288
+ includeCopy: false
289
+ ---
290
290
  `;
291
291
  const planPath = path.join(dir, "Plan.md");
292
292
  writeFileSync(planPath, planBody, "utf8");
@@ -311,15 +311,15 @@ planValidation:
311
311
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
312
312
  execFileSync("git", ["-C", dir, "commit", "-m", "add"], { windowsHide: true });
313
313
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
314
- const planBody = `---
315
- planValidation:
316
- schemaVersion: 1
317
- rules:
318
- - id: y_must_be_modify
319
- kind: matchingRowsMustHaveRowKinds
320
- pattern: "y.txt"
321
- rowKinds: [modify]
322
- ---
314
+ const planBody = `---
315
+ planValidation:
316
+ schemaVersion: 1
317
+ rules:
318
+ - id: y_must_be_modify
319
+ kind: matchingRowsMustHaveRowKinds
320
+ pattern: "y.txt"
321
+ rowKinds: [modify]
322
+ ---
323
323
  `;
324
324
  const planPath = path.join(dir, "Plan.md");
325
325
  writeFileSync(planPath, planBody, "utf8");
@@ -345,19 +345,19 @@ planValidation:
345
345
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
346
346
  execFileSync("git", ["-C", dir, "commit", "-m", "chg"], { windowsHide: true });
347
347
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
348
- const planBody = `---
349
- name: Cursor plan
350
- overview: test
351
- ---
352
- ## Repository transition validation
353
- \`\`\`yaml
354
- schemaVersion: 1
355
- rules:
356
- - id: must_modify
357
- kind: matchingRowsMustHaveRowKinds
358
- pattern: "src/x.txt"
359
- rowKinds: [modify]
360
- \`\`\`
348
+ const planBody = `---
349
+ name: Cursor plan
350
+ overview: test
351
+ ---
352
+ ## Repository transition validation
353
+ \`\`\`yaml
354
+ schemaVersion: 1
355
+ rules:
356
+ - id: must_modify
357
+ kind: matchingRowsMustHaveRowKinds
358
+ pattern: "src/x.txt"
359
+ rowKinds: [modify]
360
+ \`\`\`
361
361
  `;
362
362
  const planPath = path.join(dir, "Plan.md");
363
363
  writeFileSync(planPath, planBody, "utf8");
@@ -385,24 +385,24 @@ rules:
385
385
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
386
386
  execFileSync("git", ["-C", dir, "commit", "-m", "chg"], { windowsHide: true });
387
387
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
388
- const planBody = `---
389
- planValidation:
390
- schemaVersion: 1
391
- rules:
392
- - id: must_modify
393
- kind: matchingRowsMustHaveRowKinds
394
- pattern: "src/x.txt"
395
- rowKinds: [modify]
396
- ---
397
- ## Repository transition validation
398
- ## Repository transition validation
399
- \`\`\`yaml
400
- schemaVersion: 1
401
- rules:
402
- - id: forbid_all
403
- kind: forbidMatchingRows
404
- pattern: "**/*"
405
- \`\`\`
388
+ const planBody = `---
389
+ planValidation:
390
+ schemaVersion: 1
391
+ rules:
392
+ - id: must_modify
393
+ kind: matchingRowsMustHaveRowKinds
394
+ pattern: "src/x.txt"
395
+ rowKinds: [modify]
396
+ ---
397
+ ## Repository transition validation
398
+ ## Repository transition validation
399
+ \`\`\`yaml
400
+ schemaVersion: 1
401
+ rules:
402
+ - id: forbid_all
403
+ kind: forbidMatchingRows
404
+ pattern: "**/*"
405
+ \`\`\`
406
406
  `;
407
407
  const planPath = path.join(dir, "Plan.md");
408
408
  writeFileSync(planPath, planBody, "utf8");
@@ -429,23 +429,23 @@ rules:
429
429
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
430
430
  execFileSync("git", ["-C", dir, "commit", "-m", "chg"], { windowsHide: true });
431
431
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
432
- const planBody = `---
433
- planValidation:
434
- schemaVersion: 1
435
- rules:
436
- - id: must_modify
437
- kind: matchingRowsMustHaveRowKinds
438
- pattern: "src/x.txt"
439
- rowKinds: [modify]
440
- ---
441
- ## Repository transition validation
442
- \`\`\`yaml
443
- schemaVersion: 1
444
- rules:
445
- - id: forbid_all
446
- kind: forbidMatchingRows
447
- pattern: "**/*"
448
- \`\`\`
432
+ const planBody = `---
433
+ planValidation:
434
+ schemaVersion: 1
435
+ rules:
436
+ - id: must_modify
437
+ kind: matchingRowsMustHaveRowKinds
438
+ pattern: "src/x.txt"
439
+ rowKinds: [modify]
440
+ ---
441
+ ## Repository transition validation
442
+ \`\`\`yaml
443
+ schemaVersion: 1
444
+ rules:
445
+ - id: forbid_all
446
+ kind: forbidMatchingRows
447
+ pattern: "**/*"
448
+ \`\`\`
449
449
  `;
450
450
  const planPath = path.join(dir, "Plan.md");
451
451
  writeFileSync(planPath, planBody, "utf8");
@@ -471,17 +471,17 @@ rules:
471
471
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
472
472
  execFileSync("git", ["-C", dir, "commit", "-m", "chg"], { windowsHide: true });
473
473
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
474
- const planBody = `---
475
- name: Plan
476
- overview: x
477
- isProject: false
478
- ---
479
-
480
- # Work
481
-
482
- ## Implementation
483
-
484
- Change \`src/tracked.ts\`.
474
+ const planBody = `---
475
+ name: Plan
476
+ overview: x
477
+ isProject: false
478
+ ---
479
+
480
+ # Work
481
+
482
+ ## Implementation
483
+
484
+ Change \`src/tracked.ts\`.
485
485
  `;
486
486
  const planPath = path.join(dir, "Plan.md");
487
487
  writeFileSync(planPath, planBody, "utf8");
@@ -510,17 +510,17 @@ Change \`src/tracked.ts\`.
510
510
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
511
511
  execFileSync("git", ["-C", dir, "commit", "-m", "chg"], { windowsHide: true });
512
512
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
513
- const planBody = `---
514
- name: Plan
515
- overview: x
516
- isProject: false
517
- ---
518
-
519
- # Work
520
-
521
- ## Implementation
522
-
523
- Change \`src/tracked.ts\`.
513
+ const planBody = `---
514
+ name: Plan
515
+ overview: x
516
+ isProject: false
517
+ ---
518
+
519
+ # Work
520
+
521
+ ## Implementation
522
+
523
+ Change \`src/tracked.ts\`.
524
524
  `;
525
525
  const planPath = path.join(dir, "Plan.md");
526
526
  writeFileSync(planPath, planBody, "utf8");
@@ -548,17 +548,17 @@ Change \`src/tracked.ts\`.
548
548
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
549
549
  execFileSync("git", ["-C", dir, "commit", "-m", "add uncited only"], { windowsHide: true });
550
550
  const after = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
551
- const planBody = `---
552
- name: Plan
553
- overview: x
554
- isProject: false
555
- ---
556
-
557
- # Work
558
-
559
- ## Implementation
560
-
561
- Change \`src/tracked.ts\`.
551
+ const planBody = `---
552
+ name: Plan
553
+ overview: x
554
+ isProject: false
555
+ ---
556
+
557
+ # Work
558
+
559
+ ## Implementation
560
+
561
+ Change \`src/tracked.ts\`.
562
562
  `;
563
563
  const planPath = path.join(dir, "Plan.md");
564
564
  writeFileSync(planPath, planBody, "utf8");
@@ -577,14 +577,14 @@ Change \`src/tracked.ts\`.
577
577
  });
578
578
  describe("loadPlanTransitionRules", () => {
579
579
  it("Cursor-like front matter without planValidation and no citations yields INSUFFICIENT_SPEC", () => {
580
- const md = `---
581
- name: Example plan
582
- overview: x
583
- todos: []
584
- isProject: false
585
- ---
586
-
587
- # Body
580
+ const md = `---
581
+ name: Example plan
582
+ overview: x
583
+ todos: []
584
+ isProject: false
585
+ ---
586
+
587
+ # Body
588
588
  `;
589
589
  try {
590
590
  loadPlanTransitionRules(md);
@@ -596,17 +596,17 @@ isProject: false
596
596
  }
597
597
  });
598
598
  it("derived_citations: zero Repository transition heading and one backtick path yields requireMatchingRow rules", () => {
599
- const md = `---
600
- name: Example plan
601
- overview: x
602
- isProject: false
603
- ---
604
-
605
- # Body
606
-
607
- ## Implementation
608
-
609
- Change \`src/only.ts\`.
599
+ const md = `---
600
+ name: Example plan
601
+ overview: x
602
+ isProject: false
603
+ ---
604
+
605
+ # Body
606
+
607
+ ## Implementation
608
+
609
+ Change \`src/only.ts\`.
610
610
  `;
611
611
  const { rules, source } = loadPlanTransitionRules(md);
612
612
  expect(source).toBe("derived_citations");
@@ -620,17 +620,17 @@ Change \`src/only.ts\`.
620
620
  ]);
621
621
  });
622
622
  it("derived_citations: two backtick paths yield two requireMatchingRow rules in path sort order", () => {
623
- const md = `---
624
- name: Example plan
625
- overview: x
626
- isProject: false
627
- ---
628
-
629
- # Body
630
-
631
- ## Implementation
632
-
633
- Touch \`src/a.ts\` and \`src/b.ts\`.
623
+ const md = `---
624
+ name: Example plan
625
+ overview: x
626
+ isProject: false
627
+ ---
628
+
629
+ # Body
630
+
631
+ ## Implementation
632
+
633
+ Touch \`src/a.ts\` and \`src/b.ts\`.
634
634
  `;
635
635
  const { rules, source } = loadPlanTransitionRules(md);
636
636
  expect(source).toBe("derived_citations");
@@ -649,13 +649,13 @@ Touch \`src/a.ts\` and \`src/b.ts\`.
649
649
  });
650
650
  });
651
651
  it("duplicate Repository transition validation headings yield AMBIGUOUS_BODY_RULES", () => {
652
- const md = `---
653
- name: x
654
- ---
655
- ## Repository transition validation
656
- x
657
- ## Repository transition validation
658
- y
652
+ const md = `---
653
+ name: x
654
+ ---
655
+ ## Repository transition validation
656
+ x
657
+ ## Repository transition validation
658
+ y
659
659
  `;
660
660
  try {
661
661
  loadPlanTransitionRules(md);
@@ -667,13 +667,13 @@ y
667
667
  }
668
668
  });
669
669
  it("first fence not yaml yields INSUFFICIENT_SPEC", () => {
670
- const md = `---
671
- name: x
672
- ---
673
- ## Repository transition validation
674
- \`\`\`json
675
- {}
676
- \`\`\`
670
+ const md = `---
671
+ name: x
672
+ ---
673
+ ## Repository transition validation
674
+ \`\`\`json
675
+ {}
676
+ \`\`\`
677
677
  `;
678
678
  try {
679
679
  loadPlanTransitionRules(md);
@@ -685,18 +685,18 @@ name: x
685
685
  }
686
686
  });
687
687
  it("two yaml fences in section yield AMBIGUOUS_BODY_RULES", () => {
688
- const md = `---
689
- name: x
690
- ---
691
- ## Repository transition validation
692
- \`\`\`yaml
693
- schemaVersion: 1
694
- rules: []
695
- \`\`\`
696
- \`\`\`yaml
697
- schemaVersion: 1
698
- rules: []
699
- \`\`\`
688
+ const md = `---
689
+ name: x
690
+ ---
691
+ ## Repository transition validation
692
+ \`\`\`yaml
693
+ schemaVersion: 1
694
+ rules: []
695
+ \`\`\`
696
+ \`\`\`yaml
697
+ schemaVersion: 1
698
+ rules: []
699
+ \`\`\`
700
700
  `;
701
701
  try {
702
702
  loadPlanTransitionRules(md);
@@ -708,14 +708,14 @@ rules: []
708
708
  }
709
709
  });
710
710
  it("invalid yaml in body fence yields PLAN_VALIDATION_YAML_INVALID with body prefix", () => {
711
- const md = `---
712
- name: x
713
- ---
714
- ## Repository transition validation
715
- \`\`\`yaml
716
- schemaVersion: 1
717
- rules: [oops not closed
718
- \`\`\`
711
+ const md = `---
712
+ name: x
713
+ ---
714
+ ## Repository transition validation
715
+ \`\`\`yaml
716
+ schemaVersion: 1
717
+ rules: [oops not closed
718
+ \`\`\`
719
719
  `;
720
720
  try {
721
721
  loadPlanTransitionRules(md);
@@ -728,18 +728,18 @@ rules: [oops not closed
728
728
  }
729
729
  });
730
730
  it("body yaml valid but schema invalid yields SCHEMA_INVALID with body prefix", () => {
731
- const md = `---
732
- name: x
733
- ---
734
- ## Repository transition validation
735
- \`\`\`yaml
736
- schemaVersion: 1
737
- rules:
738
- - id: x
739
- kind: requireRenameFromTo
740
- fromPattern: a
741
- toPattern: b
742
- \`\`\`
731
+ const md = `---
732
+ name: x
733
+ ---
734
+ ## Repository transition validation
735
+ \`\`\`yaml
736
+ schemaVersion: 1
737
+ rules:
738
+ - id: x
739
+ kind: requireRenameFromTo
740
+ fromPattern: a
741
+ toPattern: b
742
+ \`\`\`
743
743
  `;
744
744
  try {
745
745
  loadPlanTransitionRules(md);
@@ -752,18 +752,18 @@ rules:
752
752
  }
753
753
  });
754
754
  it("planValidation in front matter wins over body path citations", () => {
755
- const md = `---
756
- planValidation:
757
- schemaVersion: 1
758
- rules:
759
- - id: fm_rule
760
- kind: forbidMatchingRows
761
- pattern: "nope.txt"
762
- ---
763
-
764
- ## Implementation
765
-
766
- Also \`src/ignored.ts\` in prose.
755
+ const md = `---
756
+ planValidation:
757
+ schemaVersion: 1
758
+ rules:
759
+ - id: fm_rule
760
+ kind: forbidMatchingRows
761
+ pattern: "nope.txt"
762
+ ---
763
+
764
+ ## Implementation
765
+
766
+ Also \`src/ignored.ts\` in prose.
767
767
  `;
768
768
  const { rules, source } = loadPlanTransitionRules(md);
769
769
  expect(source).toBe("front_matter");
@@ -786,14 +786,14 @@ describe("plan-transition CLI", () => {
786
786
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
787
787
  execFileSync("git", ["-C", dir, "commit", "-m", "b"], { windowsHide: true });
788
788
  const a = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
789
- const plan = `---
790
- planValidation:
791
- schemaVersion: 1
792
- rules:
793
- - id: r1
794
- kind: forbidMatchingRows
795
- pattern: "nonexistent.zzz"
796
- ---
789
+ const plan = `---
790
+ planValidation:
791
+ schemaVersion: 1
792
+ rules:
793
+ - id: r1
794
+ kind: forbidMatchingRows
795
+ pattern: "nonexistent.zzz"
796
+ ---
797
797
  `;
798
798
  const planPath = path.join(dir, "Plan.md");
799
799
  writeFileSync(planPath, plan, "utf8");
@@ -815,14 +815,14 @@ planValidation:
815
815
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
816
816
  execFileSync("git", ["-C", dir, "commit", "-m", "b"], { windowsHide: true });
817
817
  const a = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
818
- const plan = `---
819
- planValidation:
820
- schemaVersion: 1
821
- rules:
822
- - id: noop
823
- kind: forbidMatchingRows
824
- pattern: "__no_such_path_plan_bundle__.txt"
825
- ---
818
+ const plan = `---
819
+ planValidation:
820
+ schemaVersion: 1
821
+ rules:
822
+ - id: noop
823
+ kind: forbidMatchingRows
824
+ pattern: "__no_such_path_plan_bundle__.txt"
825
+ ---
826
826
  `;
827
827
  const planPath = path.join(dir, "Plan.md");
828
828
  writeFileSync(planPath, plan, "utf8");
@@ -865,17 +865,17 @@ planValidation:
865
865
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
866
866
  execFileSync("git", ["-C", dir, "commit", "-m", "b"], { windowsHide: true });
867
867
  const a = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
868
- const plan = `---
869
- name: p
870
- ---
871
- ## Repository transition validation
872
- \`\`\`yaml
873
- schemaVersion: 1
874
- rules:
875
- - id: noop
876
- kind: forbidMatchingRows
877
- pattern: "__no_such_path_plan_bundle_body__.txt"
878
- \`\`\`
868
+ const plan = `---
869
+ name: p
870
+ ---
871
+ ## Repository transition validation
872
+ \`\`\`yaml
873
+ schemaVersion: 1
874
+ rules:
875
+ - id: noop
876
+ kind: forbidMatchingRows
877
+ pattern: "__no_such_path_plan_bundle_body__.txt"
878
+ \`\`\`
879
879
  `;
880
880
  const planPath = path.join(dir, "Plan.md");
881
881
  writeFileSync(planPath, plan, "utf8");
@@ -914,16 +914,16 @@ rules:
914
914
  execFileSync("git", ["-C", dir, "add", "."], { windowsHide: true });
915
915
  execFileSync("git", ["-C", dir, "commit", "-m", "b"], { windowsHide: true });
916
916
  const a = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8", windowsHide: true }).trim();
917
- const plan = `---
918
- name: p
919
- overview: x
920
- ---
921
-
922
- # x
923
-
924
- ## Implementation
925
-
926
- Change \`src/t.ts\`.
917
+ const plan = `---
918
+ name: p
919
+ overview: x
920
+ ---
921
+
922
+ # x
923
+
924
+ ## Implementation
925
+
926
+ Change \`src/t.ts\`.
927
927
  `;
928
928
  const planPath = path.join(dir, "Plan.md");
929
929
  writeFileSync(planPath, plan, "utf8");