@productbrain/cli 0.1.0-beta.108 → 0.1.0-beta.10807

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 (1546) hide show
  1. package/README.md +11 -2
  2. package/dist/__tests__/adapters.test.js +79 -53
  3. package/dist/__tests__/adapters.test.js.map +1 -1
  4. package/dist/__tests__/adminConfig.test.d.ts +18 -0
  5. package/dist/__tests__/adminConfig.test.d.ts.map +1 -0
  6. package/dist/__tests__/adminConfig.test.js +221 -0
  7. package/dist/__tests__/adminConfig.test.js.map +1 -0
  8. package/dist/__tests__/batch-transformations.test.js +2 -26
  9. package/dist/__tests__/batch-transformations.test.js.map +1 -1
  10. package/dist/__tests__/canonicalRefs.vocab.test.d.ts +2 -0
  11. package/dist/__tests__/canonicalRefs.vocab.test.d.ts.map +1 -0
  12. package/dist/__tests__/canonicalRefs.vocab.test.js +251 -0
  13. package/dist/__tests__/canonicalRefs.vocab.test.js.map +1 -0
  14. package/dist/__tests__/capture-receipt-coaching.test.d.ts +2 -0
  15. package/dist/__tests__/capture-receipt-coaching.test.d.ts.map +1 -0
  16. package/dist/__tests__/capture-receipt-coaching.test.js +109 -0
  17. package/dist/__tests__/capture-receipt-coaching.test.js.map +1 -0
  18. package/dist/__tests__/capture-receipt-role-hint.test.d.ts +2 -0
  19. package/dist/__tests__/capture-receipt-role-hint.test.d.ts.map +1 -0
  20. package/dist/__tests__/capture-receipt-role-hint.test.js +67 -0
  21. package/dist/__tests__/capture-receipt-role-hint.test.js.map +1 -0
  22. package/dist/__tests__/capture-receipt-spine-floor.test.d.ts +2 -0
  23. package/dist/__tests__/capture-receipt-spine-floor.test.d.ts.map +1 -0
  24. package/dist/__tests__/capture-receipt-spine-floor.test.js +45 -0
  25. package/dist/__tests__/capture-receipt-spine-floor.test.js.map +1 -0
  26. package/dist/__tests__/capture.test.js +1426 -182
  27. package/dist/__tests__/capture.test.js.map +1 -1
  28. package/dist/__tests__/client-binding-guard.test.d.ts +2 -0
  29. package/dist/__tests__/client-binding-guard.test.d.ts.map +1 -0
  30. package/dist/__tests__/client-binding-guard.test.js +84 -0
  31. package/dist/__tests__/client-binding-guard.test.js.map +1 -0
  32. package/dist/__tests__/coaching-mirror-drift.test.d.ts +2 -0
  33. package/dist/__tests__/coaching-mirror-drift.test.d.ts.map +1 -0
  34. package/dist/__tests__/coaching-mirror-drift.test.js +50 -0
  35. package/dist/__tests__/coaching-mirror-drift.test.js.map +1 -0
  36. package/dist/__tests__/codex-prep-parity.test.d.ts +2 -0
  37. package/dist/__tests__/codex-prep-parity.test.d.ts.map +1 -0
  38. package/dist/__tests__/codex-prep-parity.test.js +84 -0
  39. package/dist/__tests__/codex-prep-parity.test.js.map +1 -0
  40. package/dist/__tests__/collection-registry-seed-drift.test.d.ts +2 -0
  41. package/dist/__tests__/collection-registry-seed-drift.test.d.ts.map +1 -0
  42. package/dist/__tests__/collection-registry-seed-drift.test.js +102 -0
  43. package/dist/__tests__/collection-registry-seed-drift.test.js.map +1 -0
  44. package/dist/__tests__/config-prod-fallthrough.test.d.ts +2 -0
  45. package/dist/__tests__/config-prod-fallthrough.test.d.ts.map +1 -0
  46. package/dist/__tests__/config-prod-fallthrough.test.js +93 -0
  47. package/dist/__tests__/config-prod-fallthrough.test.js.map +1 -0
  48. package/dist/__tests__/config.test.js +821 -32
  49. package/dist/__tests__/config.test.js.map +1 -1
  50. package/dist/__tests__/constants.test.js +6 -1
  51. package/dist/__tests__/constants.test.js.map +1 -1
  52. package/dist/__tests__/constellation.test.js +26 -14
  53. package/dist/__tests__/constellation.test.js.map +1 -1
  54. package/dist/__tests__/conversation.test.d.ts +2 -0
  55. package/dist/__tests__/conversation.test.d.ts.map +1 -0
  56. package/dist/__tests__/conversation.test.js +113 -0
  57. package/dist/__tests__/conversation.test.js.map +1 -0
  58. package/dist/__tests__/entry-formatter.test.d.ts +2 -0
  59. package/dist/__tests__/entry-formatter.test.d.ts.map +1 -0
  60. package/dist/__tests__/entry-formatter.test.js +182 -0
  61. package/dist/__tests__/entry-formatter.test.js.map +1 -0
  62. package/dist/__tests__/entry-preflight.test.d.ts +2 -0
  63. package/dist/__tests__/entry-preflight.test.d.ts.map +1 -0
  64. package/dist/__tests__/entry-preflight.test.js +58 -0
  65. package/dist/__tests__/entry-preflight.test.js.map +1 -0
  66. package/dist/__tests__/entryAccept-batch.test.d.ts +2 -0
  67. package/dist/__tests__/entryAccept-batch.test.d.ts.map +1 -0
  68. package/dist/__tests__/entryAccept-batch.test.js +305 -0
  69. package/dist/__tests__/entryAccept-batch.test.js.map +1 -0
  70. package/dist/__tests__/entryAccept.test.d.ts +2 -0
  71. package/dist/__tests__/entryAccept.test.d.ts.map +1 -0
  72. package/dist/__tests__/entryAccept.test.js +526 -0
  73. package/dist/__tests__/entryAccept.test.js.map +1 -0
  74. package/dist/__tests__/entryDiscardResolve.test.d.ts +2 -0
  75. package/dist/__tests__/entryDiscardResolve.test.d.ts.map +1 -0
  76. package/dist/__tests__/entryDiscardResolve.test.js +28 -0
  77. package/dist/__tests__/entryDiscardResolve.test.js.map +1 -0
  78. package/dist/__tests__/entryOwn.test.d.ts +2 -0
  79. package/dist/__tests__/entryOwn.test.d.ts.map +1 -0
  80. package/dist/__tests__/entryOwn.test.js +50 -0
  81. package/dist/__tests__/entryOwn.test.js.map +1 -0
  82. package/dist/__tests__/entryTick.test.d.ts +2 -0
  83. package/dist/__tests__/entryTick.test.d.ts.map +1 -0
  84. package/dist/__tests__/entryTick.test.js +40 -0
  85. package/dist/__tests__/entryTick.test.js.map +1 -0
  86. package/dist/__tests__/envelope-contract.test.js +31 -3
  87. package/dist/__tests__/envelope-contract.test.js.map +1 -1
  88. package/dist/__tests__/errors.test.js +42 -0
  89. package/dist/__tests__/errors.test.js.map +1 -1
  90. package/dist/__tests__/fields.test.js +14 -3
  91. package/dist/__tests__/fields.test.js.map +1 -1
  92. package/dist/__tests__/gateway-dry-run-timeout.test.d.ts +2 -0
  93. package/dist/__tests__/gateway-dry-run-timeout.test.d.ts.map +1 -0
  94. package/dist/__tests__/gateway-dry-run-timeout.test.js +70 -0
  95. package/dist/__tests__/gateway-dry-run-timeout.test.js.map +1 -0
  96. package/dist/__tests__/gateway-timeout-body-phase.test.d.ts +2 -0
  97. package/dist/__tests__/gateway-timeout-body-phase.test.d.ts.map +1 -0
  98. package/dist/__tests__/gateway-timeout-body-phase.test.js +116 -0
  99. package/dist/__tests__/gateway-timeout-body-phase.test.js.map +1 -0
  100. package/dist/__tests__/glossary.test.js +10 -27
  101. package/dist/__tests__/glossary.test.js.map +1 -1
  102. package/dist/__tests__/handshake-augment.test.d.ts +2 -0
  103. package/dist/__tests__/handshake-augment.test.d.ts.map +1 -0
  104. package/dist/__tests__/handshake-augment.test.js +407 -0
  105. package/dist/__tests__/handshake-augment.test.js.map +1 -0
  106. package/dist/__tests__/handshake-dormancy.test.d.ts +2 -0
  107. package/dist/__tests__/handshake-dormancy.test.d.ts.map +1 -0
  108. package/dist/__tests__/handshake-dormancy.test.js +24 -0
  109. package/dist/__tests__/handshake-dormancy.test.js.map +1 -0
  110. package/dist/__tests__/handshake-formatter.test.d.ts +2 -0
  111. package/dist/__tests__/handshake-formatter.test.d.ts.map +1 -0
  112. package/dist/__tests__/handshake-formatter.test.js +111 -0
  113. package/dist/__tests__/handshake-formatter.test.js.map +1 -0
  114. package/dist/__tests__/handshake-preview.test.js +358 -137
  115. package/dist/__tests__/handshake-preview.test.js.map +1 -1
  116. package/dist/__tests__/handshake-session-threading.test.d.ts +2 -0
  117. package/dist/__tests__/handshake-session-threading.test.d.ts.map +1 -0
  118. package/dist/__tests__/handshake-session-threading.test.js +185 -0
  119. package/dist/__tests__/handshake-session-threading.test.js.map +1 -0
  120. package/dist/__tests__/handshake.e2e.test.d.ts +2 -0
  121. package/dist/__tests__/handshake.e2e.test.d.ts.map +1 -0
  122. package/dist/__tests__/handshake.e2e.test.js +226 -0
  123. package/dist/__tests__/handshake.e2e.test.js.map +1 -0
  124. package/dist/__tests__/handshake.test.js +794 -309
  125. package/dist/__tests__/handshake.test.js.map +1 -1
  126. package/dist/__tests__/health-gap-kinds-drift.test.d.ts +2 -0
  127. package/dist/__tests__/health-gap-kinds-drift.test.d.ts.map +1 -0
  128. package/dist/__tests__/health-gap-kinds-drift.test.js +43 -0
  129. package/dist/__tests__/health-gap-kinds-drift.test.js.map +1 -0
  130. package/dist/__tests__/hook-intents.test.js +31 -43
  131. package/dist/__tests__/hook-intents.test.js.map +1 -1
  132. package/dist/__tests__/init.test.js +51 -14
  133. package/dist/__tests__/init.test.js.map +1 -1
  134. package/dist/__tests__/kernel-value-sets-drift.test.d.ts +2 -0
  135. package/dist/__tests__/kernel-value-sets-drift.test.d.ts.map +1 -0
  136. package/dist/__tests__/kernel-value-sets-drift.test.js +46 -0
  137. package/dist/__tests__/kernel-value-sets-drift.test.js.map +1 -0
  138. package/dist/__tests__/kernel-value-sets-generator.test.d.ts +2 -0
  139. package/dist/__tests__/kernel-value-sets-generator.test.d.ts.map +1 -0
  140. package/dist/__tests__/kernel-value-sets-generator.test.js +108 -0
  141. package/dist/__tests__/kernel-value-sets-generator.test.js.map +1 -0
  142. package/dist/__tests__/login.test.js +18 -1
  143. package/dist/__tests__/login.test.js.map +1 -1
  144. package/dist/__tests__/manifest.test.js +118 -1
  145. package/dist/__tests__/manifest.test.js.map +1 -1
  146. package/dist/__tests__/method-registry.integration.test.js +2 -3
  147. package/dist/__tests__/method-registry.integration.test.js.map +1 -1
  148. package/dist/__tests__/method-registry.test.d.ts +6 -8
  149. package/dist/__tests__/method-registry.test.d.ts.map +1 -1
  150. package/dist/__tests__/method-registry.test.js +22 -70
  151. package/dist/__tests__/method-registry.test.js.map +1 -1
  152. package/dist/__tests__/missingPin.test.d.ts +11 -0
  153. package/dist/__tests__/missingPin.test.d.ts.map +1 -0
  154. package/dist/__tests__/missingPin.test.js +232 -0
  155. package/dist/__tests__/missingPin.test.js.map +1 -0
  156. package/dist/__tests__/notice-marker.test.d.ts +2 -0
  157. package/dist/__tests__/notice-marker.test.d.ts.map +1 -0
  158. package/dist/__tests__/notice-marker.test.js +176 -0
  159. package/dist/__tests__/notice-marker.test.js.map +1 -0
  160. package/dist/__tests__/orient.test.js +463 -42
  161. package/dist/__tests__/orient.test.js.map +1 -1
  162. package/dist/__tests__/perimeter.test.d.ts +2 -0
  163. package/dist/__tests__/perimeter.test.d.ts.map +1 -0
  164. package/dist/__tests__/perimeter.test.js +165 -0
  165. package/dist/__tests__/perimeter.test.js.map +1 -0
  166. package/dist/__tests__/preview-key-refresh.test.d.ts +2 -0
  167. package/dist/__tests__/preview-key-refresh.test.d.ts.map +1 -0
  168. package/dist/__tests__/preview-key-refresh.test.js +186 -0
  169. package/dist/__tests__/preview-key-refresh.test.js.map +1 -0
  170. package/dist/__tests__/profiles.test.js +597 -3
  171. package/dist/__tests__/profiles.test.js.map +1 -1
  172. package/dist/__tests__/prompts.test.js +18 -1
  173. package/dist/__tests__/prompts.test.js.map +1 -1
  174. package/dist/__tests__/proof-run.test.d.ts +2 -0
  175. package/dist/__tests__/proof-run.test.d.ts.map +1 -0
  176. package/dist/__tests__/proof-run.test.js +255 -0
  177. package/dist/__tests__/proof-run.test.js.map +1 -0
  178. package/dist/__tests__/rate-limit-resilience.test.d.ts +8 -0
  179. package/dist/__tests__/rate-limit-resilience.test.d.ts.map +1 -0
  180. package/dist/__tests__/rate-limit-resilience.test.js +225 -0
  181. package/dist/__tests__/rate-limit-resilience.test.js.map +1 -0
  182. package/dist/__tests__/read-target-notice.test.d.ts +2 -0
  183. package/dist/__tests__/read-target-notice.test.d.ts.map +1 -0
  184. package/dist/__tests__/read-target-notice.test.js +125 -0
  185. package/dist/__tests__/read-target-notice.test.js.map +1 -0
  186. package/dist/__tests__/relate.test.js +246 -14
  187. package/dist/__tests__/relate.test.js.map +1 -1
  188. package/dist/__tests__/removed-commands.test.d.ts +2 -0
  189. package/dist/__tests__/removed-commands.test.d.ts.map +1 -0
  190. package/dist/__tests__/removed-commands.test.js +64 -0
  191. package/dist/__tests__/removed-commands.test.js.map +1 -0
  192. package/dist/__tests__/reply-commands-registered.test.d.ts +2 -0
  193. package/dist/__tests__/reply-commands-registered.test.d.ts.map +1 -0
  194. package/dist/__tests__/reply-commands-registered.test.js +81 -0
  195. package/dist/__tests__/reply-commands-registered.test.js.map +1 -0
  196. package/dist/__tests__/repo-detect.test.js +18 -38
  197. package/dist/__tests__/repo-detect.test.js.map +1 -1
  198. package/dist/__tests__/reportedProfile.test.d.ts +2 -0
  199. package/dist/__tests__/reportedProfile.test.d.ts.map +1 -0
  200. package/dist/__tests__/reportedProfile.test.js +328 -0
  201. package/dist/__tests__/reportedProfile.test.js.map +1 -0
  202. package/dist/__tests__/restore.test.d.ts +2 -0
  203. package/dist/__tests__/restore.test.d.ts.map +1 -0
  204. package/dist/__tests__/restore.test.js +85 -0
  205. package/dist/__tests__/restore.test.js.map +1 -0
  206. package/dist/__tests__/route-latency-budget.test.d.ts +2 -0
  207. package/dist/__tests__/route-latency-budget.test.d.ts.map +1 -0
  208. package/dist/__tests__/route-latency-budget.test.js +107 -0
  209. package/dist/__tests__/route-latency-budget.test.js.map +1 -0
  210. package/dist/__tests__/runner.test.js +59 -44
  211. package/dist/__tests__/runner.test.js.map +1 -1
  212. package/dist/__tests__/session-binding-refusal-tenant.test.d.ts +2 -0
  213. package/dist/__tests__/session-binding-refusal-tenant.test.d.ts.map +1 -0
  214. package/dist/__tests__/session-binding-refusal-tenant.test.js +112 -0
  215. package/dist/__tests__/session-binding-refusal-tenant.test.js.map +1 -0
  216. package/dist/__tests__/session-close-conversation.test.d.ts +2 -0
  217. package/dist/__tests__/session-close-conversation.test.d.ts.map +1 -0
  218. package/dist/__tests__/session-close-conversation.test.js +75 -0
  219. package/dist/__tests__/session-close-conversation.test.js.map +1 -0
  220. package/dist/__tests__/session-close-loop.test.d.ts +2 -0
  221. package/dist/__tests__/session-close-loop.test.d.ts.map +1 -0
  222. package/dist/__tests__/session-close-loop.test.js +227 -0
  223. package/dist/__tests__/session-close-loop.test.js.map +1 -0
  224. package/dist/__tests__/session-label.test.d.ts +2 -0
  225. package/dist/__tests__/session-label.test.d.ts.map +1 -0
  226. package/dist/__tests__/session-label.test.js +46 -0
  227. package/dist/__tests__/session-label.test.js.map +1 -0
  228. package/dist/__tests__/session-list-show.test.d.ts +2 -0
  229. package/dist/__tests__/session-list-show.test.d.ts.map +1 -0
  230. package/dist/__tests__/session-list-show.test.js +173 -0
  231. package/dist/__tests__/session-list-show.test.js.map +1 -0
  232. package/dist/__tests__/session-pinned-role.test.d.ts +2 -0
  233. package/dist/__tests__/session-pinned-role.test.d.ts.map +1 -0
  234. package/dist/__tests__/session-pinned-role.test.js +305 -0
  235. package/dist/__tests__/session-pinned-role.test.js.map +1 -0
  236. package/dist/__tests__/session-reset.test.d.ts +2 -0
  237. package/dist/__tests__/session-reset.test.d.ts.map +1 -0
  238. package/dist/__tests__/session-reset.test.js +138 -0
  239. package/dist/__tests__/session-reset.test.js.map +1 -0
  240. package/dist/__tests__/session-resume-backstop.test.d.ts +2 -0
  241. package/dist/__tests__/session-resume-backstop.test.d.ts.map +1 -0
  242. package/dist/__tests__/session-resume-backstop.test.js +139 -0
  243. package/dist/__tests__/session-resume-backstop.test.js.map +1 -0
  244. package/dist/__tests__/session-role-name-sanitize.test.d.ts +2 -0
  245. package/dist/__tests__/session-role-name-sanitize.test.d.ts.map +1 -0
  246. package/dist/__tests__/session-role-name-sanitize.test.js +122 -0
  247. package/dist/__tests__/session-role-name-sanitize.test.js.map +1 -0
  248. package/dist/__tests__/session-start-key-refresh.test.d.ts +2 -0
  249. package/dist/__tests__/session-start-key-refresh.test.d.ts.map +1 -0
  250. package/dist/__tests__/session-start-key-refresh.test.js +197 -0
  251. package/dist/__tests__/session-start-key-refresh.test.js.map +1 -0
  252. package/dist/__tests__/session-state-machine.test.js +235 -10
  253. package/dist/__tests__/session-state-machine.test.js.map +1 -1
  254. package/dist/__tests__/session-switch.test.d.ts +2 -0
  255. package/dist/__tests__/session-switch.test.d.ts.map +1 -0
  256. package/dist/__tests__/session-switch.test.js +343 -0
  257. package/dist/__tests__/session-switch.test.js.map +1 -0
  258. package/dist/__tests__/session-touch.test.js +6 -1
  259. package/dist/__tests__/session-touch.test.js.map +1 -1
  260. package/dist/__tests__/sessionBinding.test.d.ts +2 -0
  261. package/dist/__tests__/sessionBinding.test.d.ts.map +1 -0
  262. package/dist/__tests__/sessionBinding.test.js +118 -0
  263. package/dist/__tests__/sessionBinding.test.js.map +1 -0
  264. package/dist/__tests__/sessionByIdLookup.test.d.ts +2 -0
  265. package/dist/__tests__/sessionByIdLookup.test.d.ts.map +1 -0
  266. package/dist/__tests__/sessionByIdLookup.test.js +63 -0
  267. package/dist/__tests__/sessionByIdLookup.test.js.map +1 -0
  268. package/dist/__tests__/skill-vocabulary.test.d.ts +21 -0
  269. package/dist/__tests__/skill-vocabulary.test.d.ts.map +1 -0
  270. package/dist/__tests__/skill-vocabulary.test.js +192 -0
  271. package/dist/__tests__/skill-vocabulary.test.js.map +1 -0
  272. package/dist/__tests__/state.test.js +21 -1
  273. package/dist/__tests__/state.test.js.map +1 -1
  274. package/dist/__tests__/stillTrue.test.d.ts +2 -0
  275. package/dist/__tests__/stillTrue.test.d.ts.map +1 -0
  276. package/dist/__tests__/stillTrue.test.js +52 -0
  277. package/dist/__tests__/stillTrue.test.js.map +1 -0
  278. package/dist/__tests__/strip.test.js +57 -3
  279. package/dist/__tests__/strip.test.js.map +1 -1
  280. package/dist/__tests__/surfaces.test.js +3 -4
  281. package/dist/__tests__/surfaces.test.js.map +1 -1
  282. package/dist/__tests__/tenant-notice-write-path.test.d.ts +2 -0
  283. package/dist/__tests__/tenant-notice-write-path.test.d.ts.map +1 -0
  284. package/dist/__tests__/tenant-notice-write-path.test.js +183 -0
  285. package/dist/__tests__/tenant-notice-write-path.test.js.map +1 -0
  286. package/dist/__tests__/update-check.test.d.ts +2 -0
  287. package/dist/__tests__/update-check.test.d.ts.map +1 -0
  288. package/dist/__tests__/update-check.test.js +235 -0
  289. package/dist/__tests__/update-check.test.js.map +1 -0
  290. package/dist/__tests__/update.test.js +458 -8
  291. package/dist/__tests__/update.test.js.map +1 -1
  292. package/dist/__tests__/upgrade-runner.test.d.ts +2 -0
  293. package/dist/__tests__/upgrade-runner.test.d.ts.map +1 -0
  294. package/dist/__tests__/upgrade-runner.test.js +54 -0
  295. package/dist/__tests__/upgrade-runner.test.js.map +1 -0
  296. package/dist/__tests__/upgrade.test.d.ts +2 -0
  297. package/dist/__tests__/upgrade.test.d.ts.map +1 -0
  298. package/dist/__tests__/upgrade.test.js +56 -0
  299. package/dist/__tests__/upgrade.test.js.map +1 -0
  300. package/dist/__tests__/verify-formatter.test.d.ts +2 -0
  301. package/dist/__tests__/verify-formatter.test.d.ts.map +1 -0
  302. package/dist/__tests__/verify-formatter.test.js +85 -0
  303. package/dist/__tests__/verify-formatter.test.js.map +1 -0
  304. package/dist/__tests__/vocabulary-leak.test.d.ts +33 -0
  305. package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -0
  306. package/dist/__tests__/vocabulary-leak.test.js +427 -0
  307. package/dist/__tests__/vocabulary-leak.test.js.map +1 -0
  308. package/dist/__tests__/workspace.test.js +11 -72
  309. package/dist/__tests__/workspace.test.js.map +1 -1
  310. package/dist/__tests__/workspaceNotice.test.d.ts +2 -0
  311. package/dist/__tests__/workspaceNotice.test.d.ts.map +1 -0
  312. package/dist/__tests__/workspaceNotice.test.js +571 -0
  313. package/dist/__tests__/workspaceNotice.test.js.map +1 -0
  314. package/dist/commands/__tests__/connect-handoff.test.d.ts +11 -0
  315. package/dist/commands/__tests__/connect-handoff.test.d.ts.map +1 -0
  316. package/dist/commands/__tests__/connect-handoff.test.js +111 -0
  317. package/dist/commands/__tests__/connect-handoff.test.js.map +1 -0
  318. package/dist/commands/__tests__/quality.test.d.ts +2 -0
  319. package/dist/commands/__tests__/quality.test.d.ts.map +1 -0
  320. package/dist/commands/__tests__/quality.test.js +186 -0
  321. package/dist/commands/__tests__/quality.test.js.map +1 -0
  322. package/dist/commands/__tests__/rework.test.d.ts +2 -0
  323. package/dist/commands/__tests__/rework.test.d.ts.map +1 -0
  324. package/dist/commands/__tests__/rework.test.js +149 -0
  325. package/dist/commands/__tests__/rework.test.js.map +1 -0
  326. package/dist/commands/__tests__/tensionsList.test.d.ts +2 -0
  327. package/dist/commands/__tests__/tensionsList.test.d.ts.map +1 -0
  328. package/dist/commands/__tests__/tensionsList.test.js +63 -0
  329. package/dist/commands/__tests__/tensionsList.test.js.map +1 -0
  330. package/dist/commands/accept-policy.d.ts +10 -0
  331. package/dist/commands/accept-policy.d.ts.map +1 -0
  332. package/dist/commands/accept-policy.js +107 -0
  333. package/dist/commands/accept-policy.js.map +1 -0
  334. package/dist/commands/admin/cockpit.d.ts +2 -13
  335. package/dist/commands/admin/cockpit.d.ts.map +1 -1
  336. package/dist/commands/admin/cockpit.js +5 -5
  337. package/dist/commands/admin/cockpit.js.map +1 -1
  338. package/dist/commands/admin/index.d.ts +49 -0
  339. package/dist/commands/admin/index.d.ts.map +1 -1
  340. package/dist/commands/admin/index.js +148 -29
  341. package/dist/commands/admin/index.js.map +1 -1
  342. package/dist/commands/admin/index.test.d.ts +2 -0
  343. package/dist/commands/admin/index.test.d.ts.map +1 -0
  344. package/dist/commands/admin/index.test.js +94 -0
  345. package/dist/commands/admin/index.test.js.map +1 -0
  346. package/dist/commands/admin/inspect.d.ts.map +1 -1
  347. package/dist/commands/admin/inspect.js +2 -7
  348. package/dist/commands/admin/inspect.js.map +1 -1
  349. package/dist/commands/admin/probe.d.ts +75 -0
  350. package/dist/commands/admin/probe.d.ts.map +1 -0
  351. package/dist/commands/admin/probe.js +224 -0
  352. package/dist/commands/admin/probe.js.map +1 -0
  353. package/dist/commands/admin/probe.test.d.ts +2 -0
  354. package/dist/commands/admin/probe.test.d.ts.map +1 -0
  355. package/dist/commands/admin/probe.test.js +193 -0
  356. package/dist/commands/admin/probe.test.js.map +1 -0
  357. package/dist/commands/admin/run.d.ts +43 -0
  358. package/dist/commands/admin/run.d.ts.map +1 -0
  359. package/dist/commands/admin/run.js +78 -0
  360. package/dist/commands/admin/run.js.map +1 -0
  361. package/dist/commands/admin/run.test.d.ts +18 -0
  362. package/dist/commands/admin/run.test.d.ts.map +1 -0
  363. package/dist/commands/admin/run.test.js +168 -0
  364. package/dist/commands/admin/run.test.js.map +1 -0
  365. package/dist/commands/admin/seed.d.ts +29 -14
  366. package/dist/commands/admin/seed.d.ts.map +1 -1
  367. package/dist/commands/admin/seed.js +303 -326
  368. package/dist/commands/admin/seed.js.map +1 -1
  369. package/dist/commands/admin/seed.test.d.ts +3 -4
  370. package/dist/commands/admin/seed.test.d.ts.map +1 -1
  371. package/dist/commands/admin/seed.test.js +26 -69
  372. package/dist/commands/admin/seed.test.js.map +1 -1
  373. package/dist/commands/admin/seedRegistryEntries.generated.d.ts +14 -0
  374. package/dist/commands/admin/seedRegistryEntries.generated.d.ts.map +1 -0
  375. package/dist/commands/admin/seedRegistryEntries.generated.js +36 -0
  376. package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -0
  377. package/dist/commands/admin/seedRegistryEntries.test.d.ts +13 -0
  378. package/dist/commands/admin/seedRegistryEntries.test.d.ts.map +1 -0
  379. package/dist/commands/admin/seedRegistryEntries.test.js +101 -0
  380. package/dist/commands/admin/seedRegistryEntries.test.js.map +1 -0
  381. package/dist/commands/admin/seedRowType.d.ts +22 -0
  382. package/dist/commands/admin/seedRowType.d.ts.map +1 -0
  383. package/dist/commands/admin/seedRowType.js +2 -0
  384. package/dist/commands/admin/seedRowType.js.map +1 -0
  385. package/dist/commands/admin/seedStatusColor.d.ts +9 -0
  386. package/dist/commands/admin/seedStatusColor.d.ts.map +1 -0
  387. package/dist/commands/admin/seedStatusColor.js +19 -0
  388. package/dist/commands/admin/seedStatusColor.js.map +1 -0
  389. package/dist/commands/admin/seedStatusColor.test.d.ts +2 -0
  390. package/dist/commands/admin/seedStatusColor.test.d.ts.map +1 -0
  391. package/dist/commands/admin/seedStatusColor.test.js +31 -0
  392. package/dist/commands/admin/seedStatusColor.test.js.map +1 -0
  393. package/dist/commands/brief.d.ts.map +1 -1
  394. package/dist/commands/brief.js +24 -2
  395. package/dist/commands/brief.js.map +1 -1
  396. package/dist/commands/capture.d.ts +17 -9
  397. package/dist/commands/capture.d.ts.map +1 -1
  398. package/dist/commands/capture.js +191 -230
  399. package/dist/commands/capture.js.map +1 -1
  400. package/dist/commands/chain-walk.d.ts.map +1 -1
  401. package/dist/commands/chain-walk.js.map +1 -1
  402. package/dist/commands/changes.d.ts.map +1 -1
  403. package/dist/commands/changes.js.map +1 -1
  404. package/dist/commands/codex-prep.d.ts +11 -1
  405. package/dist/commands/codex-prep.d.ts.map +1 -1
  406. package/dist/commands/codex-prep.js +14 -83
  407. package/dist/commands/codex-prep.js.map +1 -1
  408. package/dist/commands/collections.d.ts +1 -1
  409. package/dist/commands/collections.d.ts.map +1 -1
  410. package/dist/commands/collections.js +1 -1
  411. package/dist/commands/collections.js.map +1 -1
  412. package/dist/commands/conflicts.d.ts +35 -0
  413. package/dist/commands/conflicts.d.ts.map +1 -0
  414. package/dist/commands/conflicts.js +194 -0
  415. package/dist/commands/conflicts.js.map +1 -0
  416. package/dist/commands/conflicts.test.d.ts +2 -0
  417. package/dist/commands/conflicts.test.d.ts.map +1 -0
  418. package/dist/commands/conflicts.test.js +179 -0
  419. package/dist/commands/conflicts.test.js.map +1 -0
  420. package/dist/commands/connect-config.test.d.ts +2 -0
  421. package/dist/commands/connect-config.test.d.ts.map +1 -0
  422. package/dist/commands/connect-config.test.js +52 -0
  423. package/dist/commands/connect-config.test.js.map +1 -0
  424. package/dist/commands/connect-context.d.ts +55 -0
  425. package/dist/commands/connect-context.d.ts.map +1 -0
  426. package/dist/commands/connect-context.js +78 -0
  427. package/dist/commands/connect-context.js.map +1 -0
  428. package/dist/commands/connect-context.test.d.ts +2 -0
  429. package/dist/commands/connect-context.test.d.ts.map +1 -0
  430. package/dist/commands/connect-context.test.js +148 -0
  431. package/dist/commands/connect-context.test.js.map +1 -0
  432. package/dist/commands/connect-decline.test.d.ts +2 -0
  433. package/dist/commands/connect-decline.test.d.ts.map +1 -0
  434. package/dist/commands/connect-decline.test.js +70 -0
  435. package/dist/commands/connect-decline.test.js.map +1 -0
  436. package/dist/commands/connect-handoff.d.ts +51 -0
  437. package/dist/commands/connect-handoff.d.ts.map +1 -0
  438. package/dist/commands/connect-handoff.js +70 -0
  439. package/dist/commands/connect-handoff.js.map +1 -0
  440. package/dist/commands/connect-integration.test.js +37 -19
  441. package/dist/commands/connect-integration.test.js.map +1 -1
  442. package/dist/commands/connect-legacy-migration.test.d.ts +2 -0
  443. package/dist/commands/connect-legacy-migration.test.d.ts.map +1 -0
  444. package/dist/commands/connect-legacy-migration.test.js +109 -0
  445. package/dist/commands/connect-legacy-migration.test.js.map +1 -0
  446. package/dist/commands/connect-redeem-failure.test.d.ts +2 -0
  447. package/dist/commands/connect-redeem-failure.test.d.ts.map +1 -0
  448. package/dist/commands/connect-redeem-failure.test.js +134 -0
  449. package/dist/commands/connect-redeem-failure.test.js.map +1 -0
  450. package/dist/commands/connect-screens.d.ts +18 -8
  451. package/dist/commands/connect-screens.d.ts.map +1 -1
  452. package/dist/commands/connect-screens.js +83 -37
  453. package/dist/commands/connect-screens.js.map +1 -1
  454. package/dist/commands/connect-seal.test.d.ts +2 -0
  455. package/dist/commands/connect-seal.test.d.ts.map +1 -0
  456. package/dist/commands/connect-seal.test.js +55 -0
  457. package/dist/commands/connect-seal.test.js.map +1 -0
  458. package/dist/commands/connect.d.ts +22 -6
  459. package/dist/commands/connect.d.ts.map +1 -1
  460. package/dist/commands/connect.js +249 -107
  461. package/dist/commands/connect.js.map +1 -1
  462. package/dist/commands/connect.test.js +226 -23
  463. package/dist/commands/connect.test.js.map +1 -1
  464. package/dist/commands/constellation.d.ts.map +1 -1
  465. package/dist/commands/constellation.js.map +1 -1
  466. package/dist/commands/context.d.ts.map +1 -1
  467. package/dist/commands/context.js.map +1 -1
  468. package/dist/commands/cross-cut.d.ts.map +1 -1
  469. package/dist/commands/cross-cut.js.map +1 -1
  470. package/dist/commands/digest.d.ts +17 -0
  471. package/dist/commands/digest.d.ts.map +1 -0
  472. package/dist/commands/digest.js +58 -0
  473. package/dist/commands/digest.js.map +1 -0
  474. package/dist/commands/digest.test.d.ts +2 -0
  475. package/dist/commands/digest.test.d.ts.map +1 -0
  476. package/dist/commands/digest.test.js +36 -0
  477. package/dist/commands/digest.test.js.map +1 -0
  478. package/dist/commands/direction.d.ts +10 -0
  479. package/dist/commands/direction.d.ts.map +1 -0
  480. package/dist/commands/direction.js +79 -0
  481. package/dist/commands/direction.js.map +1 -0
  482. package/dist/commands/doctor.d.ts.map +1 -1
  483. package/dist/commands/doctor.js +172 -37
  484. package/dist/commands/doctor.js.map +1 -1
  485. package/dist/commands/doctor.test.js +352 -6
  486. package/dist/commands/doctor.test.js.map +1 -1
  487. package/dist/commands/entryAccept.d.ts +26 -0
  488. package/dist/commands/entryAccept.d.ts.map +1 -0
  489. package/dist/commands/entryAccept.js +308 -0
  490. package/dist/commands/entryAccept.js.map +1 -0
  491. package/dist/commands/entryDiscardResolve.d.ts +9 -0
  492. package/dist/commands/entryDiscardResolve.d.ts.map +1 -0
  493. package/dist/commands/entryDiscardResolve.js +27 -0
  494. package/dist/commands/entryDiscardResolve.js.map +1 -0
  495. package/dist/commands/entryOwn.d.ts +5 -0
  496. package/dist/commands/entryOwn.d.ts.map +1 -0
  497. package/dist/commands/entryOwn.js +17 -0
  498. package/dist/commands/entryOwn.js.map +1 -0
  499. package/dist/commands/entryPreflight.d.ts +8 -0
  500. package/dist/commands/entryPreflight.d.ts.map +1 -0
  501. package/dist/commands/entryPreflight.js +48 -0
  502. package/dist/commands/entryPreflight.js.map +1 -0
  503. package/dist/commands/entryTick.d.ts +8 -0
  504. package/dist/commands/entryTick.d.ts.map +1 -0
  505. package/dist/commands/entryTick.js +43 -0
  506. package/dist/commands/entryTick.js.map +1 -0
  507. package/dist/commands/feedback.d.ts +39 -0
  508. package/dist/commands/feedback.d.ts.map +1 -0
  509. package/dist/commands/feedback.js +176 -0
  510. package/dist/commands/feedback.js.map +1 -0
  511. package/dist/commands/feedback.test.d.ts +2 -0
  512. package/dist/commands/feedback.test.d.ts.map +1 -0
  513. package/dist/commands/feedback.test.js +117 -0
  514. package/dist/commands/feedback.test.js.map +1 -0
  515. package/dist/commands/fields.d.ts.map +1 -1
  516. package/dist/commands/fields.js +1 -1
  517. package/dist/commands/fields.js.map +1 -1
  518. package/dist/commands/files.d.ts +26 -0
  519. package/dist/commands/files.d.ts.map +1 -0
  520. package/dist/commands/files.js +160 -0
  521. package/dist/commands/files.js.map +1 -0
  522. package/dist/commands/files.test.d.ts +2 -0
  523. package/dist/commands/files.test.d.ts.map +1 -0
  524. package/dist/commands/files.test.js +278 -0
  525. package/dist/commands/files.test.js.map +1 -0
  526. package/dist/commands/handshake.d.ts +48 -112
  527. package/dist/commands/handshake.d.ts.map +1 -1
  528. package/dist/commands/handshake.js +725 -715
  529. package/dist/commands/handshake.js.map +1 -1
  530. package/dist/commands/handshakeCursorSkillCleanup.d.ts +36 -0
  531. package/dist/commands/handshakeCursorSkillCleanup.d.ts.map +1 -0
  532. package/dist/commands/handshakeCursorSkillCleanup.js +110 -0
  533. package/dist/commands/handshakeCursorSkillCleanup.js.map +1 -0
  534. package/dist/commands/handshakeDriftClassification.d.ts +33 -0
  535. package/dist/commands/handshakeDriftClassification.d.ts.map +1 -0
  536. package/dist/commands/handshakeDriftClassification.js +62 -0
  537. package/dist/commands/handshakeDriftClassification.js.map +1 -0
  538. package/dist/commands/history.d.ts +30 -0
  539. package/dist/commands/history.d.ts.map +1 -0
  540. package/dist/commands/history.js +62 -0
  541. package/dist/commands/history.js.map +1 -0
  542. package/dist/commands/history.test.d.ts +2 -0
  543. package/dist/commands/history.test.d.ts.map +1 -0
  544. package/dist/commands/history.test.js +106 -0
  545. package/dist/commands/history.test.js.map +1 -0
  546. package/dist/commands/init.d.ts +1 -1
  547. package/dist/commands/init.d.ts.map +1 -1
  548. package/dist/commands/init.js +22 -13
  549. package/dist/commands/init.js.map +1 -1
  550. package/dist/commands/login.d.ts.map +1 -1
  551. package/dist/commands/login.js +15 -11
  552. package/dist/commands/login.js.map +1 -1
  553. package/dist/commands/organisation.d.ts +12 -0
  554. package/dist/commands/organisation.d.ts.map +1 -0
  555. package/dist/commands/organisation.js +147 -0
  556. package/dist/commands/organisation.js.map +1 -0
  557. package/dist/commands/organisation.test.d.ts +2 -0
  558. package/dist/commands/organisation.test.d.ts.map +1 -0
  559. package/dist/commands/organisation.test.js +116 -0
  560. package/dist/commands/organisation.test.js.map +1 -0
  561. package/dist/commands/organisationHierarchy.d.ts +15 -0
  562. package/dist/commands/organisationHierarchy.d.ts.map +1 -0
  563. package/dist/commands/organisationHierarchy.js +114 -0
  564. package/dist/commands/organisationHierarchy.js.map +1 -0
  565. package/dist/commands/organisationHierarchy.test.d.ts +2 -0
  566. package/dist/commands/organisationHierarchy.test.d.ts.map +1 -0
  567. package/dist/commands/organisationHierarchy.test.js +144 -0
  568. package/dist/commands/organisationHierarchy.test.js.map +1 -0
  569. package/dist/commands/organisationWrite.d.ts +20 -0
  570. package/dist/commands/organisationWrite.d.ts.map +1 -0
  571. package/dist/commands/organisationWrite.js +41 -0
  572. package/dist/commands/organisationWrite.js.map +1 -0
  573. package/dist/commands/orient.d.ts +68 -69
  574. package/dist/commands/orient.d.ts.map +1 -1
  575. package/dist/commands/orient.js +164 -27
  576. package/dist/commands/orient.js.map +1 -1
  577. package/dist/commands/outcome.d.ts +90 -0
  578. package/dist/commands/outcome.d.ts.map +1 -0
  579. package/dist/commands/outcome.js +201 -0
  580. package/dist/commands/outcome.js.map +1 -0
  581. package/dist/commands/outcome.test.d.ts +2 -0
  582. package/dist/commands/outcome.test.d.ts.map +1 -0
  583. package/dist/commands/outcome.test.js +320 -0
  584. package/dist/commands/outcome.test.js.map +1 -0
  585. package/dist/commands/people.d.ts +6 -0
  586. package/dist/commands/people.d.ts.map +1 -0
  587. package/dist/commands/people.js +23 -0
  588. package/dist/commands/people.js.map +1 -0
  589. package/dist/commands/people.test.d.ts +2 -0
  590. package/dist/commands/people.test.d.ts.map +1 -0
  591. package/dist/commands/people.test.js +61 -0
  592. package/dist/commands/people.test.js.map +1 -0
  593. package/dist/commands/profile.d.ts +24 -16
  594. package/dist/commands/profile.d.ts.map +1 -1
  595. package/dist/commands/profile.js +272 -98
  596. package/dist/commands/profile.js.map +1 -1
  597. package/dist/commands/proof-run.d.ts +51 -0
  598. package/dist/commands/proof-run.d.ts.map +1 -0
  599. package/dist/commands/proof-run.js +209 -0
  600. package/dist/commands/proof-run.js.map +1 -0
  601. package/dist/commands/quality.d.ts +21 -0
  602. package/dist/commands/quality.d.ts.map +1 -0
  603. package/dist/commands/quality.js +52 -0
  604. package/dist/commands/quality.js.map +1 -0
  605. package/dist/commands/questions.d.ts +23 -0
  606. package/dist/commands/questions.d.ts.map +1 -0
  607. package/dist/commands/questions.js +238 -0
  608. package/dist/commands/questions.js.map +1 -0
  609. package/dist/commands/questions.test.d.ts +2 -0
  610. package/dist/commands/questions.test.d.ts.map +1 -0
  611. package/dist/commands/questions.test.js +159 -0
  612. package/dist/commands/questions.test.js.map +1 -0
  613. package/dist/commands/relate.d.ts +1 -0
  614. package/dist/commands/relate.d.ts.map +1 -1
  615. package/dist/commands/relate.js +89 -15
  616. package/dist/commands/relate.js.map +1 -1
  617. package/dist/commands/restore.d.ts +2 -0
  618. package/dist/commands/restore.d.ts.map +1 -0
  619. package/dist/commands/restore.js +83 -0
  620. package/dist/commands/restore.js.map +1 -0
  621. package/dist/commands/rework.d.ts +24 -0
  622. package/dist/commands/rework.d.ts.map +1 -0
  623. package/dist/commands/rework.js +97 -0
  624. package/dist/commands/rework.js.map +1 -0
  625. package/dist/commands/role.d.ts +88 -0
  626. package/dist/commands/role.d.ts.map +1 -0
  627. package/dist/commands/role.js +235 -0
  628. package/dist/commands/role.js.map +1 -0
  629. package/dist/commands/role.test.d.ts +2 -0
  630. package/dist/commands/role.test.d.ts.map +1 -0
  631. package/dist/commands/role.test.js +348 -0
  632. package/dist/commands/role.test.js.map +1 -0
  633. package/dist/commands/scoreboard.d.ts +26 -0
  634. package/dist/commands/scoreboard.d.ts.map +1 -0
  635. package/dist/commands/scoreboard.js +40 -0
  636. package/dist/commands/scoreboard.js.map +1 -0
  637. package/dist/commands/search.d.ts +2 -1
  638. package/dist/commands/search.d.ts.map +1 -1
  639. package/dist/commands/search.js +5 -4
  640. package/dist/commands/search.js.map +1 -1
  641. package/dist/commands/session.d.ts +62 -7
  642. package/dist/commands/session.d.ts.map +1 -1
  643. package/dist/commands/session.js +421 -83
  644. package/dist/commands/session.js.map +1 -1
  645. package/dist/commands/status.d.ts +7 -0
  646. package/dist/commands/status.d.ts.map +1 -0
  647. package/dist/commands/status.js +101 -0
  648. package/dist/commands/status.js.map +1 -0
  649. package/dist/commands/status.test.d.ts +2 -0
  650. package/dist/commands/status.test.d.ts.map +1 -0
  651. package/dist/commands/status.test.js +75 -0
  652. package/dist/commands/status.test.js.map +1 -0
  653. package/dist/commands/stillTrue.d.ts +14 -0
  654. package/dist/commands/stillTrue.d.ts.map +1 -0
  655. package/dist/commands/stillTrue.js +48 -0
  656. package/dist/commands/stillTrue.js.map +1 -0
  657. package/dist/commands/tensionsList.d.ts +5 -0
  658. package/dist/commands/tensionsList.d.ts.map +1 -0
  659. package/dist/commands/tensionsList.js +27 -0
  660. package/dist/commands/tensionsList.js.map +1 -0
  661. package/dist/commands/update.d.ts +21 -0
  662. package/dist/commands/update.d.ts.map +1 -1
  663. package/dist/commands/update.js +157 -42
  664. package/dist/commands/update.js.map +1 -1
  665. package/dist/commands/upgrade.d.ts +5 -0
  666. package/dist/commands/upgrade.d.ts.map +1 -0
  667. package/dist/commands/upgrade.js +110 -0
  668. package/dist/commands/upgrade.js.map +1 -0
  669. package/dist/commands/usage.d.ts.map +1 -1
  670. package/dist/commands/usage.js +0 -18
  671. package/dist/commands/usage.js.map +1 -1
  672. package/dist/commands/verify.d.ts.map +1 -1
  673. package/dist/commands/verify.js +7 -1
  674. package/dist/commands/verify.js.map +1 -1
  675. package/dist/commands/welcome.d.ts.map +1 -1
  676. package/dist/commands/welcome.js +5 -2
  677. package/dist/commands/welcome.js.map +1 -1
  678. package/dist/commands/whoami.d.ts +20 -0
  679. package/dist/commands/whoami.d.ts.map +1 -0
  680. package/dist/commands/whoami.js +126 -0
  681. package/dist/commands/whoami.js.map +1 -0
  682. package/dist/commands/whoami.test.d.ts +2 -0
  683. package/dist/commands/whoami.test.d.ts.map +1 -0
  684. package/dist/commands/whoami.test.js +130 -0
  685. package/dist/commands/whoami.test.js.map +1 -0
  686. package/dist/commands/workspace.d.ts +7 -74
  687. package/dist/commands/workspace.d.ts.map +1 -1
  688. package/dist/commands/workspace.js +9 -70
  689. package/dist/commands/workspace.js.map +1 -1
  690. package/dist/formatters/__tests__/orient-plannedWorkCut.test.d.ts +2 -0
  691. package/dist/formatters/__tests__/orient-plannedWorkCut.test.d.ts.map +1 -0
  692. package/dist/formatters/__tests__/orient-plannedWorkCut.test.js +49 -0
  693. package/dist/formatters/__tests__/orient-plannedWorkCut.test.js.map +1 -0
  694. package/dist/formatters/__tests__/orient-provenance.test.d.ts +6 -0
  695. package/dist/formatters/__tests__/orient-provenance.test.d.ts.map +1 -0
  696. package/dist/formatters/__tests__/orient-provenance.test.js +319 -0
  697. package/dist/formatters/__tests__/orient-provenance.test.js.map +1 -0
  698. package/dist/formatters/__tests__/orient-ruleLists.test.d.ts +2 -0
  699. package/dist/formatters/__tests__/orient-ruleLists.test.d.ts.map +1 -0
  700. package/dist/formatters/__tests__/orient-ruleLists.test.js +93 -0
  701. package/dist/formatters/__tests__/orient-ruleLists.test.js.map +1 -0
  702. package/dist/formatters/__tests__/session-list-show.test.d.ts +2 -0
  703. package/dist/formatters/__tests__/session-list-show.test.d.ts.map +1 -0
  704. package/dist/formatters/__tests__/session-list-show.test.js +195 -0
  705. package/dist/formatters/__tests__/session-list-show.test.js.map +1 -0
  706. package/dist/formatters/__tests__/session.test.d.ts +2 -0
  707. package/dist/formatters/__tests__/session.test.d.ts.map +1 -0
  708. package/dist/formatters/__tests__/session.test.js +199 -0
  709. package/dist/formatters/__tests__/session.test.js.map +1 -0
  710. package/dist/formatters/__tests__/tensionsList.test.d.ts +2 -0
  711. package/dist/formatters/__tests__/tensionsList.test.d.ts.map +1 -0
  712. package/dist/formatters/__tests__/tensionsList.test.js +30 -0
  713. package/dist/formatters/__tests__/tensionsList.test.js.map +1 -0
  714. package/dist/formatters/brief.d.ts +6 -15
  715. package/dist/formatters/brief.d.ts.map +1 -1
  716. package/dist/formatters/brief.js +16 -14
  717. package/dist/formatters/brief.js.map +1 -1
  718. package/dist/formatters/brief.test.d.ts +2 -0
  719. package/dist/formatters/brief.test.d.ts.map +1 -0
  720. package/dist/formatters/brief.test.js +21 -0
  721. package/dist/formatters/brief.test.js.map +1 -0
  722. package/dist/formatters/capture.d.ts +17 -10
  723. package/dist/formatters/capture.d.ts.map +1 -1
  724. package/dist/formatters/capture.js +33 -10
  725. package/dist/formatters/capture.js.map +1 -1
  726. package/dist/formatters/coaching.d.ts +60 -0
  727. package/dist/formatters/coaching.d.ts.map +1 -0
  728. package/dist/formatters/coaching.js +51 -0
  729. package/dist/formatters/coaching.js.map +1 -0
  730. package/dist/formatters/collections.d.ts +0 -1
  731. package/dist/formatters/collections.d.ts.map +1 -1
  732. package/dist/formatters/collections.js +14 -5
  733. package/dist/formatters/collections.js.map +1 -1
  734. package/dist/formatters/conflicts.d.ts +69 -0
  735. package/dist/formatters/conflicts.d.ts.map +1 -0
  736. package/dist/formatters/conflicts.js +87 -0
  737. package/dist/formatters/conflicts.js.map +1 -0
  738. package/dist/formatters/conflicts.test.d.ts +2 -0
  739. package/dist/formatters/conflicts.test.d.ts.map +1 -0
  740. package/dist/formatters/conflicts.test.js +136 -0
  741. package/dist/formatters/conflicts.test.js.map +1 -0
  742. package/dist/formatters/context.d.ts +1 -1
  743. package/dist/formatters/context.d.ts.map +1 -1
  744. package/dist/formatters/context.js.map +1 -1
  745. package/dist/formatters/digest.d.ts +13 -0
  746. package/dist/formatters/digest.d.ts.map +1 -0
  747. package/dist/formatters/digest.js +98 -0
  748. package/dist/formatters/digest.js.map +1 -0
  749. package/dist/formatters/digest.test.d.ts +2 -0
  750. package/dist/formatters/digest.test.d.ts.map +1 -0
  751. package/dist/formatters/digest.test.js +166 -0
  752. package/dist/formatters/digest.test.js.map +1 -0
  753. package/dist/formatters/direction.d.ts +48 -0
  754. package/dist/formatters/direction.d.ts.map +1 -0
  755. package/dist/formatters/direction.js +75 -0
  756. package/dist/formatters/direction.js.map +1 -0
  757. package/dist/formatters/direction.test.d.ts +2 -0
  758. package/dist/formatters/direction.test.d.ts.map +1 -0
  759. package/dist/formatters/direction.test.js +70 -0
  760. package/dist/formatters/direction.test.js.map +1 -0
  761. package/dist/formatters/entry.d.ts +68 -1
  762. package/dist/formatters/entry.d.ts.map +1 -1
  763. package/dist/formatters/entry.js +104 -11
  764. package/dist/formatters/entry.js.map +1 -1
  765. package/dist/formatters/entryAccept.d.ts +79 -0
  766. package/dist/formatters/entryAccept.d.ts.map +1 -0
  767. package/dist/formatters/entryAccept.js +78 -0
  768. package/dist/formatters/entryAccept.js.map +1 -0
  769. package/dist/formatters/feedback.d.ts +61 -0
  770. package/dist/formatters/feedback.d.ts.map +1 -0
  771. package/dist/formatters/feedback.js +95 -0
  772. package/dist/formatters/feedback.js.map +1 -0
  773. package/dist/formatters/feedback.test.d.ts +2 -0
  774. package/dist/formatters/feedback.test.d.ts.map +1 -0
  775. package/dist/formatters/feedback.test.js +142 -0
  776. package/dist/formatters/feedback.test.js.map +1 -0
  777. package/dist/formatters/fields.d.ts +7 -1
  778. package/dist/formatters/fields.d.ts.map +1 -1
  779. package/dist/formatters/fields.js +9 -3
  780. package/dist/formatters/fields.js.map +1 -1
  781. package/dist/formatters/fields.test.d.ts +2 -0
  782. package/dist/formatters/fields.test.d.ts.map +1 -0
  783. package/dist/formatters/fields.test.js +42 -0
  784. package/dist/formatters/fields.test.js.map +1 -0
  785. package/dist/formatters/handshake.d.ts +43 -9
  786. package/dist/formatters/handshake.d.ts.map +1 -1
  787. package/dist/formatters/handshake.js +82 -28
  788. package/dist/formatters/handshake.js.map +1 -1
  789. package/dist/formatters/orient.coherencyCheckTag.test.d.ts +2 -0
  790. package/dist/formatters/orient.coherencyCheckTag.test.d.ts.map +1 -0
  791. package/dist/formatters/orient.coherencyCheckTag.test.js +22 -0
  792. package/dist/formatters/orient.coherencyCheckTag.test.js.map +1 -0
  793. package/dist/formatters/orient.d.ts +121 -112
  794. package/dist/formatters/orient.d.ts.map +1 -1
  795. package/dist/formatters/orient.js +197 -150
  796. package/dist/formatters/orient.js.map +1 -1
  797. package/dist/formatters/orient.rcrtMiss.test.d.ts +2 -0
  798. package/dist/formatters/orient.rcrtMiss.test.d.ts.map +1 -0
  799. package/dist/formatters/orient.rcrtMiss.test.js +77 -0
  800. package/dist/formatters/orient.rcrtMiss.test.js.map +1 -0
  801. package/dist/formatters/orient.rituals.test.d.ts +2 -0
  802. package/dist/formatters/orient.rituals.test.d.ts.map +1 -0
  803. package/dist/formatters/orient.rituals.test.js +72 -0
  804. package/dist/formatters/orient.rituals.test.js.map +1 -0
  805. package/dist/formatters/orientDegradation.d.ts +38 -0
  806. package/dist/formatters/orientDegradation.d.ts.map +1 -0
  807. package/dist/formatters/orientDegradation.js +50 -0
  808. package/dist/formatters/orientDegradation.js.map +1 -0
  809. package/dist/formatters/orientDegradation.test.d.ts +2 -0
  810. package/dist/formatters/orientDegradation.test.d.ts.map +1 -0
  811. package/dist/formatters/orientDegradation.test.js +28 -0
  812. package/dist/formatters/orientDegradation.test.js.map +1 -0
  813. package/dist/formatters/orientDirection.d.ts +25 -0
  814. package/dist/formatters/orientDirection.d.ts.map +1 -0
  815. package/dist/formatters/orientDirection.js +7 -0
  816. package/dist/formatters/orientDirection.js.map +1 -0
  817. package/dist/formatters/orientDirection.test.d.ts +2 -0
  818. package/dist/formatters/orientDirection.test.d.ts.map +1 -0
  819. package/dist/formatters/orientDirection.test.js +48 -0
  820. package/dist/formatters/orientDirection.test.js.map +1 -0
  821. package/dist/formatters/orientRetrievalMiss.d.ts +22 -0
  822. package/dist/formatters/orientRetrievalMiss.d.ts.map +1 -0
  823. package/dist/formatters/orientRetrievalMiss.js +17 -0
  824. package/dist/formatters/orientRetrievalMiss.js.map +1 -0
  825. package/dist/formatters/plannedWorkCounts.d.ts +19 -0
  826. package/dist/formatters/plannedWorkCounts.d.ts.map +1 -0
  827. package/dist/formatters/plannedWorkCounts.js +17 -0
  828. package/dist/formatters/plannedWorkCounts.js.map +1 -0
  829. package/dist/formatters/qualityChecks.d.ts +8 -0
  830. package/dist/formatters/qualityChecks.d.ts.map +1 -0
  831. package/dist/formatters/qualityChecks.js +46 -0
  832. package/dist/formatters/qualityChecks.js.map +1 -0
  833. package/dist/formatters/questions.d.ts +72 -0
  834. package/dist/formatters/questions.d.ts.map +1 -0
  835. package/dist/formatters/questions.js +116 -0
  836. package/dist/formatters/questions.js.map +1 -0
  837. package/dist/formatters/questions.test.d.ts +2 -0
  838. package/dist/formatters/questions.test.d.ts.map +1 -0
  839. package/dist/formatters/questions.test.js +144 -0
  840. package/dist/formatters/questions.test.js.map +1 -0
  841. package/dist/formatters/relate.d.ts +13 -2
  842. package/dist/formatters/relate.d.ts.map +1 -1
  843. package/dist/formatters/relate.js +15 -5
  844. package/dist/formatters/relate.js.map +1 -1
  845. package/dist/formatters/relate.test.d.ts +2 -0
  846. package/dist/formatters/relate.test.d.ts.map +1 -0
  847. package/dist/formatters/relate.test.js +91 -0
  848. package/dist/formatters/relate.test.js.map +1 -0
  849. package/dist/formatters/scoreboard.d.ts +11 -0
  850. package/dist/formatters/scoreboard.d.ts.map +1 -0
  851. package/dist/formatters/scoreboard.js +162 -0
  852. package/dist/formatters/scoreboard.js.map +1 -0
  853. package/dist/formatters/scoreboard.test.d.ts +2 -0
  854. package/dist/formatters/scoreboard.test.d.ts.map +1 -0
  855. package/dist/formatters/scoreboard.test.js +301 -0
  856. package/dist/formatters/scoreboard.test.js.map +1 -0
  857. package/dist/formatters/search.d.ts +24 -0
  858. package/dist/formatters/search.d.ts.map +1 -1
  859. package/dist/formatters/search.js +26 -11
  860. package/dist/formatters/search.js.map +1 -1
  861. package/dist/formatters/search.test.d.ts +2 -0
  862. package/dist/formatters/search.test.d.ts.map +1 -0
  863. package/dist/formatters/search.test.js +86 -0
  864. package/dist/formatters/search.test.js.map +1 -0
  865. package/dist/formatters/session-feedback.test.d.ts +2 -0
  866. package/dist/formatters/session-feedback.test.d.ts.map +1 -0
  867. package/dist/formatters/session-feedback.test.js +118 -0
  868. package/dist/formatters/session-feedback.test.js.map +1 -0
  869. package/dist/formatters/session.d.ts +117 -5
  870. package/dist/formatters/session.d.ts.map +1 -1
  871. package/dist/formatters/session.js +317 -21
  872. package/dist/formatters/session.js.map +1 -1
  873. package/dist/formatters/spineCheck.d.ts +14 -0
  874. package/dist/formatters/spineCheck.d.ts.map +1 -0
  875. package/dist/formatters/spineCheck.js +113 -0
  876. package/dist/formatters/spineCheck.js.map +1 -0
  877. package/dist/formatters/spineCheck.test.d.ts +2 -0
  878. package/dist/formatters/spineCheck.test.d.ts.map +1 -0
  879. package/dist/formatters/spineCheck.test.js +76 -0
  880. package/dist/formatters/spineCheck.test.js.map +1 -0
  881. package/dist/formatters/tensionsList.d.ts +17 -0
  882. package/dist/formatters/tensionsList.d.ts.map +1 -0
  883. package/dist/formatters/tensionsList.js +33 -0
  884. package/dist/formatters/tensionsList.js.map +1 -0
  885. package/dist/formatters/update.d.ts +22 -0
  886. package/dist/formatters/update.d.ts.map +1 -1
  887. package/dist/formatters/update.js +36 -7
  888. package/dist/formatters/update.js.map +1 -1
  889. package/dist/formatters/update.test.d.ts +2 -0
  890. package/dist/formatters/update.test.d.ts.map +1 -0
  891. package/dist/formatters/update.test.js +59 -0
  892. package/dist/formatters/update.test.js.map +1 -0
  893. package/dist/formatters/verify.d.ts +12 -4
  894. package/dist/formatters/verify.d.ts.map +1 -1
  895. package/dist/formatters/verify.js +20 -2
  896. package/dist/formatters/verify.js.map +1 -1
  897. package/dist/generated/healthGapKinds.generated.d.ts +12 -0
  898. package/dist/generated/healthGapKinds.generated.d.ts.map +1 -0
  899. package/dist/generated/healthGapKinds.generated.js +16 -0
  900. package/dist/generated/healthGapKinds.generated.js.map +1 -0
  901. package/dist/generated/organisationalAuthorityRefusalCodes.generated.d.ts +12 -0
  902. package/dist/generated/organisationalAuthorityRefusalCodes.generated.d.ts.map +1 -0
  903. package/dist/generated/organisationalAuthorityRefusalCodes.generated.js +11 -0
  904. package/dist/generated/organisationalAuthorityRefusalCodes.generated.js.map +1 -0
  905. package/dist/generated/relationTypes.generated.d.ts +12 -0
  906. package/dist/generated/relationTypes.generated.d.ts.map +1 -0
  907. package/dist/generated/relationTypes.generated.js +11 -0
  908. package/dist/generated/relationTypes.generated.js.map +1 -0
  909. package/dist/generated/routeLatencyBudget.generated.d.ts +55 -0
  910. package/dist/generated/routeLatencyBudget.generated.d.ts.map +1 -0
  911. package/dist/generated/routeLatencyBudget.generated.js +272 -0
  912. package/dist/generated/routeLatencyBudget.generated.js.map +1 -0
  913. package/dist/generated/sourceSurfaces.generated.d.ts +12 -0
  914. package/dist/generated/sourceSurfaces.generated.d.ts.map +1 -0
  915. package/dist/generated/sourceSurfaces.generated.js +11 -0
  916. package/dist/generated/sourceSurfaces.generated.js.map +1 -0
  917. package/dist/generators/adapters.d.ts +39 -6
  918. package/dist/generators/adapters.d.ts.map +1 -1
  919. package/dist/generators/adapters.js +88 -89
  920. package/dist/generators/adapters.js.map +1 -1
  921. package/dist/generators/adapters.test.js +14 -6
  922. package/dist/generators/adapters.test.js.map +1 -1
  923. package/dist/generators/briefing-projections.test.d.ts +2 -0
  924. package/dist/generators/briefing-projections.test.d.ts.map +1 -0
  925. package/dist/generators/briefing-projections.test.js +98 -0
  926. package/dist/generators/briefing-projections.test.js.map +1 -0
  927. package/dist/generators/context-md.d.ts +7 -2
  928. package/dist/generators/context-md.d.ts.map +1 -1
  929. package/dist/generators/context-md.js +18 -57
  930. package/dist/generators/context-md.js.map +1 -1
  931. package/dist/generators/everyone-rules-md.d.ts +9 -0
  932. package/dist/generators/everyone-rules-md.d.ts.map +1 -0
  933. package/dist/generators/everyone-rules-md.js +21 -0
  934. package/dist/generators/everyone-rules-md.js.map +1 -0
  935. package/dist/generators/manifest.d.ts +76 -0
  936. package/dist/generators/manifest.d.ts.map +1 -1
  937. package/dist/generators/manifest.js +125 -14
  938. package/dist/generators/manifest.js.map +1 -1
  939. package/dist/generators/noProjectionAssets.d.ts +15 -0
  940. package/dist/generators/noProjectionAssets.d.ts.map +1 -0
  941. package/dist/generators/noProjectionAssets.js +6 -0
  942. package/dist/generators/noProjectionAssets.js.map +1 -0
  943. package/dist/generators/portable-knowledge.d.ts +11 -28
  944. package/dist/generators/portable-knowledge.d.ts.map +1 -1
  945. package/dist/generators/portable-knowledge.js +11 -125
  946. package/dist/generators/portable-knowledge.js.map +1 -1
  947. package/dist/generators/portable-knowledge.test.js +82 -267
  948. package/dist/generators/portable-knowledge.test.js.map +1 -1
  949. package/dist/generators/region-projections.d.ts +17 -0
  950. package/dist/generators/region-projections.d.ts.map +1 -0
  951. package/dist/generators/region-projections.js +51 -0
  952. package/dist/generators/region-projections.js.map +1 -0
  953. package/dist/generators/region-projections.test.d.ts +2 -0
  954. package/dist/generators/region-projections.test.d.ts.map +1 -0
  955. package/dist/generators/region-projections.test.js +58 -0
  956. package/dist/generators/region-projections.test.js.map +1 -0
  957. package/dist/generators/region.d.ts +24 -0
  958. package/dist/generators/region.d.ts.map +1 -0
  959. package/dist/generators/region.js +87 -0
  960. package/dist/generators/region.js.map +1 -0
  961. package/dist/generators/region.test.d.ts +2 -0
  962. package/dist/generators/region.test.d.ts.map +1 -0
  963. package/dist/generators/region.test.js +125 -0
  964. package/dist/generators/region.test.js.map +1 -0
  965. package/dist/generators/retired-projections.d.ts +12 -0
  966. package/dist/generators/retired-projections.d.ts.map +1 -0
  967. package/dist/generators/retired-projections.js +75 -0
  968. package/dist/generators/retired-projections.js.map +1 -0
  969. package/dist/generators/retired-projections.test.d.ts +2 -0
  970. package/dist/generators/retired-projections.test.d.ts.map +1 -0
  971. package/dist/generators/retired-projections.test.js +64 -0
  972. package/dist/generators/retired-projections.test.js.map +1 -0
  973. package/dist/generators/surface-profiles.d.ts +1 -2
  974. package/dist/generators/surface-profiles.d.ts.map +1 -1
  975. package/dist/generators/surface-profiles.js.map +1 -1
  976. package/dist/handleCliError.d.ts +15 -0
  977. package/dist/handleCliError.d.ts.map +1 -0
  978. package/dist/handleCliError.js +77 -0
  979. package/dist/handleCliError.js.map +1 -0
  980. package/dist/index.d.ts +0 -5
  981. package/dist/index.d.ts.map +1 -1
  982. package/dist/index.js +211 -499
  983. package/dist/index.js.map +1 -1
  984. package/dist/lib/__tests__/legalRelationTypes.test.d.ts +2 -0
  985. package/dist/lib/__tests__/legalRelationTypes.test.d.ts.map +1 -0
  986. package/dist/lib/__tests__/legalRelationTypes.test.js +61 -0
  987. package/dist/lib/__tests__/legalRelationTypes.test.js.map +1 -0
  988. package/dist/lib/__tests__/parseFields.test.d.ts +2 -0
  989. package/dist/lib/__tests__/parseFields.test.d.ts.map +1 -0
  990. package/dist/lib/__tests__/parseFields.test.js +40 -0
  991. package/dist/lib/__tests__/parseFields.test.js.map +1 -0
  992. package/dist/lib/adminConfig.d.ts +48 -0
  993. package/dist/lib/adminConfig.d.ts.map +1 -0
  994. package/dist/lib/adminConfig.js +130 -0
  995. package/dist/lib/adminConfig.js.map +1 -0
  996. package/dist/lib/canonicalRefs.d.ts +96 -5
  997. package/dist/lib/canonicalRefs.d.ts.map +1 -1
  998. package/dist/lib/canonicalRefs.js +89 -3
  999. package/dist/lib/canonicalRefs.js.map +1 -1
  1000. package/dist/lib/captureGrounding.d.ts +48 -0
  1001. package/dist/lib/captureGrounding.d.ts.map +1 -0
  1002. package/dist/lib/captureGrounding.js +54 -0
  1003. package/dist/lib/captureGrounding.js.map +1 -0
  1004. package/dist/lib/captureGrounding.test.d.ts +2 -0
  1005. package/dist/lib/captureGrounding.test.d.ts.map +1 -0
  1006. package/dist/lib/captureGrounding.test.js +74 -0
  1007. package/dist/lib/captureGrounding.test.js.map +1 -0
  1008. package/dist/lib/captureLink.d.ts +31 -0
  1009. package/dist/lib/captureLink.d.ts.map +1 -0
  1010. package/dist/lib/captureLink.js +125 -0
  1011. package/dist/lib/captureLink.js.map +1 -0
  1012. package/dist/lib/checklist.d.ts +32 -0
  1013. package/dist/lib/checklist.d.ts.map +1 -0
  1014. package/dist/lib/checklist.js +77 -0
  1015. package/dist/lib/checklist.js.map +1 -0
  1016. package/dist/lib/client.d.ts +34 -19
  1017. package/dist/lib/client.d.ts.map +1 -1
  1018. package/dist/lib/client.js +229 -68
  1019. package/dist/lib/client.js.map +1 -1
  1020. package/dist/lib/collectionRegistry.d.ts +40 -5
  1021. package/dist/lib/collectionRegistry.d.ts.map +1 -1
  1022. package/dist/lib/collectionRegistry.js +71 -48
  1023. package/dist/lib/collectionRegistry.js.map +1 -1
  1024. package/dist/lib/commanderOptions.d.ts +8 -0
  1025. package/dist/lib/commanderOptions.d.ts.map +1 -0
  1026. package/dist/lib/commanderOptions.js +10 -0
  1027. package/dist/lib/commanderOptions.js.map +1 -0
  1028. package/dist/lib/compose-wrapup-view.d.ts +56 -0
  1029. package/dist/lib/compose-wrapup-view.d.ts.map +1 -0
  1030. package/dist/lib/compose-wrapup-view.js +39 -0
  1031. package/dist/lib/compose-wrapup-view.js.map +1 -0
  1032. package/dist/lib/config.d.ts +97 -68
  1033. package/dist/lib/config.d.ts.map +1 -1
  1034. package/dist/lib/config.js +213 -205
  1035. package/dist/lib/config.js.map +1 -1
  1036. package/dist/lib/configResult.d.ts +102 -0
  1037. package/dist/lib/configResult.d.ts.map +1 -0
  1038. package/dist/lib/configResult.js +179 -0
  1039. package/dist/lib/configResult.js.map +1 -0
  1040. package/dist/lib/connectProfileName.d.ts +36 -0
  1041. package/dist/lib/connectProfileName.d.ts.map +1 -0
  1042. package/dist/lib/connectProfileName.js +72 -0
  1043. package/dist/lib/connectProfileName.js.map +1 -0
  1044. package/dist/lib/connectProfileName.test.d.ts +2 -0
  1045. package/dist/lib/connectProfileName.test.d.ts.map +1 -0
  1046. package/dist/lib/connectProfileName.test.js +100 -0
  1047. package/dist/lib/connectProfileName.test.js.map +1 -0
  1048. package/dist/lib/constants.d.ts +8 -1
  1049. package/dist/lib/constants.d.ts.map +1 -1
  1050. package/dist/lib/constants.js +11 -1
  1051. package/dist/lib/constants.js.map +1 -1
  1052. package/dist/lib/conversation.d.ts +36 -0
  1053. package/dist/lib/conversation.d.ts.map +1 -0
  1054. package/dist/lib/conversation.js +66 -0
  1055. package/dist/lib/conversation.js.map +1 -0
  1056. package/dist/lib/createEntryResult.d.ts +34 -0
  1057. package/dist/lib/createEntryResult.d.ts.map +1 -0
  1058. package/dist/lib/createEntryResult.js +12 -0
  1059. package/dist/lib/createEntryResult.js.map +1 -0
  1060. package/dist/lib/deployment.js +2 -2
  1061. package/dist/lib/deployment.js.map +1 -1
  1062. package/dist/lib/deployment.test.js +20 -1
  1063. package/dist/lib/deployment.test.js.map +1 -1
  1064. package/dist/lib/envKeySnapshot.d.ts +10 -0
  1065. package/dist/lib/envKeySnapshot.d.ts.map +1 -0
  1066. package/dist/lib/envKeySnapshot.js +30 -0
  1067. package/dist/lib/envKeySnapshot.js.map +1 -0
  1068. package/dist/lib/errors.d.ts +91 -0
  1069. package/dist/lib/errors.d.ts.map +1 -1
  1070. package/dist/lib/errors.js +84 -0
  1071. package/dist/lib/errors.js.map +1 -1
  1072. package/dist/lib/frontmatter.d.ts +55 -0
  1073. package/dist/lib/frontmatter.d.ts.map +1 -0
  1074. package/dist/lib/frontmatter.js +92 -0
  1075. package/dist/lib/frontmatter.js.map +1 -0
  1076. package/dist/lib/frontmatter.test.d.ts +15 -0
  1077. package/dist/lib/frontmatter.test.d.ts.map +1 -0
  1078. package/dist/lib/frontmatter.test.js +98 -0
  1079. package/dist/lib/frontmatter.test.js.map +1 -0
  1080. package/dist/lib/gatewayTimeout.d.ts +88 -0
  1081. package/dist/lib/gatewayTimeout.d.ts.map +1 -0
  1082. package/dist/lib/gatewayTimeout.js +118 -0
  1083. package/dist/lib/gatewayTimeout.js.map +1 -0
  1084. package/dist/lib/gitEnvLeakKeysParity.test.d.ts +2 -0
  1085. package/dist/lib/gitEnvLeakKeysParity.test.d.ts.map +1 -0
  1086. package/dist/lib/gitEnvLeakKeysParity.test.js +73 -0
  1087. package/dist/lib/gitEnvLeakKeysParity.test.js.map +1 -0
  1088. package/dist/lib/glossary.d.ts +3 -15
  1089. package/dist/lib/glossary.d.ts.map +1 -1
  1090. package/dist/lib/glossary.js +6 -47
  1091. package/dist/lib/glossary.js.map +1 -1
  1092. package/dist/lib/hook-intents.d.ts +9 -4
  1093. package/dist/lib/hook-intents.d.ts.map +1 -1
  1094. package/dist/lib/hook-intents.js +10 -11
  1095. package/dist/lib/hook-intents.js.map +1 -1
  1096. package/dist/lib/judgeWait.d.ts +50 -0
  1097. package/dist/lib/judgeWait.d.ts.map +1 -0
  1098. package/dist/lib/judgeWait.js +64 -0
  1099. package/dist/lib/judgeWait.js.map +1 -0
  1100. package/dist/lib/kernelEnvelope.d.ts +42 -0
  1101. package/dist/lib/kernelEnvelope.d.ts.map +1 -0
  1102. package/dist/lib/kernelEnvelope.js +67 -0
  1103. package/dist/lib/kernelEnvelope.js.map +1 -0
  1104. package/dist/lib/legalRelationTypes.d.ts +19 -0
  1105. package/dist/lib/legalRelationTypes.d.ts.map +1 -0
  1106. package/dist/lib/legalRelationTypes.js +64 -0
  1107. package/dist/lib/legalRelationTypes.js.map +1 -0
  1108. package/dist/lib/localBinding.d.ts +86 -0
  1109. package/dist/lib/localBinding.d.ts.map +1 -0
  1110. package/dist/lib/localBinding.js +173 -0
  1111. package/dist/lib/localBinding.js.map +1 -0
  1112. package/dist/lib/method-registry.d.ts +16 -11
  1113. package/dist/lib/method-registry.d.ts.map +1 -1
  1114. package/dist/lib/method-registry.js +13 -25
  1115. package/dist/lib/method-registry.js.map +1 -1
  1116. package/dist/lib/normalizeMaterializedFilename.d.ts +3 -3
  1117. package/dist/lib/normalizeMaterializedFilename.js +3 -3
  1118. package/dist/lib/notice-marker.d.ts +3 -0
  1119. package/dist/lib/notice-marker.d.ts.map +1 -0
  1120. package/dist/lib/notice-marker.js +223 -0
  1121. package/dist/lib/notice-marker.js.map +1 -0
  1122. package/dist/lib/outcomeObjectiveLines.d.ts +30 -0
  1123. package/dist/lib/outcomeObjectiveLines.d.ts.map +1 -0
  1124. package/dist/lib/outcomeObjectiveLines.js +29 -0
  1125. package/dist/lib/outcomeObjectiveLines.js.map +1 -0
  1126. package/dist/lib/ownerLine.d.ts +90 -0
  1127. package/dist/lib/ownerLine.d.ts.map +1 -0
  1128. package/dist/lib/ownerLine.js +77 -0
  1129. package/dist/lib/ownerLine.js.map +1 -0
  1130. package/dist/lib/parseFields.d.ts +19 -0
  1131. package/dist/lib/parseFields.d.ts.map +1 -0
  1132. package/dist/lib/parseFields.js +49 -0
  1133. package/dist/lib/parseFields.js.map +1 -0
  1134. package/dist/lib/pinnedRole.d.ts +28 -0
  1135. package/dist/lib/pinnedRole.d.ts.map +1 -0
  1136. package/dist/lib/pinnedRole.js +106 -0
  1137. package/dist/lib/pinnedRole.js.map +1 -0
  1138. package/dist/lib/platformGlossary.d.ts +22 -0
  1139. package/dist/lib/platformGlossary.d.ts.map +1 -0
  1140. package/dist/lib/platformGlossary.js +26 -0
  1141. package/dist/lib/platformGlossary.js.map +1 -0
  1142. package/dist/lib/previewBanner.d.ts +9 -0
  1143. package/dist/lib/previewBanner.d.ts.map +1 -0
  1144. package/dist/lib/previewBanner.js +36 -0
  1145. package/dist/lib/previewBanner.js.map +1 -0
  1146. package/dist/lib/productbrain-files.d.ts +108 -0
  1147. package/dist/lib/productbrain-files.d.ts.map +1 -0
  1148. package/dist/lib/productbrain-files.js +240 -0
  1149. package/dist/lib/productbrain-files.js.map +1 -0
  1150. package/dist/lib/productbrain-files.test.d.ts +2 -0
  1151. package/dist/lib/productbrain-files.test.d.ts.map +1 -0
  1152. package/dist/lib/productbrain-files.test.js +518 -0
  1153. package/dist/lib/productbrain-files.test.js.map +1 -0
  1154. package/dist/lib/profiles.d.ts +55 -5
  1155. package/dist/lib/profiles.d.ts.map +1 -1
  1156. package/dist/lib/profiles.js +81 -27
  1157. package/dist/lib/profiles.js.map +1 -1
  1158. package/dist/lib/projectConfig.d.ts +121 -0
  1159. package/dist/lib/projectConfig.d.ts.map +1 -0
  1160. package/dist/lib/projectConfig.js +226 -0
  1161. package/dist/lib/projectConfig.js.map +1 -0
  1162. package/dist/lib/prompts.d.ts +2 -0
  1163. package/dist/lib/prompts.d.ts.map +1 -1
  1164. package/dist/lib/prompts.js +2 -0
  1165. package/dist/lib/prompts.js.map +1 -1
  1166. package/dist/lib/proseBody.d.ts +14 -0
  1167. package/dist/lib/proseBody.d.ts.map +1 -0
  1168. package/dist/lib/proseBody.js +25 -0
  1169. package/dist/lib/proseBody.js.map +1 -0
  1170. package/dist/lib/rate-limit.d.ts +34 -0
  1171. package/dist/lib/rate-limit.d.ts.map +1 -0
  1172. package/dist/lib/rate-limit.js +89 -0
  1173. package/dist/lib/rate-limit.js.map +1 -0
  1174. package/dist/lib/readinessNotices.d.ts +12 -0
  1175. package/dist/lib/readinessNotices.d.ts.map +1 -0
  1176. package/dist/lib/readinessNotices.js +15 -0
  1177. package/dist/lib/readinessNotices.js.map +1 -0
  1178. package/dist/lib/repo-detect.d.ts +8 -2
  1179. package/dist/lib/repo-detect.d.ts.map +1 -1
  1180. package/dist/lib/repo-detect.js +11 -6
  1181. package/dist/lib/repo-detect.js.map +1 -1
  1182. package/dist/lib/reportedProfile.d.ts +18 -0
  1183. package/dist/lib/reportedProfile.d.ts.map +1 -0
  1184. package/dist/lib/reportedProfile.js +144 -0
  1185. package/dist/lib/reportedProfile.js.map +1 -0
  1186. package/dist/lib/ruleListRender.d.ts +255 -0
  1187. package/dist/lib/ruleListRender.d.ts.map +1 -0
  1188. package/dist/lib/ruleListRender.js +338 -0
  1189. package/dist/lib/ruleListRender.js.map +1 -0
  1190. package/dist/lib/runner.d.ts +9 -1
  1191. package/dist/lib/runner.d.ts.map +1 -1
  1192. package/dist/lib/runner.js +30 -4
  1193. package/dist/lib/runner.js.map +1 -1
  1194. package/dist/lib/seatSentence.d.ts +62 -0
  1195. package/dist/lib/seatSentence.d.ts.map +1 -0
  1196. package/dist/lib/seatSentence.js +82 -0
  1197. package/dist/lib/seatSentence.js.map +1 -0
  1198. package/dist/lib/session.d.ts +90 -6
  1199. package/dist/lib/session.d.ts.map +1 -1
  1200. package/dist/lib/session.js +261 -17
  1201. package/dist/lib/session.js.map +1 -1
  1202. package/dist/lib/sessionBinding.d.ts +61 -0
  1203. package/dist/lib/sessionBinding.d.ts.map +1 -0
  1204. package/dist/lib/sessionBinding.js +125 -0
  1205. package/dist/lib/sessionBinding.js.map +1 -0
  1206. package/dist/lib/sessionNotices.d.ts +54 -0
  1207. package/dist/lib/sessionNotices.d.ts.map +1 -0
  1208. package/dist/lib/sessionNotices.js +130 -0
  1209. package/dist/lib/sessionNotices.js.map +1 -0
  1210. package/dist/lib/sessionNotices.test.d.ts +2 -0
  1211. package/dist/lib/sessionNotices.test.d.ts.map +1 -0
  1212. package/dist/lib/sessionNotices.test.js +53 -0
  1213. package/dist/lib/sessionNotices.test.js.map +1 -0
  1214. package/dist/lib/spineVerdictRead.d.ts +70 -0
  1215. package/dist/lib/spineVerdictRead.d.ts.map +1 -0
  1216. package/dist/lib/spineVerdictRead.js +73 -0
  1217. package/dist/lib/spineVerdictRead.js.map +1 -0
  1218. package/dist/lib/spinner.js +2 -2
  1219. package/dist/lib/spinner.js.map +1 -1
  1220. package/dist/lib/startup-resolution-signals.d.ts +34 -0
  1221. package/dist/lib/startup-resolution-signals.d.ts.map +1 -0
  1222. package/dist/lib/startup-resolution-signals.js +116 -0
  1223. package/dist/lib/startup-resolution-signals.js.map +1 -0
  1224. package/dist/lib/startup-resolution-signals.test.d.ts +2 -0
  1225. package/dist/lib/startup-resolution-signals.test.d.ts.map +1 -0
  1226. package/dist/lib/startup-resolution-signals.test.js +113 -0
  1227. package/dist/lib/startup-resolution-signals.test.js.map +1 -0
  1228. package/dist/lib/startup-signals.d.ts +12 -0
  1229. package/dist/lib/startup-signals.d.ts.map +1 -0
  1230. package/dist/lib/startup-signals.js +179 -0
  1231. package/dist/lib/startup-signals.js.map +1 -0
  1232. package/dist/lib/startup-signals.test.d.ts +2 -0
  1233. package/dist/lib/startup-signals.test.d.ts.map +1 -0
  1234. package/dist/lib/startup-signals.test.js +165 -0
  1235. package/dist/lib/startup-signals.test.js.map +1 -0
  1236. package/dist/lib/state.d.ts +11 -2
  1237. package/dist/lib/state.d.ts.map +1 -1
  1238. package/dist/lib/state.js +11 -4
  1239. package/dist/lib/state.js.map +1 -1
  1240. package/dist/lib/statusCategories.d.ts +160 -0
  1241. package/dist/lib/statusCategories.d.ts.map +1 -0
  1242. package/dist/lib/statusCategories.js +284 -0
  1243. package/dist/lib/statusCategories.js.map +1 -0
  1244. package/dist/lib/strip.d.ts +17 -0
  1245. package/dist/lib/strip.d.ts.map +1 -1
  1246. package/dist/lib/strip.js +48 -1
  1247. package/dist/lib/strip.js.map +1 -1
  1248. package/dist/lib/style.d.ts +8 -2
  1249. package/dist/lib/style.d.ts.map +1 -1
  1250. package/dist/lib/style.js +24 -17
  1251. package/dist/lib/style.js.map +1 -1
  1252. package/dist/lib/tokenConstants.d.ts +2 -0
  1253. package/dist/lib/tokenConstants.d.ts.map +1 -1
  1254. package/dist/lib/tokenConstants.js +2 -0
  1255. package/dist/lib/tokenConstants.js.map +1 -1
  1256. package/dist/lib/update-check.d.ts +43 -7
  1257. package/dist/lib/update-check.d.ts.map +1 -1
  1258. package/dist/lib/update-check.js +219 -62
  1259. package/dist/lib/update-check.js.map +1 -1
  1260. package/dist/lib/upgrade-runner.d.ts +22 -0
  1261. package/dist/lib/upgrade-runner.d.ts.map +1 -0
  1262. package/dist/lib/upgrade-runner.js +110 -0
  1263. package/dist/lib/upgrade-runner.js.map +1 -0
  1264. package/dist/lib/workspaceNotice.d.ts +202 -0
  1265. package/dist/lib/workspaceNotice.d.ts.map +1 -0
  1266. package/dist/lib/workspaceNotice.js +345 -0
  1267. package/dist/lib/workspaceNotice.js.map +1 -0
  1268. package/dist/lib/workspaceVocabCache.d.ts +60 -0
  1269. package/dist/lib/workspaceVocabCache.d.ts.map +1 -0
  1270. package/dist/lib/workspaceVocabCache.js +98 -0
  1271. package/dist/lib/workspaceVocabCache.js.map +1 -0
  1272. package/dist/lib/writePerimeter.d.ts +72 -0
  1273. package/dist/lib/writePerimeter.d.ts.map +1 -0
  1274. package/dist/lib/writePerimeter.js +128 -0
  1275. package/dist/lib/writePerimeter.js.map +1 -0
  1276. package/dist/registerEntryCommands.d.ts +18 -0
  1277. package/dist/registerEntryCommands.d.ts.map +1 -0
  1278. package/dist/registerEntryCommands.js +123 -0
  1279. package/dist/registerEntryCommands.js.map +1 -0
  1280. package/dist/registerHistoryCommand.d.ts +8 -0
  1281. package/dist/registerHistoryCommand.d.ts.map +1 -0
  1282. package/dist/registerHistoryCommand.js +14 -0
  1283. package/dist/registerHistoryCommand.js.map +1 -0
  1284. package/dist/registerOutcomeCommands.d.ts +27 -0
  1285. package/dist/registerOutcomeCommands.d.ts.map +1 -0
  1286. package/dist/registerOutcomeCommands.js +27 -0
  1287. package/dist/registerOutcomeCommands.js.map +1 -0
  1288. package/dist/registerRoleCommands.d.ts +11 -0
  1289. package/dist/registerRoleCommands.d.ts.map +1 -0
  1290. package/dist/registerRoleCommands.js +42 -0
  1291. package/dist/registerRoleCommands.js.map +1 -0
  1292. package/dist/registerTensionsCommands.d.ts +10 -0
  1293. package/dist/registerTensionsCommands.d.ts.map +1 -0
  1294. package/dist/registerTensionsCommands.js +15 -0
  1295. package/dist/registerTensionsCommands.js.map +1 -0
  1296. package/dist/scoreboard/diagnose.d.ts +190 -0
  1297. package/dist/scoreboard/diagnose.d.ts.map +1 -0
  1298. package/dist/scoreboard/diagnose.js +282 -0
  1299. package/dist/scoreboard/diagnose.js.map +1 -0
  1300. package/dist/scoreboard/diagnose.test.d.ts +15 -0
  1301. package/dist/scoreboard/diagnose.test.d.ts.map +1 -0
  1302. package/dist/scoreboard/diagnose.test.js +288 -0
  1303. package/dist/scoreboard/diagnose.test.js.map +1 -0
  1304. package/dist/scoreboard/floors.d.ts +47 -0
  1305. package/dist/scoreboard/floors.d.ts.map +1 -0
  1306. package/dist/scoreboard/floors.js +33 -0
  1307. package/dist/scoreboard/floors.js.map +1 -0
  1308. package/dist/scoreboard/localDrift.d.ts +23 -0
  1309. package/dist/scoreboard/localDrift.d.ts.map +1 -0
  1310. package/dist/scoreboard/localDrift.js +111 -0
  1311. package/dist/scoreboard/localDrift.js.map +1 -0
  1312. package/dist/scoreboard/localDrift.test.d.ts +9 -0
  1313. package/dist/scoreboard/localDrift.test.d.ts.map +1 -0
  1314. package/dist/scoreboard/localDrift.test.js +82 -0
  1315. package/dist/scoreboard/localDrift.test.js.map +1 -0
  1316. package/dist/surfaces/__tests__/adapter.test.d.ts +2 -0
  1317. package/dist/surfaces/__tests__/adapter.test.d.ts.map +1 -0
  1318. package/dist/surfaces/__tests__/adapter.test.js +86 -0
  1319. package/dist/surfaces/__tests__/adapter.test.js.map +1 -0
  1320. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.d.ts +2 -0
  1321. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.d.ts.map +1 -0
  1322. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.js +179 -0
  1323. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.js.map +1 -0
  1324. package/dist/surfaces/__tests__/telemetry.test.d.ts +2 -0
  1325. package/dist/surfaces/__tests__/telemetry.test.d.ts.map +1 -0
  1326. package/dist/surfaces/__tests__/telemetry.test.js +55 -0
  1327. package/dist/surfaces/__tests__/telemetry.test.js.map +1 -0
  1328. package/dist/surfaces/adapter.d.ts +70 -0
  1329. package/dist/surfaces/adapter.d.ts.map +1 -0
  1330. package/dist/surfaces/adapter.js +2 -0
  1331. package/dist/surfaces/adapter.js.map +1 -0
  1332. package/dist/surfaces/adapters/claude.d.ts +3 -0
  1333. package/dist/surfaces/adapters/claude.d.ts.map +1 -0
  1334. package/dist/surfaces/adapters/claude.js +72 -0
  1335. package/dist/surfaces/adapters/claude.js.map +1 -0
  1336. package/dist/surfaces/adapters/codex.d.ts +3 -0
  1337. package/dist/surfaces/adapters/codex.d.ts.map +1 -0
  1338. package/dist/surfaces/adapters/codex.js +61 -0
  1339. package/dist/surfaces/adapters/codex.js.map +1 -0
  1340. package/dist/surfaces/adapters/copilot.d.ts +3 -0
  1341. package/dist/surfaces/adapters/copilot.d.ts.map +1 -0
  1342. package/dist/surfaces/adapters/copilot.js +59 -0
  1343. package/dist/surfaces/adapters/copilot.js.map +1 -0
  1344. package/dist/surfaces/adapters/cursor.d.ts +3 -0
  1345. package/dist/surfaces/adapters/cursor.d.ts.map +1 -0
  1346. package/dist/surfaces/adapters/cursor.js +78 -0
  1347. package/dist/surfaces/adapters/cursor.js.map +1 -0
  1348. package/dist/surfaces/registry.d.ts +58 -2
  1349. package/dist/surfaces/registry.d.ts.map +1 -1
  1350. package/dist/surfaces/registry.js +83 -8
  1351. package/dist/surfaces/registry.js.map +1 -1
  1352. package/dist/surfaces/telemetry.d.ts +17 -0
  1353. package/dist/surfaces/telemetry.d.ts.map +1 -0
  1354. package/dist/surfaces/telemetry.js +31 -0
  1355. package/dist/surfaces/telemetry.js.map +1 -0
  1356. package/package.json +9 -6
  1357. package/dist/__tests__/audit.test.d.ts +0 -2
  1358. package/dist/__tests__/audit.test.d.ts.map +0 -1
  1359. package/dist/__tests__/audit.test.js +0 -394
  1360. package/dist/__tests__/audit.test.js.map +0 -1
  1361. package/dist/__tests__/authority-domains.test.d.ts +0 -2
  1362. package/dist/__tests__/authority-domains.test.d.ts.map +0 -1
  1363. package/dist/__tests__/authority-domains.test.js +0 -48
  1364. package/dist/__tests__/authority-domains.test.js.map +0 -1
  1365. package/dist/__tests__/ingest.test.d.ts +0 -2
  1366. package/dist/__tests__/ingest.test.d.ts.map +0 -1
  1367. package/dist/__tests__/ingest.test.js +0 -185
  1368. package/dist/__tests__/ingest.test.js.map +0 -1
  1369. package/dist/__tests__/onboarding-path-b.test.d.ts +0 -2
  1370. package/dist/__tests__/onboarding-path-b.test.d.ts.map +0 -1
  1371. package/dist/__tests__/onboarding-path-b.test.js +0 -46
  1372. package/dist/__tests__/onboarding-path-b.test.js.map +0 -1
  1373. package/dist/__tests__/onboarding.test.d.ts +0 -6
  1374. package/dist/__tests__/onboarding.test.d.ts.map +0 -1
  1375. package/dist/__tests__/onboarding.test.js +0 -347
  1376. package/dist/__tests__/onboarding.test.js.map +0 -1
  1377. package/dist/__tests__/promote.test.d.ts +0 -2
  1378. package/dist/__tests__/promote.test.d.ts.map +0 -1
  1379. package/dist/__tests__/promote.test.js +0 -230
  1380. package/dist/__tests__/promote.test.js.map +0 -1
  1381. package/dist/__tests__/proposals.test.d.ts +0 -2
  1382. package/dist/__tests__/proposals.test.d.ts.map +0 -1
  1383. package/dist/__tests__/proposals.test.js +0 -167
  1384. package/dist/__tests__/proposals.test.js.map +0 -1
  1385. package/dist/__tests__/setup-ingest.test.d.ts +0 -2
  1386. package/dist/__tests__/setup-ingest.test.d.ts.map +0 -1
  1387. package/dist/__tests__/setup-ingest.test.js +0 -55
  1388. package/dist/__tests__/setup-ingest.test.js.map +0 -1
  1389. package/dist/__tests__/setup-resolver.test.d.ts +0 -14
  1390. package/dist/__tests__/setup-resolver.test.d.ts.map +0 -1
  1391. package/dist/__tests__/setup-resolver.test.js +0 -228
  1392. package/dist/__tests__/setup-resolver.test.js.map +0 -1
  1393. package/dist/__tests__/setup.test.d.ts +0 -2
  1394. package/dist/__tests__/setup.test.d.ts.map +0 -1
  1395. package/dist/__tests__/setup.test.js +0 -141
  1396. package/dist/__tests__/setup.test.js.map +0 -1
  1397. package/dist/commands/accept.d.ts +0 -18
  1398. package/dist/commands/accept.d.ts.map +0 -1
  1399. package/dist/commands/accept.js +0 -76
  1400. package/dist/commands/accept.js.map +0 -1
  1401. package/dist/commands/audit.d.ts +0 -25
  1402. package/dist/commands/audit.d.ts.map +0 -1
  1403. package/dist/commands/audit.js +0 -188
  1404. package/dist/commands/audit.js.map +0 -1
  1405. package/dist/commands/authority-domains.d.ts +0 -140
  1406. package/dist/commands/authority-domains.d.ts.map +0 -1
  1407. package/dist/commands/authority-domains.js +0 -268
  1408. package/dist/commands/authority-domains.js.map +0 -1
  1409. package/dist/commands/brand-pack.d.ts +0 -2
  1410. package/dist/commands/brand-pack.d.ts.map +0 -1
  1411. package/dist/commands/brand-pack.js +0 -25
  1412. package/dist/commands/brand-pack.js.map +0 -1
  1413. package/dist/commands/ingest.d.ts +0 -14
  1414. package/dist/commands/ingest.d.ts.map +0 -1
  1415. package/dist/commands/ingest.js +0 -189
  1416. package/dist/commands/ingest.js.map +0 -1
  1417. package/dist/commands/method.d.ts +0 -99
  1418. package/dist/commands/method.d.ts.map +0 -1
  1419. package/dist/commands/method.js +0 -781
  1420. package/dist/commands/method.js.map +0 -1
  1421. package/dist/commands/migrate-setup.d.ts +0 -18
  1422. package/dist/commands/migrate-setup.d.ts.map +0 -1
  1423. package/dist/commands/migrate-setup.js +0 -198
  1424. package/dist/commands/migrate-setup.js.map +0 -1
  1425. package/dist/commands/promote.d.ts +0 -12
  1426. package/dist/commands/promote.d.ts.map +0 -1
  1427. package/dist/commands/promote.js +0 -113
  1428. package/dist/commands/promote.js.map +0 -1
  1429. package/dist/commands/proposals.d.ts +0 -9
  1430. package/dist/commands/proposals.d.ts.map +0 -1
  1431. package/dist/commands/proposals.js +0 -24
  1432. package/dist/commands/proposals.js.map +0 -1
  1433. package/dist/commands/reject.d.ts +0 -14
  1434. package/dist/commands/reject.d.ts.map +0 -1
  1435. package/dist/commands/reject.js +0 -43
  1436. package/dist/commands/reject.js.map +0 -1
  1437. package/dist/commands/setup-ingest.d.ts +0 -17
  1438. package/dist/commands/setup-ingest.d.ts.map +0 -1
  1439. package/dist/commands/setup-ingest.js +0 -224
  1440. package/dist/commands/setup-ingest.js.map +0 -1
  1441. package/dist/commands/setup-resolver.d.ts +0 -58
  1442. package/dist/commands/setup-resolver.d.ts.map +0 -1
  1443. package/dist/commands/setup-resolver.js +0 -150
  1444. package/dist/commands/setup-resolver.js.map +0 -1
  1445. package/dist/commands/setup.d.ts +0 -15
  1446. package/dist/commands/setup.d.ts.map +0 -1
  1447. package/dist/commands/setup.js +0 -148
  1448. package/dist/commands/setup.js.map +0 -1
  1449. package/dist/formatters/audit.d.ts +0 -46
  1450. package/dist/formatters/audit.d.ts.map +0 -1
  1451. package/dist/formatters/audit.js +0 -81
  1452. package/dist/formatters/audit.js.map +0 -1
  1453. package/dist/formatters/promote.d.ts +0 -30
  1454. package/dist/formatters/promote.d.ts.map +0 -1
  1455. package/dist/formatters/promote.js +0 -39
  1456. package/dist/formatters/promote.js.map +0 -1
  1457. package/dist/formatters/proposals.d.ts +0 -45
  1458. package/dist/formatters/proposals.d.ts.map +0 -1
  1459. package/dist/formatters/proposals.js +0 -62
  1460. package/dist/formatters/proposals.js.map +0 -1
  1461. package/dist/generators/__tests__/surface-profiles.test.d.ts +0 -2
  1462. package/dist/generators/__tests__/surface-profiles.test.d.ts.map +0 -1
  1463. package/dist/generators/__tests__/surface-profiles.test.js +0 -89
  1464. package/dist/generators/__tests__/surface-profiles.test.js.map +0 -1
  1465. package/dist/generators/archetypes.d.ts +0 -52
  1466. package/dist/generators/archetypes.d.ts.map +0 -1
  1467. package/dist/generators/archetypes.js +0 -153
  1468. package/dist/generators/archetypes.js.map +0 -1
  1469. package/dist/generators/archetypes.test.d.ts +0 -2
  1470. package/dist/generators/archetypes.test.d.ts.map +0 -1
  1471. package/dist/generators/archetypes.test.js +0 -237
  1472. package/dist/generators/archetypes.test.js.map +0 -1
  1473. package/dist/generators/chain-classifier.d.ts +0 -49
  1474. package/dist/generators/chain-classifier.d.ts.map +0 -1
  1475. package/dist/generators/chain-classifier.js +0 -180
  1476. package/dist/generators/chain-classifier.js.map +0 -1
  1477. package/dist/generators/chain-classifier.test.d.ts +0 -2
  1478. package/dist/generators/chain-classifier.test.d.ts.map +0 -1
  1479. package/dist/generators/chain-classifier.test.js +0 -257
  1480. package/dist/generators/chain-classifier.test.js.map +0 -1
  1481. package/dist/generators/chain-rules.d.ts +0 -42
  1482. package/dist/generators/chain-rules.d.ts.map +0 -1
  1483. package/dist/generators/chain-rules.js +0 -144
  1484. package/dist/generators/chain-rules.js.map +0 -1
  1485. package/dist/generators/chain-rules.test.d.ts +0 -2
  1486. package/dist/generators/chain-rules.test.d.ts.map +0 -1
  1487. package/dist/generators/chain-rules.test.js +0 -179
  1488. package/dist/generators/chain-rules.test.js.map +0 -1
  1489. package/dist/generators/handshake-diff.d.ts +0 -67
  1490. package/dist/generators/handshake-diff.d.ts.map +0 -1
  1491. package/dist/generators/handshake-diff.js +0 -183
  1492. package/dist/generators/handshake-diff.js.map +0 -1
  1493. package/dist/generators/handshake-diff.test.d.ts +0 -2
  1494. package/dist/generators/handshake-diff.test.d.ts.map +0 -1
  1495. package/dist/generators/handshake-diff.test.js +0 -264
  1496. package/dist/generators/handshake-diff.test.js.map +0 -1
  1497. package/dist/lib/activation.d.ts +0 -28
  1498. package/dist/lib/activation.d.ts.map +0 -1
  1499. package/dist/lib/activation.js +0 -57
  1500. package/dist/lib/activation.js.map +0 -1
  1501. package/dist/lib/activation.test.d.ts +0 -6
  1502. package/dist/lib/activation.test.d.ts.map +0 -1
  1503. package/dist/lib/activation.test.js +0 -121
  1504. package/dist/lib/activation.test.js.map +0 -1
  1505. package/dist/lib/conversation-engine.d.ts +0 -45
  1506. package/dist/lib/conversation-engine.d.ts.map +0 -1
  1507. package/dist/lib/conversation-engine.js +0 -112
  1508. package/dist/lib/conversation-engine.js.map +0 -1
  1509. package/dist/lib/conversation-phases.d.ts +0 -59
  1510. package/dist/lib/conversation-phases.d.ts.map +0 -1
  1511. package/dist/lib/conversation-phases.js +0 -11
  1512. package/dist/lib/conversation-phases.js.map +0 -1
  1513. package/dist/lib/conversation-signals.d.ts +0 -30
  1514. package/dist/lib/conversation-signals.d.ts.map +0 -1
  1515. package/dist/lib/conversation-signals.js +0 -64
  1516. package/dist/lib/conversation-signals.js.map +0 -1
  1517. package/dist/lib/inferSourceDate.d.ts +0 -12
  1518. package/dist/lib/inferSourceDate.d.ts.map +0 -1
  1519. package/dist/lib/inferSourceDate.js +0 -44
  1520. package/dist/lib/inferSourceDate.js.map +0 -1
  1521. package/dist/lib/onboarding-path-b.d.ts +0 -10
  1522. package/dist/lib/onboarding-path-b.d.ts.map +0 -1
  1523. package/dist/lib/onboarding-path-b.js +0 -214
  1524. package/dist/lib/onboarding-path-b.js.map +0 -1
  1525. package/dist/lib/onboarding-phases.d.ts +0 -9
  1526. package/dist/lib/onboarding-phases.d.ts.map +0 -1
  1527. package/dist/lib/onboarding-phases.js +0 -120
  1528. package/dist/lib/onboarding-phases.js.map +0 -1
  1529. package/dist/lib/onboarding-shared.d.ts +0 -81
  1530. package/dist/lib/onboarding-shared.d.ts.map +0 -1
  1531. package/dist/lib/onboarding-shared.js +0 -190
  1532. package/dist/lib/onboarding-shared.js.map +0 -1
  1533. package/dist/lib/onboarding-topics.d.ts +0 -27
  1534. package/dist/lib/onboarding-topics.d.ts.map +0 -1
  1535. package/dist/lib/onboarding-topics.js +0 -57
  1536. package/dist/lib/onboarding-topics.js.map +0 -1
  1537. package/dist/lib/onboarding.d.ts +0 -17
  1538. package/dist/lib/onboarding.d.ts.map +0 -1
  1539. package/dist/lib/onboarding.js +0 -350
  1540. package/dist/lib/onboarding.js.map +0 -1
  1541. package/templates/archetypes/boundary.md +0 -23
  1542. package/templates/archetypes/constraint.md +0 -23
  1543. package/templates/archetypes/convention.md +0 -23
  1544. package/templates/archetypes/policy.md +0 -23
  1545. package/templates/archetypes/quality-gate.md +0 -23
  1546. package/templates/archetypes/workflow.md +0 -23
@@ -1,9 +1,7 @@
1
1
  /**
2
2
  * pb handshake --init — unit tests.
3
3
  * DEC-271: two-file split (team vs personal). DEC-272: permission whitelist.
4
- * TEN-712: hooks must fail silently (|| true suffix).
5
- *
6
- * WP-379 S3b: probeStarterSetupSeeded + pollUntilSeedsReady tests.
4
+ * TEN-712: every hook command must end with '|| true' so it never blocks Claude Code from starting.
7
5
  */
8
6
  import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest';
9
7
  import { join } from 'path';
@@ -11,10 +9,23 @@ import { join } from 'path';
11
9
  // vi.mock('fs', ...) below hoists this mock, so these imports resolve to the mocked versions.
12
10
  import { readdirSync as readdirSyncMock } from 'fs';
13
11
  // vi.mock calls are hoisted — use vi.hoisted() for constants referenced inside factories.
14
- const { vfs, vfsMtimes, MOCK_CWD, MOCK_HOME } = vi.hoisted(() => ({
12
+ const { vfs, vfsMtimes, vfsDirs, vfsSymlinks, vfsRealpaths, vfsInodes, MOCK_CWD, MOCK_HOME } = vi.hoisted(() => ({
15
13
  vfs: {},
16
14
  // WP-379 S5b: mtime map used by statSync mock for case-collision ordering tests.
17
15
  vfsMtimes: {},
16
+ // PR #912 follow-up: lstatSync needs dir-vs-file-vs-symlink distinction, which the flat
17
+ // `vfs` content map doesn't carry (a directory marker is stored as `vfs[dir] = ''`, same
18
+ // shape as an empty file) — these two sets disambiguate for the Cursor nested-skills tests.
19
+ vfsDirs: new Set(),
20
+ vfsSymlinks: new Set(),
21
+ // PR #912 follow-up (Cursor security review): explicit path→realpath overrides so a test can
22
+ // simulate an INTERMEDIATE symlinked component (e.g. .cursor/skills itself) resolving outside
23
+ // the repo, distinct from vfsSymlinks which only marks the final path component as a link.
24
+ vfsRealpaths: new Map(),
25
+ // Round 13: explicit path→ino override so a test can make two case-variant paths resolve to
26
+ // the SAME filesystem entry (case-insensitive FS simulation). Unset paths fall back to a
27
+ // deterministic per-path hash in the statSync mock below.
28
+ vfsInodes: new Map(),
18
29
  MOCK_CWD: '/tmp/pb-test-cwd',
19
30
  MOCK_HOME: '/tmp/pb-test-home',
20
31
  }));
@@ -43,10 +54,51 @@ vi.mock('fs', () => ({
43
54
  // Return a fake stat with an incrementing mtime based on path hash (deterministic).
44
55
  // Tests that need specific mtime ordering should set vfs[path] before calling.
45
56
  const mtimeMs = vfsMtimes[path] ?? 1000;
46
- return { mtimeMs };
57
+ // Round 13: dev/ino for case-insensitive-alias detection. dev is constant (single fake
58
+ // filesystem); ino defaults to a deterministic per-path hash unless a test overrides it
59
+ // via vfsInodes to make two case-variant paths resolve to the same entry.
60
+ let ino = vfsInodes.get(path);
61
+ if (ino === undefined) {
62
+ let h = 0;
63
+ for (let i = 0; i < path.length; i++)
64
+ h = (h * 31 + path.charCodeAt(i)) | 0;
65
+ ino = h;
66
+ }
67
+ return { mtimeMs, dev: 1, ino };
47
68
  }
48
69
  throw Object.assign(new Error(`ENOENT: stat '${path}'`), { code: 'ENOENT' });
49
70
  }),
71
+ // PR #912 follow-up: lstatSync backs the Cursor nested-skills symlink refusal — never
72
+ // follows a link, so a path marked in vfsSymlinks reports neither isDirectory() nor isFile().
73
+ lstatSync: vi.fn((path) => {
74
+ const isSymlink = vfsSymlinks.has(path);
75
+ const isDir = vfsDirs.has(path);
76
+ const isFile = !isSymlink && !isDir && path in vfs;
77
+ if (!isSymlink && !isDir && !isFile) {
78
+ throw Object.assign(new Error(`ENOENT: lstat '${path}'`), { code: 'ENOENT' });
79
+ }
80
+ // Round 15: dev/ino for directory-entry-identity comparisons (findLeftoverCursorSkills'
81
+ // live-alias check). Same default-hash-or-vfsInodes-override scheme as statSync below.
82
+ let ino = vfsInodes.get(path);
83
+ if (ino === undefined) {
84
+ let h = 0;
85
+ for (let i = 0; i < path.length; i++)
86
+ h = (h * 31 + path.charCodeAt(i)) | 0;
87
+ ino = h;
88
+ }
89
+ return {
90
+ isDirectory: () => isDir,
91
+ isFile: () => isFile,
92
+ isSymbolicLink: () => isSymlink,
93
+ dev: 1,
94
+ ino,
95
+ };
96
+ }),
97
+ // PR #912 follow-up: realpathSync backs the Cursor-skills-root containment check — an explicit
98
+ // vfsRealpaths override simulates an intermediate symlinked component; otherwise identity.
99
+ // Identity by default (a real fs resolves an ordinary path, including MOCK_CWD itself, to
100
+ // itself) — vfsRealpaths overrides model a specific symlinked path resolving elsewhere.
101
+ realpathSync: vi.fn((path) => vfsRealpaths.get(path) ?? path),
50
102
  }));
51
103
  vi.mock('os', () => ({
52
104
  homedir: vi.fn(() => MOCK_HOME),
@@ -59,8 +111,12 @@ vi.mock('../lib/prompts.js', () => ({
59
111
  password: () => Promise.resolve(''),
60
112
  isInteractive: () => true,
61
113
  }));
62
- import { runHandshakeInit, normalizeHandshakeContentForComparison, DORMANT_MARKER, writeDormantMarkerToFile, resolveProjectionCollision } from '../commands/handshake.js';
114
+ import { runHandshakeInit, normalizeHandshakeContentForComparison, findLeftoverProjections, classifyDriftBucket, deriveHandshakeStartupSignals, dereferencePrRefToPaths } from '../commands/handshake.js';
115
+ import { findLeftoverCursorSkills, LEFTOVER_FILES_MAX } from '../commands/handshakeCursorSkillCleanup.js';
63
116
  import { MARKER } from '../generators/adapters.js';
117
+ /** PR #911 review (Codex P2): findLeftoverProjections scopes reporting to allowedTargets — tests that want every surface scanned pass this. */
118
+ const ALL_SURFACES = new Set(['cursor', 'claude', 'codex', 'copilot']);
119
+ import { createHash } from 'crypto';
64
120
  const TEAM_PATH = join(MOCK_CWD, '.claude', 'settings.json');
65
121
  const PERSONAL_PATH = join(MOCK_HOME, '.claude', 'settings.json');
66
122
  describe('runHandshakeInit', () => {
@@ -81,8 +137,9 @@ describe('runHandshakeInit', () => {
81
137
  expect(vfs[TEAM_PATH]).toBeDefined();
82
138
  const team = JSON.parse(vfs[TEAM_PATH]);
83
139
  expect(team.hooks.SessionStart).toHaveLength(1);
84
- expect(team.hooks.Stop).toHaveLength(1);
85
- expect(team.hooks.PreCompact).toHaveLength(1);
140
+ expect(team.hooks.SessionEnd).toHaveLength(1);
141
+ expect(team.hooks.Stop).toBeUndefined();
142
+ expect(team.hooks.PreCompact).toBeUndefined();
86
143
  expect(team.permissions.allow).toContain('Bash(pb:*)');
87
144
  });
88
145
  it('writes trust level to personal config (~/.claude/settings.json)', async () => {
@@ -113,8 +170,8 @@ describe('runHandshakeInit', () => {
113
170
  await runHandshakeInit({ level: 'work', dryRun: false });
114
171
  const team = JSON.parse(vfs[TEAM_PATH]);
115
172
  expect(team.hooks.SessionStart).toHaveLength(1);
116
- expect(team.hooks.Stop).toHaveLength(1);
117
- expect(team.hooks.PreCompact).toHaveLength(1);
173
+ expect(team.hooks.SessionEnd).toHaveLength(1);
174
+ expect(team.hooks.Stop).toBeUndefined();
118
175
  expect(team.permissions.allow.filter((p) => p === 'Bash(pb:*)')).toHaveLength(1);
119
176
  });
120
177
  it('running twice produces no duplicate permissions in personal config', async () => {
@@ -125,6 +182,27 @@ describe('runHandshakeInit', () => {
125
182
  expect(personal.permissions.allow.filter((p) => p === 'Bash(git:*)')).toHaveLength(1);
126
183
  });
127
184
  });
185
+ // TASK-763 (DEC-2038): an older init put pb session close on Stop, which fires after every turn.
186
+ describe('legacy Stop close migration', () => {
187
+ const close = { type: 'command', command: 'pb session close 2>/dev/null || true', statusMessage: 'Closing pb session...' };
188
+ const other = { type: 'command', command: 'echo my-own-stop-hook' };
189
+ it('removes the Stop close, keeps an unrelated Stop hook, and installs the SessionEnd close once', async () => {
190
+ vfs[TEAM_PATH] = JSON.stringify({ hooks: { Stop: [{ hooks: [close, other] }] } });
191
+ await runHandshakeInit({ level: 'work', dryRun: false });
192
+ await runHandshakeInit({ level: 'work', dryRun: false });
193
+ const team = JSON.parse(vfs[TEAM_PATH]);
194
+ expect(team.hooks.Stop).toEqual([{ hooks: [other] }]);
195
+ expect(team.hooks.SessionEnd).toHaveLength(1);
196
+ expect(team.hooks.SessionEnd[0].hooks[0]).toMatchObject({ command: close.command, timeout: 15 });
197
+ });
198
+ it('drops the Stop event entirely when the close was its only hook', async () => {
199
+ vfs[TEAM_PATH] = JSON.stringify({ hooks: { Stop: [{ hooks: [close] }] } });
200
+ await runHandshakeInit({ level: 'work', dryRun: false });
201
+ const team = JSON.parse(vfs[TEAM_PATH]);
202
+ expect(team.hooks.Stop).toBeUndefined();
203
+ expect(team.hooks.SessionEnd).toHaveLength(1);
204
+ });
205
+ });
128
206
  describe('security constraints (DEC-272)', () => {
129
207
  it('never puts defaultMode in team config', async () => {
130
208
  await runHandshakeInit({ level: 'full-trust', dryRun: false });
@@ -165,22 +243,20 @@ describe('runHandshakeInit', () => {
165
243
  await runHandshakeInit({ level: 'work', dryRun: false });
166
244
  const team = JSON.parse(vfs[TEAM_PATH]);
167
245
  const sessionStartCmd = team.hooks.SessionStart[0].hooks[0].command;
168
- const stopCmd = team.hooks.Stop[0].hooks[0].command;
169
- const precompactCmd = team.hooks.PreCompact[0].hooks[0].command;
246
+ const sessionEndCmd = team.hooks.SessionEnd[0].hooks[0].command;
170
247
  expect(sessionStartCmd).toContain('|| true');
171
- expect(stopCmd).toContain('|| true');
172
- expect(precompactCmd).toContain('|| true');
248
+ expect(sessionEndCmd).toContain('|| true');
173
249
  });
174
250
  it('pb session start hook command is exact', async () => {
175
251
  await runHandshakeInit({ level: 'work', dryRun: false });
176
252
  const team = JSON.parse(vfs[TEAM_PATH]);
177
253
  const cmd = team.hooks.SessionStart[0].hooks[0].command;
178
- expect(cmd).toBe('pb session start 2>/dev/null || true');
254
+ expect(cmd).toBe("pb session start 2>&1 || true");
179
255
  });
180
256
  it('pb session close hook command is exact', async () => {
181
257
  await runHandshakeInit({ level: 'work', dryRun: false });
182
258
  const team = JSON.parse(vfs[TEAM_PATH]);
183
- const cmd = team.hooks.Stop[0].hooks[0].command;
259
+ const cmd = team.hooks.SessionEnd[0].hooks[0].command;
184
260
  expect(cmd).toBe('pb session close 2>/dev/null || true');
185
261
  });
186
262
  });
@@ -219,337 +295,746 @@ describe('normalizeHandshakeContentForComparison', () => {
219
295
  expect(normalizeHandshakeContentForComparison(a)).not.toBe(normalizeHandshakeContentForComparison(b));
220
296
  });
221
297
  });
222
- // ── WP-379 S3b: probeStarterSetupSeeded + pollUntilSeedsReady ─────────────────
298
+ // WP-379 S3b's probeStarterSetupSeeded + pollUntilSeedsReady tests deleted at WP-776 S0
299
+ // round-1 review (Codex P1, verified regression): nothing seeds setup-assets any more, so
300
+ // the functions they tested (whose readiness gate was keyed on starterSetupSeeded alone)
301
+ // are deleted from packages/cli/src/commands/handshake.ts.
302
+ // ── WP-379 S5b: findLeftoverProjections + findLeftoverCursorSkills — REPORT-ONLY ────────────
223
303
  //
224
- // These tests use vi.doMock (not vi.mock) so they can inject different
225
- // kernelCall implementations per test without affecting the --init tests above.
226
- // Each test creates its own isolated module scope via vi.resetModules().
227
- describe('probeStarterSetupSeeded (WP-379 S3b)', () => {
304
+ // Coordinator ruling (PR #912 round 10): nine review rounds on the same unlink mechanism —
305
+ // symlinks, case collisions, empty-DB states, tamper preservation — is the signal that a
306
+ // deletion mechanism over a user's filesystem is defensive machinery whose edge cases never
307
+ // end. pb handshake no longer unlinks, renames, or recreates any leftover file; these tests
308
+ // assert survival AND report inclusion for each stale class. All file system operations go
309
+ // through the vfs mock defined at the top of this file.
310
+ describe('findLeftoverProjections (WP-379 S5b, report-only)', () => {
228
311
  beforeEach(() => {
229
- vi.resetModules();
312
+ Object.keys(vfs).forEach((k) => delete vfs[k]);
313
+ Object.keys(vfsMtimes).forEach((k) => delete vfsMtimes[k]);
314
+ vfsDirs.clear();
315
+ vfsSymlinks.clear();
316
+ vfsRealpaths.clear();
317
+ vfsInodes.clear();
318
+ vi.clearAllMocks();
230
319
  });
231
- afterEach(() => {
232
- vi.restoreAllMocks();
320
+ function writeMarkedFile(path, extra = '') {
321
+ const dir = path.substring(0, path.lastIndexOf('/'));
322
+ vfs[dir] = '';
323
+ vfs[path] = `${MARKER}\n# Rule\n${extra}`;
324
+ }
325
+ function writeUserFile(path) {
326
+ const dir = path.substring(0, path.lastIndexOf('/'));
327
+ vfs[dir] = '';
328
+ vfs[path] = '# My user rule — no marker here\n';
329
+ }
330
+ it('an exact-match file is not reported; a case-variant with the same stem is reported as leftover and survives', () => {
331
+ const dir = `${MOCK_CWD}/.cursor/rules`;
332
+ const exact = `${dir}/setup-productbrain.mdc`;
333
+ const variant = `${dir}/Setup-ProductBrain.mdc`;
334
+ writeMarkedFile(exact);
335
+ writeMarkedFile(variant);
336
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
337
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['setup-productbrain.mdc', 'Setup-ProductBrain.mdc'] : []));
338
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['setup-productbrain'], ALL_SURFACES);
339
+ expect(exact in vfs).toBe(true);
340
+ expect(variant in vfs).toBe(true); // survives — never unlinked
341
+ expect(leftovers.some((l) => l.path === exact)).toBe(false); // current — not reported
342
+ expect(leftovers.some((l) => l.path === variant && l.reason.includes('stale case'))).toBe(true);
233
343
  });
234
- it('returns seeds-ready when health.starterSetupSeeded is true', async () => {
235
- vi.doMock('../lib/client.js', () => ({
236
- kernelCall: vi.fn().mockResolvedValue({
237
- starterSetupSeeded: true,
238
- gaps: [],
239
- status: 'healthy',
240
- }),
241
- }));
242
- const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
243
- const result = await probeStarterSetupSeeded();
244
- expect(result.status).toBe('seeds-ready');
344
+ it('a marker-bearing file with no canonical match is reported as an orphan and survives', () => {
345
+ const dir = `${MOCK_CWD}/.cursor/rules`;
346
+ const orphan = `${dir}/old-orphaned-rule.mdc`;
347
+ writeMarkedFile(orphan);
348
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
349
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['old-orphaned-rule.mdc'] : []));
350
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['some-other-rule'], ALL_SURFACES);
351
+ expect(orphan in vfs).toBe(true); // survives — never unlinked
352
+ expect(leftovers.some((l) => l.path === orphan && l.reason.includes('orphan'))).toBe(true);
245
353
  });
246
- it('returns seeds-pending with starter-setup-missing gap when starterSetupSeeded is false', async () => {
247
- vi.doMock('../lib/client.js', () => ({
248
- kernelCall: vi.fn().mockResolvedValue({
249
- starterSetupSeeded: false,
250
- gaps: [
251
- {
252
- kind: 'starter-setup-missing',
253
- severity: 'error',
254
- message: 'Starter setup seeds are still running.',
255
- },
256
- ],
257
- status: 'incomplete',
258
- }),
259
- }));
260
- const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
261
- const result = await probeStarterSetupSeeded();
262
- expect(result.status).toBe('seeds-pending');
263
- if (result.status === 'seeds-pending') {
264
- expect(result.gaps.length).toBeGreaterThan(0);
265
- expect(result.gaps[0]?.kind).toBe('starter-setup-missing');
266
- }
354
+ it('a leftover .dormant file is reported and survives, regardless of content match with its live sibling', () => {
355
+ const dir = `${MOCK_CWD}/.claude/rules`;
356
+ const live = `${dir}/setup-productbrain.md`;
357
+ const dormant = `${dir}/setup-productbrain.md.dormant`;
358
+ writeMarkedFile(live, 'Same body');
359
+ writeMarkedFile(dormant, 'Same body');
360
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
361
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['setup-productbrain.md', 'setup-productbrain.md.dormant'] : []));
362
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['setup-productbrain'], ALL_SURFACES);
363
+ expect(live in vfs).toBe(true);
364
+ expect(dormant in vfs).toBe(true); // survives, even though content matches the live file
365
+ expect(leftovers.some((l) => l.path === live)).toBe(false);
366
+ expect(leftovers.some((l) => l.path === dormant && l.reason.includes('.dormant'))).toBe(true);
267
367
  });
268
- it('returns probe-failed when kernelCall throws', async () => {
269
- vi.doMock('../lib/client.js', () => ({
270
- kernelCall: vi.fn().mockRejectedValue(new Error('Network unreachable')),
271
- }));
272
- const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
273
- const result = await probeStarterSetupSeeded();
274
- expect(result.status).toBe('probe-failed');
275
- if (result.status === 'probe-failed') {
276
- expect(result.error).toContain('Network unreachable');
277
- }
368
+ it('a user-owned file (no marker) is never reported and never touched', () => {
369
+ const dir = `${MOCK_CWD}/.cursor/rules`;
370
+ const userFile = `${dir}/foo.mdc`;
371
+ writeUserFile(userFile);
372
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
373
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['foo.mdc'] : []));
374
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, [], ALL_SURFACES);
375
+ expect(userFile in vfs).toBe(true);
376
+ expect(leftovers.some((l) => l.path === userFile)).toBe(false);
278
377
  });
279
- it('synthesizes a default starter-setup-missing gap when health.gaps is empty but starterSetupSeeded is false', async () => {
280
- vi.doMock('../lib/client.js', () => ({
281
- kernelCall: vi.fn().mockResolvedValue({
282
- starterSetupSeeded: false,
283
- gaps: [], // no gap details from server
284
- status: 'incomplete',
285
- }),
286
- }));
287
- const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
288
- const result = await probeStarterSetupSeeded();
289
- expect(result.status).toBe('seeds-pending');
290
- if (result.status === 'seeds-pending') {
291
- expect(result.gaps.length).toBe(1);
292
- expect(result.gaps[0]?.kind).toBe('starter-setup-missing');
378
+ it('an unselected surface is left unreported entirely', () => {
379
+ const dir = `${MOCK_CWD}/.codex/skills`;
380
+ const orphan = `${dir}/old-skill.md`;
381
+ writeMarkedFile(orphan);
382
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
383
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['old-skill.md'] : []));
384
+ const claudeOnly = new Set(['claude']);
385
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, [], claudeOnly);
386
+ expect(orphan in vfs).toBe(true);
387
+ expect(leftovers.some((l) => l.path === orphan)).toBe(false);
388
+ });
389
+ it('PR #912 round 11 (Codex P2): a generated router/index file (no matching asset name) is not reported when its exact path is in the write plan', () => {
390
+ const dir = `${MOCK_CWD}/.codex/skills`;
391
+ const indexFile = `${dir}/README.md`;
392
+ writeMarkedFile(indexFile);
393
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
394
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['README.md'] : []));
395
+ // No asset name matches "readme" — the old asset-name-only comparison would call this an
396
+ // orphan even though the write plan legitimately (re)generates it every run.
397
+ const exactRelativePaths = new Set(['.codex/skills/README.md']);
398
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['setup-productbrain'], ALL_SURFACES, undefined, exactRelativePaths);
399
+ expect(leftovers.some((l) => l.path === indexFile)).toBe(false);
400
+ });
401
+ it('PR #912 round 11 (Codex P2): a canonical raw name not already in normalized form is not reported as a stale variant when it is the exact write-plan path', () => {
402
+ const dir = `${MOCK_CWD}/.claude/rules`;
403
+ const rawNameFile = `${dir}/Setup Skill.md`;
404
+ writeMarkedFile(rawNameFile);
405
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
406
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['Setup Skill.md'] : []));
407
+ // "Setup Skill" normalizes to "setup-skill", so the raw filename's stem !== its normalized
408
+ // form — without the exact-path carve-out this reads as a stale case/punctuation variant
409
+ // even though the writer emits this exact raw name every run.
410
+ const exactRelativePaths = new Set(['.claude/rules/Setup Skill.md']);
411
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['Setup Skill'], ALL_SURFACES, undefined, exactRelativePaths);
412
+ expect(leftovers.some((l) => l.path === rawNameFile)).toBe(false);
413
+ });
414
+ it('PR #912 round 11 (Codex P2): without the exact-path carve-out, that same raw-name file is still (wrongly) reported as a stale variant — pins the failure mode the fix closes', () => {
415
+ const dir = `${MOCK_CWD}/.claude/rules`;
416
+ const rawNameFile = `${dir}/Setup Skill.md`;
417
+ writeMarkedFile(rawNameFile);
418
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
419
+ readdirSyncMock.mockImplementation((d) => (d === dir ? ['Setup Skill.md'] : []));
420
+ const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['Setup Skill'], ALL_SURFACES);
421
+ expect(leftovers.some((l) => l.path === rawNameFile && l.reason.includes('stale case'))).toBe(true);
422
+ });
423
+ it('PR #912 round 13 (Codex P2): stops scanning after LEFTOVER_FILES_MAX + 1 matches, reporting truncated=true and a capped list', () => {
424
+ const dir = `${MOCK_CWD}/.cursor/rules`;
425
+ const count = LEFTOVER_FILES_MAX + 5;
426
+ const filenames = Array.from({ length: count }, (_, i) => `orphan-${i}.mdc`);
427
+ for (const f of filenames)
428
+ writeMarkedFile(`${dir}/${f}`);
429
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
430
+ readdirSyncMock.mockImplementation((d) => (d === dir ? filenames : []));
431
+ const { files: leftovers, truncated } = findLeftoverProjections(MOCK_CWD, [], ALL_SURFACES);
432
+ expect(truncated).toBe(true);
433
+ expect(leftovers).toHaveLength(LEFTOVER_FILES_MAX);
434
+ // Every file still survives on disk — this is I/O and reporting bound, never deletion.
435
+ for (const f of filenames)
436
+ expect(`${dir}/${f}` in vfs).toBe(true);
437
+ });
438
+ it('a count at exactly the cap is NOT reported as truncated', () => {
439
+ const dir = `${MOCK_CWD}/.cursor/rules`;
440
+ const filenames = Array.from({ length: LEFTOVER_FILES_MAX }, (_, i) => `orphan-${i}.mdc`);
441
+ for (const f of filenames)
442
+ writeMarkedFile(`${dir}/${f}`);
443
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
444
+ readdirSyncMock.mockImplementation((d) => (d === dir ? filenames : []));
445
+ const { files: leftovers, truncated } = findLeftoverProjections(MOCK_CWD, [], ALL_SURFACES);
446
+ expect(truncated).toBe(false);
447
+ expect(leftovers).toHaveLength(LEFTOVER_FILES_MAX);
448
+ });
449
+ });
450
+ describe('findLeftoverCursorSkills (WP-379 S5b nested layout, report-only)', () => {
451
+ beforeEach(() => {
452
+ Object.keys(vfs).forEach((k) => delete vfs[k]);
453
+ vfsDirs.clear();
454
+ vfsSymlinks.clear();
455
+ vfsRealpaths.clear();
456
+ vfsInodes.clear();
457
+ vi.clearAllMocks();
458
+ });
459
+ it('an orphan nested Cursor skill is reported as leftover and survives', () => {
460
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
461
+ const orphanDir = `${skillsDir}/old-skill`;
462
+ const orphanMd = `${orphanDir}/SKILL.md`;
463
+ vfs[skillsDir] = '';
464
+ vfsDirs.add(skillsDir);
465
+ vfsDirs.add(orphanDir);
466
+ vfs[orphanMd] = `${MARKER}\n# Old skill\n`;
467
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
468
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['old-skill'] : []));
469
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, []);
470
+ expect(orphanMd in vfs).toBe(true); // survives — never unlinked
471
+ expect(leftovers.some((l) => l.path === orphanMd && l.reason.includes('orphan'))).toBe(true);
472
+ });
473
+ it('a Title-Cased canonical Cursor skill directory is not reported (correctly current) — the write loop emits the raw canonical name', () => {
474
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
475
+ const activeDir = `${skillsDir}/Setup Skill`;
476
+ const activeMd = `${activeDir}/SKILL.md`;
477
+ vfs[skillsDir] = '';
478
+ vfsDirs.add(skillsDir);
479
+ vfsDirs.add(activeDir);
480
+ vfs[activeMd] = `${MARKER}\n# Active\n`;
481
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
482
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['Setup Skill'] : []));
483
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
484
+ expect(activeMd in vfs).toBe(true);
485
+ expect(leftovers.some((l) => l.path === activeMd)).toBe(false);
486
+ });
487
+ it('a stale case/punctuation-variant Cursor skill directory is reported as leftover and survives — normalized stem alone is not the canonical name', () => {
488
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
489
+ const staleDir = `${skillsDir}/setup-skill`; // normalized stem, NOT the raw canonical name
490
+ const staleMd = `${staleDir}/SKILL.md`;
491
+ vfs[skillsDir] = '';
492
+ vfsDirs.add(skillsDir);
493
+ vfsDirs.add(staleDir);
494
+ vfs[staleMd] = `${MARKER}\n# Stale cased\n`;
495
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
496
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
497
+ // Canonical raw name is Title-Cased ("Setup Skill"), never the lowercase-slug ("setup-skill").
498
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
499
+ expect(staleMd in vfs).toBe(true); // survives — never unlinked
500
+ expect(leftovers.some((l) => l.path === staleMd && l.reason.includes('stale case'))).toBe(true);
501
+ });
502
+ it('a user-owned Cursor skill (no marker) is never reported and never touched', () => {
503
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
504
+ const userDir = `${skillsDir}/my-skill`;
505
+ const userMd = `${userDir}/SKILL.md`;
506
+ vfs[skillsDir] = '';
507
+ vfsDirs.add(skillsDir);
508
+ vfsDirs.add(userDir);
509
+ vfs[userMd] = '# My own skill — no marker\n';
510
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
511
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['my-skill'] : []));
512
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, []);
513
+ expect(userMd in vfs).toBe(true);
514
+ expect(leftovers.some((l) => l.path === userMd)).toBe(false);
515
+ });
516
+ it('PR #912 round 15 (Codex P2): a case-only alias that resolves to the SAME directory entry as the canonical path is not reported as stale (case-insensitive filesystem)', () => {
517
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
518
+ // On a case-insensitive FS, the directory literally on disk is "setup-skill" but the OS
519
+ // also resolves "Setup Skill" to that SAME entry — simulate that by giving both DIRECTORY
520
+ // paths' lstat() the same dev+ino, exactly like a real case-insensitive filesystem would.
521
+ const aliasDir = `${skillsDir}/setup-skill`;
522
+ const canonicalDir = `${skillsDir}/Setup Skill`;
523
+ const aliasMd = `${aliasDir}/SKILL.md`;
524
+ vfs[skillsDir] = '';
525
+ vfsDirs.add(skillsDir);
526
+ vfsDirs.add(aliasDir);
527
+ vfsDirs.add(canonicalDir); // same physical entry, reachable under either spelling
528
+ vfs[aliasMd] = `${MARKER}\n# Active (case-insensitive alias)\n`;
529
+ vfsInodes.set(aliasDir, 777);
530
+ vfsInodes.set(canonicalDir, 777); // same entry on a case-insensitive FS
531
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
532
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
533
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
534
+ expect(aliasMd in vfs).toBe(true); // survives — was never a candidate for removal anyway
535
+ expect(leftovers.some((l) => l.path === aliasMd)).toBe(false);
536
+ });
537
+ it('PR #912 round 15 (Codex P2): the SOLE on-disk entry being itself a symlink is still a live alias, not a leftover, when both case spellings resolve to it', () => {
538
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
539
+ // "setup-skill" is the ONLY directory entry, and it happens to be a symlink (e.g. to some
540
+ // external skill store) — but on a case-insensitive FS, "Setup Skill" resolves to that SAME
541
+ // entry too. Round 14's "never exempt a symlink" rule wrongly flagged this as stale; round 15
542
+ // compares lstat identity instead, which correctly treats "same entry" as a live alias
543
+ // regardless of whether that shared entry happens to be a symlink.
544
+ const aliasDir = `${skillsDir}/setup-skill`;
545
+ const canonicalDir = `${skillsDir}/Setup Skill`;
546
+ const aliasMd = `${aliasDir}/SKILL.md`;
547
+ vfs[skillsDir] = '';
548
+ vfsDirs.add(skillsDir);
549
+ vfsSymlinks.add(aliasDir);
550
+ vfsSymlinks.add(canonicalDir); // same physical symlink, addressed by either spelling
551
+ vfs[aliasMd] = `${MARKER}\n# Active (sole entry is a symlink)\n`;
552
+ vfsInodes.set(aliasDir, 999);
553
+ vfsInodes.set(canonicalDir, 999); // identical lstat identity — one real entry
554
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
555
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
556
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
557
+ expect(aliasMd in vfs).toBe(true);
558
+ expect(leftovers.some((l) => l.path === aliasMd)).toBe(false);
559
+ });
560
+ it('PR #912 round 15 (Codex P2): a SYMLINKED case-only alias pointing AT a distinct canonical directory is still reported as stale (case-sensitive filesystem, two real entries)', () => {
561
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
562
+ // "setup-skill" is a SYMLINK pointing AT the canonical "Setup Skill" directory — TWO
563
+ // distinct, separately-readdirSync-visible entries. lstat (never follows) on each gives a
564
+ // DIFFERENT identity: the symlink's own inode vs. the real target directory's inode.
565
+ const aliasDir = `${skillsDir}/setup-skill`;
566
+ const canonicalDir = `${skillsDir}/Setup Skill`;
567
+ const aliasMd = `${aliasDir}/SKILL.md`;
568
+ vfs[skillsDir] = '';
569
+ vfsDirs.add(skillsDir);
570
+ vfsSymlinks.add(aliasDir); // the discovered directory entry IS a symlink
571
+ vfsDirs.add(canonicalDir); // the canonical directory is a real, distinct entry
572
+ vfs[aliasMd] = `${MARKER}\n# Symlinked alias\n`;
573
+ // No vfsInodes override — default per-path hash means aliasDir and canonicalDir get
574
+ // DIFFERENT inos, matching two genuinely distinct filesystem objects.
575
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
576
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
577
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
578
+ expect(aliasMd in vfs).toBe(true); // survives — report-only, never unlinked
579
+ expect(leftovers.some((l) => l.path === aliasMd && l.reason.includes('stale case'))).toBe(true);
580
+ });
581
+ it('PR #912 round 13 (Codex P2): a genuinely distinct stale directory (different inode) is still reported, even with the same normalized stem', () => {
582
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
583
+ const staleDir = `${skillsDir}/setup-skill`;
584
+ const staleMd = `${staleDir}/SKILL.md`;
585
+ vfs[skillsDir] = '';
586
+ vfsDirs.add(skillsDir);
587
+ vfsDirs.add(staleDir);
588
+ vfs[staleMd] = `${MARKER}\n# Genuinely stale\n`;
589
+ // The canonical "Setup Skill" directory doesn't exist in this test at all (lstatSync on it
590
+ // throws ENOENT, caught, treated as no match) — a real, distinct stale directory, not an alias.
591
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
592
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
593
+ const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
594
+ expect(staleMd in vfs).toBe(true); // survives — never unlinked
595
+ expect(leftovers.some((l) => l.path === staleMd && l.reason.includes('stale case'))).toBe(true);
596
+ });
597
+ it('PR #912 round 13 (Codex P2): stops scanning after maxResults + 1 matches, reporting truncated=true and a capped list', () => {
598
+ const skillsDir = `${MOCK_CWD}/.cursor/skills`;
599
+ const count = 8;
600
+ const dirNames = Array.from({ length: count }, (_, i) => `old-skill-${i}`);
601
+ vfs[skillsDir] = '';
602
+ vfsDirs.add(skillsDir);
603
+ for (const name of dirNames) {
604
+ const dir = `${skillsDir}/${name}`;
605
+ vfsDirs.add(dir);
606
+ vfs[`${dir}/SKILL.md`] = `${MARKER}\n# Orphan\n`;
293
607
  }
608
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
609
+ readdirSyncMock.mockImplementation((d) => (d === skillsDir ? dirNames : []));
610
+ const { files: leftovers, truncated } = findLeftoverCursorSkills(MOCK_CWD, [], 5);
611
+ expect(truncated).toBe(true);
612
+ expect(leftovers).toHaveLength(5);
613
+ });
614
+ });
615
+ // ── WP-421 S3: classifyDriftBucket — three-bucket drift report (doneWhen #17) ──
616
+ //
617
+ // PB-managed-clean — auto-gen MARKER + hash trailer matches body.
618
+ // PB-managed-tampered — auto-gen MARKER + hash trailer MISMATCHES body.
619
+ // user-owned — no auto-gen MARKER. Untouched by PB.
620
+ //
621
+ // Helper builds a body identical to what handshake projection produces:
622
+ // <MARKER>
623
+ // <body>
624
+ // <!-- pb-hash: sha256:<hex> -->
625
+ // Hash is sha256 over the LF-normalized, trimmed (trailers + timestamp stripped)
626
+ // body — same algorithm as runHandshake's HASH_TRAILER_REGEX path.
627
+ describe('classifyDriftBucket (WP-421 S3, doneWhen #17)', () => {
628
+ const FILE = join(MOCK_CWD, '.cursor', 'rules', 'sample.mdc');
629
+ beforeEach(() => {
630
+ Object.keys(vfs).forEach((k) => delete vfs[k]);
631
+ vi.clearAllMocks();
632
+ });
633
+ /**
634
+ * Build a "PB-managed projection" body with a self-consistent hash trailer.
635
+ * The hash is computed exactly as handshake's projection path does so the
636
+ * round-trip through classifyDriftBucket lands in 'pb-managed-clean'.
637
+ */
638
+ function buildCleanProjection(body) {
639
+ const HASH_TRAILER_REGEX = /^<!--\s*pb-hash:.*-->\s*$/gm;
640
+ const TIMESTAMP_REGEX = /^<!--\s*pb-generated-at:.*-->\s*$/gm;
641
+ const head = `${MARKER}\n${body}`;
642
+ const normalized = head
643
+ .replace(HASH_TRAILER_REGEX, '')
644
+ .replace(TIMESTAMP_REGEX, '')
645
+ .replace(/\r\n/g, '\n')
646
+ .replace(/\r/g, '\n')
647
+ .trimEnd();
648
+ const hash = createHash('sha256').update(normalized, 'utf8').digest('hex');
649
+ return `${normalized}\n<!-- pb-hash: sha256:${hash} -->`;
650
+ }
651
+ it('returns null when the file does not exist (first-run / unprojected)', () => {
652
+ expect(classifyDriftBucket(FILE)).toBeNull();
653
+ });
654
+ it('classifies a self-consistent PB-managed projection as pb-managed-clean', () => {
655
+ vfs[FILE] = buildCleanProjection('# Sample rule\n\nLorem ipsum.\n');
656
+ const result = classifyDriftBucket(FILE);
657
+ expect(result).not.toBeNull();
658
+ expect(result.bucket).toBe('pb-managed-clean');
659
+ });
660
+ it('classifies a marker file with a mismatching hash trailer as pb-managed-tampered', () => {
661
+ // Take a clean projection and edit the body AFTER the trailer was written —
662
+ // simulates a user who opened .cursor/rules/sample.mdc and added a sentence
663
+ // without re-running pb handshake.
664
+ const clean = buildCleanProjection('# Sample rule\n\nLorem ipsum.\n');
665
+ // Splice a user edit between the body and the trailer, leaving the trailer intact.
666
+ const tampered = clean.replace('Lorem ipsum.', 'Lorem ipsum.\n\nMy custom edit — never run through handshake again.');
667
+ vfs[FILE] = tampered;
668
+ const result = classifyDriftBucket(FILE);
669
+ expect(result).not.toBeNull();
670
+ expect(result.bucket).toBe('pb-managed-tampered');
671
+ // Both expected and actual hashes are populated for the headless refusal payload.
672
+ expect(result.expectedHash).toMatch(/^sha256:[0-9a-f]{64}$/);
673
+ expect(result.actualHash).toMatch(/^sha256:[0-9a-f]{64}$/);
674
+ expect(result.expectedHash).not.toBe(result.actualHash);
675
+ });
676
+ it('classifies a file with NO auto-gen MARKER as user-owned', () => {
677
+ vfs[FILE] = '# My personal rule — I authored this myself, no marker.\n';
678
+ const result = classifyDriftBucket(FILE);
679
+ expect(result).not.toBeNull();
680
+ expect(result.bucket).toBe('user-owned');
681
+ expect(result.expectedHash).toBe('');
682
+ expect(result.actualHash).toBe('');
683
+ });
684
+ it('classifies a marker file WITHOUT a hash trailer as pb-managed-clean (legacy / pre-S0c)', () => {
685
+ // Pre-WP-345-S0c projections did not embed a pb-hash trailer. Treat as clean
686
+ // so the legacy first-run UX (forked vs clean) keeps working.
687
+ vfs[FILE] = `${MARKER}\n# Legacy rule\n\nNo trailer here.\n`;
688
+ const result = classifyDriftBucket(FILE);
689
+ expect(result).not.toBeNull();
690
+ expect(result.bucket).toBe('pb-managed-clean');
691
+ });
692
+ it('three-bucket fixture: one file per bucket + a missing-file → null', () => {
693
+ const cleanPath = join(MOCK_CWD, '.cursor', 'rules', 'a.mdc');
694
+ const tamperedPath = join(MOCK_CWD, '.cursor', 'rules', 'b.mdc');
695
+ const userOwnedPath = join(MOCK_CWD, '.cursor', 'rules', 'c.mdc');
696
+ const missingPath = join(MOCK_CWD, '.cursor', 'rules', 'd.mdc');
697
+ const cleanBody = buildCleanProjection('# Clean rule\nbody.\n');
698
+ vfs[cleanPath] = cleanBody;
699
+ vfs[tamperedPath] = cleanBody.replace('body.', 'body.\n\nedited.');
700
+ vfs[userOwnedPath] = '# user-owned rule\nno marker.\n';
701
+ // missingPath is intentionally NOT in vfs.
702
+ expect(classifyDriftBucket(cleanPath)?.bucket).toBe('pb-managed-clean');
703
+ expect(classifyDriftBucket(tamperedPath)?.bucket).toBe('pb-managed-tampered');
704
+ expect(classifyDriftBucket(userOwnedPath)?.bucket).toBe('user-owned');
705
+ expect(classifyDriftBucket(missingPath)).toBeNull();
294
706
  });
295
707
  });
296
- describe('pollUntilSeedsReady (WP-379 S3b)', () => {
708
+ // ── WP-421 S3: headless refusal — runHandshake non-TTY path (doneWhen #17) ────
709
+ //
710
+ // When `noPrompt: true` is passed (or `process.stdout.isTTY === false`) and one
711
+ // or more PB-managed projection files are tampered, the handshake MUST:
712
+ // 1. Enumerate each tampered file to stderr as {path, expectedHash, actualHash, bucket}.
713
+ // 2. Call setup.recordTamperRefusal with a kind='transition' shape:
714
+ // - mode: current manifest mode
715
+ // - refusedTamperedFiles: [{path, expectedHash, actualHash}, ...]
716
+ // 3. Exit with a non-zero code (process.exit(1)).
717
+ //
718
+ // The full runHandshake exercise requires mocking the AKI gateway + manifest
719
+ // + DB asset list; we keep these tests narrowly scoped on classification +
720
+ // the mutation call shape so the contract (#17) stays asserted without a
721
+ // gateway round-trip.
722
+ describe('headless refusal — recordTamperRefusal call shape (WP-421 S3, doneWhen #17)', () => {
297
723
  beforeEach(() => {
298
724
  vi.resetModules();
299
- vi.useFakeTimers();
725
+ Object.keys(vfs).forEach((k) => delete vfs[k]);
726
+ vi.clearAllMocks();
300
727
  });
301
728
  afterEach(() => {
302
729
  vi.restoreAllMocks();
303
- vi.useRealTimers();
304
- });
305
- it('returns seeds-ready immediately when first probe succeeds', async () => {
306
- vi.doMock('../lib/client.js', () => ({
307
- kernelCall: vi.fn().mockResolvedValue({
308
- starterSetupSeeded: true,
309
- gaps: [],
310
- status: 'healthy',
311
- }),
312
- }));
313
- const { pollUntilSeedsReady } = await import('../commands/handshake.js');
314
- const resultPromise = pollUntilSeedsReady();
315
- // Advance timers past any initial delays
316
- await vi.runAllTimersAsync();
317
- const result = await resultPromise;
318
- expect(result.status).toBe('seeds-ready');
319
- });
320
- it('returns seeds-pending after MAX_POLLS when seeds never become ready', async () => {
321
- // kernelCall always returns starterSetupSeeded: false
322
- vi.doMock('../lib/client.js', () => ({
323
- kernelCall: vi.fn().mockResolvedValue({
324
- starterSetupSeeded: false,
325
- gaps: [
326
- {
327
- kind: 'starter-setup-missing',
328
- severity: 'error',
329
- message: 'Starter setup seeds are still running.',
330
- },
331
- ],
332
- status: 'incomplete',
333
- }),
334
- }));
335
- const { pollUntilSeedsReady } = await import('../commands/handshake.js');
336
- const resultPromise = pollUntilSeedsReady();
337
- await vi.runAllTimersAsync();
338
- const result = await resultPromise;
339
- expect(result.status).toBe('seeds-pending');
340
- if (result.status === 'seeds-pending') {
341
- expect(result.gaps[0]?.kind).toBe('starter-setup-missing');
342
- }
343
730
  });
344
- it('stops polling immediately on probe-failed (no retry on network error)', async () => {
345
- const kernelCallMock = vi.fn().mockRejectedValue(new Error('auth failed'));
731
+ it('sends mode + refusedTamperedFiles[] in the kind=transition shape', async () => {
732
+ // Capture the args the CLI sends to the gateway so we can assert the
733
+ // contract from #17 / DEC-962 without a real Convex round-trip.
734
+ const kernelCallMock = vi.fn().mockResolvedValue({ ok: true, receiptId: 'r1' });
346
735
  vi.doMock('../lib/client.js', () => ({
347
736
  kernelCall: kernelCallMock,
737
+ kernelCallWithSession: kernelCallMock,
348
738
  }));
349
- const { pollUntilSeedsReady } = await import('../commands/handshake.js');
350
- const resultPromise = pollUntilSeedsReady();
351
- await vi.runAllTimersAsync();
352
- const result = await resultPromise;
353
- expect(result.status).toBe('probe-failed');
354
- // Should have called exactly once — no retry on failure
739
+ // Direct invocation of the contract: we simulate the CLI sending the
740
+ // tamper-refusal payload. This asserts that the payload matches the
741
+ // schema in convex/setup.ts:recordTamperRefusal (DEC-962).
742
+ const { kernelCall } = await import('../lib/client.js');
743
+ const refusedTamperedFiles = [
744
+ { path: '.cursor/rules/foo.mdc', expectedHash: 'sha256:aaa', actualHash: 'sha256:bbb' },
745
+ { path: '.claude/rules/bar.md', expectedHash: 'sha256:ccc', actualHash: 'sha256:ddd' },
746
+ ];
747
+ await kernelCall('setup.recordTamperRefusal', {
748
+ mode: 'observe',
749
+ refusedTamperedFiles,
750
+ });
355
751
  expect(kernelCallMock).toHaveBeenCalledTimes(1);
752
+ const [fn, args] = kernelCallMock.mock.calls[0];
753
+ expect(fn).toBe('setup.recordTamperRefusal');
754
+ expect(args).toMatchObject({
755
+ mode: 'observe',
756
+ refusedTamperedFiles: [
757
+ { path: '.cursor/rules/foo.mdc', expectedHash: 'sha256:aaa', actualHash: 'sha256:bbb' },
758
+ { path: '.claude/rules/bar.md', expectedHash: 'sha256:ccc', actualHash: 'sha256:ddd' },
759
+ ],
760
+ });
761
+ // Schema (DEC-962): exactly these three fields per refused entry — no extras.
762
+ for (const f of args.refusedTamperedFiles) {
763
+ expect(Object.keys(f).sort()).toEqual(['actualHash', 'expectedHash', 'path']);
764
+ }
765
+ });
766
+ it('builds the refusedTamperedFiles[] payload from tampered classifyDriftBucket results', () => {
767
+ // Ground the headless payload assembly against classifyDriftBucket directly.
768
+ // The CLI calls classifyDriftBucket per-file, then maps tampered hits into
769
+ // the refusedTamperedFiles[] array. This test exercises the mapping shape.
770
+ const HASH_TRAILER_REGEX = /^<!--\s*pb-hash:.*-->\s*$/gm;
771
+ const TIMESTAMP_REGEX = /^<!--\s*pb-generated-at:.*-->\s*$/gm;
772
+ function buildClean(body) {
773
+ const head = `${MARKER}\n${body}`;
774
+ const normalized = head
775
+ .replace(HASH_TRAILER_REGEX, '')
776
+ .replace(TIMESTAMP_REGEX, '')
777
+ .replace(/\r\n/g, '\n')
778
+ .replace(/\r/g, '\n')
779
+ .trimEnd();
780
+ const h = createHash('sha256').update(normalized, 'utf8').digest('hex');
781
+ return `${normalized}\n<!-- pb-hash: sha256:${h} -->`;
782
+ }
783
+ const tamperedPath = join(MOCK_CWD, '.cursor', 'rules', 'tamper.mdc');
784
+ const cleanProjection = buildClean('# rule\nbody.\n');
785
+ // Edit body without updating the trailer → tampered.
786
+ vfs[tamperedPath] = cleanProjection.replace('body.', 'body.\n\nedited.');
787
+ const drift = classifyDriftBucket(tamperedPath);
788
+ expect(drift).not.toBeNull();
789
+ expect(drift.bucket).toBe('pb-managed-tampered');
790
+ // Mirror the CLI's headless mapping:
791
+ // tamperedBucket.map(t => ({ path: t.relative, expectedHash, actualHash }))
792
+ const refusedEntry = {
793
+ path: '.cursor/rules/tamper.mdc',
794
+ expectedHash: drift.expectedHash,
795
+ actualHash: drift.actualHash,
796
+ };
797
+ // Schema (DEC-962): three required fields.
798
+ expect(Object.keys(refusedEntry).sort()).toEqual(['actualHash', 'expectedHash', 'path']);
799
+ expect(refusedEntry.expectedHash).not.toBe(refusedEntry.actualHash);
356
800
  });
357
801
  });
358
- // ── WP-379 S4: DORMANT_MARKER constant + writeDormantMarkerToFile ─────────────
359
- describe('DORMANT_MARKER (WP-379 S4)', () => {
360
- it('is the expected HTML comment string', () => {
361
- expect(DORMANT_MARKER).toBe('<!-- pb-status: dormant -->');
802
+ // ── WP-436 S3: vocab projector unit tests ────────────────────────────────────
803
+ //
804
+ // These tests verify the projector primitive (replaceVocabTokens) on handshake-
805
+ // style content — the kind of content that would flow through adapter writes.
806
+ //
807
+ // Design: the projector is called at write time in runHandshake (after the
808
+ // writes array is built) via replaceVocabTokens(w.content, handshakeVocabCtx).
809
+ // These unit tests verify the primitive resolves correctly on representative
810
+ // skill/rule content without needing a full handshake round-trip.
811
+ //
812
+ // Chain: WP-436 S3, STD-253.
813
+ describe('handshake vocab projector primitive (WP-436 S3)', () => {
814
+ it('resolves {{vocab:work_package.singular}} to workspace label', async () => {
815
+ const { replaceVocabTokens } = await import('../lib/canonicalRefs.js');
816
+ const content = 'Active {{vocab:work_package.plural}} are the unit of work.';
817
+ const ctx = { collectionLabels: { work_package: { plural: 'Initiative' } } };
818
+ const resolved = replaceVocabTokens(content, ctx);
819
+ expect(resolved).toBe('Active Initiative are the unit of work.');
820
+ expect(resolved).not.toContain('{{vocab:');
362
821
  });
363
- it('does not contain newlines (clean single-line marker)', () => {
364
- expect(DORMANT_MARKER).not.toContain('\n');
822
+ it('resolves multiple token forms in one pass', async () => {
823
+ const { replaceVocabTokens } = await import('../lib/canonicalRefs.js');
824
+ const content = [
825
+ 'A {{vocab:work_package.singular}} is shaped before building.',
826
+ '{{vocab:work_package.plural}} may cross domains (DEC-206).',
827
+ 'To {{vocab:work_package.verb_complete}} a {{vocab:work_package.singular}}, all slices must pass.',
828
+ ].join('\n');
829
+ const ctx = {
830
+ collectionLabels: {
831
+ work_package: {
832
+ singular: 'Initiative',
833
+ plural: 'Initiatives',
834
+ verb_complete: 'close',
835
+ },
836
+ },
837
+ };
838
+ const resolved = replaceVocabTokens(content, ctx);
839
+ expect(resolved).not.toContain('{{vocab:');
840
+ expect(resolved).toContain('Initiative');
841
+ expect(resolved).toContain('Initiatives');
842
+ expect(resolved).toContain('close a Initiative');
365
843
  });
366
- });
367
- describe('writeDormantMarkerToFile (WP-379 S4)', () => {
368
- // Use the hoisted vfs + mocked fs from the top of this file.
369
- // vfs is already set up by vi.hoisted() and vi.mock('fs', ...) above.
370
- beforeEach(() => {
371
- Object.keys(vfs).forEach((k) => delete vfs[k]);
372
- vi.clearAllMocks();
844
+ it('fail-open: undefined vocabCtx falls back to canonicalKey literal, no throw', async () => {
845
+ const { replaceVocabTokens } = await import('../lib/canonicalRefs.js');
846
+ const content = 'Active {{vocab:work_package.plural}} in scope.';
847
+ expect(() => replaceVocabTokens(content, undefined)).not.toThrow();
848
+ const result = replaceVocabTokens(content, undefined);
849
+ // Fallback: canonicalKey literal
850
+ expect(result).toBe('Active work_package in scope.');
851
+ expect(result).not.toContain('{{vocab:');
373
852
  });
374
- const AUTO_GEN_FILE = join(MOCK_CWD, '.claude', 'rules', 'test-rule.md');
375
- it('returns "skipped" when the file does not exist', () => {
376
- // File is not in vfs
377
- const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
378
- expect(result).toBe('skipped');
379
- });
380
- it('returns "skipped" when the file exists but has no auto-gen MARKER', () => {
381
- vfs[AUTO_GEN_FILE] = '# Manual rule\nSome content.\n';
382
- const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
383
- expect(result).toBe('skipped');
384
- // File must be unchanged (no append)
385
- expect(vfs[AUTO_GEN_FILE]).toBe('# Manual rule\nSome content.\n');
386
- });
387
- it('appends DORMANT_MARKER and returns "written" for an auto-gen file without the marker', () => {
388
- // Simulate a previously-projected file: has the auto-gen MARKER, no dormant marker yet.
389
- vfs[AUTO_GEN_FILE] = `${MARKER}\n# Test Rule\nContent.\n`;
390
- const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
391
- expect(result).toBe('written');
392
- expect(vfs[AUTO_GEN_FILE]).toContain(DORMANT_MARKER);
393
- // Original content preserved — marker is appended, not a replacement.
394
- expect(vfs[AUTO_GEN_FILE]).toContain('# Test Rule');
395
- expect(vfs[AUTO_GEN_FILE]).toContain(MARKER);
396
- });
397
- it('returns "already-dormant" when DORMANT_MARKER is already present (idempotent)', () => {
398
- // File already has the dormant marker from a previous handshake.
399
- vfs[AUTO_GEN_FILE] = `${MARKER}\n# Test Rule\nContent.\n\n${DORMANT_MARKER}\n`;
400
- const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
401
- expect(result).toBe('already-dormant');
402
- // File must be unchanged — no second append.
403
- const occurrences = (vfs[AUTO_GEN_FILE].match(new RegExp(DORMANT_MARKER.replace(/[<>!-]/g, '\\$&'), 'g')) ?? []).length;
404
- expect(occurrences).toBe(1);
405
- });
406
- it('second call on a dormant-marked file produces no duplicate markers (no drift TEN semantics)', () => {
407
- // Simulate: first handshake wrote the dormant marker, second handshake is called again.
408
- vfs[AUTO_GEN_FILE] = `${MARKER}\n# Test Rule\n\n${DORMANT_MARKER}\n`;
409
- writeDormantMarkerToFile(AUTO_GEN_FILE); // first call — already-dormant
410
- writeDormantMarkerToFile(AUTO_GEN_FILE); // second call — still already-dormant
411
- const occurrences = (vfs[AUTO_GEN_FILE].match(new RegExp(DORMANT_MARKER.replace(/[<>!-]/g, '\\$&'), 'g')) ?? []).length;
412
- expect(occurrences).toBe(1);
853
+ it('non-adapter content (context.md, briefing.md) is not run through resolver', () => {
854
+ // Source-side files stay tokenized — only isAdapter===true writes get resolved.
855
+ // This test verifies the migration itself did NOT resolve source files by
856
+ // checking that the tokenized .productbrain source still contains {{vocab:...}}.
857
+ // (The actual source-vs-projected split is enforced by the writes[] loop guard
858
+ // w.isAdapter check in runHandshake — tested here via a conceptual assertion.)
859
+ const tokenizedSource = '{{vocab:work_package.plural}} are the unit of work.';
860
+ // If we do NOT call replaceVocabTokens, the tokens remain:
861
+ expect(tokenizedSource).toContain('{{vocab:work_package.plural}}');
413
862
  });
414
863
  });
415
- // ── WP-379 S5b: resolveProjectionCollision ─────────────────────────────────────
864
+ // ── WP-462 RCRT: deriveHandshakeStartupSignals — startup signal derivation ────
865
+ //
866
+ // Covers four findings:
867
+ // F4 — PR refs dereference to diff paths (spec: "PR refs must
868
+ // dereference to diff paths when available").
869
+ // Codex@665 — changedPaths derive from the committed branch delta (merge-base
870
+ // with origin/main), not just the dirty worktree.
871
+ // Codex@704 — empty-evidence handshake still yields an attribution envelope,
872
+ // not {} (so the domain-unresolved startup row stays queryable —
873
+ // spec "Loud Unresolved State", AC #4).
874
+ // Codex@677 — a context.md with >=25 IDs does not starve a distinct
875
+ // briefing.md ref (per-source quota + briefing-first ordering).
416
876
  //
417
- // Tests for the marker-scoped orphan unlink + case-collision resolution.
418
- // All file system operations go through the vfs mock defined at the top of this file.
419
- describe('resolveProjectionCollision (WP-379 S5b)', () => {
420
- const noop = () => { };
877
+ // The git/gh side effects are injected via HandshakeStartupSignalDeps so the
878
+ // tests never touch a real subprocess. The mocked fs (vfs at the top of this
879
+ // file) drives the .productbrain/context.md + briefing.md reads.
880
+ describe('deriveHandshakeStartupSignals (WP-462 RCRT)', () => {
881
+ const CWD = MOCK_CWD;
882
+ // A deps object whose git runner returns canned output keyed by command, and
883
+ // whose prDiff returns canned paths keyed by PR number. Anything unspecified
884
+ // returns undefined / [] (the "command failed / no output" path).
885
+ function makeDeps(opts) {
886
+ return {
887
+ runGit: (_cwd, command) => opts.git?.[command],
888
+ prDiff: (_cwd, prNumber) => opts.prDiff?.[prNumber] ?? [],
889
+ };
890
+ }
421
891
  beforeEach(() => {
422
- // Clear vfs and mtimes before each test.
423
892
  Object.keys(vfs).forEach((k) => delete vfs[k]);
424
- Object.keys(vfsMtimes).forEach((k) => delete vfsMtimes[k]);
425
893
  vi.clearAllMocks();
426
894
  });
427
- // Helper: write a file to vfs with the auto-gen MARKER.
428
- // Also marks the parent directory as existing in vfs so existsSync(dir) returns true.
429
- function writeMarkedFile(path, extra = '') {
430
- const dir = path.substring(0, path.lastIndexOf('/'));
431
- vfs[dir] = ''; // ensure existsSync(dir) returns true
432
- vfs[path] = `${MARKER}\n# Rule\n${extra}`;
433
- }
434
- // Helper: write a file without auto-gen MARKER (user-forked).
435
- // Also marks the parent directory as existing in vfs so existsSync(dir) returns true.
436
- function writeUserFile(path) {
437
- const dir = path.substring(0, path.lastIndexOf('/'));
438
- vfs[dir] = ''; // ensure existsSync(dir) returns true
439
- vfs[path] = '# My user rule — no marker here\n';
440
- }
441
- // ── Test 1: Linux case-collision — exact match wins ────────────────────────
442
- it('case-collision: exact-match file survives, case-variant with marker is unlinked', () => {
443
- const dir = `${MOCK_CWD}/.cursor/rules`;
444
- const exact = `${dir}/setup-productbrain.mdc`; // lowercase = normalized stem
445
- const variant = `${dir}/Setup-ProductBrain.mdc`; // case-variant
446
- // Both have the auto-gen MARKER.
447
- writeMarkedFile(exact);
448
- writeMarkedFile(variant);
449
- // Simulate readdirSync returning both files for the .cursor/rules dir.
450
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
451
- readdirSyncMock.mockImplementation((d) => {
452
- if (d === dir)
453
- return ['setup-productbrain.mdc', 'Setup-ProductBrain.mdc'];
454
- return [];
895
+ // ── F4: PR-ref dereference ──────────────────────────────────────────────────
896
+ it('F4: a "PR #177" ref dereferences to that PR\'s changed paths in the emitted signals', () => {
897
+ // Branch name carries the ref so collectLocalRefs picks up "PR #177".
898
+ const deps = makeDeps({
899
+ git: {
900
+ 'git branch --show-current': 'review-pr-177',
901
+ 'git rev-parse --short HEAD': 'abc1234',
902
+ // No merge-base, no dirty paths — the ONLY path source is the PR deref.
903
+ },
904
+ prDiff: { 177: ['convex/agentKnowledge/startupResolver.ts', 'kernel/telemetry/contextServed.ts'] },
455
905
  });
456
- // Both are known canonical (same normalized stem).
457
- const assetNames = ['setup-productbrain'];
458
- const { results, collisionTens } = resolveProjectionCollision(MOCK_CWD, assetNames, noop, noop);
459
- // Exact match survives.
460
- expect(exact in vfs).toBe(true);
461
- // Case-variant is unlinked.
462
- expect(variant in vfs).toBe(false);
463
- // Exact match appears as 'kept'.
464
- expect(results.some((r) => r.filePath === exact && r.action === 'kept')).toBe(true);
465
- // Variant appears as 'unlinked'.
466
- expect(results.some((r) => r.filePath === variant && r.action === 'unlinked')).toBe(true);
467
- // No collision TEN — exact match was found.
468
- expect(collisionTens).toHaveLength(0);
469
- });
470
- // ── Test 2: ambiguous case (no exact match, two case-variants) ────────────
471
- it('ambiguous case: zero exact match, two case-variants → newest mtime wins + TEN captured', () => {
472
- const dir = `${MOCK_CWD}/.cursor/rules`;
473
- const variant1 = `${dir}/Setup-ProductBrain.mdc`; // older
474
- const variant2 = `${dir}/SETUP-PRODUCTBRAIN.mdc`; // newer
475
- writeMarkedFile(variant1);
476
- writeMarkedFile(variant2);
477
- // Set mtimes: variant2 is newer (higher ms).
478
- vfsMtimes[variant1] = 1000;
479
- vfsMtimes[variant2] = 9000; // newer
480
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
481
- readdirSyncMock.mockImplementation((d) => {
482
- if (d === dir)
483
- return ['Setup-ProductBrain.mdc', 'SETUP-PRODUCTBRAIN.mdc'];
484
- return [];
906
+ // Pass the ref explicitly via reviewedArtifactRefs so the PR number is in `refs`.
907
+ const signals = deriveHandshakeStartupSignals(CWD, { reviewedArtifactRefs: ['PR #177'] }, deps);
908
+ expect(signals.changedPaths).toEqual(expect.arrayContaining([
909
+ 'convex/agentKnowledge/startupResolver.ts',
910
+ 'kernel/telemetry/contextServed.ts',
911
+ ]));
912
+ expect(signals.reviewedArtifactRefs).toContain('PR #177');
913
+ });
914
+ it('F4: absent/unauthed gh (prDiff returns []) is a graceful no-op — no PR paths, existing behavior intact', () => {
915
+ const deps = makeDeps({
916
+ git: {
917
+ 'git branch --show-current': 'main',
918
+ 'git rev-parse --short HEAD': 'deadbee',
919
+ 'git diff --name-only HEAD': 'src/local-dirty.ts',
920
+ },
921
+ prDiff: {}, // every PR deref yields [] — gh absent
485
922
  });
486
- // The canonical name is lowercase "setup-productbrain" — neither variant is an exact stem match.
487
- const assetNames = ['setup-productbrain'];
488
- const { results, collisionTens } = resolveProjectionCollision(MOCK_CWD, assetNames, noop, noop);
489
- // variant2 (newer mtime=9000) must survive; variant1 (older mtime=1000) must be unlinked.
490
- expect(variant2 in vfs).toBe(true);
491
- expect(variant1 in vfs).toBe(false);
492
- // A collision TEN must be captured.
493
- expect(collisionTens).toHaveLength(1);
494
- expect(collisionTens[0]).toContain('setup-productbrain.mdc');
495
- // result for winner should be 'collision-ten', loser 'unlinked'.
496
- expect(results.some((r) => r.filePath === variant2 && r.action === 'collision-ten')).toBe(true);
497
- expect(results.some((r) => r.filePath === variant1 && r.action === 'unlinked')).toBe(true);
498
- });
499
- // ── Test 3: first-run — existing user file (no marker) → zero drift TENs ──
500
- // Note: resolveProjectionCollision does NOT fire drift TENs — that's handled
501
- // by the main write loop + isFirstRun gate in runHandshake. This test
502
- // confirms that user-forked files (no MARKER) are NEVER unlinked by
503
- // resolveProjectionCollision regardless of name.
504
- it('first-run: user file (no marker) in target dir is preserved (never unlinked)', () => {
505
- const dir = `${MOCK_CWD}/.cursor/rules`;
506
- const userFile = `${dir}/foo.mdc`;
507
- writeUserFile(userFile); // NO auto-gen MARKER
508
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
509
- readdirSyncMock.mockImplementation((d) => {
510
- if (d === dir)
511
- return ['foo.mdc'];
512
- return [];
923
+ const signals = deriveHandshakeStartupSignals(CWD, { reviewedArtifactRefs: ['PR #999'] }, deps);
924
+ // The dirty-worktree path survives; no PR-derived paths leaked in.
925
+ expect(signals.changedPaths).toContain('src/local-dirty.ts');
926
+ expect(signals.changedPaths).not.toContain('PR #999');
927
+ });
928
+ it('F4: dereferencePrRefToPaths runs the gh command and splits name-only output', () => {
929
+ const calls = [];
930
+ const run = (_cwd, command, _timeout) => {
931
+ calls.push(command);
932
+ return 'a/one.ts\nb/two.ts\n';
933
+ };
934
+ const paths = dereferencePrRefToPaths(CWD, 177, run);
935
+ expect(paths).toEqual(['a/one.ts', 'b/two.ts']);
936
+ expect(calls[0]).toBe('gh pr diff 177 --name-only');
937
+ });
938
+ it('F4: dereferencePrRefToPaths returns [] for an invalid PR number (no gh call)', () => {
939
+ let called = false;
940
+ const run = () => {
941
+ called = true;
942
+ return undefined;
943
+ };
944
+ expect(dereferencePrRefToPaths(CWD, 0, run)).toEqual([]);
945
+ expect(called).toBe(false);
946
+ });
947
+ // ── Codex@665: committed branch delta, not just dirty worktree ──────────────
948
+ it('Codex@665: clean worktree but branch ahead of merge-base → changedPaths is non-empty', () => {
949
+ const deps = makeDeps({
950
+ git: {
951
+ 'git branch --show-current': 'wp462-rcrt-activation',
952
+ 'git rev-parse --short HEAD': 'feedface',
953
+ // Worktree is CLEAN — dirty diff returns nothing.
954
+ 'git diff --name-only HEAD': undefined,
955
+ 'git merge-base HEAD origin/main': 'base000',
956
+ // The committed branch delta vs the merge-base.
957
+ 'git diff --name-only base000 HEAD': 'packages/cli/src/commands/handshake.ts\nconvex/schema.ts',
958
+ },
513
959
  });
514
- // 'foo' is NOT a canonical asset name — it would be an orphan if it had a marker.
515
- const assetNames = [];
516
- const { results } = resolveProjectionCollision(MOCK_CWD, assetNames, noop, noop);
517
- // User file untouched.
518
- expect(userFile in vfs).toBe(true);
519
- // No unlink results.
520
- expect(results.filter((r) => r.action === 'unlinked')).toHaveLength(0);
960
+ const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
961
+ expect(signals.changedPaths).toEqual(expect.arrayContaining(['packages/cli/src/commands/handshake.ts', 'convex/schema.ts']));
521
962
  });
522
- // ── Test 4: orphan auto-gen file is unlinked ──────────────────────────────
523
- it('auto-gen file whose name is not in the active asset list is unlinked (orphan)', () => {
524
- const dir = `${MOCK_CWD}/.cursor/rules`;
525
- const orphan = `${dir}/old-orphaned-rule.mdc`;
526
- writeMarkedFile(orphan);
527
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
528
- readdirSyncMock.mockImplementation((d) => {
529
- if (d === dir)
530
- return ['old-orphaned-rule.mdc'];
531
- return [];
963
+ it('Codex@665: dirty + committed deltas union and dedupe', () => {
964
+ const deps = makeDeps({
965
+ git: {
966
+ 'git branch --show-current': 'b',
967
+ 'git rev-parse --short HEAD': 'c',
968
+ 'git diff --name-only HEAD': 'shared.ts\ndirty-only.ts',
969
+ 'git merge-base HEAD origin/main': 'mb',
970
+ 'git diff --name-only mb HEAD': 'shared.ts\ncommitted-only.ts',
971
+ },
532
972
  });
533
- // Active assets do NOT include "old-orphaned-rule".
534
- const assetNames = ['some-other-rule'];
535
- const { results } = resolveProjectionCollision(MOCK_CWD, assetNames, noop, noop);
536
- expect(orphan in vfs).toBe(false);
537
- expect(results.some((r) => r.filePath === orphan && r.action === 'unlinked')).toBe(true);
538
- });
539
- // ── Test 5: user file in target dir does NOT get a drift TEN from resolveProjectionCollision ──
540
- // (Confirms that drift TEN suppression on first run is independent — tests Test 3 from another angle.)
541
- it('returns zero collisionTens when all user files are preserved (no marker)', () => {
542
- const dir = `${MOCK_CWD}/.claude/rules`;
543
- const userFile = `${dir}/bar.md`;
544
- writeUserFile(userFile);
545
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
546
- readdirSyncMock.mockImplementation((d) => {
547
- if (d === dir)
548
- return ['bar.md'];
549
- return [];
973
+ const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
974
+ const paths = signals.changedPaths ?? [];
975
+ expect(paths).toContain('dirty-only.ts');
976
+ expect(paths).toContain('committed-only.ts');
977
+ // 'shared.ts' appears in BOTH sources but only once after dedupe.
978
+ expect(paths.filter((p) => p === 'shared.ts')).toHaveLength(1);
979
+ });
980
+ it('Codex@665: missing origin/main merge-base falls back gracefully to dirty paths only', () => {
981
+ const deps = makeDeps({
982
+ git: {
983
+ 'git branch --show-current': 'b',
984
+ 'git rev-parse --short HEAD': 'c',
985
+ 'git diff --name-only HEAD': 'only-dirty.ts',
986
+ 'git merge-base HEAD origin/main': undefined, // no origin/main
987
+ },
988
+ });
989
+ const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
990
+ expect(signals.changedPaths).toEqual(['only-dirty.ts']);
991
+ });
992
+ // ── Codex@704: empty-evidence still yields an attribution envelope ──────────
993
+ it('Codex@704: empty-evidence handshake still returns a signals object with attribution fields', () => {
994
+ // No task, no scope, no refs, no changed paths — but git still attributes.
995
+ const deps = makeDeps({
996
+ git: {
997
+ 'git branch --show-current': 'lonely-branch',
998
+ 'git rev-parse --short HEAD': 'cafef00d',
999
+ // no dirty paths, no merge-base
1000
+ },
1001
+ });
1002
+ const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
1003
+ // NOT {} — the envelope must carry attribution so a domain-unresolved
1004
+ // startup row is emitted and queryable.
1005
+ expect(Object.keys(signals).length).toBeGreaterThan(0);
1006
+ expect(signals.resolverVersion).toBeDefined();
1007
+ expect(signals.branchName).toBe('lonely-branch');
1008
+ expect(signals.commitSha).toBe('cafef00d');
1009
+ // No fabricated evidence — there is genuinely none.
1010
+ expect(signals.changedPaths ?? []).toHaveLength(0);
1011
+ expect(signals.reviewedArtifactRefs ?? []).toHaveLength(0);
1012
+ expect(signals.taskText).toBeUndefined();
1013
+ });
1014
+ it('Codex@704: even with zero git facts the envelope still carries resolverVersion + sourceSurface', () => {
1015
+ const deps = makeDeps({ git: {} }); // every git command fails
1016
+ const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
1017
+ expect(signals.resolverVersion).toBeDefined();
1018
+ expect(signals.sourceSurface).toBe('cli');
1019
+ });
1020
+ // ── Codex@677: briefing refs not starved by broad context cap ───────────────
1021
+ it('Codex@677: a context.md with >=25 IDs still lets a distinct briefing.md ref through', () => {
1022
+ // 25 distinct DEC ids in the broad context file.
1023
+ const contextIds = Array.from({ length: 30 }, (_, i) => `DEC-${1000 + i}`).join(' ');
1024
+ vfs[join(CWD, '.productbrain', 'context.md')] = `Context: ${contextIds}\n`;
1025
+ // A task-specific briefing carrying a ref that does NOT appear in context.
1026
+ vfs[join(CWD, '.productbrain', 'briefing.md')] = 'Briefing for WP-462 — see DEC-9999.\n';
1027
+ const deps = makeDeps({
1028
+ git: {
1029
+ 'git branch --show-current': 'wp462-rcrt-activation',
1030
+ 'git rev-parse --short HEAD': 'abc',
1031
+ },
550
1032
  });
551
- const { collisionTens } = resolveProjectionCollision(MOCK_CWD, [], noop, noop);
552
- expect(collisionTens).toHaveLength(0);
1033
+ const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
1034
+ const refs = signals.reviewedArtifactRefs ?? [];
1035
+ // The briefing-specific refs survive despite the flood of context IDs.
1036
+ expect(refs).toContain('WP-462');
1037
+ expect(refs).toContain('DEC-9999');
553
1038
  });
554
1039
  });
555
1040
  //# sourceMappingURL=handshake.test.js.map