@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.
- package/LICENSE +21 -0
- package/README.md +127 -0
- package/dist/canonical.d.ts +21 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +76 -0
- package/dist/canonical.js.map +1 -0
- package/dist/checks/commands-no-test-warn.d.ts +6 -0
- package/dist/checks/commands-no-test-warn.d.ts.map +1 -0
- package/dist/checks/commands-no-test-warn.js +35 -0
- package/dist/checks/commands-no-test-warn.js.map +1 -0
- package/dist/checks/description-warn.d.ts +6 -0
- package/dist/checks/description-warn.d.ts.map +1 -0
- package/dist/checks/description-warn.js +23 -0
- package/dist/checks/description-warn.js.map +1 -0
- package/dist/checks/entry-point-alias-warn.d.ts +6 -0
- package/dist/checks/entry-point-alias-warn.d.ts.map +1 -0
- package/dist/checks/entry-point-alias-warn.js +25 -0
- package/dist/checks/entry-point-alias-warn.js.map +1 -0
- package/dist/checks/fingerprint-check.d.ts +6 -0
- package/dist/checks/fingerprint-check.d.ts.map +1 -0
- package/dist/checks/fingerprint-check.js +59 -0
- package/dist/checks/fingerprint-check.js.map +1 -0
- package/dist/checks/hash-check.d.ts +6 -0
- package/dist/checks/hash-check.d.ts.map +1 -0
- package/dist/checks/hash-check.js +36 -0
- package/dist/checks/hash-check.js.map +1 -0
- package/dist/checks/interface-form-check.d.ts +6 -0
- package/dist/checks/interface-form-check.d.ts.map +1 -0
- package/dist/checks/interface-form-check.js +66 -0
- package/dist/checks/interface-form-check.js.map +1 -0
- package/dist/checks/memory-dangling-ref-check.d.ts +6 -0
- package/dist/checks/memory-dangling-ref-check.d.ts.map +1 -0
- package/dist/checks/memory-dangling-ref-check.js +34 -0
- package/dist/checks/memory-dangling-ref-check.js.map +1 -0
- package/dist/checks/memory-fingerprint-check.d.ts +6 -0
- package/dist/checks/memory-fingerprint-check.d.ts.map +1 -0
- package/dist/checks/memory-fingerprint-check.js +20 -0
- package/dist/checks/memory-fingerprint-check.js.map +1 -0
- package/dist/checks/memory-supersession-check.d.ts +6 -0
- package/dist/checks/memory-supersession-check.d.ts.map +1 -0
- package/dist/checks/memory-supersession-check.js +61 -0
- package/dist/checks/memory-supersession-check.js.map +1 -0
- package/dist/checks/memory-verification-check.d.ts +6 -0
- package/dist/checks/memory-verification-check.d.ts.map +1 -0
- package/dist/checks/memory-verification-check.js +61 -0
- package/dist/checks/memory-verification-check.js.map +1 -0
- package/dist/checks/nested-path-escape.d.ts +6 -0
- package/dist/checks/nested-path-escape.d.ts.map +1 -0
- package/dist/checks/nested-path-escape.js +76 -0
- package/dist/checks/nested-path-escape.js.map +1 -0
- package/dist/checks/schema-check.d.ts +6 -0
- package/dist/checks/schema-check.d.ts.map +1 -0
- package/dist/checks/schema-check.js +32 -0
- package/dist/checks/schema-check.js.map +1 -0
- package/dist/checks/source-cross-check.d.ts +52 -0
- package/dist/checks/source-cross-check.d.ts.map +1 -0
- package/dist/checks/source-cross-check.js +473 -0
- package/dist/checks/source-cross-check.js.map +1 -0
- package/dist/checks/source-path-check.d.ts +6 -0
- package/dist/checks/source-path-check.d.ts.map +1 -0
- package/dist/checks/source-path-check.js +62 -0
- package/dist/checks/source-path-check.js.map +1 -0
- package/dist/checks/structure-path-check.d.ts +6 -0
- package/dist/checks/structure-path-check.d.ts.map +1 -0
- package/dist/checks/structure-path-check.js +31 -0
- package/dist/checks/structure-path-check.js.map +1 -0
- package/dist/checks/verify/ast-grep-verifier.d.ts +4 -0
- package/dist/checks/verify/ast-grep-verifier.d.ts.map +1 -0
- package/dist/checks/verify/ast-grep-verifier.js +153 -0
- package/dist/checks/verify/ast-grep-verifier.js.map +1 -0
- package/dist/checks/verify/detect-ast-grep.d.ts +9 -0
- package/dist/checks/verify/detect-ast-grep.d.ts.map +1 -0
- package/dist/checks/verify/detect-ast-grep.js +26 -0
- package/dist/checks/verify/detect-ast-grep.js.map +1 -0
- package/dist/checks/verify/detect-semgrep.d.ts +8 -0
- package/dist/checks/verify/detect-semgrep.d.ts.map +1 -0
- package/dist/checks/verify/detect-semgrep.js +36 -0
- package/dist/checks/verify/detect-semgrep.js.map +1 -0
- package/dist/checks/verify/glob-verifier.d.ts +5 -0
- package/dist/checks/verify/glob-verifier.d.ts.map +1 -0
- package/dist/checks/verify/glob-verifier.js +58 -0
- package/dist/checks/verify/glob-verifier.js.map +1 -0
- package/dist/checks/verify/semgrep-pattern-verifier.d.ts +4 -0
- package/dist/checks/verify/semgrep-pattern-verifier.d.ts.map +1 -0
- package/dist/checks/verify/semgrep-pattern-verifier.js +121 -0
- package/dist/checks/verify/semgrep-pattern-verifier.js.map +1 -0
- package/dist/checks/verify/semgrep-rule-file-verifier.d.ts +9 -0
- package/dist/checks/verify/semgrep-rule-file-verifier.d.ts.map +1 -0
- package/dist/checks/verify/semgrep-rule-file-verifier.js +151 -0
- package/dist/checks/verify/semgrep-rule-file-verifier.js.map +1 -0
- package/dist/checks/verify/types.d.ts +44 -0
- package/dist/checks/verify/types.d.ts.map +1 -0
- package/dist/checks/verify/types.js +6 -0
- package/dist/checks/verify/types.js.map +1 -0
- package/dist/checks/verify-check.d.ts +9 -0
- package/dist/checks/verify-check.d.ts.map +1 -0
- package/dist/checks/verify-check.js +67 -0
- package/dist/checks/verify-check.js.map +1 -0
- package/dist/discovery.d.ts +13 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +82 -0
- package/dist/discovery.js.map +1 -0
- package/dist/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +5 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +19 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +80 -0
- package/dist/memory.js.map +1 -0
- package/dist/parse.d.ts +17 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +47 -0
- package/dist/parse.js.map +1 -0
- package/dist/schema-0.10.json +194 -0
- package/dist/schema-0.11.json +203 -0
- package/dist/schema-0.12.json +243 -0
- package/dist/schema-0.13.json +267 -0
- package/dist/schema-0.14.json +288 -0
- package/dist/schema-0.15.json +347 -0
- package/dist/schema-0.2.json +283 -0
- package/dist/schema-0.4.json +280 -0
- package/dist/schema-0.5.json +300 -0
- package/dist/schema-0.6.json +328 -0
- package/dist/schema-0.7.json +311 -0
- package/dist/schema-0.8.json +245 -0
- package/dist/schema-0.9.json +172 -0
- package/dist/schema-1.0.json +347 -0
- package/dist/schema-memory-0.1.json +43 -0
- package/dist/schema-memory-0.2.json +49 -0
- package/dist/schema-memory.d.ts +5 -0
- package/dist/schema-memory.d.ts.map +1 -0
- package/dist/schema-memory.js +16 -0
- package/dist/schema-memory.js.map +1 -0
- package/dist/schema.d.ts +6 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +62 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.json +129 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.generated.d.ts +1103 -0
- package/dist/types.generated.d.ts.map +1 -0
- package/dist/types.generated.js +7 -0
- package/dist/types.generated.js.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/validate-tree.d.ts +20 -0
- package/dist/validate-tree.d.ts.map +1 -0
- package/dist/validate-tree.js +64 -0
- package/dist/validate-tree.js.map +1 -0
- 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":"AAAA,kDAAkD;AAClD,iFAAiF;AACjF,2EAA2E;AAC3E,gFAAgF;AAChF,wEAAwE;AACxE,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,oDAAoD;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAG9D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,MAAM,uBAAuB,GAAG;IAC9B,cAAc;IACd,sBAAsB;IACtB,sBAAsB;IACtB,wBAAwB;CACzB,CAAC;AAEF,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe;IAC7D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAaD,MAAM,OAAO,GAAG,CAAC,CAAU,EAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9E,MAAM,QAAQ,GAAG,CAAC,EAAa,EAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACjF,MAAM,KAAK,GAAG,CAAC,CAAkB,EAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACpF,MAAM,KAAK,GAAG,GAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,GAA0B,EAC1B,OAAe;IAEf,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,4BAA4B;YAClC,OAAO,EACL,uEAAuE;gBACvE,6EAA6E;YAC/E,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,yEAAyE;IACzE,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,WAAW,CAAC;IAC3F,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC;YACX,IAAI,EAAE,+BAA+B;YACrC,OAAO,EACL,qBAAqB,GAAG,CAAC,SAAS,mCAAmC;gBACrE,IAAI,YAAY,0DAA0D;YAC5E,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,0BAA0B;YAChC,OAAO,EACL,qBAAqB,GAAG,CAAC,SAAS,0CAA0C,YAAY,GAAG;YAC7F,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;IAClD,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,SAAS,UAAU,4CAA4C;YACxE,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,MAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAChB,SAAS,EACT,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,EACjD;YACE,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,gBAAgB;YAC3B,GAAG,EAAE,QAAQ;SACd,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACpF,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,8BAA8B,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,mBAAmB,EAAE;YACrF,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC9C,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACjD,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC;gBACb,IAAI,EAAE,0BAA0B;gBAChC,OAAO,EAAE,+BAA+B,GAAG,CAAC,SAAS,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE;gBAC/E,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,8BAA8B,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YACvF,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA+B,CAAC;QACxF,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,8CAA8C,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YAC7E,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,4BAA4B;YAClC,OAAO,EACL,sBAAsB,GAAG,CAAC,SAAS,iCAAiC;gBACpE,OAAO,UAAU,IAAI;YACvB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvD,IAAI,EAAE,sCAA+C;YACrD,OAAO,EACL,sBAAsB,GAAG,CAAC,SAAS,gBAAgB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG;gBAC5E,sBAAsB,GAAG,CAAC,SAAS,IAAI;YACzC,OAAO;SACR,CAAC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,KAAK,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -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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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,uEAAuE;AACvE,sEAAsE"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|
package/dist/memory.d.ts
ADDED
|
@@ -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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"}
|
package/dist/parse.d.ts
ADDED
|
@@ -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"}
|