@productbrain/cli 0.1.0-beta.14 → 0.1.0-beta.14010

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