@intentius/behold 0.7.0 → 0.9.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 (104) hide show
  1. package/AGENTS.md +94 -2
  2. package/README.md +133 -2
  3. package/demos.json +25 -1
  4. package/dist/cli.js +3176 -330
  5. package/example-argo-estate/README.md +71 -0
  6. package/example-argo-estate/app-a/chant.config.ts +18 -0
  7. package/example-argo-estate/app-a/manifests/app.yaml +54 -0
  8. package/example-argo-estate/app-a/package.json +13 -0
  9. package/example-argo-estate/app-a/src/app.ts +35 -0
  10. package/example-argo-estate/app-a/tsconfig.json +1 -0
  11. package/example-argo-estate/app-b/chant.config.ts +18 -0
  12. package/example-argo-estate/app-b/manifests/app.yaml +54 -0
  13. package/example-argo-estate/app-b/package.json +13 -0
  14. package/example-argo-estate/app-b/src/app.ts +34 -0
  15. package/example-argo-estate/app-b/tsconfig.json +1 -0
  16. package/example-argo-estate/control-plane/chant.config.ts +29 -0
  17. package/example-argo-estate/control-plane/package.json +13 -0
  18. package/example-argo-estate/control-plane/src/argo.ts +69 -0
  19. package/example-argo-estate/control-plane/tsconfig.json +1 -0
  20. package/example-argo-estate/package-lock.json +1949 -0
  21. package/example-argo-estate/package.json +10 -0
  22. package/example-carve/README.md +194 -0
  23. package/example-carve/app/chant.config.ts +6 -0
  24. package/example-carve/app/package-lock.json +1075 -0
  25. package/example-carve/app/package.json +13 -0
  26. package/example-carve/app/src/carved.ts +30 -0
  27. package/example-carve/app/tsconfig.json +1 -0
  28. package/example-carve/carve-report.json +872 -0
  29. package/example-carve/legacy-tf/cdn.tf +23 -0
  30. package/example-carve/legacy-tf/compute.tf +63 -0
  31. package/example-carve/legacy-tf/floci-override.tf.disabled +61 -0
  32. package/example-carve/legacy-tf/modules/cdn/main.tf +72 -0
  33. package/example-carve/legacy-tf/naming.tf +10 -0
  34. package/example-carve/legacy-tf/network.tf +119 -0
  35. package/example-carve/legacy-tf/observability.tf +18 -0
  36. package/example-carve/legacy-tf/outputs.tf +16 -0
  37. package/example-carve/legacy-tf/storage.tf +33 -0
  38. package/example-carve/legacy-tf/terraform.tfstate +602 -0
  39. package/example-carve/legacy-tf/versions.tf +40 -0
  40. package/example-flux-estate/README.md +22 -12
  41. package/example-flux-estate/app-a/package.json +2 -2
  42. package/example-flux-estate/app-a/src/app.ts +2 -1
  43. package/example-flux-estate/app-b/chant.config.ts +4 -3
  44. package/example-flux-estate/app-b/package.json +2 -2
  45. package/example-flux-estate/app-b/src/app.ts +5 -3
  46. package/example-flux-estate/control-plane/package.json +2 -2
  47. package/example-flux-estate/control-plane/src/flux.ts +10 -2
  48. package/example-flux-estate/package-lock.json +17 -17
  49. package/example-k8s/README.md +16 -2
  50. package/example-k8s/base/deployment.yaml +21 -0
  51. package/example-k8s/base/kustomization.yaml +3 -0
  52. package/example-k8s/base/service.yaml +12 -0
  53. package/example-k8s/chant.config.ts +10 -0
  54. package/example-k8s/overlays/dev/kustomization.yaml +6 -0
  55. package/example-k8s/package-lock.json +18 -18
  56. package/example-k8s/package.json +3 -3
  57. package/example-writes/package-lock.json +14 -14
  58. package/example-writes/package.json +3 -3
  59. package/package.json +9 -6
  60. package/web/app.js +1027 -42
  61. package/web/carve-steps.js +610 -0
  62. package/web/carve-steps.test.js +233 -0
  63. package/web/demos.js +71 -0
  64. package/web/demos.test.js +83 -0
  65. package/web/icons/cncf/argo.svg +1 -0
  66. package/web/icons/cncf/flux.svg +1 -0
  67. package/web/icons/cncf/helm.svg +1 -0
  68. package/web/icons/k8s/c-role.svg +1 -0
  69. package/web/icons/k8s/cm.svg +1 -0
  70. package/web/icons/k8s/crb.svg +1 -0
  71. package/web/icons/k8s/crd.svg +1 -0
  72. package/web/icons/k8s/cronjob.svg +1 -0
  73. package/web/icons/k8s/deploy.svg +1 -0
  74. package/web/icons/k8s/ds.svg +1 -0
  75. package/web/icons/k8s/ep.svg +1 -0
  76. package/web/icons/k8s/group.svg +1 -0
  77. package/web/icons/k8s/hpa.svg +1 -0
  78. package/web/icons/k8s/ing.svg +1 -0
  79. package/web/icons/k8s/job.svg +1 -0
  80. package/web/icons/k8s/limits.svg +1 -0
  81. package/web/icons/k8s/netpol.svg +1 -0
  82. package/web/icons/k8s/ns.svg +1 -0
  83. package/web/icons/k8s/pod.svg +1 -0
  84. package/web/icons/k8s/psp.svg +1 -0
  85. package/web/icons/k8s/pv.svg +1 -0
  86. package/web/icons/k8s/pvc.svg +1 -0
  87. package/web/icons/k8s/quota.svg +1 -0
  88. package/web/icons/k8s/rb.svg +1 -0
  89. package/web/icons/k8s/role.svg +1 -0
  90. package/web/icons/k8s/rs.svg +1 -0
  91. package/web/icons/k8s/sa.svg +1 -0
  92. package/web/icons/k8s/sc.svg +1 -0
  93. package/web/icons/k8s/secret.svg +1 -0
  94. package/web/icons/k8s/sts.svg +1 -0
  95. package/web/icons/k8s/svc.svg +1 -0
  96. package/web/icons/k8s/user.svg +1 -0
  97. package/web/icons/k8s/vol.svg +1 -0
  98. package/web/index.html +285 -85
  99. package/web/json-view.js +334 -0
  100. package/web/json-view.test.js +218 -0
  101. package/web/layout-store.js +278 -0
  102. package/web/layout-store.test.js +388 -0
  103. package/web/panel.js +28 -0
  104. package/web/theme.js +114 -6
@@ -3,15 +3,19 @@
3
3
  Three chant projects served as one composed estate:
4
4
 
5
5
  - **control-plane/** — the Flux machinery: a `GitRepository` pointing at
6
- behold's own public repo and one `Kustomization` per app. The reconcilers
7
- deploy the apps; this project never applies a workload itself.
6
+ behold's own public repo and one `Kustomization` per app, app-b's gated on
7
+ app-a's with `dependsOn` (behold#223). The reconcilers deploy the apps; this
8
+ project never applies a workload itself.
8
9
  - **app-a/** — a small web workload with explicit `metadata.namespace` on
9
10
  every object: the fully-resolved half.
10
11
  - **app-b/** — the same workload with **no** namespace anywhere: the control
11
12
  plane's `targetNamespace` stamps it at apply time. Idiomatic Flux, and the
12
- deliberate exhibit of behold's namespace-mismatch note (behold#192) a
13
- plain live read scopes to `default`, finds nothing, and behold explains the
14
- all-pending paint instead of letting it read as "not deployed".
13
+ deliberate exhibit of the estate namespace join (behold#221). Served alone,
14
+ app-b's live read scopes to `default`, finds nothing, and behold explains
15
+ the all-pending paint with the namespace-mismatch note (behold#192) instead
16
+ of letting it read as "not deployed". Served composed, the estate reads the
17
+ binding off the control plane's own `Kustomization` and scopes app-b's read
18
+ to `app-b` — the answer neither project holds by itself.
15
19
 
16
20
  ```sh
17
21
  npx @intentius/behold demo flux-estate
@@ -22,14 +26,20 @@ controllers straight from the pinned release manifest (no `flux` CLI needed),
22
26
  applies the control plane, waits for the reconcilers to deploy both apps from
23
27
  this repo, and serves the three projects composed. What to look at:
24
28
 
25
- - The **estate**: per-project boundary boxes, and the `sourceRef` edges wiring
26
- Kustomization → GitRepository across stacks.
29
+ - The **estate**: per-project boundary boxes, the `sourceRef` edges wiring
30
+ Kustomization → GitRepository across stacks, and the `dependsOn` edge from
31
+ app-b's Kustomization to app-a's — the estate's reconcile ordering.
27
32
  - The **overlay** (env `local`): app-a green, the control plane's CRs green,
28
- app-b pending **with the note explaining why**.
29
- - The **runtime tier** on the control plane alone
30
- (`behold serve control-plane --env local`, zoom: runtime): the workloads
31
- Flux deployed, attributed back to the declaring Kustomization via its
32
- labels (chant#1549).
33
+ and app-b green too — read in the namespace the control plane binds it to,
34
+ with a note naming where it looked. Serve `app-b` on its own to see the
35
+ same objects go pending, which is what the join is worth.
36
+ - The **runtime tier** (zoom: runtime), on the estate itself since behold#224:
37
+ the workloads Flux deployed, attributed back to the declaring Kustomization
38
+ via its labels (chant#1549) and boxed under it.
39
+ - The **logical lens** (zoom: logical): cluster ⊃ namespace boxes, with each
40
+ app's objects inside the namespace the control plane declared for them —
41
+ the view that only exists once the three projects are composed, since the
42
+ namespaces are declared in one project and filled from the others.
33
43
 
34
44
  The app `manifests/` are committed `chant build` output — Flux syncs them
35
45
  from GitHub `main`, so changes to an app's source need a rebuild
@@ -7,7 +7,7 @@
7
7
  "build": "chant build src -o manifests/app.yaml --format yaml"
8
8
  },
9
9
  "dependencies": {
10
- "@intentius/chant": "^0.44.2",
11
- "@intentius/chant-lexicon-k8s": "^0.44.2"
10
+ "@intentius/chant": "^0.44.6",
11
+ "@intentius/chant-lexicon-k8s": "^0.44.6"
12
12
  }
13
13
  }
@@ -1,7 +1,8 @@
1
1
  // App A: one small web workload, namespace declared EXPLICITLY on every
2
2
  // object. Contrast app-b, which leaves namespace to the control plane's
3
3
  // targetNamespace — the two apps together show both halves of the Flux
4
- // namespace story (behold#192).
4
+ // namespace story: behold#192's note when app-b is served alone, behold#221's
5
+ // estate join when the three projects are served composed.
5
6
  import { Deployment, Service } from "@intentius/chant-lexicon-k8s";
6
7
 
7
8
  const labels = { app: "app-a" };
@@ -4,9 +4,10 @@ import type { K8sChantConfig } from "@intentius/chant-lexicon-k8s";
4
4
  // App project B — the targetNamespace half of the estate: its objects declare
5
5
  // no metadata.namespace (see src/app.ts), so the control plane's
6
6
  // Kustomization stamps `app-b` at apply time. That is idiomatic Flux, AND it
7
- // means a plain live read scopes to `default` and finds nothing — behold's
8
- // namespace-mismatch note (behold#192) names exactly this, on purpose, in
9
- // this demo.
7
+ // means a live read of THIS PROJECT ALONE scopes to `default` and finds
8
+ // nothing — behold's namespace-mismatch note (behold#192) names exactly this,
9
+ // on purpose, in this demo. Composed with the control plane, behold joins the
10
+ // binding and reads `app-b` instead (behold#221).
10
11
  export default {
11
12
  lexicons: ["k8s"],
12
13
  sourceDir: "src",
@@ -7,7 +7,7 @@
7
7
  "build": "chant build src -o manifests/app.yaml --format yaml"
8
8
  },
9
9
  "dependencies": {
10
- "@intentius/chant": "^0.44.2",
11
- "@intentius/chant-lexicon-k8s": "^0.44.2"
10
+ "@intentius/chant": "^0.44.6",
11
+ "@intentius/chant-lexicon-k8s": "^0.44.6"
12
12
  }
13
13
  }
@@ -1,9 +1,11 @@
1
1
  // App B: same small workload as app-a, with NO metadata.namespace anywhere —
2
2
  // the control plane's Kustomization stamps targetNamespace: app-b at apply
3
3
  // time. Idiomatic Flux (that's what the field is for), and the deliberate
4
- // exhibit of behold's namespace-mismatch note (behold#192): a plain live read
5
- // scopes to `default`, finds nothing, and behold explains the all-pending
6
- // paint instead of letting it read as "not deployed".
4
+ // exhibit of behold's estate namespace join (behold#221): served ALONE this
5
+ // project's live read scopes to `default`, finds nothing, and behold explains
6
+ // the all-pending paint with its namespace-mismatch note (behold#192) rather
7
+ // than letting it read as "not deployed". Served COMPOSED, the estate reads
8
+ // the binding off ../../control-plane and scopes the read to `app-b`.
7
9
  import { Deployment, Service } from "@intentius/chant-lexicon-k8s";
8
10
 
9
11
  const labels = { app: "app-b" };
@@ -7,7 +7,7 @@
7
7
  "build": "chant build src -o dist/control-plane.yaml --format yaml"
8
8
  },
9
9
  "dependencies": {
10
- "@intentius/chant": "^0.44.2",
11
- "@intentius/chant-lexicon-k8s": "^0.44.2"
10
+ "@intentius/chant": "^0.44.6",
11
+ "@intentius/chant-lexicon-k8s": "^0.44.6"
12
12
  }
13
13
  }
@@ -3,8 +3,10 @@
3
3
  // Kustomization applies one app project's committed manifests into that app's
4
4
  // namespace via targetNamespace — which is why app-b's objects declare no
5
5
  // metadata.namespace (see ../../app-b/src/app.ts): Flux stamps it at apply
6
- // time. That is the normal Flux estate shape, and exactly the shape behold's
7
- // namespace-mismatch note (behold#192) exists to explain.
6
+ // time. That is the normal Flux estate shape the one behold#192's note
7
+ // explains for a project served alone, and the one behold#221's estate join
8
+ // resolves outright by reading `targetNamespace` off the Kustomizations
9
+ // below and scoping app-b's live read to it.
8
10
  //
9
11
  // scripts/estate-up.sh applies the BUILT form of this project (chant build →
10
12
  // dist/control-plane.yaml) once, after installing Flux; from then on the
@@ -39,6 +41,11 @@ export const appA = new Kustomization({
39
41
  },
40
42
  });
41
43
 
44
+ // app-b is the estate's second layer: Flux holds it back until app-a has
45
+ // applied cleanly. Nothing in app-b talks to app-a at runtime — the gate is
46
+ // here because a layered estate's ordering is its most load-bearing structure
47
+ // and the demo should show one (behold#223). Same field a real estate uses to
48
+ // put its platform layer ahead of its apps.
42
49
  export const appB = new Kustomization({
43
50
  metadata: { name: "app-b", namespace: "flux-system" },
44
51
  spec: {
@@ -47,5 +54,6 @@ export const appB = new Kustomization({
47
54
  targetNamespace: "app-b",
48
55
  sourceRef: { kind: "GitRepository", name: "behold" },
49
56
  path: "./example-flux-estate/app-b/manifests",
57
+ dependsOn: [{ name: "app-a" }],
50
58
  },
51
59
  });
@@ -14,22 +14,22 @@
14
14
  "app-a": {
15
15
  "name": "behold-example-flux-app-a",
16
16
  "dependencies": {
17
- "@intentius/chant": "^0.44.2",
18
- "@intentius/chant-lexicon-k8s": "^0.44.2"
17
+ "@intentius/chant": "^0.44.6",
18
+ "@intentius/chant-lexicon-k8s": "^0.44.6"
19
19
  }
20
20
  },
21
21
  "app-b": {
22
22
  "name": "behold-example-flux-app-b",
23
23
  "dependencies": {
24
- "@intentius/chant": "^0.44.2",
25
- "@intentius/chant-lexicon-k8s": "^0.44.2"
24
+ "@intentius/chant": "^0.44.6",
25
+ "@intentius/chant-lexicon-k8s": "^0.44.6"
26
26
  }
27
27
  },
28
28
  "control-plane": {
29
29
  "name": "behold-example-flux-control-plane",
30
30
  "dependencies": {
31
- "@intentius/chant": "^0.44.2",
32
- "@intentius/chant-lexicon-k8s": "^0.44.2"
31
+ "@intentius/chant": "^0.44.6",
32
+ "@intentius/chant-lexicon-k8s": "^0.44.6"
33
33
  }
34
34
  },
35
35
  "node_modules/@dagrejs/dagre": {
@@ -464,9 +464,9 @@
464
464
  }
465
465
  },
466
466
  "node_modules/@intentius/chant": {
467
- "version": "0.44.2",
468
- "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.2.tgz",
469
- "integrity": "sha512-qGt/eAteVO6R6UGDEo7QdlRL48lOiTnjYc58OLrxMfDJ1nxzQaDa68H7UnGytApQ1mOdLcEsK60lX8vnYYg0Nw==",
467
+ "version": "0.44.6",
468
+ "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.6.tgz",
469
+ "integrity": "sha512-VFqPKe2WsSAJoUvfyghVTlIcj+QRNn//JgSHToq6PDDuKPU7F34V/4f+EZpX4MF3gvwVkZc9d6FUwKio6t0uqg==",
470
470
  "license": "Apache-2.0",
471
471
  "dependencies": {
472
472
  "@dagrejs/dagre": "^3.0.0",
@@ -482,9 +482,9 @@
482
482
  }
483
483
  },
484
484
  "node_modules/@intentius/chant-k8s-client": {
485
- "version": "0.44.2",
486
- "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.44.2.tgz",
487
- "integrity": "sha512-97r6hXTwnSw2f2CDFCaBoKOs6J1VHj2l59vTvQ5Q+HFq1XPADilmRAcAq5vbcFFkIZbfbAe4JiRbMls0ATDW2w==",
485
+ "version": "0.44.6",
486
+ "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.44.6.tgz",
487
+ "integrity": "sha512-Do3zY0Bd2nIITDDrXYePwdOBdnNf59xn5J1aJA6gsg3dzXxR3dZ25YBAh+SQxKbRPuXIbu9rKd5lodaM8ZQDng==",
488
488
  "license": "Apache-2.0",
489
489
  "optional": true,
490
490
  "dependencies": {
@@ -492,19 +492,19 @@
492
492
  }
493
493
  },
494
494
  "node_modules/@intentius/chant-lexicon-k8s": {
495
- "version": "0.44.2",
496
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.44.2.tgz",
497
- "integrity": "sha512-w3OycY5D/dez3J+7L0NjxcEA4AjAVhfZHC9jeawei+vWo2cbN74H8RKRqS3WHdyqiaBWlyiJRuI+8lJxEVSzUA==",
495
+ "version": "0.44.6",
496
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.44.6.tgz",
497
+ "integrity": "sha512-JP2Lo4fFV7FPbSTHapKuDgpvrsm3dbNBT9pMW9NQB2MoE/ZkMGf3z3/wsPnygLdjbYq29abVYmw7DzPqBmA1tw==",
498
498
  "license": "Apache-2.0",
499
499
  "dependencies": {
500
500
  "@types/js-yaml": "^4.0.9",
501
501
  "js-yaml": "^4.1.1"
502
502
  },
503
503
  "optionalDependencies": {
504
- "@intentius/chant-k8s-client": "^0.44.2"
504
+ "@intentius/chant-k8s-client": "^0.44.6"
505
505
  },
506
506
  "peerDependencies": {
507
- "@intentius/chant": "^0.44.2",
507
+ "@intentius/chant": "^0.44.6",
508
508
  "typescript": "^5.9.3",
509
509
  "zod": "^4.3.6"
510
510
  }
@@ -6,13 +6,27 @@ PodDisruptionBudget), deployed from the browser with the **▶ Deploy
6
6
  [k3d](https://k3d.io) cluster — no cloud account, no credentials.
7
7
 
8
8
  ```
9
- src/config.ts static config — app name, pinned image tag
9
+ src/config.ts static config — app name, pinned image tag
10
10
  src/web.ts WebApp composite → Deployment + Service + PodDisruptionBudget
11
11
  ops/k3d-apply.op.ts ApplyOp "k3d-apply" — code → local k3d, server-side apply
12
- chant.config.ts lexicons [k8s, temporal], k8s.profiles.local bound to k3d-behold-k3d-demo
12
+ base/ a plain Deployment + Service, core kinds only
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,
15
+ k8s.kustomize.roots: ["overlays/dev"]
13
16
  scripts/local/ local-up.sh / local-down.sh — the k3d cluster's own lifecycle
14
17
  ```
15
18
 
19
+ `overlays/dev` is a real kustomize build root (chant#1626, chant 0.44.3): chant
20
+ renders it (`kustomize build`, `kubectl kustomize` fallback) at build time and
21
+ joins the two rendered objects (`dev-echo` Deployment + Service) to the graph,
22
+ each stamped with a `chant.intentius.io/kustomize-root: overlays/dev`
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
25
+ `kustomization.yaml` next to typed source triggers via its directory walk, but
26
+ here from chant's own provenance rather than file location. Kept to core/apps
27
+ kinds on purpose: chant#1628 still mistypes a Flux/Argo/cert-manager CR
28
+ rendered through a kustomize root.
29
+
16
30
  ## Run it
17
31
 
18
32
  From the **behold** repo root:
@@ -0,0 +1,21 @@
1
+ apiVersion: apps/v1
2
+ kind: Deployment
3
+ metadata:
4
+ name: echo
5
+ labels:
6
+ app: echo
7
+ spec:
8
+ replicas: 1
9
+ selector:
10
+ matchLabels:
11
+ app: echo
12
+ template:
13
+ metadata:
14
+ labels:
15
+ app: echo
16
+ spec:
17
+ containers:
18
+ - name: echo
19
+ image: nginxinc/nginx-unprivileged:1.27-alpine
20
+ ports:
21
+ - containerPort: 8080
@@ -0,0 +1,3 @@
1
+ resources:
2
+ - deployment.yaml
3
+ - service.yaml
@@ -0,0 +1,12 @@
1
+ apiVersion: v1
2
+ kind: Service
3
+ metadata:
4
+ name: echo
5
+ labels:
6
+ app: echo
7
+ spec:
8
+ selector:
9
+ app: echo
10
+ ports:
11
+ - port: 80
12
+ targetPort: 8080
@@ -17,5 +17,15 @@ export default {
17
17
  profiles: {
18
18
  local: { context: "k3d-behold-k3d-demo" },
19
19
  },
20
+ // chant#1626 (chant 0.44.3, behold#225): a real kustomize build root —
21
+ // `overlays/dev` layers a namePrefix and a replica patch onto `base/`.
22
+ // Rendered at build time and stamped with the
23
+ // `chant.intentius.io/kustomize-root` provenance annotation, which
24
+ // behold's kustomize lens (src/logical-kustomize.ts, #217) prefers over
25
+ // its directory-walk heuristic — the `overlay dev` box in the demo graph
26
+ // comes from this, not source-file location. Core/apps kinds only inside
27
+ // the root: chant#1628 still mistypes Flux/Argo/cert-manager CRs
28
+ // rendered through a kustomize build.
29
+ kustomize: { roots: ["overlays/dev"] },
20
30
  } satisfies K8sChantConfig,
21
31
  } satisfies ChantConfig;
@@ -0,0 +1,6 @@
1
+ resources:
2
+ - ../../base
3
+ namePrefix: dev-
4
+ replicas:
5
+ - name: echo
6
+ count: 2
@@ -6,9 +6,9 @@
6
6
  "": {
7
7
  "name": "behold-example-k8s",
8
8
  "dependencies": {
9
- "@intentius/chant": "^0.44.2",
10
- "@intentius/chant-lexicon-k8s": "^0.44.2",
11
- "@intentius/chant-lexicon-temporal": "^0.44.2"
9
+ "@intentius/chant": "^0.44.6",
10
+ "@intentius/chant-lexicon-k8s": "^0.44.6",
11
+ "@intentius/chant-lexicon-temporal": "^0.44.6"
12
12
  }
13
13
  },
14
14
  "node_modules/@dagrejs/dagre": {
@@ -443,9 +443,9 @@
443
443
  }
444
444
  },
445
445
  "node_modules/@intentius/chant": {
446
- "version": "0.44.2",
447
- "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.2.tgz",
448
- "integrity": "sha512-qGt/eAteVO6R6UGDEo7QdlRL48lOiTnjYc58OLrxMfDJ1nxzQaDa68H7UnGytApQ1mOdLcEsK60lX8vnYYg0Nw==",
446
+ "version": "0.44.6",
447
+ "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.6.tgz",
448
+ "integrity": "sha512-VFqPKe2WsSAJoUvfyghVTlIcj+QRNn//JgSHToq6PDDuKPU7F34V/4f+EZpX4MF3gvwVkZc9d6FUwKio6t0uqg==",
449
449
  "license": "Apache-2.0",
450
450
  "dependencies": {
451
451
  "@dagrejs/dagre": "^3.0.0",
@@ -461,9 +461,9 @@
461
461
  }
462
462
  },
463
463
  "node_modules/@intentius/chant-k8s-client": {
464
- "version": "0.44.2",
465
- "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.44.2.tgz",
466
- "integrity": "sha512-97r6hXTwnSw2f2CDFCaBoKOs6J1VHj2l59vTvQ5Q+HFq1XPADilmRAcAq5vbcFFkIZbfbAe4JiRbMls0ATDW2w==",
464
+ "version": "0.44.6",
465
+ "resolved": "https://registry.npmjs.org/@intentius/chant-k8s-client/-/chant-k8s-client-0.44.6.tgz",
466
+ "integrity": "sha512-Do3zY0Bd2nIITDDrXYePwdOBdnNf59xn5J1aJA6gsg3dzXxR3dZ25YBAh+SQxKbRPuXIbu9rKd5lodaM8ZQDng==",
467
467
  "license": "Apache-2.0",
468
468
  "optional": true,
469
469
  "dependencies": {
@@ -471,34 +471,34 @@
471
471
  }
472
472
  },
473
473
  "node_modules/@intentius/chant-lexicon-k8s": {
474
- "version": "0.44.2",
475
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.44.2.tgz",
476
- "integrity": "sha512-w3OycY5D/dez3J+7L0NjxcEA4AjAVhfZHC9jeawei+vWo2cbN74H8RKRqS3WHdyqiaBWlyiJRuI+8lJxEVSzUA==",
474
+ "version": "0.44.6",
475
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-k8s/-/chant-lexicon-k8s-0.44.6.tgz",
476
+ "integrity": "sha512-JP2Lo4fFV7FPbSTHapKuDgpvrsm3dbNBT9pMW9NQB2MoE/ZkMGf3z3/wsPnygLdjbYq29abVYmw7DzPqBmA1tw==",
477
477
  "license": "Apache-2.0",
478
478
  "dependencies": {
479
479
  "@types/js-yaml": "^4.0.9",
480
480
  "js-yaml": "^4.1.1"
481
481
  },
482
482
  "optionalDependencies": {
483
- "@intentius/chant-k8s-client": "^0.44.2"
483
+ "@intentius/chant-k8s-client": "^0.44.6"
484
484
  },
485
485
  "peerDependencies": {
486
- "@intentius/chant": "^0.44.2",
486
+ "@intentius/chant": "^0.44.6",
487
487
  "typescript": "^5.9.3",
488
488
  "zod": "^4.3.6"
489
489
  }
490
490
  },
491
491
  "node_modules/@intentius/chant-lexicon-temporal": {
492
- "version": "0.44.2",
493
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.44.2.tgz",
494
- "integrity": "sha512-0sHR116Z7mDRgJZudNGgITJs4GDwU5fLgOM6ruJ2u1uIehCd1CYGJ1P7nWtetr4FHfM9vn022iLuO194rvkwcA==",
492
+ "version": "0.44.6",
493
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.44.6.tgz",
494
+ "integrity": "sha512-Uta1NNOHjZpI04NLaB9lTjXxAlKM7TSRx4D6Yj76RyeSoIZzcvnFJ9lJjSaIGaN20rdjK1w43b8BxsLOZTrwyA==",
495
495
  "license": "Apache-2.0",
496
496
  "dependencies": {
497
497
  "@temporalio/common": "^1.17.2",
498
498
  "js-yaml": "^4.1.1"
499
499
  },
500
500
  "peerDependencies": {
501
- "@intentius/chant": "^0.44.2",
501
+ "@intentius/chant": "^0.44.6",
502
502
  "typescript": "^5.9.3",
503
503
  "zod": "^4.3.6"
504
504
  }
@@ -7,8 +7,8 @@
7
7
  "build": "./node_modules/.bin/chant build src --lexicon k8s -o app.yaml"
8
8
  },
9
9
  "dependencies": {
10
- "@intentius/chant": "^0.44.2",
11
- "@intentius/chant-lexicon-k8s": "^0.44.2",
12
- "@intentius/chant-lexicon-temporal": "^0.44.2"
10
+ "@intentius/chant": "^0.44.6",
11
+ "@intentius/chant-lexicon-k8s": "^0.44.6",
12
+ "@intentius/chant-lexicon-temporal": "^0.44.6"
13
13
  }
14
14
  }
@@ -6,9 +6,9 @@
6
6
  "": {
7
7
  "name": "behold-example-writes",
8
8
  "dependencies": {
9
- "@intentius/chant": "^0.44.2",
10
- "@intentius/chant-lexicon-aws": "^0.44.2",
11
- "@intentius/chant-lexicon-temporal": "^0.44.2"
9
+ "@intentius/chant": "^0.44.6",
10
+ "@intentius/chant-lexicon-aws": "^0.44.6",
11
+ "@intentius/chant-lexicon-temporal": "^0.44.6"
12
12
  }
13
13
  },
14
14
  "node_modules/@dagrejs/dagre": {
@@ -443,9 +443,9 @@
443
443
  }
444
444
  },
445
445
  "node_modules/@intentius/chant": {
446
- "version": "0.44.2",
447
- "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.2.tgz",
448
- "integrity": "sha512-qGt/eAteVO6R6UGDEo7QdlRL48lOiTnjYc58OLrxMfDJ1nxzQaDa68H7UnGytApQ1mOdLcEsK60lX8vnYYg0Nw==",
446
+ "version": "0.44.6",
447
+ "resolved": "https://registry.npmjs.org/@intentius/chant/-/chant-0.44.6.tgz",
448
+ "integrity": "sha512-VFqPKe2WsSAJoUvfyghVTlIcj+QRNn//JgSHToq6PDDuKPU7F34V/4f+EZpX4MF3gvwVkZc9d6FUwKio6t0uqg==",
449
449
  "license": "Apache-2.0",
450
450
  "dependencies": {
451
451
  "@dagrejs/dagre": "^3.0.0",
@@ -461,30 +461,30 @@
461
461
  }
462
462
  },
463
463
  "node_modules/@intentius/chant-lexicon-aws": {
464
- "version": "0.44.2",
465
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-aws/-/chant-lexicon-aws-0.44.2.tgz",
466
- "integrity": "sha512-TPlq70LqLB8KRYLup8njKJeLbQyjofVTvQy892HI2RkacyAohhWj65hxIDH7zbEbnONbfJpolxyaicAzDXmnuw==",
464
+ "version": "0.44.6",
465
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-aws/-/chant-lexicon-aws-0.44.6.tgz",
466
+ "integrity": "sha512-2qGwWFCRLkT9MD5YFnhnZOGDCqPZg9la4MM8szlX8QxFFoQjAulJ8e+vjeCGbWoB8nbSIQ9kJOX8Yn46Pm37iQ==",
467
467
  "license": "Apache-2.0",
468
468
  "dependencies": {
469
469
  "fflate": "^0.8.2",
470
470
  "js-yaml": "^4.1.0"
471
471
  },
472
472
  "peerDependencies": {
473
- "@intentius/chant": "^0.44.2",
473
+ "@intentius/chant": "^0.44.6",
474
474
  "typescript": "^5.9.3"
475
475
  }
476
476
  },
477
477
  "node_modules/@intentius/chant-lexicon-temporal": {
478
- "version": "0.44.2",
479
- "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.44.2.tgz",
480
- "integrity": "sha512-0sHR116Z7mDRgJZudNGgITJs4GDwU5fLgOM6ruJ2u1uIehCd1CYGJ1P7nWtetr4FHfM9vn022iLuO194rvkwcA==",
478
+ "version": "0.44.6",
479
+ "resolved": "https://registry.npmjs.org/@intentius/chant-lexicon-temporal/-/chant-lexicon-temporal-0.44.6.tgz",
480
+ "integrity": "sha512-Uta1NNOHjZpI04NLaB9lTjXxAlKM7TSRx4D6Yj76RyeSoIZzcvnFJ9lJjSaIGaN20rdjK1w43b8BxsLOZTrwyA==",
481
481
  "license": "Apache-2.0",
482
482
  "dependencies": {
483
483
  "@temporalio/common": "^1.17.2",
484
484
  "js-yaml": "^4.1.1"
485
485
  },
486
486
  "peerDependencies": {
487
- "@intentius/chant": "^0.44.2",
487
+ "@intentius/chant": "^0.44.6",
488
488
  "typescript": "^5.9.3",
489
489
  "zod": "^4.3.6"
490
490
  }
@@ -7,8 +7,8 @@
7
7
  "build": "./node_modules/.bin/chant build src --lexicon aws -o template.json"
8
8
  },
9
9
  "dependencies": {
10
- "@intentius/chant": "^0.44.2",
11
- "@intentius/chant-lexicon-aws": "^0.44.2",
12
- "@intentius/chant-lexicon-temporal": "^0.44.2"
10
+ "@intentius/chant": "^0.44.6",
11
+ "@intentius/chant-lexicon-aws": "^0.44.6",
12
+ "@intentius/chant-lexicon-temporal": "^0.44.6"
13
13
  }
14
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentius/behold",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "description": "behold — a live control plane on chant. See your whole estate (every substrate in one graph), coloured by drift; act through delegated, gated Ops.",
6
6
  "bin": {
@@ -13,6 +13,8 @@
13
13
  "example-writes",
14
14
  "example-k8s",
15
15
  "example-flux-estate",
16
+ "example-argo-estate",
17
+ "example-carve",
16
18
  "demos.json",
17
19
  "AGENTS.md"
18
20
  ],
@@ -24,18 +26,19 @@
24
26
  "dev": "tsx src/cli.ts",
25
27
  "demo": "npm --prefix example-writes install && tsx src/cli.ts serve example-writes --local --env prod",
26
28
  "demo:k8s": "bash example-k8s/scripts/local/local-up.sh; npm --prefix example-k8s install && tsx src/cli.ts serve example-k8s --local --env local; bash example-k8s/scripts/local/local-down.sh",
27
- "smoke:ui": "node smoke/ui-smoke.mjs",
29
+ "smoke:ui": "tsx smoke/ui-smoke.mjs",
28
30
  "tsc": "tsc --noEmit",
29
31
  "test": "vitest run",
30
- "build": "esbuild src/cli.ts --bundle --platform=node --format=esm --external:hono --external:@hono/node-server --external:@intentius/pinhole --outfile=dist/cli.js && chmod +x dist/cli.js",
32
+ "build": "esbuild src/cli.ts --bundle --platform=node --format=esm --external:hono --external:@hono/node-server --external:@intentius/pinhole --external:@kubernetes/client-node --outfile=dist/cli.js && chmod +x dist/cli.js",
31
33
  "prepare": "npm run build",
32
34
  "prepublishOnly": "npm run build"
33
35
  },
34
36
  "dependencies": {
35
- "@hono/node-server": "^1.13.0",
37
+ "@hono/node-server": "^2.0.5",
36
38
  "@intentius/chant": "^0.38.0",
37
- "@intentius/pinhole": "^0.2.5",
38
- "hono": "^4.6.0"
39
+ "@intentius/chant-k8s-client": "^0.44.5",
40
+ "@intentius/pinhole": "^0.3.3",
41
+ "hono": "^4.12.34"
39
42
  },
40
43
  "devDependencies": {
41
44
  "@types/node": "^22.0.0",