explico 0.13.1 → 0.15.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/CHANGELOG.md +990 -1
- package/README.md +200 -30
- package/dist/compiler/astro.d.ts +15 -2
- package/dist/compiler/astro.js +40 -11
- package/dist/compiler/cli-main.d.ts +100 -0
- package/dist/compiler/cli-main.js +433 -0
- package/dist/compiler/cli-reference.d.ts +50 -0
- package/dist/compiler/cli-reference.js +213 -0
- package/dist/compiler/cli-verbs.d.ts +45 -0
- package/dist/compiler/cli-verbs.js +224 -0
- package/dist/compiler/cli-verify.d.ts +51 -0
- package/dist/compiler/cli-verify.js +151 -0
- package/dist/compiler/cli.d.ts +408 -24
- package/dist/compiler/cli.js +1328 -8
- package/dist/compiler/collections.d.ts +88 -1
- package/dist/compiler/collections.js +170 -25
- package/dist/compiler/content-release.d.ts +49 -0
- package/dist/compiler/content-release.js +63 -0
- package/dist/compiler/content-schemas.d.ts +2 -2
- package/dist/compiler/course-config.d.ts +1 -1
- package/dist/compiler/course-config.js +105 -1
- package/dist/compiler/decks.d.ts +161 -0
- package/dist/compiler/decks.js +235 -0
- package/dist/compiler/exports/combined-html.d.ts +5 -1
- package/dist/compiler/exports/deck-fit.d.ts +55 -0
- package/dist/compiler/exports/deck-fit.js +90 -0
- package/dist/compiler/exports/export-chapters.d.ts +37 -6
- package/dist/compiler/exports/export-chapters.js +64 -5
- package/dist/compiler/exports/export-pages.d.ts +30 -3
- package/dist/compiler/exports/export-pages.js +24 -1
- package/dist/compiler/exports/latex/beamerthemeexplico.sty +124 -0
- package/dist/compiler/exports/latex/cache.d.ts +78 -0
- package/dist/compiler/exports/latex/cache.js +129 -0
- package/dist/compiler/exports/latex/capture.d.ts +10 -1
- package/dist/compiler/exports/latex/capture.js +3 -1
- package/dist/compiler/exports/latex/compile.d.ts +13 -2
- package/dist/compiler/exports/latex/compile.js +12 -1
- package/dist/compiler/exports/latex/deck.d.ts +92 -0
- package/dist/compiler/exports/latex/deck.js +349 -0
- package/dist/compiler/exports/latex/document.d.ts +51 -6
- package/dist/compiler/exports/latex/document.js +71 -12
- package/dist/compiler/exports/latex/explico-common.sty +198 -0
- package/dist/compiler/exports/latex/explico.cls +13 -183
- package/dist/compiler/exports/latex/serialize.d.ts +60 -4
- package/dist/compiler/exports/latex/serialize.js +4 -2
- package/dist/compiler/exports/latex-export.d.ts +24 -2
- package/dist/compiler/exports/latex-export.js +107 -26
- package/dist/compiler/exports/markdown/serialize.d.ts +24 -4
- package/dist/compiler/exports/markdown/serialize.js +85 -8
- package/dist/compiler/exports/markdown-export.d.ts +6 -1
- package/dist/compiler/exports/markdown-export.js +50 -11
- package/dist/compiler/exports/standalone-html.d.ts +10 -5
- package/dist/compiler/exports/standalone-html.js +3 -3
- package/dist/compiler/exports/static-tree.d.ts +38 -1
- package/dist/compiler/exports/static-tree.js +120 -4
- package/dist/compiler/knowledge-version.d.ts +26 -2
- package/dist/compiler/knowledge-version.js +27 -17
- package/dist/compiler/lesson-derivation.d.ts +143 -6
- package/dist/compiler/lesson-derivation.js +145 -13
- package/dist/compiler/manifest.d.ts +133 -4
- package/dist/compiler/manifest.js +364 -58
- package/dist/compiler/page-versions.d.ts +184 -0
- package/dist/compiler/page-versions.js +217 -0
- package/dist/compiler/render-diagnostics.d.ts +5 -1
- package/dist/compiler/resolution-report.d.ts +24 -6
- package/dist/compiler/resolution-report.js +22 -4
- package/dist/compiler/validate-content.d.ts +7 -0
- package/dist/compiler/validate-content.js +160 -0
- package/dist/{course-config-rRtME5UV.d.ts → course-config-BLtIdkei.d.ts} +164 -1
- package/dist/curriculum/competency-graph.d.ts +54 -0
- package/dist/curriculum/competency-graph.js +41 -0
- package/dist/reference/base-library.d.mts +8 -0
- package/dist/reference/base-library.mjs +19 -0
- package/dist/reference/consistency.d.ts +8 -4
- package/dist/reference/consistency.js +82 -26
- package/dist/reference/deck-remark.d.mts +123 -0
- package/dist/reference/deck-remark.mjs +600 -0
- package/dist/reference/deck-source.d.ts +107 -0
- package/dist/reference/deck-source.js +140 -0
- package/dist/reference/decks-validate.d.ts +133 -0
- package/dist/reference/decks-validate.js +359 -0
- package/dist/reference/derived-entries.d.ts +5 -1
- package/dist/reference/diagram-fit.d.ts +6 -2
- package/dist/reference/diagram-fit.js +5 -1
- package/dist/reference/figure-symbols.d.ts +23 -6
- package/dist/reference/figure-symbols.js +51 -15
- package/dist/reference/float-name.d.ts +43 -0
- package/dist/reference/float-name.js +58 -0
- package/dist/reference/folds-validate.d.ts +1 -1
- package/dist/reference/gate-abbreviations.d.ts +1 -1
- package/dist/reference/gate-indices.js +5 -4
- package/dist/reference/gate-math.d.ts +29 -2
- package/dist/reference/gate-math.js +99 -18
- package/dist/reference/gate-part-pages.d.ts +1 -1
- package/dist/reference/lab-katex-validate.d.ts +10 -6
- package/dist/reference/lab-katex-validate.js +17 -9
- package/dist/reference/lab-math-scope.js +29 -4
- package/dist/reference/math-glyphs.d.mts +25 -0
- package/dist/reference/math-glyphs.mjs +189 -25
- package/dist/reference/page-notation.d.ts +22 -3
- package/dist/reference/page-notation.js +32 -10
- package/dist/reference/references.d.ts +14 -1
- package/dist/reference/references.js +13 -0
- package/dist/reference/registry-scope.d.mts +33 -0
- package/dist/reference/registry-scope.mjs +34 -0
- package/dist/reference/registry.js +29 -10
- package/dist/reference/rehype-deck.d.mts +6 -0
- package/dist/reference/rehype-deck.mjs +286 -0
- package/dist/reference/rehype-heading-anchors.d.mts +20 -0
- package/dist/reference/rehype-heading-anchors.mjs +48 -6
- package/dist/reference/remark-notation.mjs +249 -40
- package/dist/reference/source-lines.d.mts +12 -0
- package/dist/reference/source-lines.mjs +65 -0
- package/dist/reference/types.d.ts +28 -0
- package/dist/rules/catalog.d.ts +21 -4
- package/dist/rules/catalog.js +237 -2
- package/dist/rules/course-rules.d.ts +5 -1
- package/dist/rules/course-rules.js +17 -3
- package/dist/rules/course-rules.schema.json +12 -0
- package/dist/rules/in-effect.d.ts +13 -3
- package/dist/rules/in-effect.js +34 -10
- package/dist/rules/rules.schema.json +280 -1
- package/dist/rules/settings.d.ts +1 -1
- package/dist/session/PreferenceStore.d.ts +6 -0
- package/dist/session/PreferenceStore.js +18 -1
- package/dist/session/deck-memory.d.ts +116 -0
- package/dist/session/deck-memory.js +143 -0
- package/dist/session/reading-memory.d.ts +96 -0
- package/dist/session/reading-memory.js +133 -0
- package/docs/VERSIONING.md +21 -18
- package/docs/authoring/README.md +31 -9
- package/docs/authoring/agents.md +72 -18
- package/docs/authoring/cli-reference.json +2172 -0
- package/docs/authoring/cli.md +887 -0
- package/docs/authoring/components.md +15 -0
- package/docs/authoring/deck.md +612 -0
- package/docs/authoring/migrating.md +1195 -16
- package/docs/authoring/notation.md +49 -6
- package/docs/authoring/structure.md +80 -1
- package/docs/authoring/versioning.md +56 -3
- package/docs/authoring/visualizations.md +7 -2
- package/docs/course-agent/AGENTS.md +40 -0
- package/docs/course-agent/agents/rules-reviewer.md +33 -0
- package/docs/course-agent/skills/draft-lesson/SKILL.md +38 -0
- package/docs/course-agent/skills/migrate-course/SKILL.md +32 -0
- package/docs/course-agent/skills/release-content/SKILL.md +26 -0
- package/docs/diagram-scaling.md +148 -0
- package/docs/privacy.md +59 -0
- package/package.json +8 -2
- package/src/compiler/astro.ts +60 -21
- package/src/compiler/cli-main.ts +557 -0
- package/src/compiler/cli-reference.ts +285 -0
- package/src/compiler/cli-verbs.ts +270 -0
- package/src/compiler/cli-verify.ts +241 -0
- package/src/compiler/cli.ts +2119 -170
- package/src/compiler/collections.ts +284 -25
- package/src/compiler/content-release.ts +91 -0
- package/src/compiler/course-config.ts +267 -0
- package/src/compiler/decks.ts +455 -0
- package/src/compiler/exports/deck-fit.ts +127 -0
- package/src/compiler/exports/export-chapters.ts +105 -6
- package/src/compiler/exports/export-pages.ts +46 -2
- package/src/compiler/exports/latex/beamerthemeexplico.sty +124 -0
- package/src/compiler/exports/latex/cache.ts +183 -0
- package/src/compiler/exports/latex/capture.ts +5 -2
- package/src/compiler/exports/latex/compile.ts +18 -0
- package/src/compiler/exports/latex/deck.ts +419 -0
- package/src/compiler/exports/latex/document.ts +117 -21
- package/src/compiler/exports/latex/explico-common.sty +198 -0
- package/src/compiler/exports/latex/explico.cls +13 -183
- package/src/compiler/exports/latex/serialize.ts +25 -21
- package/src/compiler/exports/latex/texlive-packages.txt +6 -2
- package/src/compiler/exports/latex-export.ts +187 -45
- package/src/compiler/exports/markdown/serialize.ts +118 -9
- package/src/compiler/exports/markdown-export.ts +56 -11
- package/src/compiler/exports/standalone-html.ts +8 -7
- package/src/compiler/exports/static-tree.ts +175 -3
- package/src/compiler/knowledge-version.ts +56 -21
- package/src/compiler/lesson-derivation.ts +282 -16
- package/src/compiler/manifest.ts +568 -63
- package/src/compiler/page-versions.ts +401 -0
- package/src/compiler/resolution-report.ts +38 -7
- package/src/compiler/validate-content.ts +215 -0
- package/src/components/CourseContents.astro +124 -6
- package/src/components/CurriculumMap.astro +49 -1
- package/src/components/FloatIndex.astro +1 -1
- package/src/components/PartOverview.astro +51 -5
- package/src/components/assessments/AssessmentSet.astro +41 -15
- package/src/components/block-heading.ts +15 -6
- package/src/components/card-carry.ts +7 -4
- package/src/components/card-manager.ts +14 -2
- package/src/components/card-memory.ts +13 -9
- package/src/components/deck/DeckEnhancer.astro +13 -0
- package/src/components/deck/deck-context.ts +104 -0
- package/src/components/deck/deck-controller.ts +1287 -0
- package/src/components/deck/deck-map.ts +91 -0
- package/src/components/deck-lane.ts +163 -0
- package/src/components/diagram/Diagram.astro +131 -86
- package/src/components/disclosure/persisted-disclosure.ts +9 -1
- package/src/components/figure/Figure.astro +7 -2
- package/src/components/figure/FloatCaption.astro +5 -3
- package/src/components/fold/Fold.astro +2 -2
- package/src/components/notation/NotationFormula.astro +81 -11
- package/src/components/notation/NotationGlossary.astro +132 -1
- package/src/components/notation/NotationLayer.astro +15 -7
- package/src/components/starlight/AboutPanel.astro +186 -3
- package/src/components/starlight/CollapsibleSections.astro +24 -3
- package/src/components/starlight/DiagramEnhancer.astro +5 -1
- package/src/components/starlight/HeadingAnchorEnhancer.astro +1 -1
- package/src/components/starlight/LayoutHeader.astro +17 -0
- package/src/components/starlight/LayoutPageTitle.astro +110 -0
- package/src/components/starlight/LayoutSidebar.astro +807 -21
- package/src/components/starlight/LayoutSocialIcons.astro +62 -6
- package/src/components/starlight/LessonExportActions.astro +27 -9
- package/src/components/starlight/LessonFooter.astro +59 -0
- package/src/components/starlight/ReadingMemoryNotice.astro +114 -0
- package/src/components/starlight/TextSizeControl.astro +24 -13
- package/src/components/starlight/page-marks.ts +139 -0
- package/src/components/starlight/section-summary.ts +1 -1
- package/src/components/starlight/sidebar-editions.ts +245 -0
- package/src/components/table/Table.astro +15 -7
- package/src/content-config.ts +87 -1
- package/src/curriculum/competency-graph.ts +95 -0
- package/src/reference/base-library.mjs +19 -0
- package/src/reference/consistency.ts +137 -39
- package/src/reference/deck-remark.mjs +600 -0
- package/src/reference/deck-source.ts +273 -0
- package/src/reference/decks-validate.ts +604 -0
- package/src/reference/diagram-fit.ts +18 -4
- package/src/reference/diagram-layout.ts +3 -1
- package/src/reference/figure-symbols.ts +108 -31
- package/src/reference/folds-validate.ts +1 -1
- package/src/reference/gate-indices.ts +5 -3
- package/src/reference/gate-math.ts +169 -25
- package/src/reference/lab-katex-validate.ts +30 -15
- package/src/reference/lab-math-scope.ts +34 -3
- package/src/reference/math-glyphs.mjs +189 -25
- package/src/reference/page-notation.ts +69 -15
- package/src/reference/references.ts +28 -0
- package/src/reference/registry-scope.mjs +34 -0
- package/src/reference/registry.ts +41 -11
- package/src/reference/rehype-deck.mjs +286 -0
- package/src/reference/rehype-heading-anchors.mjs +48 -6
- package/src/reference/remark-notation.mjs +249 -40
- package/src/reference/source-lines.mjs +65 -0
- package/src/reference/types.ts +28 -0
- package/src/rules/catalog.ts +274 -4
- package/src/rules/course-rules.ts +21 -1
- package/src/rules/in-effect.ts +58 -11
- package/src/session/PreferenceStore.ts +23 -0
- package/src/session/deck-memory.ts +263 -0
- package/src/session/reading-memory.ts +243 -0
- package/src/styles/deck.css +1150 -0
- package/src/styles/global.css +958 -27
- package/src/styles/zones.css +277 -0
- /package/src/{components → reference}/float-name.ts +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { ContentCliError, authoringDocsDir } from "./cli.js";
|
|
4
|
+
import { CONTENT_VERBS, usageLine } from "./cli-verbs.js";
|
|
5
|
+
const CLI_REFERENCE_FILE = "cli-reference.json";
|
|
6
|
+
function loadCliReference() {
|
|
7
|
+
const dir = authoringDocsDir();
|
|
8
|
+
const file = dir === void 0 ? void 0 : join(dir, CLI_REFERENCE_FILE);
|
|
9
|
+
if (file === void 0 || !existsSync(file)) {
|
|
10
|
+
throw new ContentCliError("unknown-command", `No ${CLI_REFERENCE_FILE} beside the engine (node_modules/explico/docs/authoring).`);
|
|
11
|
+
}
|
|
12
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
13
|
+
}
|
|
14
|
+
function verbsNamed(word) {
|
|
15
|
+
const hits = CONTENT_VERBS.filter((verb) => verb.verb === word || verb.verb.startsWith(`${word} `));
|
|
16
|
+
if (hits.length === 0) {
|
|
17
|
+
throw new ContentCliError(
|
|
18
|
+
"unknown-command",
|
|
19
|
+
`Unknown verb "${word}". The verbs: ${[...new Set(CONTENT_VERBS.map((verb) => verb.verb.split(" ")[0]))].join(", ")}.`
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
return hits;
|
|
23
|
+
}
|
|
24
|
+
function reachableDefs(name, defs, seen = /* @__PURE__ */ new Set()) {
|
|
25
|
+
if (seen.has(name) || defs[name] === void 0) return seen;
|
|
26
|
+
seen.add(name);
|
|
27
|
+
for (const match of JSON.stringify(defs[name]).matchAll(/"#\/\$defs\/([^"]+)"/g)) reachableDefs(match[1], defs, seen);
|
|
28
|
+
return seen;
|
|
29
|
+
}
|
|
30
|
+
function schemaOf(reference, name) {
|
|
31
|
+
const names = [...reachableDefs(name, reference.$defs)].sort();
|
|
32
|
+
return {
|
|
33
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
34
|
+
$ref: `#/$defs/${name}`,
|
|
35
|
+
$defs: Object.fromEntries(names.map((n) => [n, reference.$defs[n]]))
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function verbHelp(reference, word) {
|
|
39
|
+
return {
|
|
40
|
+
verbs: verbsNamed(word).map((verb) => ({ ...verb, usage: usageLine(verb), schema: schemaOf(reference, verb.json) }))
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function oneLine(text) {
|
|
44
|
+
return typeof text === "string" ? text.replace(/\s+/g, " ").trim() : "";
|
|
45
|
+
}
|
|
46
|
+
function refName(ref) {
|
|
47
|
+
return ref.replace("#/$defs/", "");
|
|
48
|
+
}
|
|
49
|
+
function isObjectShape(schema) {
|
|
50
|
+
return schema.type === "object" && schema.properties !== void 0;
|
|
51
|
+
}
|
|
52
|
+
function typeExpression(schema) {
|
|
53
|
+
if (typeof schema.$ref === "string") return refName(schema.$ref);
|
|
54
|
+
if ("const" in schema) return JSON.stringify(schema.const);
|
|
55
|
+
if (Array.isArray(schema.enum)) return schema.enum.map((value) => JSON.stringify(value)).join(" | ");
|
|
56
|
+
if (Array.isArray(schema.anyOf)) return schema.anyOf.map(typeExpression).join(" | ");
|
|
57
|
+
if (schema.type === "array") {
|
|
58
|
+
const items = typeExpression(schema.items ?? {});
|
|
59
|
+
return / \| /.test(items) ? `(${items})[]` : `${items}[]`;
|
|
60
|
+
}
|
|
61
|
+
if (schema.type === "object") {
|
|
62
|
+
if (schema.properties !== void 0) return "{\u2026}";
|
|
63
|
+
const value = schema.additionalProperties;
|
|
64
|
+
return `Record<string, ${typeof value === "object" && value !== null ? typeExpression(value) : "unknown"}>`;
|
|
65
|
+
}
|
|
66
|
+
if (schema.type === "integer") return "number";
|
|
67
|
+
if (typeof schema.type === "string") return schema.type;
|
|
68
|
+
return "unknown";
|
|
69
|
+
}
|
|
70
|
+
function expandable(schema) {
|
|
71
|
+
if (isObjectShape(schema)) return schema;
|
|
72
|
+
if (schema.type === "array") return expandable(schema.items ?? {});
|
|
73
|
+
if (Array.isArray(schema.anyOf)) {
|
|
74
|
+
const objects = schema.anyOf.map(expandable).filter((s) => s !== void 0);
|
|
75
|
+
return objects.length === 1 ? objects[0] : void 0;
|
|
76
|
+
}
|
|
77
|
+
return void 0;
|
|
78
|
+
}
|
|
79
|
+
function shapeLines(schema, indent = " ") {
|
|
80
|
+
const lines = [];
|
|
81
|
+
const required = new Set(schema.required ?? []);
|
|
82
|
+
for (const [name, raw] of Object.entries(schema.properties ?? {})) {
|
|
83
|
+
const description = oneLine(raw.description);
|
|
84
|
+
lines.push(`${indent}${name}${required.has(name) ? "" : "?"}: ${typeExpression(raw)}${description === "" ? "" : ` \u2014 ${description}`}`);
|
|
85
|
+
const nested = expandable(raw);
|
|
86
|
+
if (nested !== void 0) lines.push(...shapeLines(nested, `${indent} `));
|
|
87
|
+
}
|
|
88
|
+
return lines;
|
|
89
|
+
}
|
|
90
|
+
function defLines(name, schema) {
|
|
91
|
+
const description = oneLine(schema.description);
|
|
92
|
+
const head = `${name}${isObjectShape(schema) ? "" : ` = ${typeExpression(schema)}`}`;
|
|
93
|
+
return [description === "" ? head : `${head} \u2014 ${description}`, ...isObjectShape(schema) ? shapeLines(schema) : []];
|
|
94
|
+
}
|
|
95
|
+
function verbFacts(verb) {
|
|
96
|
+
return [
|
|
97
|
+
["For", verb.when],
|
|
98
|
+
["Prints", verb.prints],
|
|
99
|
+
["Writes", verb.writes],
|
|
100
|
+
["Exits 1", `on a usage error${verb.exit === void 0 ? "" : `, and ${verb.exit}`}`]
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
function typeOrder(verb) {
|
|
104
|
+
return [verb.json, ...Object.keys(verb.schema.$defs).filter((name) => name !== verb.json).sort()];
|
|
105
|
+
}
|
|
106
|
+
function formatVerbHelp(reference, help) {
|
|
107
|
+
const blocks = help.verbs.map((verb) => {
|
|
108
|
+
const lines = [verb.usage, "", ...verbFacts(verb).map(([label, text]) => ` ${`${label}:`.padEnd(9)}${text}`)];
|
|
109
|
+
if (verb.flags.length > 0) {
|
|
110
|
+
lines.push("", "Flags:");
|
|
111
|
+
const width = Math.max(...verb.flags.map((flag) => flag.flag.length));
|
|
112
|
+
for (const flag of verb.flags) lines.push(` ${flag.flag.padEnd(width)} ${flag.description}`);
|
|
113
|
+
}
|
|
114
|
+
lines.push("", `--json prints ${verb.json}:`);
|
|
115
|
+
for (const name of typeOrder(verb)) lines.push(...defLines(name, reference.$defs[name]).map((line) => ` ${line}`), "");
|
|
116
|
+
return lines.join("\n").trimEnd();
|
|
117
|
+
});
|
|
118
|
+
return `${blocks.join("\n\n")}
|
|
119
|
+
|
|
120
|
+
On a failure --json prints ${reference.error}: { "ok": false, "error": { "code", "message" } }.
|
|
121
|
+
`;
|
|
122
|
+
}
|
|
123
|
+
function anchor(name) {
|
|
124
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, "-");
|
|
125
|
+
}
|
|
126
|
+
function cliReferenceMarkdown(reference) {
|
|
127
|
+
const out = [
|
|
128
|
+
"<!-- generated by scripts/agent/gen-cli.mjs from src/compiler/cli-verbs.ts and the report types \u2014 do not edit; `node scripts/agent/gen-cli.mjs` rewrites it, `--check` gates it -->",
|
|
129
|
+
"",
|
|
130
|
+
"# The `content` CLI",
|
|
131
|
+
"",
|
|
132
|
+
"Every verb of `pnpm content`, what it writes, when it exits 1, and the shape",
|
|
133
|
+
"of its `--json`. The same data, with a JSON Schema per type, is",
|
|
134
|
+
"[`cli-reference.json`](cli-reference.json); `pnpm content help <verb> [--json]`",
|
|
135
|
+
"prints one verb of it. Every verb takes `--json`: data only on stdout, and on",
|
|
136
|
+
`a failure \`{ "ok": false, "error": { "code", "message" } }\` ([\`${reference.error}\`](#${anchor(reference.error)})).`,
|
|
137
|
+
"",
|
|
138
|
+
"| Verb | You want to know or do | Writes |",
|
|
139
|
+
"| --- | --- | --- |",
|
|
140
|
+
...reference.verbs.map((verb) => `| [\`${verb.verb}\`](#${anchor(`content ${verb.verb}`)}) | ${verb.when} | ${verb.writes} |`),
|
|
141
|
+
""
|
|
142
|
+
];
|
|
143
|
+
for (const verb of reference.verbs) {
|
|
144
|
+
out.push(`## content ${verb.verb}`, "", "```text", usageLine(verb), "```", "");
|
|
145
|
+
for (const [label, text] of verbFacts(verb)) out.push(`- **${label}:** ${text.replace(/\\explain/g, "`\\explain`")}`);
|
|
146
|
+
out.push("");
|
|
147
|
+
if (verb.flags.length > 0) {
|
|
148
|
+
out.push("| Flag | Effect |", "| --- | --- |");
|
|
149
|
+
for (const flag of verb.flags) out.push(`| \`${flag.flag}\` | ${flag.description} |`);
|
|
150
|
+
out.push("");
|
|
151
|
+
}
|
|
152
|
+
out.push(`\`--json\`: [\`${verb.json}\`](#${anchor(verb.json)})`, "");
|
|
153
|
+
}
|
|
154
|
+
out.push("## The `--json` types", "", "A `?` marks a property that may be absent.", "");
|
|
155
|
+
for (const name of Object.keys(reference.$defs).sort()) {
|
|
156
|
+
out.push(`### ${name}`, "", "```ts", ...defLines(name, reference.$defs[name]), "```", "");
|
|
157
|
+
}
|
|
158
|
+
return `${out.join("\n").trimEnd()}
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
function jsonShapeErrors(schema, value, defs = schema.$defs ?? {}, path = "$") {
|
|
162
|
+
if (typeof schema.$ref === "string") {
|
|
163
|
+
const target = defs[refName(schema.$ref)];
|
|
164
|
+
return target === void 0 ? [`${path}: unknown ${schema.$ref}`] : jsonShapeErrors(target, value, defs, path);
|
|
165
|
+
}
|
|
166
|
+
if ("const" in schema) return value === schema.const ? [] : [`${path}: expected ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}`];
|
|
167
|
+
if (Array.isArray(schema.enum)) {
|
|
168
|
+
return schema.enum.includes(value) ? [] : [`${path}: expected one of ${schema.enum.map((v) => JSON.stringify(v)).join(", ")}, got ${JSON.stringify(value)}`];
|
|
169
|
+
}
|
|
170
|
+
if (Array.isArray(schema.anyOf)) {
|
|
171
|
+
const branches = schema.anyOf.map((branch) => jsonShapeErrors(branch, value, defs, path));
|
|
172
|
+
if (branches.some((errors2) => errors2.length === 0)) return [];
|
|
173
|
+
return [`${path}: matches none of ${typeExpression(schema)} (${branches.map((errors2) => errors2[0]).join("; ")})`];
|
|
174
|
+
}
|
|
175
|
+
const type = schema.type;
|
|
176
|
+
if (type === void 0) return [];
|
|
177
|
+
const actual = value === null ? "null" : Array.isArray(value) ? "array" : typeof value;
|
|
178
|
+
const ok = type === "integer" ? Number.isInteger(value) : type === actual;
|
|
179
|
+
if (!ok) return [`${path}: expected ${type}, got ${actual}`];
|
|
180
|
+
if (type === "array") {
|
|
181
|
+
const items = schema.items ?? {};
|
|
182
|
+
return value.flatMap((item, index) => jsonShapeErrors(items, item, defs, `${path}[${index}]`));
|
|
183
|
+
}
|
|
184
|
+
if (type !== "object") return [];
|
|
185
|
+
const record = value;
|
|
186
|
+
const properties = schema.properties ?? {};
|
|
187
|
+
const errors = [];
|
|
188
|
+
for (const name of schema.required ?? []) {
|
|
189
|
+
if (!(name in record)) errors.push(`${path}.${name}: missing`);
|
|
190
|
+
}
|
|
191
|
+
for (const [name, item] of Object.entries(record)) {
|
|
192
|
+
if (item === void 0) continue;
|
|
193
|
+
const declared = properties[name];
|
|
194
|
+
if (declared !== void 0) errors.push(...jsonShapeErrors(declared, item, defs, `${path}.${name}`));
|
|
195
|
+
else if (schema.additionalProperties === false) errors.push(`${path}.${name}: not in the type`);
|
|
196
|
+
else if (typeof schema.additionalProperties === "object") {
|
|
197
|
+
errors.push(...jsonShapeErrors(schema.additionalProperties, item, defs, `${path}.${name}`));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return errors;
|
|
201
|
+
}
|
|
202
|
+
export {
|
|
203
|
+
CLI_REFERENCE_FILE,
|
|
204
|
+
cliReferenceMarkdown,
|
|
205
|
+
defLines,
|
|
206
|
+
formatVerbHelp,
|
|
207
|
+
jsonShapeErrors,
|
|
208
|
+
loadCliReference,
|
|
209
|
+
schemaOf,
|
|
210
|
+
shapeLines,
|
|
211
|
+
verbHelp,
|
|
212
|
+
verbsNamed
|
|
213
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every `content` verb, as data: its arguments, what it is for, what it
|
|
3
|
+
* prints, what it writes, when it exits non-zero, and the exported type its
|
|
4
|
+
* `--json` prints. The one source for the usage text (`CONTENT_USAGE`),
|
|
5
|
+
* `content help <verb>`, `docs/authoring/cli.md` and
|
|
6
|
+
* `docs/authoring/cli-reference.json` — the last two generated by
|
|
7
|
+
* `scripts/agent/gen-cli.mjs`, which also turns each `json` type name into a
|
|
8
|
+
* JSON Schema from the TypeScript declaration (`--check` in verify and CI).
|
|
9
|
+
*
|
|
10
|
+
* A new verb is a row here, a `case` in `cli-main.ts`, and a regenerated
|
|
11
|
+
* reference; the `--json` contract test in the playground runs every
|
|
12
|
+
* read-only row against the course and validates its output.
|
|
13
|
+
*/
|
|
14
|
+
/** One flag a verb takes. */
|
|
15
|
+
interface ContentVerbFlag {
|
|
16
|
+
/** As typed: `--lesson <id>`, `--write`. */
|
|
17
|
+
readonly flag: string;
|
|
18
|
+
readonly description: string;
|
|
19
|
+
}
|
|
20
|
+
/** One verb's row. */
|
|
21
|
+
interface ContentVerb {
|
|
22
|
+
/** The command word(s): `symbol`, `new lesson`. */
|
|
23
|
+
readonly verb: string;
|
|
24
|
+
/** What follows the verb on the usage line, `--json` left out (every verb takes it). */
|
|
25
|
+
readonly args: string;
|
|
26
|
+
/** What you want to know or do when you reach for it. */
|
|
27
|
+
readonly when: string;
|
|
28
|
+
/** What it prints as text. */
|
|
29
|
+
readonly prints: string;
|
|
30
|
+
/** The flags, each once; a positional argument is described in `prints` or `when`. */
|
|
31
|
+
readonly flags: readonly ContentVerbFlag[];
|
|
32
|
+
/** What it changes on disk. */
|
|
33
|
+
readonly writes: string;
|
|
34
|
+
/** When it exits 1, beyond a usage error. */
|
|
35
|
+
readonly exit?: string;
|
|
36
|
+
/** The type its `--json` prints, by its exported name in `explico/compiler/cli`, `cli-main` or `cli-verify`. */
|
|
37
|
+
readonly json: string;
|
|
38
|
+
}
|
|
39
|
+
declare const CONTENT_VERBS: readonly ContentVerb[];
|
|
40
|
+
/** One usage line: `pnpm content symbol <latex | key> [--json]`. */
|
|
41
|
+
declare function usageLine(verb: ContentVerb): string;
|
|
42
|
+
/** The usage text `content help` prints; `scripts/agent/gen-map.mjs` lists the verbs from the generated reference. */
|
|
43
|
+
declare const CONTENT_USAGE: string;
|
|
44
|
+
|
|
45
|
+
export { CONTENT_USAGE, CONTENT_VERBS, type ContentVerb, type ContentVerbFlag, usageLine };
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
const WRITE = { flag: "--write", description: "apply the edits; without it the diff is printed and nothing changes" };
|
|
2
|
+
const READ_ONLY = "nothing";
|
|
3
|
+
const CONTENT_VERBS = [
|
|
4
|
+
{
|
|
5
|
+
verb: "status",
|
|
6
|
+
args: "",
|
|
7
|
+
when: "how the course stands",
|
|
8
|
+
prints: "counts, diagnostic totals, the knowledge and page versions, the agent surfaces' sizes, whether the course's AGENTS.md points at the engine's guide and the procedures are installed",
|
|
9
|
+
flags: [],
|
|
10
|
+
writes: READ_ONLY,
|
|
11
|
+
json: "StatusReport"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
verb: "diagnostics",
|
|
15
|
+
args: "[info|warning|error] [--all | --code <c> | --lesson <id> | --changed]",
|
|
16
|
+
when: "what is wrong, where",
|
|
17
|
+
prints: "counts by code (with each code's rule) and by file, at the given severity or higher (info by default); a filter or --all lists the lines instead. --json always prints the lines",
|
|
18
|
+
flags: [
|
|
19
|
+
{ flag: "--all", description: "list every diagnostic instead of the counts" },
|
|
20
|
+
{ flag: "--code <c>", description: "only that diagnostic code" },
|
|
21
|
+
{ flag: "--lesson <id>", description: "only that lesson's file" },
|
|
22
|
+
{ flag: "--changed", description: "only lessons whose .mdx or .checks.yml differs from git HEAD, tracked or not" }
|
|
23
|
+
],
|
|
24
|
+
writes: READ_ONLY,
|
|
25
|
+
json: "DiagnosticsReport"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
verb: "warnings",
|
|
29
|
+
args: "",
|
|
30
|
+
when: "the warnings alone",
|
|
31
|
+
prints: "every warning, one line each with its rule, then the count",
|
|
32
|
+
flags: [],
|
|
33
|
+
writes: READ_ONLY,
|
|
34
|
+
json: "WarningsReport"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
verb: "context",
|
|
38
|
+
args: "<lesson>",
|
|
39
|
+
when: "what a lesson draws on",
|
|
40
|
+
prints: "its outcomes, notation, sources, diagnostics and token counts; --json adds the body, the floats it can reference, its sections and domain signatures",
|
|
41
|
+
flags: [],
|
|
42
|
+
writes: READ_ONLY,
|
|
43
|
+
json: "ContextReport"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
verb: "equation",
|
|
47
|
+
args: '"<latex>" [--lesson <id>]',
|
|
48
|
+
when: "will this expression build",
|
|
49
|
+
prints: "each glyph's card, unresolved glyphs with where they are defined",
|
|
50
|
+
flags: [{ flag: "--lesson <id>", description: "resolve against that lesson's local notation as well as the shared cards" }],
|
|
51
|
+
writes: READ_ONLY,
|
|
52
|
+
exit: "when the build would refuse the expression",
|
|
53
|
+
json: "EquationReport"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
verb: "bindings",
|
|
57
|
+
args: "<lesson>",
|
|
58
|
+
when: "what a lesson's math binds",
|
|
59
|
+
prints: "every math span: its bindings, unresolved glyphs, redundant \\explain wraps",
|
|
60
|
+
flags: [],
|
|
61
|
+
writes: READ_ONLY,
|
|
62
|
+
json: "BindingsReport"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
verb: "symbol",
|
|
66
|
+
args: "<latex | key>",
|
|
67
|
+
when: "is this symbol defined already",
|
|
68
|
+
prints: "the shared card, each local entry with its lesson, each gloss with its card, near misses",
|
|
69
|
+
flags: [],
|
|
70
|
+
writes: READ_ONLY,
|
|
71
|
+
json: "SymbolReport"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
verb: "check",
|
|
75
|
+
args: "<lesson | deck>\u2026 [--changed]",
|
|
76
|
+
when: "does it render",
|
|
77
|
+
prints: "ok or FAIL per lesson: schema, references, MDX \u2192 KaTeX; each error and warning with its rule, the info counted by code",
|
|
78
|
+
flags: [{ flag: "--changed", description: "the lessons whose .mdx or .checks.yml differs from git HEAD, tracked or not" }],
|
|
79
|
+
writes: READ_ONLY,
|
|
80
|
+
exit: "when a lesson has an error",
|
|
81
|
+
json: "CheckReport"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
verb: "rule",
|
|
85
|
+
args: "<ID>",
|
|
86
|
+
when: "one rule, whole",
|
|
87
|
+
prints: "the entry as this course has it (enforcement, codes, settings in effect) and the rule page's section, example included",
|
|
88
|
+
flags: [],
|
|
89
|
+
writes: READ_ONLY,
|
|
90
|
+
exit: "for an ID the catalog and the course rules do not know",
|
|
91
|
+
json: "RuleReport"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
verb: "migrate",
|
|
95
|
+
args: "[--from <version>] [--to <version>]",
|
|
96
|
+
when: "what an upgrade needs",
|
|
97
|
+
prints: "the migration guide's sections between the version package.json pins at git HEAD and the one installed, oldest first",
|
|
98
|
+
flags: [
|
|
99
|
+
{ flag: "--from <version>", description: "start here instead of the version pinned at HEAD" },
|
|
100
|
+
{ flag: "--to <version>", description: "stop here instead of the installed version" }
|
|
101
|
+
],
|
|
102
|
+
writes: READ_ONLY,
|
|
103
|
+
exit: "when a section between the two versions is missing",
|
|
104
|
+
json: "MigrateReport"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
verb: "rules",
|
|
108
|
+
args: "[--element <e>[,<e>]] [--enforcement script|partial|guide|locked] [--edition chapter|deck]",
|
|
109
|
+
when: "which rules apply",
|
|
110
|
+
prints: "the rules this course has on, by element, with enforcement, codes, settings in effect and a one-line summary",
|
|
111
|
+
flags: [
|
|
112
|
+
{ flag: "--element <e>[,<e>]", description: "only rules about these elements (prose, table, notation, \u2026)" },
|
|
113
|
+
{ flag: "--enforcement <kind>", description: "only script, partial, guide or locked rules" },
|
|
114
|
+
{ flag: "--edition <edition>", description: "chapter (the default) or deck: the rules for that edition's pages" }
|
|
115
|
+
],
|
|
116
|
+
writes: READ_ONLY,
|
|
117
|
+
json: "RulesJson"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
verb: "move",
|
|
121
|
+
args: "<lesson>:<key> [--to <key>] [--write]",
|
|
122
|
+
when: "a local entry becomes shared",
|
|
123
|
+
prints: "the new card and every copy and reference that changes, as a diff",
|
|
124
|
+
flags: [{ flag: "--to <key>", description: "the shared card's key, when it differs from the local one" }, WRITE],
|
|
125
|
+
writes: "only with --write",
|
|
126
|
+
json: "EditPlanJson"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
verb: "rename",
|
|
130
|
+
args: "<old> <new> [--write]",
|
|
131
|
+
when: "rename a shared card",
|
|
132
|
+
prints: "the card file and every reference, as a diff",
|
|
133
|
+
flags: [WRITE],
|
|
134
|
+
writes: "only with --write",
|
|
135
|
+
json: "EditPlanJson"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
verb: "fix",
|
|
139
|
+
args: "<lesson>\u2026 | --all [--write]",
|
|
140
|
+
when: "the mechanical repairs",
|
|
141
|
+
prints: "redundant \\explain wraps unwrapped, as a diff",
|
|
142
|
+
flags: [{ flag: "--all", description: "every lesson; the ones with nothing to fix are counted" }, WRITE],
|
|
143
|
+
writes: "only with --write",
|
|
144
|
+
json: "EditPlanJson"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
verb: "new lesson",
|
|
148
|
+
args: "<id>",
|
|
149
|
+
when: "a chapter to start from",
|
|
150
|
+
prints: "the files it created: the .mdx and its .checks.yml",
|
|
151
|
+
flags: [],
|
|
152
|
+
writes: "new files; never overwrites",
|
|
153
|
+
json: "NewJson"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
verb: "new deck",
|
|
157
|
+
args: "<lesson | part>",
|
|
158
|
+
when: "slides to start from",
|
|
159
|
+
prints: "the deck it drafted from the chapter (or the part's chapters)",
|
|
160
|
+
flags: [],
|
|
161
|
+
writes: "new files; never overwrites",
|
|
162
|
+
json: "NewJson"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
verb: "new term",
|
|
166
|
+
args: "<key>",
|
|
167
|
+
when: "a shared notation card to start from",
|
|
168
|
+
prints: "the card file it created",
|
|
169
|
+
flags: [],
|
|
170
|
+
writes: "new files; never overwrites",
|
|
171
|
+
json: "NewJson"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
verb: "init-agent",
|
|
175
|
+
args: "[--write]",
|
|
176
|
+
when: "install the agent procedures",
|
|
177
|
+
prints: "the skills and the rules-reviewer agent it would copy into .claude/, and a baseline AGENTS.md when the course has none; rerun after an upgrade",
|
|
178
|
+
flags: [WRITE],
|
|
179
|
+
writes: "only with --write",
|
|
180
|
+
json: "EditPlanJson"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
verb: "release",
|
|
184
|
+
args: "[major|minor|patch] [--write]",
|
|
185
|
+
when: "cut a content release (rule C3)",
|
|
186
|
+
prints: "## [Unreleased] in content/CHANGELOG.md becoming a dated ## [x.y.z] heading and about.version becoming x.y.z, as a diff; the bump defaults to what the section's headings imply (Breaking or Removed \u2192 major, Added \u2192 minor, else patch)",
|
|
187
|
+
flags: [WRITE],
|
|
188
|
+
writes: "only with --write",
|
|
189
|
+
json: "EditPlanJson"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
verb: "verify",
|
|
193
|
+
args: "[--e2e] [--force]",
|
|
194
|
+
when: "is it ready to hand back",
|
|
195
|
+
prints: "one line per step \u2014 validate:content, check --changed, astro check, the course's tests, astro build, and with --e2e the browser tests \u2014 and the tail of each failed step's log; a rerun on an unchanged tree answers from the last pass",
|
|
196
|
+
flags: [
|
|
197
|
+
{ flag: "--e2e", description: "also run the browser tests (the course's test:e2e script, or playwright test when it has a config)" },
|
|
198
|
+
{ flag: "--force", description: "run even when nothing changed since the last pass" }
|
|
199
|
+
],
|
|
200
|
+
writes: "what validate:content and astro build write; logs and the pass record under node_modules/.cache/explico/verify/",
|
|
201
|
+
exit: "when a step fails",
|
|
202
|
+
json: "VerifyReport"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
verb: "help",
|
|
206
|
+
args: "[<verb>]",
|
|
207
|
+
when: "a verb's flags and its --json shape",
|
|
208
|
+
prints: "the usage; with a verb, its flags, what it writes, its exit code and the shape of its --json",
|
|
209
|
+
flags: [],
|
|
210
|
+
writes: READ_ONLY,
|
|
211
|
+
exit: "for an unknown verb",
|
|
212
|
+
json: "HelpJson"
|
|
213
|
+
}
|
|
214
|
+
];
|
|
215
|
+
function usageLine(verb) {
|
|
216
|
+
return `pnpm content ${verb.verb}${verb.args === "" ? "" : ` ${verb.args}`} [--json]`;
|
|
217
|
+
}
|
|
218
|
+
const CONTENT_USAGE = `Usage:
|
|
219
|
+
${CONTENT_VERBS.map((verb) => ` ${usageLine(verb)}`).join("\n")}`;
|
|
220
|
+
export {
|
|
221
|
+
CONTENT_USAGE,
|
|
222
|
+
CONTENT_VERBS,
|
|
223
|
+
usageLine
|
|
224
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
type VerifyStepName = 'validate:content' | 'check --changed' | 'astro check' | 'tests' | 'astro build' | 'e2e';
|
|
2
|
+
interface VerifyStep {
|
|
3
|
+
readonly name: VerifyStepName;
|
|
4
|
+
readonly status: 'pass' | 'fail' | 'skipped';
|
|
5
|
+
/** The command it ran, as it would be typed; absent for a skipped step. */
|
|
6
|
+
readonly command?: string;
|
|
7
|
+
/** Why it was skipped, or why it could not start. */
|
|
8
|
+
readonly reason?: string;
|
|
9
|
+
readonly seconds?: number;
|
|
10
|
+
/** Course-relative path of its whole output. */
|
|
11
|
+
readonly log?: string;
|
|
12
|
+
/** The last lines of the output of a failed step. */
|
|
13
|
+
readonly tail?: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
interface VerifyReport {
|
|
16
|
+
readonly ok: boolean;
|
|
17
|
+
/** True when the tree is unchanged since a pass that covered as much: nothing ran, `steps` are that pass's. */
|
|
18
|
+
readonly cached: boolean;
|
|
19
|
+
/** When the recorded pass ran, for a cached answer (ISO 8601). */
|
|
20
|
+
readonly since?: string;
|
|
21
|
+
/** The hash of the tree the run left, or `null` outside a git repository (then nothing is recorded). */
|
|
22
|
+
readonly tree: string | null;
|
|
23
|
+
/** Whether the browser tests were part of the run. */
|
|
24
|
+
readonly e2e: boolean;
|
|
25
|
+
readonly steps: readonly VerifyStep[];
|
|
26
|
+
}
|
|
27
|
+
interface VerifyOptions {
|
|
28
|
+
readonly e2e?: boolean;
|
|
29
|
+
readonly force?: boolean;
|
|
30
|
+
/** The course root; the working directory by default. */
|
|
31
|
+
readonly cwd?: string;
|
|
32
|
+
/** Called as each step starts and ends, for a progress line. */
|
|
33
|
+
readonly onStep?: (event: {
|
|
34
|
+
readonly phase: 'start';
|
|
35
|
+
readonly name: VerifyStepName;
|
|
36
|
+
} | {
|
|
37
|
+
readonly phase: 'end';
|
|
38
|
+
readonly step: VerifyStep;
|
|
39
|
+
}) => void;
|
|
40
|
+
}
|
|
41
|
+
declare const VERIFY_DIR: string;
|
|
42
|
+
/** The working tree as the gate sees it, in one hash; `null` outside git. */
|
|
43
|
+
declare function verifyTreeHash(cwd: string): string | null;
|
|
44
|
+
/** Run every step, record a pass, and say what happened; never throws for a failing step. */
|
|
45
|
+
declare function runVerify(options?: VerifyOptions): VerifyReport;
|
|
46
|
+
/** The digest after a run: failed steps' tails, then one verdict line. */
|
|
47
|
+
declare function formatVerifyReport(report: VerifyReport): string;
|
|
48
|
+
/** One progress line per step: ` astro build ok 41.2s`. */
|
|
49
|
+
declare function formatVerifyStep(step: VerifyStep): string;
|
|
50
|
+
|
|
51
|
+
export { VERIFY_DIR, type VerifyOptions, type VerifyReport, type VerifyStep, type VerifyStepName, formatVerifyReport, formatVerifyStep, runVerify, verifyTreeHash };
|