@productbrain/cli 0.1.0-beta.94 → 0.1.0-beta.9413

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 (1510) hide show
  1. package/README.md +11 -2
  2. package/dist/__tests__/adapters.test.js +76 -23
  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 +66 -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 +1337 -181
  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 +47 -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 +85 -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.d.ts +1 -1
  49. package/dist/__tests__/config.test.js +937 -18
  50. package/dist/__tests__/config.test.js.map +1 -1
  51. package/dist/__tests__/constants.test.js +6 -1
  52. package/dist/__tests__/constants.test.js.map +1 -1
  53. package/dist/__tests__/constellation.test.js +26 -14
  54. package/dist/__tests__/constellation.test.js.map +1 -1
  55. package/dist/__tests__/conversation.test.d.ts +2 -0
  56. package/dist/__tests__/conversation.test.d.ts.map +1 -0
  57. package/dist/__tests__/conversation.test.js +113 -0
  58. package/dist/__tests__/conversation.test.js.map +1 -0
  59. package/dist/__tests__/entry-formatter.test.d.ts +2 -0
  60. package/dist/__tests__/entry-formatter.test.d.ts.map +1 -0
  61. package/dist/__tests__/entry-formatter.test.js +135 -0
  62. package/dist/__tests__/entry-formatter.test.js.map +1 -0
  63. package/dist/__tests__/entry-preflight.test.d.ts +2 -0
  64. package/dist/__tests__/entry-preflight.test.d.ts.map +1 -0
  65. package/dist/__tests__/entry-preflight.test.js +58 -0
  66. package/dist/__tests__/entry-preflight.test.js.map +1 -0
  67. package/dist/__tests__/entryAccept-batch.test.d.ts +2 -0
  68. package/dist/__tests__/entryAccept-batch.test.d.ts.map +1 -0
  69. package/dist/__tests__/entryAccept-batch.test.js +305 -0
  70. package/dist/__tests__/entryAccept-batch.test.js.map +1 -0
  71. package/dist/__tests__/entryAccept.test.d.ts +2 -0
  72. package/dist/__tests__/entryAccept.test.d.ts.map +1 -0
  73. package/dist/__tests__/entryAccept.test.js +506 -0
  74. package/dist/__tests__/entryAccept.test.js.map +1 -0
  75. package/dist/__tests__/entryDiscardResolve.test.d.ts +2 -0
  76. package/dist/__tests__/entryDiscardResolve.test.d.ts.map +1 -0
  77. package/dist/__tests__/entryDiscardResolve.test.js +28 -0
  78. package/dist/__tests__/entryDiscardResolve.test.js.map +1 -0
  79. package/dist/__tests__/entryOwn.test.d.ts +2 -0
  80. package/dist/__tests__/entryOwn.test.d.ts.map +1 -0
  81. package/dist/__tests__/entryOwn.test.js +50 -0
  82. package/dist/__tests__/entryOwn.test.js.map +1 -0
  83. package/dist/__tests__/entryTick.test.d.ts +2 -0
  84. package/dist/__tests__/entryTick.test.d.ts.map +1 -0
  85. package/dist/__tests__/entryTick.test.js +40 -0
  86. package/dist/__tests__/entryTick.test.js.map +1 -0
  87. package/dist/__tests__/envelope-contract.test.js +31 -3
  88. package/dist/__tests__/envelope-contract.test.js.map +1 -1
  89. package/dist/__tests__/errors.test.js +42 -0
  90. package/dist/__tests__/errors.test.js.map +1 -1
  91. package/dist/__tests__/fields.test.js +14 -3
  92. package/dist/__tests__/fields.test.js.map +1 -1
  93. package/dist/__tests__/gateway-dry-run-timeout.test.d.ts +2 -0
  94. package/dist/__tests__/gateway-dry-run-timeout.test.d.ts.map +1 -0
  95. package/dist/__tests__/gateway-dry-run-timeout.test.js +70 -0
  96. package/dist/__tests__/gateway-dry-run-timeout.test.js.map +1 -0
  97. package/dist/__tests__/gateway-timeout-body-phase.test.d.ts +2 -0
  98. package/dist/__tests__/gateway-timeout-body-phase.test.d.ts.map +1 -0
  99. package/dist/__tests__/gateway-timeout-body-phase.test.js +121 -0
  100. package/dist/__tests__/gateway-timeout-body-phase.test.js.map +1 -0
  101. package/dist/__tests__/handshake-augment.test.d.ts +2 -0
  102. package/dist/__tests__/handshake-augment.test.d.ts.map +1 -0
  103. package/dist/__tests__/handshake-augment.test.js +407 -0
  104. package/dist/__tests__/handshake-augment.test.js.map +1 -0
  105. package/dist/__tests__/handshake-dormancy.test.d.ts +2 -0
  106. package/dist/__tests__/handshake-dormancy.test.d.ts.map +1 -0
  107. package/dist/__tests__/handshake-dormancy.test.js +24 -0
  108. package/dist/__tests__/handshake-dormancy.test.js.map +1 -0
  109. package/dist/__tests__/handshake-formatter.test.d.ts +2 -0
  110. package/dist/__tests__/handshake-formatter.test.d.ts.map +1 -0
  111. package/dist/__tests__/handshake-formatter.test.js +111 -0
  112. package/dist/__tests__/handshake-formatter.test.js.map +1 -0
  113. package/dist/__tests__/handshake-preview.test.js +360 -16
  114. package/dist/__tests__/handshake-preview.test.js.map +1 -1
  115. package/dist/__tests__/handshake-session-threading.test.d.ts +2 -0
  116. package/dist/__tests__/handshake-session-threading.test.d.ts.map +1 -0
  117. package/dist/__tests__/handshake-session-threading.test.js +185 -0
  118. package/dist/__tests__/handshake-session-threading.test.js.map +1 -0
  119. package/dist/__tests__/handshake.e2e.test.d.ts +2 -0
  120. package/dist/__tests__/handshake.e2e.test.d.ts.map +1 -0
  121. package/dist/__tests__/handshake.e2e.test.js +226 -0
  122. package/dist/__tests__/handshake.e2e.test.js.map +1 -0
  123. package/dist/__tests__/handshake.test.js +828 -4
  124. package/dist/__tests__/handshake.test.js.map +1 -1
  125. package/dist/__tests__/health-gap-kinds-drift.test.d.ts +2 -0
  126. package/dist/__tests__/health-gap-kinds-drift.test.d.ts.map +1 -0
  127. package/dist/__tests__/health-gap-kinds-drift.test.js +43 -0
  128. package/dist/__tests__/health-gap-kinds-drift.test.js.map +1 -0
  129. package/dist/__tests__/hook-intents.test.js +2 -2
  130. package/dist/__tests__/hook-intents.test.js.map +1 -1
  131. package/dist/__tests__/ingest.test.js +9 -0
  132. package/dist/__tests__/ingest.test.js.map +1 -1
  133. package/dist/__tests__/init.test.js +51 -14
  134. package/dist/__tests__/init.test.js.map +1 -1
  135. package/dist/__tests__/kernel-value-sets-drift.test.d.ts +2 -0
  136. package/dist/__tests__/kernel-value-sets-drift.test.d.ts.map +1 -0
  137. package/dist/__tests__/kernel-value-sets-drift.test.js +46 -0
  138. package/dist/__tests__/kernel-value-sets-drift.test.js.map +1 -0
  139. package/dist/__tests__/kernel-value-sets-generator.test.d.ts +2 -0
  140. package/dist/__tests__/kernel-value-sets-generator.test.d.ts.map +1 -0
  141. package/dist/__tests__/kernel-value-sets-generator.test.js +108 -0
  142. package/dist/__tests__/kernel-value-sets-generator.test.js.map +1 -0
  143. package/dist/__tests__/login.test.js +18 -1
  144. package/dist/__tests__/login.test.js.map +1 -1
  145. package/dist/__tests__/manifest.test.js +118 -1
  146. package/dist/__tests__/manifest.test.js.map +1 -1
  147. package/dist/__tests__/method-registry.integration.test.js +2 -3
  148. package/dist/__tests__/method-registry.integration.test.js.map +1 -1
  149. package/dist/__tests__/method-registry.test.d.ts +6 -8
  150. package/dist/__tests__/method-registry.test.d.ts.map +1 -1
  151. package/dist/__tests__/method-registry.test.js +22 -70
  152. package/dist/__tests__/method-registry.test.js.map +1 -1
  153. package/dist/__tests__/missingPin.test.d.ts +11 -0
  154. package/dist/__tests__/missingPin.test.d.ts.map +1 -0
  155. package/dist/__tests__/missingPin.test.js +232 -0
  156. package/dist/__tests__/missingPin.test.js.map +1 -0
  157. package/dist/__tests__/notice-marker.test.d.ts +2 -0
  158. package/dist/__tests__/notice-marker.test.d.ts.map +1 -0
  159. package/dist/__tests__/notice-marker.test.js +176 -0
  160. package/dist/__tests__/notice-marker.test.js.map +1 -0
  161. package/dist/__tests__/onboarding-path-b.test.js +4 -4
  162. package/dist/__tests__/onboarding-path-b.test.js.map +1 -1
  163. package/dist/__tests__/onboarding.test.js +29 -5
  164. package/dist/__tests__/onboarding.test.js.map +1 -1
  165. package/dist/__tests__/onboardingFallback.test.d.ts +2 -0
  166. package/dist/__tests__/onboardingFallback.test.d.ts.map +1 -0
  167. package/dist/__tests__/onboardingFallback.test.js +74 -0
  168. package/dist/__tests__/onboardingFallback.test.js.map +1 -0
  169. package/dist/__tests__/orient.test.js +539 -20
  170. package/dist/__tests__/orient.test.js.map +1 -1
  171. package/dist/__tests__/perimeter.test.d.ts +2 -0
  172. package/dist/__tests__/perimeter.test.d.ts.map +1 -0
  173. package/dist/__tests__/perimeter.test.js +165 -0
  174. package/dist/__tests__/perimeter.test.js.map +1 -0
  175. package/dist/__tests__/personal-layer.test.d.ts +1 -2
  176. package/dist/__tests__/personal-layer.test.d.ts.map +1 -1
  177. package/dist/__tests__/personal-layer.test.js +12 -48
  178. package/dist/__tests__/personal-layer.test.js.map +1 -1
  179. package/dist/__tests__/preview-key-refresh.test.d.ts +2 -0
  180. package/dist/__tests__/preview-key-refresh.test.d.ts.map +1 -0
  181. package/dist/__tests__/preview-key-refresh.test.js +126 -0
  182. package/dist/__tests__/preview-key-refresh.test.js.map +1 -0
  183. package/dist/__tests__/profiles.test.js +644 -6
  184. package/dist/__tests__/profiles.test.js.map +1 -1
  185. package/dist/__tests__/prompts.test.js +18 -1
  186. package/dist/__tests__/prompts.test.js.map +1 -1
  187. package/dist/__tests__/proof-run.test.d.ts +2 -0
  188. package/dist/__tests__/proof-run.test.d.ts.map +1 -0
  189. package/dist/__tests__/proof-run.test.js +255 -0
  190. package/dist/__tests__/proof-run.test.js.map +1 -0
  191. package/dist/__tests__/rate-limit-resilience.test.d.ts +7 -0
  192. package/dist/__tests__/rate-limit-resilience.test.d.ts.map +1 -0
  193. package/dist/__tests__/rate-limit-resilience.test.js +209 -0
  194. package/dist/__tests__/rate-limit-resilience.test.js.map +1 -0
  195. package/dist/__tests__/read-target-notice.test.d.ts +2 -0
  196. package/dist/__tests__/read-target-notice.test.d.ts.map +1 -0
  197. package/dist/__tests__/read-target-notice.test.js +129 -0
  198. package/dist/__tests__/read-target-notice.test.js.map +1 -0
  199. package/dist/__tests__/relate.test.js +246 -14
  200. package/dist/__tests__/relate.test.js.map +1 -1
  201. package/dist/__tests__/reply-commands-registered.test.d.ts +2 -0
  202. package/dist/__tests__/reply-commands-registered.test.d.ts.map +1 -0
  203. package/dist/__tests__/reply-commands-registered.test.js +81 -0
  204. package/dist/__tests__/reply-commands-registered.test.js.map +1 -0
  205. package/dist/__tests__/repo-detect.test.js +18 -38
  206. package/dist/__tests__/repo-detect.test.js.map +1 -1
  207. package/dist/__tests__/reportedProfile.test.d.ts +2 -0
  208. package/dist/__tests__/reportedProfile.test.d.ts.map +1 -0
  209. package/dist/__tests__/reportedProfile.test.js +328 -0
  210. package/dist/__tests__/reportedProfile.test.js.map +1 -0
  211. package/dist/__tests__/restore.test.d.ts +2 -0
  212. package/dist/__tests__/restore.test.d.ts.map +1 -0
  213. package/dist/__tests__/restore.test.js +85 -0
  214. package/dist/__tests__/restore.test.js.map +1 -0
  215. package/dist/__tests__/route-latency-budget.test.d.ts +2 -0
  216. package/dist/__tests__/route-latency-budget.test.d.ts.map +1 -0
  217. package/dist/__tests__/route-latency-budget.test.js +106 -0
  218. package/dist/__tests__/route-latency-budget.test.js.map +1 -0
  219. package/dist/__tests__/runner.test.js +59 -44
  220. package/dist/__tests__/runner.test.js.map +1 -1
  221. package/dist/__tests__/session-binding-refusal-tenant.test.d.ts +2 -0
  222. package/dist/__tests__/session-binding-refusal-tenant.test.d.ts.map +1 -0
  223. package/dist/__tests__/session-binding-refusal-tenant.test.js +112 -0
  224. package/dist/__tests__/session-binding-refusal-tenant.test.js.map +1 -0
  225. package/dist/__tests__/session-close-loop.test.d.ts +2 -0
  226. package/dist/__tests__/session-close-loop.test.d.ts.map +1 -0
  227. package/dist/__tests__/session-close-loop.test.js +213 -0
  228. package/dist/__tests__/session-close-loop.test.js.map +1 -0
  229. package/dist/__tests__/session-label.test.d.ts +2 -0
  230. package/dist/__tests__/session-label.test.d.ts.map +1 -0
  231. package/dist/__tests__/session-label.test.js +46 -0
  232. package/dist/__tests__/session-label.test.js.map +1 -0
  233. package/dist/__tests__/session-list-show.test.d.ts +2 -0
  234. package/dist/__tests__/session-list-show.test.d.ts.map +1 -0
  235. package/dist/__tests__/session-list-show.test.js +173 -0
  236. package/dist/__tests__/session-list-show.test.js.map +1 -0
  237. package/dist/__tests__/session-pinned-role.test.d.ts +2 -0
  238. package/dist/__tests__/session-pinned-role.test.d.ts.map +1 -0
  239. package/dist/__tests__/session-pinned-role.test.js +272 -0
  240. package/dist/__tests__/session-pinned-role.test.js.map +1 -0
  241. package/dist/__tests__/session-reset.test.d.ts +2 -0
  242. package/dist/__tests__/session-reset.test.d.ts.map +1 -0
  243. package/dist/__tests__/session-reset.test.js +138 -0
  244. package/dist/__tests__/session-reset.test.js.map +1 -0
  245. package/dist/__tests__/session-resume-backstop.test.d.ts +2 -0
  246. package/dist/__tests__/session-resume-backstop.test.d.ts.map +1 -0
  247. package/dist/__tests__/session-resume-backstop.test.js +139 -0
  248. package/dist/__tests__/session-resume-backstop.test.js.map +1 -0
  249. package/dist/__tests__/session-role-name-sanitize.test.d.ts +2 -0
  250. package/dist/__tests__/session-role-name-sanitize.test.d.ts.map +1 -0
  251. package/dist/__tests__/session-role-name-sanitize.test.js +127 -0
  252. package/dist/__tests__/session-role-name-sanitize.test.js.map +1 -0
  253. package/dist/__tests__/session-start-key-refresh.test.d.ts +2 -0
  254. package/dist/__tests__/session-start-key-refresh.test.d.ts.map +1 -0
  255. package/dist/__tests__/session-start-key-refresh.test.js +197 -0
  256. package/dist/__tests__/session-start-key-refresh.test.js.map +1 -0
  257. package/dist/__tests__/session-state-machine.test.js +235 -10
  258. package/dist/__tests__/session-state-machine.test.js.map +1 -1
  259. package/dist/__tests__/session-switch.test.d.ts +2 -0
  260. package/dist/__tests__/session-switch.test.d.ts.map +1 -0
  261. package/dist/__tests__/session-switch.test.js +343 -0
  262. package/dist/__tests__/session-switch.test.js.map +1 -0
  263. package/dist/__tests__/session-touch.test.js +6 -1
  264. package/dist/__tests__/session-touch.test.js.map +1 -1
  265. package/dist/__tests__/sessionBinding.test.d.ts +2 -0
  266. package/dist/__tests__/sessionBinding.test.d.ts.map +1 -0
  267. package/dist/__tests__/sessionBinding.test.js +118 -0
  268. package/dist/__tests__/sessionBinding.test.js.map +1 -0
  269. package/dist/__tests__/sessionByIdLookup.test.d.ts +2 -0
  270. package/dist/__tests__/sessionByIdLookup.test.d.ts.map +1 -0
  271. package/dist/__tests__/sessionByIdLookup.test.js +63 -0
  272. package/dist/__tests__/sessionByIdLookup.test.js.map +1 -0
  273. package/dist/__tests__/skill-vocabulary.test.d.ts +21 -0
  274. package/dist/__tests__/skill-vocabulary.test.d.ts.map +1 -0
  275. package/dist/__tests__/skill-vocabulary.test.js +192 -0
  276. package/dist/__tests__/skill-vocabulary.test.js.map +1 -0
  277. package/dist/__tests__/state.test.js +21 -1
  278. package/dist/__tests__/state.test.js.map +1 -1
  279. package/dist/__tests__/stillTrue.test.d.ts +2 -0
  280. package/dist/__tests__/stillTrue.test.d.ts.map +1 -0
  281. package/dist/__tests__/stillTrue.test.js +52 -0
  282. package/dist/__tests__/stillTrue.test.js.map +1 -0
  283. package/dist/__tests__/strip.test.js +57 -3
  284. package/dist/__tests__/strip.test.js.map +1 -1
  285. package/dist/__tests__/tenant-notice-write-path.test.d.ts +2 -0
  286. package/dist/__tests__/tenant-notice-write-path.test.d.ts.map +1 -0
  287. package/dist/__tests__/tenant-notice-write-path.test.js +169 -0
  288. package/dist/__tests__/tenant-notice-write-path.test.js.map +1 -0
  289. package/dist/__tests__/update-check.test.d.ts +2 -0
  290. package/dist/__tests__/update-check.test.d.ts.map +1 -0
  291. package/dist/__tests__/update-check.test.js +215 -0
  292. package/dist/__tests__/update-check.test.js.map +1 -0
  293. package/dist/__tests__/update.test.js +458 -8
  294. package/dist/__tests__/update.test.js.map +1 -1
  295. package/dist/__tests__/upgrade-runner.test.d.ts +2 -0
  296. package/dist/__tests__/upgrade-runner.test.d.ts.map +1 -0
  297. package/dist/__tests__/upgrade-runner.test.js +54 -0
  298. package/dist/__tests__/upgrade-runner.test.js.map +1 -0
  299. package/dist/__tests__/upgrade.test.d.ts +2 -0
  300. package/dist/__tests__/upgrade.test.d.ts.map +1 -0
  301. package/dist/__tests__/upgrade.test.js +56 -0
  302. package/dist/__tests__/upgrade.test.js.map +1 -0
  303. package/dist/__tests__/verify-formatter.test.d.ts +2 -0
  304. package/dist/__tests__/verify-formatter.test.d.ts.map +1 -0
  305. package/dist/__tests__/verify-formatter.test.js +85 -0
  306. package/dist/__tests__/verify-formatter.test.js.map +1 -0
  307. package/dist/__tests__/vocabulary-leak.test.d.ts +33 -0
  308. package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -0
  309. package/dist/__tests__/vocabulary-leak.test.js +428 -0
  310. package/dist/__tests__/vocabulary-leak.test.js.map +1 -0
  311. package/dist/__tests__/workspace.test.js +28 -69
  312. package/dist/__tests__/workspace.test.js.map +1 -1
  313. package/dist/__tests__/workspaceNotice.test.d.ts +2 -0
  314. package/dist/__tests__/workspaceNotice.test.d.ts.map +1 -0
  315. package/dist/__tests__/workspaceNotice.test.js +571 -0
  316. package/dist/__tests__/workspaceNotice.test.js.map +1 -0
  317. package/dist/commands/__tests__/connect-handoff.test.d.ts +11 -0
  318. package/dist/commands/__tests__/connect-handoff.test.d.ts.map +1 -0
  319. package/dist/commands/__tests__/connect-handoff.test.js +111 -0
  320. package/dist/commands/__tests__/connect-handoff.test.js.map +1 -0
  321. package/dist/commands/__tests__/quality.test.d.ts +2 -0
  322. package/dist/commands/__tests__/quality.test.d.ts.map +1 -0
  323. package/dist/commands/__tests__/quality.test.js +156 -0
  324. package/dist/commands/__tests__/quality.test.js.map +1 -0
  325. package/dist/commands/__tests__/rework.test.d.ts +2 -0
  326. package/dist/commands/__tests__/rework.test.d.ts.map +1 -0
  327. package/dist/commands/__tests__/rework.test.js +149 -0
  328. package/dist/commands/__tests__/rework.test.js.map +1 -0
  329. package/dist/commands/__tests__/tensionsList.test.d.ts +2 -0
  330. package/dist/commands/__tests__/tensionsList.test.d.ts.map +1 -0
  331. package/dist/commands/__tests__/tensionsList.test.js +63 -0
  332. package/dist/commands/__tests__/tensionsList.test.js.map +1 -0
  333. package/dist/commands/accept-policy.d.ts +10 -0
  334. package/dist/commands/accept-policy.d.ts.map +1 -0
  335. package/dist/commands/accept-policy.js +107 -0
  336. package/dist/commands/accept-policy.js.map +1 -0
  337. package/dist/commands/admin/cockpit.d.ts +2 -13
  338. package/dist/commands/admin/cockpit.d.ts.map +1 -1
  339. package/dist/commands/admin/cockpit.js +5 -5
  340. package/dist/commands/admin/cockpit.js.map +1 -1
  341. package/dist/commands/admin/index.d.ts +49 -0
  342. package/dist/commands/admin/index.d.ts.map +1 -1
  343. package/dist/commands/admin/index.js +148 -29
  344. package/dist/commands/admin/index.js.map +1 -1
  345. package/dist/commands/admin/index.test.d.ts +2 -0
  346. package/dist/commands/admin/index.test.d.ts.map +1 -0
  347. package/dist/commands/admin/index.test.js +94 -0
  348. package/dist/commands/admin/index.test.js.map +1 -0
  349. package/dist/commands/admin/inspect.js +1 -1
  350. package/dist/commands/admin/inspect.js.map +1 -1
  351. package/dist/commands/admin/probe.d.ts +75 -0
  352. package/dist/commands/admin/probe.d.ts.map +1 -0
  353. package/dist/commands/admin/probe.js +224 -0
  354. package/dist/commands/admin/probe.js.map +1 -0
  355. package/dist/commands/admin/probe.test.d.ts +2 -0
  356. package/dist/commands/admin/probe.test.d.ts.map +1 -0
  357. package/dist/commands/admin/probe.test.js +193 -0
  358. package/dist/commands/admin/probe.test.js.map +1 -0
  359. package/dist/commands/admin/run.d.ts +43 -0
  360. package/dist/commands/admin/run.d.ts.map +1 -0
  361. package/dist/commands/admin/run.js +78 -0
  362. package/dist/commands/admin/run.js.map +1 -0
  363. package/dist/commands/admin/run.test.d.ts +18 -0
  364. package/dist/commands/admin/run.test.d.ts.map +1 -0
  365. package/dist/commands/admin/run.test.js +168 -0
  366. package/dist/commands/admin/run.test.js.map +1 -0
  367. package/dist/commands/admin/seed.d.ts +32 -3
  368. package/dist/commands/admin/seed.d.ts.map +1 -1
  369. package/dist/commands/admin/seed.js +303 -124
  370. package/dist/commands/admin/seed.js.map +1 -1
  371. package/dist/commands/admin/seed.test.d.ts +4 -0
  372. package/dist/commands/admin/seed.test.d.ts.map +1 -1
  373. package/dist/commands/admin/seed.test.js +27 -12
  374. package/dist/commands/admin/seed.test.js.map +1 -1
  375. package/dist/commands/admin/seedRegistryEntries.generated.d.ts +14 -0
  376. package/dist/commands/admin/seedRegistryEntries.generated.d.ts.map +1 -0
  377. package/dist/commands/admin/seedRegistryEntries.generated.js +36 -0
  378. package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -0
  379. package/dist/commands/admin/seedRegistryEntries.test.d.ts +13 -0
  380. package/dist/commands/admin/seedRegistryEntries.test.d.ts.map +1 -0
  381. package/dist/commands/admin/seedRegistryEntries.test.js +101 -0
  382. package/dist/commands/admin/seedRegistryEntries.test.js.map +1 -0
  383. package/dist/commands/admin/seedRowType.d.ts +22 -0
  384. package/dist/commands/admin/seedRowType.d.ts.map +1 -0
  385. package/dist/commands/admin/seedRowType.js +2 -0
  386. package/dist/commands/admin/seedRowType.js.map +1 -0
  387. package/dist/commands/admin/seedStatusColor.d.ts +9 -0
  388. package/dist/commands/admin/seedStatusColor.d.ts.map +1 -0
  389. package/dist/commands/admin/seedStatusColor.js +19 -0
  390. package/dist/commands/admin/seedStatusColor.js.map +1 -0
  391. package/dist/commands/admin/seedStatusColor.test.d.ts +2 -0
  392. package/dist/commands/admin/seedStatusColor.test.d.ts.map +1 -0
  393. package/dist/commands/admin/seedStatusColor.test.js +31 -0
  394. package/dist/commands/admin/seedStatusColor.test.js.map +1 -0
  395. package/dist/commands/brief.d.ts.map +1 -1
  396. package/dist/commands/brief.js +24 -2
  397. package/dist/commands/brief.js.map +1 -1
  398. package/dist/commands/capture.d.ts +15 -9
  399. package/dist/commands/capture.d.ts.map +1 -1
  400. package/dist/commands/capture.js +173 -228
  401. package/dist/commands/capture.js.map +1 -1
  402. package/dist/commands/chain-walk.d.ts.map +1 -1
  403. package/dist/commands/chain-walk.js.map +1 -1
  404. package/dist/commands/changes.d.ts.map +1 -1
  405. package/dist/commands/changes.js.map +1 -1
  406. package/dist/commands/codex-prep.d.ts +12 -1
  407. package/dist/commands/codex-prep.d.ts.map +1 -1
  408. package/dist/commands/codex-prep.js +18 -84
  409. package/dist/commands/codex-prep.js.map +1 -1
  410. package/dist/commands/collections.d.ts +1 -1
  411. package/dist/commands/collections.d.ts.map +1 -1
  412. package/dist/commands/collections.js +1 -1
  413. package/dist/commands/collections.js.map +1 -1
  414. package/dist/commands/conflicts.d.ts +35 -0
  415. package/dist/commands/conflicts.d.ts.map +1 -0
  416. package/dist/commands/conflicts.js +194 -0
  417. package/dist/commands/conflicts.js.map +1 -0
  418. package/dist/commands/conflicts.test.d.ts +2 -0
  419. package/dist/commands/conflicts.test.d.ts.map +1 -0
  420. package/dist/commands/conflicts.test.js +179 -0
  421. package/dist/commands/conflicts.test.js.map +1 -0
  422. package/dist/commands/connect-config.test.d.ts +2 -0
  423. package/dist/commands/connect-config.test.d.ts.map +1 -0
  424. package/dist/commands/connect-config.test.js +52 -0
  425. package/dist/commands/connect-config.test.js.map +1 -0
  426. package/dist/commands/connect-context.d.ts +55 -0
  427. package/dist/commands/connect-context.d.ts.map +1 -0
  428. package/dist/commands/connect-context.js +78 -0
  429. package/dist/commands/connect-context.js.map +1 -0
  430. package/dist/commands/connect-context.test.d.ts +2 -0
  431. package/dist/commands/connect-context.test.d.ts.map +1 -0
  432. package/dist/commands/connect-context.test.js +148 -0
  433. package/dist/commands/connect-context.test.js.map +1 -0
  434. package/dist/commands/connect-decline.test.d.ts +2 -0
  435. package/dist/commands/connect-decline.test.d.ts.map +1 -0
  436. package/dist/commands/connect-decline.test.js +70 -0
  437. package/dist/commands/connect-decline.test.js.map +1 -0
  438. package/dist/commands/connect-handoff.d.ts +51 -0
  439. package/dist/commands/connect-handoff.d.ts.map +1 -0
  440. package/dist/commands/connect-handoff.js +70 -0
  441. package/dist/commands/connect-handoff.js.map +1 -0
  442. package/dist/commands/connect-integration.test.js +53 -19
  443. package/dist/commands/connect-integration.test.js.map +1 -1
  444. package/dist/commands/connect-legacy-migration.test.d.ts +2 -0
  445. package/dist/commands/connect-legacy-migration.test.d.ts.map +1 -0
  446. package/dist/commands/connect-legacy-migration.test.js +109 -0
  447. package/dist/commands/connect-legacy-migration.test.js.map +1 -0
  448. package/dist/commands/connect-redeem-failure.test.d.ts +2 -0
  449. package/dist/commands/connect-redeem-failure.test.d.ts.map +1 -0
  450. package/dist/commands/connect-redeem-failure.test.js +134 -0
  451. package/dist/commands/connect-redeem-failure.test.js.map +1 -0
  452. package/dist/commands/connect-screens.d.ts +17 -4
  453. package/dist/commands/connect-screens.d.ts.map +1 -1
  454. package/dist/commands/connect-screens.js +83 -19
  455. package/dist/commands/connect-screens.js.map +1 -1
  456. package/dist/commands/connect-seal.test.d.ts +2 -0
  457. package/dist/commands/connect-seal.test.d.ts.map +1 -0
  458. package/dist/commands/connect-seal.test.js +55 -0
  459. package/dist/commands/connect-seal.test.js.map +1 -0
  460. package/dist/commands/connect.d.ts +24 -6
  461. package/dist/commands/connect.d.ts.map +1 -1
  462. package/dist/commands/connect.js +284 -90
  463. package/dist/commands/connect.js.map +1 -1
  464. package/dist/commands/connect.test.js +282 -16
  465. package/dist/commands/connect.test.js.map +1 -1
  466. package/dist/commands/constellation.d.ts.map +1 -1
  467. package/dist/commands/constellation.js.map +1 -1
  468. package/dist/commands/context.d.ts.map +1 -1
  469. package/dist/commands/context.js.map +1 -1
  470. package/dist/commands/cross-cut.d.ts.map +1 -1
  471. package/dist/commands/cross-cut.js.map +1 -1
  472. package/dist/commands/digest.d.ts +17 -0
  473. package/dist/commands/digest.d.ts.map +1 -0
  474. package/dist/commands/digest.js +58 -0
  475. package/dist/commands/digest.js.map +1 -0
  476. package/dist/commands/digest.test.d.ts +2 -0
  477. package/dist/commands/digest.test.d.ts.map +1 -0
  478. package/dist/commands/digest.test.js +36 -0
  479. package/dist/commands/digest.test.js.map +1 -0
  480. package/dist/commands/direction.d.ts +10 -0
  481. package/dist/commands/direction.d.ts.map +1 -0
  482. package/dist/commands/direction.js +79 -0
  483. package/dist/commands/direction.js.map +1 -0
  484. package/dist/commands/doctor.d.ts.map +1 -1
  485. package/dist/commands/doctor.js +173 -38
  486. package/dist/commands/doctor.js.map +1 -1
  487. package/dist/commands/doctor.test.js +352 -6
  488. package/dist/commands/doctor.test.js.map +1 -1
  489. package/dist/commands/entryAccept.d.ts +24 -0
  490. package/dist/commands/entryAccept.d.ts.map +1 -0
  491. package/dist/commands/entryAccept.js +296 -0
  492. package/dist/commands/entryAccept.js.map +1 -0
  493. package/dist/commands/entryDiscardResolve.d.ts +9 -0
  494. package/dist/commands/entryDiscardResolve.d.ts.map +1 -0
  495. package/dist/commands/entryDiscardResolve.js +27 -0
  496. package/dist/commands/entryDiscardResolve.js.map +1 -0
  497. package/dist/commands/entryOwn.d.ts +5 -0
  498. package/dist/commands/entryOwn.d.ts.map +1 -0
  499. package/dist/commands/entryOwn.js +17 -0
  500. package/dist/commands/entryOwn.js.map +1 -0
  501. package/dist/commands/entryPreflight.d.ts +8 -0
  502. package/dist/commands/entryPreflight.d.ts.map +1 -0
  503. package/dist/commands/entryPreflight.js +48 -0
  504. package/dist/commands/entryPreflight.js.map +1 -0
  505. package/dist/commands/entryTick.d.ts +8 -0
  506. package/dist/commands/entryTick.d.ts.map +1 -0
  507. package/dist/commands/entryTick.js +43 -0
  508. package/dist/commands/entryTick.js.map +1 -0
  509. package/dist/commands/feedback.d.ts +36 -0
  510. package/dist/commands/feedback.d.ts.map +1 -0
  511. package/dist/commands/feedback.js +174 -0
  512. package/dist/commands/feedback.js.map +1 -0
  513. package/dist/commands/feedback.test.d.ts +2 -0
  514. package/dist/commands/feedback.test.d.ts.map +1 -0
  515. package/dist/commands/feedback.test.js +109 -0
  516. package/dist/commands/feedback.test.js.map +1 -0
  517. package/dist/commands/fields.d.ts.map +1 -1
  518. package/dist/commands/fields.js +1 -1
  519. package/dist/commands/fields.js.map +1 -1
  520. package/dist/commands/files.d.ts +26 -0
  521. package/dist/commands/files.d.ts.map +1 -0
  522. package/dist/commands/files.js +160 -0
  523. package/dist/commands/files.js.map +1 -0
  524. package/dist/commands/files.test.d.ts +2 -0
  525. package/dist/commands/files.test.d.ts.map +1 -0
  526. package/dist/commands/files.test.js +278 -0
  527. package/dist/commands/files.test.js.map +1 -0
  528. package/dist/commands/handshake.d.ts +57 -9
  529. package/dist/commands/handshake.d.ts.map +1 -1
  530. package/dist/commands/handshake.js +779 -170
  531. package/dist/commands/handshake.js.map +1 -1
  532. package/dist/commands/handshakeCursorSkillCleanup.d.ts +36 -0
  533. package/dist/commands/handshakeCursorSkillCleanup.d.ts.map +1 -0
  534. package/dist/commands/handshakeCursorSkillCleanup.js +110 -0
  535. package/dist/commands/handshakeCursorSkillCleanup.js.map +1 -0
  536. package/dist/commands/handshakeDriftClassification.d.ts +33 -0
  537. package/dist/commands/handshakeDriftClassification.d.ts.map +1 -0
  538. package/dist/commands/handshakeDriftClassification.js +62 -0
  539. package/dist/commands/handshakeDriftClassification.js.map +1 -0
  540. package/dist/commands/history.d.ts +30 -0
  541. package/dist/commands/history.d.ts.map +1 -0
  542. package/dist/commands/history.js +62 -0
  543. package/dist/commands/history.js.map +1 -0
  544. package/dist/commands/history.test.d.ts +2 -0
  545. package/dist/commands/history.test.d.ts.map +1 -0
  546. package/dist/commands/history.test.js +106 -0
  547. package/dist/commands/history.test.js.map +1 -0
  548. package/dist/commands/ingest.d.ts.map +1 -1
  549. package/dist/commands/ingest.js +9 -0
  550. package/dist/commands/ingest.js.map +1 -1
  551. package/dist/commands/init.d.ts +1 -1
  552. package/dist/commands/init.d.ts.map +1 -1
  553. package/dist/commands/init.js +22 -13
  554. package/dist/commands/init.js.map +1 -1
  555. package/dist/commands/login.d.ts.map +1 -1
  556. package/dist/commands/login.js +15 -11
  557. package/dist/commands/login.js.map +1 -1
  558. package/dist/commands/organisation.d.ts +17 -0
  559. package/dist/commands/organisation.d.ts.map +1 -0
  560. package/dist/commands/organisation.js +199 -0
  561. package/dist/commands/organisation.js.map +1 -0
  562. package/dist/commands/organisation.test.d.ts +2 -0
  563. package/dist/commands/organisation.test.d.ts.map +1 -0
  564. package/dist/commands/organisation.test.js +210 -0
  565. package/dist/commands/organisation.test.js.map +1 -0
  566. package/dist/commands/organisationHierarchy.d.ts +8 -0
  567. package/dist/commands/organisationHierarchy.d.ts.map +1 -0
  568. package/dist/commands/organisationHierarchy.js +75 -0
  569. package/dist/commands/organisationHierarchy.js.map +1 -0
  570. package/dist/commands/organisationHierarchy.test.d.ts +2 -0
  571. package/dist/commands/organisationHierarchy.test.d.ts.map +1 -0
  572. package/dist/commands/organisationHierarchy.test.js +72 -0
  573. package/dist/commands/organisationHierarchy.test.js.map +1 -0
  574. package/dist/commands/organisationWrite.d.ts +18 -0
  575. package/dist/commands/organisationWrite.d.ts.map +1 -0
  576. package/dist/commands/organisationWrite.js +71 -0
  577. package/dist/commands/organisationWrite.js.map +1 -0
  578. package/dist/commands/orient.d.ts +82 -66
  579. package/dist/commands/orient.d.ts.map +1 -1
  580. package/dist/commands/orient.js +226 -18
  581. package/dist/commands/orient.js.map +1 -1
  582. package/dist/commands/outcome.d.ts +91 -0
  583. package/dist/commands/outcome.d.ts.map +1 -0
  584. package/dist/commands/outcome.js +204 -0
  585. package/dist/commands/outcome.js.map +1 -0
  586. package/dist/commands/outcome.test.d.ts +2 -0
  587. package/dist/commands/outcome.test.d.ts.map +1 -0
  588. package/dist/commands/outcome.test.js +308 -0
  589. package/dist/commands/outcome.test.js.map +1 -0
  590. package/dist/commands/profile.d.ts +33 -2
  591. package/dist/commands/profile.d.ts.map +1 -1
  592. package/dist/commands/profile.js +281 -41
  593. package/dist/commands/profile.js.map +1 -1
  594. package/dist/commands/proof-run.d.ts +51 -0
  595. package/dist/commands/proof-run.d.ts.map +1 -0
  596. package/dist/commands/proof-run.js +209 -0
  597. package/dist/commands/proof-run.js.map +1 -0
  598. package/dist/commands/quality.d.ts +16 -0
  599. package/dist/commands/quality.d.ts.map +1 -0
  600. package/dist/commands/quality.js +29 -0
  601. package/dist/commands/quality.js.map +1 -0
  602. package/dist/commands/questions.d.ts +23 -0
  603. package/dist/commands/questions.d.ts.map +1 -0
  604. package/dist/commands/questions.js +238 -0
  605. package/dist/commands/questions.js.map +1 -0
  606. package/dist/commands/questions.test.d.ts +2 -0
  607. package/dist/commands/questions.test.d.ts.map +1 -0
  608. package/dist/commands/questions.test.js +159 -0
  609. package/dist/commands/questions.test.js.map +1 -0
  610. package/dist/commands/relate.d.ts +1 -0
  611. package/dist/commands/relate.d.ts.map +1 -1
  612. package/dist/commands/relate.js +94 -7
  613. package/dist/commands/relate.js.map +1 -1
  614. package/dist/commands/restore.d.ts +2 -0
  615. package/dist/commands/restore.d.ts.map +1 -0
  616. package/dist/commands/restore.js +83 -0
  617. package/dist/commands/restore.js.map +1 -0
  618. package/dist/commands/rework.d.ts +24 -0
  619. package/dist/commands/rework.d.ts.map +1 -0
  620. package/dist/commands/rework.js +97 -0
  621. package/dist/commands/rework.js.map +1 -0
  622. package/dist/commands/role.d.ts +57 -0
  623. package/dist/commands/role.d.ts.map +1 -0
  624. package/dist/commands/role.js +141 -0
  625. package/dist/commands/role.js.map +1 -0
  626. package/dist/commands/role.test.d.ts +2 -0
  627. package/dist/commands/role.test.d.ts.map +1 -0
  628. package/dist/commands/role.test.js +211 -0
  629. package/dist/commands/role.test.js.map +1 -0
  630. package/dist/commands/scoreboard.d.ts +26 -0
  631. package/dist/commands/scoreboard.d.ts.map +1 -0
  632. package/dist/commands/scoreboard.js +40 -0
  633. package/dist/commands/scoreboard.js.map +1 -0
  634. package/dist/commands/search.d.ts +3 -0
  635. package/dist/commands/search.d.ts.map +1 -1
  636. package/dist/commands/search.js +7 -1
  637. package/dist/commands/search.js.map +1 -1
  638. package/dist/commands/session.d.ts +60 -7
  639. package/dist/commands/session.d.ts.map +1 -1
  640. package/dist/commands/session.js +417 -69
  641. package/dist/commands/session.js.map +1 -1
  642. package/dist/commands/shape.d.ts +16 -0
  643. package/dist/commands/shape.d.ts.map +1 -0
  644. package/dist/commands/shape.js +149 -0
  645. package/dist/commands/shape.js.map +1 -0
  646. package/dist/commands/shape.test.d.ts +2 -0
  647. package/dist/commands/shape.test.d.ts.map +1 -0
  648. package/dist/commands/shape.test.js +148 -0
  649. package/dist/commands/shape.test.js.map +1 -0
  650. package/dist/commands/status.d.ts +7 -0
  651. package/dist/commands/status.d.ts.map +1 -0
  652. package/dist/commands/status.js +102 -0
  653. package/dist/commands/status.js.map +1 -0
  654. package/dist/commands/status.test.d.ts +2 -0
  655. package/dist/commands/status.test.d.ts.map +1 -0
  656. package/dist/commands/status.test.js +75 -0
  657. package/dist/commands/status.test.js.map +1 -0
  658. package/dist/commands/stillTrue.d.ts +14 -0
  659. package/dist/commands/stillTrue.d.ts.map +1 -0
  660. package/dist/commands/stillTrue.js +48 -0
  661. package/dist/commands/stillTrue.js.map +1 -0
  662. package/dist/commands/tensionsList.d.ts +5 -0
  663. package/dist/commands/tensionsList.d.ts.map +1 -0
  664. package/dist/commands/tensionsList.js +27 -0
  665. package/dist/commands/tensionsList.js.map +1 -0
  666. package/dist/commands/update.d.ts +21 -0
  667. package/dist/commands/update.d.ts.map +1 -1
  668. package/dist/commands/update.js +157 -42
  669. package/dist/commands/update.js.map +1 -1
  670. package/dist/commands/upgrade.d.ts +5 -0
  671. package/dist/commands/upgrade.d.ts.map +1 -0
  672. package/dist/commands/upgrade.js +110 -0
  673. package/dist/commands/upgrade.js.map +1 -0
  674. package/dist/commands/usage.d.ts.map +1 -1
  675. package/dist/commands/usage.js +0 -18
  676. package/dist/commands/usage.js.map +1 -1
  677. package/dist/commands/verify.d.ts.map +1 -1
  678. package/dist/commands/verify.js +7 -1
  679. package/dist/commands/verify.js.map +1 -1
  680. package/dist/commands/welcome.d.ts.map +1 -1
  681. package/dist/commands/welcome.js +5 -2
  682. package/dist/commands/welcome.js.map +1 -1
  683. package/dist/commands/whoami.d.ts +20 -0
  684. package/dist/commands/whoami.d.ts.map +1 -0
  685. package/dist/commands/whoami.js +126 -0
  686. package/dist/commands/whoami.js.map +1 -0
  687. package/dist/commands/whoami.test.d.ts +2 -0
  688. package/dist/commands/whoami.test.d.ts.map +1 -0
  689. package/dist/commands/whoami.test.js +130 -0
  690. package/dist/commands/whoami.test.js.map +1 -0
  691. package/dist/commands/workspace.d.ts +19 -14
  692. package/dist/commands/workspace.d.ts.map +1 -1
  693. package/dist/commands/workspace.js +11 -48
  694. package/dist/commands/workspace.js.map +1 -1
  695. package/dist/formatters/__tests__/orient-provenance.test.d.ts +6 -0
  696. package/dist/formatters/__tests__/orient-provenance.test.d.ts.map +1 -0
  697. package/dist/formatters/__tests__/orient-provenance.test.js +320 -0
  698. package/dist/formatters/__tests__/orient-provenance.test.js.map +1 -0
  699. package/dist/formatters/__tests__/orient-ruleLists.test.d.ts +2 -0
  700. package/dist/formatters/__tests__/orient-ruleLists.test.d.ts.map +1 -0
  701. package/dist/formatters/__tests__/orient-ruleLists.test.js +93 -0
  702. package/dist/formatters/__tests__/orient-ruleLists.test.js.map +1 -0
  703. package/dist/formatters/__tests__/session-list-show.test.d.ts +2 -0
  704. package/dist/formatters/__tests__/session-list-show.test.d.ts.map +1 -0
  705. package/dist/formatters/__tests__/session-list-show.test.js +195 -0
  706. package/dist/formatters/__tests__/session-list-show.test.js.map +1 -0
  707. package/dist/formatters/__tests__/session.test.d.ts +2 -0
  708. package/dist/formatters/__tests__/session.test.d.ts.map +1 -0
  709. package/dist/formatters/__tests__/session.test.js +193 -0
  710. package/dist/formatters/__tests__/session.test.js.map +1 -0
  711. package/dist/formatters/__tests__/tensionsList.test.d.ts +2 -0
  712. package/dist/formatters/__tests__/tensionsList.test.d.ts.map +1 -0
  713. package/dist/formatters/__tests__/tensionsList.test.js +30 -0
  714. package/dist/formatters/__tests__/tensionsList.test.js.map +1 -0
  715. package/dist/formatters/brief.d.ts +6 -15
  716. package/dist/formatters/brief.d.ts.map +1 -1
  717. package/dist/formatters/brief.js +16 -14
  718. package/dist/formatters/brief.js.map +1 -1
  719. package/dist/formatters/brief.test.d.ts +2 -0
  720. package/dist/formatters/brief.test.d.ts.map +1 -0
  721. package/dist/formatters/brief.test.js +21 -0
  722. package/dist/formatters/brief.test.js.map +1 -0
  723. package/dist/formatters/capture.d.ts +17 -10
  724. package/dist/formatters/capture.d.ts.map +1 -1
  725. package/dist/formatters/capture.js +32 -10
  726. package/dist/formatters/capture.js.map +1 -1
  727. package/dist/formatters/coaching.d.ts +53 -0
  728. package/dist/formatters/coaching.d.ts.map +1 -0
  729. package/dist/formatters/coaching.js +51 -0
  730. package/dist/formatters/coaching.js.map +1 -0
  731. package/dist/formatters/collections.d.ts +0 -1
  732. package/dist/formatters/collections.d.ts.map +1 -1
  733. package/dist/formatters/collections.js +14 -5
  734. package/dist/formatters/collections.js.map +1 -1
  735. package/dist/formatters/conflicts.d.ts +69 -0
  736. package/dist/formatters/conflicts.d.ts.map +1 -0
  737. package/dist/formatters/conflicts.js +87 -0
  738. package/dist/formatters/conflicts.js.map +1 -0
  739. package/dist/formatters/conflicts.test.d.ts +2 -0
  740. package/dist/formatters/conflicts.test.d.ts.map +1 -0
  741. package/dist/formatters/conflicts.test.js +136 -0
  742. package/dist/formatters/conflicts.test.js.map +1 -0
  743. package/dist/formatters/context.d.ts +1 -1
  744. package/dist/formatters/context.d.ts.map +1 -1
  745. package/dist/formatters/context.js.map +1 -1
  746. package/dist/formatters/digest.d.ts +13 -0
  747. package/dist/formatters/digest.d.ts.map +1 -0
  748. package/dist/formatters/digest.js +98 -0
  749. package/dist/formatters/digest.js.map +1 -0
  750. package/dist/formatters/digest.test.d.ts +2 -0
  751. package/dist/formatters/digest.test.d.ts.map +1 -0
  752. package/dist/formatters/digest.test.js +166 -0
  753. package/dist/formatters/digest.test.js.map +1 -0
  754. package/dist/formatters/direction.d.ts +48 -0
  755. package/dist/formatters/direction.d.ts.map +1 -0
  756. package/dist/formatters/direction.js +75 -0
  757. package/dist/formatters/direction.js.map +1 -0
  758. package/dist/formatters/direction.test.d.ts +2 -0
  759. package/dist/formatters/direction.test.d.ts.map +1 -0
  760. package/dist/formatters/direction.test.js +70 -0
  761. package/dist/formatters/direction.test.js.map +1 -0
  762. package/dist/formatters/entry.d.ts +61 -0
  763. package/dist/formatters/entry.d.ts.map +1 -1
  764. package/dist/formatters/entry.js +100 -11
  765. package/dist/formatters/entry.js.map +1 -1
  766. package/dist/formatters/entryAccept.d.ts +77 -0
  767. package/dist/formatters/entryAccept.d.ts.map +1 -0
  768. package/dist/formatters/entryAccept.js +76 -0
  769. package/dist/formatters/entryAccept.js.map +1 -0
  770. package/dist/formatters/feedback.d.ts +56 -0
  771. package/dist/formatters/feedback.d.ts.map +1 -0
  772. package/dist/formatters/feedback.js +89 -0
  773. package/dist/formatters/feedback.js.map +1 -0
  774. package/dist/formatters/feedback.test.d.ts +2 -0
  775. package/dist/formatters/feedback.test.d.ts.map +1 -0
  776. package/dist/formatters/feedback.test.js +112 -0
  777. package/dist/formatters/feedback.test.js.map +1 -0
  778. package/dist/formatters/fields.d.ts +7 -1
  779. package/dist/formatters/fields.d.ts.map +1 -1
  780. package/dist/formatters/fields.js +9 -3
  781. package/dist/formatters/fields.js.map +1 -1
  782. package/dist/formatters/fields.test.d.ts +2 -0
  783. package/dist/formatters/fields.test.d.ts.map +1 -0
  784. package/dist/formatters/fields.test.js +42 -0
  785. package/dist/formatters/fields.test.js.map +1 -0
  786. package/dist/formatters/handshake.d.ts +43 -9
  787. package/dist/formatters/handshake.d.ts.map +1 -1
  788. package/dist/formatters/handshake.js +83 -29
  789. package/dist/formatters/handshake.js.map +1 -1
  790. package/dist/formatters/orient.coherencyCheckTag.test.d.ts +2 -0
  791. package/dist/formatters/orient.coherencyCheckTag.test.d.ts.map +1 -0
  792. package/dist/formatters/orient.coherencyCheckTag.test.js +22 -0
  793. package/dist/formatters/orient.coherencyCheckTag.test.js.map +1 -0
  794. package/dist/formatters/orient.d.ts +136 -71
  795. package/dist/formatters/orient.d.ts.map +1 -1
  796. package/dist/formatters/orient.js +203 -111
  797. package/dist/formatters/orient.js.map +1 -1
  798. package/dist/formatters/orient.rcrtMiss.test.d.ts +2 -0
  799. package/dist/formatters/orient.rcrtMiss.test.d.ts.map +1 -0
  800. package/dist/formatters/orient.rcrtMiss.test.js +78 -0
  801. package/dist/formatters/orient.rcrtMiss.test.js.map +1 -0
  802. package/dist/formatters/orient.rituals.test.d.ts +2 -0
  803. package/dist/formatters/orient.rituals.test.d.ts.map +1 -0
  804. package/dist/formatters/orient.rituals.test.js +74 -0
  805. package/dist/formatters/orient.rituals.test.js.map +1 -0
  806. package/dist/formatters/orient.shapeAdvisorySummary.test.d.ts +2 -0
  807. package/dist/formatters/orient.shapeAdvisorySummary.test.d.ts.map +1 -0
  808. package/dist/formatters/orient.shapeAdvisorySummary.test.js +60 -0
  809. package/dist/formatters/orient.shapeAdvisorySummary.test.js.map +1 -0
  810. package/dist/formatters/orientDegradation.d.ts +38 -0
  811. package/dist/formatters/orientDegradation.d.ts.map +1 -0
  812. package/dist/formatters/orientDegradation.js +50 -0
  813. package/dist/formatters/orientDegradation.js.map +1 -0
  814. package/dist/formatters/orientDegradation.test.d.ts +2 -0
  815. package/dist/formatters/orientDegradation.test.d.ts.map +1 -0
  816. package/dist/formatters/orientDegradation.test.js +28 -0
  817. package/dist/formatters/orientDegradation.test.js.map +1 -0
  818. package/dist/formatters/orientDirection.d.ts +81 -0
  819. package/dist/formatters/orientDirection.d.ts.map +1 -0
  820. package/dist/formatters/orientDirection.js +23 -0
  821. package/dist/formatters/orientDirection.js.map +1 -0
  822. package/dist/formatters/orientDirection.test.d.ts +2 -0
  823. package/dist/formatters/orientDirection.test.d.ts.map +1 -0
  824. package/dist/formatters/orientDirection.test.js +71 -0
  825. package/dist/formatters/orientDirection.test.js.map +1 -0
  826. package/dist/formatters/orientRetrievalMiss.d.ts +22 -0
  827. package/dist/formatters/orientRetrievalMiss.d.ts.map +1 -0
  828. package/dist/formatters/orientRetrievalMiss.js +17 -0
  829. package/dist/formatters/orientRetrievalMiss.js.map +1 -0
  830. package/dist/formatters/questions.d.ts +72 -0
  831. package/dist/formatters/questions.d.ts.map +1 -0
  832. package/dist/formatters/questions.js +116 -0
  833. package/dist/formatters/questions.js.map +1 -0
  834. package/dist/formatters/questions.test.d.ts +2 -0
  835. package/dist/formatters/questions.test.d.ts.map +1 -0
  836. package/dist/formatters/questions.test.js +144 -0
  837. package/dist/formatters/questions.test.js.map +1 -0
  838. package/dist/formatters/relate.d.ts +13 -2
  839. package/dist/formatters/relate.d.ts.map +1 -1
  840. package/dist/formatters/relate.js +15 -5
  841. package/dist/formatters/relate.js.map +1 -1
  842. package/dist/formatters/relate.test.d.ts +2 -0
  843. package/dist/formatters/relate.test.d.ts.map +1 -0
  844. package/dist/formatters/relate.test.js +91 -0
  845. package/dist/formatters/relate.test.js.map +1 -0
  846. package/dist/formatters/scoreboard.d.ts +11 -0
  847. package/dist/formatters/scoreboard.d.ts.map +1 -0
  848. package/dist/formatters/scoreboard.js +162 -0
  849. package/dist/formatters/scoreboard.js.map +1 -0
  850. package/dist/formatters/scoreboard.test.d.ts +2 -0
  851. package/dist/formatters/scoreboard.test.d.ts.map +1 -0
  852. package/dist/formatters/scoreboard.test.js +301 -0
  853. package/dist/formatters/scoreboard.test.js.map +1 -0
  854. package/dist/formatters/search.d.ts +3 -0
  855. package/dist/formatters/search.d.ts.map +1 -1
  856. package/dist/formatters/search.js +15 -1
  857. package/dist/formatters/search.js.map +1 -1
  858. package/dist/formatters/search.test.d.ts +2 -0
  859. package/dist/formatters/search.test.d.ts.map +1 -0
  860. package/dist/formatters/search.test.js +76 -0
  861. package/dist/formatters/search.test.js.map +1 -0
  862. package/dist/formatters/session-feedback.test.d.ts +2 -0
  863. package/dist/formatters/session-feedback.test.d.ts.map +1 -0
  864. package/dist/formatters/session-feedback.test.js +146 -0
  865. package/dist/formatters/session-feedback.test.js.map +1 -0
  866. package/dist/formatters/session.d.ts +122 -5
  867. package/dist/formatters/session.d.ts.map +1 -1
  868. package/dist/formatters/session.js +312 -21
  869. package/dist/formatters/session.js.map +1 -1
  870. package/dist/formatters/shape.d.ts +54 -0
  871. package/dist/formatters/shape.d.ts.map +1 -0
  872. package/dist/formatters/shape.js +97 -0
  873. package/dist/formatters/shape.js.map +1 -0
  874. package/dist/formatters/shape.test.d.ts +2 -0
  875. package/dist/formatters/shape.test.d.ts.map +1 -0
  876. package/dist/formatters/shape.test.js +80 -0
  877. package/dist/formatters/shape.test.js.map +1 -0
  878. package/dist/formatters/spineCheck.d.ts +14 -0
  879. package/dist/formatters/spineCheck.d.ts.map +1 -0
  880. package/dist/formatters/spineCheck.js +113 -0
  881. package/dist/formatters/spineCheck.js.map +1 -0
  882. package/dist/formatters/spineCheck.test.d.ts +2 -0
  883. package/dist/formatters/spineCheck.test.d.ts.map +1 -0
  884. package/dist/formatters/spineCheck.test.js +76 -0
  885. package/dist/formatters/spineCheck.test.js.map +1 -0
  886. package/dist/formatters/tensionsList.d.ts +17 -0
  887. package/dist/formatters/tensionsList.d.ts.map +1 -0
  888. package/dist/formatters/tensionsList.js +33 -0
  889. package/dist/formatters/tensionsList.js.map +1 -0
  890. package/dist/formatters/update.d.ts +22 -0
  891. package/dist/formatters/update.d.ts.map +1 -1
  892. package/dist/formatters/update.js +36 -7
  893. package/dist/formatters/update.js.map +1 -1
  894. package/dist/formatters/update.test.d.ts +2 -0
  895. package/dist/formatters/update.test.d.ts.map +1 -0
  896. package/dist/formatters/update.test.js +59 -0
  897. package/dist/formatters/update.test.js.map +1 -0
  898. package/dist/formatters/verify.d.ts +12 -4
  899. package/dist/formatters/verify.d.ts.map +1 -1
  900. package/dist/formatters/verify.js +20 -2
  901. package/dist/formatters/verify.js.map +1 -1
  902. package/dist/generated/healthGapKinds.generated.d.ts +12 -0
  903. package/dist/generated/healthGapKinds.generated.d.ts.map +1 -0
  904. package/dist/generated/healthGapKinds.generated.js +16 -0
  905. package/dist/generated/healthGapKinds.generated.js.map +1 -0
  906. package/dist/generated/organisationalAuthorityRefusalCodes.generated.d.ts +12 -0
  907. package/dist/generated/organisationalAuthorityRefusalCodes.generated.d.ts.map +1 -0
  908. package/dist/generated/organisationalAuthorityRefusalCodes.generated.js +11 -0
  909. package/dist/generated/organisationalAuthorityRefusalCodes.generated.js.map +1 -0
  910. package/dist/generated/relationTypes.generated.d.ts +12 -0
  911. package/dist/generated/relationTypes.generated.d.ts.map +1 -0
  912. package/dist/generated/relationTypes.generated.js +11 -0
  913. package/dist/generated/relationTypes.generated.js.map +1 -0
  914. package/dist/generated/routeLatencyBudget.generated.d.ts +56 -0
  915. package/dist/generated/routeLatencyBudget.generated.d.ts.map +1 -0
  916. package/dist/generated/routeLatencyBudget.generated.js +280 -0
  917. package/dist/generated/routeLatencyBudget.generated.js.map +1 -0
  918. package/dist/generated/sourceSurfaces.generated.d.ts +12 -0
  919. package/dist/generated/sourceSurfaces.generated.d.ts.map +1 -0
  920. package/dist/generated/sourceSurfaces.generated.js +11 -0
  921. package/dist/generated/sourceSurfaces.generated.js.map +1 -0
  922. package/dist/generators/adapters.d.ts +39 -6
  923. package/dist/generators/adapters.d.ts.map +1 -1
  924. package/dist/generators/adapters.js +86 -55
  925. package/dist/generators/adapters.js.map +1 -1
  926. package/dist/generators/adapters.test.js +1 -3
  927. package/dist/generators/adapters.test.js.map +1 -1
  928. package/dist/generators/boundary-manifest.d.ts +29 -0
  929. package/dist/generators/boundary-manifest.d.ts.map +1 -0
  930. package/dist/generators/boundary-manifest.js +183 -0
  931. package/dist/generators/boundary-manifest.js.map +1 -0
  932. package/dist/generators/boundary-manifest.real-file.test.d.ts +2 -0
  933. package/dist/generators/boundary-manifest.real-file.test.d.ts.map +1 -0
  934. package/dist/generators/boundary-manifest.real-file.test.js +70 -0
  935. package/dist/generators/boundary-manifest.real-file.test.js.map +1 -0
  936. package/dist/generators/boundary-manifest.test.d.ts +2 -0
  937. package/dist/generators/boundary-manifest.test.d.ts.map +1 -0
  938. package/dist/generators/boundary-manifest.test.js +91 -0
  939. package/dist/generators/boundary-manifest.test.js.map +1 -0
  940. package/dist/generators/briefing-projections.test.d.ts +2 -0
  941. package/dist/generators/briefing-projections.test.d.ts.map +1 -0
  942. package/dist/generators/briefing-projections.test.js +97 -0
  943. package/dist/generators/briefing-projections.test.js.map +1 -0
  944. package/dist/generators/context-md.d.ts +7 -2
  945. package/dist/generators/context-md.d.ts.map +1 -1
  946. package/dist/generators/context-md.js +14 -54
  947. package/dist/generators/context-md.js.map +1 -1
  948. package/dist/generators/everyone-rules-md.d.ts +9 -0
  949. package/dist/generators/everyone-rules-md.d.ts.map +1 -0
  950. package/dist/generators/everyone-rules-md.js +21 -0
  951. package/dist/generators/everyone-rules-md.js.map +1 -0
  952. package/dist/generators/manifest.d.ts +78 -0
  953. package/dist/generators/manifest.d.ts.map +1 -1
  954. package/dist/generators/manifest.js +125 -14
  955. package/dist/generators/manifest.js.map +1 -1
  956. package/dist/generators/noProjectionAssets.d.ts +15 -0
  957. package/dist/generators/noProjectionAssets.d.ts.map +1 -0
  958. package/dist/generators/noProjectionAssets.js +6 -0
  959. package/dist/generators/noProjectionAssets.js.map +1 -0
  960. package/dist/generators/portable-knowledge.d.ts +15 -38
  961. package/dist/generators/portable-knowledge.d.ts.map +1 -1
  962. package/dist/generators/portable-knowledge.js +13 -144
  963. package/dist/generators/portable-knowledge.js.map +1 -1
  964. package/dist/generators/portable-knowledge.test.js +82 -267
  965. package/dist/generators/portable-knowledge.test.js.map +1 -1
  966. package/dist/generators/region-projections.d.ts +17 -0
  967. package/dist/generators/region-projections.d.ts.map +1 -0
  968. package/dist/generators/region-projections.js +51 -0
  969. package/dist/generators/region-projections.js.map +1 -0
  970. package/dist/generators/region-projections.test.d.ts +2 -0
  971. package/dist/generators/region-projections.test.d.ts.map +1 -0
  972. package/dist/generators/region-projections.test.js +58 -0
  973. package/dist/generators/region-projections.test.js.map +1 -0
  974. package/dist/generators/region.d.ts +24 -0
  975. package/dist/generators/region.d.ts.map +1 -0
  976. package/dist/generators/region.js +87 -0
  977. package/dist/generators/region.js.map +1 -0
  978. package/dist/generators/region.test.d.ts +2 -0
  979. package/dist/generators/region.test.d.ts.map +1 -0
  980. package/dist/generators/region.test.js +126 -0
  981. package/dist/generators/region.test.js.map +1 -0
  982. package/dist/generators/retired-projections.d.ts +12 -0
  983. package/dist/generators/retired-projections.d.ts.map +1 -0
  984. package/dist/generators/retired-projections.js +75 -0
  985. package/dist/generators/retired-projections.js.map +1 -0
  986. package/dist/generators/retired-projections.test.d.ts +2 -0
  987. package/dist/generators/retired-projections.test.d.ts.map +1 -0
  988. package/dist/generators/retired-projections.test.js +64 -0
  989. package/dist/generators/retired-projections.test.js.map +1 -0
  990. package/dist/generators/surface-profiles.d.ts +1 -2
  991. package/dist/generators/surface-profiles.d.ts.map +1 -1
  992. package/dist/generators/surface-profiles.js.map +1 -1
  993. package/dist/handleCliError.d.ts +2 -0
  994. package/dist/handleCliError.d.ts.map +1 -0
  995. package/dist/handleCliError.js +56 -0
  996. package/dist/handleCliError.js.map +1 -0
  997. package/dist/index.d.ts +0 -5
  998. package/dist/index.d.ts.map +1 -1
  999. package/dist/index.js +218 -358
  1000. package/dist/index.js.map +1 -1
  1001. package/dist/lib/__tests__/legalRelationTypes.test.d.ts +2 -0
  1002. package/dist/lib/__tests__/legalRelationTypes.test.d.ts.map +1 -0
  1003. package/dist/lib/__tests__/legalRelationTypes.test.js +61 -0
  1004. package/dist/lib/__tests__/legalRelationTypes.test.js.map +1 -0
  1005. package/dist/lib/__tests__/parseFields.test.d.ts +2 -0
  1006. package/dist/lib/__tests__/parseFields.test.d.ts.map +1 -0
  1007. package/dist/lib/__tests__/parseFields.test.js +40 -0
  1008. package/dist/lib/__tests__/parseFields.test.js.map +1 -0
  1009. package/dist/lib/adminConfig.d.ts +48 -0
  1010. package/dist/lib/adminConfig.d.ts.map +1 -0
  1011. package/dist/lib/adminConfig.js +130 -0
  1012. package/dist/lib/adminConfig.js.map +1 -0
  1013. package/dist/lib/canonicalRefs.d.ts +160 -0
  1014. package/dist/lib/canonicalRefs.d.ts.map +1 -0
  1015. package/dist/lib/canonicalRefs.js +169 -0
  1016. package/dist/lib/canonicalRefs.js.map +1 -0
  1017. package/dist/lib/captureGrounding.d.ts +48 -0
  1018. package/dist/lib/captureGrounding.d.ts.map +1 -0
  1019. package/dist/lib/captureGrounding.js +54 -0
  1020. package/dist/lib/captureGrounding.js.map +1 -0
  1021. package/dist/lib/captureGrounding.test.d.ts +2 -0
  1022. package/dist/lib/captureGrounding.test.d.ts.map +1 -0
  1023. package/dist/lib/captureGrounding.test.js +74 -0
  1024. package/dist/lib/captureGrounding.test.js.map +1 -0
  1025. package/dist/lib/captureLink.d.ts +26 -0
  1026. package/dist/lib/captureLink.d.ts.map +1 -0
  1027. package/dist/lib/captureLink.js +110 -0
  1028. package/dist/lib/captureLink.js.map +1 -0
  1029. package/dist/lib/checklist.d.ts +32 -0
  1030. package/dist/lib/checklist.d.ts.map +1 -0
  1031. package/dist/lib/checklist.js +77 -0
  1032. package/dist/lib/checklist.js.map +1 -0
  1033. package/dist/lib/client.d.ts +46 -19
  1034. package/dist/lib/client.d.ts.map +1 -1
  1035. package/dist/lib/client.js +224 -59
  1036. package/dist/lib/client.js.map +1 -1
  1037. package/dist/lib/collectionRegistry.d.ts +40 -5
  1038. package/dist/lib/collectionRegistry.d.ts.map +1 -1
  1039. package/dist/lib/collectionRegistry.js +71 -48
  1040. package/dist/lib/collectionRegistry.js.map +1 -1
  1041. package/dist/lib/commanderOptions.d.ts +8 -0
  1042. package/dist/lib/commanderOptions.d.ts.map +1 -0
  1043. package/dist/lib/commanderOptions.js +10 -0
  1044. package/dist/lib/commanderOptions.js.map +1 -0
  1045. package/dist/lib/compose-wrapup-view.d.ts +48 -0
  1046. package/dist/lib/compose-wrapup-view.d.ts.map +1 -0
  1047. package/dist/lib/compose-wrapup-view.js +37 -0
  1048. package/dist/lib/compose-wrapup-view.js.map +1 -0
  1049. package/dist/lib/config.d.ts +107 -55
  1050. package/dist/lib/config.d.ts.map +1 -1
  1051. package/dist/lib/config.js +234 -169
  1052. package/dist/lib/config.js.map +1 -1
  1053. package/dist/lib/configResult.d.ts +102 -0
  1054. package/dist/lib/configResult.d.ts.map +1 -0
  1055. package/dist/lib/configResult.js +179 -0
  1056. package/dist/lib/configResult.js.map +1 -0
  1057. package/dist/lib/connectKeyLabel.d.ts +9 -0
  1058. package/dist/lib/connectKeyLabel.d.ts.map +1 -0
  1059. package/dist/lib/connectKeyLabel.js +12 -0
  1060. package/dist/lib/connectKeyLabel.js.map +1 -0
  1061. package/dist/lib/connectProfileName.d.ts +36 -0
  1062. package/dist/lib/connectProfileName.d.ts.map +1 -0
  1063. package/dist/lib/connectProfileName.js +72 -0
  1064. package/dist/lib/connectProfileName.js.map +1 -0
  1065. package/dist/lib/connectProfileName.test.d.ts +2 -0
  1066. package/dist/lib/connectProfileName.test.d.ts.map +1 -0
  1067. package/dist/lib/connectProfileName.test.js +100 -0
  1068. package/dist/lib/connectProfileName.test.js.map +1 -0
  1069. package/dist/lib/constants.d.ts +5 -1
  1070. package/dist/lib/constants.d.ts.map +1 -1
  1071. package/dist/lib/constants.js +8 -1
  1072. package/dist/lib/constants.js.map +1 -1
  1073. package/dist/lib/conversation.d.ts +36 -0
  1074. package/dist/lib/conversation.d.ts.map +1 -0
  1075. package/dist/lib/conversation.js +66 -0
  1076. package/dist/lib/conversation.js.map +1 -0
  1077. package/dist/lib/createEntryResult.d.ts +34 -0
  1078. package/dist/lib/createEntryResult.d.ts.map +1 -0
  1079. package/dist/lib/createEntryResult.js +12 -0
  1080. package/dist/lib/createEntryResult.js.map +1 -0
  1081. package/dist/lib/deployment.js +2 -2
  1082. package/dist/lib/deployment.js.map +1 -1
  1083. package/dist/lib/deployment.test.js +20 -1
  1084. package/dist/lib/deployment.test.js.map +1 -1
  1085. package/dist/lib/envKeySnapshot.d.ts +10 -0
  1086. package/dist/lib/envKeySnapshot.d.ts.map +1 -0
  1087. package/dist/lib/envKeySnapshot.js +30 -0
  1088. package/dist/lib/envKeySnapshot.js.map +1 -0
  1089. package/dist/lib/errors.d.ts +93 -0
  1090. package/dist/lib/errors.d.ts.map +1 -1
  1091. package/dist/lib/errors.js +86 -0
  1092. package/dist/lib/errors.js.map +1 -1
  1093. package/dist/lib/frontmatter.d.ts +55 -0
  1094. package/dist/lib/frontmatter.d.ts.map +1 -0
  1095. package/dist/lib/frontmatter.js +92 -0
  1096. package/dist/lib/frontmatter.js.map +1 -0
  1097. package/dist/lib/frontmatter.test.d.ts +15 -0
  1098. package/dist/lib/frontmatter.test.d.ts.map +1 -0
  1099. package/dist/lib/frontmatter.test.js +98 -0
  1100. package/dist/lib/frontmatter.test.js.map +1 -0
  1101. package/dist/lib/gatewayTimeout.d.ts +88 -0
  1102. package/dist/lib/gatewayTimeout.d.ts.map +1 -0
  1103. package/dist/lib/gatewayTimeout.js +118 -0
  1104. package/dist/lib/gatewayTimeout.js.map +1 -0
  1105. package/dist/lib/gitEnvLeakKeysParity.test.d.ts +2 -0
  1106. package/dist/lib/gitEnvLeakKeysParity.test.d.ts.map +1 -0
  1107. package/dist/lib/gitEnvLeakKeysParity.test.js +73 -0
  1108. package/dist/lib/gitEnvLeakKeysParity.test.js.map +1 -0
  1109. package/dist/lib/glossary.js +1 -1
  1110. package/dist/lib/glossary.js.map +1 -1
  1111. package/dist/lib/hook-intents.d.ts.map +1 -1
  1112. package/dist/lib/hook-intents.js +2 -3
  1113. package/dist/lib/hook-intents.js.map +1 -1
  1114. package/dist/lib/judgeWait.d.ts +50 -0
  1115. package/dist/lib/judgeWait.d.ts.map +1 -0
  1116. package/dist/lib/judgeWait.js +64 -0
  1117. package/dist/lib/judgeWait.js.map +1 -0
  1118. package/dist/lib/kernelEnvelope.d.ts +42 -0
  1119. package/dist/lib/kernelEnvelope.d.ts.map +1 -0
  1120. package/dist/lib/kernelEnvelope.js +67 -0
  1121. package/dist/lib/kernelEnvelope.js.map +1 -0
  1122. package/dist/lib/legalRelationTypes.d.ts +19 -0
  1123. package/dist/lib/legalRelationTypes.d.ts.map +1 -0
  1124. package/dist/lib/legalRelationTypes.js +64 -0
  1125. package/dist/lib/legalRelationTypes.js.map +1 -0
  1126. package/dist/lib/localBinding.d.ts +86 -0
  1127. package/dist/lib/localBinding.d.ts.map +1 -0
  1128. package/dist/lib/localBinding.js +173 -0
  1129. package/dist/lib/localBinding.js.map +1 -0
  1130. package/dist/lib/method-registry.d.ts +16 -11
  1131. package/dist/lib/method-registry.d.ts.map +1 -1
  1132. package/dist/lib/method-registry.js +13 -25
  1133. package/dist/lib/method-registry.js.map +1 -1
  1134. package/dist/lib/normalizeMaterializedFilename.d.ts +28 -0
  1135. package/dist/lib/normalizeMaterializedFilename.d.ts.map +1 -0
  1136. package/dist/lib/normalizeMaterializedFilename.js +56 -0
  1137. package/dist/lib/normalizeMaterializedFilename.js.map +1 -0
  1138. package/dist/lib/normalizeMaterializedFilename.test.d.ts +16 -0
  1139. package/dist/lib/normalizeMaterializedFilename.test.d.ts.map +1 -0
  1140. package/dist/lib/normalizeMaterializedFilename.test.js +90 -0
  1141. package/dist/lib/normalizeMaterializedFilename.test.js.map +1 -0
  1142. package/dist/lib/notice-marker.d.ts +3 -0
  1143. package/dist/lib/notice-marker.d.ts.map +1 -0
  1144. package/dist/lib/notice-marker.js +223 -0
  1145. package/dist/lib/notice-marker.js.map +1 -0
  1146. package/dist/lib/onboarding-path-b.d.ts.map +1 -1
  1147. package/dist/lib/onboarding-path-b.js +39 -15
  1148. package/dist/lib/onboarding-path-b.js.map +1 -1
  1149. package/dist/lib/onboarding-shared.d.ts +27 -5
  1150. package/dist/lib/onboarding-shared.d.ts.map +1 -1
  1151. package/dist/lib/onboarding-shared.js +55 -37
  1152. package/dist/lib/onboarding-shared.js.map +1 -1
  1153. package/dist/lib/onboarding-shared.test.d.ts +2 -0
  1154. package/dist/lib/onboarding-shared.test.d.ts.map +1 -0
  1155. package/dist/lib/onboarding-shared.test.js +131 -0
  1156. package/dist/lib/onboarding-shared.test.js.map +1 -0
  1157. package/dist/lib/onboarding-topics.js +1 -1
  1158. package/dist/lib/onboarding.d.ts +5 -1
  1159. package/dist/lib/onboarding.d.ts.map +1 -1
  1160. package/dist/lib/onboarding.js +62 -25
  1161. package/dist/lib/onboarding.js.map +1 -1
  1162. package/dist/lib/ownerLine.d.ts +73 -0
  1163. package/dist/lib/ownerLine.d.ts.map +1 -0
  1164. package/dist/lib/ownerLine.js +57 -0
  1165. package/dist/lib/ownerLine.js.map +1 -0
  1166. package/dist/lib/parseFields.d.ts +19 -0
  1167. package/dist/lib/parseFields.d.ts.map +1 -0
  1168. package/dist/lib/parseFields.js +49 -0
  1169. package/dist/lib/parseFields.js.map +1 -0
  1170. package/dist/lib/pinnedRole.d.ts +28 -0
  1171. package/dist/lib/pinnedRole.d.ts.map +1 -0
  1172. package/dist/lib/pinnedRole.js +112 -0
  1173. package/dist/lib/pinnedRole.js.map +1 -0
  1174. package/dist/lib/platformGlossary.d.ts +19 -0
  1175. package/dist/lib/platformGlossary.d.ts.map +1 -0
  1176. package/dist/lib/platformGlossary.js +21 -0
  1177. package/dist/lib/platformGlossary.js.map +1 -0
  1178. package/dist/lib/previewBanner.d.ts +9 -0
  1179. package/dist/lib/previewBanner.d.ts.map +1 -0
  1180. package/dist/lib/previewBanner.js +37 -0
  1181. package/dist/lib/previewBanner.js.map +1 -0
  1182. package/dist/lib/productbrain-files.d.ts +108 -0
  1183. package/dist/lib/productbrain-files.d.ts.map +1 -0
  1184. package/dist/lib/productbrain-files.js +240 -0
  1185. package/dist/lib/productbrain-files.js.map +1 -0
  1186. package/dist/lib/productbrain-files.test.d.ts +2 -0
  1187. package/dist/lib/productbrain-files.test.d.ts.map +1 -0
  1188. package/dist/lib/productbrain-files.test.js +518 -0
  1189. package/dist/lib/productbrain-files.test.js.map +1 -0
  1190. package/dist/lib/profiles.d.ts +55 -5
  1191. package/dist/lib/profiles.d.ts.map +1 -1
  1192. package/dist/lib/profiles.js +81 -27
  1193. package/dist/lib/profiles.js.map +1 -1
  1194. package/dist/lib/projectConfig.d.ts +96 -0
  1195. package/dist/lib/projectConfig.d.ts.map +1 -0
  1196. package/dist/lib/projectConfig.js +185 -0
  1197. package/dist/lib/projectConfig.js.map +1 -0
  1198. package/dist/lib/prompts.d.ts +2 -0
  1199. package/dist/lib/prompts.d.ts.map +1 -1
  1200. package/dist/lib/prompts.js +2 -0
  1201. package/dist/lib/prompts.js.map +1 -1
  1202. package/dist/lib/proseBody.d.ts +14 -0
  1203. package/dist/lib/proseBody.d.ts.map +1 -0
  1204. package/dist/lib/proseBody.js +25 -0
  1205. package/dist/lib/proseBody.js.map +1 -0
  1206. package/dist/lib/rate-limit.d.ts +38 -0
  1207. package/dist/lib/rate-limit.d.ts.map +1 -0
  1208. package/dist/lib/rate-limit.js +83 -0
  1209. package/dist/lib/rate-limit.js.map +1 -0
  1210. package/dist/lib/readinessNotices.d.ts +12 -0
  1211. package/dist/lib/readinessNotices.d.ts.map +1 -0
  1212. package/dist/lib/readinessNotices.js +15 -0
  1213. package/dist/lib/readinessNotices.js.map +1 -0
  1214. package/dist/lib/repo-detect.d.ts +8 -2
  1215. package/dist/lib/repo-detect.d.ts.map +1 -1
  1216. package/dist/lib/repo-detect.js +11 -6
  1217. package/dist/lib/repo-detect.js.map +1 -1
  1218. package/dist/lib/reportedProfile.d.ts +18 -0
  1219. package/dist/lib/reportedProfile.d.ts.map +1 -0
  1220. package/dist/lib/reportedProfile.js +144 -0
  1221. package/dist/lib/reportedProfile.js.map +1 -0
  1222. package/dist/lib/ruleListRender.d.ts +178 -0
  1223. package/dist/lib/ruleListRender.d.ts.map +1 -0
  1224. package/dist/lib/ruleListRender.js +257 -0
  1225. package/dist/lib/ruleListRender.js.map +1 -0
  1226. package/dist/lib/runner.d.ts +9 -1
  1227. package/dist/lib/runner.d.ts.map +1 -1
  1228. package/dist/lib/runner.js +30 -4
  1229. package/dist/lib/runner.js.map +1 -1
  1230. package/dist/lib/session.d.ts +90 -6
  1231. package/dist/lib/session.d.ts.map +1 -1
  1232. package/dist/lib/session.js +261 -17
  1233. package/dist/lib/session.js.map +1 -1
  1234. package/dist/lib/sessionBinding.d.ts +61 -0
  1235. package/dist/lib/sessionBinding.d.ts.map +1 -0
  1236. package/dist/lib/sessionBinding.js +125 -0
  1237. package/dist/lib/sessionBinding.js.map +1 -0
  1238. package/dist/lib/sessionNotices.d.ts +54 -0
  1239. package/dist/lib/sessionNotices.d.ts.map +1 -0
  1240. package/dist/lib/sessionNotices.js +130 -0
  1241. package/dist/lib/sessionNotices.js.map +1 -0
  1242. package/dist/lib/sessionNotices.test.d.ts +2 -0
  1243. package/dist/lib/sessionNotices.test.d.ts.map +1 -0
  1244. package/dist/lib/sessionNotices.test.js +55 -0
  1245. package/dist/lib/sessionNotices.test.js.map +1 -0
  1246. package/dist/lib/spineVerdictRead.d.ts +70 -0
  1247. package/dist/lib/spineVerdictRead.d.ts.map +1 -0
  1248. package/dist/lib/spineVerdictRead.js +73 -0
  1249. package/dist/lib/spineVerdictRead.js.map +1 -0
  1250. package/dist/lib/spinner.js +2 -2
  1251. package/dist/lib/spinner.js.map +1 -1
  1252. package/dist/lib/startup-resolution-signals.d.ts +34 -0
  1253. package/dist/lib/startup-resolution-signals.d.ts.map +1 -0
  1254. package/dist/lib/startup-resolution-signals.js +116 -0
  1255. package/dist/lib/startup-resolution-signals.js.map +1 -0
  1256. package/dist/lib/startup-resolution-signals.test.d.ts +2 -0
  1257. package/dist/lib/startup-resolution-signals.test.d.ts.map +1 -0
  1258. package/dist/lib/startup-resolution-signals.test.js +113 -0
  1259. package/dist/lib/startup-resolution-signals.test.js.map +1 -0
  1260. package/dist/lib/startup-signals.d.ts +12 -0
  1261. package/dist/lib/startup-signals.d.ts.map +1 -0
  1262. package/dist/lib/startup-signals.js +179 -0
  1263. package/dist/lib/startup-signals.js.map +1 -0
  1264. package/dist/lib/startup-signals.test.d.ts +2 -0
  1265. package/dist/lib/startup-signals.test.d.ts.map +1 -0
  1266. package/dist/lib/startup-signals.test.js +165 -0
  1267. package/dist/lib/startup-signals.test.js.map +1 -0
  1268. package/dist/lib/state.d.ts +11 -2
  1269. package/dist/lib/state.d.ts.map +1 -1
  1270. package/dist/lib/state.js +11 -4
  1271. package/dist/lib/state.js.map +1 -1
  1272. package/dist/lib/statusCategories.d.ts +160 -0
  1273. package/dist/lib/statusCategories.d.ts.map +1 -0
  1274. package/dist/lib/statusCategories.js +284 -0
  1275. package/dist/lib/statusCategories.js.map +1 -0
  1276. package/dist/lib/strip.d.ts +17 -0
  1277. package/dist/lib/strip.d.ts.map +1 -1
  1278. package/dist/lib/strip.js +48 -1
  1279. package/dist/lib/strip.js.map +1 -1
  1280. package/dist/lib/style.d.ts +8 -2
  1281. package/dist/lib/style.d.ts.map +1 -1
  1282. package/dist/lib/style.js +24 -17
  1283. package/dist/lib/style.js.map +1 -1
  1284. package/dist/lib/tokenConstants.d.ts +2 -0
  1285. package/dist/lib/tokenConstants.d.ts.map +1 -1
  1286. package/dist/lib/tokenConstants.js +2 -0
  1287. package/dist/lib/tokenConstants.js.map +1 -1
  1288. package/dist/lib/update-check.d.ts +42 -7
  1289. package/dist/lib/update-check.d.ts.map +1 -1
  1290. package/dist/lib/update-check.js +213 -62
  1291. package/dist/lib/update-check.js.map +1 -1
  1292. package/dist/lib/upgrade-runner.d.ts +22 -0
  1293. package/dist/lib/upgrade-runner.d.ts.map +1 -0
  1294. package/dist/lib/upgrade-runner.js +110 -0
  1295. package/dist/lib/upgrade-runner.js.map +1 -0
  1296. package/dist/lib/workspaceNotice.d.ts +202 -0
  1297. package/dist/lib/workspaceNotice.d.ts.map +1 -0
  1298. package/dist/lib/workspaceNotice.js +345 -0
  1299. package/dist/lib/workspaceNotice.js.map +1 -0
  1300. package/dist/lib/workspaceVocabCache.d.ts +60 -0
  1301. package/dist/lib/workspaceVocabCache.d.ts.map +1 -0
  1302. package/dist/lib/workspaceVocabCache.js +98 -0
  1303. package/dist/lib/workspaceVocabCache.js.map +1 -0
  1304. package/dist/lib/writePerimeter.d.ts +72 -0
  1305. package/dist/lib/writePerimeter.d.ts.map +1 -0
  1306. package/dist/lib/writePerimeter.js +128 -0
  1307. package/dist/lib/writePerimeter.js.map +1 -0
  1308. package/dist/registerEntryCommands.d.ts +18 -0
  1309. package/dist/registerEntryCommands.d.ts.map +1 -0
  1310. package/dist/registerEntryCommands.js +122 -0
  1311. package/dist/registerEntryCommands.js.map +1 -0
  1312. package/dist/registerHistoryCommand.d.ts +8 -0
  1313. package/dist/registerHistoryCommand.d.ts.map +1 -0
  1314. package/dist/registerHistoryCommand.js +14 -0
  1315. package/dist/registerHistoryCommand.js.map +1 -0
  1316. package/dist/registerOutcomeCommands.d.ts +27 -0
  1317. package/dist/registerOutcomeCommands.d.ts.map +1 -0
  1318. package/dist/registerOutcomeCommands.js +27 -0
  1319. package/dist/registerOutcomeCommands.js.map +1 -0
  1320. package/dist/registerRoleCommands.d.ts +10 -0
  1321. package/dist/registerRoleCommands.d.ts.map +1 -0
  1322. package/dist/registerRoleCommands.js +14 -0
  1323. package/dist/registerRoleCommands.js.map +1 -0
  1324. package/dist/registerTensionsCommands.d.ts +10 -0
  1325. package/dist/registerTensionsCommands.d.ts.map +1 -0
  1326. package/dist/registerTensionsCommands.js +15 -0
  1327. package/dist/registerTensionsCommands.js.map +1 -0
  1328. package/dist/scoreboard/diagnose.d.ts +190 -0
  1329. package/dist/scoreboard/diagnose.d.ts.map +1 -0
  1330. package/dist/scoreboard/diagnose.js +282 -0
  1331. package/dist/scoreboard/diagnose.js.map +1 -0
  1332. package/dist/scoreboard/diagnose.test.d.ts +15 -0
  1333. package/dist/scoreboard/diagnose.test.d.ts.map +1 -0
  1334. package/dist/scoreboard/diagnose.test.js +288 -0
  1335. package/dist/scoreboard/diagnose.test.js.map +1 -0
  1336. package/dist/scoreboard/floors.d.ts +47 -0
  1337. package/dist/scoreboard/floors.d.ts.map +1 -0
  1338. package/dist/scoreboard/floors.js +33 -0
  1339. package/dist/scoreboard/floors.js.map +1 -0
  1340. package/dist/scoreboard/localDrift.d.ts +23 -0
  1341. package/dist/scoreboard/localDrift.d.ts.map +1 -0
  1342. package/dist/scoreboard/localDrift.js +111 -0
  1343. package/dist/scoreboard/localDrift.js.map +1 -0
  1344. package/dist/scoreboard/localDrift.test.d.ts +9 -0
  1345. package/dist/scoreboard/localDrift.test.d.ts.map +1 -0
  1346. package/dist/scoreboard/localDrift.test.js +82 -0
  1347. package/dist/scoreboard/localDrift.test.js.map +1 -0
  1348. package/dist/surfaces/__tests__/adapter.test.d.ts +2 -0
  1349. package/dist/surfaces/__tests__/adapter.test.d.ts.map +1 -0
  1350. package/dist/surfaces/__tests__/adapter.test.js +86 -0
  1351. package/dist/surfaces/__tests__/adapter.test.js.map +1 -0
  1352. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.d.ts +2 -0
  1353. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.d.ts.map +1 -0
  1354. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.js +179 -0
  1355. package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.js.map +1 -0
  1356. package/dist/surfaces/__tests__/telemetry.test.d.ts +2 -0
  1357. package/dist/surfaces/__tests__/telemetry.test.d.ts.map +1 -0
  1358. package/dist/surfaces/__tests__/telemetry.test.js +55 -0
  1359. package/dist/surfaces/__tests__/telemetry.test.js.map +1 -0
  1360. package/dist/surfaces/adapter.d.ts +70 -0
  1361. package/dist/surfaces/adapter.d.ts.map +1 -0
  1362. package/dist/surfaces/adapter.js +2 -0
  1363. package/dist/surfaces/adapter.js.map +1 -0
  1364. package/dist/surfaces/adapters/claude.d.ts +3 -0
  1365. package/dist/surfaces/adapters/claude.d.ts.map +1 -0
  1366. package/dist/surfaces/adapters/claude.js +72 -0
  1367. package/dist/surfaces/adapters/claude.js.map +1 -0
  1368. package/dist/surfaces/adapters/codex.d.ts +3 -0
  1369. package/dist/surfaces/adapters/codex.d.ts.map +1 -0
  1370. package/dist/surfaces/adapters/codex.js +61 -0
  1371. package/dist/surfaces/adapters/codex.js.map +1 -0
  1372. package/dist/surfaces/adapters/copilot.d.ts +3 -0
  1373. package/dist/surfaces/adapters/copilot.d.ts.map +1 -0
  1374. package/dist/surfaces/adapters/copilot.js +59 -0
  1375. package/dist/surfaces/adapters/copilot.js.map +1 -0
  1376. package/dist/surfaces/adapters/cursor.d.ts +3 -0
  1377. package/dist/surfaces/adapters/cursor.d.ts.map +1 -0
  1378. package/dist/surfaces/adapters/cursor.js +78 -0
  1379. package/dist/surfaces/adapters/cursor.js.map +1 -0
  1380. package/dist/surfaces/registry.d.ts +58 -2
  1381. package/dist/surfaces/registry.d.ts.map +1 -1
  1382. package/dist/surfaces/registry.js +82 -7
  1383. package/dist/surfaces/registry.js.map +1 -1
  1384. package/dist/surfaces/telemetry.d.ts +17 -0
  1385. package/dist/surfaces/telemetry.d.ts.map +1 -0
  1386. package/dist/surfaces/telemetry.js +31 -0
  1387. package/dist/surfaces/telemetry.js.map +1 -0
  1388. package/package.json +9 -5
  1389. package/dist/__tests__/audit.test.d.ts +0 -2
  1390. package/dist/__tests__/audit.test.d.ts.map +0 -1
  1391. package/dist/__tests__/audit.test.js +0 -394
  1392. package/dist/__tests__/audit.test.js.map +0 -1
  1393. package/dist/__tests__/promote.test.d.ts +0 -2
  1394. package/dist/__tests__/promote.test.d.ts.map +0 -1
  1395. package/dist/__tests__/promote.test.js +0 -161
  1396. package/dist/__tests__/promote.test.js.map +0 -1
  1397. package/dist/__tests__/proposals.test.d.ts +0 -2
  1398. package/dist/__tests__/proposals.test.d.ts.map +0 -1
  1399. package/dist/__tests__/proposals.test.js +0 -167
  1400. package/dist/__tests__/proposals.test.js.map +0 -1
  1401. package/dist/__tests__/setup-resolver.test.d.ts +0 -14
  1402. package/dist/__tests__/setup-resolver.test.d.ts.map +0 -1
  1403. package/dist/__tests__/setup-resolver.test.js +0 -228
  1404. package/dist/__tests__/setup-resolver.test.js.map +0 -1
  1405. package/dist/__tests__/setup.test.d.ts +0 -2
  1406. package/dist/__tests__/setup.test.d.ts.map +0 -1
  1407. package/dist/__tests__/setup.test.js +0 -141
  1408. package/dist/__tests__/setup.test.js.map +0 -1
  1409. package/dist/commands/accept.d.ts +0 -18
  1410. package/dist/commands/accept.d.ts.map +0 -1
  1411. package/dist/commands/accept.js +0 -76
  1412. package/dist/commands/accept.js.map +0 -1
  1413. package/dist/commands/audit.d.ts +0 -25
  1414. package/dist/commands/audit.d.ts.map +0 -1
  1415. package/dist/commands/audit.js +0 -188
  1416. package/dist/commands/audit.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/promote.d.ts +0 -12
  1422. package/dist/commands/promote.d.ts.map +0 -1
  1423. package/dist/commands/promote.js +0 -90
  1424. package/dist/commands/promote.js.map +0 -1
  1425. package/dist/commands/proposals.d.ts +0 -9
  1426. package/dist/commands/proposals.d.ts.map +0 -1
  1427. package/dist/commands/proposals.js +0 -24
  1428. package/dist/commands/proposals.js.map +0 -1
  1429. package/dist/commands/reject.d.ts +0 -14
  1430. package/dist/commands/reject.d.ts.map +0 -1
  1431. package/dist/commands/reject.js +0 -43
  1432. package/dist/commands/reject.js.map +0 -1
  1433. package/dist/commands/setup-resolver.d.ts +0 -58
  1434. package/dist/commands/setup-resolver.d.ts.map +0 -1
  1435. package/dist/commands/setup-resolver.js +0 -150
  1436. package/dist/commands/setup-resolver.js.map +0 -1
  1437. package/dist/commands/setup.d.ts +0 -15
  1438. package/dist/commands/setup.d.ts.map +0 -1
  1439. package/dist/commands/setup.js +0 -148
  1440. package/dist/commands/setup.js.map +0 -1
  1441. package/dist/formatters/audit.d.ts +0 -46
  1442. package/dist/formatters/audit.d.ts.map +0 -1
  1443. package/dist/formatters/audit.js +0 -81
  1444. package/dist/formatters/audit.js.map +0 -1
  1445. package/dist/formatters/promote.d.ts +0 -30
  1446. package/dist/formatters/promote.d.ts.map +0 -1
  1447. package/dist/formatters/promote.js +0 -39
  1448. package/dist/formatters/promote.js.map +0 -1
  1449. package/dist/formatters/proposals.d.ts +0 -45
  1450. package/dist/formatters/proposals.d.ts.map +0 -1
  1451. package/dist/formatters/proposals.js +0 -62
  1452. package/dist/formatters/proposals.js.map +0 -1
  1453. package/dist/generators/__tests__/surface-profiles.test.d.ts +0 -2
  1454. package/dist/generators/__tests__/surface-profiles.test.d.ts.map +0 -1
  1455. package/dist/generators/__tests__/surface-profiles.test.js +0 -89
  1456. package/dist/generators/__tests__/surface-profiles.test.js.map +0 -1
  1457. package/dist/generators/archetypes.d.ts +0 -52
  1458. package/dist/generators/archetypes.d.ts.map +0 -1
  1459. package/dist/generators/archetypes.js +0 -153
  1460. package/dist/generators/archetypes.js.map +0 -1
  1461. package/dist/generators/archetypes.test.d.ts +0 -2
  1462. package/dist/generators/archetypes.test.d.ts.map +0 -1
  1463. package/dist/generators/archetypes.test.js +0 -237
  1464. package/dist/generators/archetypes.test.js.map +0 -1
  1465. package/dist/generators/chain-classifier.d.ts +0 -49
  1466. package/dist/generators/chain-classifier.d.ts.map +0 -1
  1467. package/dist/generators/chain-classifier.js +0 -180
  1468. package/dist/generators/chain-classifier.js.map +0 -1
  1469. package/dist/generators/chain-classifier.test.d.ts +0 -2
  1470. package/dist/generators/chain-classifier.test.d.ts.map +0 -1
  1471. package/dist/generators/chain-classifier.test.js +0 -257
  1472. package/dist/generators/chain-classifier.test.js.map +0 -1
  1473. package/dist/generators/chain-rules.d.ts +0 -42
  1474. package/dist/generators/chain-rules.d.ts.map +0 -1
  1475. package/dist/generators/chain-rules.js +0 -144
  1476. package/dist/generators/chain-rules.js.map +0 -1
  1477. package/dist/generators/chain-rules.test.d.ts +0 -2
  1478. package/dist/generators/chain-rules.test.d.ts.map +0 -1
  1479. package/dist/generators/chain-rules.test.js +0 -179
  1480. package/dist/generators/chain-rules.test.js.map +0 -1
  1481. package/dist/generators/handshake-diff.d.ts +0 -67
  1482. package/dist/generators/handshake-diff.d.ts.map +0 -1
  1483. package/dist/generators/handshake-diff.js +0 -183
  1484. package/dist/generators/handshake-diff.js.map +0 -1
  1485. package/dist/generators/handshake-diff.test.d.ts +0 -2
  1486. package/dist/generators/handshake-diff.test.d.ts.map +0 -1
  1487. package/dist/generators/handshake-diff.test.js +0 -264
  1488. package/dist/generators/handshake-diff.test.js.map +0 -1
  1489. package/dist/lib/activation.d.ts +0 -28
  1490. package/dist/lib/activation.d.ts.map +0 -1
  1491. package/dist/lib/activation.js +0 -57
  1492. package/dist/lib/activation.js.map +0 -1
  1493. package/dist/lib/activation.test.d.ts +0 -6
  1494. package/dist/lib/activation.test.d.ts.map +0 -1
  1495. package/dist/lib/activation.test.js +0 -121
  1496. package/dist/lib/activation.test.js.map +0 -1
  1497. package/dist/lib/inferSourceDate.d.ts +0 -12
  1498. package/dist/lib/inferSourceDate.d.ts.map +0 -1
  1499. package/dist/lib/inferSourceDate.js +0 -44
  1500. package/dist/lib/inferSourceDate.js.map +0 -1
  1501. package/dist/lib/onboarding-phases.d.ts +0 -9
  1502. package/dist/lib/onboarding-phases.d.ts.map +0 -1
  1503. package/dist/lib/onboarding-phases.js +0 -120
  1504. package/dist/lib/onboarding-phases.js.map +0 -1
  1505. package/templates/archetypes/boundary.md +0 -23
  1506. package/templates/archetypes/constraint.md +0 -23
  1507. package/templates/archetypes/convention.md +0 -23
  1508. package/templates/archetypes/policy.md +0 -23
  1509. package/templates/archetypes/quality-gate.md +0 -23
  1510. package/templates/archetypes/workflow.md +0 -23
@@ -1,17 +1,19 @@
1
1
  /**
2
2
  * Tests for config resolution — WP-303 Slice 0.
3
3
  *
4
- * Tests resolveConfig(), getConfigSafe(), and .productbrain/config.json reading.
4
+ * Tests resolveConfig(), getConfigSafe(), findProjectRoot(), and config file reading.
5
5
  * Uses temp directories and mocks to isolate from real config on the filesystem.
6
6
  */
7
7
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
8
- import { mkdirSync, writeFileSync, rmSync } from 'fs';
9
- import { resolve } from 'path';
8
+ import { mkdirSync, writeFileSync, readFileSync, rmSync } from 'fs';
9
+ import { dirname, resolve } from 'path';
10
10
  import { tmpdir } from 'os';
11
11
  import { randomUUID } from 'crypto';
12
12
  // Mock the profiles module to prevent real profile config from leaking in
13
13
  vi.mock('../lib/profiles.js', () => ({
14
14
  resolveProfileConfig: vi.fn(() => null),
15
+ resolveNamedProfileConfig: vi.fn(() => null),
16
+ getGlobalActiveProfile: vi.fn(() => null),
15
17
  }));
16
18
  // Mock os.homedir to prevent reading real ~/.config/productbrain/.env
17
19
  vi.mock('os', async (importOriginal) => {
@@ -28,9 +30,13 @@ describe('config resolution', () => {
28
30
  const envKeys = ['PRODUCTBRAIN_API_KEY', 'CONVEX_SITE_URL', 'PB_PROFILE', 'PB_ENV'];
29
31
  // Import after mock setup
30
32
  let resolveConfig;
33
+ let getConfig;
31
34
  let getConfigSafe;
32
35
  let resetConfigCache;
36
+ let findProjectRoot;
33
37
  beforeEach(async () => {
38
+ // Reset all mocks first to prevent queued mockReturnValueOnce state leakage between tests
39
+ vi.resetAllMocks();
34
40
  // Save and clear relevant env vars
35
41
  for (const key of envKeys) {
36
42
  savedEnv[key] = process.env[key];
@@ -44,8 +50,10 @@ describe('config resolution', () => {
44
50
  // Dynamic import to get module with mocks applied
45
51
  const config = await import('../lib/config.js');
46
52
  resolveConfig = config.resolveConfig;
53
+ getConfig = config.getConfig;
47
54
  getConfigSafe = config.getConfigSafe;
48
55
  resetConfigCache = config.resetConfigCache;
56
+ findProjectRoot = config.findProjectRoot;
49
57
  // Reset envLoaded state before each test
50
58
  resetConfigCache();
51
59
  });
@@ -69,22 +77,208 @@ describe('config resolution', () => {
69
77
  // ignore
70
78
  }
71
79
  });
80
+ describe('findProjectRoot()', () => {
81
+ it('finds .productbrain/ in the start directory', () => {
82
+ const pbDir = resolve(tempDir, '.productbrain');
83
+ mkdirSync(pbDir, { recursive: true });
84
+ writeFileSync(resolve(pbDir, 'config.json'), '{}');
85
+ const result = findProjectRoot(tempDir);
86
+ expect(result).toBe(tempDir);
87
+ });
88
+ it('finds .productbrain/ in a parent directory', () => {
89
+ // Create .productbrain/ in tempDir with a config file
90
+ const pbDir = resolve(tempDir, '.productbrain');
91
+ mkdirSync(pbDir, { recursive: true });
92
+ writeFileSync(resolve(pbDir, 'config.json'), '{}');
93
+ // Create a subdirectory and search from there
94
+ const subDir = resolve(tempDir, 'src', 'commands');
95
+ mkdirSync(subDir, { recursive: true });
96
+ const result = findProjectRoot(subDir);
97
+ expect(result).toBe(tempDir);
98
+ });
99
+ it('skips a projection-only .productbrain/ subtree and walks to the config-bearing root', () => {
100
+ // Repo root has a config-bearing .productbrain.
101
+ const rootPbDir = resolve(tempDir, '.productbrain');
102
+ mkdirSync(rootPbDir, { recursive: true });
103
+ writeFileSync(resolve(rootPbDir, 'config.json'), '{}');
104
+ // A subrepo has a projection-only .productbrain (handshake artifacts, no config files).
105
+ const subRepo = resolve(tempDir, 'packages', 'cli');
106
+ const subPbDir = resolve(subRepo, '.productbrain');
107
+ mkdirSync(subPbDir, { recursive: true });
108
+ writeFileSync(resolve(subPbDir, 'briefing.md'), '# briefing');
109
+ writeFileSync(resolve(subPbDir, 'context.md'), '# context');
110
+ // Walking up from inside the subrepo must skip the projection and reach the root.
111
+ const result = findProjectRoot(subRepo);
112
+ expect(result).toBe(tempDir);
113
+ });
114
+ it('accepts a sub-tree .productbrain/ that does carry its own config', () => {
115
+ // Intentional sub-config is respected (e.g. a nested CLI project).
116
+ const subRepo = resolve(tempDir, 'sub');
117
+ const subPbDir = resolve(subRepo, '.productbrain');
118
+ mkdirSync(subPbDir, { recursive: true });
119
+ writeFileSync(resolve(subPbDir, 'config.local.json'), '{}');
120
+ const result = findProjectRoot(subRepo);
121
+ expect(result).toBe(subRepo);
122
+ });
123
+ it('returns null when no .productbrain/ found up to home', () => {
124
+ // tempDir is under the real system tmpdir. The mocked homedir() returns a
125
+ // path that is NOT an ancestor of tempDir, so the walk will exhaust all
126
+ // ancestors of tempDir up to the filesystem root and return null because
127
+ // neither tempDir nor any ancestor has .productbrain/ AND the mocked home
128
+ // is never reached (it's a sibling branch, not a parent).
129
+ // We use a fresh subdir under tempDir so there is definitely no .productbrain/.
130
+ const searchDir = resolve(tempDir, 'no-pb-here', 'subdir');
131
+ mkdirSync(searchDir, { recursive: true });
132
+ const result = findProjectRoot(searchDir);
133
+ expect(result).toBeNull();
134
+ });
135
+ it('stops walking at the home directory', () => {
136
+ // The mocked homedir() returns a fake path outside tempDir.
137
+ // Create a fresh dir inside tempDir (no .productbrain/ present).
138
+ // findProjectRoot will walk up from it, never find .productbrain/,
139
+ // and eventually stop — returning null.
140
+ const deepDir = resolve(tempDir, 'deeply', 'nested', 'project');
141
+ mkdirSync(deepDir, { recursive: true });
142
+ const result = findProjectRoot(deepDir);
143
+ expect(result).toBeNull();
144
+ });
145
+ });
72
146
  describe('resolveConfig()', () => {
73
- it('returns project config.json values when env vars are absent', () => {
147
+ it('returns project config.local.json profile values when env vars absent', async () => {
148
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
149
+ resolveNamedProfileConfig.mockReturnValueOnce({
150
+ apiKey: 'pb_sk_local_profile_key',
151
+ siteUrl: 'https://local-profile.example.com',
152
+ });
153
+ const pbDir = resolve(tempDir, '.productbrain');
154
+ mkdirSync(pbDir, { recursive: true });
155
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'my-workspace' }));
156
+ const result = resolveConfig();
157
+ expect(result.apiKey).toBe('pb_sk_local_profile_key');
158
+ expect(result.siteUrl).toBe('https://local-profile.example.com');
159
+ expect(result.source).toBe('project');
160
+ });
161
+ it('config.local.json profile beats global profile', async () => {
162
+ const { resolveNamedProfileConfig, resolveProfileConfig } = await import('../lib/profiles.js');
163
+ resolveNamedProfileConfig.mockReturnValueOnce({
164
+ apiKey: 'pb_sk_local_profile_key',
165
+ siteUrl: 'https://local-profile.example.com',
166
+ });
167
+ resolveProfileConfig.mockReturnValueOnce({
168
+ apiKey: 'pb_sk_global_profile_key',
169
+ siteUrl: 'https://global-profile.example.com',
170
+ });
171
+ const pbDir = resolve(tempDir, '.productbrain');
172
+ mkdirSync(pbDir, { recursive: true });
173
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'local-workspace' }));
174
+ const result = resolveConfig();
175
+ expect(result.apiKey).toBe('pb_sk_local_profile_key');
176
+ expect(result.source).toBe('project');
177
+ });
178
+ it('FAILS CLOSED on a dangling repo-local pin — never silently falls through to the global active profile', async () => {
179
+ const { resolveNamedProfileConfig, resolveProfileConfig } = await import('../lib/profiles.js');
180
+ // Pin names a profile that no longer resolves (deleted, or never fully set up).
181
+ resolveNamedProfileConfig.mockReturnValue(null);
182
+ // A perfectly usable global profile is available — and must NOT be adopted.
183
+ resolveProfileConfig.mockReturnValue({
184
+ apiKey: 'pb_sk_global_profile_key',
185
+ siteUrl: 'https://global-profile.example.com',
186
+ });
187
+ const pbDir = resolve(tempDir, '.productbrain');
188
+ mkdirSync(pbDir, { recursive: true });
189
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'deleted-workspace' }));
190
+ expect(() => resolveConfig()).toThrow(/pinned to profile "deleted-workspace"/);
191
+ });
192
+ it('dangling repo-local pin throws AUTH_MISSING rather than returning a foreign credential', async () => {
193
+ const { resolveNamedProfileConfig, resolveProfileConfig } = await import('../lib/profiles.js');
194
+ // Pin resolves to a profile file that exists but carries no API key.
195
+ resolveNamedProfileConfig.mockReturnValue({
196
+ siteUrl: 'https://pinned.example.com',
197
+ });
198
+ resolveProfileConfig.mockReturnValue({
199
+ apiKey: 'pb_sk_global_profile_key',
200
+ siteUrl: 'https://global-profile.example.com',
201
+ });
202
+ const pbDir = resolve(tempDir, '.productbrain');
203
+ mkdirSync(pbDir, { recursive: true });
204
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'keyless-workspace' }));
205
+ let caught;
206
+ try {
207
+ resolveConfig();
208
+ }
209
+ catch (e) {
210
+ caught = e;
211
+ }
212
+ expect(caught?.code).toBe('AUTH_MISSING');
213
+ });
214
+ it('getConfig() refuses a dangling pin — the loadEnv() cascade must not adopt the global profile', async () => {
215
+ // This is the door ~98 command modules use, and it is a SEPARATE cascade from
216
+ // resolveConfig() — loadEnv() mutates process.env rather than returning a value.
217
+ const { resolveNamedProfileConfig, resolveProfileConfig } = await import('../lib/profiles.js');
218
+ resolveNamedProfileConfig.mockReturnValue(null);
219
+ resolveProfileConfig.mockReturnValue({
220
+ apiKey: 'pb_sk_global_profile_key',
221
+ siteUrl: 'https://global-profile.example.com',
222
+ });
223
+ const pbDir = resolve(tempDir, '.productbrain');
224
+ mkdirSync(pbDir, { recursive: true });
225
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'deleted-workspace' }));
226
+ expect(() => getConfig()).toThrow(/pinned to profile "deleted-workspace"/);
227
+ // The foreign credential must never become the live binding.
228
+ expect(process.env.PRODUCTBRAIN_API_KEY).toBeUndefined();
229
+ });
230
+ it('a pin whose profile has a malformed key is a broken pin, not a credential', async () => {
231
+ const { resolveNamedProfileConfig, resolveProfileConfig } = await import('../lib/profiles.js');
232
+ resolveNamedProfileConfig.mockReturnValue({
233
+ apiKey: 'not-a-pb-key',
234
+ siteUrl: 'https://pinned.example.com',
235
+ });
236
+ resolveProfileConfig.mockReturnValue({
237
+ apiKey: 'pb_sk_global_profile_key',
238
+ siteUrl: 'https://global-profile.example.com',
239
+ });
74
240
  const pbDir = resolve(tempDir, '.productbrain');
75
241
  mkdirSync(pbDir, { recursive: true });
76
- writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ apiKey: 'pb_sk_project_key', siteUrl: 'https://custom.example.com' }));
242
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'malformed-workspace' }));
243
+ // Names the pin, rather than deferring to a generic "no API key, run pb login".
244
+ expect(() => resolveConfig()).toThrow(/pinned to profile "malformed-workspace"/);
245
+ });
246
+ it('getConfigSafe() REPORTS a dangling pin instead of throwing — diagnostics must still render', async () => {
247
+ const { resolveNamedProfileConfig, resolveProfileConfig } = await import('../lib/profiles.js');
248
+ resolveNamedProfileConfig.mockReturnValue(null);
249
+ resolveProfileConfig.mockReturnValue({
250
+ apiKey: 'pb_sk_global_profile_key',
251
+ siteUrl: 'https://global-profile.example.com',
252
+ });
253
+ const pbDir = resolve(tempDir, '.productbrain');
254
+ mkdirSync(pbDir, { recursive: true });
255
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'deleted-workspace' }));
256
+ // `pb doctor` and the bare-`pb` dashboard go through here; they must diagnose, not die.
257
+ const result = getConfigSafe();
258
+ expect(result.ok).toBe(false);
259
+ expect(result.reason).toMatch(/pinned to profile "deleted-workspace"/);
260
+ });
261
+ it('a pin with no URL of its own goes to DEFAULT_SITE_URL, never config.json siteUrl (TEN-4500)', async () => {
262
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
263
+ resolveNamedProfileConfig.mockReturnValueOnce({
264
+ apiKey: 'pb_sk_pinned_key',
265
+ });
266
+ const pbDir = resolve(tempDir, '.productbrain');
267
+ mkdirSync(pbDir, { recursive: true });
268
+ writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'https://project-gateway.example.com' }));
269
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'product-brain' }));
77
270
  const result = resolveConfig();
78
- expect(result.apiKey).toBe('pb_sk_project_key');
79
- expect(result.siteUrl).toBe('https://custom.example.com');
271
+ expect(result.apiKey).toBe('pb_sk_pinned_key');
272
+ expect(result.siteUrl).toBe('https://gateway.productbrain.io');
273
+ expect(result.siteUrlSource).toBe('default');
80
274
  expect(result.source).toBe('project');
81
275
  });
82
- it('env vars override project config.json', () => {
276
+ it('env vars override project config.local.json', () => {
83
277
  process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_env_key';
84
278
  process.env.CONVEX_SITE_URL = 'https://env.example.com';
85
279
  const pbDir = resolve(tempDir, '.productbrain');
86
280
  mkdirSync(pbDir, { recursive: true });
87
- writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ apiKey: 'pb_sk_project_key', siteUrl: 'https://project.example.com' }));
281
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'some-workspace' }));
88
282
  const result = resolveConfig();
89
283
  expect(result.apiKey).toBe('pb_sk_env_key');
90
284
  expect(result.siteUrl).toBe('https://env.example.com');
@@ -96,14 +290,18 @@ describe('config resolution', () => {
96
290
  expect(result.siteUrl).toBe('https://gateway.productbrain.io');
97
291
  expect(result.source).toBe('default');
98
292
  });
99
- it('handles partial project config (only siteUrl, no apiKey)', () => {
293
+ it('ignores profile field in config.json (legacy migration) — not a pin, so the project has no tenant', () => {
294
+ const pbDir = resolve(tempDir, '.productbrain');
295
+ mkdirSync(pbDir, { recursive: true });
296
+ // Old config.json with profile field — must be ignored, not treated as a pin
297
+ writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'https://project.example.com', profile: 'should-be-ignored' }));
298
+ expect(() => resolveConfig()).toThrow(/no tenant pin/i);
299
+ });
300
+ it('a declared project with only siteUrl and no pin refuses rather than falling through', () => {
100
301
  const pbDir = resolve(tempDir, '.productbrain');
101
302
  mkdirSync(pbDir, { recursive: true });
102
303
  writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'https://partial.example.com' }));
103
- const result = resolveConfig();
104
- // No apiKey in project config, so it should fall through to default
105
- expect(result.apiKey).toBeUndefined();
106
- expect(result.source).toBe('default');
304
+ expect(() => resolveConfig()).toThrow(/no tenant pin/i);
107
305
  });
108
306
  });
109
307
  describe('getConfigSafe()', () => {
@@ -115,6 +313,211 @@ describe('config resolution', () => {
115
313
  expect(result.reason).toContain('No API key');
116
314
  }
117
315
  });
316
+ it('names the FILE, not CONVEX_SITE_URL, when a file supplied the non-HTTPS URL', () => {
317
+ // A file-sourced siteUrl outranks CONVEX_SITE_URL everywhere except an env-key override, so
318
+ // "set CONVEX_SITE_URL" would send the operator back through the same failure.
319
+ process.env.CONVEX_SITE_URL = 'https://this-would-never-win.example.com';
320
+ const pbDir = resolve(tempDir, '.productbrain');
321
+ mkdirSync(pbDir, { recursive: true });
322
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
323
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
324
+ siteUrl: 'http://insecure.example.com',
325
+ preview: true,
326
+ }));
327
+ resetConfigCache();
328
+ const result = getConfigSafe();
329
+ expect(result.ok).toBe(false);
330
+ if (!result.ok) {
331
+ expect(result.kind).toBe('invalid-url');
332
+ expect(result.reason).toMatch(/must use HTTPS/i);
333
+ // The binding supplies its own URL, so the repair is that file alone — naming a profile
334
+ // it may also pin would point at something that does not control this URL.
335
+ expect(result.guidance).toContain('.productbrain/config.local.json');
336
+ expect(result.guidance).not.toMatch(/profile/i);
337
+ expect(result.guidance).not.toMatch(/CONVEX_SITE_URL/);
338
+ }
339
+ });
340
+ it('names CONVEX_SITE_URL when the environment did supply the non-HTTPS URL', () => {
341
+ process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_env_key';
342
+ process.env.CONVEX_SITE_URL = 'http://insecure.example.com';
343
+ resetConfigCache();
344
+ const result = getConfigSafe();
345
+ expect(result.ok).toBe(false);
346
+ if (!result.ok) {
347
+ expect(result.kind).toBe('invalid-url');
348
+ expect(result.guidance).toContain('CONVEX_SITE_URL');
349
+ }
350
+ });
351
+ // ── The URL's origin is NOT the credential's origin ────────────────────────────────────
352
+ //
353
+ // A key travels only with the URL beside it (TEN-4500), so the repair names that source —
354
+ // never config.json, whose siteUrl no longer routes any key, and never a sibling file that
355
+ // happens to sit in the same directory.
356
+ it('a non-HTTPS config.json siteUrl never reaches a pinned key (TEN-4500)', async () => {
357
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
358
+ resolveNamedProfileConfig.mockReturnValue({
359
+ apiKey: 'pb_sk_pinned_key',
360
+ });
361
+ const pbDir = resolve(tempDir, '.productbrain');
362
+ mkdirSync(pbDir, { recursive: true });
363
+ writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'http://insecure.example.com' }));
364
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'product-brain' }));
365
+ resetConfigCache();
366
+ const result = getConfigSafe();
367
+ expect(result.ok).toBe(true);
368
+ if (result.ok)
369
+ expect(result.siteUrl).toBe('https://gateway.productbrain.io');
370
+ });
371
+ it('names the pin — not config.json or a CWD .env — when the pinned profile supplied the URL', async () => {
372
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
373
+ resolveNamedProfileConfig.mockReturnValue({
374
+ apiKey: 'pb_sk_pinned_key',
375
+ siteUrl: 'http://pin.example.com',
376
+ });
377
+ const pbDir = resolve(tempDir, '.productbrain');
378
+ mkdirSync(pbDir, { recursive: true });
379
+ writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'http://insecure.example.com' }));
380
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'product-brain' }));
381
+ writeFileSync(resolve(tempDir, '.env'), 'PRODUCTBRAIN_API_KEY=pb_sk_cwd_key\nCONVEX_SITE_URL=https://cwd-would-have-been-fine.example.com\n');
382
+ resetConfigCache();
383
+ const result = getConfigSafe();
384
+ expect(result.ok).toBe(false);
385
+ if (!result.ok) {
386
+ expect(result.kind).toBe('invalid-url');
387
+ expect(result.reason).toContain('http://pin.example.com');
388
+ expect(result.guidance).toContain('pinned by .productbrain/config.local.json');
389
+ expect(result.guidance).not.toContain('.productbrain/config.json');
390
+ expect(result.guidance).not.toMatch(/\.env file/);
391
+ }
392
+ });
393
+ it('names the profile the repo pin points at, not just "the profile it pins"', async () => {
394
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
395
+ resolveNamedProfileConfig.mockReturnValue({
396
+ apiKey: 'pb_sk_pinned_key_0123456789',
397
+ siteUrl: 'http://insecure.example.com',
398
+ });
399
+ const pbDir = resolve(tempDir, '.productbrain');
400
+ mkdirSync(pbDir, { recursive: true });
401
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'pinned-workspace' }));
402
+ resetConfigCache();
403
+ const result = getConfigSafe();
404
+ expect(result.ok).toBe(false);
405
+ if (!result.ok) {
406
+ expect(result.kind).toBe('invalid-url');
407
+ expect(result.guidance).toContain('pinned-workspace');
408
+ }
409
+ });
410
+ it('names the CWD env file that actually won, not the generic .env', () => {
411
+ // CWD_ENV_PATHS scans .env.mcp first, so a generic "the .env file" label would send the
412
+ // operator to edit a file the cascade never read.
413
+ writeFileSync(resolve(tempDir, '.env.mcp'), 'PRODUCTBRAIN_API_KEY=pb_sk_cwd_key\nCONVEX_SITE_URL=http://insecure.example.com\n');
414
+ resetConfigCache();
415
+ const result = getConfigSafe();
416
+ expect(result.ok).toBe(false);
417
+ if (!result.ok) {
418
+ expect(result.kind).toBe('invalid-url');
419
+ expect(result.guidance).toContain('.env.mcp');
420
+ }
421
+ });
422
+ it('tells the operator to unset PRODUCTBRAIN_API_KEY — not to run pb login — for a bad exported key', () => {
423
+ // An exported key wins step 1 of the cascade, and `pb login` writes to a profile or the
424
+ // legacy home file — both of which lose to it. "Run pb login" would loop forever.
425
+ process.env.PRODUCTBRAIN_API_KEY = 'bad_prefix_key';
426
+ resetConfigCache();
427
+ const result = getConfigSafe();
428
+ expect(result.ok).toBe(false);
429
+ if (!result.ok) {
430
+ expect(result.kind).toBe('invalid-key');
431
+ expect(result.guidance).toMatch(/Unset PRODUCTBRAIN_API_KEY|replace it/);
432
+ // `pb login` may only be named to explain why it cannot help — never as the instruction.
433
+ expect(result.guidance).not.toMatch(/Run `pb login`/);
434
+ expect(result.guidance).toMatch(/cannot repair/);
435
+ expect(result.nextCommand).not.toBe('pb login');
436
+ }
437
+ });
438
+ it('still points a stored malformed key at pb login — login CAN repair that one', async () => {
439
+ const { resolveProfileConfig } = await import('../lib/profiles.js');
440
+ resolveProfileConfig.mockReturnValue({
441
+ apiKey: 'bad_prefix_key',
442
+ siteUrl: 'https://profile.example.com',
443
+ });
444
+ resetConfigCache();
445
+ const result = getConfigSafe();
446
+ expect(result.ok).toBe(false);
447
+ if (!result.ok) {
448
+ expect(result.kind).toBe('invalid-key');
449
+ expect(result.guidance).toMatch(/pb login/);
450
+ expect(result.nextCommand).toBe('pb login');
451
+ }
452
+ });
453
+ // ── Which profile actually supplied it ──────────────────────────────────────────────────
454
+ //
455
+ // resolveProfileConfig() reaches a credential four ways — PB_PROFILE, the active-profile
456
+ // marker, a `default` fallback, and the legacy ~/.config/productbrain/.env — and reports the
457
+ // winner's name. A fixed "the active profile" label sends the operator to edit a profile that
458
+ // supplied nothing, so the same failure comes straight back.
459
+ it('names the PB_PROFILE-selected profile, not "the active profile", for its non-HTTPS URL', async () => {
460
+ const { resolveProfileConfig, getGlobalActiveProfile } = await import('../lib/profiles.js');
461
+ // A DIFFERENT profile is globally active. PB_PROFILE outranks it in profiles.ts, which
462
+ // returns the selected name alongside the credential (profiles.ts resolveProfileConfig 1).
463
+ getGlobalActiveProfile.mockReturnValue('main-workspace');
464
+ process.env.PB_PROFILE = 'preview-workspace';
465
+ resolveProfileConfig.mockReturnValue({
466
+ apiKey: 'pb_sk_selected_profile_key',
467
+ siteUrl: 'http://insecure.example.com',
468
+ profileName: 'preview-workspace',
469
+ });
470
+ resetConfigCache();
471
+ const result = getConfigSafe();
472
+ expect(result.ok).toBe(false);
473
+ if (!result.ok) {
474
+ expect(result.kind).toBe('invalid-url');
475
+ expect(result.guidance).toContain('the profile "preview-workspace"');
476
+ expect(result.guidance).not.toContain('the active profile');
477
+ // The globally active profile did not supply this URL and must not be named.
478
+ expect(result.guidance).not.toContain('main-workspace');
479
+ }
480
+ });
481
+ it('names the `default` fallback profile for a malformed stored key', async () => {
482
+ const { resolveProfileConfig } = await import('../lib/profiles.js');
483
+ // No PB_PROFILE and no active-profile marker: profiles.ts falls back to `default`, which is
484
+ // a real file the operator can open — "the active profile" is not.
485
+ resolveProfileConfig.mockReturnValue({
486
+ apiKey: 'bad_prefix_key',
487
+ siteUrl: 'https://profile.example.com',
488
+ profileName: 'default',
489
+ });
490
+ resetConfigCache();
491
+ const result = getConfigSafe();
492
+ expect(result.ok).toBe(false);
493
+ if (!result.ok) {
494
+ expect(result.kind).toBe('invalid-key');
495
+ expect(result.reason).toContain('the profile "default"');
496
+ expect(result.reason).not.toContain('the active profile');
497
+ }
498
+ });
499
+ it('does NOT call the legacy home config "the active profile" — it is not a named profile', async () => {
500
+ // resolveConfig() step 4 labels the legacy ~/.config/productbrain/.env `profile`, but it
501
+ // carries no profile name at all, so naming a profile there would be a fabrication.
502
+ const { HOME_ENV_PATH } = await import('../lib/config.js');
503
+ mkdirSync(dirname(HOME_ENV_PATH), { recursive: true });
504
+ writeFileSync(HOME_ENV_PATH, 'PRODUCTBRAIN_API_KEY=bad_prefix_key\n');
505
+ try {
506
+ resetConfigCache();
507
+ const result = getConfigSafe();
508
+ expect(result.ok).toBe(false);
509
+ if (!result.ok) {
510
+ expect(result.kind).toBe('invalid-key');
511
+ expect(result.reason).not.toContain('the active profile');
512
+ expect(result.reason).toContain('the stored profile configuration');
513
+ }
514
+ }
515
+ finally {
516
+ // The fake home is shared by every test in this file; a stray legacy .env would supply a
517
+ // credential to the cases that assert none is found.
518
+ rmSync(HOME_ENV_PATH, { force: true });
519
+ }
520
+ });
118
521
  it('returns { ok: true } with correct source when key exists in env', () => {
119
522
  process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_test_key';
120
523
  process.env.CONVEX_SITE_URL = 'https://test.example.com';
@@ -127,10 +530,15 @@ describe('config resolution', () => {
127
530
  expect(result.source).toBe('env');
128
531
  }
129
532
  });
130
- it('returns { ok: true } with project source when key in config.json', () => {
533
+ it('returns { ok: true } with project source when key in config.local.json profile', async () => {
534
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
535
+ resolveNamedProfileConfig.mockReturnValueOnce({
536
+ apiKey: 'pb_sk_proj_safe',
537
+ siteUrl: 'https://proj.example.com',
538
+ });
131
539
  const pbDir = resolve(tempDir, '.productbrain');
132
540
  mkdirSync(pbDir, { recursive: true });
133
- writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ apiKey: 'pb_sk_proj_safe', siteUrl: 'https://proj.example.com' }));
541
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'test-workspace' }));
134
542
  resetConfigCache();
135
543
  const result = getConfigSafe();
136
544
  expect(result.ok).toBe(true);
@@ -139,16 +547,51 @@ describe('config resolution', () => {
139
547
  expect(result.source).toBe('project');
140
548
  }
141
549
  });
550
+ it('SF-3: preview binding overrides a stale CONVEX_SITE_URL exported in the shell', () => {
551
+ // Real-dev URL exported but no PRODUCTBRAIN_API_KEY — the realistic dogfood shell.
552
+ process.env.CONVEX_SITE_URL = 'https://trustworthy-kangaroo-277.convex.site';
553
+ const pbDir = resolve(tempDir, '.productbrain');
554
+ mkdirSync(pbDir, { recursive: true });
555
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
556
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
557
+ siteUrl: 'https://my-preview.convex.site',
558
+ preview: true,
559
+ workspaceName: 'Preview Workspace',
560
+ }));
561
+ resetConfigCache();
562
+ const result = getConfigSafe();
563
+ // Preview key must NEVER be paired with the stale real-dev URL — that would
564
+ // route a preview credential to a non-preview gateway (STD-261).
565
+ expect(result.ok).toBe(true);
566
+ if (result.ok) {
567
+ expect(result.apiKey).toBe('pb_sk_preview_key_0123456789abcdef');
568
+ expect(result.siteUrl).toBe('https://my-preview.convex.site');
569
+ }
570
+ });
142
571
  });
143
572
  describe('.productbrain/config.json error handling', () => {
144
- it('warns but does not crash on invalid JSON', () => {
573
+ it('warns on invalid JSON, and still refuses — a damaged declaration is not an escape hatch', () => {
145
574
  const pbDir = resolve(tempDir, '.productbrain');
146
575
  mkdirSync(pbDir, { recursive: true });
147
576
  writeFileSync(resolve(pbDir, 'config.json'), '{ invalid json!!!');
577
+ // The file is unreadable but PRESENT, so the repo has still declared itself a project.
578
+ // Falling through here would hand the global profile a workspace precisely when the
579
+ // committed declaration is corrupt — the wrong-tenant substitution WP-694 S2 closes.
580
+ //
581
+ // No stderr assertion: the refusal is reached on the file's EXISTENCE, so nothing parses
582
+ // config.json on this path and the "invalid JSON" warning never fires. Refusing outright
583
+ // supersedes warning-then-using-someone-else's-workspace. The sibling test below still
584
+ // covers the warn-and-continue path for a malformed config.local.json.
585
+ expect(() => resolveConfig()).toThrow(/no tenant pin/i);
586
+ });
587
+ it('warns but does not crash on invalid config.local.json', () => {
588
+ const pbDir = resolve(tempDir, '.productbrain');
589
+ mkdirSync(pbDir, { recursive: true });
590
+ writeFileSync(resolve(pbDir, 'config.local.json'), '{ invalid json!!!');
148
591
  // Capture stderr
149
592
  const stderrWrite = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
150
593
  const result = resolveConfig();
151
- // Should have warned
594
+ // Should have warned about config.local.json
152
595
  expect(stderrWrite).toHaveBeenCalledWith(expect.stringContaining('invalid JSON'));
153
596
  // Should fall through to default
154
597
  expect(result.apiKey).toBeUndefined();
@@ -162,5 +605,481 @@ describe('config resolution', () => {
162
605
  expect(result.source).toBe('default');
163
606
  });
164
607
  });
608
+ describe('directory walking', () => {
609
+ it('resolveConfig reads config.local.json from a parent directory', async () => {
610
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
611
+ resolveNamedProfileConfig.mockReturnValueOnce({
612
+ apiKey: 'pb_sk_parent_key',
613
+ siteUrl: 'https://parent.example.com',
614
+ });
615
+ // Create .productbrain in tempDir
616
+ const pbDir = resolve(tempDir, '.productbrain');
617
+ mkdirSync(pbDir, { recursive: true });
618
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'parent-workspace' }));
619
+ // Set CWD to a subdirectory
620
+ const subDir = resolve(tempDir, 'src', 'lib');
621
+ mkdirSync(subDir, { recursive: true });
622
+ process.cwd = () => subDir;
623
+ const result = resolveConfig();
624
+ expect(result.apiKey).toBe('pb_sk_parent_key');
625
+ expect(result.source).toBe('project');
626
+ });
627
+ });
628
+ describe('setLocalProfilePin', () => {
629
+ it('creates config.local.json with the profile pin', async () => {
630
+ const { setLocalProfilePin, readLocalProjectConfig } = await import('../lib/config.js');
631
+ mkdirSync(resolve(tempDir, '.productbrain'), { recursive: true });
632
+ setLocalProfilePin(tempDir, 'preview-ws');
633
+ expect(readLocalProjectConfig()?.profile).toBe('preview-ws');
634
+ });
635
+ it('preserves sibling keys when updating the pin', async () => {
636
+ const { setLocalProfilePin } = await import('../lib/config.js');
637
+ const pbDir = resolve(tempDir, '.productbrain');
638
+ mkdirSync(pbDir, { recursive: true });
639
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'old', somethingElse: 1 }));
640
+ setLocalProfilePin(tempDir, 'new');
641
+ const parsed = JSON.parse(readFileSync(resolve(pbDir, 'config.local.json'), 'utf8'));
642
+ expect(parsed).toEqual({ profile: 'new', somethingElse: 1 });
643
+ });
644
+ it('overwrites corrupt JSON and writes only the new pin', async () => {
645
+ const { setLocalProfilePin } = await import('../lib/config.js');
646
+ const pbDir = resolve(tempDir, '.productbrain');
647
+ mkdirSync(pbDir, { recursive: true });
648
+ writeFileSync(resolve(pbDir, 'config.local.json'), '{ this is not valid json!!!');
649
+ setLocalProfilePin(tempDir, 'new');
650
+ const parsed = JSON.parse(readFileSync(resolve(pbDir, 'config.local.json'), 'utf8'));
651
+ expect(parsed).toEqual({ profile: 'new' });
652
+ });
653
+ });
654
+ describe('resolveEffectiveProfile', () => {
655
+ it('returns env source when PB_PROFILE is set', async () => {
656
+ process.env.PB_PROFILE = 'from-env';
657
+ const { resolveEffectiveProfile } = await import('../lib/config.js');
658
+ expect(resolveEffectiveProfile()).toEqual({ profile: 'from-env', source: 'env' });
659
+ });
660
+ it('returns local source when a repo pin exists', async () => {
661
+ const pbDir = resolve(tempDir, '.productbrain');
662
+ mkdirSync(pbDir, { recursive: true });
663
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'repo-pin' }));
664
+ const { resolveEffectiveProfile } = await import('../lib/config.js');
665
+ expect(resolveEffectiveProfile()).toEqual({ profile: 'repo-pin', source: 'local' });
666
+ });
667
+ // The pin's key is bound by resolveConfig() step 2b / loadEnv() step 1b before the profile
668
+ // system reads PB_PROFILE, so the env name never supplies the credential here. Reporting it
669
+ // would label every identity surface with a workspace the CLI is not operating against.
670
+ it('prefers the repo pin over PB_PROFILE, matching which profile supplies the credential', async () => {
671
+ process.env.PB_PROFILE = 'from-env';
672
+ const pbDir = resolve(tempDir, '.productbrain');
673
+ mkdirSync(pbDir, { recursive: true });
674
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'repo-pin' }));
675
+ const { resolveEffectiveProfile } = await import('../lib/config.js');
676
+ expect(resolveEffectiveProfile()).toEqual({ profile: 'repo-pin', source: 'local' });
677
+ });
678
+ it('returns global source from the active-profile file when no local pin', async () => {
679
+ const profiles = await import('../lib/profiles.js');
680
+ profiles.getGlobalActiveProfile.mockReturnValue('global-ws');
681
+ const { resolveEffectiveProfile } = await import('../lib/config.js');
682
+ expect(resolveEffectiveProfile()).toEqual({ profile: 'global-ws', source: 'global' });
683
+ });
684
+ it('returns none when nothing is configured', async () => {
685
+ const { resolveEffectiveProfile } = await import('../lib/config.js');
686
+ expect(resolveEffectiveProfile()).toEqual({ profile: null, source: 'none' });
687
+ });
688
+ it('returns default source when no env/local/global but default profile resolves', async () => {
689
+ // No PB_PROFILE env var (cleared by beforeEach)
690
+ // No config.local.json in tempDir (tempDir is fresh per beforeEach)
691
+ const profiles = await import('../lib/profiles.js');
692
+ profiles.getGlobalActiveProfile.mockReturnValue(null);
693
+ profiles.resolveNamedProfileConfig.mockReturnValue({ apiKey: 'pb_live_x' });
694
+ const { resolveEffectiveProfile } = await import('../lib/config.js');
695
+ expect(resolveEffectiveProfile()).toEqual({ profile: 'default', source: 'default' });
696
+ });
697
+ });
698
+ // ─── Preview binding (Slice B) ───────────────────────────────────────────────
699
+ describe('resolveConfig() — direct preview binding in config.local.json', () => {
700
+ it('returns preview key + siteUrl when config.local.json has a direct apiKey', () => {
701
+ const pbDir = resolve(tempDir, '.productbrain');
702
+ mkdirSync(pbDir, { recursive: true });
703
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
704
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
705
+ siteUrl: 'https://my-preview.convex.site',
706
+ preview: true,
707
+ workspaceName: 'Preview Workspace',
708
+ }));
709
+ resetConfigCache();
710
+ const result = resolveConfig();
711
+ expect(result.apiKey).toBe('pb_sk_preview_key_0123456789abcdef');
712
+ expect(result.siteUrl).toBe('https://my-preview.convex.site');
713
+ expect(result.source).toBe('project');
714
+ });
715
+ it('env var still wins over direct preview binding', () => {
716
+ process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_env_override';
717
+ process.env.CONVEX_SITE_URL = 'https://env.example.com';
718
+ const pbDir = resolve(tempDir, '.productbrain');
719
+ mkdirSync(pbDir, { recursive: true });
720
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
721
+ apiKey: 'pb_sk_preview_key_should_be_ignored',
722
+ siteUrl: 'https://my-preview.convex.site',
723
+ preview: true,
724
+ }));
725
+ resetConfigCache();
726
+ const result = resolveConfig();
727
+ expect(result.apiKey).toBe('pb_sk_env_override');
728
+ expect(result.siteUrl).toBe('https://env.example.com');
729
+ expect(result.source).toBe('env');
730
+ });
731
+ it('profile pin still works when no direct apiKey present', async () => {
732
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
733
+ resolveNamedProfileConfig.mockReturnValueOnce({
734
+ apiKey: 'pb_sk_profile_key',
735
+ siteUrl: 'https://profile.example.com',
736
+ });
737
+ const pbDir = resolve(tempDir, '.productbrain');
738
+ mkdirSync(pbDir, { recursive: true });
739
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'my-workspace' }));
740
+ resetConfigCache();
741
+ const result = resolveConfig();
742
+ expect(result.apiKey).toBe('pb_sk_profile_key');
743
+ expect(result.source).toBe('project');
744
+ });
745
+ it('rejects a preview binding whose apiKey does not start with API_KEY_PREFIX', () => {
746
+ const pbDir = resolve(tempDir, '.productbrain');
747
+ mkdirSync(pbDir, { recursive: true });
748
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
749
+ apiKey: 'sk_bad_prefix_key',
750
+ siteUrl: 'https://my-preview.convex.site',
751
+ preview: true,
752
+ }));
753
+ resetConfigCache();
754
+ // A present-but-malformed key is unusable, not absent — the refusal must say so, or the
755
+ // operator goes looking for a key that is sitting right there in the file.
756
+ expect(() => resolveConfig()).toThrow(/incomplete preview binding.*not a valid pb_sk_ key/i);
757
+ });
758
+ it('SF-3: does NOT bind a preview apiKey that has no siteUrl (never borrows config.json gateway)', () => {
759
+ const pbDir = resolve(tempDir, '.productbrain');
760
+ mkdirSync(pbDir, { recursive: true });
761
+ // Committed config.json pins the real-dev gateway.
762
+ writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'https://trustworthy-kangaroo-277.convex.site' }));
763
+ // Preview key present but its OWN siteUrl is absent (hand-edit / partial preview.json).
764
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ apiKey: 'pb_sk_preview_key_0123456789abcdef', preview: true }));
765
+ resetConfigCache();
766
+ // The preview key must NOT be bound or allowed to fall through. Pairing it with
767
+ // config.json's real-dev gateway would send a preview credential to the wrong deployment.
768
+ expect(() => resolveConfig()).toThrow(/incomplete preview binding.*missing deployment URL/i);
769
+ });
770
+ it('S5: an incomplete preview binding is diagnosed before a sibling profile pin', async () => {
771
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
772
+ resolveNamedProfileConfig.mockReturnValue(null);
773
+ const pbDir = resolve(tempDir, '.productbrain');
774
+ mkdirSync(pbDir, { recursive: true });
775
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
776
+ profile: 'repo-pin',
777
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
778
+ preview: true,
779
+ workspaceName: 'Preview Workspace',
780
+ }));
781
+ resetConfigCache();
782
+ expect(() => resolveConfig()).toThrow(/incomplete preview binding.*missing deployment URL/i);
783
+ expect(() => getConfig()).toThrow(/incomplete preview binding.*missing deployment URL/i);
784
+ });
785
+ // ── Marker-less bindings: the claim is the credential, not the `preview` stamp ──────────
786
+ //
787
+ // A config.local.json carrying an apiKey is asserting which workspace this repo talks to
788
+ // whether or not `pb:preview` stamped `preview: true` — a hand-written or partially-scrubbed
789
+ // file is exactly the case that must not be skipped.
790
+ it('binds a marker-less apiKey + siteUrl pair and does NOT defer to a sibling profile pin', async () => {
791
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
792
+ // A perfectly resolvable pin sits in the same file — it names a DIFFERENT tenant, so
793
+ // adopting it would silently retarget every read and write.
794
+ resolveNamedProfileConfig.mockReturnValue({
795
+ apiKey: 'pb_sk_sibling_pin_key',
796
+ siteUrl: 'https://sibling-pin.example.com',
797
+ });
798
+ const pbDir = resolve(tempDir, '.productbrain');
799
+ mkdirSync(pbDir, { recursive: true });
800
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
801
+ profile: 'sibling-pin',
802
+ apiKey: 'pb_sk_markerless_key_0123456789',
803
+ siteUrl: 'https://markerless.convex.site',
804
+ // no `preview: true` marker
805
+ }));
806
+ resetConfigCache();
807
+ const result = resolveConfig();
808
+ expect(result.apiKey).toBe('pb_sk_markerless_key_0123456789');
809
+ expect(result.siteUrl).toBe('https://markerless.convex.site');
810
+ expect(result.source).toBe('project');
811
+ });
812
+ it('refuses a marker-less apiKey with no siteUrl instead of resolving to the default gateway', () => {
813
+ const pbDir = resolve(tempDir, '.productbrain');
814
+ mkdirSync(pbDir, { recursive: true });
815
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ apiKey: 'pb_sk_markerless_key_0123456789' }));
816
+ resetConfigCache();
817
+ // Silently falling through would send this credential to the production gateway (STD-261).
818
+ expect(() => resolveConfig()).toThrow(/incomplete preview binding.*missing deployment URL/i);
819
+ });
820
+ it('S5: the marker-less refusal also holds through the loadEnv() cascade', () => {
821
+ const pbDir = resolve(tempDir, '.productbrain');
822
+ mkdirSync(pbDir, { recursive: true });
823
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ apiKey: 'pb_sk_markerless_key_0123456789' }));
824
+ resetConfigCache();
825
+ expect(() => getConfig()).toThrow(/incomplete preview binding.*missing deployment URL/i);
826
+ // The refusal must not leave a half-bound credential behind for the next caller.
827
+ expect(process.env.PRODUCTBRAIN_API_KEY).toBeUndefined();
828
+ });
829
+ // A present-but-non-string apiKey is a corrupt or hand-written binding, not an absent one.
830
+ // Treating it as absent would let the sibling profile pin supply a DIFFERENT tenant's
831
+ // credential — the workspace substitution this path exists to prevent.
832
+ it.each([
833
+ ['a number', 12345],
834
+ ['an empty string', ''],
835
+ ['a boolean', true],
836
+ ['an object', { key: 'pb_sk_nested' }],
837
+ ])('refuses a marker-less binding whose apiKey is %s, rather than adopting the sibling pin', async (_label, apiKey) => {
838
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
839
+ // A perfectly resolvable pin naming a DIFFERENT tenant sits in the same file.
840
+ resolveNamedProfileConfig.mockReturnValue({
841
+ apiKey: 'pb_sk_sibling_pin_key',
842
+ siteUrl: 'https://sibling-pin.example.com',
843
+ });
844
+ const pbDir = resolve(tempDir, '.productbrain');
845
+ mkdirSync(pbDir, { recursive: true });
846
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'sibling-pin', apiKey, siteUrl: 'https://markerless.convex.site' }));
847
+ resetConfigCache();
848
+ expect(() => resolveConfig()).toThrow(/not a valid pb_sk_ key/i);
849
+ });
850
+ it('treats an explicitly null apiKey as absent — JSON null means "no value"', async () => {
851
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
852
+ resolveNamedProfileConfig.mockReturnValue({
853
+ apiKey: 'pb_sk_pin_key',
854
+ siteUrl: 'https://pinned.example.com',
855
+ });
856
+ const pbDir = resolve(tempDir, '.productbrain');
857
+ mkdirSync(pbDir, { recursive: true });
858
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'pinned-workspace', apiKey: null }));
859
+ resetConfigCache();
860
+ const result = resolveConfig();
861
+ expect(result.apiKey).toBe('pb_sk_pin_key');
862
+ expect(result.source).toBe('project');
863
+ });
864
+ it('leaves the ordinary pin-only path untouched — the widened claim test must not swallow it', async () => {
865
+ const { resolveNamedProfileConfig } = await import('../lib/profiles.js');
866
+ resolveNamedProfileConfig.mockReturnValue({
867
+ apiKey: 'pb_sk_pin_only_key',
868
+ siteUrl: 'https://pinned-profile.example.com',
869
+ });
870
+ const pbDir = resolve(tempDir, '.productbrain');
871
+ mkdirSync(pbDir, { recursive: true });
872
+ // Committed config.json + a pin whose profile stores its own URL: the pin path's normal
873
+ // shape (pb connect writes the URL into the profile). config.json's siteUrl routes nothing.
874
+ writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'https://project-gateway.example.com' }));
875
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'pin-only-workspace' }));
876
+ resetConfigCache();
877
+ const result = resolveConfig();
878
+ expect(result.apiKey).toBe('pb_sk_pin_only_key');
879
+ expect(result.siteUrl).toBe('https://pinned-profile.example.com');
880
+ expect(result.source).toBe('project');
881
+ });
882
+ });
883
+ describe('readLocalProjectConfig() — apiKey validity', () => {
884
+ it('withholds a malformed apiKey and flags it so diagnostics can name the fault', async () => {
885
+ const pbDir = resolve(tempDir, '.productbrain');
886
+ mkdirSync(pbDir, { recursive: true });
887
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ apiKey: 'sk_bad_prefix_key', siteUrl: 'https://my-preview.convex.site' }));
888
+ const { readLocalProjectConfig } = await import('../lib/config.js');
889
+ const local = readLocalProjectConfig();
890
+ // Withheld from `apiKey` so it can never bind, but not reported as absent either.
891
+ expect(local?.apiKey).toBeUndefined();
892
+ expect(local?.apiKeyMalformed).toBe(true);
893
+ });
894
+ it('loads a valid apiKey with no malformed flag', async () => {
895
+ const pbDir = resolve(tempDir, '.productbrain');
896
+ mkdirSync(pbDir, { recursive: true });
897
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
898
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
899
+ siteUrl: 'https://my-preview.convex.site',
900
+ }));
901
+ const { readLocalProjectConfig } = await import('../lib/config.js');
902
+ const local = readLocalProjectConfig();
903
+ expect(local?.apiKey).toBe('pb_sk_preview_key_0123456789abcdef');
904
+ expect(local?.apiKeyMalformed).toBeUndefined();
905
+ });
906
+ });
907
+ describe('getPreviewBinding()', () => {
908
+ it('returns null when no config.local.json exists', async () => {
909
+ const { getPreviewBinding } = await import('../lib/config.js');
910
+ const result = getPreviewBinding();
911
+ expect(result).toBeNull();
912
+ });
913
+ it('returns null when config.local.json has no preview flag', async () => {
914
+ const pbDir = resolve(tempDir, '.productbrain');
915
+ mkdirSync(pbDir, { recursive: true });
916
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'some-workspace' }));
917
+ const { getPreviewBinding } = await import('../lib/config.js');
918
+ expect(getPreviewBinding()).toBeNull();
919
+ });
920
+ it('returns { workspaceName } when preview:true is set', async () => {
921
+ const pbDir = resolve(tempDir, '.productbrain');
922
+ mkdirSync(pbDir, { recursive: true });
923
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
924
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
925
+ siteUrl: 'https://my-preview.convex.site',
926
+ preview: true,
927
+ workspaceName: 'Preview Workspace',
928
+ }));
929
+ const { getPreviewBinding } = await import('../lib/config.js');
930
+ const result = getPreviewBinding();
931
+ expect(result).not.toBeNull();
932
+ expect(result?.workspaceName).toBe('Preview Workspace');
933
+ });
934
+ it('returns { workspaceName: null } when preview:true but no workspaceName', async () => {
935
+ const pbDir = resolve(tempDir, '.productbrain');
936
+ mkdirSync(pbDir, { recursive: true });
937
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
938
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
939
+ siteUrl: 'https://my-preview.convex.site',
940
+ preview: true,
941
+ }));
942
+ const { getPreviewBinding } = await import('../lib/config.js');
943
+ const result = getPreviewBinding();
944
+ expect(result).not.toBeNull();
945
+ expect(result?.workspaceName).toBeNull();
946
+ });
947
+ it('returns null when preview:true but no apiKey (SF-3 mirror)', async () => {
948
+ const pbDir = resolve(tempDir, '.productbrain');
949
+ mkdirSync(pbDir, { recursive: true });
950
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
951
+ siteUrl: 'https://my-preview.convex.site',
952
+ preview: true,
953
+ workspaceName: 'Preview Workspace',
954
+ }));
955
+ const { getPreviewBinding } = await import('../lib/config.js');
956
+ expect(getPreviewBinding()).toBeNull();
957
+ });
958
+ it('returns null when preview:true but no siteUrl (SF-3 mirror)', async () => {
959
+ const pbDir = resolve(tempDir, '.productbrain');
960
+ mkdirSync(pbDir, { recursive: true });
961
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
962
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
963
+ preview: true,
964
+ workspaceName: 'Preview Workspace',
965
+ }));
966
+ const { getPreviewBinding } = await import('../lib/config.js');
967
+ expect(getPreviewBinding()).toBeNull();
968
+ });
969
+ it('returns null when PRODUCTBRAIN_API_KEY env var overrides preview binding', async () => {
970
+ const pbDir = resolve(tempDir, '.productbrain');
971
+ mkdirSync(pbDir, { recursive: true });
972
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({
973
+ apiKey: 'pb_sk_preview_key_0123456789abcdef',
974
+ siteUrl: 'https://my-preview.convex.site',
975
+ preview: true,
976
+ workspaceName: 'Preview Workspace',
977
+ }));
978
+ process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_real_chain_key';
979
+ const { getPreviewBinding } = await import('../lib/config.js');
980
+ expect(getPreviewBinding()).toBeNull();
981
+ });
982
+ it('returns null when config.local.json has invalid JSON (never throws)', async () => {
983
+ const pbDir = resolve(tempDir, '.productbrain');
984
+ mkdirSync(pbDir, { recursive: true });
985
+ writeFileSync(resolve(pbDir, 'config.local.json'), '{ this is not valid json');
986
+ const stderrWrite = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
987
+ const { getPreviewBinding } = await import('../lib/config.js');
988
+ expect(() => getPreviewBinding()).not.toThrow();
989
+ expect(getPreviewBinding()).toBeNull();
990
+ stderrWrite.mockRestore();
991
+ });
992
+ });
993
+ // ── TEN-4500 / TASK-640: a key travels only with the site URL stored or exported beside it ──
994
+ //
995
+ // `.productbrain/config.json` is committed, so a cloned repo controls its siteUrl. A key from
996
+ // anywhere else must never be sent there: with no URL of its own it goes to DEFAULT_SITE_URL.
997
+ describe('a key travels only with its own site URL (TEN-4500)', () => {
998
+ const DEFAULT = 'https://gateway.productbrain.io';
999
+ const COMMITTED = 'https://cloned-repo.example.com';
1000
+ function commitProjectSiteUrl() {
1001
+ const pbDir = resolve(tempDir, '.productbrain');
1002
+ mkdirSync(pbDir, { recursive: true });
1003
+ writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: COMMITTED }));
1004
+ return pbDir;
1005
+ }
1006
+ it('an exported key with no exported site URL is sent to DEFAULT_SITE_URL, never config.json siteUrl', () => {
1007
+ process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_env_key';
1008
+ commitProjectSiteUrl();
1009
+ expect(getConfig().siteUrl).toBe(DEFAULT);
1010
+ });
1011
+ it('loadEnv and resolveConfig name the same site URL for the same inputs', async () => {
1012
+ const { resolveNamedProfileConfig, resolveProfileConfig } = await import('../lib/profiles.js');
1013
+ const named = resolveNamedProfileConfig;
1014
+ const active = resolveProfileConfig;
1015
+ const cases = [
1016
+ {
1017
+ name: 'env key, no env URL, committed config.json',
1018
+ arrange: () => {
1019
+ process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_env_key';
1020
+ commitProjectSiteUrl();
1021
+ },
1022
+ expected: DEFAULT,
1023
+ },
1024
+ {
1025
+ name: 'env key with env URL, committed config.json',
1026
+ arrange: () => {
1027
+ process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_env_key';
1028
+ process.env.CONVEX_SITE_URL = 'https://env.example.com';
1029
+ commitProjectSiteUrl();
1030
+ },
1031
+ expected: 'https://env.example.com',
1032
+ },
1033
+ {
1034
+ name: 'pinned profile with its own URL, exported URL, committed config.json',
1035
+ arrange: () => {
1036
+ named.mockReturnValue({ apiKey: 'pb_sk_pinned_key', siteUrl: 'https://pinned.example.com' });
1037
+ process.env.CONVEX_SITE_URL = 'https://env.example.com';
1038
+ const pbDir = commitProjectSiteUrl();
1039
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'product-brain' }));
1040
+ },
1041
+ expected: 'https://pinned.example.com',
1042
+ },
1043
+ {
1044
+ name: 'pinned profile with no URL, committed config.json',
1045
+ arrange: () => {
1046
+ named.mockReturnValue({ apiKey: 'pb_sk_pinned_key' });
1047
+ const pbDir = commitProjectSiteUrl();
1048
+ writeFileSync(resolve(pbDir, 'config.local.json'), JSON.stringify({ profile: 'product-brain' }));
1049
+ },
1050
+ expected: DEFAULT,
1051
+ },
1052
+ {
1053
+ name: 'unpinned profile with its own URL, exported URL',
1054
+ arrange: () => {
1055
+ active.mockReturnValue({ apiKey: 'pb_sk_profile_key', siteUrl: 'https://profile.example.com', profileName: 'p' });
1056
+ process.env.CONVEX_SITE_URL = 'https://env.example.com';
1057
+ },
1058
+ expected: 'https://profile.example.com',
1059
+ },
1060
+ {
1061
+ name: 'unpinned profile with no URL, exported URL',
1062
+ arrange: () => {
1063
+ active.mockReturnValue({ apiKey: 'pb_sk_profile_key', profileName: 'p' });
1064
+ process.env.CONVEX_SITE_URL = 'https://env.example.com';
1065
+ },
1066
+ expected: DEFAULT,
1067
+ },
1068
+ ];
1069
+ const observed = cases.map(({ name, arrange }) => {
1070
+ named.mockReset();
1071
+ active.mockReset();
1072
+ delete process.env.PRODUCTBRAIN_API_KEY;
1073
+ delete process.env.CONVEX_SITE_URL;
1074
+ rmSync(resolve(tempDir, '.productbrain'), { recursive: true, force: true });
1075
+ arrange();
1076
+ const resolved = resolveConfig().siteUrl;
1077
+ resetConfigCache();
1078
+ const loaded = getConfig().siteUrl;
1079
+ return { name, resolved, loaded };
1080
+ });
1081
+ expect(observed).toEqual(cases.map(({ name, expected }) => ({ name, resolved: expected, loaded: expected })));
1082
+ });
1083
+ });
165
1084
  });
166
1085
  //# sourceMappingURL=config.test.js.map