project-tiny-context-harness 0.2.84 → 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 -157
  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 +15 -3
  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 -244
  275. package/assets/skills/composite-long-task-workflow/assets/execution-binding.template.md +0 -57
  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 -675
  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 -52
  313. package/dist/lib/superpowers-task-completion-output.js +0 -228
  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 -382
  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 -24
  336. package/dist/lib/superpowers-task-gates.d.ts +0 -12
  337. package/dist/lib/superpowers-task-gates.js +0 -155
  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 -440
  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 -290
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { promises as fs } from "node:fs";
3
3
  import path from "node:path";
4
- import { ensureDir, listFiles, pathExists, readText, writeTextIfChanged } from "./fs.js";
4
+ import { ensureDir, listFiles, pathExists, readText, writeTextIfChanged, } from "./fs.js";
5
5
  import { AGENTS_BLOCK_MARKERS } from "./managed-file.js";
6
6
  import { SOURCE_MAPPINGS_PATH } from "./paths.js";
7
7
  import { parseYaml } from "./yaml.js";
@@ -29,7 +29,9 @@ export async function checkSource(projectRoot) {
29
29
  for (const item of expected) {
30
30
  sourceHashes.set(item.relative, hash(item.content));
31
31
  const targetFile = path.join(target, item.relative);
32
- const existing = (await pathExists(targetFile)) ? await readText(targetFile) : "";
32
+ const existing = (await pathExists(targetFile))
33
+ ? await readText(targetFile)
34
+ : "";
33
35
  if (hash(existing) !== hash(item.content)) {
34
36
  drift.push(`${mapping.target}/${item.relative}`);
35
37
  }
@@ -58,15 +60,25 @@ async function applyMapping(projectRoot, mapping) {
58
60
  if (typeof rendered === "string") {
59
61
  return (await writeTextIfChanged(target, rendered)) ? [mapping.target] : [];
60
62
  }
61
- await fs.rm(target, { recursive: true, force: true });
62
63
  await ensureDir(target);
63
64
  const changed = [];
65
+ const expectedRelatives = new Set(rendered.map((item) => item.relative));
64
66
  for (const item of rendered) {
65
67
  const targetFile = path.join(target, item.relative);
66
68
  if (await writeTextIfChanged(targetFile, item.content)) {
67
69
  changed.push(`${mapping.target}/${item.relative}`);
68
70
  }
69
71
  }
72
+ for (const targetFile of await listFiles(target)) {
73
+ if (path.basename(targetFile) === ".gitkeep") {
74
+ continue;
75
+ }
76
+ const relative = path.relative(target, targetFile);
77
+ if (!expectedRelatives.has(relative)) {
78
+ await fs.rm(targetFile, { force: true });
79
+ changed.push(`${mapping.target}/${relative}`);
80
+ }
81
+ }
70
82
  return changed;
71
83
  }
72
84
  async function renderMapping(projectRoot, mapping) {
@@ -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