project-tiny-context-harness 0.8.17 → 0.11.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 (488) hide show
  1. package/README.md +93 -30
  2. package/assets/README.md +158 -44
  3. package/assets/README.zh-CN.md +88 -29
  4. package/assets/agents/AGENTS_CORE.md +2 -2
  5. package/assets/context_templates/context.toml +6 -1
  6. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_helpers.cs +301 -0
  7. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_run.cs +197 -0
  8. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_types.cs +215 -0
  9. package/assets/runtime/windows-job-supervisor/windows_job_process_supervisor.ps1 +117 -0
  10. package/assets/skills/design-resource-authoring/SKILL.md +6 -3
  11. package/assets/skills/design-resource-authoring/references/authority-delta-assessment.md +52 -0
  12. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +5 -1
  13. package/assets/skills/design-system-authoring/SKILL.md +23 -17
  14. package/assets/skills/design-system-authoring/references/authority-adoption.md +19 -9
  15. package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +4 -0
  16. package/assets/skills/long-task-workflow/SKILL.md +6 -6
  17. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +10 -4
  18. package/assets/skills/long-task-workflow/references/contract-authoring.md +5 -5
  19. package/assets/skills/long-task-workflow/references/evidence-design.md +14 -3
  20. package/assets/skills/long-task-workflow/references/source-authoring.md +11 -8
  21. package/assets/tools/context_rules.json +53 -0
  22. package/assets/tools/validate_context.py +302 -77
  23. package/dist/cli.js +2 -1
  24. package/dist/commands/context-create.d.ts +1 -0
  25. package/dist/commands/context-create.js +90 -0
  26. package/dist/commands/context-inspect.d.ts +1 -0
  27. package/dist/commands/context-inspect.js +98 -0
  28. package/dist/commands/context-move.d.ts +1 -0
  29. package/dist/commands/context-move.js +78 -0
  30. package/dist/commands/context-register.d.ts +1 -0
  31. package/dist/commands/context-register.js +110 -0
  32. package/dist/commands/context-transaction.d.ts +1 -0
  33. package/dist/commands/context-transaction.js +84 -0
  34. package/dist/commands/context.d.ts +1 -0
  35. package/dist/commands/context.js +36 -0
  36. package/dist/commands/design-authority-delta.d.ts +1 -0
  37. package/dist/commands/design-authority-delta.js +53 -0
  38. package/dist/commands/design-authority.d.ts +1 -0
  39. package/dist/commands/design-authority.js +104 -0
  40. package/dist/commands/design-resource.js +8 -1
  41. package/dist/commands/doctor.d.ts +1 -1
  42. package/dist/commands/doctor.js +61 -3
  43. package/dist/commands/index.js +19 -2
  44. package/dist/commands/long-task-authoring.js +20 -2
  45. package/dist/commands/long-task-workdir.d.ts +2 -0
  46. package/dist/commands/long-task-workdir.js +23 -0
  47. package/dist/commands/long-task.js +75 -6
  48. package/dist/commands/route.d.ts +15 -0
  49. package/dist/commands/route.js +142 -0
  50. package/dist/index.d.ts +3 -13
  51. package/dist/index.js +3 -12
  52. package/dist/lib/cli-exit.d.ts +14 -0
  53. package/dist/lib/cli-exit.js +19 -0
  54. package/dist/lib/context-catalog/catalog-default-footprint.d.ts +3 -0
  55. package/dist/lib/context-catalog/catalog-default-footprint.js +53 -0
  56. package/dist/lib/context-catalog/catalog-diagnostics.d.ts +9 -0
  57. package/dist/lib/context-catalog/catalog-diagnostics.js +34 -0
  58. package/dist/lib/context-catalog/catalog-discovery.d.ts +7 -0
  59. package/dist/lib/context-catalog/catalog-discovery.js +81 -0
  60. package/dist/lib/context-catalog/catalog-load.d.ts +8 -0
  61. package/dist/lib/context-catalog/catalog-load.js +187 -0
  62. package/dist/lib/context-catalog/catalog-path-validation.d.ts +7 -0
  63. package/dist/lib/context-catalog/catalog-path-validation.js +62 -0
  64. package/dist/lib/context-catalog/catalog-paths.d.ts +11 -0
  65. package/dist/lib/context-catalog/catalog-paths.js +41 -0
  66. package/dist/lib/context-catalog/catalog-portable-contract.d.ts +15 -0
  67. package/dist/lib/context-catalog/catalog-portable-contract.js +68 -0
  68. package/dist/lib/context-catalog/catalog-staged-path-safety.d.ts +1 -0
  69. package/dist/lib/context-catalog/catalog-staged-path-safety.js +36 -0
  70. package/dist/lib/context-catalog/catalog-types.d.ts +40 -0
  71. package/dist/lib/context-catalog/catalog-types.js +1 -0
  72. package/dist/lib/context-catalog/catalog-validation.d.ts +9 -0
  73. package/dist/lib/context-catalog/catalog-validation.js +148 -0
  74. package/dist/lib/context-create/context-create-path.d.ts +2 -0
  75. package/dist/lib/context-create/context-create-path.js +30 -0
  76. package/dist/lib/context-create/context-create-template.d.ts +2 -0
  77. package/dist/lib/context-create/context-create-template.js +95 -0
  78. package/dist/lib/context-create/context-create-types.d.ts +28 -0
  79. package/dist/lib/context-create/context-create-types.js +1 -0
  80. package/dist/lib/context-create/context-create-write.d.ts +1 -0
  81. package/dist/lib/context-create/context-create-write.js +85 -0
  82. package/dist/lib/context-create/context-create.d.ts +2 -0
  83. package/dist/lib/context-create/context-create.js +84 -0
  84. package/dist/lib/context-default-footprint.d.ts +2 -3
  85. package/dist/lib/context-default-footprint.js +49 -57
  86. package/dist/lib/context-doctor/context-doctor-types.d.ts +16 -0
  87. package/dist/lib/context-doctor/context-doctor-types.js +15 -0
  88. package/dist/lib/context-doctor/context-doctor.d.ts +2 -0
  89. package/dist/lib/context-doctor/context-doctor.js +130 -0
  90. package/dist/lib/context-graph-snapshot.d.ts +5 -0
  91. package/dist/lib/context-graph-snapshot.js +46 -25
  92. package/dist/lib/context-inspect/context-inspect-projection.d.ts +9 -0
  93. package/dist/lib/context-inspect/context-inspect-projection.js +49 -0
  94. package/dist/lib/context-inspect/context-inspect-render.d.ts +2 -0
  95. package/dist/lib/context-inspect/context-inspect-render.js +29 -0
  96. package/dist/lib/context-inspect/context-inspect-types.d.ts +43 -0
  97. package/dist/lib/context-inspect/context-inspect-types.js +1 -0
  98. package/dist/lib/context-inspect/context-inspect.d.ts +2 -0
  99. package/dist/lib/context-inspect/context-inspect.js +104 -0
  100. package/dist/lib/context-manifest-schema.d.ts +1 -1
  101. package/dist/lib/context-manifest-schema.js +4 -20
  102. package/dist/lib/context-markdown/context-markdown-analysis.d.ts +15 -0
  103. package/dist/lib/context-markdown/context-markdown-analysis.js +245 -0
  104. package/dist/lib/context-markdown/context-markdown-extract.d.ts +7 -0
  105. package/dist/lib/context-markdown/context-markdown-extract.js +114 -0
  106. package/dist/lib/context-markdown/context-markdown-types.d.ts +57 -0
  107. package/dist/lib/context-markdown/context-markdown-types.js +1 -0
  108. package/dist/lib/context-move/context-move-input.d.ts +8 -0
  109. package/dist/lib/context-move/context-move-input.js +17 -0
  110. package/dist/lib/context-move/context-move-literal-scan.d.ts +20 -0
  111. package/dist/lib/context-move/context-move-literal-scan.js +213 -0
  112. package/dist/lib/context-move/context-move-live-validation.d.ts +3 -0
  113. package/dist/lib/context-move/context-move-live-validation.js +56 -0
  114. package/dist/lib/context-move/context-move-markdown-plan.d.ts +22 -0
  115. package/dist/lib/context-move/context-move-markdown-plan.js +39 -0
  116. package/dist/lib/context-move/context-move-projection.d.ts +3 -0
  117. package/dist/lib/context-move/context-move-projection.js +11 -0
  118. package/dist/lib/context-move/context-move-reference-validation.d.ts +11 -0
  119. package/dist/lib/context-move/context-move-reference-validation.js +64 -0
  120. package/dist/lib/context-move/context-move-render.d.ts +2 -0
  121. package/dist/lib/context-move/context-move-render.js +24 -0
  122. package/dist/lib/context-move/context-move-support.d.ts +10 -0
  123. package/dist/lib/context-move/context-move-support.js +88 -0
  124. package/dist/lib/context-move/context-move-transaction-plan.d.ts +24 -0
  125. package/dist/lib/context-move/context-move-transaction-plan.js +108 -0
  126. package/dist/lib/context-move/context-move-types.d.ts +74 -0
  127. package/dist/lib/context-move/context-move-types.js +1 -0
  128. package/dist/lib/context-move/context-move.d.ts +8 -0
  129. package/dist/lib/context-move/context-move.js +180 -0
  130. package/dist/lib/context-mutation/manifest-lossless-patch.d.ts +28 -0
  131. package/dist/lib/context-mutation/manifest-lossless-patch.js +208 -0
  132. package/dist/lib/context-mutation/markdown-link-patch.d.ts +34 -0
  133. package/dist/lib/context-mutation/markdown-link-patch.js +143 -0
  134. package/dist/lib/context-mutation/markdown-link-spans.d.ts +10 -0
  135. package/dist/lib/context-mutation/markdown-link-spans.js +179 -0
  136. package/dist/lib/context-mutation/mutation-cas.d.ts +13 -0
  137. package/dist/lib/context-mutation/mutation-cas.js +365 -0
  138. package/dist/lib/context-mutation/mutation-command-support.d.ts +12 -0
  139. package/dist/lib/context-mutation/mutation-command-support.js +57 -0
  140. package/dist/lib/context-mutation/mutation-commit.d.ts +12 -0
  141. package/dist/lib/context-mutation/mutation-commit.js +89 -0
  142. package/dist/lib/context-mutation/mutation-directories.d.ts +5 -0
  143. package/dist/lib/context-mutation/mutation-directories.js +56 -0
  144. package/dist/lib/context-mutation/mutation-file-state.d.ts +14 -0
  145. package/dist/lib/context-mutation/mutation-file-state.js +137 -0
  146. package/dist/lib/context-mutation/mutation-journal-file-validation.d.ts +1 -0
  147. package/dist/lib/context-mutation/mutation-journal-file-validation.js +106 -0
  148. package/dist/lib/context-mutation/mutation-journal-io.d.ts +5 -0
  149. package/dist/lib/context-mutation/mutation-journal-io.js +55 -0
  150. package/dist/lib/context-mutation/mutation-journal-storage.d.ts +18 -0
  151. package/dist/lib/context-mutation/mutation-journal-storage.js +283 -0
  152. package/dist/lib/context-mutation/mutation-journal-validation-support.d.ts +16 -0
  153. package/dist/lib/context-mutation/mutation-journal-validation-support.js +140 -0
  154. package/dist/lib/context-mutation/mutation-journal-validation.d.ts +3 -0
  155. package/dist/lib/context-mutation/mutation-journal-validation.js +177 -0
  156. package/dist/lib/context-mutation/mutation-journal.d.ts +8 -0
  157. package/dist/lib/context-mutation/mutation-journal.js +111 -0
  158. package/dist/lib/context-mutation/mutation-live-validation.d.ts +3 -0
  159. package/dist/lib/context-mutation/mutation-live-validation.js +51 -0
  160. package/dist/lib/context-mutation/mutation-long-task-guard.d.ts +6 -0
  161. package/dist/lib/context-mutation/mutation-long-task-guard.js +57 -0
  162. package/dist/lib/context-mutation/mutation-recovery.d.ts +4 -0
  163. package/dist/lib/context-mutation/mutation-recovery.js +189 -0
  164. package/dist/lib/context-mutation/mutation-staged-fs.d.ts +5 -0
  165. package/dist/lib/context-mutation/mutation-staged-fs.js +56 -0
  166. package/dist/lib/context-mutation/mutation-types.d.ts +103 -0
  167. package/dist/lib/context-mutation/mutation-types.js +1 -0
  168. package/dist/lib/context-register/context-register-input.d.ts +11 -0
  169. package/dist/lib/context-register/context-register-input.js +43 -0
  170. package/dist/lib/context-register/context-register-render.d.ts +2 -0
  171. package/dist/lib/context-register/context-register-render.js +21 -0
  172. package/dist/lib/context-register/context-register-support.d.ts +6 -0
  173. package/dist/lib/context-register/context-register-support.js +46 -0
  174. package/dist/lib/context-register/context-register-types.d.ts +46 -0
  175. package/dist/lib/context-register/context-register-types.js +1 -0
  176. package/dist/lib/context-register/context-register.d.ts +8 -0
  177. package/dist/lib/context-register/context-register.js +155 -0
  178. package/dist/lib/context-router/context-route-budget.d.ts +15 -0
  179. package/dist/lib/context-router/context-route-budget.js +14 -0
  180. package/dist/lib/context-router/context-route-candidates.d.ts +15 -0
  181. package/dist/lib/context-router/context-route-candidates.js +112 -0
  182. package/dist/lib/context-router/context-route-order.d.ts +6 -0
  183. package/dist/lib/context-router/context-route-order.js +53 -0
  184. package/dist/lib/context-router/context-route-paths.d.ts +16 -0
  185. package/dist/lib/context-router/context-route-paths.js +109 -0
  186. package/dist/lib/context-router/context-route-render.d.ts +2 -0
  187. package/dist/lib/context-router/context-route-render.js +32 -0
  188. package/dist/lib/context-router/context-route-scan.d.ts +18 -0
  189. package/dist/lib/context-router/context-route-scan.js +156 -0
  190. package/dist/lib/context-router/context-route-selection.d.ts +16 -0
  191. package/dist/lib/context-router/context-route-selection.js +72 -0
  192. package/dist/lib/context-router/context-route-terms.d.ts +13 -0
  193. package/dist/lib/context-router/context-route-terms.js +202 -0
  194. package/dist/lib/context-router/context-route-types.d.ts +101 -0
  195. package/dist/lib/context-router/context-route-types.js +1 -0
  196. package/dist/lib/context-router/context-route.d.ts +2 -0
  197. package/dist/lib/context-router/context-route.js +127 -0
  198. package/dist/lib/context-units-migration.d.ts +13 -0
  199. package/dist/lib/context-units-migration.js +217 -0
  200. package/dist/lib/design-authority-binding.d.ts +7 -0
  201. package/dist/lib/design-authority-binding.js +96 -0
  202. package/dist/lib/design-authority-closure.d.ts +3 -0
  203. package/dist/lib/design-authority-closure.js +201 -0
  204. package/dist/lib/design-authority-delta-codec-primitives.d.ts +10 -0
  205. package/dist/lib/design-authority-delta-codec-primitives.js +58 -0
  206. package/dist/lib/design-authority-delta-codec.d.ts +2 -0
  207. package/dist/lib/design-authority-delta-codec.js +193 -0
  208. package/dist/lib/design-authority-delta-types.d.ts +65 -0
  209. package/dist/lib/design-authority-delta-types.js +6 -0
  210. package/dist/lib/design-authority-delta-validation.d.ts +2 -0
  211. package/dist/lib/design-authority-delta-validation.js +16 -0
  212. package/dist/lib/design-authority-digest.d.ts +8 -0
  213. package/dist/lib/design-authority-digest.js +36 -0
  214. package/dist/lib/design-authority-files.d.ts +9 -0
  215. package/dist/lib/design-authority-files.js +62 -0
  216. package/dist/lib/design-authority-format.d.ts +2 -0
  217. package/dist/lib/design-authority-format.js +93 -0
  218. package/dist/lib/design-authority-links.d.ts +10 -0
  219. package/dist/lib/design-authority-links.js +137 -0
  220. package/dist/lib/design-authority-manifest.d.ts +4 -0
  221. package/dist/lib/design-authority-manifest.js +144 -0
  222. package/dist/lib/design-authority-tokens.d.ts +9 -0
  223. package/dist/lib/design-authority-tokens.js +45 -0
  224. package/dist/lib/design-authority-types.d.ts +80 -0
  225. package/dist/lib/design-authority-types.js +23 -0
  226. package/dist/lib/design-md-tool-adapter.d.ts +9 -0
  227. package/dist/lib/design-md-tool-adapter.js +152 -0
  228. package/dist/lib/design-md-tool-normalization.d.ts +7 -0
  229. package/dist/lib/design-md-tool-normalization.js +78 -0
  230. package/dist/lib/design-md-tool-types.d.ts +99 -0
  231. package/dist/lib/design-md-tool-types.js +8 -0
  232. package/dist/lib/design-resource-handoff-input-types.d.ts +1 -1
  233. package/dist/lib/design-resource-handoff-manifest-projection.js +3 -0
  234. package/dist/lib/design-resource-handoff-shape.js +14 -2
  235. package/dist/lib/design-resource-handoff-types.d.ts +3 -0
  236. package/dist/lib/design-resource-handoff-validation.js +16 -4
  237. package/dist/lib/design-resource-implementation-feasibility-validation-support.js +1 -1
  238. package/dist/lib/design-resource-recovery-current.js +22 -0
  239. package/dist/lib/design-resource-recovery-shape.js +64 -7
  240. package/dist/lib/design-resource-recovery-types.d.ts +4 -1
  241. package/dist/lib/design-resource-symbolic-fact-shape.js +7 -1
  242. package/dist/lib/design-resource-symbolic-fact-types.d.ts +3 -0
  243. package/dist/lib/design-resource-symbolic-fact-validation.js +15 -3
  244. package/dist/lib/doctor.d.ts +2 -1
  245. package/dist/lib/doctor.js +29 -1
  246. package/dist/lib/fs.js +1 -1
  247. package/dist/lib/long-task-acceptance-reachability-claims.d.ts +2 -0
  248. package/dist/lib/long-task-acceptance-reachability-claims.js +279 -0
  249. package/dist/lib/long-task-acceptance-reachability-design.d.ts +2 -0
  250. package/dist/lib/long-task-acceptance-reachability-design.js +96 -0
  251. package/dist/lib/long-task-acceptance-reachability-external.d.ts +9 -0
  252. package/dist/lib/long-task-acceptance-reachability-external.js +123 -0
  253. package/dist/lib/long-task-acceptance-reachability-helpers.d.ts +64 -0
  254. package/dist/lib/long-task-acceptance-reachability-helpers.js +473 -0
  255. package/dist/lib/long-task-acceptance-reachability-semantic.d.ts +2 -0
  256. package/dist/lib/long-task-acceptance-reachability-semantic.js +122 -0
  257. package/dist/lib/long-task-acceptance-reachability-types.d.ts +91 -0
  258. package/dist/lib/long-task-acceptance-reachability-types.js +1 -0
  259. package/dist/lib/long-task-acceptance-reachability.d.ts +4 -0
  260. package/dist/lib/long-task-acceptance-reachability.js +115 -0
  261. package/dist/lib/long-task-activation-validation.d.ts +6 -0
  262. package/dist/lib/long-task-activation-validation.js +72 -69
  263. package/dist/lib/long-task-active-authority-lock-context.d.ts +4 -0
  264. package/dist/lib/long-task-active-authority-lock-context.js +29 -0
  265. package/dist/lib/long-task-applicability-identity.d.ts +25 -0
  266. package/dist/lib/long-task-applicability-identity.js +60 -0
  267. package/dist/lib/long-task-authoring-preflight-diagnostics.js +8 -0
  268. package/dist/lib/long-task-authoring-preflight-types.d.ts +2 -0
  269. package/dist/lib/long-task-authoring-preflight-types.js +9 -0
  270. package/dist/lib/long-task-authoring-preflight.js +18 -2
  271. package/dist/lib/long-task-authority-material-diff.js +4 -0
  272. package/dist/lib/long-task-authority-materials.js +19 -0
  273. package/dist/lib/long-task-authority-policy.d.ts +3 -0
  274. package/dist/lib/long-task-authority-policy.js +3 -0
  275. package/dist/lib/long-task-authority-revision-details.js +2 -1
  276. package/dist/lib/long-task-authority-types.d.ts +2 -0
  277. package/dist/lib/long-task-authority.js +2 -0
  278. package/dist/lib/long-task-check-shape.js +6 -1
  279. package/dist/lib/long-task-claim-definitions.js +1 -3
  280. package/dist/lib/long-task-claim-semantic-proof-floor.d.ts +3 -0
  281. package/dist/lib/long-task-claim-semantic-proof-floor.js +78 -0
  282. package/dist/lib/long-task-claims.d.ts +0 -18
  283. package/dist/lib/long-task-claims.js +15 -14
  284. package/dist/lib/long-task-command-process.js +3 -0
  285. package/dist/lib/long-task-compact-authoring.js +3 -0
  286. package/dist/lib/long-task-compact-projections.js +10 -0
  287. package/dist/lib/long-task-complete-delivery-evidence-types.d.ts +38 -0
  288. package/dist/lib/long-task-complete-delivery-evidence-types.js +1 -0
  289. package/dist/lib/long-task-completion-types.d.ts +109 -0
  290. package/dist/lib/long-task-completion-types.js +1 -0
  291. package/dist/lib/long-task-conformance-policy.d.ts +2 -1
  292. package/dist/lib/long-task-conformance-policy.js +11 -4
  293. package/dist/lib/long-task-context-authority-topology.js +6 -4
  294. package/dist/lib/long-task-contract-types.d.ts +52 -1
  295. package/dist/lib/long-task-counterfactual-sandbox.d.ts +7 -1
  296. package/dist/lib/long-task-counterfactual-sandbox.js +86 -6
  297. package/dist/lib/long-task-delivery-compiler-preflight.d.ts +24 -0
  298. package/dist/lib/long-task-delivery-compiler-preflight.js +32 -0
  299. package/dist/lib/long-task-delivery-compiler.d.ts +1 -0
  300. package/dist/lib/long-task-delivery-compiler.js +59 -44
  301. package/dist/lib/long-task-delivery-parser.d.ts +3 -0
  302. package/dist/lib/long-task-delivery-parser.js +26 -8
  303. package/dist/lib/long-task-delivery-types.d.ts +2 -0
  304. package/dist/lib/long-task-delivery-types.js +2 -0
  305. package/dist/lib/long-task-delivery-validation.d.ts +6 -1
  306. package/dist/lib/long-task-delivery-validation.js +19 -4
  307. package/dist/lib/long-task-design-feasibility-binding.d.ts +1 -0
  308. package/dist/lib/long-task-design-feasibility-binding.js +3 -3
  309. package/dist/lib/long-task-design-feasibility-source-closure.js +11 -2
  310. package/dist/lib/long-task-design-obligation.d.ts +50 -0
  311. package/dist/lib/long-task-design-obligation.js +99 -0
  312. package/dist/lib/long-task-design-resource-handoff.d.ts +3 -1
  313. package/dist/lib/long-task-design-resource-handoff.js +36 -12
  314. package/dist/lib/long-task-design-resource-method-binding.js +12 -0
  315. package/dist/lib/long-task-effective-external-takeover.d.ts +15 -0
  316. package/dist/lib/long-task-effective-external-takeover.js +109 -0
  317. package/dist/lib/long-task-effective-external-ui-takeover.d.ts +5 -0
  318. package/dist/lib/long-task-effective-external-ui-takeover.js +117 -0
  319. package/dist/lib/long-task-evidence-capability-codec.js +91 -0
  320. package/dist/lib/long-task-evidence-capability-runtime.js +62 -14
  321. package/dist/lib/long-task-evidence-capability-types.d.ts +3 -2
  322. package/dist/lib/long-task-evidence-v2.d.ts +6 -1
  323. package/dist/lib/long-task-evidence-v2.js +253 -170
  324. package/dist/lib/long-task-execution-observation.d.ts +7 -0
  325. package/dist/lib/long-task-execution-observation.js +21 -4
  326. package/dist/lib/long-task-expected-authority.d.ts +4 -0
  327. package/dist/lib/long-task-expected-authority.js +126 -0
  328. package/dist/lib/long-task-external-confirmation-artifacts.d.ts +9 -0
  329. package/dist/lib/long-task-external-confirmation-artifacts.js +138 -0
  330. package/dist/lib/long-task-external-confirmation-attestation.d.ts +20 -0
  331. package/dist/lib/long-task-external-confirmation-attestation.js +115 -0
  332. package/dist/lib/long-task-external-confirmation-challenge.d.ts +23 -0
  333. package/dist/lib/long-task-external-confirmation-challenge.js +164 -0
  334. package/dist/lib/long-task-external-confirmation-context.d.ts +14 -0
  335. package/dist/lib/long-task-external-confirmation-context.js +53 -0
  336. package/dist/lib/long-task-external-confirmation-evaluation.d.ts +11 -0
  337. package/dist/lib/long-task-external-confirmation-evaluation.js +454 -0
  338. package/dist/lib/long-task-external-confirmation-expected.d.ts +8 -0
  339. package/dist/lib/long-task-external-confirmation-expected.js +200 -0
  340. package/dist/lib/long-task-external-confirmation-identity.d.ts +10 -0
  341. package/dist/lib/long-task-external-confirmation-identity.js +77 -0
  342. package/dist/lib/long-task-external-confirmation-plan.d.ts +25 -0
  343. package/dist/lib/long-task-external-confirmation-plan.js +148 -0
  344. package/dist/lib/long-task-external-confirmation-preparation.d.ts +4 -0
  345. package/dist/lib/long-task-external-confirmation-preparation.js +100 -0
  346. package/dist/lib/long-task-external-confirmation-shape.d.ts +8 -0
  347. package/dist/lib/long-task-external-confirmation-shape.js +387 -0
  348. package/dist/lib/long-task-external-confirmation-state.d.ts +10 -0
  349. package/dist/lib/long-task-external-confirmation-state.js +109 -0
  350. package/dist/lib/long-task-external-confirmation-types.d.ts +195 -0
  351. package/dist/lib/long-task-external-confirmation-types.js +1 -0
  352. package/dist/lib/long-task-final-integrity.d.ts +2 -0
  353. package/dist/lib/long-task-final-integrity.js +21 -10
  354. package/dist/lib/long-task-final-v2.d.ts +7 -2
  355. package/dist/lib/long-task-final-v2.js +179 -55
  356. package/dist/lib/long-task-finalization-identity.d.ts +27 -0
  357. package/dist/lib/long-task-finalization-identity.js +58 -0
  358. package/dist/lib/long-task-finding-context.d.ts +1 -1
  359. package/dist/lib/long-task-finding-context.js +139 -13
  360. package/dist/lib/long-task-freshness.d.ts +27 -0
  361. package/dist/lib/long-task-freshness.js +128 -5
  362. package/dist/lib/long-task-git.js +3 -3
  363. package/dist/lib/long-task-material-input-closure.d.ts +3 -0
  364. package/dist/lib/long-task-material-input-closure.js +92 -0
  365. package/dist/lib/long-task-obligation-authority-resolution.d.ts +12 -0
  366. package/dist/lib/long-task-obligation-authority-resolution.js +57 -0
  367. package/dist/lib/long-task-obligation-semantic-identity.d.ts +16 -0
  368. package/dist/lib/long-task-obligation-semantic-identity.js +116 -0
  369. package/dist/lib/long-task-observation-authority.d.ts +11 -0
  370. package/dist/lib/long-task-observation-authority.js +137 -6
  371. package/dist/lib/long-task-process-table.d.ts +2 -5
  372. package/dist/lib/long-task-process-table.js +21 -53
  373. package/dist/lib/long-task-process-tree.d.ts +0 -1
  374. package/dist/lib/long-task-process-tree.js +24 -54
  375. package/dist/lib/long-task-proof-adequacy.d.ts +12 -0
  376. package/dist/lib/long-task-proof-adequacy.js +57 -0
  377. package/dist/lib/long-task-proof-capability-floor.d.ts +6 -0
  378. package/dist/lib/long-task-proof-capability-floor.js +137 -0
  379. package/dist/lib/long-task-repair-frontier-checks.d.ts +8 -0
  380. package/dist/lib/long-task-repair-frontier-checks.js +93 -0
  381. package/dist/lib/long-task-repair-frontier-groups.d.ts +2 -0
  382. package/dist/lib/long-task-repair-frontier-groups.js +64 -0
  383. package/dist/lib/long-task-repair-frontier-utils.d.ts +6 -0
  384. package/dist/lib/long-task-repair-frontier-utils.js +27 -0
  385. package/dist/lib/long-task-repair-frontier.d.ts +14 -0
  386. package/dist/lib/long-task-repair-frontier.js +132 -0
  387. package/dist/lib/long-task-risk.d.ts +3 -2
  388. package/dist/lib/long-task-risk.js +73 -24
  389. package/dist/lib/long-task-root-shape.js +148 -8
  390. package/dist/lib/long-task-runner-freeze.d.ts +2 -1
  391. package/dist/lib/long-task-runner-freeze.js +23 -8
  392. package/dist/lib/long-task-runtime-types.d.ts +34 -40
  393. package/dist/lib/long-task-semantic-assurance-policy.js +2 -11
  394. package/dist/lib/long-task-semantic-contract-types.d.ts +2 -1
  395. package/dist/lib/long-task-semantic-drift-migration.js +48 -2
  396. package/dist/lib/long-task-semantic-fact-binding-types.d.ts +20 -0
  397. package/dist/lib/long-task-semantic-fact-closure.d.ts +5 -1
  398. package/dist/lib/long-task-semantic-fact-closure.js +33 -5
  399. package/dist/lib/long-task-semantic-fact-contract-closure.js +176 -1
  400. package/dist/lib/long-task-semantic-fact-contract-proofs.js +18 -1
  401. package/dist/lib/long-task-semantic-fact-input-closure.d.ts +16 -2
  402. package/dist/lib/long-task-semantic-fact-input-closure.js +138 -15
  403. package/dist/lib/long-task-semantic-fact-provenance-closure.js +1 -1
  404. package/dist/lib/long-task-semantic-fact-shape.d.ts +2 -1
  405. package/dist/lib/long-task-semantic-fact-shape.js +35 -1
  406. package/dist/lib/long-task-semantic-proof-adequacy.d.ts +2 -0
  407. package/dist/lib/long-task-semantic-proof-adequacy.js +19 -0
  408. package/dist/lib/long-task-semantic-proof-profile.d.ts +5 -0
  409. package/dist/lib/long-task-semantic-proof-profile.js +187 -0
  410. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  411. package/dist/lib/long-task-shape-primitives.js +5 -0
  412. package/dist/lib/long-task-source-anchors.d.ts +10 -0
  413. package/dist/lib/long-task-source-anchors.js +102 -0
  414. package/dist/lib/long-task-source-authority-types.d.ts +46 -0
  415. package/dist/lib/long-task-source-claim-validation.js +36 -0
  416. package/dist/lib/long-task-source-conservation-facts.d.ts +8 -0
  417. package/dist/lib/long-task-source-conservation-facts.js +57 -0
  418. package/dist/lib/long-task-source-conservation-types.d.ts +34 -0
  419. package/dist/lib/long-task-source-conservation-types.js +1 -0
  420. package/dist/lib/long-task-source-conservation.d.ts +7 -0
  421. package/dist/lib/long-task-source-conservation.js +110 -0
  422. package/dist/lib/long-task-source-fragments.d.ts +6 -0
  423. package/dist/lib/long-task-source-fragments.js +219 -0
  424. package/dist/lib/long-task-source-projection-resolution.d.ts +5 -0
  425. package/dist/lib/long-task-source-projection-resolution.js +57 -0
  426. package/dist/lib/long-task-source-projection-validation.d.ts +17 -0
  427. package/dist/lib/long-task-source-projection-validation.js +154 -0
  428. package/dist/lib/long-task-source-shape.js +14 -6
  429. package/dist/lib/long-task-source-supersession.d.ts +5 -0
  430. package/dist/lib/long-task-source-supersession.js +138 -0
  431. package/dist/lib/long-task-stage-policy.d.ts +7 -2
  432. package/dist/lib/long-task-stage-policy.js +67 -23
  433. package/dist/lib/long-task-state.d.ts +18 -4
  434. package/dist/lib/long-task-state.js +319 -33
  435. package/dist/lib/long-task-static-observation-freeze.js +4 -3
  436. package/dist/lib/long-task-status-projection.d.ts +3 -1
  437. package/dist/lib/long-task-status-projection.js +44 -13
  438. package/dist/lib/long-task-status-v2.d.ts +10 -6
  439. package/dist/lib/long-task-status-v2.js +70 -58
  440. package/dist/lib/long-task-target-policy.d.ts +8 -3
  441. package/dist/lib/long-task-target-policy.js +40 -9
  442. package/dist/lib/long-task-terminal-finalization.d.ts +12 -0
  443. package/dist/lib/long-task-terminal-finalization.js +190 -0
  444. package/dist/lib/long-task-ui-design-policy.js +15 -4
  445. package/dist/lib/long-task-verifier-counterfactuals.d.ts +11 -0
  446. package/dist/lib/long-task-verifier-counterfactuals.js +96 -0
  447. package/dist/lib/long-task-verifier-execution.d.ts +9 -0
  448. package/dist/lib/long-task-verifier-execution.js +67 -0
  449. package/dist/lib/long-task-verifier-identity.js +16 -5
  450. package/dist/lib/long-task-verifier-v2.js +52 -65
  451. package/dist/lib/long-task-windows-job-supervisor-helper.d.ts +1 -0
  452. package/dist/lib/long-task-windows-job-supervisor-helper.js +104 -0
  453. package/dist/lib/long-task-windows-job-supervisor-protocol.d.ts +28 -0
  454. package/dist/lib/long-task-windows-job-supervisor-protocol.js +124 -0
  455. package/dist/lib/long-task-windows-job-supervisor-result.d.ts +11 -0
  456. package/dist/lib/long-task-windows-job-supervisor-result.js +152 -0
  457. package/dist/lib/long-task-windows-job-supervisor.d.ts +2 -0
  458. package/dist/lib/long-task-windows-job-supervisor.js +126 -0
  459. package/dist/lib/long-task-workspace-scope.d.ts +1 -0
  460. package/dist/lib/long-task-workspace-scope.js +4 -1
  461. package/dist/lib/long-task-workspace.d.ts +1 -0
  462. package/dist/lib/long-task-workspace.js +10 -0
  463. package/dist/lib/migrations.js +43 -2
  464. package/dist/lib/repository-path-safety.d.ts +1 -0
  465. package/dist/lib/repository-path-safety.js +3 -3
  466. package/dist/lib/semantic-fact-input-shape.d.ts +7 -2
  467. package/dist/lib/semantic-fact-input-shape.js +25 -1
  468. package/dist/lib/semantic-fact-inventory-types.d.ts +8 -2
  469. package/dist/lib/semantic-fact-policy-census.d.ts +1 -1
  470. package/dist/lib/semantic-fact-policy-census.js +5 -2
  471. package/dist/lib/semantic-fact-policy.d.ts +1 -1
  472. package/dist/lib/semantic-fact-policy.js +2 -2
  473. package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
  474. package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
  475. package/dist/lib/validators.d.ts +3 -0
  476. package/dist/lib/validators.js +45 -157
  477. package/dist/public-api-core.d.ts +12 -0
  478. package/dist/public-api-core.js +12 -0
  479. package/dist/public-api-long-task.d.ts +10 -0
  480. package/dist/public-api-long-task.js +10 -0
  481. package/dist/public-types.d.ts +5 -1
  482. package/dist/schemas/design-authority-delta-assessment-v1.schema.json +191 -0
  483. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +166 -2
  484. package/dist/schemas/long-task-external-confirmation-record-v1.schema.json +155 -0
  485. package/dist/schemas/long-task-external-confirmation-record-v2.schema.json +209 -0
  486. package/migrations/README.md +99 -0
  487. package/package.json +7 -5
  488. package/source-mappings.yaml +18 -0
@@ -0,0 +1,34 @@
1
+ import { compareUtf8Paths, normalizeContextPath } from "./catalog-paths.js";
2
+ const DIAGNOSTIC_SEVERITY_ORDER = {
3
+ error: 0,
4
+ warning: 1,
5
+ };
6
+ export function catalogDiagnostic(code, severity, message, location = {}) {
7
+ return { code, severity, message, ...location };
8
+ }
9
+ export function catalogErrors(diagnostics) {
10
+ return sortCatalogDiagnostics(diagnostics)
11
+ .filter((entry) => entry.severity === "error")
12
+ .map((entry) => entry.message);
13
+ }
14
+ export function catalogWarnings(diagnostics) {
15
+ return sortCatalogDiagnostics(diagnostics)
16
+ .filter((entry) => entry.severity === "warning")
17
+ .map((entry) => entry.message);
18
+ }
19
+ export function compareCatalogDiagnostics(left, right) {
20
+ return (DIAGNOSTIC_SEVERITY_ORDER[left.severity] -
21
+ DIAGNOSTIC_SEVERITY_ORDER[right.severity] ||
22
+ compareUtf8Paths(diagnosticPath(left), diagnosticPath(right)) ||
23
+ (left.line ?? 0) - (right.line ?? 0) ||
24
+ compareUtf8Paths(left.code, right.code) ||
25
+ compareUtf8Paths(left.message, right.message));
26
+ }
27
+ export function sortCatalogDiagnostics(diagnostics) {
28
+ return [...diagnostics].sort(compareCatalogDiagnostics);
29
+ }
30
+ function diagnosticPath(diagnostic) {
31
+ // Diagnostics without a path sort first. Path comparison is slash-normalized
32
+ // and byte-defined; it never depends on the process locale or ICU build.
33
+ return diagnostic.path ? normalizeContextPath(diagnostic.path) : "";
34
+ }
@@ -0,0 +1,7 @@
1
+ import type { CatalogFile } from "./catalog-types.js";
2
+ import type { CatalogDiagnostic } from "./catalog-types.js";
3
+ export interface CatalogDiscoveryResult {
4
+ files: CatalogFile[];
5
+ diagnostics: CatalogDiagnostic[];
6
+ }
7
+ export declare function discoverContextMarkdownFiles(projectRoot: string, fileOverrides?: ReadonlyMap<string, Uint8Array | null>): Promise<CatalogDiscoveryResult>;
@@ -0,0 +1,81 @@
1
+ import { lstat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { listFiles } from "../fs.js";
4
+ import { compareUtf8Paths, normalizeContextPath, normalizeContextPathSpelling, portableContextPathCaseKey, repositoryRelativePathSpelling, } from "./catalog-paths.js";
5
+ import { catalogDiagnostic } from "./catalog-diagnostics.js";
6
+ export async function discoverContextMarkdownFiles(projectRoot, fileOverrides = new Map()) {
7
+ const contextRoot = path.join(projectRoot, "project_context");
8
+ const files = (await listFiles(contextRoot))
9
+ .filter((file) => file.toLowerCase().endsWith(".md"))
10
+ .map((absolutePath) => ({
11
+ absolutePath,
12
+ physicalRelative: repositoryRelativePathSpelling(projectRoot, absolutePath),
13
+ }))
14
+ .sort((left, right) => compareUtf8Paths(left.physicalRelative, right.physicalRelative));
15
+ const diagnostics = [];
16
+ const result = new Map();
17
+ const physicalSpellings = new Map();
18
+ for (const { absolutePath, physicalRelative } of files) {
19
+ const relative = normalizeContextPath(physicalRelative);
20
+ const spellings = physicalSpellings.get(relative) ?? [];
21
+ spellings.push(physicalRelative);
22
+ physicalSpellings.set(relative, spellings);
23
+ if (result.has(relative))
24
+ continue;
25
+ const metadata = await lstat(absolutePath);
26
+ result.set(relative, {
27
+ path: relative,
28
+ physical_path: physicalRelative,
29
+ absolute_path: absolutePath,
30
+ bytes: metadata.size,
31
+ });
32
+ }
33
+ for (const [relative, spellings] of physicalSpellings) {
34
+ const unique = [...new Set(spellings)].sort(compareUtf8Paths);
35
+ if (unique.length < 2)
36
+ continue;
37
+ diagnostics.push(catalogDiagnostic("context_path_unicode_collision", "error", `Context files ${unique.join(", ")} normalize to the same NFC repository path ${relative}`, { path: relative }));
38
+ }
39
+ for (const [relativeInput, bytes] of fileOverrides) {
40
+ const relative = normalizeContextPath(relativeInput);
41
+ if (!relative.startsWith("project_context/") ||
42
+ !relative.toLowerCase().endsWith(".md"))
43
+ continue;
44
+ if (bytes === null)
45
+ result.delete(relative);
46
+ else {
47
+ const existing = result.get(relative);
48
+ if (existing) {
49
+ result.set(relative, { ...existing, bytes: bytes.byteLength });
50
+ continue;
51
+ }
52
+ const physicalPath = normalizeContextPathSpelling(relativeInput);
53
+ result.set(relative, {
54
+ path: relative,
55
+ physical_path: physicalPath,
56
+ absolute_path: path.join(projectRoot, ...physicalPath.split("/")),
57
+ bytes: bytes.byteLength,
58
+ });
59
+ }
60
+ }
61
+ addContextCaseCollisionDiagnostics(diagnostics, result.keys());
62
+ return {
63
+ files: [...result.values()].sort((left, right) => compareUtf8Paths(left.path, right.path)),
64
+ diagnostics,
65
+ };
66
+ }
67
+ function addContextCaseCollisionDiagnostics(diagnostics, paths) {
68
+ const folded = new Map();
69
+ for (const contextPath of paths) {
70
+ const key = portableContextPathCaseKey(contextPath);
71
+ const values = folded.get(key) ?? [];
72
+ values.push(contextPath);
73
+ folded.set(key, values);
74
+ }
75
+ for (const values of folded.values()) {
76
+ const unique = [...new Set(values)].sort(compareUtf8Paths);
77
+ if (unique.length < 2)
78
+ continue;
79
+ diagnostics.push(catalogDiagnostic("context_path_case_collision", "error", `Context files ${unique.join(", ")} collide on a case-insensitive filesystem`, { path: unique[0] }));
80
+ }
81
+ }
@@ -0,0 +1,8 @@
1
+ import type { ContextCatalog } from "./catalog-types.js";
2
+ export interface LoadContextCatalogOptions {
3
+ discover_files?: boolean;
4
+ validate_manifest?: boolean;
5
+ file_overrides?: ReadonlyMap<string, Uint8Array | null>;
6
+ directory_overrides?: ReadonlySet<string>;
7
+ }
8
+ export declare function loadContextCatalog(projectRootInput: string, options?: LoadContextCatalogOptions): Promise<ContextCatalog>;
@@ -0,0 +1,187 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { CONTEXT_MANIFEST_PATH } from "../context-manifest.js";
4
+ import { parseContextManifest } from "../context-manifest-schema.js";
5
+ import { pathExists } from "../fs.js";
6
+ import { selectDefaultContextPaths } from "./catalog-default-footprint.js";
7
+ import { catalogDiagnostic, sortCatalogDiagnostics, } from "./catalog-diagnostics.js";
8
+ import { discoverContextMarkdownFiles } from "./catalog-discovery.js";
9
+ import { compareUtf8Paths, normalizeContextPath, normalizeContextPathSpelling, sortedContextMap, } from "./catalog-paths.js";
10
+ import { validateCatalogManifest } from "./catalog-validation.js";
11
+ export async function loadContextCatalog(projectRootInput, options = {}) {
12
+ const projectRoot = path.resolve(projectRootInput);
13
+ const manifestPath = CONTEXT_MANIFEST_PATH;
14
+ const absoluteManifestPath = path.join(projectRoot, ...manifestPath.split("/"));
15
+ const diagnostics = [];
16
+ const normalizedOverrides = normalizeFileOverrides(options.file_overrides);
17
+ const fileOverrides = normalizedOverrides.values;
18
+ diagnostics.push(...normalizedOverrides.diagnostics);
19
+ const directoryOverrides = normalizeDirectoryOverrides(options.directory_overrides);
20
+ const discovery = options.discover_files === false
21
+ ? { files: [], diagnostics: [] }
22
+ : await discoverContextMarkdownFiles(projectRoot, fileOverrides);
23
+ const contextFiles = discovery.files;
24
+ diagnostics.push(...discovery.diagnostics);
25
+ const withoutCoreFiles = contextFiles.filter((entry) => entry.path !== "project_context/global.md" &&
26
+ entry.path !== "project_context/architecture.md");
27
+ const manifestOverride = fileOverrides.has(manifestPath)
28
+ ? fileOverrides.get(manifestPath)
29
+ : undefined;
30
+ if (manifestOverride === null ||
31
+ (manifestOverride === undefined &&
32
+ !(await pathExists(absoluteManifestPath)))) {
33
+ diagnostics.push(catalogDiagnostic("context_manifest_missing", "error", "project_context/context.toml is missing", { path: manifestPath }));
34
+ addUnregisteredDiagnostics(diagnostics, withoutCoreFiles);
35
+ return {
36
+ project_root: projectRoot,
37
+ manifest_path: manifestPath,
38
+ areas: [],
39
+ registered_contexts: [],
40
+ context_files: contextFiles,
41
+ unregistered_context_files: withoutCoreFiles,
42
+ default_footprint: new Map(),
43
+ roles_by_path: new Map(),
44
+ read_policies_by_path: new Map(),
45
+ diagnostics: sortCatalogDiagnostics(diagnostics),
46
+ };
47
+ }
48
+ const manifestContent = manifestOverride === undefined
49
+ ? await readFile(absoluteManifestPath, "utf8")
50
+ : Buffer.from(manifestOverride).toString("utf8");
51
+ const parsed = parseContextManifest(manifestContent, manifestPath);
52
+ diagnostics.push(...parsed.errors.map((message) => catalogDiagnostic("context_manifest_parse", "error", message, {
53
+ path: manifestPath,
54
+ })));
55
+ if (!parsed.manifest) {
56
+ addUnregisteredDiagnostics(diagnostics, withoutCoreFiles);
57
+ return {
58
+ project_root: projectRoot,
59
+ manifest_path: manifestPath,
60
+ manifest_content: manifestContent,
61
+ areas: [],
62
+ registered_contexts: [],
63
+ context_files: contextFiles,
64
+ unregistered_context_files: withoutCoreFiles,
65
+ default_footprint: new Map(),
66
+ roles_by_path: new Map(),
67
+ read_policies_by_path: new Map(),
68
+ diagnostics: sortCatalogDiagnostics(diagnostics),
69
+ };
70
+ }
71
+ const validation = options.validate_manifest === false
72
+ ? {
73
+ registered_contexts: [],
74
+ roles_by_path: new Map(),
75
+ read_policies_by_path: new Map(),
76
+ diagnostics: [],
77
+ }
78
+ : await validateCatalogManifest(projectRoot, parsed.manifest, fileOverrides, directoryOverrides, contextFiles);
79
+ diagnostics.push(...validation.diagnostics);
80
+ const registeredPaths = new Set([
81
+ "project_context/global.md",
82
+ "project_context/architecture.md",
83
+ ...parsed.manifest.areas.map((area) => normalizeContextPath(area.context)),
84
+ ...parsed.manifest.contexts.map((context) => normalizeContextPath(context.path)),
85
+ ]);
86
+ const unregisteredContextFiles = contextFiles.filter((entry) => !registeredPaths.has(entry.path));
87
+ addUnregisteredDiagnostics(diagnostics, unregisteredContextFiles);
88
+ return {
89
+ project_root: projectRoot,
90
+ manifest_path: manifestPath,
91
+ manifest_content: manifestContent,
92
+ manifest: parsed.manifest,
93
+ areas: projectAreas(parsed.manifest.areas),
94
+ registered_contexts: projectRegisteredContexts(validation.registered_contexts),
95
+ context_files: contextFiles,
96
+ unregistered_context_files: unregisteredContextFiles,
97
+ default_footprint: selectDefaultContextPaths(parsed.manifest),
98
+ roles_by_path: sortedContextMap(validation.roles_by_path),
99
+ read_policies_by_path: sortedContextMap(validation.read_policies_by_path),
100
+ diagnostics: sortCatalogDiagnostics(diagnostics),
101
+ };
102
+ }
103
+ function normalizeDirectoryOverrides(values) {
104
+ if (!values)
105
+ return new Set();
106
+ return new Set([...values].map(normalizeContextPath));
107
+ }
108
+ function normalizeFileOverrides(values) {
109
+ if (!values)
110
+ return { values: new Map(), diagnostics: [] };
111
+ const normalized = new Map();
112
+ const diagnostics = [];
113
+ const spellings = new Map();
114
+ const entries = [...values].sort(([left], [right]) => compareUtf8Paths(normalizeContextPathSpelling(left), normalizeContextPathSpelling(right)));
115
+ for (const [file, bytes] of entries) {
116
+ const relative = normalizeContextPath(file);
117
+ const valuesForPath = spellings.get(relative) ?? [];
118
+ valuesForPath.push(normalizeContextPathSpelling(file));
119
+ spellings.set(relative, valuesForPath);
120
+ if (!normalized.has(relative))
121
+ normalized.set(relative, bytes === null ? null : Buffer.from(bytes));
122
+ }
123
+ for (const [relative, rawSpellings] of spellings) {
124
+ const unique = [...new Set(rawSpellings)].sort(compareUtf8Paths);
125
+ if (unique.length < 2)
126
+ continue;
127
+ diagnostics.push(catalogDiagnostic("context_override_path_unicode_collision", "error", `Context file overrides ${unique.join(", ")} normalize to the same NFC repository path ${relative}`, { path: relative }));
128
+ }
129
+ return { values: normalized, diagnostics };
130
+ }
131
+ function addUnregisteredDiagnostics(diagnostics, files) {
132
+ for (const file of files) {
133
+ diagnostics.push(catalogDiagnostic("context_file_unregistered", "warning", `${file.path} is an unregistered Context Markdown file; add it to project_context/context.toml or move it out of project_context/**`, { path: file.path }));
134
+ }
135
+ }
136
+ function projectAreas(areas) {
137
+ return areas
138
+ .map((area) => ({
139
+ ...area,
140
+ id: area.id.normalize("NFC"),
141
+ root: normalizeContextPath(area.root),
142
+ context: normalizeContextPath(area.context),
143
+ forbidden_runtime_dependencies: [...area.forbidden_runtime_dependencies]
144
+ .map((entry) => entry.normalize("NFC"))
145
+ .sort(compareUtf8Paths),
146
+ }))
147
+ .sort((left, right) => compareUtf8Paths(left.root, right.root) ||
148
+ compareUtf8Paths(left.id, right.id) ||
149
+ compareUtf8Paths(left.context, right.context) ||
150
+ left.line - right.line);
151
+ }
152
+ function projectRegisteredContexts(entries) {
153
+ return entries
154
+ .map((entry) => ({
155
+ ...entry,
156
+ path: normalizeContextPath(entry.path),
157
+ area: entry.area
158
+ ? {
159
+ ...entry.area,
160
+ id: entry.area.id.normalize("NFC"),
161
+ root: normalizeContextPath(entry.area.root),
162
+ context: normalizeContextPath(entry.area.context),
163
+ forbidden_runtime_dependencies: [
164
+ ...entry.area.forbidden_runtime_dependencies,
165
+ ]
166
+ .map((value) => value.normalize("NFC"))
167
+ .sort(compareUtf8Paths),
168
+ }
169
+ : undefined,
170
+ context: entry.context
171
+ ? {
172
+ ...entry.context,
173
+ path: normalizeContextPath(entry.context.path),
174
+ triggers: [...entry.context.triggers]
175
+ .map((value) => value.normalize("NFC"))
176
+ .sort(compareUtf8Paths),
177
+ default_children: [...entry.context.default_children]
178
+ .map(normalizeContextPath)
179
+ .sort(compareUtf8Paths),
180
+ }
181
+ : undefined,
182
+ }))
183
+ .sort((left, right) => compareUtf8Paths(left.path, right.path) ||
184
+ compareUtf8Paths(left.source, right.source) ||
185
+ compareUtf8Paths(left.role, right.role) ||
186
+ left.line - right.line);
187
+ }
@@ -0,0 +1,7 @@
1
+ import type { CatalogFile } from "./catalog-types.js";
2
+ export type CatalogPathErrorReporter = (code: string, message: string, location?: {
3
+ path?: string;
4
+ line?: number;
5
+ }) => void;
6
+ export declare function validateCatalogManifestPath(projectRoot: string, rawPath: string, allowedRoot: string, source: string, allowFile: boolean, addError: CatalogPathErrorReporter, fileOverrides?: ReadonlyMap<string, Uint8Array | null>, directoryOverrides?: ReadonlySet<string>, filesByPath?: ReadonlyMap<string, CatalogFile>): Promise<boolean>;
7
+ export declare function looksLikeContextExportArtifact(value: string): boolean;
@@ -0,0 +1,62 @@
1
+ import path from "node:path";
2
+ import { realpath } from "node:fs/promises";
3
+ import { pathExists } from "../fs.js";
4
+ import { assertCatalogStagedFilePath } from "./catalog-staged-path-safety.js";
5
+ import { isPathWithin, normalizeContextPath } from "./catalog-paths.js";
6
+ const EXPORT_ARTIFACT_NAME_PATTERNS = [
7
+ /full-project-context/iu,
8
+ /当前项目context/iu,
9
+ /当前项目代码实现(?:context)?/iu,
10
+ /code-level-implementation/iu,
11
+ /project-overview/iu,
12
+ /context-bundle/iu,
13
+ /context-summary/iu,
14
+ /context-export/iu,
15
+ ];
16
+ export async function validateCatalogManifestPath(projectRoot, rawPath, allowedRoot, source, allowFile, addError, fileOverrides = new Map(), directoryOverrides = new Set(), filesByPath = new Map()) {
17
+ if (path.isAbsolute(rawPath) ||
18
+ rawPath.replace(/\\/gu, "/").split("/").includes("..")) {
19
+ addError("manifest_path_not_relative", `project_context/context.toml ${source} path must be relative and must not contain '..': ${rawPath}`);
20
+ return false;
21
+ }
22
+ const target = path.resolve(projectRoot, rawPath);
23
+ if (!isPathWithin(allowedRoot, target)) {
24
+ addError("manifest_path_outside_allowed_root", `project_context/context.toml ${source} escapes its allowed root: ${rawPath}`);
25
+ return false;
26
+ }
27
+ const relative = normalizeContextPath(path.relative(projectRoot, target));
28
+ const physicalRelative = filesByPath.get(relative)?.physical_path ?? relative;
29
+ const physicalTarget = path.resolve(projectRoot, physicalRelative);
30
+ if (allowFile && fileOverrides.has(relative)) {
31
+ if (fileOverrides.get(relative) === null) {
32
+ addError("manifest_path_missing", `project_context/context.toml references missing context file: ${relative}`);
33
+ return false;
34
+ }
35
+ try {
36
+ await assertCatalogStagedFilePath(projectRoot, physicalRelative, directoryOverrides, `catalog_staged_file:${source}`);
37
+ return true;
38
+ }
39
+ catch (error) {
40
+ addError("manifest_path_staged_unsafe", `project_context/context.toml ${source} staged path is unsafe: ${message(error)}`);
41
+ return false;
42
+ }
43
+ }
44
+ const existingTarget = allowFile ? physicalTarget : target;
45
+ if (!(await pathExists(existingTarget))) {
46
+ addError("manifest_path_missing", `project_context/context.toml references missing ${allowFile ? "context file" : "area root"}: ${normalizeContextPath(rawPath)}`);
47
+ return false;
48
+ }
49
+ const realAllowedRoot = await realpath(allowedRoot);
50
+ const realTarget = await realpath(existingTarget);
51
+ if (!isPathWithin(realAllowedRoot, realTarget)) {
52
+ addError("manifest_path_symlink_escape", `project_context/context.toml ${source} resolves through a symbolic link outside its allowed root: ${rawPath}`);
53
+ return false;
54
+ }
55
+ return true;
56
+ }
57
+ function message(error) {
58
+ return error instanceof Error ? error.message : String(error);
59
+ }
60
+ export function looksLikeContextExportArtifact(value) {
61
+ return EXPORT_ARTIFACT_NAME_PATTERNS.some((pattern) => pattern.test(value));
62
+ }
@@ -0,0 +1,11 @@
1
+ import type { CatalogFile, ContextCatalog } from "./catalog-types.js";
2
+ export declare function normalizeContextPath(value: string): string;
3
+ export declare function normalizeContextPathSpelling(value: string): string;
4
+ export declare function resolveProjectPath(projectRoot: string, repositoryRelativePath: string): string;
5
+ export declare function repositoryRelativePath(projectRoot: string, absolutePath: string): string;
6
+ export declare function repositoryRelativePathSpelling(projectRoot: string, absolutePath: string): string;
7
+ export declare function resolveCatalogFile(catalog: Pick<ContextCatalog, "context_files">, repositoryRelativePath: string): CatalogFile | undefined;
8
+ export declare function isPathWithin(root: string, target: string): boolean;
9
+ export declare function compareUtf8Paths(left: string, right: string): number;
10
+ export declare function portableContextPathCaseKey(value: string): string;
11
+ export declare function sortedContextMap<T>(values: Iterable<readonly [string, T]>): Map<string, T>;
@@ -0,0 +1,41 @@
1
+ import path from "node:path";
2
+ export function normalizeContextPath(value) {
3
+ return normalizeContextPathSpelling(value).normalize("NFC");
4
+ }
5
+ // Preserve the physical spelling when discovery needs to diagnose two paths
6
+ // that collapse to the same public NFC key. Catalog consumers should otherwise
7
+ // use normalizeContextPath().
8
+ export function normalizeContextPathSpelling(value) {
9
+ return value.replace(/\\/gu, "/").replace(/^\.\//u, "");
10
+ }
11
+ export function resolveProjectPath(projectRoot, repositoryRelativePath) {
12
+ return path.resolve(projectRoot, ...normalizeContextPath(repositoryRelativePath).split("/"));
13
+ }
14
+ export function repositoryRelativePath(projectRoot, absolutePath) {
15
+ return normalizeContextPath(path.relative(projectRoot, absolutePath));
16
+ }
17
+ export function repositoryRelativePathSpelling(projectRoot, absolutePath) {
18
+ return normalizeContextPathSpelling(path.relative(projectRoot, absolutePath));
19
+ }
20
+ export function resolveCatalogFile(catalog, repositoryRelativePath) {
21
+ const key = normalizeContextPath(repositoryRelativePath);
22
+ return catalog.context_files.find((file) => file.path === key);
23
+ }
24
+ export function isPathWithin(root, target) {
25
+ const relative = path.relative(root, target);
26
+ return (relative === "" ||
27
+ (!relative.startsWith(`..${path.sep}`) &&
28
+ relative !== ".." &&
29
+ !path.isAbsolute(relative)));
30
+ }
31
+ export function compareUtf8Paths(left, right) {
32
+ return Buffer.compare(Buffer.from(left, "utf8"), Buffer.from(right, "utf8"));
33
+ }
34
+ export function portableContextPathCaseKey(value) {
35
+ // ECMAScript default case conversion is locale-independent. This key is a
36
+ // portability collision detector, not a filesystem lookup or ontology.
37
+ return normalizeContextPath(value).toLowerCase();
38
+ }
39
+ export function sortedContextMap(values) {
40
+ return new Map([...values].sort(([left], [right]) => compareUtf8Paths(left, right)));
41
+ }
@@ -0,0 +1,15 @@
1
+ export type ContextRole = "global" | "architecture" | "area" | "domain" | "subdomain" | "foundation" | "archive" | "contract" | "verification" | "deployment" | "implementation-index" | "decision-rationale";
2
+ export declare const CONTEXT_SCHEMA_VERSION: number;
3
+ export declare const CONTEXT_ROLES: readonly string[];
4
+ export declare const CONTEXT_ROLE_ALIASES: Readonly<{
5
+ [x: string]: string;
6
+ }>;
7
+ export declare const CONTEXT_READ_POLICIES: readonly string[];
8
+ export declare const CONTEXT_LEGACY_READ_POLICIES: readonly string[];
9
+ export declare const CONTEXT_TOP_LEVEL_FIELDS: Set<string>;
10
+ export declare const CONTEXT_AREA_FIELDS: Set<string>;
11
+ export declare const CONTEXT_NODE_FIELDS: Set<string>;
12
+ export declare const CONTEXT_READ_POLICY_SET: Set<string>;
13
+ export declare const CONTEXT_LEGACY_READ_POLICY_SET: Set<string>;
14
+ export declare function normalizeContextRole(value: string): ContextRole | undefined;
15
+ export declare function isContextReadPolicy(value: string): boolean;
@@ -0,0 +1,68 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ const rawRules = require("../../../assets/tools/context_rules.json");
4
+ const rules = validateRules(rawRules);
5
+ export const CONTEXT_SCHEMA_VERSION = rules.context_schema_version;
6
+ export const CONTEXT_ROLES = Object.freeze([...rules.roles]);
7
+ export const CONTEXT_ROLE_ALIASES = Object.freeze({
8
+ ...rules.role_aliases,
9
+ });
10
+ export const CONTEXT_READ_POLICIES = Object.freeze([...rules.read_policies]);
11
+ export const CONTEXT_LEGACY_READ_POLICIES = Object.freeze([
12
+ ...rules.legacy_read_policies,
13
+ ]);
14
+ export const CONTEXT_TOP_LEVEL_FIELDS = new Set(rules.top_level_fields);
15
+ export const CONTEXT_AREA_FIELDS = new Set(rules.area_fields);
16
+ export const CONTEXT_NODE_FIELDS = new Set(rules.context_fields);
17
+ export const CONTEXT_READ_POLICY_SET = new Set(CONTEXT_READ_POLICIES);
18
+ export const CONTEXT_LEGACY_READ_POLICY_SET = new Set(CONTEXT_LEGACY_READ_POLICIES);
19
+ export function normalizeContextRole(value) {
20
+ const normalized = value.trim().toLowerCase();
21
+ const aliased = CONTEXT_ROLE_ALIASES[normalized] ?? normalized;
22
+ return CONTEXT_ROLES.includes(aliased) ? aliased : undefined;
23
+ }
24
+ export function isContextReadPolicy(value) {
25
+ return CONTEXT_READ_POLICY_SET.has(value);
26
+ }
27
+ function validateRules(value) {
28
+ if (!isRecord(value)) {
29
+ throw new Error("context_rules_invalid:root");
30
+ }
31
+ const arrayFields = [
32
+ "roles",
33
+ "read_policies",
34
+ "legacy_read_policies",
35
+ "top_level_fields",
36
+ "area_fields",
37
+ "context_fields",
38
+ ];
39
+ for (const field of arrayFields) {
40
+ if (!isUniqueStringArray(value[field])) {
41
+ throw new Error(`context_rules_invalid:${field}`);
42
+ }
43
+ }
44
+ if (!Number.isInteger(value.context_schema_version) ||
45
+ Number(value.context_schema_version) < 1) {
46
+ throw new Error("context_rules_invalid:context_schema_version");
47
+ }
48
+ if (!isRecord(value.role_aliases) ||
49
+ Object.values(value.role_aliases).some((entry) => typeof entry !== "string" || !entry.trim())) {
50
+ throw new Error("context_rules_invalid:role_aliases");
51
+ }
52
+ const typed = value;
53
+ if (typed.legacy_read_policies.some((policy) => !typed.read_policies.includes(policy))) {
54
+ throw new Error("context_rules_invalid:legacy_read_policies_subset");
55
+ }
56
+ if (Object.values(typed.role_aliases).some((role) => !typed.roles.includes(role))) {
57
+ throw new Error("context_rules_invalid:role_alias_target");
58
+ }
59
+ return typed;
60
+ }
61
+ function isUniqueStringArray(value) {
62
+ return (Array.isArray(value) &&
63
+ value.every((entry) => typeof entry === "string" && entry.trim()) &&
64
+ new Set(value).size === value.length);
65
+ }
66
+ function isRecord(value) {
67
+ return typeof value === "object" && value !== null && !Array.isArray(value);
68
+ }
@@ -0,0 +1 @@
1
+ export declare function assertCatalogStagedFilePath(repository: string, relative: string, stagedDirectories: ReadonlySet<string>, label: string): Promise<void>;
@@ -0,0 +1,36 @@
1
+ import { lstat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { assertProtectedRepositoryDirectory, assertSafeRepositoryFilePath, resolveInsideRepository, } from "../repository-path-safety.js";
4
+ import { normalizeContextPath, normalizeContextPathSpelling, } from "./catalog-paths.js";
5
+ export async function assertCatalogStagedFilePath(repository, relative, stagedDirectories, label) {
6
+ const absolute = resolveInsideRepository(repository, relative, label);
7
+ const parent = normalizeContextPathSpelling(path.posix.dirname(relative));
8
+ let physicalCursor = "";
9
+ for (const segment of parent.split("/")) {
10
+ if (!segment || segment === ".")
11
+ continue;
12
+ physicalCursor = physicalCursor ? `${physicalCursor}/${segment}` : segment;
13
+ const canonicalCursor = normalizeContextPath(physicalCursor);
14
+ const candidate = path.join(repository, ...physicalCursor.split("/"));
15
+ const status = await lstat(candidate).catch((error) => {
16
+ if (error.code === "ENOENT")
17
+ return null;
18
+ throw error;
19
+ });
20
+ if (!status) {
21
+ if (!stagedDirectories.has(canonicalCursor))
22
+ throw new Error(`staged_parent_not_declared:${label}:${canonicalCursor}`);
23
+ continue;
24
+ }
25
+ await assertProtectedRepositoryDirectory(repository, candidate, `${label}:parent`);
26
+ }
27
+ const target = await lstat(absolute).catch((error) => {
28
+ if (error.code === "ENOENT")
29
+ return null;
30
+ throw error;
31
+ });
32
+ if (target)
33
+ await assertSafeRepositoryFilePath(repository, relative, label, {
34
+ destinationMayBeAbsent: true,
35
+ });
36
+ }
@@ -0,0 +1,40 @@
1
+ import type { ContextAreaEntry, ContextManifest, ContextNodeEntry } from "../context-manifest-schema.js";
2
+ import type { ContextRole } from "./catalog-portable-contract.js";
3
+ import type { DefaultContextSelectionReason } from "./catalog-default-footprint.js";
4
+ export type CatalogDiagnosticSeverity = "error" | "warning";
5
+ export interface CatalogDiagnostic {
6
+ code: string;
7
+ severity: CatalogDiagnosticSeverity;
8
+ message: string;
9
+ path?: string;
10
+ line?: number;
11
+ }
12
+ export interface CatalogFile {
13
+ path: string;
14
+ physical_path: string;
15
+ absolute_path: string;
16
+ bytes: number;
17
+ }
18
+ export interface CatalogRegisteredContext {
19
+ source: "area" | "context";
20
+ path: string;
21
+ role: ContextRole;
22
+ read_policy?: string;
23
+ line: number;
24
+ area?: ContextAreaEntry;
25
+ context?: ContextNodeEntry;
26
+ }
27
+ export interface ContextCatalog {
28
+ project_root: string;
29
+ manifest_path: string;
30
+ manifest_content?: string;
31
+ manifest?: ContextManifest;
32
+ areas: ContextAreaEntry[];
33
+ registered_contexts: CatalogRegisteredContext[];
34
+ context_files: CatalogFile[];
35
+ unregistered_context_files: CatalogFile[];
36
+ default_footprint: Map<string, Set<DefaultContextSelectionReason>>;
37
+ roles_by_path: Map<string, ContextRole>;
38
+ read_policies_by_path: Map<string, string>;
39
+ diagnostics: CatalogDiagnostic[];
40
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { ContextManifest } from "../context-manifest-schema.js";
2
+ import type { CatalogFile, CatalogDiagnostic, CatalogRegisteredContext } from "./catalog-types.js";
3
+ export interface CatalogManifestValidation {
4
+ registered_contexts: CatalogRegisteredContext[];
5
+ roles_by_path: Map<string, CatalogRegisteredContext["role"]>;
6
+ read_policies_by_path: Map<string, string>;
7
+ diagnostics: CatalogDiagnostic[];
8
+ }
9
+ export declare function validateCatalogManifest(projectRoot: string, manifest: ContextManifest, fileOverrides?: ReadonlyMap<string, Uint8Array | null>, directoryOverrides?: ReadonlySet<string>, contextFiles?: readonly CatalogFile[]): Promise<CatalogManifestValidation>;