@hawkeyexl/manni 4.2.0 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/batch-A5HZKYIW.js +18 -0
- package/dist/batch-A5HZKYIW.js.map +1 -0
- package/dist/calibrate-S5K6QHUY.js +13 -0
- package/dist/calibrate-S5K6QHUY.js.map +1 -0
- package/dist/capture-OZEZDABQ.js +15 -0
- package/dist/capture-OZEZDABQ.js.map +1 -0
- package/dist/chunk-3R23C5DT.js +120 -0
- package/dist/chunk-3R23C5DT.js.map +1 -0
- package/dist/chunk-5HNHEUD5.js +174 -0
- package/dist/chunk-5HNHEUD5.js.map +1 -0
- package/dist/chunk-CFDUZRM2.js +1941 -0
- package/dist/chunk-CFDUZRM2.js.map +1 -0
- package/dist/chunk-G5CM2VGQ.js +297 -0
- package/dist/chunk-G5CM2VGQ.js.map +1 -0
- package/dist/chunk-HAPTXWU2.js +379 -0
- package/dist/chunk-HAPTXWU2.js.map +1 -0
- package/dist/chunk-IOYXPBCL.js +37 -0
- package/dist/chunk-IOYXPBCL.js.map +1 -0
- package/dist/chunk-KJR7OVDX.js +4447 -0
- package/dist/chunk-KJR7OVDX.js.map +1 -0
- package/dist/chunk-KTSJ2ZHA.js +40 -0
- package/dist/chunk-KTSJ2ZHA.js.map +1 -0
- package/dist/{chunk-BNHQWIAE.js → chunk-UBMMXS2Y.js} +2 -2
- package/dist/{chunk-UYDRDFYF.js → chunk-V4KUVE47.js} +1943 -909
- package/dist/chunk-V4KUVE47.js.map +1 -0
- package/dist/{chunk-TH565O2N.js → chunk-ZQBTK3DO.js} +898 -278
- package/dist/chunk-ZQBTK3DO.js.map +1 -0
- package/dist/cli.js +437 -47
- package/dist/cli.js.map +1 -1
- package/dist/docmeta.js +3 -2
- package/dist/docmeta.js.map +1 -1
- package/dist/index.d.ts +3873 -795
- package/dist/index.js +292 -4
- 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 +3 -1
- package/plugin/tracevals/.claude-plugin/plugin.json +9 -0
- package/plugin/tracevals/hooks/hooks.json +17 -0
- package/dist/chunk-TH565O2N.js.map +0 -1
- package/dist/chunk-UYDRDFYF.js.map +0 -1
- /package/dist/{chunk-BNHQWIAE.js.map → chunk-UBMMXS2Y.js.map} +0 -0
|
@@ -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.1",
|
|
12
11
|
description: "One command line for documentation that is meant to be checked. `manni meta` validates the presence and format of document metadata (Markdown frontmatter and more) against JSON Schema, built for CI. Formerly docmeta.",
|
|
13
12
|
type: "module",
|
|
14
13
|
bin: {
|
|
@@ -36,6 +35,7 @@ var package_default = {
|
|
|
36
35
|
files: [
|
|
37
36
|
"dist",
|
|
38
37
|
"schemas",
|
|
38
|
+
"plugin",
|
|
39
39
|
"shapes",
|
|
40
40
|
"templates"
|
|
41
41
|
],
|
|
@@ -105,6 +105,7 @@ var package_default = {
|
|
|
105
105
|
"@asciidoctor/core": "^3.0.4",
|
|
106
106
|
"@axe-core/playwright": "^4.13.0",
|
|
107
107
|
"@hawkeyexl/inference": "^0.4.0",
|
|
108
|
+
"@inquirer/prompts": "^7.10.1",
|
|
108
109
|
"@types/n3": "^1.26.3",
|
|
109
110
|
"@xmldom/xmldom": "^0.9.12",
|
|
110
111
|
ajv: "^8.17.1",
|
|
@@ -636,30 +637,6 @@ import { realpathSync as realpathSync2 } from "node:fs";
|
|
|
636
637
|
import { fileURLToPath } from "node:url";
|
|
637
638
|
import { CommanderError } from "commander";
|
|
638
639
|
|
|
639
|
-
// src/shared/errors.ts
|
|
640
|
-
var ToolError = class extends Error {
|
|
641
|
-
/** clig.dev: 2 is operational/usage; 1 is reserved for findings. */
|
|
642
|
-
exitCode = 2;
|
|
643
|
-
constructor(message) {
|
|
644
|
-
super(message);
|
|
645
|
-
this.name = "ToolError";
|
|
646
|
-
}
|
|
647
|
-
};
|
|
648
|
-
function errorMessage(err) {
|
|
649
|
-
if (err instanceof Error) return err.message;
|
|
650
|
-
if (typeof err === "string") return err;
|
|
651
|
-
if (typeof err === "number" || typeof err === "bigint") return String(err);
|
|
652
|
-
if (typeof err === "object" && err !== null && "message" in err && typeof err.message === "string") {
|
|
653
|
-
return err.message;
|
|
654
|
-
}
|
|
655
|
-
try {
|
|
656
|
-
const json = JSON.stringify(err);
|
|
657
|
-
if (json !== void 0) return json;
|
|
658
|
-
} catch {
|
|
659
|
-
}
|
|
660
|
-
return String(err);
|
|
661
|
-
}
|
|
662
|
-
|
|
663
640
|
// src/shared/program-name.ts
|
|
664
641
|
var name = "manni";
|
|
665
642
|
function programName() {
|
|
@@ -8079,22 +8056,799 @@ var __default42 = {
|
|
|
8079
8056
|
description: "A relative path. It starts with no `/`, `\\` or `~`, no drive letter, and no URL scheme."
|
|
8080
8057
|
}
|
|
8081
8058
|
}
|
|
8082
|
-
},
|
|
8083
|
-
"generated-assertion-hash": {
|
|
8084
|
-
pattern: "^sha256-[0-9a-f]{64}$",
|
|
8085
|
-
description: "`sha256-` and sixty-four lowercase hex digits."
|
|
8059
|
+
},
|
|
8060
|
+
"generated-assertion-hash": {
|
|
8061
|
+
pattern: "^sha256-[0-9a-f]{64}$",
|
|
8062
|
+
description: "`sha256-` and sixty-four lowercase hex digits."
|
|
8063
|
+
}
|
|
8064
|
+
}
|
|
8065
|
+
}
|
|
8066
|
+
}
|
|
8067
|
+
};
|
|
8068
|
+
|
|
8069
|
+
// src/meta/schemas/artifact-evals-strict/1.0.0.json
|
|
8070
|
+
var __default43 = {
|
|
8071
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8072
|
+
$id: "manni:artifact-evals-strict:1.0.0",
|
|
8073
|
+
title: "manni artifact-evals strict overlay v1.0.0",
|
|
8074
|
+
description: "The strict overlay for manni:artifact-evals:1.0.0. Stack it beside the open vocabulary, which owns every key, every required rule and every conditional. Inside `metadata`, it narrows provider and model names, exit codes, companion paths and the assertion hash as manni:evals-strict:1.0.0 does. It also closes `grader` to the named graders and `tool:` integrations.",
|
|
8075
|
+
additionalProperties: true,
|
|
8076
|
+
type: "object",
|
|
8077
|
+
properties: {
|
|
8078
|
+
metadata: {
|
|
8079
|
+
description: "Strict narrows the object entries of `metadata.evals`. A string shorthand passes as the open vocabulary reads it, and every other member of `metadata` passes untouched.",
|
|
8080
|
+
properties: {
|
|
8081
|
+
evals: {
|
|
8082
|
+
items: {
|
|
8083
|
+
$ref: "#/$defs/entry"
|
|
8084
|
+
}
|
|
8085
|
+
},
|
|
8086
|
+
"meta-provenance": {
|
|
8087
|
+
description: "Strict holds each entry to the rules the ai-context overlay applies to the same shape. `generated-by` is a model id with no spaces, and each pointer is well formed.",
|
|
8088
|
+
items: {
|
|
8089
|
+
properties: {
|
|
8090
|
+
"generated-by": {
|
|
8091
|
+
pattern: "^[A-Za-z0-9][A-Za-z0-9._:/\\\\@-]*$",
|
|
8092
|
+
description: "A model id of letters in either case, digits, `.`, `_`, `:`, `/`, `\\`, `@` and `-`, with no spaces. A Windows path to a local model passes."
|
|
8093
|
+
},
|
|
8094
|
+
fields: {
|
|
8095
|
+
items: {
|
|
8096
|
+
pattern: "^(?:/(?:[^~/]|~[01])*)+$",
|
|
8097
|
+
description: "A JSON Pointer in which every `~` begins an RFC 6901 escape, `~0` or `~1`."
|
|
8098
|
+
}
|
|
8099
|
+
},
|
|
8100
|
+
confidence: {
|
|
8101
|
+
propertyNames: {
|
|
8102
|
+
pattern: "^(?:(?:/(?:[^~/]|~[01])*)+|[a-z0-9][a-z0-9-]*)$",
|
|
8103
|
+
description: "A well-formed JSON Pointer, or a kebab eval id."
|
|
8104
|
+
}
|
|
8105
|
+
}
|
|
8106
|
+
}
|
|
8107
|
+
}
|
|
8108
|
+
}
|
|
8109
|
+
}
|
|
8110
|
+
}
|
|
8111
|
+
},
|
|
8112
|
+
$defs: {
|
|
8113
|
+
entry: {
|
|
8114
|
+
description: "The rules strict adds to an object entry.",
|
|
8115
|
+
properties: {
|
|
8116
|
+
grader: {
|
|
8117
|
+
anyOf: [
|
|
8118
|
+
{
|
|
8119
|
+
enum: [
|
|
8120
|
+
"ai",
|
|
8121
|
+
"human",
|
|
8122
|
+
"command",
|
|
8123
|
+
"tool-usage",
|
|
8124
|
+
"skill-invoked",
|
|
8125
|
+
"file-access",
|
|
8126
|
+
"turn-count",
|
|
8127
|
+
"cost",
|
|
8128
|
+
"regex",
|
|
8129
|
+
"json-output"
|
|
8130
|
+
]
|
|
8131
|
+
},
|
|
8132
|
+
{
|
|
8133
|
+
type: "string",
|
|
8134
|
+
pattern: "^tool:[a-z0-9][a-z0-9-]*$"
|
|
8135
|
+
}
|
|
8136
|
+
],
|
|
8137
|
+
description: "One of the ten named graders, or a `tool:<kebab>` integration. Strict accepts no other kebab name."
|
|
8138
|
+
},
|
|
8139
|
+
provider: {
|
|
8140
|
+
pattern: "^[a-z0-9][a-z0-9-]*$",
|
|
8141
|
+
description: "A kebab provider name, such as `anthropic` or `llama-cpp`."
|
|
8142
|
+
},
|
|
8143
|
+
model: {
|
|
8144
|
+
pattern: "^[A-Za-z0-9][A-Za-z0-9._:/\\\\@-]*$",
|
|
8145
|
+
description: "A model id of letters in either case, digits, `.`, `_`, `:`, `/`, `\\`, `@` and `-`, with no spaces. A Windows path to a local model passes."
|
|
8146
|
+
},
|
|
8147
|
+
"success-exit-codes": {
|
|
8148
|
+
uniqueItems: true,
|
|
8149
|
+
items: {
|
|
8150
|
+
type: "integer",
|
|
8151
|
+
minimum: 0,
|
|
8152
|
+
maximum: 255
|
|
8153
|
+
},
|
|
8154
|
+
description: "Distinct exit codes, each from 0 to 255, the range a process can return."
|
|
8155
|
+
},
|
|
8156
|
+
target: {
|
|
8157
|
+
properties: {
|
|
8158
|
+
path: {
|
|
8159
|
+
pattern: "^(?![\\\\/~])(?![A-Za-z]:)(?![A-Za-z][A-Za-z0-9+.-]*://).+$",
|
|
8160
|
+
description: "A relative path. It starts with no `/`, `\\` or `~`, no drive letter, and no URL scheme."
|
|
8161
|
+
}
|
|
8162
|
+
}
|
|
8163
|
+
},
|
|
8164
|
+
"generated-assertion-hash": {
|
|
8165
|
+
pattern: "^sha256-[0-9a-f]{64}$",
|
|
8166
|
+
description: "`sha256-` and sixty-four lowercase hex digits."
|
|
8167
|
+
}
|
|
8168
|
+
}
|
|
8169
|
+
}
|
|
8170
|
+
}
|
|
8171
|
+
};
|
|
8172
|
+
|
|
8173
|
+
// src/meta/schemas/graph-strict/1.0.0.json
|
|
8174
|
+
var __default44 = {
|
|
8175
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8176
|
+
$id: "manni:graph-strict:1.0.0",
|
|
8177
|
+
title: "manni graph strict overlay v1.0.0",
|
|
8178
|
+
description: "The strict overlay for manni:graph:1.0.0. Stack it beside the open vocabulary, which owns the closed `graph` block and its iiRDS enums. It narrows section keys to heading slugs and lineage references to single tokens.",
|
|
8179
|
+
additionalProperties: true,
|
|
8180
|
+
type: "object",
|
|
8181
|
+
properties: {
|
|
8182
|
+
graph: {
|
|
8183
|
+
description: "Strict narrows `sections` keys, `revision-of` and `derived-from`. Every other member of the block passes as the open vocabulary reads it.",
|
|
8184
|
+
properties: {
|
|
8185
|
+
sections: {
|
|
8186
|
+
propertyNames: {
|
|
8187
|
+
pattern: "^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}\\p{Nd}_-]+$",
|
|
8188
|
+
description: "A heading slug of lowercase letters, caseless letters and their marks, digits, `_` and `-`. It admits slugs from scripts without case, such as Han, Arabic and Devanagari. The pattern uses Unicode property escapes, so a validator must compile it with the ECMA-262 `u` flag, as Ajv does for a 2020-12 schema."
|
|
8189
|
+
}
|
|
8190
|
+
},
|
|
8191
|
+
"revision-of": {
|
|
8192
|
+
$ref: "#/$defs/refList"
|
|
8193
|
+
},
|
|
8194
|
+
"derived-from": {
|
|
8195
|
+
$ref: "#/$defs/refList"
|
|
8196
|
+
}
|
|
8197
|
+
}
|
|
8198
|
+
}
|
|
8199
|
+
},
|
|
8200
|
+
$defs: {
|
|
8201
|
+
refList: {
|
|
8202
|
+
pattern: "^\\S(?:.*\\S)?$",
|
|
8203
|
+
items: {
|
|
8204
|
+
pattern: "^\\S(?:.*\\S)?$"
|
|
8205
|
+
},
|
|
8206
|
+
description: "A path or URL on one line with no surrounding space, alone or in each item of the list. A path may contain spaces."
|
|
8207
|
+
}
|
|
8208
|
+
}
|
|
8209
|
+
};
|
|
8210
|
+
|
|
8211
|
+
// src/meta/schemas/citations-strict/1.0.0.json
|
|
8212
|
+
var __default45 = {
|
|
8213
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8214
|
+
$id: "manni:citations-strict:1.0.0",
|
|
8215
|
+
title: "manni citations strict overlay v1.0.0",
|
|
8216
|
+
description: "The strict overlay for manni:citations:1.0.0. Stack it beside the open vocabulary, which owns every key and every required rule. It asks for the full commit hash a tool writes, and it pairs the pin's prefix with the source file.",
|
|
8217
|
+
additionalProperties: true,
|
|
8218
|
+
type: "object",
|
|
8219
|
+
properties: {
|
|
8220
|
+
citations: {
|
|
8221
|
+
description: "Strict narrows each entry's `source`. An encrypted `file` takes an `hmac-sha256-` pin, a plain one takes a `sha256-` pin, and `commit-sha` is a full hash.",
|
|
8222
|
+
items: {
|
|
8223
|
+
properties: {
|
|
8224
|
+
source: {
|
|
8225
|
+
properties: {
|
|
8226
|
+
"commit-sha": {
|
|
8227
|
+
pattern: "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
|
|
8228
|
+
description: "A full commit hash, forty lowercase hex digits or sixty-four in a SHA-256 repository."
|
|
8229
|
+
}
|
|
8230
|
+
},
|
|
8231
|
+
if: {
|
|
8232
|
+
properties: {
|
|
8233
|
+
file: {
|
|
8234
|
+
pattern: "^~"
|
|
8235
|
+
}
|
|
8236
|
+
},
|
|
8237
|
+
required: [
|
|
8238
|
+
"file"
|
|
8239
|
+
]
|
|
8240
|
+
},
|
|
8241
|
+
then: {
|
|
8242
|
+
properties: {
|
|
8243
|
+
integrity: {
|
|
8244
|
+
pattern: "^hmac-sha256-",
|
|
8245
|
+
description: "An encrypted `file` is pinned `hmac-sha256-`."
|
|
8246
|
+
}
|
|
8247
|
+
}
|
|
8248
|
+
},
|
|
8249
|
+
else: {
|
|
8250
|
+
properties: {
|
|
8251
|
+
integrity: {
|
|
8252
|
+
pattern: "^sha256-",
|
|
8253
|
+
description: "A plain `file` is pinned `sha256-`."
|
|
8254
|
+
}
|
|
8255
|
+
}
|
|
8256
|
+
}
|
|
8257
|
+
}
|
|
8258
|
+
}
|
|
8259
|
+
}
|
|
8260
|
+
}
|
|
8261
|
+
}
|
|
8262
|
+
};
|
|
8263
|
+
|
|
8264
|
+
// src/meta/schemas/tgdp/1.1.json
|
|
8265
|
+
var __default46 = {
|
|
8266
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8267
|
+
$id: "tgdp:templates:1.1",
|
|
8268
|
+
title: "The Good Docs Project templates v1.1",
|
|
8269
|
+
description: "Requires `type` and recommends the 25 template slugs that The Good Docs Project publishes (upstream templates repo, main as of 2026-08-09). Any other non-empty string names a page type TGDP does not publish, and passes. Stack tgdp:templates-strict:1.1 beside it to close `type` to the 25 slugs. Adopting it states that every page has a type, so an untyped page is a gap. Diataxis classifies what a page *is* on the same key, so a page under both has to satisfy both. Pick one. It composes freely with a schema keyed on a different field, such as passo-uno:seven-action:1.0. See https://www.thegooddocsproject.dev/template",
|
|
8270
|
+
type: "object",
|
|
8271
|
+
additionalProperties: true,
|
|
8272
|
+
required: [
|
|
8273
|
+
"type"
|
|
8274
|
+
],
|
|
8275
|
+
properties: {
|
|
8276
|
+
type: {
|
|
8277
|
+
anyOf: [
|
|
8278
|
+
{
|
|
8279
|
+
type: "string",
|
|
8280
|
+
minLength: 1
|
|
8281
|
+
},
|
|
8282
|
+
{
|
|
8283
|
+
enum: [
|
|
8284
|
+
"api-getting-started",
|
|
8285
|
+
"api-reference",
|
|
8286
|
+
"bug-report",
|
|
8287
|
+
"changelog",
|
|
8288
|
+
"code-of-conduct",
|
|
8289
|
+
"code-of-conduct-incident-record",
|
|
8290
|
+
"code-of-conduct-remediation-record",
|
|
8291
|
+
"code-of-conduct-response-plan",
|
|
8292
|
+
"concept",
|
|
8293
|
+
"contact-support",
|
|
8294
|
+
"contributing-guide",
|
|
8295
|
+
"glossary",
|
|
8296
|
+
"how-to",
|
|
8297
|
+
"installation-guide",
|
|
8298
|
+
"our-team",
|
|
8299
|
+
"quickstart",
|
|
8300
|
+
"readme",
|
|
8301
|
+
"reference",
|
|
8302
|
+
"release-notes",
|
|
8303
|
+
"sdk-overview",
|
|
8304
|
+
"style-guide",
|
|
8305
|
+
"terminology-system",
|
|
8306
|
+
"troubleshooting",
|
|
8307
|
+
"tutorial",
|
|
8308
|
+
"user-personas"
|
|
8309
|
+
]
|
|
8310
|
+
}
|
|
8311
|
+
],
|
|
8312
|
+
description: "Which page type this page is, as a Good Docs Project template slug where one fits. The 25 slugs are the recommended values. The Core pack is `concept`, `how-to`, `readme`, `reference`, `release-notes`, `troubleshooting` and `tutorial`. The rest come from the Community and Misc packs. Any other non-empty string names a page type TGDP does not publish. The enum recommends and rejects nothing; stack tgdp:templates-strict:1.1 to close the list."
|
|
8313
|
+
}
|
|
8314
|
+
}
|
|
8315
|
+
};
|
|
8316
|
+
|
|
8317
|
+
// src/meta/schemas/tgdp-strict/1.1.json
|
|
8318
|
+
var __default47 = {
|
|
8319
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8320
|
+
$id: "tgdp:templates-strict:1.1",
|
|
8321
|
+
title: "The Good Docs Project templates strict overlay v1.1",
|
|
8322
|
+
description: "The strict overlay for tgdp:templates:1.1. Stack it beside the open schema, which owns the key and the required rule. It closes `type` to the 25 template slugs and requires no key.",
|
|
8323
|
+
additionalProperties: true,
|
|
8324
|
+
type: "object",
|
|
8325
|
+
properties: {
|
|
8326
|
+
type: {
|
|
8327
|
+
enum: [
|
|
8328
|
+
"api-getting-started",
|
|
8329
|
+
"api-reference",
|
|
8330
|
+
"bug-report",
|
|
8331
|
+
"changelog",
|
|
8332
|
+
"code-of-conduct",
|
|
8333
|
+
"code-of-conduct-incident-record",
|
|
8334
|
+
"code-of-conduct-remediation-record",
|
|
8335
|
+
"code-of-conduct-response-plan",
|
|
8336
|
+
"concept",
|
|
8337
|
+
"contact-support",
|
|
8338
|
+
"contributing-guide",
|
|
8339
|
+
"glossary",
|
|
8340
|
+
"how-to",
|
|
8341
|
+
"installation-guide",
|
|
8342
|
+
"our-team",
|
|
8343
|
+
"quickstart",
|
|
8344
|
+
"readme",
|
|
8345
|
+
"reference",
|
|
8346
|
+
"release-notes",
|
|
8347
|
+
"sdk-overview",
|
|
8348
|
+
"style-guide",
|
|
8349
|
+
"terminology-system",
|
|
8350
|
+
"troubleshooting",
|
|
8351
|
+
"tutorial",
|
|
8352
|
+
"user-personas"
|
|
8353
|
+
],
|
|
8354
|
+
description: "Stacked beside tgdp:templates:1.1, strict closes `type` to the 25 template slugs. That is the check tgdp:templates:1.0 makes in one file."
|
|
8355
|
+
}
|
|
8356
|
+
}
|
|
8357
|
+
};
|
|
8358
|
+
|
|
8359
|
+
// src/meta/schemas/artifact-evals/1.1.0.json
|
|
8360
|
+
var __default48 = {
|
|
8361
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8362
|
+
$id: "manni:artifact-evals:1.1.0",
|
|
8363
|
+
title: "manni artifact-evals vocabulary v1.1.0",
|
|
8364
|
+
description: "Eval declarations for instruction artifacts - skills, agent definitions, and project-rules files: assertions about what must have held in an agent session that used the artifact. A manni common vocabulary sharing the entry shape of manni:evals:1.0.0. The page-side keys appear here one level down - `metadata.evals` (one assertion or the list), `metadata.eval-skip`, and `metadata.meta-provenance`, the page-level attribution record of manni:ai-context:1.0.0 with the same entry shape - because an artifact's top-level frontmatter is the host tool's contract and `metadata` is its sanctioned extension bag; there is no container object inside it - the list is the value. `metadata` stays open so other tools' members pass untouched, and the `eval-` prefix is reserved and enforced inside it: an unrecognized `eval-*` member is rejected, the same loud-typo guard as the page side.",
|
|
8365
|
+
type: "object",
|
|
8366
|
+
additionalProperties: true,
|
|
8367
|
+
properties: {
|
|
8368
|
+
metadata: {
|
|
8369
|
+
type: "object",
|
|
8370
|
+
additionalProperties: true,
|
|
8371
|
+
properties: {
|
|
8372
|
+
evals: {
|
|
8373
|
+
type: [
|
|
8374
|
+
"string",
|
|
8375
|
+
"array"
|
|
8376
|
+
],
|
|
8377
|
+
minLength: 1,
|
|
8378
|
+
minItems: 1,
|
|
8379
|
+
items: {
|
|
8380
|
+
$ref: "#/$defs/evalEntry"
|
|
8381
|
+
},
|
|
8382
|
+
description: "The evals for this artifact: one AI-judged assertion as a string, or a non-empty list of entries \u2014 string shorthands, or closed objects with a required id. An empty list is not a declaration; an artifact with no evals omits the key. Ids are unique within an artifact: two entries claiming one id is an error, not a last-one-wins override. JSON Schema cannot express that over a mixed-shape array - `uniqueItems` is whole-item equality - so it is a requirement on implementations, stated here so every tool agrees on the rule."
|
|
8383
|
+
},
|
|
8384
|
+
"eval-skip": {
|
|
8385
|
+
type: "boolean",
|
|
8386
|
+
default: false,
|
|
8387
|
+
description: "Skip this artifact's evals entirely \u2014 reported as skipped, never silently ignored. The page-side key, one level down; default false."
|
|
8388
|
+
},
|
|
8389
|
+
"meta-provenance": {
|
|
8390
|
+
type: "array",
|
|
8391
|
+
minItems: 1,
|
|
8392
|
+
items: {
|
|
8393
|
+
$ref: "#/$defs/metaProvenanceEntry"
|
|
8394
|
+
},
|
|
8395
|
+
description: "Attribution for machine-proposed metadata, one entry per model (consumers merge by generated-by; the schema dedupes identical entries): which evals (by id) and which fields (by JSON Pointer) it proposed, at what confidence. A human deletes an entry once those are reviewed, so a surviving entry means unreviewed machine metadata. The page-level `meta-provenance`, one level down, with the entry shape repeated byte for byte. The name does not start with `eval-`, so the prefix guard does not apply to it.",
|
|
8396
|
+
uniqueItems: true
|
|
8397
|
+
}
|
|
8398
|
+
},
|
|
8399
|
+
patternProperties: {
|
|
8400
|
+
"^eval-(?!skip$)": false
|
|
8401
|
+
},
|
|
8402
|
+
"x-manni-location": "external"
|
|
8403
|
+
}
|
|
8404
|
+
},
|
|
8405
|
+
$defs: {
|
|
8406
|
+
metaProvenanceEntry: {
|
|
8407
|
+
type: "object",
|
|
8408
|
+
additionalProperties: false,
|
|
8409
|
+
required: [
|
|
8410
|
+
"generated-by"
|
|
8411
|
+
],
|
|
8412
|
+
anyOf: [
|
|
8413
|
+
{
|
|
8414
|
+
required: [
|
|
8415
|
+
"fields"
|
|
8416
|
+
]
|
|
8417
|
+
},
|
|
8418
|
+
{
|
|
8419
|
+
required: [
|
|
8420
|
+
"evals"
|
|
8421
|
+
]
|
|
8422
|
+
}
|
|
8423
|
+
],
|
|
8424
|
+
description: "One model's proposals: which metadata values and which evals it proposed, at what confidence. At least one of `fields` or `evals` is required, because an entry naming neither says nothing.",
|
|
8425
|
+
properties: {
|
|
8426
|
+
"generated-by": {
|
|
8427
|
+
type: "string",
|
|
8428
|
+
minLength: 1,
|
|
8429
|
+
description: "Model or agent that proposed the fields or evals."
|
|
8430
|
+
},
|
|
8431
|
+
fields: {
|
|
8432
|
+
type: "array",
|
|
8433
|
+
minItems: 1,
|
|
8434
|
+
items: {
|
|
8435
|
+
type: "string",
|
|
8436
|
+
pattern: "^/"
|
|
8437
|
+
},
|
|
8438
|
+
uniqueItems: true,
|
|
8439
|
+
description: "The metadata values it proposed, as JSON Pointers: the same form `validate` reports. `/intent` names a top-level key and `/graph/label` reaches into a block. Pointers let one entry shape cover every vocabulary stacked on the document."
|
|
8440
|
+
},
|
|
8441
|
+
evals: {
|
|
8442
|
+
type: "array",
|
|
8443
|
+
minItems: 1,
|
|
8444
|
+
items: {
|
|
8445
|
+
type: "string",
|
|
8446
|
+
pattern: "^[a-z0-9][a-z0-9-]*$"
|
|
8447
|
+
},
|
|
8448
|
+
uniqueItems: true,
|
|
8449
|
+
description: "The evals it proposed, by kebab id, so a reordered eval list does not orphan them."
|
|
8450
|
+
},
|
|
8451
|
+
confidence: {
|
|
8452
|
+
type: "object",
|
|
8453
|
+
propertyNames: {
|
|
8454
|
+
pattern: "^(?:/.*|[a-z0-9][a-z0-9-]*)$"
|
|
8455
|
+
},
|
|
8456
|
+
additionalProperties: {
|
|
8457
|
+
type: "number",
|
|
8458
|
+
minimum: 0,
|
|
8459
|
+
maximum: 1
|
|
8460
|
+
},
|
|
8461
|
+
description: "Model confidence, 0..1, keyed by a pointer from `fields` or an id from `evals`. The two key forms cannot collide: a pointer starts with `/` and an id cannot. A confidence attached to a malformed key fails here instead of dangling."
|
|
8462
|
+
}
|
|
8463
|
+
}
|
|
8464
|
+
},
|
|
8465
|
+
evalEntry: {
|
|
8466
|
+
if: {
|
|
8467
|
+
type: "string"
|
|
8468
|
+
},
|
|
8469
|
+
then: {
|
|
8470
|
+
type: "string",
|
|
8471
|
+
minLength: 1
|
|
8472
|
+
},
|
|
8473
|
+
else: {
|
|
8474
|
+
$ref: "#/$defs/inlineEval"
|
|
8475
|
+
},
|
|
8476
|
+
description: "One eval: a string shorthand (an AI-judged assertion at error severity \u2014 the legitimately id-less form), or a closed object. Branched with if/then rather than oneOf so a fault inside the object form is reported once, against the key that is wrong."
|
|
8477
|
+
},
|
|
8478
|
+
inlineEval: {
|
|
8479
|
+
type: "object",
|
|
8480
|
+
required: [
|
|
8481
|
+
"id"
|
|
8482
|
+
],
|
|
8483
|
+
properties: {
|
|
8484
|
+
id: {
|
|
8485
|
+
type: "string",
|
|
8486
|
+
pattern: "^[a-z0-9][a-z0-9-]*$",
|
|
8487
|
+
description: "Unique (per artifact) kebab-case identifier. Required on the object form \u2014 position-derived names orphan cached verdicts whenever entries move; if an eval is worth an object, it is worth a stable name."
|
|
8488
|
+
},
|
|
8489
|
+
assertion: {
|
|
8490
|
+
type: "string",
|
|
8491
|
+
minLength: 1,
|
|
8492
|
+
description: "What must have held in the session that used this artifact."
|
|
8493
|
+
},
|
|
8494
|
+
type: {
|
|
8495
|
+
$ref: "#/$defs/evalType"
|
|
8496
|
+
},
|
|
8497
|
+
grader: {
|
|
8498
|
+
$ref: "#/$defs/grader"
|
|
8499
|
+
},
|
|
8500
|
+
provider: {
|
|
8501
|
+
type: "string",
|
|
8502
|
+
minLength: 1,
|
|
8503
|
+
description: "Which configured inference provider or agent judges an `ai`-graded eval. Legal values are whatever the inference dependency supports, validated at run time; omit for the config default."
|
|
8504
|
+
},
|
|
8505
|
+
model: {
|
|
8506
|
+
type: "string",
|
|
8507
|
+
minLength: 1,
|
|
8508
|
+
description: "Model that judges an `ai`-graded eval, within `provider`. Legal values are whatever the inference dependency supports, validated at run time; omit for the config default. Two uses: an eval that matters can name a stronger judge than the default, and an eval can name a judge other than the model that produced the session it grades - a model asked whether its own session followed the rules is the sharpest form of self-preference bias there is. Meaningful only on `ai` evals."
|
|
8509
|
+
},
|
|
8510
|
+
runs: {
|
|
8511
|
+
type: "integer",
|
|
8512
|
+
minimum: 1,
|
|
8513
|
+
maximum: 50,
|
|
8514
|
+
description: "Ensemble runs for this eval, overriding the tool's configured default. Lets a high-stakes or known-flaky assertion buy more agreement than a cheap one, which a corpus-wide setting cannot. Capped because it multiplies cost directly. Meaningful only on `ai` evals."
|
|
8515
|
+
},
|
|
8516
|
+
command: {
|
|
8517
|
+
type: "array",
|
|
8518
|
+
minItems: 1,
|
|
8519
|
+
items: {
|
|
8520
|
+
type: "string",
|
|
8521
|
+
minLength: 1
|
|
8522
|
+
},
|
|
8523
|
+
description: "Command to execute for command-graded evals. {trace} is replaced with the session trace path \u2014 the artifact-side analog of the page side's {file} \u2014 and exit 0 (or `success-exit-codes`) is a pass. Omitting it is the generation contract: tooling generates a check script from the assertion, then writes `command` and `generated-assertion-hash` back. Legal only alongside `grader: command`."
|
|
8524
|
+
},
|
|
8525
|
+
"success-exit-codes": {
|
|
8526
|
+
type: "array",
|
|
8527
|
+
minItems: 1,
|
|
8528
|
+
items: {
|
|
8529
|
+
type: "integer"
|
|
8530
|
+
},
|
|
8531
|
+
default: [
|
|
8532
|
+
0
|
|
8533
|
+
],
|
|
8534
|
+
description: "Exit codes that count as a pass."
|
|
8535
|
+
},
|
|
8536
|
+
"timeout-ms": {
|
|
8537
|
+
type: "integer",
|
|
8538
|
+
minimum: 1,
|
|
8539
|
+
description: "Timeout for command-graded evals."
|
|
8540
|
+
},
|
|
8541
|
+
"generated-assertion-hash": {
|
|
8542
|
+
type: "string",
|
|
8543
|
+
description: "sha256 of the assertion when the check script was generated \u2014 written back alongside `command`, and never legal without it. A mismatch with the current assertion triggers regeneration."
|
|
8544
|
+
},
|
|
8545
|
+
options: {
|
|
8546
|
+
type: "object",
|
|
8547
|
+
description: "Grader-specific options; validated by the grader at run time, deliberately outside this schema \u2014 a grader's options evolve on the grader's schedule."
|
|
8548
|
+
},
|
|
8549
|
+
severity: {
|
|
8550
|
+
$ref: "#/$defs/severity"
|
|
8551
|
+
},
|
|
8552
|
+
weight: {
|
|
8553
|
+
type: "number",
|
|
8554
|
+
exclusiveMinimum: 0,
|
|
8555
|
+
default: 1,
|
|
8556
|
+
description: "Relative contribution to an aggregate score across evals. Does not change this eval's own pass/fail, nor its severity: an eval still passes or fails on its own terms, and weight only decides how much that outcome moves a run total. Zero is excluded deliberately - a weightless eval is a silent disable, and `skip` already means that, loudly."
|
|
8557
|
+
},
|
|
8558
|
+
"severity-map": {
|
|
8559
|
+
type: "object",
|
|
8560
|
+
additionalProperties: {
|
|
8561
|
+
$ref: "#/$defs/severity"
|
|
8562
|
+
},
|
|
8563
|
+
description: "Maps a tool grader's own severities onto eval severities. Meaningful only on `tool:*` evals \u2014 imported from the page side to keep the entry vocabularies congruent."
|
|
8564
|
+
},
|
|
8565
|
+
skip: {
|
|
8566
|
+
type: "boolean"
|
|
8567
|
+
},
|
|
8568
|
+
evidence: {
|
|
8569
|
+
type: "string",
|
|
8570
|
+
minLength: 1,
|
|
8571
|
+
description: "Hint telling the judge where in the session to look."
|
|
8572
|
+
},
|
|
8573
|
+
target: {
|
|
8574
|
+
$ref: "#/$defs/target"
|
|
8575
|
+
},
|
|
8576
|
+
examples: {
|
|
8577
|
+
type: "object",
|
|
8578
|
+
additionalProperties: false,
|
|
8579
|
+
properties: {
|
|
8580
|
+
pass: {
|
|
8581
|
+
$ref: "#/$defs/anchorList"
|
|
8582
|
+
},
|
|
8583
|
+
fail: {
|
|
8584
|
+
$ref: "#/$defs/anchorList"
|
|
8585
|
+
}
|
|
8586
|
+
},
|
|
8587
|
+
description: "Anchor examples of passing and failing behavior for the judge \u2014 one or several each."
|
|
8588
|
+
}
|
|
8589
|
+
},
|
|
8590
|
+
additionalProperties: false,
|
|
8591
|
+
dependentRequired: {
|
|
8592
|
+
"generated-assertion-hash": [
|
|
8593
|
+
"command"
|
|
8594
|
+
]
|
|
8595
|
+
},
|
|
8596
|
+
allOf: [
|
|
8597
|
+
{
|
|
8598
|
+
if: {
|
|
8599
|
+
properties: {
|
|
8600
|
+
grader: {
|
|
8601
|
+
const: "ai"
|
|
8602
|
+
}
|
|
8603
|
+
},
|
|
8604
|
+
required: [
|
|
8605
|
+
"grader"
|
|
8606
|
+
]
|
|
8607
|
+
},
|
|
8608
|
+
then: {
|
|
8609
|
+
required: [
|
|
8610
|
+
"assertion"
|
|
8611
|
+
]
|
|
8612
|
+
}
|
|
8613
|
+
},
|
|
8614
|
+
{
|
|
8615
|
+
if: {
|
|
8616
|
+
not: {
|
|
8617
|
+
required: [
|
|
8618
|
+
"grader"
|
|
8619
|
+
]
|
|
8620
|
+
}
|
|
8621
|
+
},
|
|
8622
|
+
then: {
|
|
8623
|
+
required: [
|
|
8624
|
+
"assertion"
|
|
8625
|
+
],
|
|
8626
|
+
description: "No grader means the `ai` default, so the assertion the judge reads is required."
|
|
8627
|
+
}
|
|
8628
|
+
},
|
|
8629
|
+
{
|
|
8630
|
+
if: {
|
|
8631
|
+
properties: {
|
|
8632
|
+
grader: {
|
|
8633
|
+
const: "human"
|
|
8634
|
+
}
|
|
8635
|
+
},
|
|
8636
|
+
required: [
|
|
8637
|
+
"grader"
|
|
8638
|
+
]
|
|
8639
|
+
},
|
|
8640
|
+
then: {
|
|
8641
|
+
required: [
|
|
8642
|
+
"assertion"
|
|
8643
|
+
]
|
|
8644
|
+
}
|
|
8645
|
+
},
|
|
8646
|
+
{
|
|
8647
|
+
if: {
|
|
8648
|
+
properties: {
|
|
8649
|
+
grader: {
|
|
8650
|
+
const: "command"
|
|
8651
|
+
}
|
|
8652
|
+
},
|
|
8653
|
+
required: [
|
|
8654
|
+
"grader"
|
|
8655
|
+
]
|
|
8656
|
+
},
|
|
8657
|
+
then: {
|
|
8658
|
+
anyOf: [
|
|
8659
|
+
{
|
|
8660
|
+
required: [
|
|
8661
|
+
"assertion"
|
|
8662
|
+
]
|
|
8663
|
+
},
|
|
8664
|
+
{
|
|
8665
|
+
required: [
|
|
8666
|
+
"command"
|
|
8667
|
+
]
|
|
8668
|
+
}
|
|
8669
|
+
],
|
|
8670
|
+
description: "A command eval carries either the assertion its script is generated from, or the command itself - the generation contract writes the second from the first."
|
|
8671
|
+
}
|
|
8672
|
+
},
|
|
8673
|
+
{
|
|
8674
|
+
if: {
|
|
8675
|
+
required: [
|
|
8676
|
+
"command"
|
|
8677
|
+
]
|
|
8678
|
+
},
|
|
8679
|
+
then: {
|
|
8680
|
+
properties: {
|
|
8681
|
+
grader: {
|
|
8682
|
+
const: "command"
|
|
8683
|
+
}
|
|
8684
|
+
},
|
|
8685
|
+
required: [
|
|
8686
|
+
"grader"
|
|
8687
|
+
],
|
|
8688
|
+
description: "An entry carrying an executable command must say grader: command."
|
|
8689
|
+
}
|
|
8690
|
+
},
|
|
8691
|
+
{
|
|
8692
|
+
if: {
|
|
8693
|
+
anyOf: [
|
|
8694
|
+
{
|
|
8695
|
+
required: [
|
|
8696
|
+
"success-exit-codes"
|
|
8697
|
+
]
|
|
8698
|
+
},
|
|
8699
|
+
{
|
|
8700
|
+
required: [
|
|
8701
|
+
"timeout-ms"
|
|
8702
|
+
]
|
|
8703
|
+
}
|
|
8704
|
+
]
|
|
8705
|
+
},
|
|
8706
|
+
then: {
|
|
8707
|
+
properties: {
|
|
8708
|
+
grader: {
|
|
8709
|
+
const: "command"
|
|
8710
|
+
}
|
|
8711
|
+
},
|
|
8712
|
+
required: [
|
|
8713
|
+
"grader"
|
|
8714
|
+
],
|
|
8715
|
+
description: "success-exit-codes and timeout-ms configure command execution, so they are legal only alongside grader: command \u2014 present, or generated later under the generation contract."
|
|
8716
|
+
}
|
|
8717
|
+
},
|
|
8718
|
+
{
|
|
8719
|
+
if: {
|
|
8720
|
+
anyOf: [
|
|
8721
|
+
{
|
|
8722
|
+
required: [
|
|
8723
|
+
"provider"
|
|
8724
|
+
]
|
|
8725
|
+
},
|
|
8726
|
+
{
|
|
8727
|
+
required: [
|
|
8728
|
+
"model"
|
|
8729
|
+
]
|
|
8730
|
+
},
|
|
8731
|
+
{
|
|
8732
|
+
required: [
|
|
8733
|
+
"runs"
|
|
8734
|
+
]
|
|
8735
|
+
}
|
|
8736
|
+
]
|
|
8737
|
+
},
|
|
8738
|
+
then: {
|
|
8739
|
+
properties: {
|
|
8740
|
+
grader: {
|
|
8741
|
+
const: "ai"
|
|
8742
|
+
}
|
|
8743
|
+
},
|
|
8744
|
+
description: "provider, model and runs configure the AI judge, so they are legal only on an `ai` eval. `grader` is not required alongside them because `ai` is the default."
|
|
8745
|
+
}
|
|
8746
|
+
}
|
|
8747
|
+
]
|
|
8748
|
+
},
|
|
8749
|
+
evalType: {
|
|
8750
|
+
enum: [
|
|
8751
|
+
"capability",
|
|
8752
|
+
"regression"
|
|
8753
|
+
],
|
|
8754
|
+
default: "regression",
|
|
8755
|
+
description: "`capability` probes a boundary and is expected to fail sometimes; `regression` protects behavior that already works. Reported, not enforced."
|
|
8756
|
+
},
|
|
8757
|
+
severity: {
|
|
8758
|
+
enum: [
|
|
8759
|
+
"error",
|
|
8760
|
+
"warning",
|
|
8761
|
+
"notice"
|
|
8762
|
+
],
|
|
8763
|
+
default: "error",
|
|
8764
|
+
description: "Only error-severity failures fail the eval; warning and notice report but pass. The three levels are the family scale in manni's shared severity, so a finding reads the same in every tool. Default error \u2014 the string shorthand implies it."
|
|
8765
|
+
},
|
|
8766
|
+
grader: {
|
|
8767
|
+
anyOf: [
|
|
8768
|
+
{
|
|
8769
|
+
type: "string",
|
|
8770
|
+
pattern: "^(tool:)?[a-z0-9][a-z0-9-]*$"
|
|
8771
|
+
},
|
|
8772
|
+
{
|
|
8773
|
+
enum: [
|
|
8774
|
+
"ai",
|
|
8775
|
+
"human",
|
|
8776
|
+
"command",
|
|
8777
|
+
"tool-usage",
|
|
8778
|
+
"skill-invoked",
|
|
8779
|
+
"file-access",
|
|
8780
|
+
"turn-count",
|
|
8781
|
+
"cost",
|
|
8782
|
+
"regex",
|
|
8783
|
+
"json-output",
|
|
8784
|
+
"tool-order"
|
|
8785
|
+
]
|
|
8786
|
+
}
|
|
8787
|
+
],
|
|
8788
|
+
default: "ai",
|
|
8789
|
+
description: "How the assertion is checked: the AI judge (`ai`); a human review queue (`human` \u2014 judged per session, since every trace is new, unlike the page side where a verdict persists until the page changes); an executable check over the trace (`command`); a deterministic session grader \u2014 `tool-usage`, `tool-order`, `skill-invoked`, `file-access`, `turn-count`, `cost`, `regex`, `json-output`; or a `tool:<kebab>` integration, the page side's namespace, accepted here so one grader spelling ports across both eval vocabularies. Recommended values, not a closed list: any kebab name is legal and validated against the grader registry at run time, so a new grader never needs a schema version \u2014 the one cost is that a stale or misspelled grader name passes this schema and is rejected by the registry instead."
|
|
8790
|
+
},
|
|
8791
|
+
anchorList: {
|
|
8792
|
+
if: {
|
|
8793
|
+
type: "array"
|
|
8794
|
+
},
|
|
8795
|
+
then: {
|
|
8796
|
+
type: "array",
|
|
8797
|
+
minItems: 1,
|
|
8798
|
+
uniqueItems: true,
|
|
8799
|
+
items: {
|
|
8800
|
+
type: "string",
|
|
8801
|
+
minLength: 1
|
|
8802
|
+
}
|
|
8803
|
+
},
|
|
8804
|
+
else: {
|
|
8805
|
+
type: "string",
|
|
8806
|
+
minLength: 1
|
|
8807
|
+
},
|
|
8808
|
+
description: "One anchor example, or a non-empty list of them."
|
|
8809
|
+
},
|
|
8810
|
+
target: {
|
|
8811
|
+
if: {
|
|
8812
|
+
type: "object"
|
|
8813
|
+
},
|
|
8814
|
+
then: {
|
|
8815
|
+
type: "object",
|
|
8816
|
+
additionalProperties: false,
|
|
8817
|
+
required: [
|
|
8818
|
+
"source",
|
|
8819
|
+
"path"
|
|
8820
|
+
],
|
|
8821
|
+
properties: {
|
|
8822
|
+
source: {
|
|
8823
|
+
const: "file"
|
|
8824
|
+
},
|
|
8825
|
+
path: {
|
|
8826
|
+
type: "string",
|
|
8827
|
+
minLength: 1,
|
|
8828
|
+
description: "Path to the file to grade, relative to the session's working directory."
|
|
8829
|
+
}
|
|
8086
8830
|
}
|
|
8087
|
-
}
|
|
8831
|
+
},
|
|
8832
|
+
else: {
|
|
8833
|
+
enum: [
|
|
8834
|
+
"transcript",
|
|
8835
|
+
"last-message",
|
|
8836
|
+
"files",
|
|
8837
|
+
"artifact"
|
|
8838
|
+
]
|
|
8839
|
+
},
|
|
8840
|
+
default: "transcript",
|
|
8841
|
+
description: "What the grader receives: the whole session (`transcript`), the final assistant message (`last-message`), the list of files the session wrote (`files`), the instruction artifact itself (`artifact`), or a named file. Distinct from `evidence`, which hints where to look within what is graded - this selects the bytes themselves, and it is structural, so deterministic graders honour it too. Named `target` rather than `focus` for that reason: a regex grader has no focus, it has a target. Branched with if/then rather than oneOf so a fault inside the object form is reported once, against the key that is wrong."
|
|
8088
8842
|
}
|
|
8089
8843
|
}
|
|
8090
8844
|
};
|
|
8091
8845
|
|
|
8092
|
-
// src/meta/schemas/artifact-evals-strict/1.
|
|
8093
|
-
var
|
|
8846
|
+
// src/meta/schemas/artifact-evals-strict/1.1.0.json
|
|
8847
|
+
var __default49 = {
|
|
8094
8848
|
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8095
|
-
$id: "manni:artifact-evals-strict:1.
|
|
8096
|
-
title: "manni artifact-evals strict overlay v1.
|
|
8097
|
-
description: "The strict overlay for manni:artifact-evals:1.
|
|
8849
|
+
$id: "manni:artifact-evals-strict:1.1.0",
|
|
8850
|
+
title: "manni artifact-evals strict overlay v1.1.0",
|
|
8851
|
+
description: "The strict overlay for manni:artifact-evals:1.1.0. Stack it beside the open vocabulary, which owns every key, every required rule and every conditional. Inside `metadata`, it narrows provider and model names, exit codes, companion paths and the assertion hash as manni:evals-strict:1.0.0 does. It also closes `grader` to the named graders and `tool:` integrations.",
|
|
8098
8852
|
additionalProperties: true,
|
|
8099
8853
|
type: "object",
|
|
8100
8854
|
properties: {
|
|
@@ -8149,7 +8903,8 @@ var __default43 = {
|
|
|
8149
8903
|
"turn-count",
|
|
8150
8904
|
"cost",
|
|
8151
8905
|
"regex",
|
|
8152
|
-
"json-output"
|
|
8906
|
+
"json-output",
|
|
8907
|
+
"tool-order"
|
|
8153
8908
|
]
|
|
8154
8909
|
},
|
|
8155
8910
|
{
|
|
@@ -8157,7 +8912,7 @@ var __default43 = {
|
|
|
8157
8912
|
pattern: "^tool:[a-z0-9][a-z0-9-]*$"
|
|
8158
8913
|
}
|
|
8159
8914
|
],
|
|
8160
|
-
description: "One of the
|
|
8915
|
+
description: "One of the eleven named graders, or a `tool:<kebab>` integration. Strict accepts no other kebab name."
|
|
8161
8916
|
},
|
|
8162
8917
|
provider: {
|
|
8163
8918
|
pattern: "^[a-z0-9][a-z0-9-]*$",
|
|
@@ -8193,194 +8948,8 @@ var __default43 = {
|
|
|
8193
8948
|
}
|
|
8194
8949
|
};
|
|
8195
8950
|
|
|
8196
|
-
// src/meta/schemas/graph-strict/1.0.0.json
|
|
8197
|
-
var __default44 = {
|
|
8198
|
-
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8199
|
-
$id: "manni:graph-strict:1.0.0",
|
|
8200
|
-
title: "manni graph strict overlay v1.0.0",
|
|
8201
|
-
description: "The strict overlay for manni:graph:1.0.0. Stack it beside the open vocabulary, which owns the closed `graph` block and its iiRDS enums. It narrows section keys to heading slugs and lineage references to single tokens.",
|
|
8202
|
-
additionalProperties: true,
|
|
8203
|
-
type: "object",
|
|
8204
|
-
properties: {
|
|
8205
|
-
graph: {
|
|
8206
|
-
description: "Strict narrows `sections` keys, `revision-of` and `derived-from`. Every other member of the block passes as the open vocabulary reads it.",
|
|
8207
|
-
properties: {
|
|
8208
|
-
sections: {
|
|
8209
|
-
propertyNames: {
|
|
8210
|
-
pattern: "^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}\\p{Nd}_-]+$",
|
|
8211
|
-
description: "A heading slug of lowercase letters, caseless letters and their marks, digits, `_` and `-`. It admits slugs from scripts without case, such as Han, Arabic and Devanagari. The pattern uses Unicode property escapes, so a validator must compile it with the ECMA-262 `u` flag, as Ajv does for a 2020-12 schema."
|
|
8212
|
-
}
|
|
8213
|
-
},
|
|
8214
|
-
"revision-of": {
|
|
8215
|
-
$ref: "#/$defs/refList"
|
|
8216
|
-
},
|
|
8217
|
-
"derived-from": {
|
|
8218
|
-
$ref: "#/$defs/refList"
|
|
8219
|
-
}
|
|
8220
|
-
}
|
|
8221
|
-
}
|
|
8222
|
-
},
|
|
8223
|
-
$defs: {
|
|
8224
|
-
refList: {
|
|
8225
|
-
pattern: "^\\S(?:.*\\S)?$",
|
|
8226
|
-
items: {
|
|
8227
|
-
pattern: "^\\S(?:.*\\S)?$"
|
|
8228
|
-
},
|
|
8229
|
-
description: "A path or URL on one line with no surrounding space, alone or in each item of the list. A path may contain spaces."
|
|
8230
|
-
}
|
|
8231
|
-
}
|
|
8232
|
-
};
|
|
8233
|
-
|
|
8234
|
-
// src/meta/schemas/citations-strict/1.0.0.json
|
|
8235
|
-
var __default45 = {
|
|
8236
|
-
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8237
|
-
$id: "manni:citations-strict:1.0.0",
|
|
8238
|
-
title: "manni citations strict overlay v1.0.0",
|
|
8239
|
-
description: "The strict overlay for manni:citations:1.0.0. Stack it beside the open vocabulary, which owns every key and every required rule. It asks for the full commit hash a tool writes, and it pairs the pin's prefix with the source file.",
|
|
8240
|
-
additionalProperties: true,
|
|
8241
|
-
type: "object",
|
|
8242
|
-
properties: {
|
|
8243
|
-
citations: {
|
|
8244
|
-
description: "Strict narrows each entry's `source`. An encrypted `file` takes an `hmac-sha256-` pin, a plain one takes a `sha256-` pin, and `commit-sha` is a full hash.",
|
|
8245
|
-
items: {
|
|
8246
|
-
properties: {
|
|
8247
|
-
source: {
|
|
8248
|
-
properties: {
|
|
8249
|
-
"commit-sha": {
|
|
8250
|
-
pattern: "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
|
|
8251
|
-
description: "A full commit hash, forty lowercase hex digits or sixty-four in a SHA-256 repository."
|
|
8252
|
-
}
|
|
8253
|
-
},
|
|
8254
|
-
if: {
|
|
8255
|
-
properties: {
|
|
8256
|
-
file: {
|
|
8257
|
-
pattern: "^~"
|
|
8258
|
-
}
|
|
8259
|
-
},
|
|
8260
|
-
required: [
|
|
8261
|
-
"file"
|
|
8262
|
-
]
|
|
8263
|
-
},
|
|
8264
|
-
then: {
|
|
8265
|
-
properties: {
|
|
8266
|
-
integrity: {
|
|
8267
|
-
pattern: "^hmac-sha256-",
|
|
8268
|
-
description: "An encrypted `file` is pinned `hmac-sha256-`."
|
|
8269
|
-
}
|
|
8270
|
-
}
|
|
8271
|
-
},
|
|
8272
|
-
else: {
|
|
8273
|
-
properties: {
|
|
8274
|
-
integrity: {
|
|
8275
|
-
pattern: "^sha256-",
|
|
8276
|
-
description: "A plain `file` is pinned `sha256-`."
|
|
8277
|
-
}
|
|
8278
|
-
}
|
|
8279
|
-
}
|
|
8280
|
-
}
|
|
8281
|
-
}
|
|
8282
|
-
}
|
|
8283
|
-
}
|
|
8284
|
-
}
|
|
8285
|
-
};
|
|
8286
|
-
|
|
8287
|
-
// src/meta/schemas/tgdp/1.1.json
|
|
8288
|
-
var __default46 = {
|
|
8289
|
-
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8290
|
-
$id: "tgdp:templates:1.1",
|
|
8291
|
-
title: "The Good Docs Project templates v1.1",
|
|
8292
|
-
description: "Requires `type` and recommends the 25 template slugs that The Good Docs Project publishes (upstream templates repo, main as of 2026-08-09). Any other non-empty string names a page type TGDP does not publish, and passes. Stack tgdp:templates-strict:1.1 beside it to close `type` to the 25 slugs. Adopting it states that every page has a type, so an untyped page is a gap. Diataxis classifies what a page *is* on the same key, so a page under both has to satisfy both. Pick one. It composes freely with a schema keyed on a different field, such as passo-uno:seven-action:1.0. See https://www.thegooddocsproject.dev/template",
|
|
8293
|
-
type: "object",
|
|
8294
|
-
additionalProperties: true,
|
|
8295
|
-
required: [
|
|
8296
|
-
"type"
|
|
8297
|
-
],
|
|
8298
|
-
properties: {
|
|
8299
|
-
type: {
|
|
8300
|
-
anyOf: [
|
|
8301
|
-
{
|
|
8302
|
-
type: "string",
|
|
8303
|
-
minLength: 1
|
|
8304
|
-
},
|
|
8305
|
-
{
|
|
8306
|
-
enum: [
|
|
8307
|
-
"api-getting-started",
|
|
8308
|
-
"api-reference",
|
|
8309
|
-
"bug-report",
|
|
8310
|
-
"changelog",
|
|
8311
|
-
"code-of-conduct",
|
|
8312
|
-
"code-of-conduct-incident-record",
|
|
8313
|
-
"code-of-conduct-remediation-record",
|
|
8314
|
-
"code-of-conduct-response-plan",
|
|
8315
|
-
"concept",
|
|
8316
|
-
"contact-support",
|
|
8317
|
-
"contributing-guide",
|
|
8318
|
-
"glossary",
|
|
8319
|
-
"how-to",
|
|
8320
|
-
"installation-guide",
|
|
8321
|
-
"our-team",
|
|
8322
|
-
"quickstart",
|
|
8323
|
-
"readme",
|
|
8324
|
-
"reference",
|
|
8325
|
-
"release-notes",
|
|
8326
|
-
"sdk-overview",
|
|
8327
|
-
"style-guide",
|
|
8328
|
-
"terminology-system",
|
|
8329
|
-
"troubleshooting",
|
|
8330
|
-
"tutorial",
|
|
8331
|
-
"user-personas"
|
|
8332
|
-
]
|
|
8333
|
-
}
|
|
8334
|
-
],
|
|
8335
|
-
description: "Which page type this page is, as a Good Docs Project template slug where one fits. The 25 slugs are the recommended values. The Core pack is `concept`, `how-to`, `readme`, `reference`, `release-notes`, `troubleshooting` and `tutorial`. The rest come from the Community and Misc packs. Any other non-empty string names a page type TGDP does not publish. The enum recommends and rejects nothing; stack tgdp:templates-strict:1.1 to close the list."
|
|
8336
|
-
}
|
|
8337
|
-
}
|
|
8338
|
-
};
|
|
8339
|
-
|
|
8340
|
-
// src/meta/schemas/tgdp-strict/1.1.json
|
|
8341
|
-
var __default47 = {
|
|
8342
|
-
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8343
|
-
$id: "tgdp:templates-strict:1.1",
|
|
8344
|
-
title: "The Good Docs Project templates strict overlay v1.1",
|
|
8345
|
-
description: "The strict overlay for tgdp:templates:1.1. Stack it beside the open schema, which owns the key and the required rule. It closes `type` to the 25 template slugs and requires no key.",
|
|
8346
|
-
additionalProperties: true,
|
|
8347
|
-
type: "object",
|
|
8348
|
-
properties: {
|
|
8349
|
-
type: {
|
|
8350
|
-
enum: [
|
|
8351
|
-
"api-getting-started",
|
|
8352
|
-
"api-reference",
|
|
8353
|
-
"bug-report",
|
|
8354
|
-
"changelog",
|
|
8355
|
-
"code-of-conduct",
|
|
8356
|
-
"code-of-conduct-incident-record",
|
|
8357
|
-
"code-of-conduct-remediation-record",
|
|
8358
|
-
"code-of-conduct-response-plan",
|
|
8359
|
-
"concept",
|
|
8360
|
-
"contact-support",
|
|
8361
|
-
"contributing-guide",
|
|
8362
|
-
"glossary",
|
|
8363
|
-
"how-to",
|
|
8364
|
-
"installation-guide",
|
|
8365
|
-
"our-team",
|
|
8366
|
-
"quickstart",
|
|
8367
|
-
"readme",
|
|
8368
|
-
"reference",
|
|
8369
|
-
"release-notes",
|
|
8370
|
-
"sdk-overview",
|
|
8371
|
-
"style-guide",
|
|
8372
|
-
"terminology-system",
|
|
8373
|
-
"troubleshooting",
|
|
8374
|
-
"tutorial",
|
|
8375
|
-
"user-personas"
|
|
8376
|
-
],
|
|
8377
|
-
description: "Stacked beside tgdp:templates:1.1, strict closes `type` to the 25 template slugs. That is the check tgdp:templates:1.0 makes in one file."
|
|
8378
|
-
}
|
|
8379
|
-
}
|
|
8380
|
-
};
|
|
8381
|
-
|
|
8382
8951
|
// src/meta/schemas/stewardship/1.1.0.json
|
|
8383
|
-
var
|
|
8952
|
+
var __default50 = {
|
|
8384
8953
|
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8385
8954
|
$id: "manni:stewardship:1.1.0",
|
|
8386
8955
|
title: "manni stewardship vocabulary v1.1.0",
|
|
@@ -8507,7 +9076,7 @@ var __default48 = {
|
|
|
8507
9076
|
};
|
|
8508
9077
|
|
|
8509
9078
|
// src/meta/schemas/stewardship-strict/1.1.0.json
|
|
8510
|
-
var
|
|
9079
|
+
var __default51 = {
|
|
8511
9080
|
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
8512
9081
|
$id: "manni:stewardship-strict:1.1.0",
|
|
8513
9082
|
title: "manni stewardship strict overlay v1.1.0",
|
|
@@ -8673,8 +9242,10 @@ var BUILTINS = /* @__PURE__ */ new Map([
|
|
|
8673
9242
|
["manni:citations-strict:1.0.0", __default45],
|
|
8674
9243
|
["tgdp:templates:1.1", __default46],
|
|
8675
9244
|
["tgdp:templates-strict:1.1", __default47],
|
|
8676
|
-
["manni:
|
|
8677
|
-
["manni:
|
|
9245
|
+
["manni:artifact-evals:1.1.0", __default48],
|
|
9246
|
+
["manni:artifact-evals-strict:1.1.0", __default49],
|
|
9247
|
+
["manni:stewardship:1.1.0", __default50],
|
|
9248
|
+
["manni:stewardship-strict:1.1.0", __default51]
|
|
8678
9249
|
]);
|
|
8679
9250
|
var ANNOTATION_ONLY_PREDECESSORS = /* @__PURE__ */ new Map([
|
|
8680
9251
|
["manni:stewardship:1.1.0", "manni:stewardship:1.0.0"],
|
|
@@ -8772,6 +9343,8 @@ var PUBLISHED_PATHS = [
|
|
|
8772
9343
|
["citations-strict/1.0.0.json", "manni:citations-strict:1.0.0"],
|
|
8773
9344
|
["tgdp/1.1.json", "tgdp:templates:1.1"],
|
|
8774
9345
|
["tgdp-strict/1.1.json", "tgdp:templates-strict:1.1"],
|
|
9346
|
+
["artifact-evals/1.1.0.json", "manni:artifact-evals:1.1.0"],
|
|
9347
|
+
["artifact-evals-strict/1.1.0.json", "manni:artifact-evals-strict:1.1.0"],
|
|
8775
9348
|
["stewardship/1.1.0.json", "manni:stewardship:1.1.0"],
|
|
8776
9349
|
["stewardship-strict/1.1.0.json", "manni:stewardship-strict:1.1.0"]
|
|
8777
9350
|
];
|
|
@@ -11727,9 +12300,7 @@ function renderSarif(results, opts = {}) {
|
|
|
11727
12300
|
)}`;
|
|
11728
12301
|
}
|
|
11729
12302
|
|
|
11730
|
-
// src/
|
|
11731
|
-
var SUITE_NAME = "manni";
|
|
11732
|
-
var CLASS_NAME = "manni.validate";
|
|
12303
|
+
// src/shared/xml.ts
|
|
11733
12304
|
var XML_ENTITIES = {
|
|
11734
12305
|
"&": "&",
|
|
11735
12306
|
"<": "<",
|
|
@@ -11749,6 +12320,10 @@ function xmlEscape(value) {
|
|
|
11749
12320
|
}
|
|
11750
12321
|
return out;
|
|
11751
12322
|
}
|
|
12323
|
+
|
|
12324
|
+
// src/meta/reporters/junit.ts
|
|
12325
|
+
var SUITE_NAME = "manni";
|
|
12326
|
+
var CLASS_NAME = "manni.validate";
|
|
11752
12327
|
var attr = (name2, value) => ` ${name2}="${xmlEscape(value)}"`;
|
|
11753
12328
|
function renderJunit(results, opts = {}) {
|
|
11754
12329
|
const tests = results.length;
|
|
@@ -11798,6 +12373,16 @@ function shouldColor(opts) {
|
|
|
11798
12373
|
if (env.NO_COLOR != null && env.NO_COLOR !== "") return false;
|
|
11799
12374
|
return Boolean(opts.isTTY);
|
|
11800
12375
|
}
|
|
12376
|
+
function colorFor(command, isTTY, env) {
|
|
12377
|
+
const noColor = colorOwner(command).opts().color === false;
|
|
12378
|
+
return shouldColor({ noColor, isTTY, env });
|
|
12379
|
+
}
|
|
12380
|
+
function colorOwner(command) {
|
|
12381
|
+
for (let c = command; c !== null; c = c.parent) {
|
|
12382
|
+
if (c.options.some((o) => o.long === "--no-color")) return c;
|
|
12383
|
+
}
|
|
12384
|
+
return command;
|
|
12385
|
+
}
|
|
11801
12386
|
|
|
11802
12387
|
// src/shared/github.ts
|
|
11803
12388
|
function escapeWorkflowCommandMessage(message) {
|
|
@@ -12035,7 +12620,7 @@ async function readCapped(url, res, maxBytes) {
|
|
|
12035
12620
|
}
|
|
12036
12621
|
|
|
12037
12622
|
// src/meta/core/external-metadata.ts
|
|
12038
|
-
import { readFile as
|
|
12623
|
+
import { readFile as readFile7 } from "node:fs/promises";
|
|
12039
12624
|
import { isAbsolute as isAbsolute5, relative as relative9, resolve as resolve14, sep as sep4 } from "node:path";
|
|
12040
12625
|
import {
|
|
12041
12626
|
LineCounter as LineCounter3,
|
|
@@ -12047,6 +12632,7 @@ import {
|
|
|
12047
12632
|
} from "yaml";
|
|
12048
12633
|
|
|
12049
12634
|
// src/shared/manifest-cas.ts
|
|
12635
|
+
import { readFile as readFile5 } from "node:fs/promises";
|
|
12050
12636
|
import { posix as posix3 } from "node:path";
|
|
12051
12637
|
var COMMIT_ATTEMPTS = 5;
|
|
12052
12638
|
function conflictRefusal(file) {
|
|
@@ -12115,10 +12701,18 @@ async function settle(held, io) {
|
|
|
12115
12701
|
function isMissing(error) {
|
|
12116
12702
|
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
12117
12703
|
}
|
|
12704
|
+
async function readManifestOrEmpty(absPath, perPage) {
|
|
12705
|
+
try {
|
|
12706
|
+
return await readFile5(absPath, "utf8");
|
|
12707
|
+
} catch (e) {
|
|
12708
|
+
if (perPage && isMissing(e)) return "";
|
|
12709
|
+
throw e;
|
|
12710
|
+
}
|
|
12711
|
+
}
|
|
12118
12712
|
|
|
12119
12713
|
// src/shared/encryption-key.ts
|
|
12120
12714
|
import { spawnSync } from "node:child_process";
|
|
12121
|
-
import { readFile as
|
|
12715
|
+
import { readFile as readFile6 } from "node:fs/promises";
|
|
12122
12716
|
import { basename as basename4, dirname as dirname6, join as join7, relative as relative8, resolve as resolve13 } from "node:path";
|
|
12123
12717
|
import { isDeepStrictEqual } from "node:util";
|
|
12124
12718
|
import { isMap as isMap5, parseDocument as parseDocument4, parse as parseYaml3, stringify as stringify2 } from "yaml";
|
|
@@ -12188,7 +12782,7 @@ function errorCode3(err) {
|
|
|
12188
12782
|
}
|
|
12189
12783
|
async function readIfPresent(path) {
|
|
12190
12784
|
try {
|
|
12191
|
-
return await
|
|
12785
|
+
return await readFile6(path, "utf8");
|
|
12192
12786
|
} catch (err) {
|
|
12193
12787
|
if (errorCode3(err) === "ENOENT") return null;
|
|
12194
12788
|
throw err;
|
|
@@ -12702,7 +13296,7 @@ function outsideRefusal(manifest, collection, pageRel) {
|
|
|
12702
13296
|
}
|
|
12703
13297
|
async function readPageManifest(abs, file) {
|
|
12704
13298
|
try {
|
|
12705
|
-
return await
|
|
13299
|
+
return await readFile7(abs, "utf8");
|
|
12706
13300
|
} catch (err) {
|
|
12707
13301
|
if (isMissing(err)) return "";
|
|
12708
13302
|
throw unreadable(file, err);
|
|
@@ -12710,7 +13304,7 @@ async function readPageManifest(abs, file) {
|
|
|
12710
13304
|
}
|
|
12711
13305
|
async function readManifest(abs, file) {
|
|
12712
13306
|
try {
|
|
12713
|
-
return await
|
|
13307
|
+
return await readFile7(abs, "utf8");
|
|
12714
13308
|
} catch (err) {
|
|
12715
13309
|
throw unreadable(file, err);
|
|
12716
13310
|
}
|
|
@@ -14421,7 +15015,7 @@ import { dirname as dirname9, resolve as resolve16 } from "node:path";
|
|
|
14421
15015
|
|
|
14422
15016
|
// src/meta/core/derive/codeowners.ts
|
|
14423
15017
|
import { existsSync as existsSync3 } from "node:fs";
|
|
14424
|
-
import { readFile as
|
|
15018
|
+
import { readFile as readFile8 } from "node:fs/promises";
|
|
14425
15019
|
import { dirname as dirname7, relative as relative11, resolve as resolve15, sep as sep6 } from "node:path";
|
|
14426
15020
|
import picomatch4 from "picomatch";
|
|
14427
15021
|
var CODEOWNERS_LOCATIONS = [
|
|
@@ -14585,7 +15179,7 @@ async function deriveFromCodeowners(inputs, opts) {
|
|
|
14585
15179
|
const key = `${path}\0${label}`;
|
|
14586
15180
|
let file = parsed2.get(key);
|
|
14587
15181
|
if (!file) {
|
|
14588
|
-
file =
|
|
15182
|
+
file = readFile8(path, "utf8").then(
|
|
14589
15183
|
(text2) => parseCodeowners(text2, path, label)
|
|
14590
15184
|
);
|
|
14591
15185
|
parsed2.set(key, file);
|
|
@@ -16473,7 +17067,7 @@ async function deriveForTable(inputs, ctx, hint, fields) {
|
|
|
16473
17067
|
}
|
|
16474
17068
|
|
|
16475
17069
|
// src/meta/commands/validate.ts
|
|
16476
|
-
import { readFile as
|
|
17070
|
+
import { readFile as readFile10 } from "node:fs/promises";
|
|
16477
17071
|
|
|
16478
17072
|
// src/meta/core/page-marks.ts
|
|
16479
17073
|
function pageMarks(opts) {
|
|
@@ -16551,9 +17145,32 @@ async function configMarks(configPath, cwd) {
|
|
|
16551
17145
|
trustRoot: schemaTrustRoot(cwd, loaded.dir)
|
|
16552
17146
|
});
|
|
16553
17147
|
}
|
|
17148
|
+
async function metaSection(configPath, cwd) {
|
|
17149
|
+
const loaded = await loadConfig(configPath, cwd);
|
|
17150
|
+
if (loaded === null) return null;
|
|
17151
|
+
return rebaseConfigSchemaRefs(loaded.config, loaded.dir, cwd);
|
|
17152
|
+
}
|
|
17153
|
+
function familyMarks(opts) {
|
|
17154
|
+
let built;
|
|
17155
|
+
const defaults = () => pageMarks({
|
|
17156
|
+
validator: marksValidator({ config: null, cwd: opts.cwd, configDir: opts.configDir }),
|
|
17157
|
+
config: null,
|
|
17158
|
+
cwd: opts.cwd,
|
|
17159
|
+
trustRoot: schemaTrustRoot(opts.cwd, opts.configDir)
|
|
17160
|
+
});
|
|
17161
|
+
return () => built ??= (async () => {
|
|
17162
|
+
if (opts.configPath === void 0) return defaults();
|
|
17163
|
+
try {
|
|
17164
|
+
return await configMarks(opts.configPath, opts.cwd) ?? defaults();
|
|
17165
|
+
} catch (err) {
|
|
17166
|
+
if (err instanceof DocmetaError) return defaults();
|
|
17167
|
+
throw err;
|
|
17168
|
+
}
|
|
17169
|
+
})();
|
|
17170
|
+
}
|
|
16554
17171
|
|
|
16555
17172
|
// src/meta/core/relocation.ts
|
|
16556
|
-
import { access, readFile as
|
|
17173
|
+
import { access, readFile as readFile9, stat as stat7, unlink } from "node:fs/promises";
|
|
16557
17174
|
import { basename as basename5, extname as extname3, isAbsolute as isAbsolute8, join as join9, relative as relative13, resolve as resolve17, sep as sep8 } from "node:path";
|
|
16558
17175
|
import picomatch6 from "picomatch";
|
|
16559
17176
|
import {
|
|
@@ -17302,13 +17919,13 @@ async function planRelocation(ctx, request) {
|
|
|
17302
17919
|
let unreadable2;
|
|
17303
17920
|
if (beyond) {
|
|
17304
17921
|
try {
|
|
17305
|
-
content = await
|
|
17922
|
+
content = await readFile9(absPath, "utf8");
|
|
17306
17923
|
own2 = extractor.extract(content, label, { elements }).data;
|
|
17307
17924
|
} catch (err) {
|
|
17308
17925
|
unreadable2 = (errorMessage(err).split("\n")[0] ?? "").replace(/:\s*$/, "");
|
|
17309
17926
|
}
|
|
17310
17927
|
} else {
|
|
17311
|
-
content = await
|
|
17928
|
+
content = await readFile9(absPath, "utf8");
|
|
17312
17929
|
try {
|
|
17313
17930
|
own2 = extractor.extract(content, label, { elements }).data;
|
|
17314
17931
|
} catch (err) {
|
|
@@ -17749,7 +18366,7 @@ function assertNoStrandedEntries(m, index, pages2, configDir, fileOf) {
|
|
|
17749
18366
|
}
|
|
17750
18367
|
async function readManifestText(path, file, perPage) {
|
|
17751
18368
|
try {
|
|
17752
|
-
return await
|
|
18369
|
+
return await readFile9(path, "utf8");
|
|
17753
18370
|
} catch (err) {
|
|
17754
18371
|
if (perPage && isMissing(err)) return null;
|
|
17755
18372
|
throw new DocmetaError(`Manifest ${file} could not be read: ${errorMessage(err)}`);
|
|
@@ -17779,7 +18396,7 @@ function keyLines2(text2, join12) {
|
|
|
17779
18396
|
async function configTarget(ctx, configDir) {
|
|
17780
18397
|
if (ctx.configPath !== void 0) {
|
|
17781
18398
|
try {
|
|
17782
|
-
const text2 = await
|
|
18399
|
+
const text2 = await readFile9(ctx.configPath, "utf8");
|
|
17783
18400
|
return { path: ctx.configPath, text: text2, disk: text2 };
|
|
17784
18401
|
} catch (err) {
|
|
17785
18402
|
if (err.code !== "ENOENT") {
|
|
@@ -17793,7 +18410,7 @@ async function configTarget(ctx, configDir) {
|
|
|
17793
18410
|
for (const name2 of FAMILY_CONFIG_NAMES) {
|
|
17794
18411
|
const path = join9(configDir, name2);
|
|
17795
18412
|
try {
|
|
17796
|
-
const text2 = await
|
|
18413
|
+
const text2 = await readFile9(path, "utf8");
|
|
17797
18414
|
return { path, text: text2, disk: text2 };
|
|
17798
18415
|
} catch {
|
|
17799
18416
|
}
|
|
@@ -17979,7 +18596,7 @@ async function applyRelocation(ctx, plan, io = {}) {
|
|
|
17979
18596
|
for (const w of plan.writes) {
|
|
17980
18597
|
let now;
|
|
17981
18598
|
try {
|
|
17982
|
-
now = await
|
|
18599
|
+
now = await readFile9(w.path, "utf8");
|
|
17983
18600
|
} catch (err) {
|
|
17984
18601
|
if (err.code !== "ENOENT") {
|
|
17985
18602
|
throw new DocmetaError(`${label(w)} could not be read: ${errorMessage(err)}`);
|
|
@@ -18812,7 +19429,7 @@ async function runValidate(opts) {
|
|
|
18812
19429
|
await processOne(STDIN_LABEL, content, forcedExtractor.extensions[0] ?? "");
|
|
18813
19430
|
}
|
|
18814
19431
|
for (const file of files) {
|
|
18815
|
-
const content = await
|
|
19432
|
+
const content = await readFile10(resolve19(base, file), "utf8");
|
|
18816
19433
|
await processOne(file, content, extname4(file));
|
|
18817
19434
|
}
|
|
18818
19435
|
if (unverified > 0) opts.onNotice?.(unverifiedWarning(unverified));
|
|
@@ -18958,7 +19575,7 @@ async function runValidate(opts) {
|
|
|
18958
19575
|
}
|
|
18959
19576
|
|
|
18960
19577
|
// src/meta/commands/get.ts
|
|
18961
|
-
import { readFile as
|
|
19578
|
+
import { readFile as readFile11 } from "node:fs/promises";
|
|
18962
19579
|
import { resolve as resolve20, extname as extname5 } from "node:path";
|
|
18963
19580
|
async function runGet(opts) {
|
|
18964
19581
|
const cwd = opts.cwd ?? process.cwd();
|
|
@@ -19104,7 +19721,7 @@ async function runGet(opts) {
|
|
|
19104
19721
|
await readOne(STDIN_LABEL, opts.stdinContent ?? "", forced.extensions[0] ?? "");
|
|
19105
19722
|
}
|
|
19106
19723
|
for (const file of files) {
|
|
19107
|
-
const content = await
|
|
19724
|
+
const content = await readFile11(resolve20(base, file), "utf8");
|
|
19108
19725
|
await readOne(file, content, extname5(file));
|
|
19109
19726
|
}
|
|
19110
19727
|
if (deriving) {
|
|
@@ -19230,7 +19847,7 @@ function parseJsonPointer(pointer) {
|
|
|
19230
19847
|
|
|
19231
19848
|
// src/meta/commands/schemas.ts
|
|
19232
19849
|
import { existsSync as existsSync4 } from "node:fs";
|
|
19233
|
-
import { mkdir as mkdir3, readFile as
|
|
19850
|
+
import { mkdir as mkdir3, readFile as readFile12 } from "node:fs/promises";
|
|
19234
19851
|
import { dirname as dirname10, extname as extname6, isAbsolute as isAbsolute10, join as join10, relative as relative16, resolve as resolve21, sep as sep10 } from "node:path";
|
|
19235
19852
|
import { parseDocument as parseDocument8, parse as parseYaml6, stringify as stringify4 } from "yaml";
|
|
19236
19853
|
function getSchemasInfo(registered2) {
|
|
@@ -19350,7 +19967,7 @@ async function runVendorSchema(opts) {
|
|
|
19350
19967
|
}
|
|
19351
19968
|
let unchanged = false;
|
|
19352
19969
|
if (existsSync4(absFile)) {
|
|
19353
|
-
const current = await
|
|
19970
|
+
const current = await readFile12(absFile);
|
|
19354
19971
|
unchanged = bytes.equals(current);
|
|
19355
19972
|
if (!unchanged && !folded.replaced) {
|
|
19356
19973
|
throw new DocmetaError(
|
|
@@ -19360,7 +19977,7 @@ async function runVendorSchema(opts) {
|
|
|
19360
19977
|
}
|
|
19361
19978
|
await mkdir3(absDir, { recursive: true });
|
|
19362
19979
|
await writeFileAtomic(absFile, bytes);
|
|
19363
|
-
const existing = loaded ? await
|
|
19980
|
+
const existing = loaded ? await readFile12(configPath, "utf8") : null;
|
|
19364
19981
|
const section = loaded ? loaded.section : META_SECTION;
|
|
19365
19982
|
const text2 = renderConfig(existing, folded.entries, section);
|
|
19366
19983
|
reparseConfig(text2, posixRelative(cwd, configPath) || DEFAULT_CONFIG_NAME, section);
|
|
@@ -19612,7 +20229,7 @@ async function runInferSchema(opts) {
|
|
|
19612
20229
|
await scanOne(STDIN_LABEL, opts.stdinContent ?? "", forced.extensions[0] ?? "");
|
|
19613
20230
|
}
|
|
19614
20231
|
for (const file of files) {
|
|
19615
|
-
const content = await
|
|
20232
|
+
const content = await readFile12(resolve21(base, file), "utf8");
|
|
19616
20233
|
await scanOne(file, content, extname6(file));
|
|
19617
20234
|
}
|
|
19618
20235
|
for (const u of unreadable2) {
|
|
@@ -19673,7 +20290,7 @@ async function runInferSchema(opts) {
|
|
|
19673
20290
|
// src/meta/commands/query.ts
|
|
19674
20291
|
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
19675
20292
|
import { existsSync as existsSync5 } from "node:fs";
|
|
19676
|
-
import { mkdir as mkdir4, open as open2, readFile as
|
|
20293
|
+
import { mkdir as mkdir4, open as open2, readFile as readFile13, rename as rename3, rm as rm3 } from "node:fs/promises";
|
|
19677
20294
|
import { dirname as dirname11, isAbsolute as isAbsolute11, resolve as resolve22, extname as extname7, sep as sep11 } from "node:path";
|
|
19678
20295
|
|
|
19679
20296
|
// src/shared/prompt.ts
|
|
@@ -20031,7 +20648,7 @@ async function runQuery(opts) {
|
|
|
20031
20648
|
await readOne(STDIN_LABEL, opts.stdinContent ?? "", ext);
|
|
20032
20649
|
}
|
|
20033
20650
|
for (const file of files) {
|
|
20034
|
-
const content = await
|
|
20651
|
+
const content = await readFile13(resolve22(base, file), "utf8");
|
|
20035
20652
|
await readOne(file, content, extname7(file));
|
|
20036
20653
|
}
|
|
20037
20654
|
const db = opts.db === void 0 ? void 0 : { resolved: resolve22(cwd, opts.db), display: opts.db };
|
|
@@ -20691,7 +21308,7 @@ async function loadSetMembers(refs, ctx) {
|
|
|
20691
21308
|
seenFiles.add(canon);
|
|
20692
21309
|
let text2;
|
|
20693
21310
|
try {
|
|
20694
|
-
text2 = await
|
|
21311
|
+
text2 = await readFile13(abs, "utf8");
|
|
20695
21312
|
} catch {
|
|
20696
21313
|
throw new DocmetaError(
|
|
20697
21314
|
`Schema file not found: "${ref}" (looked at ${abs}).`
|
|
@@ -21048,7 +21665,7 @@ async function planConfigEdit(ctx, edit, runRefs) {
|
|
|
21048
21665
|
if (configPath === void 0 || configDir === void 0) {
|
|
21049
21666
|
return { changes: [], repointed: false };
|
|
21050
21667
|
}
|
|
21051
|
-
const text2 = await
|
|
21668
|
+
const text2 = await readFile13(configPath, "utf8");
|
|
21052
21669
|
const doc = parseDocument10(stripBom2(text2));
|
|
21053
21670
|
const display = displayPath(ctx, configPath);
|
|
21054
21671
|
const rawRefOf = (item) => {
|
|
@@ -21515,7 +22132,7 @@ async function planManifestEdits(changes, entries, ctx, renameHints) {
|
|
|
21515
22132
|
let text2;
|
|
21516
22133
|
let expected;
|
|
21517
22134
|
try {
|
|
21518
|
-
text2 = await
|
|
22135
|
+
text2 = await readFile13(home.absPath, "utf8");
|
|
21519
22136
|
expected = text2;
|
|
21520
22137
|
} catch (err) {
|
|
21521
22138
|
if (!home.perPage || !isMissing(err)) {
|
|
@@ -21951,7 +22568,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
|
|
|
21951
22568
|
}
|
|
21952
22569
|
const entry = byLabel.get(label);
|
|
21953
22570
|
if (!entry) throw new DocmetaError(`No loaded entry for "${label}".`);
|
|
21954
|
-
const content = await
|
|
22571
|
+
const content = await readFile13(path, "utf8");
|
|
21955
22572
|
const members = ctx.memberships(label);
|
|
21956
22573
|
const current = (await mergeWithMarks(
|
|
21957
22574
|
label,
|
|
@@ -22023,7 +22640,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
|
|
|
22023
22640
|
}
|
|
22024
22641
|
let now;
|
|
22025
22642
|
try {
|
|
22026
|
-
now = await
|
|
22643
|
+
now = await readFile13(w.path, "utf8");
|
|
22027
22644
|
} catch {
|
|
22028
22645
|
now = void 0;
|
|
22029
22646
|
}
|
|
@@ -22036,7 +22653,7 @@ async function applyChanges(changes, entries, ctx, schemaPlan, manifestWrites =
|
|
|
22036
22653
|
for (const m of manifestWrites) {
|
|
22037
22654
|
let now;
|
|
22038
22655
|
try {
|
|
22039
|
-
now = await
|
|
22656
|
+
now = await readFile13(m.path, "utf8");
|
|
22040
22657
|
} catch {
|
|
22041
22658
|
now = null;
|
|
22042
22659
|
}
|
|
@@ -22169,7 +22786,7 @@ function skipExpression(sql, from) {
|
|
|
22169
22786
|
}
|
|
22170
22787
|
|
|
22171
22788
|
// src/meta/commands/fill.ts
|
|
22172
|
-
import { readFile as
|
|
22789
|
+
import { readFile as readFile16 } from "node:fs/promises";
|
|
22173
22790
|
import { resolve as resolve24, extname as extname9, join as join11 } from "node:path";
|
|
22174
22791
|
import {
|
|
22175
22792
|
completeValidatedJSON,
|
|
@@ -22589,7 +23206,7 @@ function single(alternatives2) {
|
|
|
22589
23206
|
}
|
|
22590
23207
|
|
|
22591
23208
|
// src/meta/commands/fill-hints.ts
|
|
22592
|
-
import { readFile as
|
|
23209
|
+
import { readFile as readFile14 } from "node:fs/promises";
|
|
22593
23210
|
import { extname as extname8, resolve as resolve23 } from "node:path";
|
|
22594
23211
|
|
|
22595
23212
|
// src/shared/reference-fields.ts
|
|
@@ -22703,7 +23320,7 @@ async function readIds(collection, opts) {
|
|
|
22703
23320
|
const path = resolve23(opts.configDir, file);
|
|
22704
23321
|
let id;
|
|
22705
23322
|
try {
|
|
22706
|
-
id = extractor.extract(await
|
|
23323
|
+
id = extractor.extract(await readFile14(path, "utf8"), file).data.id;
|
|
22707
23324
|
} catch {
|
|
22708
23325
|
continue;
|
|
22709
23326
|
}
|
|
@@ -22722,7 +23339,7 @@ function termLabelSource() {
|
|
|
22722
23339
|
}
|
|
22723
23340
|
|
|
22724
23341
|
// src/meta/core/manifest-writes.ts
|
|
22725
|
-
import { readFile as
|
|
23342
|
+
import { readFile as readFile15 } from "node:fs/promises";
|
|
22726
23343
|
var manifestCodec = {
|
|
22727
23344
|
apply(text2, op) {
|
|
22728
23345
|
const where = { entry: op.entry, key: op.key, join: op.join, file: op.file };
|
|
@@ -22738,7 +23355,7 @@ function applyManifestOp(text2, op) {
|
|
|
22738
23355
|
async function holdManifestFile(path, file, perPage = false) {
|
|
22739
23356
|
let before;
|
|
22740
23357
|
try {
|
|
22741
|
-
before = await
|
|
23358
|
+
before = await readFile15(path, "utf8");
|
|
22742
23359
|
} catch (err) {
|
|
22743
23360
|
if (perPage && isMissing(err)) return heldManifest(path, file, "", true);
|
|
22744
23361
|
throw new DocmetaError(`Manifest ${file} could not be read: ${errorMessage(err)}`);
|
|
@@ -22755,7 +23372,7 @@ async function settleManifest(held, io = {}) {
|
|
|
22755
23372
|
codec: manifestCodec,
|
|
22756
23373
|
// A per-page manifest (proposal 0058) may be the first file in its directory.
|
|
22757
23374
|
write: io.write ?? ((at2, text2) => writeFileAtomic(at2, text2, { createParents: true })),
|
|
22758
|
-
read: io.read ?? ((at2) =>
|
|
23375
|
+
read: io.read ?? ((at2) => readFile15(at2, "utf8")),
|
|
22759
23376
|
toError: (message) => new DocmetaError(message)
|
|
22760
23377
|
});
|
|
22761
23378
|
rebaseline(held);
|
|
@@ -23869,7 +24486,7 @@ async function runFill(opts) {
|
|
|
23869
24486
|
const prepareAll = async () => ({
|
|
23870
24487
|
stdin: usingStdin ? await prepareOne("<stdin>", opts.stdinContent ?? "", forcedExtractor?.extensions[0] ?? "") : void 0,
|
|
23871
24488
|
files: await mapConcurrent(files, concurrency, async (file) => {
|
|
23872
|
-
const content = await
|
|
24489
|
+
const content = await readFile16(resolve24(base, file), "utf8");
|
|
23873
24490
|
return prepareOne(file, content, extname9(file));
|
|
23874
24491
|
})
|
|
23875
24492
|
});
|
|
@@ -24287,7 +24904,7 @@ async function mapConcurrent(items2, limit, fn) {
|
|
|
24287
24904
|
}
|
|
24288
24905
|
|
|
24289
24906
|
// src/meta/commands/derive.ts
|
|
24290
|
-
import { readFile as
|
|
24907
|
+
import { readFile as readFile17 } from "node:fs/promises";
|
|
24291
24908
|
import { extname as extname10, relative as relative17, resolve as resolve25, sep as sep12 } from "node:path";
|
|
24292
24909
|
var GENERATED_BY_ENV = "MANNI_GENERATED_BY";
|
|
24293
24910
|
var SOURCE_HINT = "narrow --sources or --fields";
|
|
@@ -24440,7 +25057,7 @@ async function runDerive(opts) {
|
|
|
24440
25057
|
});
|
|
24441
25058
|
continue;
|
|
24442
25059
|
}
|
|
24443
|
-
const content = await
|
|
25060
|
+
const content = await readFile17(absPath, "utf8");
|
|
24444
25061
|
const elements = resolveElements(label, config, membersFor(label));
|
|
24445
25062
|
try {
|
|
24446
25063
|
loaded2.set(label, {
|
|
@@ -25635,10 +26252,10 @@ function cellFrom(value) {
|
|
|
25635
26252
|
}
|
|
25636
26253
|
|
|
25637
26254
|
export {
|
|
25638
|
-
__export,
|
|
25639
26255
|
package_default,
|
|
25640
26256
|
palette,
|
|
25641
26257
|
shouldColor,
|
|
26258
|
+
colorFor,
|
|
25642
26259
|
matchesFileGlob,
|
|
25643
26260
|
hasPagePlaceholder,
|
|
25644
26261
|
pageManifestPath,
|
|
@@ -25653,8 +26270,6 @@ export {
|
|
|
25653
26270
|
generateEncryptionKey,
|
|
25654
26271
|
encryptValue,
|
|
25655
26272
|
decryptValue,
|
|
25656
|
-
ToolError,
|
|
25657
|
-
errorMessage,
|
|
25658
26273
|
assertKnownProvider,
|
|
25659
26274
|
assertModelHasProvider,
|
|
25660
26275
|
PROVIDERS_KEY,
|
|
@@ -25746,6 +26361,7 @@ export {
|
|
|
25746
26361
|
__default31 as __default,
|
|
25747
26362
|
__default33 as __default2,
|
|
25748
26363
|
__default34 as __default3,
|
|
26364
|
+
__default48 as __default4,
|
|
25749
26365
|
listBuiltins,
|
|
25750
26366
|
classifyRef,
|
|
25751
26367
|
fetchSchemaBytes,
|
|
@@ -25775,6 +26391,7 @@ export {
|
|
|
25775
26391
|
loadMetaSection,
|
|
25776
26392
|
resolveRunConfig,
|
|
25777
26393
|
renderSarif,
|
|
26394
|
+
xmlEscape,
|
|
25778
26395
|
renderJunit,
|
|
25779
26396
|
REPORT_FORMATS,
|
|
25780
26397
|
formatList,
|
|
@@ -25794,6 +26411,7 @@ export {
|
|
|
25794
26411
|
rebaseable,
|
|
25795
26412
|
settle,
|
|
25796
26413
|
isMissing,
|
|
26414
|
+
readManifestOrEmpty,
|
|
25797
26415
|
EXTERNAL_METADATA_FETCH_TIMEOUT_MS,
|
|
25798
26416
|
EXTERNAL_METADATA_FETCH_MAX_BYTES,
|
|
25799
26417
|
fetchExternalMetadata,
|
|
@@ -25826,6 +26444,8 @@ export {
|
|
|
25826
26444
|
pageSchemaSet,
|
|
25827
26445
|
marksValidator,
|
|
25828
26446
|
configMarks,
|
|
26447
|
+
metaSection,
|
|
26448
|
+
familyMarks,
|
|
25829
26449
|
relocateFailed,
|
|
25830
26450
|
relocationContext,
|
|
25831
26451
|
keyHome,
|
|
@@ -25895,4 +26515,4 @@ export {
|
|
|
25895
26515
|
renderQuery,
|
|
25896
26516
|
renderQueryCsv
|
|
25897
26517
|
};
|
|
25898
|
-
//# sourceMappingURL=chunk-
|
|
26518
|
+
//# sourceMappingURL=chunk-ZQBTK3DO.js.map
|