yadflow 3.13.0 → 3.13.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/CHANGELOG.md +23 -0
- package/bin/yad.mjs +8 -3
- package/cli/doctor.mjs +113 -1
- package/cli/epic-state.mjs +14 -6
- package/cli/gate.mjs +191 -25
- package/cli/platform.mjs +80 -0
- package/package.json +3 -3
- package/skills/yad-architecture/SKILL.md +15 -3
- package/skills/yad-architecture/references/contract-format.md +4 -1
- package/skills/yad-checks/references/check-gates.md +18 -1
- package/skills/yad-checks/templates/checks/contract-check.sh +46 -3
- package/skills/yad-checks/templates/checks/epic-open.sh +41 -9
- package/skills/yad-checks/templates/checks/lineage-check.sh +38 -9
- package/skills/yad-checks/templates/checks/reconcile-debt-check.sh +39 -7
- package/skills/yad-checks/templates/checks/spec-link.sh +17 -5
- package/skills/yad-docs/templates/app/package-lock.json +7 -519
- package/skills/yad-epic/references/state-schema.md +13 -0
- package/skills/yad-hub-bridge/references/bridge.md +50 -5
- package/skills/yad-hub-bridge/templates/github/yad-gate-sync.yml +6 -3
- package/skills/yad-hub-bridge/templates/gitlab/yad-gate-sync.gitlab-ci.yml +13 -2
- package/skills/yad-review-gate/SKILL.md +13 -3
- package/skills/yad-review-gate/references/gating.md +7 -3
- package/skills/yad-spec/references/spec-handoff.md +12 -2
|
@@ -347,474 +347,6 @@
|
|
|
347
347
|
"tslib": "^2.4.0"
|
|
348
348
|
}
|
|
349
349
|
},
|
|
350
|
-
"node_modules/@esbuild/aix-ppc64": {
|
|
351
|
-
"version": "0.28.1",
|
|
352
|
-
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
|
|
353
|
-
"integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
|
|
354
|
-
"cpu": [
|
|
355
|
-
"ppc64"
|
|
356
|
-
],
|
|
357
|
-
"dev": true,
|
|
358
|
-
"license": "MIT",
|
|
359
|
-
"optional": true,
|
|
360
|
-
"os": [
|
|
361
|
-
"aix"
|
|
362
|
-
],
|
|
363
|
-
"peer": true,
|
|
364
|
-
"engines": {
|
|
365
|
-
"node": ">=18"
|
|
366
|
-
}
|
|
367
|
-
},
|
|
368
|
-
"node_modules/@esbuild/android-arm": {
|
|
369
|
-
"version": "0.28.1",
|
|
370
|
-
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
|
|
371
|
-
"integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
|
|
372
|
-
"cpu": [
|
|
373
|
-
"arm"
|
|
374
|
-
],
|
|
375
|
-
"dev": true,
|
|
376
|
-
"license": "MIT",
|
|
377
|
-
"optional": true,
|
|
378
|
-
"os": [
|
|
379
|
-
"android"
|
|
380
|
-
],
|
|
381
|
-
"peer": true,
|
|
382
|
-
"engines": {
|
|
383
|
-
"node": ">=18"
|
|
384
|
-
}
|
|
385
|
-
},
|
|
386
|
-
"node_modules/@esbuild/android-arm64": {
|
|
387
|
-
"version": "0.28.1",
|
|
388
|
-
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
|
|
389
|
-
"integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
|
|
390
|
-
"cpu": [
|
|
391
|
-
"arm64"
|
|
392
|
-
],
|
|
393
|
-
"dev": true,
|
|
394
|
-
"license": "MIT",
|
|
395
|
-
"optional": true,
|
|
396
|
-
"os": [
|
|
397
|
-
"android"
|
|
398
|
-
],
|
|
399
|
-
"peer": true,
|
|
400
|
-
"engines": {
|
|
401
|
-
"node": ">=18"
|
|
402
|
-
}
|
|
403
|
-
},
|
|
404
|
-
"node_modules/@esbuild/android-x64": {
|
|
405
|
-
"version": "0.28.1",
|
|
406
|
-
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
|
|
407
|
-
"integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
|
|
408
|
-
"cpu": [
|
|
409
|
-
"x64"
|
|
410
|
-
],
|
|
411
|
-
"dev": true,
|
|
412
|
-
"license": "MIT",
|
|
413
|
-
"optional": true,
|
|
414
|
-
"os": [
|
|
415
|
-
"android"
|
|
416
|
-
],
|
|
417
|
-
"peer": true,
|
|
418
|
-
"engines": {
|
|
419
|
-
"node": ">=18"
|
|
420
|
-
}
|
|
421
|
-
},
|
|
422
|
-
"node_modules/@esbuild/darwin-arm64": {
|
|
423
|
-
"version": "0.28.1",
|
|
424
|
-
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
|
|
425
|
-
"integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
|
|
426
|
-
"cpu": [
|
|
427
|
-
"arm64"
|
|
428
|
-
],
|
|
429
|
-
"dev": true,
|
|
430
|
-
"license": "MIT",
|
|
431
|
-
"optional": true,
|
|
432
|
-
"os": [
|
|
433
|
-
"darwin"
|
|
434
|
-
],
|
|
435
|
-
"peer": true,
|
|
436
|
-
"engines": {
|
|
437
|
-
"node": ">=18"
|
|
438
|
-
}
|
|
439
|
-
},
|
|
440
|
-
"node_modules/@esbuild/darwin-x64": {
|
|
441
|
-
"version": "0.28.1",
|
|
442
|
-
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
|
|
443
|
-
"integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
|
|
444
|
-
"cpu": [
|
|
445
|
-
"x64"
|
|
446
|
-
],
|
|
447
|
-
"dev": true,
|
|
448
|
-
"license": "MIT",
|
|
449
|
-
"optional": true,
|
|
450
|
-
"os": [
|
|
451
|
-
"darwin"
|
|
452
|
-
],
|
|
453
|
-
"peer": true,
|
|
454
|
-
"engines": {
|
|
455
|
-
"node": ">=18"
|
|
456
|
-
}
|
|
457
|
-
},
|
|
458
|
-
"node_modules/@esbuild/freebsd-arm64": {
|
|
459
|
-
"version": "0.28.1",
|
|
460
|
-
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
|
|
461
|
-
"integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
|
|
462
|
-
"cpu": [
|
|
463
|
-
"arm64"
|
|
464
|
-
],
|
|
465
|
-
"dev": true,
|
|
466
|
-
"license": "MIT",
|
|
467
|
-
"optional": true,
|
|
468
|
-
"os": [
|
|
469
|
-
"freebsd"
|
|
470
|
-
],
|
|
471
|
-
"peer": true,
|
|
472
|
-
"engines": {
|
|
473
|
-
"node": ">=18"
|
|
474
|
-
}
|
|
475
|
-
},
|
|
476
|
-
"node_modules/@esbuild/freebsd-x64": {
|
|
477
|
-
"version": "0.28.1",
|
|
478
|
-
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
|
|
479
|
-
"integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
|
|
480
|
-
"cpu": [
|
|
481
|
-
"x64"
|
|
482
|
-
],
|
|
483
|
-
"dev": true,
|
|
484
|
-
"license": "MIT",
|
|
485
|
-
"optional": true,
|
|
486
|
-
"os": [
|
|
487
|
-
"freebsd"
|
|
488
|
-
],
|
|
489
|
-
"peer": true,
|
|
490
|
-
"engines": {
|
|
491
|
-
"node": ">=18"
|
|
492
|
-
}
|
|
493
|
-
},
|
|
494
|
-
"node_modules/@esbuild/linux-arm": {
|
|
495
|
-
"version": "0.28.1",
|
|
496
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
|
|
497
|
-
"integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
|
|
498
|
-
"cpu": [
|
|
499
|
-
"arm"
|
|
500
|
-
],
|
|
501
|
-
"dev": true,
|
|
502
|
-
"license": "MIT",
|
|
503
|
-
"optional": true,
|
|
504
|
-
"os": [
|
|
505
|
-
"linux"
|
|
506
|
-
],
|
|
507
|
-
"peer": true,
|
|
508
|
-
"engines": {
|
|
509
|
-
"node": ">=18"
|
|
510
|
-
}
|
|
511
|
-
},
|
|
512
|
-
"node_modules/@esbuild/linux-arm64": {
|
|
513
|
-
"version": "0.28.1",
|
|
514
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
|
|
515
|
-
"integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
|
|
516
|
-
"cpu": [
|
|
517
|
-
"arm64"
|
|
518
|
-
],
|
|
519
|
-
"dev": true,
|
|
520
|
-
"license": "MIT",
|
|
521
|
-
"optional": true,
|
|
522
|
-
"os": [
|
|
523
|
-
"linux"
|
|
524
|
-
],
|
|
525
|
-
"peer": true,
|
|
526
|
-
"engines": {
|
|
527
|
-
"node": ">=18"
|
|
528
|
-
}
|
|
529
|
-
},
|
|
530
|
-
"node_modules/@esbuild/linux-ia32": {
|
|
531
|
-
"version": "0.28.1",
|
|
532
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
|
|
533
|
-
"integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
|
|
534
|
-
"cpu": [
|
|
535
|
-
"ia32"
|
|
536
|
-
],
|
|
537
|
-
"dev": true,
|
|
538
|
-
"license": "MIT",
|
|
539
|
-
"optional": true,
|
|
540
|
-
"os": [
|
|
541
|
-
"linux"
|
|
542
|
-
],
|
|
543
|
-
"peer": true,
|
|
544
|
-
"engines": {
|
|
545
|
-
"node": ">=18"
|
|
546
|
-
}
|
|
547
|
-
},
|
|
548
|
-
"node_modules/@esbuild/linux-loong64": {
|
|
549
|
-
"version": "0.28.1",
|
|
550
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
|
|
551
|
-
"integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
|
|
552
|
-
"cpu": [
|
|
553
|
-
"loong64"
|
|
554
|
-
],
|
|
555
|
-
"dev": true,
|
|
556
|
-
"license": "MIT",
|
|
557
|
-
"optional": true,
|
|
558
|
-
"os": [
|
|
559
|
-
"linux"
|
|
560
|
-
],
|
|
561
|
-
"peer": true,
|
|
562
|
-
"engines": {
|
|
563
|
-
"node": ">=18"
|
|
564
|
-
}
|
|
565
|
-
},
|
|
566
|
-
"node_modules/@esbuild/linux-mips64el": {
|
|
567
|
-
"version": "0.28.1",
|
|
568
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
|
|
569
|
-
"integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
|
|
570
|
-
"cpu": [
|
|
571
|
-
"mips64el"
|
|
572
|
-
],
|
|
573
|
-
"dev": true,
|
|
574
|
-
"license": "MIT",
|
|
575
|
-
"optional": true,
|
|
576
|
-
"os": [
|
|
577
|
-
"linux"
|
|
578
|
-
],
|
|
579
|
-
"peer": true,
|
|
580
|
-
"engines": {
|
|
581
|
-
"node": ">=18"
|
|
582
|
-
}
|
|
583
|
-
},
|
|
584
|
-
"node_modules/@esbuild/linux-ppc64": {
|
|
585
|
-
"version": "0.28.1",
|
|
586
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
|
|
587
|
-
"integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
|
|
588
|
-
"cpu": [
|
|
589
|
-
"ppc64"
|
|
590
|
-
],
|
|
591
|
-
"dev": true,
|
|
592
|
-
"license": "MIT",
|
|
593
|
-
"optional": true,
|
|
594
|
-
"os": [
|
|
595
|
-
"linux"
|
|
596
|
-
],
|
|
597
|
-
"peer": true,
|
|
598
|
-
"engines": {
|
|
599
|
-
"node": ">=18"
|
|
600
|
-
}
|
|
601
|
-
},
|
|
602
|
-
"node_modules/@esbuild/linux-riscv64": {
|
|
603
|
-
"version": "0.28.1",
|
|
604
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
|
|
605
|
-
"integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
|
|
606
|
-
"cpu": [
|
|
607
|
-
"riscv64"
|
|
608
|
-
],
|
|
609
|
-
"dev": true,
|
|
610
|
-
"license": "MIT",
|
|
611
|
-
"optional": true,
|
|
612
|
-
"os": [
|
|
613
|
-
"linux"
|
|
614
|
-
],
|
|
615
|
-
"peer": true,
|
|
616
|
-
"engines": {
|
|
617
|
-
"node": ">=18"
|
|
618
|
-
}
|
|
619
|
-
},
|
|
620
|
-
"node_modules/@esbuild/linux-s390x": {
|
|
621
|
-
"version": "0.28.1",
|
|
622
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
|
|
623
|
-
"integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
|
|
624
|
-
"cpu": [
|
|
625
|
-
"s390x"
|
|
626
|
-
],
|
|
627
|
-
"dev": true,
|
|
628
|
-
"license": "MIT",
|
|
629
|
-
"optional": true,
|
|
630
|
-
"os": [
|
|
631
|
-
"linux"
|
|
632
|
-
],
|
|
633
|
-
"peer": true,
|
|
634
|
-
"engines": {
|
|
635
|
-
"node": ">=18"
|
|
636
|
-
}
|
|
637
|
-
},
|
|
638
|
-
"node_modules/@esbuild/linux-x64": {
|
|
639
|
-
"version": "0.28.1",
|
|
640
|
-
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
|
|
641
|
-
"integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
|
|
642
|
-
"cpu": [
|
|
643
|
-
"x64"
|
|
644
|
-
],
|
|
645
|
-
"dev": true,
|
|
646
|
-
"license": "MIT",
|
|
647
|
-
"optional": true,
|
|
648
|
-
"os": [
|
|
649
|
-
"linux"
|
|
650
|
-
],
|
|
651
|
-
"peer": true,
|
|
652
|
-
"engines": {
|
|
653
|
-
"node": ">=18"
|
|
654
|
-
}
|
|
655
|
-
},
|
|
656
|
-
"node_modules/@esbuild/netbsd-arm64": {
|
|
657
|
-
"version": "0.28.1",
|
|
658
|
-
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
|
|
659
|
-
"integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
|
|
660
|
-
"cpu": [
|
|
661
|
-
"arm64"
|
|
662
|
-
],
|
|
663
|
-
"dev": true,
|
|
664
|
-
"license": "MIT",
|
|
665
|
-
"optional": true,
|
|
666
|
-
"os": [
|
|
667
|
-
"netbsd"
|
|
668
|
-
],
|
|
669
|
-
"peer": true,
|
|
670
|
-
"engines": {
|
|
671
|
-
"node": ">=18"
|
|
672
|
-
}
|
|
673
|
-
},
|
|
674
|
-
"node_modules/@esbuild/netbsd-x64": {
|
|
675
|
-
"version": "0.28.1",
|
|
676
|
-
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
|
|
677
|
-
"integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
|
|
678
|
-
"cpu": [
|
|
679
|
-
"x64"
|
|
680
|
-
],
|
|
681
|
-
"dev": true,
|
|
682
|
-
"license": "MIT",
|
|
683
|
-
"optional": true,
|
|
684
|
-
"os": [
|
|
685
|
-
"netbsd"
|
|
686
|
-
],
|
|
687
|
-
"peer": true,
|
|
688
|
-
"engines": {
|
|
689
|
-
"node": ">=18"
|
|
690
|
-
}
|
|
691
|
-
},
|
|
692
|
-
"node_modules/@esbuild/openbsd-arm64": {
|
|
693
|
-
"version": "0.28.1",
|
|
694
|
-
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
|
|
695
|
-
"integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
|
|
696
|
-
"cpu": [
|
|
697
|
-
"arm64"
|
|
698
|
-
],
|
|
699
|
-
"dev": true,
|
|
700
|
-
"license": "MIT",
|
|
701
|
-
"optional": true,
|
|
702
|
-
"os": [
|
|
703
|
-
"openbsd"
|
|
704
|
-
],
|
|
705
|
-
"peer": true,
|
|
706
|
-
"engines": {
|
|
707
|
-
"node": ">=18"
|
|
708
|
-
}
|
|
709
|
-
},
|
|
710
|
-
"node_modules/@esbuild/openbsd-x64": {
|
|
711
|
-
"version": "0.28.1",
|
|
712
|
-
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
|
|
713
|
-
"integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
|
|
714
|
-
"cpu": [
|
|
715
|
-
"x64"
|
|
716
|
-
],
|
|
717
|
-
"dev": true,
|
|
718
|
-
"license": "MIT",
|
|
719
|
-
"optional": true,
|
|
720
|
-
"os": [
|
|
721
|
-
"openbsd"
|
|
722
|
-
],
|
|
723
|
-
"peer": true,
|
|
724
|
-
"engines": {
|
|
725
|
-
"node": ">=18"
|
|
726
|
-
}
|
|
727
|
-
},
|
|
728
|
-
"node_modules/@esbuild/openharmony-arm64": {
|
|
729
|
-
"version": "0.28.1",
|
|
730
|
-
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
|
|
731
|
-
"integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
|
|
732
|
-
"cpu": [
|
|
733
|
-
"arm64"
|
|
734
|
-
],
|
|
735
|
-
"dev": true,
|
|
736
|
-
"license": "MIT",
|
|
737
|
-
"optional": true,
|
|
738
|
-
"os": [
|
|
739
|
-
"openharmony"
|
|
740
|
-
],
|
|
741
|
-
"peer": true,
|
|
742
|
-
"engines": {
|
|
743
|
-
"node": ">=18"
|
|
744
|
-
}
|
|
745
|
-
},
|
|
746
|
-
"node_modules/@esbuild/sunos-x64": {
|
|
747
|
-
"version": "0.28.1",
|
|
748
|
-
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
|
|
749
|
-
"integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
|
|
750
|
-
"cpu": [
|
|
751
|
-
"x64"
|
|
752
|
-
],
|
|
753
|
-
"dev": true,
|
|
754
|
-
"license": "MIT",
|
|
755
|
-
"optional": true,
|
|
756
|
-
"os": [
|
|
757
|
-
"sunos"
|
|
758
|
-
],
|
|
759
|
-
"peer": true,
|
|
760
|
-
"engines": {
|
|
761
|
-
"node": ">=18"
|
|
762
|
-
}
|
|
763
|
-
},
|
|
764
|
-
"node_modules/@esbuild/win32-arm64": {
|
|
765
|
-
"version": "0.28.1",
|
|
766
|
-
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
|
|
767
|
-
"integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
|
|
768
|
-
"cpu": [
|
|
769
|
-
"arm64"
|
|
770
|
-
],
|
|
771
|
-
"dev": true,
|
|
772
|
-
"license": "MIT",
|
|
773
|
-
"optional": true,
|
|
774
|
-
"os": [
|
|
775
|
-
"win32"
|
|
776
|
-
],
|
|
777
|
-
"peer": true,
|
|
778
|
-
"engines": {
|
|
779
|
-
"node": ">=18"
|
|
780
|
-
}
|
|
781
|
-
},
|
|
782
|
-
"node_modules/@esbuild/win32-ia32": {
|
|
783
|
-
"version": "0.28.1",
|
|
784
|
-
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
|
|
785
|
-
"integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
|
|
786
|
-
"cpu": [
|
|
787
|
-
"ia32"
|
|
788
|
-
],
|
|
789
|
-
"dev": true,
|
|
790
|
-
"license": "MIT",
|
|
791
|
-
"optional": true,
|
|
792
|
-
"os": [
|
|
793
|
-
"win32"
|
|
794
|
-
],
|
|
795
|
-
"peer": true,
|
|
796
|
-
"engines": {
|
|
797
|
-
"node": ">=18"
|
|
798
|
-
}
|
|
799
|
-
},
|
|
800
|
-
"node_modules/@esbuild/win32-x64": {
|
|
801
|
-
"version": "0.28.1",
|
|
802
|
-
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
|
|
803
|
-
"integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
|
|
804
|
-
"cpu": [
|
|
805
|
-
"x64"
|
|
806
|
-
],
|
|
807
|
-
"dev": true,
|
|
808
|
-
"license": "MIT",
|
|
809
|
-
"optional": true,
|
|
810
|
-
"os": [
|
|
811
|
-
"win32"
|
|
812
|
-
],
|
|
813
|
-
"peer": true,
|
|
814
|
-
"engines": {
|
|
815
|
-
"node": ">=18"
|
|
816
|
-
}
|
|
817
|
-
},
|
|
818
350
|
"node_modules/@eslint-community/eslint-utils": {
|
|
819
351
|
"version": "4.9.1",
|
|
820
352
|
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
|
|
@@ -1938,16 +1470,16 @@
|
|
|
1938
1470
|
}
|
|
1939
1471
|
},
|
|
1940
1472
|
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
|
|
1941
|
-
"version": "5.0.
|
|
1942
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.
|
|
1943
|
-
"integrity": "sha512-
|
|
1473
|
+
"version": "5.0.8",
|
|
1474
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
|
|
1475
|
+
"integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
|
|
1944
1476
|
"dev": true,
|
|
1945
1477
|
"license": "MIT",
|
|
1946
1478
|
"dependencies": {
|
|
1947
1479
|
"balanced-match": "^4.0.2"
|
|
1948
1480
|
},
|
|
1949
1481
|
"engines": {
|
|
1950
|
-
"node": "
|
|
1482
|
+
"node": "20 || >=22"
|
|
1951
1483
|
}
|
|
1952
1484
|
},
|
|
1953
1485
|
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
|
|
@@ -2139,9 +1671,9 @@
|
|
|
2139
1671
|
}
|
|
2140
1672
|
},
|
|
2141
1673
|
"node_modules/brace-expansion": {
|
|
2142
|
-
"version": "1.1.
|
|
2143
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.
|
|
2144
|
-
"integrity": "sha512-
|
|
1674
|
+
"version": "1.1.16",
|
|
1675
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
|
|
1676
|
+
"integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
|
|
2145
1677
|
"dev": true,
|
|
2146
1678
|
"license": "MIT",
|
|
2147
1679
|
"dependencies": {
|
|
@@ -2356,50 +1888,6 @@
|
|
|
2356
1888
|
"node": ">=10.13.0"
|
|
2357
1889
|
}
|
|
2358
1890
|
},
|
|
2359
|
-
"node_modules/esbuild": {
|
|
2360
|
-
"version": "0.28.1",
|
|
2361
|
-
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
|
|
2362
|
-
"integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
|
|
2363
|
-
"dev": true,
|
|
2364
|
-
"hasInstallScript": true,
|
|
2365
|
-
"license": "MIT",
|
|
2366
|
-
"optional": true,
|
|
2367
|
-
"peer": true,
|
|
2368
|
-
"bin": {
|
|
2369
|
-
"esbuild": "bin/esbuild"
|
|
2370
|
-
},
|
|
2371
|
-
"engines": {
|
|
2372
|
-
"node": ">=18"
|
|
2373
|
-
},
|
|
2374
|
-
"optionalDependencies": {
|
|
2375
|
-
"@esbuild/aix-ppc64": "0.28.1",
|
|
2376
|
-
"@esbuild/android-arm": "0.28.1",
|
|
2377
|
-
"@esbuild/android-arm64": "0.28.1",
|
|
2378
|
-
"@esbuild/android-x64": "0.28.1",
|
|
2379
|
-
"@esbuild/darwin-arm64": "0.28.1",
|
|
2380
|
-
"@esbuild/darwin-x64": "0.28.1",
|
|
2381
|
-
"@esbuild/freebsd-arm64": "0.28.1",
|
|
2382
|
-
"@esbuild/freebsd-x64": "0.28.1",
|
|
2383
|
-
"@esbuild/linux-arm": "0.28.1",
|
|
2384
|
-
"@esbuild/linux-arm64": "0.28.1",
|
|
2385
|
-
"@esbuild/linux-ia32": "0.28.1",
|
|
2386
|
-
"@esbuild/linux-loong64": "0.28.1",
|
|
2387
|
-
"@esbuild/linux-mips64el": "0.28.1",
|
|
2388
|
-
"@esbuild/linux-ppc64": "0.28.1",
|
|
2389
|
-
"@esbuild/linux-riscv64": "0.28.1",
|
|
2390
|
-
"@esbuild/linux-s390x": "0.28.1",
|
|
2391
|
-
"@esbuild/linux-x64": "0.28.1",
|
|
2392
|
-
"@esbuild/netbsd-arm64": "0.28.1",
|
|
2393
|
-
"@esbuild/netbsd-x64": "0.28.1",
|
|
2394
|
-
"@esbuild/openbsd-arm64": "0.28.1",
|
|
2395
|
-
"@esbuild/openbsd-x64": "0.28.1",
|
|
2396
|
-
"@esbuild/openharmony-arm64": "0.28.1",
|
|
2397
|
-
"@esbuild/sunos-x64": "0.28.1",
|
|
2398
|
-
"@esbuild/win32-arm64": "0.28.1",
|
|
2399
|
-
"@esbuild/win32-ia32": "0.28.1",
|
|
2400
|
-
"@esbuild/win32-x64": "0.28.1"
|
|
2401
|
-
}
|
|
2402
|
-
},
|
|
2403
1891
|
"node_modules/escalade": {
|
|
2404
1892
|
"version": "3.2.0",
|
|
2405
1893
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
|
@@ -112,6 +112,19 @@ Append-only ledger (an array). Each entry:
|
|
|
112
112
|
`source: "bridge"` marks an approval synced from a hub review PR/MR by `yad-review-gate action: sync`
|
|
113
113
|
(via `yad-hub-bridge`). Manual approvals omit `source` and are never altered by `sync`.
|
|
114
114
|
|
|
115
|
+
A **bridge** approval carries four more fields, all written by `sync` and all about *what was approved*
|
|
116
|
+
rather than *who approved*:
|
|
117
|
+
|
|
118
|
+
| Field | Meaning |
|
|
119
|
+
|-------|---------|
|
|
120
|
+
| `artifactHash` | the content fingerprint the approval is bound to (`sha256:…`). The gate drops any approval whose hash ≠ the artifact's current one — this is revoke-on-change. For architecture it is the locked contract surface, for stories the whole `stories/` set. |
|
|
121
|
+
| `approvedAt` | when the platform says the review was submitted. Used to tell a genuine re-approval from the same review read again; **absent on GitLab**, which exposes no per-approval timestamp. |
|
|
122
|
+
| `pr` | the PR/MR number the approval arrived on. The second proof of a genuine re-approval, and the only one available on GitLab: a re-opened review is always a new PR, so an approval on a different number cannot be the old one re-read. Records written before this field existed are stamped once, from the `hub-prs.json` pointer they were recorded against. |
|
|
123
|
+
| `engagement` | `verified` when the approval carried the companion's engagement marker, else `none`. Advisory unless `hub.review.requireEngagement` is on. |
|
|
124
|
+
|
|
125
|
+
`date` is when the sync **recorded** the approval, not when it was given — it is preserved across an
|
|
126
|
+
unchanged re-sync so that re-reading a review never churns the ledger.
|
|
127
|
+
|
|
115
128
|
## `comments.json`
|
|
116
129
|
Append-only ledger (an array), the machine-readable counterpart to the `reviews/*--comments.md` markdown
|
|
117
130
|
("who reviewed/commented", as `approvals.json` is "who approved"). Written by `yad-review-gate`'s
|
|
@@ -10,7 +10,7 @@ predicate (`../yad-review-gate/references/gating.md`) runs unchanged. The bridge
|
|
|
10
10
|
|---|---|
|
|
11
11
|
| GitHub review `APPROVED` / GitLab MR approval (`approved_by`) | an `approved` record in `approvals.json`, role resolved from the roster (owner/reviewer) or derived domain-owner, tagged `"source": "bridge"` |
|
|
12
12
|
| GitHub `COMMENTED` / `CHANGES_REQUESTED`; GitLab discussions/notes | a line under `## <name> (<role>)` in `reviews/<artifact>--<date>--comments.md` + a `comments.json` record; **never** an approval. `CHANGES_REQUESTED` is also flagged as blocking in the comments file |
|
|
13
|
-
| GitHub review dismissed / GitLab approval revoked | the prior bridge `approved` record for that approver is removed on re-sync (see idempotency) |
|
|
13
|
+
| GitHub review dismissed / GitLab approval revoked | the prior bridge `approved` record for that approver is removed on re-sync **while the step is open**; once the step is `done` the record is kept as the audit trail of why it passed (see idempotency) |
|
|
14
14
|
|
|
15
15
|
`approvals.json` records from the bridge carry `"source": "bridge"`; **manual** approvals have no such
|
|
16
16
|
tag and are **never** touched by `sync` — the two coexist.
|
|
@@ -82,10 +82,21 @@ login and requested too — otherwise an escalated step is structurally unsatisf
|
|
|
82
82
|
## Idempotent re-sync
|
|
83
83
|
|
|
84
84
|
- Key bridge approvals on `(step, approver, role, domain)`. On re-sync, **upsert** — do not append a
|
|
85
|
-
duplicate.
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
-
|
|
85
|
+
duplicate.
|
|
86
|
+
- **On an OPEN step**, remove any bridge approval whose platform review was dismissed/revoked: the
|
|
87
|
+
platform is the live source of truth while the review is in flight.
|
|
88
|
+
- **On a step already `done`**, the record is only added to or refreshed in place — an approval the
|
|
89
|
+
platform no longer reports is **kept**. Those approvals are the audit record of *why* the gate
|
|
90
|
+
passed; a roster edit, an approval reset, or a degraded-but-successful read would otherwise erase
|
|
91
|
+
them and leave the step `done` with zero approvals.
|
|
92
|
+
- Key synced comments on the platform comment id so the same comment is not appended twice. Comment
|
|
93
|
+
rounds are recorded for an **open** step only, so re-visiting a merged review does not append a new
|
|
94
|
+
round per pass.
|
|
95
|
+
- Update the step's `hub-prs.json` `lastSyncedAt` when the sync **learned something** — every sync on
|
|
96
|
+
an open step, and on a closed one only when the approval record actually changed (a re-opened review
|
|
97
|
+
that was re-approved). An identical re-sync leaves it alone, so the ledger does not churn.
|
|
98
|
+
- Running `sync` twice with no platform change is a no-op on the ledger — byte-identical, including
|
|
99
|
+
`comments.json` and the dated `reviews/*.md` side files.
|
|
89
100
|
|
|
90
101
|
## Contract re-lock invalidates prior platform approvals too
|
|
91
102
|
|
|
@@ -201,6 +212,40 @@ the default branch: `yad gate ci --branch <review-branch> --pr <n> --merged` (th
|
|
|
201
212
|
unlike advisory `yad gate sync`). File-only mode (no platform) keeps `yad gate sync` as the local writer.
|
|
202
213
|
The file ledger is still the source of truth.
|
|
203
214
|
|
|
215
|
+
Because CI records the `hub-prs.json` pointer only at merge, a review the ledger has never seen still
|
|
216
|
+
has to be nameable — otherwise `sync` refuses a PR that is sitting merged on the platform. With no
|
|
217
|
+
recorded pointer, `yad gate sync <epic> <artifact>` resolves the PR/MR from the review branch
|
|
218
|
+
(`review/<epic>/<artifact>`) itself, and `--pr <n>` names it outright:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
yad gate sync EP-x architecture.md --pr 42 # advisory in bridge mode; the writer without the bridge
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
An explicit `--pr` also **overrides** a recorded pointer, since a re-opened review is a new PR the
|
|
225
|
+
ledger has not seen. Before its reviewers are bound to the artifact's hash, the number is confirmed to
|
|
226
|
+
be the PR for that artifact's review branch — a mismatch is refused, and a platform that cannot answer
|
|
227
|
+
warns and proceeds. The bridge rule is unchanged: the resolved pointer is adopted into the ledger only
|
|
228
|
+
on the writer path, so a human never leaves a gate-state file in their working tree for `ledger-guard`
|
|
229
|
+
to reject.
|
|
230
|
+
|
|
231
|
+
**In bridge mode `gate sync` stays advisory even with `--pr`** — it prints the predicate and writes
|
|
232
|
+
nothing, because CI owns the ledger. The recovery that actually writes is the command CI itself runs,
|
|
233
|
+
on the default branch: `yad gate ci --branch <review-branch> --pr <n> --merged`.
|
|
234
|
+
|
|
235
|
+
**Serialization.** Both wired jobs push the ledger to the default branch, and on GitLab the scheduled
|
|
236
|
+
sweep's recent-MR window overlaps whatever the merge-push pipeline is handling — so they are pinned to
|
|
237
|
+
one at a time (`concurrency: yad-gate-mergesync` on GitHub, `resource_group: yad-gate-mergesync` on
|
|
238
|
+
GitLab). Without it both runs produce the same advance, one pushes, and the other rebases onto it and
|
|
239
|
+
lands a duplicate `chore(gate): advance …` commit under a different SHA — unreviewed churn, since
|
|
240
|
+
those commits carry `[skip ci]` and go straight to the default branch. An already-wired GitLab hub
|
|
241
|
+
picks the `resource_group` up on the next `yad update` / `yad check --fix`.
|
|
242
|
+
|
|
243
|
+
**`yad gate open` does not create or push the review branch.** It opens a PR/MR *against*
|
|
244
|
+
`review/<epic>/<artifact>`, so that branch must already be **on origin** — a local-only branch is no
|
|
245
|
+
use, because `gh pr create --head` does not push either. `yad open-pr`, run from the branch, pushes it
|
|
246
|
+
and then delegates here. Opening with the branch absent is refused up front, before any ledger write,
|
|
247
|
+
rather than failing inside `gh`/`glab`; an origin that cannot be reached at all only warns.
|
|
248
|
+
|
|
204
249
|
### Manual end-to-end verification (GitHub)
|
|
205
250
|
|
|
206
251
|
1. On a scratch hub: `yad setup` (platform github, roster with a second account) → `yad check --fix`
|
|
@@ -17,8 +17,10 @@
|
|
|
17
17
|
# RECONCILE (schedule, every 15 min): the safety net. The merge job's `closed` event fires once and
|
|
18
18
|
# never repeats, so a transient API/GraphQL/push failure (or a fail-closed degraded approval read)
|
|
19
19
|
# would otherwise strand a merged review until someone reran it by hand. This periodic job discovers
|
|
20
|
-
# recently-merged review PRs from the API and advances any not yet done
|
|
21
|
-
# `done` is
|
|
20
|
+
# recently-merged review PRs from the API and advances any not yet done. Idempotent: a step that is
|
|
21
|
+
# already `done` is never re-advanced (the chain is one-way), and re-syncing it writes nothing unless
|
|
22
|
+
# its approvals genuinely changed — so re-visiting a merged review for a week costs one no-op read per
|
|
23
|
+
# pass, not a commit. On GitHub a scheduled workflow runs automatically once committed (no setup).
|
|
22
24
|
#
|
|
23
25
|
# CI never approves and never merges — the merge click is the human approval act.
|
|
24
26
|
#
|
|
@@ -73,7 +75,8 @@ jobs:
|
|
|
73
75
|
|
|
74
76
|
reconcile:
|
|
75
77
|
# Safety net: recover any merged review PR whose merge-time run failed transiently (the `closed`
|
|
76
|
-
# event never re-fires). Idempotent — `yad gate ci`
|
|
78
|
+
# event never re-fires). Idempotent — `yad gate ci` never re-advances a step that is already `done`,
|
|
79
|
+
# and a re-sync of one writes nothing unless its approvals actually changed.
|
|
77
80
|
if: github.event_name == 'schedule'
|
|
78
81
|
runs-on: ubuntu-latest
|
|
79
82
|
concurrency:
|