spexcode 0.6.2 → 0.6.5

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 (479) hide show
  1. package/README.md +3 -1
  2. package/bin/spex.mjs +4 -0
  3. package/node_modules/@spexcode/spec-cli/bin/spex.mjs +76 -0
  4. package/node_modules/@spexcode/spec-cli/dist/attach.d.ts +2 -0
  5. package/node_modules/@spexcode/spec-cli/dist/attach.js +48 -0
  6. package/node_modules/@spexcode/spec-cli/dist/claude-headless.d.ts +33 -0
  7. package/node_modules/@spexcode/spec-cli/dist/claude-headless.js +307 -0
  8. package/node_modules/@spexcode/spec-cli/dist/cli.d.ts +1 -0
  9. package/node_modules/@spexcode/spec-cli/dist/cli.js +1859 -0
  10. package/node_modules/@spexcode/spec-cli/dist/client.d.ts +111 -0
  11. package/node_modules/@spexcode/spec-cli/dist/client.js +476 -0
  12. package/node_modules/@spexcode/spec-cli/dist/cockpit.d.ts +7 -0
  13. package/node_modules/@spexcode/spec-cli/dist/cockpit.js +26 -0
  14. package/node_modules/@spexcode/spec-cli/dist/codex-headless.d.ts +1 -0
  15. package/{spec-cli/src/codex-headless.ts → node_modules/@spexcode/spec-cli/dist/codex-headless.js} +3 -9
  16. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.d.ts +53 -0
  17. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.js +686 -0
  18. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.d.ts +1 -0
  19. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.js +90 -0
  20. package/node_modules/@spexcode/spec-cli/dist/contract-filter.d.ts +14 -0
  21. package/node_modules/@spexcode/spec-cli/dist/contract-filter.js +219 -0
  22. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.d.ts +6 -0
  23. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.js +50 -0
  24. package/node_modules/@spexcode/spec-cli/dist/delivery-queue.d.ts +23 -0
  25. package/node_modules/@spexcode/spec-cli/dist/delivery-queue.js +179 -0
  26. package/node_modules/@spexcode/spec-cli/dist/doctor.d.ts +9 -0
  27. package/node_modules/@spexcode/spec-cli/dist/doctor.js +547 -0
  28. package/node_modules/@spexcode/spec-cli/dist/eval-host.d.ts +1 -0
  29. package/node_modules/@spexcode/spec-cli/dist/eval-host.js +19 -0
  30. package/node_modules/@spexcode/spec-cli/dist/execution-trace.d.ts +26 -0
  31. package/node_modules/@spexcode/spec-cli/dist/execution-trace.js +475 -0
  32. package/node_modules/@spexcode/spec-cli/dist/file-write.d.ts +2 -0
  33. package/node_modules/@spexcode/spec-cli/dist/file-write.js +26 -0
  34. package/node_modules/@spexcode/spec-cli/dist/flat.d.ts +89 -0
  35. package/node_modules/@spexcode/spec-cli/dist/flat.js +1076 -0
  36. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.d.ts +56 -0
  37. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.js +168 -0
  38. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.d.ts +28 -0
  39. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.js +361 -0
  40. package/node_modules/@spexcode/spec-cli/dist/gateway.d.ts +37 -0
  41. package/node_modules/@spexcode/spec-cli/dist/gateway.js +503 -0
  42. package/node_modules/@spexcode/spec-cli/dist/graphCache.d.ts +27 -0
  43. package/node_modules/@spexcode/spec-cli/dist/graphCache.js +716 -0
  44. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.d.ts +14 -0
  45. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.js +35 -0
  46. package/node_modules/@spexcode/spec-cli/dist/graphStream.d.ts +85 -0
  47. package/node_modules/@spexcode/spec-cli/dist/graphStream.js +1195 -0
  48. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.d.ts +64 -0
  49. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.js +166 -0
  50. package/node_modules/@spexcode/spec-cli/dist/guide.d.ts +8 -0
  51. package/{spec-cli/src/guide.ts → node_modules/@spexcode/spec-cli/dist/guide.js} +36 -32
  52. package/node_modules/@spexcode/spec-cli/dist/harness-select.d.ts +18 -0
  53. package/node_modules/@spexcode/spec-cli/dist/harness-select.js +62 -0
  54. package/node_modules/@spexcode/spec-cli/dist/harness.d.ts +325 -0
  55. package/node_modules/@spexcode/spec-cli/dist/harness.js +3026 -0
  56. package/node_modules/@spexcode/spec-cli/dist/headless-controller.d.ts +9 -0
  57. package/node_modules/@spexcode/spec-cli/dist/headless-controller.js +47 -0
  58. package/node_modules/@spexcode/spec-cli/dist/help.d.ts +10 -0
  59. package/node_modules/@spexcode/spec-cli/dist/help.js +574 -0
  60. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.d.ts +18 -0
  61. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.js +122 -0
  62. package/node_modules/@spexcode/spec-cli/dist/hooks.d.ts +1 -0
  63. package/{spec-cli/src/hooks.ts → node_modules/@spexcode/spec-cli/dist/hooks.js} +15 -15
  64. package/node_modules/@spexcode/spec-cli/dist/host-resources.d.ts +97 -0
  65. package/node_modules/@spexcode/spec-cli/dist/host-resources.js +795 -0
  66. package/node_modules/@spexcode/spec-cli/dist/host.d.ts +88 -0
  67. package/node_modules/@spexcode/spec-cli/dist/host.js +663 -0
  68. package/node_modules/@spexcode/spec-cli/dist/index.d.ts +1 -0
  69. package/node_modules/@spexcode/spec-cli/dist/index.js +899 -0
  70. package/node_modules/@spexcode/spec-cli/dist/init.d.ts +1 -0
  71. package/node_modules/@spexcode/spec-cli/dist/init.js +284 -0
  72. package/node_modules/@spexcode/spec-cli/dist/issues-cli.d.ts +6 -0
  73. package/node_modules/@spexcode/spec-cli/dist/issues-cli.js +334 -0
  74. package/node_modules/@spexcode/spec-cli/dist/issues.d.ts +69 -0
  75. package/node_modules/@spexcode/spec-cli/dist/issues.js +189 -0
  76. package/node_modules/@spexcode/spec-cli/dist/lint.d.ts +34 -0
  77. package/node_modules/@spexcode/spec-cli/dist/lint.js +476 -0
  78. package/node_modules/@spexcode/spec-cli/dist/listen.d.ts +7 -0
  79. package/{spec-cli/src/listen.ts → node_modules/@spexcode/spec-cli/dist/listen.js} +13 -17
  80. package/node_modules/@spexcode/spec-cli/dist/localIssues.d.ts +65 -0
  81. package/node_modules/@spexcode/spec-cli/dist/localIssues.js +582 -0
  82. package/node_modules/@spexcode/spec-cli/dist/login-page.d.ts +5 -0
  83. package/{spec-cli/src/login-page.ts → node_modules/@spexcode/spec-cli/dist/login-page.js} +7 -7
  84. package/node_modules/@spexcode/spec-cli/dist/loop-in.d.ts +23 -0
  85. package/{spec-cli/src/loop-in.ts → node_modules/@spexcode/spec-cli/dist/loop-in.js} +35 -45
  86. package/node_modules/@spexcode/spec-cli/dist/machine-peer.d.ts +69 -0
  87. package/node_modules/@spexcode/spec-cli/dist/machine-peer.js +603 -0
  88. package/node_modules/@spexcode/spec-cli/dist/materialize.d.ts +18 -0
  89. package/node_modules/@spexcode/spec-cli/dist/materialize.js +468 -0
  90. package/node_modules/@spexcode/spec-cli/dist/mentions.d.ts +50 -0
  91. package/node_modules/@spexcode/spec-cli/dist/mentions.js +117 -0
  92. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.d.ts +4 -0
  93. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.js +208 -0
  94. package/node_modules/@spexcode/spec-cli/dist/opencode.d.ts +3 -0
  95. package/{spec-cli/src/opencode.ts → node_modules/@spexcode/spec-cli/dist/opencode.js} +9 -13
  96. package/node_modules/@spexcode/spec-cli/dist/pi-harness.d.ts +3 -0
  97. package/{spec-cli/src/pi-harness.ts → node_modules/@spexcode/spec-cli/dist/pi-harness.js} +45 -40
  98. package/node_modules/@spexcode/spec-cli/dist/pi-headless.d.ts +25 -0
  99. package/node_modules/@spexcode/spec-cli/dist/pi-headless.js +196 -0
  100. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.d.ts +21 -0
  101. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.js +146 -0
  102. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.d.ts +10 -0
  103. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.js +404 -0
  104. package/node_modules/@spexcode/spec-cli/dist/pty-helper.d.mts +1 -0
  105. package/node_modules/@spexcode/spec-cli/dist/pty-helper.mjs +101 -0
  106. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.d.mts +2 -0
  107. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.mjs +23 -0
  108. package/node_modules/@spexcode/spec-cli/dist/public-graph.d.ts +46 -0
  109. package/node_modules/@spexcode/spec-cli/dist/public-graph.js +56 -0
  110. package/node_modules/@spexcode/spec-cli/dist/ranker.d.ts +15 -0
  111. package/node_modules/@spexcode/spec-cli/dist/ranker.js +188 -0
  112. package/node_modules/@spexcode/spec-cli/dist/reaper.d.ts +6 -0
  113. package/node_modules/@spexcode/spec-cli/dist/reaper.js +81 -0
  114. package/node_modules/@spexcode/spec-cli/dist/reviews.d.ts +189 -0
  115. package/node_modules/@spexcode/spec-cli/dist/reviews.js +350 -0
  116. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.d.ts +6 -0
  117. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.js +37 -0
  118. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.d.ts +21 -0
  119. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.js +84 -0
  120. package/node_modules/@spexcode/spec-cli/dist/search.bench.d.mts +1 -0
  121. package/node_modules/@spexcode/spec-cli/dist/search.bench.mjs +75 -0
  122. package/node_modules/@spexcode/spec-cli/dist/search.d.ts +20 -0
  123. package/node_modules/@spexcode/spec-cli/dist/search.js +61 -0
  124. package/node_modules/@spexcode/spec-cli/dist/session-cursors.d.ts +14 -0
  125. package/node_modules/@spexcode/spec-cli/dist/session-cursors.js +82 -0
  126. package/node_modules/@spexcode/spec-cli/dist/session-declarations.d.ts +13 -0
  127. package/node_modules/@spexcode/spec-cli/dist/session-declarations.js +126 -0
  128. package/node_modules/@spexcode/spec-cli/dist/session-execution.d.ts +10 -0
  129. package/node_modules/@spexcode/spec-cli/dist/session-execution.js +70 -0
  130. package/node_modules/@spexcode/spec-cli/dist/session-files.d.ts +28 -0
  131. package/node_modules/@spexcode/spec-cli/dist/session-files.js +130 -0
  132. package/node_modules/@spexcode/spec-cli/dist/session-follow.d.ts +31 -0
  133. package/node_modules/@spexcode/spec-cli/dist/session-follow.js +179 -0
  134. package/node_modules/@spexcode/spec-cli/dist/session-reparent.d.ts +10 -0
  135. package/node_modules/@spexcode/spec-cli/dist/session-reparent.js +33 -0
  136. package/node_modules/@spexcode/spec-cli/dist/session-timeline.d.ts +51 -0
  137. package/node_modules/@spexcode/spec-cli/dist/session-timeline.js +233 -0
  138. package/node_modules/@spexcode/spec-cli/dist/session-web.d.ts +24 -0
  139. package/node_modules/@spexcode/spec-cli/dist/session-web.js +141 -0
  140. package/node_modules/@spexcode/spec-cli/dist/sessions.d.ts +412 -0
  141. package/node_modules/@spexcode/spec-cli/dist/sessions.js +4239 -0
  142. package/node_modules/@spexcode/spec-cli/dist/sh.d.ts +1 -0
  143. package/node_modules/@spexcode/spec-cli/dist/sh.js +3 -0
  144. package/node_modules/@spexcode/spec-cli/dist/shim-runtime.d.ts +1 -0
  145. package/{spec-cli/src/shim-runtime.ts → node_modules/@spexcode/spec-cli/dist/shim-runtime.js} +3 -4
  146. package/node_modules/@spexcode/spec-cli/dist/slash-commands.d.ts +9 -0
  147. package/node_modules/@spexcode/spec-cli/dist/slash-commands.js +307 -0
  148. package/node_modules/@spexcode/spec-cli/dist/source-files.d.ts +9 -0
  149. package/node_modules/@spexcode/spec-cli/dist/source-files.js +113 -0
  150. package/node_modules/@spexcode/spec-cli/dist/supervise.d.ts +1 -0
  151. package/node_modules/@spexcode/spec-cli/dist/supervise.js +308 -0
  152. package/node_modules/@spexcode/spec-cli/dist/tree.d.ts +25 -0
  153. package/node_modules/@spexcode/spec-cli/dist/tree.js +98 -0
  154. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.d.ts +3 -0
  155. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.js +41 -0
  156. package/node_modules/@spexcode/spec-cli/dist/uninstall.d.ts +3 -0
  157. package/node_modules/@spexcode/spec-cli/dist/uninstall.js +177 -0
  158. package/node_modules/@spexcode/spec-cli/dist/uploads.d.ts +36 -0
  159. package/node_modules/@spexcode/spec-cli/dist/uploads.js +243 -0
  160. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.d.ts +1 -0
  161. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.js +47 -0
  162. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/dispatch.sh +5 -5
  163. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/harness.sh +1 -1
  164. package/node_modules/@spexcode/spec-cli/package.json +47 -0
  165. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +8 -0
  166. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec-first.sh +1 -1
  167. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec-of-file.sh +1 -0
  168. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/spec.md +2 -2
  169. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +31 -29
  170. package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +94 -0
  171. package/node_modules/@spexcode/spec-core/dist/anchors.js +730 -0
  172. package/node_modules/@spexcode/spec-core/dist/git.d.ts +166 -0
  173. package/node_modules/@spexcode/spec-core/dist/git.js +2736 -0
  174. package/node_modules/@spexcode/spec-core/dist/graph-delta.d.ts +44 -0
  175. package/node_modules/@spexcode/spec-core/dist/graph-delta.js +72 -0
  176. package/node_modules/@spexcode/spec-core/dist/graph.d.ts +34 -0
  177. package/node_modules/@spexcode/spec-core/dist/graph.js +237 -0
  178. package/node_modules/@spexcode/spec-core/dist/graphDelta.d.ts +3 -0
  179. package/node_modules/@spexcode/spec-core/dist/graphDelta.js +13 -0
  180. package/node_modules/@spexcode/spec-core/dist/harness-identity.d.ts +31 -0
  181. package/node_modules/@spexcode/spec-core/dist/harness-identity.js +20 -0
  182. package/node_modules/@spexcode/spec-core/dist/identity-presets.d.ts +152 -0
  183. package/node_modules/@spexcode/spec-core/dist/identity-presets.js +132 -0
  184. package/node_modules/@spexcode/spec-core/dist/index.d.ts +45 -0
  185. package/node_modules/@spexcode/spec-core/dist/index.js +19 -0
  186. package/node_modules/@spexcode/spec-core/dist/layout.d.ts +183 -0
  187. package/node_modules/@spexcode/spec-core/dist/layout.js +548 -0
  188. package/node_modules/@spexcode/spec-core/dist/process-identity.d.ts +37 -0
  189. package/node_modules/@spexcode/spec-core/dist/process-identity.js +214 -0
  190. package/node_modules/@spexcode/spec-core/dist/project-identity.d.ts +12 -0
  191. package/node_modules/@spexcode/spec-core/dist/project-identity.js +71 -0
  192. package/node_modules/@spexcode/spec-core/dist/project-store.d.ts +3 -0
  193. package/node_modules/@spexcode/spec-core/dist/project-store.js +14 -0
  194. package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +2 -0
  195. package/node_modules/@spexcode/spec-core/dist/resilience.js +40 -0
  196. package/node_modules/@spexcode/spec-core/dist/review/index.d.ts +3 -0
  197. package/node_modules/@spexcode/spec-core/dist/review/index.js +5 -0
  198. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +77 -0
  199. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +308 -0
  200. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +66 -0
  201. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +180 -0
  202. package/node_modules/@spexcode/spec-core/dist/review/session.d.ts +4 -0
  203. package/node_modules/@spexcode/spec-core/dist/review/session.js +8 -0
  204. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.d.ts +15 -0
  205. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.js +12 -0
  206. package/node_modules/@spexcode/spec-core/dist/root-lru.d.ts +4 -0
  207. package/{spec-cli/src/root-lru.ts → node_modules/@spexcode/spec-core/dist/root-lru.js} +26 -30
  208. package/node_modules/@spexcode/spec-core/dist/specs.d.ts +117 -0
  209. package/node_modules/@spexcode/spec-core/dist/specs.js +489 -0
  210. package/node_modules/@spexcode/spec-core/package.json +28 -0
  211. package/node_modules/@spexcode/spec-eval/dist/cache.d.ts +10 -0
  212. package/node_modules/@spexcode/spec-eval/dist/cache.js +50 -0
  213. package/node_modules/@spexcode/spec-eval/dist/cli.d.ts +22 -0
  214. package/node_modules/@spexcode/spec-eval/dist/cli.js +981 -0
  215. package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +98 -0
  216. package/node_modules/@spexcode/spec-eval/dist/evaltab.js +176 -0
  217. package/node_modules/@spexcode/spec-eval/dist/filing.d.ts +16 -0
  218. package/node_modules/@spexcode/spec-eval/dist/filing.js +36 -0
  219. package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +48 -0
  220. package/node_modules/@spexcode/spec-eval/dist/freshness.js +799 -0
  221. package/node_modules/@spexcode/spec-eval/dist/host.d.ts +46 -0
  222. package/node_modules/@spexcode/spec-eval/dist/host.js +53 -0
  223. package/node_modules/@spexcode/spec-eval/dist/humanok.d.ts +11 -0
  224. package/node_modules/@spexcode/spec-eval/dist/humanok.js +27 -0
  225. package/node_modules/@spexcode/spec-eval/dist/index.d.ts +4 -0
  226. package/node_modules/@spexcode/spec-eval/dist/index.js +4 -0
  227. package/node_modules/@spexcode/spec-eval/dist/remarks.d.ts +31 -0
  228. package/node_modules/@spexcode/spec-eval/dist/remarks.js +1 -0
  229. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.d.ts +13 -0
  230. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.js +303 -0
  231. package/node_modules/@spexcode/spec-eval/dist/scenarios.d.ts +99 -0
  232. package/node_modules/@spexcode/spec-eval/dist/scenarios.js +650 -0
  233. package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +307 -0
  234. package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +1883 -0
  235. package/node_modules/@spexcode/spec-eval/dist/sidecar.d.ts +55 -0
  236. package/node_modules/@spexcode/spec-eval/dist/sidecar.js +82 -0
  237. package/node_modules/@spexcode/spec-eval/dist/timeline.d.ts +25 -0
  238. package/node_modules/@spexcode/spec-eval/dist/timeline.js +65 -0
  239. package/node_modules/@spexcode/spec-eval/dist/ui-path.d.ts +1 -0
  240. package/node_modules/@spexcode/spec-eval/dist/ui-path.js +2 -0
  241. package/node_modules/@spexcode/spec-eval/package.json +36 -0
  242. package/node_modules/@spexcode/spec-forge/dist/cache.d.ts +29 -0
  243. package/node_modules/@spexcode/spec-forge/dist/cache.js +59 -0
  244. package/node_modules/@spexcode/spec-forge/dist/cli.d.ts +1 -0
  245. package/node_modules/@spexcode/spec-forge/dist/cli.js +100 -0
  246. package/node_modules/@spexcode/spec-forge/dist/drivers/github.d.ts +2 -0
  247. package/node_modules/@spexcode/spec-forge/dist/drivers/github.js +116 -0
  248. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.d.ts +7 -0
  249. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.js +144 -0
  250. package/node_modules/@spexcode/spec-forge/dist/drivers.d.ts +10 -0
  251. package/node_modules/@spexcode/spec-forge/dist/drivers.js +83 -0
  252. package/node_modules/@spexcode/spec-forge/dist/index.d.ts +4 -0
  253. package/node_modules/@spexcode/spec-forge/dist/index.js +4 -0
  254. package/node_modules/@spexcode/spec-forge/dist/links.d.ts +15 -0
  255. package/node_modules/@spexcode/spec-forge/dist/links.js +65 -0
  256. package/node_modules/@spexcode/spec-forge/dist/needs-eval.d.ts +10 -0
  257. package/node_modules/@spexcode/spec-forge/dist/needs-eval.js +20 -0
  258. package/node_modules/@spexcode/spec-forge/dist/port.d.ts +53 -0
  259. package/node_modules/@spexcode/spec-forge/dist/port.js +1 -0
  260. package/node_modules/@spexcode/spec-forge/dist/resident.d.ts +7 -0
  261. package/node_modules/@spexcode/spec-forge/dist/resident.js +43 -0
  262. package/node_modules/@spexcode/spec-forge/package.json +32 -0
  263. package/package.json +33 -19
  264. package/spec-cli/bin/spex.mjs +0 -69
  265. package/spec-cli/src/anchors.ts +0 -728
  266. package/spec-cli/src/attach.ts +0 -43
  267. package/spec-cli/src/claude-headless.ts +0 -321
  268. package/spec-cli/src/cli.ts +0 -1258
  269. package/spec-cli/src/client.ts +0 -414
  270. package/spec-cli/src/cockpit.ts +0 -43
  271. package/spec-cli/src/codex-runtime-generations.ts +0 -646
  272. package/spec-cli/src/commit-surgery.ts +0 -68
  273. package/spec-cli/src/contract-filter.ts +0 -202
  274. package/spec-cli/src/delivery-queue.ts +0 -165
  275. package/spec-cli/src/doctor.ts +0 -516
  276. package/spec-cli/src/execution-trace.ts +0 -444
  277. package/spec-cli/src/file-write.ts +0 -22
  278. package/spec-cli/src/gateway-auth.ts +0 -181
  279. package/spec-cli/src/gateway-hub.ts +0 -358
  280. package/spec-cli/src/gateway.ts +0 -461
  281. package/spec-cli/src/git.ts +0 -2556
  282. package/spec-cli/src/graph.ts +0 -271
  283. package/spec-cli/src/graphCache.ts +0 -710
  284. package/spec-cli/src/graphDelta.ts +0 -77
  285. package/spec-cli/src/graphStream.ts +0 -1019
  286. package/spec-cli/src/harness-select.ts +0 -77
  287. package/spec-cli/src/harness.ts +0 -3025
  288. package/spec-cli/src/headless-controller.ts +0 -63
  289. package/spec-cli/src/help.ts +0 -492
  290. package/spec-cli/src/host-resources.ts +0 -762
  291. package/spec-cli/src/host.ts +0 -611
  292. package/spec-cli/src/identity-presets.d.ts +0 -13
  293. package/spec-cli/src/identity-presets.js +0 -138
  294. package/spec-cli/src/index.ts +0 -818
  295. package/spec-cli/src/init.ts +0 -258
  296. package/spec-cli/src/issues-cli.ts +0 -276
  297. package/spec-cli/src/issues.ts +0 -237
  298. package/spec-cli/src/layout.ts +0 -640
  299. package/spec-cli/src/lint.ts +0 -488
  300. package/spec-cli/src/localIssues.ts +0 -538
  301. package/spec-cli/src/materialize.ts +0 -417
  302. package/spec-cli/src/mentions.ts +0 -81
  303. package/spec-cli/src/opencode-headless.ts +0 -205
  304. package/spec-cli/src/pi-headless.ts +0 -153
  305. package/spec-cli/src/plugin-harness.ts +0 -157
  306. package/spec-cli/src/process-identity.ts +0 -207
  307. package/spec-cli/src/project-identity.ts +0 -73
  308. package/spec-cli/src/project-store.ts +0 -17
  309. package/spec-cli/src/pty-bridge.ts +0 -396
  310. package/spec-cli/src/pty-helper.mjs +0 -96
  311. package/spec-cli/src/pty-native-helper.mjs +0 -22
  312. package/spec-cli/src/ranker.ts +0 -191
  313. package/spec-cli/src/reaper.ts +0 -125
  314. package/spec-cli/src/resilience.ts +0 -41
  315. package/spec-cli/src/reviewSnapshot.ts +0 -28
  316. package/spec-cli/src/reviews.ts +0 -434
  317. package/spec-cli/src/runtime-guard.ts +0 -35
  318. package/spec-cli/src/runtime-ownership.ts +0 -88
  319. package/spec-cli/src/search.bench.mjs +0 -80
  320. package/spec-cli/src/search.ts +0 -63
  321. package/spec-cli/src/session-cursors.ts +0 -91
  322. package/spec-cli/src/session-execution.ts +0 -68
  323. package/spec-cli/src/session-files.ts +0 -121
  324. package/spec-cli/src/session-follow.ts +0 -182
  325. package/spec-cli/src/session-reparent.ts +0 -33
  326. package/spec-cli/src/session-timeline.ts +0 -247
  327. package/spec-cli/src/session-web.ts +0 -135
  328. package/spec-cli/src/sessions.ts +0 -3883
  329. package/spec-cli/src/sh.ts +0 -3
  330. package/spec-cli/src/slash-commands.ts +0 -318
  331. package/spec-cli/src/source-files.ts +0 -104
  332. package/spec-cli/src/specs.ts +0 -498
  333. package/spec-cli/src/supervise.ts +0 -245
  334. package/spec-cli/src/tree.ts +0 -118
  335. package/spec-cli/src/tsx-bin.ts +0 -18
  336. package/spec-cli/src/uninstall.ts +0 -171
  337. package/spec-cli/src/uploads.ts +0 -253
  338. package/spec-cli/src/worktree-sources.ts +0 -42
  339. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +0 -8
  340. package/spec-dashboard/dist/assets/App-B6IbFbGu.js +0 -2
  341. package/spec-dashboard/dist/assets/Dashboard-C5ap-Sga.css +0 -1
  342. package/spec-dashboard/dist/assets/Dashboard-_sDk7Rcg.js +0 -27
  343. package/spec-dashboard/dist/assets/EvalsPage-BT357Lyt.js +0 -2
  344. package/spec-dashboard/dist/assets/IssuesPage-BG9rNOgV.js +0 -1
  345. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  346. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  347. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  348. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  349. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  350. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  351. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  352. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  353. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  354. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  355. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  356. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  357. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  358. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  359. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  360. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  361. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  362. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  363. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  364. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  365. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  366. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  367. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  368. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  369. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  370. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  371. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  372. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  373. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  374. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  375. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  376. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  377. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  378. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  379. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  380. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  381. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  382. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  383. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  384. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  385. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  386. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  387. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  388. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  389. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  390. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  391. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  392. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  393. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  394. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  395. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  396. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  397. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  398. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  399. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  400. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  401. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  402. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  403. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  404. package/spec-dashboard/dist/assets/MobileApp-D9yPMR3A.js +0 -2
  405. package/spec-dashboard/dist/assets/Modal-B3EcgeA3.js +0 -1
  406. package/spec-dashboard/dist/assets/PageScroll-CNZOugWV.js +0 -1
  407. package/spec-dashboard/dist/assets/ProjectsPage-C2CRHmvs.js +0 -1
  408. package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +0 -32
  409. package/spec-dashboard/dist/assets/SessionInterface-DOEjuT3l.js +0 -40
  410. package/spec-dashboard/dist/assets/SessionWindow-1nYgZ4CL.js +0 -1
  411. package/spec-dashboard/dist/assets/Settings-7WeTJn0V.js +0 -1
  412. package/spec-dashboard/dist/assets/Thread-CEbzAFQn.js +0 -13
  413. package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +0 -1
  414. package/spec-dashboard/dist/assets/data-SlvxNA2r.js +0 -1
  415. package/spec-dashboard/dist/assets/index-DLVeOHL-.js +0 -41
  416. package/spec-dashboard/dist/assets/index-DYLGfPjx.css +0 -1
  417. package/spec-dashboard/dist/assets/launch-Cp579UoJ.css +0 -1
  418. package/spec-dashboard/dist/assets/launch-yxCYr64x.js +0 -276
  419. package/spec-dashboard/dist/assets/sessionSurface--7l69h4F.js +0 -1
  420. package/spec-dashboard/dist/index.html +0 -29
  421. package/spec-dashboard/src/reviewFilters.js +0 -322
  422. package/spec-dashboard/src/reviewQuery.js +0 -174
  423. package/spec-dashboard/src/session.js +0 -199
  424. package/spec-eval/src/cache.ts +0 -57
  425. package/spec-eval/src/cli.ts +0 -894
  426. package/spec-eval/src/evaltab.ts +0 -264
  427. package/spec-eval/src/filing.ts +0 -39
  428. package/spec-eval/src/freshness.ts +0 -836
  429. package/spec-eval/src/humanok.ts +0 -28
  430. package/spec-eval/src/scenariofresh.ts +0 -244
  431. package/spec-eval/src/scenarios.ts +0 -672
  432. package/spec-eval/src/sessioneval.ts +0 -2220
  433. package/spec-eval/src/sidecar.ts +0 -93
  434. package/spec-eval/src/timeline.ts +0 -54
  435. package/spec-forge/src/__fixtures__/github-forge.json +0 -63
  436. package/spec-forge/src/cache.ts +0 -66
  437. package/spec-forge/src/cli.ts +0 -99
  438. package/spec-forge/src/drivers/github.ts +0 -132
  439. package/spec-forge/src/drivers/gitlab.ts +0 -153
  440. package/spec-forge/src/drivers.ts +0 -73
  441. package/spec-forge/src/links.ts +0 -72
  442. package/spec-forge/src/needs-eval.ts +0 -29
  443. package/spec-forge/src/port.ts +0 -36
  444. package/spec-forge/src/resident.ts +0 -46
  445. /package/{spec-cli → node_modules/@spexcode/spec-cli}/README.md +0 -0
  446. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -0
  447. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-sed-v0.fixture +0 -0
  448. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/commit-msg +0 -0
  449. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-checkout +0 -0
  450. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-merge +0 -0
  451. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/pre-commit +0 -0
  452. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/prepare-commit-msg +0 -0
  453. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/reference-transaction +0 -0
  454. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/extract/spec.md +0 -0
  455. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/regroup/spec.md +0 -0
  456. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/rename/spec.md +0 -0
  457. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/spec.md +0 -0
  458. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/tidy/spec.md +0 -0
  459. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/comment-altitude/spec.md +0 -0
  460. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/idle.sh +0 -0
  461. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/spec.md +0 -0
  462. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/mark-active.sh +0 -0
  463. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/spec.md +0 -0
  464. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/fail.sh +0 -0
  465. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/spec.md +0 -0
  466. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec.md +0 -0
  467. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec.md +0 -0
  468. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec.md +0 -0
  469. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +0 -0
  470. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/forge-link/spec.md +0 -0
  471. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +0 -0
  472. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +0 -0
  473. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/spec.md +0 -0
  474. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/digest.mjs +0 -0
  475. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/spec.md +0 -0
  476. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/spec.md +0 -0
  477. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/spec.md +0 -0
  478. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/spec.md +0 -0
  479. /package/{spec-cli → node_modules/@spexcode/spec-core}/templates/spexcode.json +0 -0
@@ -0,0 +1,46 @@
1
+ import type { RemarkTrack } from './remarks.js';
2
+ export type EvalHost = {
3
+ loadConfig?: (root: string) => any;
4
+ trackedSourceFiles?: (root: string, roots: string[], policy: any) => string[];
5
+ stripRefSigil?: (value: string) => string;
6
+ commitTrunkData?: (path: string, message: string) => 'committed' | 'no-op' | 'not-primary';
7
+ apiBase?: () => Promise<string>;
8
+ };
9
+ export type ReviewIdentity = {
10
+ id: string;
11
+ node: string | null;
12
+ branch: string | null;
13
+ label: string;
14
+ };
15
+ export type ReviewPayload = {
16
+ id: string;
17
+ node: string | null;
18
+ branch: string | null;
19
+ label: string;
20
+ ahead: number;
21
+ dirtyNonRuntime: number;
22
+ diff: import('@spexcode/spec-core').ReviewDiffFile[];
23
+ gates: {
24
+ conflictsWithMain: boolean;
25
+ lint: {
26
+ errorCount: number;
27
+ warningCount: number;
28
+ };
29
+ };
30
+ proposal: {
31
+ kind: string | null;
32
+ note: string | null;
33
+ };
34
+ };
35
+ export type EvalHostPort = EvalHost & {
36
+ reviewIdentity: (id: string) => ReviewIdentity | null;
37
+ reviewPayload: (id: string) => Promise<ReviewPayload | null>;
38
+ loadEvalRemarkTracks?: () => Map<string, RemarkTrack>;
39
+ };
40
+ export declare function setEvalRemarkTracks(loader: () => Map<string, RemarkTrack>): void;
41
+ export declare function setEvalHost(next: EvalHost): void;
42
+ export declare function evalHost(): EvalHost;
43
+ export declare function requireEvalHost<K extends keyof EvalHost>(field: K): NonNullable<EvalHost[K]>;
44
+ export declare function evalRemarkTracks(): Map<string, RemarkTrack>;
45
+ export declare function evalRemarkSourceFingerprint(): string;
46
+ export declare const trackKey: (node: string, scenario: string) => string;
@@ -0,0 +1,53 @@
1
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ let services = {};
4
+ let remarks = () => new Map();
5
+ export function setEvalRemarkTracks(loader) {
6
+ remarks = loader;
7
+ }
8
+ export function setEvalHost(next) { services = { ...services, ...next }; }
9
+ export function evalHost() { return services; }
10
+ // CLI-backed commands must fail at the capability boundary, rather than letting an absent
11
+ // service turn into an unrelated TypeError or an empty result. Remark reads are the one
12
+ // deliberate standalone downgrade and stay on evalRemarkTracks() below.
13
+ export function requireEvalHost(field) {
14
+ const value = services[field];
15
+ if (value == null)
16
+ throw new Error(`spec-eval host is not configured: ${String(field)}`);
17
+ return value;
18
+ }
19
+ export function evalRemarkTracks() {
20
+ return remarks();
21
+ }
22
+ // The eval engine fingerprints the remark input even when no CLI host is installed. It deliberately hashes
23
+ // bytes, not issue semantics; the CLI host remains the sole owner of parsing and joining remark tracks.
24
+ export function evalRemarkSourceFingerprint() {
25
+ const root = process.env.SPEXCODE_ISSUES_DIR;
26
+ if (!root)
27
+ return '';
28
+ const files = [];
29
+ const walk = (dir) => {
30
+ let entries;
31
+ try {
32
+ entries = readdirSync(dir);
33
+ }
34
+ catch {
35
+ return;
36
+ }
37
+ for (const name of entries.sort()) {
38
+ const path = join(dir, name);
39
+ try {
40
+ if (statSync(path).isDirectory())
41
+ walk(path);
42
+ else
43
+ files.push(`${path}\0${readFileSync(path).toString('base64')}`);
44
+ }
45
+ catch {
46
+ files.push(`${path}\0<unreadable>`);
47
+ }
48
+ }
49
+ };
50
+ walk(root);
51
+ return files.join('\0');
52
+ }
53
+ export const trackKey = (node, scenario) => `${node} · ${scenario}`;
@@ -0,0 +1,11 @@
1
+ import { type HumanOk } from './sidecar.js';
2
+ export type OkResult = {
3
+ ok: true;
4
+ humanOk: HumanOk;
5
+ already: boolean;
6
+ landed: 'committed' | 'uncommitted';
7
+ } | {
8
+ ok: false;
9
+ error: string;
10
+ };
11
+ export declare function fileHumanOk(nodeId: string, scenario: string, by: string): OkResult;
@@ -0,0 +1,27 @@
1
+ import { relative } from 'node:path';
2
+ import { repoRoot } from '@spexcode/spec-core';
3
+ import { requireEvalHost } from './host.js';
4
+ import { evalNodes, resolveEvalNode } from './scenarios.js';
5
+ import { readReadings, readSidecar, appendHumanOk, humanOkFor } from './sidecar.js';
6
+ export function fileHumanOk(nodeId, scenario, by) {
7
+ const root = repoRoot();
8
+ const res = resolveEvalNode(evalNodes(root), nodeId);
9
+ if (!res.ok)
10
+ return { ok: false, error: res.error };
11
+ const node = res.node;
12
+ if (!node.scenarios.some((s) => s.name === scenario) &&
13
+ !readSidecar(node.sidecarPath).readings.some((r) => r.scenario === scenario))
14
+ return { ok: false, error: `'${node.id}' has no scenario '${scenario}'` };
15
+ const forScenario = readReadings(node.sidecarPath).filter((r) => r.scenario === scenario);
16
+ if (!forScenario.length)
17
+ return { ok: false, error: `'${node.id}' scenario '${scenario}' has no effective eval — nothing to ok` };
18
+ const latest = forScenario[forScenario.length - 1];
19
+ const existing = humanOkFor(readSidecar(node.sidecarPath).oks, scenario, latest.ts);
20
+ if (existing)
21
+ return { ok: true, humanOk: existing, already: true, landed: 'committed' };
22
+ const row = { kind: 'human-ok', scenario, okTs: latest.ts, okSha: latest.codeSha, by, ts: new Date().toISOString() };
23
+ appendHumanOk(node.sidecarPath, row);
24
+ const commit = requireEvalHost('commitTrunkData');
25
+ const landed = commit(relative(root, node.sidecarPath), `eval(${node.id}): human-ok '${scenario}' @ ${latest.ts} by ${by}`);
26
+ return { ok: true, humanOk: row, already: false, landed: landed === 'not-primary' ? 'uncommitted' : 'committed' };
27
+ }
@@ -0,0 +1,4 @@
1
+ export * from './sessioneval.js';
2
+ export * from './evaltab.js';
3
+ export * from './scenarios.js';
4
+ export * from './host.js';
@@ -0,0 +1,4 @@
1
+ export * from './sessioneval.js';
2
+ export * from './evaltab.js';
3
+ export * from './scenarios.js';
4
+ export * from './host.js';
@@ -0,0 +1,31 @@
1
+ export type Reply = {
2
+ by: string;
3
+ at: string;
4
+ body: string;
5
+ rid?: string;
6
+ targetCodeSha?: string;
7
+ resolved?: boolean;
8
+ resolvedAt?: string;
9
+ resolvedBy?: string;
10
+ };
11
+ export type Issue = {
12
+ id: string;
13
+ store: string;
14
+ concern: string;
15
+ by: string;
16
+ status: string;
17
+ nodes: string[];
18
+ created: string;
19
+ body: string;
20
+ replies: Reply[];
21
+ evidence: string[];
22
+ labels: unknown[];
23
+ url?: string;
24
+ };
25
+ export type RemarkTrack = {
26
+ threadId: string;
27
+ node: string;
28
+ scenario: string;
29
+ thread: Issue;
30
+ remarks: Reply[];
31
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ export type ScenarioIndex = Map<string, Map<string, string[]>>;
2
+ export declare function scenarioIndex(root: string, evalPaths: string[]): Promise<ScenarioIndex>;
3
+ export declare function scenarioCacheStats(): {
4
+ heads: number;
5
+ roots: number;
6
+ };
7
+ export declare function scenarioChangeCommits(idx: ScenarioIndex, evalPath: string, scenario: string): string[];
8
+ export declare function primeScenarioBlocks(root: string, demands: readonly {
9
+ rev: string;
10
+ path: string;
11
+ }[]): Promise<void>;
12
+ export declare function primeScenarioBlocksAt(root: string, revs: string[], path: string): Promise<void>;
13
+ export declare function scenarioBlocksAt(root: string, rev: string, path: string): Map<string, string> | null;
@@ -0,0 +1,303 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { batchBlobTexts, batchRevisionOids, git, gitA, gitTry, headSha } from '@spexcode/spec-core';
3
+ import { parseScenarios } from './scenarios.js';
4
+ import { rootSlots, touchRoot as touchRootLru } from '@spexcode/spec-core';
5
+ const RS = '\x1e';
6
+ function blockContent(src) {
7
+ const m = new Map();
8
+ for (const s of parseScenarios(src)) {
9
+ m.set(s.name, JSON.stringify({ d: s.description, e: s.expected }));
10
+ }
11
+ return m;
12
+ }
13
+ const ZERO = '0'.repeat(40);
14
+ const EMPTY = new Map();
15
+ const blockByOid = new Map();
16
+ async function fileChains(root, wanted) {
17
+ const chains = new Map();
18
+ const alias = new Map();
19
+ const out = await gitA(['-C', root, '-c', 'core.quotePath=false', 'log',
20
+ '--raw', '--no-abbrev', '--full-history', '-M', `--format=${RS}%H`, '--', '*eval.md', '*yatsu.md']); // dead-words-ok: archived pathspec — immutable pre-rename history is read under its archived name
21
+ for (const rec of out.split(RS)) {
22
+ const nl = rec.indexOf('\n');
23
+ if (nl < 0)
24
+ continue;
25
+ const hash = rec.slice(0, nl);
26
+ if (!hash)
27
+ continue;
28
+ for (const line of rec.slice(nl + 1).split('\n')) {
29
+ if (line[0] !== ':')
30
+ continue; // `:<oldmode> <newmode> <oldoid> <newoid> <status>\t<path>[\t<path2>]`
31
+ const tab = line.indexOf('\t');
32
+ if (tab < 0)
33
+ continue;
34
+ const meta = line.slice(1, tab).split(' ');
35
+ const oid = meta[3], rename = meta[4][0] === 'R' || meta[4][0] === 'C';
36
+ const paths = line.slice(tab + 1).split('\t');
37
+ const to = rename ? paths[1] : paths[0];
38
+ let head = alias.get(to);
39
+ if (head === undefined) {
40
+ head = to;
41
+ alias.set(to, to);
42
+ }
43
+ let arr = chains.get(head);
44
+ if (!arr) {
45
+ arr = [];
46
+ chains.set(head, arr);
47
+ }
48
+ arr.push({ hash, oid });
49
+ if (rename && paths[0] !== to) {
50
+ alias.set(paths[0], head);
51
+ alias.delete(to);
52
+ }
53
+ }
54
+ }
55
+ for (const k of [...chains.keys()])
56
+ if (!wanted.has(k))
57
+ chains.delete(k);
58
+ return chains;
59
+ }
60
+ function scenarioCommits(chain) {
61
+ const commits = new Map();
62
+ const push = (name, hash) => { const a = commits.get(name); if (a)
63
+ a.push(hash);
64
+ else
65
+ commits.set(name, [hash]); };
66
+ const real = chain.filter((v) => v.oid !== ZERO);
67
+ for (let i = 0; i < real.length; i++) {
68
+ const cur = blockByOid.get(real[i].oid) ?? EMPTY;
69
+ const older = i + 1 < real.length ? (blockByOid.get(real[i + 1].oid) ?? EMPTY) : EMPTY;
70
+ for (const name of new Set([...cur.keys(), ...older.keys()])) {
71
+ if (cur.get(name) !== older.get(name))
72
+ push(name, real[i].hash);
73
+ }
74
+ }
75
+ return commits;
76
+ }
77
+ // read MANY blobs in ONE `git cat-file --batch` process (vs one `git show` per blob). Feeds the OIDs on
78
+ // stdin, parses the `<oid> <type> <size>\n<payload>\n` records byte-accurately (size is bytes; blobs are
79
+ // UTF-8). A `<oid> missing` line yields no entry. Env-stripped like git.ts's helpers (a stray GIT_DIR would
80
+ // misroute repo discovery); kept here beside its only caller — a general git-seam primitive if a second
81
+ // caller ever wants one.
82
+ function catFileBatch(root, oids) {
83
+ const out = new Map();
84
+ if (!oids.length)
85
+ return Promise.resolve(out);
86
+ return new Promise((resolve, reject) => {
87
+ const env = { ...process.env };
88
+ delete env.GIT_DIR;
89
+ delete env.GIT_WORK_TREE;
90
+ delete env.GIT_INDEX_FILE;
91
+ delete env.GIT_OBJECT_DIRECTORY;
92
+ const p = spawn('git', ['-C', root, 'cat-file', '--batch'], { env, timeout: Number(process.env.SPEXCODE_GIT_TIMEOUT_MS || 120000), killSignal: 'SIGKILL' });
93
+ const chunks = [];
94
+ p.stdout.on('data', (c) => chunks.push(c));
95
+ p.on('error', reject);
96
+ p.on('close', (_code, signal) => {
97
+ // a child that never exited was SIGKILLed at the timeout (a hung git must not pin this promise —
98
+ // same bound as git.ts's helpers); warn loudly and parse whatever arrived.
99
+ if (signal === 'SIGKILL')
100
+ console.warn(`spec-eval: git cat-file --batch killed after timeout — child never exited`);
101
+ const buf = Buffer.concat(chunks);
102
+ let i = 0;
103
+ while (i < buf.length) {
104
+ const nl = buf.indexOf(0x0a, i);
105
+ if (nl < 0)
106
+ break;
107
+ const header = buf.toString('utf8', i, nl);
108
+ i = nl + 1;
109
+ if (header.endsWith(' missing'))
110
+ continue; // unknown OID — no payload follows
111
+ const size = Number(header.slice(header.lastIndexOf(' ') + 1));
112
+ if (!Number.isFinite(size))
113
+ break;
114
+ out.set(header.slice(0, header.indexOf(' ')), buf.toString('utf8', i, i + size));
115
+ i += size + 1; // payload + its trailing newline
116
+ }
117
+ resolve(out);
118
+ });
119
+ p.stdin.on('error', () => { });
120
+ p.stdin.write(oids.join('\n') + '\n');
121
+ p.stdin.end();
122
+ });
123
+ }
124
+ async function build(root, evalPaths) {
125
+ const chains = await fileChains(root, new Set(evalPaths));
126
+ const need = new Set();
127
+ for (const chain of chains.values())
128
+ for (const v of chain)
129
+ if (v.oid !== ZERO && !blockByOid.has(v.oid))
130
+ need.add(v.oid);
131
+ if (need.size) {
132
+ const blobs = await catFileBatch(root, [...need]);
133
+ for (const [oid, src] of blobs)
134
+ blockByOid.set(oid, blockContent(src));
135
+ }
136
+ const idx = new Map();
137
+ for (const p of evalPaths)
138
+ idx.set(p, scenarioCommits(chains.get(p) ?? []));
139
+ return idx;
140
+ }
141
+ const SLOTS = rootSlots(process.env.SPEXCODE_SCENARIO_CACHE_ROOTS, 16);
142
+ const cache = new Map();
143
+ const roots = new Map();
144
+ function touchRoot(root, head) {
145
+ touchRootLru(roots, cache, root, head, SLOTS);
146
+ }
147
+ export function scenarioIndex(root, evalPaths) {
148
+ let head;
149
+ try {
150
+ head = headSha(root);
151
+ }
152
+ catch {
153
+ return build(root, evalPaths);
154
+ }
155
+ touchRoot(root, head);
156
+ const hit = cache.get(head);
157
+ if (hit) {
158
+ cache.delete(head);
159
+ cache.set(head, hit);
160
+ return hit;
161
+ }
162
+ const p = build(root, evalPaths);
163
+ p.catch(() => cache.delete(head));
164
+ cache.set(head, p);
165
+ while (cache.size > SLOTS)
166
+ cache.delete(cache.keys().next().value);
167
+ return p;
168
+ }
169
+ export function scenarioCacheStats() {
170
+ return { heads: cache.size, roots: roots.size };
171
+ }
172
+ export function scenarioChangeCommits(idx, evalPath, scenario) {
173
+ return idx.get(evalPath)?.get(scenario) ?? [];
174
+ }
175
+ const FULL_SHA = /^[0-9a-f]{40}$/;
176
+ const oidMemo = new Map();
177
+ function oidAt(root, rev, path) {
178
+ const resolve = () => { try {
179
+ return git(['-C', root, 'rev-parse', `${rev}:${path}`]).trim();
180
+ }
181
+ catch {
182
+ return '';
183
+ } };
184
+ if (!FULL_SHA.test(rev))
185
+ return resolve();
186
+ const k = `${root}\x1f${rev}\x1f${path}`;
187
+ const hit = oidMemo.get(k);
188
+ if (hit !== undefined) {
189
+ oidMemo.delete(k);
190
+ oidMemo.set(k, hit);
191
+ return hit;
192
+ }
193
+ const v = resolve();
194
+ oidMemo.set(k, v);
195
+ if (oidMemo.size > 4096)
196
+ oidMemo.delete(oidMemo.keys().next().value);
197
+ return v;
198
+ }
199
+ // @@@ the memo holds SETTLED oids, so concurrent askers need a flight to join - primes run concurrently
200
+ // across the whole scope, and every one of them missed the memo while the first child was still running:
201
+ // measured on adopter-a's 415-node scope, 2695 `rev-parse` children resolved 1212 distinct (rev, path) pairs.
202
+ // `rev:path` under a full sha names an immutable object, so joining answers the same question; the LRU
203
+ // write still happens once, on settle, exactly as the sync path does it.
204
+ const oidFlight = new Map();
205
+ async function oidAtAsync(root, rev, path) {
206
+ if (!FULL_SHA.test(rev))
207
+ return (await gitTry(['-C', root, 'rev-parse', `${rev}:${path}`])).stdout.trim();
208
+ const k = `${root}\x1f${rev}\x1f${path}`;
209
+ const hit = oidMemo.get(k);
210
+ if (hit !== undefined) {
211
+ oidMemo.delete(k);
212
+ oidMemo.set(k, hit);
213
+ return hit;
214
+ }
215
+ const joined = oidFlight.get(k);
216
+ if (joined)
217
+ return joined;
218
+ const run = async () => {
219
+ const result = await gitTry(['-C', root, 'rev-parse', `${rev}:${path}`]);
220
+ const oid = result.ok ? result.stdout.trim() : '';
221
+ oidMemo.set(k, oid);
222
+ if (oidMemo.size > 4096)
223
+ oidMemo.delete(oidMemo.keys().next().value);
224
+ return oid;
225
+ };
226
+ const flight = run().finally(() => { if (oidFlight.get(k) === flight)
227
+ oidFlight.delete(k); });
228
+ oidFlight.set(k, flight);
229
+ return flight;
230
+ }
231
+ // @@@ the PLURAL prime, mirroring the anchor probe's - a caller hands over every (rev, path) its whole read
232
+ // will ask about and TWO children answer them all: `cat-file --batch-check` for the object ids, then
233
+ // `cat-file --batch` for the blobs. The singular form below is one demand's worth of the same thing, kept
234
+ // for callers that genuinely learn their demand one at a time. Priming one at a time is what this replaces:
235
+ // on adopter-a's 415-node scope it forked 1212 `rev-parse` children plus a `cat-file` each, and the batch
236
+ // answers the identical set — same oids, same blocks, same verdicts, two children.
237
+ export async function primeScenarioBlocks(root, demands) {
238
+ const wanted = new Map();
239
+ for (const d of demands) {
240
+ if (!FULL_SHA.test(d.rev) || !d.path)
241
+ continue; // a symbolic rev is never memoized, so it can't ride a batch
242
+ const k = `${root}\x1f${d.rev}\x1f${d.path}`;
243
+ if (!oidMemo.has(k) && !wanted.has(k))
244
+ wanted.set(k, d);
245
+ }
246
+ if (!wanted.size)
247
+ return;
248
+ const keys = [...wanted.keys()];
249
+ const rows = [...wanted.values()];
250
+ const oids = await batchRevisionOids(root, rows.map((d) => `${d.rev}:${d.path}`));
251
+ oids.forEach((oid, i) => {
252
+ oidMemo.set(keys[i], oid ?? '');
253
+ if (oidMemo.size > 4096)
254
+ oidMemo.delete(oidMemo.keys().next().value);
255
+ });
256
+ const missing = [...new Set(oids.filter((o) => !!o && !blockByOid.has(o)))];
257
+ if (!missing.length)
258
+ return;
259
+ const texts = await batchBlobTexts(root, missing);
260
+ for (const [oid, src] of texts)
261
+ if (src)
262
+ blockByOid.set(oid, blockContent(src));
263
+ }
264
+ // the blob read needs the same flight as the oid lookup above it: an oid is content, so two primes that
265
+ // resolved the same one must not each read it.
266
+ const blockFlight = new Map();
267
+ export async function primeScenarioBlocksAt(root, revs, path) {
268
+ for (const rev of revs) {
269
+ const oid = await oidAtAsync(root, rev, path);
270
+ if (!oid || blockByOid.has(oid))
271
+ continue;
272
+ const joined = blockFlight.get(oid);
273
+ if (joined) {
274
+ await joined;
275
+ continue;
276
+ }
277
+ const run = async () => {
278
+ const src = await gitA(['-C', root, 'cat-file', 'blob', oid]); // dead-words-ok: git plumbing
279
+ if (src)
280
+ blockByOid.set(oid, blockContent(src));
281
+ };
282
+ const flight = run().finally(() => { if (blockFlight.get(oid) === flight)
283
+ blockFlight.delete(oid); });
284
+ blockFlight.set(oid, flight);
285
+ await flight;
286
+ }
287
+ }
288
+ export function scenarioBlocksAt(root, rev, path) {
289
+ const oid = oidAt(root, rev, path);
290
+ if (!oid)
291
+ return null;
292
+ const hit = blockByOid.get(oid);
293
+ if (hit)
294
+ return hit;
295
+ try {
296
+ const m = blockContent(git(['-C', root, 'cat-file', 'blob', oid])); // dead-words-ok: git plumbing — 'blob' is git's object type, not our vocabulary
297
+ blockByOid.set(oid, m);
298
+ return m;
299
+ }
300
+ catch {
301
+ return null;
302
+ }
303
+ }
@@ -0,0 +1,99 @@
1
+ import { type RelationEntry } from '@spexcode/spec-core';
2
+ export declare const EVAL_FILE = "eval.md";
3
+ export declare const SIDECAR_FILE = "evals.ndjson";
4
+ export type ScenarioTestReference = {
5
+ path: string;
6
+ name?: string;
7
+ };
8
+ export type Scenario = {
9
+ name: string;
10
+ description: string;
11
+ expected: string;
12
+ tags?: string[];
13
+ test?: ScenarioTestReference;
14
+ code?: string[];
15
+ related?: string[];
16
+ };
17
+ export declare const SCENARIO_PROJECTION = "spex.eval.scenario-index";
18
+ export declare const SCENARIO_SCHEMA_VERSION = 1;
19
+ export type ScenarioSemanticRow = {
20
+ node: string;
21
+ name: string;
22
+ description: string;
23
+ expected: string;
24
+ scenarioHash: string;
25
+ code: RelationEntry[];
26
+ related: RelationEntry[];
27
+ tags: string[];
28
+ };
29
+ export type ScenarioMeasurementRow = {
30
+ test: ScenarioTestReference | null;
31
+ };
32
+ export type ScenarioProjectionRow = {
33
+ semantic: ScenarioSemanticRow;
34
+ measurement: ScenarioMeasurementRow;
35
+ };
36
+ export type ScenarioProjectionNode = {
37
+ id: string;
38
+ code: RelationEntry[];
39
+ related: RelationEntry[];
40
+ };
41
+ export type ScenarioProjectionProvenance = {
42
+ head: string | null;
43
+ treeSha: string | null;
44
+ };
45
+ export type ScenarioProjection = {
46
+ projection: typeof SCENARIO_PROJECTION;
47
+ schemaVersion: typeof SCENARIO_SCHEMA_VERSION;
48
+ provenance: ScenarioProjectionProvenance;
49
+ nodes: ScenarioProjectionNode[];
50
+ semanticIndexHash: string;
51
+ fullIndexHash: string;
52
+ planningIndexHash: string;
53
+ rows: ScenarioProjectionRow[];
54
+ };
55
+ export type EvalNode = {
56
+ id: string;
57
+ dir: string;
58
+ evalPath: string;
59
+ sidecarPath: string;
60
+ scenarios: Scenario[];
61
+ evalSource?: string;
62
+ specSource?: string;
63
+ };
64
+ export declare function scenarioHash(s: Pick<Scenario, 'description' | 'expected'>): string;
65
+ export type ScenarioCodeAxis = {
66
+ entries: RelationEntry[];
67
+ paths: string[];
68
+ problems: string[];
69
+ };
70
+ export type ScenarioCodeAxisSource = readonly string[] | readonly RelationEntry[];
71
+ export declare function scenarioCodeAxis(scenarioCode: readonly string[] | undefined, nodeCode?: ScenarioCodeAxisSource): ScenarioCodeAxis;
72
+ export declare function parseScenarios(src: string): Scenario[];
73
+ export declare function scenarioProjection(nodes: readonly Pick<EvalNode, 'id' | 'scenarios' | 'evalSource' | 'specSource'>[], provenance?: Partial<ScenarioProjectionProvenance>): ScenarioProjection;
74
+ export declare function validateScenarios(src: string, tagLibrary?: string[], pathRoot?: string): string[];
75
+ export type ScenarioMeasurementMetadataMutation = {
76
+ scenario: string;
77
+ insert: {
78
+ test: string | {
79
+ path: string;
80
+ name: string;
81
+ };
82
+ };
83
+ } | {
84
+ scenario: string;
85
+ delete: 'test';
86
+ };
87
+ export declare function writeScenarioMeasurementMetadata(source: string, request: unknown): string;
88
+ export declare function evalNodes(root: string): EvalNode[];
89
+ export declare function evalNodesAt(root: string, tip: string): EvalNode[];
90
+ export declare function evalNodesAsync(root: string): Promise<EvalNode[]>;
91
+ export type EvalResolution<T> = {
92
+ ok: true;
93
+ node: T;
94
+ } | {
95
+ ok: false;
96
+ ambiguous: boolean;
97
+ error: string;
98
+ };
99
+ export declare function resolveEvalNode<T extends Pick<EvalNode, 'id' | 'dir'>>(nodes: T[], ref: string): EvalResolution<T>;