@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.
- package/README.md +2 -2
- package/dist/batch-7JJWXWSF.js +18 -0
- package/dist/batch-7JJWXWSF.js.map +1 -0
- package/dist/calibrate-IA2ARFMH.js +13 -0
- package/dist/calibrate-IA2ARFMH.js.map +1 -0
- package/dist/capture-C32JXIFN.js +15 -0
- package/dist/capture-C32JXIFN.js.map +1 -0
- package/dist/chunk-3R23C5DT.js +120 -0
- package/dist/chunk-3R23C5DT.js.map +1 -0
- package/dist/chunk-CI2GOU3A.js +4447 -0
- package/dist/chunk-CI2GOU3A.js.map +1 -0
- package/dist/{chunk-I57KBF45.js → chunk-DP2ZA3WH.js} +1203 -142
- package/dist/chunk-DP2ZA3WH.js.map +1 -0
- package/dist/chunk-ESJ5W7EV.js +297 -0
- package/dist/chunk-ESJ5W7EV.js.map +1 -0
- package/dist/chunk-IOYXPBCL.js +37 -0
- package/dist/chunk-IOYXPBCL.js.map +1 -0
- package/dist/chunk-KTSJ2ZHA.js +40 -0
- package/dist/chunk-KTSJ2ZHA.js.map +1 -0
- package/dist/{chunk-JODRT4NF.js → chunk-MFDD3YGU.js} +8 -37
- package/dist/chunk-MFDD3YGU.js.map +1 -0
- package/dist/chunk-MOQXWXSG.js +1941 -0
- package/dist/chunk-MOQXWXSG.js.map +1 -0
- package/dist/{chunk-S3NDEIOW.js → chunk-O6RVQKK6.js} +10502 -3017
- package/dist/chunk-O6RVQKK6.js.map +1 -0
- package/dist/chunk-QROCFW5S.js +174 -0
- package/dist/chunk-QROCFW5S.js.map +1 -0
- package/dist/chunk-RVVCA4WL.js +379 -0
- package/dist/chunk-RVVCA4WL.js.map +1 -0
- package/dist/cli.js +1293 -140
- package/dist/cli.js.map +1 -1
- package/dist/docmeta.js +3 -2
- package/dist/docmeta.js.map +1 -1
- package/dist/graph/embed.d.ts +154 -0
- package/dist/graph/embed.js +137 -0
- package/dist/graph/embed.js.map +1 -0
- package/dist/graph/runtime.d.ts +751 -0
- package/dist/graph/runtime.js +3067 -0
- package/dist/graph/runtime.js.map +1 -0
- package/dist/index.d.ts +6149 -799
- package/dist/index.js +682 -7
- package/dist/index.js.map +1 -1
- package/dist/picker-6HRMETE7.js +12 -0
- package/dist/picker-6HRMETE7.js.map +1 -0
- package/package.json +32 -4
- package/plugin/tracevals/.claude-plugin/plugin.json +9 -0
- package/plugin/tracevals/hooks/hooks.json +17 -0
- package/shapes/graph/shapes-1.0.0.ttl +689 -0
- package/dist/chunk-I57KBF45.js.map +0 -1
- package/dist/chunk-JODRT4NF.js.map +0 -1
- package/dist/chunk-S3NDEIOW.js.map +0 -1
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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.
|
|
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: "
|
|
8318
|
-
title: "
|
|
8319
|
-
description: "The strict overlay for
|
|
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
|
-
|
|
8324
|
-
|
|
8325
|
-
|
|
8326
|
-
|
|
8327
|
-
"
|
|
8328
|
-
|
|
8329
|
-
|
|
8330
|
-
|
|
8331
|
-
|
|
8332
|
-
|
|
8333
|
-
|
|
8334
|
-
|
|
8335
|
-
|
|
8336
|
-
|
|
8337
|
-
|
|
8338
|
-
|
|
8339
|
-
|
|
8340
|
-
|
|
8341
|
-
|
|
8342
|
-
|
|
8343
|
-
|
|
8344
|
-
|
|
8345
|
-
|
|
8346
|
-
|
|
8347
|
-
|
|
8348
|
-
|
|
8349
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
11416
|
-
var SUITE_NAME = "manni";
|
|
11417
|
-
var CLASS_NAME = "manni.validate";
|
|
12303
|
+
// src/shared/xml.ts
|
|
11418
12304
|
var XML_ENTITIES = {
|
|
11419
12305
|
"&": "&",
|
|
11420
12306
|
"<": "<",
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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[
|
|
13113
|
-
if (
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
18806
|
-
import { dirname as dirname10, extname as extname6, isAbsolute as isAbsolute10, join as join10, relative as
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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) =>
|
|
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
|
-
|
|
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
|
|
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
|
|
23863
|
-
import { extname as extname10, relative as
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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-
|
|
26518
|
+
//# sourceMappingURL=chunk-DP2ZA3WH.js.map
|