@hawkeyexl/manni 4.2.0 → 4.3.1

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 (43) hide show
  1. package/README.md +2 -2
  2. package/dist/batch-A5HZKYIW.js +18 -0
  3. package/dist/batch-A5HZKYIW.js.map +1 -0
  4. package/dist/calibrate-S5K6QHUY.js +13 -0
  5. package/dist/calibrate-S5K6QHUY.js.map +1 -0
  6. package/dist/capture-OZEZDABQ.js +15 -0
  7. package/dist/capture-OZEZDABQ.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-5HNHEUD5.js +174 -0
  11. package/dist/chunk-5HNHEUD5.js.map +1 -0
  12. package/dist/chunk-CFDUZRM2.js +1941 -0
  13. package/dist/chunk-CFDUZRM2.js.map +1 -0
  14. package/dist/chunk-G5CM2VGQ.js +297 -0
  15. package/dist/chunk-G5CM2VGQ.js.map +1 -0
  16. package/dist/chunk-HAPTXWU2.js +379 -0
  17. package/dist/chunk-HAPTXWU2.js.map +1 -0
  18. package/dist/chunk-IOYXPBCL.js +37 -0
  19. package/dist/chunk-IOYXPBCL.js.map +1 -0
  20. package/dist/chunk-KJR7OVDX.js +4447 -0
  21. package/dist/chunk-KJR7OVDX.js.map +1 -0
  22. package/dist/chunk-KTSJ2ZHA.js +40 -0
  23. package/dist/chunk-KTSJ2ZHA.js.map +1 -0
  24. package/dist/{chunk-BNHQWIAE.js → chunk-UBMMXS2Y.js} +2 -2
  25. package/dist/{chunk-UYDRDFYF.js → chunk-V4KUVE47.js} +1943 -909
  26. package/dist/chunk-V4KUVE47.js.map +1 -0
  27. package/dist/{chunk-TH565O2N.js → chunk-ZQBTK3DO.js} +898 -278
  28. package/dist/chunk-ZQBTK3DO.js.map +1 -0
  29. package/dist/cli.js +437 -47
  30. package/dist/cli.js.map +1 -1
  31. package/dist/docmeta.js +3 -2
  32. package/dist/docmeta.js.map +1 -1
  33. package/dist/index.d.ts +3873 -795
  34. package/dist/index.js +292 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/picker-6HRMETE7.js +12 -0
  37. package/dist/picker-6HRMETE7.js.map +1 -0
  38. package/package.json +3 -1
  39. package/plugin/tracevals/.claude-plugin/plugin.json +9 -0
  40. package/plugin/tracevals/hooks/hooks.json +17 -0
  41. package/dist/chunk-TH565O2N.js.map +0 -1
  42. package/dist/chunk-UYDRDFYF.js.map +0 -1
  43. /package/dist/{chunk-BNHQWIAE.js.map → chunk-UBMMXS2Y.js.map} +0 -0
@@ -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.2.0",
10
+ version: "4.3.1",
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: {
@@ -36,6 +35,7 @@ var package_default = {
36
35
  files: [
37
36
  "dist",
38
37
  "schemas",
38
+ "plugin",
39
39
  "shapes",
40
40
  "templates"
41
41
  ],
@@ -105,6 +105,7 @@ var package_default = {
105
105
  "@asciidoctor/core": "^3.0.4",
106
106
  "@axe-core/playwright": "^4.13.0",
107
107
  "@hawkeyexl/inference": "^0.4.0",
108
+ "@inquirer/prompts": "^7.10.1",
108
109
  "@types/n3": "^1.26.3",
109
110
  "@xmldom/xmldom": "^0.9.12",
110
111
  ajv: "^8.17.1",
@@ -636,30 +637,6 @@ import { realpathSync as realpathSync2 } from "node:fs";
636
637
  import { fileURLToPath } from "node:url";
637
638
  import { CommanderError } from "commander";
638
639
 
639
- // src/shared/errors.ts
640
- var ToolError = class extends Error {
641
- /** clig.dev: 2 is operational/usage; 1 is reserved for findings. */
642
- exitCode = 2;
643
- constructor(message) {
644
- super(message);
645
- this.name = "ToolError";
646
- }
647
- };
648
- function errorMessage(err) {
649
- if (err instanceof Error) return err.message;
650
- if (typeof err === "string") return err;
651
- if (typeof err === "number" || typeof err === "bigint") return String(err);
652
- if (typeof err === "object" && err !== null && "message" in err && typeof err.message === "string") {
653
- return err.message;
654
- }
655
- try {
656
- const json = JSON.stringify(err);
657
- if (json !== void 0) return json;
658
- } catch {
659
- }
660
- return String(err);
661
- }
662
-
663
640
  // src/shared/program-name.ts
664
641
  var name = "manni";
665
642
  function programName() {
@@ -8079,22 +8056,799 @@ var __default42 = {
8079
8056
  description: "A relative path. It starts with no `/`, `\\` or `~`, no drive letter, and no URL scheme."
8080
8057
  }
8081
8058
  }
8082
- },
8083
- "generated-assertion-hash": {
8084
- pattern: "^sha256-[0-9a-f]{64}$",
8085
- description: "`sha256-` and sixty-four lowercase hex digits."
8059
+ },
8060
+ "generated-assertion-hash": {
8061
+ pattern: "^sha256-[0-9a-f]{64}$",
8062
+ description: "`sha256-` and sixty-four lowercase hex digits."
8063
+ }
8064
+ }
8065
+ }
8066
+ }
8067
+ };
8068
+
8069
+ // src/meta/schemas/artifact-evals-strict/1.0.0.json
8070
+ var __default43 = {
8071
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8072
+ $id: "manni:artifact-evals-strict:1.0.0",
8073
+ title: "manni artifact-evals strict overlay v1.0.0",
8074
+ description: "The strict overlay for manni:artifact-evals:1.0.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.",
8075
+ additionalProperties: true,
8076
+ type: "object",
8077
+ properties: {
8078
+ metadata: {
8079
+ 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.",
8080
+ properties: {
8081
+ evals: {
8082
+ items: {
8083
+ $ref: "#/$defs/entry"
8084
+ }
8085
+ },
8086
+ "meta-provenance": {
8087
+ 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.",
8088
+ items: {
8089
+ properties: {
8090
+ "generated-by": {
8091
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._:/\\\\@-]*$",
8092
+ description: "A model id of letters in either case, digits, `.`, `_`, `:`, `/`, `\\`, `@` and `-`, with no spaces. A Windows path to a local model passes."
8093
+ },
8094
+ fields: {
8095
+ items: {
8096
+ pattern: "^(?:/(?:[^~/]|~[01])*)+$",
8097
+ description: "A JSON Pointer in which every `~` begins an RFC 6901 escape, `~0` or `~1`."
8098
+ }
8099
+ },
8100
+ confidence: {
8101
+ propertyNames: {
8102
+ pattern: "^(?:(?:/(?:[^~/]|~[01])*)+|[a-z0-9][a-z0-9-]*)$",
8103
+ description: "A well-formed JSON Pointer, or a kebab eval id."
8104
+ }
8105
+ }
8106
+ }
8107
+ }
8108
+ }
8109
+ }
8110
+ }
8111
+ },
8112
+ $defs: {
8113
+ entry: {
8114
+ description: "The rules strict adds to an object entry.",
8115
+ properties: {
8116
+ grader: {
8117
+ anyOf: [
8118
+ {
8119
+ enum: [
8120
+ "ai",
8121
+ "human",
8122
+ "command",
8123
+ "tool-usage",
8124
+ "skill-invoked",
8125
+ "file-access",
8126
+ "turn-count",
8127
+ "cost",
8128
+ "regex",
8129
+ "json-output"
8130
+ ]
8131
+ },
8132
+ {
8133
+ type: "string",
8134
+ pattern: "^tool:[a-z0-9][a-z0-9-]*$"
8135
+ }
8136
+ ],
8137
+ description: "One of the ten named graders, or a `tool:<kebab>` integration. Strict accepts no other kebab name."
8138
+ },
8139
+ provider: {
8140
+ pattern: "^[a-z0-9][a-z0-9-]*$",
8141
+ description: "A kebab provider name, such as `anthropic` or `llama-cpp`."
8142
+ },
8143
+ model: {
8144
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._:/\\\\@-]*$",
8145
+ description: "A model id of letters in either case, digits, `.`, `_`, `:`, `/`, `\\`, `@` and `-`, with no spaces. A Windows path to a local model passes."
8146
+ },
8147
+ "success-exit-codes": {
8148
+ uniqueItems: true,
8149
+ items: {
8150
+ type: "integer",
8151
+ minimum: 0,
8152
+ maximum: 255
8153
+ },
8154
+ description: "Distinct exit codes, each from 0 to 255, the range a process can return."
8155
+ },
8156
+ target: {
8157
+ properties: {
8158
+ path: {
8159
+ pattern: "^(?![\\\\/~])(?![A-Za-z]:)(?![A-Za-z][A-Za-z0-9+.-]*://).+$",
8160
+ description: "A relative path. It starts with no `/`, `\\` or `~`, no drive letter, and no URL scheme."
8161
+ }
8162
+ }
8163
+ },
8164
+ "generated-assertion-hash": {
8165
+ pattern: "^sha256-[0-9a-f]{64}$",
8166
+ description: "`sha256-` and sixty-four lowercase hex digits."
8167
+ }
8168
+ }
8169
+ }
8170
+ }
8171
+ };
8172
+
8173
+ // src/meta/schemas/graph-strict/1.0.0.json
8174
+ var __default44 = {
8175
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8176
+ $id: "manni:graph-strict:1.0.0",
8177
+ title: "manni graph strict overlay v1.0.0",
8178
+ description: "The strict overlay for manni:graph:1.0.0. Stack it beside the open vocabulary, which owns the closed `graph` block and its iiRDS enums. It narrows section keys to heading slugs and lineage references to single tokens.",
8179
+ additionalProperties: true,
8180
+ type: "object",
8181
+ properties: {
8182
+ graph: {
8183
+ description: "Strict narrows `sections` keys, `revision-of` and `derived-from`. Every other member of the block passes as the open vocabulary reads it.",
8184
+ properties: {
8185
+ sections: {
8186
+ propertyNames: {
8187
+ pattern: "^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}\\p{Nd}_-]+$",
8188
+ description: "A heading slug of lowercase letters, caseless letters and their marks, digits, `_` and `-`. It admits slugs from scripts without case, such as Han, Arabic and Devanagari. The pattern uses Unicode property escapes, so a validator must compile it with the ECMA-262 `u` flag, as Ajv does for a 2020-12 schema."
8189
+ }
8190
+ },
8191
+ "revision-of": {
8192
+ $ref: "#/$defs/refList"
8193
+ },
8194
+ "derived-from": {
8195
+ $ref: "#/$defs/refList"
8196
+ }
8197
+ }
8198
+ }
8199
+ },
8200
+ $defs: {
8201
+ refList: {
8202
+ pattern: "^\\S(?:.*\\S)?$",
8203
+ items: {
8204
+ pattern: "^\\S(?:.*\\S)?$"
8205
+ },
8206
+ description: "A path or URL on one line with no surrounding space, alone or in each item of the list. A path may contain spaces."
8207
+ }
8208
+ }
8209
+ };
8210
+
8211
+ // src/meta/schemas/citations-strict/1.0.0.json
8212
+ var __default45 = {
8213
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8214
+ $id: "manni:citations-strict:1.0.0",
8215
+ title: "manni citations strict overlay v1.0.0",
8216
+ description: "The strict overlay for manni:citations:1.0.0. Stack it beside the open vocabulary, which owns every key and every required rule. It asks for the full commit hash a tool writes, and it pairs the pin's prefix with the source file.",
8217
+ additionalProperties: true,
8218
+ type: "object",
8219
+ properties: {
8220
+ citations: {
8221
+ description: "Strict narrows each entry's `source`. An encrypted `file` takes an `hmac-sha256-` pin, a plain one takes a `sha256-` pin, and `commit-sha` is a full hash.",
8222
+ items: {
8223
+ properties: {
8224
+ source: {
8225
+ properties: {
8226
+ "commit-sha": {
8227
+ pattern: "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
8228
+ description: "A full commit hash, forty lowercase hex digits or sixty-four in a SHA-256 repository."
8229
+ }
8230
+ },
8231
+ if: {
8232
+ properties: {
8233
+ file: {
8234
+ pattern: "^~"
8235
+ }
8236
+ },
8237
+ required: [
8238
+ "file"
8239
+ ]
8240
+ },
8241
+ then: {
8242
+ properties: {
8243
+ integrity: {
8244
+ pattern: "^hmac-sha256-",
8245
+ description: "An encrypted `file` is pinned `hmac-sha256-`."
8246
+ }
8247
+ }
8248
+ },
8249
+ else: {
8250
+ properties: {
8251
+ integrity: {
8252
+ pattern: "^sha256-",
8253
+ description: "A plain `file` is pinned `sha256-`."
8254
+ }
8255
+ }
8256
+ }
8257
+ }
8258
+ }
8259
+ }
8260
+ }
8261
+ }
8262
+ };
8263
+
8264
+ // src/meta/schemas/tgdp/1.1.json
8265
+ var __default46 = {
8266
+ $schema: "https://json-schema.org/draft/2020-12/schema",
8267
+ $id: "tgdp:templates:1.1",
8268
+ title: "The Good Docs Project templates v1.1",
8269
+ description: "Requires `type` and recommends the 25 template slugs that The Good Docs Project publishes (upstream templates repo, main as of 2026-08-09). Any other non-empty string names a page type TGDP does not publish, and passes. Stack tgdp:templates-strict:1.1 beside it to close `type` to the 25 slugs. Adopting it states that every page has a type, so an untyped page is a gap. Diataxis classifies what a page *is* on the same key, so a page under both has to satisfy both. Pick one. It composes freely with a schema keyed on a different field, such as passo-uno:seven-action:1.0. See https://www.thegooddocsproject.dev/template",
8270
+ type: "object",
8271
+ additionalProperties: true,
8272
+ required: [
8273
+ "type"
8274
+ ],
8275
+ properties: {
8276
+ type: {
8277
+ anyOf: [
8278
+ {
8279
+ type: "string",
8280
+ minLength: 1
8281
+ },
8282
+ {
8283
+ enum: [
8284
+ "api-getting-started",
8285
+ "api-reference",
8286
+ "bug-report",
8287
+ "changelog",
8288
+ "code-of-conduct",
8289
+ "code-of-conduct-incident-record",
8290
+ "code-of-conduct-remediation-record",
8291
+ "code-of-conduct-response-plan",
8292
+ "concept",
8293
+ "contact-support",
8294
+ "contributing-guide",
8295
+ "glossary",
8296
+ "how-to",
8297
+ "installation-guide",
8298
+ "our-team",
8299
+ "quickstart",
8300
+ "readme",
8301
+ "reference",
8302
+ "release-notes",
8303
+ "sdk-overview",
8304
+ "style-guide",
8305
+ "terminology-system",
8306
+ "troubleshooting",
8307
+ "tutorial",
8308
+ "user-personas"
8309
+ ]
8310
+ }
8311
+ ],
8312
+ description: "Which page type this page is, as a Good Docs Project template slug where one fits. The 25 slugs are the recommended values. The Core pack is `concept`, `how-to`, `readme`, `reference`, `release-notes`, `troubleshooting` and `tutorial`. The rest come from the Community and Misc packs. Any other non-empty string names a page type TGDP does not publish. The enum recommends and rejects nothing; stack tgdp:templates-strict:1.1 to close the list."
8313
+ }
8314
+ }
8315
+ };
8316
+
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
+ }
8086
8830
  }
8087
- }
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."
8088
8842
  }
8089
8843
  }
8090
8844
  };
8091
8845
 
8092
- // src/meta/schemas/artifact-evals-strict/1.0.0.json
8093
- var __default43 = {
8846
+ // src/meta/schemas/artifact-evals-strict/1.1.0.json
8847
+ var __default49 = {
8094
8848
  $schema: "https://json-schema.org/draft/2020-12/schema",
8095
- $id: "manni:artifact-evals-strict:1.0.0",
8096
- title: "manni artifact-evals strict overlay v1.0.0",
8097
- description: "The strict overlay for manni:artifact-evals:1.0.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.",
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.",
8098
8852
  additionalProperties: true,
8099
8853
  type: "object",
8100
8854
  properties: {
@@ -8149,7 +8903,8 @@ var __default43 = {
8149
8903
  "turn-count",
8150
8904
  "cost",
8151
8905
  "regex",
8152
- "json-output"
8906
+ "json-output",
8907
+ "tool-order"
8153
8908
  ]
8154
8909
  },
8155
8910
  {
@@ -8157,7 +8912,7 @@ var __default43 = {
8157
8912
  pattern: "^tool:[a-z0-9][a-z0-9-]*$"
8158
8913
  }
8159
8914
  ],
8160
- description: "One of the ten named graders, or a `tool:<kebab>` integration. Strict accepts no other kebab name."
8915
+ description: "One of the eleven named graders, or a `tool:<kebab>` integration. Strict accepts no other kebab name."
8161
8916
  },
8162
8917
  provider: {
8163
8918
  pattern: "^[a-z0-9][a-z0-9-]*$",
@@ -8193,194 +8948,8 @@ var __default43 = {
8193
8948
  }
8194
8949
  };
8195
8950
 
8196
- // src/meta/schemas/graph-strict/1.0.0.json
8197
- var __default44 = {
8198
- $schema: "https://json-schema.org/draft/2020-12/schema",
8199
- $id: "manni:graph-strict:1.0.0",
8200
- title: "manni graph strict overlay v1.0.0",
8201
- description: "The strict overlay for manni:graph:1.0.0. Stack it beside the open vocabulary, which owns the closed `graph` block and its iiRDS enums. It narrows section keys to heading slugs and lineage references to single tokens.",
8202
- additionalProperties: true,
8203
- type: "object",
8204
- properties: {
8205
- graph: {
8206
- description: "Strict narrows `sections` keys, `revision-of` and `derived-from`. Every other member of the block passes as the open vocabulary reads it.",
8207
- properties: {
8208
- sections: {
8209
- propertyNames: {
8210
- pattern: "^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}\\p{Nd}_-]+$",
8211
- description: "A heading slug of lowercase letters, caseless letters and their marks, digits, `_` and `-`. It admits slugs from scripts without case, such as Han, Arabic and Devanagari. The pattern uses Unicode property escapes, so a validator must compile it with the ECMA-262 `u` flag, as Ajv does for a 2020-12 schema."
8212
- }
8213
- },
8214
- "revision-of": {
8215
- $ref: "#/$defs/refList"
8216
- },
8217
- "derived-from": {
8218
- $ref: "#/$defs/refList"
8219
- }
8220
- }
8221
- }
8222
- },
8223
- $defs: {
8224
- refList: {
8225
- pattern: "^\\S(?:.*\\S)?$",
8226
- items: {
8227
- pattern: "^\\S(?:.*\\S)?$"
8228
- },
8229
- description: "A path or URL on one line with no surrounding space, alone or in each item of the list. A path may contain spaces."
8230
- }
8231
- }
8232
- };
8233
-
8234
- // src/meta/schemas/citations-strict/1.0.0.json
8235
- var __default45 = {
8236
- $schema: "https://json-schema.org/draft/2020-12/schema",
8237
- $id: "manni:citations-strict:1.0.0",
8238
- title: "manni citations strict overlay v1.0.0",
8239
- description: "The strict overlay for manni:citations:1.0.0. Stack it beside the open vocabulary, which owns every key and every required rule. It asks for the full commit hash a tool writes, and it pairs the pin's prefix with the source file.",
8240
- additionalProperties: true,
8241
- type: "object",
8242
- properties: {
8243
- citations: {
8244
- description: "Strict narrows each entry's `source`. An encrypted `file` takes an `hmac-sha256-` pin, a plain one takes a `sha256-` pin, and `commit-sha` is a full hash.",
8245
- items: {
8246
- properties: {
8247
- source: {
8248
- properties: {
8249
- "commit-sha": {
8250
- pattern: "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
8251
- description: "A full commit hash, forty lowercase hex digits or sixty-four in a SHA-256 repository."
8252
- }
8253
- },
8254
- if: {
8255
- properties: {
8256
- file: {
8257
- pattern: "^~"
8258
- }
8259
- },
8260
- required: [
8261
- "file"
8262
- ]
8263
- },
8264
- then: {
8265
- properties: {
8266
- integrity: {
8267
- pattern: "^hmac-sha256-",
8268
- description: "An encrypted `file` is pinned `hmac-sha256-`."
8269
- }
8270
- }
8271
- },
8272
- else: {
8273
- properties: {
8274
- integrity: {
8275
- pattern: "^sha256-",
8276
- description: "A plain `file` is pinned `sha256-`."
8277
- }
8278
- }
8279
- }
8280
- }
8281
- }
8282
- }
8283
- }
8284
- }
8285
- };
8286
-
8287
- // src/meta/schemas/tgdp/1.1.json
8288
- var __default46 = {
8289
- $schema: "https://json-schema.org/draft/2020-12/schema",
8290
- $id: "tgdp:templates:1.1",
8291
- title: "The Good Docs Project templates v1.1",
8292
- description: "Requires `type` and recommends the 25 template slugs that The Good Docs Project publishes (upstream templates repo, main as of 2026-08-09). Any other non-empty string names a page type TGDP does not publish, and passes. Stack tgdp:templates-strict:1.1 beside it to close `type` to the 25 slugs. Adopting it states that every page has a type, so an untyped page is a gap. Diataxis classifies what a page *is* on the same key, so a page under both has to satisfy both. Pick one. It composes freely with a schema keyed on a different field, such as passo-uno:seven-action:1.0. See https://www.thegooddocsproject.dev/template",
8293
- type: "object",
8294
- additionalProperties: true,
8295
- required: [
8296
- "type"
8297
- ],
8298
- properties: {
8299
- type: {
8300
- anyOf: [
8301
- {
8302
- type: "string",
8303
- minLength: 1
8304
- },
8305
- {
8306
- enum: [
8307
- "api-getting-started",
8308
- "api-reference",
8309
- "bug-report",
8310
- "changelog",
8311
- "code-of-conduct",
8312
- "code-of-conduct-incident-record",
8313
- "code-of-conduct-remediation-record",
8314
- "code-of-conduct-response-plan",
8315
- "concept",
8316
- "contact-support",
8317
- "contributing-guide",
8318
- "glossary",
8319
- "how-to",
8320
- "installation-guide",
8321
- "our-team",
8322
- "quickstart",
8323
- "readme",
8324
- "reference",
8325
- "release-notes",
8326
- "sdk-overview",
8327
- "style-guide",
8328
- "terminology-system",
8329
- "troubleshooting",
8330
- "tutorial",
8331
- "user-personas"
8332
- ]
8333
- }
8334
- ],
8335
- description: "Which page type this page is, as a Good Docs Project template slug where one fits. The 25 slugs are the recommended values. The Core pack is `concept`, `how-to`, `readme`, `reference`, `release-notes`, `troubleshooting` and `tutorial`. The rest come from the Community and Misc packs. Any other non-empty string names a page type TGDP does not publish. The enum recommends and rejects nothing; stack tgdp:templates-strict:1.1 to close the list."
8336
- }
8337
- }
8338
- };
8339
-
8340
- // src/meta/schemas/tgdp-strict/1.1.json
8341
- var __default47 = {
8342
- $schema: "https://json-schema.org/draft/2020-12/schema",
8343
- $id: "tgdp:templates-strict:1.1",
8344
- title: "The Good Docs Project templates strict overlay v1.1",
8345
- 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.",
8346
- additionalProperties: true,
8347
- type: "object",
8348
- properties: {
8349
- type: {
8350
- enum: [
8351
- "api-getting-started",
8352
- "api-reference",
8353
- "bug-report",
8354
- "changelog",
8355
- "code-of-conduct",
8356
- "code-of-conduct-incident-record",
8357
- "code-of-conduct-remediation-record",
8358
- "code-of-conduct-response-plan",
8359
- "concept",
8360
- "contact-support",
8361
- "contributing-guide",
8362
- "glossary",
8363
- "how-to",
8364
- "installation-guide",
8365
- "our-team",
8366
- "quickstart",
8367
- "readme",
8368
- "reference",
8369
- "release-notes",
8370
- "sdk-overview",
8371
- "style-guide",
8372
- "terminology-system",
8373
- "troubleshooting",
8374
- "tutorial",
8375
- "user-personas"
8376
- ],
8377
- 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."
8378
- }
8379
- }
8380
- };
8381
-
8382
8951
  // src/meta/schemas/stewardship/1.1.0.json
8383
- var __default48 = {
8952
+ var __default50 = {
8384
8953
  $schema: "https://json-schema.org/draft/2020-12/schema",
8385
8954
  $id: "manni:stewardship:1.1.0",
8386
8955
  title: "manni stewardship vocabulary v1.1.0",
@@ -8507,7 +9076,7 @@ var __default48 = {
8507
9076
  };
8508
9077
 
8509
9078
  // src/meta/schemas/stewardship-strict/1.1.0.json
8510
- var __default49 = {
9079
+ var __default51 = {
8511
9080
  $schema: "https://json-schema.org/draft/2020-12/schema",
8512
9081
  $id: "manni:stewardship-strict:1.1.0",
8513
9082
  title: "manni stewardship strict overlay v1.1.0",
@@ -8673,8 +9242,10 @@ var BUILTINS = /* @__PURE__ */ new Map([
8673
9242
  ["manni:citations-strict:1.0.0", __default45],
8674
9243
  ["tgdp:templates:1.1", __default46],
8675
9244
  ["tgdp:templates-strict:1.1", __default47],
8676
- ["manni:stewardship:1.1.0", __default48],
8677
- ["manni:stewardship-strict:1.1.0", __default49]
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]
8678
9249
  ]);
8679
9250
  var ANNOTATION_ONLY_PREDECESSORS = /* @__PURE__ */ new Map([
8680
9251
  ["manni:stewardship:1.1.0", "manni:stewardship:1.0.0"],
@@ -8772,6 +9343,8 @@ var PUBLISHED_PATHS = [
8772
9343
  ["citations-strict/1.0.0.json", "manni:citations-strict:1.0.0"],
8773
9344
  ["tgdp/1.1.json", "tgdp:templates:1.1"],
8774
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"],
8775
9348
  ["stewardship/1.1.0.json", "manni:stewardship:1.1.0"],
8776
9349
  ["stewardship-strict/1.1.0.json", "manni:stewardship-strict:1.1.0"]
8777
9350
  ];
@@ -11727,9 +12300,7 @@ function renderSarif(results, opts = {}) {
11727
12300
  )}`;
11728
12301
  }
11729
12302
 
11730
- // src/meta/reporters/junit.ts
11731
- var SUITE_NAME = "manni";
11732
- var CLASS_NAME = "manni.validate";
12303
+ // src/shared/xml.ts
11733
12304
  var XML_ENTITIES = {
11734
12305
  "&": "&amp;",
11735
12306
  "<": "&lt;",
@@ -11749,6 +12320,10 @@ function xmlEscape(value) {
11749
12320
  }
11750
12321
  return out;
11751
12322
  }
12323
+
12324
+ // src/meta/reporters/junit.ts
12325
+ var SUITE_NAME = "manni";
12326
+ var CLASS_NAME = "manni.validate";
11752
12327
  var attr = (name2, value) => ` ${name2}="${xmlEscape(value)}"`;
11753
12328
  function renderJunit(results, opts = {}) {
11754
12329
  const tests = results.length;
@@ -11798,6 +12373,16 @@ function shouldColor(opts) {
11798
12373
  if (env.NO_COLOR != null && env.NO_COLOR !== "") return false;
11799
12374
  return Boolean(opts.isTTY);
11800
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
+ }
11801
12386
 
11802
12387
  // src/shared/github.ts
11803
12388
  function escapeWorkflowCommandMessage(message) {
@@ -12035,7 +12620,7 @@ async function readCapped(url, res, maxBytes) {
12035
12620
  }
12036
12621
 
12037
12622
  // src/meta/core/external-metadata.ts
12038
- import { readFile as readFile6 } from "node:fs/promises";
12623
+ import { readFile as readFile7 } from "node:fs/promises";
12039
12624
  import { isAbsolute as isAbsolute5, relative as relative9, resolve as resolve14, sep as sep4 } from "node:path";
12040
12625
  import {
12041
12626
  LineCounter as LineCounter3,
@@ -12047,6 +12632,7 @@ import {
12047
12632
  } from "yaml";
12048
12633
 
12049
12634
  // src/shared/manifest-cas.ts
12635
+ import { readFile as readFile5 } from "node:fs/promises";
12050
12636
  import { posix as posix3 } from "node:path";
12051
12637
  var COMMIT_ATTEMPTS = 5;
12052
12638
  function conflictRefusal(file) {
@@ -12115,10 +12701,18 @@ async function settle(held, io) {
12115
12701
  function isMissing(error) {
12116
12702
  return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
12117
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
+ }
12118
12712
 
12119
12713
  // src/shared/encryption-key.ts
12120
12714
  import { spawnSync } from "node:child_process";
12121
- import { readFile as readFile5 } from "node:fs/promises";
12715
+ import { readFile as readFile6 } from "node:fs/promises";
12122
12716
  import { basename as basename4, dirname as dirname6, join as join7, relative as relative8, resolve as resolve13 } from "node:path";
12123
12717
  import { isDeepStrictEqual } from "node:util";
12124
12718
  import { isMap as isMap5, parseDocument as parseDocument4, parse as parseYaml3, stringify as stringify2 } from "yaml";
@@ -12188,7 +12782,7 @@ function errorCode3(err) {
12188
12782
  }
12189
12783
  async function readIfPresent(path) {
12190
12784
  try {
12191
- return await readFile5(path, "utf8");
12785
+ return await readFile6(path, "utf8");
12192
12786
  } catch (err) {
12193
12787
  if (errorCode3(err) === "ENOENT") return null;
12194
12788
  throw err;
@@ -12702,7 +13296,7 @@ function outsideRefusal(manifest, collection, pageRel) {
12702
13296
  }
12703
13297
  async function readPageManifest(abs, file) {
12704
13298
  try {
12705
- return await readFile6(abs, "utf8");
13299
+ return await readFile7(abs, "utf8");
12706
13300
  } catch (err) {
12707
13301
  if (isMissing(err)) return "";
12708
13302
  throw unreadable(file, err);
@@ -12710,7 +13304,7 @@ async function readPageManifest(abs, file) {
12710
13304
  }
12711
13305
  async function readManifest(abs, file) {
12712
13306
  try {
12713
- return await readFile6(abs, "utf8");
13307
+ return await readFile7(abs, "utf8");
12714
13308
  } catch (err) {
12715
13309
  throw unreadable(file, err);
12716
13310
  }
@@ -14421,7 +15015,7 @@ import { dirname as dirname9, resolve as resolve16 } from "node:path";
14421
15015
 
14422
15016
  // src/meta/core/derive/codeowners.ts
14423
15017
  import { existsSync as existsSync3 } from "node:fs";
14424
- import { readFile as readFile7 } from "node:fs/promises";
15018
+ import { readFile as readFile8 } from "node:fs/promises";
14425
15019
  import { dirname as dirname7, relative as relative11, resolve as resolve15, sep as sep6 } from "node:path";
14426
15020
  import picomatch4 from "picomatch";
14427
15021
  var CODEOWNERS_LOCATIONS = [
@@ -14585,7 +15179,7 @@ async function deriveFromCodeowners(inputs, opts) {
14585
15179
  const key = `${path}\0${label}`;
14586
15180
  let file = parsed2.get(key);
14587
15181
  if (!file) {
14588
- file = readFile7(path, "utf8").then(
15182
+ file = readFile8(path, "utf8").then(
14589
15183
  (text2) => parseCodeowners(text2, path, label)
14590
15184
  );
14591
15185
  parsed2.set(key, file);
@@ -16473,7 +17067,7 @@ async function deriveForTable(inputs, ctx, hint, fields) {
16473
17067
  }
16474
17068
 
16475
17069
  // src/meta/commands/validate.ts
16476
- import { readFile as readFile9 } from "node:fs/promises";
17070
+ import { readFile as readFile10 } from "node:fs/promises";
16477
17071
 
16478
17072
  // src/meta/core/page-marks.ts
16479
17073
  function pageMarks(opts) {
@@ -16551,9 +17145,32 @@ async function configMarks(configPath, cwd) {
16551
17145
  trustRoot: schemaTrustRoot(cwd, loaded.dir)
16552
17146
  });
16553
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
+ }
16554
17171
 
16555
17172
  // src/meta/core/relocation.ts
16556
- 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";
16557
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";
16558
17175
  import picomatch6 from "picomatch";
16559
17176
  import {
@@ -17302,13 +17919,13 @@ async function planRelocation(ctx, request) {
17302
17919
  let unreadable2;
17303
17920
  if (beyond) {
17304
17921
  try {
17305
- content = await readFile8(absPath, "utf8");
17922
+ content = await readFile9(absPath, "utf8");
17306
17923
  own2 = extractor.extract(content, label, { elements }).data;
17307
17924
  } catch (err) {
17308
17925
  unreadable2 = (errorMessage(err).split("\n")[0] ?? "").replace(/:\s*$/, "");
17309
17926
  }
17310
17927
  } else {
17311
- content = await readFile8(absPath, "utf8");
17928
+ content = await readFile9(absPath, "utf8");
17312
17929
  try {
17313
17930
  own2 = extractor.extract(content, label, { elements }).data;
17314
17931
  } catch (err) {
@@ -17749,7 +18366,7 @@ function assertNoStrandedEntries(m, index, pages2, configDir, fileOf) {
17749
18366
  }
17750
18367
  async function readManifestText(path, file, perPage) {
17751
18368
  try {
17752
- return await readFile8(path, "utf8");
18369
+ return await readFile9(path, "utf8");
17753
18370
  } catch (err) {
17754
18371
  if (perPage && isMissing(err)) return null;
17755
18372
  throw new DocmetaError(`Manifest ${file} could not be read: ${errorMessage(err)}`);
@@ -17779,7 +18396,7 @@ function keyLines2(text2, join12) {
17779
18396
  async function configTarget(ctx, configDir) {
17780
18397
  if (ctx.configPath !== void 0) {
17781
18398
  try {
17782
- const text2 = await readFile8(ctx.configPath, "utf8");
18399
+ const text2 = await readFile9(ctx.configPath, "utf8");
17783
18400
  return { path: ctx.configPath, text: text2, disk: text2 };
17784
18401
  } catch (err) {
17785
18402
  if (err.code !== "ENOENT") {
@@ -17793,7 +18410,7 @@ async function configTarget(ctx, configDir) {
17793
18410
  for (const name2 of FAMILY_CONFIG_NAMES) {
17794
18411
  const path = join9(configDir, name2);
17795
18412
  try {
17796
- const text2 = await readFile8(path, "utf8");
18413
+ const text2 = await readFile9(path, "utf8");
17797
18414
  return { path, text: text2, disk: text2 };
17798
18415
  } catch {
17799
18416
  }
@@ -17979,7 +18596,7 @@ async function applyRelocation(ctx, plan, io = {}) {
17979
18596
  for (const w of plan.writes) {
17980
18597
  let now;
17981
18598
  try {
17982
- now = await readFile8(w.path, "utf8");
18599
+ now = await readFile9(w.path, "utf8");
17983
18600
  } catch (err) {
17984
18601
  if (err.code !== "ENOENT") {
17985
18602
  throw new DocmetaError(`${label(w)} could not be read: ${errorMessage(err)}`);
@@ -18812,7 +19429,7 @@ async function runValidate(opts) {
18812
19429
  await processOne(STDIN_LABEL, content, forcedExtractor.extensions[0] ?? "");
18813
19430
  }
18814
19431
  for (const file of files) {
18815
- const content = await readFile9(resolve19(base, file), "utf8");
19432
+ const content = await readFile10(resolve19(base, file), "utf8");
18816
19433
  await processOne(file, content, extname4(file));
18817
19434
  }
18818
19435
  if (unverified > 0) opts.onNotice?.(unverifiedWarning(unverified));
@@ -18958,7 +19575,7 @@ async function runValidate(opts) {
18958
19575
  }
18959
19576
 
18960
19577
  // src/meta/commands/get.ts
18961
- import { readFile as readFile10 } from "node:fs/promises";
19578
+ import { readFile as readFile11 } from "node:fs/promises";
18962
19579
  import { resolve as resolve20, extname as extname5 } from "node:path";
18963
19580
  async function runGet(opts) {
18964
19581
  const cwd = opts.cwd ?? process.cwd();
@@ -19104,7 +19721,7 @@ async function runGet(opts) {
19104
19721
  await readOne(STDIN_LABEL, opts.stdinContent ?? "", forced.extensions[0] ?? "");
19105
19722
  }
19106
19723
  for (const file of files) {
19107
- const content = await readFile10(resolve20(base, file), "utf8");
19724
+ const content = await readFile11(resolve20(base, file), "utf8");
19108
19725
  await readOne(file, content, extname5(file));
19109
19726
  }
19110
19727
  if (deriving) {
@@ -19230,7 +19847,7 @@ function parseJsonPointer(pointer) {
19230
19847
 
19231
19848
  // src/meta/commands/schemas.ts
19232
19849
  import { existsSync as existsSync4 } from "node:fs";
19233
- import { mkdir as mkdir3, readFile as readFile11 } from "node:fs/promises";
19850
+ import { mkdir as mkdir3, readFile as readFile12 } from "node:fs/promises";
19234
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";
19235
19852
  import { parseDocument as parseDocument8, parse as parseYaml6, stringify as stringify4 } from "yaml";
19236
19853
  function getSchemasInfo(registered2) {
@@ -19350,7 +19967,7 @@ async function runVendorSchema(opts) {
19350
19967
  }
19351
19968
  let unchanged = false;
19352
19969
  if (existsSync4(absFile)) {
19353
- const current = await readFile11(absFile);
19970
+ const current = await readFile12(absFile);
19354
19971
  unchanged = bytes.equals(current);
19355
19972
  if (!unchanged && !folded.replaced) {
19356
19973
  throw new DocmetaError(
@@ -19360,7 +19977,7 @@ async function runVendorSchema(opts) {
19360
19977
  }
19361
19978
  await mkdir3(absDir, { recursive: true });
19362
19979
  await writeFileAtomic(absFile, bytes);
19363
- const existing = loaded ? await readFile11(configPath, "utf8") : null;
19980
+ const existing = loaded ? await readFile12(configPath, "utf8") : null;
19364
19981
  const section = loaded ? loaded.section : META_SECTION;
19365
19982
  const text2 = renderConfig(existing, folded.entries, section);
19366
19983
  reparseConfig(text2, posixRelative(cwd, configPath) || DEFAULT_CONFIG_NAME, section);
@@ -19612,7 +20229,7 @@ async function runInferSchema(opts) {
19612
20229
  await scanOne(STDIN_LABEL, opts.stdinContent ?? "", forced.extensions[0] ?? "");
19613
20230
  }
19614
20231
  for (const file of files) {
19615
- const content = await readFile11(resolve21(base, file), "utf8");
20232
+ const content = await readFile12(resolve21(base, file), "utf8");
19616
20233
  await scanOne(file, content, extname6(file));
19617
20234
  }
19618
20235
  for (const u of unreadable2) {
@@ -19673,7 +20290,7 @@ async function runInferSchema(opts) {
19673
20290
  // src/meta/commands/query.ts
19674
20291
  import { randomBytes as randomBytes2 } from "node:crypto";
19675
20292
  import { existsSync as existsSync5 } from "node:fs";
19676
- 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";
19677
20294
  import { dirname as dirname11, isAbsolute as isAbsolute11, resolve as resolve22, extname as extname7, sep as sep11 } from "node:path";
19678
20295
 
19679
20296
  // src/shared/prompt.ts
@@ -20031,7 +20648,7 @@ async function runQuery(opts) {
20031
20648
  await readOne(STDIN_LABEL, opts.stdinContent ?? "", ext);
20032
20649
  }
20033
20650
  for (const file of files) {
20034
- const content = await readFile12(resolve22(base, file), "utf8");
20651
+ const content = await readFile13(resolve22(base, file), "utf8");
20035
20652
  await readOne(file, content, extname7(file));
20036
20653
  }
20037
20654
  const db = opts.db === void 0 ? void 0 : { resolved: resolve22(cwd, opts.db), display: opts.db };
@@ -20691,7 +21308,7 @@ async function loadSetMembers(refs, ctx) {
20691
21308
  seenFiles.add(canon);
20692
21309
  let text2;
20693
21310
  try {
20694
- text2 = await readFile12(abs, "utf8");
21311
+ text2 = await readFile13(abs, "utf8");
20695
21312
  } catch {
20696
21313
  throw new DocmetaError(
20697
21314
  `Schema file not found: "${ref}" (looked at ${abs}).`
@@ -21048,7 +21665,7 @@ async function planConfigEdit(ctx, edit, runRefs) {
21048
21665
  if (configPath === void 0 || configDir === void 0) {
21049
21666
  return { changes: [], repointed: false };
21050
21667
  }
21051
- const text2 = await readFile12(configPath, "utf8");
21668
+ const text2 = await readFile13(configPath, "utf8");
21052
21669
  const doc = parseDocument10(stripBom2(text2));
21053
21670
  const display = displayPath(ctx, configPath);
21054
21671
  const rawRefOf = (item) => {
@@ -21515,7 +22132,7 @@ async function planManifestEdits(changes, entries, ctx, renameHints) {
21515
22132
  let text2;
21516
22133
  let expected;
21517
22134
  try {
21518
- text2 = await readFile12(home.absPath, "utf8");
22135
+ text2 = await readFile13(home.absPath, "utf8");
21519
22136
  expected = text2;
21520
22137
  } catch (err) {
21521
22138
  if (!home.perPage || !isMissing(err)) {
@@ -21951,7 +22568,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
21951
22568
  }
21952
22569
  const entry = byLabel.get(label);
21953
22570
  if (!entry) throw new DocmetaError(`No loaded entry for "${label}".`);
21954
- const content = await readFile12(path, "utf8");
22571
+ const content = await readFile13(path, "utf8");
21955
22572
  const members = ctx.memberships(label);
21956
22573
  const current = (await mergeWithMarks(
21957
22574
  label,
@@ -22023,7 +22640,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
22023
22640
  }
22024
22641
  let now;
22025
22642
  try {
22026
- now = await readFile12(w.path, "utf8");
22643
+ now = await readFile13(w.path, "utf8");
22027
22644
  } catch {
22028
22645
  now = void 0;
22029
22646
  }
@@ -22036,7 +22653,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
22036
22653
  for (const m of manifestWrites) {
22037
22654
  let now;
22038
22655
  try {
22039
- now = await readFile12(m.path, "utf8");
22656
+ now = await readFile13(m.path, "utf8");
22040
22657
  } catch {
22041
22658
  now = null;
22042
22659
  }
@@ -22169,7 +22786,7 @@ function skipExpression(sql, from) {
22169
22786
  }
22170
22787
 
22171
22788
  // src/meta/commands/fill.ts
22172
- import { readFile as readFile15 } from "node:fs/promises";
22789
+ import { readFile as readFile16 } from "node:fs/promises";
22173
22790
  import { resolve as resolve24, extname as extname9, join as join11 } from "node:path";
22174
22791
  import {
22175
22792
  completeValidatedJSON,
@@ -22589,7 +23206,7 @@ function single(alternatives2) {
22589
23206
  }
22590
23207
 
22591
23208
  // src/meta/commands/fill-hints.ts
22592
- import { readFile as readFile13 } from "node:fs/promises";
23209
+ import { readFile as readFile14 } from "node:fs/promises";
22593
23210
  import { extname as extname8, resolve as resolve23 } from "node:path";
22594
23211
 
22595
23212
  // src/shared/reference-fields.ts
@@ -22703,7 +23320,7 @@ async function readIds(collection, opts) {
22703
23320
  const path = resolve23(opts.configDir, file);
22704
23321
  let id;
22705
23322
  try {
22706
- id = extractor.extract(await readFile13(path, "utf8"), file).data.id;
23323
+ id = extractor.extract(await readFile14(path, "utf8"), file).data.id;
22707
23324
  } catch {
22708
23325
  continue;
22709
23326
  }
@@ -22722,7 +23339,7 @@ function termLabelSource() {
22722
23339
  }
22723
23340
 
22724
23341
  // src/meta/core/manifest-writes.ts
22725
- import { readFile as readFile14 } from "node:fs/promises";
23342
+ import { readFile as readFile15 } from "node:fs/promises";
22726
23343
  var manifestCodec = {
22727
23344
  apply(text2, op) {
22728
23345
  const where = { entry: op.entry, key: op.key, join: op.join, file: op.file };
@@ -22738,7 +23355,7 @@ function applyManifestOp(text2, op) {
22738
23355
  async function holdManifestFile(path, file, perPage = false) {
22739
23356
  let before;
22740
23357
  try {
22741
- before = await readFile14(path, "utf8");
23358
+ before = await readFile15(path, "utf8");
22742
23359
  } catch (err) {
22743
23360
  if (perPage && isMissing(err)) return heldManifest(path, file, "", true);
22744
23361
  throw new DocmetaError(`Manifest ${file} could not be read: ${errorMessage(err)}`);
@@ -22755,7 +23372,7 @@ async function settleManifest(held, io = {}) {
22755
23372
  codec: manifestCodec,
22756
23373
  // A per-page manifest (proposal 0058) may be the first file in its directory.
22757
23374
  write: io.write ?? ((at2, text2) => writeFileAtomic(at2, text2, { createParents: true })),
22758
- read: io.read ?? ((at2) => readFile14(at2, "utf8")),
23375
+ read: io.read ?? ((at2) => readFile15(at2, "utf8")),
22759
23376
  toError: (message) => new DocmetaError(message)
22760
23377
  });
22761
23378
  rebaseline(held);
@@ -23869,7 +24486,7 @@ async function runFill(opts) {
23869
24486
  const prepareAll = async () => ({
23870
24487
  stdin: usingStdin ? await prepareOne("<stdin>", opts.stdinContent ?? "", forcedExtractor?.extensions[0] ?? "") : void 0,
23871
24488
  files: await mapConcurrent(files, concurrency, async (file) => {
23872
- const content = await readFile15(resolve24(base, file), "utf8");
24489
+ const content = await readFile16(resolve24(base, file), "utf8");
23873
24490
  return prepareOne(file, content, extname9(file));
23874
24491
  })
23875
24492
  });
@@ -24287,7 +24904,7 @@ async function mapConcurrent(items2, limit, fn) {
24287
24904
  }
24288
24905
 
24289
24906
  // src/meta/commands/derive.ts
24290
- import { readFile as readFile16 } from "node:fs/promises";
24907
+ import { readFile as readFile17 } from "node:fs/promises";
24291
24908
  import { extname as extname10, relative as relative17, resolve as resolve25, sep as sep12 } from "node:path";
24292
24909
  var GENERATED_BY_ENV = "MANNI_GENERATED_BY";
24293
24910
  var SOURCE_HINT = "narrow --sources or --fields";
@@ -24440,7 +25057,7 @@ async function runDerive(opts) {
24440
25057
  });
24441
25058
  continue;
24442
25059
  }
24443
- const content = await readFile16(absPath, "utf8");
25060
+ const content = await readFile17(absPath, "utf8");
24444
25061
  const elements = resolveElements(label, config, membersFor(label));
24445
25062
  try {
24446
25063
  loaded2.set(label, {
@@ -25635,10 +26252,10 @@ function cellFrom(value) {
25635
26252
  }
25636
26253
 
25637
26254
  export {
25638
- __export,
25639
26255
  package_default,
25640
26256
  palette,
25641
26257
  shouldColor,
26258
+ colorFor,
25642
26259
  matchesFileGlob,
25643
26260
  hasPagePlaceholder,
25644
26261
  pageManifestPath,
@@ -25653,8 +26270,6 @@ export {
25653
26270
  generateEncryptionKey,
25654
26271
  encryptValue,
25655
26272
  decryptValue,
25656
- ToolError,
25657
- errorMessage,
25658
26273
  assertKnownProvider,
25659
26274
  assertModelHasProvider,
25660
26275
  PROVIDERS_KEY,
@@ -25746,6 +26361,7 @@ export {
25746
26361
  __default31 as __default,
25747
26362
  __default33 as __default2,
25748
26363
  __default34 as __default3,
26364
+ __default48 as __default4,
25749
26365
  listBuiltins,
25750
26366
  classifyRef,
25751
26367
  fetchSchemaBytes,
@@ -25775,6 +26391,7 @@ export {
25775
26391
  loadMetaSection,
25776
26392
  resolveRunConfig,
25777
26393
  renderSarif,
26394
+ xmlEscape,
25778
26395
  renderJunit,
25779
26396
  REPORT_FORMATS,
25780
26397
  formatList,
@@ -25794,6 +26411,7 @@ export {
25794
26411
  rebaseable,
25795
26412
  settle,
25796
26413
  isMissing,
26414
+ readManifestOrEmpty,
25797
26415
  EXTERNAL_METADATA_FETCH_TIMEOUT_MS,
25798
26416
  EXTERNAL_METADATA_FETCH_MAX_BYTES,
25799
26417
  fetchExternalMetadata,
@@ -25826,6 +26444,8 @@ export {
25826
26444
  pageSchemaSet,
25827
26445
  marksValidator,
25828
26446
  configMarks,
26447
+ metaSection,
26448
+ familyMarks,
25829
26449
  relocateFailed,
25830
26450
  relocationContext,
25831
26451
  keyHome,
@@ -25895,4 +26515,4 @@ export {
25895
26515
  renderQuery,
25896
26516
  renderQueryCsv
25897
26517
  };
25898
- //# sourceMappingURL=chunk-TH565O2N.js.map
26518
+ //# sourceMappingURL=chunk-ZQBTK3DO.js.map