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.
- package/LICENSE +21 -21
- package/README.md +342 -342
- package/dist/cli.js +157 -157
- package/dist/debug-ui/app.css +188 -188
- package/dist/debug-ui/app.js +245 -245
- package/dist/debug-ui/index.html +79 -79
- package/dist/enforceCli.js +11 -11
- package/dist/planTransition.test.js +235 -235
- package/dist/planTransitionPathHarvest.test.js +116 -116
- package/dist/quickVerify/postgresCatalog.js +53 -53
- package/package.json +1 -1
- package/schemas/agent-run-record-v1.schema.json +51 -51
- package/schemas/agent-run-record-v2.schema.json +61 -61
- package/schemas/assurance-manifest-v1.schema.json +28 -28
- package/schemas/assurance-run-report-v1.schema.json +28 -28
- package/schemas/ci-lock-v1.schema.json +163 -163
- package/schemas/cli-error-envelope.schema.json +48 -48
- package/schemas/event.schema.json +111 -111
- package/schemas/execution-trace-view.schema.json +122 -122
- package/schemas/plan-validation-core.schema.json +95 -95
- package/schemas/quick-verify-report.schema.json +251 -251
- package/schemas/registry-validation-result.schema.json +99 -99
- package/schemas/run-comparison-report.schema.json +513 -513
- package/schemas/tools-registry-export.schema.json +9 -9
- package/schemas/tools-registry.schema.json +284 -284
- package/schemas/workflow-engine-result.schema.json +591 -591
- package/schemas/workflow-result-compare-input.schema.json +15 -15
- package/schemas/workflow-result-signature.schema.json +20 -20
- package/schemas/workflow-result-v9.schema.json +85 -85
- package/schemas/workflow-result.schema.json +80 -80
- package/schemas/workflow-truth-report.schema.json +761 -761
- package/dist/failureOriginSchemaEnum.test.d.ts +0 -2
- package/dist/failureOriginSchemaEnum.test.d.ts.map +0 -1
- package/dist/failureOriginSchemaEnum.test.js +0 -21
- package/dist/failureOriginSchemaEnum.test.js.map +0 -1
- package/dist/failureOriginSchemaParity.test.d.ts +0 -2
- package/dist/failureOriginSchemaParity.test.d.ts.map +0 -1
- package/dist/failureOriginSchemaParity.test.js +0 -33
- package/dist/failureOriginSchemaParity.test.js.map +0 -1
- package/dist/slice6.compare.ac.test.d.ts +0 -2
- package/dist/slice6.compare.ac.test.d.ts.map +0 -1
- package/dist/slice6.compare.ac.test.js +0 -81
- package/dist/slice6.compare.ac.test.js.map +0 -1
package/dist/enforceCli.js
CHANGED
|
@@ -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");
|