@maadb/core 0.0.1 → 0.7.10-rc.3
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/LICENSE +21 -0
- package/README.md +371 -3
- package/dist/architect.d.ts +2 -0
- package/dist/architect.d.ts.map +1 -0
- package/dist/architect.js +273 -0
- package/dist/architect.js.map +1 -0
- package/dist/auth/resolve.d.ts +36 -0
- package/dist/auth/resolve.d.ts.map +1 -0
- package/dist/auth/resolve.js +77 -0
- package/dist/auth/resolve.js.map +1 -0
- package/dist/auth/token-store.d.ts +82 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +464 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/types.d.ts +75 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +15 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/backend/adapter.d.ts +57 -0
- package/dist/backend/adapter.d.ts.map +1 -0
- package/dist/backend/adapter.js +6 -0
- package/dist/backend/adapter.js.map +1 -0
- package/dist/backend/index.d.ts +3 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +2 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/sqlite/index.d.ts +63 -0
- package/dist/backend/sqlite/index.d.ts.map +1 -0
- package/dist/backend/sqlite/index.js +521 -0
- package/dist/backend/sqlite/index.js.map +1 -0
- package/dist/backend/sqlite/schema.d.ts +2 -0
- package/dist/backend/sqlite/schema.d.ts.map +1 -0
- package/dist/backend/sqlite/schema.js +88 -0
- package/dist/backend/sqlite/schema.js.map +1 -0
- package/dist/claude-md.d.ts +2 -0
- package/dist/claude-md.d.ts.map +1 -0
- package/dist/claude-md.js +97 -0
- package/dist/claude-md.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +39 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +8 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +242 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/discover.d.ts +5 -0
- package/dist/cli/commands/discover.d.ts.map +1 -0
- package/dist/cli/commands/discover.js +48 -0
- package/dist/cli/commands/discover.js.map +1 -0
- package/dist/cli/commands/maintain.d.ts +6 -0
- package/dist/cli/commands/maintain.d.ts.map +1 -0
- package/dist/cli/commands/maintain.js +168 -0
- package/dist/cli/commands/maintain.js.map +1 -0
- package/dist/cli/commands/read.d.ts +7 -0
- package/dist/cli/commands/read.d.ts.map +1 -0
- package/dist/cli/commands/read.js +139 -0
- package/dist/cli/commands/read.js.map +1 -0
- package/dist/cli/commands/write.d.ts +4 -0
- package/dist/cli/commands/write.d.ts.map +1 -0
- package/dist/cli/commands/write.js +99 -0
- package/dist/cli/commands/write.js.map +1 -0
- package/dist/cli/helpers.d.ts +8 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +17 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +296 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine/audit.d.ts +15 -0
- package/dist/engine/audit.d.ts.map +1 -0
- package/dist/engine/audit.js +42 -0
- package/dist/engine/audit.js.map +1 -0
- package/dist/engine/backup.d.ts +9 -0
- package/dist/engine/backup.d.ts.map +1 -0
- package/dist/engine/backup.js +100 -0
- package/dist/engine/backup.js.map +1 -0
- package/dist/engine/composites.d.ts +6 -0
- package/dist/engine/composites.d.ts.map +1 -0
- package/dist/engine/composites.js +102 -0
- package/dist/engine/composites.js.map +1 -0
- package/dist/engine/context.d.ts +47 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +55 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/docid-safe.d.ts +8 -0
- package/dist/engine/docid-safe.d.ts.map +1 -0
- package/dist/engine/docid-safe.js +0 -0
- package/dist/engine/docid-safe.js.map +1 -0
- package/dist/engine/helpers.d.ts +8 -0
- package/dist/engine/helpers.d.ts.map +1 -0
- package/dist/engine/helpers.js +102 -0
- package/dist/engine/helpers.js.map +1 -0
- package/dist/engine/index.d.ts +215 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +494 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/indexing.d.ts +14 -0
- package/dist/engine/indexing.d.ts.map +1 -0
- package/dist/engine/indexing.js +225 -0
- package/dist/engine/indexing.js.map +1 -0
- package/dist/engine/journal.d.ts +32 -0
- package/dist/engine/journal.d.ts.map +1 -0
- package/dist/engine/journal.js +111 -0
- package/dist/engine/journal.js.map +1 -0
- package/dist/engine/logger.d.ts +19 -0
- package/dist/engine/logger.d.ts.map +1 -0
- package/dist/engine/logger.js +40 -0
- package/dist/engine/logger.js.map +1 -0
- package/dist/engine/maintenance.d.ts +15 -0
- package/dist/engine/maintenance.d.ts.map +1 -0
- package/dist/engine/maintenance.js +87 -0
- package/dist/engine/maintenance.js.map +1 -0
- package/dist/engine/mutex.d.ts +24 -0
- package/dist/engine/mutex.d.ts.map +1 -0
- package/dist/engine/mutex.js +50 -0
- package/dist/engine/mutex.js.map +1 -0
- package/dist/engine/pathguard.d.ts +16 -0
- package/dist/engine/pathguard.d.ts.map +1 -0
- package/dist/engine/pathguard.js +41 -0
- package/dist/engine/pathguard.js.map +1 -0
- package/dist/engine/reads.d.ts +25 -0
- package/dist/engine/reads.d.ts.map +1 -0
- package/dist/engine/reads.js +904 -0
- package/dist/engine/reads.js.map +1 -0
- package/dist/engine/types.d.ts +396 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +5 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/writes.d.ts +10 -0
- package/dist/engine/writes.d.ts.map +1 -0
- package/dist/engine/writes.js +606 -0
- package/dist/engine/writes.js.map +1 -0
- package/dist/engine.d.ts +3 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +6 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -0
- package/dist/extractor/fields.d.ts +3 -0
- package/dist/extractor/fields.d.ts.map +1 -0
- package/dist/extractor/fields.js +58 -0
- package/dist/extractor/fields.js.map +1 -0
- package/dist/extractor/index.d.ts +7 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +22 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/normalizers.d.ts +22 -0
- package/dist/extractor/normalizers.d.ts.map +1 -0
- package/dist/extractor/normalizers.js +250 -0
- package/dist/extractor/normalizers.js.map +1 -0
- package/dist/extractor/objects.d.ts +3 -0
- package/dist/extractor/objects.d.ts.map +1 -0
- package/dist/extractor/objects.js +33 -0
- package/dist/extractor/objects.js.map +1 -0
- package/dist/extractor/relationships.d.ts +3 -0
- package/dist/extractor/relationships.d.ts.map +1 -0
- package/dist/extractor/relationships.js +58 -0
- package/dist/extractor/relationships.js.map +1 -0
- package/dist/git/commit.d.ts +63 -0
- package/dist/git/commit.d.ts.map +1 -0
- package/dist/git/commit.js +161 -0
- package/dist/git/commit.js.map +1 -0
- package/dist/git/diff.d.ts +4 -0
- package/dist/git/diff.d.ts.map +1 -0
- package/dist/git/diff.js +56 -0
- package/dist/git/diff.js.map +1 -0
- package/dist/git/index.d.ts +63 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +151 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/log.d.ts +13 -0
- package/dist/git/log.d.ts.map +1 -0
- package/dist/git/log.js +116 -0
- package/dist/git/log.js.map +1 -0
- package/dist/git/snapshot.d.ts +4 -0
- package/dist/git/snapshot.d.ts.map +1 -0
- package/dist/git/snapshot.js +65 -0
- package/dist/git/snapshot.js.map +1 -0
- package/dist/instance/config.d.ts +19 -0
- package/dist/instance/config.d.ts.map +1 -0
- package/dist/instance/config.js +107 -0
- package/dist/instance/config.js.map +1 -0
- package/dist/instance/pool.d.ts +138 -0
- package/dist/instance/pool.d.ts.map +1 -0
- package/dist/instance/pool.js +335 -0
- package/dist/instance/pool.js.map +1 -0
- package/dist/instance/session.d.ts +140 -0
- package/dist/instance/session.d.ts.map +1 -0
- package/dist/instance/session.js +267 -0
- package/dist/instance/session.js.map +1 -0
- package/dist/logging.d.ts +108 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +120 -0
- package/dist/logging.js.map +1 -0
- package/dist/maad-md.d.ts +11 -0
- package/dist/maad-md.d.ts.map +1 -0
- package/dist/maad-md.js +252 -0
- package/dist/maad-md.js.map +1 -0
- package/dist/mcp/bulk-cap.d.ts +10 -0
- package/dist/mcp/bulk-cap.d.ts.map +1 -0
- package/dist/mcp/bulk-cap.js +37 -0
- package/dist/mcp/bulk-cap.js.map +1 -0
- package/dist/mcp/config.d.ts +18 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +20 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/ctx.d.ts +17 -0
- package/dist/mcp/ctx.d.ts.map +1 -0
- package/dist/mcp/ctx.js +7 -0
- package/dist/mcp/ctx.js.map +1 -0
- package/dist/mcp/guardrails.d.ts +42 -0
- package/dist/mcp/guardrails.d.ts.map +1 -0
- package/dist/mcp/guardrails.js +58 -0
- package/dist/mcp/guardrails.js.map +1 -0
- package/dist/mcp/idempotency.d.ts +69 -0
- package/dist/mcp/idempotency.d.ts.map +1 -0
- package/dist/mcp/idempotency.js +168 -0
- package/dist/mcp/idempotency.js.map +1 -0
- package/dist/mcp/instance-reload.d.ts +23 -0
- package/dist/mcp/instance-reload.d.ts.map +1 -0
- package/dist/mcp/instance-reload.js +126 -0
- package/dist/mcp/instance-reload.js.map +1 -0
- package/dist/mcp/kinds.d.ts +22 -0
- package/dist/mcp/kinds.d.ts.map +1 -0
- package/dist/mcp/kinds.js +112 -0
- package/dist/mcp/kinds.js.map +1 -0
- package/dist/mcp/lifecycle.d.ts +8 -0
- package/dist/mcp/lifecycle.d.ts.map +1 -0
- package/dist/mcp/lifecycle.js +65 -0
- package/dist/mcp/lifecycle.js.map +1 -0
- package/dist/mcp/memory-pressure.d.ts +37 -0
- package/dist/mcp/memory-pressure.d.ts.map +1 -0
- package/dist/mcp/memory-pressure.js +179 -0
- package/dist/mcp/memory-pressure.js.map +1 -0
- package/dist/mcp/notifications.d.ts +87 -0
- package/dist/mcp/notifications.d.ts.map +1 -0
- package/dist/mcp/notifications.js +154 -0
- package/dist/mcp/notifications.js.map +1 -0
- package/dist/mcp/query-depth.d.ts +28 -0
- package/dist/mcp/query-depth.d.ts.map +1 -0
- package/dist/mcp/query-depth.js +43 -0
- package/dist/mcp/query-depth.js.map +1 -0
- package/dist/mcp/rate-limit.d.ts +60 -0
- package/dist/mcp/rate-limit.d.ts.map +1 -0
- package/dist/mcp/rate-limit.js +203 -0
- package/dist/mcp/rate-limit.js.map +1 -0
- package/dist/mcp/reload-signal.d.ts +13 -0
- package/dist/mcp/reload-signal.d.ts.map +1 -0
- package/dist/mcp/reload-signal.js +68 -0
- package/dist/mcp/reload-signal.js.map +1 -0
- package/dist/mcp/response.d.ts +109 -0
- package/dist/mcp/response.d.ts.map +1 -0
- package/dist/mcp/response.js +132 -0
- package/dist/mcp/response.js.map +1 -0
- package/dist/mcp/roles.d.ts +7 -0
- package/dist/mcp/roles.d.ts.map +1 -0
- package/dist/mcp/roles.js +57 -0
- package/dist/mcp/roles.js.map +1 -0
- package/dist/mcp/server.d.ts +33 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +252 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/shutdown.d.ts +32 -0
- package/dist/mcp/shutdown.d.ts.map +1 -0
- package/dist/mcp/shutdown.js +130 -0
- package/dist/mcp/shutdown.js.map +1 -0
- package/dist/mcp/tools/audit.d.ts +4 -0
- package/dist/mcp/tools/audit.d.ts.map +1 -0
- package/dist/mcp/tools/audit.js +45 -0
- package/dist/mcp/tools/audit.js.map +1 -0
- package/dist/mcp/tools/auth.d.ts +4 -0
- package/dist/mcp/tools/auth.d.ts.map +1 -0
- package/dist/mcp/tools/auth.js +181 -0
- package/dist/mcp/tools/auth.js.map +1 -0
- package/dist/mcp/tools/backup.d.ts +4 -0
- package/dist/mcp/tools/backup.d.ts.map +1 -0
- package/dist/mcp/tools/backup.js +52 -0
- package/dist/mcp/tools/backup.js.map +1 -0
- package/dist/mcp/tools/discover.d.ts +4 -0
- package/dist/mcp/tools/discover.d.ts.map +1 -0
- package/dist/mcp/tools/discover.js +83 -0
- package/dist/mcp/tools/discover.js.map +1 -0
- package/dist/mcp/tools/instance.d.ts +15 -0
- package/dist/mcp/tools/instance.d.ts.map +1 -0
- package/dist/mcp/tools/instance.js +207 -0
- package/dist/mcp/tools/instance.js.map +1 -0
- package/dist/mcp/tools/maintain.d.ts +4 -0
- package/dist/mcp/tools/maintain.d.ts.map +1 -0
- package/dist/mcp/tools/maintain.js +123 -0
- package/dist/mcp/tools/maintain.js.map +1 -0
- package/dist/mcp/tools/read.d.ts +4 -0
- package/dist/mcp/tools/read.d.ts.map +1 -0
- package/dist/mcp/tools/read.js +304 -0
- package/dist/mcp/tools/read.js.map +1 -0
- package/dist/mcp/tools/write.d.ts +4 -0
- package/dist/mcp/tools/write.d.ts.map +1 -0
- package/dist/mcp/tools/write.js +342 -0
- package/dist/mcp/tools/write.js.map +1 -0
- package/dist/mcp/transport/auth.d.ts +41 -0
- package/dist/mcp/transport/auth.d.ts.map +1 -0
- package/dist/mcp/transport/auth.js +115 -0
- package/dist/mcp/transport/auth.js.map +1 -0
- package/dist/mcp/transport/http.d.ts +62 -0
- package/dist/mcp/transport/http.d.ts.map +1 -0
- package/dist/mcp/transport/http.js +357 -0
- package/dist/mcp/transport/http.js.map +1 -0
- package/dist/mcp/transport/pin.d.ts +15 -0
- package/dist/mcp/transport/pin.d.ts.map +1 -0
- package/dist/mcp/transport/pin.js +71 -0
- package/dist/mcp/transport/pin.js.map +1 -0
- package/dist/mcp/transport/telemetry.d.ts +79 -0
- package/dist/mcp/transport/telemetry.d.ts.map +1 -0
- package/dist/mcp/transport/telemetry.js +97 -0
- package/dist/mcp/transport/telemetry.js.map +1 -0
- package/dist/mcp/with-session.d.ts +26 -0
- package/dist/mcp/with-session.d.ts.map +1 -0
- package/dist/mcp/with-session.js +275 -0
- package/dist/mcp/with-session.js.map +1 -0
- package/dist/parser/annotations.d.ts +3 -0
- package/dist/parser/annotations.d.ts.map +1 -0
- package/dist/parser/annotations.js +41 -0
- package/dist/parser/annotations.js.map +1 -0
- package/dist/parser/blocks.d.ts +3 -0
- package/dist/parser/blocks.d.ts.map +1 -0
- package/dist/parser/blocks.js +101 -0
- package/dist/parser/blocks.js.map +1 -0
- package/dist/parser/frontmatter.d.ts +9 -0
- package/dist/parser/frontmatter.d.ts.map +1 -0
- package/dist/parser/frontmatter.js +33 -0
- package/dist/parser/frontmatter.js.map +1 -0
- package/dist/parser/index.d.ts +11 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +54 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/matter.d.ts +3 -0
- package/dist/parser/matter.d.ts.map +1 -0
- package/dist/parser/matter.js +32 -0
- package/dist/parser/matter.js.map +1 -0
- package/dist/parser/tags.d.ts +3 -0
- package/dist/parser/tags.d.ts.map +1 -0
- package/dist/parser/tags.js +32 -0
- package/dist/parser/tags.js.map +1 -0
- package/dist/parser/verbatim.d.ts +4 -0
- package/dist/parser/verbatim.d.ts.map +1 -0
- package/dist/parser/verbatim.js +121 -0
- package/dist/parser/verbatim.js.map +1 -0
- package/dist/parser/yaml-profile.d.ts +4 -0
- package/dist/parser/yaml-profile.d.ts.map +1 -0
- package/dist/parser/yaml-profile.js +73 -0
- package/dist/parser/yaml-profile.js.map +1 -0
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +2 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/loader.d.ts +4 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +147 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/types.d.ts +2 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +5 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/scanner.d.ts +57 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +223 -0
- package/dist/scanner.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/loader.d.ts +4 -0
- package/dist/schema/loader.d.ts.map +1 -0
- package/dist/schema/loader.js +303 -0
- package/dist/schema/loader.js.map +1 -0
- package/dist/schema/precision.d.ts +6 -0
- package/dist/schema/precision.d.ts.map +1 -0
- package/dist/schema/precision.js +59 -0
- package/dist/schema/precision.js.map +1 -0
- package/dist/schema/validator.d.ts +21 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +200 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-md.d.ts +8 -0
- package/dist/schema-md.d.ts.map +1 -0
- package/dist/schema-md.js +98 -0
- package/dist/schema-md.js.map +1 -0
- package/dist/skill-files.d.ts +3 -0
- package/dist/skill-files.d.ts.map +1 -0
- package/dist/skill-files.js +362 -0
- package/dist/skill-files.js.map +1 -0
- package/dist/skills-scaffold.d.ts +10 -0
- package/dist/skills-scaffold.d.ts.map +1 -0
- package/dist/skills-scaffold.js +52 -0
- package/dist/skills-scaffold.js.map +1 -0
- package/dist/types.d.ts +309 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +111 -0
- package/dist/types.js.map +1 -0
- package/dist/writer/index.d.ts +7 -0
- package/dist/writer/index.d.ts.map +1 -0
- package/dist/writer/index.js +32 -0
- package/dist/writer/index.js.map +1 -0
- package/dist/writer/serializer.d.ts +4 -0
- package/dist/writer/serializer.d.ts.map +1 -0
- package/dist/writer/serializer.js +103 -0
- package/dist/writer/serializer.js.map +1 -0
- package/dist/writer/template.d.ts +3 -0
- package/dist/writer/template.d.ts.map +1 -0
- package/dist/writer/template.js +27 -0
- package/dist/writer/template.js.map +1 -0
- package/package.json +59 -7
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Frontmatter Parser
|
|
3
|
+
// Extracts YAML frontmatter from a markdown file using gray-matter.
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { parseMatter } from './matter.js';
|
|
6
|
+
import { ok, singleErr } from '../errors.js';
|
|
7
|
+
export function parseFrontmatter(raw, filePath) {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = parseMatter(raw);
|
|
10
|
+
if (typeof parsed.data !== 'object' || parsed.data === null || Array.isArray(parsed.data)) {
|
|
11
|
+
return singleErr('PARSE_ERROR', 'Frontmatter must be a YAML mapping', { file: filePath, line: 1, col: 1 });
|
|
12
|
+
}
|
|
13
|
+
const frontmatter = parsed.data;
|
|
14
|
+
// Calculate bodyStartLine: count lines in the raw content up to where the body begins
|
|
15
|
+
// gray-matter.matter gives us the raw frontmatter string between the --- delimiters
|
|
16
|
+
let bodyStartLine = 1;
|
|
17
|
+
if (parsed.matter && parsed.matter.length > 0) {
|
|
18
|
+
// Opening --- (line 1) + frontmatter lines + closing ---
|
|
19
|
+
const fmLines = parsed.matter.split('\n').length;
|
|
20
|
+
bodyStartLine = fmLines + 2; // +1 for opening ---, +1 for closing ---
|
|
21
|
+
}
|
|
22
|
+
return ok({
|
|
23
|
+
frontmatter,
|
|
24
|
+
body: parsed.content,
|
|
25
|
+
bodyStartLine,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
const message = e instanceof Error ? e.message : 'Unknown parse error';
|
|
30
|
+
return singleErr('PARSE_ERROR', `Failed to parse frontmatter: ${message}`, { file: filePath, line: 1, col: 1 });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/parser/frontmatter.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,qBAAqB;AACrB,oEAAoE;AACpE,+EAA+E;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,SAAS,EAAe,MAAM,cAAc,CAAC;AAS1D,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAkB;IAC9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1F,OAAO,SAAS,CAAC,aAAa,EAAE,oCAAoC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7G,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAA+B,CAAC;QAE3D,sFAAsF;QACtF,oFAAoF;QACpF,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,yDAAyD;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACjD,aAAa,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,yCAAyC;QACxE,CAAC;QAED,OAAO,EAAE,CAAC;YACR,WAAW;YACX,IAAI,EAAE,MAAM,CAAC,OAAO;YACpB,aAAa;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;QACvE,OAAO,SAAS,CAAC,aAAa,EAAE,gCAAgC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Result } from '../errors.js';
|
|
2
|
+
import { type FilePath, type ParsedDocument, type Primitive } from '../types.js';
|
|
3
|
+
export { parseFrontmatter } from './frontmatter.js';
|
|
4
|
+
export { parseBlocks } from './blocks.js';
|
|
5
|
+
export { findVerbatimZones, isInVerbatimZone } from './verbatim.js';
|
|
6
|
+
export { extractValueCalls } from './tags.js';
|
|
7
|
+
export { extractAnnotations } from './annotations.js';
|
|
8
|
+
export { validateYamlProfile } from './yaml-profile.js';
|
|
9
|
+
export declare function parseDocument(path: FilePath, subtypeMap: Record<string, Primitive>): Promise<Result<ParsedDocument>>;
|
|
10
|
+
export declare function parseDocumentFromContent(raw: string, path: FilePath, subtypeMap: Record<string, Primitive>): Result<ParsedDocument>;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAA0B,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAQzG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,wBAAsB,aAAa,CACjC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAUjC;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACpC,MAAM,CAAC,cAAc,CAAC,CAwBxB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Document Parser — Public API
|
|
3
|
+
// Composes frontmatter, blocks, verbatim zones, value calls, and annotations
|
|
4
|
+
// into a single ParsedDocument.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { ok, singleErr } from '../errors.js';
|
|
9
|
+
import { parseFrontmatter } from './frontmatter.js';
|
|
10
|
+
import { parseBlocks } from './blocks.js';
|
|
11
|
+
import { findVerbatimZones } from './verbatim.js';
|
|
12
|
+
import { extractValueCalls } from './tags.js';
|
|
13
|
+
import { extractAnnotations } from './annotations.js';
|
|
14
|
+
import { validateYamlProfile } from './yaml-profile.js';
|
|
15
|
+
export { parseFrontmatter } from './frontmatter.js';
|
|
16
|
+
export { parseBlocks } from './blocks.js';
|
|
17
|
+
export { findVerbatimZones, isInVerbatimZone } from './verbatim.js';
|
|
18
|
+
export { extractValueCalls } from './tags.js';
|
|
19
|
+
export { extractAnnotations } from './annotations.js';
|
|
20
|
+
export { validateYamlProfile } from './yaml-profile.js';
|
|
21
|
+
export async function parseDocument(path, subtypeMap) {
|
|
22
|
+
let raw;
|
|
23
|
+
try {
|
|
24
|
+
raw = await readFile(path, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
const message = e instanceof Error ? e.message : 'Unknown read error';
|
|
28
|
+
return singleErr('FILE_READ_ERROR', `Failed to read file: ${message}`, { file: path, line: 0, col: 0 });
|
|
29
|
+
}
|
|
30
|
+
return parseDocumentFromContent(raw, path, subtypeMap);
|
|
31
|
+
}
|
|
32
|
+
export function parseDocumentFromContent(raw, path, subtypeMap) {
|
|
33
|
+
const hash = createHash('sha256').update(raw).digest('hex');
|
|
34
|
+
const fm = parseFrontmatter(raw, path);
|
|
35
|
+
if (!fm.ok)
|
|
36
|
+
return fm;
|
|
37
|
+
const profileResult = validateYamlProfile(fm.value.frontmatter, path);
|
|
38
|
+
if (!profileResult.ok)
|
|
39
|
+
return profileResult;
|
|
40
|
+
const { frontmatter, body, bodyStartLine } = fm.value;
|
|
41
|
+
const verbatimZones = findVerbatimZones(body, bodyStartLine);
|
|
42
|
+
const blocks = parseBlocks(body, bodyStartLine);
|
|
43
|
+
const valueCalls = extractValueCalls(body, bodyStartLine, path, verbatimZones);
|
|
44
|
+
const annotations = extractAnnotations(body, bodyStartLine, path, subtypeMap, verbatimZones);
|
|
45
|
+
return ok({
|
|
46
|
+
filePath: path,
|
|
47
|
+
fileHash: hash,
|
|
48
|
+
frontmatter,
|
|
49
|
+
blocks,
|
|
50
|
+
valueCalls,
|
|
51
|
+
annotations,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matter.d.ts","sourceRoot":"","sources":["../../src/parser/matter.ts"],"names":[],"mappings":"AAkBA,OAAO,MAAM,MAAM,aAAa,CAAC;AAcjC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAEtE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// gray-matter wrapper with a string-preserving YAML engine.
|
|
3
|
+
//
|
|
4
|
+
// Why: js-yaml's DEFAULT_SCHEMA resolves `!!timestamp` scalars into JS Date
|
|
5
|
+
// objects. Downstream code (writer/serializer, indexer, extractor, reads,
|
|
6
|
+
// writes) then normalizes Dates via `.toISOString().slice(0, 10)`, silently
|
|
7
|
+
// truncating any finer-than-day precision on round-trip. That is a hard
|
|
8
|
+
// blocker for 0.6.7 schema precision contracts — see
|
|
9
|
+
// docs/specs/0.6.7-schema-precision.md §"Round-trip precision preservation".
|
|
10
|
+
//
|
|
11
|
+
// Fix: use yaml.CORE_SCHEMA (null/bool/int/float/str/seq/map, NO timestamp).
|
|
12
|
+
// Datetime-looking scalars stay as literal strings end-to-end.
|
|
13
|
+
//
|
|
14
|
+
// Every matter(...) call in the codebase goes through parseMatter() so we
|
|
15
|
+
// cannot regress this invariant by adding a new caller that forgets the
|
|
16
|
+
// engine option.
|
|
17
|
+
// ============================================================================
|
|
18
|
+
import matter from 'gray-matter';
|
|
19
|
+
import yaml from 'js-yaml';
|
|
20
|
+
const stringPreservingYamlEngine = {
|
|
21
|
+
// yaml.load returns `unknown` (could be primitive / null on malformed YAML),
|
|
22
|
+
// but gray-matter's engine type demands `object`. Cast is safe: downstream
|
|
23
|
+
// code in parser/frontmatter.ts already validates that `.data` is a plain
|
|
24
|
+
// object and rejects other shapes.
|
|
25
|
+
parse: (raw) => yaml.load(raw, { schema: yaml.CORE_SCHEMA }),
|
|
26
|
+
stringify: (obj) => yaml.dump(obj),
|
|
27
|
+
};
|
|
28
|
+
const MATTER_OPTIONS = { engines: { yaml: stringPreservingYamlEngine } };
|
|
29
|
+
export function parseMatter(raw) {
|
|
30
|
+
return matter(raw, MATTER_OPTIONS);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=matter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matter.js","sourceRoot":"","sources":["../../src/parser/matter.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4DAA4D;AAC5D,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,wEAAwE;AACxE,qDAAqD;AACrD,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,+DAA+D;AAC/D,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,iBAAiB;AACjB,+EAA+E;AAE/E,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,MAAM,0BAA0B,GAAG;IACjC,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,mCAAmC;IACnC,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAW;IAC9E,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;CAC3C,CAAC;AAEF,MAAM,cAAc,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAW,CAAC;AAElF,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/parser/tags.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKrE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,YAAY,EAAE,GAC5B,SAAS,EAAE,CA4Bb"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Value Call Extractor
|
|
3
|
+
// Extracts {{field}} references from markdown body.
|
|
4
|
+
// Skips matches inside verbatim zones (code blocks, code spans).
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { isInVerbatimZone } from './verbatim.js';
|
|
7
|
+
const VALUE_CALL_REGEX = /\{\{([a-zA-Z_][a-zA-Z0-9_.]*)\}\}/g;
|
|
8
|
+
export function extractValueCalls(body, bodyStartLine, filePath, verbatimZones) {
|
|
9
|
+
const calls = [];
|
|
10
|
+
const lines = body.split('\n');
|
|
11
|
+
for (let i = 0; i < lines.length; i++) {
|
|
12
|
+
const line = lines[i];
|
|
13
|
+
const absoluteLine = bodyStartLine + i;
|
|
14
|
+
let match;
|
|
15
|
+
VALUE_CALL_REGEX.lastIndex = 0;
|
|
16
|
+
while ((match = VALUE_CALL_REGEX.exec(line)) !== null) {
|
|
17
|
+
const col = match.index;
|
|
18
|
+
if (isInVerbatimZone(absoluteLine, col, verbatimZones))
|
|
19
|
+
continue;
|
|
20
|
+
calls.push({
|
|
21
|
+
field: match[1],
|
|
22
|
+
location: {
|
|
23
|
+
file: filePath,
|
|
24
|
+
line: absoluteLine,
|
|
25
|
+
col,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return calls;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/parser/tags.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,uBAAuB;AACvB,oDAAoD;AACpD,iEAAiE;AACjE,+EAA+E;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AAE9D,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,aAAqB,EACrB,QAAkB,EAClB,aAA6B;IAE7B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC;QAEvC,IAAI,KAA6B,CAAC;QAClC,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;QAE/B,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;YAExB,IAAI,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;gBAAE,SAAS;YAEjE,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE;gBAChB,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,YAAY;oBAClB,GAAG;iBACJ;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { VerbatimZone } from '../types.js';
|
|
2
|
+
export declare function findVerbatimZones(body: string, bodyStartLine: number): VerbatimZone[];
|
|
3
|
+
export declare function isInVerbatimZone(line: number, col: number, zones: VerbatimZone[]): boolean;
|
|
4
|
+
//# sourceMappingURL=verbatim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verbatim.d.ts","sourceRoot":"","sources":["../../src/parser/verbatim.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,EAAE,CAsDrF;AAkDD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EAAE,GACpB,OAAO,CAmBT"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Verbatim Zone Detection
|
|
3
|
+
// Identifies fenced code blocks, indented code blocks, and inline code spans
|
|
4
|
+
// where MAAD custom syntax ({{...}}, [[...]]) must NOT be parsed.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
const FENCE_OPEN_REGEX = /^(\s*(`{3,}|~{3,}))/;
|
|
7
|
+
export function findVerbatimZones(body, bodyStartLine) {
|
|
8
|
+
const zones = [];
|
|
9
|
+
const lines = body.split('\n');
|
|
10
|
+
let inFence = false;
|
|
11
|
+
let fenceChar = '';
|
|
12
|
+
let fenceLen = 0;
|
|
13
|
+
let fenceStart = 0;
|
|
14
|
+
for (let i = 0; i < lines.length; i++) {
|
|
15
|
+
const line = lines[i];
|
|
16
|
+
const absoluteLine = bodyStartLine + i;
|
|
17
|
+
// Fenced code blocks
|
|
18
|
+
const fenceMatch = FENCE_OPEN_REGEX.exec(line);
|
|
19
|
+
if (fenceMatch) {
|
|
20
|
+
const fence = fenceMatch[2];
|
|
21
|
+
if (!inFence) {
|
|
22
|
+
inFence = true;
|
|
23
|
+
fenceChar = fence[0];
|
|
24
|
+
fenceLen = fence.length;
|
|
25
|
+
fenceStart = absoluteLine;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
// Check if this is a closing fence
|
|
29
|
+
const trimmed = line.trimStart();
|
|
30
|
+
if (trimmed[0] === fenceChar && !inFenceHasExtra(trimmed, fenceChar, fenceLen)) {
|
|
31
|
+
zones.push({
|
|
32
|
+
startLine: fenceStart,
|
|
33
|
+
endLine: absoluteLine,
|
|
34
|
+
inline: false,
|
|
35
|
+
});
|
|
36
|
+
inFence = false;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (inFence)
|
|
41
|
+
continue;
|
|
42
|
+
// Inline code spans — find ` pairs within the line
|
|
43
|
+
findInlineCodeSpans(line, absoluteLine, zones);
|
|
44
|
+
}
|
|
45
|
+
// If we're still in a fence at EOF, close it
|
|
46
|
+
if (inFence) {
|
|
47
|
+
zones.push({
|
|
48
|
+
startLine: fenceStart,
|
|
49
|
+
endLine: bodyStartLine + lines.length - 1,
|
|
50
|
+
inline: false,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return zones;
|
|
54
|
+
}
|
|
55
|
+
function inFenceHasExtra(trimmed, char, minLen) {
|
|
56
|
+
// A closing fence is: same char repeated >= fenceLen, optionally followed by whitespace only
|
|
57
|
+
let count = 0;
|
|
58
|
+
for (const c of trimmed) {
|
|
59
|
+
if (c === char)
|
|
60
|
+
count++;
|
|
61
|
+
else
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
if (count < minLen)
|
|
65
|
+
return true; // not enough chars, not a closer
|
|
66
|
+
// Check remainder is whitespace only
|
|
67
|
+
const remainder = trimmed.slice(count).trim();
|
|
68
|
+
return remainder.length > 0;
|
|
69
|
+
}
|
|
70
|
+
function findInlineCodeSpans(line, absoluteLine, zones) {
|
|
71
|
+
let i = 0;
|
|
72
|
+
while (i < line.length) {
|
|
73
|
+
if (line[i] === '`') {
|
|
74
|
+
// Count opening backticks
|
|
75
|
+
let openLen = 0;
|
|
76
|
+
const openStart = i;
|
|
77
|
+
while (i < line.length && line[i] === '`') {
|
|
78
|
+
openLen++;
|
|
79
|
+
i++;
|
|
80
|
+
}
|
|
81
|
+
// Find matching closing backticks
|
|
82
|
+
const closeTarget = '`'.repeat(openLen);
|
|
83
|
+
const closeIndex = line.indexOf(closeTarget, i);
|
|
84
|
+
if (closeIndex !== -1) {
|
|
85
|
+
zones.push({
|
|
86
|
+
startLine: absoluteLine,
|
|
87
|
+
endLine: absoluteLine,
|
|
88
|
+
startCol: openStart,
|
|
89
|
+
endCol: closeIndex + openLen,
|
|
90
|
+
inline: true,
|
|
91
|
+
});
|
|
92
|
+
i = closeIndex + openLen;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
i++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export function isInVerbatimZone(line, col, zones) {
|
|
101
|
+
for (const zone of zones) {
|
|
102
|
+
if (zone.inline) {
|
|
103
|
+
// Inline code span: same line, check column range
|
|
104
|
+
if (line === zone.startLine &&
|
|
105
|
+
zone.startCol !== undefined &&
|
|
106
|
+
zone.endCol !== undefined &&
|
|
107
|
+
col >= zone.startCol &&
|
|
108
|
+
col < zone.endCol) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Block zone: check line range
|
|
114
|
+
if (line >= zone.startLine && line <= zone.endLine) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=verbatim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verbatim.js","sourceRoot":"","sources":["../../src/parser/verbatim.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-profile.d.ts","sourceRoot":"","sources":["../../src/parser/yaml-profile.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiB,KAAK,MAAM,EAAkB,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyBjC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// MAAD YAML Profile Validator
|
|
3
|
+
// Enforces the constrained YAML subset: no anchors, no aliases, no deep
|
|
4
|
+
// nesting, no complex keys. Runs after gray-matter parse, before schema.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { ok, maadError } from '../errors.js';
|
|
7
|
+
const MAX_DEPTH = 2;
|
|
8
|
+
export function validateYamlProfile(frontmatter, filePath) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const loc = { file: filePath, line: 1, col: 1 };
|
|
11
|
+
for (const [key, value] of Object.entries(frontmatter)) {
|
|
12
|
+
// Keys must be plain strings
|
|
13
|
+
if (typeof key !== 'string') {
|
|
14
|
+
errors.push(maadError('YAML_PROFILE_VIOLATION', `Key must be a string, got ${typeof key}`, loc));
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
// Check for anchor/alias artifacts — gray-matter resolves these but we detect
|
|
18
|
+
// circular references or shared references that indicate alias usage
|
|
19
|
+
// (In practice, gray-matter silently resolves them, so we check value depth/shape)
|
|
20
|
+
// Validate value depth and types
|
|
21
|
+
const depthErrors = validateValue(key, value, 0, filePath);
|
|
22
|
+
errors.push(...depthErrors);
|
|
23
|
+
}
|
|
24
|
+
if (errors.length > 0) {
|
|
25
|
+
return { ok: false, errors };
|
|
26
|
+
}
|
|
27
|
+
return ok(frontmatter);
|
|
28
|
+
}
|
|
29
|
+
function validateValue(path, value, depth, filePath) {
|
|
30
|
+
const errors = [];
|
|
31
|
+
const loc = { file: filePath, line: 1, col: 1 };
|
|
32
|
+
if (value === null || value === undefined)
|
|
33
|
+
return errors;
|
|
34
|
+
if (typeof value === 'string')
|
|
35
|
+
return errors;
|
|
36
|
+
if (typeof value === 'number')
|
|
37
|
+
return errors;
|
|
38
|
+
if (typeof value === 'boolean')
|
|
39
|
+
return errors;
|
|
40
|
+
if (value instanceof Date)
|
|
41
|
+
return errors; // gray-matter may parse dates
|
|
42
|
+
if (Array.isArray(value)) {
|
|
43
|
+
if (depth >= MAX_DEPTH) {
|
|
44
|
+
errors.push(maadError('YAML_PROFILE_VIOLATION', `"${path}": array at depth ${depth} exceeds max nesting depth of ${MAX_DEPTH}`, loc));
|
|
45
|
+
return errors;
|
|
46
|
+
}
|
|
47
|
+
for (let i = 0; i < value.length; i++) {
|
|
48
|
+
const item = value[i];
|
|
49
|
+
// Recurse into array items at depth + 1
|
|
50
|
+
errors.push(...validateValue(`${path}[${i}]`, item, depth + 1, filePath));
|
|
51
|
+
}
|
|
52
|
+
return errors;
|
|
53
|
+
}
|
|
54
|
+
if (typeof value === 'object') {
|
|
55
|
+
if (depth >= MAX_DEPTH) {
|
|
56
|
+
errors.push(maadError('YAML_PROFILE_VIOLATION', `"${path}": object at depth ${depth} exceeds max nesting depth of ${MAX_DEPTH}`, loc));
|
|
57
|
+
return errors;
|
|
58
|
+
}
|
|
59
|
+
const obj = value;
|
|
60
|
+
for (const [key, childValue] of Object.entries(obj)) {
|
|
61
|
+
if (typeof key !== 'string') {
|
|
62
|
+
errors.push(maadError('YAML_PROFILE_VIOLATION', `"${path}": non-string key "${String(key)}" not allowed`, loc));
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
errors.push(...validateValue(`${path}.${key}`, childValue, depth + 1, filePath));
|
|
66
|
+
}
|
|
67
|
+
return errors;
|
|
68
|
+
}
|
|
69
|
+
// Unknown type
|
|
70
|
+
errors.push(maadError('YAML_PROFILE_VIOLATION', `"${path}": unsupported value type ${typeof value}`, loc));
|
|
71
|
+
return errors;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=yaml-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-profile.js","sourceRoot":"","sources":["../../src/parser/yaml-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/registry/loader.ts"],"names":[],"mappings":"AASA,OAAO,EAAiC,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAML,KAAK,QAAQ,EAId,MAAM,aAAa,CAAC;AAKrB,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAmJjF"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Registry Loader
|
|
3
|
+
// Reads and validates _registry/object_types.yaml
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { parseMatter } from '../parser/matter.js';
|
|
9
|
+
import { ok, err, singleErr, maadError } from '../errors.js';
|
|
10
|
+
import { isContainedIn } from '../engine/pathguard.js';
|
|
11
|
+
import { docType, schemaRef, PRIMITIVES, DEFAULT_SUBTYPE_MAP, buildSubtypeMap, } from '../types.js';
|
|
12
|
+
const VALID_NAME_REGEX = /^[a-z][a-z0-9_]*$/;
|
|
13
|
+
const VALID_PREFIX_REGEX = /^[a-z0-9]{2,5}$/;
|
|
14
|
+
export async function loadRegistry(projectRoot) {
|
|
15
|
+
const registryPath = path.join(projectRoot, '_registry', 'object_types.yaml');
|
|
16
|
+
if (!existsSync(registryPath)) {
|
|
17
|
+
return singleErr('REGISTRY_NOT_FOUND', `Registry file not found: ${registryPath}`);
|
|
18
|
+
}
|
|
19
|
+
let raw;
|
|
20
|
+
try {
|
|
21
|
+
raw = await readFile(registryPath, 'utf-8');
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
const message = e instanceof Error ? e.message : 'Unknown read error';
|
|
25
|
+
return singleErr('FILE_READ_ERROR', `Failed to read registry: ${message}`);
|
|
26
|
+
}
|
|
27
|
+
let data;
|
|
28
|
+
try {
|
|
29
|
+
// gray-matter can parse bare YAML files (no frontmatter delimiters needed)
|
|
30
|
+
// but we need to handle both cases
|
|
31
|
+
if (raw.trimStart().startsWith('---')) {
|
|
32
|
+
const parsed = parseMatter(raw);
|
|
33
|
+
data = parsed.data;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Parse as bare YAML — wrap in frontmatter delimiters for gray-matter
|
|
37
|
+
const parsed = parseMatter(`---\n${raw}\n---`);
|
|
38
|
+
data = parsed.data;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
const message = e instanceof Error ? e.message : 'Unknown parse error';
|
|
43
|
+
return singleErr('PARSE_ERROR', `Failed to parse registry YAML: ${message}`);
|
|
44
|
+
}
|
|
45
|
+
const errors = [];
|
|
46
|
+
const types = new Map();
|
|
47
|
+
const seenPrefixes = new Map();
|
|
48
|
+
// Parse types
|
|
49
|
+
const typesRaw = data['types'];
|
|
50
|
+
if (typesRaw === undefined || typesRaw === null || typeof typesRaw !== 'object') {
|
|
51
|
+
return singleErr('REGISTRY_INVALID', 'Registry must contain a "types" mapping');
|
|
52
|
+
}
|
|
53
|
+
for (const [name, def] of Object.entries(typesRaw)) {
|
|
54
|
+
if (typeof def !== 'object' || def === null) {
|
|
55
|
+
errors.push(maadError('REGISTRY_INVALID', `Type "${name}" must be a mapping`));
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const typeDef = def;
|
|
59
|
+
// Validate name
|
|
60
|
+
if (!VALID_NAME_REGEX.test(name)) {
|
|
61
|
+
errors.push(maadError('REGISTRY_INVALID', `Type name "${name}" must be lowercase alphanumeric with underscores, starting with a letter`));
|
|
62
|
+
}
|
|
63
|
+
// Validate path
|
|
64
|
+
const typePath = typeDef['path'];
|
|
65
|
+
if (typeof typePath !== 'string' || typePath.length === 0) {
|
|
66
|
+
errors.push(maadError('REGISTRY_INVALID', `Type "${name}" must have a "path" string`));
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const resolvedPath = path.join(projectRoot, typePath);
|
|
70
|
+
if (!isContainedIn(resolvedPath, projectRoot)) {
|
|
71
|
+
errors.push(maadError('REGISTRY_INVALID', `Type "${name}" path escapes project root: ${typePath}`));
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!existsSync(resolvedPath)) {
|
|
75
|
+
mkdirSync(resolvedPath, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
// Validate id_prefix
|
|
78
|
+
const idPrefix = typeDef['id_prefix'];
|
|
79
|
+
if (typeof idPrefix !== 'string' || !VALID_PREFIX_REGEX.test(idPrefix)) {
|
|
80
|
+
errors.push(maadError('REGISTRY_INVALID', `Type "${name}" id_prefix must be 2-5 lowercase alphanumeric characters, got: ${String(idPrefix)}`));
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// Check for duplicate prefixes
|
|
84
|
+
const existingType = seenPrefixes.get(idPrefix);
|
|
85
|
+
if (existingType !== undefined) {
|
|
86
|
+
errors.push(maadError('DUPLICATE_PREFIX', `Type "${name}" has duplicate id_prefix "${idPrefix}" (also used by "${existingType}")`));
|
|
87
|
+
}
|
|
88
|
+
seenPrefixes.set(idPrefix, name);
|
|
89
|
+
// Validate schema ref
|
|
90
|
+
const schemaValue = typeDef['schema'];
|
|
91
|
+
if (typeof schemaValue !== 'string' || schemaValue.length === 0) {
|
|
92
|
+
errors.push(maadError('REGISTRY_INVALID', `Type "${name}" must have a "schema" string`));
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const schemaFilePath = path.join(projectRoot, '_schema', `${schemaValue}.yaml`);
|
|
96
|
+
if (!existsSync(schemaFilePath)) {
|
|
97
|
+
errors.push(maadError('SCHEMA_NOT_FOUND', `Type "${name}" references schema "${schemaValue}" but file not found: ${schemaFilePath}`));
|
|
98
|
+
}
|
|
99
|
+
// Optional template
|
|
100
|
+
const template = typeof typeDef['template'] === 'string' ? typeDef['template'] : null;
|
|
101
|
+
if (template !== null) {
|
|
102
|
+
const templatePath = path.join(projectRoot, template);
|
|
103
|
+
if (!isContainedIn(templatePath, projectRoot)) {
|
|
104
|
+
errors.push(maadError('REGISTRY_INVALID', `Type "${name}" template escapes project root: ${template}`));
|
|
105
|
+
}
|
|
106
|
+
else if (!existsSync(templatePath)) {
|
|
107
|
+
errors.push(maadError('FILE_NOT_FOUND', `Type "${name}" references template "${template}" but file not found`));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
types.set(name, {
|
|
111
|
+
name: docType(name),
|
|
112
|
+
path: typePath,
|
|
113
|
+
idPrefix: idPrefix,
|
|
114
|
+
schemaRef: schemaRef(schemaValue),
|
|
115
|
+
template,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Parse extraction config
|
|
119
|
+
let extraction = { subtypes: {} };
|
|
120
|
+
const extractionRaw = data['extraction'];
|
|
121
|
+
if (extractionRaw !== undefined && typeof extractionRaw === 'object' && extractionRaw !== null) {
|
|
122
|
+
const extDef = extractionRaw;
|
|
123
|
+
const subtypesRaw = extDef['subtypes'];
|
|
124
|
+
if (subtypesRaw !== undefined && typeof subtypesRaw === 'object' && subtypesRaw !== null) {
|
|
125
|
+
const subtypes = {};
|
|
126
|
+
for (const [subtype, primitive] of Object.entries(subtypesRaw)) {
|
|
127
|
+
if (typeof primitive === 'string' && PRIMITIVES.includes(primitive)) {
|
|
128
|
+
subtypes[subtype] = primitive;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
errors.push(maadError('REGISTRY_INVALID', `Extraction subtype "${subtype}" maps to invalid primitive "${String(primitive)}". Valid: ${PRIMITIVES.join(', ')}`));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
extraction = { subtypes };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (errors.length > 0) {
|
|
138
|
+
return err(errors);
|
|
139
|
+
}
|
|
140
|
+
const subtypeMap = buildSubtypeMap(DEFAULT_SUBTYPE_MAP, extraction.subtypes);
|
|
141
|
+
return ok({
|
|
142
|
+
types: types,
|
|
143
|
+
extraction,
|
|
144
|
+
subtypeMap,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/registry/loader.ts"],"names":[],"mappings":"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"}
|