@productbrain/cli 0.1.0-beta.5 → 0.1.0-beta.50

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 (592) hide show
  1. package/README.md +98 -30
  2. package/dist/__tests__/adapters.test.d.ts +2 -0
  3. package/dist/__tests__/adapters.test.d.ts.map +1 -0
  4. package/dist/__tests__/adapters.test.js +417 -0
  5. package/dist/__tests__/adapters.test.js.map +1 -0
  6. package/dist/__tests__/audit.test.d.ts +2 -0
  7. package/dist/__tests__/audit.test.d.ts.map +1 -0
  8. package/dist/__tests__/audit.test.js +394 -0
  9. package/dist/__tests__/audit.test.js.map +1 -0
  10. package/dist/__tests__/batch-transformations.test.d.ts +2 -0
  11. package/dist/__tests__/batch-transformations.test.d.ts.map +1 -0
  12. package/dist/__tests__/batch-transformations.test.js +263 -0
  13. package/dist/__tests__/batch-transformations.test.js.map +1 -0
  14. package/dist/__tests__/capture.test.d.ts +2 -0
  15. package/dist/__tests__/capture.test.d.ts.map +1 -0
  16. package/dist/__tests__/capture.test.js +156 -0
  17. package/dist/__tests__/capture.test.js.map +1 -0
  18. package/dist/__tests__/config.test.d.ts +8 -0
  19. package/dist/__tests__/config.test.d.ts.map +1 -0
  20. package/dist/__tests__/config.test.js +166 -0
  21. package/dist/__tests__/config.test.js.map +1 -0
  22. package/dist/__tests__/constants.test.d.ts +2 -0
  23. package/dist/__tests__/constants.test.d.ts.map +1 -0
  24. package/dist/__tests__/constants.test.js +141 -0
  25. package/dist/__tests__/constants.test.js.map +1 -0
  26. package/dist/__tests__/constellation.test.d.ts +2 -0
  27. package/dist/__tests__/constellation.test.d.ts.map +1 -0
  28. package/dist/__tests__/constellation.test.js +254 -0
  29. package/dist/__tests__/constellation.test.js.map +1 -0
  30. package/dist/__tests__/context-strategy.test.d.ts +2 -0
  31. package/dist/__tests__/context-strategy.test.d.ts.map +1 -0
  32. package/dist/__tests__/context-strategy.test.js +79 -0
  33. package/dist/__tests__/context-strategy.test.js.map +1 -0
  34. package/dist/__tests__/errors.test.d.ts +2 -0
  35. package/dist/__tests__/errors.test.d.ts.map +1 -0
  36. package/dist/__tests__/errors.test.js +117 -0
  37. package/dist/__tests__/errors.test.js.map +1 -0
  38. package/dist/__tests__/experiment.test.d.ts +6 -0
  39. package/dist/__tests__/experiment.test.d.ts.map +1 -0
  40. package/dist/__tests__/experiment.test.js +69 -0
  41. package/dist/__tests__/experiment.test.js.map +1 -0
  42. package/dist/__tests__/fields.test.d.ts +2 -0
  43. package/dist/__tests__/fields.test.d.ts.map +1 -0
  44. package/dist/__tests__/fields.test.js +238 -0
  45. package/dist/__tests__/fields.test.js.map +1 -0
  46. package/dist/__tests__/glossary.test.d.ts +2 -0
  47. package/dist/__tests__/glossary.test.d.ts.map +1 -0
  48. package/dist/__tests__/glossary.test.js +32 -0
  49. package/dist/__tests__/glossary.test.js.map +1 -0
  50. package/dist/__tests__/handshake.test.d.ts +2 -0
  51. package/dist/__tests__/handshake.test.d.ts.map +1 -0
  52. package/dist/__tests__/handshake.test.js +196 -0
  53. package/dist/__tests__/handshake.test.js.map +1 -0
  54. package/dist/__tests__/ingest.test.js +98 -0
  55. package/dist/__tests__/ingest.test.js.map +1 -1
  56. package/dist/__tests__/init.test.d.ts +7 -0
  57. package/dist/__tests__/init.test.d.ts.map +1 -0
  58. package/dist/__tests__/init.test.js +146 -0
  59. package/dist/__tests__/init.test.js.map +1 -0
  60. package/dist/__tests__/login.test.d.ts +2 -0
  61. package/dist/__tests__/login.test.d.ts.map +1 -0
  62. package/dist/__tests__/login.test.js +167 -0
  63. package/dist/__tests__/login.test.js.map +1 -0
  64. package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
  65. package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
  66. package/dist/__tests__/onboarding-path-b.test.js +46 -0
  67. package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
  68. package/dist/__tests__/onboarding.test.d.ts +6 -0
  69. package/dist/__tests__/onboarding.test.d.ts.map +1 -0
  70. package/dist/__tests__/onboarding.test.js +347 -0
  71. package/dist/__tests__/onboarding.test.js.map +1 -0
  72. package/dist/__tests__/orient.test.d.ts +2 -0
  73. package/dist/__tests__/orient.test.d.ts.map +1 -0
  74. package/dist/__tests__/orient.test.js +143 -0
  75. package/dist/__tests__/orient.test.js.map +1 -0
  76. package/dist/__tests__/profiles.test.d.ts +2 -0
  77. package/dist/__tests__/profiles.test.d.ts.map +1 -0
  78. package/dist/__tests__/profiles.test.js +168 -0
  79. package/dist/__tests__/profiles.test.js.map +1 -0
  80. package/dist/__tests__/promote.test.d.ts +2 -0
  81. package/dist/__tests__/promote.test.d.ts.map +1 -0
  82. package/dist/__tests__/promote.test.js +161 -0
  83. package/dist/__tests__/promote.test.js.map +1 -0
  84. package/dist/__tests__/prompts.test.d.ts +6 -0
  85. package/dist/__tests__/prompts.test.d.ts.map +1 -0
  86. package/dist/__tests__/prompts.test.js +146 -0
  87. package/dist/__tests__/prompts.test.js.map +1 -0
  88. package/dist/__tests__/proposals.test.d.ts +2 -0
  89. package/dist/__tests__/proposals.test.d.ts.map +1 -0
  90. package/dist/__tests__/proposals.test.js +167 -0
  91. package/dist/__tests__/proposals.test.js.map +1 -0
  92. package/dist/__tests__/relate.test.d.ts +2 -0
  93. package/dist/__tests__/relate.test.d.ts.map +1 -0
  94. package/dist/__tests__/relate.test.js +103 -0
  95. package/dist/__tests__/relate.test.js.map +1 -0
  96. package/dist/__tests__/repo-detect.test.d.ts +2 -0
  97. package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
  98. package/dist/__tests__/repo-detect.test.js +215 -0
  99. package/dist/__tests__/repo-detect.test.js.map +1 -0
  100. package/dist/__tests__/runner.test.d.ts +2 -0
  101. package/dist/__tests__/runner.test.d.ts.map +1 -0
  102. package/dist/__tests__/runner.test.js +219 -0
  103. package/dist/__tests__/runner.test.js.map +1 -0
  104. package/dist/__tests__/session-touch.test.d.ts +2 -0
  105. package/dist/__tests__/session-touch.test.d.ts.map +1 -0
  106. package/dist/__tests__/session-touch.test.js +134 -0
  107. package/dist/__tests__/session-touch.test.js.map +1 -0
  108. package/dist/__tests__/session.test.d.ts +2 -0
  109. package/dist/__tests__/session.test.d.ts.map +1 -0
  110. package/dist/__tests__/session.test.js +46 -0
  111. package/dist/__tests__/session.test.js.map +1 -0
  112. package/dist/__tests__/setup.test.d.ts +2 -0
  113. package/dist/__tests__/setup.test.d.ts.map +1 -0
  114. package/dist/__tests__/setup.test.js +141 -0
  115. package/dist/__tests__/setup.test.js.map +1 -0
  116. package/dist/__tests__/spinner-labels.test.d.ts +2 -0
  117. package/dist/__tests__/spinner-labels.test.d.ts.map +1 -0
  118. package/dist/__tests__/spinner-labels.test.js +23 -0
  119. package/dist/__tests__/spinner-labels.test.js.map +1 -0
  120. package/dist/__tests__/strip.test.d.ts +2 -0
  121. package/dist/__tests__/strip.test.d.ts.map +1 -0
  122. package/dist/__tests__/strip.test.js +136 -0
  123. package/dist/__tests__/strip.test.js.map +1 -0
  124. package/dist/__tests__/surface-profiles.test.d.ts +2 -0
  125. package/dist/__tests__/surface-profiles.test.d.ts.map +1 -0
  126. package/dist/__tests__/surface-profiles.test.js +233 -0
  127. package/dist/__tests__/surface-profiles.test.js.map +1 -0
  128. package/dist/__tests__/update.test.d.ts +2 -0
  129. package/dist/__tests__/update.test.d.ts.map +1 -0
  130. package/dist/__tests__/update.test.js +228 -0
  131. package/dist/__tests__/update.test.js.map +1 -0
  132. package/dist/__tests__/workspace.test.d.ts +2 -0
  133. package/dist/__tests__/workspace.test.d.ts.map +1 -0
  134. package/dist/__tests__/workspace.test.js +308 -0
  135. package/dist/__tests__/workspace.test.js.map +1 -0
  136. package/dist/commands/accept.d.ts +18 -0
  137. package/dist/commands/accept.d.ts.map +1 -0
  138. package/dist/commands/accept.js +76 -0
  139. package/dist/commands/accept.js.map +1 -0
  140. package/dist/commands/admin/index.d.ts +17 -0
  141. package/dist/commands/admin/index.d.ts.map +1 -0
  142. package/dist/commands/admin/index.js +95 -0
  143. package/dist/commands/admin/index.js.map +1 -0
  144. package/dist/commands/admin/inspect.d.ts +12 -0
  145. package/dist/commands/admin/inspect.d.ts.map +1 -0
  146. package/dist/commands/admin/inspect.js +506 -0
  147. package/dist/commands/admin/inspect.js.map +1 -0
  148. package/dist/commands/admin/inspect.test.d.ts +5 -0
  149. package/dist/commands/admin/inspect.test.d.ts.map +1 -0
  150. package/dist/commands/admin/inspect.test.js +40 -0
  151. package/dist/commands/admin/inspect.test.js.map +1 -0
  152. package/dist/commands/admin/seed.d.ts +32 -0
  153. package/dist/commands/admin/seed.d.ts.map +1 -0
  154. package/dist/commands/admin/seed.js +527 -0
  155. package/dist/commands/admin/seed.js.map +1 -0
  156. package/dist/commands/admin/seed.test.d.ts +6 -0
  157. package/dist/commands/admin/seed.test.d.ts.map +1 -0
  158. package/dist/commands/admin/seed.test.js +65 -0
  159. package/dist/commands/admin/seed.test.js.map +1 -0
  160. package/dist/commands/audit.d.ts +25 -0
  161. package/dist/commands/audit.d.ts.map +1 -0
  162. package/dist/commands/audit.js +188 -0
  163. package/dist/commands/audit.js.map +1 -0
  164. package/dist/commands/brand-pack.d.ts +2 -0
  165. package/dist/commands/brand-pack.d.ts.map +1 -0
  166. package/dist/commands/brand-pack.js +25 -0
  167. package/dist/commands/brand-pack.js.map +1 -0
  168. package/dist/commands/brief.d.ts +28 -0
  169. package/dist/commands/brief.d.ts.map +1 -0
  170. package/dist/commands/brief.js +75 -0
  171. package/dist/commands/brief.js.map +1 -0
  172. package/dist/commands/capture.d.ts +25 -0
  173. package/dist/commands/capture.d.ts.map +1 -0
  174. package/dist/commands/capture.js +232 -0
  175. package/dist/commands/capture.js.map +1 -0
  176. package/dist/commands/chain-walk.d.ts +14 -0
  177. package/dist/commands/chain-walk.d.ts.map +1 -0
  178. package/dist/commands/chain-walk.js +38 -0
  179. package/dist/commands/chain-walk.js.map +1 -0
  180. package/dist/commands/changes.d.ts +11 -0
  181. package/dist/commands/changes.d.ts.map +1 -0
  182. package/dist/commands/changes.js +46 -0
  183. package/dist/commands/changes.js.map +1 -0
  184. package/dist/commands/codex-prep.d.ts +12 -0
  185. package/dist/commands/codex-prep.d.ts.map +1 -0
  186. package/dist/commands/codex-prep.js +122 -0
  187. package/dist/commands/codex-prep.js.map +1 -0
  188. package/dist/commands/collections.d.ts +22 -0
  189. package/dist/commands/collections.d.ts.map +1 -0
  190. package/dist/commands/collections.js +77 -0
  191. package/dist/commands/collections.js.map +1 -0
  192. package/dist/commands/connect-integration.test.d.ts +7 -0
  193. package/dist/commands/connect-integration.test.d.ts.map +1 -0
  194. package/dist/commands/connect-integration.test.js +200 -0
  195. package/dist/commands/connect-integration.test.js.map +1 -0
  196. package/dist/commands/connect.d.ts +21 -0
  197. package/dist/commands/connect.d.ts.map +1 -0
  198. package/dist/commands/connect.js +279 -0
  199. package/dist/commands/connect.js.map +1 -0
  200. package/dist/commands/connect.test.d.ts +6 -0
  201. package/dist/commands/connect.test.d.ts.map +1 -0
  202. package/dist/commands/connect.test.js +230 -0
  203. package/dist/commands/connect.test.js.map +1 -0
  204. package/dist/commands/constellation.d.ts +11 -0
  205. package/dist/commands/constellation.d.ts.map +1 -0
  206. package/dist/commands/constellation.js +33 -0
  207. package/dist/commands/constellation.js.map +1 -0
  208. package/dist/commands/context.d.ts +2 -1
  209. package/dist/commands/context.d.ts.map +1 -1
  210. package/dist/commands/context.js +20 -9
  211. package/dist/commands/context.js.map +1 -1
  212. package/dist/commands/cross-cut.d.ts +11 -0
  213. package/dist/commands/cross-cut.d.ts.map +1 -0
  214. package/dist/commands/cross-cut.js +23 -0
  215. package/dist/commands/cross-cut.js.map +1 -0
  216. package/dist/commands/doctor.d.ts +18 -0
  217. package/dist/commands/doctor.d.ts.map +1 -0
  218. package/dist/commands/doctor.js +231 -0
  219. package/dist/commands/doctor.js.map +1 -0
  220. package/dist/commands/doctor.test.d.ts +8 -0
  221. package/dist/commands/doctor.test.d.ts.map +1 -0
  222. package/dist/commands/doctor.test.js +311 -0
  223. package/dist/commands/doctor.test.js.map +1 -0
  224. package/dist/commands/fields.d.ts +9 -0
  225. package/dist/commands/fields.d.ts.map +1 -0
  226. package/dist/commands/fields.js +30 -0
  227. package/dist/commands/fields.js.map +1 -0
  228. package/dist/commands/get.d.ts +8 -1
  229. package/dist/commands/get.d.ts.map +1 -1
  230. package/dist/commands/get.js +60 -7
  231. package/dist/commands/get.js.map +1 -1
  232. package/dist/commands/handshake.d.ts +28 -0
  233. package/dist/commands/handshake.d.ts.map +1 -0
  234. package/dist/commands/handshake.js +617 -0
  235. package/dist/commands/handshake.js.map +1 -0
  236. package/dist/commands/ingest.d.ts +8 -2
  237. package/dist/commands/ingest.d.ts.map +1 -1
  238. package/dist/commands/ingest.js +148 -25
  239. package/dist/commands/ingest.js.map +1 -1
  240. package/dist/commands/init.d.ts +14 -0
  241. package/dist/commands/init.d.ts.map +1 -0
  242. package/dist/commands/init.js +117 -0
  243. package/dist/commands/init.js.map +1 -0
  244. package/dist/commands/login.d.ts +4 -0
  245. package/dist/commands/login.d.ts.map +1 -1
  246. package/dist/commands/login.js +99 -37
  247. package/dist/commands/login.js.map +1 -1
  248. package/dist/commands/orient.d.ts +103 -1
  249. package/dist/commands/orient.d.ts.map +1 -1
  250. package/dist/commands/orient.js +24 -8
  251. package/dist/commands/orient.js.map +1 -1
  252. package/dist/commands/profile.d.ts +24 -0
  253. package/dist/commands/profile.d.ts.map +1 -0
  254. package/dist/commands/profile.js +82 -0
  255. package/dist/commands/profile.js.map +1 -0
  256. package/dist/commands/promote.d.ts +12 -0
  257. package/dist/commands/promote.d.ts.map +1 -0
  258. package/dist/commands/promote.js +90 -0
  259. package/dist/commands/promote.js.map +1 -0
  260. package/dist/commands/proposals.d.ts +9 -0
  261. package/dist/commands/proposals.d.ts.map +1 -0
  262. package/dist/commands/proposals.js +24 -0
  263. package/dist/commands/proposals.js.map +1 -0
  264. package/dist/commands/reject.d.ts +14 -0
  265. package/dist/commands/reject.d.ts.map +1 -0
  266. package/dist/commands/reject.js +43 -0
  267. package/dist/commands/reject.js.map +1 -0
  268. package/dist/commands/relate.d.ts +16 -0
  269. package/dist/commands/relate.d.ts.map +1 -0
  270. package/dist/commands/relate.js +98 -0
  271. package/dist/commands/relate.js.map +1 -0
  272. package/dist/commands/search.d.ts +1 -0
  273. package/dist/commands/search.d.ts.map +1 -1
  274. package/dist/commands/search.js +5 -3
  275. package/dist/commands/search.js.map +1 -1
  276. package/dist/commands/session.d.ts +20 -0
  277. package/dist/commands/session.d.ts.map +1 -0
  278. package/dist/commands/session.js +144 -0
  279. package/dist/commands/session.js.map +1 -0
  280. package/dist/commands/setup.d.ts +15 -0
  281. package/dist/commands/setup.d.ts.map +1 -0
  282. package/dist/commands/setup.js +168 -0
  283. package/dist/commands/setup.js.map +1 -0
  284. package/dist/commands/update.d.ts +17 -0
  285. package/dist/commands/update.d.ts.map +1 -0
  286. package/dist/commands/update.js +178 -0
  287. package/dist/commands/update.js.map +1 -0
  288. package/dist/commands/verify.d.ts +13 -0
  289. package/dist/commands/verify.d.ts.map +1 -0
  290. package/dist/commands/verify.js +49 -0
  291. package/dist/commands/verify.js.map +1 -0
  292. package/dist/commands/workspace.d.ts +41 -0
  293. package/dist/commands/workspace.d.ts.map +1 -0
  294. package/dist/commands/workspace.js +239 -0
  295. package/dist/commands/workspace.js.map +1 -0
  296. package/dist/formatters/audit.d.ts +46 -0
  297. package/dist/formatters/audit.d.ts.map +1 -0
  298. package/dist/formatters/audit.js +81 -0
  299. package/dist/formatters/audit.js.map +1 -0
  300. package/dist/formatters/brief.d.ts +112 -0
  301. package/dist/formatters/brief.d.ts.map +1 -0
  302. package/dist/formatters/brief.js +179 -0
  303. package/dist/formatters/brief.js.map +1 -0
  304. package/dist/formatters/capture.d.ts +48 -0
  305. package/dist/formatters/capture.d.ts.map +1 -0
  306. package/dist/formatters/capture.js +77 -0
  307. package/dist/formatters/capture.js.map +1 -0
  308. package/dist/formatters/chain-walk.d.ts +33 -0
  309. package/dist/formatters/chain-walk.d.ts.map +1 -0
  310. package/dist/formatters/chain-walk.js +54 -0
  311. package/dist/formatters/chain-walk.js.map +1 -0
  312. package/dist/formatters/changes.d.ts +25 -0
  313. package/dist/formatters/changes.d.ts.map +1 -0
  314. package/dist/formatters/changes.js +60 -0
  315. package/dist/formatters/changes.js.map +1 -0
  316. package/dist/formatters/collections.d.ts +40 -0
  317. package/dist/formatters/collections.d.ts.map +1 -0
  318. package/dist/formatters/collections.js +93 -0
  319. package/dist/formatters/collections.js.map +1 -0
  320. package/dist/formatters/constellation.d.ts +34 -0
  321. package/dist/formatters/constellation.d.ts.map +1 -0
  322. package/dist/formatters/constellation.js +38 -0
  323. package/dist/formatters/constellation.js.map +1 -0
  324. package/dist/formatters/cross-cut.d.ts +21 -0
  325. package/dist/formatters/cross-cut.d.ts.map +1 -0
  326. package/dist/formatters/cross-cut.js +32 -0
  327. package/dist/formatters/cross-cut.js.map +1 -0
  328. package/dist/formatters/entry.d.ts +11 -4
  329. package/dist/formatters/entry.d.ts.map +1 -1
  330. package/dist/formatters/entry.js +24 -8
  331. package/dist/formatters/entry.js.map +1 -1
  332. package/dist/formatters/fields.d.ts +32 -0
  333. package/dist/formatters/fields.d.ts.map +1 -0
  334. package/dist/formatters/fields.js +49 -0
  335. package/dist/formatters/fields.js.map +1 -0
  336. package/dist/formatters/handshake.d.ts +24 -0
  337. package/dist/formatters/handshake.d.ts.map +1 -0
  338. package/dist/formatters/handshake.js +69 -0
  339. package/dist/formatters/handshake.js.map +1 -0
  340. package/dist/formatters/orient.d.ts +100 -1
  341. package/dist/formatters/orient.d.ts.map +1 -1
  342. package/dist/formatters/orient.js +123 -17
  343. package/dist/formatters/orient.js.map +1 -1
  344. package/dist/formatters/promote.d.ts +30 -0
  345. package/dist/formatters/promote.d.ts.map +1 -0
  346. package/dist/formatters/promote.js +39 -0
  347. package/dist/formatters/promote.js.map +1 -0
  348. package/dist/formatters/proposals.d.ts +45 -0
  349. package/dist/formatters/proposals.d.ts.map +1 -0
  350. package/dist/formatters/proposals.js +62 -0
  351. package/dist/formatters/proposals.js.map +1 -0
  352. package/dist/formatters/relate.d.ts +14 -0
  353. package/dist/formatters/relate.d.ts.map +1 -0
  354. package/dist/formatters/relate.js +16 -0
  355. package/dist/formatters/relate.js.map +1 -0
  356. package/dist/formatters/search.d.ts +0 -4
  357. package/dist/formatters/search.d.ts.map +1 -1
  358. package/dist/formatters/search.js +4 -1
  359. package/dist/formatters/search.js.map +1 -1
  360. package/dist/formatters/session.d.ts +11 -0
  361. package/dist/formatters/session.d.ts.map +1 -0
  362. package/dist/formatters/session.js +51 -0
  363. package/dist/formatters/session.js.map +1 -0
  364. package/dist/formatters/update.d.ts +17 -0
  365. package/dist/formatters/update.d.ts.map +1 -0
  366. package/dist/formatters/update.js +45 -0
  367. package/dist/formatters/update.js.map +1 -0
  368. package/dist/formatters/verify.d.ts +11 -0
  369. package/dist/formatters/verify.d.ts.map +1 -0
  370. package/dist/formatters/verify.js +11 -0
  371. package/dist/formatters/verify.js.map +1 -0
  372. package/dist/generators/__tests__/surface-profiles.test.d.ts +2 -0
  373. package/dist/generators/__tests__/surface-profiles.test.d.ts.map +1 -0
  374. package/dist/generators/__tests__/surface-profiles.test.js +89 -0
  375. package/dist/generators/__tests__/surface-profiles.test.js.map +1 -0
  376. package/dist/generators/adapters.d.ts +44 -0
  377. package/dist/generators/adapters.d.ts.map +1 -0
  378. package/dist/generators/adapters.js +290 -0
  379. package/dist/generators/adapters.js.map +1 -0
  380. package/dist/generators/adapters.test.d.ts +2 -0
  381. package/dist/generators/adapters.test.d.ts.map +1 -0
  382. package/dist/generators/adapters.test.js +27 -0
  383. package/dist/generators/adapters.test.js.map +1 -0
  384. package/dist/generators/archetypes.d.ts +52 -0
  385. package/dist/generators/archetypes.d.ts.map +1 -0
  386. package/dist/generators/archetypes.js +153 -0
  387. package/dist/generators/archetypes.js.map +1 -0
  388. package/dist/generators/archetypes.test.d.ts +2 -0
  389. package/dist/generators/archetypes.test.d.ts.map +1 -0
  390. package/dist/generators/archetypes.test.js +237 -0
  391. package/dist/generators/archetypes.test.js.map +1 -0
  392. package/dist/generators/briefing-md.d.ts +8 -0
  393. package/dist/generators/briefing-md.d.ts.map +1 -0
  394. package/dist/generators/briefing-md.js +51 -0
  395. package/dist/generators/briefing-md.js.map +1 -0
  396. package/dist/generators/chain-classifier.d.ts +49 -0
  397. package/dist/generators/chain-classifier.d.ts.map +1 -0
  398. package/dist/generators/chain-classifier.js +180 -0
  399. package/dist/generators/chain-classifier.js.map +1 -0
  400. package/dist/generators/chain-classifier.test.d.ts +2 -0
  401. package/dist/generators/chain-classifier.test.d.ts.map +1 -0
  402. package/dist/generators/chain-classifier.test.js +257 -0
  403. package/dist/generators/chain-classifier.test.js.map +1 -0
  404. package/dist/generators/chain-rules.d.ts +42 -0
  405. package/dist/generators/chain-rules.d.ts.map +1 -0
  406. package/dist/generators/chain-rules.js +144 -0
  407. package/dist/generators/chain-rules.js.map +1 -0
  408. package/dist/generators/chain-rules.test.d.ts +2 -0
  409. package/dist/generators/chain-rules.test.d.ts.map +1 -0
  410. package/dist/generators/chain-rules.test.js +179 -0
  411. package/dist/generators/chain-rules.test.js.map +1 -0
  412. package/dist/generators/context-md.d.ts +8 -0
  413. package/dist/generators/context-md.d.ts.map +1 -0
  414. package/dist/generators/context-md.js +134 -0
  415. package/dist/generators/context-md.js.map +1 -0
  416. package/dist/generators/handshake-diff.d.ts +67 -0
  417. package/dist/generators/handshake-diff.d.ts.map +1 -0
  418. package/dist/generators/handshake-diff.js +183 -0
  419. package/dist/generators/handshake-diff.js.map +1 -0
  420. package/dist/generators/handshake-diff.test.d.ts +2 -0
  421. package/dist/generators/handshake-diff.test.d.ts.map +1 -0
  422. package/dist/generators/handshake-diff.test.js +264 -0
  423. package/dist/generators/handshake-diff.test.js.map +1 -0
  424. package/dist/generators/portable-knowledge.d.ts +143 -0
  425. package/dist/generators/portable-knowledge.d.ts.map +1 -0
  426. package/dist/generators/portable-knowledge.js +504 -0
  427. package/dist/generators/portable-knowledge.js.map +1 -0
  428. package/dist/generators/portable-knowledge.test.d.ts +2 -0
  429. package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
  430. package/dist/generators/portable-knowledge.test.js +927 -0
  431. package/dist/generators/portable-knowledge.test.js.map +1 -0
  432. package/dist/generators/surface-profiles.d.ts +49 -0
  433. package/dist/generators/surface-profiles.d.ts.map +1 -0
  434. package/dist/generators/surface-profiles.js +98 -0
  435. package/dist/generators/surface-profiles.js.map +1 -0
  436. package/dist/index.d.ts +3 -2
  437. package/dist/index.d.ts.map +1 -1
  438. package/dist/index.js +637 -37
  439. package/dist/index.js.map +1 -1
  440. package/dist/lib/activation.d.ts +28 -0
  441. package/dist/lib/activation.d.ts.map +1 -0
  442. package/dist/lib/activation.js +57 -0
  443. package/dist/lib/activation.js.map +1 -0
  444. package/dist/lib/activation.test.d.ts +6 -0
  445. package/dist/lib/activation.test.d.ts.map +1 -0
  446. package/dist/lib/activation.test.js +121 -0
  447. package/dist/lib/activation.test.js.map +1 -0
  448. package/dist/lib/client.d.ts +61 -0
  449. package/dist/lib/client.d.ts.map +1 -1
  450. package/dist/lib/client.js +262 -12
  451. package/dist/lib/client.js.map +1 -1
  452. package/dist/lib/config.d.ts +84 -4
  453. package/dist/lib/config.d.ts.map +1 -1
  454. package/dist/lib/config.js +318 -39
  455. package/dist/lib/config.js.map +1 -1
  456. package/dist/lib/constants.d.ts +42 -0
  457. package/dist/lib/constants.d.ts.map +1 -0
  458. package/dist/lib/constants.js +76 -0
  459. package/dist/lib/constants.js.map +1 -0
  460. package/dist/lib/conversation-engine.d.ts +45 -0
  461. package/dist/lib/conversation-engine.d.ts.map +1 -0
  462. package/dist/lib/conversation-engine.js +112 -0
  463. package/dist/lib/conversation-engine.js.map +1 -0
  464. package/dist/lib/conversation-phases.d.ts +59 -0
  465. package/dist/lib/conversation-phases.d.ts.map +1 -0
  466. package/dist/lib/conversation-phases.js +11 -0
  467. package/dist/lib/conversation-phases.js.map +1 -0
  468. package/dist/lib/conversation-signals.d.ts +30 -0
  469. package/dist/lib/conversation-signals.d.ts.map +1 -0
  470. package/dist/lib/conversation-signals.js +64 -0
  471. package/dist/lib/conversation-signals.js.map +1 -0
  472. package/dist/lib/deployment.d.ts +23 -0
  473. package/dist/lib/deployment.d.ts.map +1 -0
  474. package/dist/lib/deployment.js +78 -0
  475. package/dist/lib/deployment.js.map +1 -0
  476. package/dist/lib/deployment.test.d.ts +5 -0
  477. package/dist/lib/deployment.test.d.ts.map +1 -0
  478. package/dist/lib/deployment.test.js +54 -0
  479. package/dist/lib/deployment.test.js.map +1 -0
  480. package/dist/lib/errors.d.ts +58 -0
  481. package/dist/lib/errors.d.ts.map +1 -0
  482. package/dist/lib/errors.js +67 -0
  483. package/dist/lib/errors.js.map +1 -0
  484. package/dist/lib/experiment.d.ts +18 -0
  485. package/dist/lib/experiment.d.ts.map +1 -0
  486. package/dist/lib/experiment.js +28 -0
  487. package/dist/lib/experiment.js.map +1 -0
  488. package/dist/lib/format.d.ts +10 -0
  489. package/dist/lib/format.d.ts.map +1 -0
  490. package/dist/lib/format.js +27 -0
  491. package/dist/lib/format.js.map +1 -0
  492. package/dist/lib/glossary.d.ts +19 -0
  493. package/dist/lib/glossary.d.ts.map +1 -0
  494. package/dist/lib/glossary.js +53 -0
  495. package/dist/lib/glossary.js.map +1 -0
  496. package/dist/lib/onboarding-path-b.d.ts +10 -0
  497. package/dist/lib/onboarding-path-b.d.ts.map +1 -0
  498. package/dist/lib/onboarding-path-b.js +214 -0
  499. package/dist/lib/onboarding-path-b.js.map +1 -0
  500. package/dist/lib/onboarding-phases.d.ts +9 -0
  501. package/dist/lib/onboarding-phases.d.ts.map +1 -0
  502. package/dist/lib/onboarding-phases.js +120 -0
  503. package/dist/lib/onboarding-phases.js.map +1 -0
  504. package/dist/lib/onboarding-shared.d.ts +81 -0
  505. package/dist/lib/onboarding-shared.d.ts.map +1 -0
  506. package/dist/lib/onboarding-shared.js +190 -0
  507. package/dist/lib/onboarding-shared.js.map +1 -0
  508. package/dist/lib/onboarding-topics.d.ts +27 -0
  509. package/dist/lib/onboarding-topics.d.ts.map +1 -0
  510. package/dist/lib/onboarding-topics.js +57 -0
  511. package/dist/lib/onboarding-topics.js.map +1 -0
  512. package/dist/lib/onboarding.d.ts +17 -0
  513. package/dist/lib/onboarding.d.ts.map +1 -0
  514. package/dist/lib/onboarding.js +350 -0
  515. package/dist/lib/onboarding.js.map +1 -0
  516. package/dist/lib/profiles.d.ts +39 -0
  517. package/dist/lib/profiles.d.ts.map +1 -0
  518. package/dist/lib/profiles.js +180 -0
  519. package/dist/lib/profiles.js.map +1 -0
  520. package/dist/lib/prompts.d.ts +65 -0
  521. package/dist/lib/prompts.d.ts.map +1 -0
  522. package/dist/lib/prompts.js +132 -0
  523. package/dist/lib/prompts.js.map +1 -0
  524. package/dist/lib/repo-detect.d.ts +33 -0
  525. package/dist/lib/repo-detect.d.ts.map +1 -0
  526. package/dist/lib/repo-detect.js +83 -0
  527. package/dist/lib/repo-detect.js.map +1 -0
  528. package/dist/lib/runner.d.ts +33 -0
  529. package/dist/lib/runner.d.ts.map +1 -0
  530. package/dist/lib/runner.js +79 -0
  531. package/dist/lib/runner.js.map +1 -0
  532. package/dist/lib/session.d.ts +17 -0
  533. package/dist/lib/session.d.ts.map +1 -0
  534. package/dist/lib/session.js +43 -0
  535. package/dist/lib/session.js.map +1 -0
  536. package/dist/lib/spinner.d.ts +27 -0
  537. package/dist/lib/spinner.d.ts.map +1 -0
  538. package/dist/lib/spinner.js +76 -0
  539. package/dist/lib/spinner.js.map +1 -0
  540. package/dist/lib/spinner.test.d.ts +2 -0
  541. package/dist/lib/spinner.test.d.ts.map +1 -0
  542. package/dist/lib/spinner.test.js +39 -0
  543. package/dist/lib/spinner.test.js.map +1 -0
  544. package/dist/lib/strip.d.ts +12 -0
  545. package/dist/lib/strip.d.ts.map +1 -0
  546. package/dist/lib/strip.js +41 -0
  547. package/dist/lib/strip.js.map +1 -0
  548. package/dist/lib/style.d.ts +94 -0
  549. package/dist/lib/style.d.ts.map +1 -0
  550. package/dist/lib/style.js +167 -0
  551. package/dist/lib/style.js.map +1 -0
  552. package/dist/lib/style.test.d.ts +7 -0
  553. package/dist/lib/style.test.d.ts.map +1 -0
  554. package/dist/lib/style.test.js +263 -0
  555. package/dist/lib/style.test.js.map +1 -0
  556. package/dist/lib/telemetry.d.ts +15 -0
  557. package/dist/lib/telemetry.d.ts.map +1 -0
  558. package/dist/lib/telemetry.js +47 -0
  559. package/dist/lib/telemetry.js.map +1 -0
  560. package/dist/lib/wizard-surfaces.d.ts +47 -0
  561. package/dist/lib/wizard-surfaces.d.ts.map +1 -0
  562. package/dist/lib/wizard-surfaces.js +176 -0
  563. package/dist/lib/wizard-surfaces.js.map +1 -0
  564. package/dist/lib/wizard-surfaces.test.d.ts +2 -0
  565. package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
  566. package/dist/lib/wizard-surfaces.test.js +127 -0
  567. package/dist/lib/wizard-surfaces.test.js.map +1 -0
  568. package/dist/lib/wizard-trust.d.ts +31 -0
  569. package/dist/lib/wizard-trust.d.ts.map +1 -0
  570. package/dist/lib/wizard-trust.js +66 -0
  571. package/dist/lib/wizard-trust.js.map +1 -0
  572. package/dist/lib/wizard-trust.test.d.ts +2 -0
  573. package/dist/lib/wizard-trust.test.d.ts.map +1 -0
  574. package/dist/lib/wizard-trust.test.js +32 -0
  575. package/dist/lib/wizard-trust.test.js.map +1 -0
  576. package/dist/lib/workspace-probe.d.ts +16 -0
  577. package/dist/lib/workspace-probe.d.ts.map +1 -0
  578. package/dist/lib/workspace-probe.js +33 -0
  579. package/dist/lib/workspace-probe.js.map +1 -0
  580. package/package.json +9 -4
  581. package/templates/archetypes/boundary.md +23 -0
  582. package/templates/archetypes/constraint.md +23 -0
  583. package/templates/archetypes/convention.md +23 -0
  584. package/templates/archetypes/policy.md +23 -0
  585. package/templates/archetypes/quality-gate.md +23 -0
  586. package/templates/archetypes/workflow.md +23 -0
  587. package/templates/general/code-integrity.md +11 -0
  588. package/templates/general/getting-started.md +12 -0
  589. package/templates/node-ts/code-integrity.md +13 -0
  590. package/templates/node-ts/testing.md +12 -0
  591. package/templates/python/code-integrity.md +13 -0
  592. package/templates/python/testing.md +12 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * pb connect — redeem a short-lived connect token to save an API key locally.
3
+ *
4
+ * Part of FEAT-958 Path C: Onboarding flow.
5
+ * Token is obtained from an onboarding link (e.g., email, QR code).
6
+ * S1 endpoint: POST /auth/redeem-connect-token
7
+ * S2 (this): CLI command to parse token, redeem, and save key locally.
8
+ * S3: Wizard flow (surface detection + trust level).
9
+ * S4: Final handshake (pb handshake).
10
+ */
11
+ export interface ConnectOptions {
12
+ /** Override redeem gateway (`pb connect --gateway`). */
13
+ gateway?: string;
14
+ }
15
+ /**
16
+ * Main entrypoint for `pb connect <token>`.
17
+ * Validates token format, redeems it via /auth/redeem-connect-token,
18
+ * saves the key, and runs the wizard (S3).
19
+ */
20
+ export declare function runConnect(token: string, options?: ConnectOptions): Promise<void>;
21
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiNH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG3F"}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * pb connect — redeem a short-lived connect token to save an API key locally.
3
+ *
4
+ * Part of FEAT-958 Path C: Onboarding flow.
5
+ * Token is obtained from an onboarding link (e.g., email, QR code).
6
+ * S1 endpoint: POST /auth/redeem-connect-token
7
+ * S2 (this): CLI command to parse token, redeem, and save key locally.
8
+ * S3: Wizard flow (surface detection + trust level).
9
+ * S4: Final handshake (pb handshake).
10
+ */
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
12
+ import { resolve } from 'path';
13
+ import { resolveAppUrl, resolveConnectRedeemUrl } from '../lib/constants.js';
14
+ import { CLIError, ErrorCode } from '../lib/errors.js';
15
+ import { createProfile, listProfiles, PROFILES_DIR } from '../lib/profiles.js';
16
+ import { withSpinner } from '../lib/spinner.js';
17
+ import * as clack from '@clack/prompts';
18
+ import { runHandshake } from './handshake.js';
19
+ const APP_URL = resolveAppUrl();
20
+ const TOKEN_PREFIX = 'pb_ct_';
21
+ /**
22
+ * Validate token format — must start with pb_ct_ and be >20 chars.
23
+ * @returns error message if invalid, undefined if valid.
24
+ */
25
+ function validateTokenFormat(token) {
26
+ if (!token.startsWith(TOKEN_PREFIX)) {
27
+ return `Invalid token format. Token must start with '${TOKEN_PREFIX}'.`;
28
+ }
29
+ if (token.length < 30) {
30
+ return `Token is too short. Got ${token.length} chars, expected >30.`;
31
+ }
32
+ return undefined;
33
+ }
34
+ /**
35
+ * POST /auth/redeem-connect-token with the token.
36
+ * Returns the API key + workspace info, or throws CLIError on failure.
37
+ */
38
+ async function redeemToken(token, siteUrl) {
39
+ return withSpinner('Redeeming token', async () => {
40
+ const controller = new AbortController();
41
+ const timer = setTimeout(() => controller.abort(), 5000);
42
+ try {
43
+ const res = await fetch(`${siteUrl}/auth/redeem-connect-token`, {
44
+ method: 'POST',
45
+ headers: {
46
+ 'Content-Type': 'application/json',
47
+ },
48
+ body: JSON.stringify({ token }),
49
+ signal: controller.signal,
50
+ });
51
+ clearTimeout(timer);
52
+ if (!res.ok) {
53
+ let errorCode = 'unknown_error';
54
+ let errorMessage = `Server returned ${res.status}`;
55
+ try {
56
+ const errorData = (await res.json());
57
+ if (errorData.error?.code) {
58
+ errorCode = errorData.error.code;
59
+ errorMessage = errorData.error.message ?? errorMessage;
60
+ }
61
+ }
62
+ catch {
63
+ // Failed to parse error JSON — use default message
64
+ }
65
+ // Map error codes to user-friendly messages
66
+ if (errorCode === 'invalid_token' || res.status === 400) {
67
+ throw new CLIError('Token is invalid, expired, or already used. Get a new token from your onboarding link.', {
68
+ code: ErrorCode.AUTH_INVALID,
69
+ category: 'auth',
70
+ guidance: `Tried gateway: ${siteUrl}\nVisit ${APP_URL} to get a new onboarding link, or contact support.\n\nIf your token came from a different Convex deployment, use:\n pb connect --gateway <your-deployment>.convex.site <token>\nor set CONVEX_SITE_URL in your environment.`,
71
+ });
72
+ }
73
+ if (errorCode === 'workspace_not_found' || res.status === 404) {
74
+ throw new CLIError('Workspace not found. The token may be from a deleted workspace.', {
75
+ code: ErrorCode.AUTH_DENIED,
76
+ category: 'auth',
77
+ guidance: 'Contact support for help.',
78
+ });
79
+ }
80
+ throw new CLIError(`Token redemption failed: ${errorMessage}`, {
81
+ code: ErrorCode.AUTH_INVALID,
82
+ category: 'auth',
83
+ guidance: `Visit ${APP_URL} to get a new onboarding link.`,
84
+ });
85
+ }
86
+ const json = (await res.json());
87
+ // Check for error response (has error field)
88
+ if ('error' in json && json.error) {
89
+ const errorCode = json.error.code || 'unknown_error';
90
+ const errorMessage = json.error.message || 'Token redemption failed';
91
+ throw new CLIError(errorCode === 'invalid_token' ? 'Token is invalid, expired, or already used.' : errorMessage, {
92
+ code: ErrorCode.AUTH_INVALID,
93
+ category: 'auth',
94
+ guidance: `Visit ${APP_URL} to get a new onboarding link.`,
95
+ });
96
+ }
97
+ return json;
98
+ }
99
+ catch (err) {
100
+ clearTimeout(timer);
101
+ // Re-throw CLIErrors (validation failures)
102
+ if (err instanceof CLIError)
103
+ throw err;
104
+ // Network/timeout error
105
+ const msg = err instanceof Error ? err.message : String(err);
106
+ if (msg === 'fetch failed' || msg.includes('ECONNREFUSED') || msg.includes('ENOTFOUND')) {
107
+ throw new CLIError('Could not reach ProductBrain. Check your internet connection.', {
108
+ code: ErrorCode.NETWORK_UNREACHABLE,
109
+ category: 'network',
110
+ guidance: 'Check your connection, then try again: pb connect <token>',
111
+ });
112
+ }
113
+ // Unknown error
114
+ throw new CLIError(`Network error: ${msg}`, {
115
+ code: ErrorCode.NETWORK_UNREACHABLE,
116
+ category: 'network',
117
+ guidance: 'Check your internet connection and try again.',
118
+ });
119
+ }
120
+ });
121
+ }
122
+ /**
123
+ * Slugify workspace name for profile naming.
124
+ * Lowercase, replace spaces/special chars with hyphens, max 32 chars.
125
+ */
126
+ function slugify(name) {
127
+ return name
128
+ .toLowerCase()
129
+ .replace(/[^a-z0-9]+/g, '-')
130
+ .replace(/^-|-$/g, '')
131
+ .slice(0, 32) || 'default';
132
+ }
133
+ /**
134
+ * Save API key as a named profile. Creates or updates the profile.
135
+ * Does NOT activate the profile globally — project config (.productbrain/config.json)
136
+ * handles per-project resolution. User can switch manually with `pb use <profile>`.
137
+ * Sets process.env for the current process only (so handshake works).
138
+ */
139
+ function saveKeyAsProfile(apiKey, siteUrl, profileName) {
140
+ const existing = listProfiles();
141
+ if (existing.includes(profileName)) {
142
+ // Overwrite existing profile with fresh credentials (re-connect scenario)
143
+ const lines = [
144
+ `# Product Brain CLI profile: ${profileName}`,
145
+ `PRODUCTBRAIN_API_KEY=${apiKey}`,
146
+ ...(siteUrl ? [`CONVEX_SITE_URL=${siteUrl}`] : []),
147
+ '',
148
+ ];
149
+ mkdirSync(PROFILES_DIR, { recursive: true });
150
+ writeFileSync(resolve(PROFILES_DIR, `${profileName}.env`), lines.join('\n'), { mode: 0o600 });
151
+ }
152
+ else {
153
+ createProfile(profileName, apiKey, siteUrl);
154
+ }
155
+ // Don't call useProfile() — that hijacks the global active profile.
156
+ // Project config pins the workspace per-project instead.
157
+ process.env.PRODUCTBRAIN_API_KEY = apiKey;
158
+ process.env.CONVEX_SITE_URL = siteUrl;
159
+ }
160
+ /**
161
+ * Write .productbrain/config.json to pin this project to the workspace.
162
+ * Stores profile name + siteUrl. Does NOT include the API key (that stays in profiles, never committed).
163
+ */
164
+ function saveProjectConfig(siteUrl, profileName) {
165
+ const configDir = resolve(process.cwd(), '.productbrain');
166
+ const configPath = resolve(configDir, 'config.json');
167
+ // Read existing config to preserve other fields
168
+ let existing = {};
169
+ if (existsSync(configPath)) {
170
+ try {
171
+ existing = JSON.parse(readFileSync(configPath, 'utf8'));
172
+ }
173
+ catch { /* ignore parse errors */ }
174
+ }
175
+ // Write profile + siteUrl (no API key — that stays in profiles, never committed)
176
+ const config = { ...existing, siteUrl, profile: profileName };
177
+ mkdirSync(configDir, { recursive: true });
178
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
179
+ }
180
+ /**
181
+ * Main entrypoint for `pb connect <token>`.
182
+ * Validates token format, redeems it via /auth/redeem-connect-token,
183
+ * saves the key, and runs the wizard (S3).
184
+ */
185
+ export async function runConnect(token, options = {}) {
186
+ // 1. Validate token format
187
+ const formatError = validateTokenFormat(token);
188
+ if (formatError) {
189
+ throw new CLIError(formatError, {
190
+ code: ErrorCode.AUTH_INVALID,
191
+ category: 'auth',
192
+ guidance: `Usage: pb connect <token>\nToken must start with '${TOKEN_PREFIX}' and be at least 30 characters long.`,
193
+ });
194
+ }
195
+ // 2. Resolve cloud Convex gateway (--gateway → env → CONVEX_SITE_URL → production)
196
+ const siteUrl = resolveConnectRedeemUrl(options.gateway);
197
+ const result = await redeemToken(token, siteUrl);
198
+ // 4. Save API key as named profile + pin project config
199
+ const profileName = slugify(result.workspaceName);
200
+ saveKeyAsProfile(result.apiKey, siteUrl, profileName);
201
+ saveProjectConfig(siteUrl, profileName);
202
+ // 5. Print success
203
+ process.stdout.write('\n');
204
+ console.log(`✓ Connected to "${result.workspaceName}"`);
205
+ process.stdout.write('\n');
206
+ // 6. Run handshake — write ALL target files (no filtering)
207
+ console.log('Setting up your product context...\n');
208
+ try {
209
+ await runHandshake({ quiet: true });
210
+ console.log('✓ Context files synced to your AI tools:\n');
211
+ console.log(' .cursor/rules/ → Cursor');
212
+ console.log(' CLAUDE.md → Claude Code');
213
+ console.log(' .github/ → GitHub Copilot');
214
+ console.log(' AGENTS.md → Codex / CI');
215
+ console.log('');
216
+ console.log(' These update when you run `pb session start`.');
217
+ }
218
+ catch (err) {
219
+ // Handshake failure is non-fatal during connect
220
+ console.log('⚠ Context sync skipped (run `pb handshake` manually later)');
221
+ if (err instanceof Error)
222
+ console.log(` ${err.message}`);
223
+ }
224
+ process.stdout.write('\n');
225
+ // Screen 1 → Continue gate
226
+ const cont1 = await clack.select({
227
+ message: '',
228
+ options: [{ value: 'continue', label: 'Continue →' }],
229
+ });
230
+ if (clack.isCancel(cont1))
231
+ process.exit(130);
232
+ // 7. Profile & multi-workspace info
233
+ console.log(` Your API key is saved as profile "${profileName}".`);
234
+ console.log(' To connect another workspace, run `pb connect` with that token.');
235
+ console.log(' Switch between workspaces with `pb use <profile>`.\n');
236
+ console.log(' Context files were synced to this project.');
237
+ console.log(' For other repos, run `pb handshake` to set them up too.');
238
+ process.stdout.write('\n');
239
+ // Screen 2 → Continue gate
240
+ const cont2 = await clack.select({
241
+ message: '',
242
+ options: [{ value: 'continue', label: 'Continue →' }],
243
+ });
244
+ if (clack.isCancel(cont2))
245
+ process.exit(130);
246
+ // 8. Interactive "What's next?" menu
247
+ const next = await clack.select({
248
+ message: "What's next?",
249
+ options: [
250
+ { value: 'start', label: 'Start coding', hint: 'Just one step' },
251
+ { value: 'connect', label: 'Connect another workspace' },
252
+ { value: 'docs', label: 'Learn more', hint: 'productbrain.io/docs' },
253
+ { value: 'community', label: 'Join the community', hint: 'community.productbrain.io' },
254
+ ],
255
+ });
256
+ if (clack.isCancel(next))
257
+ process.exit(130);
258
+ process.stdout.write('\n');
259
+ switch (next) {
260
+ case 'start':
261
+ console.log(' Next time you open your AI tool in this project, run:\n');
262
+ console.log(' pb session start\n');
263
+ console.log(' That refreshes your product context and starts a tracked session.');
264
+ console.log(' Then just code normally — your AI already has your context.');
265
+ break;
266
+ case 'connect':
267
+ console.log(' Run `pb connect <token>` with the token from your other workspace.');
268
+ console.log(' Each workspace gets its own profile. Switch with `pb use <profile>`.');
269
+ break;
270
+ case 'docs':
271
+ console.log(' → https://productbrain.io/docs');
272
+ break;
273
+ case 'community':
274
+ console.log(' → https://community.productbrain.io');
275
+ break;
276
+ }
277
+ process.stdout.write('\n');
278
+ }
279
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tests for pb connect command (FEAT-958 S2).
3
+ * Covers token parsing, redemption, error handling, and key saving.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=connect.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.test.d.ts","sourceRoot":"","sources":["../../src/commands/connect.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Tests for pb connect command (FEAT-958 S2).
3
+ * Covers token parsing, redemption, error handling, and key saving.
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
6
+ import { runConnect } from './connect.js';
7
+ import { CLIError, ErrorCode } from '../lib/errors.js';
8
+ // Mock withSpinner to bypass spinner logic in tests
9
+ vi.mock('../lib/spinner.js', () => ({
10
+ withSpinner: vi.fn(async (message, fn) => {
11
+ // withSpinner just calls the function immediately in tests
12
+ return fn();
13
+ }),
14
+ }));
15
+ // Mock fs operations
16
+ vi.mock('fs', () => ({
17
+ mkdirSync: vi.fn(),
18
+ writeFileSync: vi.fn(),
19
+ existsSync: vi.fn(() => false),
20
+ readFileSync: vi.fn(),
21
+ }));
22
+ // Mock @clack/prompts (connect now uses interactive prompts)
23
+ vi.mock('@clack/prompts', () => ({
24
+ select: vi.fn(async () => 'continue'),
25
+ isCancel: vi.fn(() => false),
26
+ }));
27
+ // Mock profiles (connect saves key as named profile)
28
+ vi.mock('../lib/profiles.js', () => ({
29
+ createProfile: vi.fn(),
30
+ listProfiles: vi.fn(() => []),
31
+ PROFILES_DIR: '/tmp/profiles',
32
+ }));
33
+ // Mock handshake (connect runs handshake after token redemption)
34
+ vi.mock('./handshake.js', () => ({
35
+ runHandshake: vi.fn(async () => { }),
36
+ }));
37
+ // Import mocked modules after mocking
38
+ import * as fs from 'fs';
39
+ // Mock fetch globally
40
+ const mockFetch = vi.fn();
41
+ global.fetch = mockFetch;
42
+ describe('pb connect', () => {
43
+ beforeEach(() => {
44
+ mockFetch.mockClear();
45
+ vi.clearAllMocks();
46
+ process.env.PRODUCTBRAIN_API_KEY = undefined;
47
+ process.env.CONVEX_SITE_URL = undefined;
48
+ });
49
+ afterEach(() => {
50
+ vi.clearAllMocks();
51
+ });
52
+ describe('token validation', () => {
53
+ it('rejects token without pb_ct_ prefix', async () => {
54
+ await expect(runConnect('invalid_token')).rejects.toThrow(CLIError);
55
+ // Should not make fetch call
56
+ expect(mockFetch).not.toHaveBeenCalled();
57
+ });
58
+ it('rejects token that is too short', async () => {
59
+ await expect(runConnect('pb_ct_short')).rejects.toThrow(CLIError);
60
+ expect(mockFetch).not.toHaveBeenCalled();
61
+ });
62
+ it('accepts valid token format', async () => {
63
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
64
+ mockFetch.mockResolvedValueOnce({
65
+ ok: true,
66
+ json: async () => ({
67
+ ok: true,
68
+ apiKey: 'pb_sk_test',
69
+ workspaceId: 'ws123',
70
+ workspaceName: 'My Workspace',
71
+ }),
72
+ });
73
+ await runConnect(validToken);
74
+ expect(mockFetch).toHaveBeenCalledOnce();
75
+ });
76
+ });
77
+ describe('token redemption', () => {
78
+ it('successfully redeems valid token', async () => {
79
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
80
+ const mockResponse = {
81
+ ok: true,
82
+ apiKey: 'pb_sk_redeemed123',
83
+ workspaceId: 'ws456',
84
+ workspaceName: 'Dev Workspace',
85
+ };
86
+ mockFetch.mockResolvedValueOnce({
87
+ ok: true,
88
+ json: async () => mockResponse,
89
+ });
90
+ await runConnect(validToken);
91
+ // Verify POST to /auth/redeem-connect-token
92
+ expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('/auth/redeem-connect-token'), expect.objectContaining({
93
+ method: 'POST',
94
+ headers: expect.objectContaining({ 'Content-Type': 'application/json' }),
95
+ body: JSON.stringify({ token: validToken }),
96
+ }));
97
+ // Verify profile was created and project config was written
98
+ const { createProfile } = await import('../lib/profiles.js');
99
+ expect(createProfile).toHaveBeenCalledWith('dev-workspace', 'pb_sk_redeemed123', expect.any(String));
100
+ expect(fs.writeFileSync).toHaveBeenCalled();
101
+ });
102
+ it('handles invalid_token error (400)', async () => {
103
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
104
+ mockFetch.mockResolvedValueOnce({
105
+ ok: false,
106
+ status: 400,
107
+ json: async () => ({
108
+ ok: false,
109
+ error: {
110
+ code: 'invalid_token',
111
+ message: 'Token is invalid or expired',
112
+ },
113
+ }),
114
+ });
115
+ const err = await runConnect(validToken).catch((e) => e);
116
+ expect(err).toBeInstanceOf(CLIError);
117
+ expect(err.code).toBe(ErrorCode.AUTH_INVALID);
118
+ });
119
+ it('handles workspace_not_found error (404)', async () => {
120
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
121
+ mockFetch.mockResolvedValueOnce({
122
+ ok: false,
123
+ status: 404,
124
+ json: async () => ({
125
+ ok: false,
126
+ error: {
127
+ code: 'workspace_not_found',
128
+ message: 'Workspace does not exist',
129
+ },
130
+ }),
131
+ });
132
+ const err = await runConnect(validToken).catch((e) => e);
133
+ expect(err).toBeInstanceOf(CLIError);
134
+ expect(err.code).toBe(ErrorCode.AUTH_DENIED);
135
+ });
136
+ it('handles network error (fetch failed)', async () => {
137
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
138
+ mockFetch.mockRejectedValueOnce(new Error('fetch failed'));
139
+ await expect(runConnect(validToken)).rejects.toThrow(CLIError);
140
+ const err = await runConnect(validToken).catch((e) => e);
141
+ expect(err.code).toBe(ErrorCode.NETWORK_UNREACHABLE);
142
+ });
143
+ it('handles timeout', async () => {
144
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
145
+ mockFetch.mockImplementationOnce(() => new Promise((_, reject) => {
146
+ setTimeout(() => reject(new Error('AbortError')), 10);
147
+ }));
148
+ await expect(runConnect(validToken)).rejects.toThrow(CLIError);
149
+ });
150
+ });
151
+ describe('key saving', () => {
152
+ it('saves API key as named profile', async () => {
153
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
154
+ mockFetch.mockResolvedValueOnce({
155
+ ok: true,
156
+ json: async () => ({
157
+ ok: true,
158
+ apiKey: 'pb_sk_final',
159
+ workspaceId: 'ws789',
160
+ workspaceName: 'Final Workspace',
161
+ }),
162
+ });
163
+ await runConnect(validToken);
164
+ // Profile created with slugified name and API key
165
+ const { createProfile } = await import('../lib/profiles.js');
166
+ expect(createProfile).toHaveBeenCalledWith('final-workspace', 'pb_sk_final', expect.any(String));
167
+ });
168
+ it('sets process.env for current session', async () => {
169
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
170
+ mockFetch.mockResolvedValueOnce({
171
+ ok: true,
172
+ json: async () => ({
173
+ ok: true,
174
+ apiKey: 'pb_sk_env_test',
175
+ workspaceId: 'ws999',
176
+ workspaceName: 'Env Test',
177
+ }),
178
+ });
179
+ await runConnect(validToken);
180
+ expect(process.env.PRODUCTBRAIN_API_KEY).toBe('pb_sk_env_test');
181
+ expect(process.env.CONVEX_SITE_URL).toBeTruthy();
182
+ });
183
+ });
184
+ describe('error messages', () => {
185
+ it('provides guidance for invalid token format', async () => {
186
+ try {
187
+ await runConnect('bad_token');
188
+ expect.fail('should have thrown');
189
+ }
190
+ catch (err) {
191
+ if (err instanceof CLIError) {
192
+ expect(err.guidance).toContain('pb_ct_');
193
+ }
194
+ }
195
+ });
196
+ it('provides guidance for invalid_token response', async () => {
197
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
198
+ mockFetch.mockResolvedValueOnce({
199
+ ok: false,
200
+ status: 400,
201
+ json: async () => ({
202
+ ok: false,
203
+ error: {
204
+ code: 'invalid_token',
205
+ message: 'Token is invalid',
206
+ },
207
+ }),
208
+ });
209
+ try {
210
+ await runConnect(validToken);
211
+ expect.fail('should have thrown');
212
+ }
213
+ catch (err) {
214
+ if (err instanceof CLIError) {
215
+ expect(err.message).toContain('invalid');
216
+ expect(err.guidance).toContain('onboarding');
217
+ }
218
+ }
219
+ });
220
+ it('provides guidance for network errors', async () => {
221
+ const validToken = 'pb_ct_' + 'a'.repeat(40);
222
+ mockFetch.mockRejectedValueOnce(new Error('ECONNREFUSED'));
223
+ const err = await runConnect(validToken).catch((e) => e);
224
+ expect(err).toBeInstanceOf(CLIError);
225
+ expect(err.category).toBe('network');
226
+ expect(err.guidance).toMatch(/connection|internet/i);
227
+ });
228
+ });
229
+ });
230
+ //# sourceMappingURL=connect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.test.js","sourceRoot":"","sources":["../../src/commands/connect.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * pb constellation <entry-id> — compound view: entry + grouped relations.
3
+ * BET-181 Slice 3: agents can assess a shaped bet from this single output.
4
+ *
5
+ * Chain: DEC-299 (agent-native, JSON-default), STD-65 (structured, parseable, minimal),
6
+ * ARCH-25 (orient view model pattern), DEC-99 (ALLOWED_RELATION_TYPES as SSOT)
7
+ */
8
+ export declare function runConstellation(options: {
9
+ entryId: string;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=constellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constellation.d.ts","sourceRoot":"","sources":["../../src/commands/constellation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBlF"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * pb constellation <entry-id> — compound view: entry + grouped relations.
3
+ * BET-181 Slice 3: agents can assess a shaped bet from this single output.
4
+ *
5
+ * Chain: DEC-299 (agent-native, JSON-default), STD-65 (structured, parseable, minimal),
6
+ * ARCH-25 (orient view model pattern), DEC-99 (ALLOWED_RELATION_TYPES as SSOT)
7
+ */
8
+ import { getConfigOrGuide } from '../lib/config.js';
9
+ import { mcpCall } from '../lib/client.js';
10
+ import { runCliCommand } from '../lib/runner.js';
11
+ import { formatConstellation } from '../formatters/constellation.js';
12
+ import { CLIError, ErrorCode } from '../lib/errors.js';
13
+ export async function runConstellation(options) {
14
+ const config = await getConfigOrGuide(() => runConstellation(options));
15
+ if (!config)
16
+ return;
17
+ await runCliCommand({
18
+ fn: () => mcpCall('chain.getConstellation', {
19
+ entryId: options.entryId,
20
+ }),
21
+ formatPretty: (result) => {
22
+ if (!result?.entry) {
23
+ throw new CLIError(`Entry "${options.entryId}" not found.`, {
24
+ code: ErrorCode.VALIDATION_FAILED,
25
+ category: 'validation',
26
+ guidance: 'Check the entry ID and try again. Use `pb search` to find entries.',
27
+ });
28
+ }
29
+ return formatConstellation(result);
30
+ },
31
+ });
32
+ }
33
+ //# sourceMappingURL=constellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constellation.js","sourceRoot":"","sources":["../../src/commands/constellation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAA4B,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA4B;IACjE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,aAAa,CAAsB;QACvC,EAAE,EAAE,GAAG,EAAE,CACP,OAAO,CAAsB,wBAAwB,EAAE;YACrD,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QACJ,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YACvB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,QAAQ,CAAC,UAAU,OAAO,CAAC,OAAO,cAAc,EAAE;oBAC1D,IAAI,EAAE,SAAS,CAAC,iBAAiB;oBACjC,QAAQ,EAAE,YAAY;oBACtB,QAAQ,EAAE,oEAAoE;iBAC/E,CAAC,CAAC;YACL,CAAC;YACD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * pb context <entry-id> — gather and display constellation context.
3
- * Pipe-friendly: when stdout is not a TTY, output clean markdown (no ANSI codes).
3
+ * BET-181 Slice 0: routes through runCliCommand for JSON-default output.
4
+ * Previously: pipe-friendly via process.stdout.isTTY — now delegated to runner.
4
5
  */
5
6
  export declare function runContext(options: {
6
7
  entryId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5E"}