@hawkeyexl/manni 4.1.0 → 4.3.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 (51) hide show
  1. package/README.md +2 -2
  2. package/dist/batch-7JJWXWSF.js +18 -0
  3. package/dist/batch-7JJWXWSF.js.map +1 -0
  4. package/dist/calibrate-IA2ARFMH.js +13 -0
  5. package/dist/calibrate-IA2ARFMH.js.map +1 -0
  6. package/dist/capture-C32JXIFN.js +15 -0
  7. package/dist/capture-C32JXIFN.js.map +1 -0
  8. package/dist/chunk-3R23C5DT.js +120 -0
  9. package/dist/chunk-3R23C5DT.js.map +1 -0
  10. package/dist/chunk-CI2GOU3A.js +4447 -0
  11. package/dist/chunk-CI2GOU3A.js.map +1 -0
  12. package/dist/{chunk-I57KBF45.js → chunk-DP2ZA3WH.js} +1203 -142
  13. package/dist/chunk-DP2ZA3WH.js.map +1 -0
  14. package/dist/chunk-ESJ5W7EV.js +297 -0
  15. package/dist/chunk-ESJ5W7EV.js.map +1 -0
  16. package/dist/chunk-IOYXPBCL.js +37 -0
  17. package/dist/chunk-IOYXPBCL.js.map +1 -0
  18. package/dist/chunk-KTSJ2ZHA.js +40 -0
  19. package/dist/chunk-KTSJ2ZHA.js.map +1 -0
  20. package/dist/{chunk-JODRT4NF.js → chunk-MFDD3YGU.js} +8 -37
  21. package/dist/chunk-MFDD3YGU.js.map +1 -0
  22. package/dist/chunk-MOQXWXSG.js +1941 -0
  23. package/dist/chunk-MOQXWXSG.js.map +1 -0
  24. package/dist/{chunk-S3NDEIOW.js → chunk-O6RVQKK6.js} +10502 -3017
  25. package/dist/chunk-O6RVQKK6.js.map +1 -0
  26. package/dist/chunk-QROCFW5S.js +174 -0
  27. package/dist/chunk-QROCFW5S.js.map +1 -0
  28. package/dist/chunk-RVVCA4WL.js +379 -0
  29. package/dist/chunk-RVVCA4WL.js.map +1 -0
  30. package/dist/cli.js +1293 -140
  31. package/dist/cli.js.map +1 -1
  32. package/dist/docmeta.js +3 -2
  33. package/dist/docmeta.js.map +1 -1
  34. package/dist/graph/embed.d.ts +154 -0
  35. package/dist/graph/embed.js +137 -0
  36. package/dist/graph/embed.js.map +1 -0
  37. package/dist/graph/runtime.d.ts +751 -0
  38. package/dist/graph/runtime.js +3067 -0
  39. package/dist/graph/runtime.js.map +1 -0
  40. package/dist/index.d.ts +6149 -799
  41. package/dist/index.js +682 -7
  42. package/dist/index.js.map +1 -1
  43. package/dist/picker-6HRMETE7.js +12 -0
  44. package/dist/picker-6HRMETE7.js.map +1 -0
  45. package/package.json +32 -4
  46. package/plugin/tracevals/.claude-plugin/plugin.json +9 -0
  47. package/plugin/tracevals/hooks/hooks.json +17 -0
  48. package/shapes/graph/shapes-1.0.0.ttl +689 -0
  49. package/dist/chunk-I57KBF45.js.map +0 -1
  50. package/dist/chunk-JODRT4NF.js.map +0 -1
  51. package/dist/chunk-S3NDEIOW.js.map +0 -1
@@ -1,14 +1,13 @@
1
1
  #!/usr/bin/env node
2
- var __defProp = Object.defineProperty;
3
- var __export = (target, all) => {
4
- for (var name2 in all)
5
- __defProp(target, name2, { get: all[name2], enumerable: true });
6
- };
2
+ import {
3
+ ToolError,
4
+ errorMessage
5
+ } from "./chunk-IOYXPBCL.js";
7
6
 
8
7
  // package.json
9
8
  var package_default = {
10
9
  name: "@hawkeyexl/manni",
11
- version: "4.1.0",
10
+ version: "4.3.0",
12
11
  description: "One command line for documentation that is meant to be checked. `manni meta` validates the presence and format of document metadata (Markdown frontmatter and more) against JSON Schema, built for CI. Formerly docmeta.",
13
12
  type: "module",
14
13
  bin: {
@@ -23,11 +22,21 @@ var package_default = {
23
22
  types: "./dist/index.d.ts",
24
23
  import: "./dist/index.js"
25
24
  },
25
+ "./graph/runtime": {
26
+ types: "./dist/graph/runtime.d.ts",
27
+ import: "./dist/graph/runtime.js"
28
+ },
29
+ "./graph/embed": {
30
+ types: "./dist/graph/embed.d.ts",
31
+ import: "./dist/graph/embed.js"
32
+ },
26
33
  "./package.json": "./package.json"
27
34
  },
28
35
  files: [
29
36
  "dist",
30
37
  "schemas",
38
+ "plugin",
39
+ "shapes",
31
40
  "templates"
32
41
  ],
33
42
  repository: {
@@ -46,11 +55,12 @@ var package_default = {
46
55
  },
47
56
  scripts: {
48
57
  prebuild: "npm run check:deps",
49
- build: "tsup",
50
- dev: "tsup --watch",
58
+ build: "node scripts/clean-dist.mjs && tsup",
59
+ dev: "node scripts/clean-dist.mjs && tsup --watch",
51
60
  pretest: "npm run check:deps",
52
61
  test: "vitest run",
53
62
  "test:watch": "vitest",
63
+ "test:graph:real": "vitest run --config vitest.graph-real.config.ts",
54
64
  "test:coverage": "vitest run --coverage",
55
65
  pretypecheck: "npm run check:deps",
56
66
  typecheck: "tsc --noEmit",
@@ -64,6 +74,7 @@ var package_default = {
64
74
  "docs:check-api": "node scripts/check-api-reference.mjs",
65
75
  "docs:check-links": "node scripts/check-doc-links.mjs",
66
76
  "docs:check-docevals": "node dist/cli.js docevals run --deterministic-only --no-generate",
77
+ "docs:check-graph": "node scripts/check-docs-graph.mjs",
67
78
  "docs:check-tables": "node scripts/check-table-rows.mjs",
68
79
  "docs:check-versions": "node scripts/check-versions.mjs",
69
80
  "docs:sync-versions": "node scripts/sync-versions.mjs",
@@ -94,6 +105,8 @@ var package_default = {
94
105
  "@asciidoctor/core": "^3.0.4",
95
106
  "@axe-core/playwright": "^4.13.0",
96
107
  "@hawkeyexl/inference": "^0.4.0",
108
+ "@inquirer/prompts": "^7.10.1",
109
+ "@types/n3": "^1.26.3",
97
110
  "@xmldom/xmldom": "^0.9.12",
98
111
  ajv: "^8.17.1",
99
112
  "ajv-draft-04": "^1.0.0",
@@ -102,10 +115,13 @@ var package_default = {
102
115
  "fast-glob": "^3.3.2",
103
116
  "github-slugger": "^2.0.0",
104
117
  "mdast-util-to-string": "^4.0.0",
118
+ minisearch: "^7.2.0",
119
+ n3: "^1.26.0",
105
120
  parse5: "^8.0.1",
106
121
  picocolors: "^1.1.1",
107
122
  picomatch: "^4.0.7",
108
123
  "playwright-core": "^1.63.0",
124
+ "rdf-validate-shacl": "^0.6.5",
109
125
  "remark-frontmatter": "^5.0.0",
110
126
  "remark-gfm": "^4.0.1",
111
127
  "remark-mdx": "^3.1.1",
@@ -118,31 +134,42 @@ var package_default = {
118
134
  devDependencies: {
119
135
  "@commitlint/cli": "^21.2.2",
120
136
  "@commitlint/config-conventional": "^21.2.2",
137
+ "@comunica/query-sparql-rdfjs-lite": "^5.3.0",
121
138
  "@eslint/js": "^10.0.1",
139
+ "@rdfjs/types": "^2.0.1",
122
140
  "@semantic-release/changelog": "^6.0.3",
123
141
  "@semantic-release/commit-analyzer": "^13.0.1",
124
142
  "@semantic-release/git": "^10.0.1",
125
143
  "@semantic-release/github": "^12.0.8",
126
144
  "@semantic-release/npm": "^13.1.5",
127
145
  "@semantic-release/release-notes-generator": "^14.1.1",
146
+ "@types/jsonld": "^1.5.15",
128
147
  "@types/mdast": "^4.0.4",
129
148
  "@types/node": "^26.3.0",
130
149
  "@types/picomatch": "^4.0.3",
131
150
  "@types/unist": "^3.0.3",
151
+ "@types/yauzl": "^3.4.0",
132
152
  "@vitest/coverage-v8": "^4.1.11",
133
153
  eslint: "^10.9.1",
134
154
  globals: "^17.11.0",
135
155
  husky: "^9.1.7",
156
+ jsonld: "^9.0.0",
157
+ "rdfxml-streaming-parser": "^3.3.0",
136
158
  "semantic-release": "^25.0.9",
137
159
  tsup: "^8.3.5",
138
160
  typescript: "^6.0.3",
139
161
  "typescript-eslint": "^8.68.0",
140
- vitest: "^4.1.11"
162
+ vitest: "^4.1.11",
163
+ yauzl: "^3.4.0"
141
164
  },
142
165
  peerDependencies: {
166
+ "@huggingface/transformers": ">=4",
143
167
  "node-llama-cpp": "^3.19.0"
144
168
  },
145
169
  peerDependenciesMeta: {
170
+ "@huggingface/transformers": {
171
+ optional: true
172
+ },
146
173
  "node-llama-cpp": {
147
174
  optional: true
148
175
  }
@@ -610,30 +637,6 @@ import { realpathSync as realpathSync2 } from "node:fs";
610
637
  import { fileURLToPath } from "node:url";
611
638
  import { CommanderError } from "commander";
612
639
 
613
- // src/shared/errors.ts
614
- var ToolError = class extends Error {
615
- /** clig.dev: 2 is operational/usage; 1 is reserved for findings. */
616
- exitCode = 2;
617
- constructor(message) {
618
- super(message);
619
- this.name = "ToolError";
620
- }
621
- };
622
- function errorMessage(err) {
623
- if (err instanceof Error) return err.message;
624
- if (typeof err === "string") return err;
625
- if (typeof err === "number" || typeof err === "bigint") return String(err);
626
- if (typeof err === "object" && err !== null && "message" in err && typeof err.message === "string") {
627
- return err.message;
628
- }
629
- try {
630
- const json = JSON.stringify(err);
631
- if (json !== void 0) return json;
632
- } catch {
633
- }
634
- return String(err);
635
- }
636
-
637
640
  // src/shared/program-name.ts
638
641
  var name = "manni";
639
642
  function programName() {
@@ -8311,44 +8314,881 @@ var __default46 = {
8311
8314
  }
8312
8315
  };
8313
8316
 
8314
- // src/meta/schemas/tgdp-strict/1.1.json
8315
- var __default47 = {
8317
+ // src/meta/schemas/tgdp-strict/1.1.json
8318
+ var __default47 = {
8319
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8320
+ $id: "tgdp:templates-strict:1.1",
8321
+ title: "The Good Docs Project templates strict overlay v1.1",
8322
+ description: "The strict overlay for tgdp:templates:1.1. Stack it beside the open schema, which owns the key and the required rule. It closes `type` to the 25 template slugs and requires no key.",
8323
+ additionalProperties: true,
8324
+ type: "object",
8325
+ properties: {
8326
+ type: {
8327
+ enum: [
8328
+ "api-getting-started",
8329
+ "api-reference",
8330
+ "bug-report",
8331
+ "changelog",
8332
+ "code-of-conduct",
8333
+ "code-of-conduct-incident-record",
8334
+ "code-of-conduct-remediation-record",
8335
+ "code-of-conduct-response-plan",
8336
+ "concept",
8337
+ "contact-support",
8338
+ "contributing-guide",
8339
+ "glossary",
8340
+ "how-to",
8341
+ "installation-guide",
8342
+ "our-team",
8343
+ "quickstart",
8344
+ "readme",
8345
+ "reference",
8346
+ "release-notes",
8347
+ "sdk-overview",
8348
+ "style-guide",
8349
+ "terminology-system",
8350
+ "troubleshooting",
8351
+ "tutorial",
8352
+ "user-personas"
8353
+ ],
8354
+ description: "Stacked beside tgdp:templates:1.1, strict closes `type` to the 25 template slugs. That is the check tgdp:templates:1.0 makes in one file."
8355
+ }
8356
+ }
8357
+ };
8358
+
8359
+ // src/meta/schemas/artifact-evals/1.1.0.json
8360
+ var __default48 = {
8361
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8362
+ $id: "manni:artifact-evals:1.1.0",
8363
+ title: "manni artifact-evals vocabulary v1.1.0",
8364
+ description: "Eval declarations for instruction artifacts - skills, agent definitions, and project-rules files: assertions about what must have held in an agent session that used the artifact. A manni common vocabulary sharing the entry shape of manni:evals:1.0.0. The page-side keys appear here one level down - `metadata.evals` (one assertion or the list), `metadata.eval-skip`, and `metadata.meta-provenance`, the page-level attribution record of manni:ai-context:1.0.0 with the same entry shape - because an artifact's top-level frontmatter is the host tool's contract and `metadata` is its sanctioned extension bag; there is no container object inside it - the list is the value. `metadata` stays open so other tools' members pass untouched, and the `eval-` prefix is reserved and enforced inside it: an unrecognized `eval-*` member is rejected, the same loud-typo guard as the page side.",
8365
+ type: "object",
8366
+ additionalProperties: true,
8367
+ properties: {
8368
+ metadata: {
8369
+ type: "object",
8370
+ additionalProperties: true,
8371
+ properties: {
8372
+ evals: {
8373
+ type: [
8374
+ "string",
8375
+ "array"
8376
+ ],
8377
+ minLength: 1,
8378
+ minItems: 1,
8379
+ items: {
8380
+ $ref: "#/$defs/evalEntry"
8381
+ },
8382
+ description: "The evals for this artifact: one AI-judged assertion as a string, or a non-empty list of entries \u2014 string shorthands, or closed objects with a required id. An empty list is not a declaration; an artifact with no evals omits the key. Ids are unique within an artifact: two entries claiming one id is an error, not a last-one-wins override. JSON Schema cannot express that over a mixed-shape array - `uniqueItems` is whole-item equality - so it is a requirement on implementations, stated here so every tool agrees on the rule."
8383
+ },
8384
+ "eval-skip": {
8385
+ type: "boolean",
8386
+ default: false,
8387
+ description: "Skip this artifact's evals entirely \u2014 reported as skipped, never silently ignored. The page-side key, one level down; default false."
8388
+ },
8389
+ "meta-provenance": {
8390
+ type: "array",
8391
+ minItems: 1,
8392
+ items: {
8393
+ $ref: "#/$defs/metaProvenanceEntry"
8394
+ },
8395
+ description: "Attribution for machine-proposed metadata, one entry per model (consumers merge by generated-by; the schema dedupes identical entries): which evals (by id) and which fields (by JSON Pointer) it proposed, at what confidence. A human deletes an entry once those are reviewed, so a surviving entry means unreviewed machine metadata. The page-level `meta-provenance`, one level down, with the entry shape repeated byte for byte. The name does not start with `eval-`, so the prefix guard does not apply to it.",
8396
+ uniqueItems: true
8397
+ }
8398
+ },
8399
+ patternProperties: {
8400
+ "^eval-(?!skip$)": false
8401
+ },
8402
+ "x-manni-location": "external"
8403
+ }
8404
+ },
8405
+ $defs: {
8406
+ metaProvenanceEntry: {
8407
+ type: "object",
8408
+ additionalProperties: false,
8409
+ required: [
8410
+ "generated-by"
8411
+ ],
8412
+ anyOf: [
8413
+ {
8414
+ required: [
8415
+ "fields"
8416
+ ]
8417
+ },
8418
+ {
8419
+ required: [
8420
+ "evals"
8421
+ ]
8422
+ }
8423
+ ],
8424
+ description: "One model's proposals: which metadata values and which evals it proposed, at what confidence. At least one of `fields` or `evals` is required, because an entry naming neither says nothing.",
8425
+ properties: {
8426
+ "generated-by": {
8427
+ type: "string",
8428
+ minLength: 1,
8429
+ description: "Model or agent that proposed the fields or evals."
8430
+ },
8431
+ fields: {
8432
+ type: "array",
8433
+ minItems: 1,
8434
+ items: {
8435
+ type: "string",
8436
+ pattern: "^/"
8437
+ },
8438
+ uniqueItems: true,
8439
+ description: "The metadata values it proposed, as JSON Pointers: the same form `validate` reports. `/intent` names a top-level key and `/graph/label` reaches into a block. Pointers let one entry shape cover every vocabulary stacked on the document."
8440
+ },
8441
+ evals: {
8442
+ type: "array",
8443
+ minItems: 1,
8444
+ items: {
8445
+ type: "string",
8446
+ pattern: "^[a-z0-9][a-z0-9-]*$"
8447
+ },
8448
+ uniqueItems: true,
8449
+ description: "The evals it proposed, by kebab id, so a reordered eval list does not orphan them."
8450
+ },
8451
+ confidence: {
8452
+ type: "object",
8453
+ propertyNames: {
8454
+ pattern: "^(?:/.*|[a-z0-9][a-z0-9-]*)$"
8455
+ },
8456
+ additionalProperties: {
8457
+ type: "number",
8458
+ minimum: 0,
8459
+ maximum: 1
8460
+ },
8461
+ description: "Model confidence, 0..1, keyed by a pointer from `fields` or an id from `evals`. The two key forms cannot collide: a pointer starts with `/` and an id cannot. A confidence attached to a malformed key fails here instead of dangling."
8462
+ }
8463
+ }
8464
+ },
8465
+ evalEntry: {
8466
+ if: {
8467
+ type: "string"
8468
+ },
8469
+ then: {
8470
+ type: "string",
8471
+ minLength: 1
8472
+ },
8473
+ else: {
8474
+ $ref: "#/$defs/inlineEval"
8475
+ },
8476
+ description: "One eval: a string shorthand (an AI-judged assertion at error severity \u2014 the legitimately id-less form), or a closed object. Branched with if/then rather than oneOf so a fault inside the object form is reported once, against the key that is wrong."
8477
+ },
8478
+ inlineEval: {
8479
+ type: "object",
8480
+ required: [
8481
+ "id"
8482
+ ],
8483
+ properties: {
8484
+ id: {
8485
+ type: "string",
8486
+ pattern: "^[a-z0-9][a-z0-9-]*$",
8487
+ description: "Unique (per artifact) kebab-case identifier. Required on the object form \u2014 position-derived names orphan cached verdicts whenever entries move; if an eval is worth an object, it is worth a stable name."
8488
+ },
8489
+ assertion: {
8490
+ type: "string",
8491
+ minLength: 1,
8492
+ description: "What must have held in the session that used this artifact."
8493
+ },
8494
+ type: {
8495
+ $ref: "#/$defs/evalType"
8496
+ },
8497
+ grader: {
8498
+ $ref: "#/$defs/grader"
8499
+ },
8500
+ provider: {
8501
+ type: "string",
8502
+ minLength: 1,
8503
+ description: "Which configured inference provider or agent judges an `ai`-graded eval. Legal values are whatever the inference dependency supports, validated at run time; omit for the config default."
8504
+ },
8505
+ model: {
8506
+ type: "string",
8507
+ minLength: 1,
8508
+ description: "Model that judges an `ai`-graded eval, within `provider`. Legal values are whatever the inference dependency supports, validated at run time; omit for the config default. Two uses: an eval that matters can name a stronger judge than the default, and an eval can name a judge other than the model that produced the session it grades - a model asked whether its own session followed the rules is the sharpest form of self-preference bias there is. Meaningful only on `ai` evals."
8509
+ },
8510
+ runs: {
8511
+ type: "integer",
8512
+ minimum: 1,
8513
+ maximum: 50,
8514
+ description: "Ensemble runs for this eval, overriding the tool's configured default. Lets a high-stakes or known-flaky assertion buy more agreement than a cheap one, which a corpus-wide setting cannot. Capped because it multiplies cost directly. Meaningful only on `ai` evals."
8515
+ },
8516
+ command: {
8517
+ type: "array",
8518
+ minItems: 1,
8519
+ items: {
8520
+ type: "string",
8521
+ minLength: 1
8522
+ },
8523
+ description: "Command to execute for command-graded evals. {trace} is replaced with the session trace path \u2014 the artifact-side analog of the page side's {file} \u2014 and exit 0 (or `success-exit-codes`) is a pass. Omitting it is the generation contract: tooling generates a check script from the assertion, then writes `command` and `generated-assertion-hash` back. Legal only alongside `grader: command`."
8524
+ },
8525
+ "success-exit-codes": {
8526
+ type: "array",
8527
+ minItems: 1,
8528
+ items: {
8529
+ type: "integer"
8530
+ },
8531
+ default: [
8532
+ 0
8533
+ ],
8534
+ description: "Exit codes that count as a pass."
8535
+ },
8536
+ "timeout-ms": {
8537
+ type: "integer",
8538
+ minimum: 1,
8539
+ description: "Timeout for command-graded evals."
8540
+ },
8541
+ "generated-assertion-hash": {
8542
+ type: "string",
8543
+ description: "sha256 of the assertion when the check script was generated \u2014 written back alongside `command`, and never legal without it. A mismatch with the current assertion triggers regeneration."
8544
+ },
8545
+ options: {
8546
+ type: "object",
8547
+ description: "Grader-specific options; validated by the grader at run time, deliberately outside this schema \u2014 a grader's options evolve on the grader's schedule."
8548
+ },
8549
+ severity: {
8550
+ $ref: "#/$defs/severity"
8551
+ },
8552
+ weight: {
8553
+ type: "number",
8554
+ exclusiveMinimum: 0,
8555
+ default: 1,
8556
+ description: "Relative contribution to an aggregate score across evals. Does not change this eval's own pass/fail, nor its severity: an eval still passes or fails on its own terms, and weight only decides how much that outcome moves a run total. Zero is excluded deliberately - a weightless eval is a silent disable, and `skip` already means that, loudly."
8557
+ },
8558
+ "severity-map": {
8559
+ type: "object",
8560
+ additionalProperties: {
8561
+ $ref: "#/$defs/severity"
8562
+ },
8563
+ description: "Maps a tool grader's own severities onto eval severities. Meaningful only on `tool:*` evals \u2014 imported from the page side to keep the entry vocabularies congruent."
8564
+ },
8565
+ skip: {
8566
+ type: "boolean"
8567
+ },
8568
+ evidence: {
8569
+ type: "string",
8570
+ minLength: 1,
8571
+ description: "Hint telling the judge where in the session to look."
8572
+ },
8573
+ target: {
8574
+ $ref: "#/$defs/target"
8575
+ },
8576
+ examples: {
8577
+ type: "object",
8578
+ additionalProperties: false,
8579
+ properties: {
8580
+ pass: {
8581
+ $ref: "#/$defs/anchorList"
8582
+ },
8583
+ fail: {
8584
+ $ref: "#/$defs/anchorList"
8585
+ }
8586
+ },
8587
+ description: "Anchor examples of passing and failing behavior for the judge \u2014 one or several each."
8588
+ }
8589
+ },
8590
+ additionalProperties: false,
8591
+ dependentRequired: {
8592
+ "generated-assertion-hash": [
8593
+ "command"
8594
+ ]
8595
+ },
8596
+ allOf: [
8597
+ {
8598
+ if: {
8599
+ properties: {
8600
+ grader: {
8601
+ const: "ai"
8602
+ }
8603
+ },
8604
+ required: [
8605
+ "grader"
8606
+ ]
8607
+ },
8608
+ then: {
8609
+ required: [
8610
+ "assertion"
8611
+ ]
8612
+ }
8613
+ },
8614
+ {
8615
+ if: {
8616
+ not: {
8617
+ required: [
8618
+ "grader"
8619
+ ]
8620
+ }
8621
+ },
8622
+ then: {
8623
+ required: [
8624
+ "assertion"
8625
+ ],
8626
+ description: "No grader means the `ai` default, so the assertion the judge reads is required."
8627
+ }
8628
+ },
8629
+ {
8630
+ if: {
8631
+ properties: {
8632
+ grader: {
8633
+ const: "human"
8634
+ }
8635
+ },
8636
+ required: [
8637
+ "grader"
8638
+ ]
8639
+ },
8640
+ then: {
8641
+ required: [
8642
+ "assertion"
8643
+ ]
8644
+ }
8645
+ },
8646
+ {
8647
+ if: {
8648
+ properties: {
8649
+ grader: {
8650
+ const: "command"
8651
+ }
8652
+ },
8653
+ required: [
8654
+ "grader"
8655
+ ]
8656
+ },
8657
+ then: {
8658
+ anyOf: [
8659
+ {
8660
+ required: [
8661
+ "assertion"
8662
+ ]
8663
+ },
8664
+ {
8665
+ required: [
8666
+ "command"
8667
+ ]
8668
+ }
8669
+ ],
8670
+ description: "A command eval carries either the assertion its script is generated from, or the command itself - the generation contract writes the second from the first."
8671
+ }
8672
+ },
8673
+ {
8674
+ if: {
8675
+ required: [
8676
+ "command"
8677
+ ]
8678
+ },
8679
+ then: {
8680
+ properties: {
8681
+ grader: {
8682
+ const: "command"
8683
+ }
8684
+ },
8685
+ required: [
8686
+ "grader"
8687
+ ],
8688
+ description: "An entry carrying an executable command must say grader: command."
8689
+ }
8690
+ },
8691
+ {
8692
+ if: {
8693
+ anyOf: [
8694
+ {
8695
+ required: [
8696
+ "success-exit-codes"
8697
+ ]
8698
+ },
8699
+ {
8700
+ required: [
8701
+ "timeout-ms"
8702
+ ]
8703
+ }
8704
+ ]
8705
+ },
8706
+ then: {
8707
+ properties: {
8708
+ grader: {
8709
+ const: "command"
8710
+ }
8711
+ },
8712
+ required: [
8713
+ "grader"
8714
+ ],
8715
+ description: "success-exit-codes and timeout-ms configure command execution, so they are legal only alongside grader: command \u2014 present, or generated later under the generation contract."
8716
+ }
8717
+ },
8718
+ {
8719
+ if: {
8720
+ anyOf: [
8721
+ {
8722
+ required: [
8723
+ "provider"
8724
+ ]
8725
+ },
8726
+ {
8727
+ required: [
8728
+ "model"
8729
+ ]
8730
+ },
8731
+ {
8732
+ required: [
8733
+ "runs"
8734
+ ]
8735
+ }
8736
+ ]
8737
+ },
8738
+ then: {
8739
+ properties: {
8740
+ grader: {
8741
+ const: "ai"
8742
+ }
8743
+ },
8744
+ description: "provider, model and runs configure the AI judge, so they are legal only on an `ai` eval. `grader` is not required alongside them because `ai` is the default."
8745
+ }
8746
+ }
8747
+ ]
8748
+ },
8749
+ evalType: {
8750
+ enum: [
8751
+ "capability",
8752
+ "regression"
8753
+ ],
8754
+ default: "regression",
8755
+ description: "`capability` probes a boundary and is expected to fail sometimes; `regression` protects behavior that already works. Reported, not enforced."
8756
+ },
8757
+ severity: {
8758
+ enum: [
8759
+ "error",
8760
+ "warning",
8761
+ "notice"
8762
+ ],
8763
+ default: "error",
8764
+ description: "Only error-severity failures fail the eval; warning and notice report but pass. The three levels are the family scale in manni's shared severity, so a finding reads the same in every tool. Default error \u2014 the string shorthand implies it."
8765
+ },
8766
+ grader: {
8767
+ anyOf: [
8768
+ {
8769
+ type: "string",
8770
+ pattern: "^(tool:)?[a-z0-9][a-z0-9-]*$"
8771
+ },
8772
+ {
8773
+ enum: [
8774
+ "ai",
8775
+ "human",
8776
+ "command",
8777
+ "tool-usage",
8778
+ "skill-invoked",
8779
+ "file-access",
8780
+ "turn-count",
8781
+ "cost",
8782
+ "regex",
8783
+ "json-output",
8784
+ "tool-order"
8785
+ ]
8786
+ }
8787
+ ],
8788
+ default: "ai",
8789
+ description: "How the assertion is checked: the AI judge (`ai`); a human review queue (`human` \u2014 judged per session, since every trace is new, unlike the page side where a verdict persists until the page changes); an executable check over the trace (`command`); a deterministic session grader \u2014 `tool-usage`, `tool-order`, `skill-invoked`, `file-access`, `turn-count`, `cost`, `regex`, `json-output`; or a `tool:<kebab>` integration, the page side's namespace, accepted here so one grader spelling ports across both eval vocabularies. Recommended values, not a closed list: any kebab name is legal and validated against the grader registry at run time, so a new grader never needs a schema version \u2014 the one cost is that a stale or misspelled grader name passes this schema and is rejected by the registry instead."
8790
+ },
8791
+ anchorList: {
8792
+ if: {
8793
+ type: "array"
8794
+ },
8795
+ then: {
8796
+ type: "array",
8797
+ minItems: 1,
8798
+ uniqueItems: true,
8799
+ items: {
8800
+ type: "string",
8801
+ minLength: 1
8802
+ }
8803
+ },
8804
+ else: {
8805
+ type: "string",
8806
+ minLength: 1
8807
+ },
8808
+ description: "One anchor example, or a non-empty list of them."
8809
+ },
8810
+ target: {
8811
+ if: {
8812
+ type: "object"
8813
+ },
8814
+ then: {
8815
+ type: "object",
8816
+ additionalProperties: false,
8817
+ required: [
8818
+ "source",
8819
+ "path"
8820
+ ],
8821
+ properties: {
8822
+ source: {
8823
+ const: "file"
8824
+ },
8825
+ path: {
8826
+ type: "string",
8827
+ minLength: 1,
8828
+ description: "Path to the file to grade, relative to the session's working directory."
8829
+ }
8830
+ }
8831
+ },
8832
+ else: {
8833
+ enum: [
8834
+ "transcript",
8835
+ "last-message",
8836
+ "files",
8837
+ "artifact"
8838
+ ]
8839
+ },
8840
+ default: "transcript",
8841
+ description: "What the grader receives: the whole session (`transcript`), the final assistant message (`last-message`), the list of files the session wrote (`files`), the instruction artifact itself (`artifact`), or a named file. Distinct from `evidence`, which hints where to look within what is graded - this selects the bytes themselves, and it is structural, so deterministic graders honour it too. Named `target` rather than `focus` for that reason: a regex grader has no focus, it has a target. Branched with if/then rather than oneOf so a fault inside the object form is reported once, against the key that is wrong."
8842
+ }
8843
+ }
8844
+ };
8845
+
8846
+ // src/meta/schemas/artifact-evals-strict/1.1.0.json
8847
+ var __default49 = {
8848
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8849
+ $id: "manni:artifact-evals-strict:1.1.0",
8850
+ title: "manni artifact-evals strict overlay v1.1.0",
8851
+ description: "The strict overlay for manni:artifact-evals:1.1.0. Stack it beside the open vocabulary, which owns every key, every required rule and every conditional. Inside `metadata`, it narrows provider and model names, exit codes, companion paths and the assertion hash as manni:evals-strict:1.0.0 does. It also closes `grader` to the named graders and `tool:` integrations.",
8852
+ additionalProperties: true,
8853
+ type: "object",
8854
+ properties: {
8855
+ metadata: {
8856
+ description: "Strict narrows the object entries of `metadata.evals`. A string shorthand passes as the open vocabulary reads it, and every other member of `metadata` passes untouched.",
8857
+ properties: {
8858
+ evals: {
8859
+ items: {
8860
+ $ref: "#/$defs/entry"
8861
+ }
8862
+ },
8863
+ "meta-provenance": {
8864
+ description: "Strict holds each entry to the rules the ai-context overlay applies to the same shape. `generated-by` is a model id with no spaces, and each pointer is well formed.",
8865
+ items: {
8866
+ properties: {
8867
+ "generated-by": {
8868
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._:/\\\\@-]*$",
8869
+ description: "A model id of letters in either case, digits, `.`, `_`, `:`, `/`, `\\`, `@` and `-`, with no spaces. A Windows path to a local model passes."
8870
+ },
8871
+ fields: {
8872
+ items: {
8873
+ pattern: "^(?:/(?:[^~/]|~[01])*)+$",
8874
+ description: "A JSON Pointer in which every `~` begins an RFC 6901 escape, `~0` or `~1`."
8875
+ }
8876
+ },
8877
+ confidence: {
8878
+ propertyNames: {
8879
+ pattern: "^(?:(?:/(?:[^~/]|~[01])*)+|[a-z0-9][a-z0-9-]*)$",
8880
+ description: "A well-formed JSON Pointer, or a kebab eval id."
8881
+ }
8882
+ }
8883
+ }
8884
+ }
8885
+ }
8886
+ }
8887
+ }
8888
+ },
8889
+ $defs: {
8890
+ entry: {
8891
+ description: "The rules strict adds to an object entry.",
8892
+ properties: {
8893
+ grader: {
8894
+ anyOf: [
8895
+ {
8896
+ enum: [
8897
+ "ai",
8898
+ "human",
8899
+ "command",
8900
+ "tool-usage",
8901
+ "skill-invoked",
8902
+ "file-access",
8903
+ "turn-count",
8904
+ "cost",
8905
+ "regex",
8906
+ "json-output",
8907
+ "tool-order"
8908
+ ]
8909
+ },
8910
+ {
8911
+ type: "string",
8912
+ pattern: "^tool:[a-z0-9][a-z0-9-]*$"
8913
+ }
8914
+ ],
8915
+ description: "One of the eleven named graders, or a `tool:<kebab>` integration. Strict accepts no other kebab name."
8916
+ },
8917
+ provider: {
8918
+ pattern: "^[a-z0-9][a-z0-9-]*$",
8919
+ description: "A kebab provider name, such as `anthropic` or `llama-cpp`."
8920
+ },
8921
+ model: {
8922
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._:/\\\\@-]*$",
8923
+ description: "A model id of letters in either case, digits, `.`, `_`, `:`, `/`, `\\`, `@` and `-`, with no spaces. A Windows path to a local model passes."
8924
+ },
8925
+ "success-exit-codes": {
8926
+ uniqueItems: true,
8927
+ items: {
8928
+ type: "integer",
8929
+ minimum: 0,
8930
+ maximum: 255
8931
+ },
8932
+ description: "Distinct exit codes, each from 0 to 255, the range a process can return."
8933
+ },
8934
+ target: {
8935
+ properties: {
8936
+ path: {
8937
+ pattern: "^(?![\\\\/~])(?![A-Za-z]:)(?![A-Za-z][A-Za-z0-9+.-]*://).+$",
8938
+ description: "A relative path. It starts with no `/`, `\\` or `~`, no drive letter, and no URL scheme."
8939
+ }
8940
+ }
8941
+ },
8942
+ "generated-assertion-hash": {
8943
+ pattern: "^sha256-[0-9a-f]{64}$",
8944
+ description: "`sha256-` and sixty-four lowercase hex digits."
8945
+ }
8946
+ }
8947
+ }
8948
+ }
8949
+ };
8950
+
8951
+ // src/meta/schemas/stewardship/1.1.0.json
8952
+ var __default50 = {
8953
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8954
+ $id: "manni:stewardship:1.1.0",
8955
+ title: "manni stewardship vocabulary v1.1.0",
8956
+ description: "Is this page cared for? This vocabulary covers attribution, ownership, review, the document's own dates, and the anchors that make drift detectable. Every field records a fact a person asserts about the document, not one a tool reads off the file. That is why `created`, `last-updated` and `authors` are here. Git records when a path changed and who committed the change, not when the document was written or who wrote it. Those part company at every migration, split, squashed import, typo fix and bulk frontmatter sweep. A published page carries no repo, so a stamped date travels with the document where a derived one cannot. The cost is that a hand-typed `last-updated` goes stale quietly, and no JSON Schema can catch that. The review dates are records, not freshness gates. Tooling that can read a clock derives the due date from `last-reviewed` and `review-interval`. Version 1.1.0 adds `x-manni-graph-output: false` to `owner`, `stakeholders` and `reviewed-by`. Those three name people, so a published graph leaves them out: its Turtle, its JSON-LD, its iiRDS package and its search index. Validation is the same as in 1.0.0.",
8957
+ type: "object",
8958
+ additionalProperties: true,
8959
+ properties: {
8960
+ authors: {
8961
+ type: [
8962
+ "string",
8963
+ "object",
8964
+ "array"
8965
+ ],
8966
+ description: "Who wrote the page: a name, a list of names, or the structured person objects MyST and Docusaurus define. Attribution rather than answerability \u2014 `owner` is the party on the hook for the page now, and the two part company the moment an author moves on. Not a `stringList`, and not the only field here that isn't: `verified-against` and `source-of-truth` take the same string-or-object-or-list shape, as `entryList`. `authors` keeps its own inline copy rather than sharing that definition, because MyST and Docusaurus claim this key too and the composability law holds it at their loosest published definition, which `entryList`'s uniqueness and member floors go past. List members are names or person objects \u2014 never bare numbers or nulls. Never empty in any form: minLength, minItems and minProperties each bind to their own type and are ignored for the others.",
8967
+ items: {
8968
+ type: [
8969
+ "string",
8970
+ "object"
8971
+ ]
8972
+ },
8973
+ minLength: 1,
8974
+ minItems: 1,
8975
+ minProperties: 1,
8976
+ "x-manni-location": "external"
8977
+ },
8978
+ owner: {
8979
+ $ref: "#/$defs/stringList",
8980
+ description: "The person or team answerable for this page \u2014 the one required field of every docs-ownership system from Backstage to GitLab. A name, a handle, a chat channel, a team slug, or a list of them; write the spelling people can actually reach. A published graph does not carry it, because it names people.",
8981
+ "x-manni-location": "external",
8982
+ "x-manni-graph-output": false
8983
+ },
8984
+ stakeholders: {
8985
+ $ref: "#/$defs/stringList",
8986
+ description: "Who has a stake in this page being right: the feature's engineer, the product owner, the support lead who fields its tickets. The standing parties to consult before changing the page \u2014 where `reviewed-by` records who actually did the last pass. Page-level on purpose: the right stakeholders differ page by page, and project-wide ones belong in your project docs, not in every file's frontmatter. A published graph does not carry it, because it names people.",
8987
+ "x-manni-location": "external",
8988
+ "x-manni-graph-output": false
8989
+ },
8990
+ "reviewed-by": {
8991
+ $ref: "#/$defs/stringList",
8992
+ description: "Who last reviewed the page. Named `reviewed-by` rather than `reviewers` because MyST already defines `reviewers` as scholarly person objects. A published graph does not carry it, because it names people.",
8993
+ "x-manni-location": "external",
8994
+ "x-manni-graph-output": false
8995
+ },
8996
+ created: {
8997
+ $ref: "#/$defs/w3cdtf",
8998
+ description: "When the document was written, as a W3CDTF date. The document's date, not the file's: a page migrated from a CMS, imported from another repo, split out of a longer one, or landed through a squashed history has a path in this repo that is younger than the content it holds, and `git log` can only report the path. Where the two agree, git agreeing is a bonus rather than the source.",
8999
+ "x-manni-location": "external"
9000
+ },
9001
+ "last-updated": {
9002
+ $ref: "#/$defs/w3cdtf",
9003
+ description: "When the content last changed in a way a reader would notice, as a W3CDTF date. The editorial fact, not the file's: a commit date also moves for a typo fix, a link sweep, a formatting pass and a bulk frontmatter migration, none of which change what the page says. Distinct from `last-reviewed`, which records the page being checked and found still true \u2014 an update changes the content, a review confirms it, and a page can have either without the other. Spelled with the `last-` prefix for exactly the reason `last-reviewed` carries one: both name the most recent instance of a repeating event, and the two read as the pair they are. That also keeps the key clear of every neighbour's spelling of the same fact, which are `lastmod`, `last_update`, `lastUpdated` and `article:modified_time`. A stale value here is the accepted cost of stamping a date instead of deriving one, and a check comparing it against the repo's own last-change date is the tooling answer, not a schema's.",
9004
+ "x-manni-location": "page"
9005
+ },
9006
+ "last-reviewed": {
9007
+ $ref: "#/$defs/w3cdtf",
9008
+ description: "When the page was last reviewed, as a W3CDTF date. The field freshness tooling reads to derive review deadlines. A record, not a freshness gate \u2014 JSON Schema cannot compare a date to today.",
9009
+ "x-manni-location": "external"
9010
+ },
9011
+ "review-interval": {
9012
+ type: "string",
9013
+ pattern: "^P(?:\\d+W|(?=\\d|T\\d)(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?)$",
9014
+ description: "How often the page should be reviewed, as an ISO 8601 duration: `P90D`, `P1Y`. ISO rather than `90d` so the value is machine-comparable. With `last-reviewed`, this is everything review tooling needs to derive the due date \u2014 a stored due date would only ever agree with them or lie.",
9015
+ "x-manni-location": "external"
9016
+ },
9017
+ "verified-against": {
9018
+ $ref: "#/$defs/entryList",
9019
+ description: 'The product version, API revision, or spec the content was last verified against. A string is the short spelling \u2014 `operator 1.4.2` \u2014 and an object the checkable one, such as `{name: operator, version: 1.4.2}`, which a drift check can compare without parsing prose. A list says a page was verified against more than one thing, such as the operator and the cluster it runs on. What turns "reviewed" into "reviewed against something".',
9020
+ "x-manni-location": "external"
9021
+ },
9022
+ "source-of-truth": {
9023
+ $ref: "#/$defs/entryList",
9024
+ description: "Where reality lives for this page: a repo path, an API spec, a schema file. A string names it, an object structures it \u2014 `{path: charts/operator/values.yaml, kind: helm-values}` \u2014 and a list carries several, because a page usually answers to more than one source. The anchor a drift check compares the page against; a page without one cannot be drift-monitored.",
9025
+ "x-manni-location": "external"
9026
+ }
9027
+ },
9028
+ $defs: {
9029
+ stringList: {
9030
+ if: {
9031
+ type: "array"
9032
+ },
9033
+ then: {
9034
+ type: "array",
9035
+ minItems: 1,
9036
+ uniqueItems: true,
9037
+ items: {
9038
+ type: "string",
9039
+ minLength: 1
9040
+ }
9041
+ },
9042
+ else: {
9043
+ type: "string",
9044
+ minLength: 1
9045
+ },
9046
+ description: "One non-empty string, or a non-empty list of unique ones \u2014 the same shape as the `labelList` of manni:graph:1.0.0."
9047
+ },
9048
+ entryList: {
9049
+ type: [
9050
+ "string",
9051
+ "object",
9052
+ "array"
9053
+ ],
9054
+ items: {
9055
+ $comment: "The parent's keyword-per-type pattern again, one level down: minLength binds to a string member, minProperties to an object one, and each is ignored for the other. Repeated here rather than hoisted because a member's floor is a different assertion from the whole value's.",
9056
+ type: [
9057
+ "string",
9058
+ "object"
9059
+ ],
9060
+ minLength: 1,
9061
+ minProperties: 1
9062
+ },
9063
+ minLength: 1,
9064
+ minItems: 1,
9065
+ minProperties: 1,
9066
+ uniqueItems: true,
9067
+ description: 'One entry, or a non-empty list of unique ones, where an entry is a non-empty string or a non-empty object. The shape `authors` carries, made a definition because two more fields need it: the short human spelling and the structured machine-checkable one, without minting a second field name for the same fact. Object keys are left open on purpose, and the recommendations live in each field\'s description. Every non-empty floor binds to its own type \u2014 minLength for the string, minProperties for the object, minItems and uniqueItems for the list \u2014 and `items` repeats the first two, so `""`, `[]`, `{}`, `[""]` and `[{}]` all fail. Unlike `authors`, no other schema claims the keys that use this, so the family is free to set that floor.',
9068
+ $comment: "minLength, minItems, minProperties and uniqueItems each apply to one instance type and are ignored for the others; that is what lets one subschema hold three shapes without an anyOf whose errors name all three branches."
9069
+ },
9070
+ w3cdtf: {
9071
+ type: "string",
9072
+ pattern: "^[0-9]{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12][0-9]|3[01])(T([01][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9](\\.[0-9]+)?)?(Z|[+-]([01][0-9]|2[0-3]):[0-5][0-9]))?)?)?$",
9073
+ description: "A W3CDTF date, permitting reduced precision: `2026`, `2026-08`, `2026-08-23`, or a full timestamp \u2014 in which case the timezone designator is required, as the W3CDTF profile itself mandates (no local-time form). Field-ranged (month 01-12, day 01-31, hour 00-23) so an impossible date fails here rather than becoming Invalid Date in the tooling that derives review deadlines; not calendar-exact \u2014 February 31 is a reviewer's catch."
9074
+ }
9075
+ }
9076
+ };
9077
+
9078
+ // src/meta/schemas/stewardship-strict/1.1.0.json
9079
+ var __default51 = {
8316
9080
  $schema: "https://json-schema.org/draft/2020-12/schema",
8317
- $id: "tgdp:templates-strict:1.1",
8318
- title: "The Good Docs Project templates strict overlay v1.1",
8319
- description: "The strict overlay for tgdp:templates:1.1. Stack it beside the open schema, which owns the key and the required rule. It closes `type` to the 25 template slugs and requires no key.",
9081
+ $id: "manni:stewardship-strict:1.1.0",
9082
+ title: "manni stewardship strict overlay v1.1.0",
9083
+ description: "The strict overlay for manni:stewardship:1.1.0. Stack it beside the open vocabulary. It narrows the form of values the open vocabulary already claims and requires no key.",
8320
9084
  additionalProperties: true,
8321
9085
  type: "object",
8322
9086
  properties: {
8323
- type: {
8324
- enum: [
8325
- "api-getting-started",
8326
- "api-reference",
8327
- "bug-report",
8328
- "changelog",
8329
- "code-of-conduct",
8330
- "code-of-conduct-incident-record",
8331
- "code-of-conduct-remediation-record",
8332
- "code-of-conduct-response-plan",
8333
- "concept",
8334
- "contact-support",
8335
- "contributing-guide",
8336
- "glossary",
8337
- "how-to",
8338
- "installation-guide",
8339
- "our-team",
8340
- "quickstart",
8341
- "readme",
8342
- "reference",
8343
- "release-notes",
8344
- "sdk-overview",
8345
- "style-guide",
8346
- "terminology-system",
8347
- "troubleshooting",
8348
- "tutorial",
8349
- "user-personas"
9087
+ authors: {
9088
+ type: "array",
9089
+ uniqueItems: true,
9090
+ items: {
9091
+ pattern: "^\\S(?:.*\\S)?$",
9092
+ required: [
9093
+ "name"
9094
+ ],
9095
+ properties: {
9096
+ name: {
9097
+ type: "string",
9098
+ pattern: "^\\S(?:.*\\S)?$"
9099
+ },
9100
+ email: {
9101
+ type: "string",
9102
+ pattern: "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
9103
+ },
9104
+ url: {
9105
+ type: "string",
9106
+ pattern: "^https?://\\S+$"
9107
+ }
9108
+ }
9109
+ },
9110
+ description: "Strict takes authors as a list of unique entries. A string entry is one line with no surrounding space. A person object names the person, and its `email` and `url` are well formed."
9111
+ },
9112
+ owner: {
9113
+ $ref: "#/$defs/handles",
9114
+ description: "Strict holds each owner to a handle a GitHub or GitLab CODEOWNERS file accepts, in the string form and the list form alike."
9115
+ },
9116
+ stakeholders: {
9117
+ $ref: "#/$defs/names",
9118
+ description: "Strict holds each stakeholder to one line with no surrounding space. A stakeholder is a person or team, named in any form."
9119
+ },
9120
+ "reviewed-by": {
9121
+ $ref: "#/$defs/names",
9122
+ description: "Strict holds each reviewer to one line with no surrounding space. `manni meta derive` writes review-API logins and commit-trailer names, so no handle form is required."
9123
+ },
9124
+ created: {
9125
+ $ref: "#/$defs/date",
9126
+ description: "Strict holds the creation date to an RFC 3339 full date or date-time. A year or month alone fails, and so does a timestamp without seconds."
9127
+ },
9128
+ "last-updated": {
9129
+ $ref: "#/$defs/date",
9130
+ description: "Strict holds the update date to an RFC 3339 full date or date-time. A year or month alone fails, and so does a timestamp without seconds."
9131
+ },
9132
+ "last-reviewed": {
9133
+ $ref: "#/$defs/date",
9134
+ description: "Strict holds the review date to an RFC 3339 full date or date-time. A year or month alone fails, and so does a timestamp without seconds."
9135
+ },
9136
+ "verified-against": {
9137
+ required: [
9138
+ "name",
9139
+ "version"
8350
9140
  ],
8351
- description: "Stacked beside tgdp:templates:1.1, strict closes `type` to the 25 template slugs. That is the check tgdp:templates:1.0 makes in one file."
9141
+ items: {
9142
+ required: [
9143
+ "name",
9144
+ "version"
9145
+ ]
9146
+ },
9147
+ description: "Strict requires an object entry to carry `name` and `version`, alone or in a list. The version's format stays free, and a string entry is unchanged. The top-level `required` holds the single-object form, and `items` holds each object in a list, since `required` applies only to an object."
9148
+ },
9149
+ "source-of-truth": {
9150
+ $ref: "#/$defs/source",
9151
+ items: {
9152
+ $ref: "#/$defs/source"
9153
+ },
9154
+ description: "Strict requires an object entry to carry `path` or `url`, alone or in a list. A string entry is one id, path or URL on one line with no surrounding space. The top-level `$ref` holds the string and single-object forms, and `items` holds each entry in a list, since `required` applies only to an object."
9155
+ }
9156
+ },
9157
+ $defs: {
9158
+ handles: {
9159
+ pattern: "^(?:@@?[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?(?:/[A-Za-z0-9._-]+)*|[^\\s@]+@[^\\s@]+\\.[^\\s@]+)$",
9160
+ items: {
9161
+ pattern: "^(?:@@?[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?(?:/[A-Za-z0-9._-]+)*|[^\\s@]+@[^\\s@]+\\.[^\\s@]+)$"
9162
+ },
9163
+ description: "A handle a CODEOWNERS file accepts, as a string or as each member of a list. That is `@user`, `@org/team`, a GitLab nested group or `@@role`, or an email address."
9164
+ },
9165
+ names: {
9166
+ pattern: "^\\S(?:.*\\S)?$",
9167
+ items: {
9168
+ pattern: "^\\S(?:.*\\S)?$"
9169
+ },
9170
+ description: "One line with no surrounding space, as a string or as each member of a list."
9171
+ },
9172
+ date: {
9173
+ type: "string",
9174
+ pattern: "^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])(?:T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:Z|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9]))?$",
9175
+ description: "An RFC 3339 full date, or a date-time with seconds and an offset."
9176
+ },
9177
+ source: {
9178
+ pattern: "^\\S(?:.*\\S)?$",
9179
+ anyOf: [
9180
+ {
9181
+ required: [
9182
+ "path"
9183
+ ]
9184
+ },
9185
+ {
9186
+ required: [
9187
+ "url"
9188
+ ]
9189
+ }
9190
+ ],
9191
+ description: "A source entry. A string is one id, path or URL on one line with no surrounding space. An object carries `path` or `url`."
8352
9192
  }
8353
9193
  }
8354
9194
  };
@@ -8401,7 +9241,15 @@ var BUILTINS = /* @__PURE__ */ new Map([
8401
9241
  ["manni:graph-strict:1.0.0", __default44],
8402
9242
  ["manni:citations-strict:1.0.0", __default45],
8403
9243
  ["tgdp:templates:1.1", __default46],
8404
- ["tgdp:templates-strict:1.1", __default47]
9244
+ ["tgdp:templates-strict:1.1", __default47],
9245
+ ["manni:artifact-evals:1.1.0", __default48],
9246
+ ["manni:artifact-evals-strict:1.1.0", __default49],
9247
+ ["manni:stewardship:1.1.0", __default50],
9248
+ ["manni:stewardship-strict:1.1.0", __default51]
9249
+ ]);
9250
+ var ANNOTATION_ONLY_PREDECESSORS = /* @__PURE__ */ new Map([
9251
+ ["manni:stewardship:1.1.0", "manni:stewardship:1.0.0"],
9252
+ ["manni:stewardship-strict:1.1.0", "manni:stewardship-strict:1.0.0"]
8405
9253
  ]);
8406
9254
  function assertPublishableBuiltinId(id) {
8407
9255
  const first = id.split(":")[0];
@@ -8494,7 +9342,11 @@ var PUBLISHED_PATHS = [
8494
9342
  ["graph-strict/1.0.0.json", "manni:graph-strict:1.0.0"],
8495
9343
  ["citations-strict/1.0.0.json", "manni:citations-strict:1.0.0"],
8496
9344
  ["tgdp/1.1.json", "tgdp:templates:1.1"],
8497
- ["tgdp-strict/1.1.json", "tgdp:templates-strict:1.1"]
9345
+ ["tgdp-strict/1.1.json", "tgdp:templates-strict:1.1"],
9346
+ ["artifact-evals/1.1.0.json", "manni:artifact-evals:1.1.0"],
9347
+ ["artifact-evals-strict/1.1.0.json", "manni:artifact-evals-strict:1.1.0"],
9348
+ ["stewardship/1.1.0.json", "manni:stewardship:1.1.0"],
9349
+ ["stewardship-strict/1.1.0.json", "manni:stewardship-strict:1.1.0"]
8498
9350
  ];
8499
9351
  var PUBLISHED_ALIAS = new Map(
8500
9352
  PUBLISHED_PATHS.map(([path, id]) => [`${PUBLISHED_BASE}${path}`, id])
@@ -8850,7 +9702,7 @@ var DEFAULT_SCHEMAS = Object.freeze([
8850
9702
  "manni:core:1.0.0",
8851
9703
  "manni:audience:1.0.0",
8852
9704
  "manni:structure:1.0.0",
8853
- "manni:stewardship:1.0.0",
9705
+ "manni:stewardship:1.1.0",
8854
9706
  "manni:lifecycle:1.0.0",
8855
9707
  "manni:ai-context:1.0.0",
8856
9708
  "manni:evals:1.0.0",
@@ -8858,7 +9710,14 @@ var DEFAULT_SCHEMAS = Object.freeze([
8858
9710
  "manni:citations:1.0.0"
8859
9711
  ]);
8860
9712
  var FILE_SCHEMA_KEY = "$schema";
8861
- var DEFAULT_SCHEMA_SET = new Set(DEFAULT_SCHEMAS);
9713
+ function vocabularyOf(id) {
9714
+ const parts = id.split(":");
9715
+ if (parts.length !== 3) return void 0;
9716
+ return `${parts[0] ?? ""}:${parts[1] ?? ""}`;
9717
+ }
9718
+ var DEFAULT_VOCABULARIES = new Set(
9719
+ DEFAULT_SCHEMAS.map(vocabularyOf).filter((v) => v !== void 0)
9720
+ );
8862
9721
  function schemaEntryRef(entry) {
8863
9722
  return typeof entry === "string" ? entry : entry.ref;
8864
9723
  }
@@ -8969,14 +9828,34 @@ function withStrict(refs, registered2) {
8969
9828
  out.push(ref);
8970
9829
  const strictId = strictIdOf(ref);
8971
9830
  if (strictId === void 0) continue;
8972
- if (DEFAULT_SCHEMA_SET.has(ref) && isBuiltinId(strictId)) out.push(strictId);
9831
+ const vocabulary = vocabularyOf(ref);
9832
+ const isDefault = vocabulary !== void 0 && DEFAULT_VOCABULARIES.has(vocabulary);
9833
+ if (isDefault && isBuiltinId(ref) && isBuiltinId(strictId)) out.push(strictId);
8973
9834
  else if (registered2?.has(ref) === true && registered2.has(strictId)) out.push(strictId);
8974
9835
  }
8975
9836
  return dedupe(out);
8976
9837
  }
9838
+ function withoutReplacedVersions(set, listed) {
9839
+ const explicit = /* @__PURE__ */ new Set();
9840
+ for (const ref of listed) {
9841
+ if (!isBuiltinId(ref)) continue;
9842
+ explicit.add(ref);
9843
+ const strictId = strictIdOf(ref);
9844
+ if (strictId !== void 0) explicit.add(strictId);
9845
+ }
9846
+ const pinned = new Set(
9847
+ [...explicit].map(vocabularyOf).filter((v) => v !== void 0)
9848
+ );
9849
+ return set.filter((ref) => {
9850
+ if (explicit.has(ref) || !isBuiltinId(ref)) return true;
9851
+ const vocabulary = vocabularyOf(ref);
9852
+ return vocabulary === void 0 || !pinned.has(vocabulary);
9853
+ });
9854
+ }
8977
9855
  function joined(listed, defaults, strict, registered2) {
8978
9856
  const set = dedupe([...defaults ? DEFAULT_SCHEMAS : [], ...listed]);
8979
- return strict ? withStrict(set, registered2) : set;
9857
+ const paired = strict ? withStrict(set, registered2) : set;
9858
+ return defaults ? withoutReplacedVersions(paired, listed) : paired;
8980
9859
  }
8981
9860
  function isDefaultSetOnly(resolved) {
8982
9861
  if (!resolved.defaults) return false;
@@ -10709,6 +11588,14 @@ function schemaTrustRoot(cwd, configDir) {
10709
11588
  async function loadConfig(explicitPath, cwd = process.cwd()) {
10710
11589
  const file = explicitPath ? await readConfigFile(explicitPath, cwd, CONFIG_FILE) : await findConfigFile(cwd, CONFIG_FILE);
10711
11590
  if (file === null) return null;
11591
+ return loadedFrom(file);
11592
+ }
11593
+ async function loadMetaSection(explicitPath, cwd = process.cwd()) {
11594
+ if (explicitPath === void 0) return loadConfig(void 0, cwd);
11595
+ const file = await readConfigFile(explicitPath, cwd, CONFIG_FILE);
11596
+ return file.wrapped ? loadedFrom(file) : null;
11597
+ }
11598
+ async function loadedFrom(file) {
10712
11599
  const section = file.wrapped ? META_SECTION : void 0;
10713
11600
  const config = parseConfigValue(file.value, file.source, section);
10714
11601
  assertOverrideCollections(config, file.collections, file.source, section);
@@ -11050,8 +11937,9 @@ function canonicalSchemaRef(ref, ctx) {
11050
11937
  return relative7(ctx.base, abs).replace(/\\/g, "/");
11051
11938
  }
11052
11939
  function fingerprint(e, ctx) {
11940
+ const ref = canonicalSchemaRef(e.schema, ctx);
11053
11941
  const parts = [
11054
- canonicalSchemaRef(e.schema, ctx),
11942
+ ANNOTATION_ONLY_PREDECESSORS.get(ref) ?? ref,
11055
11943
  e.instancePath,
11056
11944
  e.keyword,
11057
11945
  e.subject ?? ""
@@ -11412,9 +12300,7 @@ function renderSarif(results, opts = {}) {
11412
12300
  )}`;
11413
12301
  }
11414
12302
 
11415
- // src/meta/reporters/junit.ts
11416
- var SUITE_NAME = "manni";
11417
- var CLASS_NAME = "manni.validate";
12303
+ // src/shared/xml.ts
11418
12304
  var XML_ENTITIES = {
11419
12305
  "&": "&amp;",
11420
12306
  "<": "&lt;",
@@ -11434,6 +12320,10 @@ function xmlEscape(value) {
11434
12320
  }
11435
12321
  return out;
11436
12322
  }
12323
+
12324
+ // src/meta/reporters/junit.ts
12325
+ var SUITE_NAME = "manni";
12326
+ var CLASS_NAME = "manni.validate";
11437
12327
  var attr = (name2, value) => ` ${name2}="${xmlEscape(value)}"`;
11438
12328
  function renderJunit(results, opts = {}) {
11439
12329
  const tests = results.length;
@@ -11483,6 +12373,16 @@ function shouldColor(opts) {
11483
12373
  if (env.NO_COLOR != null && env.NO_COLOR !== "") return false;
11484
12374
  return Boolean(opts.isTTY);
11485
12375
  }
12376
+ function colorFor(command, isTTY, env) {
12377
+ const noColor = colorOwner(command).opts().color === false;
12378
+ return shouldColor({ noColor, isTTY, env });
12379
+ }
12380
+ function colorOwner(command) {
12381
+ for (let c = command; c !== null; c = c.parent) {
12382
+ if (c.options.some((o) => o.long === "--no-color")) return c;
12383
+ }
12384
+ return command;
12385
+ }
11486
12386
 
11487
12387
  // src/shared/github.ts
11488
12388
  function escapeWorkflowCommandMessage(message) {
@@ -11720,7 +12620,7 @@ async function readCapped(url, res, maxBytes) {
11720
12620
  }
11721
12621
 
11722
12622
  // src/meta/core/external-metadata.ts
11723
- import { readFile as readFile6 } from "node:fs/promises";
12623
+ import { readFile as readFile7 } from "node:fs/promises";
11724
12624
  import { isAbsolute as isAbsolute5, relative as relative9, resolve as resolve14, sep as sep4 } from "node:path";
11725
12625
  import {
11726
12626
  LineCounter as LineCounter3,
@@ -11732,6 +12632,7 @@ import {
11732
12632
  } from "yaml";
11733
12633
 
11734
12634
  // src/shared/manifest-cas.ts
12635
+ import { readFile as readFile5 } from "node:fs/promises";
11735
12636
  import { posix as posix3 } from "node:path";
11736
12637
  var COMMIT_ATTEMPTS = 5;
11737
12638
  function conflictRefusal(file) {
@@ -11800,10 +12701,18 @@ async function settle(held, io) {
11800
12701
  function isMissing(error) {
11801
12702
  return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
11802
12703
  }
12704
+ async function readManifestOrEmpty(absPath, perPage) {
12705
+ try {
12706
+ return await readFile5(absPath, "utf8");
12707
+ } catch (e) {
12708
+ if (perPage && isMissing(e)) return "";
12709
+ throw e;
12710
+ }
12711
+ }
11803
12712
 
11804
12713
  // src/shared/encryption-key.ts
11805
12714
  import { spawnSync } from "node:child_process";
11806
- import { readFile as readFile5 } from "node:fs/promises";
12715
+ import { readFile as readFile6 } from "node:fs/promises";
11807
12716
  import { basename as basename4, dirname as dirname6, join as join7, relative as relative8, resolve as resolve13 } from "node:path";
11808
12717
  import { isDeepStrictEqual } from "node:util";
11809
12718
  import { isMap as isMap5, parseDocument as parseDocument4, parse as parseYaml3, stringify as stringify2 } from "yaml";
@@ -11873,7 +12782,7 @@ function errorCode3(err) {
11873
12782
  }
11874
12783
  async function readIfPresent(path) {
11875
12784
  try {
11876
- return await readFile5(path, "utf8");
12785
+ return await readFile6(path, "utf8");
11877
12786
  } catch (err) {
11878
12787
  if (errorCode3(err) === "ENOENT") return null;
11879
12788
  throw err;
@@ -12387,7 +13296,7 @@ function outsideRefusal(manifest, collection, pageRel) {
12387
13296
  }
12388
13297
  async function readPageManifest(abs, file) {
12389
13298
  try {
12390
- return await readFile6(abs, "utf8");
13299
+ return await readFile7(abs, "utf8");
12391
13300
  } catch (err) {
12392
13301
  if (isMissing(err)) return "";
12393
13302
  throw unreadable(file, err);
@@ -12395,7 +13304,7 @@ async function readPageManifest(abs, file) {
12395
13304
  }
12396
13305
  async function readManifest(abs, file) {
12397
13306
  try {
12398
- return await readFile6(abs, "utf8");
13307
+ return await readFile7(abs, "utf8");
12399
13308
  } catch (err) {
12400
13309
  throw unreadable(file, err);
12401
13310
  }
@@ -12992,6 +13901,9 @@ function isFieldLocation(value) {
12992
13901
  return value === "page" || value === "external";
12993
13902
  }
12994
13903
 
13904
+ // src/meta/core/graph-output.ts
13905
+ var GRAPH_OUTPUT_KEYWORD = "x-manni-graph-output";
13906
+
12995
13907
  // src/meta/core/validator.ts
12996
13908
  import * as AjvDraft07Ns from "ajv";
12997
13909
  import * as Ajv2019Ns from "ajv/dist/2019.js";
@@ -13023,6 +13935,7 @@ function buildAjv(dialect, coerceTypes = false) {
13023
13935
  if (dialect === "draft7") ajv.addMetaSchema(draft06MetaSchema);
13024
13936
  registerEncryptKeyword(ajv);
13025
13937
  registerLocationKeyword(ajv);
13938
+ registerGraphOutputKeyword(ajv);
13026
13939
  registerBuiltins(ajv, dialect);
13027
13940
  return ajv;
13028
13941
  }
@@ -13071,6 +13984,28 @@ function registerLocationKeyword(ajv) {
13071
13984
  function isLocationShapeError(err) {
13072
13985
  return err instanceof Error && err.message.includes(`"${LOCATION_KEYWORD}"`);
13073
13986
  }
13987
+ var graphOutputRecorder;
13988
+ function registerGraphOutputKeyword(ajv) {
13989
+ ajv.addKeyword({
13990
+ keyword: GRAPH_OUTPUT_KEYWORD,
13991
+ metaSchema: { type: "boolean" },
13992
+ errors: false,
13993
+ validate: (schema, _data, _parent, cxt) => {
13994
+ if (graphOutputRecorder !== void 0 && typeof schema === "boolean") {
13995
+ const key = topLevelKey(cxt?.instancePath ?? "");
13996
+ if (key !== void 0) {
13997
+ const seen = graphOutputRecorder.get(key);
13998
+ if (seen) seen.add(schema);
13999
+ else graphOutputRecorder.set(key, /* @__PURE__ */ new Set([schema]));
14000
+ }
14001
+ }
14002
+ return true;
14003
+ }
14004
+ });
14005
+ }
14006
+ function isGraphOutputShapeError(err) {
14007
+ return err instanceof Error && err.message.includes(`"${GRAPH_OUTPUT_KEYWORD}"`);
14008
+ }
13074
14009
  function marksSchemaExternal(schema) {
13075
14010
  const properties = schema["properties"];
13076
14011
  if (typeof properties !== "object" || properties === null) return false;
@@ -13081,7 +14016,7 @@ function marksSchemaExternal(schema) {
13081
14016
  function isRecord2(value) {
13082
14017
  return typeof value === "object" && value !== null && !Array.isArray(value);
13083
14018
  }
13084
- function definiteLocationConflict(root) {
14019
+ function definiteMarkConflict(root, keyword, isMark) {
13085
14020
  const marks = /* @__PURE__ */ new Map();
13086
14021
  const localRef = (node, embedded) => {
13087
14022
  const ref = node["$ref"];
@@ -13109,8 +14044,8 @@ function definiteLocationConflict(root) {
13109
14044
  if (!isRecord2(node) || visited.has(node)) return;
13110
14045
  visited.add(node);
13111
14046
  const inner = isEmbedded(node, embedded);
13112
- const mark = node[LOCATION_KEYWORD];
13113
- if (isFieldLocation(mark)) {
14047
+ const mark = node[keyword];
14048
+ if (isMark(mark)) {
13114
14049
  const seen = marks.get(key);
13115
14050
  if (seen) seen.add(mark);
13116
14051
  else marks.set(key, /* @__PURE__ */ new Set([mark]));
@@ -13240,12 +14175,22 @@ var Validator = class {
13240
14175
  `${ref}: "${FILE_SCHEMA_KEY}" cannot be stored in external metadata.`
13241
14176
  );
13242
14177
  }
13243
- const contradicted = definiteLocationConflict(schema);
14178
+ const contradicted = definiteMarkConflict(schema, LOCATION_KEYWORD, isFieldLocation);
13244
14179
  if (contradicted !== void 0) {
13245
14180
  throw new DocmetaError(
13246
14181
  `${ref}: "${LOCATION_KEYWORD}" says both "page" and "external" for "${contradicted}".`
13247
14182
  );
13248
14183
  }
14184
+ const graphContradicted = definiteMarkConflict(
14185
+ schema,
14186
+ GRAPH_OUTPUT_KEYWORD,
14187
+ (value) => typeof value === "boolean"
14188
+ );
14189
+ if (graphContradicted !== void 0) {
14190
+ throw new DocmetaError(
14191
+ `${ref}: "${GRAPH_OUTPUT_KEYWORD}" says both true and false for "${graphContradicted}".`
14192
+ );
14193
+ }
13249
14194
  try {
13250
14195
  const ajv = this.ajvFor(dialectOf(schema));
13251
14196
  const id = typeof schema["$id"] === "string" ? schema["$id"] : void 0;
@@ -13267,6 +14212,11 @@ var Validator = class {
13267
14212
  `${ref}: "${LOCATION_KEYWORD}" must be "page" or "external".`
13268
14213
  );
13269
14214
  }
14215
+ if (isGraphOutputShapeError(err)) {
14216
+ throw new DocmetaError(
14217
+ `${ref}: "${GRAPH_OUTPUT_KEYWORD}" must be true or false.`
14218
+ );
14219
+ }
13270
14220
  throw new DocmetaError(
13271
14221
  `Schema "${ref}" failed to compile: ${errorMessage(err)}`
13272
14222
  );
@@ -13356,6 +14306,45 @@ var Validator = class {
13356
14306
  }
13357
14307
  return claimed;
13358
14308
  }
14309
+ /**
14310
+ * Whether each top-level key of `data` belongs in a published graph under
14311
+ * `refs`, as its `x-manni-graph-output` mark says. A key no schema marks has no
14312
+ * entry, which the caller reads as `true`: absent means harvested.
14313
+ *
14314
+ * A first pass with the recording keyword, as `locationPreferences` runs, so
14315
+ * a mark counts exactly where validation would evaluate it, and a mark nested
14316
+ * inside `graph` is ignored. Only present values are marked: Ajv applies a
14317
+ * property's subschema to a property that exists. `$schema` is stripped
14318
+ * first, as validation does.
14319
+ *
14320
+ * Refs are evaluated in order and a later ref's mark wins, so a house schema
14321
+ * listed after a vocabulary refines it. A schema that says both on paths
14322
+ * every document takes is refused when it compiles. A ref whose conditional
14323
+ * branches say both `true` and `false` gives that key no preference: with
14324
+ * `allErrors`, Ajv evaluates failing branches too, so neither value is that
14325
+ * ref's answer and an earlier ref's stands.
14326
+ */
14327
+ async graphOutputPreferences(data, refs) {
14328
+ const { [FILE_SCHEMA_KEY]: _omit, ...subject } = data;
14329
+ void _omit;
14330
+ const preferences = /* @__PURE__ */ new Map();
14331
+ for (const ref of refs) {
14332
+ const fn = await this.compile(ref);
14333
+ const seen = /* @__PURE__ */ new Map();
14334
+ graphOutputRecorder = seen;
14335
+ try {
14336
+ fn(subject);
14337
+ } finally {
14338
+ graphOutputRecorder = void 0;
14339
+ }
14340
+ for (const [key, values] of seen) {
14341
+ const [value, ...others] = [...values];
14342
+ if (value === void 0 || others.length > 0) continue;
14343
+ preferences.set(key, value);
14344
+ }
14345
+ }
14346
+ return preferences;
14347
+ }
13359
14348
  /**
13360
14349
  * Validate `data` against every schema in `refs`. Returns all violations,
13361
14350
  * each tagged with the schema that produced it and a source line via
@@ -14026,7 +15015,7 @@ import { dirname as dirname9, resolve as resolve16 } from "node:path";
14026
15015
 
14027
15016
  // src/meta/core/derive/codeowners.ts
14028
15017
  import { existsSync as existsSync3 } from "node:fs";
14029
- import { readFile as readFile7 } from "node:fs/promises";
15018
+ import { readFile as readFile8 } from "node:fs/promises";
14030
15019
  import { dirname as dirname7, relative as relative11, resolve as resolve15, sep as sep6 } from "node:path";
14031
15020
  import picomatch4 from "picomatch";
14032
15021
  var CODEOWNERS_LOCATIONS = [
@@ -14190,7 +15179,7 @@ async function deriveFromCodeowners(inputs, opts) {
14190
15179
  const key = `${path}\0${label}`;
14191
15180
  let file = parsed2.get(key);
14192
15181
  if (!file) {
14193
- file = readFile7(path, "utf8").then(
15182
+ file = readFile8(path, "utf8").then(
14194
15183
  (text2) => parseCodeowners(text2, path, label)
14195
15184
  );
14196
15185
  parsed2.set(key, file);
@@ -16078,7 +17067,7 @@ async function deriveForTable(inputs, ctx, hint, fields) {
16078
17067
  }
16079
17068
 
16080
17069
  // src/meta/commands/validate.ts
16081
- import { readFile as readFile9 } from "node:fs/promises";
17070
+ import { readFile as readFile10 } from "node:fs/promises";
16082
17071
 
16083
17072
  // src/meta/core/page-marks.ts
16084
17073
  function pageMarks(opts) {
@@ -16114,17 +17103,20 @@ function lazyValidator(opts) {
16114
17103
  let built;
16115
17104
  return () => opts.validator instanceof Validator ? opts.validator : built ??= opts.validator();
16116
17105
  }
17106
+ function pageSchemaSet(opts, label, probe, memberOf2) {
17107
+ return resolveSchemaSetWithSource({
17108
+ filePath: label,
17109
+ fileSchema: probe[FILE_SCHEMA_KEY],
17110
+ ...opts.cliSchemas !== void 0 ? { cliSchemas: [...opts.cliSchemas] } : {},
17111
+ config: opts.config,
17112
+ memberOf: opts.memberOf?.(label) ?? memberOf2,
17113
+ fileBase: opts.cwd,
17114
+ trustRoot: opts.trustRoot
17115
+ }).schemas;
17116
+ }
16117
17117
  function pageRefs(opts, label, probe, memberOf2) {
16118
17118
  try {
16119
- return resolveSchemaSetWithSource({
16120
- filePath: label,
16121
- fileSchema: probe[FILE_SCHEMA_KEY],
16122
- ...opts.cliSchemas !== void 0 ? { cliSchemas: [...opts.cliSchemas] } : {},
16123
- config: opts.config,
16124
- memberOf: opts.memberOf?.(label) ?? memberOf2,
16125
- fileBase: opts.cwd,
16126
- trustRoot: opts.trustRoot
16127
- }).schemas;
17119
+ return pageSchemaSet(opts, label, probe, memberOf2);
16128
17120
  } catch (err) {
16129
17121
  if (err instanceof DocmetaError) return void 0;
16130
17122
  throw err;
@@ -16153,9 +17145,32 @@ async function configMarks(configPath, cwd) {
16153
17145
  trustRoot: schemaTrustRoot(cwd, loaded.dir)
16154
17146
  });
16155
17147
  }
17148
+ async function metaSection(configPath, cwd) {
17149
+ const loaded = await loadConfig(configPath, cwd);
17150
+ if (loaded === null) return null;
17151
+ return rebaseConfigSchemaRefs(loaded.config, loaded.dir, cwd);
17152
+ }
17153
+ function familyMarks(opts) {
17154
+ let built;
17155
+ const defaults = () => pageMarks({
17156
+ validator: marksValidator({ config: null, cwd: opts.cwd, configDir: opts.configDir }),
17157
+ config: null,
17158
+ cwd: opts.cwd,
17159
+ trustRoot: schemaTrustRoot(opts.cwd, opts.configDir)
17160
+ });
17161
+ return () => built ??= (async () => {
17162
+ if (opts.configPath === void 0) return defaults();
17163
+ try {
17164
+ return await configMarks(opts.configPath, opts.cwd) ?? defaults();
17165
+ } catch (err) {
17166
+ if (err instanceof DocmetaError) return defaults();
17167
+ throw err;
17168
+ }
17169
+ })();
17170
+ }
16156
17171
 
16157
17172
  // src/meta/core/relocation.ts
16158
- import { access, readFile as readFile8, stat as stat7, unlink } from "node:fs/promises";
17173
+ import { access, readFile as readFile9, stat as stat7, unlink } from "node:fs/promises";
16159
17174
  import { basename as basename5, extname as extname3, isAbsolute as isAbsolute8, join as join9, relative as relative13, resolve as resolve17, sep as sep8 } from "node:path";
16160
17175
  import picomatch6 from "picomatch";
16161
17176
  import {
@@ -16904,13 +17919,13 @@ async function planRelocation(ctx, request) {
16904
17919
  let unreadable2;
16905
17920
  if (beyond) {
16906
17921
  try {
16907
- content = await readFile8(absPath, "utf8");
17922
+ content = await readFile9(absPath, "utf8");
16908
17923
  own2 = extractor.extract(content, label, { elements }).data;
16909
17924
  } catch (err) {
16910
17925
  unreadable2 = (errorMessage(err).split("\n")[0] ?? "").replace(/:\s*$/, "");
16911
17926
  }
16912
17927
  } else {
16913
- content = await readFile8(absPath, "utf8");
17928
+ content = await readFile9(absPath, "utf8");
16914
17929
  try {
16915
17930
  own2 = extractor.extract(content, label, { elements }).data;
16916
17931
  } catch (err) {
@@ -17351,7 +18366,7 @@ function assertNoStrandedEntries(m, index, pages2, configDir, fileOf) {
17351
18366
  }
17352
18367
  async function readManifestText(path, file, perPage) {
17353
18368
  try {
17354
- return await readFile8(path, "utf8");
18369
+ return await readFile9(path, "utf8");
17355
18370
  } catch (err) {
17356
18371
  if (perPage && isMissing(err)) return null;
17357
18372
  throw new DocmetaError(`Manifest ${file} could not be read: ${errorMessage(err)}`);
@@ -17381,7 +18396,7 @@ function keyLines2(text2, join12) {
17381
18396
  async function configTarget(ctx, configDir) {
17382
18397
  if (ctx.configPath !== void 0) {
17383
18398
  try {
17384
- const text2 = await readFile8(ctx.configPath, "utf8");
18399
+ const text2 = await readFile9(ctx.configPath, "utf8");
17385
18400
  return { path: ctx.configPath, text: text2, disk: text2 };
17386
18401
  } catch (err) {
17387
18402
  if (err.code !== "ENOENT") {
@@ -17395,7 +18410,7 @@ async function configTarget(ctx, configDir) {
17395
18410
  for (const name2 of FAMILY_CONFIG_NAMES) {
17396
18411
  const path = join9(configDir, name2);
17397
18412
  try {
17398
- const text2 = await readFile8(path, "utf8");
18413
+ const text2 = await readFile9(path, "utf8");
17399
18414
  return { path, text: text2, disk: text2 };
17400
18415
  } catch {
17401
18416
  }
@@ -17581,7 +18596,7 @@ async function applyRelocation(ctx, plan, io = {}) {
17581
18596
  for (const w of plan.writes) {
17582
18597
  let now;
17583
18598
  try {
17584
- now = await readFile8(w.path, "utf8");
18599
+ now = await readFile9(w.path, "utf8");
17585
18600
  } catch (err) {
17586
18601
  if (err.code !== "ENOENT") {
17587
18602
  throw new DocmetaError(`${label(w)} could not be read: ${errorMessage(err)}`);
@@ -17990,6 +19005,36 @@ function stampManifests(label, data, collections, configDir, base, marked, field
17990
19005
  return out;
17991
19006
  }
17992
19007
 
19008
+ // src/shared/cli-options.ts
19009
+ import { basename as basename6, relative as relative15 } from "node:path";
19010
+ function collect(value, prev) {
19011
+ return prev.concat([value]);
19012
+ }
19013
+ function splitList(value) {
19014
+ return value.split(",").map((s) => s.trim()).filter(Boolean);
19015
+ }
19016
+ var STDIN_REQUIRES_AS = "Reading from stdin (`-`) requires --as <format> to choose an extractor.";
19017
+ async function readStdin() {
19018
+ const chunks = [];
19019
+ for await (const chunk of process.stdin) chunks.push(chunk);
19020
+ return Buffer.concat(chunks).toString("utf8");
19021
+ }
19022
+ function configOption(value) {
19023
+ if (value === false) return { noConfig: true };
19024
+ return typeof value === "string" ? { configPath: value } : {};
19025
+ }
19026
+ function explicitFalse(value) {
19027
+ return value === false ? false : void 0;
19028
+ }
19029
+ function reportConfig(toStdout, cwd) {
19030
+ return (info) => {
19031
+ const where = (relative15(cwd, info.dir) || ".").replace(/\\/g, "/");
19032
+ const line = `Using ${basename6(info.path)} (${where})
19033
+ `;
19034
+ (toStdout ? process.stdout : process.stderr).write(line);
19035
+ };
19036
+ }
19037
+
17993
19038
  // src/meta/commands/validate.ts
17994
19039
  function parseErrorResult(file, format, message, keyword) {
17995
19040
  const err = {
@@ -18378,13 +19423,13 @@ async function runValidate(opts) {
18378
19423
  const content = opts.stdinContent ?? "";
18379
19424
  if (!forcedExtractor) {
18380
19425
  throw new DocmetaError(
18381
- "Reading from stdin (`-`) requires --as <format> to choose an extractor."
19426
+ STDIN_REQUIRES_AS
18382
19427
  );
18383
19428
  }
18384
19429
  await processOne(STDIN_LABEL, content, forcedExtractor.extensions[0] ?? "");
18385
19430
  }
18386
19431
  for (const file of files) {
18387
- const content = await readFile9(resolve19(base, file), "utf8");
19432
+ const content = await readFile10(resolve19(base, file), "utf8");
18388
19433
  await processOne(file, content, extname4(file));
18389
19434
  }
18390
19435
  if (unverified > 0) opts.onNotice?.(unverifiedWarning(unverified));
@@ -18530,7 +19575,7 @@ async function runValidate(opts) {
18530
19575
  }
18531
19576
 
18532
19577
  // src/meta/commands/get.ts
18533
- import { readFile as readFile10 } from "node:fs/promises";
19578
+ import { readFile as readFile11 } from "node:fs/promises";
18534
19579
  import { resolve as resolve20, extname as extname5 } from "node:path";
18535
19580
  async function runGet(opts) {
18536
19581
  const cwd = opts.cwd ?? process.cwd();
@@ -18670,13 +19715,13 @@ async function runGet(opts) {
18670
19715
  if (usingStdin) {
18671
19716
  if (!forced) {
18672
19717
  throw new DocmetaError(
18673
- "Reading from stdin (`-`) requires --as <format> to choose an extractor."
19718
+ STDIN_REQUIRES_AS
18674
19719
  );
18675
19720
  }
18676
19721
  await readOne(STDIN_LABEL, opts.stdinContent ?? "", forced.extensions[0] ?? "");
18677
19722
  }
18678
19723
  for (const file of files) {
18679
- const content = await readFile10(resolve20(base, file), "utf8");
19724
+ const content = await readFile11(resolve20(base, file), "utf8");
18680
19725
  await readOne(file, content, extname5(file));
18681
19726
  }
18682
19727
  if (deriving) {
@@ -18802,8 +19847,8 @@ function parseJsonPointer(pointer) {
18802
19847
 
18803
19848
  // src/meta/commands/schemas.ts
18804
19849
  import { existsSync as existsSync4 } from "node:fs";
18805
- import { mkdir as mkdir3, readFile as readFile11 } from "node:fs/promises";
18806
- import { dirname as dirname10, extname as extname6, isAbsolute as isAbsolute10, join as join10, relative as relative15, resolve as resolve21, sep as sep10 } from "node:path";
19850
+ import { mkdir as mkdir3, readFile as readFile12 } from "node:fs/promises";
19851
+ import { dirname as dirname10, extname as extname6, isAbsolute as isAbsolute10, join as join10, relative as relative16, resolve as resolve21, sep as sep10 } from "node:path";
18807
19852
  import { parseDocument as parseDocument8, parse as parseYaml6, stringify as stringify4 } from "yaml";
18808
19853
  function getSchemasInfo(registered2) {
18809
19854
  return {
@@ -18815,7 +19860,7 @@ function getSchemasInfo(registered2) {
18815
19860
  var DEFAULT_VENDOR_DIR = "./schema";
18816
19861
  var DEFAULT_CONFIG_NAME = "manni.config.yaml";
18817
19862
  function posixRelative(from, to) {
18818
- return relative15(from, to).split(sep10).join("/");
19863
+ return relative16(from, to).split(sep10).join("/");
18819
19864
  }
18820
19865
  function vendorFileName(url) {
18821
19866
  let parsed2;
@@ -18922,7 +19967,7 @@ async function runVendorSchema(opts) {
18922
19967
  }
18923
19968
  let unchanged = false;
18924
19969
  if (existsSync4(absFile)) {
18925
- const current = await readFile11(absFile);
19970
+ const current = await readFile12(absFile);
18926
19971
  unchanged = bytes.equals(current);
18927
19972
  if (!unchanged && !folded.replaced) {
18928
19973
  throw new DocmetaError(
@@ -18932,7 +19977,7 @@ async function runVendorSchema(opts) {
18932
19977
  }
18933
19978
  await mkdir3(absDir, { recursive: true });
18934
19979
  await writeFileAtomic(absFile, bytes);
18935
- const existing = loaded ? await readFile11(configPath, "utf8") : null;
19980
+ const existing = loaded ? await readFile12(configPath, "utf8") : null;
18936
19981
  const section = loaded ? loaded.section : META_SECTION;
18937
19982
  const text2 = renderConfig(existing, folded.entries, section);
18938
19983
  reparseConfig(text2, posixRelative(cwd, configPath) || DEFAULT_CONFIG_NAME, section);
@@ -19074,7 +20119,7 @@ async function runInferSchema(opts) {
19074
20119
  }
19075
20120
  if (usingStdin && !forced) {
19076
20121
  throw new DocmetaError(
19077
- "Reading from stdin (`-`) requires --as <format> to choose an extractor."
20122
+ STDIN_REQUIRES_AS
19078
20123
  );
19079
20124
  }
19080
20125
  let absOut;
@@ -19184,7 +20229,7 @@ async function runInferSchema(opts) {
19184
20229
  await scanOne(STDIN_LABEL, opts.stdinContent ?? "", forced.extensions[0] ?? "");
19185
20230
  }
19186
20231
  for (const file of files) {
19187
- const content = await readFile11(resolve21(base, file), "utf8");
20232
+ const content = await readFile12(resolve21(base, file), "utf8");
19188
20233
  await scanOne(file, content, extname6(file));
19189
20234
  }
19190
20235
  for (const u of unreadable2) {
@@ -19245,7 +20290,7 @@ async function runInferSchema(opts) {
19245
20290
  // src/meta/commands/query.ts
19246
20291
  import { randomBytes as randomBytes2 } from "node:crypto";
19247
20292
  import { existsSync as existsSync5 } from "node:fs";
19248
- import { mkdir as mkdir4, open as open2, readFile as readFile12, rename as rename3, rm as rm3 } from "node:fs/promises";
20293
+ import { mkdir as mkdir4, open as open2, readFile as readFile13, rename as rename3, rm as rm3 } from "node:fs/promises";
19249
20294
  import { dirname as dirname11, isAbsolute as isAbsolute11, resolve as resolve22, extname as extname7, sep as sep11 } from "node:path";
19250
20295
 
19251
20296
  // src/shared/prompt.ts
@@ -19591,7 +20636,7 @@ async function runQuery(opts) {
19591
20636
  if (usingStdin) {
19592
20637
  if (!forced) {
19593
20638
  throw new DocmetaError(
19594
- "Reading from stdin (`-`) requires --as <format> to choose an extractor."
20639
+ STDIN_REQUIRES_AS
19595
20640
  );
19596
20641
  }
19597
20642
  const ext = forced.extensions[0];
@@ -19603,7 +20648,7 @@ async function runQuery(opts) {
19603
20648
  await readOne(STDIN_LABEL, opts.stdinContent ?? "", ext);
19604
20649
  }
19605
20650
  for (const file of files) {
19606
- const content = await readFile12(resolve22(base, file), "utf8");
20651
+ const content = await readFile13(resolve22(base, file), "utf8");
19607
20652
  await readOne(file, content, extname7(file));
19608
20653
  }
19609
20654
  const db = opts.db === void 0 ? void 0 : { resolved: resolve22(cwd, opts.db), display: opts.db };
@@ -20263,7 +21308,7 @@ async function loadSetMembers(refs, ctx) {
20263
21308
  seenFiles.add(canon);
20264
21309
  let text2;
20265
21310
  try {
20266
- text2 = await readFile12(abs, "utf8");
21311
+ text2 = await readFile13(abs, "utf8");
20267
21312
  } catch {
20268
21313
  throw new DocmetaError(
20269
21314
  `Schema file not found: "${ref}" (looked at ${abs}).`
@@ -20620,7 +21665,7 @@ async function planConfigEdit(ctx, edit, runRefs) {
20620
21665
  if (configPath === void 0 || configDir === void 0) {
20621
21666
  return { changes: [], repointed: false };
20622
21667
  }
20623
- const text2 = await readFile12(configPath, "utf8");
21668
+ const text2 = await readFile13(configPath, "utf8");
20624
21669
  const doc = parseDocument10(stripBom2(text2));
20625
21670
  const display = displayPath(ctx, configPath);
20626
21671
  const rawRefOf = (item) => {
@@ -21087,7 +22132,7 @@ async function planManifestEdits(changes, entries, ctx, renameHints) {
21087
22132
  let text2;
21088
22133
  let expected;
21089
22134
  try {
21090
- text2 = await readFile12(home.absPath, "utf8");
22135
+ text2 = await readFile13(home.absPath, "utf8");
21091
22136
  expected = text2;
21092
22137
  } catch (err) {
21093
22138
  if (!home.perPage || !isMissing(err)) {
@@ -21523,7 +22568,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
21523
22568
  }
21524
22569
  const entry = byLabel.get(label);
21525
22570
  if (!entry) throw new DocmetaError(`No loaded entry for "${label}".`);
21526
- const content = await readFile12(path, "utf8");
22571
+ const content = await readFile13(path, "utf8");
21527
22572
  const members = ctx.memberships(label);
21528
22573
  const current = (await mergeWithMarks(
21529
22574
  label,
@@ -21595,7 +22640,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
21595
22640
  }
21596
22641
  let now;
21597
22642
  try {
21598
- now = await readFile12(w.path, "utf8");
22643
+ now = await readFile13(w.path, "utf8");
21599
22644
  } catch {
21600
22645
  now = void 0;
21601
22646
  }
@@ -21608,7 +22653,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
21608
22653
  for (const m of manifestWrites) {
21609
22654
  let now;
21610
22655
  try {
21611
- now = await readFile12(m.path, "utf8");
22656
+ now = await readFile13(m.path, "utf8");
21612
22657
  } catch {
21613
22658
  now = null;
21614
22659
  }
@@ -21741,7 +22786,7 @@ function skipExpression(sql, from) {
21741
22786
  }
21742
22787
 
21743
22788
  // src/meta/commands/fill.ts
21744
- import { readFile as readFile15 } from "node:fs/promises";
22789
+ import { readFile as readFile16 } from "node:fs/promises";
21745
22790
  import { resolve as resolve24, extname as extname9, join as join11 } from "node:path";
21746
22791
  import {
21747
22792
  completeValidatedJSON,
@@ -22161,7 +23206,7 @@ function single(alternatives2) {
22161
23206
  }
22162
23207
 
22163
23208
  // src/meta/commands/fill-hints.ts
22164
- import { readFile as readFile13 } from "node:fs/promises";
23209
+ import { readFile as readFile14 } from "node:fs/promises";
22165
23210
  import { extname as extname8, resolve as resolve23 } from "node:path";
22166
23211
 
22167
23212
  // src/shared/reference-fields.ts
@@ -22275,7 +23320,7 @@ async function readIds(collection, opts) {
22275
23320
  const path = resolve23(opts.configDir, file);
22276
23321
  let id;
22277
23322
  try {
22278
- id = extractor.extract(await readFile13(path, "utf8"), file).data.id;
23323
+ id = extractor.extract(await readFile14(path, "utf8"), file).data.id;
22279
23324
  } catch {
22280
23325
  continue;
22281
23326
  }
@@ -22294,7 +23339,7 @@ function termLabelSource() {
22294
23339
  }
22295
23340
 
22296
23341
  // src/meta/core/manifest-writes.ts
22297
- import { readFile as readFile14 } from "node:fs/promises";
23342
+ import { readFile as readFile15 } from "node:fs/promises";
22298
23343
  var manifestCodec = {
22299
23344
  apply(text2, op) {
22300
23345
  const where = { entry: op.entry, key: op.key, join: op.join, file: op.file };
@@ -22310,7 +23355,7 @@ function applyManifestOp(text2, op) {
22310
23355
  async function holdManifestFile(path, file, perPage = false) {
22311
23356
  let before;
22312
23357
  try {
22313
- before = await readFile14(path, "utf8");
23358
+ before = await readFile15(path, "utf8");
22314
23359
  } catch (err) {
22315
23360
  if (perPage && isMissing(err)) return heldManifest(path, file, "", true);
22316
23361
  throw new DocmetaError(`Manifest ${file} could not be read: ${errorMessage(err)}`);
@@ -22327,7 +23372,7 @@ async function settleManifest(held, io = {}) {
22327
23372
  codec: manifestCodec,
22328
23373
  // A per-page manifest (proposal 0058) may be the first file in its directory.
22329
23374
  write: io.write ?? ((at2, text2) => writeFileAtomic(at2, text2, { createParents: true })),
22330
- read: io.read ?? ((at2) => readFile14(at2, "utf8")),
23375
+ read: io.read ?? ((at2) => readFile15(at2, "utf8")),
22331
23376
  toError: (message) => new DocmetaError(message)
22332
23377
  });
22333
23378
  rebaseline(held);
@@ -22585,7 +23630,7 @@ async function runFill(opts) {
22585
23630
  }
22586
23631
  if (usingStdin && !forcedExtractor) {
22587
23632
  throw new DocmetaError(
22588
- "Reading from stdin (`-`) requires --as <format> to choose an extractor."
23633
+ STDIN_REQUIRES_AS
22589
23634
  );
22590
23635
  }
22591
23636
  const threshold = requireNumber(
@@ -23441,7 +24486,7 @@ async function runFill(opts) {
23441
24486
  const prepareAll = async () => ({
23442
24487
  stdin: usingStdin ? await prepareOne("<stdin>", opts.stdinContent ?? "", forcedExtractor?.extensions[0] ?? "") : void 0,
23443
24488
  files: await mapConcurrent(files, concurrency, async (file) => {
23444
- const content = await readFile15(resolve24(base, file), "utf8");
24489
+ const content = await readFile16(resolve24(base, file), "utf8");
23445
24490
  return prepareOne(file, content, extname9(file));
23446
24491
  })
23447
24492
  });
@@ -23859,8 +24904,8 @@ async function mapConcurrent(items2, limit, fn) {
23859
24904
  }
23860
24905
 
23861
24906
  // src/meta/commands/derive.ts
23862
- import { readFile as readFile16 } from "node:fs/promises";
23863
- import { extname as extname10, relative as relative16, resolve as resolve25, sep as sep12 } from "node:path";
24907
+ import { readFile as readFile17 } from "node:fs/promises";
24908
+ import { extname as extname10, relative as relative17, resolve as resolve25, sep as sep12 } from "node:path";
23864
24909
  var GENERATED_BY_ENV = "MANNI_GENERATED_BY";
23865
24910
  var SOURCE_HINT = "narrow --sources or --fields";
23866
24911
  async function runDerive(opts) {
@@ -23978,7 +25023,7 @@ async function runDerive(opts) {
23978
25023
  const files = fromCollections ? retainMembers(walked, membersFor) : walked;
23979
25024
  const rangesByPage = /* @__PURE__ */ new Map();
23980
25025
  for (const t of targets) {
23981
- const label = relative16(base, resolve25(base, t.page)).split(sep12).join("/");
25026
+ const label = relative17(base, resolve25(base, t.page)).split(sep12).join("/");
23982
25027
  if (!files.includes(label)) {
23983
25028
  throw new DocmetaError(
23984
25029
  `${t.target} does not name one file that derive reads; a range names lines of one file.`
@@ -24012,7 +25057,7 @@ async function runDerive(opts) {
24012
25057
  });
24013
25058
  continue;
24014
25059
  }
24015
- const content = await readFile16(absPath, "utf8");
25060
+ const content = await readFile17(absPath, "utf8");
24016
25061
  const elements = resolveElements(label, config, membersFor(label));
24017
25062
  try {
24018
25063
  loaded2.set(label, {
@@ -25207,10 +26252,10 @@ function cellFrom(value) {
25207
26252
  }
25208
26253
 
25209
26254
  export {
25210
- __export,
25211
26255
  package_default,
25212
26256
  palette,
25213
26257
  shouldColor,
26258
+ colorFor,
25214
26259
  matchesFileGlob,
25215
26260
  hasPagePlaceholder,
25216
26261
  pageManifestPath,
@@ -25225,8 +26270,6 @@ export {
25225
26270
  generateEncryptionKey,
25226
26271
  encryptValue,
25227
26272
  decryptValue,
25228
- ToolError,
25229
- errorMessage,
25230
26273
  assertKnownProvider,
25231
26274
  assertModelHasProvider,
25232
26275
  PROVIDERS_KEY,
@@ -25255,6 +26298,13 @@ export {
25255
26298
  runIfMain,
25256
26299
  escapeWorkflowCommandMessage,
25257
26300
  escapeWorkflowCommandProperty,
26301
+ collect,
26302
+ splitList,
26303
+ STDIN_REQUIRES_AS,
26304
+ readStdin,
26305
+ configOption,
26306
+ explicitFalse,
26307
+ reportConfig,
25258
26308
  INTEGRITY_SHAPE,
25259
26309
  integrityOf,
25260
26310
  isIntegrity,
@@ -25309,7 +26359,9 @@ export {
25309
26359
  schemaCacheDir,
25310
26360
  SchemaCache,
25311
26361
  __default31 as __default,
25312
- __default34 as __default2,
26362
+ __default33 as __default2,
26363
+ __default34 as __default3,
26364
+ __default48 as __default4,
25313
26365
  listBuiltins,
25314
26366
  classifyRef,
25315
26367
  fetchSchemaBytes,
@@ -25333,10 +26385,13 @@ export {
25333
26385
  staleFindings,
25334
26386
  LEGACY_CONFIG_NAMES,
25335
26387
  parseConfig,
26388
+ urlManifestMessage,
25336
26389
  schemaTrustRoot,
25337
26390
  loadConfig,
26391
+ loadMetaSection,
25338
26392
  resolveRunConfig,
25339
26393
  renderSarif,
26394
+ xmlEscape,
25340
26395
  renderJunit,
25341
26396
  REPORT_FORMATS,
25342
26397
  formatList,
@@ -25356,10 +26411,12 @@ export {
25356
26411
  rebaseable,
25357
26412
  settle,
25358
26413
  isMissing,
26414
+ readManifestOrEmpty,
25359
26415
  EXTERNAL_METADATA_FETCH_TIMEOUT_MS,
25360
26416
  EXTERNAL_METADATA_FETCH_MAX_BYTES,
25361
26417
  fetchExternalMetadata,
25362
26418
  META_CONTEXT,
26419
+ lazyKey,
25363
26420
  withValueAt,
25364
26421
  EXTERNAL_OWNED_SCHEMA,
25365
26422
  EXTERNAL_DUPLICATE_SCHEMA,
@@ -25381,10 +26438,14 @@ export {
25381
26438
  LOCATION_KEYWORD,
25382
26439
  LOCATION_EXTERNAL_SCHEMA,
25383
26440
  LOCATION_PAGE_SCHEMA,
26441
+ GRAPH_OUTPUT_KEYWORD,
25384
26442
  Validator,
25385
26443
  pageMarks,
26444
+ pageSchemaSet,
25386
26445
  marksValidator,
25387
26446
  configMarks,
26447
+ metaSection,
26448
+ familyMarks,
25388
26449
  relocateFailed,
25389
26450
  relocationContext,
25390
26451
  keyHome,
@@ -25454,4 +26515,4 @@ export {
25454
26515
  renderQuery,
25455
26516
  renderQueryCsv
25456
26517
  };
25457
- //# sourceMappingURL=chunk-I57KBF45.js.map
26518
+ //# sourceMappingURL=chunk-DP2ZA3WH.js.map