@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,34 @@
1
+ // src/checks/memory-dangling-ref-check.ts
2
+ // Warns (does not error) on entry refs that look like local paths but no
3
+ // longer exist on disk. Soft signal — file moves are common; right action
4
+ // is human review, not auto-fix.
5
+ import { existsSync } from "node:fs";
6
+ import { resolve } from "node:path";
7
+ export function memoryDanglingRefCheck(doc, repoRoot) {
8
+ const warnings = [];
9
+ const d = doc;
10
+ const entries = Array.isArray(d.entries) ? d.entries : [];
11
+ for (let i = 0; i < entries.length; i++) {
12
+ const refs = entries[i].refs;
13
+ if (!Array.isArray(refs))
14
+ continue;
15
+ for (let j = 0; j < refs.length; j++) {
16
+ const ref = refs[j];
17
+ if (typeof ref !== "string")
18
+ continue;
19
+ // Skip git: and entry: refs — only check local paths
20
+ if (ref.startsWith("git:") || ref.startsWith("entry:"))
21
+ continue;
22
+ const abs = resolve(repoRoot, ref);
23
+ if (!existsSync(abs)) {
24
+ warnings.push({
25
+ code: "memory-dangling-ref",
26
+ message: `entry refs path that no longer exists: ${ref}`,
27
+ pointer: `/entries/${i}/refs/${j}`,
28
+ });
29
+ }
30
+ }
31
+ }
32
+ return { errors: [], warnings };
33
+ }
34
+ //# sourceMappingURL=memory-dangling-ref-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-dangling-ref-check.js","sourceRoot":"","sources":["../../src/checks/memory-dangling-ref-check.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,yEAAyE;AACzE,0EAA0E;AAC1E,iCAAiC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,UAAU,sBAAsB,CACpC,GAAY,EACZ,QAAgB;IAEhB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,GAA4B,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,OAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,SAAS;YACtC,qDAAqD;YACrD,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACjE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,0CAA0C,GAAG,EAAE;oBACxD,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ValidationError, Warning } from "../errors.js";
2
+ export declare function memoryFingerprintCheck(doc: unknown, anatomyFingerprint: string): {
3
+ errors: ValidationError[];
4
+ warnings: Warning[];
5
+ };
6
+ //# sourceMappingURL=memory-fingerprint-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-fingerprint-check.d.ts","sourceRoot":"","sources":["../../src/checks/memory-fingerprint-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE7D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,kBAAkB,EAAE,MAAM,GACzB;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAcpD"}
@@ -0,0 +1,20 @@
1
+ // src/checks/memory-fingerprint-check.ts
2
+ // Verifies .anatomy-memory.repo_fingerprint matches the paired .anatomy's
3
+ // [identity].fingerprint. Catches accidental cross-repo memory file copies.
4
+ export function memoryFingerprintCheck(doc, anatomyFingerprint) {
5
+ const errors = [];
6
+ const d = doc;
7
+ if (typeof d.repo_fingerprint !== "string")
8
+ return { errors, warnings: [] };
9
+ if (d.repo_fingerprint !== anatomyFingerprint) {
10
+ errors.push({
11
+ code: "memory-fingerprint-mismatch",
12
+ message: `repo_fingerprint ${JSON.stringify(d.repo_fingerprint)} does not match paired .anatomy fingerprint ${JSON.stringify(anatomyFingerprint)}`,
13
+ pointer: "/repo_fingerprint",
14
+ expected: anatomyFingerprint,
15
+ actual: d.repo_fingerprint,
16
+ });
17
+ }
18
+ return { errors, warnings: [] };
19
+ }
20
+ //# sourceMappingURL=memory-fingerprint-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-fingerprint-check.js","sourceRoot":"","sources":["../../src/checks/memory-fingerprint-check.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,0EAA0E;AAC1E,4EAA4E;AAI5E,MAAM,UAAU,sBAAsB,CACpC,GAAY,EACZ,kBAA0B;IAE1B,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,GAAqC,CAAC;IAChD,IAAI,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5E,IAAI,CAAC,CAAC,gBAAgB,KAAK,kBAAkB,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,oBAAoB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,+CAA+C,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE;YAClJ,OAAO,EAAE,mBAAmB;YAC5B,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,CAAC,CAAC,gBAAgB;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ValidationError, Warning } from "../errors.js";
2
+ export declare function memorySupersessionCheck(doc: unknown): {
3
+ errors: ValidationError[];
4
+ warnings: Warning[];
5
+ };
6
+ //# sourceMappingURL=memory-supersession-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-supersession-check.d.ts","sourceRoot":"","sources":["../../src/checks/memory-supersession-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAO7D,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,OAAO,GACX;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAyDpD"}
@@ -0,0 +1,61 @@
1
+ // src/checks/memory-supersession-check.ts
2
+ // Cross-entry referential integrity: every superseded_by must point to an
3
+ // existing id; the supersession graph must be acyclic.
4
+ export function memorySupersessionCheck(doc) {
5
+ const errors = [];
6
+ const d = doc;
7
+ const entries = Array.isArray(d.entries) ? d.entries : [];
8
+ if (entries.length === 0)
9
+ return { errors, warnings: [] };
10
+ const idIndex = new Map();
11
+ for (let i = 0; i < entries.length; i++) {
12
+ const id = entries[i].id;
13
+ if (typeof id === "string")
14
+ idIndex.set(id, i);
15
+ }
16
+ // Existence check
17
+ for (let i = 0; i < entries.length; i++) {
18
+ const sb = entries[i].superseded_by;
19
+ if (typeof sb === "string" && !idIndex.has(sb)) {
20
+ errors.push({
21
+ code: "memory-supersedes-not-found",
22
+ message: `entry references superseded_by="${sb}" but no entry with that id exists`,
23
+ pointer: `/entries/${i}/superseded_by`,
24
+ });
25
+ }
26
+ }
27
+ // Cycle check (DFS coloring)
28
+ const WHITE = 0, GRAY = 1, BLACK = 2;
29
+ const color = new Array(entries.length).fill(WHITE);
30
+ const cycleReported = new Set();
31
+ function visit(i) {
32
+ if (color[i] === GRAY)
33
+ return true;
34
+ if (color[i] === BLACK)
35
+ return false;
36
+ color[i] = GRAY;
37
+ const sb = entries[i].superseded_by;
38
+ if (typeof sb === "string") {
39
+ const next = idIndex.get(sb);
40
+ if (next !== undefined && visit(next)) {
41
+ if (!cycleReported.has(i)) {
42
+ errors.push({
43
+ code: "memory-supersedes-cycle",
44
+ message: `supersession chain forms a cycle starting at entry "${entries[i].id}"`,
45
+ pointer: `/entries/${i}/superseded_by`,
46
+ });
47
+ cycleReported.add(i);
48
+ }
49
+ return true;
50
+ }
51
+ }
52
+ color[i] = BLACK;
53
+ return false;
54
+ }
55
+ for (let i = 0; i < entries.length; i++) {
56
+ if (color[i] === WHITE)
57
+ visit(i);
58
+ }
59
+ return { errors, warnings: [] };
60
+ }
61
+ //# sourceMappingURL=memory-supersession-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-supersession-check.js","sourceRoot":"","sources":["../../src/checks/memory-supersession-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ValidationError, Warning } from "../errors.js";
2
+ export declare function memoryVerificationCheck(doc: unknown): {
3
+ errors: ValidationError[];
4
+ warnings: Warning[];
5
+ };
6
+ //# sourceMappingURL=memory-verification-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-verification-check.d.ts","sourceRoot":"","sources":["../../src/checks/memory-verification-check.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAW7D,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,OAAO,GACX;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAkDpD"}
@@ -0,0 +1,61 @@
1
+ // src/checks/memory-verification-check.ts
2
+ // v0.2 memory: validate the optional last_verified_at + verified_by fields.
3
+ // - memory-verified-by-malformed (error): a verified_by item doesn't match
4
+ // the attribution regex.
5
+ // - memory-verified-by-too-many (warning): verified_by has > 5 entries
6
+ // (the schema's maxItems is 5; this fires when an over-long array slips
7
+ // past schema validation, e.g. via a v0.2 file written by a non-conformant
8
+ // producer that still satisfies additionalProperties:true).
9
+ // - memory-last-verified-before-at (warning): last_verified_at < at, which
10
+ // almost always means a typo or clock skew rather than a meaningful state.
11
+ const ATTRIBUTION_RE = /^(claude-session(:[a-z0-9-]+)?|human:[a-z0-9._-]+|@[a-z0-9._-]+)$/;
12
+ const MAX_VERIFIED_BY = 5;
13
+ export function memoryVerificationCheck(doc) {
14
+ const errors = [];
15
+ const warnings = [];
16
+ const d = doc;
17
+ const entries = Array.isArray(d.entries) ? d.entries : [];
18
+ if (entries.length === 0)
19
+ return { errors, warnings };
20
+ for (let i = 0; i < entries.length; i++) {
21
+ const e = entries[i];
22
+ // verified_by malformed item
23
+ if (Array.isArray(e.verified_by)) {
24
+ for (let j = 0; j < e.verified_by.length; j++) {
25
+ const v = e.verified_by[j];
26
+ if (typeof v !== "string" || !ATTRIBUTION_RE.test(v)) {
27
+ errors.push({
28
+ code: "memory-verified-by-malformed",
29
+ message: `verified_by[${j}] is not a valid attribution string (expected human:<handle> | claude-session[:<model>] | @<handle>)`,
30
+ pointer: `/entries/${i}/verified_by/${j}`,
31
+ actual: typeof v === "string" ? v : `(${typeof v})`,
32
+ });
33
+ }
34
+ }
35
+ // verified_by too many (warning — schema's maxItems should catch this,
36
+ // but a forward-compat additionalProperties:true read of a malformed
37
+ // file could surface it here too)
38
+ if (e.verified_by.length > MAX_VERIFIED_BY) {
39
+ warnings.push({
40
+ code: "memory-verified-by-too-many",
41
+ message: `verified_by has ${e.verified_by.length} entries; the schema cap is ${MAX_VERIFIED_BY}. CLI writers truncate to the most recent ${MAX_VERIFIED_BY} via LRU on next verify.`,
42
+ pointer: `/entries/${i}/verified_by`,
43
+ });
44
+ }
45
+ }
46
+ // last_verified_at < at
47
+ if (typeof e.last_verified_at === "string" && typeof e.at === "string") {
48
+ // ISO-8601 lexical compare matches chronological order for normalized
49
+ // strings, which both fields are required by schema:format:date-time.
50
+ if (e.last_verified_at < e.at) {
51
+ warnings.push({
52
+ code: "memory-last-verified-before-at",
53
+ message: `last_verified_at (${e.last_verified_at}) is before the entry's creation timestamp (${e.at}); usually a typo or clock skew`,
54
+ pointer: `/entries/${i}/last_verified_at`,
55
+ });
56
+ }
57
+ }
58
+ }
59
+ return { errors, warnings };
60
+ }
61
+ //# sourceMappingURL=memory-verification-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-verification-check.js","sourceRoot":"","sources":["../../src/checks/memory-verification-check.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,4EAA4E;AAC5E,6EAA6E;AAC7E,6BAA6B;AAC7B,yEAAyE;AACzE,4EAA4E;AAC5E,+EAA+E;AAC/E,gEAAgE;AAChE,6EAA6E;AAC7E,+EAA+E;AAU/E,MAAM,cAAc,GAAG,mEAAmE,CAAC;AAC3F,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,UAAU,uBAAuB,CACrC,GAAY;IAEZ,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,GAA4B,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,OAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAEtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAErB,6BAA6B;QAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,8BAA8B;wBACpC,OAAO,EAAE,eAAe,CAAC,sGAAsG;wBAC/H,OAAO,EAAE,YAAY,CAAC,gBAAgB,CAAC,EAAE;wBACzC,MAAM,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG;qBACpD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,uEAAuE;YACvE,qEAAqE;YACrE,kCAAkC;YAClC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBAC3C,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,mBAAmB,CAAC,CAAC,WAAW,CAAC,MAAM,+BAA+B,eAAe,6CAA6C,eAAe,0BAA0B;oBACpL,OAAO,EAAE,YAAY,CAAC,cAAc;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACvE,sEAAsE;YACtE,sEAAsE;YACtE,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,gCAAgC;oBACtC,OAAO,EAAE,qBAAqB,CAAC,CAAC,gBAAgB,+CAA+C,CAAC,CAAC,EAAE,iCAAiC;oBACpI,OAAO,EAAE,YAAY,CAAC,mBAAmB;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ValidationError, Warning } from "../errors.js";
2
+ export declare function nestedPathEscapeCheck(doc: unknown, anatomyDir?: string): {
3
+ errors: ValidationError[];
4
+ warnings: Warning[];
5
+ };
6
+ //# sourceMappingURL=nested-path-escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-path-escape.d.ts","sourceRoot":"","sources":["../../src/checks/nested-path-escape.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAmC7D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG;IACxE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CA6CA"}
@@ -0,0 +1,76 @@
1
+ // src/checks/nested-path-escape.ts
2
+ // When anatomyDir is supplied, every path-bearing field MUST resolve within
3
+ // the anatomy's directory after lexical normalisation. The check uses POSIX
4
+ // path semantics (forward slashes, lexical resolution); no filesystem access.
5
+ function escapesScope(rawPath) {
6
+ // Lexical normalisation: split on / (path-bearing fields are POSIX-style
7
+ // relative paths per the v0.2 schema), resolve "." and ".." segments,
8
+ // and check whether the depth ever goes negative.
9
+ const segments = rawPath.split("/").filter(s => s.length > 0 && s !== ".");
10
+ let depth = 0;
11
+ for (const seg of segments) {
12
+ if (seg === "..") {
13
+ depth--;
14
+ if (depth < 0)
15
+ return true;
16
+ }
17
+ else {
18
+ depth++;
19
+ }
20
+ }
21
+ return false;
22
+ }
23
+ function checkPath(rawPath, pointer, errors) {
24
+ if (typeof rawPath !== "string")
25
+ return;
26
+ if (escapesScope(rawPath)) {
27
+ errors.push({
28
+ code: "nested-path-escape",
29
+ message: `path escapes the anatomy's directory: ${rawPath}`,
30
+ pointer,
31
+ actual: rawPath,
32
+ });
33
+ }
34
+ }
35
+ export function nestedPathEscapeCheck(doc, anatomyDir) {
36
+ if (anatomyDir === undefined)
37
+ return { errors: [], warnings: [] };
38
+ const errors = [];
39
+ const d = doc;
40
+ // entry_points
41
+ const eps = d?.operation?.entry_points;
42
+ if (Array.isArray(eps)) {
43
+ for (let i = 0; i < eps.length; i++) {
44
+ checkPath(eps[i]?.path, `/operation/entry_points/${i}/path`, errors);
45
+ }
46
+ }
47
+ // structure.entries
48
+ const ents = d?.structure?.entries;
49
+ if (Array.isArray(ents)) {
50
+ for (let i = 0; i < ents.length; i++) {
51
+ checkPath(ents[i]?.path, `/structure/entries/${i}/path`, errors);
52
+ }
53
+ }
54
+ // substance.capabilities/limitations source (both forms)
55
+ const subst = d?.substance;
56
+ if (subst) {
57
+ for (const arrName of ["capabilities", "limitations"]) {
58
+ const arr = subst[arrName];
59
+ if (!Array.isArray(arr))
60
+ continue;
61
+ for (let i = 0; i < arr.length; i++) {
62
+ const src = arr[i]?.source;
63
+ if (typeof src === "string") {
64
+ const hashIdx = src.indexOf("#");
65
+ const pathPart = hashIdx === -1 ? src : src.slice(0, hashIdx);
66
+ checkPath(pathPart, `/substance/${arrName}/${i}/source`, errors);
67
+ }
68
+ else if (src && typeof src === "object" && typeof src.path === "string") {
69
+ checkPath(src.path, `/substance/${arrName}/${i}/source/path`, errors);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ return { errors, warnings: [] };
75
+ }
76
+ //# sourceMappingURL=nested-path-escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-path-escape.js","sourceRoot":"","sources":["../../src/checks/nested-path-escape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ValidationError, Warning } from "../errors.js";
2
+ export declare function schemaCheck(doc: unknown): {
3
+ errors: ValidationError[];
4
+ warnings: Warning[];
5
+ };
6
+ //# sourceMappingURL=schema-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-check.d.ts","sourceRoot":"","sources":["../../src/checks/schema-check.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE7D,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG;IACzC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CA2BA"}
@@ -0,0 +1,32 @@
1
+ // src/checks/schema-check.ts
2
+ // Routes the parsed doc to the matching version's compiled JSON Schema based
3
+ // on its declared anatomy_version, then maps AJV errors to ValidationError.
4
+ // An unknown or missing anatomy_version produces an unsupported-anatomy-version
5
+ // error so downstream checks can be skipped safely.
6
+ import { compiledSchemas } from "../schema.js";
7
+ export function schemaCheck(doc) {
8
+ const declared = doc?.anatomy_version;
9
+ const fn = typeof declared === "string" ? compiledSchemas.get(declared) : undefined;
10
+ if (!fn) {
11
+ return {
12
+ errors: [{
13
+ code: "unsupported-anatomy-version",
14
+ message: `unsupported anatomy_version: ${JSON.stringify(declared)}`,
15
+ pointer: "/anatomy_version",
16
+ actual: declared,
17
+ }],
18
+ warnings: [],
19
+ };
20
+ }
21
+ const ok = fn(doc);
22
+ if (ok)
23
+ return { errors: [], warnings: [] };
24
+ const errors = (fn.errors ?? []).map((e) => ({
25
+ code: "schema-violation",
26
+ message: e.message ?? "schema violation",
27
+ pointer: e.instancePath, // already a JSON Pointer in AJV
28
+ schemaKeyword: e.keyword,
29
+ }));
30
+ return { errors, warnings: [] };
31
+ }
32
+ //# sourceMappingURL=schema-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-check.js","sourceRoot":"","sources":["../../src/checks/schema-check.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,6EAA6E;AAC7E,4EAA4E;AAC5E,gFAAgF;AAChF,oDAAoD;AAEpD,OAAO,EAAE,eAAe,EAAiB,MAAM,cAAc,CAAC;AAG9D,MAAM,UAAU,WAAW,CAAC,GAAY;IAItC,MAAM,QAAQ,GAAI,GAAqC,EAAE,eAAe,CAAC;IACzE,MAAM,EAAE,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpF,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO;YACL,MAAM,EAAE,CAAC;oBACP,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,gCAAgC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;oBACnE,OAAO,EAAE,kBAAkB;oBAC3B,MAAM,EAAE,QAAQ;iBACjB,CAAC;YACF,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAE5C,MAAM,MAAM,GAAsB,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,kBAA2B;QACjC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,kBAAkB;QACxC,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,gCAAgC;QACzD,aAAa,EAAE,CAAC,CAAC,OAAO;KACzB,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { ValidationError, Warning } from "../errors.js";
2
+ type LiteralKind = "host-port" | "scoped-package" | "source-path";
3
+ export declare function extractLiterals(text: string): Array<{
4
+ literal: string;
5
+ kind: LiteralKind;
6
+ }>;
7
+ /** Returns true if `name` appears in `haystack` inside a quoted string,
8
+ * bounded on the right by either a closing quote or `/` (subpath imports
9
+ * like `'@fontsource/inter/400.css'` or `'react-dom/client'`). The right-
10
+ * side `/` is the only addition over a strict closing-quote match — `-` and
11
+ * `.` are still rejected so `react` does not match `react-dom`/`react.foo`. */
12
+ export declare function findQuotedReference(name: string, haystack: string): boolean;
13
+ /** Reads ANATOMY_SOURCE_SCAN_BYTES (e.g. "16M", "32768K", "16777216").
14
+ * Defaults to DEFAULT_MAX_TOTAL_BYTES (8 MB) when unset/malformed.
15
+ * Surfaced via the source-cross-check-truncated warning when the budget
16
+ * is exhausted, so monorepo users with >8MB of source can raise the cap
17
+ * without splitting into cascading sub-.anatomy files (per the
18
+ * 2026-05-09 stress test on openclaw-fresh). */
19
+ export declare function getMaxTotalBytes(): number;
20
+ interface SourceIndex {
21
+ files: Array<{
22
+ relPath: string;
23
+ content: string;
24
+ }>;
25
+ combinedHaystack: string;
26
+ truncated: boolean;
27
+ /** The byte budget used for this index (from getMaxTotalBytes()). Echoed
28
+ * in the truncation warning so the user sees what cap was applied. */
29
+ maxTotalBytes: number;
30
+ /** First file relative-path that exceeded the budget and was therefore
31
+ * NOT loaded — gives the user a concrete pointer for what got skipped. */
32
+ firstSkippedRel?: string;
33
+ /** Parsed package.json `scripts` section, if package.json existed and parsed
34
+ * as JSON. Used by the bare-command usage check in checkDependencyUsage. */
35
+ packageJsonScripts?: Record<string, string>;
36
+ }
37
+ /** Returns true if `name` appears as a whitespace/operator-bounded token in
38
+ * any value of the parsed package.json scripts. Handles bare invocation
39
+ * (`"prettier --write ."`), `npx <name>`, and chained commands
40
+ * (`"npm run lint && vitest run"`). For `@scope/name` deps, also matches
41
+ * the conventional bin form `<scope>-<name>` (e.g. `@electron/rebuild`
42
+ * publishes a bin called `electron-rebuild`). */
43
+ export declare function isUsedInScripts(name: string, scripts: Record<string, string> | undefined): boolean;
44
+ export declare function buildSourceIndex(scanRoot: string, structureEntries: Array<{
45
+ path?: string;
46
+ }>): SourceIndex;
47
+ export declare function sourceCrossCheck(doc: unknown, repoRoot?: string, anatomyDir?: string): {
48
+ errors: ValidationError[];
49
+ warnings: Warning[];
50
+ };
51
+ export {};
52
+ //# sourceMappingURL=source-cross-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-cross-check.d.ts","sourceRoot":"","sources":["../../src/checks/source-cross-check.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE7D,KAAK,WAAW,GAAG,WAAW,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAOlE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAiB3F;AAED;;;;gFAIgF;AAChF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM3E;AA4CD;;;;;iDAKiD;AACjD,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAKD,UAAU,WAAW;IACnB,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB;2EACuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB;+EAC2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;iFAC6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAaD;;;;;kDAKkD;AAClD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,OAAO,CAWT;AAsHD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACzC,WAAW,CA0Eb;AA6FD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAgCpD"}