@productbrain/cli 0.1.0-beta.1 → 0.1.0-beta.15

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 (278) hide show
  1. package/README.md +167 -0
  2. package/dist/__tests__/audit.test.d.ts +2 -0
  3. package/dist/__tests__/audit.test.d.ts.map +1 -0
  4. package/dist/__tests__/audit.test.js +394 -0
  5. package/dist/__tests__/audit.test.js.map +1 -0
  6. package/dist/__tests__/capture.test.d.ts +2 -0
  7. package/dist/__tests__/capture.test.d.ts.map +1 -0
  8. package/dist/__tests__/capture.test.js +86 -0
  9. package/dist/__tests__/capture.test.js.map +1 -0
  10. package/dist/__tests__/constellation.test.d.ts +2 -0
  11. package/dist/__tests__/constellation.test.d.ts.map +1 -0
  12. package/dist/__tests__/constellation.test.js +260 -0
  13. package/dist/__tests__/constellation.test.js.map +1 -0
  14. package/dist/__tests__/context-strategy.test.d.ts +2 -0
  15. package/dist/__tests__/context-strategy.test.d.ts.map +1 -0
  16. package/dist/__tests__/context-strategy.test.js +79 -0
  17. package/dist/__tests__/context-strategy.test.js.map +1 -0
  18. package/dist/__tests__/fields.test.d.ts +2 -0
  19. package/dist/__tests__/fields.test.d.ts.map +1 -0
  20. package/dist/__tests__/fields.test.js +238 -0
  21. package/dist/__tests__/fields.test.js.map +1 -0
  22. package/dist/__tests__/handshake.test.d.ts +2 -0
  23. package/dist/__tests__/handshake.test.d.ts.map +1 -0
  24. package/dist/__tests__/handshake.test.js +187 -0
  25. package/dist/__tests__/handshake.test.js.map +1 -0
  26. package/dist/__tests__/ingest.test.d.ts +2 -0
  27. package/dist/__tests__/ingest.test.d.ts.map +1 -0
  28. package/dist/__tests__/ingest.test.js +185 -0
  29. package/dist/__tests__/ingest.test.js.map +1 -0
  30. package/dist/__tests__/promote.test.d.ts +2 -0
  31. package/dist/__tests__/promote.test.d.ts.map +1 -0
  32. package/dist/__tests__/promote.test.js +139 -0
  33. package/dist/__tests__/promote.test.js.map +1 -0
  34. package/dist/__tests__/proposals.test.d.ts +2 -0
  35. package/dist/__tests__/proposals.test.d.ts.map +1 -0
  36. package/dist/__tests__/proposals.test.js +190 -0
  37. package/dist/__tests__/proposals.test.js.map +1 -0
  38. package/dist/__tests__/relate.test.d.ts +2 -0
  39. package/dist/__tests__/relate.test.d.ts.map +1 -0
  40. package/dist/__tests__/relate.test.js +105 -0
  41. package/dist/__tests__/relate.test.js.map +1 -0
  42. package/dist/__tests__/repo-detect.test.d.ts +2 -0
  43. package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
  44. package/dist/__tests__/repo-detect.test.js +119 -0
  45. package/dist/__tests__/repo-detect.test.js.map +1 -0
  46. package/dist/__tests__/runner.test.d.ts +2 -0
  47. package/dist/__tests__/runner.test.d.ts.map +1 -0
  48. package/dist/__tests__/runner.test.js +215 -0
  49. package/dist/__tests__/runner.test.js.map +1 -0
  50. package/dist/__tests__/session-touch.test.d.ts +2 -0
  51. package/dist/__tests__/session-touch.test.d.ts.map +1 -0
  52. package/dist/__tests__/session-touch.test.js +134 -0
  53. package/dist/__tests__/session-touch.test.js.map +1 -0
  54. package/dist/__tests__/session.test.d.ts +2 -0
  55. package/dist/__tests__/session.test.d.ts.map +1 -0
  56. package/dist/__tests__/session.test.js +52 -0
  57. package/dist/__tests__/session.test.js.map +1 -0
  58. package/dist/__tests__/strip.test.d.ts +2 -0
  59. package/dist/__tests__/strip.test.d.ts.map +1 -0
  60. package/dist/__tests__/strip.test.js +136 -0
  61. package/dist/__tests__/strip.test.js.map +1 -0
  62. package/dist/__tests__/update.test.d.ts +2 -0
  63. package/dist/__tests__/update.test.d.ts.map +1 -0
  64. package/dist/__tests__/update.test.js +237 -0
  65. package/dist/__tests__/update.test.js.map +1 -0
  66. package/dist/commands/accept.d.ts +18 -0
  67. package/dist/commands/accept.d.ts.map +1 -0
  68. package/dist/commands/accept.js +72 -0
  69. package/dist/commands/accept.js.map +1 -0
  70. package/dist/commands/audit.d.ts +25 -0
  71. package/dist/commands/audit.d.ts.map +1 -0
  72. package/dist/commands/audit.js +188 -0
  73. package/dist/commands/audit.js.map +1 -0
  74. package/dist/commands/brand-pack.d.ts +2 -0
  75. package/dist/commands/brand-pack.d.ts.map +1 -0
  76. package/dist/commands/brand-pack.js +25 -0
  77. package/dist/commands/brand-pack.js.map +1 -0
  78. package/dist/commands/brief.d.ts +28 -0
  79. package/dist/commands/brief.d.ts.map +1 -0
  80. package/dist/commands/brief.js +70 -0
  81. package/dist/commands/brief.js.map +1 -0
  82. package/dist/commands/capture.d.ts +25 -0
  83. package/dist/commands/capture.d.ts.map +1 -0
  84. package/dist/commands/capture.js +103 -0
  85. package/dist/commands/capture.js.map +1 -0
  86. package/dist/commands/chain-walk.d.ts +14 -0
  87. package/dist/commands/chain-walk.d.ts.map +1 -0
  88. package/dist/commands/chain-walk.js +33 -0
  89. package/dist/commands/chain-walk.js.map +1 -0
  90. package/dist/commands/changes.d.ts +11 -0
  91. package/dist/commands/changes.d.ts.map +1 -0
  92. package/dist/commands/changes.js +41 -0
  93. package/dist/commands/changes.js.map +1 -0
  94. package/dist/commands/constellation.d.ts +11 -0
  95. package/dist/commands/constellation.d.ts.map +1 -0
  96. package/dist/commands/constellation.js +28 -0
  97. package/dist/commands/constellation.js.map +1 -0
  98. package/dist/commands/context.d.ts +2 -1
  99. package/dist/commands/context.d.ts.map +1 -1
  100. package/dist/commands/context.js +19 -9
  101. package/dist/commands/context.js.map +1 -1
  102. package/dist/commands/cross-cut.d.ts +11 -0
  103. package/dist/commands/cross-cut.d.ts.map +1 -0
  104. package/dist/commands/cross-cut.js +23 -0
  105. package/dist/commands/cross-cut.js.map +1 -0
  106. package/dist/commands/fields.d.ts +9 -0
  107. package/dist/commands/fields.d.ts.map +1 -0
  108. package/dist/commands/fields.js +26 -0
  109. package/dist/commands/fields.js.map +1 -0
  110. package/dist/commands/get.d.ts +8 -1
  111. package/dist/commands/get.d.ts.map +1 -1
  112. package/dist/commands/get.js +55 -6
  113. package/dist/commands/get.js.map +1 -1
  114. package/dist/commands/handshake.d.ts +18 -0
  115. package/dist/commands/handshake.d.ts.map +1 -0
  116. package/dist/commands/handshake.js +378 -0
  117. package/dist/commands/handshake.js.map +1 -0
  118. package/dist/commands/ingest.d.ts +14 -0
  119. package/dist/commands/ingest.d.ts.map +1 -0
  120. package/dist/commands/ingest.js +181 -0
  121. package/dist/commands/ingest.js.map +1 -0
  122. package/dist/commands/login.d.ts +5 -0
  123. package/dist/commands/login.d.ts.map +1 -0
  124. package/dist/commands/login.js +53 -0
  125. package/dist/commands/login.js.map +1 -0
  126. package/dist/commands/orient.d.ts +2 -0
  127. package/dist/commands/orient.d.ts.map +1 -1
  128. package/dist/commands/orient.js +17 -8
  129. package/dist/commands/orient.js.map +1 -1
  130. package/dist/commands/promote.d.ts +12 -0
  131. package/dist/commands/promote.d.ts.map +1 -0
  132. package/dist/commands/promote.js +48 -0
  133. package/dist/commands/promote.js.map +1 -0
  134. package/dist/commands/proposals.d.ts +9 -0
  135. package/dist/commands/proposals.d.ts.map +1 -0
  136. package/dist/commands/proposals.js +24 -0
  137. package/dist/commands/proposals.js.map +1 -0
  138. package/dist/commands/reject.d.ts +14 -0
  139. package/dist/commands/reject.d.ts.map +1 -0
  140. package/dist/commands/reject.js +37 -0
  141. package/dist/commands/reject.js.map +1 -0
  142. package/dist/commands/relate.d.ts +16 -0
  143. package/dist/commands/relate.d.ts.map +1 -0
  144. package/dist/commands/relate.js +80 -0
  145. package/dist/commands/relate.js.map +1 -0
  146. package/dist/commands/search.d.ts +1 -0
  147. package/dist/commands/search.d.ts.map +1 -1
  148. package/dist/commands/search.js +9 -3
  149. package/dist/commands/search.js.map +1 -1
  150. package/dist/commands/session.d.ts +20 -0
  151. package/dist/commands/session.d.ts.map +1 -0
  152. package/dist/commands/session.js +134 -0
  153. package/dist/commands/session.js.map +1 -0
  154. package/dist/commands/update.d.ts +16 -0
  155. package/dist/commands/update.d.ts.map +1 -0
  156. package/dist/commands/update.js +139 -0
  157. package/dist/commands/update.js.map +1 -0
  158. package/dist/commands/verify.d.ts +13 -0
  159. package/dist/commands/verify.d.ts.map +1 -0
  160. package/dist/commands/verify.js +43 -0
  161. package/dist/commands/verify.js.map +1 -0
  162. package/dist/formatters/audit.d.ts +46 -0
  163. package/dist/formatters/audit.d.ts.map +1 -0
  164. package/dist/formatters/audit.js +81 -0
  165. package/dist/formatters/audit.js.map +1 -0
  166. package/dist/formatters/brief.d.ts +112 -0
  167. package/dist/formatters/brief.d.ts.map +1 -0
  168. package/dist/formatters/brief.js +179 -0
  169. package/dist/formatters/brief.js.map +1 -0
  170. package/dist/formatters/capture.d.ts +30 -0
  171. package/dist/formatters/capture.d.ts.map +1 -0
  172. package/dist/formatters/capture.js +58 -0
  173. package/dist/formatters/capture.js.map +1 -0
  174. package/dist/formatters/chain-walk.d.ts +33 -0
  175. package/dist/formatters/chain-walk.d.ts.map +1 -0
  176. package/dist/formatters/chain-walk.js +54 -0
  177. package/dist/formatters/chain-walk.js.map +1 -0
  178. package/dist/formatters/changes.d.ts +25 -0
  179. package/dist/formatters/changes.d.ts.map +1 -0
  180. package/dist/formatters/changes.js +60 -0
  181. package/dist/formatters/changes.js.map +1 -0
  182. package/dist/formatters/constellation.d.ts +34 -0
  183. package/dist/formatters/constellation.d.ts.map +1 -0
  184. package/dist/formatters/constellation.js +38 -0
  185. package/dist/formatters/constellation.js.map +1 -0
  186. package/dist/formatters/cross-cut.d.ts +21 -0
  187. package/dist/formatters/cross-cut.d.ts.map +1 -0
  188. package/dist/formatters/cross-cut.js +32 -0
  189. package/dist/formatters/cross-cut.js.map +1 -0
  190. package/dist/formatters/entry.d.ts +11 -0
  191. package/dist/formatters/entry.d.ts.map +1 -1
  192. package/dist/formatters/entry.js +14 -1
  193. package/dist/formatters/entry.js.map +1 -1
  194. package/dist/formatters/fields.d.ts +32 -0
  195. package/dist/formatters/fields.d.ts.map +1 -0
  196. package/dist/formatters/fields.js +49 -0
  197. package/dist/formatters/fields.js.map +1 -0
  198. package/dist/formatters/handshake.d.ts +17 -0
  199. package/dist/formatters/handshake.d.ts.map +1 -0
  200. package/dist/formatters/handshake.js +51 -0
  201. package/dist/formatters/handshake.js.map +1 -0
  202. package/dist/formatters/orient.d.ts +1 -0
  203. package/dist/formatters/orient.d.ts.map +1 -1
  204. package/dist/formatters/orient.js +4 -2
  205. package/dist/formatters/orient.js.map +1 -1
  206. package/dist/formatters/promote.d.ts +29 -0
  207. package/dist/formatters/promote.d.ts.map +1 -0
  208. package/dist/formatters/promote.js +38 -0
  209. package/dist/formatters/promote.js.map +1 -0
  210. package/dist/formatters/proposals.d.ts +45 -0
  211. package/dist/formatters/proposals.d.ts.map +1 -0
  212. package/dist/formatters/proposals.js +62 -0
  213. package/dist/formatters/proposals.js.map +1 -0
  214. package/dist/formatters/relate.d.ts +12 -0
  215. package/dist/formatters/relate.d.ts.map +1 -0
  216. package/dist/formatters/relate.js +13 -0
  217. package/dist/formatters/relate.js.map +1 -0
  218. package/dist/formatters/session.d.ts +11 -0
  219. package/dist/formatters/session.d.ts.map +1 -0
  220. package/dist/formatters/session.js +51 -0
  221. package/dist/formatters/session.js.map +1 -0
  222. package/dist/formatters/update.d.ts +17 -0
  223. package/dist/formatters/update.d.ts.map +1 -0
  224. package/dist/formatters/update.js +43 -0
  225. package/dist/formatters/update.js.map +1 -0
  226. package/dist/formatters/verify.d.ts +11 -0
  227. package/dist/formatters/verify.d.ts.map +1 -0
  228. package/dist/formatters/verify.js +11 -0
  229. package/dist/formatters/verify.js.map +1 -0
  230. package/dist/generators/adapters.d.ts +10 -0
  231. package/dist/generators/adapters.d.ts.map +1 -0
  232. package/dist/generators/adapters.js +102 -0
  233. package/dist/generators/adapters.js.map +1 -0
  234. package/dist/generators/briefing-md.d.ts +8 -0
  235. package/dist/generators/briefing-md.d.ts.map +1 -0
  236. package/dist/generators/briefing-md.js +51 -0
  237. package/dist/generators/briefing-md.js.map +1 -0
  238. package/dist/generators/context-md.d.ts +8 -0
  239. package/dist/generators/context-md.d.ts.map +1 -0
  240. package/dist/generators/context-md.js +123 -0
  241. package/dist/generators/context-md.js.map +1 -0
  242. package/dist/generators/portable-knowledge.d.ts +72 -0
  243. package/dist/generators/portable-knowledge.d.ts.map +1 -0
  244. package/dist/generators/portable-knowledge.js +246 -0
  245. package/dist/generators/portable-knowledge.js.map +1 -0
  246. package/dist/generators/portable-knowledge.test.d.ts +2 -0
  247. package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
  248. package/dist/generators/portable-knowledge.test.js +399 -0
  249. package/dist/generators/portable-knowledge.test.js.map +1 -0
  250. package/dist/index.d.ts +3 -2
  251. package/dist/index.d.ts.map +1 -1
  252. package/dist/index.js +466 -6
  253. package/dist/index.js.map +1 -1
  254. package/dist/lib/client.d.ts +34 -0
  255. package/dist/lib/client.d.ts.map +1 -1
  256. package/dist/lib/client.js +114 -9
  257. package/dist/lib/client.js.map +1 -1
  258. package/dist/lib/config.d.ts +19 -2
  259. package/dist/lib/config.d.ts.map +1 -1
  260. package/dist/lib/config.js +95 -14
  261. package/dist/lib/config.js.map +1 -1
  262. package/dist/lib/repo-detect.d.ts +14 -0
  263. package/dist/lib/repo-detect.d.ts.map +1 -0
  264. package/dist/lib/repo-detect.js +58 -0
  265. package/dist/lib/repo-detect.js.map +1 -0
  266. package/dist/lib/runner.d.ts +31 -0
  267. package/dist/lib/runner.d.ts.map +1 -0
  268. package/dist/lib/runner.js +65 -0
  269. package/dist/lib/runner.js.map +1 -0
  270. package/dist/lib/session.d.ts +17 -0
  271. package/dist/lib/session.d.ts.map +1 -0
  272. package/dist/lib/session.js +43 -0
  273. package/dist/lib/session.js.map +1 -0
  274. package/dist/lib/strip.d.ts +11 -0
  275. package/dist/lib/strip.d.ts.map +1 -0
  276. package/dist/lib/strip.js +26 -0
  277. package/dist/lib/strip.js.map +1 -0
  278. package/package.json +8 -4
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Session formatters — terminal output for session start / close.
3
+ */
4
+ export function formatSessionStart(session, superseded) {
5
+ const lines = [];
6
+ lines.push('');
7
+ lines.push(`Session started: ${session.sessionId}`);
8
+ lines.push(`Workspace: ${session.workspaceName}`);
9
+ lines.push(`Time: ${session.startedAt}`);
10
+ if (superseded) {
11
+ lines.push('');
12
+ lines.push(`Note: superseded previous session ${superseded.previousSessionId}`);
13
+ lines.push(` Started: ${superseded.startedAt} by ${superseded.initiatedBy}`);
14
+ }
15
+ lines.push('');
16
+ lines.push('You now have write access. Use `pb capture "<text>"` to capture knowledge.');
17
+ lines.push('Run `pb session close` when done.');
18
+ return lines.join('\n');
19
+ }
20
+ export function formatSessionClose(session) {
21
+ const lines = [];
22
+ const count = session.entriesCaptured.length;
23
+ lines.push('');
24
+ lines.push('Session closed.');
25
+ lines.push(`Duration: ${formatDuration(session.startedAt)}`);
26
+ if (count > 0) {
27
+ lines.push('');
28
+ lines.push(`Entries captured: ${count} (all as drafts)`);
29
+ for (const id of session.entriesCaptured) {
30
+ lines.push(` • ${id}`);
31
+ }
32
+ lines.push('');
33
+ lines.push('Review and commit drafts in Product Brain Studio, or via MCP.');
34
+ }
35
+ else {
36
+ lines.push('No entries captured this session.');
37
+ }
38
+ return lines.join('\n');
39
+ }
40
+ function formatDuration(startedAt) {
41
+ const ms = Date.now() - new Date(startedAt).getTime();
42
+ const mins = Math.floor(ms / 60000);
43
+ if (mins < 1)
44
+ return 'less than a minute';
45
+ if (mins < 60)
46
+ return `${mins}m`;
47
+ const hrs = Math.floor(mins / 60);
48
+ const rem = mins % 60;
49
+ return rem > 0 ? `${hrs}h ${rem}m` : `${hrs}h`;
50
+ }
51
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/formatters/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,kBAAkB,CAChC,OAAqB,EACrB,UAAkF;IAElF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAEzC,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qCAAqC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,cAAc,UAAU,CAAC,SAAS,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAEhD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAqB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;IAE7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAE7D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,kBAAkB,CAAC,CAAC;QACzD,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,oBAAoB,CAAC;IAC1C,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IACtB,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AACjD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Update receipt formatter — terminal output for pb update.
3
+ * BET-192 / FEAT-575: Added normalization + validation warning rendering.
4
+ */
5
+ export interface UpdateReceiptData {
6
+ entryId: string;
7
+ changeNote?: string;
8
+ fieldsChanged: string[];
9
+ name?: string;
10
+ status?: string;
11
+ /** BET-192: Fields silently dropped by normalizeEntryData. */
12
+ normalizationWarnings?: string[];
13
+ /** BET-192: Missing required fields, type mismatches, etc. */
14
+ validationWarnings?: string[];
15
+ }
16
+ export declare function formatUpdateReceipt(data: UpdateReceiptData): string;
17
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/formatters/update.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAyCnE"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Update receipt formatter — terminal output for pb update.
3
+ * BET-192 / FEAT-575: Added normalization + validation warning rendering.
4
+ */
5
+ export function formatUpdateReceipt(data) {
6
+ const lines = [];
7
+ // Summary line
8
+ const changes = [];
9
+ if (data.name)
10
+ changes.push(`name`);
11
+ if (data.status)
12
+ changes.push(`status → ${data.status}`);
13
+ for (const f of data.fieldsChanged) {
14
+ const key = f.split('=')[0]?.trim();
15
+ if (key)
16
+ changes.push(key);
17
+ }
18
+ lines.push(`Updated ${data.entryId}: ${data.changeNote ?? changes.join(', ')}`);
19
+ // Detail
20
+ if (data.changeNote && changes.length > 0) {
21
+ lines.push(` Fields: ${changes.join(', ')}`);
22
+ }
23
+ // BET-192 / FEAT-575: Surface normalization warnings — fields that were rejected/dropped.
24
+ if (data.normalizationWarnings && data.normalizationWarnings.length > 0) {
25
+ lines.push('');
26
+ lines.push(' ⚠ Normalization warnings:');
27
+ for (const warning of data.normalizationWarnings) {
28
+ lines.push(` - ${warning}`);
29
+ }
30
+ }
31
+ // BET-192 / FEAT-575: Surface validation warnings — missing required fields, etc.
32
+ if (data.validationWarnings && data.validationWarnings.length > 0) {
33
+ lines.push('');
34
+ lines.push(' ⚠ Validation warnings:');
35
+ for (const warning of data.validationWarnings) {
36
+ lines.push(` - ${warning}`);
37
+ }
38
+ }
39
+ lines.push('');
40
+ lines.push(` View: pb get ${data.entryId}`);
41
+ return lines.join('\n');
42
+ }
43
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/formatters/update.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,eAAe;IACf,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACpC,IAAI,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhF,SAAS;IACT,IAAI,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,0FAA0F;IAC1F,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Verify receipt formatter — terminal output for pb verify.
3
+ * BET-240 E1: Verification status for chain entries.
4
+ */
5
+ export interface VerifyReceiptData {
6
+ entryId: string;
7
+ verificationStatus: 'verified';
8
+ alreadyVerified: boolean;
9
+ }
10
+ export declare function formatVerifyReceipt(data: VerifyReceiptData): string;
11
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/formatters/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,UAAU,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAKnE"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Verify receipt formatter — terminal output for pb verify.
3
+ * BET-240 E1: Verification status for chain entries.
4
+ */
5
+ export function formatVerifyReceipt(data) {
6
+ if (data.alreadyVerified) {
7
+ return `${data.entryId} is already verified.`;
8
+ }
9
+ return `Verified ${data.entryId}. Status: verified.`;
10
+ }
11
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/formatters/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IACzD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,GAAG,IAAI,CAAC,OAAO,uBAAuB,CAAC;IAChD,CAAC;IACD,OAAO,YAAY,IAAI,CAAC,OAAO,qBAAqB,CAAC;AACvD,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Adapter file generators — thin pointers for each AI tool.
3
+ * Each function returns the file content as a string.
4
+ */
5
+ declare const MARKER = "auto-generated by pb handshake";
6
+ export { MARKER };
7
+ export declare function generateClaudeMd(timestamp: string): string;
8
+ export declare function generateCursorMdc(timestamp: string): string;
9
+ export declare function generateCopilotMd(timestamp: string): string;
10
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/generators/adapters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,QAAA,MAAM,MAAM,mCAAmC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,CAAC;AAElB,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAoC1D;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAgC3D;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwB3D"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Adapter file generators — thin pointers for each AI tool.
3
+ * Each function returns the file content as a string.
4
+ */
5
+ const MARKER = 'auto-generated by pb handshake';
6
+ export { MARKER };
7
+ export function generateClaudeMd(timestamp) {
8
+ return `<!-- ${MARKER} — ${timestamp} -->
9
+ <!-- Re-run \`pb handshake\` to refresh. Do not edit manually. -->
10
+
11
+ # Product Brain Context
12
+
13
+ Read \`.productbrain/context.md\` for full workspace briefing (stage, bets, governance, tensions).
14
+ Read \`.productbrain/briefing.md\` for entries matched to this repo.
15
+
16
+ ## The Chain is the SSOT. Use \`pb\` before everything.
17
+
18
+ | Command | Purpose |
19
+ |---------|---------|
20
+ | \`pb orient -b\` | Current workspace focus |
21
+ | \`pb get <ID>\` | Full entry (BET, DEC, STD, BR, TEN, ARCH) |
22
+ | \`pb context <ID>\` | Constellation context for an entry |
23
+ | \`pb search <query>\` | Find entries across the Chain |
24
+ | \`pb handshake\` | Refresh these context files |
25
+
26
+ **Before implementing any feature, ticket, or fix:** run \`pb get <ID>\` to read the actual spec, exclusions, acceptance criteria, and governance relations. Never assume you know the spec from the conversation alone.
27
+
28
+ ## Session lifecycle — close the loop
29
+
30
+ Start every session with \`pb session start\`. This opens a tracked write session and refreshes context.
31
+
32
+ When you make a decision, discover a tension, or learn something during work:
33
+ \`\`\`
34
+ pb capture "TEN: description of the tension"
35
+ pb capture "DEC: decided X because Y"
36
+ pb capture "INS: learned that X"
37
+ \`\`\`
38
+
39
+ Close with \`pb session close\` — reviews what was captured, refreshes context for the next session.
40
+
41
+ All captures are drafts. The human reviews and commits in Product Brain Studio.
42
+ `;
43
+ }
44
+ export function generateCursorMdc(timestamp) {
45
+ return `---
46
+ description: Product Brain Chain context — workspace knowledge for AI-assisted development
47
+ globs:
48
+ alwaysApply: true
49
+ ---
50
+
51
+ # Product Brain Context
52
+
53
+ Read \`.productbrain/context.md\` for full workspace briefing (stage, bets, governance, tensions).
54
+ Read \`.productbrain/briefing.md\` for entries matched to this repo.
55
+
56
+ ## The Chain is the SSOT. Use \`pb\` before everything.
57
+
58
+ - \`pb orient -b\` — Current workspace focus
59
+ - \`pb get <ID>\` — Full entry (BET, DEC, STD, BR, TEN, ARCH)
60
+ - \`pb context <ID>\` — Constellation context for an entry
61
+ - \`pb search <query>\` — Find entries across the Chain
62
+ - \`pb handshake\` — Refresh these context files
63
+
64
+ Before implementing any feature, ticket, or fix: run \`pb get <ID>\` to read the actual spec, exclusions, acceptance criteria, and governance relations. Never assume you know the spec from the conversation alone.
65
+
66
+ ## Session lifecycle — close the loop
67
+
68
+ Start with \`pb session start\`. When you make a decision, discover a tension, or learn something:
69
+ - \`pb capture "TEN: description"\` — capture a tension
70
+ - \`pb capture "DEC: decided X because Y"\` — capture a decision
71
+ - \`pb capture "INS: learned that X"\` — capture an insight
72
+ Close with \`pb session close\`. All captures are drafts — human reviews and commits.
73
+
74
+ <!-- ${MARKER} — ${timestamp} -->
75
+ `;
76
+ }
77
+ export function generateCopilotMd(timestamp) {
78
+ return `<!-- ${MARKER} — ${timestamp} -->
79
+ <!-- Re-run \`pb handshake\` to refresh. Do not edit manually. -->
80
+
81
+ # Product Brain Context
82
+
83
+ Read \`.productbrain/context.md\` for full workspace briefing (stage, bets, governance, tensions).
84
+ Read \`.productbrain/briefing.md\` for entries matched to this repo.
85
+
86
+ ## The Chain is the SSOT. Use \`pb\` before everything.
87
+
88
+ - \`pb orient -b\` — Current workspace focus
89
+ - \`pb get <ID>\` — Full entry (BET, DEC, STD, BR, TEN, ARCH)
90
+ - \`pb context <ID>\` — Constellation context for an entry
91
+ - \`pb search <query>\` — Find entries across the Chain
92
+ - \`pb handshake\` — Refresh these context files
93
+
94
+ Before implementing any feature, ticket, or fix: run \`pb get <ID>\` to read the actual spec, exclusions, acceptance criteria, and governance relations. Never assume you know the spec from the conversation alone.
95
+
96
+ ## Session lifecycle — close the loop
97
+
98
+ Start with \`pb session start\`. Capture knowledge during work with \`pb capture "text"\`.
99
+ Close with \`pb session close\`. All captures are drafts — human reviews and commits.
100
+ `;
101
+ }
102
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/generators/adapters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,GAAG,gCAAgC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,CAAC;AAElB,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,QAAQ,MAAM,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCrC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BF,MAAM,MAAM,SAAS;CAC3B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO,QAAQ,MAAM,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;CAsBrC,CAAC;AACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Generates .productbrain/briefing.md — entries matched to this specific repo.
3
+ * Pure function: search results + repo context in, markdown string out.
4
+ */
5
+ import type { SearchResult } from '../formatters/search.js';
6
+ import type { RepoContext } from '../lib/repo-detect.js';
7
+ export declare function generateBriefingMd(entries: SearchResult[], repo: RepoContext, searchQueries: string[], timestamp: string): string;
8
+ //# sourceMappingURL=briefing-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing-md.d.ts","sourceRoot":"","sources":["../../src/generators/briefing-md.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,YAAY,EAAE,EACvB,IAAI,EAAE,WAAW,EACjB,aAAa,EAAE,MAAM,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,MAAM,CAiDR"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Generates .productbrain/briefing.md — entries matched to this specific repo.
3
+ * Pure function: search results + repo context in, markdown string out.
4
+ */
5
+ export function generateBriefingMd(entries, repo, searchQueries, timestamp) {
6
+ const lines = [];
7
+ lines.push('<!-- auto-generated by pb handshake — ' + timestamp + ' -->');
8
+ lines.push('<!-- Re-run `pb handshake` to refresh. Do not edit manually. -->');
9
+ lines.push('');
10
+ lines.push(`# Repo Briefing — ${repo.name ?? 'Unknown'}`);
11
+ lines.push('');
12
+ lines.push(`_Generated: ${timestamp}_`);
13
+ if (repo.repoSlug)
14
+ lines.push(`_Repo: ${repo.repoSlug}_`);
15
+ if (repo.detectedStack.length > 0)
16
+ lines.push(`_Stack: ${repo.detectedStack.join(', ')}_`);
17
+ lines.push('');
18
+ if (entries.length === 0) {
19
+ lines.push('No matching Chain entries found for this repository.');
20
+ lines.push('');
21
+ lines.push(`Searched for: ${searchQueries.join(', ')}`);
22
+ lines.push('');
23
+ lines.push('Try `pb search <query>` for manual searches.');
24
+ lines.push('');
25
+ return lines.join('\n');
26
+ }
27
+ lines.push(`**${entries.length}** entries found relevant to this repository.`);
28
+ lines.push('');
29
+ // Group by collection
30
+ const grouped = new Map();
31
+ for (const e of entries) {
32
+ const coll = e.collectionSlug ?? 'other';
33
+ if (!grouped.has(coll))
34
+ grouped.set(coll, []);
35
+ grouped.get(coll).push(e);
36
+ }
37
+ for (const [coll, items] of grouped) {
38
+ lines.push(`## ${coll} (${items.length})`);
39
+ for (const e of items) {
40
+ const id = e.entryId ?? e.name;
41
+ lines.push(`- **${id}** — ${e.name}${e.status ? ` [${e.status}]` : ''}`);
42
+ }
43
+ lines.push('');
44
+ }
45
+ lines.push('---');
46
+ lines.push(`_Searched for: ${searchQueries.join(', ')}_`);
47
+ lines.push('_Run `pb get <ID>` for full details on any entry._');
48
+ lines.push('');
49
+ return lines.join('\n');
50
+ }
51
+ //# sourceMappingURL=briefing-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing-md.js","sourceRoot":"","sources":["../../src/generators/briefing-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Generates .productbrain/context.md — workspace briefing snapshot.
3
+ * Pure function: orient view in, markdown string out.
4
+ */
5
+ import type { OrientViewFromApi } from '../commands/orient.js';
6
+ import type { RepoContext } from '../lib/repo-detect.js';
7
+ export declare function generateContextMd(view: OrientViewFromApi, repo: RepoContext, timestamp: string): string;
8
+ //# sourceMappingURL=context-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-md.d.ts","sourceRoot":"","sources":["../../src/generators/context-md.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWzD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA2GvG"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Generates .productbrain/context.md — workspace briefing snapshot.
3
+ * Pure function: orient view in, markdown string out.
4
+ */
5
+ function entryLine(e, maxPreview = 100) {
6
+ const id = e.entryId ?? e.name;
7
+ if (e.preview) {
8
+ const p = e.preview.length > maxPreview ? e.preview.slice(0, maxPreview) + '...' : e.preview;
9
+ return `- **${id}** — ${p}`;
10
+ }
11
+ return `- **${id}** — ${e.name}`;
12
+ }
13
+ export function generateContextMd(view, repo, timestamp) {
14
+ const lines = [];
15
+ lines.push('<!-- auto-generated by pb handshake — ' + timestamp + ' -->');
16
+ lines.push('<!-- Re-run `pb handshake` to refresh. Do not edit manually. -->');
17
+ lines.push('');
18
+ lines.push('# Product Brain — Workspace Context');
19
+ lines.push('');
20
+ lines.push(`_Generated: ${timestamp}_`);
21
+ if (repo.name)
22
+ lines.push(`_Repo: ${repo.name}${repo.repoSlug ? ` (${repo.repoSlug})` : ''}_`);
23
+ lines.push('');
24
+ // Stage
25
+ lines.push('## Stage');
26
+ lines.push(`**${view.stage}**`);
27
+ lines.push('');
28
+ // Strategic context
29
+ const sc = view.strategicContext;
30
+ lines.push('## Strategic Context');
31
+ if (sc.vision)
32
+ lines.push(`- **Vision**: ${sc.vision}`);
33
+ if (sc.purpose)
34
+ lines.push(`- **Purpose**: ${sc.purpose}`);
35
+ if (sc.currentBet)
36
+ lines.push(`- **Current bet**: ${sc.currentBet}`);
37
+ lines.push(`- **Active bets**: ${sc.activeBetCount}`);
38
+ lines.push(`- **Active tensions**: ${sc.activeTensionCount}`);
39
+ if (sc.productAreas.length > 0)
40
+ lines.push(`- **Product areas**: ${sc.productAreas.join(', ')}`);
41
+ lines.push('');
42
+ // Active bets
43
+ if (view.activeBets.length > 0) {
44
+ lines.push('## Active Bets');
45
+ for (const bet of view.activeBets.slice(0, 10)) {
46
+ lines.push(`- **${bet.entryId ?? bet.name}** — ${bet.name}`);
47
+ if (bet.linkedTensions && bet.linkedTensions.length > 0) {
48
+ for (const t of bet.linkedTensions.slice(0, 3)) {
49
+ lines.push(` - ${t.name}`);
50
+ }
51
+ }
52
+ }
53
+ lines.push('');
54
+ }
55
+ // Governance
56
+ const gov = view.governance;
57
+ if (gov) {
58
+ const hasGov = gov.principles.length > 0 || gov.standards.length > 0 || gov.businessRules.length > 0;
59
+ if (hasGov) {
60
+ lines.push('## Governance');
61
+ if (gov.principles.length > 0) {
62
+ lines.push('### Principles');
63
+ for (const p of gov.principles.slice(0, 5))
64
+ lines.push(entryLine(p));
65
+ }
66
+ if (gov.standards.length > 0) {
67
+ lines.push('### Standards');
68
+ for (const s of gov.standards.slice(0, 5))
69
+ lines.push(entryLine(s));
70
+ }
71
+ if (gov.businessRules.length > 0) {
72
+ lines.push('### Business Rules');
73
+ for (const br of gov.businessRules.slice(0, 5))
74
+ lines.push(entryLine(br));
75
+ }
76
+ lines.push('');
77
+ }
78
+ }
79
+ // Architecture notes
80
+ if (view.architectureNotes && view.architectureNotes.length > 0) {
81
+ lines.push('## Architecture');
82
+ for (const a of view.architectureNotes.slice(0, 5))
83
+ lines.push(entryLine(a));
84
+ lines.push('');
85
+ }
86
+ // Open tensions
87
+ if (view.tensions && view.tensions.length > 0) {
88
+ lines.push('## Open Tensions');
89
+ for (const t of view.tensions.slice(0, 10)) {
90
+ lines.push(`- **${t.entryId ?? t.name}** — ${t.name}`);
91
+ }
92
+ lines.push('');
93
+ }
94
+ // Planned work
95
+ const pw = view.plannedWork;
96
+ if (pw) {
97
+ const hasPlanned = pw.uncommittedDrafts.length > 0 || pw.inProgressEntries.length > 0 || pw.openTensions.length > 0;
98
+ if (hasPlanned) {
99
+ lines.push('## Planned Work');
100
+ if (pw.uncommittedDrafts.length > 0) {
101
+ lines.push('### Drafts');
102
+ for (const d of pw.uncommittedDrafts.slice(0, 5))
103
+ lines.push(`- ${d.name} [${d.collection}]`);
104
+ }
105
+ if (pw.inProgressEntries.length > 0) {
106
+ lines.push('### In Progress');
107
+ for (const e of pw.inProgressEntries.slice(0, 5))
108
+ lines.push(`- ${e.name} [${e.collection}]`);
109
+ }
110
+ if (pw.openTensions.length > 0) {
111
+ lines.push('### Open Tensions');
112
+ for (const t of pw.openTensions.slice(0, 5))
113
+ lines.push(`- ${t.name}`);
114
+ }
115
+ lines.push('');
116
+ }
117
+ }
118
+ lines.push('---');
119
+ lines.push('_This is a snapshot. Run `pb orient` for live data. Run `pb get <ID>` for full entry details._');
120
+ lines.push('');
121
+ return lines.join('\n');
122
+ }
123
+ //# sourceMappingURL=context-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-md.js","sourceRoot":"","sources":["../../src/generators/context-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Portable knowledge — reads canonical skills/rules from .productbrain/
3
+ * and generates tool-specific copies for Cursor, Claude Code, etc.
4
+ */
5
+ export interface CanonicalSkill {
6
+ name: string;
7
+ description: string;
8
+ triggers: string[];
9
+ body: string;
10
+ sourcePath: string;
11
+ targets?: string[];
12
+ level?: string;
13
+ }
14
+ export interface CanonicalRule {
15
+ name: string;
16
+ description: string;
17
+ scope?: string;
18
+ autoApply: boolean;
19
+ body: string;
20
+ sourcePath: string;
21
+ targets?: string[];
22
+ level?: string;
23
+ }
24
+ export type TargetName = 'cursor' | 'claude' | 'copilot';
25
+ /** Returns true if the entry should be emitted to the given target. */
26
+ export declare function shouldEmitToTarget(entry: CanonicalRule | CanonicalSkill, target: TargetName): boolean;
27
+ export type HandshakeLevel = 'beginner' | 'intermediate' | 'expert';
28
+ /**
29
+ * Filter items by graduated level.
30
+ * - If requestedLevel is undefined/null: return ALL items (backward compat).
31
+ * - Items with no `level` field: always included (backward compat).
32
+ * - Otherwise: include items whose level is within the hierarchy for requestedLevel.
33
+ */
34
+ export declare function filterByLevel<T extends {
35
+ level?: string;
36
+ }>(items: T[], requestedLevel?: string): T[];
37
+ export declare function readCanonicalSkills(productbrainDir: string): CanonicalSkill[];
38
+ export declare function readCanonicalRules(productbrainDir: string): CanonicalRule[];
39
+ /**
40
+ * Strip transport-conditional sections from a skill body.
41
+ *
42
+ * Sections are delimited by HTML comments:
43
+ * <!-- transport:TARGET_NAME -->
44
+ * ...content...
45
+ * <!-- /transport -->
46
+ *
47
+ * - Blocks matching the current target: keep the content, remove the delimiter comments.
48
+ * - Blocks for OTHER targets: remove entirely (delimiters + content).
49
+ * - Content outside any transport block: keep as-is (universal content).
50
+ */
51
+ export declare function stripTransportSections(body: string, target: TargetName): string;
52
+ /**
53
+ * Generate a Cursor SKILL.md from a canonical skill.
54
+ * Cursor expects: name, description (with triggers embedded).
55
+ */
56
+ export declare function generateCursorSkill(skill: CanonicalSkill): string;
57
+ /**
58
+ * Generate a Cursor .mdc rule from a canonical rule.
59
+ * Cursor expects: description, globs, alwaysApply.
60
+ */
61
+ export declare function generateCursorRule(rule: CanonicalRule): string;
62
+ /**
63
+ * Generate a Claude Code .md rule from a canonical rule.
64
+ * Claude Code expects: description, optional paths (array).
65
+ */
66
+ export declare function generateClaudeRule(rule: CanonicalRule): string;
67
+ /**
68
+ * Generate a Claude Code skill-router.md — imperative skill activation rule.
69
+ * Loaded automatically by Claude Code via .claude/rules/ with no paths (always active).
70
+ */
71
+ export declare function generateClaudeSkillRouter(skills: CanonicalSkill[]): string;
72
+ //# sourceMappingURL=portable-knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-knowledge.d.ts","sourceRoot":"","sources":["../../src/generators/portable-knowledge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzD,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAGrG;AAID,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,cAAc,GAAG,QAAQ,CAAC;AAUpE;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CASpG;AAkED,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE,CAsB7E;AAED,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,aAAa,EAAE,CAuB3E;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAa/E;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAyBjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAc9D;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAqB9D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CA4B1E"}