@productbrain/cli 0.1.0-beta.7 → 0.1.0-beta.70

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 (600) 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 +377 -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/cockpit.d.ts +88 -0
  141. package/dist/commands/admin/cockpit.d.ts.map +1 -0
  142. package/dist/commands/admin/cockpit.js +409 -0
  143. package/dist/commands/admin/cockpit.js.map +1 -0
  144. package/dist/commands/admin/index.d.ts +21 -0
  145. package/dist/commands/admin/index.d.ts.map +1 -0
  146. package/dist/commands/admin/index.js +254 -0
  147. package/dist/commands/admin/index.js.map +1 -0
  148. package/dist/commands/admin/inspect.d.ts +21 -0
  149. package/dist/commands/admin/inspect.d.ts.map +1 -0
  150. package/dist/commands/admin/inspect.js +536 -0
  151. package/dist/commands/admin/inspect.js.map +1 -0
  152. package/dist/commands/admin/inspect.test.d.ts +7 -0
  153. package/dist/commands/admin/inspect.test.d.ts.map +1 -0
  154. package/dist/commands/admin/inspect.test.js +71 -0
  155. package/dist/commands/admin/inspect.test.js.map +1 -0
  156. package/dist/commands/admin/seed.d.ts +32 -0
  157. package/dist/commands/admin/seed.d.ts.map +1 -0
  158. package/dist/commands/admin/seed.js +527 -0
  159. package/dist/commands/admin/seed.js.map +1 -0
  160. package/dist/commands/admin/seed.test.d.ts +6 -0
  161. package/dist/commands/admin/seed.test.d.ts.map +1 -0
  162. package/dist/commands/admin/seed.test.js +65 -0
  163. package/dist/commands/admin/seed.test.js.map +1 -0
  164. package/dist/commands/audit.d.ts +25 -0
  165. package/dist/commands/audit.d.ts.map +1 -0
  166. package/dist/commands/audit.js +188 -0
  167. package/dist/commands/audit.js.map +1 -0
  168. package/dist/commands/brand-pack.d.ts +2 -0
  169. package/dist/commands/brand-pack.d.ts.map +1 -0
  170. package/dist/commands/brand-pack.js +25 -0
  171. package/dist/commands/brand-pack.js.map +1 -0
  172. package/dist/commands/brief.d.ts +28 -0
  173. package/dist/commands/brief.d.ts.map +1 -0
  174. package/dist/commands/brief.js +75 -0
  175. package/dist/commands/brief.js.map +1 -0
  176. package/dist/commands/capture.d.ts +30 -0
  177. package/dist/commands/capture.d.ts.map +1 -0
  178. package/dist/commands/capture.js +385 -0
  179. package/dist/commands/capture.js.map +1 -0
  180. package/dist/commands/chain-walk.d.ts +14 -0
  181. package/dist/commands/chain-walk.d.ts.map +1 -0
  182. package/dist/commands/chain-walk.js +38 -0
  183. package/dist/commands/chain-walk.js.map +1 -0
  184. package/dist/commands/changes.d.ts +11 -0
  185. package/dist/commands/changes.d.ts.map +1 -0
  186. package/dist/commands/changes.js +46 -0
  187. package/dist/commands/changes.js.map +1 -0
  188. package/dist/commands/codex-prep.d.ts +12 -0
  189. package/dist/commands/codex-prep.d.ts.map +1 -0
  190. package/dist/commands/codex-prep.js +122 -0
  191. package/dist/commands/codex-prep.js.map +1 -0
  192. package/dist/commands/collections.d.ts +22 -0
  193. package/dist/commands/collections.d.ts.map +1 -0
  194. package/dist/commands/collections.js +77 -0
  195. package/dist/commands/collections.js.map +1 -0
  196. package/dist/commands/connect-integration.test.d.ts +7 -0
  197. package/dist/commands/connect-integration.test.d.ts.map +1 -0
  198. package/dist/commands/connect-integration.test.js +200 -0
  199. package/dist/commands/connect-integration.test.js.map +1 -0
  200. package/dist/commands/connect.d.ts +21 -0
  201. package/dist/commands/connect.d.ts.map +1 -0
  202. package/dist/commands/connect.js +279 -0
  203. package/dist/commands/connect.js.map +1 -0
  204. package/dist/commands/connect.test.d.ts +6 -0
  205. package/dist/commands/connect.test.d.ts.map +1 -0
  206. package/dist/commands/connect.test.js +230 -0
  207. package/dist/commands/connect.test.js.map +1 -0
  208. package/dist/commands/constellation.d.ts +11 -0
  209. package/dist/commands/constellation.d.ts.map +1 -0
  210. package/dist/commands/constellation.js +33 -0
  211. package/dist/commands/constellation.js.map +1 -0
  212. package/dist/commands/context.d.ts +2 -1
  213. package/dist/commands/context.d.ts.map +1 -1
  214. package/dist/commands/context.js +20 -9
  215. package/dist/commands/context.js.map +1 -1
  216. package/dist/commands/cross-cut.d.ts +11 -0
  217. package/dist/commands/cross-cut.d.ts.map +1 -0
  218. package/dist/commands/cross-cut.js +23 -0
  219. package/dist/commands/cross-cut.js.map +1 -0
  220. package/dist/commands/doctor.d.ts +18 -0
  221. package/dist/commands/doctor.d.ts.map +1 -0
  222. package/dist/commands/doctor.js +232 -0
  223. package/dist/commands/doctor.js.map +1 -0
  224. package/dist/commands/doctor.test.d.ts +8 -0
  225. package/dist/commands/doctor.test.d.ts.map +1 -0
  226. package/dist/commands/doctor.test.js +311 -0
  227. package/dist/commands/doctor.test.js.map +1 -0
  228. package/dist/commands/fields.d.ts +9 -0
  229. package/dist/commands/fields.d.ts.map +1 -0
  230. package/dist/commands/fields.js +30 -0
  231. package/dist/commands/fields.js.map +1 -0
  232. package/dist/commands/get.d.ts +8 -1
  233. package/dist/commands/get.d.ts.map +1 -1
  234. package/dist/commands/get.js +60 -7
  235. package/dist/commands/get.js.map +1 -1
  236. package/dist/commands/handshake.d.ts +28 -0
  237. package/dist/commands/handshake.d.ts.map +1 -0
  238. package/dist/commands/handshake.js +617 -0
  239. package/dist/commands/handshake.js.map +1 -0
  240. package/dist/commands/ingest.d.ts +8 -2
  241. package/dist/commands/ingest.d.ts.map +1 -1
  242. package/dist/commands/ingest.js +148 -25
  243. package/dist/commands/ingest.js.map +1 -1
  244. package/dist/commands/init.d.ts +14 -0
  245. package/dist/commands/init.d.ts.map +1 -0
  246. package/dist/commands/init.js +117 -0
  247. package/dist/commands/init.js.map +1 -0
  248. package/dist/commands/login.d.ts +4 -0
  249. package/dist/commands/login.d.ts.map +1 -1
  250. package/dist/commands/login.js +101 -38
  251. package/dist/commands/login.js.map +1 -1
  252. package/dist/commands/orient.d.ts +107 -1
  253. package/dist/commands/orient.d.ts.map +1 -1
  254. package/dist/commands/orient.js +24 -8
  255. package/dist/commands/orient.js.map +1 -1
  256. package/dist/commands/profile.d.ts +24 -0
  257. package/dist/commands/profile.d.ts.map +1 -0
  258. package/dist/commands/profile.js +82 -0
  259. package/dist/commands/profile.js.map +1 -0
  260. package/dist/commands/promote.d.ts +12 -0
  261. package/dist/commands/promote.d.ts.map +1 -0
  262. package/dist/commands/promote.js +90 -0
  263. package/dist/commands/promote.js.map +1 -0
  264. package/dist/commands/proposals.d.ts +9 -0
  265. package/dist/commands/proposals.d.ts.map +1 -0
  266. package/dist/commands/proposals.js +24 -0
  267. package/dist/commands/proposals.js.map +1 -0
  268. package/dist/commands/reject.d.ts +14 -0
  269. package/dist/commands/reject.d.ts.map +1 -0
  270. package/dist/commands/reject.js +43 -0
  271. package/dist/commands/reject.js.map +1 -0
  272. package/dist/commands/relate.d.ts +16 -0
  273. package/dist/commands/relate.d.ts.map +1 -0
  274. package/dist/commands/relate.js +98 -0
  275. package/dist/commands/relate.js.map +1 -0
  276. package/dist/commands/search.d.ts +1 -0
  277. package/dist/commands/search.d.ts.map +1 -1
  278. package/dist/commands/search.js +5 -3
  279. package/dist/commands/search.js.map +1 -1
  280. package/dist/commands/session.d.ts +20 -0
  281. package/dist/commands/session.d.ts.map +1 -0
  282. package/dist/commands/session.js +148 -0
  283. package/dist/commands/session.js.map +1 -0
  284. package/dist/commands/setup.d.ts +15 -0
  285. package/dist/commands/setup.d.ts.map +1 -0
  286. package/dist/commands/setup.js +168 -0
  287. package/dist/commands/setup.js.map +1 -0
  288. package/dist/commands/update.d.ts +17 -0
  289. package/dist/commands/update.d.ts.map +1 -0
  290. package/dist/commands/update.js +178 -0
  291. package/dist/commands/update.js.map +1 -0
  292. package/dist/commands/verify.d.ts +13 -0
  293. package/dist/commands/verify.d.ts.map +1 -0
  294. package/dist/commands/verify.js +49 -0
  295. package/dist/commands/verify.js.map +1 -0
  296. package/dist/commands/workspace.d.ts +41 -0
  297. package/dist/commands/workspace.d.ts.map +1 -0
  298. package/dist/commands/workspace.js +239 -0
  299. package/dist/commands/workspace.js.map +1 -0
  300. package/dist/formatters/audit.d.ts +46 -0
  301. package/dist/formatters/audit.d.ts.map +1 -0
  302. package/dist/formatters/audit.js +81 -0
  303. package/dist/formatters/audit.js.map +1 -0
  304. package/dist/formatters/brief.d.ts +112 -0
  305. package/dist/formatters/brief.d.ts.map +1 -0
  306. package/dist/formatters/brief.js +179 -0
  307. package/dist/formatters/brief.js.map +1 -0
  308. package/dist/formatters/capture.d.ts +48 -0
  309. package/dist/formatters/capture.d.ts.map +1 -0
  310. package/dist/formatters/capture.js +77 -0
  311. package/dist/formatters/capture.js.map +1 -0
  312. package/dist/formatters/chain-walk.d.ts +33 -0
  313. package/dist/formatters/chain-walk.d.ts.map +1 -0
  314. package/dist/formatters/chain-walk.js +54 -0
  315. package/dist/formatters/chain-walk.js.map +1 -0
  316. package/dist/formatters/changes.d.ts +25 -0
  317. package/dist/formatters/changes.d.ts.map +1 -0
  318. package/dist/formatters/changes.js +60 -0
  319. package/dist/formatters/changes.js.map +1 -0
  320. package/dist/formatters/collections.d.ts +40 -0
  321. package/dist/formatters/collections.d.ts.map +1 -0
  322. package/dist/formatters/collections.js +93 -0
  323. package/dist/formatters/collections.js.map +1 -0
  324. package/dist/formatters/constellation.d.ts +34 -0
  325. package/dist/formatters/constellation.d.ts.map +1 -0
  326. package/dist/formatters/constellation.js +38 -0
  327. package/dist/formatters/constellation.js.map +1 -0
  328. package/dist/formatters/cross-cut.d.ts +21 -0
  329. package/dist/formatters/cross-cut.d.ts.map +1 -0
  330. package/dist/formatters/cross-cut.js +32 -0
  331. package/dist/formatters/cross-cut.js.map +1 -0
  332. package/dist/formatters/entry.d.ts +11 -4
  333. package/dist/formatters/entry.d.ts.map +1 -1
  334. package/dist/formatters/entry.js +24 -8
  335. package/dist/formatters/entry.js.map +1 -1
  336. package/dist/formatters/fields.d.ts +32 -0
  337. package/dist/formatters/fields.d.ts.map +1 -0
  338. package/dist/formatters/fields.js +49 -0
  339. package/dist/formatters/fields.js.map +1 -0
  340. package/dist/formatters/handshake.d.ts +24 -0
  341. package/dist/formatters/handshake.d.ts.map +1 -0
  342. package/dist/formatters/handshake.js +69 -0
  343. package/dist/formatters/handshake.js.map +1 -0
  344. package/dist/formatters/orient.d.ts +104 -1
  345. package/dist/formatters/orient.d.ts.map +1 -1
  346. package/dist/formatters/orient.js +140 -17
  347. package/dist/formatters/orient.js.map +1 -1
  348. package/dist/formatters/promote.d.ts +30 -0
  349. package/dist/formatters/promote.d.ts.map +1 -0
  350. package/dist/formatters/promote.js +39 -0
  351. package/dist/formatters/promote.js.map +1 -0
  352. package/dist/formatters/proposals.d.ts +45 -0
  353. package/dist/formatters/proposals.d.ts.map +1 -0
  354. package/dist/formatters/proposals.js +62 -0
  355. package/dist/formatters/proposals.js.map +1 -0
  356. package/dist/formatters/relate.d.ts +14 -0
  357. package/dist/formatters/relate.d.ts.map +1 -0
  358. package/dist/formatters/relate.js +16 -0
  359. package/dist/formatters/relate.js.map +1 -0
  360. package/dist/formatters/search.d.ts +0 -4
  361. package/dist/formatters/search.d.ts.map +1 -1
  362. package/dist/formatters/search.js +4 -1
  363. package/dist/formatters/search.js.map +1 -1
  364. package/dist/formatters/session.d.ts +11 -0
  365. package/dist/formatters/session.d.ts.map +1 -0
  366. package/dist/formatters/session.js +53 -0
  367. package/dist/formatters/session.js.map +1 -0
  368. package/dist/formatters/update.d.ts +17 -0
  369. package/dist/formatters/update.d.ts.map +1 -0
  370. package/dist/formatters/update.js +45 -0
  371. package/dist/formatters/update.js.map +1 -0
  372. package/dist/formatters/verify.d.ts +11 -0
  373. package/dist/formatters/verify.d.ts.map +1 -0
  374. package/dist/formatters/verify.js +11 -0
  375. package/dist/formatters/verify.js.map +1 -0
  376. package/dist/generators/__tests__/surface-profiles.test.d.ts +2 -0
  377. package/dist/generators/__tests__/surface-profiles.test.d.ts.map +1 -0
  378. package/dist/generators/__tests__/surface-profiles.test.js +89 -0
  379. package/dist/generators/__tests__/surface-profiles.test.js.map +1 -0
  380. package/dist/generators/adapters.d.ts +44 -0
  381. package/dist/generators/adapters.d.ts.map +1 -0
  382. package/dist/generators/adapters.js +290 -0
  383. package/dist/generators/adapters.js.map +1 -0
  384. package/dist/generators/adapters.test.d.ts +2 -0
  385. package/dist/generators/adapters.test.d.ts.map +1 -0
  386. package/dist/generators/adapters.test.js +27 -0
  387. package/dist/generators/adapters.test.js.map +1 -0
  388. package/dist/generators/archetypes.d.ts +52 -0
  389. package/dist/generators/archetypes.d.ts.map +1 -0
  390. package/dist/generators/archetypes.js +153 -0
  391. package/dist/generators/archetypes.js.map +1 -0
  392. package/dist/generators/archetypes.test.d.ts +2 -0
  393. package/dist/generators/archetypes.test.d.ts.map +1 -0
  394. package/dist/generators/archetypes.test.js +237 -0
  395. package/dist/generators/archetypes.test.js.map +1 -0
  396. package/dist/generators/briefing-md.d.ts +8 -0
  397. package/dist/generators/briefing-md.d.ts.map +1 -0
  398. package/dist/generators/briefing-md.js +51 -0
  399. package/dist/generators/briefing-md.js.map +1 -0
  400. package/dist/generators/chain-classifier.d.ts +49 -0
  401. package/dist/generators/chain-classifier.d.ts.map +1 -0
  402. package/dist/generators/chain-classifier.js +180 -0
  403. package/dist/generators/chain-classifier.js.map +1 -0
  404. package/dist/generators/chain-classifier.test.d.ts +2 -0
  405. package/dist/generators/chain-classifier.test.d.ts.map +1 -0
  406. package/dist/generators/chain-classifier.test.js +257 -0
  407. package/dist/generators/chain-classifier.test.js.map +1 -0
  408. package/dist/generators/chain-rules.d.ts +42 -0
  409. package/dist/generators/chain-rules.d.ts.map +1 -0
  410. package/dist/generators/chain-rules.js +144 -0
  411. package/dist/generators/chain-rules.js.map +1 -0
  412. package/dist/generators/chain-rules.test.d.ts +2 -0
  413. package/dist/generators/chain-rules.test.d.ts.map +1 -0
  414. package/dist/generators/chain-rules.test.js +179 -0
  415. package/dist/generators/chain-rules.test.js.map +1 -0
  416. package/dist/generators/context-md.d.ts +8 -0
  417. package/dist/generators/context-md.d.ts.map +1 -0
  418. package/dist/generators/context-md.js +134 -0
  419. package/dist/generators/context-md.js.map +1 -0
  420. package/dist/generators/handshake-diff.d.ts +67 -0
  421. package/dist/generators/handshake-diff.d.ts.map +1 -0
  422. package/dist/generators/handshake-diff.js +183 -0
  423. package/dist/generators/handshake-diff.js.map +1 -0
  424. package/dist/generators/handshake-diff.test.d.ts +2 -0
  425. package/dist/generators/handshake-diff.test.d.ts.map +1 -0
  426. package/dist/generators/handshake-diff.test.js +264 -0
  427. package/dist/generators/handshake-diff.test.js.map +1 -0
  428. package/dist/generators/portable-knowledge.d.ts +143 -0
  429. package/dist/generators/portable-knowledge.d.ts.map +1 -0
  430. package/dist/generators/portable-knowledge.js +504 -0
  431. package/dist/generators/portable-knowledge.js.map +1 -0
  432. package/dist/generators/portable-knowledge.test.d.ts +2 -0
  433. package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
  434. package/dist/generators/portable-knowledge.test.js +927 -0
  435. package/dist/generators/portable-knowledge.test.js.map +1 -0
  436. package/dist/generators/surface-profiles.d.ts +49 -0
  437. package/dist/generators/surface-profiles.d.ts.map +1 -0
  438. package/dist/generators/surface-profiles.js +98 -0
  439. package/dist/generators/surface-profiles.js.map +1 -0
  440. package/dist/index.d.ts +3 -2
  441. package/dist/index.d.ts.map +1 -1
  442. package/dist/index.js +642 -37
  443. package/dist/index.js.map +1 -1
  444. package/dist/lib/activation.d.ts +28 -0
  445. package/dist/lib/activation.d.ts.map +1 -0
  446. package/dist/lib/activation.js +57 -0
  447. package/dist/lib/activation.js.map +1 -0
  448. package/dist/lib/activation.test.d.ts +6 -0
  449. package/dist/lib/activation.test.d.ts.map +1 -0
  450. package/dist/lib/activation.test.js +121 -0
  451. package/dist/lib/activation.test.js.map +1 -0
  452. package/dist/lib/client.d.ts +61 -0
  453. package/dist/lib/client.d.ts.map +1 -1
  454. package/dist/lib/client.js +258 -12
  455. package/dist/lib/client.js.map +1 -1
  456. package/dist/lib/config.d.ts +84 -4
  457. package/dist/lib/config.d.ts.map +1 -1
  458. package/dist/lib/config.js +322 -42
  459. package/dist/lib/config.js.map +1 -1
  460. package/dist/lib/constants.d.ts +42 -0
  461. package/dist/lib/constants.d.ts.map +1 -0
  462. package/dist/lib/constants.js +76 -0
  463. package/dist/lib/constants.js.map +1 -0
  464. package/dist/lib/conversation-engine.d.ts +45 -0
  465. package/dist/lib/conversation-engine.d.ts.map +1 -0
  466. package/dist/lib/conversation-engine.js +112 -0
  467. package/dist/lib/conversation-engine.js.map +1 -0
  468. package/dist/lib/conversation-phases.d.ts +59 -0
  469. package/dist/lib/conversation-phases.d.ts.map +1 -0
  470. package/dist/lib/conversation-phases.js +11 -0
  471. package/dist/lib/conversation-phases.js.map +1 -0
  472. package/dist/lib/conversation-signals.d.ts +30 -0
  473. package/dist/lib/conversation-signals.d.ts.map +1 -0
  474. package/dist/lib/conversation-signals.js +64 -0
  475. package/dist/lib/conversation-signals.js.map +1 -0
  476. package/dist/lib/deployment.d.ts +23 -0
  477. package/dist/lib/deployment.d.ts.map +1 -0
  478. package/dist/lib/deployment.js +78 -0
  479. package/dist/lib/deployment.js.map +1 -0
  480. package/dist/lib/deployment.test.d.ts +5 -0
  481. package/dist/lib/deployment.test.d.ts.map +1 -0
  482. package/dist/lib/deployment.test.js +54 -0
  483. package/dist/lib/deployment.test.js.map +1 -0
  484. package/dist/lib/errors.d.ts +58 -0
  485. package/dist/lib/errors.d.ts.map +1 -0
  486. package/dist/lib/errors.js +67 -0
  487. package/dist/lib/errors.js.map +1 -0
  488. package/dist/lib/experiment.d.ts +18 -0
  489. package/dist/lib/experiment.d.ts.map +1 -0
  490. package/dist/lib/experiment.js +28 -0
  491. package/dist/lib/experiment.js.map +1 -0
  492. package/dist/lib/format.d.ts +10 -0
  493. package/dist/lib/format.d.ts.map +1 -0
  494. package/dist/lib/format.js +27 -0
  495. package/dist/lib/format.js.map +1 -0
  496. package/dist/lib/glossary.d.ts +19 -0
  497. package/dist/lib/glossary.d.ts.map +1 -0
  498. package/dist/lib/glossary.js +53 -0
  499. package/dist/lib/glossary.js.map +1 -0
  500. package/dist/lib/onboarding-path-b.d.ts +10 -0
  501. package/dist/lib/onboarding-path-b.d.ts.map +1 -0
  502. package/dist/lib/onboarding-path-b.js +214 -0
  503. package/dist/lib/onboarding-path-b.js.map +1 -0
  504. package/dist/lib/onboarding-phases.d.ts +9 -0
  505. package/dist/lib/onboarding-phases.d.ts.map +1 -0
  506. package/dist/lib/onboarding-phases.js +120 -0
  507. package/dist/lib/onboarding-phases.js.map +1 -0
  508. package/dist/lib/onboarding-shared.d.ts +81 -0
  509. package/dist/lib/onboarding-shared.d.ts.map +1 -0
  510. package/dist/lib/onboarding-shared.js +190 -0
  511. package/dist/lib/onboarding-shared.js.map +1 -0
  512. package/dist/lib/onboarding-topics.d.ts +27 -0
  513. package/dist/lib/onboarding-topics.d.ts.map +1 -0
  514. package/dist/lib/onboarding-topics.js +57 -0
  515. package/dist/lib/onboarding-topics.js.map +1 -0
  516. package/dist/lib/onboarding.d.ts +17 -0
  517. package/dist/lib/onboarding.d.ts.map +1 -0
  518. package/dist/lib/onboarding.js +350 -0
  519. package/dist/lib/onboarding.js.map +1 -0
  520. package/dist/lib/profiles.d.ts +39 -0
  521. package/dist/lib/profiles.d.ts.map +1 -0
  522. package/dist/lib/profiles.js +185 -0
  523. package/dist/lib/profiles.js.map +1 -0
  524. package/dist/lib/prompts.d.ts +65 -0
  525. package/dist/lib/prompts.d.ts.map +1 -0
  526. package/dist/lib/prompts.js +132 -0
  527. package/dist/lib/prompts.js.map +1 -0
  528. package/dist/lib/repo-detect.d.ts +33 -0
  529. package/dist/lib/repo-detect.d.ts.map +1 -0
  530. package/dist/lib/repo-detect.js +83 -0
  531. package/dist/lib/repo-detect.js.map +1 -0
  532. package/dist/lib/runner.d.ts +33 -0
  533. package/dist/lib/runner.d.ts.map +1 -0
  534. package/dist/lib/runner.js +79 -0
  535. package/dist/lib/runner.js.map +1 -0
  536. package/dist/lib/session.d.ts +17 -0
  537. package/dist/lib/session.d.ts.map +1 -0
  538. package/dist/lib/session.js +43 -0
  539. package/dist/lib/session.js.map +1 -0
  540. package/dist/lib/spinner.d.ts +27 -0
  541. package/dist/lib/spinner.d.ts.map +1 -0
  542. package/dist/lib/spinner.js +76 -0
  543. package/dist/lib/spinner.js.map +1 -0
  544. package/dist/lib/spinner.test.d.ts +2 -0
  545. package/dist/lib/spinner.test.d.ts.map +1 -0
  546. package/dist/lib/spinner.test.js +39 -0
  547. package/dist/lib/spinner.test.js.map +1 -0
  548. package/dist/lib/strip.d.ts +12 -0
  549. package/dist/lib/strip.d.ts.map +1 -0
  550. package/dist/lib/strip.js +41 -0
  551. package/dist/lib/strip.js.map +1 -0
  552. package/dist/lib/style.d.ts +94 -0
  553. package/dist/lib/style.d.ts.map +1 -0
  554. package/dist/lib/style.js +167 -0
  555. package/dist/lib/style.js.map +1 -0
  556. package/dist/lib/style.test.d.ts +7 -0
  557. package/dist/lib/style.test.d.ts.map +1 -0
  558. package/dist/lib/style.test.js +263 -0
  559. package/dist/lib/style.test.js.map +1 -0
  560. package/dist/lib/telemetry.d.ts +15 -0
  561. package/dist/lib/telemetry.d.ts.map +1 -0
  562. package/dist/lib/telemetry.js +47 -0
  563. package/dist/lib/telemetry.js.map +1 -0
  564. package/dist/lib/tokenConstants.d.ts +17 -0
  565. package/dist/lib/tokenConstants.d.ts.map +1 -0
  566. package/dist/lib/tokenConstants.js +17 -0
  567. package/dist/lib/tokenConstants.js.map +1 -0
  568. package/dist/lib/wizard-surfaces.d.ts +47 -0
  569. package/dist/lib/wizard-surfaces.d.ts.map +1 -0
  570. package/dist/lib/wizard-surfaces.js +176 -0
  571. package/dist/lib/wizard-surfaces.js.map +1 -0
  572. package/dist/lib/wizard-surfaces.test.d.ts +2 -0
  573. package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
  574. package/dist/lib/wizard-surfaces.test.js +127 -0
  575. package/dist/lib/wizard-surfaces.test.js.map +1 -0
  576. package/dist/lib/wizard-trust.d.ts +31 -0
  577. package/dist/lib/wizard-trust.d.ts.map +1 -0
  578. package/dist/lib/wizard-trust.js +66 -0
  579. package/dist/lib/wizard-trust.js.map +1 -0
  580. package/dist/lib/wizard-trust.test.d.ts +2 -0
  581. package/dist/lib/wizard-trust.test.d.ts.map +1 -0
  582. package/dist/lib/wizard-trust.test.js +32 -0
  583. package/dist/lib/wizard-trust.test.js.map +1 -0
  584. package/dist/lib/workspace-probe.d.ts +16 -0
  585. package/dist/lib/workspace-probe.d.ts.map +1 -0
  586. package/dist/lib/workspace-probe.js +33 -0
  587. package/dist/lib/workspace-probe.js.map +1 -0
  588. package/package.json +13 -4
  589. package/templates/archetypes/boundary.md +23 -0
  590. package/templates/archetypes/constraint.md +23 -0
  591. package/templates/archetypes/convention.md +23 -0
  592. package/templates/archetypes/policy.md +23 -0
  593. package/templates/archetypes/quality-gate.md +23 -0
  594. package/templates/archetypes/workflow.md +23 -0
  595. package/templates/general/code-integrity.md +11 -0
  596. package/templates/general/getting-started.md +12 -0
  597. package/templates/node-ts/code-integrity.md +13 -0
  598. package/templates/node-ts/testing.md +12 -0
  599. package/templates/python/code-integrity.md +13 -0
  600. package/templates/python/testing.md +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+CAA+C;AAC/C,eAAO,MAAM,gBAAgB,oCAAoC,CAAC;AAiBlE;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAQnE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,IAAI,OAAO,CAEnC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * CLI constants — single source of truth for URLs and environment switching.
3
+ * WP-301 Slice 0: Extract hardcoded URLs, add PB_ENV awareness.
4
+ */
5
+ /** Production Convex HTTP Actions endpoint. */
6
+ export const DEFAULT_SITE_URL = 'https://gateway.productbrain.io';
7
+ /** Hostname lists for banners + admin seed gates live in `deployment.ts` (PRODUCTION_HOSTS, DEV_CLOUD_HOSTS). */
8
+ /** Production web app URL. */
9
+ const PROD_APP_URL = 'https://work.productbrain.io';
10
+ /**
11
+ * Legacy: intended for a local Convex dev server, but Convex HTTP Actions
12
+ * are always cloud-hosted (`npx convex dev` syncs to *.convex.site).
13
+ * Only used by resolveSiteUrl() which has no production consumers.
14
+ */
15
+ const DEV_SITE_URL = 'http://localhost:5176';
16
+ /** Local web app URL. */
17
+ const DEV_APP_URL = 'http://localhost:5173';
18
+ /**
19
+ * Resolve the Convex site URL based on PB_ENV.
20
+ * - PB_ENV=dev → DEV_SITE_URL (localhost — see caveat on DEV_SITE_URL)
21
+ * - PB_ENV=production or unset → production URL
22
+ *
23
+ * NOTE: No production CLI command currently imports this function.
24
+ * For HTTP Actions (connect, etc.), use CONVEX_SITE_URL or DEFAULT_SITE_URL.
25
+ */
26
+ export function resolveSiteUrl() {
27
+ const env = process.env.PB_ENV?.toLowerCase();
28
+ if (env === 'dev')
29
+ return DEV_SITE_URL;
30
+ return DEFAULT_SITE_URL;
31
+ }
32
+ /**
33
+ * Gateway URL for `pb connect` token redemption (`POST …/auth/redeem-connect-token`).
34
+ *
35
+ * Resolution order:
36
+ * 1. `cliGateway` argument (from `pb connect --gateway <url>`)
37
+ * 2. `PB_CONNECT_GATEWAY_URL` env var
38
+ * 3. `CONVEX_SITE_URL` env var — the actual Convex HTTP Actions deployment
39
+ * 4. `DEFAULT_SITE_URL` (production gateway)
40
+ *
41
+ * Convex HTTP Actions are cloud-hosted even during local development
42
+ * (`npx convex dev` syncs to cloud, not localhost). Tokens minted by
43
+ * any web app (production or localhost) live in the cloud Convex DB,
44
+ * so redeem must target the cloud deployment — never localhost.
45
+ *
46
+ * For dev deployments: set CONVEX_SITE_URL to your *.convex.site URL
47
+ * or use --gateway.
48
+ */
49
+ export function resolveConnectRedeemUrl(cliGateway) {
50
+ const fromCli = cliGateway?.trim();
51
+ if (fromCli)
52
+ return fromCli.replace(/\/$/, '');
53
+ const fromEnv = process.env.PB_CONNECT_GATEWAY_URL?.trim();
54
+ if (fromEnv)
55
+ return fromEnv.replace(/\/$/, '');
56
+ const fromConvex = process.env.CONVEX_SITE_URL?.trim();
57
+ if (fromConvex)
58
+ return fromConvex.replace(/\/$/, '');
59
+ return DEFAULT_SITE_URL;
60
+ }
61
+ /**
62
+ * Resolve the web app URL based on PB_ENV.
63
+ * - PB_ENV=dev → localhost:5173
64
+ * - PB_ENV=production or unset → work.productbrain.io
65
+ */
66
+ export function resolveAppUrl() {
67
+ const env = process.env.PB_ENV?.toLowerCase();
68
+ if (env === 'dev')
69
+ return DEV_APP_URL;
70
+ return PROD_APP_URL;
71
+ }
72
+ /** Whether the CLI is running in dev mode. */
73
+ export function isDevMode() {
74
+ return process.env.PB_ENV?.toLowerCase() === 'dev';
75
+ }
76
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAElE,iHAAiH;AAEjH,8BAA8B;AAC9B,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAEpD;;;;GAIG;AACH,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C,yBAAyB;AACzB,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAC9C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IACvC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAmB;IACzD,MAAM,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IAC3D,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IACvD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAC9C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,WAAW,CAAC;IACtC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC;AACrD,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Conversation engine — topic evaluation, XML directive builder, post-processing.
3
+ * WP-304: Coach pattern — LLM judges topic completion, heuristic backup.
4
+ *
5
+ * The engine evaluates topic completion and builds XML directives.
6
+ * It does NOT generate content — that's the LLM's job.
7
+ */
8
+ import type { ConversationState, ConversationSignals, TopicQA } from './conversation-phases.js';
9
+ import type { OnboardingTopic } from './onboarding-topics.js';
10
+ /** Result of evaluating the current topic. */
11
+ export interface TopicEvalResult {
12
+ /** Whether the current topic is complete. */
13
+ complete: boolean;
14
+ /** Whether advancement was forced by maxExchanges. */
15
+ forced: boolean;
16
+ /** Whether this topic was skipped (signal already present). */
17
+ skip: boolean;
18
+ }
19
+ /**
20
+ * Check if a topic should be skipped because its signal is already present.
21
+ * Only skips if we have enough content for quality extraction (>= 20 words).
22
+ */
23
+ export declare function shouldSkipTopic(topic: OnboardingTopic, signals: ConversationSignals, totalUserWords: number): boolean;
24
+ /**
25
+ * Evaluate whether the current topic is complete.
26
+ * Priority: skip > LLM judgment > heuristic backup > forced > continue.
27
+ */
28
+ export declare function evaluateTopic(topic: OnboardingTopic, state: ConversationState, llmSaidComplete: boolean): TopicEvalResult;
29
+ /**
30
+ * Build the XML topic directive to inject into the system prompt.
31
+ * Renders <topic> with goal/behaviour/criteria, plus <accumulated_context>
32
+ * with completed Q&A pairs from earlier topics.
33
+ */
34
+ export declare function buildTopicDirective(topic: OnboardingTopic, topicIndex: number, totalTopics: number, completedQA: TopicQA[], workspaceName: string): string;
35
+ /**
36
+ * Strip banned patterns the LLM produces despite prompt instructions.
37
+ * Safety net — Gemini Flash at temp 0.3 still produces these ~15% of the time.
38
+ */
39
+ export declare function sanitizeResponse(text: string): string;
40
+ /**
41
+ * Detect if a response is too similar to recent ones (refusal loop).
42
+ * Uses Jaccard similarity on word sets.
43
+ */
44
+ export declare function isTooSimilar(newMsg: string, recentMsgs: string[], threshold?: number): boolean;
45
+ //# sourceMappingURL=conversation-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-engine.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAElB,sDAAsD;IACtD,MAAM,EAAE,OAAO,CAAC;IAEhB,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;CACf;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAIrH;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,iBAAiB,EACxB,eAAe,EAAE,OAAO,GACvB,eAAe,CAyBjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,OAAO,EAAE,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,CAoBR;AAcD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,SAAM,GAAG,OAAO,CAW3F"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Conversation engine — topic evaluation, XML directive builder, post-processing.
3
+ * WP-304: Coach pattern — LLM judges topic completion, heuristic backup.
4
+ *
5
+ * The engine evaluates topic completion and builds XML directives.
6
+ * It does NOT generate content — that's the LLM's job.
7
+ */
8
+ /**
9
+ * Minimum user words before topic skipping is allowed.
10
+ * Below this threshold, the conversation is too thin for quality extraction —
11
+ * keep asking even if LLM signals say the topic is covered.
12
+ */
13
+ const MIN_WORDS_FOR_SKIP = 20;
14
+ /**
15
+ * Check if a topic should be skipped because its signal is already present.
16
+ * Only skips if we have enough content for quality extraction (>= 20 words).
17
+ */
18
+ export function shouldSkipTopic(topic, signals, totalUserWords) {
19
+ if (topic.skipIfSignal === null)
20
+ return false;
21
+ if (totalUserWords < MIN_WORDS_FOR_SKIP)
22
+ return false;
23
+ return signals[topic.skipIfSignal] === true;
24
+ }
25
+ /**
26
+ * Evaluate whether the current topic is complete.
27
+ * Priority: skip > LLM judgment > heuristic backup > forced > continue.
28
+ */
29
+ export function evaluateTopic(topic, state, llmSaidComplete) {
30
+ // 1. Skip: signal already present from earlier topics (only if enough content)
31
+ if (shouldSkipTopic(topic, state.signals, state.totalUserWords)) {
32
+ return { complete: true, forced: false, skip: true };
33
+ }
34
+ const exchanges = state.topicExchanges[topic.id] ?? 0;
35
+ // 2. LLM says complete (require at least 1 exchange to prevent premature completion)
36
+ if (llmSaidComplete && exchanges >= 1) {
37
+ return { complete: true, forced: false, skip: false };
38
+ }
39
+ // 3. Heuristic backup: signal detected even if LLM didn't say complete
40
+ if (topic.heuristicSignal && state.signals[topic.heuristicSignal] === true && exchanges >= 1) {
41
+ return { complete: true, forced: false, skip: false };
42
+ }
43
+ // 4. Forced: max exchanges hit
44
+ if (exchanges >= topic.maxExchanges) {
45
+ return { complete: true, forced: true, skip: false };
46
+ }
47
+ // 5. Continue
48
+ return { complete: false, forced: false, skip: false };
49
+ }
50
+ /**
51
+ * Build the XML topic directive to inject into the system prompt.
52
+ * Renders <topic> with goal/behaviour/criteria, plus <accumulated_context>
53
+ * with completed Q&A pairs from earlier topics.
54
+ */
55
+ export function buildTopicDirective(topic, topicIndex, totalTopics, completedQA, workspaceName) {
56
+ let xml = `
57
+ <topic id="${topic.id}" index="${topicIndex + 1}" of="${totalTopics}">
58
+ <goal>${topic.goal}</goal>
59
+ <behaviour>${topic.behaviour}</behaviour>
60
+ <criteria>${topic.criteria}</criteria>
61
+ </topic>`;
62
+ if (completedQA.length > 0) {
63
+ xml += '\n\n<accumulated_context>';
64
+ for (const qa of completedQA) {
65
+ xml += `\n <topic_qa id="${qa.topicId}">`;
66
+ xml += `\n <question>${qa.question}</question>`;
67
+ xml += `\n <answer>${qa.answer}</answer>`;
68
+ xml += '\n </topic_qa>';
69
+ }
70
+ xml += '\n</accumulated_context>';
71
+ }
72
+ return xml;
73
+ }
74
+ // ── Post-processing ─────────────────────────────────────────────────────────
75
+ const BANNED_PATTERNS = [
76
+ /\bsounds like\b/gi,
77
+ /\bit sounds like\b/gi,
78
+ /\bsounds\s+(?:ambitious|exciting|fascinating|impressive|intriguing|interesting|amazing|complex|like)\b/gi,
79
+ /\bintriguing\b/gi,
80
+ // Anti-paraphrase: strip "When you say X," and "You mentioned X," prefixes
81
+ /^when you (?:say|mention|talk about)\b[^.?!]{0,60}[,]\s*/i,
82
+ /^you mentioned\b[^.?!]{0,60}[,]\s*/i,
83
+ ];
84
+ /**
85
+ * Strip banned patterns the LLM produces despite prompt instructions.
86
+ * Safety net — Gemini Flash at temp 0.3 still produces these ~15% of the time.
87
+ */
88
+ export function sanitizeResponse(text) {
89
+ let cleaned = text;
90
+ for (const pattern of BANNED_PATTERNS) {
91
+ cleaned = cleaned.replace(pattern, '');
92
+ }
93
+ // Clean up double spaces and leading punctuation from removals
94
+ return cleaned.replace(/\s{2,}/g, ' ').replace(/^\s*[.,]\s*/, '').trim();
95
+ }
96
+ /**
97
+ * Detect if a response is too similar to recent ones (refusal loop).
98
+ * Uses Jaccard similarity on word sets.
99
+ */
100
+ export function isTooSimilar(newMsg, recentMsgs, threshold = 0.6) {
101
+ const newWords = new Set(newMsg.toLowerCase().split(/\s+/));
102
+ for (const prev of recentMsgs.slice(-2)) {
103
+ const prevWords = new Set(prev.toLowerCase().split(/\s+/));
104
+ const intersection = new Set([...newWords].filter((w) => prevWords.has(w)));
105
+ const union = new Set([...newWords, ...prevWords]);
106
+ if (union.size > 0 && intersection.size / union.size > threshold) {
107
+ return true;
108
+ }
109
+ }
110
+ return false;
111
+ }
112
+ //# sourceMappingURL=conversation-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-engine.js","sourceRoot":"","sources":["../../src/lib/conversation-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Conversation types — state and signal types for coach-pattern conversations.
3
+ * WP-304: LLM owns content, CLI owns flow.
4
+ *
5
+ * Pattern: Deterministic Shell, Stochastic Core.
6
+ * - CLI defines topics with goal/behaviour/criteria (deterministic)
7
+ * - LLM generates conversation content and judges criteria (stochastic)
8
+ * - CLI evaluates with heuristic backup and decides when to advance
9
+ */
10
+ /** A completed topic's question-answer pair, accumulated as context for later topics. */
11
+ export interface TopicQA {
12
+ topicId: string;
13
+ question: string;
14
+ answer: string;
15
+ }
16
+ /** Conversation state — the CLI's accumulated view of the conversation. */
17
+ export interface ConversationState {
18
+ /** All messages so far. */
19
+ messages: Array<{
20
+ role: 'user' | 'assistant';
21
+ content: string;
22
+ }>;
23
+ /** Number of user messages total. */
24
+ userMessageCount: number;
25
+ /** Total user words total. */
26
+ totalUserWords: number;
27
+ /** Exchange count per topic (coach pattern) or phase (legacy). */
28
+ topicExchanges: Record<string, number>;
29
+ /** @deprecated Alias for topicExchanges — used by legacy phase engine until Slice 3. */
30
+ phaseExchanges: Record<string, number>;
31
+ /** Which topics have been completed. */
32
+ completedTopics: Set<string>;
33
+ /** @deprecated Alias for completedTopics — used by legacy phase engine until Slice 3. */
34
+ completedPhases: Set<string>;
35
+ /** Current topic ID. */
36
+ currentTopicId: string;
37
+ /** @deprecated Alias for currentTopicId — used by legacy phase engine until Slice 3. */
38
+ currentPhaseId: string;
39
+ /** Completed topic Q&A pairs — accumulated context for later topics. */
40
+ completedQA: TopicQA[];
41
+ /** Heuristic signals detected from user messages. */
42
+ signals: ConversationSignals;
43
+ /** Count of consecutive refusals/non-answers. */
44
+ refusalStreak: number;
45
+ }
46
+ /** Signals detected from user messages — heuristic + LLM-reported. */
47
+ export interface ConversationSignals {
48
+ /** User described what they're building. */
49
+ mentionedProduct: boolean;
50
+ /** User described a problem, pain point, or challenge. */
51
+ mentionedChallenge: boolean;
52
+ /** User mentioned why they're trying Product Brain. */
53
+ mentionedWhyPB: boolean;
54
+ /** User gave at least one substantive answer (>= 15 words). */
55
+ hasSubstantiveAnswer: boolean;
56
+ /** Number of user messages with >= 8 words. */
57
+ substantiveMessageCount: number;
58
+ }
59
+ //# sourceMappingURL=conversation-phases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-phases.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-phases.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yFAAyF;AACzF,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEjE,qCAAqC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IAEvB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,wCAAwC;IACxC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,yFAAyF;IACzF,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE7B,wBAAwB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IAEvB,wEAAwE;IACxE,WAAW,EAAE,OAAO,EAAE,CAAC;IAEvB,qDAAqD;IACrD,OAAO,EAAE,mBAAmB,CAAC;IAE7B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAE1B,0DAA0D;IAC1D,kBAAkB,EAAE,OAAO,CAAC;IAE5B,uDAAuD;IACvD,cAAc,EAAE,OAAO,CAAC;IAExB,+DAA+D;IAC/D,oBAAoB,EAAE,OAAO,CAAC;IAE9B,+CAA+C;IAC/C,uBAAuB,EAAE,MAAM,CAAC;CACjC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Conversation types — state and signal types for coach-pattern conversations.
3
+ * WP-304: LLM owns content, CLI owns flow.
4
+ *
5
+ * Pattern: Deterministic Shell, Stochastic Core.
6
+ * - CLI defines topics with goal/behaviour/criteria (deterministic)
7
+ * - LLM generates conversation content and judges criteria (stochastic)
8
+ * - CLI evaluates with heuristic backup and decides when to advance
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=conversation-phases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-phases.js","sourceRoot":"","sources":["../../src/lib/conversation-phases.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Conversation signal detection — heuristic pattern matching on user text.
3
+ * WP-304: CLI-side signal detection as backup/validation for LLM-reported signals.
4
+ *
5
+ * These are intentionally loose. False positives advance the conversation
6
+ * (fine — user gave a relevant answer). False negatives mean one more turn
7
+ * in the phase (also fine — maxExchanges caps prevent loops).
8
+ */
9
+ import type { ConversationSignals } from './conversation-phases.js';
10
+ /**
11
+ * Detect signals from user messages using regex heuristics.
12
+ * Returns accumulated signals across all user messages.
13
+ *
14
+ * Thresholds are intentionally strict — we'd rather ask one more question
15
+ * than advance on a vague answer. maxExchanges is the safety valve.
16
+ */
17
+ export declare function detectSignals(messages: Array<{
18
+ role: string;
19
+ content: string;
20
+ }>): ConversationSignals;
21
+ /**
22
+ * Merge LLM-reported signals into heuristic signals.
23
+ * LLM signals are additive — once true, always true.
24
+ */
25
+ export declare function mergeSignals(heuristic: ConversationSignals, llmSignals: {
26
+ describedProduct?: boolean;
27
+ describedProblem?: boolean;
28
+ answeredWhyPB?: boolean;
29
+ }): ConversationSignals;
30
+ //# sourceMappingURL=conversation-signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-signals.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AA4BpE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,mBAAmB,CAgBrG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9F,mBAAmB,CAOrB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Conversation signal detection — heuristic pattern matching on user text.
3
+ * WP-304: CLI-side signal detection as backup/validation for LLM-reported signals.
4
+ *
5
+ * These are intentionally loose. False positives advance the conversation
6
+ * (fine — user gave a relevant answer). False negatives mean one more turn
7
+ * in the phase (also fine — maxExchanges caps prevent loops).
8
+ */
9
+ const PRODUCT_PATTERNS = [
10
+ /\b(?:building|making|creating|working on|developing)\b/i,
11
+ /\b(?:app|platform|tool|product|service|saas|api|system|software)\b/i,
12
+ ];
13
+ const CHALLENGE_PATTERNS = [
14
+ /\b(?:hard|hardest|difficult|challeng|struggling?|pain|problem|frustrat|broken|mess)\b/i,
15
+ /\b(?:don'?t know|can'?t figure|losing track|forget|lost context|outdated|rot)\b/i,
16
+ /\b(?:hate|annoying|waste|slow|manual|tedious)\b/i,
17
+ ];
18
+ const WHY_PB_PATTERNS = [
19
+ /\b(?:product brain|brain)\b/i,
20
+ /\b(?:context|memory|decisions?|knowledge|source of truth|ssot)\b/i,
21
+ /\b(?:ai|llm|claude|cursor|copilot|agent)\b.*\b(?:context|remember|forget|know)\b/i,
22
+ /\b(?:remember|forget|consistent|prompt)\b.*\b(?:ai|llm|agent|tool)\b/i,
23
+ // Broader: user describes the problem PB solves without naming PB
24
+ /\b(?:re-?explain|repeat myself|start from (?:zero|scratch)|re-?tell)\b/i,
25
+ /\b(?:docs?|documentation|md files?)\b.*\b(?:outdated|stale|rot|drift|wrong|maintain)\b/i,
26
+ /\b(?:cost|waste|spend)\b.*\b(?:tokens?|context|time)\b.*\b(?:re-?explain|repeat|maintain)\b/i,
27
+ ];
28
+ function countWords(text) {
29
+ return text.trim().split(/\s+/).filter(Boolean).length;
30
+ }
31
+ /**
32
+ * Detect signals from user messages using regex heuristics.
33
+ * Returns accumulated signals across all user messages.
34
+ *
35
+ * Thresholds are intentionally strict — we'd rather ask one more question
36
+ * than advance on a vague answer. maxExchanges is the safety valve.
37
+ */
38
+ export function detectSignals(messages) {
39
+ const userMessages = messages.filter((m) => m.role === 'user');
40
+ return {
41
+ // Product mention requires BOTH a pattern match AND enough words to be meaningful.
42
+ // "a cool app" matches the pattern but isn't substantive — need at least 10 words.
43
+ mentionedProduct: userMessages.some((m) => PRODUCT_PATTERNS.some((p) => p.test(m.content)) && countWords(m.content) >= 10),
44
+ mentionedChallenge: userMessages.some((m) => CHALLENGE_PATTERNS.some((p) => p.test(m.content))),
45
+ mentionedWhyPB: userMessages.some((m) => WHY_PB_PATTERNS.some((p) => p.test(m.content))),
46
+ // Substantive = enough detail to extract something meaningful from
47
+ hasSubstantiveAnswer: userMessages.some((m) => countWords(m.content) >= 15),
48
+ // Count messages with real content (not just "me" or "yes")
49
+ substantiveMessageCount: userMessages.filter((m) => countWords(m.content) >= 8).length,
50
+ };
51
+ }
52
+ /**
53
+ * Merge LLM-reported signals into heuristic signals.
54
+ * LLM signals are additive — once true, always true.
55
+ */
56
+ export function mergeSignals(heuristic, llmSignals) {
57
+ return {
58
+ ...heuristic,
59
+ mentionedProduct: heuristic.mentionedProduct || (llmSignals.describedProduct ?? false),
60
+ mentionedChallenge: heuristic.mentionedChallenge || (llmSignals.describedProblem ?? false),
61
+ mentionedWhyPB: heuristic.mentionedWhyPB || (llmSignals.answeredWhyPB ?? false),
62
+ };
63
+ }
64
+ //# sourceMappingURL=conversation-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-signals.js","sourceRoot":"","sources":["../../src/lib/conversation-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,gBAAgB,GAAG;IACvB,yDAAyD;IACzD,qEAAqE;CACtE,CAAC;AAEF,MAAM,kBAAkB,GAAG;IACzB,wFAAwF;IACxF,kFAAkF;IAClF,kDAAkD;CACnD,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,8BAA8B;IAC9B,mEAAmE;IACnE,mFAAmF;IACnF,uEAAuE;IACvE,kEAAkE;IAClE,yEAAyE;IACzE,yFAAyF;IACzF,8FAA8F;CAC/F,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkD;IAC9E,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAE/D,OAAO;QACL,mFAAmF;QACnF,mFAAmF;QACnF,gBAAgB,EAAE,YAAY,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CACtF;QACD,kBAAkB,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/F,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxF,mEAAmE;QACnE,oBAAoB,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3E,4DAA4D;QAC5D,uBAAuB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;KACvF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,SAA8B,EAC9B,UAA+F;IAE/F,OAAO;QACL,GAAG,SAAS;QACZ,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,KAAK,CAAC;QACtF,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC1F,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC;KAChF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Convex / gateway deployment classification for CLI banners and admin seed gates.
3
+ *
4
+ * Convex uses "Development (Cloud)" vs "Production" for deployments; the CLI must not
5
+ * treat every non-localhost URL as "production" (WP-312 follow-up).
6
+ *
7
+ * Extend PRODUCTION_HOSTS / DEV_CLOUD_HOSTS when new team deployments are provisioned.
8
+ */
9
+ /** Loopback — local Convex dev UI / tunnel only. */
10
+ export type DeploymentTier = 'local' | 'prod' | 'dev-cloud' | 'cloud';
11
+ export declare function parseHostname(siteUrl: string): string;
12
+ export declare function classifyDeployment(siteUrl: string): DeploymentTier;
13
+ /**
14
+ * Whether admin seed destructive paths should show confirmation + `--confirm` in CI.
15
+ * False for loopback and known dev-cloud Convex deployments only.
16
+ */
17
+ export declare function requiresAdminDestructiveConfirmation(siteUrl: string): boolean;
18
+ /** Title for clack `note()` before confirm (prod vs unknown remote). */
19
+ export declare function confirmRiskNoteTitle(siteUrl: string): string;
20
+ export declare function seedRunConfirmMessage(siteUrl: string, manifestName: string): string;
21
+ export declare function seedAllConfirmMessage(siteUrl: string): string;
22
+ export declare function seedMultiselectConfirmMessage(siteUrl: string, count: number): string;
23
+ //# sourceMappingURL=deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../src/lib/deployment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oDAAoD;AACpD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;AAwBtE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAMlE;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG7E;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAInF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpF"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Convex / gateway deployment classification for CLI banners and admin seed gates.
3
+ *
4
+ * Convex uses "Development (Cloud)" vs "Production" for deployments; the CLI must not
5
+ * treat every non-localhost URL as "production" (WP-312 follow-up).
6
+ *
7
+ * Extend PRODUCTION_HOSTS / DEV_CLOUD_HOSTS when new team deployments are provisioned.
8
+ */
9
+ const LOCAL_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);
10
+ /**
11
+ * Customer / team production hosts (gateway, prod Convex deployment, public API).
12
+ * Destructive admin seeds use production-style confirmation + red [PROD] banner.
13
+ */
14
+ const PRODUCTION_HOSTS = new Set([
15
+ 'gateway.productbrain.io',
16
+ 'data.productbrain.io',
17
+ 'api.productbrain.io',
18
+ /** Convex Production deployment (dashboard label). */
19
+ 'terrific-penguin-60.convex.site',
20
+ ]);
21
+ /**
22
+ * Convex **Development (Cloud)** deployments — real cloud DB, not customer prod.
23
+ * No prod-style gate; banner shows [DEV·CLOUD].
24
+ */
25
+ const DEV_CLOUD_HOSTS = new Set([
26
+ 'trustworthy-kangaroo-277.convex.site',
27
+ ]);
28
+ export function parseHostname(siteUrl) {
29
+ try {
30
+ return new URL(siteUrl).hostname;
31
+ }
32
+ catch {
33
+ return siteUrl;
34
+ }
35
+ }
36
+ export function classifyDeployment(siteUrl) {
37
+ const host = parseHostname(siteUrl);
38
+ if (LOCAL_HOSTS.has(host))
39
+ return 'local';
40
+ if (PRODUCTION_HOSTS.has(host))
41
+ return 'prod';
42
+ if (DEV_CLOUD_HOSTS.has(host))
43
+ return 'dev-cloud';
44
+ return 'cloud';
45
+ }
46
+ /**
47
+ * Whether admin seed destructive paths should show confirmation + `--confirm` in CI.
48
+ * False for loopback and known dev-cloud Convex deployments only.
49
+ */
50
+ export function requiresAdminDestructiveConfirmation(siteUrl) {
51
+ const t = classifyDeployment(siteUrl);
52
+ return t !== 'local' && t !== 'dev-cloud';
53
+ }
54
+ /** Title for clack `note()` before confirm (prod vs unknown remote). */
55
+ export function confirmRiskNoteTitle(siteUrl) {
56
+ const t = classifyDeployment(siteUrl);
57
+ if (t === 'prod')
58
+ return '⚠ Production';
59
+ if (t === 'cloud')
60
+ return '⚠ Remote deployment';
61
+ return '⚠ Confirm';
62
+ }
63
+ export function seedRunConfirmMessage(siteUrl, manifestName) {
64
+ return classifyDeployment(siteUrl) === 'prod'
65
+ ? `Run ${manifestName} on production?`
66
+ : `Run ${manifestName} on this remote deployment?`;
67
+ }
68
+ export function seedAllConfirmMessage(siteUrl) {
69
+ return classifyDeployment(siteUrl) === 'prod'
70
+ ? 'Run ALL seed operations on production?'
71
+ : 'Run ALL seed operations on this remote deployment?';
72
+ }
73
+ export function seedMultiselectConfirmMessage(siteUrl, count) {
74
+ return classifyDeployment(siteUrl) === 'prod'
75
+ ? `Run ${count} operation(s) on PRODUCTION?`
76
+ : `Run ${count} operation(s) on this remote deployment?`;
77
+ }
78
+ //# sourceMappingURL=deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/lib/deployment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjE;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS;IACvC,yBAAyB;IACzB,sBAAsB;IACtB,qBAAqB;IACrB,sDAAsD;IACtD,iCAAiC;CAClC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS;IACtC,sCAAsC;CACvC,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC;IAClD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAAC,OAAe;IAClE,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,WAAW,CAAC;AAC5C,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC;IACzC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,sBAAsB,CAAC;IACjD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,YAAoB;IACzE,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,MAAM;QAC3C,CAAC,CAAC,OAAO,YAAY,iBAAiB;QACtC,CAAC,CAAC,OAAO,YAAY,6BAA6B,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,MAAM;QAC3C,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,oDAAoD,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,OAAe,EAAE,KAAa;IAC1E,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,MAAM;QAC3C,CAAC,CAAC,OAAO,KAAK,8BAA8B;QAC5C,CAAC,CAAC,OAAO,KAAK,0CAA0C,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Deployment classification — banners and admin seed gates.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=deployment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.test.d.ts","sourceRoot":"","sources":["../../src/lib/deployment.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Deployment classification — banners and admin seed gates.
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { classifyDeployment, confirmRiskNoteTitle, parseHostname, requiresAdminDestructiveConfirmation, seedAllConfirmMessage, seedRunConfirmMessage, } from './deployment.js';
6
+ describe('parseHostname', () => {
7
+ it('parses hostname from https URL', () => {
8
+ expect(parseHostname('https://trustworthy-kangaroo-277.convex.site')).toBe('trustworthy-kangaroo-277.convex.site');
9
+ });
10
+ });
11
+ describe('classifyDeployment', () => {
12
+ it('classifies loopback as local', () => {
13
+ expect(classifyDeployment('http://localhost:5176')).toBe('local');
14
+ expect(classifyDeployment('http://127.0.0.1:3000')).toBe('local');
15
+ expect(classifyDeployment('http://[::1]:3000')).toBe('local');
16
+ });
17
+ it('classifies known dev-cloud Convex deployment', () => {
18
+ expect(classifyDeployment('https://trustworthy-kangaroo-277.convex.site')).toBe('dev-cloud');
19
+ });
20
+ it('classifies gateway and prod Convex as prod', () => {
21
+ expect(classifyDeployment('https://gateway.productbrain.io')).toBe('prod');
22
+ expect(classifyDeployment('https://terrific-penguin-60.convex.site')).toBe('prod');
23
+ expect(classifyDeployment('https://api.productbrain.io')).toBe('prod');
24
+ });
25
+ it('classifies unknown remote as cloud', () => {
26
+ expect(classifyDeployment('https://other-team-xyz.convex.site')).toBe('cloud');
27
+ });
28
+ });
29
+ describe('requiresAdminDestructiveConfirmation', () => {
30
+ it('is false for local and dev-cloud only', () => {
31
+ expect(requiresAdminDestructiveConfirmation('http://localhost:3000')).toBe(false);
32
+ expect(requiresAdminDestructiveConfirmation('https://trustworthy-kangaroo-277.convex.site')).toBe(false);
33
+ expect(requiresAdminDestructiveConfirmation('https://gateway.productbrain.io')).toBe(true);
34
+ expect(requiresAdminDestructiveConfirmation('https://unknown.convex.site')).toBe(true);
35
+ });
36
+ });
37
+ describe('confirmRiskNoteTitle', () => {
38
+ it('matches tier', () => {
39
+ expect(confirmRiskNoteTitle('https://gateway.productbrain.io')).toContain('Production');
40
+ expect(confirmRiskNoteTitle('https://other.convex.site')).toContain('Remote');
41
+ });
42
+ });
43
+ describe('seed confirm copy', () => {
44
+ it('uses production wording only for prod tier', () => {
45
+ expect(seedRunConfirmMessage('https://gateway.productbrain.io', 'seed:knowledge')).toContain('production');
46
+ expect(seedRunConfirmMessage('https://trustworthy-kangaroo-277.convex.site', 'seed:knowledge')).toContain('remote deployment');
47
+ expect(seedRunConfirmMessage('https://unknown.convex.site', 'seed:knowledge')).toContain('remote deployment');
48
+ });
49
+ it('seed all message follows tier', () => {
50
+ expect(seedAllConfirmMessage('https://gateway.productbrain.io')).toContain('production');
51
+ expect(seedAllConfirmMessage('https://unknown.convex.site')).toContain('remote deployment');
52
+ });
53
+ });
54
+ //# sourceMappingURL=deployment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.test.js","sourceRoot":"","sources":["../../src/lib/deployment.test.ts"],"names":[],"mappings":"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"}