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

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 (166) hide show
  1. package/README.md +84 -1
  2. package/dist/__tests__/capture.test.d.ts +2 -0
  3. package/dist/__tests__/capture.test.d.ts.map +1 -0
  4. package/dist/__tests__/capture.test.js +86 -0
  5. package/dist/__tests__/capture.test.js.map +1 -0
  6. package/dist/__tests__/constellation.test.d.ts +2 -0
  7. package/dist/__tests__/constellation.test.d.ts.map +1 -0
  8. package/dist/__tests__/constellation.test.js +260 -0
  9. package/dist/__tests__/constellation.test.js.map +1 -0
  10. package/dist/__tests__/fields.test.d.ts +2 -0
  11. package/dist/__tests__/fields.test.d.ts.map +1 -0
  12. package/dist/__tests__/fields.test.js +238 -0
  13. package/dist/__tests__/fields.test.js.map +1 -0
  14. package/dist/__tests__/handshake.test.d.ts +2 -0
  15. package/dist/__tests__/handshake.test.d.ts.map +1 -0
  16. package/dist/__tests__/handshake.test.js +187 -0
  17. package/dist/__tests__/handshake.test.js.map +1 -0
  18. package/dist/__tests__/relate.test.d.ts +2 -0
  19. package/dist/__tests__/relate.test.d.ts.map +1 -0
  20. package/dist/__tests__/relate.test.js +79 -0
  21. package/dist/__tests__/relate.test.js.map +1 -0
  22. package/dist/__tests__/repo-detect.test.d.ts +2 -0
  23. package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
  24. package/dist/__tests__/repo-detect.test.js +119 -0
  25. package/dist/__tests__/repo-detect.test.js.map +1 -0
  26. package/dist/__tests__/runner.test.d.ts +2 -0
  27. package/dist/__tests__/runner.test.d.ts.map +1 -0
  28. package/dist/__tests__/runner.test.js +215 -0
  29. package/dist/__tests__/runner.test.js.map +1 -0
  30. package/dist/__tests__/session-touch.test.d.ts +2 -0
  31. package/dist/__tests__/session-touch.test.d.ts.map +1 -0
  32. package/dist/__tests__/session-touch.test.js +134 -0
  33. package/dist/__tests__/session-touch.test.js.map +1 -0
  34. package/dist/__tests__/session.test.d.ts +2 -0
  35. package/dist/__tests__/session.test.d.ts.map +1 -0
  36. package/dist/__tests__/session.test.js +52 -0
  37. package/dist/__tests__/session.test.js.map +1 -0
  38. package/dist/__tests__/strip.test.d.ts +2 -0
  39. package/dist/__tests__/strip.test.d.ts.map +1 -0
  40. package/dist/__tests__/strip.test.js +136 -0
  41. package/dist/__tests__/strip.test.js.map +1 -0
  42. package/dist/__tests__/update.test.d.ts +2 -0
  43. package/dist/__tests__/update.test.d.ts.map +1 -0
  44. package/dist/__tests__/update.test.js +148 -0
  45. package/dist/__tests__/update.test.js.map +1 -0
  46. package/dist/commands/capture.d.ts +21 -0
  47. package/dist/commands/capture.d.ts.map +1 -0
  48. package/dist/commands/capture.js +100 -0
  49. package/dist/commands/capture.js.map +1 -0
  50. package/dist/commands/constellation.d.ts +11 -0
  51. package/dist/commands/constellation.d.ts.map +1 -0
  52. package/dist/commands/constellation.js +28 -0
  53. package/dist/commands/constellation.js.map +1 -0
  54. package/dist/commands/context.d.ts +2 -1
  55. package/dist/commands/context.d.ts.map +1 -1
  56. package/dist/commands/context.js +15 -9
  57. package/dist/commands/context.js.map +1 -1
  58. package/dist/commands/fields.d.ts +9 -0
  59. package/dist/commands/fields.d.ts.map +1 -0
  60. package/dist/commands/fields.js +26 -0
  61. package/dist/commands/fields.js.map +1 -0
  62. package/dist/commands/get.d.ts +8 -1
  63. package/dist/commands/get.d.ts.map +1 -1
  64. package/dist/commands/get.js +51 -6
  65. package/dist/commands/get.js.map +1 -1
  66. package/dist/commands/handshake.d.ts +18 -0
  67. package/dist/commands/handshake.d.ts.map +1 -0
  68. package/dist/commands/handshake.js +378 -0
  69. package/dist/commands/handshake.js.map +1 -0
  70. package/dist/commands/ingest.d.ts +1 -0
  71. package/dist/commands/ingest.d.ts.map +1 -1
  72. package/dist/commands/ingest.js +25 -8
  73. package/dist/commands/ingest.js.map +1 -1
  74. package/dist/commands/orient.d.ts +1 -0
  75. package/dist/commands/orient.d.ts.map +1 -1
  76. package/dist/commands/orient.js +13 -8
  77. package/dist/commands/orient.js.map +1 -1
  78. package/dist/commands/relate.d.ts +15 -0
  79. package/dist/commands/relate.d.ts.map +1 -0
  80. package/dist/commands/relate.js +72 -0
  81. package/dist/commands/relate.js.map +1 -0
  82. package/dist/commands/search.d.ts +1 -0
  83. package/dist/commands/search.d.ts.map +1 -1
  84. package/dist/commands/search.js +5 -3
  85. package/dist/commands/search.js.map +1 -1
  86. package/dist/commands/session.d.ts +20 -0
  87. package/dist/commands/session.d.ts.map +1 -0
  88. package/dist/commands/session.js +134 -0
  89. package/dist/commands/session.js.map +1 -0
  90. package/dist/commands/update.d.ts +16 -0
  91. package/dist/commands/update.d.ts.map +1 -0
  92. package/dist/commands/update.js +89 -0
  93. package/dist/commands/update.js.map +1 -0
  94. package/dist/formatters/capture.d.ts +30 -0
  95. package/dist/formatters/capture.d.ts.map +1 -0
  96. package/dist/formatters/capture.js +58 -0
  97. package/dist/formatters/capture.js.map +1 -0
  98. package/dist/formatters/constellation.d.ts +34 -0
  99. package/dist/formatters/constellation.d.ts.map +1 -0
  100. package/dist/formatters/constellation.js +38 -0
  101. package/dist/formatters/constellation.js.map +1 -0
  102. package/dist/formatters/fields.d.ts +32 -0
  103. package/dist/formatters/fields.d.ts.map +1 -0
  104. package/dist/formatters/fields.js +49 -0
  105. package/dist/formatters/fields.js.map +1 -0
  106. package/dist/formatters/handshake.d.ts +17 -0
  107. package/dist/formatters/handshake.d.ts.map +1 -0
  108. package/dist/formatters/handshake.js +51 -0
  109. package/dist/formatters/handshake.js.map +1 -0
  110. package/dist/formatters/relate.d.ts +11 -0
  111. package/dist/formatters/relate.d.ts.map +1 -0
  112. package/dist/formatters/relate.js +10 -0
  113. package/dist/formatters/relate.js.map +1 -0
  114. package/dist/formatters/session.d.ts +11 -0
  115. package/dist/formatters/session.d.ts.map +1 -0
  116. package/dist/formatters/session.js +51 -0
  117. package/dist/formatters/session.js.map +1 -0
  118. package/dist/formatters/update.d.ts +17 -0
  119. package/dist/formatters/update.d.ts.map +1 -0
  120. package/dist/formatters/update.js +43 -0
  121. package/dist/formatters/update.js.map +1 -0
  122. package/dist/generators/adapters.d.ts +10 -0
  123. package/dist/generators/adapters.d.ts.map +1 -0
  124. package/dist/generators/adapters.js +102 -0
  125. package/dist/generators/adapters.js.map +1 -0
  126. package/dist/generators/briefing-md.d.ts +8 -0
  127. package/dist/generators/briefing-md.d.ts.map +1 -0
  128. package/dist/generators/briefing-md.js +51 -0
  129. package/dist/generators/briefing-md.js.map +1 -0
  130. package/dist/generators/context-md.d.ts +8 -0
  131. package/dist/generators/context-md.d.ts.map +1 -0
  132. package/dist/generators/context-md.js +123 -0
  133. package/dist/generators/context-md.js.map +1 -0
  134. package/dist/generators/portable-knowledge.d.ts +72 -0
  135. package/dist/generators/portable-knowledge.d.ts.map +1 -0
  136. package/dist/generators/portable-knowledge.js +246 -0
  137. package/dist/generators/portable-knowledge.js.map +1 -0
  138. package/dist/generators/portable-knowledge.test.d.ts +2 -0
  139. package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
  140. package/dist/generators/portable-knowledge.test.js +399 -0
  141. package/dist/generators/portable-knowledge.test.js.map +1 -0
  142. package/dist/index.d.ts +3 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +231 -6
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/client.d.ts +19 -0
  147. package/dist/lib/client.d.ts.map +1 -1
  148. package/dist/lib/client.js +102 -8
  149. package/dist/lib/client.js.map +1 -1
  150. package/dist/lib/repo-detect.d.ts +14 -0
  151. package/dist/lib/repo-detect.d.ts.map +1 -0
  152. package/dist/lib/repo-detect.js +58 -0
  153. package/dist/lib/repo-detect.js.map +1 -0
  154. package/dist/lib/runner.d.ts +31 -0
  155. package/dist/lib/runner.d.ts.map +1 -0
  156. package/dist/lib/runner.js +65 -0
  157. package/dist/lib/runner.js.map +1 -0
  158. package/dist/lib/session.d.ts +17 -0
  159. package/dist/lib/session.d.ts.map +1 -0
  160. package/dist/lib/session.js +43 -0
  161. package/dist/lib/session.js.map +1 -0
  162. package/dist/lib/strip.d.ts +11 -0
  163. package/dist/lib/strip.d.ts.map +1 -0
  164. package/dist/lib/strip.js +26 -0
  165. package/dist/lib/strip.js.map +1 -0
  166. package/package.json +6 -3
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Constellation formatter — grouped relation view for pb constellation <entry-id>.
3
+ * BET-181 Slice 3: human-readable grouped view for TTY; JSON handled by runner.
4
+ *
5
+ * Chain: STD-65 (structured, parseable, minimal), DEC-299 (agent-native output)
6
+ *
7
+ * Relation types are derived from the server response — never hardcoded here.
8
+ * The formatter renders whatever relation types the query returns.
9
+ */
10
+ /** Format constellation for terminal (readable grouped output). */
11
+ export function formatConstellation(result) {
12
+ const lines = [];
13
+ const { entry, relations, summary } = result;
14
+ const id = entry.entryId ?? entry.name;
15
+ lines.push(`${id} [${entry.collectionSlug}] — ${entry.name}`);
16
+ lines.push(`Status: ${entry.status}`);
17
+ if (summary.totalRelations === 0) {
18
+ lines.push('');
19
+ lines.push('No relations.');
20
+ return lines.join('\n');
21
+ }
22
+ lines.push(`${summary.totalRelations} relation(s) across ${summary.relationTypes.length} type(s)`);
23
+ lines.push('');
24
+ for (const relType of summary.relationTypes) {
25
+ const entries = relations[relType];
26
+ if (!entries || entries.length === 0)
27
+ continue;
28
+ lines.push(`${relType} (${entries.length})`);
29
+ for (const e of entries) {
30
+ const arrow = e.direction === 'outgoing' ? '→' : '←';
31
+ const eid = e.entryId ? `${e.entryId}: ` : '';
32
+ lines.push(` ${arrow} ${eid}${e.name} [${e.collectionSlug}]`);
33
+ }
34
+ lines.push('');
35
+ }
36
+ return lines.join('\n').trimEnd();
37
+ }
38
+ //# sourceMappingURL=constellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constellation.js","sourceRoot":"","sources":["../../src/formatters/constellation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0BH,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE7C,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,cAAc,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtC,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,uBAAuB,OAAO,CAAC,aAAa,CAAC,MAAM,UAAU,CAAC,CAAC;IACnG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE/C,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACrD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Fields formatter — human-readable table of collection field definitions.
3
+ * BET-181 Slice 2: Schema discovery for CLI agents (pb fields <collection>).
4
+ * Chain: DEC-186 (CLI uses Convex view model with CLI-native formatting)
5
+ */
6
+ export interface CollectionField {
7
+ key: string;
8
+ label: string;
9
+ type: string;
10
+ required?: boolean;
11
+ options?: string[];
12
+ deprecated?: boolean;
13
+ deprecatedOptions?: string[];
14
+ relatesTo?: string;
15
+ searchable?: boolean;
16
+ displayHint?: string;
17
+ zone?: string;
18
+ colorMap?: unknown;
19
+ accentSource?: boolean;
20
+ iconMap?: Record<string, string>;
21
+ helpText?: string;
22
+ optionDescriptions?: unknown;
23
+ semanticRole?: string;
24
+ }
25
+ export interface CollectionFieldsResult {
26
+ slug: string;
27
+ name: string;
28
+ fields: CollectionField[];
29
+ }
30
+ /** Format collection fields as a human-readable table for TTY output. */
31
+ export declare function formatFields(result: CollectionFieldsResult): string;
32
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/formatters/fields.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAsDnE"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Fields formatter — human-readable table of collection field definitions.
3
+ * BET-181 Slice 2: Schema discovery for CLI agents (pb fields <collection>).
4
+ * Chain: DEC-186 (CLI uses Convex view model with CLI-native formatting)
5
+ */
6
+ /** Format collection fields as a human-readable table for TTY output. */
7
+ export function formatFields(result) {
8
+ const lines = [];
9
+ lines.push(`Collection: ${result.name} (${result.slug})`);
10
+ lines.push('');
11
+ if (!result.fields || result.fields.length === 0) {
12
+ lines.push('No fields defined.');
13
+ return lines.join('\n');
14
+ }
15
+ lines.push(`Fields (${result.fields.length}):`);
16
+ lines.push('');
17
+ for (const field of result.fields) {
18
+ const requiredMark = field.required ? ' *' : '';
19
+ const deprecatedMark = field.deprecated ? ' [deprecated]' : '';
20
+ lines.push(` ${field.key}${requiredMark}${deprecatedMark}`);
21
+ lines.push(` label: ${field.label}`);
22
+ lines.push(` type: ${field.type}`);
23
+ if (field.options && field.options.length > 0) {
24
+ lines.push(` options: ${field.options.join(', ')}`);
25
+ }
26
+ if (field.helpText) {
27
+ lines.push(` help: ${field.helpText}`);
28
+ }
29
+ if (field.displayHint) {
30
+ lines.push(` display: ${field.displayHint}`);
31
+ }
32
+ if (field.zone) {
33
+ lines.push(` zone: ${field.zone}`);
34
+ }
35
+ if (field.semanticRole) {
36
+ lines.push(` role: ${field.semanticRole}`);
37
+ }
38
+ if (field.searchable) {
39
+ lines.push(` searchable: true`);
40
+ }
41
+ lines.push('');
42
+ }
43
+ // Remove trailing empty line
44
+ while (lines.length > 0 && lines[lines.length - 1] === '') {
45
+ lines.pop();
46
+ }
47
+ return lines.join('\n');
48
+ }
49
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/formatters/fields.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH,yEAAyE;AACzE,MAAM,UAAU,YAAY,CAAC,MAA8B;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,GAAG,YAAY,GAAG,cAAc,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAEzC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,6BAA6B;IAC7B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC1D,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Handshake formatter — console report after file generation.
3
+ */
4
+ import type { SearchResult } from './search.js';
5
+ import type { RepoContext } from '../lib/repo-detect.js';
6
+ export interface HandshakeReport {
7
+ filesWritten: string[];
8
+ filesSkipped: Array<{
9
+ path: string;
10
+ reason: string;
11
+ }>;
12
+ matchedEntries: SearchResult[];
13
+ searchQueries: string[];
14
+ repo: RepoContext;
15
+ }
16
+ export declare function formatHandshakeReport(report: HandshakeReport): string;
17
+ //# sourceMappingURL=handshake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../src/formatters/handshake.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAqDrE"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Handshake formatter — console report after file generation.
3
+ */
4
+ export function formatHandshakeReport(report) {
5
+ const lines = [];
6
+ lines.push('pb handshake — context files generated');
7
+ lines.push('');
8
+ // Repo info
9
+ const name = report.repo.name ?? 'unknown';
10
+ const slug = report.repo.repoSlug ? ` (${report.repo.repoSlug})` : '';
11
+ lines.push(`Repo: ${name}${slug}`);
12
+ if (report.repo.detectedStack.length > 0) {
13
+ lines.push(`Stack: ${report.repo.detectedStack.join(', ')}`);
14
+ }
15
+ lines.push('');
16
+ // Written files
17
+ if (report.filesWritten.length > 0) {
18
+ lines.push('Written:');
19
+ for (const f of report.filesWritten) {
20
+ lines.push(` ${f}`);
21
+ }
22
+ lines.push('');
23
+ }
24
+ // Skipped files
25
+ if (report.filesSkipped.length > 0) {
26
+ lines.push('Skipped:');
27
+ for (const f of report.filesSkipped) {
28
+ lines.push(` ${f.path} — ${f.reason}`);
29
+ }
30
+ lines.push('');
31
+ }
32
+ // Matched entries
33
+ if (report.matchedEntries.length > 0) {
34
+ lines.push(`Matched ${report.matchedEntries.length} Chain entries:`);
35
+ for (const e of report.matchedEntries.slice(0, 20)) {
36
+ const id = e.entryId ?? e.name;
37
+ const coll = e.collectionSlug ?? '—';
38
+ lines.push(` ${id} [${coll}] ${e.name}`);
39
+ }
40
+ if (report.matchedEntries.length > 20) {
41
+ lines.push(` ... and ${report.matchedEntries.length - 20} more`);
42
+ }
43
+ lines.push('');
44
+ }
45
+ lines.push('Tip: Add .productbrain/ to .gitignore (contains workspace-specific context).');
46
+ lines.push(' Adapter files (CLAUDE.md, .cursor/rules/, .claude/rules/, .github/) are safe to commit.');
47
+ lines.push('');
48
+ lines.push('Run `pb handshake` again to refresh.');
49
+ return lines.join('\n');
50
+ }
51
+ //# sourceMappingURL=handshake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../src/formatters/handshake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Relate / unrelate receipt formatters — terminal output for pb relate / pb unrelate.
3
+ */
4
+ export interface RelateReceiptData {
5
+ fromId: string;
6
+ type: string;
7
+ toId: string;
8
+ }
9
+ export declare function formatRelateReceipt(data: RelateReceiptData): string;
10
+ export declare function formatUnrelateReceipt(data: RelateReceiptData): string;
11
+ //# sourceMappingURL=relate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relate.d.ts","sourceRoot":"","sources":["../../src/formatters/relate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAEnE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAErE"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Relate / unrelate receipt formatters — terminal output for pb relate / pb unrelate.
3
+ */
4
+ export function formatRelateReceipt(data) {
5
+ return `→ ${data.fromId} –[${data.type}]→ ${data.toId}`;
6
+ }
7
+ export function formatUnrelateReceipt(data) {
8
+ return `✗ Removed ${data.fromId} –[${data.type}]→ ${data.toId}`;
9
+ }
10
+ //# sourceMappingURL=relate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relate.js","sourceRoot":"","sources":["../../src/formatters/relate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IACzD,OAAO,KAAK,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IAC3D,OAAO,aAAa,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Session formatters — terminal output for session start / close.
3
+ */
4
+ import type { SessionState } from '../lib/session.js';
5
+ export declare function formatSessionStart(session: SessionState, superseded?: {
6
+ previousSessionId: string;
7
+ startedAt: string;
8
+ initiatedBy: string;
9
+ }): string;
10
+ export declare function formatSessionClose(session: SessionState): string;
11
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/formatters/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,YAAY,EACrB,UAAU,CAAC,EAAE;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACjF,MAAM,CAmBR;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAqBhE"}
@@ -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,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"}