@intentius/chant-lexicon-k8s 0.57.0 → 0.59.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.
- package/dist/api/fake-cluster.d.ts +7 -6
- package/dist/api/fake-cluster.d.ts.map +1 -1
- package/dist/api/sweep-types.d.ts +1 -2
- package/dist/api/sweep-types.d.ts.map +1 -1
- package/dist/codegen/docs.d.ts.map +1 -1
- package/dist/composites/cron-schedule.d.ts +26 -0
- package/dist/composites/cron-schedule.d.ts.map +1 -0
- package/dist/composites/cron-workload.d.ts +1 -1
- package/dist/composites/cron-workload.d.ts.map +1 -1
- package/dist/composites/operator-stack.d.ts +20 -19
- package/dist/composites/operator-stack.d.ts.map +1 -1
- package/dist/config-schema.d.ts +3 -0
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config.d.ts +26 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/deep-observe-hooks.d.ts +4 -4
- package/dist/deep-observe.d.ts +23 -16
- package/dist/deep-observe.d.ts.map +1 -1
- package/dist/describe-resources.d.ts.map +1 -1
- package/dist/effect-receipt-row.d.ts +164 -0
- package/dist/effect-receipt-row.d.ts.map +1 -0
- package/dist/export-resources.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/integrity.json +4 -4
- package/dist/lint/audit-catalog.d.ts.map +1 -1
- package/dist/lint/audit-lineage.d.ts +10 -0
- package/dist/lint/audit-lineage.d.ts.map +1 -0
- package/dist/lint/post-synth/wk8505.d.ts +3 -1
- package/dist/lint/post-synth/wk8505.d.ts.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/okf/index.md +1 -1
- package/dist/okf/rules/WK8505.md +2 -2
- package/dist/okf/types/Kustomization.md +1 -1
- package/dist/op/activities/argo.d.ts +4 -4
- package/dist/op/activities/argo.d.ts.map +1 -1
- package/dist/op/activities/index.d.ts +15 -7
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/kubectl.d.ts +7 -7
- package/dist/op/activities/kubectl.d.ts.map +1 -1
- package/dist/op/activities/wait-for-ready.d.ts +6 -5
- package/dist/op/activities/wait-for-ready.d.ts.map +1 -1
- package/dist/op/builders.d.ts +13 -13
- package/dist/plugin.d.ts.map +1 -1
- package/dist/receipt-store.d.ts +113 -0
- package/dist/receipt-store.d.ts.map +1 -0
- package/dist/rules/wk8505.ts +4 -2
- package/dist/serializer.d.ts.map +1 -1
- package/dist/skills/chant-k8s-argo.md +27 -13
- package/dist/subscribe-changes.d.ts +84 -0
- package/dist/subscribe-changes.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/api/fake-cluster.ts +17 -4
- package/src/api/sweep-types.ts +1 -2
- package/src/codegen/docs.ts +7 -0
- package/src/composites/composites.test.ts +72 -3
- package/src/composites/cron-schedule.ts +47 -0
- package/src/composites/cron-workload.ts +4 -1
- package/src/composites/operator-stack.ts +25 -24
- package/src/config-schema.ts +5 -0
- package/src/config.ts +27 -4
- package/src/crd/crd-sources.ts +4 -4
- package/src/deep-observe-hooks.ts +4 -4
- package/src/deep-observe.test.ts +219 -46
- package/src/deep-observe.ts +54 -28
- package/src/describe-resources.ts +31 -7
- package/src/effect-receipt-row.test.ts +285 -0
- package/src/effect-receipt-row.ts +268 -0
- package/src/export-resources.ts +1 -1
- package/src/index.ts +22 -0
- package/src/lint/audit-catalog.ts +6 -2
- package/src/lint/audit-lineage.ts +127 -0
- package/src/lint/post-synth/wk8505.ts +4 -2
- package/src/op/activities/argo.test.ts +7 -8
- package/src/op/activities/argo.ts +4 -4
- package/src/op/activities/index.ts +23 -7
- package/src/op/activities/kubectl.test.ts +43 -4
- package/src/op/activities/kubectl.ts +67 -67
- package/src/op/activities/wait-for-ready.test.ts +2 -2
- package/src/op/activities/wait-for-ready.ts +7 -7
- package/src/op/builders.ts +13 -13
- package/src/plugin.ts +16 -1
- package/src/receipt-store.test.ts +380 -0
- package/src/receipt-store.ts +290 -0
- package/src/serializer.test.ts +26 -0
- package/src/serializer.ts +92 -1
- package/src/skills/chant-k8s-argo.md +27 -13
- package/src/subscribe-changes.test.ts +368 -0
- package/src/subscribe-changes.ts +210 -0
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAcrC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1H,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGlI,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC5G,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAGrF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/integrity.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"algorithm": "sha256",
|
|
3
3
|
"artifacts": {
|
|
4
|
-
"manifest.json": "
|
|
4
|
+
"manifest.json": "e6462e0737c2379da42f1c15509b9170a0006a5dedacae41cedcd276b19847cb",
|
|
5
5
|
"meta.json": "8b999bc142f448b0b627ecdc9e2388bbe672c8a1f7aae5303135624cf2fe65e3",
|
|
6
6
|
"types/index.d.ts": "5f67de738adb455805e72600948940af9c664283785fb68c9fd8f5ea90d42cc3",
|
|
7
7
|
"rules/argo-appset-single-project.ts": "afa9f310753aa2d475f35012b13135b2dfaebed2a35d44edbe185ebc07673674",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"rules/wk8502.ts": "c13813543b4ec42b9b87d2ebfe20bae3e6e954a8d7c4e9387581a753484aa778",
|
|
55
55
|
"rules/wk8503.ts": "4ee80ded81a0b2cff24013b300ee3fcadbfd29e20346b964a97e557afa1147f3",
|
|
56
56
|
"rules/wk8504.ts": "b1dd7689e37f788fb4524c42254d5d99048a38203643a405f25383ac21b74e36",
|
|
57
|
-
"rules/wk8505.ts": "
|
|
57
|
+
"rules/wk8505.ts": "b866168e8c8ed55edb5d69666258cdb6c4a2e2db3e41951a59fe54fd7d5bda5b",
|
|
58
58
|
"skills/chant-k8s.md": "222268f9e6b19912ece4b066d8897f009b90a3fe6f14e9c5059d0717e7ee0f82",
|
|
59
59
|
"skills/chant-k8s-patterns.md": "683148e9f0f9da6879bd65d97c82cc29dbff897e31bc11b3c1de654cd6baeea3",
|
|
60
60
|
"skills/chant-k8s-deployment-strategies.md": "c4cc93cba064230567baa755b5a3493dc69bfc6e74a62e1990d12039ffaaf5f8",
|
|
@@ -62,8 +62,8 @@
|
|
|
62
62
|
"skills/chant-k8s-eks.md": "9e953d6a2c39518c4b797a2bf54ff5b4a33530503e5b6d66e35921e8f952432f",
|
|
63
63
|
"skills/chant-k8s-gke.md": "8938840bf9ef5ed58d6333fdd773b3dd54ecaf25a9df35e58f7f5c3355d4928f",
|
|
64
64
|
"skills/chant-k8s-aks.md": "e18f0e2b055f72cd7a37deaf258d7027c2d4d3e286e8fd4975b27a1f981a3ad9",
|
|
65
|
-
"skills/chant-k8s-argo.md": "
|
|
65
|
+
"skills/chant-k8s-argo.md": "24c9a85b78a2fc5c6657424baac9cc6d6caff6f47605b8146b2c0082133181cf",
|
|
66
66
|
"skills/chant-k8s-flux.md": "9670efc2e9854bd14686b5adeb707396b9030a4dcaee6529b30abf56efe2c50c"
|
|
67
67
|
},
|
|
68
|
-
"composite": "
|
|
68
|
+
"composite": "505afb4698c52323d63b02081ac0236e2f96367a213c0259d1b9e9527ba0a7f4"
|
|
69
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqD,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqD,KAAK,QAAQ,EAAgB,MAAM,gCAAgC,CAAC;AAGhI,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAyCpD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prior art for these audit rules: the open-source tools whose checks cover the
|
|
3
|
+
* same condition, credited per rule. See packages/core/src/audit/prior-art.ts for
|
|
4
|
+
* the registry, the relation vocabulary, and why this is credit rather than
|
|
5
|
+
* authority. Kept by hand; the prior-art sweep (scripts/prior-art-sweep.ts) reports
|
|
6
|
+
* when a credited tool's index no longer lists a rule cited here.
|
|
7
|
+
*/
|
|
8
|
+
import type { Lineage } from "@intentius/chant/audit/catalog";
|
|
9
|
+
export declare const k8sAuditLineage: Record<string, Lineage[]>;
|
|
10
|
+
//# sourceMappingURL=audit-lineage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-lineage.d.ts","sourceRoot":"","sources":["../../src/lint/audit-lineage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAE9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAqHrD,CAAC"}
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
* invocations, so "no Kustomization in THIS build sets spec.decryption" can
|
|
16
16
|
* mean "wired up in the other build" as easily as "forgotten" — the design
|
|
17
17
|
* doc's §4 explains why no path-to-build-target join exists to tell those
|
|
18
|
-
* apart.
|
|
18
|
+
* apart. Single-build-root scoped, tracked by chant #1939 as a candidate for
|
|
19
|
+
* an opt-in project-level mode; promote to error if that join ever becomes
|
|
20
|
+
* available.
|
|
19
21
|
*
|
|
20
22
|
* Fires only on claims that actually resolved (`problems.length === 0`, via
|
|
21
23
|
* `resolveEncryptedSecretClaims`), not on every raw declaration. An
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wk8505.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/wk8505.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wk8505.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/wk8505.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,cAAc,EAAyC,MAAM,kCAAkC,CAAC;AAa9G,eAAO,MAAM,MAAM,EAAE,cAwBpB,CAAC"}
|
package/dist/manifest.json
CHANGED
package/dist/okf/index.md
CHANGED
|
@@ -279,4 +279,4 @@ okf_version: '0.2'
|
|
|
279
279
|
* [WK8502](/rules/WK8502.md) - Custom resource spec field has the wrong type or a value outside its enum
|
|
280
280
|
* [WK8503](/rules/WK8503.md) - Workload consumes a Secret nothing in the output produces — produce it (Secret, ExternalSecret, InfisicalSecret, Certificate) or declare its provenance with...
|
|
281
281
|
* [WK8504](/rules/WK8504.md) - committed-encrypted secret declaration does not resolve — the declared file is missing, is not the named Secret, or is not encrypted
|
|
282
|
-
* [WK8505](/rules/WK8505.md) - committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it
|
|
282
|
+
* [WK8505](/rules/WK8505.md) - committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it. Sees one build roo...
|
package/dist/okf/rules/WK8505.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: post-synth-check
|
|
3
3
|
title: WK8505
|
|
4
|
-
description: 'committed-encrypted secret with no Flux decryption wiring — add decryption: ''sops'' to the FluxAppFor reconciling the path that carries it'
|
|
4
|
+
description: 'committed-encrypted secret with no Flux decryption wiring — add decryption: ''sops'' to the FluxAppFor reconciling the path that carries it. Sees one build root at a time, so it goes silent when that...'
|
|
5
5
|
id: WK8505
|
|
6
6
|
severity: error
|
|
7
7
|
category: post-synth
|
|
8
8
|
lexicon: k8s
|
|
9
9
|
docs: https://intentius.io/chant/lexicons/k8s/rules/
|
|
10
10
|
---
|
|
11
|
-
committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it
|
|
11
|
+
committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it. Sees one build root at a time, so it goes silent when that Kustomization lives in a different build root (chant #1939).
|
|
12
12
|
|
|
13
13
|
## Applies to
|
|
14
14
|
|
|
@@ -18,4 +18,4 @@ resource_type: K8s::Flux::Kustomization
|
|
|
18
18
|
- [FLUX001](/rules/FLUX001.md): GitRepository must pin spec.ref
|
|
19
19
|
- [FLUX002](/rules/FLUX002.md): Kustomization.spec.sourceRef must reference a declared source (or the bootstrap flux-system repo)
|
|
20
20
|
- [FLUX003](/rules/FLUX003.md): Kustomization.spec.dependsOn entries should name Kustomizations declared in the build
|
|
21
|
-
- [WK8505](/rules/WK8505.md): committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it
|
|
21
|
+
- [WK8505](/rules/WK8505.md): committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it. Sees one build root at a time, so it goes silent when that Kustomization lives in a different build root (chant #1939).
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* `ResourceFetcher` for `waitForReady`.
|
|
11
11
|
*
|
|
12
12
|
* It stays **dependency-light** — primitives-only signature (app name /
|
|
13
|
-
* namespace / server), no generated Argo CRD types — so
|
|
14
|
-
*
|
|
13
|
+
* namespace / server), no generated Argo CRD types — so importing the lexicon's
|
|
14
|
+
* activity module at run time stays cheap.
|
|
15
15
|
*/
|
|
16
16
|
export interface WaitForArgoSyncArgs {
|
|
17
17
|
/** Argo Application name. */
|
|
@@ -29,7 +29,7 @@ export interface WaitForArgoSyncArgs {
|
|
|
29
29
|
insecure?: boolean;
|
|
30
30
|
/** kubectl context (used when `server` is not set). */
|
|
31
31
|
context?: string;
|
|
32
|
-
/** Poll interval in ms (default 15000).
|
|
32
|
+
/** Poll interval in ms (default 15000). */
|
|
33
33
|
intervalMs?: number;
|
|
34
34
|
}
|
|
35
35
|
/** The two status fields the activity gates on. */
|
|
@@ -52,7 +52,7 @@ export declare const defaultArgoStatusFetcher: ArgoStatusFetcher;
|
|
|
52
52
|
* `ArgoSyncFailedError` if it reaches a terminal unhealthy state (Degraded /
|
|
53
53
|
* Missing).
|
|
54
54
|
*
|
|
55
|
-
* Delegates the poll loop
|
|
55
|
+
* Delegates the poll loop and the ready/terminal evaluation to the
|
|
56
56
|
* generic `waitForReady` using the shared `argoproj.io/Application` readiness
|
|
57
57
|
* spec. The Argo `ArgoStatusFetcher` is adapted into a `ResourceFetcher` that
|
|
58
58
|
* shapes `{health, sync}` into the `status.health.status` / `status.sync.status`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argo.d.ts","sourceRoot":"","sources":["../../../src/op/activities/argo.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,
|
|
1
|
+
{"version":3,"file":"argo.d.ts","sourceRoot":"","sources":["../../../src/op/activities/argo.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,4EAA4E;AAC5E,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA4CD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,EAAE,iBACkC,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,iBAA4C,GACpD,OAAO,CAAC,aAAa,CAAC,CAkCxB"}
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* k8s Op activities — resolved by the core activity registry when a project's
|
|
3
|
-
* `chant.config.ts` lists the `k8s` lexicon. Relocated from the
|
|
3
|
+
* `chant.config.ts` lists the `k8s` lexicon. Relocated from the hosting lexicon
|
|
4
4
|
* (#809) so Kubernetes-facing imperative activities live with their product:
|
|
5
5
|
* - kubectlApply — server-side apply a rendered manifest (and, since chant
|
|
6
6
|
* #1075, prune chant-owned objects it no longer declares; `applyManifest`
|
|
7
|
-
* is the same work with a report of what it did, which is what
|
|
8
|
-
*
|
|
7
|
+
* is the same work with a report of what it did, which is what core's
|
|
8
|
+
* `nativeApply` dispatcher calls for a kubectl target)
|
|
9
9
|
* - waitForArgoSync — block until an Argo CD Application is Healthy && Synced
|
|
10
10
|
*
|
|
11
11
|
* k3dUp / k3dDown moved again, to the k3d lexicon (chant #1410) — a lexicon
|
|
12
12
|
* owns its own product's activities, and k3d is its own product now. Projects
|
|
13
13
|
* using them list `k3d` in `lexicons`; loadActivities(["k3d"]) provides them.
|
|
14
14
|
*
|
|
15
|
-
* The step builders (kubectlApply, k3dUp, k3dDown) stay in core
|
|
16
|
-
*
|
|
17
|
-
* dependency-light — it shells out to a CLI and does not import the
|
|
18
|
-
* surface — so
|
|
15
|
+
* The step builders (kubectlApply, k3dUp, k3dDown) stay in core and reach
|
|
16
|
+
* authors through `@intentius/chant/op` like the other core builders. Each
|
|
17
|
+
* activity is dependency-light — it shells out to a CLI and does not import the
|
|
18
|
+
* k8s declarable surface — so `loadActivities`
|
|
19
|
+
* (`packages/core/src/op/activity-registry.ts`), which imports this module at
|
|
20
|
+
* run time, pulls in nothing expensive.
|
|
19
21
|
*/
|
|
20
22
|
export { kubectlApply, applyManifest, readManifestDocuments } from "./kubectl.js";
|
|
21
23
|
export type { KubectlApplyArgs, ApplyManifestResult, AppliedRef, ApplyDeleteMode } from "./kubectl.js";
|
|
@@ -27,4 +29,10 @@ export { waitForReady, defaultResourceFetcher, apiResourceFetcher, ReadinessFail
|
|
|
27
29
|
export type { WaitForReadyArgs, ResourceFetcher, ReadinessSpec, ReadinessMatch, ConditionMatch, PathMatch, } from "./wait-for-ready.js";
|
|
28
30
|
export { resolveClusterTarget, ClusterBindingMismatchError } from "@intentius/chant/kubectl-context";
|
|
29
31
|
export type { ResolvedClusterTarget, K8sClusterProfile, K8sConfigShape } from "@intentius/chant/kubectl-context";
|
|
32
|
+
export declare const receiptRead: (args: import("@intentius/chant/op/receipt-store").ReceiptReadArgs, signal?: AbortSignal) => Promise<import("@intentius/chant/op/receipt-store").ReceiptReadResult>;
|
|
33
|
+
export declare const receiptWrite: (args: import("@intentius/chant/op/receipt-store").ReceiptWriteArgs, signal?: AbortSignal) => Promise<{
|
|
34
|
+
written: true;
|
|
35
|
+
receipt: string;
|
|
36
|
+
}>;
|
|
37
|
+
export declare const receiptStaleness: (args: import("@intentius/chant/op/receipt-store").ReceiptStalenessArgs, signal?: AbortSignal) => Promise<import("@intentius/chant/op/receipt-store").ReceiptStalenessResult>;
|
|
30
38
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAMpG,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAEpF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAS,GACV,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACrG,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAYjH,eAAO,MAAM,WAAW,qKAAqC,CAAC;AAC9D,eAAO,MAAM,YAAY;;;EAAsC,CAAC;AAChE,eAAO,MAAM,gBAAgB,+KAA0C,CAAC"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* chant #1074 moved this off `kubectl apply -f`. The activity contract is
|
|
5
5
|
* unchanged (a manifest path, an optional context, `Promise<void>`, the
|
|
6
|
-
* `longInfra` profile
|
|
7
|
-
*
|
|
8
|
-
* reason.
|
|
6
|
+
* `longInfra` profile) because an Op step names the activity by its export
|
|
7
|
+
* name and core's registry resolves it there; what changed is underneath. The
|
|
8
|
+
* name is kept for the same reason.
|
|
9
9
|
*
|
|
10
10
|
* chant #1075 finished the job on two axes:
|
|
11
11
|
*
|
|
@@ -35,14 +35,14 @@ import { type K8sConnector } from "../../api/connect.js";
|
|
|
35
35
|
/**
|
|
36
36
|
* How the apply treats chant-owned objects that are no longer declared. The
|
|
37
37
|
* same three values `nativeApply` has always taken; `gated` differs from
|
|
38
|
-
* `owned-only` only in that
|
|
39
|
-
* the composite's business, not this activity's.
|
|
38
|
+
* `owned-only` only in that an approval gate runs before this activity does,
|
|
39
|
+
* which is the composite's business, not this activity's.
|
|
40
40
|
*/
|
|
41
41
|
export type ApplyDeleteMode = "never" | "owned-only" | "gated";
|
|
42
42
|
export interface KubectlApplyArgs {
|
|
43
43
|
/**
|
|
44
44
|
* Path to a manifest file, or a directory of them. With `documents` given,
|
|
45
|
-
* this becomes only the human-facing label the
|
|
45
|
+
* this becomes only the human-facing label the step's log lines carry
|
|
46
46
|
* (e.g. `kustomize:<dir>`), and nothing is read from disk.
|
|
47
47
|
*/
|
|
48
48
|
manifest: string;
|
|
@@ -151,7 +151,7 @@ export declare function resolveFieldManager(args: KubectlApplyArgs): Promise<str
|
|
|
151
151
|
export declare function applyManifest(args: KubectlApplyArgs, signal?: AbortSignal, connect?: K8sConnector): Promise<ApplyManifestResult>;
|
|
152
152
|
/**
|
|
153
153
|
* Apply every document in `args.manifest`.
|
|
154
|
-
* Uses longInfra profile
|
|
154
|
+
* Uses the longInfra profile: 20m timeout, three attempts backing off from 30s.
|
|
155
155
|
*/
|
|
156
156
|
export declare function kubectlApply(args: KubectlApplyArgs, signal?: AbortSignal, connect?: K8sConnector): Promise<void>;
|
|
157
157
|
//# sourceMappingURL=kubectl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kubectl.d.ts","sourceRoot":"","sources":["../../../src/op/activities/kubectl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;
|
|
1
|
+
{"version":3,"file":"kubectl.d.ts","sourceRoot":"","sources":["../../../src/op/activities/kubectl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAWH,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAM3E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,sFAAsF;IACtF,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAiB7E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjF;AAqHD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAqD9B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -4,8 +4,8 @@ import { type K8sConnector } from "../../api/connect.js";
|
|
|
4
4
|
* ready, driven by a data-only **readiness spec** rather than per-CRD code.
|
|
5
5
|
*
|
|
6
6
|
* Like `waitForArgoSync`, this activity is intentionally **dependency-light**:
|
|
7
|
-
* its signature is primitives + a plain readiness spec, so
|
|
8
|
-
* loads
|
|
7
|
+
* its signature is primitives + a plain readiness spec, so the activity module
|
|
8
|
+
* loads without pulling in the generated CRD declarable surface. It reads the
|
|
9
9
|
* resource and evaluates the spec's predicates. It generalizes the bespoke
|
|
10
10
|
* `waitForArgoSync` / `waitForStack` waits — see #365.
|
|
11
11
|
*
|
|
@@ -99,7 +99,7 @@ export interface WaitForReadyArgs {
|
|
|
99
99
|
group?: string;
|
|
100
100
|
/** Explicit readiness spec — wins over the registry/default. */
|
|
101
101
|
spec?: ReadinessSpec;
|
|
102
|
-
/** Poll interval in ms (default 15000).
|
|
102
|
+
/** Poll interval in ms (default 15000). */
|
|
103
103
|
intervalMs?: number;
|
|
104
104
|
}
|
|
105
105
|
/** Pluggable resource reader — overridden in tests with a fake. */
|
|
@@ -121,8 +121,9 @@ export declare function apiResourceFetcher(connect?: K8sConnector): ResourceFetc
|
|
|
121
121
|
export declare const defaultResourceFetcher: ResourceFetcher;
|
|
122
122
|
/**
|
|
123
123
|
* Poll until the resource satisfies its readiness spec. Throws
|
|
124
|
-
* `ReadinessFailedError` on a terminal state
|
|
125
|
-
*
|
|
124
|
+
* `ReadinessFailedError` on a terminal state, which the `k8sWait` profile lists
|
|
125
|
+
* as non-retryable, so a resource that will never become ready fails on the
|
|
126
|
+
* first attempt instead of burning the profile's 15m timeout three times.
|
|
126
127
|
*
|
|
127
128
|
* @param fetcher injectable reader (defaults to kubectl). Tests pass a fake to
|
|
128
129
|
* drive not-ready → ready / terminal transitions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-for-ready.d.ts","sourceRoot":"","sources":["../../../src/op/activities/wait-for-ready.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;;;;;;;;;;;;;;;;GAiBG;AAIH,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAEhC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,SAAS,GAAG,oBAAoB,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAG/B,CAAC;AA4CF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA2C7D,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAEnF;AAyDD,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAGlE;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAE3F;AAID,6EAA6E;AAC7E,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"wait-for-ready.d.ts","sourceRoot":"","sources":["../../../src/op/activities/wait-for-ready.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;;;;;;;;;;;;;;;;GAiBG;AAIH,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAEhC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,SAAS,GAAG,oBAAoB,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAG/B,CAAC;AA4CF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA2C7D,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAEnF;AAyDD,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAGlE;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAE3F;AAID,6EAA6E;AAC7E,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG,CAC5B,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtC;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,YAAkC,GAAG,eAAe,CAmC/F;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,eAAsE,CAAC;AAE5G;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,eAAsC,GAC9C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsBlC"}
|
package/dist/op/builders.d.ts
CHANGED
|
@@ -18,20 +18,20 @@
|
|
|
18
18
|
* earlier step's declared output.
|
|
19
19
|
*
|
|
20
20
|
* `core`'s own `kubectlApply`/`waitForReady`/`ensureSecret` (in
|
|
21
|
-
* `@intentius/chant/op`,
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
21
|
+
* `@intentius/chant/op`, the lexicon-agnostic single-import barrel) are
|
|
22
|
+
* UNCHANGED and produce byte-identical `ActivityStep` output for the same
|
|
23
|
+
* inputs — these are purely additive. Deliberately not swapped into core's
|
|
24
|
+
* barrel: that would make `@intentius/chant` depend on this package (and on
|
|
25
|
+
* helm, for `helmInstall`) at runtime, so a project that never touches
|
|
26
|
+
* Kubernetes would install both just to import anything from `op`. That is
|
|
27
|
+
* exactly the "core stays product-agnostic" property the
|
|
28
28
|
* `op/activities/index.ts` module docs across this repo call out on purpose
|
|
29
|
-
* (activities
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* already depends on; existing `@intentius/chant
|
|
34
|
-
*
|
|
29
|
+
* (activities live in per-product lexicons for this reason; the step-builder
|
|
30
|
+
* layer shouldn't reintroduce the coupling from the other direction). An
|
|
31
|
+
* author who wants the typed surface imports it from here —
|
|
32
|
+
* `@intentius/chant-lexicon-k8s` — which a project using `kubectlApply`
|
|
33
|
+
* already depends on; existing `@intentius/chant/op` imports keep working
|
|
34
|
+
* exactly as before, opting in only if the import is changed.
|
|
35
35
|
*/
|
|
36
36
|
import { type ActivityStep, type NamedActivityStep, type WithStepRefs } from "@intentius/chant/op";
|
|
37
37
|
import type { KubectlApplyArgs } from "./activities/kubectl.js";
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,0BAA0B,CAAC;AA6BjG,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,0BAA0B,CAAC;AA6BjG,eAAO,MAAM,SAAS,EAAE,aA6tBvB,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The k8s `ReceiptStore` (#2074, epic #1703): core's injectable receipt seam
|
|
3
|
+
* (#1834, `@intentius/chant/op/receipt-store`) implemented over a core
|
|
4
|
+
* `ConfigMap`, at the address ./effect-receipt-row.ts derives from the
|
|
5
|
+
* ownership marker fields, plus the plan-side live read of the same rows.
|
|
6
|
+
*
|
|
7
|
+
* The transport is the lexicon's own typed client (./api/connect.ts), so a
|
|
8
|
+
* receipt read and write take the same environment-to-cluster binding
|
|
9
|
+
* (#1100/#1155), the same credential policy and the same field manager as
|
|
10
|
+
* every other k8s mutation. No `kubectl` binary is involved.
|
|
11
|
+
*
|
|
12
|
+
* Write discipline (epic decision 3): `write` exists for the `effect()` step
|
|
13
|
+
* alone, because the step's read-compare-run-write is the only path that reaches it,
|
|
14
|
+
* on success, last. It is a server-side apply as `chant:<stack>`, stamping the
|
|
15
|
+
* ownership marker labels and {@link RECEIPT_LABEL_KEY}, so a later write
|
|
16
|
+
* updates the value in place and the owned-only prune retains rather than
|
|
17
|
+
* deletes it (./op/activities/kubectl.ts).
|
|
18
|
+
*
|
|
19
|
+
* Identity: the ConfigMap name needs `<stack>` and `<env>`, which the activity
|
|
20
|
+
* args deliberately do not carry (the `EffectReceiptRef` is
|
|
21
|
+
* identity-of-the-effect, not identity-of-the-deployment). The store resolves
|
|
22
|
+
* them once, lazily, at first use: an explicit option, else `CHANT_ENV` (what
|
|
23
|
+
* `chant run --env` sets) and the project's `ownership` block, the same fields
|
|
24
|
+
* that stamp markers (epic decision 4). Nothing resolving is an error, never a
|
|
25
|
+
* guessed segment.
|
|
26
|
+
*
|
|
27
|
+
* Not exported from the package entry point. Like ./secret-store.ts and
|
|
28
|
+
* ./teardown.ts, this module names the API client, which must stay off the
|
|
29
|
+
* build path (chant #1074, examples/k8s-client-boundary.test.ts). Consumers
|
|
30
|
+
* reach it by subpath: `@intentius/chant-lexicon-k8s/receipt-store`.
|
|
31
|
+
*/
|
|
32
|
+
import type { ReceiptStore } from "@intentius/chant/op/receipt-store";
|
|
33
|
+
import type { ResourceMetadata, UnobservedEntity } from "@intentius/chant/lexicon";
|
|
34
|
+
import type { DeepResourceObservation } from "@intentius/chant/deep-observation";
|
|
35
|
+
import type { K8sClient, K8sObject } from "@intentius/chant-k8s-client";
|
|
36
|
+
import { type K8sConnector } from "./api/connect.js";
|
|
37
|
+
import { type RenderedReceiptRow } from "./effect-receipt-row.js";
|
|
38
|
+
/** Options for {@link k8sReceiptStore}. All optional: the default store reads
|
|
39
|
+
* its identity and its namespace from the project, and its cluster from the
|
|
40
|
+
* environment binding. */
|
|
41
|
+
export interface K8sReceiptStoreOptions {
|
|
42
|
+
/** The name's `<stack>` segment. Omitted, the project's `ownership.stack`
|
|
43
|
+
* (chant.config.ts, found upward from `cwd`) answers. */
|
|
44
|
+
stack?: string;
|
|
45
|
+
/** The name's `<env>` segment, explicit by decision 4. Omitted, `CHANT_ENV`
|
|
46
|
+
* (set by `chant run --env`) answers, then a literal `ownership.env`. */
|
|
47
|
+
environment?: string;
|
|
48
|
+
/** Namespace the receipts live in. Omitted, `k8s.receipts.namespace`
|
|
49
|
+
* answers, then `default`. */
|
|
50
|
+
namespace?: string;
|
|
51
|
+
/** Where to look for chant.config.ts. Defaults to the working directory. */
|
|
52
|
+
cwd?: string;
|
|
53
|
+
/** Explicit kubectl context, for a caller that already resolved one. */
|
|
54
|
+
context?: string;
|
|
55
|
+
/** The connector to build a client with. Test seam. */
|
|
56
|
+
connect?: K8sConnector;
|
|
57
|
+
/** Environment record the identity fallback reads. Defaults to `process.env`. */
|
|
58
|
+
env?: Record<string, string | undefined>;
|
|
59
|
+
}
|
|
60
|
+
/** The stored expectation on a live receipt ConfigMap, or undefined when the
|
|
61
|
+
* object holds none. */
|
|
62
|
+
export declare function receiptValueOf(object: K8sObject | undefined): string | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* The `ReceiptStore` over ConfigMaps. Bind it once in the op activities barrel
|
|
65
|
+
* as `receiptActivities(k8sReceiptStore())`, and the registry resolves
|
|
66
|
+
* `receiptRead`/`receiptWrite`/`receiptStaleness` by name, exactly like
|
|
67
|
+
* `ensureSecret` (#1830). Identity and cluster resolve lazily at first use, so
|
|
68
|
+
* module load never reads the project or connects to anything.
|
|
69
|
+
*/
|
|
70
|
+
export declare function k8sReceiptStore(options?: K8sReceiptStoreOptions): ReceiptStore;
|
|
71
|
+
/** What the observation leg learned about the declared receipt rows. */
|
|
72
|
+
export interface ReceiptRowObservation {
|
|
73
|
+
resources: Record<string, ResourceMetadata>;
|
|
74
|
+
unobserved: Record<string, UnobservedEntity>;
|
|
75
|
+
}
|
|
76
|
+
/** The receipt rows a build output carries, keyed by entity name. Only the
|
|
77
|
+
* entities this observation was asked about. */
|
|
78
|
+
export declare function receiptRowsFor(entityNames: readonly string[], buildOutput: string | undefined): Map<string, RenderedReceiptRow>;
|
|
79
|
+
/**
|
|
80
|
+
* The plan-side live read of the receipt rows (#2074's observation leg).
|
|
81
|
+
*
|
|
82
|
+
* A receipt is not a document the applier ever wrote (#1832), and it carries
|
|
83
|
+
* no `props` on the declared side, so the generic declared-entity sweep in
|
|
84
|
+
* ./describe-resources.ts has neither a `metadata.name` to query by nor an
|
|
85
|
+
* honest verdict to give. The serializer rendered each receipt's derived
|
|
86
|
+
* ConfigMap address into the build output's receipt comment, so this leg reads
|
|
87
|
+
* the addresses back from there, one derivation, decision 4, and asks the
|
|
88
|
+
* cluster for each.
|
|
89
|
+
*
|
|
90
|
+
* Present maps the stored value onto `attributes.value` (core's
|
|
91
|
+
* `RECEIPT_VALUE_ATTRIBUTE`); a genuine 404 is a real absence and stays one; a
|
|
92
|
+
* failed read is an `unobserved` hole, never a wrong answer: a receipt nobody
|
|
93
|
+
* could read must not arrive downstream as "the effect never ran".
|
|
94
|
+
*/
|
|
95
|
+
export declare function observeReceiptRows(client: K8sClient, rows: ReadonlyMap<string, RenderedReceiptRow>): Promise<ReceiptRowObservation>;
|
|
96
|
+
/**
|
|
97
|
+
* The deep read's answer for the receipt rows.
|
|
98
|
+
*
|
|
99
|
+
* A receipt is read back here for the same reason the thin path reads it: a
|
|
100
|
+
* declared entity nobody looked at is a hole, and a hole in the deep read is
|
|
101
|
+
* noise on every `lifecycle diff --live --deep` a project with receipts runs.
|
|
102
|
+
* What it deliberately contributes is an EMPTY property tree: the declaration
|
|
103
|
+
* has no `props`, so every live path would land outside the claimed-field set
|
|
104
|
+
* (`@intentius/chant/claimed-fields`) and be reported unclaimed, and the
|
|
105
|
+
* receipt's stored value is not drift on any reading, because a stale receipt is an
|
|
106
|
+
* `effect` row from `planReceipts` (#1832), never an update. Presence and the
|
|
107
|
+
* uid are the whole of what the deep read has to say about a receipt.
|
|
108
|
+
*/
|
|
109
|
+
export declare function observeReceiptRowsDeep(client: K8sClient, rows: ReadonlyMap<string, RenderedReceiptRow>): Promise<{
|
|
110
|
+
resources: Record<string, DeepResourceObservation>;
|
|
111
|
+
unobserved: Record<string, UnobservedEntity>;
|
|
112
|
+
}>;
|
|
113
|
+
//# sourceMappingURL=receipt-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt-store.d.ts","sourceRoot":"","sources":["../src/receipt-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAQL,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAE9B;;0BAE0B;AAC1B,MAAM,WAAW,sBAAsB;IACrC;6DACyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;6EACyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;kCAC8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AA+CD;wBACwB;AACxB,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIhF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,YAAY,CAuClF;AAED,wEAAwE;AACxE,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC9C;AAED;gDACgD;AAChD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAUjC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC5C,OAAO,CAAC,qBAAqB,CAAC,CAsChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC5C,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CAAE,CAAC,CAW/G"}
|
package/dist/rules/wk8505.ts
CHANGED
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
* invocations, so "no Kustomization in THIS build sets spec.decryption" can
|
|
16
16
|
* mean "wired up in the other build" as easily as "forgotten" — the design
|
|
17
17
|
* doc's §4 explains why no path-to-build-target join exists to tell those
|
|
18
|
-
* apart.
|
|
18
|
+
* apart. Single-build-root scoped, tracked by chant #1939 as a candidate for
|
|
19
|
+
* an opt-in project-level mode; promote to error if that join ever becomes
|
|
20
|
+
* available.
|
|
19
21
|
*
|
|
20
22
|
* Fires only on claims that actually resolved (`problems.length === 0`, via
|
|
21
23
|
* `resolveEncryptedSecretClaims`), not on every raw declaration. An
|
|
@@ -39,7 +41,7 @@ function fluxKustomizations(manifests: K8sManifest[]): K8sManifest[] {
|
|
|
39
41
|
export const wk8505: PostSynthCheck = {
|
|
40
42
|
id: "WK8505",
|
|
41
43
|
description:
|
|
42
|
-
"committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it",
|
|
44
|
+
"committed-encrypted secret with no Flux decryption wiring — add decryption: 'sops' to the FluxAppFor reconciling the path that carries it. Sees one build root at a time, so it goes silent when that Kustomization lives in a different build root (chant #1939).",
|
|
43
45
|
|
|
44
46
|
check(ctx: PostSynthContext): PostSynthDiagnostic[] {
|
|
45
47
|
const kustomizations = fluxKustomizations(allManifests(ctx));
|
package/dist/serializer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAsC,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAsC,MAAM,6BAA6B,CAAC;AAyRlG;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UAkO3B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
skill: chant-k8s-argo
|
|
3
|
-
description: Argo CD composites for GitOps reconciliation — ArgoAppFor, ArgoAppSetForRegions, AppProject scoping, cluster registration, and
|
|
3
|
+
description: Argo CD composites for GitOps reconciliation — ArgoAppFor, ArgoAppSetForRegions, AppProject scoping, cluster registration, and how a deploy splits between Argo and a chant Op
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -14,9 +14,9 @@ Chant authors typed infrastructure into manifests. Argo CD continuously reconcil
|
|
|
14
14
|
|---|---|---|
|
|
15
15
|
| **Chant** | Authoring typed infra → manifests | the lexicons |
|
|
16
16
|
| **Argo CD** | Continuously reconciling declarative manifests (the apply layer) | `ArgoAppFor` / `ArgoAppSetForRegions` |
|
|
17
|
-
| **
|
|
17
|
+
| **A chant Op** | Procedural steps Argo can't express: ordering, human gates, one-shot RPCs | an `Op` in the project, plus this lexicon's `waitForArgoSync` |
|
|
18
18
|
|
|
19
|
-
Rule of thumb: **if it's declarative and converges, let Argo reconcile it. If it's a procedure with ordering, gates, or out-of-band steps,
|
|
19
|
+
Rule of thumb: **if it's declarative and converges, let Argo reconcile it. If it's a procedure with ordering, gates, or out-of-band steps, write it as a chant Op and run it from CI or a steward.** Prefer Argo CD over Argo Workflows; the procedural layer stays an Op.
|
|
20
20
|
|
|
21
21
|
## Prerequisites
|
|
22
22
|
|
|
@@ -138,9 +138,9 @@ Produces a `Secret` labelled `argocd.argoproj.io/secret-type: cluster`. After th
|
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
141
|
-
##
|
|
141
|
+
## Splitting a deploy between Argo and an Op
|
|
142
142
|
|
|
143
|
-
When a deploy has both declarative and procedural parts, let each layer own what it's good at. Example
|
|
143
|
+
When a deploy has both declarative and procedural parts, let each layer own what it's good at. Example, the multi-region CockroachDB deploy:
|
|
144
144
|
|
|
145
145
|
| Step | Owner | Why |
|
|
146
146
|
|---|---|---|
|
|
@@ -148,16 +148,30 @@ When a deploy has both declarative and procedural parts, let each layer own what
|
|
|
148
148
|
| Install ESO / operators (Helm) | **Argo** | Declarative Helm source |
|
|
149
149
|
| Apply per-cluster K8s manifests | **Argo** (`ApplicationSet`) | One App per workload cluster |
|
|
150
150
|
| Wait for workloads Healthy | **Argo** (`Health=Healthy`) | Subsumed by Application health |
|
|
151
|
-
| Wait for DNS delegation | **
|
|
152
|
-
| Generate + push TLS certs | **
|
|
153
|
-
| `cockroach init`, configure regions | **
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
| Wait for DNS delegation | **an Op** | Out of band, and a human confirms it |
|
|
152
|
+
| Generate + push TLS certs | **an Op** | One-shot procedure, secrets not in git |
|
|
153
|
+
| `cockroach init`, configure regions | **an Op** | Ordered one-shot RPCs |
|
|
154
|
+
|
|
155
|
+
Argo owns the sync. The Op owns the ordering and the gates: its phases run in
|
|
156
|
+
sequence in one process (`packages/core/src/op/local-executor.ts`), and a `gate`
|
|
157
|
+
step reads the gate ledger, so a run that reaches a gate nobody has approved
|
|
158
|
+
records the pending fact, ends with status `gated` and exits 3. Someone runs
|
|
159
|
+
`chant approve <op> <gate>`, the next run reads the resolution and walks
|
|
160
|
+
through. CI is what runs the Op, on whatever cadence the Op's `schedule`
|
|
161
|
+
names.
|
|
162
|
+
|
|
163
|
+
To make a step wait on Argo, use this lexicon's `waitForArgoSync` activity. It is
|
|
164
|
+
exported from `lexicons/k8s/src/op/activities/index.ts`, and the core activity
|
|
165
|
+
registry resolves it by export name once `k8s` is in the project's `lexicons`.
|
|
166
|
+
Give the step core's `argoSync` profile
|
|
167
|
+
(`packages/core/src/op/activity-profiles.ts`): a 30m timeout, five attempts
|
|
168
|
+
backing off from 10s, and `ArgoSyncFailedError` marked non-retryable so a
|
|
169
|
+
terminally unhealthy Application fails fast instead of polling to the cap.
|
|
156
170
|
|
|
157
171
|
```typescript
|
|
158
|
-
// In
|
|
159
|
-
|
|
160
|
-
//
|
|
172
|
+
// In an Op phase:
|
|
173
|
+
activity("waitForArgoSync", { appName: "east-crdb", namespace: "argocd" }, "argoSync"),
|
|
174
|
+
// Later steps in the phase run once the workloads are Healthy.
|
|
161
175
|
```
|
|
162
176
|
|
|
163
177
|
`waitForArgoSync` is dependency-free — it polls the Application's status (`health=Healthy && sync=Synced`) and never imports the Argo CRD types.
|