@devenius/junamis-skills 0.0.0-stage → 1.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 +150 -0
- package/LICENSE +21 -0
- package/README.md +231 -2
- package/SECURITY.md +81 -0
- package/bin/junamis-skills.js +7 -0
- package/dist/cli.d.ts +59 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +564 -0
- package/dist/cli.js.map +1 -0
- package/dist/color.d.ts +40 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +55 -0
- package/dist/color.js.map +1 -0
- package/dist/design/atomic.d.ts +4 -0
- package/dist/design/atomic.d.ts.map +1 -0
- package/dist/design/atomic.js +14 -0
- package/dist/design/atomic.js.map +1 -0
- package/dist/design/bootstrap.d.ts +23 -0
- package/dist/design/bootstrap.d.ts.map +1 -0
- package/dist/design/bootstrap.js +411 -0
- package/dist/design/bootstrap.js.map +1 -0
- package/dist/design/cli.d.ts +86 -0
- package/dist/design/cli.d.ts.map +1 -0
- package/dist/design/cli.js +425 -0
- package/dist/design/cli.js.map +1 -0
- package/dist/design/delta.d.ts +45 -0
- package/dist/design/delta.d.ts.map +1 -0
- package/dist/design/delta.js +557 -0
- package/dist/design/delta.js.map +1 -0
- package/dist/design/drift.d.ts +26 -0
- package/dist/design/drift.d.ts.map +1 -0
- package/dist/design/drift.js +341 -0
- package/dist/design/drift.js.map +1 -0
- package/dist/design/errors.d.ts +25 -0
- package/dist/design/errors.d.ts.map +1 -0
- package/dist/design/errors.js +30 -0
- package/dist/design/errors.js.map +1 -0
- package/dist/design/events.d.ts +18 -0
- package/dist/design/events.d.ts.map +1 -0
- package/dist/design/events.js +44 -0
- package/dist/design/events.js.map +1 -0
- package/dist/design/fingerprint.d.ts +10 -0
- package/dist/design/fingerprint.d.ts.map +1 -0
- package/dist/design/fingerprint.js +66 -0
- package/dist/design/fingerprint.js.map +1 -0
- package/dist/design/index-gen.d.ts +16 -0
- package/dist/design/index-gen.d.ts.map +1 -0
- package/dist/design/index-gen.js +94 -0
- package/dist/design/index-gen.js.map +1 -0
- package/dist/design/schema.d.ts +54 -0
- package/dist/design/schema.d.ts.map +1 -0
- package/dist/design/schema.js +408 -0
- package/dist/design/schema.js.map +1 -0
- package/dist/design/yaml.d.ts +12 -0
- package/dist/design/yaml.d.ts.map +1 -0
- package/dist/design/yaml.js +264 -0
- package/dist/design/yaml.js.map +1 -0
- package/dist/external.d.ts +61 -0
- package/dist/external.d.ts.map +1 -0
- package/dist/external.js +426 -0
- package/dist/external.js.map +1 -0
- package/dist/guide.d.ts +17 -0
- package/dist/guide.d.ts.map +1 -0
- package/dist/guide.js +219 -0
- package/dist/guide.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/install-external.d.ts +3 -0
- package/dist/install-external.d.ts.map +1 -0
- package/dist/install-external.js +37 -0
- package/dist/install-external.js.map +1 -0
- package/dist/library-install.d.ts +39 -0
- package/dist/library-install.d.ts.map +1 -0
- package/dist/library-install.js +663 -0
- package/dist/library-install.js.map +1 -0
- package/dist/orchestrator/boot.d.ts +3 -0
- package/dist/orchestrator/boot.d.ts.map +1 -0
- package/dist/orchestrator/boot.js +515 -0
- package/dist/orchestrator/boot.js.map +1 -0
- package/dist/orchestrator/cli.d.ts +37 -0
- package/dist/orchestrator/cli.d.ts.map +1 -0
- package/dist/orchestrator/cli.js +563 -0
- package/dist/orchestrator/cli.js.map +1 -0
- package/dist/orchestrator/commands.d.ts +46 -0
- package/dist/orchestrator/commands.d.ts.map +1 -0
- package/dist/orchestrator/commands.js +752 -0
- package/dist/orchestrator/commands.js.map +1 -0
- package/dist/orchestrator/compaction.d.ts +21 -0
- package/dist/orchestrator/compaction.d.ts.map +1 -0
- package/dist/orchestrator/compaction.js +93 -0
- package/dist/orchestrator/compaction.js.map +1 -0
- package/dist/orchestrator/drift.d.ts +11 -0
- package/dist/orchestrator/drift.d.ts.map +1 -0
- package/dist/orchestrator/drift.js +181 -0
- package/dist/orchestrator/drift.js.map +1 -0
- package/dist/orchestrator/errors.d.ts +52 -0
- package/dist/orchestrator/errors.d.ts.map +1 -0
- package/dist/orchestrator/errors.js +96 -0
- package/dist/orchestrator/errors.js.map +1 -0
- package/dist/orchestrator/frontmatter.d.ts +6 -0
- package/dist/orchestrator/frontmatter.d.ts.map +1 -0
- package/dist/orchestrator/frontmatter.js +50 -0
- package/dist/orchestrator/frontmatter.js.map +1 -0
- package/dist/orchestrator/fsx.d.ts +45 -0
- package/dist/orchestrator/fsx.d.ts.map +1 -0
- package/dist/orchestrator/fsx.js +295 -0
- package/dist/orchestrator/fsx.js.map +1 -0
- package/dist/orchestrator/handoff.d.ts +8 -0
- package/dist/orchestrator/handoff.d.ts.map +1 -0
- package/dist/orchestrator/handoff.js +246 -0
- package/dist/orchestrator/handoff.js.map +1 -0
- package/dist/orchestrator/hash.d.ts +10 -0
- package/dist/orchestrator/hash.d.ts.map +1 -0
- package/dist/orchestrator/hash.js +65 -0
- package/dist/orchestrator/hash.js.map +1 -0
- package/dist/orchestrator/journal.d.ts +35 -0
- package/dist/orchestrator/journal.d.ts.map +1 -0
- package/dist/orchestrator/journal.js +163 -0
- package/dist/orchestrator/journal.js.map +1 -0
- package/dist/orchestrator/lease.d.ts +31 -0
- package/dist/orchestrator/lease.d.ts.map +1 -0
- package/dist/orchestrator/lease.js +175 -0
- package/dist/orchestrator/lease.js.map +1 -0
- package/dist/orchestrator/plan.d.ts +27 -0
- package/dist/orchestrator/plan.d.ts.map +1 -0
- package/dist/orchestrator/plan.js +240 -0
- package/dist/orchestrator/plan.js.map +1 -0
- package/dist/orchestrator/report.d.ts +49 -0
- package/dist/orchestrator/report.d.ts.map +1 -0
- package/dist/orchestrator/report.js +244 -0
- package/dist/orchestrator/report.js.map +1 -0
- package/dist/orchestrator/state.d.ts +43 -0
- package/dist/orchestrator/state.d.ts.map +1 -0
- package/dist/orchestrator/state.js +369 -0
- package/dist/orchestrator/state.js.map +1 -0
- package/dist/orchestrator/store.d.ts +42 -0
- package/dist/orchestrator/store.d.ts.map +1 -0
- package/dist/orchestrator/store.js +202 -0
- package/dist/orchestrator/store.js.map +1 -0
- package/dist/orchestrator/test-hooks.d.ts +5 -0
- package/dist/orchestrator/test-hooks.d.ts.map +1 -0
- package/dist/orchestrator/test-hooks.js +31 -0
- package/dist/orchestrator/test-hooks.js.map +1 -0
- package/dist/orchestrator/time.d.ts +11 -0
- package/dist/orchestrator/time.d.ts.map +1 -0
- package/dist/orchestrator/time.js +38 -0
- package/dist/orchestrator/time.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +42 -0
- package/dist/paths.js.map +1 -0
- package/dist/pinned-source.d.ts +13 -0
- package/dist/pinned-source.d.ts.map +1 -0
- package/dist/pinned-source.js +238 -0
- package/dist/pinned-source.js.map +1 -0
- package/dist/reconcile/cli.d.ts +17 -0
- package/dist/reconcile/cli.d.ts.map +1 -0
- package/dist/reconcile/cli.js +171 -0
- package/dist/reconcile/cli.js.map +1 -0
- package/dist/reconcile/detectors.d.ts +29 -0
- package/dist/reconcile/detectors.d.ts.map +1 -0
- package/dist/reconcile/detectors.js +294 -0
- package/dist/reconcile/detectors.js.map +1 -0
- package/dist/reconcile/manifest.d.ts +11 -0
- package/dist/reconcile/manifest.d.ts.map +1 -0
- package/dist/reconcile/manifest.js +118 -0
- package/dist/reconcile/manifest.js.map +1 -0
- package/dist/reconcile/queue.d.ts +3 -0
- package/dist/reconcile/queue.d.ts.map +1 -0
- package/dist/reconcile/queue.js +723 -0
- package/dist/reconcile/queue.js.map +1 -0
- package/dist/reconcile/score.d.ts +19 -0
- package/dist/reconcile/score.d.ts.map +1 -0
- package/dist/reconcile/score.js +58 -0
- package/dist/reconcile/score.js.map +1 -0
- package/dist/scripts/check-opencode-config.d.ts +12 -0
- package/dist/scripts/check-opencode-config.d.ts.map +1 -0
- package/dist/scripts/check-opencode-config.js +216 -0
- package/dist/scripts/check-opencode-config.js.map +1 -0
- package/dist/scripts/check-pack.d.ts +3 -0
- package/dist/scripts/check-pack.d.ts.map +1 -0
- package/dist/scripts/check-pack.js +74 -0
- package/dist/scripts/check-pack.js.map +1 -0
- package/dist/scripts/check-pins.d.ts +9 -0
- package/dist/scripts/check-pins.d.ts.map +1 -0
- package/dist/scripts/check-pins.js +65 -0
- package/dist/scripts/check-pins.js.map +1 -0
- package/dist/scripts/check-security.d.ts +3 -0
- package/dist/scripts/check-security.d.ts.map +1 -0
- package/dist/scripts/check-security.js +47 -0
- package/dist/scripts/check-security.js.map +1 -0
- package/dist/scripts/check-skills-lock.d.ts +7 -0
- package/dist/scripts/check-skills-lock.d.ts.map +1 -0
- package/dist/scripts/check-skills-lock.js +36 -0
- package/dist/scripts/check-skills-lock.js.map +1 -0
- package/dist/scripts/check-skills-sync.d.ts +7 -0
- package/dist/scripts/check-skills-sync.d.ts.map +1 -0
- package/dist/scripts/check-skills-sync.js +146 -0
- package/dist/scripts/check-skills-sync.js.map +1 -0
- package/dist/scripts/check-yaml.d.ts +3 -0
- package/dist/scripts/check-yaml.d.ts.map +1 -0
- package/dist/scripts/check-yaml.js +41 -0
- package/dist/scripts/check-yaml.js.map +1 -0
- package/dist/scripts/publish-npm.d.ts +3 -0
- package/dist/scripts/publish-npm.d.ts.map +1 -0
- package/dist/scripts/publish-npm.js +67 -0
- package/dist/scripts/publish-npm.js.map +1 -0
- package/dist/scripts/release-check.d.ts +3 -0
- package/dist/scripts/release-check.d.ts.map +1 -0
- package/dist/scripts/release-check.js +97 -0
- package/dist/scripts/release-check.js.map +1 -0
- package/dist/scripts/support.d.ts +41 -0
- package/dist/scripts/support.d.ts.map +1 -0
- package/dist/scripts/support.js +78 -0
- package/dist/scripts/support.js.map +1 -0
- package/dist/targets/claude.d.ts +4 -0
- package/dist/targets/claude.d.ts.map +1 -0
- package/dist/targets/claude.js +42 -0
- package/dist/targets/claude.js.map +1 -0
- package/dist/targets/cline.d.ts +4 -0
- package/dist/targets/cline.d.ts.map +1 -0
- package/dist/targets/cline.js +39 -0
- package/dist/targets/cline.js.map +1 -0
- package/dist/targets/cursor.d.ts +4 -0
- package/dist/targets/cursor.d.ts.map +1 -0
- package/dist/targets/cursor.js +40 -0
- package/dist/targets/cursor.js.map +1 -0
- package/dist/targets/index.d.ts +4 -0
- package/dist/targets/index.d.ts.map +1 -0
- package/dist/targets/index.js +11 -0
- package/dist/targets/index.js.map +1 -0
- package/dist/targets/opencode.d.ts +4 -0
- package/dist/targets/opencode.d.ts.map +1 -0
- package/dist/targets/opencode.js +48 -0
- package/dist/targets/opencode.js.map +1 -0
- package/dist/targets/windsurf.d.ts +4 -0
- package/dist/targets/windsurf.d.ts.map +1 -0
- package/dist/targets/windsurf.js +41 -0
- package/dist/targets/windsurf.js.map +1 -0
- package/dist/types/common.d.ts +193 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +6 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/design.d.ts +185 -0
- package/dist/types/design.d.ts.map +1 -0
- package/dist/types/design.js +3 -0
- package/dist/types/design.js.map +1 -0
- package/dist/types/guards.d.ts +13 -0
- package/dist/types/guards.d.ts.map +1 -0
- package/dist/types/guards.js +64 -0
- package/dist/types/guards.js.map +1 -0
- package/dist/types/handoff.d.ts +29 -0
- package/dist/types/handoff.d.ts.map +1 -0
- package/dist/types/handoff.js +3 -0
- package/dist/types/handoff.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/orchestrator.d.ts +414 -0
- package/dist/types/orchestrator.d.ts.map +1 -0
- package/dist/types/orchestrator.js +4 -0
- package/dist/types/orchestrator.js.map +1 -0
- package/dist/types/reconcile.d.ts +160 -0
- package/dist/types/reconcile.d.ts.map +1 -0
- package/dist/types/reconcile.js +3 -0
- package/dist/types/reconcile.js.map +1 -0
- package/docs/RECONCILE.md +505 -0
- package/docs/design/_schema.md +506 -0
- package/junamis-skills.yml +328 -0
- package/library/EXTERNAL.md +35 -0
- package/library/HANDOFF.md +93 -0
- package/library/RESUME.md +429 -0
- package/library/SAFETY.md +83 -0
- package/library/agents/context-keeper.md +41 -0
- package/library/agents/frontend.md +43 -0
- package/library/agents/maintainer.md +44 -0
- package/library/agents/nestjs.md +40 -0
- package/library/agents/nextjs.md +40 -0
- package/library/agents/operator.md +42 -0
- package/library/agents/orchestrator.md +313 -0
- package/library/agents/researcher.md +40 -0
- package/library/agents/reviewer.md +40 -0
- package/library/skills/db-migrate/SKILL.md +50 -0
- package/library/skills/decision-record/SKILL.md +74 -0
- package/library/skills/dependency-upgrade/SKILL.md +57 -0
- package/library/skills/deploy-verify/SKILL.md +51 -0
- package/library/skills/document/SKILL.md +51 -0
- package/library/skills/env-doctor/SKILL.md +65 -0
- package/library/skills/frontend/SKILL.md +63 -0
- package/library/skills/handoff/SKILL.md +79 -0
- package/library/skills/incident-response/SKILL.md +69 -0
- package/library/skills/nestjs/SKILL.md +49 -0
- package/library/skills/nextjs/SKILL.md +48 -0
- package/library/skills/perf-budget/SKILL.md +62 -0
- package/library/skills/refactor-safely/SKILL.md +48 -0
- package/library/skills/release-prep/SKILL.md +75 -0
- package/library/skills/research/SKILL.md +66 -0
- package/library/skills/rollback/SKILL.md +49 -0
- package/library/skills/route/SKILL.md +107 -0
- package/library/skills/route-external/SKILL.md +67 -0
- package/library/skills/security-audit/SKILL.md +64 -0
- package/library/skills/skill-author/SKILL.md +49 -0
- package/opencode.json +5906 -0
- package/package.json +88 -4
- package/scripts/design-registry.mjs +7 -0
- package/scripts/orchestrator-state.mjs +7 -0
- package/scripts/reconcile.mjs +7 -0
- package/skills-lock.json +197 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Generate the derived design registry index.
|
|
2
|
+
//
|
|
3
|
+
// The output is byte-stable for the same input. The Generated timestamp comes
|
|
4
|
+
// from the newest last_reviewed date at T00:00:00Z, or from an explicit
|
|
5
|
+
// --generated-at value, never from the wall clock on its own.
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { atomicWriteText } from "./atomic.js";
|
|
8
|
+
import { ValidationError } from "./errors.js";
|
|
9
|
+
import { loadSurfaces, parseSections, STATUS_ORDER } from "./schema.js";
|
|
10
|
+
const EMPTY_DATE = "1970-01-01T00:00:00Z";
|
|
11
|
+
function byteSort(values) {
|
|
12
|
+
return [...values].sort((a, b) => Buffer.compare(Buffer.from(a, "utf8"), Buffer.from(b, "utf8")));
|
|
13
|
+
}
|
|
14
|
+
function cell(value) {
|
|
15
|
+
const text = value === null || value === undefined ? "" : String(value);
|
|
16
|
+
return text.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
|
|
17
|
+
}
|
|
18
|
+
export function countGaps(body) {
|
|
19
|
+
let parsed;
|
|
20
|
+
try {
|
|
21
|
+
parsed = parseSections(body);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
const lines = parsed.sections.get("Known gaps") ?? [];
|
|
27
|
+
return lines
|
|
28
|
+
.map((line) => line.trim())
|
|
29
|
+
.filter((line) => line.startsWith("- ") && line !== "- None").length;
|
|
30
|
+
}
|
|
31
|
+
export function deriveGeneratedAt(surfaces, override = null) {
|
|
32
|
+
if (override) {
|
|
33
|
+
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(override)) {
|
|
34
|
+
throw new ValidationError("--generated-at must be an ISO timestamp like 2026-11-09T00:00:00Z");
|
|
35
|
+
}
|
|
36
|
+
return override;
|
|
37
|
+
}
|
|
38
|
+
let newest = null;
|
|
39
|
+
for (const surface of surfaces) {
|
|
40
|
+
const date = surface.frontmatter?.last_reviewed;
|
|
41
|
+
if (typeof date === "string" && /^\d{4}-\d{2}-\d{2}$/.test(date)) {
|
|
42
|
+
if (newest === null || date > newest)
|
|
43
|
+
newest = date;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return newest ? `${newest}T00:00:00Z` : EMPTY_DATE;
|
|
47
|
+
}
|
|
48
|
+
export async function generateIndex({ designRoot, generatedAt = null }) {
|
|
49
|
+
const loaded = await loadSurfaces(designRoot, { validate: true });
|
|
50
|
+
if (loaded.errors.length > 0) {
|
|
51
|
+
const lines = loaded.errors.flatMap((entry) => entry.errors.map((error) => `${entry.file}: ${error}`));
|
|
52
|
+
throw new ValidationError("cannot generate INDEX.md from an invalid design registry", { errors: lines });
|
|
53
|
+
}
|
|
54
|
+
const surfaces = [...loaded.surfaces].sort((a, b) => {
|
|
55
|
+
return Buffer.compare(Buffer.from(a.surface_id, "utf8"), Buffer.from(b.surface_id, "utf8"));
|
|
56
|
+
});
|
|
57
|
+
const counts = {};
|
|
58
|
+
for (const status of STATUS_ORDER)
|
|
59
|
+
counts[status] = 0;
|
|
60
|
+
for (const surface of surfaces) {
|
|
61
|
+
const status = surface.frontmatter?.status;
|
|
62
|
+
if (typeof status === "string" && Object.prototype.hasOwnProperty.call(counts, status)) {
|
|
63
|
+
counts[status] = (counts[status] ?? 0) + 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const stamp = deriveGeneratedAt(surfaces, generatedAt);
|
|
67
|
+
const summary = STATUS_ORDER.map((status) => `${status} ${counts[status] ?? 0}`).join(" · ");
|
|
68
|
+
const lines = [
|
|
69
|
+
"# Design Registry Index",
|
|
70
|
+
"",
|
|
71
|
+
`Generated: ${stamp}`,
|
|
72
|
+
`Surfaces: ${surfaces.length} · ${summary}`,
|
|
73
|
+
"",
|
|
74
|
+
"| surface_id | kind | app | status | version | last_reviewed | gaps |",
|
|
75
|
+
"|-----------|------|-----|--------|---------|---------------|------|",
|
|
76
|
+
];
|
|
77
|
+
for (const surface of surfaces) {
|
|
78
|
+
const frontmatter = surface.frontmatter ?? {};
|
|
79
|
+
lines.push(`| ${cell(surface.surface_id)} | ${cell(frontmatter.kind)} | ${cell(frontmatter.app ?? "")} | ${cell(frontmatter.status)} | ${cell(frontmatter.version)} | ${cell(frontmatter.last_reviewed)} | ${countGaps(surface.body)} |`);
|
|
80
|
+
}
|
|
81
|
+
lines.push("");
|
|
82
|
+
return { content: lines.join("\n"), generatedAt: stamp, surfaceCount: surfaces.length, statusCounts: counts, surfaces };
|
|
83
|
+
}
|
|
84
|
+
export function indexFilePath(designRoot) {
|
|
85
|
+
return join(designRoot, "INDEX.md");
|
|
86
|
+
}
|
|
87
|
+
export async function writeIndex({ designRoot, generatedAt = null }) {
|
|
88
|
+
const result = await generateIndex({ designRoot, generatedAt });
|
|
89
|
+
const path = indexFilePath(designRoot);
|
|
90
|
+
await atomicWriteText(path, result.content);
|
|
91
|
+
return { ...result, path };
|
|
92
|
+
}
|
|
93
|
+
export { byteSort };
|
|
94
|
+
//# sourceMappingURL=index-gen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-gen.js","sourceRoot":"","sources":["../../src/design/index-gen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { DesignKind, DesignStatus, DesignSurface, DesignValidation } from "../types/design.js";
|
|
2
|
+
export declare const KINDS: readonly DesignKind[];
|
|
3
|
+
export declare const STATUSES: readonly DesignStatus[];
|
|
4
|
+
export declare const STATUS_ORDER: readonly DesignStatus[];
|
|
5
|
+
export declare const COMMON_SECTIONS: readonly string[];
|
|
6
|
+
export declare const KIND_SECTIONS: Readonly<Record<DesignKind, readonly string[]>>;
|
|
7
|
+
export declare function isKind(value: unknown): value is DesignKind;
|
|
8
|
+
export declare function isSurfaceId(value: unknown): value is string;
|
|
9
|
+
export declare function isStatus(value: unknown): value is DesignStatus;
|
|
10
|
+
export declare function requiredSections(kind: unknown): string[] | null;
|
|
11
|
+
export declare function canonicalSectionOrder(kind: unknown): string[] | null;
|
|
12
|
+
export interface ParsedSections {
|
|
13
|
+
readonly sections: Map<string, string[]>;
|
|
14
|
+
readonly order: string[];
|
|
15
|
+
}
|
|
16
|
+
export declare function parseSections(body: unknown): ParsedSections;
|
|
17
|
+
export declare function canonicalBody(body: unknown, kind: unknown): string;
|
|
18
|
+
export declare function computeDesignChecksum(body: unknown, kind: unknown): string;
|
|
19
|
+
export declare function validateFrontmatter(data: unknown, { kind }?: {
|
|
20
|
+
readonly kind?: string | null;
|
|
21
|
+
}): string[];
|
|
22
|
+
export declare function validateSections(body: unknown, kind: unknown): string[];
|
|
23
|
+
export declare function relativeSurfaceId(file: string, designRoot: string): string;
|
|
24
|
+
export interface ValidateTextOptions {
|
|
25
|
+
readonly file?: string | null;
|
|
26
|
+
readonly designRoot?: string | null;
|
|
27
|
+
readonly requireChecksum?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function validateDesignText(text: string, { file, designRoot, requireChecksum, }?: ValidateTextOptions): DesignValidation;
|
|
30
|
+
export declare function listSurfaceFiles(designRoot: string): Promise<string[]>;
|
|
31
|
+
export interface SurfaceError {
|
|
32
|
+
readonly file: string;
|
|
33
|
+
readonly errors: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
export interface LoadedSurfaces {
|
|
36
|
+
readonly files: string[];
|
|
37
|
+
readonly surfaces: DesignSurface[];
|
|
38
|
+
readonly errors: SurfaceError[];
|
|
39
|
+
}
|
|
40
|
+
export declare function loadSurfaces(designRoot: string, { validate }?: {
|
|
41
|
+
readonly validate?: boolean;
|
|
42
|
+
}): Promise<LoadedSurfaces>;
|
|
43
|
+
export interface RegistryValidation {
|
|
44
|
+
readonly ok: boolean;
|
|
45
|
+
readonly count: number;
|
|
46
|
+
readonly files: string[];
|
|
47
|
+
readonly surfaces: DesignSurface[];
|
|
48
|
+
readonly errors: SurfaceError[];
|
|
49
|
+
}
|
|
50
|
+
export declare function validateRegistry(designRoot: string): Promise<RegistryValidation>;
|
|
51
|
+
export declare function readSurface(designRoot: string, surfaceId: unknown): Promise<DesignValidation | null>;
|
|
52
|
+
export declare function surfacePath(designRoot: string, surfaceId: string): string;
|
|
53
|
+
export declare function parentDir(file: string): string;
|
|
54
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/design/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
// Design registry schema: frontmatter, required body sections, canonical body,
|
|
2
|
+
// and checksum.
|
|
3
|
+
//
|
|
4
|
+
// The checksum is computed over the canonicalized body only. Sections are put
|
|
5
|
+
// in a fixed order, trailing whitespace is stripped per line, line endings are
|
|
6
|
+
// normalized to \n, and frontmatter is excluded.
|
|
7
|
+
import { dirname, isAbsolute, join, relative } from "node:path";
|
|
8
|
+
import { listDir, readText, statSafe, toPosixPath } from "../orchestrator/fsx.js";
|
|
9
|
+
import { sha256Hex } from "../orchestrator/hash.js";
|
|
10
|
+
import { ValidationError } from "./errors.js";
|
|
11
|
+
import { parseFrontmatterDocument } from "./yaml.js";
|
|
12
|
+
import { errorMessage } from "../types/guards.js";
|
|
13
|
+
export const KINDS = Object.freeze(["web", "api", "data", "infra", "cli", "other"]);
|
|
14
|
+
export const STATUSES = Object.freeze(["draft", "active", "deprecated", "needs_review"]);
|
|
15
|
+
export const STATUS_ORDER = Object.freeze(["active", "draft", "deprecated", "needs_review"]);
|
|
16
|
+
export const COMMON_SECTIONS = Object.freeze(["Intent", "Current state", "Known gaps", "Change log"]);
|
|
17
|
+
export const KIND_SECTIONS = Object.freeze({
|
|
18
|
+
web: Object.freeze(["Structure", "Routes", "State & data", "Props & events", "Accessibility"]),
|
|
19
|
+
api: Object.freeze(["Endpoint", "Request", "Response — 200", "Errors", "Examples"]),
|
|
20
|
+
data: Object.freeze(["Entities", "Indexes", "Migrations"]),
|
|
21
|
+
infra: Object.freeze(["Topology", "Resources", "Env & secrets"]),
|
|
22
|
+
cli: Object.freeze(["Command", "Flags", "Output"]),
|
|
23
|
+
other: Object.freeze([]),
|
|
24
|
+
});
|
|
25
|
+
const REQUIRED_KEYS = Object.freeze([
|
|
26
|
+
"surface_id",
|
|
27
|
+
"kind",
|
|
28
|
+
"status",
|
|
29
|
+
"version",
|
|
30
|
+
"owner",
|
|
31
|
+
"code_paths",
|
|
32
|
+
"depends_on",
|
|
33
|
+
"related_tasks",
|
|
34
|
+
"last_reviewed",
|
|
35
|
+
"design_checksum",
|
|
36
|
+
]);
|
|
37
|
+
const OPTIONAL_KEYS = Object.freeze(["app", "last_reviewed_commit"]);
|
|
38
|
+
const SURFACE_ID_RE = /^[a-z0-9][a-z0-9._-]*(\/[a-z0-9][a-z0-9._-]*)*$/;
|
|
39
|
+
const VERSION_RE = /^\d+\.\d+\.\d+$/;
|
|
40
|
+
const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
41
|
+
const CHECKSUM_RE = /^sha256:[0-9a-f]{64}$/;
|
|
42
|
+
const COMMIT_RE = /^[0-9a-f]{40}$/;
|
|
43
|
+
export function isKind(value) {
|
|
44
|
+
return typeof value === "string" && KINDS.includes(value);
|
|
45
|
+
}
|
|
46
|
+
export function isSurfaceId(value) {
|
|
47
|
+
return typeof value === "string" && SURFACE_ID_RE.test(value);
|
|
48
|
+
}
|
|
49
|
+
export function isStatus(value) {
|
|
50
|
+
return typeof value === "string" && STATUSES.includes(value);
|
|
51
|
+
}
|
|
52
|
+
export function requiredSections(kind) {
|
|
53
|
+
if (!isKind(kind))
|
|
54
|
+
return null;
|
|
55
|
+
return [...COMMON_SECTIONS, ...KIND_SECTIONS[kind]];
|
|
56
|
+
}
|
|
57
|
+
export function canonicalSectionOrder(kind) {
|
|
58
|
+
if (!isKind(kind))
|
|
59
|
+
return null;
|
|
60
|
+
return ["Intent", "Current state", "Known gaps", ...KIND_SECTIONS[kind], "Change log"];
|
|
61
|
+
}
|
|
62
|
+
export function parseSections(body) {
|
|
63
|
+
const text = String(body ?? "").replace(/\r\n?/g, "\n");
|
|
64
|
+
const sections = new Map();
|
|
65
|
+
const order = [];
|
|
66
|
+
let current = null;
|
|
67
|
+
for (const line of text.split("\n")) {
|
|
68
|
+
const match = /^##\s+(.+?)\s*$/.exec(line);
|
|
69
|
+
if (match) {
|
|
70
|
+
const title = (match[1] ?? "").trim();
|
|
71
|
+
if (sections.has(title)) {
|
|
72
|
+
throw new ValidationError(`duplicate section "## ${title}"`, { errors: [`duplicate section ${title}`] });
|
|
73
|
+
}
|
|
74
|
+
sections.set(title, []);
|
|
75
|
+
order.push(title);
|
|
76
|
+
current = title;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (current === null) {
|
|
80
|
+
if (line.trim().length > 0) {
|
|
81
|
+
throw new ValidationError("body content appears before the first section", {
|
|
82
|
+
errors: ["body content before the first ## section"],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
sections.get(current)?.push(line);
|
|
88
|
+
}
|
|
89
|
+
return { sections, order };
|
|
90
|
+
}
|
|
91
|
+
function normalizeSection(lines) {
|
|
92
|
+
return (lines ?? [])
|
|
93
|
+
.map((line) => line.replace(/[ \t]+$/, ""))
|
|
94
|
+
.join("\n")
|
|
95
|
+
.replace(/^\n+/, "")
|
|
96
|
+
.replace(/\n+$/, "");
|
|
97
|
+
}
|
|
98
|
+
export function canonicalBody(body, kind) {
|
|
99
|
+
const order = canonicalSectionOrder(kind);
|
|
100
|
+
if (!order)
|
|
101
|
+
throw new ValidationError(`unknown kind ${JSON.stringify(kind)}`);
|
|
102
|
+
const { sections } = parseSections(body);
|
|
103
|
+
const parts = [];
|
|
104
|
+
for (const title of order) {
|
|
105
|
+
const content = normalizeSection(sections.get(title));
|
|
106
|
+
parts.push(content.length > 0 ? `## ${title}\n\n${content}\n` : `## ${title}\n`);
|
|
107
|
+
}
|
|
108
|
+
return parts.join("\n");
|
|
109
|
+
}
|
|
110
|
+
export function computeDesignChecksum(body, kind) {
|
|
111
|
+
return `sha256:${sha256Hex(canonicalBody(body, kind))}`;
|
|
112
|
+
}
|
|
113
|
+
function isValidDate(value) {
|
|
114
|
+
if (typeof value !== "string" || !DATE_RE.test(value))
|
|
115
|
+
return false;
|
|
116
|
+
const date = new Date(`${value}T00:00:00Z`);
|
|
117
|
+
return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
|
|
118
|
+
}
|
|
119
|
+
function stringList(value, name, errors) {
|
|
120
|
+
if (!Array.isArray(value)) {
|
|
121
|
+
errors.push(`${name} must be a list`);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
for (const entry of value) {
|
|
125
|
+
if (typeof entry !== "string" || entry.length === 0)
|
|
126
|
+
errors.push(`${name} entries must be non-empty strings`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function validateCodePath(path, errors) {
|
|
130
|
+
if (typeof path !== "string" || path.length === 0) {
|
|
131
|
+
errors.push("code_paths entries must be non-empty strings");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (isAbsolute(path) || path.split(/[\\/]+/).includes("..")) {
|
|
135
|
+
errors.push(`code_paths entry ${JSON.stringify(path)} must be a repo-relative glob`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function validateFrontmatter(data, { kind = null } = {}) {
|
|
139
|
+
const errors = [];
|
|
140
|
+
if (data === null || typeof data !== "object" || Array.isArray(data)) {
|
|
141
|
+
return ["frontmatter must be a mapping"];
|
|
142
|
+
}
|
|
143
|
+
const fields = data;
|
|
144
|
+
for (const key of REQUIRED_KEYS) {
|
|
145
|
+
if (!Object.prototype.hasOwnProperty.call(fields, key))
|
|
146
|
+
errors.push(`missing required key ${key}`);
|
|
147
|
+
}
|
|
148
|
+
for (const key of Object.keys(fields)) {
|
|
149
|
+
if (!REQUIRED_KEYS.includes(key) && !OPTIONAL_KEYS.includes(key))
|
|
150
|
+
errors.push(`unknown frontmatter key ${key}`);
|
|
151
|
+
}
|
|
152
|
+
if (typeof fields["surface_id"] !== "string" || !SURFACE_ID_RE.test(fields["surface_id"])) {
|
|
153
|
+
errors.push("surface_id must be a lowercase slash-separated id");
|
|
154
|
+
}
|
|
155
|
+
if (!isKind(fields["kind"]))
|
|
156
|
+
errors.push(`kind must be one of ${KINDS.join(", ")}`);
|
|
157
|
+
if (kind && fields["kind"] !== kind)
|
|
158
|
+
errors.push(`kind ${JSON.stringify(fields["kind"])} does not match its directory ${kind}`);
|
|
159
|
+
if (!isStatus(fields["status"]))
|
|
160
|
+
errors.push(`status must be one of ${STATUSES.join(", ")}`);
|
|
161
|
+
if (typeof fields["version"] !== "string" || !VERSION_RE.test(fields["version"])) {
|
|
162
|
+
errors.push("version must be a semver string such as 1.0.0");
|
|
163
|
+
}
|
|
164
|
+
if (typeof fields["owner"] !== "string" || fields["owner"].trim().length === 0) {
|
|
165
|
+
errors.push("owner must be a non-empty string");
|
|
166
|
+
}
|
|
167
|
+
stringList(fields["code_paths"], "code_paths", errors);
|
|
168
|
+
for (const path of Array.isArray(fields["code_paths"]) ? fields["code_paths"] : []) {
|
|
169
|
+
validateCodePath(path, errors);
|
|
170
|
+
}
|
|
171
|
+
stringList(fields["depends_on"], "depends_on", errors);
|
|
172
|
+
for (const dep of Array.isArray(fields["depends_on"]) ? fields["depends_on"] : []) {
|
|
173
|
+
if (typeof dep === "string" && !SURFACE_ID_RE.test(dep))
|
|
174
|
+
errors.push(`depends_on entry ${JSON.stringify(dep)} is not a surface_id`);
|
|
175
|
+
}
|
|
176
|
+
stringList(fields["related_tasks"], "related_tasks", errors);
|
|
177
|
+
if (typeof fields["last_reviewed"] !== "string" || !isValidDate(fields["last_reviewed"])) {
|
|
178
|
+
errors.push("last_reviewed must be a YYYY-MM-DD date");
|
|
179
|
+
}
|
|
180
|
+
if (typeof fields["design_checksum"] !== "string" || !CHECKSUM_RE.test(fields["design_checksum"])) {
|
|
181
|
+
errors.push("design_checksum must be sha256: followed by 64 lowercase hex characters");
|
|
182
|
+
}
|
|
183
|
+
if (Object.prototype.hasOwnProperty.call(fields, "app") && (typeof fields["app"] !== "string" || fields["app"].length === 0)) {
|
|
184
|
+
errors.push("app must be a non-empty string when present");
|
|
185
|
+
}
|
|
186
|
+
if (Object.prototype.hasOwnProperty.call(fields, "last_reviewed_commit")) {
|
|
187
|
+
if (typeof fields["last_reviewed_commit"] !== "string" || !COMMIT_RE.test(fields["last_reviewed_commit"])) {
|
|
188
|
+
errors.push("last_reviewed_commit must be a 40-character lowercase commit SHA when present");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return errors;
|
|
192
|
+
}
|
|
193
|
+
export function validateSections(body, kind) {
|
|
194
|
+
const errors = [];
|
|
195
|
+
const required = requiredSections(kind);
|
|
196
|
+
if (!required)
|
|
197
|
+
return [`unknown kind ${JSON.stringify(kind)}`];
|
|
198
|
+
let parsed;
|
|
199
|
+
try {
|
|
200
|
+
parsed = parseSections(body);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return [errorMessage(error)];
|
|
204
|
+
}
|
|
205
|
+
for (const title of required) {
|
|
206
|
+
if (!parsed.sections.has(title))
|
|
207
|
+
errors.push(`missing required section ## ${title}`);
|
|
208
|
+
}
|
|
209
|
+
for (const title of parsed.order) {
|
|
210
|
+
if (!required.includes(title))
|
|
211
|
+
errors.push(`unknown section ## ${title}`);
|
|
212
|
+
}
|
|
213
|
+
const gaps = parsed.sections.get("Known gaps");
|
|
214
|
+
if (gaps) {
|
|
215
|
+
const lines = gaps.map((line) => line.trim()).filter(Boolean);
|
|
216
|
+
if (lines.length === 0) {
|
|
217
|
+
errors.push("## Known gaps must be explicit; use - None when there are no gaps");
|
|
218
|
+
}
|
|
219
|
+
for (const line of lines) {
|
|
220
|
+
if (!line.startsWith("- "))
|
|
221
|
+
errors.push(`## Known gaps line is not a bullet: ${line}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const changeLog = parsed.sections.get("Change log");
|
|
225
|
+
if (changeLog) {
|
|
226
|
+
for (const line of changeLog.map((entry) => entry.trim()).filter(Boolean)) {
|
|
227
|
+
if (!line.startsWith("- "))
|
|
228
|
+
errors.push(`## Change log line is not a bullet: ${line}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return errors;
|
|
232
|
+
}
|
|
233
|
+
export function relativeSurfaceId(file, designRoot) {
|
|
234
|
+
const rel = toPosixPath(relative(designRoot, file));
|
|
235
|
+
return rel.endsWith(".md") ? rel.slice(0, -3) : rel;
|
|
236
|
+
}
|
|
237
|
+
export function validateDesignText(text, { file = null, designRoot = null, requireChecksum = true, } = {}) {
|
|
238
|
+
let parsed;
|
|
239
|
+
try {
|
|
240
|
+
parsed = parseFrontmatterDocument(text, { label: file ?? "design file" });
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
return {
|
|
244
|
+
ok: false,
|
|
245
|
+
errors: [errorMessage(error)],
|
|
246
|
+
file,
|
|
247
|
+
frontmatter: null,
|
|
248
|
+
body: null,
|
|
249
|
+
checksum: null,
|
|
250
|
+
surfaceId: null,
|
|
251
|
+
kind: null,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
const { data, body } = parsed;
|
|
255
|
+
let kind = data["kind"] ?? null;
|
|
256
|
+
let pathKind = null;
|
|
257
|
+
let surfaceId = data["surface_id"] ?? null;
|
|
258
|
+
if (file && designRoot) {
|
|
259
|
+
const rel = relativeSurfaceId(file, designRoot);
|
|
260
|
+
surfaceId = rel;
|
|
261
|
+
const candidate = rel.split("/")[0] ?? "";
|
|
262
|
+
if (!isKind(candidate)) {
|
|
263
|
+
return {
|
|
264
|
+
ok: false,
|
|
265
|
+
errors: [`file is not under a known kind directory: ${rel}`],
|
|
266
|
+
file,
|
|
267
|
+
frontmatter: data,
|
|
268
|
+
body,
|
|
269
|
+
checksum: null,
|
|
270
|
+
surfaceId: rel,
|
|
271
|
+
kind: null,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
pathKind = candidate;
|
|
275
|
+
kind = candidate;
|
|
276
|
+
}
|
|
277
|
+
const errors = validateFrontmatter(data, { kind: pathKind });
|
|
278
|
+
if (typeof surfaceId === "string" && typeof data["surface_id"] === "string" && data["surface_id"] !== surfaceId) {
|
|
279
|
+
errors.push(`surface_id ${JSON.stringify(data["surface_id"])} does not equal its path ${JSON.stringify(surfaceId)}`);
|
|
280
|
+
}
|
|
281
|
+
if (isKind(kind))
|
|
282
|
+
errors.push(...validateSections(body, kind));
|
|
283
|
+
let checksum = null;
|
|
284
|
+
if (isKind(kind)) {
|
|
285
|
+
try {
|
|
286
|
+
checksum = computeDesignChecksum(body, kind);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
errors.push(errorMessage(error));
|
|
290
|
+
}
|
|
291
|
+
if (requireChecksum && checksum && data["design_checksum"] !== checksum) {
|
|
292
|
+
errors.push(`design_checksum does not match the body (expected ${checksum})`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const parsedFrontmatter = data;
|
|
296
|
+
if (errors.length > 0) {
|
|
297
|
+
return {
|
|
298
|
+
ok: false,
|
|
299
|
+
errors,
|
|
300
|
+
file,
|
|
301
|
+
frontmatter: parsedFrontmatter,
|
|
302
|
+
body,
|
|
303
|
+
checksum,
|
|
304
|
+
surfaceId: typeof surfaceId === "string" ? surfaceId : null,
|
|
305
|
+
kind: isKind(kind) ? kind : null,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// The checks above prove every required field, the kind, the body checksum,
|
|
309
|
+
// and the surface id, so the validated contract is the accurate shape here.
|
|
310
|
+
return {
|
|
311
|
+
ok: true,
|
|
312
|
+
errors,
|
|
313
|
+
file,
|
|
314
|
+
frontmatter: data,
|
|
315
|
+
body,
|
|
316
|
+
checksum: checksum,
|
|
317
|
+
surfaceId: surfaceId,
|
|
318
|
+
kind: kind,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
export async function listSurfaceFiles(designRoot) {
|
|
322
|
+
const files = [];
|
|
323
|
+
for (const kind of KINDS) {
|
|
324
|
+
const dir = join(designRoot, kind);
|
|
325
|
+
const stat = await statSafe(dir);
|
|
326
|
+
if (!stat || !stat.isDirectory())
|
|
327
|
+
continue;
|
|
328
|
+
await walk(dir, files);
|
|
329
|
+
}
|
|
330
|
+
files.sort((a, b) => Buffer.compare(Buffer.from(a, "utf8"), Buffer.from(b, "utf8")));
|
|
331
|
+
return files;
|
|
332
|
+
}
|
|
333
|
+
async function walk(dir, out) {
|
|
334
|
+
const entries = await listDir(dir);
|
|
335
|
+
for (const entry of entries) {
|
|
336
|
+
const path = join(dir, entry.name);
|
|
337
|
+
if (entry.isDirectory()) {
|
|
338
|
+
await walk(path, out);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
if (!entry.isFile() || !entry.name.endsWith(".md"))
|
|
342
|
+
continue;
|
|
343
|
+
out.push(path);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
export async function loadSurfaces(designRoot, { validate = false } = {}) {
|
|
347
|
+
const files = await listSurfaceFiles(designRoot);
|
|
348
|
+
const surfaces = [];
|
|
349
|
+
const errors = [];
|
|
350
|
+
for (const file of files) {
|
|
351
|
+
const text = await readText(file);
|
|
352
|
+
const result = validateDesignText(text ?? "", { file, designRoot, requireChecksum: validate });
|
|
353
|
+
if (validate && !result.ok) {
|
|
354
|
+
errors.push({ file, errors: result.errors });
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
if (!result.ok && result.frontmatter === null) {
|
|
358
|
+
errors.push({ file, errors: result.errors });
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
surfaces.push({
|
|
362
|
+
file,
|
|
363
|
+
relative: toPosixPath(relative(designRoot, file)),
|
|
364
|
+
surface_id: result.surfaceId ?? "",
|
|
365
|
+
frontmatter: result.frontmatter,
|
|
366
|
+
body: result.body,
|
|
367
|
+
checksum: result.checksum,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
return { files, surfaces, errors };
|
|
371
|
+
}
|
|
372
|
+
export async function validateRegistry(designRoot) {
|
|
373
|
+
const { files, surfaces, errors } = await loadSurfaces(designRoot, { validate: true });
|
|
374
|
+
const seen = new Map();
|
|
375
|
+
for (const surface of surfaces) {
|
|
376
|
+
const prior = seen.get(surface.surface_id);
|
|
377
|
+
if (prior !== undefined) {
|
|
378
|
+
errors.push({ file: surface.file, errors: [`duplicate surface_id also used by ${prior}`] });
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
seen.set(surface.surface_id, surface.relative);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return { ok: errors.length === 0, count: files.length, files, surfaces, errors };
|
|
385
|
+
}
|
|
386
|
+
export async function readSurface(designRoot, surfaceId) {
|
|
387
|
+
if (typeof surfaceId !== "string" || !SURFACE_ID_RE.test(surfaceId)) {
|
|
388
|
+
throw new ValidationError(`invalid surface_id ${JSON.stringify(surfaceId)}`);
|
|
389
|
+
}
|
|
390
|
+
const kind = surfaceId.split("/")[0] ?? "";
|
|
391
|
+
if (!isKind(kind))
|
|
392
|
+
throw new ValidationError(`surface_id ${surfaceId} does not start with a known kind`);
|
|
393
|
+
const file = join(designRoot, `${surfaceId}.md`);
|
|
394
|
+
const rel = relative(designRoot, file);
|
|
395
|
+
if (rel.startsWith("..") || isAbsolute(rel))
|
|
396
|
+
throw new ValidationError(`surface_id ${surfaceId} escapes the design root`);
|
|
397
|
+
const text = await readText(file);
|
|
398
|
+
if (text === null)
|
|
399
|
+
return null;
|
|
400
|
+
return validateDesignText(text, { file, designRoot, requireChecksum: true });
|
|
401
|
+
}
|
|
402
|
+
export function surfacePath(designRoot, surfaceId) {
|
|
403
|
+
return join(designRoot, `${surfaceId}.md`);
|
|
404
|
+
}
|
|
405
|
+
export function parentDir(file) {
|
|
406
|
+
return dirname(file);
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/design/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function parseScalar(raw: string, label?: string): unknown;
|
|
2
|
+
export interface YamlOptions {
|
|
3
|
+
readonly label?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function parseYaml(text: unknown, { label }?: YamlOptions): unknown;
|
|
6
|
+
/** A parsed design document: validated mapping plus the body after it. */
|
|
7
|
+
export interface ParsedDocument {
|
|
8
|
+
readonly data: Record<string, unknown>;
|
|
9
|
+
readonly body: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseFrontmatterDocument(text: unknown, { label }?: YamlOptions): ParsedDocument;
|
|
12
|
+
//# sourceMappingURL=yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/design/yaml.ts"],"names":[],"mappings":"AAwBA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAU,GAAG,OAAO,CA2BjE;AA4JD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAc,EAAE,GAAE,WAAgB,GAAG,OAAO,CA4BtF;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAqB,EAAE,GAAE,WAAgB,GAAG,cAAc,CAiBnH"}
|