spexcode 0.6.2 → 0.6.6

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 (495) hide show
  1. package/README.md +3 -1
  2. package/bin/spex.mjs +4 -0
  3. package/node_modules/@spexcode/session-core/dist/delivery-queue.d.ts +23 -0
  4. package/node_modules/@spexcode/session-core/dist/delivery-queue.js +195 -0
  5. package/node_modules/@spexcode/session-core/dist/index.d.ts +5 -0
  6. package/node_modules/@spexcode/session-core/dist/index.js +5 -0
  7. package/node_modules/@spexcode/session-core/dist/internal.d.ts +3 -0
  8. package/node_modules/@spexcode/session-core/dist/internal.js +3 -0
  9. package/node_modules/@spexcode/session-core/dist/message.d.ts +22 -0
  10. package/node_modules/@spexcode/session-core/dist/message.js +52 -0
  11. package/node_modules/@spexcode/session-core/dist/record-lock.d.ts +7 -0
  12. package/node_modules/@spexcode/session-core/dist/record-lock.js +152 -0
  13. package/node_modules/@spexcode/session-core/dist/runtime-session.d.ts +50 -0
  14. package/node_modules/@spexcode/session-core/dist/runtime-session.js +286 -0
  15. package/node_modules/@spexcode/session-core/dist/session-cursors.d.ts +14 -0
  16. package/node_modules/@spexcode/session-core/dist/session-cursors.js +82 -0
  17. package/node_modules/@spexcode/session-core/dist/session-timeline.d.ts +46 -0
  18. package/node_modules/@spexcode/session-core/dist/session-timeline.js +216 -0
  19. package/node_modules/@spexcode/session-core/package.json +33 -0
  20. package/node_modules/@spexcode/spec-cli/bin/spex.mjs +77 -0
  21. package/node_modules/@spexcode/spec-cli/dist/attach.d.ts +2 -0
  22. package/node_modules/@spexcode/spec-cli/dist/attach.js +48 -0
  23. package/node_modules/@spexcode/spec-cli/dist/claude-headless.d.ts +36 -0
  24. package/node_modules/@spexcode/spec-cli/dist/claude-headless.js +316 -0
  25. package/node_modules/@spexcode/spec-cli/dist/cli.d.ts +1 -0
  26. package/node_modules/@spexcode/spec-cli/dist/cli.js +1908 -0
  27. package/node_modules/@spexcode/spec-cli/dist/client.d.ts +112 -0
  28. package/node_modules/@spexcode/spec-cli/dist/client.js +481 -0
  29. package/node_modules/@spexcode/spec-cli/dist/cockpit.d.ts +7 -0
  30. package/node_modules/@spexcode/spec-cli/dist/cockpit.js +26 -0
  31. package/node_modules/@spexcode/spec-cli/dist/codex-headless.d.ts +1 -0
  32. package/{spec-cli/src/codex-headless.ts → node_modules/@spexcode/spec-cli/dist/codex-headless.js} +3 -9
  33. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.d.ts +58 -0
  34. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.js +798 -0
  35. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.d.ts +1 -0
  36. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.js +90 -0
  37. package/node_modules/@spexcode/spec-cli/dist/contract-filter.d.ts +14 -0
  38. package/node_modules/@spexcode/spec-cli/dist/contract-filter.js +219 -0
  39. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.d.ts +6 -0
  40. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.js +50 -0
  41. package/node_modules/@spexcode/spec-cli/dist/doctor.d.ts +9 -0
  42. package/node_modules/@spexcode/spec-cli/dist/doctor.js +553 -0
  43. package/node_modules/@spexcode/spec-cli/dist/eval-host.d.ts +1 -0
  44. package/node_modules/@spexcode/spec-cli/dist/eval-host.js +19 -0
  45. package/node_modules/@spexcode/spec-cli/dist/execution-trace.d.ts +26 -0
  46. package/node_modules/@spexcode/spec-cli/dist/execution-trace.js +475 -0
  47. package/node_modules/@spexcode/spec-cli/dist/file-write.d.ts +2 -0
  48. package/node_modules/@spexcode/spec-cli/dist/file-write.js +26 -0
  49. package/node_modules/@spexcode/spec-cli/dist/flat.d.ts +89 -0
  50. package/node_modules/@spexcode/spec-cli/dist/flat.js +1076 -0
  51. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.d.ts +56 -0
  52. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.js +168 -0
  53. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.d.ts +28 -0
  54. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.js +363 -0
  55. package/node_modules/@spexcode/spec-cli/dist/gateway.d.ts +38 -0
  56. package/node_modules/@spexcode/spec-cli/dist/gateway.js +527 -0
  57. package/node_modules/@spexcode/spec-cli/dist/graphCache.d.ts +27 -0
  58. package/node_modules/@spexcode/spec-cli/dist/graphCache.js +717 -0
  59. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.d.ts +14 -0
  60. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.js +36 -0
  61. package/node_modules/@spexcode/spec-cli/dist/graphStream.d.ts +85 -0
  62. package/node_modules/@spexcode/spec-cli/dist/graphStream.js +1195 -0
  63. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.d.ts +64 -0
  64. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.js +166 -0
  65. package/node_modules/@spexcode/spec-cli/dist/guide.d.ts +8 -0
  66. package/{spec-cli/src/guide.ts → node_modules/@spexcode/spec-cli/dist/guide.js} +36 -32
  67. package/node_modules/@spexcode/spec-cli/dist/harness-select.d.ts +18 -0
  68. package/node_modules/@spexcode/spec-cli/dist/harness-select.js +62 -0
  69. package/node_modules/@spexcode/spec-cli/dist/harness.d.ts +338 -0
  70. package/node_modules/@spexcode/spec-cli/dist/harness.js +3146 -0
  71. package/node_modules/@spexcode/spec-cli/dist/headless-controller.d.ts +9 -0
  72. package/node_modules/@spexcode/spec-cli/dist/headless-controller.js +47 -0
  73. package/node_modules/@spexcode/spec-cli/dist/help.d.ts +15 -0
  74. package/node_modules/@spexcode/spec-cli/dist/help.js +594 -0
  75. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.d.ts +18 -0
  76. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.js +122 -0
  77. package/node_modules/@spexcode/spec-cli/dist/hooks.d.ts +1 -0
  78. package/{spec-cli/src/hooks.ts → node_modules/@spexcode/spec-cli/dist/hooks.js} +15 -15
  79. package/node_modules/@spexcode/spec-cli/dist/host-resources.d.ts +97 -0
  80. package/node_modules/@spexcode/spec-cli/dist/host-resources.js +795 -0
  81. package/node_modules/@spexcode/spec-cli/dist/host.d.ts +88 -0
  82. package/node_modules/@spexcode/spec-cli/dist/host.js +663 -0
  83. package/node_modules/@spexcode/spec-cli/dist/index.d.ts +1 -0
  84. package/node_modules/@spexcode/spec-cli/dist/index.js +899 -0
  85. package/node_modules/@spexcode/spec-cli/dist/init.d.ts +1 -0
  86. package/node_modules/@spexcode/spec-cli/dist/init.js +284 -0
  87. package/node_modules/@spexcode/spec-cli/dist/issues-cli.d.ts +6 -0
  88. package/node_modules/@spexcode/spec-cli/dist/issues-cli.js +334 -0
  89. package/node_modules/@spexcode/spec-cli/dist/issues.d.ts +69 -0
  90. package/node_modules/@spexcode/spec-cli/dist/issues.js +189 -0
  91. package/node_modules/@spexcode/spec-cli/dist/lint.d.ts +34 -0
  92. package/node_modules/@spexcode/spec-cli/dist/lint.js +476 -0
  93. package/node_modules/@spexcode/spec-cli/dist/listen.d.ts +8 -0
  94. package/node_modules/@spexcode/spec-cli/dist/listen.js +24 -0
  95. package/node_modules/@spexcode/spec-cli/dist/localIssues.d.ts +65 -0
  96. package/node_modules/@spexcode/spec-cli/dist/localIssues.js +582 -0
  97. package/node_modules/@spexcode/spec-cli/dist/login-page.d.ts +5 -0
  98. package/{spec-cli/src/login-page.ts → node_modules/@spexcode/spec-cli/dist/login-page.js} +7 -7
  99. package/node_modules/@spexcode/spec-cli/dist/loop-in.d.ts +23 -0
  100. package/{spec-cli/src/loop-in.ts → node_modules/@spexcode/spec-cli/dist/loop-in.js} +35 -45
  101. package/node_modules/@spexcode/spec-cli/dist/machine-peer.d.ts +69 -0
  102. package/node_modules/@spexcode/spec-cli/dist/machine-peer.js +603 -0
  103. package/node_modules/@spexcode/spec-cli/dist/materialize.d.ts +18 -0
  104. package/node_modules/@spexcode/spec-cli/dist/materialize.js +468 -0
  105. package/node_modules/@spexcode/spec-cli/dist/mentions.d.ts +50 -0
  106. package/node_modules/@spexcode/spec-cli/dist/mentions.js +117 -0
  107. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.d.ts +5 -0
  108. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.js +215 -0
  109. package/node_modules/@spexcode/spec-cli/dist/opencode.d.ts +3 -0
  110. package/{spec-cli/src/opencode.ts → node_modules/@spexcode/spec-cli/dist/opencode.js} +9 -13
  111. package/node_modules/@spexcode/spec-cli/dist/pi-harness.d.ts +3 -0
  112. package/{spec-cli/src/pi-harness.ts → node_modules/@spexcode/spec-cli/dist/pi-harness.js} +45 -40
  113. package/node_modules/@spexcode/spec-cli/dist/pi-headless.d.ts +25 -0
  114. package/node_modules/@spexcode/spec-cli/dist/pi-headless.js +196 -0
  115. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.d.ts +21 -0
  116. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.js +146 -0
  117. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.d.ts +10 -0
  118. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.js +404 -0
  119. package/node_modules/@spexcode/spec-cli/dist/pty-helper.d.mts +1 -0
  120. package/node_modules/@spexcode/spec-cli/dist/pty-helper.mjs +101 -0
  121. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.d.mts +2 -0
  122. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.mjs +23 -0
  123. package/node_modules/@spexcode/spec-cli/dist/public-graph.d.ts +46 -0
  124. package/node_modules/@spexcode/spec-cli/dist/public-graph.js +56 -0
  125. package/node_modules/@spexcode/spec-cli/dist/ranker.d.ts +15 -0
  126. package/node_modules/@spexcode/spec-cli/dist/ranker.js +188 -0
  127. package/node_modules/@spexcode/spec-cli/dist/reaper.d.ts +6 -0
  128. package/node_modules/@spexcode/spec-cli/dist/reaper.js +81 -0
  129. package/node_modules/@spexcode/spec-cli/dist/reviews.d.ts +189 -0
  130. package/node_modules/@spexcode/spec-cli/dist/reviews.js +350 -0
  131. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.d.ts +6 -0
  132. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.js +37 -0
  133. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.d.ts +21 -0
  134. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.js +84 -0
  135. package/node_modules/@spexcode/spec-cli/dist/runtime-rotate.d.ts +1 -0
  136. package/node_modules/@spexcode/spec-cli/dist/runtime-rotate.js +58 -0
  137. package/node_modules/@spexcode/spec-cli/dist/search.bench.d.mts +1 -0
  138. package/node_modules/@spexcode/spec-cli/dist/search.bench.mjs +75 -0
  139. package/node_modules/@spexcode/spec-cli/dist/search.d.ts +20 -0
  140. package/node_modules/@spexcode/spec-cli/dist/search.js +61 -0
  141. package/node_modules/@spexcode/spec-cli/dist/session-declarations.d.ts +13 -0
  142. package/node_modules/@spexcode/spec-cli/dist/session-declarations.js +126 -0
  143. package/node_modules/@spexcode/spec-cli/dist/session-execution.d.ts +10 -0
  144. package/node_modules/@spexcode/spec-cli/dist/session-execution.js +70 -0
  145. package/node_modules/@spexcode/spec-cli/dist/session-files.d.ts +28 -0
  146. package/node_modules/@spexcode/spec-cli/dist/session-files.js +130 -0
  147. package/node_modules/@spexcode/spec-cli/dist/session-follow.d.ts +31 -0
  148. package/node_modules/@spexcode/spec-cli/dist/session-follow.js +179 -0
  149. package/node_modules/@spexcode/spec-cli/dist/session-reparent.d.ts +10 -0
  150. package/node_modules/@spexcode/spec-cli/dist/session-reparent.js +33 -0
  151. package/node_modules/@spexcode/spec-cli/dist/session-timeline.d.ts +11 -0
  152. package/node_modules/@spexcode/spec-cli/dist/session-timeline.js +20 -0
  153. package/node_modules/@spexcode/spec-cli/dist/session-web.d.ts +24 -0
  154. package/node_modules/@spexcode/spec-cli/dist/session-web.js +141 -0
  155. package/node_modules/@spexcode/spec-cli/dist/sessions.d.ts +433 -0
  156. package/node_modules/@spexcode/spec-cli/dist/sessions.js +4667 -0
  157. package/node_modules/@spexcode/spec-cli/dist/sh.d.ts +1 -0
  158. package/node_modules/@spexcode/spec-cli/dist/sh.js +3 -0
  159. package/node_modules/@spexcode/spec-cli/dist/shim-runtime.d.ts +1 -0
  160. package/{spec-cli/src/shim-runtime.ts → node_modules/@spexcode/spec-cli/dist/shim-runtime.js} +3 -4
  161. package/node_modules/@spexcode/spec-cli/dist/slash-commands.d.ts +9 -0
  162. package/node_modules/@spexcode/spec-cli/dist/slash-commands.js +307 -0
  163. package/node_modules/@spexcode/spec-cli/dist/source-files.d.ts +9 -0
  164. package/node_modules/@spexcode/spec-cli/dist/source-files.js +113 -0
  165. package/node_modules/@spexcode/spec-cli/dist/supervise.d.ts +1 -0
  166. package/node_modules/@spexcode/spec-cli/dist/supervise.js +308 -0
  167. package/node_modules/@spexcode/spec-cli/dist/tree.d.ts +25 -0
  168. package/node_modules/@spexcode/spec-cli/dist/tree.js +98 -0
  169. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.d.ts +3 -0
  170. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.js +41 -0
  171. package/node_modules/@spexcode/spec-cli/dist/uninstall.d.ts +3 -0
  172. package/node_modules/@spexcode/spec-cli/dist/uninstall.js +177 -0
  173. package/node_modules/@spexcode/spec-cli/dist/uploads.d.ts +36 -0
  174. package/node_modules/@spexcode/spec-cli/dist/uploads.js +243 -0
  175. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.d.ts +1 -0
  176. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.js +47 -0
  177. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/dispatch.sh +5 -5
  178. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/harness.sh +1 -1
  179. package/node_modules/@spexcode/spec-cli/package.json +49 -0
  180. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +8 -0
  181. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec-first.sh +1 -1
  182. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec-of-file.sh +1 -0
  183. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/spec.md +2 -2
  184. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +31 -29
  185. package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +94 -0
  186. package/node_modules/@spexcode/spec-core/dist/anchors.js +730 -0
  187. package/node_modules/@spexcode/spec-core/dist/git.d.ts +170 -0
  188. package/node_modules/@spexcode/spec-core/dist/git.js +2768 -0
  189. package/node_modules/@spexcode/spec-core/dist/graph-delta.d.ts +44 -0
  190. package/node_modules/@spexcode/spec-core/dist/graph-delta.js +72 -0
  191. package/node_modules/@spexcode/spec-core/dist/graph.d.ts +34 -0
  192. package/node_modules/@spexcode/spec-core/dist/graph.js +237 -0
  193. package/node_modules/@spexcode/spec-core/dist/graphDelta.d.ts +3 -0
  194. package/node_modules/@spexcode/spec-core/dist/graphDelta.js +13 -0
  195. package/node_modules/@spexcode/spec-core/dist/harness-identity.d.ts +31 -0
  196. package/node_modules/@spexcode/spec-core/dist/harness-identity.js +20 -0
  197. package/node_modules/@spexcode/spec-core/dist/identity-presets.d.ts +152 -0
  198. package/node_modules/@spexcode/spec-core/dist/identity-presets.js +132 -0
  199. package/node_modules/@spexcode/spec-core/dist/index.d.ts +45 -0
  200. package/node_modules/@spexcode/spec-core/dist/index.js +19 -0
  201. package/node_modules/@spexcode/spec-core/dist/layout.d.ts +187 -0
  202. package/node_modules/@spexcode/spec-core/dist/layout.js +548 -0
  203. package/node_modules/@spexcode/spec-core/dist/process-identity.d.ts +37 -0
  204. package/node_modules/@spexcode/spec-core/dist/process-identity.js +214 -0
  205. package/node_modules/@spexcode/spec-core/dist/project-identity.d.ts +12 -0
  206. package/node_modules/@spexcode/spec-core/dist/project-identity.js +71 -0
  207. package/node_modules/@spexcode/spec-core/dist/project-store.d.ts +3 -0
  208. package/node_modules/@spexcode/spec-core/dist/project-store.js +14 -0
  209. package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +2 -0
  210. package/node_modules/@spexcode/spec-core/dist/resilience.js +40 -0
  211. package/node_modules/@spexcode/spec-core/dist/review/index.d.ts +3 -0
  212. package/node_modules/@spexcode/spec-core/dist/review/index.js +5 -0
  213. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +77 -0
  214. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +308 -0
  215. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +66 -0
  216. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +180 -0
  217. package/node_modules/@spexcode/spec-core/dist/review/session.d.ts +4 -0
  218. package/node_modules/@spexcode/spec-core/dist/review/session.js +8 -0
  219. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.d.ts +15 -0
  220. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.js +12 -0
  221. package/node_modules/@spexcode/spec-core/dist/root-lru.d.ts +4 -0
  222. package/{spec-cli/src/root-lru.ts → node_modules/@spexcode/spec-core/dist/root-lru.js} +26 -30
  223. package/node_modules/@spexcode/spec-core/dist/specs.d.ts +117 -0
  224. package/node_modules/@spexcode/spec-core/dist/specs.js +489 -0
  225. package/node_modules/@spexcode/spec-core/package.json +28 -0
  226. package/node_modules/@spexcode/spec-eval/dist/cache.d.ts +10 -0
  227. package/node_modules/@spexcode/spec-eval/dist/cache.js +50 -0
  228. package/node_modules/@spexcode/spec-eval/dist/cli.d.ts +22 -0
  229. package/node_modules/@spexcode/spec-eval/dist/cli.js +981 -0
  230. package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +98 -0
  231. package/node_modules/@spexcode/spec-eval/dist/evaltab.js +176 -0
  232. package/node_modules/@spexcode/spec-eval/dist/filing.d.ts +16 -0
  233. package/node_modules/@spexcode/spec-eval/dist/filing.js +36 -0
  234. package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +48 -0
  235. package/node_modules/@spexcode/spec-eval/dist/freshness.js +799 -0
  236. package/node_modules/@spexcode/spec-eval/dist/host.d.ts +46 -0
  237. package/node_modules/@spexcode/spec-eval/dist/host.js +53 -0
  238. package/node_modules/@spexcode/spec-eval/dist/humanok.d.ts +11 -0
  239. package/node_modules/@spexcode/spec-eval/dist/humanok.js +27 -0
  240. package/node_modules/@spexcode/spec-eval/dist/index.d.ts +4 -0
  241. package/node_modules/@spexcode/spec-eval/dist/index.js +4 -0
  242. package/node_modules/@spexcode/spec-eval/dist/remarks.d.ts +31 -0
  243. package/node_modules/@spexcode/spec-eval/dist/remarks.js +1 -0
  244. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.d.ts +13 -0
  245. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.js +303 -0
  246. package/node_modules/@spexcode/spec-eval/dist/scenarios.d.ts +99 -0
  247. package/node_modules/@spexcode/spec-eval/dist/scenarios.js +650 -0
  248. package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +307 -0
  249. package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +1883 -0
  250. package/node_modules/@spexcode/spec-eval/dist/sidecar.d.ts +55 -0
  251. package/node_modules/@spexcode/spec-eval/dist/sidecar.js +82 -0
  252. package/node_modules/@spexcode/spec-eval/dist/timeline.d.ts +25 -0
  253. package/node_modules/@spexcode/spec-eval/dist/timeline.js +65 -0
  254. package/node_modules/@spexcode/spec-eval/dist/ui-path.d.ts +1 -0
  255. package/node_modules/@spexcode/spec-eval/dist/ui-path.js +2 -0
  256. package/node_modules/@spexcode/spec-eval/package.json +36 -0
  257. package/node_modules/@spexcode/spec-forge/dist/cache.d.ts +29 -0
  258. package/node_modules/@spexcode/spec-forge/dist/cache.js +59 -0
  259. package/node_modules/@spexcode/spec-forge/dist/cli.d.ts +1 -0
  260. package/node_modules/@spexcode/spec-forge/dist/cli.js +100 -0
  261. package/node_modules/@spexcode/spec-forge/dist/drivers/github.d.ts +2 -0
  262. package/node_modules/@spexcode/spec-forge/dist/drivers/github.js +116 -0
  263. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.d.ts +7 -0
  264. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.js +144 -0
  265. package/node_modules/@spexcode/spec-forge/dist/drivers.d.ts +10 -0
  266. package/node_modules/@spexcode/spec-forge/dist/drivers.js +83 -0
  267. package/node_modules/@spexcode/spec-forge/dist/index.d.ts +4 -0
  268. package/node_modules/@spexcode/spec-forge/dist/index.js +4 -0
  269. package/node_modules/@spexcode/spec-forge/dist/links.d.ts +15 -0
  270. package/node_modules/@spexcode/spec-forge/dist/links.js +65 -0
  271. package/node_modules/@spexcode/spec-forge/dist/needs-eval.d.ts +10 -0
  272. package/node_modules/@spexcode/spec-forge/dist/needs-eval.js +20 -0
  273. package/node_modules/@spexcode/spec-forge/dist/port.d.ts +53 -0
  274. package/node_modules/@spexcode/spec-forge/dist/port.js +1 -0
  275. package/node_modules/@spexcode/spec-forge/dist/resident.d.ts +7 -0
  276. package/node_modules/@spexcode/spec-forge/dist/resident.js +43 -0
  277. package/node_modules/@spexcode/spec-forge/package.json +32 -0
  278. package/package.json +33 -19
  279. package/spec-cli/bin/spex.mjs +0 -69
  280. package/spec-cli/src/anchors.ts +0 -728
  281. package/spec-cli/src/attach.ts +0 -43
  282. package/spec-cli/src/claude-headless.ts +0 -321
  283. package/spec-cli/src/cli.ts +0 -1258
  284. package/spec-cli/src/client.ts +0 -414
  285. package/spec-cli/src/cockpit.ts +0 -43
  286. package/spec-cli/src/codex-runtime-generations.ts +0 -646
  287. package/spec-cli/src/commit-surgery.ts +0 -68
  288. package/spec-cli/src/contract-filter.ts +0 -202
  289. package/spec-cli/src/delivery-queue.ts +0 -165
  290. package/spec-cli/src/doctor.ts +0 -516
  291. package/spec-cli/src/execution-trace.ts +0 -444
  292. package/spec-cli/src/file-write.ts +0 -22
  293. package/spec-cli/src/gateway-auth.ts +0 -181
  294. package/spec-cli/src/gateway-hub.ts +0 -358
  295. package/spec-cli/src/gateway.ts +0 -461
  296. package/spec-cli/src/git.ts +0 -2556
  297. package/spec-cli/src/graph.ts +0 -271
  298. package/spec-cli/src/graphCache.ts +0 -710
  299. package/spec-cli/src/graphDelta.ts +0 -77
  300. package/spec-cli/src/graphStream.ts +0 -1019
  301. package/spec-cli/src/harness-select.ts +0 -77
  302. package/spec-cli/src/harness.ts +0 -3025
  303. package/spec-cli/src/headless-controller.ts +0 -63
  304. package/spec-cli/src/help.ts +0 -492
  305. package/spec-cli/src/host-resources.ts +0 -762
  306. package/spec-cli/src/host.ts +0 -611
  307. package/spec-cli/src/identity-presets.d.ts +0 -13
  308. package/spec-cli/src/identity-presets.js +0 -138
  309. package/spec-cli/src/index.ts +0 -818
  310. package/spec-cli/src/init.ts +0 -258
  311. package/spec-cli/src/issues-cli.ts +0 -276
  312. package/spec-cli/src/issues.ts +0 -237
  313. package/spec-cli/src/layout.ts +0 -640
  314. package/spec-cli/src/lint.ts +0 -488
  315. package/spec-cli/src/listen.ts +0 -28
  316. package/spec-cli/src/localIssues.ts +0 -538
  317. package/spec-cli/src/materialize.ts +0 -417
  318. package/spec-cli/src/mentions.ts +0 -81
  319. package/spec-cli/src/opencode-headless.ts +0 -205
  320. package/spec-cli/src/pi-headless.ts +0 -153
  321. package/spec-cli/src/plugin-harness.ts +0 -157
  322. package/spec-cli/src/process-identity.ts +0 -207
  323. package/spec-cli/src/project-identity.ts +0 -73
  324. package/spec-cli/src/project-store.ts +0 -17
  325. package/spec-cli/src/pty-bridge.ts +0 -396
  326. package/spec-cli/src/pty-helper.mjs +0 -96
  327. package/spec-cli/src/pty-native-helper.mjs +0 -22
  328. package/spec-cli/src/ranker.ts +0 -191
  329. package/spec-cli/src/reaper.ts +0 -125
  330. package/spec-cli/src/resilience.ts +0 -41
  331. package/spec-cli/src/reviewSnapshot.ts +0 -28
  332. package/spec-cli/src/reviews.ts +0 -434
  333. package/spec-cli/src/runtime-guard.ts +0 -35
  334. package/spec-cli/src/runtime-ownership.ts +0 -88
  335. package/spec-cli/src/search.bench.mjs +0 -80
  336. package/spec-cli/src/search.ts +0 -63
  337. package/spec-cli/src/session-cursors.ts +0 -91
  338. package/spec-cli/src/session-execution.ts +0 -68
  339. package/spec-cli/src/session-files.ts +0 -121
  340. package/spec-cli/src/session-follow.ts +0 -182
  341. package/spec-cli/src/session-reparent.ts +0 -33
  342. package/spec-cli/src/session-timeline.ts +0 -247
  343. package/spec-cli/src/session-web.ts +0 -135
  344. package/spec-cli/src/sessions.ts +0 -3883
  345. package/spec-cli/src/sh.ts +0 -3
  346. package/spec-cli/src/slash-commands.ts +0 -318
  347. package/spec-cli/src/source-files.ts +0 -104
  348. package/spec-cli/src/specs.ts +0 -498
  349. package/spec-cli/src/supervise.ts +0 -245
  350. package/spec-cli/src/tree.ts +0 -118
  351. package/spec-cli/src/tsx-bin.ts +0 -18
  352. package/spec-cli/src/uninstall.ts +0 -171
  353. package/spec-cli/src/uploads.ts +0 -253
  354. package/spec-cli/src/worktree-sources.ts +0 -42
  355. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +0 -8
  356. package/spec-dashboard/dist/assets/App-B6IbFbGu.js +0 -2
  357. package/spec-dashboard/dist/assets/Dashboard-C5ap-Sga.css +0 -1
  358. package/spec-dashboard/dist/assets/Dashboard-_sDk7Rcg.js +0 -27
  359. package/spec-dashboard/dist/assets/EvalsPage-BT357Lyt.js +0 -2
  360. package/spec-dashboard/dist/assets/IssuesPage-BG9rNOgV.js +0 -1
  361. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  362. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  363. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  364. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  365. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  366. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  367. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  368. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  369. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  370. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  371. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  372. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  373. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  374. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  375. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  376. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  377. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  378. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  379. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  380. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  381. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  382. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  383. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  384. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  385. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  386. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  387. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  388. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  389. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  390. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  391. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  392. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  393. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  394. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  395. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  396. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  397. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  398. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  399. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  400. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  401. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  402. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  403. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  404. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  405. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  406. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  407. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  408. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  409. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  410. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  411. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  412. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  413. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  414. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  415. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  416. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  417. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  418. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  419. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  420. package/spec-dashboard/dist/assets/MobileApp-D9yPMR3A.js +0 -2
  421. package/spec-dashboard/dist/assets/Modal-B3EcgeA3.js +0 -1
  422. package/spec-dashboard/dist/assets/PageScroll-CNZOugWV.js +0 -1
  423. package/spec-dashboard/dist/assets/ProjectsPage-C2CRHmvs.js +0 -1
  424. package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +0 -32
  425. package/spec-dashboard/dist/assets/SessionInterface-DOEjuT3l.js +0 -40
  426. package/spec-dashboard/dist/assets/SessionWindow-1nYgZ4CL.js +0 -1
  427. package/spec-dashboard/dist/assets/Settings-7WeTJn0V.js +0 -1
  428. package/spec-dashboard/dist/assets/Thread-CEbzAFQn.js +0 -13
  429. package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +0 -1
  430. package/spec-dashboard/dist/assets/data-SlvxNA2r.js +0 -1
  431. package/spec-dashboard/dist/assets/index-DLVeOHL-.js +0 -41
  432. package/spec-dashboard/dist/assets/index-DYLGfPjx.css +0 -1
  433. package/spec-dashboard/dist/assets/launch-Cp579UoJ.css +0 -1
  434. package/spec-dashboard/dist/assets/launch-yxCYr64x.js +0 -276
  435. package/spec-dashboard/dist/assets/sessionSurface--7l69h4F.js +0 -1
  436. package/spec-dashboard/dist/index.html +0 -29
  437. package/spec-dashboard/src/reviewFilters.js +0 -322
  438. package/spec-dashboard/src/reviewQuery.js +0 -174
  439. package/spec-dashboard/src/session.js +0 -199
  440. package/spec-eval/src/cache.ts +0 -57
  441. package/spec-eval/src/cli.ts +0 -894
  442. package/spec-eval/src/evaltab.ts +0 -264
  443. package/spec-eval/src/filing.ts +0 -39
  444. package/spec-eval/src/freshness.ts +0 -836
  445. package/spec-eval/src/humanok.ts +0 -28
  446. package/spec-eval/src/scenariofresh.ts +0 -244
  447. package/spec-eval/src/scenarios.ts +0 -672
  448. package/spec-eval/src/sessioneval.ts +0 -2220
  449. package/spec-eval/src/sidecar.ts +0 -93
  450. package/spec-eval/src/timeline.ts +0 -54
  451. package/spec-forge/src/__fixtures__/github-forge.json +0 -63
  452. package/spec-forge/src/cache.ts +0 -66
  453. package/spec-forge/src/cli.ts +0 -99
  454. package/spec-forge/src/drivers/github.ts +0 -132
  455. package/spec-forge/src/drivers/gitlab.ts +0 -153
  456. package/spec-forge/src/drivers.ts +0 -73
  457. package/spec-forge/src/links.ts +0 -72
  458. package/spec-forge/src/needs-eval.ts +0 -29
  459. package/spec-forge/src/port.ts +0 -36
  460. package/spec-forge/src/resident.ts +0 -46
  461. /package/{spec-cli → node_modules/@spexcode/spec-cli}/README.md +0 -0
  462. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -0
  463. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-sed-v0.fixture +0 -0
  464. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/commit-msg +0 -0
  465. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-checkout +0 -0
  466. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-merge +0 -0
  467. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/pre-commit +0 -0
  468. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/prepare-commit-msg +0 -0
  469. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/reference-transaction +0 -0
  470. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/extract/spec.md +0 -0
  471. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/regroup/spec.md +0 -0
  472. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/rename/spec.md +0 -0
  473. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/spec.md +0 -0
  474. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/tidy/spec.md +0 -0
  475. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/comment-altitude/spec.md +0 -0
  476. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/idle.sh +0 -0
  477. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/spec.md +0 -0
  478. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/mark-active.sh +0 -0
  479. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/spec.md +0 -0
  480. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/fail.sh +0 -0
  481. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/spec.md +0 -0
  482. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec.md +0 -0
  483. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec.md +0 -0
  484. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec.md +0 -0
  485. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +0 -0
  486. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/forge-link/spec.md +0 -0
  487. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +0 -0
  488. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +0 -0
  489. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/spec.md +0 -0
  490. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/digest.mjs +0 -0
  491. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/spec.md +0 -0
  492. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/spec.md +0 -0
  493. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/spec.md +0 -0
  494. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/spec.md +0 -0
  495. /package/{spec-cli → node_modules/@spexcode/spec-core}/templates/spexcode.json +0 -0
@@ -0,0 +1,64 @@
1
+ export declare const GUIDANCE_SCHEMA_VERSION: 1;
2
+ export declare const GUIDANCE_CATALOG_SCHEMA: "spexcode.guidance-catalog/v1";
3
+ export declare const GUIDANCE_PAYLOAD_NAME: "guidance-catalog.json";
4
+ export type GuidanceKind = 'plugin' | 'help' | 'guide';
5
+ export type GuidanceSurface = 'system' | 'command' | 'hook' | 'skill' | 'agent' | 'review';
6
+ export type GuidanceContentRole = 'prompt' | 'help' | 'guide' | 'signal';
7
+ export type GuidanceSource = Readonly<{
8
+ path: string;
9
+ contentHash: string;
10
+ revision: string;
11
+ }>;
12
+ export type GuidanceEntry = Readonly<{
13
+ id: string;
14
+ kind: GuidanceKind;
15
+ surface?: GuidanceSurface;
16
+ title: string;
17
+ description: string;
18
+ contentRole: GuidanceContentRole;
19
+ content: string;
20
+ source: GuidanceSource;
21
+ runtime?: Readonly<{
22
+ path: string;
23
+ revision: string;
24
+ events: readonly string[];
25
+ order: number;
26
+ block: boolean;
27
+ }>;
28
+ }>;
29
+ export type EffectiveSystemContract = Readonly<{
30
+ content: string;
31
+ contentHash: string;
32
+ sourceEntryIds: readonly string[];
33
+ }>;
34
+ export type GuidanceBundle = Readonly<{
35
+ schemaVersion: typeof GUIDANCE_SCHEMA_VERSION;
36
+ revision: string;
37
+ entries: readonly GuidanceEntry[];
38
+ bundleHash: string;
39
+ catalogSchema: typeof GUIDANCE_CATALOG_SCHEMA;
40
+ payloadName: typeof GUIDANCE_PAYLOAD_NAME;
41
+ sourceRevision: string;
42
+ effectiveSystemContract: EffectiveSystemContract;
43
+ }>;
44
+ type GitReader = (args: string[]) => string;
45
+ export type GuidanceCatalogOptions = Readonly<{
46
+ root?: string;
47
+ revision?: string;
48
+ sourceRevision?: (path: string) => string;
49
+ gitReader?: GitReader;
50
+ }>;
51
+ /**
52
+ * Immutable product-side projection over the authoritative plugin/help/guide surfaces.
53
+ * The constructor reads existing registries and materializes one export payload at call time.
54
+ */
55
+ export declare class GuidanceCatalog {
56
+ readonly bundle: GuidanceBundle;
57
+ constructor(options?: GuidanceCatalogOptions);
58
+ entries(): readonly GuidanceEntry[];
59
+ toJSON(): GuidanceBundle;
60
+ exportJson(): string;
61
+ write(path: string): void;
62
+ }
63
+ export declare function buildGuidanceCatalog(options?: GuidanceCatalogOptions): GuidanceCatalog;
64
+ export {};
@@ -0,0 +1,166 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { writeFileSync } from 'node:fs';
3
+ import { join, relative } from 'node:path';
4
+ import { git, repoRoot } from '@spexcode/spec-core';
5
+ import { loadAgentConfig, loadConfig, loadHookConfig, loadReviewConfig, loadSkillConfig, loadSystemConfig, } from '@spexcode/spec-core';
6
+ import { helpCatalogEntries } from './help.js';
7
+ import { guideCatalogEntries } from './guide.js';
8
+ import { HookPromptCatalog, HOOK_PROMPT_SOURCE } from './hook-prompts.js';
9
+ export const GUIDANCE_SCHEMA_VERSION = 1;
10
+ export const GUIDANCE_CATALOG_SCHEMA = 'spexcode.guidance-catalog/v1';
11
+ export const GUIDANCE_PAYLOAD_NAME = 'guidance-catalog.json';
12
+ const SURFACES = [
13
+ ['agent', loadAgentConfig],
14
+ ['command', loadConfig],
15
+ ['hook', loadHookConfig],
16
+ ['review', loadReviewConfig],
17
+ ['skill', loadSkillConfig],
18
+ ['system', loadSystemConfig],
19
+ ];
20
+ const sha256 = (text) => createHash('sha256').update(text, 'utf8').digest('hex');
21
+ function freeze(value) {
22
+ if (!value || typeof value !== 'object' || Object.isFrozen(value))
23
+ return value;
24
+ for (const child of Object.values(value))
25
+ freeze(child);
26
+ return Object.freeze(value);
27
+ }
28
+ function sourcePathForPreset(preset) {
29
+ return join(preset.dir, 'spec.md').replaceAll('\\', '/');
30
+ }
31
+ function sortEntries(entries) {
32
+ return entries.sort((a, b) => {
33
+ const left = `${a.kind}\0${a.id}\0${a.surface ?? ''}\0${a.source.path}`;
34
+ const right = `${b.kind}\0${b.id}\0${b.surface ?? ''}\0${b.source.path}`;
35
+ return left < right ? -1 : left > right ? 1 : 0;
36
+ });
37
+ }
38
+ function sourceRevision(root, path, readGit) {
39
+ const result = readGit(['-C', root, 'log', '-1', '--format=%H', '--', path]).trim();
40
+ return result || 'working-tree';
41
+ }
42
+ function currentRevision(root, readGit) {
43
+ return readGit(['-C', root, 'rev-parse', 'HEAD']).trim() || 'working-tree';
44
+ }
45
+ function entrySource(root, path, text, revision, readSourceRevision) {
46
+ return { path: relative(root, join(root, path)).replaceAll('\\', '/'), contentHash: sha256(text), revision: readSourceRevision(path) || revision };
47
+ }
48
+ /**
49
+ * Immutable product-side projection over the authoritative plugin/help/guide surfaces.
50
+ * The constructor reads existing registries and materializes one export payload at call time.
51
+ */
52
+ export class GuidanceCatalog {
53
+ bundle;
54
+ constructor(options = {}) {
55
+ const root = options.root ?? repoRoot();
56
+ const readGit = options.gitReader ?? git;
57
+ const revision = options.revision ?? currentRevision(root, readGit);
58
+ const readSourceRevision = options.sourceRevision ?? ((path) => sourceRevision(root, path, readGit));
59
+ const sourceRevisions = new Map();
60
+ const sourceRevisionFor = (path) => {
61
+ const known = sourceRevisions.get(path);
62
+ if (known)
63
+ return known;
64
+ const value = readSourceRevision(path) || revision;
65
+ sourceRevisions.set(path, value);
66
+ return value;
67
+ };
68
+ const entries = [];
69
+ const hookPrompts = new HookPromptCatalog();
70
+ for (const [surface, loader] of SURFACES) {
71
+ for (const preset of loader()) {
72
+ if (surface === 'hook') {
73
+ const prompt = hookPrompts.entry(preset.name);
74
+ const handler = preset.files.find((file) => file.endsWith('.sh'));
75
+ if (!handler)
76
+ throw new Error(`surface:hook node '${preset.name}' ships no .sh script (one co-located .sh required)`);
77
+ entries.push({
78
+ id: `plugin:${surface}:${preset.name}`,
79
+ kind: 'plugin',
80
+ surface,
81
+ title: prompt.title,
82
+ description: prompt.description,
83
+ contentRole: prompt.role,
84
+ content: prompt.content,
85
+ source: entrySource(root, HOOK_PROMPT_SOURCE, prompt.content, revision, sourceRevisionFor),
86
+ runtime: {
87
+ path: handler,
88
+ revision: sourceRevisionFor(handler),
89
+ events: [...preset.events],
90
+ order: preset.order,
91
+ block: preset.block,
92
+ },
93
+ });
94
+ continue;
95
+ }
96
+ const path = sourcePathForPreset(preset);
97
+ entries.push({
98
+ id: `plugin:${surface}:${preset.name}`,
99
+ kind: 'plugin',
100
+ surface,
101
+ title: preset.title,
102
+ description: preset.desc,
103
+ contentRole: 'prompt',
104
+ content: preset.body,
105
+ source: entrySource(root, path, preset.body, revision, sourceRevisionFor),
106
+ });
107
+ }
108
+ }
109
+ for (const entry of helpCatalogEntries()) {
110
+ const path = 'spec-cli/src/help.ts';
111
+ entries.push({
112
+ id: `help:${entry.id}`,
113
+ kind: 'help',
114
+ title: entry.title,
115
+ description: 'CLI command usage and safety guidance',
116
+ contentRole: 'help',
117
+ content: entry.text,
118
+ source: entrySource(root, path, entry.text, revision, sourceRevisionFor),
119
+ });
120
+ }
121
+ for (const entry of guideCatalogEntries()) {
122
+ const path = 'spec-cli/src/guide.ts';
123
+ entries.push({
124
+ id: `guide:${entry.id}`,
125
+ kind: 'guide',
126
+ title: entry.title,
127
+ description: 'CLI workflow and format guidance',
128
+ contentRole: 'guide',
129
+ content: entry.text,
130
+ source: entrySource(root, path, entry.text, revision, sourceRevisionFor),
131
+ });
132
+ }
133
+ const systemEntries = entries.filter((entry) => entry.kind === 'plugin' && entry.surface === 'system');
134
+ const effectiveSystemContent = systemEntries.map((entry) => entry.content.trim()).filter(Boolean).join('\n\n');
135
+ const payload = {
136
+ schemaVersion: GUIDANCE_SCHEMA_VERSION,
137
+ revision,
138
+ entries: sortEntries(entries),
139
+ catalogSchema: GUIDANCE_CATALOG_SCHEMA,
140
+ payloadName: GUIDANCE_PAYLOAD_NAME,
141
+ sourceRevision: revision,
142
+ effectiveSystemContract: {
143
+ content: effectiveSystemContent,
144
+ contentHash: sha256(effectiveSystemContent),
145
+ sourceEntryIds: systemEntries.map((entry) => entry.id),
146
+ },
147
+ };
148
+ const bundleHash = sha256(JSON.stringify(payload));
149
+ this.bundle = freeze({ ...payload, bundleHash });
150
+ }
151
+ entries() {
152
+ return this.bundle.entries;
153
+ }
154
+ toJSON() {
155
+ return this.bundle;
156
+ }
157
+ exportJson() {
158
+ return `${JSON.stringify(this.bundle, null, 2)}\n`;
159
+ }
160
+ write(path) {
161
+ writeFileSync(path, this.exportJson(), 'utf8');
162
+ }
163
+ }
164
+ export function buildGuidanceCatalog(options = {}) {
165
+ return new GuidanceCatalog(options);
166
+ }
@@ -0,0 +1,8 @@
1
+ export declare function guideText(topic?: string): string | null;
2
+ export declare function guideTopics(): string[];
3
+ export type GuideCatalogEntry = Readonly<{
4
+ id: string;
5
+ title: string;
6
+ text: string;
7
+ }>;
8
+ export declare function guideCatalogEntries(): readonly GuideCatalogEntry[];
@@ -42,8 +42,7 @@ Look these up on demand — the formats an agent authors, and the settings it co
42
42
  spex guide settings the spexcode.json / spexcode.local.json settings (launchers, dashboard icon, upload,
43
43
  lint budgets, layout) — every field, and which of the two files it belongs in
44
44
  spex guide footprint the footprint model — what SpexCode plants in a repo, and who sees it
45
- (committed | ignored | hidden), and every migration recipe`
46
-
45
+ (committed | ignored | hidden), and every migration recipe`;
47
46
  const SPEC = `spex guide spec — the spec.md file format
48
47
 
49
48
  A spec node is a DIRECTORY under .spec/<project>/…/<id>/ holding a spec.md. The node's id is its leaf dir
@@ -154,8 +153,7 @@ LIFECYCLE: author each node on a node/<id> branch, one node per commit; \`spex s
154
153
  before merge. \`spex init\` seeds the first tree; \`spex guide eval\` covers the sibling eval.md, the measurement file.
155
154
 
156
155
  SHARED LANDING: if the shared checkout is mid-merge, wait. Never abort or resolve someone else's merge; if your
157
- own landing stops half-merged, abort it and report.`
158
-
156
+ own landing stops half-merged, abort it and report.`;
159
157
  const EVAL = `spex guide eval — the eval.md file format
160
158
 
161
159
  An eval.md sits BESIDE a node's spec.md and says how to MEASURE the node's loss — the gap between live
@@ -197,11 +195,11 @@ pre-commit \`internal check-staged\` BLOCKS the commit.
197
195
  BODY (after the frontmatter): prose naming the measurement method — YATU ("You As The User"): the agent
198
196
  looks at / calls the real product surface, not an internal helper chosen to make the evidence easy.
199
197
 
200
- REPAIR PROOF: for a bug fix, use one scenario's fail→pass pair. A, BEFORE EDITING: find the violated scenario
198
+ REPAIR EVIDENCE: for a bug fix, use one scenario's fail→pass pair. A, BEFORE EDITING: find the violated scenario
201
199
  or add one to \`eval.md\`, run it against the old committed behavior, and file
202
200
  \`spex eval add <node> --scenario <s> --fail\` with evidence of the failure. B, AFTER EDITING: run that same
203
201
  scenario against the working tree until it passes; commit the verified tree; then file
204
- \`spex eval add <node> --scenario <s> --pass\`. The reading's \`codeSha\` must be that commit. New intent has no
202
+ \`spex eval add <node> --scenario <s> --pass\`. The measurement's \`codeSha\` must be that commit. New intent has no
205
203
  prior failure to reproduce.
206
204
 
207
205
  MEASURING AND FILING: the agent runs the scenario however it likes (a browser run, an API
@@ -255,7 +253,7 @@ off the surface under test. A ratio whose halves share one source says only "wha
255
253
  selector that silently drops half the population reports \`3 of 3\` when the truth is 6. Two weaker defences
256
254
  that do not substitute — a precondition sentence depends on the next author remembering it, a printed
257
255
  denominator depends on a reader noticing it. Nothing here enforces either (the schema has no population
258
- field), so treat a zero-population run as a NON-reading and do not file it. Cheaper than any of that, when
256
+ field), so treat a zero-population run as a NON-measurement and do not file it. Cheaper than any of that, when
259
257
  you can get it: restate the claim over something the product CANNOT make empty. "every active node's name is
260
258
  readable" needs someone to arrange activity and goes vacuous when nobody does; "the rendered size never falls
261
259
  below the authored size" is a property of the viewport itself, true of a one-node graph, and has no
@@ -263,7 +261,7 @@ population to get wrong. A claim with no population beats a well-reported one.
263
261
  RENDERED GEOMETRY (browser): measure the rendered BOX, never the authored STYLE. An ancestor CSS \`transform\`
264
262
  — the ordinary zoom/pan wrapper on a canvas or graph view — does NOT change computed style, so
265
263
  \`getComputedStyle(el).fontSize\` answers the AUTHORED size while the screen shows that size times the
266
- ancestor scale, and the reading is a SILENT FALSE PASS. (No numbers here on purpose: the authored size is
264
+ ancestor scale, and the measurement is a SILENT FALSE PASS. (No numbers here on purpose: the authored size is
267
265
  whatever this project's stylesheet says today, and a manual that hard-codes one teaches a constant that
268
266
  drifts — read it off the tree you are measuring.) Go through \`getBoundingClientRect()\` (it carries the
269
267
  ancestor scale) and derive the effective size from the box, or from a known string's width. This is also why
@@ -292,10 +290,8 @@ code file or the scenario (the eval.md) moves since it was filed.
292
290
  eval-owners (a file governed by > maxOwners scenarios — split it)
293
291
  spex eval ls <node> the eval timeline (verdict · freshness · evidence), newest first
294
292
  spex eval scenario ls [<node>] the declared contracts; text --unmeasured = blind-spot worklist; --json = canonical declaration index
295
- spex eval clean GC the content-addressed evidence cache`
296
-
297
- const UPLOAD_DEFAULTS = uploadPolicyDefaults()
298
-
293
+ spex eval clean GC the content-addressed evidence cache`;
294
+ const UPLOAD_DEFAULTS = uploadPolicyDefaults();
299
295
  const SETTINGS = `spex guide settings — SpexCode's runtime settings (spexcode.json / spexcode.local.json)
300
296
 
301
297
  SpexCode reads PROJECT runtime settings from TWO optional JSON files at the repo root. There is no imperative
@@ -535,8 +531,7 @@ Example — tune opt-in health diagnosis without changing the lint gate:
535
531
  stamps the explicit choice, and a missing field fails materialize loud. PERSISTENT and
536
532
  git-transactional: the edit takes effect at the next git-native materialize anchor (the commit
537
533
  that carries it, a checkout/merge that receives it, or a manual \`spex materialize\`) — a
538
- deselected harness's artifacts are pruned by that pass.`
539
-
534
+ deselected harness's artifacts are pruned by that pass.`;
540
535
  const FOOTPRINT = `spex guide footprint — what SpexCode plants in a repo, and who sees it (one fixed behavior per kind)
541
536
 
542
537
  SpexCode claims software engineering's HEAD (the recording of intent) and TAIL (the storage of
@@ -616,8 +611,7 @@ not a flag flip.
616
611
  legacy untracked spec track the sources once: git add .spec spexcode.json (commit on your branch)
617
612
  WARNING: tracking is not retroactive secrecy — history already pushed
618
613
  elsewhere cannot be recalled.
619
- back out entirely \`spex uninstall\` (add --hooks to also remove the spexcode git hooks).`
620
-
614
+ back out entirely \`spex uninstall\` (add --hooks to also remove the spexcode git hooks).`;
621
615
  const FILES = `spex guide files — hand an agent artifact back to the human
622
616
 
623
617
  Use the session's file list when an artifact belongs in the human's hands:
@@ -639,8 +633,7 @@ reports that it no longer exists. The backend refuses a preview or download for
639
633
  list.
640
634
 
641
635
  This is the reverse of a dashboard attachment: [[file-attach]] sends human bytes to an agent. Files publishes
642
- an agent-owned path for a human to download.`
643
-
636
+ an agent-owned path for a human to download.`;
644
637
  const WEB = `spex guide web — hand a running local web service to the human
645
638
 
646
639
  Use the session web list after starting a local page the human should inspect:
@@ -656,25 +649,36 @@ preview, including WebSocket traffic, so changes to the running service are visi
656
649
  Only loopback HTTP URLs with an explicit port are accepted: 127.0.0.1, localhost, or ::1. The service remains
657
650
  host-local and must stay running. A stopped service remains listed and reports that its upstream is unavailable.
658
651
  The proxy has a path prefix, so use relative asset/navigation URLs or configure your dev server's base path;
659
- hard-coded root-absolute Vite/Next assets cannot be made portable by a proxy guessing at JavaScript.`
660
-
661
- const TOPICS: Record<string, string> = { spec: SPEC, eval: EVAL, settings: SETTINGS, footprint: FOOTPRINT, files: FILES, web: WEB }
662
-
652
+ hard-coded root-absolute Vite/Next assets cannot be made portable by a proxy guessing at JavaScript.`;
653
+ const TOPICS = { spec: SPEC, eval: EVAL, settings: SETTINGS, footprint: FOOTPRINT, files: FILES, web: WEB };
663
654
  // every guide page ends by naming the OTHER help layer, so a reader never dead-ends here: guide is
664
655
  // the skill layer (workflows · formats · settings); command usage lives in help.ts's two layers.
665
- const FOOTER = `\n\n(This is the skill layer. Command usage: \`spex help\` for the map, \`spex help <command>\` for one command.)`
666
-
656
+ const FOOTER = `\n\n(This is the skill layer. Command usage: \`spex help\` for the map, \`spex help <command>\` for one command.)`;
667
657
  // null = unknown topic: the caller fails loud (exit non-zero) while still naming the layers to go
668
658
  // back to — an unknown topic must never read as a successful page ([[cli-surface]]'s dead-end rule).
669
- export function guideText(topic?: string): string | null {
670
- if (!topic) return SETUP + FOOTER
671
- const t = TOPICS[topic]
672
- return t ? t + FOOTER : null
659
+ export function guideText(topic) {
660
+ if (!topic)
661
+ return SETUP + FOOTER;
662
+ const t = TOPICS[topic];
663
+ return t ? t + FOOTER : null;
673
664
  }
674
-
675
665
  // @@@ the unknown-topic list is DERIVED, never re-typed - a hand-kept enumeration goes blind the moment a
676
666
  // topic is added beside it, and it did: `files` and `web` shipped while the error still named four.
677
- export function guideTopics(): string[] {
678
- return Object.keys(TOPICS)
667
+ export function guideTopics() {
668
+ return Object.keys(TOPICS);
669
+ }
670
+ // The catalog indexes the same rendered pages the CLI serves. Keeping this projection beside TOPICS makes a
671
+ // newly registered page automatically appear in the export and in the unknown-topic diagnostic.
672
+ export function guideCatalogEntries() {
673
+ const entries = [];
674
+ const setup = guideText();
675
+ if (setup)
676
+ entries.push({ id: 'setup', title: 'spex guide', text: setup });
677
+ for (const topic of guideTopics()) {
678
+ const text = guideText(topic);
679
+ if (text)
680
+ entries.push({ id: topic, title: `spex guide ${topic}`, text });
681
+ }
682
+ return entries;
679
683
  }
680
- import { uploadPolicyDefaults } from './layout.js'
684
+ import { uploadPolicyDefaults } from '@spexcode/spec-core';
@@ -0,0 +1,18 @@
1
+ import { type Harness, type HarnessId } from './harness.js';
2
+ export type HarnessTarget = {
3
+ kind: 'native';
4
+ id: HarnessId;
5
+ } | {
6
+ kind: 'plugin';
7
+ folder: string;
8
+ };
9
+ export declare const NATIVE_HARNESS_IDS: readonly HarnessId[];
10
+ export declare function parseHarnessFlag(spec: string): unknown[];
11
+ export declare function resolveHarnessTargets(raw: unknown): HarnessTarget[];
12
+ export declare function partitionHarnesses(targets: HarnessTarget[]): {
13
+ selected: Harness[];
14
+ unselected: Harness[];
15
+ plugins: {
16
+ folder: string;
17
+ }[];
18
+ };
@@ -0,0 +1,62 @@
1
+ import { HARNESSES } from './harness.js';
2
+ // the native vocabulary (for messages and init's flag parsing). There is NO default set: the delivery
3
+ // targets are an explicit adopter choice, stamped by `spex init --harness` and read back from config forever.
4
+ export const NATIVE_HARNESS_IDS = HARNESSES.map((h) => h.id);
5
+ const KNOWN = HARNESSES.map((h) => h.id);
6
+ // the one-line repair every missing-selection error carries — the field is REQUIRED, never defaulted,
7
+ // because with many harnesses a silent "deliver everywhere" would litter the adopter's tree with artifacts
8
+ // for tools they never installed.
9
+ const MISSING = `spexcode.json has no "harnesses" field — the delivery targets are an EXPLICIT choice, never a default. Declare it, e.g. "harnesses": ["claude"] — members are native ids (${KNOWN.join(', ')}) or {"plugin":"<folder>"}. Fresh adoption: \`spex init --harness <ids>\` stamps it.`;
10
+ // parse `spex init --harness <spec>` into the raw JSON members the `harnesses` field carries: a comma-
11
+ // separated list where `plugin:<folder>` means a plugin target and anything else is a native id. Pure
12
+ // spelling translation — legality (unknown ids, plugin exclusivity) stays with resolveHarnessTargets.
13
+ export function parseHarnessFlag(spec) {
14
+ return spec.split(',').map((s) => s.trim()).filter(Boolean)
15
+ .map((s) => (s.startsWith('plugin:') ? { plugin: s.slice('plugin:'.length) } : s));
16
+ }
17
+ // parse + validate the spexcode.json `harnesses` field into resolved targets. FAIL LOUD on an illegal set —
18
+ // materialize and init both gate on this so a bad config never silently delivers the wrong thing. `raw` is the
19
+ // JSON value as written; a MISSING field is itself illegal (the choice must exist, stamped by init).
20
+ export function resolveHarnessTargets(raw) {
21
+ if (raw === undefined || raw === null)
22
+ throw new Error(MISSING);
23
+ if (!Array.isArray(raw))
24
+ throw new Error(`spexcode.json "harnesses" must be an ARRAY of targets (got ${typeof raw}). Members are native ids (${KNOWN.join(', ')}) or {"plugin":"<folder>"}.`);
25
+ if (raw.length === 0)
26
+ throw new Error(`spexcode.json "harnesses" is EMPTY — list at least one target: native ids (${KNOWN.join(', ')}) or {"plugin":"<folder>"}.`);
27
+ const targets = [];
28
+ for (const m of raw) {
29
+ if (typeof m === 'string') {
30
+ if (m === 'plugin')
31
+ throw new Error(`spexcode.json "harnesses": a plugin target needs an EXPLICIT landing folder — write {"plugin":"<folder>"} (e.g. {"plugin":".adopter-a"}), not the bare string "plugin", because each host agent reads a different plugins dir.`);
32
+ if (!KNOWN.includes(m))
33
+ throw new Error(`spexcode.json "harnesses": unknown harness id "${m}" — known native ids are ${KNOWN.join(', ')}, or use {"plugin":"<folder>"}.`);
34
+ targets.push({ kind: 'native', id: m });
35
+ }
36
+ else if (m && typeof m === 'object' && !Array.isArray(m) && 'plugin' in m) {
37
+ const folder = m.plugin;
38
+ if (typeof folder !== 'string' || !folder.trim())
39
+ throw new Error(`spexcode.json "harnesses": a {"plugin":…} target needs a NON-EMPTY folder string (e.g. {"plugin":".adopter-a"}) — each host agent reads a different plugins dir, so the folder must be explicit.`);
40
+ targets.push({ kind: 'plugin', folder: folder.trim() });
41
+ }
42
+ else {
43
+ throw new Error(`spexcode.json "harnesses": each member must be a native id string (${KNOWN.join(', ')}) or a {"plugin":"<folder>"} object — got ${JSON.stringify(m)}.`);
44
+ }
45
+ }
46
+ // PLUGIN EXCLUSIVITY: a plugin bundle is a SUPERSET delivery to its host agent, so pairing it with any
47
+ // native harness double-delivers. So a set with a plugin may carry NO native harness.
48
+ const natives = targets.filter((t) => t.kind === 'native');
49
+ if (targets.some((t) => t.kind === 'plugin') && natives.length)
50
+ throw new Error(`spexcode.json "harnesses": a plugin target is EXCLUSIVE — it cannot coexist with native harnesses (${natives.map((t) => t.id).join(', ')}). A plugin bundle already delivers the whole system to its host agent, so pairing it with a native harness double-delivers. Choose EITHER native harnesses OR plugin target(s).`);
51
+ return targets;
52
+ }
53
+ // split the live HARNESSES adapters by whether the resolved targets SELECT them: selected get write()n,
54
+ // unselected get clean()ed (pruned). `plugins` carries the plugin targets (no emitter yet — a later node).
55
+ export function partitionHarnesses(targets) {
56
+ const selectedIds = new Set(targets.filter((t) => t.kind === 'native').map((t) => t.id));
57
+ return {
58
+ selected: HARNESSES.filter((h) => selectedIds.has(h.id)),
59
+ unselected: HARNESSES.filter((h) => !selectedIds.has(h.id)),
60
+ plugins: targets.filter((t) => t.kind === 'plugin').map((t) => ({ folder: t.folder })),
61
+ };
62
+ }