@productbrain/cli 0.1.0-beta.9 → 0.1.0-beta.91

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 (643) hide show
  1. package/README.md +77 -92
  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.js +309 -18
  15. package/dist/__tests__/capture.test.js.map +1 -1
  16. package/dist/__tests__/config.test.d.ts +8 -0
  17. package/dist/__tests__/config.test.d.ts.map +1 -0
  18. package/dist/__tests__/config.test.js +166 -0
  19. package/dist/__tests__/config.test.js.map +1 -0
  20. package/dist/__tests__/constants.test.d.ts +2 -0
  21. package/dist/__tests__/constants.test.d.ts.map +1 -0
  22. package/dist/__tests__/constants.test.js +141 -0
  23. package/dist/__tests__/constants.test.js.map +1 -0
  24. package/dist/__tests__/constellation.test.js +20 -26
  25. package/dist/__tests__/constellation.test.js.map +1 -1
  26. package/dist/__tests__/context-strategy.test.d.ts +2 -0
  27. package/dist/__tests__/context-strategy.test.d.ts.map +1 -0
  28. package/dist/__tests__/context-strategy.test.js +79 -0
  29. package/dist/__tests__/context-strategy.test.js.map +1 -0
  30. package/dist/__tests__/errors.test.d.ts +2 -0
  31. package/dist/__tests__/errors.test.d.ts.map +1 -0
  32. package/dist/__tests__/errors.test.js +117 -0
  33. package/dist/__tests__/errors.test.js.map +1 -0
  34. package/dist/__tests__/experiment.test.d.ts +6 -0
  35. package/dist/__tests__/experiment.test.d.ts.map +1 -0
  36. package/dist/__tests__/experiment.test.js +69 -0
  37. package/dist/__tests__/experiment.test.js.map +1 -0
  38. package/dist/__tests__/fields.test.js +68 -68
  39. package/dist/__tests__/fields.test.js.map +1 -1
  40. package/dist/__tests__/glossary.test.d.ts +2 -0
  41. package/dist/__tests__/glossary.test.d.ts.map +1 -0
  42. package/dist/__tests__/glossary.test.js +32 -0
  43. package/dist/__tests__/glossary.test.js.map +1 -0
  44. package/dist/__tests__/handshake-preview.test.d.ts +2 -0
  45. package/dist/__tests__/handshake-preview.test.d.ts.map +1 -0
  46. package/dist/__tests__/handshake-preview.test.js +156 -0
  47. package/dist/__tests__/handshake-preview.test.js.map +1 -0
  48. package/dist/__tests__/handshake.test.js +27 -18
  49. package/dist/__tests__/handshake.test.js.map +1 -1
  50. package/dist/__tests__/hook-intents.test.d.ts +2 -0
  51. package/dist/__tests__/hook-intents.test.d.ts.map +1 -0
  52. package/dist/__tests__/hook-intents.test.js +184 -0
  53. package/dist/__tests__/hook-intents.test.js.map +1 -0
  54. package/dist/__tests__/ingest.test.js +110 -12
  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__/manifest.test.d.ts +6 -0
  65. package/dist/__tests__/manifest.test.d.ts.map +1 -0
  66. package/dist/__tests__/manifest.test.js +138 -0
  67. package/dist/__tests__/manifest.test.js.map +1 -0
  68. package/dist/__tests__/method-registry.integration.test.d.ts +6 -0
  69. package/dist/__tests__/method-registry.integration.test.d.ts.map +1 -0
  70. package/dist/__tests__/method-registry.integration.test.js +18 -0
  71. package/dist/__tests__/method-registry.integration.test.js.map +1 -0
  72. package/dist/__tests__/method-registry.test.d.ts +14 -0
  73. package/dist/__tests__/method-registry.test.d.ts.map +1 -0
  74. package/dist/__tests__/method-registry.test.js +134 -0
  75. package/dist/__tests__/method-registry.test.js.map +1 -0
  76. package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
  77. package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
  78. package/dist/__tests__/onboarding-path-b.test.js +46 -0
  79. package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
  80. package/dist/__tests__/onboarding.test.d.ts +6 -0
  81. package/dist/__tests__/onboarding.test.d.ts.map +1 -0
  82. package/dist/__tests__/onboarding.test.js +347 -0
  83. package/dist/__tests__/onboarding.test.js.map +1 -0
  84. package/dist/__tests__/orient.test.d.ts +2 -0
  85. package/dist/__tests__/orient.test.d.ts.map +1 -0
  86. package/dist/__tests__/orient.test.js +143 -0
  87. package/dist/__tests__/orient.test.js.map +1 -0
  88. package/dist/__tests__/personal-layer.test.d.ts +12 -0
  89. package/dist/__tests__/personal-layer.test.d.ts.map +1 -0
  90. package/dist/__tests__/personal-layer.test.js +304 -0
  91. package/dist/__tests__/personal-layer.test.js.map +1 -0
  92. package/dist/__tests__/profiles.test.d.ts +2 -0
  93. package/dist/__tests__/profiles.test.d.ts.map +1 -0
  94. package/dist/__tests__/profiles.test.js +168 -0
  95. package/dist/__tests__/profiles.test.js.map +1 -0
  96. package/dist/__tests__/promote.test.d.ts +2 -0
  97. package/dist/__tests__/promote.test.d.ts.map +1 -0
  98. package/dist/__tests__/promote.test.js +161 -0
  99. package/dist/__tests__/promote.test.js.map +1 -0
  100. package/dist/__tests__/prompts.test.d.ts +6 -0
  101. package/dist/__tests__/prompts.test.d.ts.map +1 -0
  102. package/dist/__tests__/prompts.test.js +146 -0
  103. package/dist/__tests__/prompts.test.js.map +1 -0
  104. package/dist/__tests__/proposals.test.d.ts +2 -0
  105. package/dist/__tests__/proposals.test.d.ts.map +1 -0
  106. package/dist/__tests__/proposals.test.js +167 -0
  107. package/dist/__tests__/proposals.test.js.map +1 -0
  108. package/dist/__tests__/relate.test.js +57 -33
  109. package/dist/__tests__/relate.test.js.map +1 -1
  110. package/dist/__tests__/repo-detect.test.js +97 -1
  111. package/dist/__tests__/repo-detect.test.js.map +1 -1
  112. package/dist/__tests__/runner.test.js +19 -15
  113. package/dist/__tests__/runner.test.js.map +1 -1
  114. package/dist/__tests__/session-state-machine.test.d.ts +2 -0
  115. package/dist/__tests__/session-state-machine.test.d.ts.map +1 -0
  116. package/dist/__tests__/session-state-machine.test.js +154 -0
  117. package/dist/__tests__/session-state-machine.test.js.map +1 -0
  118. package/dist/__tests__/session-touch.test.js +11 -11
  119. package/dist/__tests__/session-touch.test.js.map +1 -1
  120. package/dist/__tests__/session.test.js +4 -10
  121. package/dist/__tests__/session.test.js.map +1 -1
  122. package/dist/__tests__/setup.test.d.ts +2 -0
  123. package/dist/__tests__/setup.test.d.ts.map +1 -0
  124. package/dist/__tests__/setup.test.js +141 -0
  125. package/dist/__tests__/setup.test.js.map +1 -0
  126. package/dist/__tests__/spinner-labels.test.d.ts +2 -0
  127. package/dist/__tests__/spinner-labels.test.d.ts.map +1 -0
  128. package/dist/__tests__/spinner-labels.test.js +23 -0
  129. package/dist/__tests__/spinner-labels.test.js.map +1 -0
  130. package/dist/__tests__/state.test.d.ts +6 -0
  131. package/dist/__tests__/state.test.d.ts.map +1 -0
  132. package/dist/__tests__/state.test.js +97 -0
  133. package/dist/__tests__/state.test.js.map +1 -0
  134. package/dist/__tests__/strip.test.js +2 -2
  135. package/dist/__tests__/strip.test.js.map +1 -1
  136. package/dist/__tests__/surface-profiles.test.d.ts +2 -0
  137. package/dist/__tests__/surface-profiles.test.d.ts.map +1 -0
  138. package/dist/__tests__/surface-profiles.test.js +233 -0
  139. package/dist/__tests__/surface-profiles.test.js.map +1 -0
  140. package/dist/__tests__/surfaces.test.d.ts +2 -0
  141. package/dist/__tests__/surfaces.test.d.ts.map +1 -0
  142. package/dist/__tests__/surfaces.test.js +46 -0
  143. package/dist/__tests__/surfaces.test.js.map +1 -0
  144. package/dist/__tests__/update.test.js +123 -43
  145. package/dist/__tests__/update.test.js.map +1 -1
  146. package/dist/__tests__/workspace.test.d.ts +2 -0
  147. package/dist/__tests__/workspace.test.d.ts.map +1 -0
  148. package/dist/__tests__/workspace.test.js +308 -0
  149. package/dist/__tests__/workspace.test.js.map +1 -0
  150. package/dist/commands/accept.d.ts +18 -0
  151. package/dist/commands/accept.d.ts.map +1 -0
  152. package/dist/commands/accept.js +76 -0
  153. package/dist/commands/accept.js.map +1 -0
  154. package/dist/commands/admin/cockpit.d.ts +90 -0
  155. package/dist/commands/admin/cockpit.d.ts.map +1 -0
  156. package/dist/commands/admin/cockpit.js +618 -0
  157. package/dist/commands/admin/cockpit.js.map +1 -0
  158. package/dist/commands/admin/index.d.ts +21 -0
  159. package/dist/commands/admin/index.d.ts.map +1 -0
  160. package/dist/commands/admin/index.js +256 -0
  161. package/dist/commands/admin/index.js.map +1 -0
  162. package/dist/commands/admin/inspect.d.ts +30 -0
  163. package/dist/commands/admin/inspect.d.ts.map +1 -0
  164. package/dist/commands/admin/inspect.js +555 -0
  165. package/dist/commands/admin/inspect.js.map +1 -0
  166. package/dist/commands/admin/inspect.test.d.ts +7 -0
  167. package/dist/commands/admin/inspect.test.d.ts.map +1 -0
  168. package/dist/commands/admin/inspect.test.js +90 -0
  169. package/dist/commands/admin/inspect.test.js.map +1 -0
  170. package/dist/commands/admin/manage.d.ts +8 -0
  171. package/dist/commands/admin/manage.d.ts.map +1 -0
  172. package/dist/commands/admin/manage.js +76 -0
  173. package/dist/commands/admin/manage.js.map +1 -0
  174. package/dist/commands/admin/seed.d.ts +32 -0
  175. package/dist/commands/admin/seed.d.ts.map +1 -0
  176. package/dist/commands/admin/seed.js +533 -0
  177. package/dist/commands/admin/seed.js.map +1 -0
  178. package/dist/commands/admin/seed.test.d.ts +6 -0
  179. package/dist/commands/admin/seed.test.d.ts.map +1 -0
  180. package/dist/commands/admin/seed.test.js +65 -0
  181. package/dist/commands/admin/seed.test.js.map +1 -0
  182. package/dist/commands/audit.d.ts +25 -0
  183. package/dist/commands/audit.d.ts.map +1 -0
  184. package/dist/commands/audit.js +188 -0
  185. package/dist/commands/audit.js.map +1 -0
  186. package/dist/commands/brand-pack.d.ts +2 -0
  187. package/dist/commands/brand-pack.d.ts.map +1 -0
  188. package/dist/commands/brand-pack.js +25 -0
  189. package/dist/commands/brand-pack.js.map +1 -0
  190. package/dist/commands/brief.d.ts +28 -0
  191. package/dist/commands/brief.d.ts.map +1 -0
  192. package/dist/commands/brief.js +75 -0
  193. package/dist/commands/brief.js.map +1 -0
  194. package/dist/commands/capture.d.ts +9 -0
  195. package/dist/commands/capture.d.ts.map +1 -1
  196. package/dist/commands/capture.js +256 -17
  197. package/dist/commands/capture.js.map +1 -1
  198. package/dist/commands/chain-walk.d.ts +14 -0
  199. package/dist/commands/chain-walk.d.ts.map +1 -0
  200. package/dist/commands/chain-walk.js +38 -0
  201. package/dist/commands/chain-walk.js.map +1 -0
  202. package/dist/commands/changes.d.ts +11 -0
  203. package/dist/commands/changes.d.ts.map +1 -0
  204. package/dist/commands/changes.js +46 -0
  205. package/dist/commands/changes.js.map +1 -0
  206. package/dist/commands/codex-prep.d.ts +12 -0
  207. package/dist/commands/codex-prep.d.ts.map +1 -0
  208. package/dist/commands/codex-prep.js +122 -0
  209. package/dist/commands/codex-prep.js.map +1 -0
  210. package/dist/commands/collections.d.ts +22 -0
  211. package/dist/commands/collections.d.ts.map +1 -0
  212. package/dist/commands/collections.js +77 -0
  213. package/dist/commands/collections.js.map +1 -0
  214. package/dist/commands/connect-integration.test.d.ts +7 -0
  215. package/dist/commands/connect-integration.test.d.ts.map +1 -0
  216. package/dist/commands/connect-integration.test.js +195 -0
  217. package/dist/commands/connect-integration.test.js.map +1 -0
  218. package/dist/commands/connect-screens.d.ts +21 -0
  219. package/dist/commands/connect-screens.d.ts.map +1 -0
  220. package/dist/commands/connect-screens.js +79 -0
  221. package/dist/commands/connect-screens.js.map +1 -0
  222. package/dist/commands/connect.d.ts +21 -0
  223. package/dist/commands/connect.d.ts.map +1 -0
  224. package/dist/commands/connect.js +237 -0
  225. package/dist/commands/connect.js.map +1 -0
  226. package/dist/commands/connect.test.d.ts +6 -0
  227. package/dist/commands/connect.test.d.ts.map +1 -0
  228. package/dist/commands/connect.test.js +234 -0
  229. package/dist/commands/connect.test.js.map +1 -0
  230. package/dist/commands/constellation.d.ts.map +1 -1
  231. package/dist/commands/constellation.js +8 -3
  232. package/dist/commands/constellation.js.map +1 -1
  233. package/dist/commands/context.d.ts.map +1 -1
  234. package/dist/commands/context.js +8 -3
  235. package/dist/commands/context.js.map +1 -1
  236. package/dist/commands/cross-cut.d.ts +11 -0
  237. package/dist/commands/cross-cut.d.ts.map +1 -0
  238. package/dist/commands/cross-cut.js +23 -0
  239. package/dist/commands/cross-cut.js.map +1 -0
  240. package/dist/commands/doctor.d.ts +18 -0
  241. package/dist/commands/doctor.d.ts.map +1 -0
  242. package/dist/commands/doctor.js +232 -0
  243. package/dist/commands/doctor.js.map +1 -0
  244. package/dist/commands/doctor.test.d.ts +8 -0
  245. package/dist/commands/doctor.test.d.ts.map +1 -0
  246. package/dist/commands/doctor.test.js +311 -0
  247. package/dist/commands/doctor.test.js.map +1 -0
  248. package/dist/commands/fields.d.ts.map +1 -1
  249. package/dist/commands/fields.js +8 -4
  250. package/dist/commands/fields.js.map +1 -1
  251. package/dist/commands/get.d.ts.map +1 -1
  252. package/dist/commands/get.js +14 -6
  253. package/dist/commands/get.js.map +1 -1
  254. package/dist/commands/handshake.d.ts +12 -0
  255. package/dist/commands/handshake.d.ts.map +1 -1
  256. package/dist/commands/handshake.js +422 -74
  257. package/dist/commands/handshake.js.map +1 -1
  258. package/dist/commands/ingest.d.ts +7 -2
  259. package/dist/commands/ingest.d.ts.map +1 -1
  260. package/dist/commands/ingest.js +137 -31
  261. package/dist/commands/ingest.js.map +1 -1
  262. package/dist/commands/init.d.ts +14 -0
  263. package/dist/commands/init.d.ts.map +1 -0
  264. package/dist/commands/init.js +109 -0
  265. package/dist/commands/init.js.map +1 -0
  266. package/dist/commands/login.d.ts +4 -0
  267. package/dist/commands/login.d.ts.map +1 -1
  268. package/dist/commands/login.js +101 -38
  269. package/dist/commands/login.js.map +1 -1
  270. package/dist/commands/method.d.ts +99 -0
  271. package/dist/commands/method.d.ts.map +1 -0
  272. package/dist/commands/method.js +781 -0
  273. package/dist/commands/method.js.map +1 -0
  274. package/dist/commands/orient.d.ts +106 -1
  275. package/dist/commands/orient.d.ts.map +1 -1
  276. package/dist/commands/orient.js +13 -2
  277. package/dist/commands/orient.js.map +1 -1
  278. package/dist/commands/profile.d.ts +24 -0
  279. package/dist/commands/profile.d.ts.map +1 -0
  280. package/dist/commands/profile.js +82 -0
  281. package/dist/commands/profile.js.map +1 -0
  282. package/dist/commands/promote.d.ts +12 -0
  283. package/dist/commands/promote.d.ts.map +1 -0
  284. package/dist/commands/promote.js +90 -0
  285. package/dist/commands/promote.js.map +1 -0
  286. package/dist/commands/proposals.d.ts +9 -0
  287. package/dist/commands/proposals.d.ts.map +1 -0
  288. package/dist/commands/proposals.js +24 -0
  289. package/dist/commands/proposals.js.map +1 -0
  290. package/dist/commands/reject.d.ts +14 -0
  291. package/dist/commands/reject.d.ts.map +1 -0
  292. package/dist/commands/reject.js +43 -0
  293. package/dist/commands/reject.js.map +1 -0
  294. package/dist/commands/relate.d.ts +1 -0
  295. package/dist/commands/relate.d.ts.map +1 -1
  296. package/dist/commands/relate.js +41 -15
  297. package/dist/commands/relate.js.map +1 -1
  298. package/dist/commands/search.js +2 -2
  299. package/dist/commands/search.js.map +1 -1
  300. package/dist/commands/session.d.ts.map +1 -1
  301. package/dist/commands/session.js +85 -16
  302. package/dist/commands/session.js.map +1 -1
  303. package/dist/commands/setup.d.ts +15 -0
  304. package/dist/commands/setup.d.ts.map +1 -0
  305. package/dist/commands/setup.js +148 -0
  306. package/dist/commands/setup.js.map +1 -0
  307. package/dist/commands/update.d.ts +1 -0
  308. package/dist/commands/update.d.ts.map +1 -1
  309. package/dist/commands/update.js +102 -13
  310. package/dist/commands/update.js.map +1 -1
  311. package/dist/commands/usage.d.ts +40 -0
  312. package/dist/commands/usage.d.ts.map +1 -0
  313. package/dist/commands/usage.js +232 -0
  314. package/dist/commands/usage.js.map +1 -0
  315. package/dist/commands/verify.d.ts +13 -0
  316. package/dist/commands/verify.d.ts.map +1 -0
  317. package/dist/commands/verify.js +49 -0
  318. package/dist/commands/verify.js.map +1 -0
  319. package/dist/commands/welcome.d.ts +21 -0
  320. package/dist/commands/welcome.d.ts.map +1 -0
  321. package/dist/commands/welcome.js +50 -0
  322. package/dist/commands/welcome.js.map +1 -0
  323. package/dist/commands/workspace.d.ts +41 -0
  324. package/dist/commands/workspace.d.ts.map +1 -0
  325. package/dist/commands/workspace.js +239 -0
  326. package/dist/commands/workspace.js.map +1 -0
  327. package/dist/formatters/audit.d.ts +46 -0
  328. package/dist/formatters/audit.d.ts.map +1 -0
  329. package/dist/formatters/audit.js +81 -0
  330. package/dist/formatters/audit.js.map +1 -0
  331. package/dist/formatters/brief.d.ts +112 -0
  332. package/dist/formatters/brief.d.ts.map +1 -0
  333. package/dist/formatters/brief.js +179 -0
  334. package/dist/formatters/brief.js.map +1 -0
  335. package/dist/formatters/capture.d.ts +21 -3
  336. package/dist/formatters/capture.d.ts.map +1 -1
  337. package/dist/formatters/capture.js +20 -1
  338. package/dist/formatters/capture.js.map +1 -1
  339. package/dist/formatters/chain-walk.d.ts +33 -0
  340. package/dist/formatters/chain-walk.d.ts.map +1 -0
  341. package/dist/formatters/chain-walk.js +54 -0
  342. package/dist/formatters/chain-walk.js.map +1 -0
  343. package/dist/formatters/changes.d.ts +25 -0
  344. package/dist/formatters/changes.d.ts.map +1 -0
  345. package/dist/formatters/changes.js +60 -0
  346. package/dist/formatters/changes.js.map +1 -0
  347. package/dist/formatters/collections.d.ts +40 -0
  348. package/dist/formatters/collections.d.ts.map +1 -0
  349. package/dist/formatters/collections.js +93 -0
  350. package/dist/formatters/collections.js.map +1 -0
  351. package/dist/formatters/cross-cut.d.ts +21 -0
  352. package/dist/formatters/cross-cut.d.ts.map +1 -0
  353. package/dist/formatters/cross-cut.js +32 -0
  354. package/dist/formatters/cross-cut.js.map +1 -0
  355. package/dist/formatters/entry.d.ts +11 -4
  356. package/dist/formatters/entry.d.ts.map +1 -1
  357. package/dist/formatters/entry.js +24 -8
  358. package/dist/formatters/entry.js.map +1 -1
  359. package/dist/formatters/handshake.d.ts +29 -0
  360. package/dist/formatters/handshake.d.ts.map +1 -1
  361. package/dist/formatters/handshake.js +115 -3
  362. package/dist/formatters/handshake.js.map +1 -1
  363. package/dist/formatters/orient.d.ts +104 -1
  364. package/dist/formatters/orient.d.ts.map +1 -1
  365. package/dist/formatters/orient.js +140 -17
  366. package/dist/formatters/orient.js.map +1 -1
  367. package/dist/formatters/promote.d.ts +30 -0
  368. package/dist/formatters/promote.d.ts.map +1 -0
  369. package/dist/formatters/promote.js +39 -0
  370. package/dist/formatters/promote.js.map +1 -0
  371. package/dist/formatters/proposals.d.ts +45 -0
  372. package/dist/formatters/proposals.d.ts.map +1 -0
  373. package/dist/formatters/proposals.js +62 -0
  374. package/dist/formatters/proposals.js.map +1 -0
  375. package/dist/formatters/relate.d.ts +3 -0
  376. package/dist/formatters/relate.d.ts.map +1 -1
  377. package/dist/formatters/relate.js +6 -0
  378. package/dist/formatters/relate.js.map +1 -1
  379. package/dist/formatters/search.d.ts +0 -4
  380. package/dist/formatters/search.d.ts.map +1 -1
  381. package/dist/formatters/search.js +4 -1
  382. package/dist/formatters/search.js.map +1 -1
  383. package/dist/formatters/session.d.ts +1 -1
  384. package/dist/formatters/session.d.ts.map +1 -1
  385. package/dist/formatters/session.js +3 -1
  386. package/dist/formatters/session.js.map +1 -1
  387. package/dist/formatters/update.d.ts.map +1 -1
  388. package/dist/formatters/update.js +2 -0
  389. package/dist/formatters/update.js.map +1 -1
  390. package/dist/formatters/verify.d.ts +11 -0
  391. package/dist/formatters/verify.d.ts.map +1 -0
  392. package/dist/formatters/verify.js +11 -0
  393. package/dist/formatters/verify.js.map +1 -0
  394. package/dist/generators/__tests__/surface-profiles.test.d.ts +2 -0
  395. package/dist/generators/__tests__/surface-profiles.test.d.ts.map +1 -0
  396. package/dist/generators/__tests__/surface-profiles.test.js +89 -0
  397. package/dist/generators/__tests__/surface-profiles.test.js.map +1 -0
  398. package/dist/generators/adapters.d.ts +37 -3
  399. package/dist/generators/adapters.d.ts.map +1 -1
  400. package/dist/generators/adapters.js +193 -5
  401. package/dist/generators/adapters.js.map +1 -1
  402. package/dist/generators/adapters.test.d.ts +2 -0
  403. package/dist/generators/adapters.test.d.ts.map +1 -0
  404. package/dist/generators/adapters.test.js +27 -0
  405. package/dist/generators/adapters.test.js.map +1 -0
  406. package/dist/generators/archetypes.d.ts +52 -0
  407. package/dist/generators/archetypes.d.ts.map +1 -0
  408. package/dist/generators/archetypes.js +153 -0
  409. package/dist/generators/archetypes.js.map +1 -0
  410. package/dist/generators/archetypes.test.d.ts +2 -0
  411. package/dist/generators/archetypes.test.d.ts.map +1 -0
  412. package/dist/generators/archetypes.test.js +237 -0
  413. package/dist/generators/archetypes.test.js.map +1 -0
  414. package/dist/generators/chain-classifier.d.ts +49 -0
  415. package/dist/generators/chain-classifier.d.ts.map +1 -0
  416. package/dist/generators/chain-classifier.js +180 -0
  417. package/dist/generators/chain-classifier.js.map +1 -0
  418. package/dist/generators/chain-classifier.test.d.ts +2 -0
  419. package/dist/generators/chain-classifier.test.d.ts.map +1 -0
  420. package/dist/generators/chain-classifier.test.js +257 -0
  421. package/dist/generators/chain-classifier.test.js.map +1 -0
  422. package/dist/generators/chain-rules.d.ts +42 -0
  423. package/dist/generators/chain-rules.d.ts.map +1 -0
  424. package/dist/generators/chain-rules.js +144 -0
  425. package/dist/generators/chain-rules.js.map +1 -0
  426. package/dist/generators/chain-rules.test.d.ts +2 -0
  427. package/dist/generators/chain-rules.test.d.ts.map +1 -0
  428. package/dist/generators/chain-rules.test.js +179 -0
  429. package/dist/generators/chain-rules.test.js.map +1 -0
  430. package/dist/generators/context-md.d.ts +1 -1
  431. package/dist/generators/context-md.d.ts.map +1 -1
  432. package/dist/generators/context-md.js +12 -1
  433. package/dist/generators/context-md.js.map +1 -1
  434. package/dist/generators/handshake-diff.d.ts +67 -0
  435. package/dist/generators/handshake-diff.d.ts.map +1 -0
  436. package/dist/generators/handshake-diff.js +183 -0
  437. package/dist/generators/handshake-diff.js.map +1 -0
  438. package/dist/generators/handshake-diff.test.d.ts +2 -0
  439. package/dist/generators/handshake-diff.test.d.ts.map +1 -0
  440. package/dist/generators/handshake-diff.test.js +264 -0
  441. package/dist/generators/handshake-diff.test.js.map +1 -0
  442. package/dist/generators/manifest.d.ts +37 -0
  443. package/dist/generators/manifest.d.ts.map +1 -0
  444. package/dist/generators/manifest.js +166 -0
  445. package/dist/generators/manifest.js.map +1 -0
  446. package/dist/generators/portable-knowledge.d.ts +102 -9
  447. package/dist/generators/portable-knowledge.d.ts.map +1 -1
  448. package/dist/generators/portable-knowledge.js +384 -17
  449. package/dist/generators/portable-knowledge.js.map +1 -1
  450. package/dist/generators/portable-knowledge.test.js +529 -1
  451. package/dist/generators/portable-knowledge.test.js.map +1 -1
  452. package/dist/generators/surface-profiles.d.ts +49 -0
  453. package/dist/generators/surface-profiles.d.ts.map +1 -0
  454. package/dist/generators/surface-profiles.js +98 -0
  455. package/dist/generators/surface-profiles.js.map +1 -0
  456. package/dist/index.js +618 -138
  457. package/dist/index.js.map +1 -1
  458. package/dist/lib/activation.d.ts +28 -0
  459. package/dist/lib/activation.d.ts.map +1 -0
  460. package/dist/lib/activation.js +57 -0
  461. package/dist/lib/activation.js.map +1 -0
  462. package/dist/lib/activation.test.d.ts +6 -0
  463. package/dist/lib/activation.test.d.ts.map +1 -0
  464. package/dist/lib/activation.test.js +121 -0
  465. package/dist/lib/activation.test.js.map +1 -0
  466. package/dist/lib/client.d.ts +45 -3
  467. package/dist/lib/client.d.ts.map +1 -1
  468. package/dist/lib/client.js +188 -36
  469. package/dist/lib/client.js.map +1 -1
  470. package/dist/lib/collectionRegistry.d.ts +38 -0
  471. package/dist/lib/collectionRegistry.d.ts.map +1 -0
  472. package/dist/lib/collectionRegistry.js +112 -0
  473. package/dist/lib/collectionRegistry.js.map +1 -0
  474. package/dist/lib/config.d.ts +84 -4
  475. package/dist/lib/config.d.ts.map +1 -1
  476. package/dist/lib/config.js +322 -42
  477. package/dist/lib/config.js.map +1 -1
  478. package/dist/lib/constants.d.ts +42 -0
  479. package/dist/lib/constants.d.ts.map +1 -0
  480. package/dist/lib/constants.js +76 -0
  481. package/dist/lib/constants.js.map +1 -0
  482. package/dist/lib/conversation-engine.d.ts +45 -0
  483. package/dist/lib/conversation-engine.d.ts.map +1 -0
  484. package/dist/lib/conversation-engine.js +112 -0
  485. package/dist/lib/conversation-engine.js.map +1 -0
  486. package/dist/lib/conversation-phases.d.ts +59 -0
  487. package/dist/lib/conversation-phases.d.ts.map +1 -0
  488. package/dist/lib/conversation-phases.js +11 -0
  489. package/dist/lib/conversation-phases.js.map +1 -0
  490. package/dist/lib/conversation-signals.d.ts +30 -0
  491. package/dist/lib/conversation-signals.d.ts.map +1 -0
  492. package/dist/lib/conversation-signals.js +64 -0
  493. package/dist/lib/conversation-signals.js.map +1 -0
  494. package/dist/lib/deployment.d.ts +23 -0
  495. package/dist/lib/deployment.d.ts.map +1 -0
  496. package/dist/lib/deployment.js +78 -0
  497. package/dist/lib/deployment.js.map +1 -0
  498. package/dist/lib/deployment.test.d.ts +5 -0
  499. package/dist/lib/deployment.test.d.ts.map +1 -0
  500. package/dist/lib/deployment.test.js +54 -0
  501. package/dist/lib/deployment.test.js.map +1 -0
  502. package/dist/lib/errors.d.ts +58 -0
  503. package/dist/lib/errors.d.ts.map +1 -0
  504. package/dist/lib/errors.js +67 -0
  505. package/dist/lib/errors.js.map +1 -0
  506. package/dist/lib/experiment.d.ts +18 -0
  507. package/dist/lib/experiment.d.ts.map +1 -0
  508. package/dist/lib/experiment.js +28 -0
  509. package/dist/lib/experiment.js.map +1 -0
  510. package/dist/lib/format.d.ts +10 -0
  511. package/dist/lib/format.d.ts.map +1 -0
  512. package/dist/lib/format.js +27 -0
  513. package/dist/lib/format.js.map +1 -0
  514. package/dist/lib/glossary.d.ts +19 -0
  515. package/dist/lib/glossary.d.ts.map +1 -0
  516. package/dist/lib/glossary.js +53 -0
  517. package/dist/lib/glossary.js.map +1 -0
  518. package/dist/lib/hook-intents.d.ts +51 -0
  519. package/dist/lib/hook-intents.d.ts.map +1 -0
  520. package/dist/lib/hook-intents.js +85 -0
  521. package/dist/lib/hook-intents.js.map +1 -0
  522. package/dist/lib/inferSourceDate.d.ts +12 -0
  523. package/dist/lib/inferSourceDate.d.ts.map +1 -0
  524. package/dist/lib/inferSourceDate.js +44 -0
  525. package/dist/lib/inferSourceDate.js.map +1 -0
  526. package/dist/lib/method-registry.d.ts +32 -0
  527. package/dist/lib/method-registry.d.ts.map +1 -0
  528. package/dist/lib/method-registry.js +53 -0
  529. package/dist/lib/method-registry.js.map +1 -0
  530. package/dist/lib/onboarding-path-b.d.ts +10 -0
  531. package/dist/lib/onboarding-path-b.d.ts.map +1 -0
  532. package/dist/lib/onboarding-path-b.js +214 -0
  533. package/dist/lib/onboarding-path-b.js.map +1 -0
  534. package/dist/lib/onboarding-phases.d.ts +9 -0
  535. package/dist/lib/onboarding-phases.d.ts.map +1 -0
  536. package/dist/lib/onboarding-phases.js +120 -0
  537. package/dist/lib/onboarding-phases.js.map +1 -0
  538. package/dist/lib/onboarding-shared.d.ts +81 -0
  539. package/dist/lib/onboarding-shared.d.ts.map +1 -0
  540. package/dist/lib/onboarding-shared.js +190 -0
  541. package/dist/lib/onboarding-shared.js.map +1 -0
  542. package/dist/lib/onboarding-topics.d.ts +27 -0
  543. package/dist/lib/onboarding-topics.d.ts.map +1 -0
  544. package/dist/lib/onboarding-topics.js +57 -0
  545. package/dist/lib/onboarding-topics.js.map +1 -0
  546. package/dist/lib/onboarding.d.ts +17 -0
  547. package/dist/lib/onboarding.d.ts.map +1 -0
  548. package/dist/lib/onboarding.js +350 -0
  549. package/dist/lib/onboarding.js.map +1 -0
  550. package/dist/lib/profiles.d.ts +39 -0
  551. package/dist/lib/profiles.d.ts.map +1 -0
  552. package/dist/lib/profiles.js +185 -0
  553. package/dist/lib/profiles.js.map +1 -0
  554. package/dist/lib/prompts.d.ts +65 -0
  555. package/dist/lib/prompts.d.ts.map +1 -0
  556. package/dist/lib/prompts.js +132 -0
  557. package/dist/lib/prompts.js.map +1 -0
  558. package/dist/lib/repo-detect.d.ts +19 -0
  559. package/dist/lib/repo-detect.d.ts.map +1 -1
  560. package/dist/lib/repo-detect.js +25 -0
  561. package/dist/lib/repo-detect.js.map +1 -1
  562. package/dist/lib/runner.d.ts +2 -0
  563. package/dist/lib/runner.d.ts.map +1 -1
  564. package/dist/lib/runner.js +21 -7
  565. package/dist/lib/runner.js.map +1 -1
  566. package/dist/lib/session.d.ts +25 -0
  567. package/dist/lib/session.d.ts.map +1 -1
  568. package/dist/lib/session.js +70 -4
  569. package/dist/lib/session.js.map +1 -1
  570. package/dist/lib/spinner.d.ts +27 -0
  571. package/dist/lib/spinner.d.ts.map +1 -0
  572. package/dist/lib/spinner.js +76 -0
  573. package/dist/lib/spinner.js.map +1 -0
  574. package/dist/lib/spinner.test.d.ts +2 -0
  575. package/dist/lib/spinner.test.d.ts.map +1 -0
  576. package/dist/lib/spinner.test.js +39 -0
  577. package/dist/lib/spinner.test.js.map +1 -0
  578. package/dist/lib/state.d.ts +51 -0
  579. package/dist/lib/state.d.ts.map +1 -0
  580. package/dist/lib/state.js +90 -0
  581. package/dist/lib/state.js.map +1 -0
  582. package/dist/lib/strip.d.ts +1 -0
  583. package/dist/lib/strip.d.ts.map +1 -1
  584. package/dist/lib/strip.js +15 -0
  585. package/dist/lib/strip.js.map +1 -1
  586. package/dist/lib/style.d.ts +96 -0
  587. package/dist/lib/style.d.ts.map +1 -0
  588. package/dist/lib/style.js +169 -0
  589. package/dist/lib/style.js.map +1 -0
  590. package/dist/lib/style.test.d.ts +7 -0
  591. package/dist/lib/style.test.d.ts.map +1 -0
  592. package/dist/lib/style.test.js +263 -0
  593. package/dist/lib/style.test.js.map +1 -0
  594. package/dist/lib/telemetry.d.ts +15 -0
  595. package/dist/lib/telemetry.d.ts.map +1 -0
  596. package/dist/lib/telemetry.js +47 -0
  597. package/dist/lib/telemetry.js.map +1 -0
  598. package/dist/lib/tokenConstants.d.ts +17 -0
  599. package/dist/lib/tokenConstants.d.ts.map +1 -0
  600. package/dist/lib/tokenConstants.js +17 -0
  601. package/dist/lib/tokenConstants.js.map +1 -0
  602. package/dist/lib/update-check.d.ts +21 -0
  603. package/dist/lib/update-check.d.ts.map +1 -0
  604. package/dist/lib/update-check.js +145 -0
  605. package/dist/lib/update-check.js.map +1 -0
  606. package/dist/lib/wizard-surfaces.d.ts +47 -0
  607. package/dist/lib/wizard-surfaces.d.ts.map +1 -0
  608. package/dist/lib/wizard-surfaces.js +176 -0
  609. package/dist/lib/wizard-surfaces.js.map +1 -0
  610. package/dist/lib/wizard-surfaces.test.d.ts +2 -0
  611. package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
  612. package/dist/lib/wizard-surfaces.test.js +127 -0
  613. package/dist/lib/wizard-surfaces.test.js.map +1 -0
  614. package/dist/lib/wizard-trust.d.ts +31 -0
  615. package/dist/lib/wizard-trust.d.ts.map +1 -0
  616. package/dist/lib/wizard-trust.js +66 -0
  617. package/dist/lib/wizard-trust.js.map +1 -0
  618. package/dist/lib/wizard-trust.test.d.ts +2 -0
  619. package/dist/lib/wizard-trust.test.d.ts.map +1 -0
  620. package/dist/lib/wizard-trust.test.js +32 -0
  621. package/dist/lib/wizard-trust.test.js.map +1 -0
  622. package/dist/lib/workspace-probe.d.ts +19 -0
  623. package/dist/lib/workspace-probe.d.ts.map +1 -0
  624. package/dist/lib/workspace-probe.js +27 -0
  625. package/dist/lib/workspace-probe.js.map +1 -0
  626. package/dist/surfaces/registry.d.ts +20 -0
  627. package/dist/surfaces/registry.d.ts.map +1 -0
  628. package/dist/surfaces/registry.js +42 -0
  629. package/dist/surfaces/registry.js.map +1 -0
  630. package/package.json +9 -3
  631. package/templates/archetypes/boundary.md +23 -0
  632. package/templates/archetypes/constraint.md +23 -0
  633. package/templates/archetypes/convention.md +23 -0
  634. package/templates/archetypes/policy.md +23 -0
  635. package/templates/archetypes/quality-gate.md +23 -0
  636. package/templates/archetypes/workflow.md +23 -0
  637. package/templates/general/code-integrity.md +11 -0
  638. package/templates/general/getting-started.md +12 -0
  639. package/templates/method-registry.json +16 -0
  640. package/templates/node-ts/code-integrity.md +13 -0
  641. package/templates/node-ts/testing.md +12 -0
  642. package/templates/python/code-integrity.md +13 -0
  643. package/templates/python/testing.md +12 -0
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Chain Classifier — BET-286 Slice 1
3
+ *
4
+ * Pure function that maps governance entries (from getGovernanceWithRelations)
5
+ * to the governance function each entry serves. No LLM, no network calls.
6
+ * Deterministic: same input always produces same output.
7
+ *
8
+ * Chain: BET-286 (Chain-Derived Agent Configuration)
9
+ */
10
+ /** Base score awarded for a collection-type match. */
11
+ const COLLECTION_BASE_SCORE = 0.45;
12
+ /** Score boost for a supporting relation type match. */
13
+ const RELATION_BOOST = 0.2;
14
+ /** Score boost for a supporting name pattern match. */
15
+ const NAME_BOOST = 0.15;
16
+ /** Map collection slug → primary governance function. */
17
+ const COLLECTION_TO_FUNCTION = {
18
+ 'standards': 'constraint',
19
+ 'business-rules': 'constraint',
20
+ 'architecture': 'boundary',
21
+ 'decisions': 'convention',
22
+ 'patterns': 'convention',
23
+ 'policies': 'policy',
24
+ 'flows': 'workflow',
25
+ 'glossary': 'unclassified',
26
+ };
27
+ /**
28
+ * Relation-type signals that boost a governance function.
29
+ * Key: relation type string (lowercased).
30
+ * Value: [governanceFunction, boost].
31
+ */
32
+ const RELATION_SIGNALS = [
33
+ { type: 'constrains', fn: 'constraint', boost: RELATION_BOOST },
34
+ { type: 'governs', fn: 'policy', boost: RELATION_BOOST },
35
+ { type: 'part_of', fn: 'workflow', boost: RELATION_BOOST },
36
+ ];
37
+ /** Relation signals based on the collection of the *other* entry. */
38
+ const RELATION_COLLECTION_SIGNALS = [
39
+ // informed_by an architecture entry → boost boundary
40
+ { otherCollectionSlug: 'architecture', relationType: 'informed_by', fn: 'boundary', boost: RELATION_BOOST },
41
+ ];
42
+ /**
43
+ * Name keyword signals — applied against the lowercased entry name.
44
+ * Matched signals are applied once per matching keyword group.
45
+ */
46
+ const NAME_SIGNALS = [
47
+ {
48
+ keywords: ['auth', 'security', 'permission'],
49
+ fn: 'policy',
50
+ boost: NAME_BOOST,
51
+ label: 'name contains security/auth/permission keyword',
52
+ },
53
+ {
54
+ keywords: ['test', 'quality', 'check', 'gate'],
55
+ fn: 'quality-gate',
56
+ boost: NAME_BOOST,
57
+ label: 'name contains test/quality/check/gate keyword',
58
+ },
59
+ {
60
+ keywords: ['deploy', 'release', 'rollback'],
61
+ fn: 'convention',
62
+ boost: NAME_BOOST,
63
+ label: 'name contains deploy/release/rollback keyword',
64
+ },
65
+ {
66
+ keywords: ['domain', 'boundary', 'layer', 'architecture'],
67
+ fn: 'boundary',
68
+ boost: NAME_BOOST,
69
+ label: 'name contains domain/boundary/layer/architecture keyword',
70
+ },
71
+ {
72
+ keywords: ['flag', 'feature flag'],
73
+ fn: 'convention',
74
+ boost: NAME_BOOST,
75
+ label: 'name contains flag/feature flag keyword',
76
+ },
77
+ ];
78
+ /**
79
+ * Secondary collection overrides — for collections that can produce multiple
80
+ * governance functions depending on relation/name context. When a secondary
81
+ * function score exceeds this threshold, it may win over the primary collection
82
+ * signal if its total score is higher.
83
+ *
84
+ * `standards` can produce `quality-gate` in addition to `constraint`.
85
+ * `business-rules` can produce `policy` in addition to `constraint`.
86
+ * `decisions` can produce `boundary` in addition to `convention`.
87
+ */
88
+ const SECONDARY_COLLECTION_SIGNALS = {
89
+ 'standards': 'quality-gate',
90
+ 'business-rules': 'policy',
91
+ 'decisions': 'boundary',
92
+ };
93
+ // ── Classifier ────────────────────────────────────────────────────────
94
+ /**
95
+ * Classify a batch of governance entries, returning one ClassifiedGovernance
96
+ * per entry that has a non-null entryId. Entries with null entryId are silently
97
+ * excluded (safety guard — entries without IDs cannot be referenced by archetypes).
98
+ */
99
+ export function classifyGovernance(entries) {
100
+ const results = [];
101
+ for (const entry of entries) {
102
+ // Safety: skip entries without a human-readable ID
103
+ if (entry.entryId === null)
104
+ continue;
105
+ const scores = new Map();
106
+ const signals = [];
107
+ const nameLower = entry.name.toLowerCase();
108
+ const slug = entry.collectionSlug;
109
+ // ── Signal 1: Collection type (strongest) ──────────────────────
110
+ const primaryFn = COLLECTION_TO_FUNCTION[slug];
111
+ if (primaryFn && primaryFn !== 'unclassified') {
112
+ addScore(scores, primaryFn, COLLECTION_BASE_SCORE);
113
+ signals.push(`collection '${slug}' → ${primaryFn}`);
114
+ }
115
+ // Secondary collection function — seed with a lower base so it can win
116
+ // only when relation/name signals push it above the primary.
117
+ const secondaryFn = SECONDARY_COLLECTION_SIGNALS[slug];
118
+ if (secondaryFn) {
119
+ addScore(scores, secondaryFn, COLLECTION_BASE_SCORE - 0.1);
120
+ signals.push(`collection '${slug}' secondary → ${secondaryFn}`);
121
+ }
122
+ // ── Signal 2: Relation types (refining) ───────────────────────
123
+ for (const rel of entry.relations) {
124
+ const relTypeLower = rel.type.toLowerCase();
125
+ for (const sig of RELATION_SIGNALS) {
126
+ if (relTypeLower === sig.type) {
127
+ addScore(scores, sig.fn, sig.boost);
128
+ signals.push(`relation '${rel.type}' → boost ${sig.fn}`);
129
+ }
130
+ }
131
+ for (const sig of RELATION_COLLECTION_SIGNALS) {
132
+ if (relTypeLower === sig.relationType &&
133
+ rel.otherCollectionSlug === sig.otherCollectionSlug) {
134
+ addScore(scores, sig.fn, sig.boost);
135
+ signals.push(`relation '${rel.type}' to ${sig.otherCollectionSlug} → boost ${sig.fn}`);
136
+ }
137
+ }
138
+ }
139
+ // ── Signal 3: Name patterns (weakest) ─────────────────────────
140
+ for (const sig of NAME_SIGNALS) {
141
+ const matched = sig.keywords.some((kw) => nameLower.includes(kw));
142
+ if (matched) {
143
+ addScore(scores, sig.fn, sig.boost);
144
+ signals.push(sig.label);
145
+ }
146
+ }
147
+ // ── Pick winner ───────────────────────────────────────────────
148
+ let bestFn = 'unclassified';
149
+ let bestScore = 0;
150
+ for (const [fn, score] of scores) {
151
+ if (score > bestScore) {
152
+ bestScore = score;
153
+ bestFn = fn;
154
+ }
155
+ }
156
+ // Glossary is always unclassified regardless of score
157
+ if (slug === 'glossary') {
158
+ bestFn = 'unclassified';
159
+ bestScore = 0;
160
+ }
161
+ // Confidence: clamp to [0, 1]
162
+ const confidence = Math.min(1, Math.max(0, bestScore));
163
+ results.push({
164
+ entryId: entry.entryId,
165
+ name: entry.name,
166
+ collectionSlug: entry.collectionSlug,
167
+ governanceFunction: bestFn,
168
+ confidence,
169
+ matchedSignals: signals,
170
+ data: entry.data,
171
+ relations: entry.relations,
172
+ });
173
+ }
174
+ return results;
175
+ }
176
+ // ── Helpers ────────────────────────────────────────────────────────────
177
+ function addScore(scores, fn, delta) {
178
+ scores.set(fn, (scores.get(fn) ?? 0) + delta);
179
+ }
180
+ //# sourceMappingURL=chain-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-classifier.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqDH,sDAAsD;AACtD,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,wDAAwD;AACxD,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,uDAAuD;AACvD,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,yDAAyD;AACzD,MAAM,sBAAsB,GAAuC;IACjE,WAAW,EAAE,YAAY;IACzB,gBAAgB,EAAE,YAAY;IAC9B,cAAc,EAAE,UAAU;IAC1B,WAAW,EAAE,YAAY;IACzB,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,QAAQ;IACpB,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,cAAc;CAC3B,CAAC;AAEF;;;;GAIG;AACH,MAAM,gBAAgB,GAAmE;IACvF,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE;IAC/D,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE;IACxD,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;CAC3D,CAAC;AAEF,qEAAqE;AACrE,MAAM,2BAA2B,GAK5B;IACH,qDAAqD;IACrD,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;CAC5G,CAAC;AAEF;;;GAGG;AACH,MAAM,YAAY,GAAwF;IACxG;QACE,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC;QAC5C,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,gDAAgD;KACxD;IACD;QACE,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;QAC9C,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,+CAA+C;KACvD;IACD;QACE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;QAC3C,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,+CAA+C;KACvD;IACD;QACE,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC;QACzD,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,0DAA0D;KAClE;IACD;QACE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC;QAClC,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,yCAAyC;KACjD;CACF,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,4BAA4B,GAAuC;IACvE,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,QAAQ;IAC1B,WAAW,EAAE,UAAU;CACxB,CAAC;AAEF,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA+B;IAChE,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,mDAAmD;QACnD,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,SAAS;QAErC,MAAM,MAAM,GAAa,IAAI,GAAG,EAAE,CAAC;QACnC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC;QAElC,kEAAkE;QAClE,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,SAAS,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,uEAAuE;QACvE,6DAA6D;QAC7D,MAAM,WAAW,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,qBAAqB,GAAG,GAAG,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,iEAAiE;QACjE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAE5C,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACnC,IAAI,YAAY,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;gBAC9C,IACE,YAAY,KAAK,GAAG,CAAC,YAAY;oBACjC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC,mBAAmB,EACnD,CAAC;oBACD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,mBAAmB,YAAY,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAClE,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,MAAM,GAAuB,cAAc,CAAC;QAChD,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACjC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,MAAM,GAAG,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,GAAG,cAAc,CAAC;YACxB,SAAS,GAAG,CAAC,CAAC;QAChB,CAAC;QAED,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAEvD,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,kBAAkB,EAAE,MAAM;YAC1B,UAAU;YACV,cAAc,EAAE,OAAO;YACvB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0EAA0E;AAE1E,SAAS,QAAQ,CAAC,MAAgB,EAAE,EAAsB,EAAE,KAAa;IACvE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chain-classifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-classifier.test.d.ts","sourceRoot":"","sources":["../../src/generators/chain-classifier.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * chain-classifier — unit tests.
3
+ * BET-286 Slice 1: relation-aware governance function classifier.
4
+ */
5
+ import { describe, expect, it } from 'vitest';
6
+ import { classifyGovernance, } from './chain-classifier.js';
7
+ // ── Helpers ────────────────────────────────────────────────────────────
8
+ function makeEntry(overrides) {
9
+ return {
10
+ status: 'committed',
11
+ verificationStatus: null,
12
+ data: null,
13
+ relations: [],
14
+ ...overrides,
15
+ };
16
+ }
17
+ function makeRelation(overrides) {
18
+ return {
19
+ direction: 'outgoing',
20
+ otherEntryId: null,
21
+ otherName: 'other entry',
22
+ otherCollectionSlug: null,
23
+ ...overrides,
24
+ };
25
+ }
26
+ // ── Test cases ─────────────────────────────────────────────────────────
27
+ describe('classifyGovernance — collection signal', () => {
28
+ it('STD entry with constrains relation → constraint with high confidence (>=0.6)', () => {
29
+ const entry = makeEntry({
30
+ entryId: 'STD-1',
31
+ name: 'Trunk-based development standard',
32
+ collectionSlug: 'standards',
33
+ relations: [makeRelation({ type: 'constrains', otherCollectionSlug: 'bets' })],
34
+ });
35
+ const results = classifyGovernance([entry]);
36
+ expect(results).toHaveLength(1);
37
+ expect(results[0].governanceFunction).toBe('constraint');
38
+ expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
39
+ });
40
+ it('ARCH entry → boundary with medium confidence (>=0.4)', () => {
41
+ const entry = makeEntry({
42
+ entryId: 'ARCH-1',
43
+ name: 'Seven system domains',
44
+ collectionSlug: 'architecture',
45
+ });
46
+ const results = classifyGovernance([entry]);
47
+ expect(results).toHaveLength(1);
48
+ expect(results[0].governanceFunction).toBe('boundary');
49
+ expect(results[0].confidence).toBeGreaterThanOrEqual(0.4);
50
+ });
51
+ it('DEC entry with deployment in name → convention with boosted confidence', () => {
52
+ const entry = makeEntry({
53
+ entryId: 'DEC-1',
54
+ name: 'deployment ordering for Convex and Railway',
55
+ collectionSlug: 'decisions',
56
+ });
57
+ const noNameEntry = makeEntry({
58
+ entryId: 'DEC-2',
59
+ name: 'some decision',
60
+ collectionSlug: 'decisions',
61
+ });
62
+ const withName = classifyGovernance([entry]);
63
+ const withoutName = classifyGovernance([noNameEntry]);
64
+ expect(withName[0].governanceFunction).toBe('convention');
65
+ expect(withName[0].confidence).toBeGreaterThan(withoutName[0].confidence);
66
+ });
67
+ it('FLOW entry → workflow', () => {
68
+ const entry = makeEntry({
69
+ entryId: 'FLOW-1',
70
+ name: 'Feature flag lifecycle flow',
71
+ collectionSlug: 'flows',
72
+ });
73
+ const results = classifyGovernance([entry]);
74
+ expect(results).toHaveLength(1);
75
+ expect(results[0].governanceFunction).toBe('workflow');
76
+ });
77
+ it('POL entry with governs relation → policy with high confidence', () => {
78
+ const entry = makeEntry({
79
+ entryId: 'POL-1',
80
+ name: 'Access control policy',
81
+ collectionSlug: 'policies',
82
+ relations: [makeRelation({ type: 'governs', otherCollectionSlug: 'bets' })],
83
+ });
84
+ const results = classifyGovernance([entry]);
85
+ expect(results).toHaveLength(1);
86
+ expect(results[0].governanceFunction).toBe('policy');
87
+ expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
88
+ });
89
+ it('STD entry with test in name → quality-gate with boosted confidence', () => {
90
+ const entry = makeEntry({
91
+ entryId: 'STD-2',
92
+ name: 'Test coverage quality gate for all slices',
93
+ collectionSlug: 'standards',
94
+ });
95
+ const results = classifyGovernance([entry]);
96
+ expect(results).toHaveLength(1);
97
+ expect(results[0].governanceFunction).toBe('quality-gate');
98
+ expect(results[0].confidence).toBeGreaterThanOrEqual(0.5);
99
+ });
100
+ });
101
+ describe('classifyGovernance — null entryId safety', () => {
102
+ it('entry with null entryId is excluded from output', () => {
103
+ const entry = makeEntry({
104
+ entryId: null,
105
+ name: 'Draft entry without ID',
106
+ collectionSlug: 'standards',
107
+ });
108
+ const results = classifyGovernance([entry]);
109
+ expect(results).toHaveLength(0);
110
+ });
111
+ });
112
+ describe('classifyGovernance — empty input', () => {
113
+ it('empty input → empty output', () => {
114
+ const results = classifyGovernance([]);
115
+ expect(results).toHaveLength(0);
116
+ });
117
+ });
118
+ describe('classifyGovernance — unclassified', () => {
119
+ it('glossary entry → unclassified regardless of signals', () => {
120
+ const entry = makeEntry({
121
+ entryId: 'GLO-1',
122
+ name: 'Trunk-based development',
123
+ collectionSlug: 'glossary',
124
+ relations: [makeRelation({ type: 'constrains' })],
125
+ });
126
+ const results = classifyGovernance([entry]);
127
+ expect(results).toHaveLength(1);
128
+ expect(results[0].governanceFunction).toBe('unclassified');
129
+ expect(results[0].confidence).toBe(0);
130
+ });
131
+ });
132
+ describe('classifyGovernance — multiple signal matches', () => {
133
+ it('entry with multiple signals → highest confidence function wins', () => {
134
+ // BR entry with both constrains AND governs relations.
135
+ // constrains boosts 'constraint', governs boosts 'policy'.
136
+ // business-rules base maps to 'constraint', so constraint should win.
137
+ const entry = makeEntry({
138
+ entryId: 'BR-1',
139
+ name: 'Entry creation must use createEntry gate',
140
+ collectionSlug: 'business-rules',
141
+ relations: [
142
+ makeRelation({ type: 'constrains' }),
143
+ makeRelation({ type: 'constrains' }),
144
+ makeRelation({ type: 'governs' }),
145
+ ],
146
+ });
147
+ const results = classifyGovernance([entry]);
148
+ expect(results).toHaveLength(1);
149
+ // Both constraint and policy are plausible; the function with the highest score wins.
150
+ // With 2x constrains boosts, constraint should dominate.
151
+ expect(results[0].governanceFunction).toBe('constraint');
152
+ expect(results[0].confidence).toBeGreaterThanOrEqual(0.6);
153
+ });
154
+ });
155
+ describe('classifyGovernance — passthrough fields', () => {
156
+ it('passes data and relations through to result', () => {
157
+ const data = { someField: 'someValue' };
158
+ const relation = makeRelation({ type: 'constrains' });
159
+ const entry = makeEntry({
160
+ entryId: 'STD-99',
161
+ name: 'Some standard',
162
+ collectionSlug: 'standards',
163
+ data,
164
+ relations: [relation],
165
+ });
166
+ const results = classifyGovernance([entry]);
167
+ expect(results[0].data).toBe(data);
168
+ expect(results[0].relations).toEqual([relation]);
169
+ });
170
+ it('returns entryId, name, and collectionSlug unchanged', () => {
171
+ const entry = makeEntry({
172
+ entryId: 'ARCH-42',
173
+ name: 'My architecture entry',
174
+ collectionSlug: 'architecture',
175
+ });
176
+ const results = classifyGovernance([entry]);
177
+ expect(results[0].entryId).toBe('ARCH-42');
178
+ expect(results[0].name).toBe('My architecture entry');
179
+ expect(results[0].collectionSlug).toBe('architecture');
180
+ });
181
+ });
182
+ describe('classifyGovernance — name signal boosts', () => {
183
+ it('security keyword boosts policy for business-rules collection', () => {
184
+ const withKeyword = makeEntry({
185
+ entryId: 'BR-2',
186
+ name: 'Auth security check before MCP tool execution',
187
+ collectionSlug: 'business-rules',
188
+ });
189
+ const withoutKeyword = makeEntry({
190
+ entryId: 'BR-3',
191
+ name: 'Some business rule',
192
+ collectionSlug: 'business-rules',
193
+ });
194
+ const [withResult] = classifyGovernance([withKeyword]);
195
+ const [withoutResult] = classifyGovernance([withoutKeyword]);
196
+ // Security keyword → policy wins over default constraint
197
+ expect(withResult.governanceFunction).toBe('policy');
198
+ // Without keyword, default constraint wins
199
+ expect(withoutResult.governanceFunction).toBe('constraint');
200
+ });
201
+ it('matchedSignals contains human-readable explanations', () => {
202
+ const entry = makeEntry({
203
+ entryId: 'STD-5',
204
+ name: 'Quality gate for test coverage',
205
+ collectionSlug: 'standards',
206
+ relations: [makeRelation({ type: 'constrains' })],
207
+ });
208
+ const [result] = classifyGovernance([entry]);
209
+ expect(result.matchedSignals.length).toBeGreaterThan(0);
210
+ expect(result.matchedSignals.some((s) => s.includes('standards'))).toBe(true);
211
+ });
212
+ });
213
+ describe('classifyGovernance — mixed null/non-null entryIds', () => {
214
+ it('only entries with non-null entryIds are returned', () => {
215
+ const entries = [
216
+ makeEntry({ entryId: 'STD-1', name: 'Valid standard', collectionSlug: 'standards' }),
217
+ makeEntry({ entryId: null, name: 'Draft entry', collectionSlug: 'standards' }),
218
+ makeEntry({ entryId: 'ARCH-2', name: 'Architecture entry', collectionSlug: 'architecture' }),
219
+ ];
220
+ const results = classifyGovernance(entries);
221
+ expect(results).toHaveLength(2);
222
+ expect(results.map((r) => r.entryId)).toEqual(['STD-1', 'ARCH-2']);
223
+ });
224
+ });
225
+ describe('classifyGovernance — patterns collection', () => {
226
+ it('PAT entry → convention', () => {
227
+ const entry = makeEntry({
228
+ entryId: 'PAT-1',
229
+ name: 'Additive wrapping pattern for feature flags',
230
+ collectionSlug: 'patterns',
231
+ });
232
+ const results = classifyGovernance([entry]);
233
+ expect(results[0].governanceFunction).toBe('convention');
234
+ });
235
+ });
236
+ describe('classifyGovernance — informed_by ARCH relation boosts boundary', () => {
237
+ it('DEC informed_by an architecture entry → boundary wins over convention', () => {
238
+ const entry = makeEntry({
239
+ entryId: 'DEC-5',
240
+ name: 'Domain boundaries for the seven layers',
241
+ collectionSlug: 'decisions',
242
+ relations: [
243
+ makeRelation({
244
+ type: 'informed_by',
245
+ direction: 'outgoing',
246
+ otherCollectionSlug: 'architecture',
247
+ otherName: 'Seven system domains',
248
+ otherEntryId: 'ARCH-26',
249
+ }),
250
+ ],
251
+ });
252
+ // Also include 'domain' keyword in the name → double boundary boost
253
+ const results = classifyGovernance([entry]);
254
+ expect(results[0].governanceFunction).toBe('boundary');
255
+ });
256
+ });
257
+ //# sourceMappingURL=chain-classifier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-classifier.test.js","sourceRoot":"","sources":["../../src/generators/chain-classifier.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Chain Rules Assembler — BET-286 Slice 3
3
+ *
4
+ * Fetches governance entries via MCP, classifies them, resolves archetype
5
+ * templates, and returns CanonicalRule objects ready to merge into the
6
+ * canonical rules array in runHandshake().
7
+ *
8
+ * Chain: BET-286 (Chain-Derived Agent Configuration)
9
+ */
10
+ import type { CanonicalRule } from './portable-knowledge.js';
11
+ import type { kernelCall as McpCallFn } from '../lib/client.js';
12
+ /** Statistics from a generateChainRules() call. */
13
+ export interface ChainRulesStats {
14
+ totalEntries: number;
15
+ classifiedEntries: number;
16
+ generatedRules: number;
17
+ suppressedByManual: number;
18
+ suppressedByZeroEntries: number;
19
+ }
20
+ /** Result returned by generateChainRules(). */
21
+ export interface ChainRulesResult {
22
+ /** Generated rules ready to merge into canonical rules array. */
23
+ rules: CanonicalRule[];
24
+ /** Function keys with no matching governance entries. */
25
+ gaps: string[];
26
+ /** Sentinel rule when MCP is unreachable — null on success. */
27
+ sentinel: CanonicalRule | null;
28
+ stats: ChainRulesStats;
29
+ /** Classified governance entries — passed through for diff engine confidence data. */
30
+ classified: import('./chain-classifier.js').ClassifiedGovernance[];
31
+ }
32
+ /**
33
+ * Fetch governance entries, classify them, resolve archetypes, and produce
34
+ * CanonicalRule objects ready to merge into the handshake pipeline.
35
+ *
36
+ * @param kernelCallFn - Injected kernelCall function for testability.
37
+ * @param manualRules - Existing manual rules from .productbrain/rules/.
38
+ * Used to suppress generated rules when a manual rule
39
+ * with the same name already exists.
40
+ */
41
+ export declare function generateChainRules(kernelCallFn: typeof McpCallFn, manualRules: CanonicalRule[]): Promise<ChainRulesResult>;
42
+ //# sourceMappingURL=chain-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-rules.d.ts","sourceRoot":"","sources":["../../src/generators/chain-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,OAAO,KAAK,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIhE,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,yDAAyD;IACzD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+DAA+D;IAC/D,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,sFAAsF;IACtF,UAAU,EAAE,OAAO,uBAAuB,EAAE,oBAAoB,EAAE,CAAC;CACpE;AAkCD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,OAAO,SAAS,EAC9B,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAoF3B"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Chain Rules Assembler — BET-286 Slice 3
3
+ *
4
+ * Fetches governance entries via MCP, classifies them, resolves archetype
5
+ * templates, and returns CanonicalRule objects ready to merge into the
6
+ * canonical rules array in runHandshake().
7
+ *
8
+ * Chain: BET-286 (Chain-Derived Agent Configuration)
9
+ */
10
+ import { classifyGovernance } from './chain-classifier.js';
11
+ import { resolveArchetype } from './archetypes.js';
12
+ // ── Sentinel ──────────────────────────────────────────────────────────
13
+ /** Produced when chain.getGovernanceWithRelations is unreachable. */
14
+ const CHAIN_DEGRADED_SENTINEL = {
15
+ name: '_chain_degraded',
16
+ description: 'Chain governance unavailable — agent operating with manual rules only',
17
+ body: 'WARNING: The Chain MCP endpoint is unreachable. Generated governance rules are unavailable. Agent is operating with manual rules only. Exercise extra caution on governance decisions — check with the human before proceeding.',
18
+ sourcePath: 'chain://_sentinel',
19
+ autoApply: true,
20
+ level: 'core',
21
+ scope: undefined,
22
+ targets: undefined,
23
+ };
24
+ // ── Governance functions to attempt (excluding 'unclassified') ────────
25
+ const GOVERNANCE_FUNCTIONS = [
26
+ 'constraint',
27
+ 'boundary',
28
+ 'convention',
29
+ 'policy',
30
+ 'workflow',
31
+ 'quality-gate',
32
+ ];
33
+ /** Maximum number of generated rules (ranked by relation density). */
34
+ const MAX_GENERATED_RULES = 8;
35
+ // ── Assembler ─────────────────────────────────────────────────────────
36
+ /**
37
+ * Fetch governance entries, classify them, resolve archetypes, and produce
38
+ * CanonicalRule objects ready to merge into the handshake pipeline.
39
+ *
40
+ * @param kernelCallFn - Injected kernelCall function for testability.
41
+ * @param manualRules - Existing manual rules from .productbrain/rules/.
42
+ * Used to suppress generated rules when a manual rule
43
+ * with the same name already exists.
44
+ */
45
+ export async function generateChainRules(kernelCallFn, manualRules) {
46
+ const emptyStats = {
47
+ totalEntries: 0,
48
+ classifiedEntries: 0,
49
+ generatedRules: 0,
50
+ suppressedByManual: 0,
51
+ suppressedByZeroEntries: 0,
52
+ };
53
+ // Step 1: Fetch governance entries — return sentinel on failure
54
+ // The Convex query returns { entries: [...], total: N } — unwrap the array.
55
+ let entries;
56
+ try {
57
+ const result = await kernelCallFn('chain.getGovernanceWithRelations', {});
58
+ if (!Array.isArray(result?.entries)) {
59
+ return { rules: [], gaps: [], sentinel: CHAIN_DEGRADED_SENTINEL, stats: emptyStats, classified: [] };
60
+ }
61
+ entries = result.entries;
62
+ }
63
+ catch {
64
+ return {
65
+ rules: [],
66
+ gaps: [],
67
+ sentinel: CHAIN_DEGRADED_SENTINEL,
68
+ stats: emptyStats,
69
+ classified: [],
70
+ };
71
+ }
72
+ // Step 2: Classify entries
73
+ const classified = classifyGovernance(entries);
74
+ // Step 3: Build manual rule name set for suppression check
75
+ const manualRuleNames = new Set(manualRules.map((r) => r.name));
76
+ // Step 4: Resolve an archetype per governance function
77
+ const resolvedRules = [];
78
+ const gaps = [];
79
+ let suppressedByManual = 0;
80
+ let suppressedByZeroEntries = 0;
81
+ for (const fn of GOVERNANCE_FUNCTIONS) {
82
+ const matching = classified.filter((e) => e.governanceFunction === fn);
83
+ if (matching.length === 0) {
84
+ // Zero entries for this function — add to gaps
85
+ gaps.push(fn);
86
+ suppressedByZeroEntries++;
87
+ continue;
88
+ }
89
+ const result = resolveArchetype(fn, classified, manualRuleNames);
90
+ if ('skipped' in result) {
91
+ if (result.skipped === 'manual-suppression') {
92
+ suppressedByManual++;
93
+ }
94
+ // 'no-template' and 'zero-entries' are not counted as manual suppression.
95
+ // Zero-entries is already handled above; no-template is a missing file (not a user action).
96
+ continue;
97
+ }
98
+ resolvedRules.push(result.resolved.rule);
99
+ }
100
+ // Step 5: Cap at MAX_GENERATED_RULES — rank by relation density
101
+ // Relation density = total relations across all classified entries matching this function
102
+ const ranked = rankByRelationDensity(resolvedRules, classified);
103
+ const cappedRules = ranked.slice(0, MAX_GENERATED_RULES);
104
+ const stats = {
105
+ totalEntries: entries.length,
106
+ classifiedEntries: classified.length,
107
+ generatedRules: cappedRules.length,
108
+ suppressedByManual,
109
+ suppressedByZeroEntries,
110
+ };
111
+ return {
112
+ rules: cappedRules,
113
+ gaps,
114
+ sentinel: null,
115
+ stats,
116
+ classified,
117
+ };
118
+ }
119
+ // ── Ranking ───────────────────────────────────────────────────────────
120
+ /**
121
+ * Rank generated rules by the total number of relations across classified
122
+ * entries that contributed to each rule. Higher relation density → ranked first.
123
+ *
124
+ * Falls back to name-based sort for ties to ensure stable output.
125
+ */
126
+ function rankByRelationDensity(rules, classified) {
127
+ // Build a density score per sourcePath (chain://<functionKey>)
128
+ const densityMap = new Map();
129
+ for (const rule of rules) {
130
+ // sourcePath is 'chain://<functionKey>'
131
+ const functionKey = rule.sourcePath.replace('chain://', '');
132
+ const matching = classified.filter((e) => e.governanceFunction === functionKey);
133
+ const density = matching.reduce((sum, e) => sum + e.relations.length, 0);
134
+ densityMap.set(rule.sourcePath, density);
135
+ }
136
+ return [...rules].sort((a, b) => {
137
+ const densityA = densityMap.get(a.sourcePath) ?? 0;
138
+ const densityB = densityMap.get(b.sourcePath) ?? 0;
139
+ if (densityB !== densityA)
140
+ return densityB - densityA;
141
+ return a.name.localeCompare(b.name);
142
+ });
143
+ }
144
+ //# sourceMappingURL=chain-rules.js.map