@productbrain/cli 0.1.0-beta.49 → 0.1.0-beta.4902

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