@anatomytool/validate 1.0.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.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -0
  3. package/dist/canonical.d.ts +21 -0
  4. package/dist/canonical.d.ts.map +1 -0
  5. package/dist/canonical.js +76 -0
  6. package/dist/canonical.js.map +1 -0
  7. package/dist/checks/commands-no-test-warn.d.ts +6 -0
  8. package/dist/checks/commands-no-test-warn.d.ts.map +1 -0
  9. package/dist/checks/commands-no-test-warn.js +35 -0
  10. package/dist/checks/commands-no-test-warn.js.map +1 -0
  11. package/dist/checks/description-warn.d.ts +6 -0
  12. package/dist/checks/description-warn.d.ts.map +1 -0
  13. package/dist/checks/description-warn.js +23 -0
  14. package/dist/checks/description-warn.js.map +1 -0
  15. package/dist/checks/entry-point-alias-warn.d.ts +6 -0
  16. package/dist/checks/entry-point-alias-warn.d.ts.map +1 -0
  17. package/dist/checks/entry-point-alias-warn.js +25 -0
  18. package/dist/checks/entry-point-alias-warn.js.map +1 -0
  19. package/dist/checks/fingerprint-check.d.ts +6 -0
  20. package/dist/checks/fingerprint-check.d.ts.map +1 -0
  21. package/dist/checks/fingerprint-check.js +59 -0
  22. package/dist/checks/fingerprint-check.js.map +1 -0
  23. package/dist/checks/hash-check.d.ts +6 -0
  24. package/dist/checks/hash-check.d.ts.map +1 -0
  25. package/dist/checks/hash-check.js +36 -0
  26. package/dist/checks/hash-check.js.map +1 -0
  27. package/dist/checks/interface-form-check.d.ts +6 -0
  28. package/dist/checks/interface-form-check.d.ts.map +1 -0
  29. package/dist/checks/interface-form-check.js +66 -0
  30. package/dist/checks/interface-form-check.js.map +1 -0
  31. package/dist/checks/memory-dangling-ref-check.d.ts +6 -0
  32. package/dist/checks/memory-dangling-ref-check.d.ts.map +1 -0
  33. package/dist/checks/memory-dangling-ref-check.js +34 -0
  34. package/dist/checks/memory-dangling-ref-check.js.map +1 -0
  35. package/dist/checks/memory-fingerprint-check.d.ts +6 -0
  36. package/dist/checks/memory-fingerprint-check.d.ts.map +1 -0
  37. package/dist/checks/memory-fingerprint-check.js +20 -0
  38. package/dist/checks/memory-fingerprint-check.js.map +1 -0
  39. package/dist/checks/memory-supersession-check.d.ts +6 -0
  40. package/dist/checks/memory-supersession-check.d.ts.map +1 -0
  41. package/dist/checks/memory-supersession-check.js +61 -0
  42. package/dist/checks/memory-supersession-check.js.map +1 -0
  43. package/dist/checks/memory-verification-check.d.ts +6 -0
  44. package/dist/checks/memory-verification-check.d.ts.map +1 -0
  45. package/dist/checks/memory-verification-check.js +61 -0
  46. package/dist/checks/memory-verification-check.js.map +1 -0
  47. package/dist/checks/nested-path-escape.d.ts +6 -0
  48. package/dist/checks/nested-path-escape.d.ts.map +1 -0
  49. package/dist/checks/nested-path-escape.js +76 -0
  50. package/dist/checks/nested-path-escape.js.map +1 -0
  51. package/dist/checks/schema-check.d.ts +6 -0
  52. package/dist/checks/schema-check.d.ts.map +1 -0
  53. package/dist/checks/schema-check.js +32 -0
  54. package/dist/checks/schema-check.js.map +1 -0
  55. package/dist/checks/source-cross-check.d.ts +52 -0
  56. package/dist/checks/source-cross-check.d.ts.map +1 -0
  57. package/dist/checks/source-cross-check.js +473 -0
  58. package/dist/checks/source-cross-check.js.map +1 -0
  59. package/dist/checks/source-path-check.d.ts +6 -0
  60. package/dist/checks/source-path-check.d.ts.map +1 -0
  61. package/dist/checks/source-path-check.js +62 -0
  62. package/dist/checks/source-path-check.js.map +1 -0
  63. package/dist/checks/structure-path-check.d.ts +6 -0
  64. package/dist/checks/structure-path-check.d.ts.map +1 -0
  65. package/dist/checks/structure-path-check.js +31 -0
  66. package/dist/checks/structure-path-check.js.map +1 -0
  67. package/dist/checks/verify/ast-grep-verifier.d.ts +4 -0
  68. package/dist/checks/verify/ast-grep-verifier.d.ts.map +1 -0
  69. package/dist/checks/verify/ast-grep-verifier.js +153 -0
  70. package/dist/checks/verify/ast-grep-verifier.js.map +1 -0
  71. package/dist/checks/verify/detect-ast-grep.d.ts +9 -0
  72. package/dist/checks/verify/detect-ast-grep.d.ts.map +1 -0
  73. package/dist/checks/verify/detect-ast-grep.js +26 -0
  74. package/dist/checks/verify/detect-ast-grep.js.map +1 -0
  75. package/dist/checks/verify/detect-semgrep.d.ts +8 -0
  76. package/dist/checks/verify/detect-semgrep.d.ts.map +1 -0
  77. package/dist/checks/verify/detect-semgrep.js +36 -0
  78. package/dist/checks/verify/detect-semgrep.js.map +1 -0
  79. package/dist/checks/verify/glob-verifier.d.ts +5 -0
  80. package/dist/checks/verify/glob-verifier.d.ts.map +1 -0
  81. package/dist/checks/verify/glob-verifier.js +58 -0
  82. package/dist/checks/verify/glob-verifier.js.map +1 -0
  83. package/dist/checks/verify/semgrep-pattern-verifier.d.ts +4 -0
  84. package/dist/checks/verify/semgrep-pattern-verifier.d.ts.map +1 -0
  85. package/dist/checks/verify/semgrep-pattern-verifier.js +121 -0
  86. package/dist/checks/verify/semgrep-pattern-verifier.js.map +1 -0
  87. package/dist/checks/verify/semgrep-rule-file-verifier.d.ts +9 -0
  88. package/dist/checks/verify/semgrep-rule-file-verifier.d.ts.map +1 -0
  89. package/dist/checks/verify/semgrep-rule-file-verifier.js +151 -0
  90. package/dist/checks/verify/semgrep-rule-file-verifier.js.map +1 -0
  91. package/dist/checks/verify/types.d.ts +44 -0
  92. package/dist/checks/verify/types.d.ts.map +1 -0
  93. package/dist/checks/verify/types.js +6 -0
  94. package/dist/checks/verify/types.js.map +1 -0
  95. package/dist/checks/verify-check.d.ts +9 -0
  96. package/dist/checks/verify-check.d.ts.map +1 -0
  97. package/dist/checks/verify-check.js +67 -0
  98. package/dist/checks/verify-check.js.map +1 -0
  99. package/dist/discovery.d.ts +13 -0
  100. package/dist/discovery.d.ts.map +1 -0
  101. package/dist/discovery.js +82 -0
  102. package/dist/discovery.js.map +1 -0
  103. package/dist/errors.d.ts +38 -0
  104. package/dist/errors.d.ts.map +1 -0
  105. package/dist/errors.js +5 -0
  106. package/dist/errors.js.map +1 -0
  107. package/dist/index.d.ts +43 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +81 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/memory.d.ts +19 -0
  112. package/dist/memory.d.ts.map +1 -0
  113. package/dist/memory.js +80 -0
  114. package/dist/memory.js.map +1 -0
  115. package/dist/parse.d.ts +17 -0
  116. package/dist/parse.d.ts.map +1 -0
  117. package/dist/parse.js +47 -0
  118. package/dist/parse.js.map +1 -0
  119. package/dist/schema-0.10.json +194 -0
  120. package/dist/schema-0.11.json +203 -0
  121. package/dist/schema-0.12.json +243 -0
  122. package/dist/schema-0.13.json +267 -0
  123. package/dist/schema-0.14.json +288 -0
  124. package/dist/schema-0.15.json +347 -0
  125. package/dist/schema-0.2.json +283 -0
  126. package/dist/schema-0.4.json +280 -0
  127. package/dist/schema-0.5.json +300 -0
  128. package/dist/schema-0.6.json +328 -0
  129. package/dist/schema-0.7.json +311 -0
  130. package/dist/schema-0.8.json +245 -0
  131. package/dist/schema-0.9.json +172 -0
  132. package/dist/schema-1.0.json +347 -0
  133. package/dist/schema-memory-0.1.json +43 -0
  134. package/dist/schema-memory-0.2.json +49 -0
  135. package/dist/schema-memory.d.ts +5 -0
  136. package/dist/schema-memory.d.ts.map +1 -0
  137. package/dist/schema-memory.js +16 -0
  138. package/dist/schema-memory.js.map +1 -0
  139. package/dist/schema.d.ts +6 -0
  140. package/dist/schema.d.ts.map +1 -0
  141. package/dist/schema.js +62 -0
  142. package/dist/schema.js.map +1 -0
  143. package/dist/schema.json +129 -0
  144. package/dist/types.d.ts +2 -0
  145. package/dist/types.d.ts.map +1 -0
  146. package/dist/types.generated.d.ts +1103 -0
  147. package/dist/types.generated.d.ts.map +1 -0
  148. package/dist/types.generated.js +7 -0
  149. package/dist/types.generated.js.map +1 -0
  150. package/dist/types.js +7 -0
  151. package/dist/types.js.map +1 -0
  152. package/dist/validate-tree.d.ts +20 -0
  153. package/dist/validate-tree.d.ts.map +1 -0
  154. package/dist/validate-tree.js +64 -0
  155. package/dist/validate-tree.js.map +1 -0
  156. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semgrep-rule-file-verifier.js","sourceRoot":"","sources":["../../../src/checks/verify/semgrep-rule-file-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export type VerifyConfig = {
2
+ kind: "glob_exists";
3
+ path: string;
4
+ should_not?: boolean;
5
+ } | {
6
+ kind: "glob_only";
7
+ match: string;
8
+ container: string;
9
+ } | {
10
+ kind: "ast_pattern";
11
+ lang: "ts" | "tsx" | "js" | "jsx" | "py" | "rs" | "go" | "java";
12
+ pattern: string;
13
+ expect_in?: string;
14
+ forbid_in?: string;
15
+ } | {
16
+ kind: "semgrep";
17
+ lang: "py" | "go" | "java" | "rb" | "c" | "cpp" | "rs" | "ts" | "tsx" | "js" | "jsx";
18
+ pattern: string;
19
+ expect_in?: string;
20
+ forbid_in?: string;
21
+ } | {
22
+ kind: "semgrep";
23
+ rule_file: string;
24
+ expect_in?: string;
25
+ forbid_in?: string;
26
+ };
27
+ export type GlobExistsConfig = Extract<VerifyConfig, {
28
+ kind: "glob_exists";
29
+ }>;
30
+ export type GlobOnlyConfig = Extract<VerifyConfig, {
31
+ kind: "glob_only";
32
+ }>;
33
+ export type AstPatternConfig = Extract<VerifyConfig, {
34
+ kind: "ast_pattern";
35
+ }>;
36
+ export type SemgrepPatternConfig = Extract<VerifyConfig, {
37
+ kind: "semgrep";
38
+ pattern: string;
39
+ }>;
40
+ export type SemgrepRuleFileConfig = Extract<VerifyConfig, {
41
+ kind: "semgrep";
42
+ rule_file: string;
43
+ }>;
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/checks/verify/types.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IACrF,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEN,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AAC1E,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC;AAC9E,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC/F,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ // src/checks/verify/types.ts
2
+ // Discriminated-union type for the [[rules]].verify field, mirroring the
3
+ // $defs.verify shape in spec/0.12/schema.json. The schema validator enforces
4
+ // shape at parse time; this type lets TS narrow inside the verifier.
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/checks/verify/types.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,yEAAyE;AACzE,6EAA6E;AAC7E,qEAAqE"}
@@ -0,0 +1,9 @@
1
+ import type { ValidationError, Warning } from "../errors.js";
2
+ export interface VerifyCheckOptions {
3
+ repoRoot?: string;
4
+ }
5
+ export declare function verifyCheck(doc: unknown, opts: VerifyCheckOptions): Promise<{
6
+ errors: ValidationError[];
7
+ warnings: Warning[];
8
+ }>;
9
+ //# sourceMappingURL=verify-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-check.d.ts","sourceRoot":"","sources":["../../src/checks/verify-check.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAO7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAyC7D"}
@@ -0,0 +1,67 @@
1
+ // src/checks/verify-check.ts
2
+ // Dispatcher for [[rules]].verify clauses. Walks the rules array; for each
3
+ // entry with a verify field, dispatches to the appropriate verifier:
4
+ // kind="glob_exists" -> verifyGlobExists
5
+ // kind="glob_only" -> verifyGlobOnly
6
+ // kind="ast_pattern" -> verifyAstPattern (lazy-loads @ast-grep/napi)
7
+ // Returns aggregated { errors: [], warnings: [...] } per the project's
8
+ // never-throw rule. When repoRoot is undefined, skips silently (matches
9
+ // existing source-cross-check behavior).
10
+ //
11
+ // ANATOMY_VERIFY_SKIP=1 bypasses verify-check entirely (escape hatch for
12
+ // slow CI runs or environments without ast-grep).
13
+ import { verifyGlobExists, verifyGlobOnly } from "./verify/glob-verifier.js";
14
+ import { verifyAstPattern } from "./verify/ast-grep-verifier.js";
15
+ import { verifySemgrepPattern } from "./verify/semgrep-pattern-verifier.js";
16
+ import { verifySemgrepRuleFile } from "./verify/semgrep-rule-file-verifier.js";
17
+ export async function verifyCheck(doc, opts) {
18
+ if (process.env.ANATOMY_VERIFY_SKIP === "1")
19
+ return { errors: [], warnings: [] };
20
+ if (!opts.repoRoot)
21
+ return { errors: [], warnings: [] };
22
+ const rules = doc.rules;
23
+ if (!Array.isArray(rules))
24
+ return { errors: [], warnings: [] };
25
+ const errors = [];
26
+ const warnings = [];
27
+ for (let i = 0; i < rules.length; i++) {
28
+ const entry = rules[i];
29
+ const verify = entry?.verify;
30
+ if (!verify || typeof verify !== "object")
31
+ continue;
32
+ const pointer = `/rules/${i}/verify`;
33
+ try {
34
+ if (verify.kind === "glob_exists") {
35
+ warnings.push(...await verifyGlobExists(opts.repoRoot, verify, pointer));
36
+ }
37
+ else if (verify.kind === "glob_only") {
38
+ warnings.push(...await verifyGlobOnly(opts.repoRoot, verify, pointer));
39
+ }
40
+ else if (verify.kind === "ast_pattern") {
41
+ warnings.push(...await verifyAstPattern(opts.repoRoot, verify, pointer));
42
+ }
43
+ else if (verify.kind === "semgrep") {
44
+ if ("pattern" in verify) {
45
+ warnings.push(...await verifySemgrepPattern(opts.repoRoot, verify, pointer));
46
+ }
47
+ else {
48
+ const r = await verifySemgrepRuleFile(opts.repoRoot, verify, pointer);
49
+ errors.push(...r.errors);
50
+ warnings.push(...r.warnings);
51
+ }
52
+ }
53
+ }
54
+ catch (err) {
55
+ // Defensive: a verifier exception (should never happen — verifiers
56
+ // catch their own errors) becomes a verify-invalid-pattern warning
57
+ // rather than crashing validation.
58
+ warnings.push({
59
+ code: "verify-invalid-pattern",
60
+ message: `verify check threw: ${err instanceof Error ? err.message : String(err)}`,
61
+ pointer,
62
+ });
63
+ }
64
+ }
65
+ return { errors, warnings };
66
+ }
67
+ //# sourceMappingURL=verify-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-check.js","sourceRoot":"","sources":["../../src/checks/verify-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface DiscoverOptions {
2
+ /** Default 10. Per-subtree depth cap below repoRoot (repoRoot itself is depth 0). */
3
+ maxDepth?: number;
4
+ /** Default ['.git', 'node_modules']. Replaces, does not merge. The dot-prefix
5
+ * rule is applied IN ADDITION to skipDirs (always). */
6
+ skipDirs?: string[];
7
+ }
8
+ export declare function findAnatomyForPath(repoRoot: string, queryPath: string): string | null;
9
+ export declare function discoverAllAnatomies(repoRoot: string, options?: DiscoverOptions): Array<{
10
+ dirPath: string;
11
+ absPath: string;
12
+ }>;
13
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;4DACwD;IACxD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAUD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2BrF;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,eAAe,GACxB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuC7C"}
@@ -0,0 +1,82 @@
1
+ // src/discovery.ts
2
+ // Pure filesystem discovery helpers per spec/0.3/cascading.md §3.
3
+ // No .anatomy content inspection.
4
+ import { existsSync, statSync, readdirSync } from "node:fs";
5
+ import { resolve, join, dirname, sep, relative } from "node:path";
6
+ const DEFAULT_SKIP = [".git", "node_modules", "target", "dist", "build", "__pycache__", ".next", ".turbo"];
7
+ const DEFAULT_MAX_DEPTH = 10;
8
+ function isUnderOrEqual(parent, child) {
9
+ const rel = relative(parent, child);
10
+ return rel === "" || (!rel.startsWith("..") && !rel.includes(`..${sep}`));
11
+ }
12
+ export function findAnatomyForPath(repoRoot, queryPath) {
13
+ if (!existsSync(repoRoot) || !statSync(repoRoot).isDirectory()) {
14
+ throw new TypeError(`repoRoot does not exist or is not a directory: ${repoRoot}`);
15
+ }
16
+ const absRoot = resolve(repoRoot);
17
+ const absQuery = resolve(absRoot, queryPath);
18
+ if (!isUnderOrEqual(absRoot, absQuery)) {
19
+ throw new RangeError(`queryPath is not under repoRoot: ${queryPath}`);
20
+ }
21
+ // If absQuery is an existing dir OR equals absRoot, start there.
22
+ // Otherwise (file path or non-existent), start at its dirname.
23
+ let dir;
24
+ if (absQuery === absRoot) {
25
+ dir = absRoot;
26
+ }
27
+ else if (existsSync(absQuery) && statSync(absQuery).isDirectory()) {
28
+ dir = absQuery;
29
+ }
30
+ else {
31
+ dir = dirname(absQuery);
32
+ }
33
+ while (true) {
34
+ const candidate = join(dir, ".anatomy");
35
+ if (existsSync(candidate))
36
+ return candidate;
37
+ if (dir === absRoot)
38
+ return null;
39
+ dir = dirname(dir);
40
+ }
41
+ }
42
+ export function discoverAllAnatomies(repoRoot, options) {
43
+ if (!existsSync(repoRoot) || !statSync(repoRoot).isDirectory()) {
44
+ throw new TypeError(`repoRoot does not exist or is not a directory: ${repoRoot}`);
45
+ }
46
+ const absRoot = resolve(repoRoot);
47
+ const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;
48
+ const skipDirs = options?.skipDirs ?? DEFAULT_SKIP;
49
+ const out = [];
50
+ function walk(dir, depth) {
51
+ // Process THIS directory (emit if has .anatomy).
52
+ const candidate = join(dir, ".anatomy");
53
+ if (existsSync(candidate)) {
54
+ out.push({ dirPath: dir, absPath: candidate });
55
+ }
56
+ // Stop descending if at depth cap.
57
+ if (depth >= maxDepth)
58
+ return;
59
+ let entries;
60
+ try {
61
+ entries = readdirSync(dir, { withFileTypes: true });
62
+ }
63
+ catch {
64
+ return; // unreadable directory: skip silently
65
+ }
66
+ for (const ent of entries) {
67
+ if (!ent.isDirectory() || ent.isSymbolicLink())
68
+ continue;
69
+ const name = ent.name;
70
+ if (name.startsWith("."))
71
+ continue; // dot-prefix skip
72
+ if (skipDirs.includes(name))
73
+ continue; // closed-list skip
74
+ walk(join(dir, name), depth + 1);
75
+ }
76
+ }
77
+ walk(absRoot, 0);
78
+ // Sort by dirPath lexicographically for deterministic output.
79
+ out.sort((a, b) => a.dirPath.localeCompare(b.dirPath));
80
+ return out;
81
+ }
82
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export type ErrorCode = "toml-parse-error" | "schema-violation" | "version-mismatch" | "hash-content-mismatch" | "fingerprint-mismatch" | "unsupported-anatomy-version" | "structure-path-not-found" | "interface-form-mismatch" | "source-path-not-found" | "nested-path-escape" | "anatomy-read-error" | "memory-read-error" | "missing-anatomy-memory-version" | "unsupported-memory-version" | "memory-fingerprint-mismatch" | "memory-supersedes-not-found" | "memory-supersedes-cycle" | "memory-verified-by-malformed" | "verify-rule-file-outside-repo";
2
+ export type WarningCode = "description-too-long" | "entry-point-description-deprecated" | "source-path-soft-not-found" | "duplicate-fingerprint-in-tree" | "memory-dangling-ref" | "commands-no-test" | "memory-verified-by-too-many" | "memory-last-verified-before-at" | "unused-dependency-claim" | "literal-not-in-source" | "source-cross-check-truncated" | "verify-glob-empty" | "verify-glob-unexpected-files" | "verify-glob-outside-container" | "verify-pattern-not-matched" | "verify-pattern-found-where-forbidden" | "verify-ast-grep-unavailable" | "verify-invalid-pattern" | "verify-source-scan-truncated" | "verify-semgrep-unavailable" | "verify-invalid-rule-file" | "verify-rule-file-missing" | "verify-no-files-matched";
3
+ export interface ValidationError {
4
+ /** Programmatic categorization. Frozen string-literal union. */
5
+ code: ErrorCode;
6
+ /** Human-readable explanation. Not parsed by consumers. */
7
+ message: string;
8
+ /** RFC 6901 JSON Pointer into the parsed document. "" for root-level. */
9
+ pointer: string;
10
+ /** TOML source location. v0.1 populates this only for "toml-parse-error". */
11
+ source?: {
12
+ line: number;
13
+ column: number;
14
+ };
15
+ /** Sub-classification for "schema-violation": AJV's keyword (free-form
16
+ * string). Common values: "required", "pattern", "propertyNames",
17
+ * "maxLength", "minLength", "type", "format", "enum", "const",
18
+ * "additionalProperties", "minProperties", "maxProperties", "maxItems",
19
+ * "minItems". Consumers branching on this should default-handle unknown
20
+ * values. Absent on non-schema errors. */
21
+ schemaKeyword?: string;
22
+ /** Expected value when applicable (computed hash, fingerprint concat, ...). */
23
+ expected?: unknown;
24
+ /** Actual value at `pointer` when applicable. */
25
+ actual?: unknown;
26
+ }
27
+ export interface Warning {
28
+ code: WarningCode;
29
+ message: string;
30
+ pointer: string;
31
+ /** Source-cross-check additive: the literal/name that triggered the warning.
32
+ * Other warning codes leave this undefined. */
33
+ actual?: unknown;
34
+ /** Source-cross-check additive: classification for "literal-not-in-source"
35
+ * warnings. Undefined for all other codes. */
36
+ literalKind?: "host-port" | "scoped-package" | "source-path";
37
+ }
38
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,uBAAuB,GACvB,sBAAsB,GACtB,6BAA6B,GAC7B,0BAA0B,GAC1B,yBAAyB,GACzB,uBAAuB,GACvB,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,gCAAgC,GAChC,4BAA4B,GAC5B,6BAA6B,GAC7B,6BAA6B,GAC7B,yBAAyB,GACzB,8BAA8B,GAE9B,+BAA+B,CAAC;AAEpC,MAAM,MAAM,WAAW,GACnB,sBAAsB,GACtB,oCAAoC,GACpC,4BAA4B,GAC5B,+BAA+B,GAC/B,qBAAqB,GACrB,kBAAkB,GAClB,6BAA6B,GAC7B,gCAAgC,GAChC,yBAAyB,GACzB,uBAAuB,GACvB,8BAA8B,GAE9B,mBAAmB,GACnB,8BAA8B,GAC9B,+BAA+B,GAC/B,4BAA4B,GAC5B,sCAAsC,GACtC,6BAA6B,GAC7B,wBAAwB,GACxB,8BAA8B,GAE9B,4BAA4B,GAC5B,0BAA0B,GAC1B,0BAA0B,GAC1B,yBAAyB,CAAC;AAE9B,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,SAAS,CAAC;IAChB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C;;;;;+CAK2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB;oDACgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;mDAC+C;IAC/C,WAAW,CAAC,EAAE,WAAW,GAAG,gBAAgB,GAAG,aAAa,CAAC;CAC9D"}
package/dist/errors.js ADDED
@@ -0,0 +1,5 @@
1
+ // src/errors.ts
2
+ // Public error and warning types. ErrorCode and WarningCode are frozen
3
+ // for v0.1 (adding codes requires a minor bump of @anatomy/validate).
4
+ export {};
5
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,uEAAuE;AACvE,sEAAsE"}
@@ -0,0 +1,43 @@
1
+ import type { ValidationError, Warning } from "./errors.js";
2
+ import type { AnatomyDoc } from "./types.js";
3
+ export type { AnatomyDoc } from "./types.js";
4
+ export type { ValidationError, Warning, ErrorCode, WarningCode } from "./errors.js";
5
+ export { verifyCheck } from "./checks/verify-check.js";
6
+ export type { VerifyCheckOptions } from "./checks/verify-check.js";
7
+ export { findAnatomyForPath, discoverAllAnatomies } from "./discovery.js";
8
+ export { canonicalize, hash, canonicalHash, fingerprintFromPillars } from "./canonical.js";
9
+ export type { DiscoverOptions } from "./discovery.js";
10
+ export { validateTree } from "./validate-tree.js";
11
+ export type { TreeValidateResult, ValidateTreeOptions } from "./validate-tree.js";
12
+ export { validateMemory } from "./memory.js";
13
+ export type { MemoryValidateOptions, MemoryValidateResult } from "./memory.js";
14
+ /** Ecosystem version implemented by this consumer. v0.3 = cascading-aware. */
15
+ export declare const ECOSYSTEM_VERSION = "0.3";
16
+ export interface ValidateOptions {
17
+ /** Optional: assert the file declares this anatomy_version. Mismatch
18
+ * produces a "version-mismatch" error pointing at /anatomy_version. */
19
+ expectedVersion?: string;
20
+ /** When provided, enables filesystem-aware checks: existence of paths in
21
+ * [structure].entries (v0.2) and the structured form of phrase_with_source.source.path
22
+ * (v0.2). When absent, those checks are skipped. */
23
+ repoRoot?: string;
24
+ /** v0.3: relative POSIX-style path from repoRoot to the directory containing
25
+ * this .anatomy file. Use "" for a root .anatomy. When set together with
26
+ * repoRoot:
27
+ * - structurePathCheck and sourcePathCheck resolve paths relative to
28
+ * repoRoot/anatomyDir
29
+ * - nestedPathEscapeCheck is enabled
30
+ * When omitted, behavior is exactly v0.2. */
31
+ anatomyDir?: string;
32
+ }
33
+ export type ValidateResult = {
34
+ ok: true;
35
+ value: AnatomyDoc;
36
+ warnings: Warning[];
37
+ } | {
38
+ ok: false;
39
+ errors: ValidationError[];
40
+ warnings: Warning[];
41
+ };
42
+ export declare function validate(text: string, options?: ValidateOptions): Promise<ValidateResult>;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE/E,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B;4EACwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;yDAEqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;kDAM8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAElE,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAsD/F"}
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ // src/index.ts
2
+ // Public API for @anatomy/validate.
3
+ //
4
+ // validate(text, options?) runs a fixed pipeline:
5
+ // parse → schema → hash → fingerprint → description-warn
6
+ // Plus an option-driven version-mismatch check after parse.
7
+ //
8
+ // All checks run regardless of prior failures (except: parse failure
9
+ // short-circuits since there's no doc to inspect). Errors and warnings
10
+ // surface in stable order (parse first, then schema, then validator-side
11
+ // checks, then warnings).
12
+ import { parseAnatomyToml } from "./parse.js";
13
+ import { schemaCheck } from "./checks/schema-check.js";
14
+ import { hashCheck } from "./checks/hash-check.js";
15
+ import { fingerprintCheck } from "./checks/fingerprint-check.js";
16
+ import { descriptionWarnCheck } from "./checks/description-warn.js";
17
+ import { structurePathCheck } from "./checks/structure-path-check.js";
18
+ import { sourcePathCheck } from "./checks/source-path-check.js";
19
+ import { nestedPathEscapeCheck } from "./checks/nested-path-escape.js";
20
+ import { sourceCrossCheck } from "./checks/source-cross-check.js";
21
+ import { interfaceFormCheck } from "./checks/interface-form-check.js";
22
+ import { entryPointAliasWarn } from "./checks/entry-point-alias-warn.js";
23
+ import { commandsNoTestWarn } from "./checks/commands-no-test-warn.js";
24
+ import { verifyCheck } from "./checks/verify-check.js";
25
+ export { verifyCheck } from "./checks/verify-check.js";
26
+ export { findAnatomyForPath, discoverAllAnatomies } from "./discovery.js";
27
+ export { canonicalize, hash, canonicalHash, fingerprintFromPillars } from "./canonical.js";
28
+ export { validateTree } from "./validate-tree.js";
29
+ export { validateMemory } from "./memory.js";
30
+ /** Ecosystem version implemented by this consumer. v0.3 = cascading-aware. */
31
+ export const ECOSYSTEM_VERSION = "0.3";
32
+ export async function validate(text, options) {
33
+ // 1. Parse
34
+ const parsed = parseAnatomyToml(text);
35
+ if (!parsed.ok) {
36
+ return { ok: false, errors: [parsed.error], warnings: [] };
37
+ }
38
+ const doc = parsed.doc;
39
+ const errors = [];
40
+ const warnings = [];
41
+ // 2. Version check (option-driven)
42
+ if (options?.expectedVersion !== undefined) {
43
+ const declared = doc.anatomy_version;
44
+ if (declared !== options.expectedVersion) {
45
+ errors.push({
46
+ code: "version-mismatch",
47
+ message: `anatomy_version mismatch: expected ${JSON.stringify(options.expectedVersion)}, got ${JSON.stringify(declared)}`,
48
+ pointer: "/anatomy_version",
49
+ expected: options.expectedVersion,
50
+ actual: declared,
51
+ });
52
+ }
53
+ }
54
+ // 3-6. Run checks; collect errors and warnings.
55
+ for (const check of [schemaCheck, hashCheck, fingerprintCheck, descriptionWarnCheck, interfaceFormCheck, entryPointAliasWarn, commandsNoTestWarn]) {
56
+ const r = check(doc);
57
+ errors.push(...r.errors);
58
+ warnings.push(...r.warnings);
59
+ }
60
+ // 7. repoRoot-aware checks (skipped when repoRoot is undefined).
61
+ const r2 = structurePathCheck(doc, options?.repoRoot, options?.anatomyDir);
62
+ errors.push(...r2.errors);
63
+ warnings.push(...r2.warnings);
64
+ const r3 = sourcePathCheck(doc, options?.repoRoot, options?.anatomyDir);
65
+ errors.push(...r3.errors);
66
+ warnings.push(...r3.warnings);
67
+ const r4 = nestedPathEscapeCheck(doc, options?.anatomyDir);
68
+ errors.push(...r4.errors);
69
+ warnings.push(...r4.warnings);
70
+ const r5 = sourceCrossCheck(doc, options?.repoRoot, options?.anatomyDir);
71
+ errors.push(...r5.errors);
72
+ warnings.push(...r5.warnings);
73
+ const rVerify = await verifyCheck(doc, { repoRoot: options?.repoRoot });
74
+ errors.push(...rVerify.errors);
75
+ warnings.push(...rVerify.warnings);
76
+ if (errors.length === 0) {
77
+ return { ok: true, value: doc, warnings };
78
+ }
79
+ return { ok: false, errors, warnings };
80
+ }
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ValidationError, Warning } from "./errors.js";
2
+ export interface MemoryValidateOptions {
3
+ /** Optional fingerprint of the paired .anatomy file. When provided, runs
4
+ * memory-fingerprint-mismatch check. */
5
+ anatomyFingerprint?: string;
6
+ /** Optional repo root for filesystem-aware checks (memory-dangling-ref). */
7
+ repoRoot?: string;
8
+ }
9
+ export type MemoryValidateResult = {
10
+ ok: true;
11
+ value: unknown;
12
+ warnings: Warning[];
13
+ } | {
14
+ ok: false;
15
+ errors: ValidationError[];
16
+ warnings: Warning[];
17
+ };
18
+ export declare function validateMemory(text: string, options?: MemoryValidateOptions): MemoryValidateResult;
19
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC;6CACyC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAElE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CA4ElG"}
package/dist/memory.js ADDED
@@ -0,0 +1,80 @@
1
+ // src/memory.ts
2
+ // Public API for validating .anatomy-memory files.
3
+ // Separate entry point from validate() because memory has its own schema track.
4
+ import { parseAnatomyToml } from "./parse.js";
5
+ import { compiledMemorySchemas } from "./schema-memory.js";
6
+ import { memoryFingerprintCheck } from "./checks/memory-fingerprint-check.js";
7
+ import { memorySupersessionCheck } from "./checks/memory-supersession-check.js";
8
+ import { memoryDanglingRefCheck } from "./checks/memory-dangling-ref-check.js";
9
+ import { memoryVerificationCheck } from "./checks/memory-verification-check.js";
10
+ export function validateMemory(text, options) {
11
+ // 1. Parse (with TomlDate → ISO string normalization)
12
+ const parsed = parseAnatomyToml(text);
13
+ if (!parsed.ok) {
14
+ return { ok: false, errors: [parsed.error], warnings: [] };
15
+ }
16
+ const doc = parsed.doc;
17
+ const errors = [];
18
+ const warnings = [];
19
+ // 2. Schema check — route by anatomy_memory_version
20
+ const version = doc?.anatomy_memory_version;
21
+ if (typeof version !== "string") {
22
+ errors.push({
23
+ code: "missing-anatomy-memory-version",
24
+ message: "anatomy_memory_version is missing or not a string",
25
+ pointer: "/anatomy_memory_version",
26
+ });
27
+ return { ok: false, errors, warnings };
28
+ }
29
+ const compiled = compiledMemorySchemas.get(version);
30
+ if (!compiled) {
31
+ errors.push({
32
+ code: "unsupported-memory-version",
33
+ message: `unsupported memory schema version: ${version}`,
34
+ pointer: "/anatomy_memory_version",
35
+ });
36
+ return { ok: false, errors, warnings };
37
+ }
38
+ const valid = compiled(doc);
39
+ if (!valid && compiled.errors) {
40
+ for (const e of compiled.errors) {
41
+ errors.push({
42
+ code: "schema-violation",
43
+ message: e.message ?? "schema violation",
44
+ pointer: e.instancePath || "/",
45
+ });
46
+ }
47
+ }
48
+ // 3. Fingerprint check (option-driven)
49
+ if (options?.anatomyFingerprint && errors.length === 0) {
50
+ const r = memoryFingerprintCheck(doc, options.anatomyFingerprint);
51
+ errors.push(...r.errors);
52
+ warnings.push(...r.warnings);
53
+ }
54
+ // 4. Cross-entry checks — only meaningful when schema-valid so far
55
+ if (errors.length === 0) {
56
+ const r = memorySupersessionCheck(doc);
57
+ errors.push(...r.errors);
58
+ warnings.push(...r.warnings);
59
+ }
60
+ // 4b. v0.2 verification-field checks (last_verified_at, verified_by). These
61
+ // run regardless of declared version because v0.1 files can carry the new
62
+ // fields too (the v0.1 schema's $defs.entry now accepts additionalProperties),
63
+ // and v0.1 consumers reading v0.2 files should still flag malformed verified_by.
64
+ if (errors.length === 0) {
65
+ const r = memoryVerificationCheck(doc);
66
+ errors.push(...r.errors);
67
+ warnings.push(...r.warnings);
68
+ }
69
+ // 5. Filesystem-aware checks — only when repoRoot provided
70
+ if (options?.repoRoot && errors.length === 0) {
71
+ const r = memoryDanglingRefCheck(doc, options.repoRoot);
72
+ errors.push(...r.errors);
73
+ warnings.push(...r.warnings);
74
+ }
75
+ if (errors.length === 0) {
76
+ return { ok: true, value: doc, warnings };
77
+ }
78
+ return { ok: false, errors, warnings };
79
+ }
80
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ValidationError } from "./errors.js";
2
+ export type ParseResult = {
3
+ ok: true;
4
+ doc: Record<string, unknown>;
5
+ } | {
6
+ ok: false;
7
+ error: ValidationError;
8
+ };
9
+ /**
10
+ * Parse a TOML string into its JSON-equivalent object model.
11
+ * smol-toml returns TomlDate (subclass of Date) for native datetimes;
12
+ * we normalize via Date.prototype.toISOString() so AJV's format:date-time
13
+ * validates the string representation. Returns a structured error on
14
+ * parse failure rather than throwing.
15
+ */
16
+ export declare function parseAnatomyToml(text: string): ParseResult;
17
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC;AAE1C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAoB1D"}