project-tiny-context-harness 0.2.85 → 0.6.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 (361) hide show
  1. package/README.md +163 -428
  2. package/assets/README.md +283 -455
  3. package/assets/README.zh-CN.md +199 -123
  4. package/assets/agents/AGENTS_CORE.md +54 -67
  5. package/assets/context_templates/context.toml +3 -0
  6. package/assets/context_templates/global.md +6 -6
  7. package/assets/github/harness.yml +2 -2
  8. package/assets/skills/context_development_engineer/SKILL.md +91 -107
  9. package/assets/skills/context_product_plan/SKILL.md +18 -28
  10. package/assets/skills/context_surface_contract/SKILL.md +35 -38
  11. package/assets/skills/context_uiux_design/SKILL.md +31 -30
  12. package/assets/skills/long-task-workflow/SKILL.md +76 -0
  13. package/assets/skills/long-task-workflow/agents/openai.yaml +4 -0
  14. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +41 -0
  15. package/assets/skills/long-task-workflow/references/contract-authoring.md +62 -0
  16. package/assets/skills/long-task-workflow/references/evidence-design.md +45 -0
  17. package/assets/skills/normal-long-task/SKILL.md +12 -489
  18. package/assets/skills/source-plan-authoring/SKILL.md +379 -0
  19. package/assets/tools/validate_context.py +293 -127
  20. package/dist/cli.js +3 -1
  21. package/dist/commands/check-modularity.js +33 -10
  22. package/dist/commands/composite-campaign.d.ts +1 -0
  23. package/dist/commands/composite-campaign.js +8 -0
  24. package/dist/commands/composite-long-task.d.ts +1 -6
  25. package/dist/commands/composite-long-task.js +7 -163
  26. package/dist/commands/delivery-set.d.ts +1 -0
  27. package/dist/commands/delivery-set.js +8 -0
  28. package/dist/commands/disable.d.ts +1 -0
  29. package/dist/commands/disable.js +15 -0
  30. package/dist/commands/enable.d.ts +1 -0
  31. package/dist/commands/enable.js +14 -0
  32. package/dist/commands/export-context-args.js +13 -4
  33. package/dist/commands/export-context.js +18 -7
  34. package/dist/commands/index.js +42 -30
  35. package/dist/commands/init.js +12 -6
  36. package/dist/commands/long-task-authoring.d.ts +3 -0
  37. package/dist/commands/long-task-authoring.js +92 -0
  38. package/dist/commands/long-task-explain.d.ts +1 -0
  39. package/dist/commands/long-task-explain.js +52 -0
  40. package/dist/commands/long-task.d.ts +1 -0
  41. package/dist/commands/long-task.js +226 -0
  42. package/dist/commands/package-source.js +2 -2
  43. package/dist/commands/upgrade.js +10 -10
  44. package/dist/index.d.ts +11 -1
  45. package/dist/index.js +8 -0
  46. package/dist/lib/config.js +34 -8
  47. package/dist/lib/context-default-footprint.d.ts +16 -0
  48. package/dist/lib/context-default-footprint.js +107 -0
  49. package/dist/lib/context-export.js +105 -41
  50. package/dist/lib/context-graph-snapshot.d.ts +18 -0
  51. package/dist/lib/context-graph-snapshot.js +171 -0
  52. package/dist/lib/context-manifest-schema.d.ts +28 -0
  53. package/dist/lib/context-manifest-schema.js +150 -0
  54. package/dist/lib/context-manifest.js +28 -20
  55. package/dist/lib/context-templates.js +5 -5
  56. package/dist/lib/design-md.js +1 -1
  57. package/dist/lib/doctor.js +54 -1
  58. package/dist/lib/harness-root.js +25 -8
  59. package/dist/lib/init.js +6 -3
  60. package/dist/lib/legacy-managed-scan.js +23 -7
  61. package/dist/lib/legacy-sdlc-migration.js +21 -11
  62. package/dist/lib/long-task-acceptance-reference.d.ts +22 -0
  63. package/dist/lib/long-task-acceptance-reference.js +46 -0
  64. package/dist/lib/long-task-acceptance-shape.d.ts +5 -0
  65. package/dist/lib/long-task-acceptance-shape.js +131 -0
  66. package/dist/lib/long-task-activation-validation.d.ts +21 -0
  67. package/dist/lib/long-task-activation-validation.js +136 -0
  68. package/dist/lib/long-task-artifacts.d.ts +5 -0
  69. package/dist/lib/long-task-artifacts.js +34 -0
  70. package/dist/lib/long-task-assertions-v2.d.ts +22 -0
  71. package/dist/lib/long-task-assertions-v2.js +212 -0
  72. package/dist/lib/long-task-authoring-authority-preview.d.ts +5 -0
  73. package/dist/lib/long-task-authoring-authority-preview.js +85 -0
  74. package/dist/lib/long-task-authoring-preflight-diagnostics.d.ts +8 -0
  75. package/dist/lib/long-task-authoring-preflight-diagnostics.js +179 -0
  76. package/dist/lib/long-task-authoring-preflight-repair-order.d.ts +8 -0
  77. package/dist/lib/long-task-authoring-preflight-repair-order.js +95 -0
  78. package/dist/lib/long-task-authoring-preflight-types.d.ts +46 -0
  79. package/dist/lib/long-task-authoring-preflight-types.js +38 -0
  80. package/dist/lib/long-task-authoring-preflight.d.ts +3 -0
  81. package/dist/lib/long-task-authoring-preflight.js +44 -0
  82. package/dist/lib/long-task-authority-material-diff.d.ts +17 -0
  83. package/dist/lib/long-task-authority-material-diff.js +152 -0
  84. package/dist/lib/long-task-authority-materials.d.ts +7 -0
  85. package/dist/lib/long-task-authority-materials.js +83 -0
  86. package/dist/lib/long-task-authority-policy.d.ts +168 -0
  87. package/dist/lib/long-task-authority-policy.js +181 -0
  88. package/dist/lib/long-task-authority-revision-details.d.ts +19 -0
  89. package/dist/lib/long-task-authority-revision-details.js +192 -0
  90. package/dist/lib/long-task-authority-revision-enforcement.d.ts +3 -0
  91. package/dist/lib/long-task-authority-revision-enforcement.js +41 -0
  92. package/dist/lib/long-task-authority-revision-types.d.ts +50 -0
  93. package/dist/lib/long-task-authority-revision-types.js +1 -0
  94. package/dist/lib/long-task-authority-revision.d.ts +4 -0
  95. package/dist/lib/long-task-authority-revision.js +188 -0
  96. package/dist/lib/long-task-authority-transition-policy.d.ts +62 -0
  97. package/dist/lib/long-task-authority-transition-policy.js +62 -0
  98. package/dist/lib/long-task-authority-types.d.ts +96 -0
  99. package/dist/lib/long-task-authority-types.js +1 -0
  100. package/dist/lib/long-task-authority.d.ts +7 -0
  101. package/dist/lib/long-task-authority.js +142 -0
  102. package/dist/lib/long-task-boundary-check.d.ts +15 -0
  103. package/dist/lib/long-task-boundary-check.js +9 -0
  104. package/dist/lib/long-task-check-evidence-decoder.d.ts +3 -0
  105. package/dist/lib/long-task-check-evidence-decoder.js +74 -0
  106. package/dist/lib/long-task-check-execution-policy.d.ts +18 -0
  107. package/dist/lib/long-task-check-execution-policy.js +36 -0
  108. package/dist/lib/long-task-check-runner.d.ts +2 -0
  109. package/dist/lib/long-task-check-runner.js +181 -0
  110. package/dist/lib/long-task-check-shape.d.ts +2 -0
  111. package/dist/lib/long-task-check-shape.js +136 -0
  112. package/dist/lib/long-task-claim-definitions.d.ts +7 -0
  113. package/dist/lib/long-task-claim-definitions.js +78 -0
  114. package/dist/lib/long-task-claim-proof-policy.d.ts +4 -0
  115. package/dist/lib/long-task-claim-proof-policy.js +57 -0
  116. package/dist/lib/long-task-claims.d.ts +10 -0
  117. package/dist/lib/long-task-claims.js +187 -0
  118. package/dist/lib/long-task-context-authority-topology.d.ts +7 -0
  119. package/dist/lib/long-task-context-authority-topology.js +37 -0
  120. package/dist/lib/long-task-context-authority.d.ts +14 -0
  121. package/dist/lib/long-task-context-authority.js +66 -0
  122. package/dist/lib/long-task-contract-types.d.ts +203 -0
  123. package/dist/lib/long-task-contract-types.js +1 -0
  124. package/dist/lib/long-task-counterfactual-claim-policy.d.ts +10 -0
  125. package/dist/lib/long-task-counterfactual-claim-policy.js +57 -0
  126. package/dist/lib/long-task-counterfactual-sandbox.d.ts +6 -0
  127. package/dist/lib/long-task-counterfactual-sandbox.js +87 -0
  128. package/dist/lib/long-task-counterfactual-types.d.ts +24 -0
  129. package/dist/lib/long-task-counterfactual-types.js +1 -0
  130. package/dist/lib/long-task-delivery-compiler.d.ts +10 -0
  131. package/dist/lib/long-task-delivery-compiler.js +129 -0
  132. package/dist/lib/long-task-delivery-parser.d.ts +13 -0
  133. package/dist/lib/long-task-delivery-parser.js +90 -0
  134. package/dist/lib/long-task-delivery-preflight.d.ts +5 -0
  135. package/dist/lib/long-task-delivery-preflight.js +151 -0
  136. package/dist/lib/long-task-delivery-shape.d.ts +5 -0
  137. package/dist/lib/long-task-delivery-shape.js +5 -0
  138. package/dist/lib/long-task-delivery-types.d.ts +8 -0
  139. package/dist/lib/long-task-delivery-types.js +8 -0
  140. package/dist/lib/long-task-delivery-validation.d.ts +3 -0
  141. package/dist/lib/long-task-delivery-validation.js +175 -0
  142. package/dist/lib/long-task-evidence-adapter-policy.d.ts +4 -0
  143. package/dist/lib/long-task-evidence-adapter-policy.js +15 -0
  144. package/dist/lib/long-task-evidence-adapter-types.d.ts +1 -0
  145. package/dist/lib/long-task-evidence-adapter-types.js +1 -0
  146. package/dist/lib/long-task-evidence-findings.d.ts +5 -0
  147. package/dist/lib/long-task-evidence-findings.js +113 -0
  148. package/dist/lib/long-task-evidence-sensitivity-policy.d.ts +4 -0
  149. package/dist/lib/long-task-evidence-sensitivity-policy.js +98 -0
  150. package/dist/lib/long-task-evidence-v2.d.ts +5 -0
  151. package/dist/lib/long-task-evidence-v2.js +226 -0
  152. package/dist/lib/long-task-explain-acceptance-link.d.ts +46 -0
  153. package/dist/lib/long-task-explain-acceptance-link.js +96 -0
  154. package/dist/lib/long-task-explain-claim-links.d.ts +45 -0
  155. package/dist/lib/long-task-explain-claim-links.js +88 -0
  156. package/dist/lib/long-task-explain-source-links.d.ts +93 -0
  157. package/dist/lib/long-task-explain-source-links.js +51 -0
  158. package/dist/lib/long-task-final-v2.d.ts +2 -0
  159. package/dist/lib/long-task-final-v2.js +124 -0
  160. package/dist/lib/long-task-finding-context.d.ts +3 -0
  161. package/dist/lib/long-task-finding-context.js +63 -0
  162. package/dist/lib/long-task-freshness.d.ts +3 -0
  163. package/dist/lib/long-task-freshness.js +80 -0
  164. package/dist/lib/long-task-hook-install.d.ts +9 -0
  165. package/dist/lib/long-task-hook-install.js +184 -0
  166. package/dist/lib/long-task-hook-preflight.d.ts +7 -0
  167. package/dist/lib/long-task-hook-preflight.js +58 -0
  168. package/dist/lib/long-task-observation-ownership.d.ts +2 -0
  169. package/dist/lib/long-task-observation-ownership.js +22 -0
  170. package/dist/lib/long-task-outcome-parser.d.ts +4 -0
  171. package/dist/lib/long-task-outcome-parser.js +100 -0
  172. package/dist/lib/long-task-paths.d.ts +49 -0
  173. package/dist/lib/long-task-paths.js +418 -0
  174. package/dist/lib/long-task-playwright-counterfactual-policy.d.ts +7 -0
  175. package/dist/lib/long-task-playwright-counterfactual-policy.js +125 -0
  176. package/dist/lib/long-task-playwright-evidence.d.ts +6 -0
  177. package/dist/lib/long-task-playwright-evidence.js +244 -0
  178. package/dist/lib/long-task-product-shape.d.ts +6 -0
  179. package/dist/lib/long-task-product-shape.js +73 -0
  180. package/dist/lib/long-task-progress.d.ts +4 -0
  181. package/dist/lib/long-task-progress.js +114 -0
  182. package/dist/lib/long-task-protected-files.d.ts +1 -0
  183. package/dist/lib/long-task-protected-files.js +30 -0
  184. package/dist/lib/long-task-required-proof-surfaces.d.ts +2 -0
  185. package/dist/lib/long-task-required-proof-surfaces.js +13 -0
  186. package/dist/lib/long-task-requirement-shape.d.ts +2 -0
  187. package/dist/lib/long-task-requirement-shape.js +18 -0
  188. package/dist/lib/long-task-risk-surfaces.d.ts +2 -0
  189. package/dist/lib/long-task-risk-surfaces.js +60 -0
  190. package/dist/lib/long-task-risk-types.d.ts +5 -0
  191. package/dist/lib/long-task-risk-types.js +12 -0
  192. package/dist/lib/long-task-risk.d.ts +9 -0
  193. package/dist/lib/long-task-risk.js +132 -0
  194. package/dist/lib/long-task-root-shape.d.ts +4 -0
  195. package/dist/lib/long-task-root-shape.js +86 -0
  196. package/dist/lib/long-task-runner-environment.d.ts +7 -0
  197. package/dist/lib/long-task-runner-environment.js +57 -0
  198. package/dist/lib/long-task-runner-files.d.ts +3 -0
  199. package/dist/lib/long-task-runner-files.js +39 -0
  200. package/dist/lib/long-task-runner-freeze.d.ts +2 -0
  201. package/dist/lib/long-task-runner-freeze.js +168 -0
  202. package/dist/lib/long-task-runtime-types.d.ts +214 -0
  203. package/dist/lib/long-task-runtime-types.js +1 -0
  204. package/dist/lib/long-task-shape-primitives.d.ts +17 -0
  205. package/dist/lib/long-task-shape-primitives.js +81 -0
  206. package/dist/lib/long-task-source-authority-types.d.ts +13 -0
  207. package/dist/lib/long-task-source-authority-types.js +1 -0
  208. package/dist/lib/long-task-source-claim-validation.d.ts +5 -0
  209. package/dist/lib/long-task-source-claim-validation.js +96 -0
  210. package/dist/lib/long-task-source-continuity.d.ts +4 -0
  211. package/dist/lib/long-task-source-continuity.js +57 -0
  212. package/dist/lib/long-task-source-inventory.d.ts +2 -0
  213. package/dist/lib/long-task-source-inventory.js +21 -0
  214. package/dist/lib/long-task-source-item-parser.d.ts +3 -0
  215. package/dist/lib/long-task-source-item-parser.js +112 -0
  216. package/dist/lib/long-task-source-shape.d.ts +2 -0
  217. package/dist/lib/long-task-source-shape.js +56 -0
  218. package/dist/lib/long-task-source-target-continuity.d.ts +4 -0
  219. package/dist/lib/long-task-source-target-continuity.js +80 -0
  220. package/dist/lib/long-task-source-target-index.d.ts +12 -0
  221. package/dist/lib/long-task-source-target-index.js +76 -0
  222. package/dist/lib/long-task-source-validation.d.ts +3 -0
  223. package/dist/lib/long-task-source-validation.js +46 -0
  224. package/dist/lib/long-task-state.d.ts +91 -0
  225. package/dist/lib/long-task-state.js +611 -0
  226. package/dist/lib/long-task-status-projection.d.ts +21 -0
  227. package/dist/lib/long-task-status-projection.js +116 -0
  228. package/dist/lib/long-task-status-v2.d.ts +37 -0
  229. package/dist/lib/long-task-status-v2.js +306 -0
  230. package/dist/lib/long-task-technical-shape.d.ts +3 -0
  231. package/dist/lib/long-task-technical-shape.js +44 -0
  232. package/dist/lib/long-task-verifier-authority.d.ts +12 -0
  233. package/dist/lib/long-task-verifier-authority.js +47 -0
  234. package/dist/lib/long-task-verifier-identity.d.ts +2 -0
  235. package/dist/lib/long-task-verifier-identity.js +55 -0
  236. package/dist/lib/long-task-verifier-v2.d.ts +13 -0
  237. package/dist/lib/long-task-verifier-v2.js +266 -0
  238. package/dist/lib/long-task-workspace-runtime-types.d.ts +23 -0
  239. package/dist/lib/long-task-workspace-runtime-types.js +1 -0
  240. package/dist/lib/long-task-workspace.d.ts +25 -0
  241. package/dist/lib/long-task-workspace.js +366 -0
  242. package/dist/lib/managed-file.js +20 -5
  243. package/dist/lib/migrations.js +156 -32
  244. package/dist/lib/modularity.d.ts +27 -1
  245. package/dist/lib/modularity.js +499 -23
  246. package/dist/lib/package-json-config.js +14 -5
  247. package/dist/lib/package-source.js +4 -2
  248. package/dist/lib/profiles.d.ts +13 -0
  249. package/dist/lib/profiles.js +66 -0
  250. package/dist/lib/schema-guard.js +4 -2
  251. package/dist/lib/source-files.js +14 -7
  252. package/dist/lib/source-pack-classify.js +91 -19
  253. package/dist/lib/source-pack-config.js +25 -8
  254. package/dist/lib/source-pack-export.js +84 -25
  255. package/dist/lib/source-pack-manifest.js +18 -6
  256. package/dist/lib/source-pack-records.js +35 -11
  257. package/dist/lib/source-pack-render.js +47 -18
  258. package/dist/lib/stable-json.d.ts +2 -0
  259. package/dist/lib/stable-json.js +21 -0
  260. package/dist/lib/strict-codec.d.ts +4 -0
  261. package/dist/lib/strict-codec.js +65 -0
  262. package/dist/lib/sync-engine.js +76 -24
  263. package/dist/lib/types.d.ts +8 -1
  264. package/dist/lib/upgrade.js +4 -3
  265. package/dist/lib/validators.js +218 -191
  266. package/dist/long-task-hook.d.ts +2 -0
  267. package/dist/long-task-hook.js +55 -0
  268. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +340 -0
  269. package/dist/schemas/long-task-delivery-v2/long-task-outcomes-v2.schema.json +18 -0
  270. package/migrations/README.md +8 -3
  271. package/package.json +17 -6
  272. package/source-mappings.yaml +0 -3
  273. package/assets/protected-harness-baseline.json +0 -20
  274. package/assets/skills/composite-long-task-workflow/SKILL.md +0 -245
  275. package/assets/skills/composite-long-task-workflow/assets/execution-binding.template.md +0 -62
  276. package/assets/skills/composite-long-task-workflow/assets/goal-objective.template.md +0 -17
  277. package/assets/skills/composite-long-task-workflow/references/composite-long-task-workflow-protocol.md +0 -682
  278. package/dist/commands/superpowers.d.ts +0 -1
  279. package/dist/commands/superpowers.js +0 -8
  280. package/dist/lib/composite-long-task-renderer.d.ts +0 -12
  281. package/dist/lib/composite-long-task-renderer.js +0 -109
  282. package/dist/lib/plan-acceptance-artifacts.d.ts +0 -1
  283. package/dist/lib/plan-acceptance-artifacts.js +0 -220
  284. package/dist/lib/plan-acceptance-evidence.d.ts +0 -2
  285. package/dist/lib/plan-acceptance-evidence.js +0 -108
  286. package/dist/lib/plan-acceptance-json.d.ts +0 -15
  287. package/dist/lib/plan-acceptance-json.js +0 -133
  288. package/dist/lib/plan-acceptance-validator.d.ts +0 -2
  289. package/dist/lib/plan-acceptance-validator.js +0 -209
  290. package/dist/lib/plan-contract-validator.d.ts +0 -2
  291. package/dist/lib/plan-contract-validator.js +0 -127
  292. package/dist/lib/plan-validator-common.d.ts +0 -24
  293. package/dist/lib/plan-validator-common.js +0 -196
  294. package/dist/lib/superpowers-task-ac010.d.ts +0 -6
  295. package/dist/lib/superpowers-task-ac010.js +0 -26
  296. package/dist/lib/superpowers-task-assertion-normalizers.d.ts +0 -3
  297. package/dist/lib/superpowers-task-assertion-normalizers.js +0 -74
  298. package/dist/lib/superpowers-task-assertions.d.ts +0 -20
  299. package/dist/lib/superpowers-task-assertions.js +0 -257
  300. package/dist/lib/superpowers-task-attempt.d.ts +0 -4
  301. package/dist/lib/superpowers-task-attempt.js +0 -102
  302. package/dist/lib/superpowers-task-command-run-correlation.d.ts +0 -8
  303. package/dist/lib/superpowers-task-command-run-correlation.js +0 -103
  304. package/dist/lib/superpowers-task-command-specs.d.ts +0 -3
  305. package/dist/lib/superpowers-task-command-specs.js +0 -52
  306. package/dist/lib/superpowers-task-compile-diagnostics.d.ts +0 -5
  307. package/dist/lib/superpowers-task-compile-diagnostics.js +0 -20
  308. package/dist/lib/superpowers-task-compile-guards.d.ts +0 -2
  309. package/dist/lib/superpowers-task-compile-guards.js +0 -66
  310. package/dist/lib/superpowers-task-compile.d.ts +0 -6
  311. package/dist/lib/superpowers-task-compile.js +0 -133
  312. package/dist/lib/superpowers-task-completion-output.d.ts +0 -91
  313. package/dist/lib/superpowers-task-completion-output.js +0 -374
  314. package/dist/lib/superpowers-task-conformance.d.ts +0 -2
  315. package/dist/lib/superpowers-task-conformance.js +0 -24
  316. package/dist/lib/superpowers-task-contradictions.d.ts +0 -6
  317. package/dist/lib/superpowers-task-contradictions.js +0 -126
  318. package/dist/lib/superpowers-task-current-evidence.d.ts +0 -3
  319. package/dist/lib/superpowers-task-current-evidence.js +0 -176
  320. package/dist/lib/superpowers-task-delivery.d.ts +0 -4
  321. package/dist/lib/superpowers-task-delivery.js +0 -96
  322. package/dist/lib/superpowers-task-derive.d.ts +0 -14
  323. package/dist/lib/superpowers-task-derive.js +0 -393
  324. package/dist/lib/superpowers-task-events.d.ts +0 -1
  325. package/dist/lib/superpowers-task-events.js +0 -13
  326. package/dist/lib/superpowers-task-evidence-kernel.d.ts +0 -19
  327. package/dist/lib/superpowers-task-evidence-kernel.js +0 -347
  328. package/dist/lib/superpowers-task-evidence-records.d.ts +0 -2
  329. package/dist/lib/superpowers-task-evidence-records.js +0 -55
  330. package/dist/lib/superpowers-task-evidence.d.ts +0 -10
  331. package/dist/lib/superpowers-task-evidence.js +0 -147
  332. package/dist/lib/superpowers-task-fields.d.ts +0 -22
  333. package/dist/lib/superpowers-task-fields.js +0 -276
  334. package/dist/lib/superpowers-task-final-card.d.ts +0 -3
  335. package/dist/lib/superpowers-task-final-card.js +0 -35
  336. package/dist/lib/superpowers-task-gates.d.ts +0 -12
  337. package/dist/lib/superpowers-task-gates.js +0 -267
  338. package/dist/lib/superpowers-task-harness-drift.d.ts +0 -11
  339. package/dist/lib/superpowers-task-harness-drift.js +0 -90
  340. package/dist/lib/superpowers-task-next-slices.d.ts +0 -1
  341. package/dist/lib/superpowers-task-next-slices.js +0 -12
  342. package/dist/lib/superpowers-task-protected-baseline.d.ts +0 -10
  343. package/dist/lib/superpowers-task-protected-baseline.js +0 -66
  344. package/dist/lib/superpowers-task-source-compile.d.ts +0 -5
  345. package/dist/lib/superpowers-task-source-compile.js +0 -226
  346. package/dist/lib/superpowers-task-source-parser.d.ts +0 -23
  347. package/dist/lib/superpowers-task-source-parser.js +0 -218
  348. package/dist/lib/superpowers-task-state-schema.d.ts +0 -460
  349. package/dist/lib/superpowers-task-state-schema.js +0 -66
  350. package/dist/lib/superpowers-task-state-shape.d.ts +0 -3
  351. package/dist/lib/superpowers-task-state-shape.js +0 -50
  352. package/dist/lib/superpowers-task-state.d.ts +0 -16
  353. package/dist/lib/superpowers-task-state.js +0 -246
  354. package/dist/lib/superpowers-task-status.d.ts +0 -2
  355. package/dist/lib/superpowers-task-status.js +0 -24
  356. package/dist/lib/superpowers-task-under-specified.d.ts +0 -7
  357. package/dist/lib/superpowers-task-under-specified.js +0 -61
  358. package/dist/lib/superpowers-task-unregistered-evidence.d.ts +0 -11
  359. package/dist/lib/superpowers-task-unregistered-evidence.js +0 -72
  360. package/dist/lib/superpowers-task-validator.d.ts +0 -5
  361. package/dist/lib/superpowers-task-validator.js +0 -293
@@ -0,0 +1,611 @@
1
+ import { access, mkdir, open, readFile, readdir, rename, rm, writeFile, } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { canonicalJson, canonicalValueJson, sha256Hex, } from "./strict-codec.js";
4
+ import { gitCommonDir, gitConfigGet, gitConfigSet, gitConfigUnset, gitPath, } from "./long-task-workspace.js";
5
+ import { verifierAuthorityDiff } from "./long-task-verifier-authority.js";
6
+ const RUNTIME_FOLDER = ".ty-context";
7
+ const COMPILED_FILE = "compiled-contract.json";
8
+ const PROGRESS_FOLDER = "progress";
9
+ const AUTHORITY_PENDING_FILE = "authority-revision-pending.json";
10
+ const AUTHORITY_APPROVED_FILE = "authority-revision-approved.json";
11
+ const FINAL_FILE = "final-receipt.json";
12
+ const CONTRACT_FILE = "delivery-contract.yaml";
13
+ export function runtimePath(workdir, file = "") {
14
+ return path.join(path.resolve(workdir), RUNTIME_FOLDER, file);
15
+ }
16
+ export function worktreeIdentity(repositoryRoot) {
17
+ const normalized = normalizePath(repositoryRoot);
18
+ return `wt-${sha256Hex(normalized)}`;
19
+ }
20
+ export async function activeRecordPath(repositoryRoot) {
21
+ const identity = worktreeIdentity(repositoryRoot);
22
+ return path.join(await gitCommonDir(repositoryRoot), "ty-context", "long-task", "worktrees", identity, "active.json");
23
+ }
24
+ export async function activeAuthorityLockPath(repositoryRoot) {
25
+ return `${await activeRecordPath(repositoryRoot)}.lock`;
26
+ }
27
+ export async function activeAuthorityLockExists(repositoryRoot) {
28
+ return access(await activeAuthorityLockPath(repositoryRoot))
29
+ .then(() => true)
30
+ .catch(() => false);
31
+ }
32
+ export async function withActiveAuthorityLock(repositoryRoot, operation, action) {
33
+ return withActiveAuthorityLockInternal(repositoryRoot, operation, action, false);
34
+ }
35
+ async function withActiveAuthorityLockInternal(repositoryRoot, operation, action, breakStaleLock) {
36
+ const root = path.resolve(repositoryRoot);
37
+ const activeFile = await activeRecordPath(root);
38
+ await mkdir(path.dirname(activeFile), { recursive: true });
39
+ const lockFile = await activeAuthorityLockPath(root);
40
+ let lock;
41
+ try {
42
+ lock = await open(lockFile, "wx");
43
+ }
44
+ catch (error) {
45
+ if (error.code === "EEXIST" && breakStaleLock) {
46
+ await rm(lockFile, { force: true });
47
+ try {
48
+ lock = await open(lockFile, "wx");
49
+ }
50
+ catch (retryError) {
51
+ if (retryError.code === "EEXIST")
52
+ throw new Error("active_authority_compare_and_swap_failed:lock_unavailable");
53
+ throw retryError;
54
+ }
55
+ }
56
+ else if (error.code === "EEXIST")
57
+ throw new Error("active_authority_compare_and_swap_failed:lock_unavailable");
58
+ else
59
+ throw error;
60
+ }
61
+ try {
62
+ await lock.writeFile(canonicalJson({
63
+ pid: process.pid,
64
+ operation,
65
+ created_at: new Date().toISOString(),
66
+ }), "utf8");
67
+ await lock.sync();
68
+ return await action();
69
+ }
70
+ finally {
71
+ await lock.close();
72
+ await rm(lockFile, { force: true });
73
+ }
74
+ }
75
+ export async function writeCompiledDeliveryContract(compiled) {
76
+ const staged = await stageCompiledDeliveryContract(compiled);
77
+ try {
78
+ await staged.publish();
79
+ }
80
+ catch (error) {
81
+ await staged.discard();
82
+ throw error;
83
+ }
84
+ }
85
+ export async function stageCompiledDeliveryContract(compiled) {
86
+ const target = runtimePath(compiled.workdir, COMPILED_FILE);
87
+ const temporary = await stageAtomicText(target, canonicalJson(compiled));
88
+ let consumed = false;
89
+ return {
90
+ async publish() {
91
+ if (consumed)
92
+ throw new Error("compiled_cache_stage_already_consumed");
93
+ await rename(temporary, target);
94
+ consumed = true;
95
+ },
96
+ async discard() {
97
+ if (consumed)
98
+ return;
99
+ consumed = true;
100
+ await rm(temporary, { force: true });
101
+ },
102
+ };
103
+ }
104
+ export async function readCompiledDeliveryContract(workdir) {
105
+ return validateCompiledDeliveryContract(await readJson(runtimePath(workdir, COMPILED_FILE)), path.resolve(workdir));
106
+ }
107
+ export async function loadActiveLongTaskAuthority(repositoryRoot, _options = {}) {
108
+ return loadActiveLongTaskAuthorityUnlocked(path.resolve(repositoryRoot));
109
+ }
110
+ async function loadActiveLongTaskAuthorityUnlocked(root) {
111
+ const identity = worktreeIdentity(root);
112
+ const [marker, raw] = await Promise.all([
113
+ gitConfigGet(root, markerKey(identity)),
114
+ readOptionalJson(await activeRecordPath(root)),
115
+ ]);
116
+ if (marker === null && raw === null)
117
+ return { authority: null, source: "none", migrated: false };
118
+ if (marker === null)
119
+ throw new Error("active_binding_marker_missing");
120
+ if (raw === null)
121
+ throw new Error("active_binding_record_missing");
122
+ const row = raw;
123
+ if (row.schema_version === "active-long-task-authority-v3")
124
+ return {
125
+ authority: await validateActiveAuthorityV3(root, identity, marker, row),
126
+ source: "active_authority_v3",
127
+ migrated: false,
128
+ };
129
+ if (row.schema_version === "active-long-task-binding-v2")
130
+ throw new Error("legacy_v2_active_authority_manual_required");
131
+ throw new Error("active_authority_invalid:schema_version");
132
+ }
133
+ export async function loadActiveCompiledAuthority(repositoryRoot, workdir, options = {}) {
134
+ const loaded = await loadActiveLongTaskAuthority(repositoryRoot, options);
135
+ if (!loaded.authority)
136
+ return null;
137
+ if (workdir &&
138
+ normalizePath(loaded.authority.workdir) !== normalizePath(workdir))
139
+ throw new Error("active_task_workdir_mismatch");
140
+ return loaded.authority.authority_snapshot;
141
+ }
142
+ export async function readActiveLongTaskBinding(repositoryRoot) {
143
+ return (await loadActiveLongTaskAuthority(repositoryRoot)).authority;
144
+ }
145
+ export async function inspectCompiledCache(authority) {
146
+ try {
147
+ const cache = await readCompiledDeliveryContract(authority.workdir);
148
+ return cache.compiled_identity === authority.active_authority_identity
149
+ ? "compiled_cache_matching"
150
+ : "compiled_cache_mismatched_ignored";
151
+ }
152
+ catch (error) {
153
+ return missingError(error)
154
+ ? "compiled_cache_missing_repairable"
155
+ : "compiled_cache_mismatched_ignored";
156
+ }
157
+ }
158
+ export async function commitActiveAuthority(options) {
159
+ const root = path.resolve(options.candidate.repository_root);
160
+ const initial = await loadActiveLongTaskAuthorityUnlocked(root);
161
+ const verifierDiff = initial.authority
162
+ ? verifierAuthorityDiff(initial.authority.verifier_identity, options.candidate.verifier_identity)
163
+ : null;
164
+ const operation = initial.authority &&
165
+ (verifierDiff?.verifier_content_changed ||
166
+ verifierDiff?.verifier_runtime_locator_changed)
167
+ ? "migrate"
168
+ : "commit";
169
+ return withActiveAuthorityLock(root, operation, async () => {
170
+ const current = await loadActiveLongTaskAuthorityUnlocked(root);
171
+ assertAuthorityCasCandidate(current.authority, options.candidate, options.expected_previous_identity);
172
+ await ensureRuntimeExcludes(root, options.candidate.workdir);
173
+ const authority = activeAuthorityFromCompiled(options.candidate, current.authority?.activated_at ?? new Date().toISOString());
174
+ await persistActiveAuthorityCasUnlocked(root, authority, options.expected_previous_identity);
175
+ return authority;
176
+ });
177
+ }
178
+ export async function activateDeliveryContract(compiled) {
179
+ const current = await loadActiveLongTaskAuthority(compiled.repository_root);
180
+ return commitActiveAuthority({
181
+ candidate: compiled,
182
+ expected_previous_identity: current.authority?.active_authority_identity ?? null,
183
+ });
184
+ }
185
+ export async function assertMatchingActiveBinding(compiled) {
186
+ const active = (await loadActiveLongTaskAuthority(compiled.repository_root, {
187
+ migrate_legacy: true,
188
+ })).authority;
189
+ if (!active)
190
+ throw new Error("active_task_missing");
191
+ if (normalizePath(active.workdir) !== normalizePath(compiled.workdir) ||
192
+ active.task_id !== compiled.task.id ||
193
+ active.active_authority_identity !== compiled.compiled_identity ||
194
+ active.authority_revision !== compiled.authority_revision ||
195
+ active.worktree_identity !== worktreeIdentity(compiled.repository_root) ||
196
+ !sameValue(active.verifier_identity, compiled.verifier_identity))
197
+ throw new Error("active_task_identity_mismatch");
198
+ return active;
199
+ }
200
+ async function validateActiveAuthorityV3(root, identity, marker, row) {
201
+ if (typeof row.task_id !== "string" ||
202
+ typeof row.repository_root !== "string" ||
203
+ typeof row.worktree_identity !== "string" ||
204
+ typeof row.workdir !== "string" ||
205
+ typeof row.active_authority_identity !== "string" ||
206
+ typeof row.authority_revision !== "number" ||
207
+ !Number.isInteger(row.authority_revision) ||
208
+ row.authority_revision < 1 ||
209
+ typeof row.activated_at !== "string" ||
210
+ typeof row.authority_snapshot_sha256 !== "string" ||
211
+ !row.initial_task_base ||
212
+ !row.verifier_identity ||
213
+ !row.authority_snapshot)
214
+ throw new Error("active_authority_invalid:shape");
215
+ const authority = row;
216
+ if (marker !== markerValue(authority))
217
+ throw new Error("marker_record_mismatch");
218
+ if (authority.worktree_identity !== identity)
219
+ throw new Error("active_authority_invalid:worktree_identity");
220
+ if (normalizePath(authority.repository_root) !== normalizePath(root))
221
+ throw new Error("active_authority_invalid:repository_identity");
222
+ const snapshot = validateCompiledDeliveryContract(authority.authority_snapshot, path.resolve(authority.workdir));
223
+ if (sha256Hex(canonicalValueJson(snapshot)) !==
224
+ authority.authority_snapshot_sha256)
225
+ throw new Error("active_authority_invalid:snapshot_hash");
226
+ if (authority.task_id !== snapshot.task.id ||
227
+ normalizePath(authority.repository_root) !==
228
+ normalizePath(snapshot.repository_root) ||
229
+ normalizePath(authority.workdir) !== normalizePath(snapshot.workdir) ||
230
+ authority.active_authority_identity !== snapshot.compiled_identity ||
231
+ authority.authority_revision !== snapshot.authority_revision ||
232
+ !sameValue(authority.initial_task_base, snapshot.initial_task_base) ||
233
+ !sameValue(authority.verifier_identity, snapshot.verifier_identity))
234
+ throw new Error("active_authority_invalid:snapshot_binding");
235
+ await assertActiveWorkdir(authority.workdir);
236
+ return authority;
237
+ }
238
+ function validateCompiledDeliveryContract(value, expectedWorkdir) {
239
+ if (!value || typeof value !== "object" || Array.isArray(value))
240
+ throw new Error("compiled_contract_invalid:shape");
241
+ const compiled = value;
242
+ if (compiled.schema_version !== "compiled-long-task-delivery-v2" ||
243
+ typeof compiled.compiled_identity !== "string" ||
244
+ typeof compiled.repository_root !== "string" ||
245
+ typeof compiled.workdir !== "string")
246
+ throw new Error("compiled_contract_invalid:schema_version");
247
+ const { compiled_identity: compiledIdentity, ...unsigned } = compiled;
248
+ if (sha256Hex(canonicalValueJson(unsigned)) !== compiledIdentity)
249
+ throw new Error("compiled_contract_invalid:identity");
250
+ if (expectedWorkdir &&
251
+ normalizePath(expectedWorkdir) !== normalizePath(compiled.workdir))
252
+ throw new Error("compiled_contract_invalid:workdir");
253
+ return compiled;
254
+ }
255
+ function activeAuthorityFromCompiled(compiled, activatedAt) {
256
+ const authoritySnapshot = validateCompiledDeliveryContract(compiled, compiled.workdir);
257
+ return {
258
+ schema_version: "active-long-task-authority-v3",
259
+ task_id: authoritySnapshot.task.id,
260
+ repository_root: path.resolve(authoritySnapshot.repository_root),
261
+ worktree_identity: worktreeIdentity(authoritySnapshot.repository_root),
262
+ workdir: path.resolve(authoritySnapshot.workdir),
263
+ active_authority_identity: authoritySnapshot.compiled_identity,
264
+ authority_revision: authoritySnapshot.authority_revision,
265
+ initial_task_base: authoritySnapshot.initial_task_base,
266
+ verifier_identity: authoritySnapshot.verifier_identity,
267
+ activated_at: activatedAt,
268
+ authority_snapshot: authoritySnapshot,
269
+ authority_snapshot_sha256: sha256Hex(canonicalValueJson(authoritySnapshot)),
270
+ };
271
+ }
272
+ function assertAuthorityCasCandidate(current, candidate, expectedPreviousIdentity) {
273
+ const currentIdentity = current?.active_authority_identity ?? null;
274
+ if (currentIdentity !== expectedPreviousIdentity)
275
+ throw new Error("active_authority_compare_and_swap_failed");
276
+ if (!current) {
277
+ if (candidate.authority_revision !== 1)
278
+ throw new Error("active_authority_revision_invalid:new_task");
279
+ return;
280
+ }
281
+ if (normalizePath(current.workdir) !== normalizePath(candidate.workdir) ||
282
+ current.task_id !== candidate.task.id)
283
+ throw new Error(`active_task_exists:${current.workdir}`);
284
+ if (!sameValue(current.initial_task_base, candidate.initial_task_base))
285
+ throw new Error("active_authority_initial_task_base_changed");
286
+ if (currentIdentity === candidate.compiled_identity) {
287
+ if (candidate.authority_revision !== current.authority_revision)
288
+ throw new Error("active_authority_revision_invalid:unchanged_identity");
289
+ return;
290
+ }
291
+ if (candidate.authority_revision !== current.authority_revision + 1)
292
+ throw new Error("active_authority_revision_invalid:expected_increment");
293
+ }
294
+ async function persistActiveAuthorityCasUnlocked(root, authority, expectedPreviousIdentity) {
295
+ const activeFile = await activeRecordPath(root);
296
+ await mkdir(path.dirname(activeFile), { recursive: true });
297
+ const current = await loadActiveLongTaskAuthorityUnlocked(root);
298
+ assertAuthorityCasCandidate(current.authority, authority.authority_snapshot, expectedPreviousIdentity);
299
+ const identity = worktreeIdentity(root);
300
+ const key = markerKey(identity);
301
+ const [oldRecord, oldMarker] = await Promise.all([
302
+ readOptionalText(activeFile),
303
+ gitConfigGet(root, key),
304
+ ]);
305
+ try {
306
+ await atomicJson(activeFile, authority);
307
+ await gitConfigSet(root, key, markerValue(authority));
308
+ }
309
+ catch (error) {
310
+ try {
311
+ if (oldRecord === null)
312
+ await rm(activeFile, { force: true });
313
+ else
314
+ await atomicText(activeFile, oldRecord);
315
+ if (oldMarker === null)
316
+ await gitConfigUnset(root, key);
317
+ else
318
+ await gitConfigSet(root, key, oldMarker);
319
+ }
320
+ catch (rollbackError) {
321
+ throw new Error(`active_authority_commit_rollback_failed:${message(rollbackError)}`);
322
+ }
323
+ throw new Error(`active_authority_commit_failed:${message(error)}`);
324
+ }
325
+ }
326
+ async function assertActiveWorkdir(workdir) {
327
+ await access(workdir).catch(() => {
328
+ throw new Error("active_binding_workdir_missing");
329
+ });
330
+ await access(path.join(workdir, CONTRACT_FILE)).catch(() => {
331
+ throw new Error("active_binding_contract_missing");
332
+ });
333
+ }
334
+ function markerValue(authority) {
335
+ return [
336
+ authority.task_id,
337
+ String(authority.authority_revision),
338
+ authority.active_authority_identity,
339
+ ].join("|");
340
+ }
341
+ function sameValue(left, right) {
342
+ return canonicalValueJson(left) === canonicalValueJson(right);
343
+ }
344
+ export async function writeProgressRecord(workdir, record) {
345
+ await atomicJson(runtimePath(workdir, path.join(PROGRESS_FOLDER, `${record.check_internal_id}.json`)), record);
346
+ }
347
+ export async function readProgressRecords(workdir) {
348
+ const folder = runtimePath(workdir, PROGRESS_FOLDER);
349
+ const names = await readdir(folder).catch((error) => {
350
+ if (error.code === "ENOENT")
351
+ return [];
352
+ throw error;
353
+ });
354
+ const rows = {};
355
+ for (const name of names.filter((name) => name.endsWith(".json")).sort()) {
356
+ const value = (await readJson(path.join(folder, name)));
357
+ if (value.schema_version !== "long-task-progress-record-v2")
358
+ throw new Error(`progress_record_invalid:${name}`);
359
+ rows[value.check_internal_id] = value;
360
+ }
361
+ return rows;
362
+ }
363
+ export async function writePendingAuthorityRevision(workdir, pending) {
364
+ await atomicJson(runtimePath(workdir, AUTHORITY_PENDING_FILE), pending);
365
+ await rm(runtimePath(workdir, AUTHORITY_APPROVED_FILE), { force: true });
366
+ }
367
+ export async function readPendingAuthorityRevision(workdir) {
368
+ return (await readOptionalJson(runtimePath(workdir, AUTHORITY_PENDING_FILE)));
369
+ }
370
+ export async function approvePendingAuthorityRevision(workdir, revision) {
371
+ const pending = await readPendingAuthorityRevision(workdir);
372
+ if (!pending || pending.revision_identity !== revision)
373
+ throw new Error("authority_revision_not_found_or_mismatched");
374
+ await atomicJson(runtimePath(workdir, AUTHORITY_APPROVED_FILE), {
375
+ schema_version: "long-task-authority-revision-approved-v2",
376
+ revision_identity: revision,
377
+ approved_at: new Date().toISOString(),
378
+ });
379
+ }
380
+ export async function authorityRevisionApproved(workdir, revision) {
381
+ const value = (await readOptionalJson(runtimePath(workdir, AUTHORITY_APPROVED_FILE)));
382
+ return value?.revision_identity === revision;
383
+ }
384
+ export async function clearAuthorityRevision(workdir) {
385
+ await Promise.all([
386
+ rm(runtimePath(workdir, AUTHORITY_PENDING_FILE), { force: true }),
387
+ rm(runtimePath(workdir, AUTHORITY_APPROVED_FILE), { force: true }),
388
+ ]);
389
+ }
390
+ export async function invalidateDerivedProgress(workdir) {
391
+ await Promise.all([
392
+ rm(runtimePath(workdir, PROGRESS_FOLDER), { recursive: true, force: true }),
393
+ rm(runtimePath(workdir, FINAL_FILE), { force: true }),
394
+ ]);
395
+ }
396
+ export async function writeFinalReceipt(repositoryRoot, workdir, unsigned) {
397
+ const receipt = {
398
+ ...unsigned,
399
+ receipt_sha256: sha256Hex(canonicalValueJson(unsigned)),
400
+ };
401
+ const content = canonicalJson(receipt);
402
+ await Promise.all([
403
+ atomicText(runtimePath(workdir, FINAL_FILE), content),
404
+ atomicText(await auditReceiptPath(repositoryRoot), content),
405
+ ]);
406
+ return receipt;
407
+ }
408
+ export async function readFinalReceipt(_repositoryRoot, workdir) {
409
+ const value = await readOptionalJson(runtimePath(workdir, FINAL_FILE));
410
+ if (value === null)
411
+ return null;
412
+ const receipt = value;
413
+ const { receipt_sha256: receiptHash, ...unsigned } = receipt;
414
+ if (receipt.schema_version !== "long-task-final-receipt-v2" ||
415
+ receipt.authority_scope !== "audit_only" ||
416
+ receipt.reusable_for_acceptance !== false ||
417
+ sha256Hex(canonicalValueJson(unsigned)) !== receiptHash)
418
+ throw new Error("final_receipt_integrity_mismatch");
419
+ return receipt;
420
+ }
421
+ export function activeAuthorityIdentityMatches(authority, expected) {
422
+ return (authority.task_id === expected.task_id &&
423
+ authority.authority_revision === expected.authority_revision &&
424
+ authority.active_authority_identity === expected.compiled_identity &&
425
+ authority.worktree_identity ===
426
+ (expected.worktree_identity ?? authority.worktree_identity));
427
+ }
428
+ export async function clearActiveBindingCas(options) {
429
+ const root = path.resolve(options.repository_root);
430
+ return withActiveAuthorityLock(root, "clear", async () => clearActiveBindingCasUnlocked(root, options));
431
+ }
432
+ async function clearActiveBindingCasUnlocked(root, options) {
433
+ const loaded = await loadActiveLongTaskAuthorityUnlocked(root);
434
+ const active = loaded.authority;
435
+ if (!active ||
436
+ normalizePath(active.workdir) !== normalizePath(options.workdir) ||
437
+ !activeAuthorityIdentityMatches(active, options))
438
+ throw new Error("active_authority_clear_compare_and_swap_failed");
439
+ const activeFile = await activeRecordPath(root);
440
+ const key = markerKey(worktreeIdentity(root));
441
+ const [oldRecord, oldMarker] = await Promise.all([
442
+ readOptionalText(activeFile),
443
+ gitConfigGet(root, key),
444
+ ]);
445
+ try {
446
+ await rm(activeFile, { force: true });
447
+ await gitConfigUnset(root, key);
448
+ }
449
+ catch (error) {
450
+ try {
451
+ if (oldRecord !== null)
452
+ await atomicText(activeFile, oldRecord);
453
+ if (oldMarker !== null)
454
+ await gitConfigSet(root, key, oldMarker);
455
+ }
456
+ catch (rollbackError) {
457
+ throw new Error(`active_authority_clear_rollback_failed:${message(rollbackError)}`);
458
+ }
459
+ throw new Error(`active_authority_clear_failed:${message(error)}`);
460
+ }
461
+ return true;
462
+ }
463
+ export async function abandonLongTaskState(repositoryRoot, workdir) {
464
+ const root = path.resolve(repositoryRoot);
465
+ const resolved = assertContainedWorkdir(root, workdir);
466
+ await withActiveAuthorityLock(root, "abandon", async () => {
467
+ const loaded = await loadActiveLongTaskAuthorityUnlocked(root);
468
+ const active = loaded.authority;
469
+ if (!active)
470
+ throw new Error("active_task_missing");
471
+ if (normalizePath(active.workdir) !== normalizePath(resolved))
472
+ throw new Error("active_task_workdir_mismatch");
473
+ await clearActiveBindingCasUnlocked(root, {
474
+ repository_root: root,
475
+ workdir: resolved,
476
+ task_id: active.task_id,
477
+ authority_revision: active.authority_revision,
478
+ compiled_identity: active.active_authority_identity,
479
+ worktree_identity: active.worktree_identity,
480
+ });
481
+ await rm(runtimePath(resolved), { recursive: true, force: true });
482
+ });
483
+ }
484
+ export async function forceClearCorruptActiveState(repositoryRoot, workdir) {
485
+ const root = path.resolve(repositoryRoot);
486
+ const resolved = assertContainedWorkdir(root, workdir);
487
+ const lockPresent = await activeAuthorityLockExists(root);
488
+ let corruptState = lockPresent;
489
+ if (!corruptState)
490
+ try {
491
+ await loadActiveLongTaskAuthorityUnlocked(root);
492
+ corruptState = false;
493
+ }
494
+ catch {
495
+ corruptState = true;
496
+ }
497
+ if (!corruptState)
498
+ throw new Error("force_corrupt_state_requires_corrupt_active_state");
499
+ await withActiveAuthorityLockInternal(root, "abandon", async () => {
500
+ const activeFile = await activeRecordPath(root);
501
+ const key = markerKey(worktreeIdentity(root));
502
+ const [oldRecord, oldMarker] = await Promise.all([
503
+ readOptionalText(activeFile),
504
+ gitConfigGet(root, key),
505
+ ]);
506
+ try {
507
+ await rm(activeFile, { force: true });
508
+ await gitConfigUnset(root, key);
509
+ }
510
+ catch (error) {
511
+ try {
512
+ if (oldRecord !== null)
513
+ await atomicText(activeFile, oldRecord);
514
+ if (oldMarker !== null)
515
+ await gitConfigSet(root, key, oldMarker);
516
+ }
517
+ catch (rollbackError) {
518
+ throw new Error(`active_authority_force_clear_rollback_failed:${message(rollbackError)}`);
519
+ }
520
+ throw new Error(`active_authority_force_clear_failed:${message(error)}`);
521
+ }
522
+ await rm(runtimePath(resolved), { recursive: true, force: true });
523
+ }, true);
524
+ }
525
+ export async function clearFinalReceipt(repositoryRoot, workdir) {
526
+ await Promise.all([
527
+ rm(runtimePath(workdir, FINAL_FILE), { force: true }),
528
+ rm(await auditReceiptPath(repositoryRoot), { force: true }),
529
+ ]);
530
+ }
531
+ async function auditReceiptPath(repositoryRoot) {
532
+ return path.join(path.dirname(await activeRecordPath(repositoryRoot)), "last-final-receipt.json");
533
+ }
534
+ async function ensureRuntimeExcludes(repositoryRoot, workdir) {
535
+ const exclude = await gitPath(repositoryRoot, "info/exclude");
536
+ await mkdir(path.dirname(exclude), { recursive: true });
537
+ const existing = await readFile(exclude, "utf8").catch(() => "");
538
+ const relativeRuntime = `${path
539
+ .relative(repositoryRoot, runtimePath(workdir))
540
+ .replace(/\\/gu, "/")}/`;
541
+ if (!existing.split(/\r?\n/u).includes(relativeRuntime))
542
+ await writeFile(exclude, `${existing.replace(/\s*$/u, "")}\n${relativeRuntime}\n`, "utf8");
543
+ }
544
+ function markerKey(identity) {
545
+ return `ty-context.longTask.${identity}`;
546
+ }
547
+ function normalizePath(value) {
548
+ const normalized = path.resolve(value).replace(/\\/gu, "/");
549
+ return process.platform === "win32" ? normalized.toLowerCase() : normalized;
550
+ }
551
+ function assertContainedWorkdir(repositoryRoot, workdir) {
552
+ const root = path.resolve(repositoryRoot);
553
+ const resolved = path.resolve(workdir);
554
+ const relative = path.relative(root, resolved);
555
+ if (!relative ||
556
+ relative === ".." ||
557
+ relative.startsWith(`..${path.sep}`) ||
558
+ path.isAbsolute(relative))
559
+ throw new Error("long_task_workdir_outside_repository");
560
+ return resolved;
561
+ }
562
+ async function readJson(file) {
563
+ return JSON.parse(await readFile(file, "utf8"));
564
+ }
565
+ async function readOptionalJson(file) {
566
+ try {
567
+ return await readJson(file);
568
+ }
569
+ catch (error) {
570
+ if (error.code === "ENOENT")
571
+ return null;
572
+ throw error;
573
+ }
574
+ }
575
+ async function readOptionalText(file) {
576
+ try {
577
+ return await readFile(file, "utf8");
578
+ }
579
+ catch (error) {
580
+ if (error.code === "ENOENT")
581
+ return null;
582
+ throw error;
583
+ }
584
+ }
585
+ async function atomicJson(file, value) {
586
+ await atomicText(file, canonicalJson(value));
587
+ }
588
+ async function atomicText(file, content) {
589
+ const temporary = await stageAtomicText(file, content);
590
+ await rename(temporary, file);
591
+ }
592
+ async function stageAtomicText(file, content) {
593
+ await mkdir(path.dirname(file), { recursive: true });
594
+ const temporary = `${file}.tmp-${process.pid}-${Date.now()}`;
595
+ const handle = await open(temporary, "wx");
596
+ try {
597
+ await handle.writeFile(content, "utf8");
598
+ await handle.sync();
599
+ }
600
+ finally {
601
+ await handle.close();
602
+ }
603
+ return temporary;
604
+ }
605
+ function missingError(error) {
606
+ const value = message(error);
607
+ return value.includes("ENOENT") || value.includes("no such file");
608
+ }
609
+ function message(error) {
610
+ return error instanceof Error ? error.message : String(error);
611
+ }
@@ -0,0 +1,21 @@
1
+ import type { CompiledDeliveryContractV2, FinalReceiptV2, LongTaskFindingV2, OutcomeStatusV2, ProgressRecordV2, WorkspaceManifestV2 } from "./long-task-delivery-types.js";
2
+ interface StatusProjectionInputV2 {
3
+ compiled: CompiledDeliveryContractV2;
4
+ manifest: WorkspaceManifestV2;
5
+ stale: string[];
6
+ progress: Record<string, ProgressRecordV2>;
7
+ receipt: FinalReceiptV2 | null;
8
+ receiptError: string | null;
9
+ }
10
+ export type AuditGateStatusV2 = "no_final_gate" | "last_gate_passed" | "last_gate_failed" | "last_gate_blocked" | "last_gate_inputs_stale";
11
+ export declare function projectDeliveryStatus(input: StatusProjectionInputV2): {
12
+ finalResult: AuditGateStatusV2;
13
+ finalWorkflowStatus: FinalReceiptV2["workflow_status"] | null;
14
+ outcomes: Record<string, OutcomeStatusV2>;
15
+ readyOutcomes: string[];
16
+ needsReverify: string[];
17
+ progressPassing: string[];
18
+ progressFailing: string[];
19
+ findings: LongTaskFindingV2[];
20
+ };
21
+ export {};