@intentius/chant 0.124.45 → 0.124.46

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 (190) hide show
  1. package/dist/capabilities/aws.paths +148 -0
  2. package/dist/capabilities/base-mappings.json +122 -0
  3. package/dist/capabilities/catalog.d.ts +89 -0
  4. package/dist/capabilities/catalog.d.ts.map +1 -0
  5. package/dist/capabilities/catalog.js +204 -0
  6. package/dist/capabilities/language.d.ts +103 -0
  7. package/dist/capabilities/language.d.ts.map +1 -0
  8. package/dist/capabilities/language.js +335 -0
  9. package/dist/capabilities/matcher.d.ts +65 -0
  10. package/dist/capabilities/matcher.d.ts.map +1 -0
  11. package/dist/capabilities/matcher.js +299 -0
  12. package/dist/capabilities/view.d.ts +207 -0
  13. package/dist/capabilities/view.d.ts.map +1 -0
  14. package/dist/capabilities/view.js +484 -0
  15. package/dist/cli/commands/lint.d.ts.map +1 -1
  16. package/dist/cli/commands/lint.js +1 -0
  17. package/dist/cli/handlers/declared-graph.d.ts +44 -0
  18. package/dist/cli/handlers/declared-graph.d.ts.map +1 -0
  19. package/dist/cli/handlers/declared-graph.js +87 -0
  20. package/dist/cli/handlers/graph.d.ts +25 -0
  21. package/dist/cli/handlers/graph.d.ts.map +1 -1
  22. package/dist/cli/handlers/graph.js +93 -87
  23. package/dist/cli/handlers/pr-env.d.ts.map +1 -1
  24. package/dist/cli/handlers/pr-env.js +2 -1
  25. package/dist/cli/handlers/search-count.d.ts +89 -0
  26. package/dist/cli/handlers/search-count.d.ts.map +1 -0
  27. package/dist/cli/handlers/search-count.js +132 -0
  28. package/dist/cli/handlers/search.d.ts +358 -6
  29. package/dist/cli/handlers/search.d.ts.map +1 -1
  30. package/dist/cli/handlers/search.js +1065 -155
  31. package/dist/cli/main.d.ts.map +1 -1
  32. package/dist/cli/main.js +23 -3
  33. package/dist/cli/mcp/server.d.ts.map +1 -1
  34. package/dist/cli/mcp/server.js +3 -0
  35. package/dist/cli/mcp/tools/capabilities.d.ts +7 -0
  36. package/dist/cli/mcp/tools/capabilities.d.ts.map +1 -0
  37. package/dist/cli/mcp/tools/capabilities.js +27 -0
  38. package/dist/cli/mcp/workspace-tools.d.ts +3 -1
  39. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  40. package/dist/cli/mcp/workspace-tools.js +47 -2
  41. package/dist/cli/parse-args.d.ts.map +1 -1
  42. package/dist/cli/parse-args.js +64 -17
  43. package/dist/cli/registry.d.ts +22 -0
  44. package/dist/cli/registry.d.ts.map +1 -1
  45. package/dist/components/pr-env-ports.d.ts +29 -0
  46. package/dist/components/pr-env-ports.d.ts.map +1 -0
  47. package/dist/components/pr-env-ports.js +77 -0
  48. package/dist/components/pr-env-run.d.ts +5 -21
  49. package/dist/components/pr-env-run.d.ts.map +1 -1
  50. package/dist/components/pr-env-run.js +6 -70
  51. package/dist/components/pr-environment.d.ts +2 -1
  52. package/dist/components/pr-environment.d.ts.map +1 -1
  53. package/dist/components/pr-environment.js +1 -1
  54. package/dist/config-environments.d.ts +92 -0
  55. package/dist/config-environments.d.ts.map +1 -0
  56. package/dist/config-environments.js +102 -0
  57. package/dist/config.d.ts +24 -84
  58. package/dist/config.d.ts.map +1 -1
  59. package/dist/config.js +9 -96
  60. package/dist/graph-detail.d.ts.map +1 -1
  61. package/dist/graph-detail.js +15 -3
  62. package/dist/graph-effective.d.ts +33 -2
  63. package/dist/graph-effective.d.ts.map +1 -1
  64. package/dist/graph-effective.js +215 -68
  65. package/dist/graph-ir.d.ts +23 -0
  66. package/dist/graph-ir.d.ts.map +1 -1
  67. package/dist/graph-ir.js +130 -0
  68. package/dist/graph-sub-template.d.ts +11 -0
  69. package/dist/graph-sub-template.d.ts.map +1 -0
  70. package/dist/graph-sub-template.js +19 -0
  71. package/dist/lexicon.d.ts +9 -0
  72. package/dist/lexicon.d.ts.map +1 -1
  73. package/dist/lifecycle/observe.d.ts +28 -0
  74. package/dist/lifecycle/observe.d.ts.map +1 -1
  75. package/dist/lifecycle/observe.js +23 -1
  76. package/dist/lint/rule.d.ts +6 -0
  77. package/dist/lint/rule.d.ts.map +1 -1
  78. package/dist/live-endpoint.d.ts +1 -1
  79. package/dist/live-endpoint.d.ts.map +1 -1
  80. package/dist/live-endpoint.js +1 -1
  81. package/dist/observation.d.ts +48 -1
  82. package/dist/observation.d.ts.map +1 -1
  83. package/dist/observation.js +21 -5
  84. package/dist/op/activities/activity-contracts.d.ts +4 -4
  85. package/dist/wave-runtime.mjs +250 -249
  86. package/dist/workspace/capabilities-contract.d.ts +66 -0
  87. package/dist/workspace/capabilities-contract.d.ts.map +1 -0
  88. package/dist/workspace/capabilities-contract.js +107 -0
  89. package/dist/workspace/capabilities.schema.json +229 -0
  90. package/dist/workspace/compose-graph.d.ts +9 -0
  91. package/dist/workspace/compose-graph.d.ts.map +1 -1
  92. package/dist/workspace/compose-graph.js +3 -1
  93. package/dist/workspace/conformance/index.d.ts +1 -1
  94. package/dist/workspace/conformance/index.d.ts.map +1 -1
  95. package/dist/workspace/conformance/index.js +39 -2
  96. package/dist/workspace/graph-cache.d.ts +8 -0
  97. package/dist/workspace/graph-cache.d.ts.map +1 -1
  98. package/dist/workspace/graph-cache.js +27 -3
  99. package/dist/workspace/graph-cli.d.ts +39 -2
  100. package/dist/workspace/graph-cli.d.ts.map +1 -1
  101. package/dist/workspace/graph-cli.js +66 -24
  102. package/dist/workspace/graph.schema.json +148 -0
  103. package/dist/workspace/kind-readers.d.ts +3 -0
  104. package/dist/workspace/kind-readers.d.ts.map +1 -1
  105. package/dist/workspace/kind-readers.js +7 -1
  106. package/dist/workspace/member-commands.d.ts +10 -1
  107. package/dist/workspace/member-commands.d.ts.map +1 -1
  108. package/dist/workspace/member-commands.js +17 -1
  109. package/dist/workspace/nested-graph.d.ts +2 -0
  110. package/dist/workspace/nested-graph.d.ts.map +1 -1
  111. package/dist/workspace/nested-graph.js +32 -1
  112. package/dist/workspace/reason-codes.d.ts +10 -0
  113. package/dist/workspace/reason-codes.d.ts.map +1 -1
  114. package/dist/workspace/reason-codes.js +12 -0
  115. package/dist/workspace/search-cli.d.ts +204 -0
  116. package/dist/workspace/search-cli.d.ts.map +1 -0
  117. package/dist/workspace/search-cli.js +466 -0
  118. package/dist/workspace/search-contract.d.ts +56 -0
  119. package/dist/workspace/search-contract.d.ts.map +1 -0
  120. package/dist/workspace/search-contract.js +70 -0
  121. package/dist/workspace/search.schema.json +822 -0
  122. package/package.json +1 -1
  123. package/src/__snapshots__/okf.test.ts.snap +10 -0
  124. package/src/capabilities/aws.paths +148 -0
  125. package/src/capabilities/base-mappings.json +122 -0
  126. package/src/capabilities/catalog.ts +230 -0
  127. package/src/capabilities/language.test.ts +191 -0
  128. package/src/capabilities/language.ts +373 -0
  129. package/src/capabilities/matcher.ts +315 -0
  130. package/src/capabilities/view-compose.test.ts +76 -0
  131. package/src/capabilities/view.ts +631 -0
  132. package/src/cli/commands/lint.ts +1 -0
  133. package/src/cli/handlers/declared-graph.ts +99 -0
  134. package/src/cli/handlers/graph.test.ts +94 -3
  135. package/src/cli/handlers/graph.ts +123 -96
  136. package/src/cli/handlers/pr-env.ts +1 -2
  137. package/src/cli/handlers/search-build-roots.test.ts +144 -0
  138. package/src/cli/handlers/search-count.test.ts +191 -0
  139. package/src/cli/handlers/search-count.ts +165 -0
  140. package/src/cli/handlers/search-json.test.ts +333 -0
  141. package/src/cli/handlers/search-live.test.ts +387 -0
  142. package/src/cli/handlers/search-paths.test.ts +235 -0
  143. package/src/cli/handlers/search.ts +1312 -166
  144. package/src/cli/main.test.ts +28 -3
  145. package/src/cli/main.ts +23 -3
  146. package/src/cli/mcp/server.test.ts +3 -3
  147. package/src/cli/mcp/server.ts +3 -0
  148. package/src/cli/mcp/tools/capabilities.ts +32 -0
  149. package/src/cli/mcp/workspace-tools.e2e.test.ts +21 -1
  150. package/src/cli/mcp/workspace-tools.ts +47 -2
  151. package/src/cli/parse-args.ts +52 -13
  152. package/src/cli/registry.ts +22 -0
  153. package/src/components/pr-env-ports.ts +89 -0
  154. package/src/components/pr-env-run-bundle.test.ts +54 -0
  155. package/src/components/pr-env-run.ts +5 -76
  156. package/src/components/pr-environment.ts +2 -1
  157. package/src/config-environments.ts +133 -0
  158. package/src/config.ts +37 -124
  159. package/src/graph-detail.ts +15 -3
  160. package/src/graph-effective.ts +226 -75
  161. package/src/graph-ir.test.ts +163 -0
  162. package/src/graph-ir.ts +147 -0
  163. package/src/graph-sub-template.ts +22 -0
  164. package/src/lexicon.ts +10 -0
  165. package/src/lifecycle/observe.test.ts +27 -1
  166. package/src/lifecycle/observe.ts +43 -1
  167. package/src/lint/rule.ts +6 -0
  168. package/src/live-endpoint.ts +1 -1
  169. package/src/observation.test.ts +25 -0
  170. package/src/observation.ts +69 -5
  171. package/src/workspace/capabilities-contract.test.ts +88 -0
  172. package/src/workspace/capabilities-contract.ts +132 -0
  173. package/src/workspace/capabilities.schema.json +229 -0
  174. package/src/workspace/compose-graph.ts +10 -1
  175. package/src/workspace/conformance/conformance.e2e.test.ts +14 -1
  176. package/src/workspace/conformance/index.ts +31 -2
  177. package/src/workspace/graph-cache.ts +27 -3
  178. package/src/workspace/graph-cli.ts +96 -24
  179. package/src/workspace/graph.schema.json +148 -0
  180. package/src/workspace/kind-readers.e2e.test.ts +28 -0
  181. package/src/workspace/kind-readers.test.ts +1 -1
  182. package/src/workspace/kind-readers.ts +7 -1
  183. package/src/workspace/member-commands.ts +22 -1
  184. package/src/workspace/nested-graph.ts +32 -1
  185. package/src/workspace/reason-codes.test.ts +7 -0
  186. package/src/workspace/reason-codes.ts +12 -0
  187. package/src/workspace/search-cli.e2e.test.ts +305 -0
  188. package/src/workspace/search-cli.ts +591 -0
  189. package/src/workspace/search-contract.ts +95 -0
  190. package/src/workspace/search.schema.json +822 -0
package/dist/config.js CHANGED
@@ -7,86 +7,11 @@ import { evaluateProjectConfig } from "./config-sandbox.js";
7
7
  import { lexiconNames, pathLexiconRoot, registerLexiconDeclarations } from "./lexicon-module.js";
8
8
  import { decideConfigSchema } from "./op/decide-config.js";
9
9
  import { PublishDeclarationSchema } from "./lifecycle/publish-declaration.js";
10
- /** The declared name of one `environments` entry, whichever form it takes. */
11
- export function environmentName(entry) {
12
- return typeof entry === "string" ? entry : entry.name;
13
- }
14
- /**
15
- * Every declared environment's name, in `environments` order. `undefined` in,
16
- * `undefined` out — mirrors the field itself being optional, so a caller that
17
- * already writes `config.environments?.something` can keep doing so:
18
- * `environmentNames(config.environments)?.includes(name)`.
19
- */
20
- export function environmentNames(environments) {
21
- return environments?.map(environmentName);
22
- }
23
- /**
24
- * Whether a declared environment name is a glob pattern rather than a literal
25
- * (#1221) — it contains at least one `*`.
26
- */
27
- export function isEnvironmentPattern(declaredName) {
28
- return declaredName.includes("*");
29
- }
30
- /**
31
- * Anchored `*`-glob match (#1221): each `*` in `pattern` matches any run of
32
- * characters (possibly empty); everything else matches itself. Deliberately
33
- * the whole surface — no `?`, no character classes, no regex. A pattern with
34
- * no `*` degenerates to string equality.
35
- */
36
- export function matchesEnvironmentPattern(pattern, name) {
37
- const parts = pattern.split("*");
38
- if (parts.length === 1)
39
- return pattern === name;
40
- const first = parts[0];
41
- const last = parts[parts.length - 1];
42
- if (!name.startsWith(first))
43
- return false;
44
- let cursor = first.length;
45
- for (let i = 1; i < parts.length - 1; i++) {
46
- const part = parts[i];
47
- if (part === "")
48
- continue;
49
- const at = name.indexOf(part, cursor);
50
- if (at === -1)
51
- return false;
52
- cursor = at + part.length;
53
- }
54
- return name.length - cursor >= last.length && name.endsWith(last);
55
- }
56
- /**
57
- * Environment-membership test (#1221): is `name` covered by this project's
58
- * declared `environments`? A literal entry matches by equality; an entry
59
- * containing `*` matches as a glob pattern (`"pr-*"` covers `pr-42`).
60
- * Literals are checked first across the whole list, then patterns — so a
61
- * name that is declared outright never depends on pattern order. `undefined`
62
- * / empty `environments` returns `false`; callers that treat "no declared
63
- * environments" as "anything goes" (e.g. {@link unknownEnvError} in
64
- * `./env.ts`) guard that case themselves.
65
- */
66
- export function matchesDeclaredEnvironment(environments, name) {
67
- const names = environmentNames(environments) ?? [];
68
- if (names.includes(name))
69
- return true;
70
- return names.some((declared) => isEnvironmentPattern(declared) && matchesEnvironmentPattern(declared, name));
71
- }
72
- /**
73
- * The endpoint `name` declares (chant #1166) — `undefined` for a bare-string
74
- * entry, an entry with no `endpoint` set, or a name this project doesn't
75
- * declare at all. `./live-endpoint.ts`'s `applyLiveEndpoint` is the consumer:
76
- * it injects this into the ambient env var each observing lexicon's CLI
77
- * shell-out reads (e.g. `AWS_ENDPOINT_URL`), unless that var is already set —
78
- * ambient always wins.
79
- *
80
- * A pattern entry (#1221) can carry an endpoint too: `{ name: "pr-*",
81
- * endpoint }` supplies the endpoint for every `pr-<n>` environment. A literal
82
- * entry always wins over a pattern — declaring `pr-special` alongside
83
- * `pr-*` resolves `pr-special` to the literal entry's endpoint (or none).
84
- */
85
- export function environmentEndpoint(environments, name) {
86
- const found = environments?.find((e) => environmentName(e) === name) ??
87
- environments?.find((e) => isEnvironmentPattern(environmentName(e)) && matchesEnvironmentPattern(environmentName(e), name));
88
- return found && typeof found !== "string" ? found.endpoint : undefined;
89
- }
10
+ // The environment and ownership helpers that read a config already loaded
11
+ // live in ./config-environments.ts, which loads nothing, so a bundle that
12
+ // needs only them stays clear of the loader below (#4356 follow-up).
13
+ export { environmentEndpoint, environmentName, environmentNames, isEnvironmentPattern, isOwnershipParamRef, matchesDeclaredEnvironment, matchesEnvironmentPattern, resolveOwnershipStack, } from "./config-environments.js";
14
+ import { isOwnershipParamRef, resolveOwnershipStack } from "./config-environments.js";
90
15
  /**
91
16
  * Zod schema for ChantConfig validation.
92
17
  */
@@ -120,6 +45,10 @@ export const ChantConfigSchema = z.object({
120
45
  build: z.object({
121
46
  fold: z.boolean().optional(),
122
47
  }).optional(),
48
+ // Strict like `run`: a misspelt `lint` would leave the gate on with nothing said.
49
+ graph: z.object({
50
+ lint: z.enum(["gate", "report"]).optional(),
51
+ }).strict().optional(),
123
52
  buildParams: z.record(z.string(), z.object({
124
53
  type: z.enum(["string", "number", "boolean"]),
125
54
  default: z.union([z.string(), z.number(), z.boolean()]).optional(),
@@ -358,22 +287,6 @@ function warnIfFragmentShadowsProjectConfig(configPath) {
358
287
  }
359
288
  /** Top-level keys that make a config a *project* config rather than a lint fragment. */
360
289
  const PROJECT_CONFIG_KEYS = new Set(Object.keys(ChantConfigSchema.shape).filter((k) => k !== "lint"));
361
- /** Whether an `ownership.env` entry is a build-parameter reference rather than a literal. */
362
- export function isOwnershipParamRef(env) {
363
- return typeof env === "object" && env !== null && typeof env.param === "string";
364
- }
365
- /**
366
- * The ownership stack identity alone — `ownership.stack` when marking is on
367
- * (no `stack`, or `enabled: false`, means off). For callers that need the
368
- * stack and nothing else (a field manager, a prune selector) and so have no
369
- * build parameters to resolve `env` against.
370
- */
371
- export function resolveOwnershipStack(config) {
372
- const o = config.ownership;
373
- if (!o || !o.stack || o.enabled === false)
374
- return undefined;
375
- return o.stack;
376
- }
377
290
  /**
378
291
  * Resolve the `env` half of the ownership marker (#1396). A literal is
379
292
  * returned as-is. A `{ param }` reference is looked up in this build's resolved
@@ -1 +1 @@
1
- {"version":3,"file":"graph-detail.d.ts","sourceRoot":"","sources":["../src/graph-detail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAExC,eAAO,MAAM,MAAM;aACjB,MAAM,EAAE,CAAC;aACT,UAAU,EAAE,CAAC;aACb,WAAW,EAAE,CAAC;aACd,UAAU,EAAE,CAAC;CACL,CAAC;AAEX,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAYpE;AAqPD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAYtF"}
1
+ {"version":3,"file":"graph-detail.d.ts","sourceRoot":"","sources":["../src/graph-detail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,YAAY,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAExC,eAAO,MAAM,MAAM;aACjB,MAAM,EAAE,CAAC;aACT,UAAU,EAAE,CAAC;aACb,WAAW,EAAE,CAAC;aACd,UAAU,EAAE,CAAC;CACL,CAAC;AAEX,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAYpE;AAgQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAYtF"}
@@ -1,3 +1,4 @@
1
+ import { subTemplateRefs } from "./graph-sub-template.js";
1
2
  export const DETAIL = {
2
3
  STACKS: 0,
3
4
  COMPOSITES: 1,
@@ -28,12 +29,12 @@ function paintAttrs(attrs) {
28
29
  out[k] = v;
29
30
  return out;
30
31
  }
31
- /** A `{ $ref: "producer.attribute" }` envelope — a reference, not a property tree. */
32
+ /** A `{ $ref: "producer.attribute" }` or `{ $sub: "..." }` (#4373) envelope — a reference, not a property tree. */
32
33
  function isRefEnvelope(v) {
33
34
  return (typeof v === "object" &&
34
35
  v !== null &&
35
36
  !Array.isArray(v) &&
36
- typeof v.$ref === "string");
37
+ (typeof v.$ref === "string" || typeof v.$sub === "string"));
37
38
  }
38
39
  /** T2's resource view of a node's attrs: overlay paint, scalar fields
39
40
  * (identity, status-relevant values), and top-level reference envelopes.
@@ -235,7 +236,8 @@ function toAttributes(ir) {
235
236
  });
236
237
  return { ...ir, edges };
237
238
  }
238
- /** Find the attribute in a `{ $ref: "producer.attribute" }` envelope under attrs. */
239
+ /** Find the attribute in a `{ $ref: "producer.attribute" }` envelope under attrs,
240
+ * or in a `{ $sub }` envelope's `${producer.attribute}` (#4373). */
239
241
  function findRefAttr(attrs, producer) {
240
242
  let found;
241
243
  const visit = (v) => {
@@ -254,6 +256,16 @@ function findRefAttr(attrs, producer) {
254
256
  return;
255
257
  }
256
258
  }
259
+ const sub = v.$sub;
260
+ if (typeof sub === "string") {
261
+ const vars = v.$vars;
262
+ const bound = new Set(vars && typeof vars === "object" ? Object.keys(vars) : []);
263
+ const hit = subTemplateRefs(sub, bound).find((r) => r.name === producer && r.attr);
264
+ if (hit) {
265
+ found = hit.attr;
266
+ return;
267
+ }
268
+ }
257
269
  for (const val of Object.values(v))
258
270
  visit(val);
259
271
  };
@@ -1,4 +1,5 @@
1
- import type { GraphIR } from "./graph-ir.js";
1
+ import type { GraphIR, IRNode } from "./graph-ir.js";
2
+ import { type CapabilityPack } from "./capabilities/view.js";
2
3
  /**
3
4
  * Fold DERIVED reachability facts onto EC2 instance nodes so a single-node query
4
5
  * can answer questions that are otherwise a multi-hop join with a union (#1139).
@@ -20,6 +21,36 @@ import type { GraphIR } from "./graph-ir.js";
20
21
  * With these, "instances SSH-reachable from the internet" is one predicate:
21
22
  * `kind:EC2::Instance attr:internetFacing=true attr:effectiveIngress=tcp:22:0.0.0.0/0`
22
23
  * — no hand-joined CLI sweep, no over/under-counting.
24
+ *
25
+ * Both are capability rules (#4375): `internet-facing`, `in-sg` and
26
+ * `ingress-of` in `capabilities/aws.paths`, over the lexicon-neutral view, so
27
+ * one rule serves CloudFormation kinds and Terraform's AWS types (#4362)
28
+ * alike. What stays here is the attribute surface: which nodes get the facts,
29
+ * and how a rule's evidence is spelled as `proto:port:cidr` and `...Via`.
30
+ */
31
+ export declare function enrichEffectiveTopology(ir: GraphIR, packs?: CapabilityPack[]): GraphIR;
32
+ /**
33
+ * The Terraform type of a `resource` or `data` node: `aws_instance` for
34
+ * `aws_instance.web`, `data.aws_ami` for `data.aws_ami.ubuntu`. Undefined for
35
+ * any other node.
36
+ *
37
+ * This is the one reading of a terraform node's type. `chant search`'s `kind:`
38
+ * (#4366), its rows and `--explain` count, `--count-by kind` (#4360) and the
39
+ * effective-topology folds (#4362) all call it, so they cannot disagree.
40
+ *
41
+ * The terraform lexicon puts every resource on the IR as `Terraform::Resource`
42
+ * (and every data source as `Terraform::Data`) and carries the block's type
43
+ * label as `attrs.type` (#4366), which is read first. A node without one (an
44
+ * older producer, or a `chant graph --live` node built from state) falls back
45
+ * to the block's address (`aws_instance.web`, or `module.app.aws_instance.web`)
46
+ * in `attrs.address`, whose second-to-last segment is the type, and failing
47
+ * that to its id, whose last path segment is the address too. A data source
48
+ * keeps its `data.` prefix: `data.aws_ami` reads an AMI, it does not manage one.
49
+ */
50
+ export declare function terraformType(n: IRNode | undefined): string | undefined;
51
+ /**
52
+ * The provider resource type of a terraform `resource` node (`aws_instance`),
53
+ * or undefined for any other node, data sources included. See {@link terraformType}.
23
54
  */
24
- export declare function enrichEffectiveTopology(ir: GraphIR): GraphIR;
55
+ export declare function terraformResourceType(n: IRNode | undefined): string | undefined;
25
56
  //# sourceMappingURL=graph-effective.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph-effective.d.ts","sourceRoot":"","sources":["../src/graph-effective.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CA2F5D"}
1
+ {"version":3,"file":"graph-effective.d.ts","sourceRoot":"","sources":["../src/graph-effective.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAa,KAAK,cAAc,EAAa,MAAM,qBAAqB,CAAC;AAGhF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,GAAE,cAAc,EAAO,GAAG,OAAO,CA4C1F;AAkGD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE/E"}
@@ -1,3 +1,6 @@
1
+ import { CapabilityEngine } from "./capabilities/matcher.js";
2
+ import { buildView } from "./capabilities/view.js";
3
+ import { resolvePacks, shippedRules } from "./capabilities/catalog.js";
1
4
  /**
2
5
  * Fold DERIVED reachability facts onto EC2 instance nodes so a single-node query
3
6
  * can answer questions that are otherwise a multi-hop join with a union (#1139).
@@ -19,89 +22,233 @@
19
22
  * With these, "instances SSH-reachable from the internet" is one predicate:
20
23
  * `kind:EC2::Instance attr:internetFacing=true attr:effectiveIngress=tcp:22:0.0.0.0/0`
21
24
  * — no hand-joined CLI sweep, no over/under-counting.
25
+ *
26
+ * Both are capability rules (#4375): `internet-facing`, `in-sg` and
27
+ * `ingress-of` in `capabilities/aws.paths`, over the lexicon-neutral view, so
28
+ * one rule serves CloudFormation kinds and Terraform's AWS types (#4362)
29
+ * alike. What stays here is the attribute surface: which nodes get the facts,
30
+ * and how a rule's evidence is spelled as `proto:port:cidr` and `...Via`.
22
31
  */
23
- export function enrichEffectiveTopology(ir) {
24
- const byId = new Map(ir.nodes.map((n) => [n.id, n]));
25
- const edges = ir.edges ?? [];
26
- const kind = (n) => n?.kind ?? "";
27
- const isKind = (n, suffix) => !!n && (kind(n) === suffix || kind(n).endsWith("::" + suffix));
28
- const via = (...names) => (v) => names.includes(v);
29
- /** Out-neighbours of `id` (edges from → to), optionally filtered by viaAttr. */
30
- const out = (id, pred) => edges
31
- .filter((e) => e.from === id && (!pred || pred(e.viaAttr ?? e.kind ?? "")))
32
- .map((e) => byId.get(e.to))
33
- .filter((x) => !!x);
34
- /** In-neighbours of `id` (edges to ← from), optionally filtered by viaAttr. */
35
- const incoming = (id, pred) => edges
36
- .filter((e) => e.to === id && (!pred || pred(e.viaAttr ?? e.kind ?? "")))
37
- .map((e) => byId.get(e.from))
38
- .filter((x) => !!x);
39
- const normalizeIngress = (sg) => {
40
- const rules = sg.attrs?.["SecurityGroupIngress"];
41
- if (!Array.isArray(rules))
42
- return [];
43
- return rules.map((r) => {
44
- const rule = r;
45
- const proto = String(rule.IpProtocol ?? "-1");
46
- const from = rule.FromPort;
47
- const to = rule.ToPort;
48
- const port = from == null ? "all" : from === to ? `${from}` : `${from}-${to}`;
49
- const cidr = rule.CidrIp ??
50
- rule.CidrIpv6 ??
51
- (rule.SourceSecurityGroupId ? `sg:${String(rule.SourceSecurityGroupId)}` : "?");
52
- return `${proto}:${port}:${cidr}`;
53
- });
54
- };
55
- /** Security groups reachable from an instance — direct and via launch template. */
56
- const effectiveSgs = (inst) => {
57
- const direct = out(inst.id, via("SecurityGroupIds", "SecurityGroupId"));
58
- const templates = out(inst.id, via("LaunchTemplate", "LaunchTemplateId"));
59
- const viaTemplate = templates
60
- .flatMap((lt) => out(lt.id, via("LaunchTemplateData", "SecurityGroupIds", "SecurityGroupId")))
61
- .filter((n) => isKind(n, "SecurityGroup"));
62
- const all = [...direct.filter((n) => isKind(n, "SecurityGroup")), ...viaTemplate];
63
- return [...new Map(all.map((s) => [s.id, s])).values()];
64
- };
65
- /** The IGW an instance's subnet routes to (evidence), or undefined. */
66
- const internetFacingVia = (inst) => {
67
- for (const subnet of out(inst.id, via("SubnetId")).filter((n) => isKind(n, "Subnet"))) {
68
- const assocs = incoming(subnet.id, via("SubnetId")).filter((a) => isKind(a, "SubnetRouteTableAssociation"));
69
- const routeTables = assocs.flatMap((a) => out(a.id, via("RouteTableId")).filter((n) => isKind(n, "RouteTable")));
70
- for (const rt of routeTables) {
71
- const routes = incoming(rt.id, via("RouteTableId")).filter((n) => isKind(n, "Route"));
72
- for (const route of routes) {
73
- const dest = route.attrs?.["DestinationCidrBlock"];
74
- const igw = out(route.id, via("GatewayId")).find((g) => isKind(g, "InternetGateway"));
75
- if (igw && (dest == null || dest === "0.0.0.0/0")) {
76
- const id = igw.id.includes("::") ? igw.id.slice(igw.id.lastIndexOf("::") + 2) : igw.id;
77
- return `${rt.id.includes("::") ? rt.id.slice(rt.id.lastIndexOf("::") + 2) : rt.id} → ${id}`;
78
- }
79
- }
80
- }
81
- }
82
- return undefined;
83
- };
32
+ export function enrichEffectiveTopology(ir, packs = []) {
33
+ const view = buildView(ir, resolvePacks(packs));
34
+ const engine = new CapabilityEngine(view, shippedRules().rules);
35
+ const facing = engine.set("internet-facing");
36
+ const groups = engine.relation("in-sg").out;
84
37
  const nodes = ir.nodes.map((n) => {
85
- if (!isKind(n, "Instance"))
38
+ const tf = terraformResourceType(n) === "aws_instance";
39
+ if (!tf && !isKind(n, "Instance"))
86
40
  return n;
87
- const effectiveIngress = effectiveSgs(n).flatMap(normalizeIngress);
41
+ const attrs = (n.attrs ?? {});
42
+ const reached = [...(groups.get(n.id) ?? new Map())];
43
+ const ingress = reached.flatMap(([sg]) => ingressStrings(view, sg));
44
+ const effectiveIngress = tf ? [...new Set(ingress)] : ingress;
88
45
  // A live enrichment may already have set internetFacing (+ its evidence) for
89
46
  // a subnet chant doesn't model declaratively (e.g. the account's default
90
47
  // VPC). Keep that truth; otherwise derive it from the declared route topology.
91
- const attrs = (n.attrs ?? {});
92
48
  const liveFacing = attrs["internetFacing"] === true;
93
- const declaredVia = internetFacingVia(n);
49
+ const evidence = facing.get(n.id);
50
+ const declaredVia = evidence && evidence.hops.length > 0 ? facingVia(view, evidence, tf) : undefined;
94
51
  const via = attrs["internetFacingVia"] ?? declaredVia;
52
+ const ingressVia = tf ? reached.map(([sg, ev]) => groupPath(view, ev, sg)).join(", ") : "";
95
53
  return {
96
54
  ...n,
97
- attrs: { ...attrs, effectiveIngress, internetFacing: liveFacing || !!declaredVia, ...(via ? { internetFacingVia: via } : {}) },
55
+ attrs: {
56
+ ...attrs,
57
+ effectiveIngress,
58
+ internetFacing: liveFacing || !!declaredVia,
59
+ ...(via ? { internetFacingVia: via } : {}),
60
+ ...(ingressVia ? { effectiveIngressVia: `security groups ${ingressVia}` } : {}),
61
+ },
98
62
  };
99
63
  });
100
64
  // Record what this pass computed, so a caller can report the graph's derived surface
101
65
  // without hardcoding attribute names. Only kinds actually enriched are listed.
102
66
  const enriched = nodes.some((n) => isKind(n, "Instance"));
103
- const derivedAttrs = enriched
104
- ? { ...(ir.derivedAttrs ?? {}), Instance: ["internetFacing", "effectiveIngress"] }
67
+ const enrichedTf = nodes.some((n) => terraformResourceType(n) === "aws_instance");
68
+ const derivedAttrs = enriched || enrichedTf
69
+ ? {
70
+ ...(ir.derivedAttrs ?? {}),
71
+ ...(enriched ? { Instance: ["internetFacing", "effectiveIngress"] } : {}),
72
+ ...(enrichedTf ? { aws_instance: ["internetFacing", "effectiveIngress"] } : {}),
73
+ }
105
74
  : ir.derivedAttrs;
106
75
  return { ...ir, nodes, ...(derivedAttrs ? { derivedAttrs } : {}) };
107
76
  }
77
+ function isKind(n, suffix) {
78
+ const kind = n?.kind ?? "";
79
+ return !!n && (kind === suffix || kind.endsWith("::" + suffix));
80
+ }
81
+ function bare(id) {
82
+ return id.includes("::") ? id.slice(id.lastIndexOf("::") + 2) : id;
83
+ }
84
+ /** A node's name in a fold's evidence: a terraform address, or a bare logical id. */
85
+ function display(view, id) {
86
+ const v = view.nodes.get(id);
87
+ if (v && v.lexicon === "terraform")
88
+ return id.slice(id.lastIndexOf("/") + 1);
89
+ return bare(id);
90
+ }
91
+ /** The ids an evidence path visits, in walk order. */
92
+ function visited(ev, start) {
93
+ const out = start ? [start] : [];
94
+ let at = start;
95
+ for (const h of ev.hops) {
96
+ const next = at === undefined ? h.to : h.from === at ? h.to : h.from;
97
+ if (at === undefined)
98
+ out.push(h.from === next ? h.to : h.from);
99
+ out.push(next);
100
+ at = next;
101
+ }
102
+ return out;
103
+ }
104
+ /** `internetFacingVia`, as each fold always spelled it. */
105
+ function facingVia(view, ev, tf) {
106
+ const ids = visited(ev);
107
+ const of = (label) => ids.find((id) => view.nodes.get(id)?.label === label);
108
+ const rt = of("RouteTable");
109
+ const igw = of("InternetGateway");
110
+ if (!rt || !igw)
111
+ return undefined;
112
+ if (!tf)
113
+ return `${bare(rt)} → ${bare(igw)}`;
114
+ const subnet = of("Subnet");
115
+ const route = of("Route");
116
+ const how = route && view.nodes.get(route)?.attrs.block ? "inline route" : route ? display(view, route) : "route";
117
+ return `subnet route ${subnet ? display(view, subnet) : "?"} -> ${display(view, rt)} -> ${display(view, igw)} (${how})`;
118
+ }
119
+ /** One reached group, as `effectiveIngressVia` names it: the group, or the template it came through. */
120
+ function groupPath(view, ev, sg) {
121
+ const lt = visited(ev).find((id) => view.nodes.get(id)?.label === "LaunchTemplate");
122
+ return lt ? `${display(view, lt)} -> ${display(view, sg)}` : display(view, sg);
123
+ }
124
+ const STYLE_ORDER = ["cfn", "tf-inline", "tf-sg-rule", "tf-vpc-rule"];
125
+ /** A group's ingress rules as `proto:port:source` strings, inline rules first. */
126
+ function ingressStrings(view, sg) {
127
+ const rules = view.edges
128
+ .filter((e) => e.from === sg && e.name === "ingress")
129
+ .map((e) => view.nodes.get(e.to))
130
+ .filter((r) => r && r.label === "IngressRule");
131
+ const order = (r) => (r.attrs.block ? -1 : STYLE_ORDER.indexOf(String(r.attrs.style)));
132
+ return [...rules]
133
+ .sort((a, b) => order(a) - order(b))
134
+ .flatMap((r) => {
135
+ const raw = (r.body ?? {});
136
+ switch (r.attrs.style) {
137
+ case "tf-inline":
138
+ return terraformIngress(raw, { proto: "protocol", cidrs: ["cidr_blocks", "ipv6_cidr_blocks", "prefix_list_ids"], groups: ["security_groups"] });
139
+ case "tf-sg-rule":
140
+ return terraformIngress(raw, { proto: "protocol", cidrs: ["cidr_blocks", "ipv6_cidr_blocks", "prefix_list_ids"], groups: ["source_security_group_id"] });
141
+ case "tf-vpc-rule":
142
+ return terraformIngress(raw, { proto: "ip_protocol", cidrs: ["cidr_ipv4", "cidr_ipv6", "prefix_list_id"], groups: ["referenced_security_group_id"] });
143
+ default:
144
+ return [cloudFormationIngress(raw)];
145
+ }
146
+ });
147
+ }
148
+ /** One CloudFormation ingress rule as `proto:port:source`. */
149
+ function cloudFormationIngress(rule) {
150
+ const proto = String(rule.IpProtocol ?? "-1");
151
+ const from = rule.FromPort;
152
+ const to = rule.ToPort;
153
+ const port = from == null ? "all" : from === to ? `${from}` : `${from}-${to}`;
154
+ const source = rule.SourceSecurityGroupId;
155
+ const group = source && typeof source === "object" && typeof source.$ref === "string"
156
+ ? String(source.$ref).replace(/\.[A-Za-z]+$/, "")
157
+ : source;
158
+ const cidr = rule.CidrIp ??
159
+ rule.CidrIpv6 ??
160
+ (group ? `sg:${String(group)}` : "?");
161
+ return `${proto}:${port}:${cidr}`;
162
+ }
163
+ /** The chant entity types every terraform `resource` and `data` block carries. */
164
+ const TERRAFORM_RESOURCE = "Terraform::Resource";
165
+ const TERRAFORM_DATA = "Terraform::Data";
166
+ /**
167
+ * The Terraform type of a `resource` or `data` node: `aws_instance` for
168
+ * `aws_instance.web`, `data.aws_ami` for `data.aws_ami.ubuntu`. Undefined for
169
+ * any other node.
170
+ *
171
+ * This is the one reading of a terraform node's type. `chant search`'s `kind:`
172
+ * (#4366), its rows and `--explain` count, `--count-by kind` (#4360) and the
173
+ * effective-topology folds (#4362) all call it, so they cannot disagree.
174
+ *
175
+ * The terraform lexicon puts every resource on the IR as `Terraform::Resource`
176
+ * (and every data source as `Terraform::Data`) and carries the block's type
177
+ * label as `attrs.type` (#4366), which is read first. A node without one (an
178
+ * older producer, or a `chant graph --live` node built from state) falls back
179
+ * to the block's address (`aws_instance.web`, or `module.app.aws_instance.web`)
180
+ * in `attrs.address`, whose second-to-last segment is the type, and failing
181
+ * that to its id, whose last path segment is the address too. A data source
182
+ * keeps its `data.` prefix: `data.aws_ami` reads an AMI, it does not manage one.
183
+ */
184
+ export function terraformType(n) {
185
+ if (!n || (n.kind !== TERRAFORM_RESOURCE && n.kind !== TERRAFORM_DATA))
186
+ return undefined;
187
+ const label = n.attrs?.["type"];
188
+ let type = typeof label === "string" && label.length > 0 ? label : undefined;
189
+ if (type === undefined) {
190
+ const parts = terraformAddress(n).split(".");
191
+ type = parts.length >= 2 ? parts[parts.length - 2] : undefined;
192
+ }
193
+ if (type === undefined)
194
+ return undefined;
195
+ return n.kind === TERRAFORM_DATA ? `data.${type}` : type;
196
+ }
197
+ /**
198
+ * The provider resource type of a terraform `resource` node (`aws_instance`),
199
+ * or undefined for any other node, data sources included. See {@link terraformType}.
200
+ */
201
+ export function terraformResourceType(n) {
202
+ return n?.kind === TERRAFORM_RESOURCE ? terraformType(n) : undefined;
203
+ }
204
+ function terraformAddress(n) {
205
+ const address = n.attrs?.["address"];
206
+ if (typeof address === "string" && address.length > 0)
207
+ return address;
208
+ return n.id.slice(n.id.lastIndexOf("/") + 1).replace(/~\d+$/, "");
209
+ }
210
+ function bodyOf(n) {
211
+ const body = n.attrs?.["body"];
212
+ return body && typeof body === "object" && !Array.isArray(body) ? body : {};
213
+ }
214
+ /** A block-or-list attribute as a list: hcl2json renders nested blocks as arrays. */
215
+ function list(value) {
216
+ if (value == null)
217
+ return [];
218
+ return Array.isArray(value) ? value : [value];
219
+ }
220
+ /** `${aws_security_group.x.id}` -> `aws_security_group.x`; anything else unchanged. */
221
+ function sourceRef(value) {
222
+ const s = String(value);
223
+ const m = /^\$\{([A-Za-z0-9_.-]+?)(?:\.(?:id|arn|name))?\}$/.exec(s);
224
+ return m ? m[1] : s;
225
+ }
226
+ /**
227
+ * One terraform ingress rule, in any of its three spellings, normalized to the
228
+ * `proto:port:source` strings the CloudFormation fold produces. A rule with
229
+ * several CIDRs or sources yields one string per source, so each is queryable
230
+ * on its own.
231
+ */
232
+ function terraformIngress(rule, fields) {
233
+ const rawProto = String(rule[fields.proto] ?? "-1").toLowerCase();
234
+ const proto = rawProto === "all" ? "-1" : rawProto;
235
+ const from = rule["from_port"];
236
+ const to = rule["to_port"];
237
+ const port = proto === "-1" || from == null
238
+ ? "all"
239
+ : String(from) === String(to ?? from)
240
+ ? `${from}`
241
+ : `${from}-${to}`;
242
+ const sources = [];
243
+ for (const f of fields.cidrs)
244
+ for (const c of list(rule[f]))
245
+ sources.push(String(c));
246
+ for (const f of fields.groups)
247
+ for (const g of list(rule[f]))
248
+ sources.push(`sg:${sourceRef(g)}`);
249
+ if (rule["self"] === true)
250
+ sources.push("sg:self");
251
+ if (sources.length === 0)
252
+ sources.push("?");
253
+ return sources.map((src) => `${proto}:${port}:${src}`);
254
+ }
@@ -1,6 +1,8 @@
1
1
  import { type Declarable } from "./declarable.js";
2
+ import { subTemplateRefs } from "./graph-sub-template.js";
2
3
  import type { ResourceMetadata } from "./lexicon.js";
3
4
  import type { UnobservedEntity } from "./observation.js";
5
+ export { subTemplateRefs };
4
6
  /**
5
7
  * Graph IR — the engine-neutral, lint-gated representation of a project's
6
8
  * resolved infrastructure graph. Painters (mermaid, graphviz, custom SVG) and
@@ -25,6 +27,20 @@ export interface SourceLoc {
25
27
  export interface AttrRefEnvelope {
26
28
  $ref: string;
27
29
  }
30
+ /**
31
+ * A CloudFormation `Fn::Sub` in an attribute projection (#4373), in place of
32
+ * `{ $intrinsic: true }`. `$sub` is the template exactly as it serializes, so
33
+ * `${assets.Arn}/*` names the producer and attribute a reader would otherwise
34
+ * have to guess. `$vars` is the two-argument form's variable map, each value
35
+ * projected like any other attr. Every `${Name}` or `${Name.Attr}` in the
36
+ * template that names a node, and every reference in `$vars`, is also an edge.
37
+ * `${!Literal}` (CloudFormation's escape), pseudo-parameters (`${AWS::Region}`)
38
+ * and names `$vars` binds are not.
39
+ */
40
+ export interface SubEnvelope {
41
+ $sub: string;
42
+ $vars?: Record<string, unknown>;
43
+ }
28
44
  /** One resource in the graph. */
29
45
  export interface IRNode {
30
46
  /** Logical name (the export name, or composite-expanded name). */
@@ -420,6 +436,13 @@ export interface GraphIR {
420
436
  * the passes produced, not a list maintained by hand.
421
437
  */
422
438
  derivedAttrs?: Record<string, string[]>;
439
+ /**
440
+ * With `chant graph --format ir --capability-view` (#4378): the
441
+ * lexicon-neutral view capability rules read, built by this chant through
442
+ * the project's own lexicon mappings and adapters. A `ViewDocument`
443
+ * (`capabilities/view.ts`). Absent unless asked for.
444
+ */
445
+ capabilityView?: unknown;
423
446
  }
424
447
  /**
425
448
  * Build the graph IR from resolved entities (the output of `discover`). Pure and
@@ -1 +1 @@
1
- {"version":3,"file":"graph-ir.d.ts","sourceRoot":"","sources":["../src/graph-ir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph-ir.d.ts","sourceRoot":"","sources":["../src/graph-ir.ts"],"names":[],"mappings":"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"}