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,21 @@
1
+ export function renderContextRegisterText(result) {
2
+ const lines = [
3
+ `Context register ${result.applied ? "committed" : "dry-run"}`,
4
+ `Path: ${result.path}`,
5
+ `Role: ${result.role}`,
6
+ `Read policy: ${result.read_policy}`,
7
+ `Manifest: ${result.manifest.before_sha256} -> ${result.manifest.after_sha256} (${signed(result.manifest.bytes_delta)} bytes)`,
8
+ `Default footprint: ${result.default_footprint.before.path_count}/${result.default_footprint.before.bytes} -> ${result.default_footprint.after.path_count}/${result.default_footprint.after.bytes}`,
9
+ `Transaction: ${result.transaction.id} (${result.transaction.state})`,
10
+ "",
11
+ result.manifest.diff.trimEnd(),
12
+ ];
13
+ for (const diagnostic of result.diagnostics)
14
+ lines.push(`warning: ${diagnostic}`);
15
+ if (!result.applied)
16
+ lines.push("", "No files changed. Re-run with --apply to commit this exact plan after a fresh CAS check.");
17
+ return `${lines.join("\n")}\n`;
18
+ }
19
+ function signed(value) {
20
+ return value >= 0 ? `+${value}` : String(value);
21
+ }
@@ -0,0 +1,6 @@
1
+ import type { CatalogFile, ContextCatalog } from "../context-catalog/catalog-types.js";
2
+ import type { NormalizedRegisterInput } from "./context-register-input.js";
3
+ export declare function assertRegistrationTarget(catalog: ContextCatalog, contextPath: string): CatalogFile;
4
+ export declare function assertStagedRegistration(catalog: ContextCatalog, input: NormalizedRegisterInput): void;
5
+ export declare function readContextContent(repository: string, file: CatalogFile): Promise<string>;
6
+ export declare function renderAppendDiff(file: string, block: string): string;
@@ -0,0 +1,46 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { portableContextPathCaseKey } from "../context-catalog/catalog-paths.js";
3
+ import { decodeMutationUtf8, mutationCatalogFailure, mutationIoFailure, mutationMessage, } from "../context-mutation/mutation-command-support.js";
4
+ import { assertProtectedRepositoryFile } from "../repository-path-safety.js";
5
+ export function assertRegistrationTarget(catalog, contextPath) {
6
+ const folded = portableContextPathCaseKey(contextPath);
7
+ const registered = catalog.registered_contexts.find((entry) => portableContextPathCaseKey(entry.path) === folded);
8
+ if (registered)
9
+ mutationCatalogFailure(`Context is already registered as ${registered.path}`);
10
+ const file = catalog.unregistered_context_files.find((entry) => portableContextPathCaseKey(entry.path) === folded);
11
+ if (!file)
12
+ mutationIoFailure(`context register requires an existing unregistered file: ${contextPath}`);
13
+ if (file.path !== contextPath)
14
+ mutationIoFailure(`context register path case does not match existing file: ${file.path}`);
15
+ return file;
16
+ }
17
+ export function assertStagedRegistration(catalog, input) {
18
+ const matches = catalog.registered_contexts.filter((entry) => entry.source === "context" && entry.path === input.path);
19
+ if (matches.length !== 1)
20
+ mutationCatalogFailure("staged registration is not unique");
21
+ if (matches[0].role !== input.role ||
22
+ matches[0].read_policy !== input.read_policy)
23
+ mutationCatalogFailure("staged registration metadata does not match the request");
24
+ }
25
+ export async function readContextContent(repository, file) {
26
+ try {
27
+ const absolute = await assertProtectedRepositoryFile(repository, file.absolute_path, "context_register_source");
28
+ return decodeMutationUtf8(await readFile(absolute), file.path);
29
+ }
30
+ catch (error) {
31
+ mutationIoFailure(`unable to read Context registration source: ${mutationMessage(error)}`, error);
32
+ }
33
+ }
34
+ export function renderAppendDiff(file, block) {
35
+ return [
36
+ `--- ${file}`,
37
+ `+++ ${file}`,
38
+ "@@ append context @@",
39
+ ...block
40
+ .replace(/\r\n/gu, "\n")
41
+ .trimEnd()
42
+ .split("\n")
43
+ .map((line) => `+${line}`),
44
+ "",
45
+ ].join("\n");
46
+ }
@@ -0,0 +1,46 @@
1
+ import type { ContextRole } from "../context-catalog/catalog-portable-contract.js";
2
+ import type { ContextFootprintState } from "../context-mutation/mutation-types.js";
3
+ export interface ContextRegisterInput {
4
+ project_root: string;
5
+ context_path: string;
6
+ role: string;
7
+ read_policy?: string;
8
+ read_when?: string;
9
+ triggers?: string[];
10
+ default_children?: string[];
11
+ apply?: boolean;
12
+ }
13
+ export interface ContextRegisterResult {
14
+ schema_version: 1;
15
+ operation: "register";
16
+ applied: boolean;
17
+ path: string;
18
+ role: ContextRole;
19
+ read_policy: "default" | "on-demand";
20
+ manifest: {
21
+ path: "project_context/context.toml";
22
+ before_sha256: string;
23
+ after_sha256: string;
24
+ before_bytes: number;
25
+ after_bytes: number;
26
+ bytes_delta: number;
27
+ diff: string;
28
+ };
29
+ default_footprint: {
30
+ changed: boolean;
31
+ before: ContextFootprintState;
32
+ after: ContextFootprintState;
33
+ added: string[];
34
+ removed: string[];
35
+ };
36
+ catalog: {
37
+ before_identity: string;
38
+ after_identity: string;
39
+ };
40
+ diagnostics: string[];
41
+ transaction: {
42
+ id: string;
43
+ state: "dry-run" | "committed";
44
+ journal_present: false;
45
+ };
46
+ }
@@ -0,0 +1,8 @@
1
+ import type { ContextMutationPlan } from "../context-mutation/mutation-types.js";
2
+ import type { ContextRegisterInput, ContextRegisterResult } from "./context-register-types.js";
3
+ export declare function registerContext(input: ContextRegisterInput): Promise<ContextRegisterResult>;
4
+ export interface PlannedContextRegistration {
5
+ plan: ContextMutationPlan;
6
+ result: ContextRegisterResult;
7
+ }
8
+ export declare function planContextRegistration(input: ContextRegisterInput): Promise<PlannedContextRegistration>;
@@ -0,0 +1,155 @@
1
+ import { appendContextManifestBlock, } from "../context-mutation/manifest-lossless-patch.js";
2
+ import { captureMutationFileState, mutationFileStateFromBytes, mutationTemporaryPath, } from "../context-mutation/mutation-cas.js";
3
+ import { executeContextMutationPlan } from "../context-mutation/mutation-commit.js";
4
+ import { assertMutationCatalogValid, assertNoUnfinishedContextMutation, decodeMutationUtf8, loadMutationCatalog, mutationCatalogFailure, mutationIoFailure, mutationMessage, mutationStateBytes, sameMutationArray, } from "../context-mutation/mutation-command-support.js";
5
+ import { contextCatalogIdentity, contextFootprintState, stagedFileOverrides, } from "../context-mutation/mutation-staged-fs.js";
6
+ import { canonicalValueJson, sha256Hex } from "../strict-codec.js";
7
+ import { CliCommandError } from "../cli-exit.js";
8
+ import { validateContextRegistrationContent } from "../validators.js";
9
+ import { normalizeContextRegisterInput } from "./context-register-input.js";
10
+ import { assertRegistrationTarget, assertStagedRegistration, readContextContent, renderAppendDiff, } from "./context-register-support.js";
11
+ const MANIFEST_PATH = "project_context/context.toml";
12
+ export async function registerContext(input) {
13
+ const planned = await planContextRegistration(input);
14
+ if (!input.apply)
15
+ return planned.result;
16
+ try {
17
+ await executeContextMutationPlan(input.project_root, planned.plan);
18
+ }
19
+ catch (error) {
20
+ if (error instanceof CliCommandError)
21
+ throw error;
22
+ mutationIoFailure(`context register transaction stopped: ${mutationMessage(error)}; inspect recovery with ty-context context transaction status`, error);
23
+ }
24
+ return {
25
+ ...planned.result,
26
+ applied: true,
27
+ transaction: {
28
+ ...planned.result.transaction,
29
+ state: "committed",
30
+ },
31
+ };
32
+ }
33
+ export async function planContextRegistration(input) {
34
+ const normalized = normalizeContextRegisterInput(input);
35
+ await assertNoUnfinishedContextMutation(input.project_root);
36
+ const beforeCatalog = await loadMutationCatalog(input.project_root);
37
+ assertMutationCatalogValid(beforeCatalog, "context register requires a valid Catalog");
38
+ const registrationFile = assertRegistrationTarget(beforeCatalog, normalized.path);
39
+ const manifestBefore = await captureMutationFileState(input.project_root, MANIFEST_PATH);
40
+ if (!manifestBefore.exists || manifestBefore.mode === null)
41
+ mutationCatalogFailure("project_context/context.toml is missing");
42
+ const manifestText = decodeMutationUtf8(mutationStateBytes(manifestBefore), MANIFEST_PATH);
43
+ if (manifestText !== beforeCatalog.manifest_content)
44
+ mutationIoFailure("Context Catalog changed while planning register");
45
+ const contextContent = await readContextContent(input.project_root, registrationFile);
46
+ const recoveryErrors = validateContextRegistrationContent(input.project_root, normalized.path, contextContent, normalized.role, normalized.read_policy);
47
+ if (recoveryErrors.length)
48
+ mutationCatalogFailure(`Context is not recoverable for registration: ${recoveryErrors.join("; ")}`);
49
+ const manifestPatchInput = {
50
+ path: normalized.path,
51
+ role: normalized.role,
52
+ read_policy: normalized.read_policy,
53
+ read_when: normalized.read_when,
54
+ triggers: normalized.triggers,
55
+ default_children: normalized.default_children,
56
+ };
57
+ let patch;
58
+ try {
59
+ patch = appendContextManifestBlock(manifestText, manifestPatchInput);
60
+ }
61
+ catch (error) {
62
+ mutationCatalogFailure(`Manifest cannot be patched losslessly: ${mutationMessage(error)}`, error);
63
+ }
64
+ const afterBytes = Buffer.from(patch.content, "utf8");
65
+ const overrides = stagedFileOverrides([[MANIFEST_PATH, afterBytes]]);
66
+ const afterCatalog = await loadMutationCatalog(input.project_root, overrides);
67
+ assertMutationCatalogValid(afterCatalog, "staged Context registration is invalid");
68
+ assertStagedRegistration(afterCatalog, normalized);
69
+ const beforeFootprint = contextFootprintState(beforeCatalog);
70
+ const afterFootprint = contextFootprintState(afterCatalog);
71
+ const afterState = mutationFileStateFromBytes(afterBytes, manifestBefore.mode);
72
+ const operationData = {
73
+ kind: "register",
74
+ context_path: normalized.path,
75
+ role: normalized.role,
76
+ read_policy: normalized.read_policy,
77
+ expected_default_paths: afterFootprint.paths,
78
+ expected_default_bytes: afterFootprint.bytes,
79
+ };
80
+ const catalogBeforeIdentity = contextCatalogIdentity(beforeCatalog);
81
+ const catalogAfterIdentity = contextCatalogIdentity(afterCatalog);
82
+ const transactionId = sha256Hex(canonicalValueJson({
83
+ operation: "register",
84
+ catalog_before_identity: catalogBeforeIdentity,
85
+ catalog_after_identity: catalogAfterIdentity,
86
+ file: {
87
+ path: MANIFEST_PATH,
88
+ before_sha256: manifestBefore.sha256,
89
+ after_sha256: afterState.sha256,
90
+ mode: manifestBefore.mode,
91
+ },
92
+ operation_data: operationData,
93
+ }));
94
+ const plan = {
95
+ transaction_id: transactionId,
96
+ operation: "register",
97
+ catalog_before_identity: catalogBeforeIdentity,
98
+ catalog_after_identity: catalogAfterIdentity,
99
+ directories: [],
100
+ files: [
101
+ {
102
+ path: MANIFEST_PATH,
103
+ physical_path: MANIFEST_PATH,
104
+ before: manifestBefore,
105
+ after: afterState,
106
+ commit_order: 0,
107
+ temporary_path: mutationTemporaryPath(MANIFEST_PATH, transactionId, 0),
108
+ temporary_state: null,
109
+ published_before: null,
110
+ published_after: null,
111
+ },
112
+ ],
113
+ operation_data: operationData,
114
+ };
115
+ return {
116
+ plan,
117
+ result: {
118
+ schema_version: 1,
119
+ operation: "register",
120
+ applied: false,
121
+ path: normalized.path,
122
+ role: normalized.role,
123
+ read_policy: normalized.read_policy,
124
+ manifest: {
125
+ path: MANIFEST_PATH,
126
+ before_sha256: manifestBefore.sha256,
127
+ after_sha256: afterState.sha256,
128
+ before_bytes: mutationStateBytes(manifestBefore).length,
129
+ after_bytes: afterBytes.length,
130
+ bytes_delta: afterBytes.length - mutationStateBytes(manifestBefore).length,
131
+ diff: renderAppendDiff(MANIFEST_PATH, patch.inserted_block),
132
+ },
133
+ default_footprint: {
134
+ changed: beforeFootprint.bytes !== afterFootprint.bytes ||
135
+ !sameMutationArray(beforeFootprint.paths, afterFootprint.paths),
136
+ before: beforeFootprint,
137
+ after: afterFootprint,
138
+ added: afterFootprint.paths.filter((file) => !beforeFootprint.paths.includes(file)),
139
+ removed: beforeFootprint.paths.filter((file) => !afterFootprint.paths.includes(file)),
140
+ },
141
+ catalog: {
142
+ before_identity: catalogBeforeIdentity,
143
+ after_identity: catalogAfterIdentity,
144
+ },
145
+ diagnostics: afterCatalog.diagnostics
146
+ .filter((entry) => entry.severity === "warning")
147
+ .map((entry) => entry.message),
148
+ transaction: {
149
+ id: transactionId,
150
+ state: "dry-run",
151
+ journal_present: false,
152
+ },
153
+ },
154
+ };
155
+ }
@@ -0,0 +1,15 @@
1
+ export declare const CONTEXT_ROUTE_SCHEMA_VERSION = 1;
2
+ export declare const CONTEXT_ROUTE_BUDGETS: Readonly<{
3
+ readonly task_utf8_bytes: number;
4
+ readonly automatic_terms: 32;
5
+ readonly explicit_terms: 32;
6
+ readonly automatic_term_min_code_points: 2;
7
+ readonly explicit_term_min_code_points: 1;
8
+ readonly term_max_code_points: 128;
9
+ readonly candidate_files: 4096;
10
+ readonly per_file_scan_bytes: number;
11
+ readonly aggregate_scan_bytes: number;
12
+ readonly output_matches: 200;
13
+ readonly per_file_output_matches: 20;
14
+ }>;
15
+ export type ContextRouteBudgetName = keyof typeof CONTEXT_ROUTE_BUDGETS;
@@ -0,0 +1,14 @@
1
+ export const CONTEXT_ROUTE_SCHEMA_VERSION = 1;
2
+ export const CONTEXT_ROUTE_BUDGETS = Object.freeze({
3
+ task_utf8_bytes: 8 * 1024,
4
+ automatic_terms: 32,
5
+ explicit_terms: 32,
6
+ automatic_term_min_code_points: 2,
7
+ explicit_term_min_code_points: 1,
8
+ term_max_code_points: 128,
9
+ candidate_files: 4096,
10
+ per_file_scan_bytes: 1024 * 1024,
11
+ aggregate_scan_bytes: 32 * 1024 * 1024,
12
+ output_matches: 200,
13
+ per_file_output_matches: 20,
14
+ });
@@ -0,0 +1,15 @@
1
+ import type { CatalogFile, CatalogRegisteredContext, ContextCatalog } from "../context-catalog/catalog-types.js";
2
+ import type { ContextRouteBudgetExceeded, ContextRouteCandidate, ContextRouteDefaultEntry, ContextRouteGroup, ContextRouteReason, ContextRouteResult } from "./context-route-types.js";
3
+ export interface MutableCandidate extends Omit<ContextRouteCandidate, "cumulative_bytes"> {
4
+ group_set: Set<ContextRouteGroup>;
5
+ reason_keys: Set<string>;
6
+ }
7
+ export declare function addReason(candidates: Map<string, MutableCandidate>, catalog: ContextCatalog, filesByPath: Map<string, CatalogFile>, registeredByPath: Map<string, CatalogRegisteredContext>, contextPath: string, reason: ContextRouteReason, group?: ContextRouteGroup, matchedPath?: string): MutableCandidate;
8
+ export declare function projectCandidates(values: MutableCandidate[]): ContextRouteCandidate[];
9
+ export declare function defaultEntries(catalog: ContextCatalog): ContextRouteDefaultEntry[];
10
+ export declare function emptyResult(input: {
11
+ catalog: ContextCatalog;
12
+ caseSensitive: boolean;
13
+ defaultContext: ContextRouteDefaultEntry[];
14
+ exceeded: ContextRouteBudgetExceeded[];
15
+ }): ContextRouteResult;
@@ -0,0 +1,112 @@
1
+ import { compareUtf8Paths } from "../context-catalog/catalog-paths.js";
2
+ import { CONTEXT_LEGACY_READ_POLICY_SET } from "../context-catalog/catalog-portable-contract.js";
3
+ import { CONTEXT_ROUTE_SCHEMA_VERSION } from "./context-route-budget.js";
4
+ import { compareRouteReasons, sortRouteGroups, stableRouteBudgetExceeded, } from "./context-route-order.js";
5
+ export function addReason(candidates, catalog, filesByPath, registeredByPath, contextPath, reason, group, matchedPath) {
6
+ const registered = registeredByPath.get(contextPath);
7
+ const file = filesByPath.get(contextPath);
8
+ const current = candidates.get(contextPath) ??
9
+ createCandidate(catalog, registered, file, contextPath);
10
+ if (group)
11
+ current.group_set.add(group);
12
+ if (matchedPath && !current.matched_paths.includes(matchedPath))
13
+ current.matched_paths.push(matchedPath);
14
+ const reasonKey = `${reason.kind}\0${reason.input}\0${reason.detail}`;
15
+ if (!current.reason_keys.has(reasonKey)) {
16
+ current.reason_keys.add(reasonKey);
17
+ current.reasons.push(reason);
18
+ }
19
+ candidates.set(contextPath, current);
20
+ return current;
21
+ }
22
+ export function projectCandidates(values) {
23
+ const result = [...values].sort((left, right) => compareUtf8Paths(left.path, right.path));
24
+ let cumulative = 0;
25
+ return result.map(({ group_set, reason_keys: _reasonKeys, ...entry }) => {
26
+ cumulative += entry.bytes;
27
+ return {
28
+ ...entry,
29
+ groups: sortRouteGroups(group_set),
30
+ reasons: [...entry.reasons].sort(compareRouteReasons),
31
+ matched_paths: [...entry.matched_paths].sort(compareUtf8Paths),
32
+ cumulative_bytes: cumulative,
33
+ };
34
+ });
35
+ }
36
+ export function defaultEntries(catalog) {
37
+ const files = new Map(catalog.context_files.map((entry) => [entry.path, entry]));
38
+ const values = [...catalog.default_footprint.entries()].sort(([left], [right]) => compareUtf8Paths(left, right));
39
+ let cumulative = 0;
40
+ return values.map(([contextPath, reasons]) => {
41
+ const bytes = contextPath === catalog.manifest_path
42
+ ? Buffer.byteLength(catalog.manifest_content ?? "", "utf8")
43
+ : (files.get(contextPath)?.bytes ?? 0);
44
+ cumulative += bytes;
45
+ return {
46
+ path: contextPath,
47
+ reasons: [...reasons].sort(compareUtf8Paths),
48
+ bytes,
49
+ cumulative_bytes: cumulative,
50
+ };
51
+ });
52
+ }
53
+ export function emptyResult(input) {
54
+ return {
55
+ schema_version: CONTEXT_ROUTE_SCHEMA_VERSION,
56
+ complete: false,
57
+ catalog_valid: false,
58
+ experimental: true,
59
+ authority: false,
60
+ workflow_search_replaced: false,
61
+ matching: {
62
+ literal: true,
63
+ unicode_normalization: "NFC",
64
+ case_sensitive: input.caseSensitive,
65
+ },
66
+ scan: {
67
+ files_considered: input.catalog.context_files.length,
68
+ files_scanned: 0,
69
+ bytes_scanned: 0,
70
+ budget_exceeded: input.exceeded.length > 0,
71
+ exceeded: stableRouteBudgetExceeded(input.exceeded),
72
+ },
73
+ output_truncated: false,
74
+ default_context: input.defaultContext,
75
+ candidates: [],
76
+ unregistered_matches: [],
77
+ ambiguous: [],
78
+ unresolved: [],
79
+ diagnostics: input.catalog.diagnostics,
80
+ };
81
+ }
82
+ function createCandidate(catalog, registered, file, contextPath) {
83
+ const groups = classificationGroups(catalog, registered, contextPath);
84
+ const unregistered = catalog.unregistered_context_files.some((entry) => entry.path === contextPath);
85
+ return {
86
+ path: contextPath,
87
+ registration: unregistered ? "unregistered" : "registered",
88
+ role: registered?.role ?? null,
89
+ read_policy: registered?.read_policy ?? null,
90
+ groups,
91
+ group_set: new Set(groups),
92
+ reasons: [],
93
+ reason_keys: new Set(),
94
+ matched_terms: [],
95
+ matched_paths: [],
96
+ matches: [],
97
+ bytes: file?.bytes ?? 0,
98
+ };
99
+ }
100
+ function classificationGroups(catalog, registered, contextPath) {
101
+ if (catalog.unregistered_context_files.some((entry) => entry.path === contextPath))
102
+ return ["unregistered"];
103
+ const groups = [];
104
+ if (catalog.default_footprint.has(contextPath))
105
+ groups.push("default_registered");
106
+ if (registered?.read_policy &&
107
+ CONTEXT_LEGACY_READ_POLICY_SET.has(registered.read_policy))
108
+ groups.push("legacy_registered");
109
+ else if (!catalog.default_footprint.has(contextPath))
110
+ groups.push("on_demand_registered");
111
+ return groups;
112
+ }
@@ -0,0 +1,6 @@
1
+ import type { ContextRouteAmbiguity, ContextRouteBudgetExceeded, ContextRouteGroup, ContextRouteReason, ContextRouteUnresolved } from "./context-route-types.js";
2
+ export declare function compareRouteReasons(left: ContextRouteReason, right: ContextRouteReason): number;
3
+ export declare function sortRouteGroups(groups: Iterable<ContextRouteGroup>): ContextRouteGroup[];
4
+ export declare function stableRouteBudgetExceeded(values: readonly ContextRouteBudgetExceeded[]): ContextRouteBudgetExceeded[];
5
+ export declare function compareRouteAmbiguities(left: ContextRouteAmbiguity, right: ContextRouteAmbiguity): number;
6
+ export declare function compareRouteUnresolved(left: ContextRouteUnresolved, right: ContextRouteUnresolved): number;
@@ -0,0 +1,53 @@
1
+ import { compareUtf8Paths, normalizeContextPath, } from "../context-catalog/catalog-paths.js";
2
+ export function compareRouteReasons(left, right) {
3
+ return (compareUtf8Paths(left.kind, right.kind) ||
4
+ compareUtf8Paths(left.input, right.input) ||
5
+ compareUtf8Paths(left.detail, right.detail));
6
+ }
7
+ export function sortRouteGroups(groups) {
8
+ return [...groups].sort(compareUtf8Paths);
9
+ }
10
+ export function stableRouteBudgetExceeded(values) {
11
+ const merged = new Map();
12
+ for (const entry of values) {
13
+ const normalized = {
14
+ ...entry,
15
+ ...(entry.path ? { path: normalizeContextPath(entry.path) } : {}),
16
+ };
17
+ const key = `${normalized.budget}\0${normalized.path ?? ""}`;
18
+ const current = merged.get(key);
19
+ merged.set(key, current
20
+ ? {
21
+ ...normalized,
22
+ limit: Math.min(current.limit, normalized.limit),
23
+ observed: Math.max(current.observed, normalized.observed),
24
+ }
25
+ : normalized);
26
+ }
27
+ return [...merged.values()].sort((left, right) => compareUtf8Paths(left.budget, right.budget) ||
28
+ compareUtf8Paths(left.path ?? "", right.path ?? "") ||
29
+ left.limit - right.limit ||
30
+ left.observed - right.observed);
31
+ }
32
+ export function compareRouteAmbiguities(left, right) {
33
+ return (compareUtf8Paths(left.kind, right.kind) ||
34
+ compareUtf8Paths(left.input, right.input) ||
35
+ compareAreaCandidateLists(left.candidates, right.candidates) ||
36
+ compareUtf8Paths(left.reason, right.reason));
37
+ }
38
+ export function compareRouteUnresolved(left, right) {
39
+ return (compareUtf8Paths(left.kind, right.kind) ||
40
+ compareUtf8Paths(left.input, right.input) ||
41
+ compareUtf8Paths(left.reason, right.reason));
42
+ }
43
+ function compareAreaCandidateLists(left, right) {
44
+ const length = Math.min(left.length, right.length);
45
+ for (let index = 0; index < length; index += 1) {
46
+ const comparison = compareUtf8Paths(left[index].root, right[index].root) ||
47
+ compareUtf8Paths(left[index].id, right[index].id) ||
48
+ compareUtf8Paths(left[index].context, right[index].context);
49
+ if (comparison !== 0)
50
+ return comparison;
51
+ }
52
+ return left.length - right.length;
53
+ }
@@ -0,0 +1,16 @@
1
+ import type { CatalogFile, ContextCatalog } from "../context-catalog/catalog-types.js";
2
+ import type { ContextRouteAmbiguity, ContextRouteAreaCandidate, ContextRouteUnresolved } from "./context-route-types.js";
3
+ export interface ContextRoutePathMatch {
4
+ input: string;
5
+ normalized_path: string;
6
+ area: ContextRouteAreaCandidate;
7
+ }
8
+ export interface ContextRoutePathResult {
9
+ matches: ContextRoutePathMatch[];
10
+ ambiguous: ContextRouteAmbiguity[];
11
+ unresolved: ContextRouteUnresolved[];
12
+ }
13
+ export declare function matchContextAreas(catalog: ContextCatalog, inputs: string[]): ContextRoutePathResult;
14
+ export declare function resolveManualIncludes(catalog: ContextCatalog, inputs: string[]): Promise<CatalogFile[]>;
15
+ export declare function normalizeRepositoryInput(value: string, flag: string): string;
16
+ export declare function normalizeRepositoryInputs(values: readonly string[], flag: string): string[];
@@ -0,0 +1,109 @@
1
+ import { lstat, realpath } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { CLI_EXIT_CODES, CliCommandError } from "../cli-exit.js";
4
+ import { compareUtf8Paths, isPathWithin, normalizeContextPath, resolveProjectPath, } from "../context-catalog/catalog-paths.js";
5
+ import { compareRouteAmbiguities, compareRouteUnresolved, } from "./context-route-order.js";
6
+ export function matchContextAreas(catalog, inputs) {
7
+ const matches = [];
8
+ const ambiguous = [];
9
+ const unresolved = [];
10
+ for (const normalized of normalizeRepositoryInputs(inputs, "--path")) {
11
+ const candidates = catalog.areas
12
+ .map((area) => ({
13
+ id: area.id.normalize("NFC"),
14
+ root: normalizeAreaRoot(area.root),
15
+ context: normalizeContextPath(area.context),
16
+ }))
17
+ .filter((area) => areaContains(area.root, normalized));
18
+ if (candidates.length === 0) {
19
+ unresolved.push({
20
+ kind: "path",
21
+ input: normalized,
22
+ reason: "no Area root contains the repository-relative path",
23
+ });
24
+ continue;
25
+ }
26
+ const maximum = Math.max(...candidates.map(areaScore));
27
+ const deepest = candidates
28
+ .filter((area) => areaScore(area) === maximum)
29
+ .sort((left, right) => compareUtf8Paths(`${left.root}\0${left.id}\0${left.context}`, `${right.root}\0${right.id}\0${right.context}`));
30
+ if (deepest.length > 1) {
31
+ ambiguous.push({
32
+ kind: "area_path",
33
+ input: normalized,
34
+ candidates: deepest,
35
+ reason: "multiple Area roots tie at the deepest matching root",
36
+ });
37
+ continue;
38
+ }
39
+ matches.push({
40
+ input: normalized,
41
+ normalized_path: normalized,
42
+ area: deepest[0],
43
+ });
44
+ }
45
+ return {
46
+ matches: matches.sort(comparePathMatches),
47
+ ambiguous: ambiguous.sort(compareRouteAmbiguities),
48
+ unresolved: unresolved.sort(compareRouteUnresolved),
49
+ };
50
+ }
51
+ export async function resolveManualIncludes(catalog, inputs) {
52
+ const files = new Map(catalog.context_files.map((file) => [file.path, file]));
53
+ const contextRoot = resolveProjectPath(catalog.project_root, "project_context");
54
+ const realContextRoot = await realpath(contextRoot);
55
+ const result = new Map();
56
+ for (const normalized of normalizeRepositoryInputs(inputs, "--include")) {
57
+ if (!normalized.startsWith("project_context/") ||
58
+ !normalized.endsWith(".md"))
59
+ throw new CliCommandError(CLI_EXIT_CODES.io, `route include must name an existing Markdown file under project_context/: ${normalized}`);
60
+ const file = files.get(normalized);
61
+ if (!file)
62
+ throw new CliCommandError(CLI_EXIT_CODES.io, `route include is missing or is not an eligible Context file: ${normalized}`);
63
+ const metadata = await lstat(file.absolute_path);
64
+ if (!metadata.isFile() || metadata.isSymbolicLink())
65
+ throw new CliCommandError(CLI_EXIT_CODES.io, `route include must be a regular no-follow file: ${normalized}`);
66
+ const identity = await realpath(file.absolute_path);
67
+ if (!isPathWithin(realContextRoot, identity))
68
+ throw new CliCommandError(CLI_EXIT_CODES.io, `route include resolves outside project_context/: ${normalized}`);
69
+ result.set(normalized, file);
70
+ }
71
+ return [...result.values()].sort((left, right) => compareUtf8Paths(left.path, right.path));
72
+ }
73
+ export function normalizeRepositoryInput(value, flag) {
74
+ const normalized = normalizeContextPath(value.trim());
75
+ if (!normalized)
76
+ throw new CliCommandError(CLI_EXIT_CODES.arguments, `route ${flag} requires a non-empty repository-relative path`);
77
+ if (path.posix.isAbsolute(normalized) ||
78
+ path.win32.isAbsolute(normalized) ||
79
+ normalized.split("/").includes("..") ||
80
+ /^[A-Za-z]:/u.test(normalized))
81
+ throw new CliCommandError(CLI_EXIT_CODES.io, `route ${flag} path must stay repository-relative: ${value}`);
82
+ return normalized;
83
+ }
84
+ export function normalizeRepositoryInputs(values, flag) {
85
+ return [
86
+ ...new Set(values.map((value) => normalizeRepositoryInput(value, flag))),
87
+ ].sort(compareUtf8Paths);
88
+ }
89
+ function normalizeAreaRoot(value) {
90
+ const normalized = normalizeContextPath(value.trim());
91
+ return normalized === "" || normalized === "."
92
+ ? "."
93
+ : normalized.replace(/\/$/u, "");
94
+ }
95
+ function comparePathMatches(left, right) {
96
+ return (compareUtf8Paths(left.normalized_path, right.normalized_path) ||
97
+ compareUtf8Paths(left.area.root, right.area.root) ||
98
+ compareUtf8Paths(left.area.id, right.area.id) ||
99
+ compareUtf8Paths(left.area.context, right.area.context));
100
+ }
101
+ function areaContains(root, candidate) {
102
+ return root === "." || candidate === root || candidate.startsWith(`${root}/`);
103
+ }
104
+ function areaScore(area) {
105
+ if (area.root === ".")
106
+ return 0;
107
+ const depth = area.root.split("/").length;
108
+ return depth * 1_000_000 + Buffer.byteLength(area.root, "utf8");
109
+ }
@@ -0,0 +1,2 @@
1
+ import type { ContextRouteResult } from "./context-route-types.js";
2
+ export declare function renderContextRouteText(result: ContextRouteResult, explain: boolean): string;