project-tiny-context-harness 0.2.85 → 0.6.1

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 +164 -427
  2. package/assets/README.md +284 -455
  3. package/assets/README.zh-CN.md +200 -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 +63 -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 +467 -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,13 @@
1
+ import type { HarnessConfig, HarnessProfile } from "./types.js";
2
+ export declare const HARNESS_PROFILES: readonly HarnessProfile[];
3
+ export declare function isProfileEnabled(config: HarnessConfig, profile: HarnessProfile): boolean;
4
+ export declare function assertHarnessProfileEnabled(projectRoot: string, profile: HarnessProfile): Promise<void>;
5
+ export declare function enableHarnessProfile(projectRoot: string, profile: string): Promise<{
6
+ changed: boolean;
7
+ config: HarnessConfig;
8
+ }>;
9
+ export declare function disableHarnessProfile(projectRoot: string, profile: string): Promise<{
10
+ changed: boolean;
11
+ config: HarnessConfig;
12
+ }>;
13
+ export declare function enabledManagedSkillNames(config: HarnessConfig): Set<string>;
@@ -0,0 +1,66 @@
1
+ import path from "node:path";
2
+ import { readConfig, writeConfigIfMissing } from "./config.js";
3
+ import { harnessConfigPath } from "./harness-root.js";
4
+ import { readText, writeTextIfChanged } from "./fs.js";
5
+ import { parseYaml, stringifyYaml } from "./yaml.js";
6
+ export const HARNESS_PROFILES = [
7
+ "core-portable",
8
+ "workflow-default",
9
+ "long-task",
10
+ ];
11
+ export function isProfileEnabled(config, profile) {
12
+ return config.profiles.enabled.includes(profile);
13
+ }
14
+ export async function assertHarnessProfileEnabled(projectRoot, profile) {
15
+ const config = await readConfig(projectRoot);
16
+ if (!isProfileEnabled(config, profile)) {
17
+ throw new Error(`profile ${profile} is not enabled; run: ty-context enable ${profile}`);
18
+ }
19
+ }
20
+ export async function enableHarnessProfile(projectRoot, profile) {
21
+ if (!HARNESS_PROFILES.includes(profile)) {
22
+ throw new Error(`unknown profile ${profile}; expected one of ${HARNESS_PROFILES.join(", ")}`);
23
+ }
24
+ await writeConfigIfMissing(projectRoot);
25
+ const relative = await harnessConfigPath(projectRoot);
26
+ const file = path.join(projectRoot, relative);
27
+ const raw = parseYaml(await readText(file));
28
+ const existing = await readConfig(projectRoot);
29
+ const enabled = [
30
+ ...new Set([...existing.profiles.enabled, profile]),
31
+ ];
32
+ const next = { ...raw, profiles: { enabled } };
33
+ const changed = await writeTextIfChanged(file, stringifyYaml(next));
34
+ return { changed, config: await readConfig(projectRoot) };
35
+ }
36
+ export async function disableHarnessProfile(projectRoot, profile) {
37
+ if (profile !== "long-task") {
38
+ throw new Error("only long-task can be explicitly disabled");
39
+ }
40
+ await writeConfigIfMissing(projectRoot);
41
+ const relative = await harnessConfigPath(projectRoot);
42
+ const file = path.join(projectRoot, relative);
43
+ const raw = parseYaml(await readText(file));
44
+ const existing = await readConfig(projectRoot);
45
+ const enabled = existing.profiles.enabled.filter((item) => item !== profile);
46
+ const next = { ...raw, profiles: { enabled } };
47
+ const changed = await writeTextIfChanged(file, stringifyYaml(next));
48
+ return { changed, config: await readConfig(projectRoot) };
49
+ }
50
+ export function enabledManagedSkillNames(config) {
51
+ const names = new Set([
52
+ "context_development_engineer",
53
+ "context_full_project_export",
54
+ "context_harness_upgrade",
55
+ "context_product_plan",
56
+ "context_surface_contract",
57
+ "context_uiux_design",
58
+ ]);
59
+ if (isProfileEnabled(config, "workflow-default"))
60
+ names.add("normal-long-task");
61
+ if (isProfileEnabled(config, "long-task")) {
62
+ names.add("long-task-workflow");
63
+ names.add("source-plan-authoring");
64
+ }
65
+ return names;
66
+ }
@@ -10,13 +10,15 @@ export async function assertSupportedSchema(projectRoot, commandName) {
10
10
  export function unsupportedSchemaMessage(schemaVersion, commandName) {
11
11
  const projectMajor = schemaMajor(schemaVersion);
12
12
  const supportedMajor = schemaMajor(CURRENT_SCHEMA_VERSION);
13
- if (projectMajor === undefined || supportedMajor === undefined || projectMajor <= supportedMajor) {
13
+ if (projectMajor === undefined ||
14
+ supportedMajor === undefined ||
15
+ projectMajor <= supportedMajor) {
14
16
  return undefined;
15
17
  }
16
18
  return [
17
19
  `unsupported Harness schema version ${schemaVersion}; this CLI supports schema ${CURRENT_SCHEMA_VERSION}`,
18
20
  `Refusing to run ${commandName} because older CLI versions must not rewrite newer projects`,
19
- `Use the canonical latest CLI: ${CANONICAL_NPX_COMMAND} ${commandName}`
21
+ `Use the canonical latest CLI: ${CANONICAL_NPX_COMMAND} ${commandName}`,
20
22
  ].join(". ");
21
23
  }
22
24
  export function schemaMajor(schemaVersion) {
@@ -23,9 +23,15 @@ const EXCLUDED_DIR_NAMES = new Set([
23
23
  "temp",
24
24
  "test-reports",
25
25
  "test-results",
26
- "tmp"
26
+ "tmp",
27
+ ]);
28
+ export const SAFE_EXAMPLE_FILE_NAMES = new Set([
29
+ ".env.example",
30
+ ".env.sample",
31
+ ".env.template",
32
+ "example.env",
33
+ "sample.env",
27
34
  ]);
28
- export const SAFE_EXAMPLE_FILE_NAMES = new Set([".env.example", ".env.sample", ".env.template", "example.env", "sample.env"]);
29
35
  const EXCLUDED_FILE_PATTERNS = [
30
36
  /^\.env(?:\.|$)/i,
31
37
  /\.log$/i,
@@ -36,7 +42,7 @@ const EXCLUDED_FILE_PATTERNS = [
36
42
  /full-project-context-\d{8}T\d{6}Z\.md$/i,
37
43
  /当前项目context-\d{8}T\d{6}Z\.md$/i,
38
44
  /当前项目代码实现\.md$/i,
39
- /(^|[-_.])(code-level-implementation|context-export|context-bundle)([-_.]|$)/i
45
+ /(^|[-_.])(code-level-implementation|context-export|context-bundle)([-_.]|$)/i,
40
46
  ];
41
47
  const CODE_FILE_EXTENSIONS = [
42
48
  ".bat",
@@ -59,7 +65,7 @@ const CODE_FILE_EXTENSIONS = [
59
65
  ".tsx",
60
66
  ".vue",
61
67
  ".yaml",
62
- ".yml"
68
+ ".yml",
63
69
  ];
64
70
  const CODE_FILE_BASE_NAMES = new Set([
65
71
  ".env.example",
@@ -71,7 +77,7 @@ const CODE_FILE_BASE_NAMES = new Set([
71
77
  "pyproject.toml",
72
78
  "requirements.txt",
73
79
  "setup.cfg",
74
- "tsconfig.json"
80
+ "tsconfig.json",
75
81
  ]);
76
82
  const CONFIG_JSON_NAMES = new Set([
77
83
  "babel.config.json",
@@ -82,7 +88,7 @@ const CONFIG_JSON_NAMES = new Set([
82
88
  "jsconfig.json",
83
89
  "package.json",
84
90
  "tsconfig.json",
85
- "vite.config.json"
91
+ "vite.config.json",
86
92
  ]);
87
93
  export function shouldIncludeCodeFile(relative) {
88
94
  if (shouldExcludeRelativePath(relative)) {
@@ -111,7 +117,8 @@ export function shouldExcludeRelativePath(relative) {
111
117
  const base = segments[segments.length - 1] ?? "";
112
118
  const lowerBase = base.toLowerCase();
113
119
  return EXCLUDED_FILE_PATTERNS.some((pattern) => {
114
- if (SAFE_EXAMPLE_FILE_NAMES.has(lowerBase) && pattern.source.startsWith("^\\.env")) {
120
+ if (SAFE_EXAMPLE_FILE_NAMES.has(lowerBase) &&
121
+ pattern.source.startsWith("^\\.env")) {
115
122
  return false;
116
123
  }
117
124
  return pattern.test(base) || pattern.test(normalized);
@@ -12,7 +12,7 @@ export function classifyCodeFile(relative, content, areas) {
12
12
  tags,
13
13
  routes,
14
14
  score: scoreFor(tags, relative),
15
- bucket: routingBucket(relative, areas)
15
+ bucket: routingBucket(relative, areas),
16
16
  };
17
17
  }
18
18
  function tagsFor(relative, content, language, routes) {
@@ -27,7 +27,8 @@ function tagsFor(relative, content, language, routes) {
27
27
  tags.add("cli");
28
28
  if (/worker|scheduler|queue|runtime|cron|job/.test(lower))
29
29
  tags.add("worker");
30
- if (/schema|contract|types?\.|\.d\.ts$/.test(lower) || /\b(interface|type|schema)\b/.test(content))
30
+ if (/schema|contract|types?\.|\.d\.ts$/.test(lower) ||
31
+ /\b(interface|type|schema)\b/.test(content))
31
32
  tags.add("contract");
32
33
  if (/pages|views|screens|components|\.vue$|\.tsx$|\.jsx$/.test(lower))
33
34
  tags.add("ui");
@@ -40,12 +41,25 @@ function tagsFor(relative, content, language, routes) {
40
41
  return [...tags].sort();
41
42
  }
42
43
  function scoreFor(tags, relative) {
43
- const weights = { entry: 50, api: 35, cli: 32, worker: 30, contract: 28, ui: 24, test: 18, config: 12, oversized: -15 };
44
- return tags.reduce((sum, tag) => sum + (weights[tag] ?? 0), 0) + Math.max(0, 20 - relative.split("/").length);
44
+ const weights = {
45
+ entry: 50,
46
+ api: 35,
47
+ cli: 32,
48
+ worker: 30,
49
+ contract: 28,
50
+ ui: 24,
51
+ test: 18,
52
+ config: 12,
53
+ oversized: -15,
54
+ };
55
+ return (tags.reduce((sum, tag) => sum + (weights[tag] ?? 0), 0) +
56
+ Math.max(0, 20 - relative.split("/").length));
45
57
  }
46
58
  function routingBucket(relative, areas) {
47
59
  for (const area of areas) {
48
- if (area.root === "." || relative === area.root || relative.startsWith(`${area.root}/`)) {
60
+ if (area.root === "." ||
61
+ relative === area.root ||
62
+ relative.startsWith(`${area.root}/`)) {
49
63
  return `area:${area.id}`;
50
64
  }
51
65
  }
@@ -62,11 +76,17 @@ function summarizeCodeFile(relative, content, language) {
62
76
  const symbols = extractSymbolSummary(content, language);
63
77
  if (base === "package.json") {
64
78
  const packageName = /"name"\s*:\s*"([^"]+)"/.exec(content)?.[1];
65
- return packageName ? `Defines npm package ${packageName} metadata, scripts and dependencies.` : "Defines npm package metadata, scripts and dependencies.";
79
+ return packageName
80
+ ? `Defines npm package ${packageName} metadata, scripts and dependencies.`
81
+ : "Defines npm package metadata, scripts and dependencies.";
66
82
  }
67
83
  if (base.toLowerCase() === "makefile") {
68
- const targets = [...content.matchAll(/^([A-Za-z0-9_.-]+):/gm)].map((match) => match[1]).slice(0, 6);
69
- return targets.length > 0 ? `Defines Make targets ${targets.join(", ")}.` : "Defines Make targets for local automation.";
84
+ const targets = [...content.matchAll(/^([A-Za-z0-9_.-]+):/gm)]
85
+ .map((match) => match[1])
86
+ .slice(0, 6);
87
+ return targets.length > 0
88
+ ? `Defines Make targets ${targets.join(", ")}.`
89
+ : "Defines Make targets for local automation.";
70
90
  }
71
91
  if (symbols.length > 0) {
72
92
  return `${describeFilePurpose(relative, language)}; exposes ${symbols.slice(0, 6).join(", ")}.`;
@@ -75,15 +95,21 @@ function summarizeCodeFile(relative, content, language) {
75
95
  }
76
96
  function extractSymbolSummary(content, language) {
77
97
  const patterns = language === "python"
78
- ? [/^(?:async\s+)?def\s+([A-Za-z_][\w]*)/gm, /^class\s+([A-Za-z_][\w]*)/gm]
98
+ ? [
99
+ /^(?:async\s+)?def\s+([A-Za-z_][\w]*)/gm,
100
+ /^class\s+([A-Za-z_][\w]*)/gm,
101
+ ]
79
102
  : language === "go"
80
- ? [/^func\s+(?:\([^)]+\)\s*)?([A-Za-z_][\w]*)/gm, /^type\s+([A-Za-z_][\w]*)/gm]
103
+ ? [
104
+ /^func\s+(?:\([^)]+\)\s*)?([A-Za-z_][\w]*)/gm,
105
+ /^type\s+([A-Za-z_][\w]*)/gm,
106
+ ]
81
107
  : [
82
108
  /(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/g,
83
109
  /(?:export\s+)?class\s+([A-Za-z_$][\w$]*)/g,
84
110
  /(?:export\s+)?interface\s+([A-Za-z_$][\w$]*)/g,
85
111
  /(?:export\s+)?type\s+([A-Za-z_$][\w$]*)/g,
86
- /(?:export\s+)?const\s+([A-Za-z_$][\w$]*)/g
112
+ /(?:export\s+)?const\s+([A-Za-z_$][\w$]*)/g,
87
113
  ];
88
114
  const symbols = new Set();
89
115
  for (const pattern of patterns) {
@@ -99,42 +125,88 @@ function extractSymbolSummary(content, language) {
99
125
  }
100
126
  function extractRouteSummary(content) {
101
127
  const routes = new Set();
102
- const patterns = [/\.(get|post|put|patch|delete|head|options)\s*\(\s*["'`]([^"'`]+)["'`]/gi, /\bHandle(?:Func)?\s*\(\s*["'`]([^"'`]+)["'`]/g];
128
+ const patterns = [
129
+ /\.(get|post|put|patch|delete|head|options)\s*\(\s*["'`]([^"'`]+)["'`]/gi,
130
+ /\bHandle(?:Func)?\s*\(\s*["'`]([^"'`]+)["'`]/g,
131
+ ];
103
132
  for (const pattern of patterns) {
104
133
  let match;
105
134
  while ((match = pattern.exec(content)) && routes.size < 8) {
106
- routes.add(match.length === 3 ? `${match[1].toUpperCase()} ${match[2]}` : `route ${match[1]}`);
135
+ routes.add(match.length === 3
136
+ ? `${match[1].toUpperCase()} ${match[2]}`
137
+ : `route ${match[1]}`);
107
138
  }
108
139
  }
109
140
  return [...routes].sort();
110
141
  }
111
142
  function describeFilePurpose(relative, language) {
112
143
  const lower = relative.toLowerCase();
113
- if (lower.includes("/test") || lower.includes(".test.") || lower.includes(".spec."))
144
+ if (lower.includes("/test") ||
145
+ lower.includes(".test.") ||
146
+ lower.includes(".spec."))
114
147
  return `Contains ${language} tests for ${path.posix.basename(relative)}`;
115
148
  if (lower.includes("/commands/"))
116
149
  return `Implements ${language} command handling for ${path.posix.basename(relative)}`;
117
- if (lower.includes("/cli") || lower.endsWith("/cli.ts") || lower.endsWith("/cli.js"))
150
+ if (lower.includes("/cli") ||
151
+ lower.endsWith("/cli.ts") ||
152
+ lower.endsWith("/cli.js"))
118
153
  return `Implements ${language} CLI behavior for ${path.posix.basename(relative)}`;
119
- if (lower.includes("/components/") || lower.includes("/pages/") || lower.includes("/views/"))
154
+ if (lower.includes("/components/") ||
155
+ lower.includes("/pages/") ||
156
+ lower.includes("/views/"))
120
157
  return `Implements ${language} UI behavior for ${path.posix.basename(relative)}`;
121
158
  return `Contains ${language} implementation for ${path.posix.basename(relative)}`;
122
159
  }
123
160
  function isLikelyEntrypoint(relative) {
124
161
  const lower = relative.toLowerCase();
125
162
  const base = path.posix.basename(lower);
126
- return ["package.json", "makefile", "dockerfile", "main.go", "app.py", "server.py", "index.ts", "index.js", "cli.ts", "cli.js"].includes(base) || /\/src\/(main|app|index)\.[tj]sx?$/.test(lower);
163
+ return ([
164
+ "package.json",
165
+ "makefile",
166
+ "dockerfile",
167
+ "main.go",
168
+ "app.py",
169
+ "server.py",
170
+ "index.ts",
171
+ "index.js",
172
+ "cli.ts",
173
+ "cli.js",
174
+ ].includes(base) || /\/src\/(main|app|index)\.[tj]sx?$/.test(lower));
127
175
  }
128
176
  function languageFor(relative) {
129
177
  const lower = relative.toLowerCase();
130
178
  const base = path.posix.basename(lower);
131
179
  if (base === "makefile")
132
180
  return "make";
133
- if (base === "dockerfile" || base.startsWith("dockerfile.") || lower.endsWith(".dockerfile"))
181
+ if (base === "dockerfile" ||
182
+ base.startsWith("dockerfile.") ||
183
+ lower.endsWith(".dockerfile"))
134
184
  return "dockerfile";
135
185
  if (SAFE_EXAMPLE_FILE_NAMES.has(base))
136
186
  return "dotenv";
137
- for (const [extension, language] of [[".tsx", "tsx"], [".ts", "typescript"], [".jsx", "jsx"], [".js", "javascript"], [".mjs", "javascript"], [".py", "python"], [".go", "go"], [".vue", "vue"], [".sql", "sql"], [".json", "json"], [".jsonc", "jsonc"], [".yaml", "yaml"], [".yml", "yaml"], [".toml", "toml"], [".sh", "bash"], [".ps1", "powershell"], [".cmd", "batch"], [".bat", "batch"], [".graphql", "graphql"], [".gql", "graphql"], [".proto", "protobuf"]]) {
187
+ for (const [extension, language] of [
188
+ [".tsx", "tsx"],
189
+ [".ts", "typescript"],
190
+ [".jsx", "jsx"],
191
+ [".js", "javascript"],
192
+ [".mjs", "javascript"],
193
+ [".py", "python"],
194
+ [".go", "go"],
195
+ [".vue", "vue"],
196
+ [".sql", "sql"],
197
+ [".json", "json"],
198
+ [".jsonc", "jsonc"],
199
+ [".yaml", "yaml"],
200
+ [".yml", "yaml"],
201
+ [".toml", "toml"],
202
+ [".sh", "bash"],
203
+ [".ps1", "powershell"],
204
+ [".cmd", "batch"],
205
+ [".bat", "batch"],
206
+ [".graphql", "graphql"],
207
+ [".gql", "graphql"],
208
+ [".proto", "protobuf"],
209
+ ]) {
138
210
  if (lower.endsWith(extension))
139
211
  return language;
140
212
  }
@@ -12,9 +12,15 @@ export async function readSourcePackProfile(projectRoot, profileId) {
12
12
  throw new Error(`source pack profile not found: ${profileId}`);
13
13
  }
14
14
  const parsed = parseYaml(await readText(configPath));
15
- const sourcePacks = parsed && typeof parsed === "object" ? parsed.source_packs : undefined;
16
- const profileValue = sourcePacks && typeof sourcePacks === "object" ? sourcePacks[profileId] : undefined;
17
- if (!profileValue || typeof profileValue !== "object" || Array.isArray(profileValue)) {
15
+ const sourcePacks = parsed && typeof parsed === "object"
16
+ ? parsed.source_packs
17
+ : undefined;
18
+ const profileValue = sourcePacks && typeof sourcePacks === "object"
19
+ ? sourcePacks[profileId]
20
+ : undefined;
21
+ if (!profileValue ||
22
+ typeof profileValue !== "object" ||
23
+ Array.isArray(profileValue)) {
18
24
  throw new Error(`source pack profile not found: ${profileId}`);
19
25
  }
20
26
  const value = profileValue;
@@ -23,7 +29,7 @@ export async function readSourcePackProfile(projectRoot, profileId) {
23
29
  code: readPatternList(value.code, `source_packs.${profileId}.code`, "code path"),
24
30
  exclude: readPatternList(value.exclude, `source_packs.${profileId}.exclude`, "exclude path"),
25
31
  verification: readStringList(value.verification, `source_packs.${profileId}.verification`),
26
- maxBundleCharacters: readPositiveInteger(value.max_bundle_characters, `source_packs.${profileId}.max_bundle_characters`)
32
+ maxBundleCharacters: readPositiveInteger(value.max_bundle_characters, `source_packs.${profileId}.max_bundle_characters`),
27
33
  };
28
34
  }
29
35
  export async function parseContextAreas(projectRoot) {
@@ -38,13 +44,21 @@ export async function parseContextAreas(projectRoot) {
38
44
  const root = /root\s*=\s*"([^"]+)"/.exec(block)?.[1];
39
45
  const context = /context\s*=\s*"([^"]+)"/.exec(block)?.[1];
40
46
  if (id && root && context) {
41
- areas.push({ id, root: normalizeRepoPath(root, "area root"), context: normalizeRepoPath(context, "area context") });
47
+ areas.push({
48
+ id,
49
+ root: normalizeRepoPath(root, "area root"),
50
+ context: normalizeRepoPath(context, "area context"),
51
+ });
42
52
  }
43
53
  }
44
54
  return areas.sort((left, right) => left.id.localeCompare(right.id));
45
55
  }
46
56
  export function mergePatterns(...groups) {
47
- return [...new Set(groups.flatMap((group) => group ?? []).map((value) => normalizeRepoPath(value, "include path")))].sort();
57
+ return [
58
+ ...new Set(groups
59
+ .flatMap((group) => group ?? [])
60
+ .map((value) => normalizeRepoPath(value, "include path"))),
61
+ ].sort();
48
62
  }
49
63
  export function validatePatternList(values, label) {
50
64
  return values.map((value) => normalizeRepoPath(value, label));
@@ -66,7 +80,8 @@ function readStringList(value, label) {
66
80
  if (value === undefined) {
67
81
  return [];
68
82
  }
69
- if (!Array.isArray(value) || value.some((item) => typeof item !== "string" || item.trim().length === 0)) {
83
+ if (!Array.isArray(value) ||
84
+ value.some((item) => typeof item !== "string" || item.trim().length === 0)) {
70
85
  throw new Error(`<harnessRoot>/config.yaml ${label} must be an array of non-empty strings`);
71
86
  }
72
87
  return value.map((item) => item.trim());
@@ -81,7 +96,9 @@ function readPositiveInteger(value, label) {
81
96
  return Number(value);
82
97
  }
83
98
  function isAllowedPatternPath(value) {
84
- return value.length > 0 && !path.posix.isAbsolute(value) && !value.split("/").includes("..");
99
+ return (value.length > 0 &&
100
+ !path.posix.isAbsolute(value) &&
101
+ !value.split("/").includes(".."));
85
102
  }
86
103
  function globToRegExp(pattern) {
87
104
  const escaped = pattern
@@ -1,8 +1,8 @@
1
1
  import path from "node:path";
2
- import { artifactReport, buildManifest, pruneTimestampedExports, readPackageVersion, writeArtifactSet } from "./source-pack-manifest.js";
3
- import { mergePatterns, parseContextAreas, readSourcePackProfile, validatePatternList } from "./source-pack-config.js";
4
- import { collectCodeRecords, collectContextArtifacts, countRedactionWarnings, repoRelative } from "./source-pack-records.js";
5
- import { renderBundleArtifact, renderCodeIndexArtifact, renderFullProjectContextArtifact, renderTaskContextArtifact } from "./source-pack-render.js";
2
+ import { artifactReport, buildManifest, pruneTimestampedExports, readPackageVersion, writeArtifactSet, } from "./source-pack-manifest.js";
3
+ import { mergePatterns, parseContextAreas, readSourcePackProfile, validatePatternList, } from "./source-pack-config.js";
4
+ import { collectCodeRecords, collectContextArtifacts, countRedactionWarnings, repoRelative, } from "./source-pack-records.js";
5
+ import { renderBundleArtifact, renderCodeIndexArtifact, renderFullProjectContextArtifact, renderTaskContextArtifact, } from "./source-pack-render.js";
6
6
  const DEFAULT_EXPORT_DIR = "tmp/ty-context/context-exports";
7
7
  const DEFAULT_MAX_PACK_FILES = 5;
8
8
  const DEFAULT_MAX_BUNDLE_CHARACTERS = 800_000;
@@ -18,20 +18,27 @@ export async function runSourcePackExport(projectRoot, options) {
18
18
  const includeCode = mergePatterns(profile.code, validatePatternList(options.includeCode ?? [], "include code path"));
19
19
  const includeContext = mergePatterns(profile.context, validatePatternList(options.includeContext ?? [], "include context path"));
20
20
  const exclude = mergePatterns(profile.exclude);
21
- const maxBundleCharacters = options.maxBundleCharacters ?? profile.maxBundleCharacters ?? DEFAULT_MAX_BUNDLE_CHARACTERS;
21
+ const maxBundleCharacters = options.maxBundleCharacters ??
22
+ profile.maxBundleCharacters ??
23
+ DEFAULT_MAX_BUNDLE_CHARACTERS;
22
24
  const bundleStrategy = options.bundleStrategy ?? "auto";
23
25
  const records = await collectCodeRecords(projectRoot, warnings, {
24
26
  include: includeCode.length > 0 ? includeCode : undefined,
25
27
  exclude,
26
- areas
28
+ areas,
27
29
  });
28
- const contexts = await collectContextArtifacts(projectRoot, warnings, options.mode === "task-context" && includeContext.length > 0 ? includeContext : undefined);
30
+ const contexts = await collectContextArtifacts(projectRoot, warnings, options.mode === "task-context" && includeContext.length > 0
31
+ ? includeContext
32
+ : undefined);
29
33
  const taskName = options.taskName ?? "";
30
34
  const command = options.command ?? commandFor(options);
31
35
  const toolVersion = await readPackageVersion();
32
36
  const recommendedUploadSets = uploadSets(options.mode, taskName);
33
37
  const artifacts = [];
34
- if (options.mode === "code-index" || options.mode === "source-pack" || options.mode === "code-bundles" || options.mode === "task-context") {
38
+ if (options.mode === "code-index" ||
39
+ options.mode === "source-pack" ||
40
+ options.mode === "code-bundles" ||
41
+ options.mode === "task-context") {
35
42
  assignBundles(records, maxBundleCharacters, bundleStrategy);
36
43
  artifacts.push(markdownArtifact("code-index", "code-index.md", renderCodeIndexArtifact(records, areas, warnings, meta(generatedAt, "code-index.md", command, toolVersion)), records.length, sumLines(records), warnings.length));
37
44
  }
@@ -52,10 +59,13 @@ export async function runSourcePackExport(projectRoot, options) {
52
59
  generatedAt,
53
60
  command,
54
61
  maxPackFiles,
55
- artifacts: nonManifestArtifacts.map((artifact) => ({ ...artifact, relativePath: `${DEFAULT_EXPORT_DIR}/latest/${artifact.name}` })),
62
+ artifacts: nonManifestArtifacts.map((artifact) => ({
63
+ ...artifact,
64
+ relativePath: `${DEFAULT_EXPORT_DIR}/latest/${artifact.name}`,
65
+ })),
56
66
  warnings,
57
67
  omitted,
58
- recommendedUploadSets
68
+ recommendedUploadSets,
59
69
  });
60
70
  artifacts.unshift({
61
71
  kind: "manifest",
@@ -64,7 +74,7 @@ export async function runSourcePackExport(projectRoot, options) {
64
74
  content: manifest,
65
75
  sourceCount: 0,
66
76
  sourceLineCount: 0,
67
- warningCount: warnings.length
77
+ warningCount: warnings.length,
68
78
  });
69
79
  for (const artifact of artifacts) {
70
80
  if (!artifact.relativePath) {
@@ -95,7 +105,7 @@ export async function runSourcePackExport(projectRoot, options) {
95
105
  warnings,
96
106
  omitted,
97
107
  recommendedUploadSets,
98
- wrote: !options.check
108
+ wrote: !options.check,
99
109
  };
100
110
  }
101
111
  function addDefaultBundles(artifacts, records, contexts, maxPackFiles, warnings, generatedAt, command, toolVersion) {
@@ -160,12 +170,18 @@ function assignTaskBundles(records, maxCharacters) {
160
170
  function sortedRecords(records, bundleStrategy) {
161
171
  return [...records].sort((left, right) => {
162
172
  if (bundleStrategy === "area" || bundleStrategy === "config") {
163
- return left.bucket.localeCompare(right.bucket) || right.score - left.score || left.relative.localeCompare(right.relative);
173
+ return (left.bucket.localeCompare(right.bucket) ||
174
+ right.score - left.score ||
175
+ left.relative.localeCompare(right.relative));
164
176
  }
165
177
  if (bundleStrategy === "topdir") {
166
- return topDir(left).localeCompare(topDir(right)) || right.score - left.score || left.relative.localeCompare(right.relative);
178
+ return (topDir(left).localeCompare(topDir(right)) ||
179
+ right.score - left.score ||
180
+ left.relative.localeCompare(right.relative));
167
181
  }
168
- return right.score - left.score || left.bucket.localeCompare(right.bucket) || left.relative.localeCompare(right.relative);
182
+ return (right.score - left.score ||
183
+ left.bucket.localeCompare(right.bucket) ||
184
+ left.relative.localeCompare(right.relative));
169
185
  });
170
186
  }
171
187
  function topDir(record) {
@@ -173,23 +189,55 @@ function topDir(record) {
173
189
  }
174
190
  function omittedSummary(records) {
175
191
  const omitted = records.filter((record) => record.bundle === "omitted");
176
- return { source_file_count: omitted.length, reason_counts: omitted.length > 0 ? { bundle_budget: omitted.length } : {} };
192
+ return {
193
+ source_file_count: omitted.length,
194
+ reason_counts: omitted.length > 0 ? { bundle_budget: omitted.length } : {},
195
+ };
177
196
  }
178
197
  function markdownArtifact(kind, name, content, sourceCount, sourceLineCount, warningCount) {
179
- return { kind, name, relativePath: "", content, sourceCount, sourceLineCount, warningCount };
198
+ return {
199
+ kind,
200
+ name,
201
+ relativePath: "",
202
+ content,
203
+ sourceCount,
204
+ sourceLineCount,
205
+ warningCount,
206
+ };
180
207
  }
181
208
  function meta(generatedAt, artifactName, command, toolVersion) {
182
- return { generatedAt, outputPath: `tmp/ty-context/context-exports/latest/${artifactName}`, command, toolVersion };
209
+ return {
210
+ generatedAt,
211
+ outputPath: `tmp/ty-context/context-exports/latest/${artifactName}`,
212
+ command,
213
+ toolVersion,
214
+ };
183
215
  }
184
216
  function uploadSets(mode, taskName) {
185
217
  const base = `${DEFAULT_EXPORT_DIR}/latest`;
186
218
  const sets = {
187
- daily_planning: [`${base}/full-project-context.md`, `${base}/code-index.md`],
188
- cross_module_review: [`${base}/full-project-context.md`, `${base}/code-index.md`, `${base}/code-bundle-core.md`, `${base}/code-bundle-extended.md`],
189
- full_fallback: [`${base}/full-project-context.md`, `${base}/code-index.md`, `${DEFAULT_EXPORT_DIR}/code-level-implementation-<timestamp>/code-level-implementation.md`]
219
+ daily_planning: [
220
+ `${base}/full-project-context.md`,
221
+ `${base}/code-index.md`,
222
+ ],
223
+ cross_module_review: [
224
+ `${base}/full-project-context.md`,
225
+ `${base}/code-index.md`,
226
+ `${base}/code-bundle-core.md`,
227
+ `${base}/code-bundle-extended.md`,
228
+ ],
229
+ full_fallback: [
230
+ `${base}/full-project-context.md`,
231
+ `${base}/code-index.md`,
232
+ `${DEFAULT_EXPORT_DIR}/code-level-implementation-<timestamp>/code-level-implementation.md`,
233
+ ],
190
234
  };
191
235
  if (mode === "task-context") {
192
- sets.focused_task_handoff = [`${base}/full-project-context.md`, `${base}/code-index.md`, `${base}/task-contexts/task-context-${taskSlug(taskName)}.md`];
236
+ sets.focused_task_handoff = [
237
+ `${base}/full-project-context.md`,
238
+ `${base}/code-index.md`,
239
+ `${base}/task-contexts/task-context-${taskSlug(taskName)}.md`,
240
+ ];
193
241
  }
194
242
  return sets;
195
243
  }
@@ -200,17 +248,28 @@ function validateMaxPackFiles(mode, maxPackFiles) {
200
248
  if (maxPackFiles > DEFAULT_MAX_PACK_FILES) {
201
249
  throw new Error("export-context --max-pack-files cannot exceed 5 for Source Pack modes");
202
250
  }
203
- const required = mode === "code-index" ? 2 : mode === "task-context" ? 4 : mode === "code-bundles" ? 3 : 3;
251
+ const required = mode === "code-index"
252
+ ? 2
253
+ : mode === "task-context"
254
+ ? 4
255
+ : mode === "code-bundles"
256
+ ? 3
257
+ : 3;
204
258
  if (maxPackFiles < required) {
205
259
  throw new Error(`export-context ${mode} requires --max-pack-files >= ${required}`);
206
260
  }
207
261
  }
208
262
  function commandFor(options) {
209
- const flag = options.mode === "task-context" ? `--task-context ${options.taskName ?? ""}` : `--${options.mode}`;
263
+ const flag = options.mode === "task-context"
264
+ ? `--task-context ${options.taskName ?? ""}`
265
+ : `--${options.mode}`;
210
266
  return `ty-context export-context ${flag}`;
211
267
  }
212
268
  function taskSlug(value) {
213
- return value.toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "task";
269
+ return (value
270
+ .toLowerCase()
271
+ .replace(/[^a-z0-9._-]+/g, "-")
272
+ .replace(/^-+|-+$/g, "") || "task");
214
273
  }
215
274
  function sumLines(records) {
216
275
  return records.reduce((sum, record) => sum + record.lines, 0);