@intentius/behold 0.19.0 → 0.21.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.
Files changed (52) hide show
  1. package/AGENTS.md +90 -5
  2. package/README.md +54 -1
  3. package/demos.json +3 -2
  4. package/dist/cli.js +1327 -303
  5. package/example-argo-estate/README.md +8 -8
  6. package/example-argo-estate/app-a/package.json +2 -2
  7. package/example-argo-estate/app-b/package.json +2 -2
  8. package/example-argo-estate/chant.workspace.json +27 -0
  9. package/example-argo-estate/control-plane/package.json +2 -2
  10. package/example-argo-estate/package-lock.json +133 -56
  11. package/example-carve/README.md +14 -14
  12. package/example-carve/app/package-lock.json +72 -9
  13. package/example-carve/app/package.json +2 -2
  14. package/example-carve/legacy-tf/versions.tf +1 -1
  15. package/example-choudoufu-estate/README.md +4 -4
  16. package/example-choudoufu-estate/chant.workspace.json +32 -0
  17. package/example-choudoufu-estate/scripts/choudoufu-up.sh +21 -0
  18. package/example-flux-estate/README.md +5 -5
  19. package/example-flux-estate/app-a/package.json +2 -2
  20. package/example-flux-estate/app-b/package.json +2 -2
  21. package/example-flux-estate/chant.workspace.json +27 -0
  22. package/example-flux-estate/control-plane/package.json +2 -2
  23. package/example-flux-estate/package-lock.json +133 -56
  24. package/example-k8s/README.md +20 -20
  25. package/example-k8s/chant.config.ts +1 -1
  26. package/example-k8s/ops/k3d-apply.op.ts +1 -1
  27. package/example-k8s/package-lock.json +129 -211
  28. package/example-k8s/package.json +2 -3
  29. package/example-terraform-estate/README.md +5 -5
  30. package/example-terraform-estate/chant.workspace.json +22 -0
  31. package/example-writes/README.md +5 -5
  32. package/example-writes/chant.config.ts +1 -1
  33. package/example-writes/ops/apply.op.ts +1 -1
  34. package/example-writes/ops/floci.op.ts +2 -2
  35. package/example-writes/ops/reconcile.op.ts +1 -1
  36. package/example-writes/package-lock.json +62 -175
  37. package/example-writes/package.json +2 -3
  38. package/package.json +6 -6
  39. package/web/app.js +431 -17
  40. package/web/behaviour-scale.js +32 -0
  41. package/web/behaviour-scale.test.js +39 -0
  42. package/web/embed.js +76 -0
  43. package/web/embed.test.js +45 -0
  44. package/web/index.html +20 -0
  45. package/web/operator.js +14 -1
  46. package/web/panel.js +11 -3
  47. package/web/run-playhead.js +13 -1
  48. package/web/view-url.js +138 -0
  49. package/web/view-url.test.js +84 -0
  50. package/web/workspace-gates.js +44 -0
  51. package/web/workspace-gates.test.js +34 -0
  52. package/example-choudoufu-estate/.behold.json +0 -8
@@ -14,22 +14,22 @@
14
14
  "app-a": {
15
15
  "name": "behold-example-flux-app-a",
16
16
  "dependencies": {
17
- "@intentius/chant": "^0.54.0",
18
- "@intentius/chant-lexicon-k8s": "^0.54.0"
17
+ "@intentius/chant": "^0.95.0",
18
+ "@intentius/chant-lexicon-k8s": "^0.95.0"
19
19
  }
20
20
  },
21
21
  "app-b": {
22
22
  "name": "behold-example-flux-app-b",
23
23
  "dependencies": {
24
- "@intentius/chant": "^0.54.0",
25
- "@intentius/chant-lexicon-k8s": "^0.54.0"
24
+ "@intentius/chant": "^0.95.0",
25
+ "@intentius/chant-lexicon-k8s": "^0.95.0"
26
26
  }
27
27
  },
28
28
  "control-plane": {
29
29
  "name": "behold-example-flux-control-plane",
30
30
  "dependencies": {
31
- "@intentius/chant": "^0.54.0",
32
- "@intentius/chant-lexicon-k8s": "^0.54.0"
31
+ "@intentius/chant": "^0.95.0",
32
+ "@intentius/chant-lexicon-k8s": "^0.95.0"
33
33
  }
34
34
  },
35
35
  "node_modules/@dagrejs/dagre": {
@@ -464,14 +464,16 @@
464
464
  }
465
465
  },
466
466
  "node_modules/@intentius/chant": {
467
- "version": "0.54.0",
468
- "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.54.0.tgz",
469
- "integrity": "sha512-ETYVPvDWqJiEsaaaYK+1U2lGrZZqHPU6/bOH797oQNw5gd7ESkEoYZxlh0qO90FQGVdx1pQMvmlCWskWD4xIlA==",
467
+ "version": "0.95.0",
468
+ "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.95.0.tgz",
469
+ "integrity": "sha512-zhReqEbP7apFyI9bwHATxSKPbc9HK8W2lJvZpib0YNEgSafydm+dd31Hn+7o3AcHhYbAkLpHFQwlFYbM2uVYCg==",
470
470
  "license": "Apache-2.0",
471
471
  "dependencies": {
472
472
  "@dagrejs/dagre": "^3.0.0",
473
+ "ajv": "^8.20.0",
473
474
  "esbuild": "^0.28.1",
474
475
  "fflate": "^0.8.2",
476
+ "js-yaml": "^4.3.1",
475
477
  "picomatch": "^4.0.3",
476
478
  "tsx": "^4.0.0",
477
479
  "typescript": "^5.5.0",
@@ -479,12 +481,20 @@
479
481
  },
480
482
  "bin": {
481
483
  "chant": "bin/chant"
484
+ },
485
+ "peerDependencies": {
486
+ "vitest": ">=2"
487
+ },
488
+ "peerDependenciesMeta": {
489
+ "vitest": {
490
+ "optional": true
491
+ }
482
492
  }
483
493
  },
484
494
  "node_modules/@intentius/chant-k8s-client": {
485
- "version": "0.54.0",
486
- "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.54.0.tgz",
487
- "integrity": "sha512-LzoPfOQ4tIy7QR3ohLi/OqRgoZU/NXZ5TU6WeXFVqzffSjEoZu9yonjkaALy30Dqqa77XGFMTcP/SMZkNSEdsQ==",
495
+ "version": "0.95.0",
496
+ "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.95.0.tgz",
497
+ "integrity": "sha512-AjLnvTNzAIHbwsOv8gszuLqzH0UeA16Dy8dWIdEICUDLRdmi0gGcX7qZ/VNzQMIHu9Bu1hSIJz+gbmR44a7tYA==",
488
498
  "license": "Apache-2.0",
489
499
  "optional": true,
490
500
  "dependencies": {
@@ -492,23 +502,37 @@
492
502
  }
493
503
  },
494
504
  "node_modules/@intentius/chant-lexicon-k8s": {
495
- "version": "0.54.0",
496
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.54.0.tgz",
497
- "integrity": "sha512-Bz+UYEJmy6gCAhlTPXAsyeLG8B7B9KvBX/Cjt261z/nOc/0OwdOhZs3DkjD1UA1ZPKfkUxP/S1mJq8ux3ggNCw==",
505
+ "version": "0.95.0",
506
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.95.0.tgz",
507
+ "integrity": "sha512-sanDVeXQYHXkwwQ5OZiVCbpHn25B6wt9XvW3uoBpzLv/lBhxrPfKGv5xhDyAfKaSktfCknWXlI2S0SV+6AOy8A==",
498
508
  "license": "Apache-2.0",
499
509
  "dependencies": {
510
+ "@intentius/chant-lexicon-otel": "*",
500
511
  "@types/js-yaml": "^4.0.9",
501
512
  "js-yaml": "^4.3.1"
502
513
  },
503
514
  "optionalDependencies": {
504
- "@intentius/chant-k8s-client": "^0.54.0"
515
+ "@intentius/chant-k8s-client": "^0.95.0"
505
516
  },
506
517
  "peerDependencies": {
507
- "@intentius/chant": "^0.54.0",
518
+ "@intentius/chant": "^0.95.0",
508
519
  "typescript": "^5.9.3",
509
520
  "zod": "^4.3.6"
510
521
  }
511
522
  },
523
+ "node_modules/@intentius/chant-lexicon-otel": {
524
+ "version": "0.95.0",
525
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-otel/-/chant-lexicon-otel-0.95.0.tgz",
526
+ "integrity": "sha512-TTydUPN3fStnkdsmAIWKZiA2gBahxOAz9ihcsHx5rupnkOTSHO8soxayqbUBaUxVbdbrwYT9zpAcc3W3KcXBaQ==",
527
+ "license": "Apache-2.0",
528
+ "dependencies": {
529
+ "js-yaml": "^4.3.1"
530
+ },
531
+ "peerDependencies": {
532
+ "@intentius/chant": "^0.95.0",
533
+ "typescript": "^5.9.3"
534
+ }
535
+ },
512
536
  "node_modules/@jsep-plugin/assignment": {
513
537
  "version": "1.3.0",
514
538
  "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz",
@@ -590,13 +614,13 @@
590
614
  "license": "MIT"
591
615
  },
592
616
  "node_modules/@types/node": {
593
- "version": "26.4.1",
594
- "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.1.tgz",
595
- "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==",
617
+ "version": "26.6.3",
618
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz",
619
+ "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==",
596
620
  "license": "MIT",
597
621
  "optional": true,
598
622
  "dependencies": {
599
- "undici-types": "~8.3.0"
623
+ "undici-types": "~8.9.0"
600
624
  }
601
625
  },
602
626
  "node_modules/@types/stream-buffers": {
@@ -619,6 +643,22 @@
619
643
  "node": ">= 20"
620
644
  }
621
645
  },
646
+ "node_modules/ajv": {
647
+ "version": "8.20.0",
648
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
649
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
650
+ "license": "MIT",
651
+ "dependencies": {
652
+ "fast-deep-equal": "^3.1.3",
653
+ "fast-uri": "^3.0.1",
654
+ "json-schema-traverse": "^1.0.0",
655
+ "require-from-string": "^2.0.2"
656
+ },
657
+ "funding": {
658
+ "type": "github",
659
+ "url": "https://github.com/sponsors/epoberezkin"
660
+ }
661
+ },
622
662
  "node_modules/argparse": {
623
663
  "version": "2.0.1",
624
664
  "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -633,9 +673,9 @@
633
673
  "optional": true
634
674
  },
635
675
  "node_modules/b4a": {
636
- "version": "1.8.1",
637
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz",
638
- "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==",
676
+ "version": "1.9.0",
677
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.9.0.tgz",
678
+ "integrity": "sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==",
639
679
  "license": "Apache-2.0",
640
680
  "optional": true,
641
681
  "peerDependencies": {
@@ -663,9 +703,9 @@
663
703
  }
664
704
  },
665
705
  "node_modules/bare-fs": {
666
- "version": "4.8.1",
667
- "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.1.tgz",
668
- "integrity": "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==",
706
+ "version": "4.8.2",
707
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.2.tgz",
708
+ "integrity": "sha512-+ZI68KHMUvosXfKbg/UOHK0tbCdRnegbvPEdEcZ3Nd6TetieQsJPRXBRXPdLyy8+3VSEbPXtsumTpEtt78xv9w==",
669
709
  "license": "Apache-2.0",
670
710
  "optional": true,
671
711
  "dependencies": {
@@ -723,9 +763,9 @@
723
763
  }
724
764
  },
725
765
  "node_modules/bare-url": {
726
- "version": "2.5.3",
727
- "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.3.tgz",
728
- "integrity": "sha512-3absfEzoyFosWT8v83ZcJgbTJxv+S/sI7jBfeCMlUVatSaefRmwweqBhFpMllQv+HTxs/FbbToVOw1c05NORkQ==",
766
+ "version": "2.5.4",
767
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.4.tgz",
768
+ "integrity": "sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==",
729
769
  "license": "Apache-2.0",
730
770
  "optional": true,
731
771
  "dependencies": {
@@ -924,6 +964,12 @@
924
964
  "bare-events": "^2.7.0"
925
965
  }
926
966
  },
967
+ "node_modules/fast-deep-equal": {
968
+ "version": "3.1.3",
969
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
970
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
971
+ "license": "MIT"
972
+ },
927
973
  "node_modules/fast-fifo": {
928
974
  "version": "1.3.2",
929
975
  "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
@@ -931,6 +977,22 @@
931
977
  "license": "MIT",
932
978
  "optional": true
933
979
  },
980
+ "node_modules/fast-uri": {
981
+ "version": "3.1.8",
982
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
983
+ "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
984
+ "funding": [
985
+ {
986
+ "type": "github",
987
+ "url": "https://github.com/sponsors/fastify"
988
+ },
989
+ {
990
+ "type": "opencollective",
991
+ "url": "https://opencollective.com/fastify"
992
+ }
993
+ ],
994
+ "license": "BSD-3-Clause"
995
+ },
934
996
  "node_modules/fflate": {
935
997
  "version": "0.8.3",
936
998
  "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz",
@@ -1083,9 +1145,9 @@
1083
1145
  }
1084
1146
  },
1085
1147
  "node_modules/ip-address": {
1086
- "version": "10.7.0",
1087
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.0.tgz",
1088
- "integrity": "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==",
1148
+ "version": "10.7.2",
1149
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.2.tgz",
1150
+ "integrity": "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==",
1089
1151
  "license": "MIT",
1090
1152
  "optional": true,
1091
1153
  "engines": {
@@ -1103,9 +1165,9 @@
1103
1165
  }
1104
1166
  },
1105
1167
  "node_modules/jose": {
1106
- "version": "6.2.10",
1107
- "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz",
1108
- "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==",
1168
+ "version": "6.2.12",
1169
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz",
1170
+ "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==",
1109
1171
  "license": "MIT",
1110
1172
  "optional": true,
1111
1173
  "funding": {
@@ -1144,6 +1206,12 @@
1144
1206
  "node": ">= 10.16.0"
1145
1207
  }
1146
1208
  },
1209
+ "node_modules/json-schema-traverse": {
1210
+ "version": "1.0.0",
1211
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
1212
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
1213
+ "license": "MIT"
1214
+ },
1147
1215
  "node_modules/jsonpath-plus": {
1148
1216
  "version": "10.4.0",
1149
1217
  "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz",
@@ -1204,9 +1272,9 @@
1204
1272
  "optional": true
1205
1273
  },
1206
1274
  "node_modules/oauth4webapi": {
1207
- "version": "3.8.7",
1208
- "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.7.tgz",
1209
- "integrity": "sha512-4RxcKxXjuItDFZ20RRPf4YTw3kpeXJyCgJFxVzJ068A7PNJ18st2Dg90tlC1LkSDS0GecroagCLHYEIVUhCAkw==",
1275
+ "version": "3.8.8",
1276
+ "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.8.tgz",
1277
+ "integrity": "sha512-8N28E+a/oxfXWBgOMt+ZP/JUf/XR+IFbvkAEPP3gznXOMv9BpAAwiIj0TFNz3tGTPc0ZQ8zmWBNgN1nAys0gng==",
1210
1278
  "license": "MIT",
1211
1279
  "optional": true,
1212
1280
  "funding": {
@@ -1224,14 +1292,14 @@
1224
1292
  }
1225
1293
  },
1226
1294
  "node_modules/openid-client": {
1227
- "version": "6.8.7",
1228
- "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.8.7.tgz",
1229
- "integrity": "sha512-gtKthNu7evSBvTdrrlHb4F3Fi9dcwlb5QaITlCs+9mfpvuOi0Q3qtBf5+iY4sEP8hy1qCoAdxBNPDcmZeVSDzQ==",
1295
+ "version": "6.8.8",
1296
+ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.8.8.tgz",
1297
+ "integrity": "sha512-ZsucJA5Ad04Uv7YN4ql+s4GXNmb9uAYQwyJTsJx7CH/MX3JZioLE2pVKi1SC+YrbSLA4Px3Gi30dMjgOZtb6pA==",
1230
1298
  "license": "MIT",
1231
1299
  "optional": true,
1232
1300
  "dependencies": {
1233
- "jose": "^6.2.8",
1234
- "oauth4webapi": "^3.8.7"
1301
+ "jose": "^6.2.12",
1302
+ "oauth4webapi": "^3.8.8"
1235
1303
  },
1236
1304
  "funding": {
1237
1305
  "url": "https://github.com/sponsors/panva"
@@ -1260,6 +1328,15 @@
1260
1328
  "once": "^1.3.1"
1261
1329
  }
1262
1330
  },
1331
+ "node_modules/require-from-string": {
1332
+ "version": "2.0.2",
1333
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
1334
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
1335
+ "license": "MIT",
1336
+ "engines": {
1337
+ "node": ">=0.10.0"
1338
+ }
1339
+ },
1263
1340
  "node_modules/rfc4648": {
1264
1341
  "version": "1.5.4",
1265
1342
  "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz",
@@ -1279,9 +1356,9 @@
1279
1356
  }
1280
1357
  },
1281
1358
  "node_modules/socks": {
1282
- "version": "2.8.9",
1283
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz",
1284
- "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==",
1359
+ "version": "2.8.10",
1360
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz",
1361
+ "integrity": "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==",
1285
1362
  "license": "MIT",
1286
1363
  "optional": true,
1287
1364
  "dependencies": {
@@ -1410,9 +1487,9 @@
1410
1487
  }
1411
1488
  },
1412
1489
  "node_modules/undici": {
1413
- "version": "8.10.1",
1414
- "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.1.tgz",
1415
- "integrity": "sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==",
1490
+ "version": "8.11.2",
1491
+ "resolved": "https://registry.npmjs.org/undici/-/undici-8.11.2.tgz",
1492
+ "integrity": "sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==",
1416
1493
  "license": "MIT",
1417
1494
  "optional": true,
1418
1495
  "engines": {
@@ -1420,9 +1497,9 @@
1420
1497
  }
1421
1498
  },
1422
1499
  "node_modules/undici-types": {
1423
- "version": "8.3.0",
1424
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
1425
- "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
1500
+ "version": "8.9.0",
1501
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
1502
+ "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
1426
1503
  "license": "MIT",
1427
1504
  "optional": true
1428
1505
  },
@@ -1434,9 +1511,9 @@
1434
1511
  "optional": true
1435
1512
  },
1436
1513
  "node_modules/ws": {
1437
- "version": "8.21.3",
1438
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
1439
- "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
1514
+ "version": "8.22.0",
1515
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz",
1516
+ "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==",
1440
1517
  "license": "MIT",
1441
1518
  "optional": true,
1442
1519
  "engines": {
@@ -1,9 +1,9 @@
1
- # The k3d turnkey demo — behold's Kubernetes counterpart to Loom-on-Floci
1
+ # The k3d turnkey demo: `behold demo k8s`
2
2
 
3
3
  The smallest real thing on Kubernetes: one `nginx` Deployment + Service (+ a
4
4
  PodDisruptionBudget), deployed from the browser with the **▶ Deploy
5
5
  (k3d-apply)** header button, against a local, single-node
6
- [k3d](https://k3d.io) cluster — no cloud account, no credentials.
6
+ [k3d](https://k3d.io) cluster, no cloud account, no credentials.
7
7
 
8
8
  ```
9
9
  src/config.ts static config — app name, pinned image tag
@@ -11,7 +11,7 @@ src/web.ts WebApp composite → Deployment + Service + PodDisruptionB
11
11
  ops/k3d-apply.op.ts ApplyOp "k3d-apply" — code → local k3d, server-side apply
12
12
  base/ a plain Deployment + Service, core kinds only
13
13
  overlays/dev/ kustomize overlay over base/ — namePrefix "dev-" + a replica patch
14
- chant.config.ts lexicons [k8s, temporal], k8s.profiles.local bound to k3d-behold-k3d-demo,
14
+ chant.config.ts lexicons [k8s], k8s.profiles.local bound to k3d-behold-k3d-demo,
15
15
  k8s.kustomize.roots: ["overlays/dev"]
16
16
  scripts/local/ local-up.sh / local-down.sh — the k3d cluster's own lifecycle
17
17
  ```
@@ -21,7 +21,7 @@ renders it (`kustomize build`, `kubectl kustomize` fallback) at build time and
21
21
  joins the two rendered objects (`dev-echo` Deployment + Service) to the graph,
22
22
  each stamped with a `chant.intentius.io/kustomize-root: overlays/dev`
23
23
  annotation. behold's kustomize lens (behold#171/#217) reads that stamp and
24
- boxes them as `overlay dev` in the graph — the same lens a hand-rolled
24
+ boxes them as `overlay dev` in the graph, the same lens a hand-rolled
25
25
  `kustomization.yaml` next to typed source triggers via its directory walk, but
26
26
  here from chant's own provenance rather than file location. Kept to core/apps
27
27
  kinds on purpose: chant#1628 still mistypes a Flux/Argo/cert-manager CR
@@ -38,10 +38,10 @@ npm run demo:k8s
38
38
  ```
39
39
 
40
40
  That one command does two things: `scripts/local/local-up.sh` creates the
41
- cluster (idempotent — reuses one already up), then `behold serve --local`
41
+ cluster (idempotent, reusing one already up), then `behold serve --local`
42
42
  points its live overlay at it. `--local`'s usual boot step (`chant emulator
43
- up`) is a no-op here — chant's k8s lexicon has no local-emulator capability
44
- the way Floci does for aws — so the cluster comes up via the same generic
43
+ up`) is a no-op here, since chant's k8s lexicon has no local-emulator capability
44
+ the way Floci does for aws, so the cluster comes up via the same generic
45
45
  substrate **Bring up** mechanism the Floci demo's `scripts/local/local-up.sh`
46
46
  convention already uses (see `src/substrates.ts`), just run up front instead
47
47
  of from a click. Ctrl-C stops `behold serve` and tears the cluster back down;
@@ -49,14 +49,14 @@ Docker or k3d missing degrades to the source graph with a clear message
49
49
  instead of crashing.
50
50
 
51
51
  1. Open **http://localhost:4600**. The graph shows the Deployment, Service and
52
- PodDisruptionBudget — **blue** (declared, not yet deployed).
52
+ PodDisruptionBudget in **blue** (declared, not yet deployed).
53
53
  2. Click **▶ Deploy (k3d-apply)** in the header (or ⌘K → "Deploy: Sync"). The
54
54
  now-line streams Build → Plan (a live
55
55
  diff) → Apply: a Kubernetes **server-side apply**, field manager
56
- `chant:behold-k3d-demo` (chant#1074/#1075) — deletes are **owned-only**, a
56
+ `chant:behold-k3d-demo` (chant#1074/#1075). Deletes are **owned-only**, a
57
57
  marker-scoped prune that only ever touches what chant itself applied.
58
58
  3. The three nodes flip **blue → green (managed)**. Zoom in on the Deployment
59
- and its two Pods appear **nested underneath it** — the runtime tier
59
+ and its two Pods appear **nested underneath it**, the runtime tier
60
60
  (chant#1077/behold#86): live children a Deployment's controller created,
61
61
  never declared here, never classified as drift or an orphan.
62
62
 
@@ -66,16 +66,16 @@ behold's k8s parity (#85–#87) shipped against fixtures; this is it against a
66
66
  real cluster.
67
67
 
68
68
  **Declared, not yet deployed.** Before step 2, `/api/overlay` reports all
69
- three nodes `_status: accent` (pending) — chant knows about them, the cluster
69
+ three nodes `_status: accent` (pending): chant knows about them, the cluster
70
70
  doesn't yet.
71
71
 
72
72
  **Runtime children.** After apply, `/api/overlay`'s `ir.groups.byContainer`
73
- nests the Deployment's Pods under it, each `_status: runtime` — a tier below
73
+ nests the Deployment's Pods under it, each `_status: runtime`, a tier below
74
74
  what's declared, sourced from the cluster's own `ownerReferences`, that
75
75
  behold's zoom dial can descend into.
76
76
 
77
- **Managed-fields drift.** Scale or label the Deployment out of band —
78
- `kubectl scale deployment/web --replicas=3`, bypassing chant entirely — and
77
+ **Managed-fields drift.** Scale or label the Deployment out of band, and
78
+ `kubectl scale deployment/web --replicas=3`, bypassing chant entirely, and
79
79
  `/api/diff`'s `fieldDrift` reports `spec.replicas: { kind: "changed", declared:
80
80
  2, live: 3 }`: chant's own SSA-tracked field, now diverged from a competing
81
81
  field manager (`kubectl`, visible in `kubectl get deploy/web -o json`'s
@@ -94,16 +94,16 @@ stop owning them, and will contest them again on their next apply.
94
94
 
95
95
  — naming the contested path and the competing manager, and leaving the field
96
96
  alone rather than force-resolving it. (One honest gap found running this
97
- live: a **new** out-of-band key with no chant-declared counterpart at all —
97
+ live: a **new** out-of-band key with no chant-declared counterpart at all,
98
98
  `kubectl label deployment/web team=platform`, which has no corresponding
99
- `web.spec` field in `src/web.ts` — doesn't currently surface in `fieldDrift`,
99
+ `web.spec` field in `src/web.ts`, doesn't currently surface in `fieldDrift`,
100
100
  only a value change to a field chant *does* declare does. Worth a follow-up
101
101
  issue on the chant side; noted here rather than papered over.)
102
102
 
103
103
  **Unobserved.** `chant.config.ts` binds environment `local` to kubectl context
104
- `k3d-behold-k3d-demo` (chant#1100) — every read/apply checks that binding
104
+ `k3d-behold-k3d-demo` (chant#1100), every read/apply checks that binding
105
105
  against whatever context is actually ambient, and refuses rather than reading
106
- the wrong cluster. Switch away from it for a moment —
106
+ the wrong cluster. Switch away from it for a moment:
107
107
 
108
108
  ```sh
109
109
  kubectl config use-context <anything-else>
@@ -128,7 +128,7 @@ bash scripts/local/local-down.sh
128
128
  ## Note for chant#1179
129
129
 
130
130
  This Op's `delete: "owned-only"` exercises the same typed, marker-scoped
131
- prune path chant#1179 wants a live k3d E2E for. This demo isn't that test —
131
+ prune path chant#1179 wants a live k3d E2E for. This demo isn't that test;
132
132
  it's a manual walkthrough, not an automated assertion of "exactly the orphan
133
- and nothing else was deleted" — but it does confirm the path runs against a
133
+ and nothing else was deleted", but it does confirm the path runs against a
134
134
  real cluster, not just `fakeCluster`.
@@ -9,7 +9,7 @@ import type { K8sChantConfig } from "@intentius/chant-lexicon-k8s";
9
9
  // "unobserved" step (README.md) is exactly that refusal, produced on purpose
10
10
  // by switching away from this context for a moment.
11
11
  export default {
12
- lexicons: ["k8s", "temporal"],
12
+ lexicons: ["k8s"],
13
13
  sourceDir: "src",
14
14
  environments: ["local"],
15
15
  ownership: { stack: "behold-k3d-demo", env: "local" },
@@ -1,4 +1,4 @@
1
- import { ApplyOp } from "@intentius/chant-lexicon-temporal";
1
+ import { ApplyOp } from "@intentius/chant/op";
2
2
 
3
3
  // code → local k3d (chant#704), no cloud account. scripts/local/local-up.sh
4
4
  // (run by `npm run demo:k8s` before behold starts serving) brings the cluster