@jasonbelmonti/markdown-engine 2.0.0 → 3.1.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 +45 -1
- package/README.md +132 -57
- package/dist/api/contracts.d.ts +2 -1
- package/dist/api/contracts.d.ts.map +1 -1
- package/dist/api/contracts.js +1 -0
- package/dist/api/contracts.js.map +1 -1
- package/dist/api/declarative-validation.d.ts +2 -2
- package/dist/api/declarative-validation.d.ts.map +1 -1
- package/dist/api/declarative-validation.js +53 -31
- package/dist/api/declarative-validation.js.map +1 -1
- package/dist/api/document-set-validation-types.d.ts +32 -0
- package/dist/api/document-set-validation-types.d.ts.map +1 -0
- package/dist/api/document-set-validation-types.js +2 -0
- package/dist/api/document-set-validation-types.js.map +1 -0
- package/dist/api/document-set-validation.d.ts +4 -0
- package/dist/api/document-set-validation.d.ts.map +1 -0
- package/dist/api/document-set-validation.js +60 -0
- package/dist/api/document-set-validation.js.map +1 -0
- package/dist/api/serialize.d.ts +2 -1
- package/dist/api/serialize.d.ts.map +1 -1
- package/dist/api/serialize.js.map +1 -1
- package/dist/cli/declarative-validation.d.ts.map +1 -1
- package/dist/cli/declarative-validation.js +7 -12
- package/dist/cli/declarative-validation.js.map +1 -1
- package/dist/declarative-validation/applicability/classifier.d.ts +18 -0
- package/dist/declarative-validation/applicability/classifier.d.ts.map +1 -0
- package/dist/declarative-validation/applicability/classifier.js +37 -0
- package/dist/declarative-validation/applicability/classifier.js.map +1 -0
- package/dist/declarative-validation/applicability/index.d.ts +2 -0
- package/dist/declarative-validation/applicability/index.d.ts.map +1 -0
- package/dist/declarative-validation/applicability/index.js +2 -0
- package/dist/declarative-validation/applicability/index.js.map +1 -0
- package/dist/declarative-validation/assertions/context.d.ts +2 -2
- package/dist/declarative-validation/assertions/context.d.ts.map +1 -1
- package/dist/declarative-validation/assertions/diagnostics.d.ts +7 -4
- package/dist/declarative-validation/assertions/diagnostics.d.ts.map +1 -1
- package/dist/declarative-validation/assertions/diagnostics.js +26 -1
- package/dist/declarative-validation/assertions/diagnostics.js.map +1 -1
- package/dist/declarative-validation/assertions/evaluator.d.ts +2 -2
- package/dist/declarative-validation/assertions/evaluator.d.ts.map +1 -1
- package/dist/declarative-validation/assertions/evaluator.js +9 -0
- package/dist/declarative-validation/assertions/evaluator.js.map +1 -1
- package/dist/declarative-validation/assertions/frontmatter-shape.d.ts +9 -0
- package/dist/declarative-validation/assertions/frontmatter-shape.d.ts.map +1 -0
- package/dist/declarative-validation/assertions/frontmatter-shape.js +105 -0
- package/dist/declarative-validation/assertions/frontmatter-shape.js.map +1 -0
- package/dist/declarative-validation/assertions/group-evaluator.d.ts +6 -0
- package/dist/declarative-validation/assertions/group-evaluator.d.ts.map +1 -0
- package/dist/declarative-validation/assertions/group-evaluator.js +57 -0
- package/dist/declarative-validation/assertions/group-evaluator.js.map +1 -0
- package/dist/declarative-validation/assertions/id-targets.d.ts +15 -0
- package/dist/declarative-validation/assertions/id-targets.d.ts.map +1 -1
- package/dist/declarative-validation/assertions/id-targets.js +18 -55
- package/dist/declarative-validation/assertions/id-targets.js.map +1 -1
- package/dist/declarative-validation/assertions/ids.d.ts.map +1 -1
- package/dist/declarative-validation/assertions/ids.js +100 -14
- package/dist/declarative-validation/assertions/ids.js.map +1 -1
- package/dist/declarative-validation/assertions/index.d.ts +1 -0
- package/dist/declarative-validation/assertions/index.d.ts.map +1 -1
- package/dist/declarative-validation/assertions/index.js +1 -0
- package/dist/declarative-validation/assertions/index.js.map +1 -1
- package/dist/declarative-validation/assertions/table-column-coverage.d.ts +9 -0
- package/dist/declarative-validation/assertions/table-column-coverage.d.ts.map +1 -0
- package/dist/declarative-validation/assertions/table-column-coverage.js +108 -0
- package/dist/declarative-validation/assertions/table-column-coverage.js.map +1 -0
- package/dist/declarative-validation/assertions/text-format.d.ts +9 -0
- package/dist/declarative-validation/assertions/text-format.d.ts.map +1 -0
- package/dist/declarative-validation/assertions/text-format.js +75 -0
- package/dist/declarative-validation/assertions/text-format.js.map +1 -0
- package/dist/declarative-validation/compiler/applicability-plan.d.ts +5 -0
- package/dist/declarative-validation/compiler/applicability-plan.d.ts.map +1 -0
- package/dist/declarative-validation/compiler/applicability-plan.js +22 -0
- package/dist/declarative-validation/compiler/applicability-plan.js.map +1 -0
- package/dist/declarative-validation/compiler/assertion-builders.d.ts +2 -1
- package/dist/declarative-validation/compiler/assertion-builders.d.ts.map +1 -1
- package/dist/declarative-validation/compiler/assertion-builders.js +88 -13
- package/dist/declarative-validation/compiler/assertion-builders.js.map +1 -1
- package/dist/declarative-validation/compiler/assertion-shapes.d.ts +5 -1
- package/dist/declarative-validation/compiler/assertion-shapes.d.ts.map +1 -1
- package/dist/declarative-validation/compiler/assertion-shapes.js +120 -0
- package/dist/declarative-validation/compiler/assertion-shapes.js.map +1 -1
- package/dist/declarative-validation/compiler/assertions.d.ts +2 -1
- package/dist/declarative-validation/compiler/assertions.d.ts.map +1 -1
- package/dist/declarative-validation/compiler/assertions.js +16 -4
- package/dist/declarative-validation/compiler/assertions.js.map +1 -1
- package/dist/declarative-validation/compiler/compatibility.d.ts.map +1 -1
- package/dist/declarative-validation/compiler/compatibility.js +3 -0
- package/dist/declarative-validation/compiler/compatibility.js.map +1 -1
- package/dist/declarative-validation/compiler/group-plans.d.ts +6 -0
- package/dist/declarative-validation/compiler/group-plans.d.ts.map +1 -0
- package/dist/declarative-validation/compiler/group-plans.js +67 -0
- package/dist/declarative-validation/compiler/group-plans.js.map +1 -0
- package/dist/declarative-validation/compiler/index.d.ts +1 -1
- package/dist/declarative-validation/compiler/index.d.ts.map +1 -1
- package/dist/declarative-validation/compiler/index.js +70 -35
- package/dist/declarative-validation/compiler/index.js.map +1 -1
- package/dist/declarative-validation/compiler/plan.d.ts +80 -5
- package/dist/declarative-validation/compiler/plan.d.ts.map +1 -1
- package/dist/declarative-validation/compiler/rule-fields.d.ts +6 -0
- package/dist/declarative-validation/compiler/rule-fields.d.ts.map +1 -0
- package/dist/declarative-validation/compiler/rule-fields.js +40 -0
- package/dist/declarative-validation/compiler/rule-fields.js.map +1 -0
- package/dist/declarative-validation/diagnostics/profile-config-diagnostics.d.ts +0 -1
- package/dist/declarative-validation/diagnostics/profile-config-diagnostics.d.ts.map +1 -1
- package/dist/declarative-validation/diagnostics/profile-config-diagnostics.js +8 -2
- package/dist/declarative-validation/diagnostics/profile-config-diagnostics.js.map +1 -1
- package/dist/declarative-validation/evidence/index.d.ts +3 -3
- package/dist/declarative-validation/evidence/index.d.ts.map +1 -1
- package/dist/declarative-validation/evidence/index.js +6 -6
- package/dist/declarative-validation/evidence/index.js.map +1 -1
- package/dist/declarative-validation/profile/applicability-schema.d.ts +4 -0
- package/dist/declarative-validation/profile/applicability-schema.d.ts.map +1 -0
- package/dist/declarative-validation/profile/applicability-schema.js +24 -0
- package/dist/declarative-validation/profile/applicability-schema.js.map +1 -0
- package/dist/declarative-validation/profile/assertion-schema.d.ts +2 -1
- package/dist/declarative-validation/profile/assertion-schema.d.ts.map +1 -1
- package/dist/declarative-validation/profile/assertion-schema.js +194 -14
- package/dist/declarative-validation/profile/assertion-schema.js.map +1 -1
- package/dist/declarative-validation/profile/direct-profile-diagnostics.d.ts +3 -1
- package/dist/declarative-validation/profile/direct-profile-diagnostics.d.ts.map +1 -1
- package/dist/declarative-validation/profile/direct-profile-diagnostics.js +10 -2
- package/dist/declarative-validation/profile/direct-profile-diagnostics.js.map +1 -1
- package/dist/declarative-validation/profile/frontmatter-shape-schema.d.ts +8 -0
- package/dist/declarative-validation/profile/frontmatter-shape-schema.d.ts.map +1 -0
- package/dist/declarative-validation/profile/frontmatter-shape-schema.js +178 -0
- package/dist/declarative-validation/profile/frontmatter-shape-schema.js.map +1 -0
- package/dist/declarative-validation/profile/group-schema.d.ts +5 -0
- package/dist/declarative-validation/profile/group-schema.d.ts.map +1 -0
- package/dist/declarative-validation/profile/group-schema.js +55 -0
- package/dist/declarative-validation/profile/group-schema.js.map +1 -0
- package/dist/declarative-validation/profile/ids-assertion-contract.d.ts +12 -0
- package/dist/declarative-validation/profile/ids-assertion-contract.d.ts.map +1 -0
- package/dist/declarative-validation/profile/ids-assertion-contract.js +32 -0
- package/dist/declarative-validation/profile/ids-assertion-contract.js.map +1 -0
- package/dist/declarative-validation/profile/index.d.ts +63 -2
- package/dist/declarative-validation/profile/index.d.ts.map +1 -1
- package/dist/declarative-validation/profile/index.js.map +1 -1
- package/dist/declarative-validation/profile/materialization.d.ts.map +1 -1
- package/dist/declarative-validation/profile/materialization.js +13 -10
- package/dist/declarative-validation/profile/materialization.js.map +1 -1
- package/dist/declarative-validation/profile/schema.d.ts.map +1 -1
- package/dist/declarative-validation/profile/schema.js +73 -12
- package/dist/declarative-validation/profile/schema.js.map +1 -1
- package/dist/declarative-validation/profile/syntax-version.d.ts +7 -0
- package/dist/declarative-validation/profile/syntax-version.d.ts.map +1 -0
- package/dist/declarative-validation/profile/syntax-version.js +11 -0
- package/dist/declarative-validation/profile/syntax-version.js.map +1 -0
- package/dist/declarative-validation/profile/text-format-contract.d.ts +4 -0
- package/dist/declarative-validation/profile/text-format-contract.d.ts.map +1 -0
- package/dist/declarative-validation/profile/text-format-contract.js +6 -0
- package/dist/declarative-validation/profile/text-format-contract.js.map +1 -0
- package/dist/declarative-validation/results/clone-rule-result.d.ts +6 -0
- package/dist/declarative-validation/results/clone-rule-result.d.ts.map +1 -0
- package/dist/declarative-validation/results/clone-rule-result.js +125 -0
- package/dist/declarative-validation/results/clone-rule-result.js.map +1 -0
- package/dist/declarative-validation/results/create-result.d.ts +15 -0
- package/dist/declarative-validation/results/create-result.d.ts.map +1 -0
- package/dist/declarative-validation/results/create-result.js +58 -0
- package/dist/declarative-validation/results/create-result.js.map +1 -0
- package/dist/declarative-validation/results/index.d.ts +3 -25
- package/dist/declarative-validation/results/index.d.ts.map +1 -1
- package/dist/declarative-validation/results/index.js +2 -1
- package/dist/declarative-validation/results/index.js.map +1 -1
- package/dist/declarative-validation/results/skipped-rule-result.d.ts +10 -0
- package/dist/declarative-validation/results/skipped-rule-result.d.ts.map +1 -0
- package/dist/declarative-validation/results/skipped-rule-result.js +18 -0
- package/dist/declarative-validation/results/skipped-rule-result.js.map +1 -0
- package/dist/declarative-validation/results/types.d.ts +77 -0
- package/dist/declarative-validation/results/types.d.ts.map +1 -0
- package/dist/declarative-validation/results/types.js +2 -0
- package/dist/declarative-validation/results/types.js.map +1 -0
- package/dist/declarative-validation/selectors/table-targets.d.ts +23 -0
- package/dist/declarative-validation/selectors/table-targets.d.ts.map +1 -1
- package/dist/declarative-validation/selectors/table-targets.js +52 -9
- package/dist/declarative-validation/selectors/table-targets.js.map +1 -1
- package/dist-bundled/markdown-engine-cli.mjs +27373 -0
- package/docs/contracts/api.md +79 -15
- package/docs/contracts/declarative-validation.md +462 -40
- package/fixtures/declarative-validation/examples/okf-v0.1/fail/invalid-log-date/log.md +5 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/fail/missing-concept-type/concepts/customer-metric.md +8 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/fail/non-root-index-frontmatter/datasets/index.md +7 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/pass/datasets/index.md +3 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/pass/datasets/sales.md +16 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/pass/index.md +8 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/pass/log.md +9 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/pass/playbooks/incident-response.md +17 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/profiles/concept.yaml +14 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/profiles/log.yaml +10 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/profiles/non-root-index.yaml +9 -0
- package/fixtures/declarative-validation/examples/okf-v0.1/profiles/root-index.yaml +12 -0
- package/package.json +9 -3
- package/scripts/install-markdown-engine-cli.sh +113 -0
- package/skills/profile-backed-markdown/SKILL.md +54 -0
- package/skills/profile-backed-markdown/assets/profiles/operational-spec.yaml +98 -0
- package/skills/profile-backed-markdown/references/repair-brief.md +14 -0
- package/skills/profile-backed-markdown/scripts/validate-profile-backed-markdown.mjs +590 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: BigQuery Dataset
|
|
3
|
+
title: Sales Dataset
|
|
4
|
+
description: Sales reporting assets for the example bundle.
|
|
5
|
+
resource: https://example.com/bigquery/datasets/sales
|
|
6
|
+
tags: [sales, reporting]
|
|
7
|
+
timestamp: 2026-06-15T00:00:00Z
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Schema
|
|
11
|
+
|
|
12
|
+
The sales dataset contains curated order and customer reporting tables.
|
|
13
|
+
|
|
14
|
+
# Citations
|
|
15
|
+
|
|
16
|
+
[1] [Internal sales catalog](https://example.com/catalog/sales)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Playbook
|
|
3
|
+
title: Incident Response
|
|
4
|
+
description: Triage steps for a data freshness incident.
|
|
5
|
+
tags: [oncall, freshness]
|
|
6
|
+
timestamp: 2026-06-15T00:00:00Z
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Trigger
|
|
10
|
+
|
|
11
|
+
A freshness alert fires when an expected dataset update is delayed.
|
|
12
|
+
|
|
13
|
+
# Steps
|
|
14
|
+
|
|
15
|
+
1. Check the ingestion dashboard.
|
|
16
|
+
2. Notify the on-call owner.
|
|
17
|
+
3. Record the incident in the bundle log.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
syntaxVersion: markdown-engine.validation@v2
|
|
2
|
+
documentVersion: 1.0.0
|
|
3
|
+
rules:
|
|
4
|
+
- id: okf.concept.frontmatter
|
|
5
|
+
select:
|
|
6
|
+
target: document
|
|
7
|
+
assert:
|
|
8
|
+
frontmatterShape:
|
|
9
|
+
presence: required
|
|
10
|
+
fields:
|
|
11
|
+
- field: type
|
|
12
|
+
required: true
|
|
13
|
+
valueType: string
|
|
14
|
+
nonEmpty: true
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jasonbelmonti/markdown-engine",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Deterministic Markdown parsing and validation engine package.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
"types": "./dist/index.d.ts",
|
|
32
32
|
"files": [
|
|
33
33
|
"dist",
|
|
34
|
+
"dist-bundled",
|
|
35
|
+
"scripts/install-markdown-engine-cli.sh",
|
|
36
|
+
"skills",
|
|
34
37
|
"docs/contracts",
|
|
35
38
|
"fixtures/declarative-validation/examples",
|
|
36
39
|
"CHANGELOG.md",
|
|
@@ -42,9 +45,11 @@
|
|
|
42
45
|
"scripts": {
|
|
43
46
|
"clean": "node scripts/clean-dist.mjs",
|
|
44
47
|
"build": "npm run clean && tsc -p tsconfig.json",
|
|
48
|
+
"build:cli:bundled": "node scripts/build-bundled-cli.mjs",
|
|
49
|
+
"build:cli-bundle": "node scripts/build-cli-bundle.mjs",
|
|
45
50
|
"prepack": "npm run release:verify",
|
|
46
51
|
"prepublishOnly": "npm run release:verify",
|
|
47
|
-
"release:verify": "npm run typecheck && npm test && node scripts/check-boundaries.mjs && npm run docs:rich-ir-contract && npm run docs:declarative-validation-contract && npm run audit:declarative-validation-boundary && npm run build && node scripts/prove-repeatability.mjs --runs 10 && npm run release:check-clean",
|
|
52
|
+
"release:verify": "npm run typecheck && npm test && node scripts/check-boundaries.mjs && npm run docs:rich-ir-contract && npm run docs:declarative-validation-contract && npm run audit:declarative-validation-boundary && npm run build && npm run build:cli:bundled && node scripts/prove-repeatability.mjs --runs 10 && npm run release:check-clean",
|
|
48
53
|
"release:check-clean": "git diff --check HEAD -- && git diff --exit-code HEAD --",
|
|
49
54
|
"snapshots:update:parser": "npm run build && vitest run tests/parser-fixtures.test.ts -u \"--exclude=.worktrees/**\"",
|
|
50
55
|
"snapshots:update:rules": "npm run build && vitest run tests/rules.test.ts -u \"--exclude=.worktrees/**\"",
|
|
@@ -65,7 +70,7 @@
|
|
|
65
70
|
"test:validation:profile": "npm run build && vitest run tests/declarative-validation-profile.test.ts \"--exclude=.worktrees/**\"",
|
|
66
71
|
"test:validation:compiler": "npm run build && vitest run tests/declarative-validation-compiler.test.ts \"--exclude=.worktrees/**\"",
|
|
67
72
|
"test:validation:selectors": "npm run build && vitest run tests/declarative-validation-selectors.test.ts \"--exclude=.worktrees/**\"",
|
|
68
|
-
"test:validation:assertions": "npm run build && vitest run tests/declarative-validation-assertions.test.ts \"--exclude=.worktrees/**\"",
|
|
73
|
+
"test:validation:assertions": "npm run build && vitest run tests/declarative-validation-assertions.test.ts tests/declarative-validation-frontmatter-shape-assertions.test.ts tests/declarative-validation-table-column-coverage-fixtures.test.ts tests/declarative-validation-grouped-rules-fixtures.test.ts tests/declarative-validation-when-skipped-rules-fixtures.test.ts \"--exclude=.worktrees/**\"",
|
|
69
74
|
"test:validation:diagnostics": "npm run build && vitest run tests/declarative-validation-diagnostics.test.ts \"--exclude=.worktrees/**\"",
|
|
70
75
|
"test:validation:cli": "npm run build && vitest run tests/declarative-validation-cli.test.ts \"--exclude=.worktrees/**\"",
|
|
71
76
|
"test:validation:examples": "npm run build && vitest run tests/declarative-validation-examples.test.ts \"--exclude=.worktrees/**\"",
|
|
@@ -83,6 +88,7 @@
|
|
|
83
88
|
"devDependencies": {
|
|
84
89
|
"@types/node": "^22.19.17",
|
|
85
90
|
"cmark-gfm": "^0.9.0",
|
|
91
|
+
"esbuild": "^0.27.7",
|
|
86
92
|
"typescript": "^5.8.3",
|
|
87
93
|
"vitest": "^3.1.3"
|
|
88
94
|
},
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
VERSION="3.0.0"
|
|
5
|
+
PACKAGE="@jasonbelmonti/markdown-engine"
|
|
6
|
+
EXPECTED_SHA256="f61ab59e28eb92cccf4fd8073c090102e67a9397a7f0d208661ded14b879053d"
|
|
7
|
+
DEFAULT_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
|
|
8
|
+
MARKDOWN_ENGINE_HOME="${MARKDOWN_ENGINE_HOME:-$DEFAULT_DATA_HOME/markdown-engine}"
|
|
9
|
+
MARKDOWN_ENGINE_BIN_DIR="${MARKDOWN_ENGINE_BIN_DIR:-$HOME/.local/bin}"
|
|
10
|
+
INSTALL_DIR="$MARKDOWN_ENGINE_HOME/tools/markdown-engine/$VERSION"
|
|
11
|
+
INSTALL_CLI="$INSTALL_DIR/markdown-engine-cli.mjs"
|
|
12
|
+
BIN_DIR="$MARKDOWN_ENGINE_BIN_DIR"
|
|
13
|
+
BIN_PATH="$BIN_DIR/markdown-engine"
|
|
14
|
+
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
|
15
|
+
REPO_ROOT=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd)
|
|
16
|
+
LOCAL_CLI="$REPO_ROOT/dist-bundled/markdown-engine-cli.mjs"
|
|
17
|
+
PACKED_CLI_ENTRY="package/dist-bundled/markdown-engine-cli.mjs"
|
|
18
|
+
TMP_DIR=""
|
|
19
|
+
SOURCE_CLI=""
|
|
20
|
+
|
|
21
|
+
cleanup() {
|
|
22
|
+
if [ -n "$TMP_DIR" ] && [ -d "$TMP_DIR" ]; then
|
|
23
|
+
rm -rf "$TMP_DIR"
|
|
24
|
+
fi
|
|
25
|
+
}
|
|
26
|
+
trap cleanup EXIT HUP INT TERM
|
|
27
|
+
|
|
28
|
+
fail() {
|
|
29
|
+
printf 'install-markdown-engine-cli: %s\n' "$1" >&2
|
|
30
|
+
exit 1
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
require_command() {
|
|
34
|
+
command -v "$1" >/dev/null 2>&1 || fail "required command not found: $1"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
sha256_of() {
|
|
38
|
+
shasum -a 256 "$1" | awk '{print $1}'
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
shell_quote() {
|
|
42
|
+
printf "'"
|
|
43
|
+
printf '%s' "$1" | sed "s/'/'\\\\''/g"
|
|
44
|
+
printf "'"
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
has_expected_sha() {
|
|
48
|
+
candidate_sha=$(sha256_of "$1")
|
|
49
|
+
|
|
50
|
+
if [ "$candidate_sha" = "$EXPECTED_SHA256" ]; then
|
|
51
|
+
return 0
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
printf 'install-markdown-engine-cli: ignoring local CLI with unexpected SHA-256 for %s: %s\n' "$1" "$candidate_sha" >&2
|
|
55
|
+
return 1
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
resolve_source_cli() {
|
|
59
|
+
if [ -f "$LOCAL_CLI" ]; then
|
|
60
|
+
if has_expected_sha "$LOCAL_CLI"; then
|
|
61
|
+
SOURCE_CLI="$LOCAL_CLI"
|
|
62
|
+
return 0
|
|
63
|
+
fi
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
require_command npm
|
|
67
|
+
require_command tar
|
|
68
|
+
|
|
69
|
+
TMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/markdown-engine-cli.XXXXXX")
|
|
70
|
+
pack_file=$(npm pack "$PACKAGE@$VERSION" --ignore-scripts --pack-destination "$TMP_DIR" --silent)
|
|
71
|
+
|
|
72
|
+
[ -n "$pack_file" ] || fail "npm pack did not return a tarball name"
|
|
73
|
+
[ -f "$TMP_DIR/$pack_file" ] || fail "npm pack tarball not found: $TMP_DIR/$pack_file"
|
|
74
|
+
|
|
75
|
+
tar -xzf "$TMP_DIR/$pack_file" -C "$TMP_DIR" "$PACKED_CLI_ENTRY" ||
|
|
76
|
+
fail "packed CLI artifact not found in $PACKAGE@$VERSION"
|
|
77
|
+
|
|
78
|
+
packed_cli="$TMP_DIR/$PACKED_CLI_ENTRY"
|
|
79
|
+
[ -f "$packed_cli" ] || fail "packed CLI artifact not found in $PACKAGE@$VERSION"
|
|
80
|
+
SOURCE_CLI="$packed_cli"
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
require_command shasum
|
|
84
|
+
require_command node
|
|
85
|
+
require_command sed
|
|
86
|
+
|
|
87
|
+
resolve_source_cli
|
|
88
|
+
source_cli="$SOURCE_CLI"
|
|
89
|
+
[ -n "$source_cli" ] || fail "unable to resolve bundled CLI source"
|
|
90
|
+
actual_sha=$(sha256_of "$source_cli")
|
|
91
|
+
|
|
92
|
+
if [ "$actual_sha" != "$EXPECTED_SHA256" ]; then
|
|
93
|
+
fail "unexpected CLI SHA-256 for $source_cli: $actual_sha"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
mkdir -p "$INSTALL_DIR" "$BIN_DIR"
|
|
97
|
+
cp "$source_cli" "$INSTALL_CLI"
|
|
98
|
+
chmod 755 "$INSTALL_CLI"
|
|
99
|
+
|
|
100
|
+
quoted_install_cli=$(shell_quote "$INSTALL_CLI")
|
|
101
|
+
{
|
|
102
|
+
printf '%s\n' '#!/usr/bin/env sh'
|
|
103
|
+
printf 'DEFAULT_MARKDOWN_ENGINE_CLI=%s\n' "$quoted_install_cli"
|
|
104
|
+
printf '%s\n' 'MARKDOWN_ENGINE_CLI="${MARKDOWN_ENGINE_CLI:-$DEFAULT_MARKDOWN_ENGINE_CLI}"'
|
|
105
|
+
printf '%s\n' 'exec "${NODE_BINARY:-node}" "$MARKDOWN_ENGINE_CLI" "$@"'
|
|
106
|
+
} > "$BIN_PATH"
|
|
107
|
+
chmod 755 "$BIN_PATH"
|
|
108
|
+
|
|
109
|
+
"${NODE_BINARY:-node}" "$INSTALL_CLI" --help >/dev/null
|
|
110
|
+
|
|
111
|
+
printf 'Installed markdown-engine CLI: %s\n' "$INSTALL_CLI"
|
|
112
|
+
printf 'Installed markdown-engine wrapper: %s\n' "$BIN_PATH"
|
|
113
|
+
printf 'SHA-256: %s\n' "$actual_sha"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: profile-backed-markdown
|
|
3
|
+
description: Validate Markdown files that declare a local markdown-engine validation profile in frontmatter.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Profile-Backed Markdown
|
|
7
|
+
|
|
8
|
+
Use this skill when a Markdown file contains frontmatter with `validationProfile`
|
|
9
|
+
and you need deterministic profile validation before editing or handing off the
|
|
10
|
+
file.
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. Run the bundled wrapper:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
node scripts/validate-profile-backed-markdown.mjs --file /path/to/file.md
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
2. Treat stdout as the validator JSON source of truth. Do not infer pass/fail
|
|
21
|
+
from prose or repair notes.
|
|
22
|
+
3. If validation fails, rerun with `--repair-brief` to emit compact repair
|
|
23
|
+
guidance on stderr while preserving validator JSON on stdout.
|
|
24
|
+
4. Edit the Markdown file only when the user asked for repair. Do not edit
|
|
25
|
+
validation profiles unless explicitly requested.
|
|
26
|
+
5. Rerun the wrapper after edits and require exit code `0` before reporting the
|
|
27
|
+
document clean.
|
|
28
|
+
|
|
29
|
+
## Frontmatter Contract
|
|
30
|
+
|
|
31
|
+
The wrapper reads a top-level frontmatter scalar:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
validationProfile: operational-spec
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Profile names resolve to `assets/profiles/<validationProfile>.yaml` by default.
|
|
38
|
+
The wrapper rejects absolute paths and parent-directory traversal so validation
|
|
39
|
+
profiles stay within the local skill assets.
|
|
40
|
+
|
|
41
|
+
## Bundled CLI
|
|
42
|
+
|
|
43
|
+
The wrapper does not require a globally installed `markdown-engine` binary. It
|
|
44
|
+
uses `MARKDOWN_ENGINE_CLI` when set, then checks for a local
|
|
45
|
+
`scripts/markdown-engine-cli.mjs`, then falls back to the package-level
|
|
46
|
+
`dist-bundled/markdown-engine-cli.mjs`.
|
|
47
|
+
|
|
48
|
+
For a standalone skill folder, build and copy the bundled CLI artifact before
|
|
49
|
+
distribution:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm run build:cli:bundled
|
|
53
|
+
cp dist-bundled/markdown-engine-cli.mjs skills/profile-backed-markdown/scripts/
|
|
54
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
syntaxVersion: markdown-engine.validation@v1
|
|
2
|
+
documentVersion: 1.0.0
|
|
3
|
+
rules:
|
|
4
|
+
- id: frontmatter.required
|
|
5
|
+
select:
|
|
6
|
+
target: document
|
|
7
|
+
assert:
|
|
8
|
+
frontmatterRequired:
|
|
9
|
+
fields:
|
|
10
|
+
- title
|
|
11
|
+
- owner
|
|
12
|
+
- status
|
|
13
|
+
|
|
14
|
+
- id: sections.required
|
|
15
|
+
select:
|
|
16
|
+
target: document
|
|
17
|
+
assert:
|
|
18
|
+
sectionsRequired:
|
|
19
|
+
order: strict
|
|
20
|
+
headings:
|
|
21
|
+
- Objective
|
|
22
|
+
- Context / Constraints
|
|
23
|
+
- Execution Plan
|
|
24
|
+
- Risk Register
|
|
25
|
+
- Handoff Links
|
|
26
|
+
|
|
27
|
+
- id: objective.text
|
|
28
|
+
select:
|
|
29
|
+
target: section
|
|
30
|
+
title: Objective
|
|
31
|
+
assert:
|
|
32
|
+
text:
|
|
33
|
+
contains: "Mission control"
|
|
34
|
+
|
|
35
|
+
- id: objective.length
|
|
36
|
+
select:
|
|
37
|
+
target: section
|
|
38
|
+
title: Objective
|
|
39
|
+
assert:
|
|
40
|
+
textLength:
|
|
41
|
+
min: 80
|
|
42
|
+
max: 180
|
|
43
|
+
|
|
44
|
+
- id: risk.table.columns
|
|
45
|
+
select:
|
|
46
|
+
target: table
|
|
47
|
+
section: Risk Register
|
|
48
|
+
header:
|
|
49
|
+
- ID
|
|
50
|
+
- Mitigation
|
|
51
|
+
- Status
|
|
52
|
+
assert:
|
|
53
|
+
tableColumnsRequired:
|
|
54
|
+
columns:
|
|
55
|
+
- ID
|
|
56
|
+
- Mitigation
|
|
57
|
+
- Status
|
|
58
|
+
|
|
59
|
+
- id: risk.ids.unique
|
|
60
|
+
select:
|
|
61
|
+
target: tableCell
|
|
62
|
+
section: Risk Register
|
|
63
|
+
tableHeader:
|
|
64
|
+
- ID
|
|
65
|
+
- Mitigation
|
|
66
|
+
- Status
|
|
67
|
+
column: ID
|
|
68
|
+
assert:
|
|
69
|
+
ids:
|
|
70
|
+
prefix: OPS-RISK
|
|
71
|
+
unique: true
|
|
72
|
+
|
|
73
|
+
- id: execution.must.count
|
|
74
|
+
select:
|
|
75
|
+
target: section
|
|
76
|
+
title: Execution Plan
|
|
77
|
+
assert:
|
|
78
|
+
textOccurrenceCount:
|
|
79
|
+
text: MUST
|
|
80
|
+
count: 2
|
|
81
|
+
|
|
82
|
+
- id: execution.list
|
|
83
|
+
select:
|
|
84
|
+
target: list
|
|
85
|
+
section: Execution Plan
|
|
86
|
+
ordered: false
|
|
87
|
+
assert:
|
|
88
|
+
text:
|
|
89
|
+
contains: "Validate profile"
|
|
90
|
+
|
|
91
|
+
- id: handoff.link
|
|
92
|
+
select:
|
|
93
|
+
target: link
|
|
94
|
+
section: Handoff Links
|
|
95
|
+
text: "handoff packet"
|
|
96
|
+
url: "./handoff-packet.md"
|
|
97
|
+
assert:
|
|
98
|
+
exists: true
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Repair Brief Contract
|
|
2
|
+
|
|
3
|
+
`--repair-brief` emits a compact diagnostic summary on stderr and preserves the
|
|
4
|
+
validator JSON result on stdout.
|
|
5
|
+
|
|
6
|
+
Each diagnostic entry is derived from validator JSON only:
|
|
7
|
+
|
|
8
|
+
- `ruleId`: the failing profile rule when present, otherwise `(none)`.
|
|
9
|
+
- `message`: the validator diagnostic message.
|
|
10
|
+
- `sourceRange`: the validator diagnostic range when present, otherwise
|
|
11
|
+
`unavailable`.
|
|
12
|
+
|
|
13
|
+
The wrapper must not invent validation outcomes, synthesize missing diagnostics,
|
|
14
|
+
or edit local profile assets.
|