@intentius/chant-lexicon-helm 0.46.0 → 0.49.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 (118) hide show
  1. package/dist/archive-render.d.ts +94 -0
  2. package/dist/archive-render.d.ts.map +1 -0
  3. package/dist/commands.d.ts +54 -0
  4. package/dist/commands.d.ts.map +1 -0
  5. package/dist/config.d.ts +135 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/deep-observe-hooks.d.ts +2 -0
  8. package/dist/deep-observe-hooks.d.ts.map +1 -0
  9. package/dist/deep-observe.d.ts +54 -0
  10. package/dist/deep-observe.d.ts.map +1 -0
  11. package/dist/describe-resources.d.ts +17 -0
  12. package/dist/describe-resources.d.ts.map +1 -0
  13. package/dist/index.d.ts +18 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/integrity.json +5 -3
  16. package/dist/lint/audit-catalog.d.ts.map +1 -1
  17. package/dist/lint/post-synth/index.d.ts.map +1 -1
  18. package/dist/lint/post-synth/whm503.d.ts +34 -0
  19. package/dist/lint/post-synth/whm503.d.ts.map +1 -0
  20. package/dist/lint/post-synth/whm504.d.ts +20 -0
  21. package/dist/lint/post-synth/whm504.d.ts.map +1 -0
  22. package/dist/manifest.json +1 -1
  23. package/dist/okf/index.md +2 -0
  24. package/dist/okf/rules/WHM503.md +15 -0
  25. package/dist/okf/rules/WHM504.md +11 -0
  26. package/dist/okf/types/Values.md +1 -0
  27. package/dist/op/activities/cluster-probe.d.ts +44 -0
  28. package/dist/op/activities/cluster-probe.d.ts.map +1 -0
  29. package/dist/op/activities/helm.d.ts +179 -5
  30. package/dist/op/activities/helm.d.ts.map +1 -1
  31. package/dist/op/activities/index.d.ts +4 -2
  32. package/dist/op/activities/index.d.ts.map +1 -1
  33. package/dist/pinnability/actions.d.ts +76 -0
  34. package/dist/pinnability/actions.d.ts.map +1 -0
  35. package/dist/pinnability/classify.d.ts +129 -0
  36. package/dist/pinnability/classify.d.ts.map +1 -0
  37. package/dist/pinnability/conditions.d.ts +109 -0
  38. package/dist/pinnability/conditions.d.ts.map +1 -0
  39. package/dist/pinnability/index.d.ts +17 -0
  40. package/dist/pinnability/index.d.ts.map +1 -0
  41. package/dist/pinnability/localize.d.ts +124 -0
  42. package/dist/pinnability/localize.d.ts.map +1 -0
  43. package/dist/pinnability/render-stream.d.ts +27 -0
  44. package/dist/pinnability/render-stream.d.ts.map +1 -0
  45. package/dist/pinnability/values.d.ts +69 -0
  46. package/dist/pinnability/values.d.ts.map +1 -0
  47. package/dist/plugin.d.ts.map +1 -1
  48. package/dist/release-observe.d.ts +109 -0
  49. package/dist/release-observe.d.ts.map +1 -0
  50. package/dist/render-diff.d.ts +192 -0
  51. package/dist/render-diff.d.ts.map +1 -0
  52. package/dist/render-digest.d.ts +135 -0
  53. package/dist/render-digest.d.ts.map +1 -0
  54. package/dist/render-store.d.ts +310 -0
  55. package/dist/render-store.d.ts.map +1 -0
  56. package/dist/render-wrapper.d.ts +140 -0
  57. package/dist/render-wrapper.d.ts.map +1 -0
  58. package/dist/render.d.ts +81 -0
  59. package/dist/render.d.ts.map +1 -1
  60. package/dist/rules/whm503.ts +101 -0
  61. package/dist/rules/whm504.ts +52 -0
  62. package/dist/skills/chant-helm.md +7 -0
  63. package/dist/values-probe.d.ts +177 -0
  64. package/dist/values-probe.d.ts.map +1 -0
  65. package/dist/wrapper-chart.d.ts +61 -0
  66. package/dist/wrapper-chart.d.ts.map +1 -0
  67. package/package.json +10 -4
  68. package/src/archive-render.test.ts +201 -0
  69. package/src/archive-render.ts +119 -0
  70. package/src/commands.test.ts +487 -0
  71. package/src/commands.ts +445 -0
  72. package/src/config.test.ts +130 -0
  73. package/src/config.ts +220 -0
  74. package/src/deep-observe-hooks.ts +20 -0
  75. package/src/deep-observe.test.ts +165 -0
  76. package/src/deep-observe.ts +121 -0
  77. package/src/describe-resources.test.ts +255 -0
  78. package/src/describe-resources.ts +198 -0
  79. package/src/index.ts +98 -2
  80. package/src/lifecycle-integration.test.ts +289 -0
  81. package/src/lint/audit-catalog.ts +2 -0
  82. package/src/lint/post-synth/index.ts +4 -0
  83. package/src/lint/post-synth/whm503.test.ts +134 -0
  84. package/src/lint/post-synth/whm503.ts +101 -0
  85. package/src/lint/post-synth/whm504.test.ts +105 -0
  86. package/src/lint/post-synth/whm504.ts +52 -0
  87. package/src/op/activities/cluster-probe.test.ts +66 -0
  88. package/src/op/activities/cluster-probe.ts +148 -0
  89. package/src/op/activities/helm.test.ts +824 -0
  90. package/src/op/activities/helm.ts +628 -5
  91. package/src/op/activities/index.ts +17 -2
  92. package/src/pinnability/actions.ts +263 -0
  93. package/src/pinnability/classify.ts +579 -0
  94. package/src/pinnability/conditions.ts +0 -0
  95. package/src/pinnability/index.ts +77 -0
  96. package/src/pinnability/localize.test.ts +234 -0
  97. package/src/pinnability/localize.ts +644 -0
  98. package/src/pinnability/pinnability.test.ts +560 -0
  99. package/src/pinnability/render-stream.ts +59 -0
  100. package/src/pinnability/values.ts +205 -0
  101. package/src/plugin.test.ts +3 -1
  102. package/src/plugin.ts +47 -0
  103. package/src/release-observe.ts +392 -0
  104. package/src/render-diff.test.ts +366 -0
  105. package/src/render-diff.ts +407 -0
  106. package/src/render-digest.test.ts +186 -0
  107. package/src/render-digest.ts +207 -0
  108. package/src/render-store.test.ts +412 -0
  109. package/src/render-store.ts +621 -0
  110. package/src/render-wrapper.test.ts +259 -0
  111. package/src/render-wrapper.ts +274 -0
  112. package/src/render.test.ts +383 -4
  113. package/src/render.ts +319 -8
  114. package/src/skills/chant-helm.md +7 -0
  115. package/src/values-probe.test.ts +400 -0
  116. package/src/values-probe.ts +627 -0
  117. package/src/wrapper-chart.test.ts +110 -0
  118. package/src/wrapper-chart.ts +124 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Double-render localizer for open generated inputs (#1236, epic #1228
3
+ * Phase 1).
4
+ *
5
+ * The static classifier (#1234) NAMES generator sites; this module proves
6
+ * which of them actually fire and maps every unstable output line back to
7
+ * the input that produced it. The mechanism is the epic's own: pin the
8
+ * input, not the output. For each candidate values path that could close a
9
+ * generator, render the chart twice with that path pinned — the lines that
10
+ * stop differing are the lines that input produced, cascades included
11
+ * (finding 6: one `randAlphaNum` admin password differed as the secret line
12
+ * PLUS a `checksum/secret` annotation derived from it; hoisting the secret
13
+ * alone would have desynchronized the checksum and silently broken
14
+ * restart-on-change).
15
+ *
16
+ * Candidate pins come from three static sources, each validated dynamically
17
+ * before being suggested:
18
+ *
19
+ * 1. the generator's own action (`x | default (randAlphaNum 16)` — the
20
+ * classifier already names `x`),
21
+ * 2. enclosing control-flow gates (`if not .Values.core.existingSecret`
22
+ * around the generator: supplying the existing-secret slot closes it),
23
+ * 3. the include chain — a generator inside `define "grafana.password"`
24
+ * inherits the gates of every `include "grafana.password"` site, which
25
+ * is where grafana's `{{- if .Values.adminPassword }} ... {{- else }}`
26
+ * supply slot lives.
27
+ *
28
+ * A differing line no probe and no source mapping can explain is reported as
29
+ * UNLOCALIZED instability — never silently pinnable. A base double render
30
+ * with zero differing lines confirms the chart deterministic.
31
+ */
32
+ import { type PinnabilityReport } from "./classify.js";
33
+ /** Renders the chart with the given values paths pinned to literal strings. */
34
+ export type RenderFn = (pins: Record<string, string>) => string;
35
+ export type PinStyle = "supply" | "existing-slot" | "gate";
36
+ export interface CandidatePin {
37
+ /** Root-scoped values path. */
38
+ path: string;
39
+ style: PinStyle;
40
+ }
41
+ /** One unstable output line, located in the rendered document set. */
42
+ export interface LocalizedOccurrence {
43
+ /** Source template of the rendered document (`# Source:` origin). */
44
+ doc: string;
45
+ /** `Kind/name` of the document, when parseable. */
46
+ docId: string;
47
+ /** YAML key of the differing line (`admin-password`, `checksum/secret`). */
48
+ key: string;
49
+ /** 1-based line within the document, from the first base render. */
50
+ line: number;
51
+ /**
52
+ * The line lives in a different template than the generator — a derived
53
+ * field (checksum annotation, re-included secret) grouped under its root
54
+ * input rather than reported as independent instability.
55
+ */
56
+ derived: boolean;
57
+ }
58
+ /** One open generated input with the unstable lines localized to it. */
59
+ export interface LocalizedInput {
60
+ fn: string;
61
+ /** Template file and line of the generator (classifier coordinates). */
62
+ file: string;
63
+ line: number;
64
+ /** The values path a supply-style pin uses, when one validated. */
65
+ valuesPath?: string;
66
+ /** A validated pin exists — supplying a value closes this input. */
67
+ suppliable: boolean;
68
+ /**
69
+ * The concrete values entry a user adds to close the input, e.g.
70
+ * `adminPassword: <generate once and supply>`. Absent when no candidate
71
+ * pin validated (the input is real but not closable via values).
72
+ */
73
+ suggestedPin?: string;
74
+ /** Chart-provided slots that also close it (`admin.existingSecret`). */
75
+ existingSlots: string[];
76
+ occurrences: LocalizedOccurrence[];
77
+ }
78
+ export interface LocalizationReport {
79
+ /** The base double render differed on zero lines. */
80
+ deterministic: boolean;
81
+ /** Differing line count of the base double render (per-render lines). */
82
+ differingLines: number;
83
+ inputs: LocalizedInput[];
84
+ /** Differing lines no probe and no source mapping explains. */
85
+ unlocalized: LocalizedOccurrence[];
86
+ /**
87
+ * Pinning every validated pin at once yields a stable render. Present
88
+ * only when at least one pin validated.
89
+ */
90
+ stableWithAllPins?: boolean;
91
+ /** How many `helm template` invocations the localization used. */
92
+ renders: number;
93
+ }
94
+ export interface LocalizeOptions {
95
+ render: RenderFn;
96
+ /** Values overrides, as `helm template --values` would merge them. */
97
+ values?: unknown;
98
+ /** Values files merged (in order) over the chart defaults. */
99
+ valuesFiles?: string[];
100
+ /** Probe budget per generator site (default 6). */
101
+ maxProbesPerInput?: number;
102
+ }
103
+ interface DiffOccurrence {
104
+ ident: string;
105
+ doc: string;
106
+ docId: string;
107
+ key: string;
108
+ line: number;
109
+ }
110
+ /**
111
+ * Diff two renders of the SAME inputs into a set of differing-line
112
+ * occurrences with identities stable across separate probe runs: documents
113
+ * pair by (`# Source:` origin, ordinal), lines identify by their YAML key
114
+ * plus ordinal rather than raw content — the content is exactly what varies.
115
+ */
116
+ export declare function diffRenderPair(a: string, b: string): Map<string, DiffOccurrence>;
117
+ /**
118
+ * Localize the open generated inputs of a chart: double-render, and map
119
+ * every differing line back to the input that produced it by pinning
120
+ * candidate inputs one at a time. See the module doc for the mechanism.
121
+ */
122
+ export declare function localizeOpenInputs(chartDir: string, report: PinnabilityReport, options: LocalizeOptions): LocalizationReport;
123
+ export {};
124
+ //# sourceMappingURL=localize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localize.d.ts","sourceRoot":"","sources":["../../src/pinnability/localize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAWpB,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;AAEhE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,+DAA+D;IAC/D,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,CAAC;IACjB,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAMD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAmCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CA4ChF;AA0ND;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,eAAe,GACvB,kBAAkB,CA8LpB"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Helpers over a `helm template` output stream (#1234, epic #1228).
3
+ *
4
+ * The CRD routing rule here is what the structure-preserving wrapper
5
+ * (#1239) builds on, and the line diff seeds the double-render localizer
6
+ * (#1236). Both were proven in the survey harness before promotion.
7
+ */
8
+ /** Split a `helm template` stream into non-empty documents. */
9
+ export declare function splitDocuments(rendered: string): string[];
10
+ /** The `# Source: <chart>/<path>` origin of a rendered document, if any. */
11
+ export declare function sourcePath(doc: string): string | undefined;
12
+ /**
13
+ * Finding 10: segment matching, not prefix matching. A subchart's CRDs
14
+ * arrive as `charts/<child>/crds/<file>`; `startsWith("crds/")` catches
15
+ * 0 of them and would route every one into templates/, making it deletable
16
+ * on uninstall.
17
+ */
18
+ export declare function isCrdSource(path: string): boolean;
19
+ export interface RoutedDocuments {
20
+ crds: string[];
21
+ templates: string[];
22
+ }
23
+ /** Route rendered documents by origin: `crds/`-segment sources vs the rest. */
24
+ export declare function routeBySource(rendered: string): RoutedDocuments;
25
+ /** Count lines that differ between two renders (symmetric, order-blind). */
26
+ export declare function countDifferingLines(a: string, b: string): number;
27
+ //# sourceMappingURL=render-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-stream.d.ts","sourceRoot":"","sources":["../../src/pinnability/render-stream.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAKzD;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAO/D;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhE"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Chart model and value coalescing for the pinnability classifier (#1234,
3
+ * epic #1228).
4
+ *
5
+ * Pinnability is a property of `(chart, values)`, not of the chart alone —
6
+ * so the classifier needs each subchart instance's EFFECTIVE values to ask
7
+ * whether a gate is open. This module walks `Chart.yaml` dependencies
8
+ * (aliases and `condition:` included — finding 12: dependency conditions are
9
+ * values-driven and therefore closed inputs) and approximates helm's
10
+ * coalescing: child defaults, overridden by the parent's `<alias-or-name>`
11
+ * subtree, with `global` propagated down.
12
+ *
13
+ * The approximation is deliberate and bounded. `import-values`, `tags`, and
14
+ * `tpl`-computed values are not modeled; a gate they would decide resolves
15
+ * as UNKNOWN and the classifier refuses rather than pins (see
16
+ * conditions.ts). The build-time values probe (#1251) replaces this with
17
+ * helm's own coalescing.
18
+ */
19
+ export interface ChartDependency {
20
+ name: string;
21
+ alias?: string;
22
+ /** Comma-separated values paths, evaluated against the ROOT values. */
23
+ condition?: string;
24
+ }
25
+ export interface ChartMeta {
26
+ name: string;
27
+ dependencies: ChartDependency[];
28
+ }
29
+ export declare function readChartMeta(chartDir: string): ChartMeta;
30
+ export declare function readYamlFile(path: string): unknown;
31
+ /**
32
+ * Helm-style deep merge: `override` wins, maps merge recursively, a `null`
33
+ * override deletes the key, arrays replace wholesale.
34
+ */
35
+ export declare function mergeValues(base: unknown, override: unknown): unknown;
36
+ /** Resolve a dot path against a values tree; undefined when absent. */
37
+ export declare function valueAtPath(values: unknown, path: string[]): unknown;
38
+ /**
39
+ * One chart in the tree, with the values IT sees. An aliased dependency
40
+ * yields two instances over the same directory — each with its own value
41
+ * scope, which is why findings are evaluated per instance but reported per
42
+ * file.
43
+ */
44
+ export interface ChartInstance {
45
+ /** Directory of the (sub)chart. */
46
+ dir: string;
47
+ /** Directory relative to the root chart ("" for the root). */
48
+ relDir: string;
49
+ /** Values scope from the root, e.g. ["grafana"] or ["kidtwo"]; [] for root. */
50
+ scope: readonly string[];
51
+ /** Effective values as this instance sees them. */
52
+ values: unknown;
53
+ /**
54
+ * When a `condition:` on the dependency chain disables this instance under
55
+ * the supplied values: the first condition path that resolved false, in
56
+ * root coordinates. Constructs inside a disabled instance are gated by it.
57
+ */
58
+ disabledBy?: string;
59
+ }
60
+ /**
61
+ * Build the instance tree for a chart directory and the values the render
62
+ * was given. `suppliedValues` merges over the root chart's `values.yaml`
63
+ * exactly like `helm template --values`.
64
+ */
65
+ export declare function buildChartInstances(chartDir: string, suppliedValues?: unknown): {
66
+ instances: ChartInstance[];
67
+ warnings: string[];
68
+ };
69
+ //# sourceMappingURL=values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/pinnability/values.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAqBzD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAYrE;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAOpE;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,OAAO,GACvB;IAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA8EpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAiC,MAAM,0BAA0B,CAAC;AAY7F,eAAO,MAAM,UAAU,EAAE,aAqXxB,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAiC,MAAM,0BAA0B,CAAC;AAiB7F,eAAO,MAAM,UAAU,EAAE,aA+ZxB,CAAC"}
@@ -0,0 +1,109 @@
1
+ import type { UnobservedEntity, UnobservedReason } from "@intentius/chant/lexicon";
2
+ declare const defaultRunner: (command: string) => Promise<{
3
+ stdout: string;
4
+ }>;
5
+ /** Injectable command runner, so tests drive every branch without helm or a cluster. */
6
+ export type HelmRunner = (command: string) => Promise<{
7
+ stdout: string;
8
+ }>;
9
+ export { defaultRunner as defaultHelmRunner };
10
+ export declare const HELM_CHART_ENTITY_TYPE = "Helm::Chart";
11
+ export declare const HELM_RELEASE_TYPE = "Helm::Release";
12
+ /** Shell-quote one argv element, same convention as `helm-upgrade.ts`. */
13
+ export declare function q(arg: string): string;
14
+ /**
15
+ * The environment's kube context (#1488): the declared binding when present,
16
+ * ambient otherwise. Unresolvable config is ambient, chant's own fallback —
17
+ * identical to `list-artifacts.ts`.
18
+ */
19
+ export declare function resolveHelmContext(environment: string): Promise<string | undefined>;
20
+ /**
21
+ * Total verdict for a failed helm invocation (#1089/#1246). A missing binary
22
+ * and a missing/unusable kubeconfig are both `no-credentials` — the read had
23
+ * no usable way to reach the target. Anything else the CLI refused is
24
+ * `read-failed`.
25
+ */
26
+ export declare function classifyHelmFailure(err: unknown): {
27
+ reason: UnobservedReason;
28
+ detail: string;
29
+ };
30
+ /**
31
+ * Kinds that are cluster-scoped, so a document without `metadata.namespace`
32
+ * must not inherit the release namespace. Well-known built-ins only; a
33
+ * cluster-scoped CRD instance this set does not name defaults to the release
34
+ * namespace, which affects the row's address, never its verdict.
35
+ */
36
+ export declare const CLUSTER_SCOPED_KINDS: Set<string>;
37
+ /** One rendered document a release holds, from either channel. */
38
+ export interface ParsedReleaseResource {
39
+ /**
40
+ * Row key, following the k8s runtime-sweep convention
41
+ * (`<Kind>/<namespace>/<name>`, `cluster:<Kind>/<name>`) so a helm row and
42
+ * a k8s row for the same object spell the same identity.
43
+ */
44
+ key: string;
45
+ apiVersion: string;
46
+ kind: string;
47
+ name: string;
48
+ namespace?: string;
49
+ /** Which read reported it — hooks are invisible to the manifest channel. */
50
+ channel: "manifest" | "hooks";
51
+ /** chant's k8s entity type for the document's GVK (`K8s::Apps::Deployment`). */
52
+ entityType: string;
53
+ /** The document itself, minus nothing — the release's stored declaration. */
54
+ doc: Record<string, unknown>;
55
+ /** `helm.sh/hook*` annotations, for hook-channel rows. */
56
+ hook?: {
57
+ hook: string;
58
+ weight?: string;
59
+ deletePolicy?: string;
60
+ };
61
+ }
62
+ /** One declared chart resolved to a live release, with what the release holds. */
63
+ export interface ObservedRelease {
64
+ entityName: string;
65
+ release: string;
66
+ namespace: string;
67
+ status?: string;
68
+ revision?: string;
69
+ chart?: string;
70
+ appVersion?: string;
71
+ updated?: string;
72
+ resources: ParsedReleaseResource[];
73
+ }
74
+ export interface ReleaseObservation {
75
+ /** Charts whose release was found and fully read. */
76
+ releases: ObservedRelease[];
77
+ /** Chart entities whose release `helm list` did not report — a real absence. */
78
+ absent: string[];
79
+ /** Chart entities that could not be read, with a total reason (#1089). */
80
+ unobserved: Record<string, UnobservedEntity>;
81
+ /** The helm command issued per chart entity (#1620). */
82
+ queried: Record<string, string>;
83
+ }
84
+ export interface ReleaseObserveOptions {
85
+ environment: string;
86
+ entities: Map<string, {
87
+ entityType: string;
88
+ props: Record<string, unknown>;
89
+ }>;
90
+ /** Deploy unit, `<namespace>/<release>` or `<release>` (see `describeStackStatus`). */
91
+ stack?: string;
92
+ }
93
+ /** The declared chart entities, with the release name each one deploys as. */
94
+ export declare function chartEntities(entities: Map<string, {
95
+ entityType: string;
96
+ props: Record<string, unknown>;
97
+ }>): Array<{
98
+ entityName: string;
99
+ release: string;
100
+ }>;
101
+ /** Parse one channel's multi-document YAML stream into per-resource rows. */
102
+ export declare function parseReleaseDocuments(text: string, channel: "manifest" | "hooks", releaseNamespace: string): ParsedReleaseResource[];
103
+ /**
104
+ * Resolve every declared chart to its release and read both channels.
105
+ * Never throws for a per-release failure; a whole-read failure (the `helm
106
+ * list` itself) lands every chart entity in `unobserved` with one reason.
107
+ */
108
+ export declare function observeReleases(options: ReleaseObserveOptions, run?: HelmRunner): Promise<ReleaseObservation>;
109
+ //# sourceMappingURL=release-observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-observe.d.ts","sourceRoot":"","sources":["../src/release-observe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Render diffing (#1249 offline, #1250 live — epic #1228 Phase 6), the two
3
+ * halves of `chant helm diff` (./commands.ts).
4
+ *
5
+ * `diffRenders` (#1249) is the offline half: given two content digests
6
+ * already in the render store (render-store.ts), report what changed
7
+ * between them — no cluster, no credentials, no live read. This is the
8
+ * pre-flight question a pin, a chart bump, or a values change all raise:
9
+ * "what will this touch?"
10
+ *
11
+ * Pairing is document-level, keyed on `(kind, namespace, name)` — the same
12
+ * identity `RenderManifest.documents` already indexes (render-store.ts).
13
+ * That index exists precisely so two renders can be matched without
14
+ * reparsing a whole stream: a document present on both sides with the same
15
+ * per-document digest is unchanged and costs nothing further; one whose
16
+ * digest differs is parsed on both sides and diffed field by field.
17
+ *
18
+ * Field-level diffing reuses core's `flattenDeepProperties` /
19
+ * `deepValueEqual` (packages/core/src/deep-observation.ts) — the same
20
+ * path-flattening core's own live-drift diff (lifecycle/deep-diff.ts) is
21
+ * built on. This module does not reuse `diffDeep` itself for the offline
22
+ * path: that function's shape is declared/live/baseline/fieldOwners,
23
+ * tailored to a source tree vs a cluster read. A stored render has neither
24
+ * a baseline nor a field owner, and both sides here are equally "declared"
25
+ * — reusing the flatten/compare primitives without the three-way apparatus
26
+ * is the right cut for render-to-render.
27
+ *
28
+ * Duplicate documents (an aliased dependency emitting the same CRD twice,
29
+ * render-digest.ts's canonicalization note) are matched positionally within
30
+ * their `(kind, namespace, name)` group: first occurrence to first, second
31
+ * to second. A group with more entries on one side reports the surplus as
32
+ * added or removed rather than guessing which duplicate corresponds to
33
+ * which.
34
+ *
35
+ * A document neither side's manifest could index (unparseable, or missing
36
+ * `kind`/`metadata.name` — render-store.ts's `indexRenderDocuments`) cannot
37
+ * be paired by identity. It is never silently dropped: `unindexed` counts
38
+ * it on whichever side(s) it appears, so a diff over two renders that both
39
+ * carry unindexable documents does not quietly under-report.
40
+ *
41
+ * `diffRenderLive` (#1250) is the online complement: given a single
42
+ * `contentDigest` resolved from the render store, read the live property
43
+ * tree for every document the render recorded — by identity
44
+ * (kind/namespace/name), not by helm release — and diff each one against
45
+ * the render's own stored bytes with `lifecycle/deep-diff.ts`. This *does*
46
+ * reuse `diffDeep`'s three-way apparatus (via `diffDeepObservation`): the
47
+ * declared side is the render's stored documents, the live side is a
48
+ * cluster read, which is exactly that function's shape.
49
+ *
50
+ * The declared side for the live path is the render's stored documents,
51
+ * never a fresh `helm template` run and never a chant TS build. A digest
52
+ * not in the store — an unpinned render was never persisted
53
+ * (`render-store.ts`'s `persistHelmRender` refuses that) — has nothing to
54
+ * diff against and comes back `found: false`, never a false "no drift" over
55
+ * documents nobody has (epic AC: unpinned releases handled without false
56
+ * drift).
57
+ *
58
+ * The live side reuses the exact seam `observeResourcesDeepHelm` (#1247)
59
+ * uses — the k8s lexicon's typed client and normalization hooks — so a
60
+ * document this reads and one a release's `describeResources` reads compare
61
+ * under the same rules (secret masking, managed-fields ownership, pruning).
62
+ * Hook resources need no special handling here the way the release-scoped
63
+ * read needs a second `helm get hooks` channel: `helm template` (what
64
+ * produced the stored render) already includes hook manifests as ordinary
65
+ * documents, so they are simply rows in `manifest.documents` like any other.
66
+ */
67
+ import type { DeepDiffResult } from "@intentius/chant/lifecycle/deep-diff";
68
+ import type { K8sConnector } from "@intentius/chant-lexicon-k8s/api/connect";
69
+ import { type RenderManifest } from "./render-store.js";
70
+ /** How one field within a changed document differs between the two renders. */
71
+ export interface RenderFieldChange {
72
+ /** Path within the document's property tree (`spec.replicas`, `data.zeta`). */
73
+ path: string;
74
+ /**
75
+ * `changed` — both renders have the path, with different values.
76
+ * `added` — only the right-hand (`to`) render has it.
77
+ * `removed` — only the left-hand (`from`) render has it.
78
+ */
79
+ kind: "changed" | "added" | "removed";
80
+ /** Value on the `from` side. Absent for `added`. */
81
+ before?: unknown;
82
+ /** Value on the `to` side. Absent for `removed`. */
83
+ after?: unknown;
84
+ }
85
+ /** Identity of one document, for reporting — the same triple documents are paired on. */
86
+ export interface RenderDiffDocumentRef {
87
+ kind: string;
88
+ namespace: string | null;
89
+ name: string;
90
+ /** The `# Source:` origin path, when the document carried one. */
91
+ source: string | null;
92
+ }
93
+ /** A document present on only one side. */
94
+ export interface AddedOrRemovedDocument extends RenderDiffDocumentRef {
95
+ digest: string;
96
+ }
97
+ /** A document present on both sides with different content. */
98
+ export interface ChangedDocument extends RenderDiffDocumentRef {
99
+ /** Per-document digest on the `from` side. */
100
+ beforeDigest: string;
101
+ /** Per-document digest on the `to` side. */
102
+ afterDigest: string;
103
+ /** Field-level differences, sorted by path. Empty only if a document parses but yields no leaves. */
104
+ changes: RenderFieldChange[];
105
+ }
106
+ export interface RenderDiffResult {
107
+ from: {
108
+ contentDigest: string;
109
+ chart: string;
110
+ releaseName: string;
111
+ };
112
+ to: {
113
+ contentDigest: string;
114
+ chart: string;
115
+ releaseName: string;
116
+ };
117
+ /** Present only on `to`. Sorted by kind/namespace/name. */
118
+ added: AddedOrRemovedDocument[];
119
+ /** Present only on `from`. Sorted by kind/namespace/name. */
120
+ removed: AddedOrRemovedDocument[];
121
+ /** Present on both, different bytes. Sorted by kind/namespace/name. */
122
+ changed: ChangedDocument[];
123
+ /** Present on both with equal per-document digest — reported as identities only, no field pass run. */
124
+ unchanged: RenderDiffDocumentRef[];
125
+ /**
126
+ * Documents each manifest's index could not identify — present in the
127
+ * stream (`docCount`) but absent from `documents` (unparseable, or no
128
+ * `kind` + `metadata.name`). Never matched, never silently dropped.
129
+ */
130
+ unindexed: {
131
+ from: number;
132
+ to: number;
133
+ };
134
+ }
135
+ export interface DiffRendersOptions {
136
+ /** Render store root override; defaults to `renderStoreRoot()`. */
137
+ root?: string;
138
+ }
139
+ /**
140
+ * Diff two renders already in the store, by content digest. Offline: every
141
+ * byte compared comes from the archive (render-store.ts), never a cluster.
142
+ *
143
+ * Throws when either digest has no manifest — a diff over a render nobody
144
+ * persisted is a usage error, not an empty report.
145
+ */
146
+ export declare function diffRenders(from: string, to: string, options?: DiffRendersOptions): RenderDiffResult;
147
+ /** True when the diff found no added, removed, or changed documents. */
148
+ export declare function renderDiffIsEmpty(result: RenderDiffResult): boolean;
149
+ export interface RenderLiveDiffOptions {
150
+ /** The stored render to diff against the cluster — a `contentDigest` from `chant helm renders`. */
151
+ contentDigest: string;
152
+ /** The chant environment the live read targets — resolves the k8s cluster binding (`k8s.profiles.<environment>.context`), same as any other live read. */
153
+ environment: string;
154
+ /** Render store root override (tests); defaults to `renderStoreRoot()`. */
155
+ root?: string;
156
+ owned?: boolean;
157
+ }
158
+ export interface RenderLiveDiffDeps {
159
+ /** Forwarded to the k8s reader — a test passes a fake cluster's connector. */
160
+ connect?: K8sConnector;
161
+ }
162
+ export type RenderLiveDiffOutcome = {
163
+ found: true;
164
+ manifest: RenderManifest;
165
+ diff: DeepDiffResult;
166
+ }
167
+ /** No such render in the store — refuse the diff rather than report a false clean result. */
168
+ | {
169
+ found: false;
170
+ contentDigest: string;
171
+ };
172
+ /** Row key convention shared with the release-scoped reads (#1246/#1247): `<Kind>/<namespace>/<name>`, `cluster:<Kind>/<name>`. */
173
+ export declare function documentKey(kind: string, namespace: string | undefined, name: string): string;
174
+ /**
175
+ * A namespace-silent document defaults to the render's target namespace —
176
+ * the same rule a deployed release applies to its manifest (`helm apply
177
+ * -n <ns>` targets whatever a namespace-silent object's `.Release.Namespace`
178
+ * would have filled in) — unless the kind is cluster-scoped, in which case a
179
+ * missing namespace is never defaulted.
180
+ */
181
+ export declare function resolveDocumentNamespace(kind: string, declared: string | null, renderNamespace: string | null): string | undefined;
182
+ /**
183
+ * Diff one stored render's documents against the live cluster.
184
+ *
185
+ * `found: false` when `contentDigest` is not in the store — never fabricates
186
+ * a document, and never reports "no drift" over a render this has no bytes
187
+ * for. On a found render, every document indexed in its manifest becomes a
188
+ * synthetic declared entity (keyed like a release's rows), read live through
189
+ * the k8s lexicon's deep observer, and diffed property-by-property.
190
+ */
191
+ export declare function diffRenderLive(options: RenderLiveDiffOptions, deps?: RenderLiveDiffDeps): Promise<RenderLiveDiffOutcome>;
192
+ //# sourceMappingURL=render-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-diff.d.ts","sourceRoot":"","sources":["../src/render-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAM7E,OAAO,EAAoE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMvH,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACtC,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yFAAyF;AACzF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,eAAgB,SAAQ,qBAAqB;IAC5D,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,EAAE,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,2DAA2D;IAC3D,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,6DAA6D;IAC7D,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,uEAAuE;IACvE,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,uGAAuG;IACvG,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC;;;;OAIG;IACH,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AA8DD,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,CA6DpG;AAaD,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAEnE;AAMD,MAAM,WAAW,qBAAqB;IACpC,mGAAmG;IACnG,aAAa,EAAE,MAAM,CAAC;IACtB,0JAA0J;IAC1J,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE;AACjE,6FAA6F;GAC3F;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAS5C,mIAAmI;AACnI,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,eAAe,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,GAAG,SAAS,CAIpB;AAYD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,EAC9B,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAqChC"}