spexcode 0.6.1 → 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 (480) hide show
  1. package/README.md +99 -149
  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} +115 -22
  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 +27 -7
  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/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/comment-altitude/spec.md +9 -0
  167. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec-first.sh +1 -1
  168. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec-of-file.sh +1 -0
  169. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/spec.md +22 -0
  170. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/spec.md +2 -2
  171. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +31 -29
  172. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +15 -0
  173. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/forge-link/spec.md +10 -0
  174. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +13 -0
  175. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +12 -0
  176. package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +94 -0
  177. package/node_modules/@spexcode/spec-core/dist/anchors.js +730 -0
  178. package/node_modules/@spexcode/spec-core/dist/git.d.ts +166 -0
  179. package/node_modules/@spexcode/spec-core/dist/git.js +2736 -0
  180. package/node_modules/@spexcode/spec-core/dist/graph-delta.d.ts +44 -0
  181. package/node_modules/@spexcode/spec-core/dist/graph-delta.js +72 -0
  182. package/node_modules/@spexcode/spec-core/dist/graph.d.ts +34 -0
  183. package/node_modules/@spexcode/spec-core/dist/graph.js +237 -0
  184. package/node_modules/@spexcode/spec-core/dist/graphDelta.d.ts +3 -0
  185. package/node_modules/@spexcode/spec-core/dist/graphDelta.js +13 -0
  186. package/node_modules/@spexcode/spec-core/dist/harness-identity.d.ts +31 -0
  187. package/node_modules/@spexcode/spec-core/dist/harness-identity.js +20 -0
  188. package/node_modules/@spexcode/spec-core/dist/identity-presets.d.ts +152 -0
  189. package/node_modules/@spexcode/spec-core/dist/identity-presets.js +132 -0
  190. package/node_modules/@spexcode/spec-core/dist/index.d.ts +45 -0
  191. package/node_modules/@spexcode/spec-core/dist/index.js +19 -0
  192. package/node_modules/@spexcode/spec-core/dist/layout.d.ts +183 -0
  193. package/node_modules/@spexcode/spec-core/dist/layout.js +548 -0
  194. package/node_modules/@spexcode/spec-core/dist/process-identity.d.ts +37 -0
  195. package/node_modules/@spexcode/spec-core/dist/process-identity.js +214 -0
  196. package/node_modules/@spexcode/spec-core/dist/project-identity.d.ts +12 -0
  197. package/node_modules/@spexcode/spec-core/dist/project-identity.js +71 -0
  198. package/node_modules/@spexcode/spec-core/dist/project-store.d.ts +3 -0
  199. package/node_modules/@spexcode/spec-core/dist/project-store.js +14 -0
  200. package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +2 -0
  201. package/node_modules/@spexcode/spec-core/dist/resilience.js +40 -0
  202. package/node_modules/@spexcode/spec-core/dist/review/index.d.ts +3 -0
  203. package/node_modules/@spexcode/spec-core/dist/review/index.js +5 -0
  204. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +77 -0
  205. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +308 -0
  206. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +66 -0
  207. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +180 -0
  208. package/node_modules/@spexcode/spec-core/dist/review/session.d.ts +4 -0
  209. package/node_modules/@spexcode/spec-core/dist/review/session.js +8 -0
  210. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.d.ts +15 -0
  211. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.js +12 -0
  212. package/node_modules/@spexcode/spec-core/dist/root-lru.d.ts +4 -0
  213. package/{spec-cli/src/root-lru.ts → node_modules/@spexcode/spec-core/dist/root-lru.js} +26 -30
  214. package/node_modules/@spexcode/spec-core/dist/specs.d.ts +117 -0
  215. package/node_modules/@spexcode/spec-core/dist/specs.js +489 -0
  216. package/node_modules/@spexcode/spec-core/package.json +28 -0
  217. package/node_modules/@spexcode/spec-eval/dist/cache.d.ts +10 -0
  218. package/node_modules/@spexcode/spec-eval/dist/cache.js +50 -0
  219. package/node_modules/@spexcode/spec-eval/dist/cli.d.ts +22 -0
  220. package/node_modules/@spexcode/spec-eval/dist/cli.js +981 -0
  221. package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +98 -0
  222. package/node_modules/@spexcode/spec-eval/dist/evaltab.js +176 -0
  223. package/node_modules/@spexcode/spec-eval/dist/filing.d.ts +16 -0
  224. package/node_modules/@spexcode/spec-eval/dist/filing.js +36 -0
  225. package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +48 -0
  226. package/node_modules/@spexcode/spec-eval/dist/freshness.js +799 -0
  227. package/node_modules/@spexcode/spec-eval/dist/host.d.ts +46 -0
  228. package/node_modules/@spexcode/spec-eval/dist/host.js +53 -0
  229. package/node_modules/@spexcode/spec-eval/dist/humanok.d.ts +11 -0
  230. package/node_modules/@spexcode/spec-eval/dist/humanok.js +27 -0
  231. package/node_modules/@spexcode/spec-eval/dist/index.d.ts +4 -0
  232. package/node_modules/@spexcode/spec-eval/dist/index.js +4 -0
  233. package/node_modules/@spexcode/spec-eval/dist/remarks.d.ts +31 -0
  234. package/node_modules/@spexcode/spec-eval/dist/remarks.js +1 -0
  235. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.d.ts +13 -0
  236. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.js +303 -0
  237. package/node_modules/@spexcode/spec-eval/dist/scenarios.d.ts +99 -0
  238. package/node_modules/@spexcode/spec-eval/dist/scenarios.js +650 -0
  239. package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +307 -0
  240. package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +1883 -0
  241. package/node_modules/@spexcode/spec-eval/dist/sidecar.d.ts +55 -0
  242. package/node_modules/@spexcode/spec-eval/dist/sidecar.js +82 -0
  243. package/node_modules/@spexcode/spec-eval/dist/timeline.d.ts +25 -0
  244. package/node_modules/@spexcode/spec-eval/dist/timeline.js +65 -0
  245. package/node_modules/@spexcode/spec-eval/dist/ui-path.d.ts +1 -0
  246. package/node_modules/@spexcode/spec-eval/dist/ui-path.js +2 -0
  247. package/node_modules/@spexcode/spec-eval/package.json +36 -0
  248. package/node_modules/@spexcode/spec-forge/dist/cache.d.ts +29 -0
  249. package/node_modules/@spexcode/spec-forge/dist/cache.js +59 -0
  250. package/node_modules/@spexcode/spec-forge/dist/cli.d.ts +1 -0
  251. package/node_modules/@spexcode/spec-forge/dist/cli.js +100 -0
  252. package/node_modules/@spexcode/spec-forge/dist/drivers/github.d.ts +2 -0
  253. package/node_modules/@spexcode/spec-forge/dist/drivers/github.js +116 -0
  254. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.d.ts +7 -0
  255. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.js +144 -0
  256. package/node_modules/@spexcode/spec-forge/dist/drivers.d.ts +10 -0
  257. package/node_modules/@spexcode/spec-forge/dist/drivers.js +83 -0
  258. package/node_modules/@spexcode/spec-forge/dist/index.d.ts +4 -0
  259. package/node_modules/@spexcode/spec-forge/dist/index.js +4 -0
  260. package/node_modules/@spexcode/spec-forge/dist/links.d.ts +15 -0
  261. package/node_modules/@spexcode/spec-forge/dist/links.js +65 -0
  262. package/node_modules/@spexcode/spec-forge/dist/needs-eval.d.ts +10 -0
  263. package/node_modules/@spexcode/spec-forge/dist/needs-eval.js +20 -0
  264. package/node_modules/@spexcode/spec-forge/dist/port.d.ts +53 -0
  265. package/node_modules/@spexcode/spec-forge/dist/port.js +1 -0
  266. package/node_modules/@spexcode/spec-forge/dist/resident.d.ts +7 -0
  267. package/node_modules/@spexcode/spec-forge/dist/resident.js +43 -0
  268. package/node_modules/@spexcode/spec-forge/package.json +32 -0
  269. package/package.json +33 -19
  270. package/spec-cli/bin/spex.mjs +0 -69
  271. package/spec-cli/src/anchors.ts +0 -706
  272. package/spec-cli/src/attach.ts +0 -43
  273. package/spec-cli/src/claude-headless.ts +0 -321
  274. package/spec-cli/src/cli.ts +0 -1115
  275. package/spec-cli/src/client.ts +0 -315
  276. package/spec-cli/src/cockpit.ts +0 -43
  277. package/spec-cli/src/codex-runtime-generations.ts +0 -646
  278. package/spec-cli/src/commit-surgery.ts +0 -68
  279. package/spec-cli/src/contract-filter.ts +0 -202
  280. package/spec-cli/src/delivery-queue.ts +0 -107
  281. package/spec-cli/src/doctor.ts +0 -516
  282. package/spec-cli/src/file-write.ts +0 -22
  283. package/spec-cli/src/gateway-auth.ts +0 -181
  284. package/spec-cli/src/gateway-hub.ts +0 -356
  285. package/spec-cli/src/gateway.ts +0 -368
  286. package/spec-cli/src/git.ts +0 -2180
  287. package/spec-cli/src/graph.ts +0 -221
  288. package/spec-cli/src/graphCache.ts +0 -641
  289. package/spec-cli/src/graphDelta.ts +0 -77
  290. package/spec-cli/src/graphStream.ts +0 -1019
  291. package/spec-cli/src/harness-select.ts +0 -77
  292. package/spec-cli/src/harness.ts +0 -2747
  293. package/spec-cli/src/headless-controller.ts +0 -63
  294. package/spec-cli/src/help.ts +0 -480
  295. package/spec-cli/src/host-resources.ts +0 -707
  296. package/spec-cli/src/host.ts +0 -611
  297. package/spec-cli/src/identity-presets.d.ts +0 -13
  298. package/spec-cli/src/identity-presets.js +0 -128
  299. package/spec-cli/src/index.ts +0 -730
  300. package/spec-cli/src/init.ts +0 -258
  301. package/spec-cli/src/issues-cli.ts +0 -276
  302. package/spec-cli/src/issues.ts +0 -237
  303. package/spec-cli/src/layout.ts +0 -557
  304. package/spec-cli/src/lint.ts +0 -458
  305. package/spec-cli/src/localIssues.ts +0 -538
  306. package/spec-cli/src/materialize.ts +0 -412
  307. package/spec-cli/src/mentions.ts +0 -81
  308. package/spec-cli/src/opencode-headless.ts +0 -205
  309. package/spec-cli/src/pi-headless.ts +0 -153
  310. package/spec-cli/src/plugin-harness.ts +0 -157
  311. package/spec-cli/src/process-identity.ts +0 -207
  312. package/spec-cli/src/project-identity.ts +0 -73
  313. package/spec-cli/src/project-store.ts +0 -17
  314. package/spec-cli/src/pty-bridge.ts +0 -396
  315. package/spec-cli/src/pty-helper.mjs +0 -96
  316. package/spec-cli/src/pty-native-helper.mjs +0 -22
  317. package/spec-cli/src/ranker.ts +0 -191
  318. package/spec-cli/src/reaper.ts +0 -125
  319. package/spec-cli/src/resilience.ts +0 -41
  320. package/spec-cli/src/reviewSnapshot.ts +0 -28
  321. package/spec-cli/src/reviews.ts +0 -405
  322. package/spec-cli/src/runtime-guard.ts +0 -35
  323. package/spec-cli/src/runtime-ownership.ts +0 -88
  324. package/spec-cli/src/search.bench.mjs +0 -80
  325. package/spec-cli/src/search.ts +0 -63
  326. package/spec-cli/src/session-cursors.ts +0 -91
  327. package/spec-cli/src/session-follow.ts +0 -182
  328. package/spec-cli/src/session-timeline.ts +0 -98
  329. package/spec-cli/src/sessions.ts +0 -3403
  330. package/spec-cli/src/sh.ts +0 -3
  331. package/spec-cli/src/slash-commands.ts +0 -318
  332. package/spec-cli/src/source-files.ts +0 -104
  333. package/spec-cli/src/specs.ts +0 -498
  334. package/spec-cli/src/supervise.ts +0 -245
  335. package/spec-cli/src/tree.ts +0 -118
  336. package/spec-cli/src/tsx-bin.ts +0 -18
  337. package/spec-cli/src/uninstall.ts +0 -171
  338. package/spec-cli/src/uploads.ts +0 -253
  339. package/spec-cli/src/worktree-sources.ts +0 -42
  340. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +0 -8
  341. package/spec-cli/templates/spec/project/.plugins/core/comment-altitude/spec.md +0 -28
  342. package/spec-cli/templates/spec/project/.plugins/core/spec.md +0 -23
  343. package/spec-cli/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +0 -32
  344. package/spec-cli/templates/spec/project/.plugins/prompts/forge-link/spec.md +0 -9
  345. package/spec-cli/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +0 -15
  346. package/spec-cli/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +0 -18
  347. package/spec-dashboard/dist/assets/App-F9uaAVcH.js +0 -2
  348. package/spec-dashboard/dist/assets/Dashboard-Ba_jhxp1.js +0 -27
  349. package/spec-dashboard/dist/assets/Dashboard-C5ap-Sga.css +0 -1
  350. package/spec-dashboard/dist/assets/EvalsPage-FixoOg_n.js +0 -2
  351. package/spec-dashboard/dist/assets/IssuesPage-CuKLFhH3.js +0 -1
  352. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  353. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  354. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  355. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  356. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  357. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  358. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  359. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  360. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  361. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  362. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  363. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  364. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  365. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  366. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  367. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  368. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  369. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  370. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  371. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  372. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  373. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  374. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  375. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  376. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  377. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  378. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  379. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  380. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  381. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  382. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  383. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  384. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  385. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  386. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  387. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  388. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  389. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  390. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  391. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  392. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  393. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  394. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  395. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  396. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  397. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  398. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  399. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  400. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  401. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  402. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  403. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  404. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  405. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  406. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  407. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  408. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  409. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  410. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  411. package/spec-dashboard/dist/assets/MobileApp-CHgEHORJ.js +0 -2
  412. package/spec-dashboard/dist/assets/Modal-CQgYymmr.js +0 -1
  413. package/spec-dashboard/dist/assets/PageScroll-hT7UTLvD.js +0 -1
  414. package/spec-dashboard/dist/assets/ProjectsPage-CtXxakF9.js +0 -1
  415. package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +0 -32
  416. package/spec-dashboard/dist/assets/SessionInterface-Bpie-9fs.js +0 -39
  417. package/spec-dashboard/dist/assets/SessionWindow-CixDi4PI.js +0 -1
  418. package/spec-dashboard/dist/assets/Settings-C2MsucfE.js +0 -1
  419. package/spec-dashboard/dist/assets/Thread-C6Go8HRh.js +0 -13
  420. package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +0 -1
  421. package/spec-dashboard/dist/assets/data-B-RQmit6.js +0 -1
  422. package/spec-dashboard/dist/assets/index-CsI8DElI.css +0 -1
  423. package/spec-dashboard/dist/assets/index-DrVao0Ep.js +0 -41
  424. package/spec-dashboard/dist/assets/launch-BBH02b1v.js +0 -276
  425. package/spec-dashboard/dist/assets/launch-Cp579UoJ.css +0 -1
  426. package/spec-dashboard/dist/assets/terminalFont-C6oGNKrf.js +0 -1
  427. package/spec-dashboard/dist/index.html +0 -29
  428. package/spec-dashboard/src/reviewFilters.js +0 -322
  429. package/spec-dashboard/src/reviewQuery.js +0 -174
  430. package/spec-dashboard/src/session.js +0 -199
  431. package/spec-eval/src/cache.ts +0 -57
  432. package/spec-eval/src/cli.ts +0 -889
  433. package/spec-eval/src/evaltab.ts +0 -262
  434. package/spec-eval/src/filing.ts +0 -39
  435. package/spec-eval/src/freshness.ts +0 -557
  436. package/spec-eval/src/humanok.ts +0 -28
  437. package/spec-eval/src/scenariofresh.ts +0 -244
  438. package/spec-eval/src/scenarios.ts +0 -672
  439. package/spec-eval/src/sessioneval.ts +0 -2226
  440. package/spec-eval/src/sidecar.ts +0 -93
  441. package/spec-eval/src/timeline.ts +0 -54
  442. package/spec-forge/src/__fixtures__/github-forge.json +0 -63
  443. package/spec-forge/src/cache.ts +0 -66
  444. package/spec-forge/src/cli.ts +0 -99
  445. package/spec-forge/src/drivers/github.ts +0 -132
  446. package/spec-forge/src/drivers/gitlab.ts +0 -153
  447. package/spec-forge/src/drivers.ts +0 -73
  448. package/spec-forge/src/links.ts +0 -72
  449. package/spec-forge/src/needs-eval.ts +0 -29
  450. package/spec-forge/src/port.ts +0 -36
  451. package/spec-forge/src/resident.ts +0 -46
  452. /package/{spec-cli → node_modules/@spexcode/spec-cli}/README.md +0 -0
  453. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -0
  454. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-sed-v0.fixture +0 -0
  455. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/commit-msg +0 -0
  456. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-checkout +0 -0
  457. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-merge +0 -0
  458. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/pre-commit +0 -0
  459. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/prepare-commit-msg +0 -0
  460. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/reference-transaction +0 -0
  461. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/extract/spec.md +0 -0
  462. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/regroup/spec.md +0 -0
  463. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/rename/spec.md +0 -0
  464. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/spec.md +0 -0
  465. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/tidy/spec.md +0 -0
  466. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/idle.sh +0 -0
  467. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/spec.md +0 -0
  468. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/mark-active.sh +0 -0
  469. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/spec.md +0 -0
  470. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/fail.sh +0 -0
  471. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/spec.md +0 -0
  472. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec.md +0 -0
  473. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec.md +0 -0
  474. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/spec.md +0 -0
  475. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/digest.mjs +0 -0
  476. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/spec.md +0 -0
  477. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/spec.md +0 -0
  478. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/spec.md +0 -0
  479. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/spec.md +0 -0
  480. /package/{spec-cli → node_modules/@spexcode/spec-core}/templates/spexcode.json +0 -0
@@ -0,0 +1,55 @@
1
+ export type Verdict = {
2
+ status: 'pass' | 'fail';
3
+ note?: string;
4
+ };
5
+ export type EvidenceKind = 'image' | 'transcript' | 'video' | 'data';
6
+ export type Evidence = {
7
+ hash: string;
8
+ kind: EvidenceKind;
9
+ };
10
+ export type Reading = {
11
+ scenario: string;
12
+ codeSha: string;
13
+ scenarioHash?: string;
14
+ evidence?: Evidence[];
15
+ blob?: string | null;
16
+ blobKind?: EvidenceKind;
17
+ timelineBlob?: string;
18
+ evaluator?: string;
19
+ by?: string;
20
+ verdict?: Verdict;
21
+ ts: string;
22
+ };
23
+ export declare function evidenceOf(r: {
24
+ evidence?: Evidence[];
25
+ blob?: string | null;
26
+ blobKind?: EvidenceKind;
27
+ }): Evidence[];
28
+ export declare function isJsonBlob(b: Buffer): boolean;
29
+ export type Retraction = {
30
+ retracts: string;
31
+ scenario: string;
32
+ note?: string;
33
+ by?: string;
34
+ ts: string;
35
+ };
36
+ export type HumanOk = {
37
+ kind: 'human-ok';
38
+ scenario: string;
39
+ okTs: string;
40
+ okSha: string;
41
+ by: string;
42
+ ts: string;
43
+ };
44
+ export declare function readSidecar(sidecarPath: string): {
45
+ readings: Reading[];
46
+ retractions: Retraction[];
47
+ oks: HumanOk[];
48
+ };
49
+ export declare function applyRetractions(readings: Reading[], retractions: Retraction[]): Reading[];
50
+ export declare function readReadings(sidecarPath: string): Reading[];
51
+ export declare function appendReading(sidecarPath: string, r: Reading): void;
52
+ export declare function appendRetraction(sidecarPath: string, r: Retraction): void;
53
+ export declare function appendHumanOk(sidecarPath: string, r: HumanOk): void;
54
+ export declare function humanOkFor(oks: HumanOk[], scenario: string, readingTs: string): HumanOk | null;
55
+ export declare function latestPerScenario(readings: Reading[]): Map<string, Reading>;
@@ -0,0 +1,82 @@
1
+ import { readFileSync, appendFileSync, existsSync } from 'node:fs';
2
+ export function evidenceOf(r) {
3
+ if (r.evidence?.length)
4
+ return r.evidence;
5
+ if (r.blob)
6
+ return [{ hash: r.blob, kind: r.blobKind ?? 'image' }];
7
+ return [];
8
+ }
9
+ export function isJsonBlob(b) {
10
+ if (!b.length || b.includes(0))
11
+ return false; // empty or binary → not JSON text
12
+ if (b.length > 4_000_000)
13
+ return false; // don't parse an unbounded blob just to sniff a type
14
+ const s = b.toString('utf8').trim();
15
+ const open = s[0], close = s[s.length - 1];
16
+ if (!((open === '{' && close === '}') || (open === '[' && close === ']')))
17
+ return false;
18
+ try {
19
+ const v = JSON.parse(s);
20
+ return v !== null && typeof v === 'object';
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ export function readSidecar(sidecarPath) {
27
+ const readings = [];
28
+ const retractions = [];
29
+ const oks = [];
30
+ if (!existsSync(sidecarPath))
31
+ return { readings, retractions, oks };
32
+ for (const line of readFileSync(sidecarPath, 'utf8').split('\n')) {
33
+ const t = line.trim();
34
+ if (!t)
35
+ continue;
36
+ try {
37
+ const r = JSON.parse(t);
38
+ if (!r || typeof r.scenario !== 'string')
39
+ continue;
40
+ if (typeof r.retracts === 'string')
41
+ retractions.push(r);
42
+ else if (r.kind === 'human-ok' && typeof r.okTs === 'string')
43
+ oks.push(r);
44
+ else if (typeof r.codeSha === 'string')
45
+ readings.push(r);
46
+ }
47
+ catch { /* Keep earlier events readable after an incomplete append. */ }
48
+ }
49
+ return { readings, retractions, oks };
50
+ }
51
+ export function applyRetractions(readings, retractions) {
52
+ if (!retractions.length)
53
+ return readings;
54
+ const gone = new Set(retractions.map((x) => `${x.scenario}\0${x.retracts}`));
55
+ return readings.filter((r) => !gone.has(`${r.scenario}\0${r.ts}`));
56
+ }
57
+ export function readReadings(sidecarPath) {
58
+ const { readings, retractions } = readSidecar(sidecarPath);
59
+ return applyRetractions(readings, retractions);
60
+ }
61
+ export function appendReading(sidecarPath, r) {
62
+ appendFileSync(sidecarPath, JSON.stringify(r) + '\n');
63
+ }
64
+ export function appendRetraction(sidecarPath, r) {
65
+ appendFileSync(sidecarPath, JSON.stringify(r) + '\n');
66
+ }
67
+ export function appendHumanOk(sidecarPath, r) {
68
+ appendFileSync(sidecarPath, JSON.stringify(r) + '\n');
69
+ }
70
+ export function humanOkFor(oks, scenario, readingTs) {
71
+ let hit = null;
72
+ for (const o of oks)
73
+ if (o.scenario === scenario && o.okTs === readingTs)
74
+ hit = o;
75
+ return hit;
76
+ }
77
+ export function latestPerScenario(readings) {
78
+ const m = new Map();
79
+ for (const r of readings)
80
+ m.set(r.scenario, r); // later lines overwrite earlier → last wins
81
+ return m;
82
+ }
@@ -0,0 +1,25 @@
1
+ export type TimelineEvent = {
2
+ at: number;
3
+ step: string;
4
+ node?: string;
5
+ };
6
+ export type StepTimeline = {
7
+ v: 2;
8
+ axis: string;
9
+ events: TimelineEvent[];
10
+ };
11
+ export type LegacyTimelineEvent = {
12
+ tMs: number;
13
+ step: string;
14
+ node?: string;
15
+ };
16
+ export type LegacyStepTimeline = {
17
+ v: 1;
18
+ events: LegacyTimelineEvent[];
19
+ };
20
+ export declare function validateTimeline(raw: unknown): string[];
21
+ export declare function normalizeTimeline(raw: unknown): {
22
+ axis: string;
23
+ events: TimelineEvent[];
24
+ };
25
+ export declare function stepAt(events: TimelineEvent[], pos: number): TimelineEvent | null;
@@ -0,0 +1,65 @@
1
+ const V2_EVENT_KEYS = new Set(['at', 'step', 'node']);
2
+ const V1_EVENT_KEYS = new Set(['tMs', 'step', 'node']);
3
+ export function validateTimeline(raw) {
4
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
5
+ return ['timeline must be a JSON object { v, axis, events }'];
6
+ const o = raw;
7
+ if (o.v !== 1 && o.v !== 2)
8
+ return ['`v` must be 1 (legacy time axis) or 2 (axis-tagged)'];
9
+ const errs = [];
10
+ const v2 = o.v === 2;
11
+ const posKey = v2 ? 'at' : 'tMs';
12
+ const rootKeys = v2 ? new Set(['v', 'axis', 'events']) : new Set(['v', 'events']);
13
+ const evKeys = v2 ? V2_EVENT_KEYS : V1_EVENT_KEYS;
14
+ for (const k of Object.keys(o))
15
+ if (!rootKeys.has(k))
16
+ errs.push(`unknown field \`${k}\` (allowed: ${[...rootKeys].join(', ')})`);
17
+ if (v2 && (typeof o.axis !== 'string' || !o.axis.trim()))
18
+ errs.push('`axis` must be a non-empty string (e.g. time, frame, line, index)');
19
+ if (!Array.isArray(o.events)) {
20
+ errs.push('`events` must be an array');
21
+ return errs;
22
+ }
23
+ let prev = -Infinity;
24
+ o.events.forEach((e, i) => {
25
+ if (typeof e !== 'object' || e === null || Array.isArray(e)) {
26
+ errs.push(`events[${i}] must be an object`);
27
+ return;
28
+ }
29
+ const ev = e;
30
+ for (const k of Object.keys(ev))
31
+ if (!evKeys.has(k))
32
+ errs.push(`events[${i}]: unknown field \`${k}\` (allowed: ${[...evKeys].join(', ')})`);
33
+ const pos = ev[posKey];
34
+ if (typeof pos !== 'number' || !Number.isFinite(pos) || pos < 0) {
35
+ errs.push(`events[${i}].${posKey} must be a finite number ≥ 0`);
36
+ }
37
+ else {
38
+ if (pos < prev)
39
+ errs.push(`events[${i}].${posKey} is out of order (the list is ordered by position)`);
40
+ prev = pos;
41
+ }
42
+ if (typeof ev.step !== 'string' || !ev.step.trim())
43
+ errs.push(`events[${i}].step must be a non-empty string`);
44
+ if (ev.node !== undefined && (typeof ev.node !== 'string' || !ev.node.trim()))
45
+ errs.push(`events[${i}].node must be a non-empty string when present`);
46
+ });
47
+ return errs;
48
+ }
49
+ export function normalizeTimeline(raw) {
50
+ const o = (raw ?? {});
51
+ const events = Array.isArray(o.events) ? o.events : [];
52
+ if (o.v === 1)
53
+ return { axis: 'time', events: events.map((e) => ({ at: e.tMs, step: e.step, ...(e.node ? { node: e.node } : {}) })) };
54
+ return { axis: typeof o.axis === 'string' ? o.axis : 'time', events: events.map((e) => ({ at: e.at, step: e.step, ...(e.node ? { node: e.node } : {}) })) };
55
+ }
56
+ export function stepAt(events, pos) {
57
+ let hit = null;
58
+ for (const e of events) {
59
+ if (e.at <= pos)
60
+ hit = e;
61
+ else
62
+ break;
63
+ }
64
+ return hit;
65
+ }
@@ -0,0 +1 @@
1
+ export declare const isUiPath: (p: string) => boolean;
@@ -0,0 +1,2 @@
1
+ const UI_FILE = /\.(jsx|tsx|vue|svelte|css)$/;
2
+ export const isUiPath = (p) => UI_FILE.test(p) || p.includes('spec-dashboard/');
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@spexcode/spec-eval",
3
+ "version": "0.6.5",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./dist/index.js",
7
+ "./sessioneval": "./dist/sessioneval.js",
8
+ "./evaltab": "./dist/evaltab.js",
9
+ "./cli": "./dist/cli.js",
10
+ "./cache": "./dist/cache.js",
11
+ "./filing": "./dist/filing.js",
12
+ "./humanok": "./dist/humanok.js",
13
+ "./scenarios": "./dist/scenarios.js",
14
+ "./host": "./dist/host.js",
15
+ "./remarks": "./dist/remarks.js",
16
+ "./package.json": "./package.json"
17
+ },
18
+ "files": ["dist"],
19
+ "description": "The eval/loss engine \u2014 eval.md declares scenarios, a flat evals.ndjson sidecar records readings (a second git-as-database axis), freshness compares each reading's stored scenario-contract hash and git ancestry on its governed code, and evidence lives content-addressed under the shared git common dir. `spex eval add|ls|scenario ls|lint|retract|clean`.",
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "build": "node ../scripts/build-dist.mjs",
25
+ "prepublishOnly": "node ../scripts/release-publish.mjs --from-package-publish",
26
+ "test": "tsx --import ../scripts/test-home.mjs --test src/*.test.ts"
27
+ },
28
+ "dependencies": {
29
+ "@spexcode/spec-core": "0.6.5"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^20.16.0",
33
+ "tsx": "^4.19.2",
34
+ "typescript": "^5.6.3"
35
+ }
36
+ }
@@ -0,0 +1,29 @@
1
+ import type { ForgeDriver, ForgeIssue, ForgePR } from './port.js';
2
+ import { type NodeLinks } from './links.js';
3
+ export type ForgeDelta = {
4
+ kind: 'issue';
5
+ issue: ForgeIssue;
6
+ } | {
7
+ kind: 'pr';
8
+ pr: ForgePR;
9
+ } | {
10
+ kind: 'remove';
11
+ target: 'issue' | 'pr';
12
+ number: number;
13
+ };
14
+ export declare class ForgeCache {
15
+ private issues;
16
+ private prs;
17
+ private revision;
18
+ apply(delta: ForgeDelta): void;
19
+ reconcile(driver: ForgeDriver): Promise<void>;
20
+ applyIssues(issues: ForgeIssue[]): void;
21
+ setPRs(prs: ForgePR[]): void;
22
+ view(nodeIds: string[]): NodeLinks[];
23
+ state(): {
24
+ issues: ForgeIssue[];
25
+ prs: ForgePR[];
26
+ };
27
+ stateRevision(): number;
28
+ private set;
29
+ }
@@ -0,0 +1,59 @@
1
+ import { resolveLinks } from './links.js';
2
+ function sameMap(a, b) {
3
+ if (a.size !== b.size)
4
+ return false;
5
+ for (const [number, value] of a)
6
+ if (!b.has(number) || JSON.stringify(value) !== JSON.stringify(b.get(number)))
7
+ return false;
8
+ return true;
9
+ }
10
+ export class ForgeCache {
11
+ issues = new Map();
12
+ prs = new Map();
13
+ revision = 0;
14
+ apply(delta) {
15
+ if (delta.kind === 'issue')
16
+ this.set(this.issues, delta.issue);
17
+ else if (delta.kind === 'pr')
18
+ this.set(this.prs, delta.pr);
19
+ else {
20
+ const target = delta.target === 'issue' ? this.issues : this.prs;
21
+ if (target.delete(delta.number))
22
+ this.revision++;
23
+ }
24
+ }
25
+ async reconcile(driver) {
26
+ const [issues, prs] = await Promise.all([driver.listIssues(), driver.listPRs()]);
27
+ const nextIssues = new Map(issues.map((i) => [i.number, i]));
28
+ const nextPRs = new Map(prs.map((p) => [p.number, p]));
29
+ if (!sameMap(this.issues, nextIssues) || !sameMap(this.prs, nextPRs))
30
+ this.revision++;
31
+ this.issues = nextIssues;
32
+ this.prs = nextPRs;
33
+ }
34
+ applyIssues(issues) {
35
+ for (const i of issues)
36
+ this.set(this.issues, i);
37
+ }
38
+ setPRs(prs) {
39
+ const next = new Map(prs.map((p) => [p.number, p]));
40
+ if (!sameMap(this.prs, next))
41
+ this.revision++;
42
+ this.prs = next;
43
+ }
44
+ view(nodeIds) {
45
+ return resolveLinks([...this.issues.values()], [...this.prs.values()], nodeIds);
46
+ }
47
+ state() {
48
+ return { issues: [...this.issues.values()], prs: [...this.prs.values()] };
49
+ }
50
+ stateRevision() {
51
+ return this.revision;
52
+ }
53
+ set(target, value) {
54
+ if (JSON.stringify(target.get(value.number)) !== JSON.stringify(value)) {
55
+ target.set(value.number, value);
56
+ this.revision++;
57
+ }
58
+ }
59
+ }
@@ -0,0 +1 @@
1
+ export declare function runIssueLinks(args: string[]): Promise<number>;
@@ -0,0 +1,100 @@
1
+ import { loadSpecs } from '@spexcode/spec-core';
2
+ import { FORGE_DRIVERS, forgeDriverFor, resolveForgeHost } from './drivers.js';
3
+ import { resolveLinks } from './links.js';
4
+ import { resolveEvalPending } from './needs-eval.js';
5
+ function flag(args, name) {
6
+ const i = args.indexOf(`--${name}`);
7
+ return i >= 0 ? args[i + 1] : undefined;
8
+ }
9
+ const has = (args, name) => args.includes(`--${name}`);
10
+ async function readForge(args) {
11
+ const host = flag(args, 'store') ?? resolveForgeHost();
12
+ const driver = forgeDriverFor(host);
13
+ if (!driver) {
14
+ console.error(`spex issue links: unknown --store '${host}' (known: ${FORGE_DRIVERS.map((d) => d.host).join(', ')})`);
15
+ return null;
16
+ }
17
+ const nodeIds = (await loadSpecs()).map((s) => s.id);
18
+ const [issues, prs] = await Promise.all([driver.listIssues(), driver.listPRs()]);
19
+ return { driver, nodeIds, issues, prs };
20
+ }
21
+ function render(links) {
22
+ const out = [];
23
+ for (const n of links) {
24
+ out.push(`\n${n.node}`);
25
+ if (n.issues.length) {
26
+ out.push(' issues:');
27
+ for (const i of n.issues)
28
+ out.push(` #${i.number} ${i.state} ${i.title} (via ${i.via}) ${i.url}`);
29
+ }
30
+ if (n.prs.length) {
31
+ out.push(' prs:');
32
+ for (const p of n.prs)
33
+ out.push(` #${p.number} ${p.state} ${p.title} ${p.headRefName} ${p.url}`);
34
+ }
35
+ }
36
+ return out.join('\n');
37
+ }
38
+ async function links(args) {
39
+ const forge = await readForge(args);
40
+ if (!forge)
41
+ return 2;
42
+ const { driver, nodeIds, issues, prs } = forge;
43
+ let resolved = resolveLinks(issues, prs, nodeIds);
44
+ const only = flag(args, 'node');
45
+ if (only) {
46
+ if (!nodeIds.includes(only)) {
47
+ console.error(`spex issue links: no such node '${only}'`);
48
+ return 1;
49
+ }
50
+ resolved = resolved.filter((n) => n.node === only);
51
+ }
52
+ if (has(args, 'json')) {
53
+ console.log(JSON.stringify(resolved, null, 2));
54
+ return 0;
55
+ }
56
+ const nIssues = resolved.reduce((a, n) => a + n.issues.length, 0);
57
+ const nPRs = resolved.reduce((a, n) => a + n.prs.length, 0);
58
+ console.log(`spec-forge · ${driver.host} · ${resolved.length} linked node(s) · ${nIssues} issue(s), ${nPRs} pr(s)` +
59
+ ` · traced ${issues.length} issue(s), ${prs.length} pr(s)`);
60
+ if (resolved.length)
61
+ console.log(render(resolved));
62
+ return 0;
63
+ }
64
+ function renderPending(pending) {
65
+ const out = [];
66
+ for (const n of pending) {
67
+ out.push(`\n${n.node}`);
68
+ for (const i of n.pending)
69
+ out.push(` #${i.number} ${i.state} ${i.title} (via ${i.via}) ${i.url}`);
70
+ }
71
+ return out.join('\n');
72
+ }
73
+ async function evalPending(args) {
74
+ const forge = await readForge(args);
75
+ if (!forge)
76
+ return 2;
77
+ const { driver, nodeIds, issues, prs } = forge;
78
+ let resolved = resolveEvalPending(issues, prs, nodeIds);
79
+ const only = flag(args, 'node');
80
+ if (only) {
81
+ if (!nodeIds.includes(only)) {
82
+ console.error(`spex issue links: no such node '${only}'`);
83
+ return 1;
84
+ }
85
+ resolved = resolved.filter((n) => n.node === only);
86
+ }
87
+ if (has(args, 'json')) {
88
+ console.log(JSON.stringify(resolved, null, 2));
89
+ return 0;
90
+ }
91
+ const nPending = resolved.reduce((a, n) => a + n.pending.length, 0);
92
+ console.log(`spec-forge · ${driver.host} · ${resolved.length} node(s) with eval pending · ${nPending} issue(s)` +
93
+ ` · traced ${issues.length} issue(s), ${prs.length} pr(s)`);
94
+ if (resolved.length)
95
+ console.log(renderPending(resolved));
96
+ return 0;
97
+ }
98
+ export async function runIssueLinks(args) {
99
+ return has(args, 'pending') ? evalPending(args) : links(args);
100
+ }
@@ -0,0 +1,2 @@
1
+ import type { ForgeDriver } from '../port.js';
2
+ export declare const githubDriver: ForgeDriver;
@@ -0,0 +1,116 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const run = promisify(execFile);
4
+ // maxBuffer is raised above the 1MB default: a busy repo's issue/PR JSON can exceed it
5
+ async function gh(args) {
6
+ const { stdout } = await run('gh', args, { maxBuffer: 16 * 1024 * 1024 });
7
+ return JSON.parse(stdout);
8
+ }
9
+ export const githubDriver = {
10
+ host: 'github',
11
+ // fetch open and closed in separate `--limit 200` windows and merge, so a flood of closed issues can't crowd the open set out of one shared `--state all` limit
12
+ async listIssues() {
13
+ const list = (state) => gh(['issue', 'list', '--state', state, '--limit', '200', '--json', 'number,title,body,url,state,labels,author,createdAt,comments']);
14
+ const [open, closed] = await Promise.all([list('open'), list('closed')]);
15
+ return [...open, ...closed].map((r) => ({
16
+ number: r.number,
17
+ title: r.title,
18
+ body: r.body ?? '',
19
+ url: r.url,
20
+ state: (r.state || '').toLowerCase(),
21
+ labels: forgeLabels(r.labels),
22
+ author: r.author?.login ?? '',
23
+ createdAt: r.createdAt ?? '',
24
+ comments: (r.comments ?? []).map((c) => ({ author: c.author?.login ?? '', createdAt: c.createdAt ?? '', body: c.body ?? '' })),
25
+ }));
26
+ },
27
+ async listIssuesSince(sinceISO) {
28
+ const out = [];
29
+ for (let page = 1; page <= 20; page++) {
30
+ const rows = await gh(['api', `repos/{owner}/{repo}/issues?state=all&since=${encodeURIComponent(sinceISO)}&per_page=100&page=${page}`]);
31
+ out.push(...rows);
32
+ if (rows.length < 100)
33
+ break;
34
+ }
35
+ return Promise.all(out.filter((r) => !r.pull_request).map(async (r) => ({
36
+ number: r.number,
37
+ title: r.title,
38
+ body: r.body ?? '',
39
+ url: r.html_url,
40
+ state: (r.state || '').toLowerCase(),
41
+ labels: forgeLabels(r.labels),
42
+ author: r.user?.login ?? '',
43
+ createdAt: r.created_at ?? '',
44
+ comments: r.comments > 0 ? await listComments(r.number) : [],
45
+ })));
46
+ },
47
+ async listPRs() {
48
+ const base = ['pr', 'list', '--state', 'open', '--limit', '200', '--json'];
49
+ const fields = 'number,title,url,state,headRefName';
50
+ let rows;
51
+ try {
52
+ rows = await gh([...base, `${fields},closingIssuesReferences`]);
53
+ }
54
+ catch (err) {
55
+ if (!isUnknownFieldError(err))
56
+ throw err;
57
+ warnNoTransitiveOnce();
58
+ rows = await gh([...base, fields]);
59
+ }
60
+ return rows.map((r) => ({
61
+ number: r.number,
62
+ title: r.title,
63
+ url: r.url,
64
+ state: r.state,
65
+ headRefName: r.headRefName,
66
+ closesIssues: (r.closingIssuesReferences ?? []).map((c) => c.number),
67
+ }));
68
+ },
69
+ async createIssue({ title, body }) {
70
+ const { stdout } = await run('gh', ['issue', 'create', '--title', title, '--body', body], { maxBuffer: 1024 * 1024 });
71
+ const url = stdout.trim().split('\n').pop() ?? '';
72
+ const number = parseInt(url.split('/').pop() ?? '', 10);
73
+ if (!url.startsWith('http') || !Number.isFinite(number))
74
+ throw new Error(`gh issue create returned an unexpected result: ${stdout.trim()}`);
75
+ return { number, url };
76
+ },
77
+ async createComment({ number, body }) {
78
+ const { stdout } = await run('gh', ['issue', 'comment', String(number), '--body', body], { maxBuffer: 1024 * 1024 });
79
+ const url = stdout.trim().split('\n').pop() ?? '';
80
+ if (!url.startsWith('http'))
81
+ throw new Error(`gh issue comment returned an unexpected result: ${stdout.trim()}`);
82
+ return { url };
83
+ },
84
+ // the lifecycle write verb (see port.ts). `gh issue close` does not reliably print a permalink, so read
85
+ // the issue URL back through gh's JSON surface after the close succeeds.
86
+ async closeIssue({ number }) {
87
+ await run('gh', ['issue', 'close', String(number)], { maxBuffer: 1024 * 1024 });
88
+ const r = await gh(['issue', 'view', String(number), '--json', 'url']);
89
+ if (!r.url?.startsWith('http'))
90
+ throw new Error(`gh issue view returned an unexpected url after close: ${JSON.stringify(r)}`);
91
+ return { url: r.url };
92
+ },
93
+ };
94
+ function forgeLabels(labels) {
95
+ return (labels ?? []).flatMap((label) => {
96
+ const name = typeof label === 'string' ? label : label.name ?? '';
97
+ return name ? [{ name, ...(typeof label === 'string' || !label.color ? {} : { color: label.color }) }] : [];
98
+ });
99
+ }
100
+ async function listComments(number) {
101
+ const rows = await gh(['api', `repos/{owner}/{repo}/issues/${number}/comments?per_page=100`]);
102
+ return rows.map((c) => ({ author: c.user?.login ?? '', createdAt: c.created_at ?? '', body: c.body ?? '' }));
103
+ }
104
+ function isUnknownFieldError(err) {
105
+ const e = err;
106
+ const text = `${e?.stderr ?? ''}\n${e?.message ?? ''}`;
107
+ return /unknown json field/i.test(text);
108
+ }
109
+ let warnedNoTransitive = false;
110
+ function warnNoTransitiveOnce() {
111
+ if (warnedNoTransitive)
112
+ return;
113
+ warnedNoTransitive = true;
114
+ console.warn('spec-forge: this `gh` is too old for `closingIssuesReferences` — transitive issue↔PR links are ' +
115
+ 'disabled (branch + `Spec:` marker links still work). Upgrade `gh` to restore them.');
116
+ }
@@ -0,0 +1,7 @@
1
+ import type { ForgeDriver } from '../port.js';
2
+ export declare function parseRemote(remote: string): {
3
+ base: string;
4
+ host: string;
5
+ project: string;
6
+ } | null;
7
+ export declare const gitlabDriver: ForgeDriver;