@tiangong-lca/pcr 0.0.0-stage → 0.2.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 (581) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +5 -0
  3. package/README.md +107 -2
  4. package/node_modules/ajv/.runkit_example.js +23 -0
  5. package/node_modules/ajv/LICENSE +22 -0
  6. package/node_modules/ajv/README.md +207 -0
  7. package/node_modules/ajv/dist/2019.d.ts +19 -0
  8. package/node_modules/ajv/dist/2019.js +61 -0
  9. package/node_modules/ajv/dist/2019.js.map +1 -0
  10. package/node_modules/ajv/dist/2020.d.ts +19 -0
  11. package/node_modules/ajv/dist/2020.js +55 -0
  12. package/node_modules/ajv/dist/2020.js.map +1 -0
  13. package/node_modules/ajv/dist/ajv.d.ts +18 -0
  14. package/node_modules/ajv/dist/ajv.js +50 -0
  15. package/node_modules/ajv/dist/ajv.js.map +1 -0
  16. package/node_modules/ajv/dist/compile/codegen/code.d.ts +40 -0
  17. package/node_modules/ajv/dist/compile/codegen/code.js +156 -0
  18. package/node_modules/ajv/dist/compile/codegen/code.js.map +1 -0
  19. package/node_modules/ajv/dist/compile/codegen/index.d.ts +79 -0
  20. package/node_modules/ajv/dist/compile/codegen/index.js +697 -0
  21. package/node_modules/ajv/dist/compile/codegen/index.js.map +1 -0
  22. package/node_modules/ajv/dist/compile/codegen/scope.d.ts +79 -0
  23. package/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
  24. package/node_modules/ajv/dist/compile/codegen/scope.js.map +1 -0
  25. package/node_modules/ajv/dist/compile/errors.d.ts +13 -0
  26. package/node_modules/ajv/dist/compile/errors.js +123 -0
  27. package/node_modules/ajv/dist/compile/errors.js.map +1 -0
  28. package/node_modules/ajv/dist/compile/index.d.ts +80 -0
  29. package/node_modules/ajv/dist/compile/index.js +242 -0
  30. package/node_modules/ajv/dist/compile/index.js.map +1 -0
  31. package/node_modules/ajv/dist/compile/jtd/parse.d.ts +4 -0
  32. package/node_modules/ajv/dist/compile/jtd/parse.js +350 -0
  33. package/node_modules/ajv/dist/compile/jtd/parse.js.map +1 -0
  34. package/node_modules/ajv/dist/compile/jtd/serialize.d.ts +4 -0
  35. package/node_modules/ajv/dist/compile/jtd/serialize.js +236 -0
  36. package/node_modules/ajv/dist/compile/jtd/serialize.js.map +1 -0
  37. package/node_modules/ajv/dist/compile/jtd/types.d.ts +6 -0
  38. package/node_modules/ajv/dist/compile/jtd/types.js +14 -0
  39. package/node_modules/ajv/dist/compile/jtd/types.js.map +1 -0
  40. package/node_modules/ajv/dist/compile/names.d.ts +20 -0
  41. package/node_modules/ajv/dist/compile/names.js +28 -0
  42. package/node_modules/ajv/dist/compile/names.js.map +1 -0
  43. package/node_modules/ajv/dist/compile/ref_error.d.ts +6 -0
  44. package/node_modules/ajv/dist/compile/ref_error.js +12 -0
  45. package/node_modules/ajv/dist/compile/ref_error.js.map +1 -0
  46. package/node_modules/ajv/dist/compile/resolve.d.ts +12 -0
  47. package/node_modules/ajv/dist/compile/resolve.js +155 -0
  48. package/node_modules/ajv/dist/compile/resolve.js.map +1 -0
  49. package/node_modules/ajv/dist/compile/rules.d.ts +28 -0
  50. package/node_modules/ajv/dist/compile/rules.js +26 -0
  51. package/node_modules/ajv/dist/compile/rules.js.map +1 -0
  52. package/node_modules/ajv/dist/compile/util.d.ts +40 -0
  53. package/node_modules/ajv/dist/compile/util.js +178 -0
  54. package/node_modules/ajv/dist/compile/util.js.map +1 -0
  55. package/node_modules/ajv/dist/compile/validate/applicability.d.ts +6 -0
  56. package/node_modules/ajv/dist/compile/validate/applicability.js +19 -0
  57. package/node_modules/ajv/dist/compile/validate/applicability.js.map +1 -0
  58. package/node_modules/ajv/dist/compile/validate/boolSchema.d.ts +4 -0
  59. package/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
  60. package/node_modules/ajv/dist/compile/validate/boolSchema.js.map +1 -0
  61. package/node_modules/ajv/dist/compile/validate/dataType.d.ts +17 -0
  62. package/node_modules/ajv/dist/compile/validate/dataType.js +203 -0
  63. package/node_modules/ajv/dist/compile/validate/dataType.js.map +1 -0
  64. package/node_modules/ajv/dist/compile/validate/defaults.d.ts +2 -0
  65. package/node_modules/ajv/dist/compile/validate/defaults.js +35 -0
  66. package/node_modules/ajv/dist/compile/validate/defaults.js.map +1 -0
  67. package/node_modules/ajv/dist/compile/validate/index.d.ts +42 -0
  68. package/node_modules/ajv/dist/compile/validate/index.js +520 -0
  69. package/node_modules/ajv/dist/compile/validate/index.js.map +1 -0
  70. package/node_modules/ajv/dist/compile/validate/keyword.d.ts +8 -0
  71. package/node_modules/ajv/dist/compile/validate/keyword.js +124 -0
  72. package/node_modules/ajv/dist/compile/validate/keyword.js.map +1 -0
  73. package/node_modules/ajv/dist/compile/validate/subschema.d.ts +47 -0
  74. package/node_modules/ajv/dist/compile/validate/subschema.js +81 -0
  75. package/node_modules/ajv/dist/compile/validate/subschema.js.map +1 -0
  76. package/node_modules/ajv/dist/core.d.ts +174 -0
  77. package/node_modules/ajv/dist/core.js +618 -0
  78. package/node_modules/ajv/dist/core.js.map +1 -0
  79. package/node_modules/ajv/dist/jtd.d.ts +47 -0
  80. package/node_modules/ajv/dist/jtd.js +72 -0
  81. package/node_modules/ajv/dist/jtd.js.map +1 -0
  82. package/node_modules/ajv/dist/refs/data.json +13 -0
  83. package/node_modules/ajv/dist/refs/json-schema-2019-09/index.d.ts +2 -0
  84. package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js +28 -0
  85. package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js.map +1 -0
  86. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/applicator.json +53 -0
  87. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/content.json +17 -0
  88. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/core.json +57 -0
  89. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/format.json +14 -0
  90. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/meta-data.json +37 -0
  91. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/validation.json +90 -0
  92. package/node_modules/ajv/dist/refs/json-schema-2019-09/schema.json +39 -0
  93. package/node_modules/ajv/dist/refs/json-schema-2020-12/index.d.ts +2 -0
  94. package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +30 -0
  95. package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js.map +1 -0
  96. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.json +48 -0
  97. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.json +17 -0
  98. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.json +51 -0
  99. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
  100. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.json +37 -0
  101. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
  102. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.json +90 -0
  103. package/node_modules/ajv/dist/refs/json-schema-2020-12/schema.json +55 -0
  104. package/node_modules/ajv/dist/refs/json-schema-draft-06.json +137 -0
  105. package/node_modules/ajv/dist/refs/json-schema-draft-07.json +151 -0
  106. package/node_modules/ajv/dist/refs/json-schema-secure.json +88 -0
  107. package/node_modules/ajv/dist/refs/jtd-schema.d.ts +3 -0
  108. package/node_modules/ajv/dist/refs/jtd-schema.js +118 -0
  109. package/node_modules/ajv/dist/refs/jtd-schema.js.map +1 -0
  110. package/node_modules/ajv/dist/runtime/equal.d.ts +6 -0
  111. package/node_modules/ajv/dist/runtime/equal.js +7 -0
  112. package/node_modules/ajv/dist/runtime/equal.js.map +1 -0
  113. package/node_modules/ajv/dist/runtime/parseJson.d.ts +18 -0
  114. package/node_modules/ajv/dist/runtime/parseJson.js +185 -0
  115. package/node_modules/ajv/dist/runtime/parseJson.js.map +1 -0
  116. package/node_modules/ajv/dist/runtime/quote.d.ts +5 -0
  117. package/node_modules/ajv/dist/runtime/quote.js +30 -0
  118. package/node_modules/ajv/dist/runtime/quote.js.map +1 -0
  119. package/node_modules/ajv/dist/runtime/re2.d.ts +6 -0
  120. package/node_modules/ajv/dist/runtime/re2.js +6 -0
  121. package/node_modules/ajv/dist/runtime/re2.js.map +1 -0
  122. package/node_modules/ajv/dist/runtime/timestamp.d.ts +5 -0
  123. package/node_modules/ajv/dist/runtime/timestamp.js +42 -0
  124. package/node_modules/ajv/dist/runtime/timestamp.js.map +1 -0
  125. package/node_modules/ajv/dist/runtime/ucs2length.d.ts +5 -0
  126. package/node_modules/ajv/dist/runtime/ucs2length.js +24 -0
  127. package/node_modules/ajv/dist/runtime/ucs2length.js.map +1 -0
  128. package/node_modules/ajv/dist/runtime/uri.d.ts +6 -0
  129. package/node_modules/ajv/dist/runtime/uri.js +6 -0
  130. package/node_modules/ajv/dist/runtime/uri.js.map +1 -0
  131. package/node_modules/ajv/dist/runtime/validation_error.d.ts +7 -0
  132. package/node_modules/ajv/dist/runtime/validation_error.js +11 -0
  133. package/node_modules/ajv/dist/runtime/validation_error.js.map +1 -0
  134. package/node_modules/ajv/dist/standalone/index.d.ts +6 -0
  135. package/node_modules/ajv/dist/standalone/index.js +90 -0
  136. package/node_modules/ajv/dist/standalone/index.js.map +1 -0
  137. package/node_modules/ajv/dist/standalone/instance.d.ts +12 -0
  138. package/node_modules/ajv/dist/standalone/instance.js +35 -0
  139. package/node_modules/ajv/dist/standalone/instance.js.map +1 -0
  140. package/node_modules/ajv/dist/types/index.d.ts +183 -0
  141. package/node_modules/ajv/dist/types/index.js +3 -0
  142. package/node_modules/ajv/dist/types/index.js.map +1 -0
  143. package/node_modules/ajv/dist/types/json-schema.d.ts +125 -0
  144. package/node_modules/ajv/dist/types/json-schema.js +3 -0
  145. package/node_modules/ajv/dist/types/json-schema.js.map +1 -0
  146. package/node_modules/ajv/dist/types/jtd-schema.d.ts +174 -0
  147. package/node_modules/ajv/dist/types/jtd-schema.js +3 -0
  148. package/node_modules/ajv/dist/types/jtd-schema.js.map +1 -0
  149. package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.d.ts +8 -0
  150. package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +49 -0
  151. package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js.map +1 -0
  152. package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.d.ts +6 -0
  153. package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +106 -0
  154. package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js.map +1 -0
  155. package/node_modules/ajv/dist/vocabularies/applicator/allOf.d.ts +3 -0
  156. package/node_modules/ajv/dist/vocabularies/applicator/allOf.js +23 -0
  157. package/node_modules/ajv/dist/vocabularies/applicator/allOf.js.map +1 -0
  158. package/node_modules/ajv/dist/vocabularies/applicator/anyOf.d.ts +4 -0
  159. package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +12 -0
  160. package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js.map +1 -0
  161. package/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts +7 -0
  162. package/node_modules/ajv/dist/vocabularies/applicator/contains.js +95 -0
  163. package/node_modules/ajv/dist/vocabularies/applicator/contains.js.map +1 -0
  164. package/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts +21 -0
  165. package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +85 -0
  166. package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js.map +1 -0
  167. package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.d.ts +3 -0
  168. package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +11 -0
  169. package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js.map +1 -0
  170. package/node_modules/ajv/dist/vocabularies/applicator/if.d.ts +6 -0
  171. package/node_modules/ajv/dist/vocabularies/applicator/if.js +66 -0
  172. package/node_modules/ajv/dist/vocabularies/applicator/if.js.map +1 -0
  173. package/node_modules/ajv/dist/vocabularies/applicator/index.d.ts +13 -0
  174. package/node_modules/ajv/dist/vocabularies/applicator/index.js +44 -0
  175. package/node_modules/ajv/dist/vocabularies/applicator/index.js.map +1 -0
  176. package/node_modules/ajv/dist/vocabularies/applicator/items.d.ts +5 -0
  177. package/node_modules/ajv/dist/vocabularies/applicator/items.js +52 -0
  178. package/node_modules/ajv/dist/vocabularies/applicator/items.js.map +1 -0
  179. package/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts +6 -0
  180. package/node_modules/ajv/dist/vocabularies/applicator/items2020.js +30 -0
  181. package/node_modules/ajv/dist/vocabularies/applicator/items2020.js.map +1 -0
  182. package/node_modules/ajv/dist/vocabularies/applicator/not.d.ts +4 -0
  183. package/node_modules/ajv/dist/vocabularies/applicator/not.js +26 -0
  184. package/node_modules/ajv/dist/vocabularies/applicator/not.js.map +1 -0
  185. package/node_modules/ajv/dist/vocabularies/applicator/oneOf.d.ts +6 -0
  186. package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +60 -0
  187. package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js.map +1 -0
  188. package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.d.ts +3 -0
  189. package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +75 -0
  190. package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js.map +1 -0
  191. package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.d.ts +3 -0
  192. package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +12 -0
  193. package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js.map +1 -0
  194. package/node_modules/ajv/dist/vocabularies/applicator/properties.d.ts +3 -0
  195. package/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
  196. package/node_modules/ajv/dist/vocabularies/applicator/properties.js.map +1 -0
  197. package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.d.ts +6 -0
  198. package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +38 -0
  199. package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js.map +1 -0
  200. package/node_modules/ajv/dist/vocabularies/applicator/thenElse.d.ts +3 -0
  201. package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +13 -0
  202. package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js.map +1 -0
  203. package/node_modules/ajv/dist/vocabularies/code.d.ts +17 -0
  204. package/node_modules/ajv/dist/vocabularies/code.js +131 -0
  205. package/node_modules/ajv/dist/vocabularies/code.js.map +1 -0
  206. package/node_modules/ajv/dist/vocabularies/core/id.d.ts +3 -0
  207. package/node_modules/ajv/dist/vocabularies/core/id.js +10 -0
  208. package/node_modules/ajv/dist/vocabularies/core/id.js.map +1 -0
  209. package/node_modules/ajv/dist/vocabularies/core/index.d.ts +3 -0
  210. package/node_modules/ajv/dist/vocabularies/core/index.js +16 -0
  211. package/node_modules/ajv/dist/vocabularies/core/index.js.map +1 -0
  212. package/node_modules/ajv/dist/vocabularies/core/ref.d.ts +8 -0
  213. package/node_modules/ajv/dist/vocabularies/core/ref.js +122 -0
  214. package/node_modules/ajv/dist/vocabularies/core/ref.js.map +1 -0
  215. package/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts +5 -0
  216. package/node_modules/ajv/dist/vocabularies/discriminator/index.js +104 -0
  217. package/node_modules/ajv/dist/vocabularies/discriminator/index.js.map +1 -0
  218. package/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts +10 -0
  219. package/node_modules/ajv/dist/vocabularies/discriminator/types.js +9 -0
  220. package/node_modules/ajv/dist/vocabularies/discriminator/types.js.map +1 -0
  221. package/node_modules/ajv/dist/vocabularies/draft2020.d.ts +3 -0
  222. package/node_modules/ajv/dist/vocabularies/draft2020.js +23 -0
  223. package/node_modules/ajv/dist/vocabularies/draft2020.js.map +1 -0
  224. package/node_modules/ajv/dist/vocabularies/draft7.d.ts +3 -0
  225. package/node_modules/ajv/dist/vocabularies/draft7.js +17 -0
  226. package/node_modules/ajv/dist/vocabularies/draft7.js.map +1 -0
  227. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.d.ts +5 -0
  228. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +30 -0
  229. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js.map +1 -0
  230. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.d.ts +5 -0
  231. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +51 -0
  232. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js.map +1 -0
  233. package/node_modules/ajv/dist/vocabularies/dynamic/index.d.ts +3 -0
  234. package/node_modules/ajv/dist/vocabularies/dynamic/index.js +9 -0
  235. package/node_modules/ajv/dist/vocabularies/dynamic/index.js.map +1 -0
  236. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.d.ts +3 -0
  237. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +16 -0
  238. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js.map +1 -0
  239. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.d.ts +3 -0
  240. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +10 -0
  241. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js.map +1 -0
  242. package/node_modules/ajv/dist/vocabularies/errors.d.ts +9 -0
  243. package/node_modules/ajv/dist/vocabularies/errors.js +3 -0
  244. package/node_modules/ajv/dist/vocabularies/errors.js.map +1 -0
  245. package/node_modules/ajv/dist/vocabularies/format/format.d.ts +8 -0
  246. package/node_modules/ajv/dist/vocabularies/format/format.js +92 -0
  247. package/node_modules/ajv/dist/vocabularies/format/format.js.map +1 -0
  248. package/node_modules/ajv/dist/vocabularies/format/index.d.ts +3 -0
  249. package/node_modules/ajv/dist/vocabularies/format/index.js +6 -0
  250. package/node_modules/ajv/dist/vocabularies/format/index.js.map +1 -0
  251. package/node_modules/ajv/dist/vocabularies/jtd/discriminator.d.ts +6 -0
  252. package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js +71 -0
  253. package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js.map +1 -0
  254. package/node_modules/ajv/dist/vocabularies/jtd/elements.d.ts +5 -0
  255. package/node_modules/ajv/dist/vocabularies/jtd/elements.js +24 -0
  256. package/node_modules/ajv/dist/vocabularies/jtd/elements.js.map +1 -0
  257. package/node_modules/ajv/dist/vocabularies/jtd/enum.d.ts +6 -0
  258. package/node_modules/ajv/dist/vocabularies/jtd/enum.js +43 -0
  259. package/node_modules/ajv/dist/vocabularies/jtd/enum.js.map +1 -0
  260. package/node_modules/ajv/dist/vocabularies/jtd/error.d.ts +9 -0
  261. package/node_modules/ajv/dist/vocabularies/jtd/error.js +20 -0
  262. package/node_modules/ajv/dist/vocabularies/jtd/error.js.map +1 -0
  263. package/node_modules/ajv/dist/vocabularies/jtd/index.d.ts +10 -0
  264. package/node_modules/ajv/dist/vocabularies/jtd/index.js +29 -0
  265. package/node_modules/ajv/dist/vocabularies/jtd/index.js.map +1 -0
  266. package/node_modules/ajv/dist/vocabularies/jtd/metadata.d.ts +5 -0
  267. package/node_modules/ajv/dist/vocabularies/jtd/metadata.js +25 -0
  268. package/node_modules/ajv/dist/vocabularies/jtd/metadata.js.map +1 -0
  269. package/node_modules/ajv/dist/vocabularies/jtd/nullable.d.ts +4 -0
  270. package/node_modules/ajv/dist/vocabularies/jtd/nullable.js +22 -0
  271. package/node_modules/ajv/dist/vocabularies/jtd/nullable.js.map +1 -0
  272. package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.d.ts +3 -0
  273. package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js +15 -0
  274. package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js.map +1 -0
  275. package/node_modules/ajv/dist/vocabularies/jtd/properties.d.ts +22 -0
  276. package/node_modules/ajv/dist/vocabularies/jtd/properties.js +149 -0
  277. package/node_modules/ajv/dist/vocabularies/jtd/properties.js.map +1 -0
  278. package/node_modules/ajv/dist/vocabularies/jtd/ref.d.ts +4 -0
  279. package/node_modules/ajv/dist/vocabularies/jtd/ref.js +67 -0
  280. package/node_modules/ajv/dist/vocabularies/jtd/ref.js.map +1 -0
  281. package/node_modules/ajv/dist/vocabularies/jtd/type.d.ts +10 -0
  282. package/node_modules/ajv/dist/vocabularies/jtd/type.js +69 -0
  283. package/node_modules/ajv/dist/vocabularies/jtd/type.js.map +1 -0
  284. package/node_modules/ajv/dist/vocabularies/jtd/union.d.ts +3 -0
  285. package/node_modules/ajv/dist/vocabularies/jtd/union.js +12 -0
  286. package/node_modules/ajv/dist/vocabularies/jtd/union.js.map +1 -0
  287. package/node_modules/ajv/dist/vocabularies/jtd/values.d.ts +5 -0
  288. package/node_modules/ajv/dist/vocabularies/jtd/values.js +51 -0
  289. package/node_modules/ajv/dist/vocabularies/jtd/values.js.map +1 -0
  290. package/node_modules/ajv/dist/vocabularies/metadata.d.ts +3 -0
  291. package/node_modules/ajv/dist/vocabularies/metadata.js +18 -0
  292. package/node_modules/ajv/dist/vocabularies/metadata.js.map +1 -0
  293. package/node_modules/ajv/dist/vocabularies/next.d.ts +3 -0
  294. package/node_modules/ajv/dist/vocabularies/next.js +8 -0
  295. package/node_modules/ajv/dist/vocabularies/next.js.map +1 -0
  296. package/node_modules/ajv/dist/vocabularies/unevaluated/index.d.ts +3 -0
  297. package/node_modules/ajv/dist/vocabularies/unevaluated/index.js +7 -0
  298. package/node_modules/ajv/dist/vocabularies/unevaluated/index.js.map +1 -0
  299. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.d.ts +6 -0
  300. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +40 -0
  301. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js.map +1 -0
  302. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.d.ts +6 -0
  303. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +65 -0
  304. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js.map +1 -0
  305. package/node_modules/ajv/dist/vocabularies/validation/const.d.ts +6 -0
  306. package/node_modules/ajv/dist/vocabularies/validation/const.js +25 -0
  307. package/node_modules/ajv/dist/vocabularies/validation/const.js.map +1 -0
  308. package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.d.ts +5 -0
  309. package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +12 -0
  310. package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js.map +1 -0
  311. package/node_modules/ajv/dist/vocabularies/validation/enum.d.ts +8 -0
  312. package/node_modules/ajv/dist/vocabularies/validation/enum.js +48 -0
  313. package/node_modules/ajv/dist/vocabularies/validation/enum.js.map +1 -0
  314. package/node_modules/ajv/dist/vocabularies/validation/index.d.ts +16 -0
  315. package/node_modules/ajv/dist/vocabularies/validation/index.js +33 -0
  316. package/node_modules/ajv/dist/vocabularies/validation/index.js.map +1 -0
  317. package/node_modules/ajv/dist/vocabularies/validation/limitContains.d.ts +3 -0
  318. package/node_modules/ajv/dist/vocabularies/validation/limitContains.js +15 -0
  319. package/node_modules/ajv/dist/vocabularies/validation/limitContains.js.map +1 -0
  320. package/node_modules/ajv/dist/vocabularies/validation/limitItems.d.ts +3 -0
  321. package/node_modules/ajv/dist/vocabularies/validation/limitItems.js +24 -0
  322. package/node_modules/ajv/dist/vocabularies/validation/limitItems.js.map +1 -0
  323. package/node_modules/ajv/dist/vocabularies/validation/limitLength.d.ts +3 -0
  324. package/node_modules/ajv/dist/vocabularies/validation/limitLength.js +27 -0
  325. package/node_modules/ajv/dist/vocabularies/validation/limitLength.js.map +1 -0
  326. package/node_modules/ajv/dist/vocabularies/validation/limitNumber.d.ts +11 -0
  327. package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +27 -0
  328. package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js.map +1 -0
  329. package/node_modules/ajv/dist/vocabularies/validation/limitProperties.d.ts +3 -0
  330. package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +24 -0
  331. package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js.map +1 -0
  332. package/node_modules/ajv/dist/vocabularies/validation/multipleOf.d.ts +8 -0
  333. package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +26 -0
  334. package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js.map +1 -0
  335. package/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts +8 -0
  336. package/node_modules/ajv/dist/vocabularies/validation/pattern.js +33 -0
  337. package/node_modules/ajv/dist/vocabularies/validation/pattern.js.map +1 -0
  338. package/node_modules/ajv/dist/vocabularies/validation/required.d.ts +8 -0
  339. package/node_modules/ajv/dist/vocabularies/validation/required.js +79 -0
  340. package/node_modules/ajv/dist/vocabularies/validation/required.js.map +1 -0
  341. package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.d.ts +9 -0
  342. package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +64 -0
  343. package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js.map +1 -0
  344. package/node_modules/ajv/lib/2019.ts +81 -0
  345. package/node_modules/ajv/lib/2020.ts +75 -0
  346. package/node_modules/ajv/lib/ajv.ts +70 -0
  347. package/node_modules/ajv/lib/compile/codegen/code.ts +169 -0
  348. package/node_modules/ajv/lib/compile/codegen/index.ts +852 -0
  349. package/node_modules/ajv/lib/compile/codegen/scope.ts +215 -0
  350. package/node_modules/ajv/lib/compile/errors.ts +184 -0
  351. package/node_modules/ajv/lib/compile/index.ts +324 -0
  352. package/node_modules/ajv/lib/compile/jtd/parse.ts +411 -0
  353. package/node_modules/ajv/lib/compile/jtd/serialize.ts +277 -0
  354. package/node_modules/ajv/lib/compile/jtd/types.ts +16 -0
  355. package/node_modules/ajv/lib/compile/names.ts +27 -0
  356. package/node_modules/ajv/lib/compile/ref_error.ts +13 -0
  357. package/node_modules/ajv/lib/compile/resolve.ts +149 -0
  358. package/node_modules/ajv/lib/compile/rules.ts +50 -0
  359. package/node_modules/ajv/lib/compile/util.ts +213 -0
  360. package/node_modules/ajv/lib/compile/validate/applicability.ts +22 -0
  361. package/node_modules/ajv/lib/compile/validate/boolSchema.ts +47 -0
  362. package/node_modules/ajv/lib/compile/validate/dataType.ts +230 -0
  363. package/node_modules/ajv/lib/compile/validate/defaults.ts +32 -0
  364. package/node_modules/ajv/lib/compile/validate/index.ts +582 -0
  365. package/node_modules/ajv/lib/compile/validate/keyword.ts +171 -0
  366. package/node_modules/ajv/lib/compile/validate/subschema.ts +135 -0
  367. package/node_modules/ajv/lib/core.ts +892 -0
  368. package/node_modules/ajv/lib/jtd.ts +132 -0
  369. package/node_modules/ajv/lib/refs/data.json +13 -0
  370. package/node_modules/ajv/lib/refs/json-schema-2019-09/index.ts +28 -0
  371. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/applicator.json +53 -0
  372. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/content.json +17 -0
  373. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/core.json +57 -0
  374. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/format.json +14 -0
  375. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/meta-data.json +37 -0
  376. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/validation.json +90 -0
  377. package/node_modules/ajv/lib/refs/json-schema-2019-09/schema.json +39 -0
  378. package/node_modules/ajv/lib/refs/json-schema-2020-12/index.ts +30 -0
  379. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/applicator.json +48 -0
  380. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/content.json +17 -0
  381. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/core.json +51 -0
  382. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
  383. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/meta-data.json +37 -0
  384. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
  385. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/validation.json +90 -0
  386. package/node_modules/ajv/lib/refs/json-schema-2020-12/schema.json +55 -0
  387. package/node_modules/ajv/lib/refs/json-schema-draft-06.json +137 -0
  388. package/node_modules/ajv/lib/refs/json-schema-draft-07.json +151 -0
  389. package/node_modules/ajv/lib/refs/json-schema-secure.json +88 -0
  390. package/node_modules/ajv/lib/refs/jtd-schema.ts +130 -0
  391. package/node_modules/ajv/lib/runtime/equal.ts +7 -0
  392. package/node_modules/ajv/lib/runtime/parseJson.ts +177 -0
  393. package/node_modules/ajv/lib/runtime/quote.ts +31 -0
  394. package/node_modules/ajv/lib/runtime/re2.ts +6 -0
  395. package/node_modules/ajv/lib/runtime/timestamp.ts +46 -0
  396. package/node_modules/ajv/lib/runtime/ucs2length.ts +20 -0
  397. package/node_modules/ajv/lib/runtime/uri.ts +6 -0
  398. package/node_modules/ajv/lib/runtime/validation_error.ts +13 -0
  399. package/node_modules/ajv/lib/standalone/index.ts +100 -0
  400. package/node_modules/ajv/lib/standalone/instance.ts +36 -0
  401. package/node_modules/ajv/lib/types/index.ts +244 -0
  402. package/node_modules/ajv/lib/types/json-schema.ts +187 -0
  403. package/node_modules/ajv/lib/types/jtd-schema.ts +273 -0
  404. package/node_modules/ajv/lib/vocabularies/applicator/additionalItems.ts +56 -0
  405. package/node_modules/ajv/lib/vocabularies/applicator/additionalProperties.ts +118 -0
  406. package/node_modules/ajv/lib/vocabularies/applicator/allOf.ts +22 -0
  407. package/node_modules/ajv/lib/vocabularies/applicator/anyOf.ts +14 -0
  408. package/node_modules/ajv/lib/vocabularies/applicator/contains.ts +109 -0
  409. package/node_modules/ajv/lib/vocabularies/applicator/dependencies.ts +112 -0
  410. package/node_modules/ajv/lib/vocabularies/applicator/dependentSchemas.ts +11 -0
  411. package/node_modules/ajv/lib/vocabularies/applicator/if.ts +80 -0
  412. package/node_modules/ajv/lib/vocabularies/applicator/index.ts +53 -0
  413. package/node_modules/ajv/lib/vocabularies/applicator/items.ts +59 -0
  414. package/node_modules/ajv/lib/vocabularies/applicator/items2020.ts +36 -0
  415. package/node_modules/ajv/lib/vocabularies/applicator/not.ts +38 -0
  416. package/node_modules/ajv/lib/vocabularies/applicator/oneOf.ts +82 -0
  417. package/node_modules/ajv/lib/vocabularies/applicator/patternProperties.ts +91 -0
  418. package/node_modules/ajv/lib/vocabularies/applicator/prefixItems.ts +12 -0
  419. package/node_modules/ajv/lib/vocabularies/applicator/properties.ts +57 -0
  420. package/node_modules/ajv/lib/vocabularies/applicator/propertyNames.ts +50 -0
  421. package/node_modules/ajv/lib/vocabularies/applicator/thenElse.ts +13 -0
  422. package/node_modules/ajv/lib/vocabularies/code.ts +168 -0
  423. package/node_modules/ajv/lib/vocabularies/core/id.ts +10 -0
  424. package/node_modules/ajv/lib/vocabularies/core/index.ts +16 -0
  425. package/node_modules/ajv/lib/vocabularies/core/ref.ts +129 -0
  426. package/node_modules/ajv/lib/vocabularies/discriminator/index.ts +113 -0
  427. package/node_modules/ajv/lib/vocabularies/discriminator/types.ts +12 -0
  428. package/node_modules/ajv/lib/vocabularies/draft2020.ts +23 -0
  429. package/node_modules/ajv/lib/vocabularies/draft7.ts +17 -0
  430. package/node_modules/ajv/lib/vocabularies/dynamic/dynamicAnchor.ts +31 -0
  431. package/node_modules/ajv/lib/vocabularies/dynamic/dynamicRef.ts +51 -0
  432. package/node_modules/ajv/lib/vocabularies/dynamic/index.ts +9 -0
  433. package/node_modules/ajv/lib/vocabularies/dynamic/recursiveAnchor.ts +14 -0
  434. package/node_modules/ajv/lib/vocabularies/dynamic/recursiveRef.ts +10 -0
  435. package/node_modules/ajv/lib/vocabularies/errors.ts +18 -0
  436. package/node_modules/ajv/lib/vocabularies/format/format.ts +120 -0
  437. package/node_modules/ajv/lib/vocabularies/format/index.ts +6 -0
  438. package/node_modules/ajv/lib/vocabularies/jtd/discriminator.ts +89 -0
  439. package/node_modules/ajv/lib/vocabularies/jtd/elements.ts +32 -0
  440. package/node_modules/ajv/lib/vocabularies/jtd/enum.ts +45 -0
  441. package/node_modules/ajv/lib/vocabularies/jtd/error.ts +23 -0
  442. package/node_modules/ajv/lib/vocabularies/jtd/index.ts +37 -0
  443. package/node_modules/ajv/lib/vocabularies/jtd/metadata.ts +24 -0
  444. package/node_modules/ajv/lib/vocabularies/jtd/nullable.ts +21 -0
  445. package/node_modules/ajv/lib/vocabularies/jtd/optionalProperties.ts +15 -0
  446. package/node_modules/ajv/lib/vocabularies/jtd/properties.ts +184 -0
  447. package/node_modules/ajv/lib/vocabularies/jtd/ref.ts +76 -0
  448. package/node_modules/ajv/lib/vocabularies/jtd/type.ts +75 -0
  449. package/node_modules/ajv/lib/vocabularies/jtd/union.ts +12 -0
  450. package/node_modules/ajv/lib/vocabularies/jtd/values.ts +58 -0
  451. package/node_modules/ajv/lib/vocabularies/metadata.ts +17 -0
  452. package/node_modules/ajv/lib/vocabularies/next.ts +8 -0
  453. package/node_modules/ajv/lib/vocabularies/unevaluated/index.ts +7 -0
  454. package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedItems.ts +47 -0
  455. package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedProperties.ts +85 -0
  456. package/node_modules/ajv/lib/vocabularies/validation/const.ts +28 -0
  457. package/node_modules/ajv/lib/vocabularies/validation/dependentRequired.ts +23 -0
  458. package/node_modules/ajv/lib/vocabularies/validation/enum.ts +54 -0
  459. package/node_modules/ajv/lib/vocabularies/validation/index.ts +49 -0
  460. package/node_modules/ajv/lib/vocabularies/validation/limitContains.ts +16 -0
  461. package/node_modules/ajv/lib/vocabularies/validation/limitItems.ts +26 -0
  462. package/node_modules/ajv/lib/vocabularies/validation/limitLength.ts +30 -0
  463. package/node_modules/ajv/lib/vocabularies/validation/limitNumber.ts +42 -0
  464. package/node_modules/ajv/lib/vocabularies/validation/limitProperties.ts +26 -0
  465. package/node_modules/ajv/lib/vocabularies/validation/multipleOf.ts +34 -0
  466. package/node_modules/ajv/lib/vocabularies/validation/pattern.ts +39 -0
  467. package/node_modules/ajv/lib/vocabularies/validation/required.ts +98 -0
  468. package/node_modules/ajv/lib/vocabularies/validation/uniqueItems.ts +79 -0
  469. package/node_modules/ajv/package.json +126 -0
  470. package/node_modules/fast-deep-equal/LICENSE +21 -0
  471. package/node_modules/fast-deep-equal/README.md +96 -0
  472. package/node_modules/fast-deep-equal/es6/index.d.ts +2 -0
  473. package/node_modules/fast-deep-equal/es6/index.js +72 -0
  474. package/node_modules/fast-deep-equal/es6/react.d.ts +2 -0
  475. package/node_modules/fast-deep-equal/es6/react.js +79 -0
  476. package/node_modules/fast-deep-equal/index.d.ts +4 -0
  477. package/node_modules/fast-deep-equal/index.js +46 -0
  478. package/node_modules/fast-deep-equal/package.json +61 -0
  479. package/node_modules/fast-deep-equal/react.d.ts +2 -0
  480. package/node_modules/fast-deep-equal/react.js +53 -0
  481. package/node_modules/fast-uri/.gitattributes +2 -0
  482. package/node_modules/fast-uri/.github/dependabot.yml +13 -0
  483. package/node_modules/fast-uri/.github/workflows/ci.yml +106 -0
  484. package/node_modules/fast-uri/.github/workflows/lock-threads.yml +19 -0
  485. package/node_modules/fast-uri/.github/workflows/package-manager-ci.yml +24 -0
  486. package/node_modules/fast-uri/LICENSE +30 -0
  487. package/node_modules/fast-uri/README.md +152 -0
  488. package/node_modules/fast-uri/benchmark/benchmark.mjs +159 -0
  489. package/node_modules/fast-uri/benchmark/equal.mjs +51 -0
  490. package/node_modules/fast-uri/benchmark/non-simple-domain.mjs +22 -0
  491. package/node_modules/fast-uri/benchmark/package.json +17 -0
  492. package/node_modules/fast-uri/benchmark/string-array-to-hex-stripped.mjs +24 -0
  493. package/node_modules/fast-uri/benchmark/ws-is-secure.mjs +65 -0
  494. package/node_modules/fast-uri/eslint.config.js +6 -0
  495. package/node_modules/fast-uri/index.js +627 -0
  496. package/node_modules/fast-uri/lib/schemes.js +272 -0
  497. package/node_modules/fast-uri/lib/utils.js +747 -0
  498. package/node_modules/fast-uri/package.json +68 -0
  499. package/node_modules/fast-uri/test/ajv.test.js +43 -0
  500. package/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  501. package/node_modules/fast-uri/test/equal.test.js +145 -0
  502. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +503 -0
  503. package/node_modules/fast-uri/test/fixtures/uri-js-serialize.json +120 -0
  504. package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  505. package/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  506. package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  507. package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  508. package/node_modules/fast-uri/test/parse.test.js +327 -0
  509. package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  510. package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  511. package/node_modules/fast-uri/test/resolve.test.js +87 -0
  512. package/node_modules/fast-uri/test/rfc-3986.test.js +90 -0
  513. package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  514. package/node_modules/fast-uri/test/security-normalization.test.js +140 -0
  515. package/node_modules/fast-uri/test/security.test.js +431 -0
  516. package/node_modules/fast-uri/test/serialize.test.js +151 -0
  517. package/node_modules/fast-uri/test/uri-js-compatibility.test.js +33 -0
  518. package/node_modules/fast-uri/test/uri-js.test.js +912 -0
  519. package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  520. package/node_modules/fast-uri/test/util.test.js +38 -0
  521. package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  522. package/node_modules/fast-uri/tsconfig.json +9 -0
  523. package/node_modules/fast-uri/types/index.d.ts +60 -0
  524. package/node_modules/fast-uri/types/index.test-d.ts +17 -0
  525. package/node_modules/json-schema-traverse/.eslintrc.yml +27 -0
  526. package/node_modules/json-schema-traverse/.github/FUNDING.yml +2 -0
  527. package/node_modules/json-schema-traverse/.github/workflows/build.yml +28 -0
  528. package/node_modules/json-schema-traverse/.github/workflows/publish.yml +27 -0
  529. package/node_modules/json-schema-traverse/LICENSE +21 -0
  530. package/node_modules/json-schema-traverse/README.md +95 -0
  531. package/node_modules/json-schema-traverse/index.d.ts +40 -0
  532. package/node_modules/json-schema-traverse/index.js +93 -0
  533. package/node_modules/json-schema-traverse/package.json +43 -0
  534. package/node_modules/json-schema-traverse/spec/.eslintrc.yml +6 -0
  535. package/node_modules/json-schema-traverse/spec/fixtures/schema.js +125 -0
  536. package/node_modules/json-schema-traverse/spec/index.spec.js +171 -0
  537. package/node_modules/require-from-string/index.js +34 -0
  538. package/node_modules/require-from-string/license +21 -0
  539. package/node_modules/require-from-string/package.json +28 -0
  540. package/node_modules/require-from-string/readme.md +56 -0
  541. package/package.json +33 -4
  542. package/packages/pcr-core/schemas/agent-review.schema.json +69 -0
  543. package/packages/pcr-core/schemas/classification-coverage.schema.json +187 -0
  544. package/packages/pcr-core/schemas/controlled-vocabulary.schema.json +189 -0
  545. package/packages/pcr-core/schemas/dataset-validation-input.schema.json +7 -0
  546. package/packages/pcr-core/schemas/feedback-draft-output.schema.json +12 -0
  547. package/packages/pcr-core/schemas/feedback.schema.json +27 -0
  548. package/packages/pcr-core/schemas/guidance-output.schema.json +97 -0
  549. package/packages/pcr-core/schemas/model-validation-input.schema.json +10 -0
  550. package/packages/pcr-core/schemas/pcr-id-aliases.schema.json +120 -0
  551. package/packages/pcr-core/schemas/readiness.schema.json +100 -0
  552. package/packages/pcr-core/schemas/structured-projection.schema.json +269 -0
  553. package/packages/pcr-core/schemas/validation-output.schema.json +117 -0
  554. package/packages/pcr-core/src/classification-coverage.mjs +732 -0
  555. package/packages/pcr-core/src/consumption-calculation.mjs +53 -0
  556. package/packages/pcr-core/src/consumption-data.mjs +88 -0
  557. package/packages/pcr-core/src/consumption-guidance.mjs +62 -0
  558. package/packages/pcr-core/src/consumption-review.mjs +83 -0
  559. package/packages/pcr-core/src/contracts.mjs +195 -0
  560. package/packages/pcr-core/src/generated/controlled-vocabulary.mjs +41 -0
  561. package/packages/pcr-core/src/index.mjs +2101 -0
  562. package/packages/pcr-core/src/languages.mjs +86 -0
  563. package/packages/pcr-core/src/offline-library.mjs +121 -0
  564. package/packages/pcr-core/src/output-semantics.mjs +228 -0
  565. package/packages/pcr-core/src/pcr-id-aliases.mjs +949 -0
  566. package/packages/pcr-core/src/projection-completeness.mjs +284 -0
  567. package/packages/pcr-core/src/projection-integrity.mjs +208 -0
  568. package/packages/pcr-core/src/read-context.mjs +505 -0
  569. package/packages/pcr-core/src/schema-validation.mjs +142 -0
  570. package/packages/pcr-core/src/source-context.mjs +13 -0
  571. package/packages/pcr-core/src/tidas-inspection.mjs +177 -0
  572. package/packages/pcr-core/src/yaml-lite.mjs +261 -0
  573. package/packages/tiangong-pcr-cli/bin/tiangong-pcr.mjs +12 -0
  574. package/packages/tiangong-pcr-cli/src/commands.mjs +1691 -0
  575. package/skills/tiangong-pcr/SKILL.md +90 -0
  576. package/skills/tiangong-pcr/references/cli-usage.md +66 -0
  577. package/skills/tiangong-pcr/references/feedback-loop.md +16 -0
  578. package/skills/tiangong-pcr/references/lca-authoring.md +30 -0
  579. package/skills/tiangong-pcr/references/model-authoring-loop.md +6 -0
  580. package/skills/tiangong-pcr/references/reviewing-tidas.md +71 -0
  581. package/skills/tiangong-pcr/references/tidas-authoring.md +45 -0
@@ -0,0 +1,949 @@
1
+ import {
2
+ closeSync,
3
+ constants as fsConstants,
4
+ fstatSync,
5
+ lstatSync,
6
+ openSync,
7
+ readFileSync,
8
+ readdirSync,
9
+ realpathSync,
10
+ } from "node:fs";
11
+ import { createHash } from "node:crypto";
12
+ import path from "node:path";
13
+ import { TextDecoder } from "node:util";
14
+
15
+ import { assertCoreContract } from "./contracts.mjs";
16
+ import {
17
+ CONTENT_MATURITY_VALUES,
18
+ PCR_STATUS_VALUES,
19
+ } from "./generated/controlled-vocabulary.mjs";
20
+ import { parseYaml } from "./yaml-lite.mjs";
21
+
22
+ export const PCR_ID_ALIAS_DIRECTORY = "classifications/aliases";
23
+ export const PCR_ID_ALIAS_REGISTRY_PATH =
24
+ `${PCR_ID_ALIAS_DIRECTORY}/pcr-id-aliases.yaml`;
25
+
26
+ const PCR_ROOT = "library/pcrs";
27
+ const CATALOG_PATH = "library/catalog.yaml";
28
+ const PCR_ID_PATTERN = /^pcr\.[a-z0-9]+(?:[.-][a-z0-9]+)*$/u;
29
+ const ALIAS_FILE_PATTERN = /\.ya?ml$/u;
30
+ const EXACT_BYTE_SHA256_PATTERN = /^sha256:[0-9a-f]{64}$/u;
31
+ const PCR_STATUSES = new Set(PCR_STATUS_VALUES);
32
+ const CONTENT_MATURITIES = new Set(CONTENT_MATURITY_VALUES);
33
+ const MANAGED_READ_FLAGS =
34
+ fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK;
35
+ const FATAL_UTF8_DECODER = new TextDecoder("utf-8", { fatal: true });
36
+
37
+ export class PcrIdAliasRegistryError extends Error {
38
+ constructor({ source = PCR_ID_ALIAS_DIRECTORY, issues }) {
39
+ super(`PCR id alias registry is inconsistent at ${source}: ${issues.join("; ")}`);
40
+ this.name = "PcrIdAliasRegistryError";
41
+ this.code = "PCR_INVALID_PCR_ID_ALIASES";
42
+ this.details = {
43
+ source,
44
+ issues: [...issues],
45
+ };
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Read the deterministic, validated alias set. Once a repository has a
51
+ * catalog, that catalog must pin the exact registry bytes and entry count;
52
+ * a missing catalog and every missing or mismatched declaration fail closed.
53
+ * Generation and migration tooling must opt into standalone validation
54
+ * explicitly with verifyCatalogBinding=false.
55
+ */
56
+ export function readPcrIdAliases({ root, verifyCatalogBinding = true }) {
57
+ const normalizedRoot = path.resolve(root);
58
+ const binding = verifyCatalogBinding
59
+ ? readCatalogAliasBinding(normalizedRoot)
60
+ : { mode: "standalone" };
61
+ const registryPaths = binding.mode === "declared"
62
+ ? declaredAliasRegistryPaths(normalizedRoot, binding)
63
+ : aliasRegistryPaths(normalizedRoot);
64
+ const records = [];
65
+ const registrySources = new Map();
66
+
67
+ for (const registryPath of registryPaths) {
68
+ let document;
69
+ try {
70
+ const source = readContainedUtf8RegularFile({
71
+ root: normalizedRoot,
72
+ relativePath: registryPath,
73
+ label: "PCR id alias registry",
74
+ });
75
+ registrySources.set(registryPath, source);
76
+ document = parseYaml(source.text);
77
+ } catch (error) {
78
+ throw invalidAliases(registryPath, error);
79
+ }
80
+
81
+ assertCoreContract("pcr-id-aliases.schema.json", document, {
82
+ code: "PCR_INVALID_PCR_ID_ALIASES",
83
+ entityKind: "PCR id alias registry",
84
+ source: registryPath,
85
+ });
86
+ for (const [index, alias] of document.aliases.entries()) {
87
+ records.push({
88
+ alias,
89
+ index,
90
+ registryPath,
91
+ });
92
+ }
93
+ }
94
+
95
+ if (binding.mode === "declared") {
96
+ const source = registrySources.get(binding.path);
97
+ const actualHash = exactByteSha256(source.bytes);
98
+ if (actualHash !== binding.sha256) {
99
+ throw new PcrIdAliasRegistryError({
100
+ source: CATALOG_PATH,
101
+ issues: [
102
+ `declared PCR id alias exact-byte SHA-256 mismatch for ${binding.path}: expected ${binding.sha256}, found ${actualHash}`,
103
+ ],
104
+ });
105
+ }
106
+ if (records.length !== binding.entryCount) {
107
+ throw new PcrIdAliasRegistryError({
108
+ source: CATALOG_PATH,
109
+ issues: [
110
+ `declared PCR id alias entry_count mismatch for ${binding.path}: expected ${binding.entryCount}, found ${records.length}`,
111
+ ],
112
+ });
113
+ }
114
+ }
115
+
116
+ assertAliasSemantics({ root: normalizedRoot, records });
117
+ return records
118
+ .map(({ alias }) => structuredClone(alias))
119
+ .sort((left, right) => compareText(left.source_pcr_id, right.source_pcr_id));
120
+ }
121
+
122
+ /**
123
+ * Conservative file inventory for every source consulted while validating a
124
+ * non-empty alias registry. Consumers use this to bind a validated alias set
125
+ * to its decision evidence, normalized-leaf evidence, and manifest identity
126
+ * inventory without accepting caller-provided aliases as authoritative.
127
+ */
128
+ export function pcrIdAliasValidationDependencies({ root }) {
129
+ const normalizedRoot = path.resolve(root);
130
+ const document = readAliasRegistryDocument(normalizedRoot);
131
+ const aliases = Array.isArray(document?.aliases) ? document.aliases : [];
132
+ const dependencies = new Set(aliasRegistryPaths(normalizedRoot));
133
+ if (aliases.length === 0) {
134
+ return [...dependencies].sort(compareText);
135
+ }
136
+ for (const alias of aliases) {
137
+ if (typeof alias?.decision_ref === "string") {
138
+ dependencies.add(alias.decision_ref.split("#", 1)[0]);
139
+ }
140
+ const target = alias?.target;
141
+ if (
142
+ target?.kind === "classification_coverage" &&
143
+ typeof target.classification_system === "string" &&
144
+ typeof target.classification_version === "string"
145
+ ) {
146
+ dependencies.add(
147
+ `classifications/systems/${target.classification_system}/${target.classification_version}/normalized/leaves.json`,
148
+ );
149
+ }
150
+ }
151
+ for (const record of readCanonicalManifestInventory(normalizedRoot)) {
152
+ dependencies.add(record.relativePath);
153
+ }
154
+ return [...dependencies].sort(compareText);
155
+ }
156
+
157
+ /**
158
+ * Return the exact directory-entry state of each alias source path. An absent
159
+ * legacy leaf is valid during physical migration, but it is not equivalent to
160
+ * an empty directory, a regular file, or a symbolic-link substitution.
161
+ */
162
+ export function pcrIdAliasSourcePcrPathStates({ root }) {
163
+ const normalizedRoot = path.resolve(root);
164
+ const document = readAliasRegistryDocument(normalizedRoot);
165
+ const aliases = Array.isArray(document?.aliases) ? document.aliases : [];
166
+ return aliases
167
+ .map((alias) => ({
168
+ path: String(alias?.source_pcr_path ?? ""),
169
+ state: aliasSourcePcrPathState({
170
+ root: normalizedRoot,
171
+ relativePath: String(alias?.source_pcr_path ?? ""),
172
+ }),
173
+ }))
174
+ .sort((left, right) => compareText(left.path, right.path));
175
+ }
176
+
177
+ function readAliasRegistryDocument(root) {
178
+ try {
179
+ return parseYaml(readContainedUtf8RegularFile({
180
+ root,
181
+ relativePath: PCR_ID_ALIAS_REGISTRY_PATH,
182
+ label: "PCR id alias registry",
183
+ }).text);
184
+ } catch (error) {
185
+ throw invalidAliases(PCR_ID_ALIAS_REGISTRY_PATH, error);
186
+ }
187
+ }
188
+
189
+ function aliasSourcePcrPathState({ root, relativePath }) {
190
+ try {
191
+ assertSafeRelativePath(relativePath, "alias source PCR path");
192
+ const segments = relativePath.split("/");
193
+ let currentPath = root;
194
+ for (const [index, segment] of segments.entries()) {
195
+ currentPath = path.join(currentPath, segment);
196
+ let stats;
197
+ try {
198
+ stats = lstatSync(currentPath);
199
+ } catch (error) {
200
+ if (error?.code === "ENOENT") {
201
+ return "absent";
202
+ }
203
+ return `unreadable:${error?.code ?? "unknown"}`;
204
+ }
205
+ if (stats.isSymbolicLink()) {
206
+ return "symbolic_link";
207
+ }
208
+ const isLast = index === segments.length - 1;
209
+ if (!isLast && !stats.isDirectory()) {
210
+ return "parent_not_directory";
211
+ }
212
+ if (isLast) {
213
+ return stats.isDirectory()
214
+ ? "directory"
215
+ : stats.isFile()
216
+ ? "regular_file"
217
+ : "other";
218
+ }
219
+ }
220
+ } catch {
221
+ return "invalid_path";
222
+ }
223
+ return "invalid_path";
224
+ }
225
+
226
+ function readCatalogAliasBinding(root) {
227
+ if (!containedRegularFileExists({
228
+ root,
229
+ relativePath: CATALOG_PATH,
230
+ label: "PCR catalog",
231
+ })) {
232
+ throw new PcrIdAliasRegistryError({
233
+ source: CATALOG_PATH,
234
+ issues: ["PCR catalog is required to bind the alias registry"],
235
+ });
236
+ }
237
+
238
+ let catalog;
239
+ try {
240
+ const source = readContainedUtf8RegularFile({
241
+ root,
242
+ relativePath: CATALOG_PATH,
243
+ label: "PCR catalog",
244
+ });
245
+ catalog = parseYaml(source.text);
246
+ } catch (error) {
247
+ throw invalidAliases(CATALOG_PATH, error);
248
+ }
249
+
250
+ if (
251
+ !catalog
252
+ || typeof catalog !== "object"
253
+ || Array.isArray(catalog)
254
+ ) {
255
+ throw new PcrIdAliasRegistryError({
256
+ source: CATALOG_PATH,
257
+ issues: ["PCR catalog must be an object"],
258
+ });
259
+ }
260
+ if (!Object.hasOwn(catalog, "pcr_id_aliases")) {
261
+ throw new PcrIdAliasRegistryError({
262
+ source: CATALOG_PATH,
263
+ issues: ["PCR catalog must declare an exact-byte pcr_id_aliases binding"],
264
+ });
265
+ }
266
+
267
+ const descriptor = catalog.pcr_id_aliases;
268
+ const issues = [];
269
+ if (!descriptor || typeof descriptor !== "object" || Array.isArray(descriptor)) {
270
+ issues.push(
271
+ "pcr_id_aliases must be an exact-byte binding object; rebuild the catalog",
272
+ );
273
+ } else {
274
+ const allowedKeys = new Set(["path", "hash_mode", "sha256", "entry_count"]);
275
+ const unknownKeys = Object.keys(descriptor).filter((key) => !allowedKeys.has(key));
276
+ if (unknownKeys.length > 0) {
277
+ issues.push(`pcr_id_aliases has unsupported fields: ${unknownKeys.sort(compareText).join(", ")}`);
278
+ }
279
+ if (descriptor.path !== PCR_ID_ALIAS_REGISTRY_PATH) {
280
+ issues.push(
281
+ `pcr_id_aliases.path must be ${PCR_ID_ALIAS_REGISTRY_PATH}`,
282
+ );
283
+ }
284
+ if (descriptor.hash_mode !== "exact_bytes") {
285
+ issues.push("pcr_id_aliases.hash_mode must be exact_bytes");
286
+ }
287
+ if (!EXACT_BYTE_SHA256_PATTERN.test(String(descriptor.sha256 ?? ""))) {
288
+ issues.push("pcr_id_aliases.sha256 must be a lowercase sha256:<64-hex> digest");
289
+ }
290
+ if (!Number.isSafeInteger(descriptor.entry_count) || descriptor.entry_count < 0) {
291
+ issues.push("pcr_id_aliases.entry_count must be a non-negative safe integer");
292
+ }
293
+ }
294
+ if (issues.length > 0) {
295
+ throw new PcrIdAliasRegistryError({ source: CATALOG_PATH, issues });
296
+ }
297
+ return {
298
+ mode: "declared",
299
+ path: descriptor.path,
300
+ sha256: descriptor.sha256,
301
+ entryCount: descriptor.entry_count,
302
+ };
303
+ }
304
+
305
+ function declaredAliasRegistryPaths(root, binding) {
306
+ const paths = aliasRegistryPaths(root);
307
+ if (!paths.includes(binding.path)) {
308
+ throw new PcrIdAliasRegistryError({
309
+ source: CATALOG_PATH,
310
+ issues: [`declared PCR id alias registry is missing: ${binding.path}`],
311
+ });
312
+ }
313
+ const unexpected = paths.filter((registryPath) => registryPath !== binding.path);
314
+ if (unexpected.length > 0) {
315
+ throw new PcrIdAliasRegistryError({
316
+ source: CATALOG_PATH,
317
+ issues: [
318
+ `unbound PCR id alias registries are not allowed: ${unexpected.join(", ")}`,
319
+ ],
320
+ });
321
+ }
322
+ return [binding.path];
323
+ }
324
+
325
+ /**
326
+ * Exact old-id lookup. The alias is returned even while its physical legacy
327
+ * scaffold still exists; consumers can therefore switch to redirect-first
328
+ * behavior before deleting the old directory.
329
+ */
330
+ export function findPcrIdAlias({ root, pcrId, context = null }) {
331
+ const normalizedPcrId = String(pcrId);
332
+ if (!PCR_ID_PATTERN.test(normalizedPcrId)) {
333
+ throw new PcrIdAliasRegistryError({
334
+ issues: [`invalid PCR id lookup token ${normalizedPcrId}`],
335
+ });
336
+ }
337
+ if (context) {
338
+ return context.findPcrIdAlias(normalizedPcrId, { root });
339
+ }
340
+ return readPcrIdAliases({ root }).find(
341
+ (alias) => alias.source_pcr_id === normalizedPcrId,
342
+ ) ?? null;
343
+ }
344
+
345
+ function aliasRegistryPaths(root) {
346
+ const directoryPath = path.join(root, ...PCR_ID_ALIAS_DIRECTORY.split("/"));
347
+ let before;
348
+ let names;
349
+ try {
350
+ try {
351
+ lstatSync(directoryPath);
352
+ } catch (error) {
353
+ if (error?.code === "ENOENT") {
354
+ return [];
355
+ }
356
+ throw error;
357
+ }
358
+ before = assertCanonicalDirectory({
359
+ root,
360
+ relativePath: PCR_ID_ALIAS_DIRECTORY,
361
+ label: "PCR id alias directory",
362
+ });
363
+ names = readdirSync(directoryPath).sort(compareText);
364
+ const after = lstatSync(directoryPath);
365
+ if (!after.isDirectory() || !sameFileIdentity(before, after)) {
366
+ throw new Error("PCR id alias directory changed while it was being listed");
367
+ }
368
+ } catch (error) {
369
+ throw invalidAliases(PCR_ID_ALIAS_DIRECTORY, error);
370
+ }
371
+
372
+ return names
373
+ .filter((name) => ALIAS_FILE_PATTERN.test(name))
374
+ .map((name) => `${PCR_ID_ALIAS_DIRECTORY}/${name}`);
375
+ }
376
+
377
+ function assertAliasSemantics({ root, records }) {
378
+ if (records.length === 0) {
379
+ return;
380
+ }
381
+ const issues = [];
382
+ const recordsBySource = new Map();
383
+ for (const record of records) {
384
+ const sourceId = record.alias.source_pcr_id;
385
+ const existing = recordsBySource.get(sourceId);
386
+ if (existing) {
387
+ issues.push(
388
+ `duplicate alias source ${sourceId} in ${existing.registryPath} and ${record.registryPath}`,
389
+ );
390
+ continue;
391
+ }
392
+ recordsBySource.set(sourceId, record);
393
+
394
+ const expectedId = pcrIdForSourcePath(record.alias.source_pcr_path);
395
+ if (expectedId !== sourceId) {
396
+ issues.push(
397
+ `alias source ${sourceId} does not match source_pcr_path ${record.alias.source_pcr_path}; expected ${expectedId}`,
398
+ );
399
+ }
400
+ }
401
+
402
+ const sources = new Set(recordsBySource.keys());
403
+ assertTerminalAliasGraph({ recordsBySource, sources, issues });
404
+ assertDecisionReferences({ root, records, issues });
405
+ assertClassificationTargets({ root, records, issues });
406
+
407
+ let manifests = [];
408
+ try {
409
+ manifests = readCanonicalManifestInventory(root);
410
+ } catch (error) {
411
+ issues.push(error instanceof Error ? error.message : String(error));
412
+ }
413
+ assertPcrTargetsAndSources({ root, records, sources, manifests, issues });
414
+
415
+ if (issues.length > 0) {
416
+ throw new PcrIdAliasRegistryError({
417
+ issues: uniqueSorted(issues),
418
+ });
419
+ }
420
+ }
421
+
422
+ function assertTerminalAliasGraph({ recordsBySource, sources, issues }) {
423
+ const canonicalEdges = new Map();
424
+ for (const [sourceId, record] of recordsBySource) {
425
+ if (record.alias.target.kind !== "canonical_pcr") {
426
+ continue;
427
+ }
428
+ const targetId = record.alias.target.pcr_id;
429
+ if (sourceId === targetId) {
430
+ issues.push(`alias source ${sourceId} cannot redirect to itself`);
431
+ continue;
432
+ }
433
+ canonicalEdges.set(sourceId, targetId);
434
+ }
435
+
436
+ const cycleMembers = aliasCycleMembers(canonicalEdges);
437
+ if (cycleMembers.size > 0) {
438
+ issues.push(`alias cycle detected among ${[...cycleMembers].sort(compareText).join(", ")}`);
439
+ }
440
+ for (const [sourceId, targetId] of canonicalEdges) {
441
+ if (sources.has(targetId) && !cycleMembers.has(sourceId) && !cycleMembers.has(targetId)) {
442
+ issues.push(
443
+ `alias chain is not allowed: ${sourceId} targets alias source ${targetId}`,
444
+ );
445
+ }
446
+ }
447
+ }
448
+
449
+ function aliasCycleMembers(edges) {
450
+ const cycleMembers = new Set();
451
+ const completed = new Set();
452
+ for (const start of edges.keys()) {
453
+ if (completed.has(start)) {
454
+ continue;
455
+ }
456
+ const pathIds = [];
457
+ const pathIndex = new Map();
458
+ let current = start;
459
+ while (edges.has(current) && !completed.has(current)) {
460
+ if (pathIndex.has(current)) {
461
+ for (const member of pathIds.slice(pathIndex.get(current))) {
462
+ cycleMembers.add(member);
463
+ }
464
+ break;
465
+ }
466
+ pathIndex.set(current, pathIds.length);
467
+ pathIds.push(current);
468
+ current = edges.get(current);
469
+ }
470
+ for (const member of pathIds) {
471
+ completed.add(member);
472
+ }
473
+ }
474
+ return cycleMembers;
475
+ }
476
+
477
+ function assertDecisionReferences({ root, records, issues }) {
478
+ const checked = new Map();
479
+ for (const { alias } of records) {
480
+ const decisionPath = alias.decision_ref.split("#", 1)[0];
481
+ if (!checked.has(decisionPath)) {
482
+ try {
483
+ readContainedUtf8RegularFile({
484
+ root,
485
+ relativePath: decisionPath,
486
+ label: "alias decision reference",
487
+ });
488
+ checked.set(decisionPath, null);
489
+ } catch (error) {
490
+ checked.set(decisionPath, error instanceof Error ? error.message : String(error));
491
+ }
492
+ }
493
+ const problem = checked.get(decisionPath);
494
+ if (problem) {
495
+ issues.push(`alias source ${alias.source_pcr_id} has invalid decision_ref: ${problem}`);
496
+ }
497
+ }
498
+ }
499
+
500
+ function assertClassificationTargets({ root, records, issues }) {
501
+ const inventories = new Map();
502
+ for (const { alias } of records) {
503
+ if (alias.target.kind !== "classification_coverage") {
504
+ continue;
505
+ }
506
+ const target = alias.target;
507
+ const coordinate = `${target.classification_system}:${target.classification_version}`;
508
+ if (!inventories.has(coordinate)) {
509
+ inventories.set(
510
+ coordinate,
511
+ readNormalizedLeafInventory({ root, target }),
512
+ );
513
+ }
514
+ const inventory = inventories.get(coordinate);
515
+ if (inventory.error) {
516
+ issues.push(
517
+ `alias source ${alias.source_pcr_id} has invalid classification target ${coordinate}:${target.code}: ${inventory.error}`,
518
+ );
519
+ continue;
520
+ }
521
+ const matches = inventory.codes.get(String(target.code)) ?? 0;
522
+ if (matches !== 1) {
523
+ issues.push(
524
+ `alias source ${alias.source_pcr_id} classification target ${coordinate}:${target.code} occurs ${matches} times in normalized leaves`,
525
+ );
526
+ }
527
+ }
528
+ }
529
+
530
+ function readNormalizedLeafInventory({ root, target }) {
531
+ const relativePath =
532
+ `classifications/systems/${target.classification_system}/${target.classification_version}` +
533
+ "/normalized/leaves.json";
534
+ try {
535
+ const source = readContainedUtf8RegularFile({
536
+ root,
537
+ relativePath,
538
+ label: "normalized classification leaves",
539
+ });
540
+ const document = JSON.parse(source.text);
541
+ if (
542
+ String(document.classification_system).toLowerCase() !== target.classification_system
543
+ || String(document.classification_version) !== target.classification_version
544
+ || !Array.isArray(document.leaves)
545
+ ) {
546
+ return { error: `${relativePath} has an invalid classification coordinate or leaves inventory` };
547
+ }
548
+ const codes = new Map();
549
+ for (const leaf of document.leaves) {
550
+ const code = String(leaf?.code ?? "");
551
+ if (code.length > 0) {
552
+ codes.set(code, (codes.get(code) ?? 0) + 1);
553
+ }
554
+ }
555
+ return { codes, error: null };
556
+ } catch (error) {
557
+ return { error: error instanceof Error ? error.message : String(error) };
558
+ }
559
+ }
560
+
561
+ function assertPcrTargetsAndSources({ root, records, sources, manifests, issues }) {
562
+ const manifestsById = groupBy(manifests, (record) => String(record.manifest.id ?? ""));
563
+ const manifestsByDirectory = groupBy(manifests, (record) => record.directory);
564
+
565
+ for (const { alias } of records) {
566
+ const sourceDirectoryState = inspectContainedDirectory({
567
+ root,
568
+ relativePath: alias.source_pcr_path,
569
+ label: `alias source ${alias.source_pcr_id}`,
570
+ });
571
+ if (sourceDirectoryState.error) {
572
+ issues.push(sourceDirectoryState.error);
573
+ } else if (sourceDirectoryState.exists) {
574
+ const sourceRecords = manifestsByDirectory.get(alias.source_pcr_path) ?? [];
575
+ if (sourceRecords.length !== 1) {
576
+ issues.push(
577
+ `alias source path ${alias.source_pcr_path} must contain exactly one canonical manifest while it exists`,
578
+ );
579
+ } else {
580
+ const sourceRecord = sourceRecords[0];
581
+ if (sourceRecord.manifest.id !== alias.source_pcr_id) {
582
+ issues.push(
583
+ `alias source path ${alias.source_pcr_path} contains manifest id ${String(sourceRecord.manifest.id)} instead of ${alias.source_pcr_id}`,
584
+ );
585
+ }
586
+ const sourceKind = classifyManifest(sourceRecord.manifest);
587
+ if (sourceKind === "material") {
588
+ issues.push(
589
+ `alias source ${alias.source_pcr_id} collides with a material PCR at ${alias.source_pcr_path}`,
590
+ );
591
+ } else if (sourceKind !== "legacy") {
592
+ issues.push(
593
+ `alias source ${alias.source_pcr_id} has invalid lifecycle identity at ${alias.source_pcr_path}`,
594
+ );
595
+ }
596
+ }
597
+ }
598
+
599
+ const sourceRecords = manifestsById.get(alias.source_pcr_id) ?? [];
600
+ for (const sourceRecord of sourceRecords) {
601
+ if (sourceRecord.directory !== alias.source_pcr_path) {
602
+ issues.push(
603
+ `alias source ${alias.source_pcr_id} exists at unexpected path ${sourceRecord.directory}; declared ${alias.source_pcr_path}`,
604
+ );
605
+ }
606
+ }
607
+ if (sourceRecords.some((record) => classifyManifest(record.manifest) === "material")) {
608
+ issues.push(`alias source ${alias.source_pcr_id} collides with a material PCR identity`);
609
+ }
610
+
611
+ if (alias.target.kind !== "canonical_pcr") {
612
+ continue;
613
+ }
614
+ const targetId = alias.target.pcr_id;
615
+ if (sources.has(targetId)) {
616
+ // The graph validator reports self, chain, or cycle with more useful context.
617
+ continue;
618
+ }
619
+ const targets = manifestsById.get(targetId) ?? [];
620
+ if (targets.length !== 1) {
621
+ issues.push(
622
+ `canonical alias target ${targetId} must resolve to exactly one PCR manifest; found ${targets.length}`,
623
+ );
624
+ continue;
625
+ }
626
+ if (classifyManifest(targets[0].manifest) !== "material") {
627
+ issues.push(`canonical alias target ${targetId} is not a material PCR`);
628
+ }
629
+ }
630
+ }
631
+
632
+ function readCanonicalManifestInventory(root) {
633
+ const pcrRoot = path.join(root, ...PCR_ROOT.split("/"));
634
+ try {
635
+ lstatSync(pcrRoot);
636
+ } catch (error) {
637
+ if (error?.code === "ENOENT") {
638
+ return [];
639
+ }
640
+ throw error;
641
+ }
642
+ assertCanonicalDirectory({ root, relativePath: PCR_ROOT, label: "PCR catalog root" });
643
+ const manifestPaths = [];
644
+ collectManifestPaths({ root, relativeDirectory: PCR_ROOT, manifestPaths });
645
+ return manifestPaths.map((relativePath) => {
646
+ const source = readContainedUtf8RegularFile({
647
+ root,
648
+ relativePath,
649
+ label: "PCR manifest",
650
+ });
651
+ return {
652
+ directory: path.posix.dirname(relativePath),
653
+ relativePath,
654
+ manifest: parseYaml(source.text),
655
+ };
656
+ });
657
+ }
658
+
659
+ function collectManifestPaths({ root, relativeDirectory, manifestPaths }) {
660
+ const directoryPath = path.join(root, ...relativeDirectory.split("/"));
661
+ const before = assertCanonicalDirectory({
662
+ root,
663
+ relativePath: relativeDirectory,
664
+ label: "PCR directory",
665
+ });
666
+ const entries = readdirSync(directoryPath).sort(compareText);
667
+ const after = lstatSync(directoryPath);
668
+ if (!after.isDirectory() || !sameFileIdentity(before, after)) {
669
+ throw new Error(`PCR directory changed while it was being listed: ${relativeDirectory}`);
670
+ }
671
+ for (const entry of entries) {
672
+ const relativePath = `${relativeDirectory}/${entry}`;
673
+ const filePath = path.join(root, ...relativePath.split("/"));
674
+ const stats = lstatSync(filePath);
675
+ if (stats.isSymbolicLink()) {
676
+ throw new Error(`PCR catalog path contains a symbolic link: ${relativePath}`);
677
+ }
678
+ if (stats.isDirectory()) {
679
+ collectManifestPaths({ root, relativeDirectory: relativePath, manifestPaths });
680
+ } else if (stats.isFile() && entry === "manifest.yaml") {
681
+ manifestPaths.push(relativePath);
682
+ }
683
+ }
684
+ }
685
+
686
+ function inspectContainedDirectory({ root, relativePath, label }) {
687
+ try {
688
+ assertSafeRelativePath(relativePath, label);
689
+ const segments = relativePath.split("/");
690
+ let current = root;
691
+ for (const [index, segment] of segments.entries()) {
692
+ current = path.join(current, segment);
693
+ let stats;
694
+ try {
695
+ stats = lstatSync(current);
696
+ } catch (error) {
697
+ if (error?.code === "ENOENT") {
698
+ return { exists: false, error: null };
699
+ }
700
+ throw error;
701
+ }
702
+ if (stats.isSymbolicLink()) {
703
+ return { exists: false, error: `${label} path contains a symbolic link: ${relativePath}` };
704
+ }
705
+ if (!stats.isDirectory()) {
706
+ return {
707
+ exists: false,
708
+ error: `${label} path component is not a directory: ${segments.slice(0, index + 1).join("/")}`,
709
+ };
710
+ }
711
+ }
712
+ return { exists: true, error: null };
713
+ } catch (error) {
714
+ return { exists: false, error: error instanceof Error ? error.message : String(error) };
715
+ }
716
+ }
717
+
718
+ function assertCanonicalDirectory({ root, relativePath, label }) {
719
+ assertSafeRelativePath(relativePath, label);
720
+ const segments = relativePath.split("/");
721
+ let current = root;
722
+ let finalStats;
723
+ for (const segment of segments) {
724
+ current = path.join(current, segment);
725
+ const stats = lstatSync(current);
726
+ if (stats.isSymbolicLink()) {
727
+ throw new Error(`${label} path contains a symbolic link: ${relativePath}`);
728
+ }
729
+ if (!stats.isDirectory()) {
730
+ throw new Error(`${label} is not a canonical directory: ${relativePath}`);
731
+ }
732
+ finalStats = stats;
733
+ }
734
+ return finalStats;
735
+ }
736
+
737
+ function containedRegularFileExists({ root, relativePath, label }) {
738
+ assertSafeRelativePath(relativePath, label);
739
+ const segments = relativePath.split("/");
740
+ let currentPath = root;
741
+ for (const [index, segment] of segments.entries()) {
742
+ currentPath = path.join(currentPath, segment);
743
+ let stats;
744
+ try {
745
+ stats = lstatSync(currentPath);
746
+ } catch (error) {
747
+ if (error?.code === "ENOENT") {
748
+ return false;
749
+ }
750
+ throw invalidAliases(relativePath, error);
751
+ }
752
+ if (stats.isSymbolicLink()) {
753
+ throw new PcrIdAliasRegistryError({
754
+ source: relativePath,
755
+ issues: [`${label} path contains a symbolic link: ${relativePath}`],
756
+ });
757
+ }
758
+ const isLast = index === segments.length - 1;
759
+ if ((!isLast && !stats.isDirectory()) || (isLast && !stats.isFile())) {
760
+ throw new PcrIdAliasRegistryError({
761
+ source: relativePath,
762
+ issues: [
763
+ isLast
764
+ ? `${label} is not a regular file: ${relativePath}`
765
+ : `${label} parent is not a directory: ${relativePath}`,
766
+ ],
767
+ });
768
+ }
769
+ }
770
+ return true;
771
+ }
772
+
773
+ function readContainedUtf8RegularFile({ root, relativePath, label }) {
774
+ assertSafeRelativePath(relativePath, label);
775
+ const resolvedRoot = path.resolve(root);
776
+ const containedRelativePath = relativePath.split("/").join(path.sep);
777
+ const resolvedPath = path.resolve(resolvedRoot, containedRelativePath);
778
+ assertRegularPathChain({
779
+ root: resolvedRoot,
780
+ containedRelativePath,
781
+ relativePath,
782
+ label,
783
+ });
784
+
785
+ let descriptor;
786
+ let bytes;
787
+ try {
788
+ descriptor = openSync(resolvedPath, MANAGED_READ_FLAGS);
789
+ const openedStats = fstatSync(descriptor);
790
+ if (!openedStats.isFile()) {
791
+ throw new Error(`${label} is not a regular file: ${relativePath}`);
792
+ }
793
+ const currentStats = assertRegularPathChain({
794
+ root: resolvedRoot,
795
+ containedRelativePath,
796
+ relativePath,
797
+ label,
798
+ });
799
+ assertRealPathContained({
800
+ root: resolvedRoot,
801
+ candidate: resolvedPath,
802
+ label,
803
+ relativePath,
804
+ });
805
+ if (!sameFileIdentity(openedStats, currentStats)) {
806
+ throw new Error(`${label} path changed while it was being opened: ${relativePath}`);
807
+ }
808
+ bytes = readFileSync(descriptor);
809
+ } catch (error) {
810
+ if (error instanceof Error && error.message.startsWith(`${label} `)) {
811
+ throw error;
812
+ }
813
+ throw new Error(
814
+ `${label} could not be opened without following symbolic links: ${relativePath} (${error instanceof Error ? error.code ?? error.message : String(error)})`,
815
+ );
816
+ } finally {
817
+ if (descriptor !== undefined) {
818
+ closeSync(descriptor);
819
+ }
820
+ }
821
+
822
+ try {
823
+ return {
824
+ bytes,
825
+ text: FATAL_UTF8_DECODER.decode(bytes),
826
+ };
827
+ } catch (error) {
828
+ throw new Error(
829
+ `${label} is not valid UTF-8: ${relativePath} (${error instanceof Error ? error.message : String(error)})`,
830
+ );
831
+ }
832
+ }
833
+
834
+ function assertRegularPathChain({ root, containedRelativePath, relativePath, label }) {
835
+ const segments = containedRelativePath.split(path.sep);
836
+ let currentPath = root;
837
+ let finalStats;
838
+ for (const [index, segment] of segments.entries()) {
839
+ currentPath = path.join(currentPath, segment);
840
+ let stats;
841
+ try {
842
+ stats = lstatSync(currentPath);
843
+ } catch (error) {
844
+ throw new Error(
845
+ `${label} does not exist at ${relativePath} (${error instanceof Error ? error.code ?? error.message : String(error)})`,
846
+ );
847
+ }
848
+ if (stats.isSymbolicLink()) {
849
+ throw new Error(`${label} path contains a symbolic link: ${relativePath}`);
850
+ }
851
+ const isLast = index === segments.length - 1;
852
+ if (isLast && !stats.isFile()) {
853
+ throw new Error(`${label} is not a regular file: ${relativePath}`);
854
+ }
855
+ if (!isLast && !stats.isDirectory()) {
856
+ throw new Error(`${label} parent is not a directory: ${relativePath}`);
857
+ }
858
+ if (isLast) {
859
+ finalStats = stats;
860
+ }
861
+ }
862
+ return finalStats;
863
+ }
864
+
865
+ function assertRealPathContained({ root, candidate, label, relativePath }) {
866
+ const realRoot = realpathSync(root);
867
+ const realCandidate = realpathSync(candidate);
868
+ const relative = path.relative(realRoot, realCandidate);
869
+ if (
870
+ relative.length === 0
871
+ || relative === ".."
872
+ || relative.startsWith(`..${path.sep}`)
873
+ || path.isAbsolute(relative)
874
+ ) {
875
+ throw new Error(`${label} real path escapes the repository root: ${relativePath}`);
876
+ }
877
+ }
878
+
879
+ function assertSafeRelativePath(relativePath, label) {
880
+ if (
881
+ typeof relativePath !== "string"
882
+ || relativePath.length === 0
883
+ || relativePath.includes("\\")
884
+ || relativePath.includes("\0")
885
+ || path.posix.isAbsolute(relativePath)
886
+ || path.posix.normalize(relativePath) !== relativePath
887
+ || relativePath === ".."
888
+ || relativePath.startsWith("../")
889
+ ) {
890
+ throw new Error(`${label} uses an unsafe repository-relative path: ${String(relativePath)}`);
891
+ }
892
+ }
893
+
894
+ function pcrIdForSourcePath(sourcePath) {
895
+ const segments = sourcePath.split("/");
896
+ return `pcr.${segments.slice(2).join(".")}`;
897
+ }
898
+
899
+ function classifyManifest(manifest) {
900
+ if (!PCR_STATUSES.has(manifest?.status) || !CONTENT_MATURITIES.has(manifest?.content_maturity)) {
901
+ return "invalid";
902
+ }
903
+ if (manifest?.status === "scaffold" && manifest?.content_maturity === "empty_scaffold") {
904
+ return "legacy";
905
+ }
906
+ if (manifest?.status !== "scaffold" && manifest?.content_maturity !== "empty_scaffold") {
907
+ return "material";
908
+ }
909
+ return "invalid";
910
+ }
911
+
912
+ function groupBy(values, keyFor) {
913
+ const groups = new Map();
914
+ for (const value of values) {
915
+ const key = keyFor(value);
916
+ const group = groups.get(key) ?? [];
917
+ group.push(value);
918
+ groups.set(key, group);
919
+ }
920
+ return groups;
921
+ }
922
+
923
+ function invalidAliases(source, error) {
924
+ if (error?.code === "PCR_INVALID_PCR_ID_ALIASES") {
925
+ return error;
926
+ }
927
+ return new PcrIdAliasRegistryError({
928
+ source,
929
+ issues: [error instanceof Error ? error.message : String(error)],
930
+ });
931
+ }
932
+
933
+ function sameFileIdentity(left, right) {
934
+ return left?.dev === right?.dev && left?.ino === right?.ino;
935
+ }
936
+
937
+ function exactByteSha256(bytes) {
938
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
939
+ }
940
+
941
+ function uniqueSorted(values) {
942
+ return [...new Set(values)].sort(compareText);
943
+ }
944
+
945
+ function compareText(left, right) {
946
+ const normalizedLeft = String(left);
947
+ const normalizedRight = String(right);
948
+ return normalizedLeft < normalizedRight ? -1 : normalizedLeft > normalizedRight ? 1 : 0;
949
+ }