@productbrain/cli 0.1.0-beta.7 → 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.
- package/README.md +84 -1
- package/dist/__tests__/capture.test.d.ts +2 -0
- package/dist/__tests__/capture.test.d.ts.map +1 -0
- package/dist/__tests__/capture.test.js +86 -0
- package/dist/__tests__/capture.test.js.map +1 -0
- package/dist/__tests__/constellation.test.d.ts +2 -0
- package/dist/__tests__/constellation.test.d.ts.map +1 -0
- package/dist/__tests__/constellation.test.js +260 -0
- package/dist/__tests__/constellation.test.js.map +1 -0
- package/dist/__tests__/fields.test.d.ts +2 -0
- package/dist/__tests__/fields.test.d.ts.map +1 -0
- package/dist/__tests__/fields.test.js +238 -0
- package/dist/__tests__/fields.test.js.map +1 -0
- package/dist/__tests__/handshake.test.d.ts +2 -0
- package/dist/__tests__/handshake.test.d.ts.map +1 -0
- package/dist/__tests__/handshake.test.js +187 -0
- package/dist/__tests__/handshake.test.js.map +1 -0
- package/dist/__tests__/relate.test.d.ts +2 -0
- package/dist/__tests__/relate.test.d.ts.map +1 -0
- package/dist/__tests__/relate.test.js +79 -0
- package/dist/__tests__/relate.test.js.map +1 -0
- package/dist/__tests__/repo-detect.test.d.ts +2 -0
- package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
- package/dist/__tests__/repo-detect.test.js +119 -0
- package/dist/__tests__/repo-detect.test.js.map +1 -0
- package/dist/__tests__/runner.test.d.ts +2 -0
- package/dist/__tests__/runner.test.d.ts.map +1 -0
- package/dist/__tests__/runner.test.js +215 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/__tests__/session-touch.test.d.ts +2 -0
- package/dist/__tests__/session-touch.test.d.ts.map +1 -0
- package/dist/__tests__/session-touch.test.js +134 -0
- package/dist/__tests__/session-touch.test.js.map +1 -0
- package/dist/__tests__/session.test.d.ts +2 -0
- package/dist/__tests__/session.test.d.ts.map +1 -0
- package/dist/__tests__/session.test.js +52 -0
- package/dist/__tests__/session.test.js.map +1 -0
- package/dist/__tests__/strip.test.d.ts +2 -0
- package/dist/__tests__/strip.test.d.ts.map +1 -0
- package/dist/__tests__/strip.test.js +136 -0
- package/dist/__tests__/strip.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +148 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/commands/capture.d.ts +21 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +100 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/constellation.d.ts +11 -0
- package/dist/commands/constellation.d.ts.map +1 -0
- package/dist/commands/constellation.js +28 -0
- package/dist/commands/constellation.js.map +1 -0
- package/dist/commands/context.d.ts +2 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +15 -9
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/fields.d.ts +9 -0
- package/dist/commands/fields.d.ts.map +1 -0
- package/dist/commands/fields.js +26 -0
- package/dist/commands/fields.js.map +1 -0
- package/dist/commands/get.d.ts +8 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +51 -6
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/handshake.d.ts +18 -0
- package/dist/commands/handshake.d.ts.map +1 -0
- package/dist/commands/handshake.js +378 -0
- package/dist/commands/handshake.js.map +1 -0
- package/dist/commands/ingest.d.ts +1 -0
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +25 -8
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/orient.d.ts +1 -0
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +13 -8
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/relate.d.ts +15 -0
- package/dist/commands/relate.d.ts.map +1 -0
- package/dist/commands/relate.js +72 -0
- package/dist/commands/relate.js.map +1 -0
- package/dist/commands/search.d.ts +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +5 -3
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts +20 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +134 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/update.d.ts +16 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +89 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/formatters/capture.d.ts +30 -0
- package/dist/formatters/capture.d.ts.map +1 -0
- package/dist/formatters/capture.js +58 -0
- package/dist/formatters/capture.js.map +1 -0
- package/dist/formatters/constellation.d.ts +34 -0
- package/dist/formatters/constellation.d.ts.map +1 -0
- package/dist/formatters/constellation.js +38 -0
- package/dist/formatters/constellation.js.map +1 -0
- package/dist/formatters/fields.d.ts +32 -0
- package/dist/formatters/fields.d.ts.map +1 -0
- package/dist/formatters/fields.js +49 -0
- package/dist/formatters/fields.js.map +1 -0
- package/dist/formatters/handshake.d.ts +17 -0
- package/dist/formatters/handshake.d.ts.map +1 -0
- package/dist/formatters/handshake.js +51 -0
- package/dist/formatters/handshake.js.map +1 -0
- package/dist/formatters/relate.d.ts +11 -0
- package/dist/formatters/relate.d.ts.map +1 -0
- package/dist/formatters/relate.js +10 -0
- package/dist/formatters/relate.js.map +1 -0
- package/dist/formatters/session.d.ts +11 -0
- package/dist/formatters/session.d.ts.map +1 -0
- package/dist/formatters/session.js +51 -0
- package/dist/formatters/session.js.map +1 -0
- package/dist/formatters/update.d.ts +17 -0
- package/dist/formatters/update.d.ts.map +1 -0
- package/dist/formatters/update.js +43 -0
- package/dist/formatters/update.js.map +1 -0
- package/dist/generators/adapters.d.ts +10 -0
- package/dist/generators/adapters.d.ts.map +1 -0
- package/dist/generators/adapters.js +102 -0
- package/dist/generators/adapters.js.map +1 -0
- package/dist/generators/briefing-md.d.ts +8 -0
- package/dist/generators/briefing-md.d.ts.map +1 -0
- package/dist/generators/briefing-md.js +51 -0
- package/dist/generators/briefing-md.js.map +1 -0
- package/dist/generators/context-md.d.ts +8 -0
- package/dist/generators/context-md.d.ts.map +1 -0
- package/dist/generators/context-md.js +123 -0
- package/dist/generators/context-md.js.map +1 -0
- package/dist/generators/portable-knowledge.d.ts +72 -0
- package/dist/generators/portable-knowledge.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.js +246 -0
- package/dist/generators/portable-knowledge.js.map +1 -0
- package/dist/generators/portable-knowledge.test.d.ts +2 -0
- package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.test.js +399 -0
- package/dist/generators/portable-knowledge.test.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +231 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +19 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +102 -8
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/repo-detect.d.ts +14 -0
- package/dist/lib/repo-detect.d.ts.map +1 -0
- package/dist/lib/repo-detect.js +58 -0
- package/dist/lib/repo-detect.js.map +1 -0
- package/dist/lib/runner.d.ts +31 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +65 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/session.d.ts +17 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +43 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/strip.d.ts +11 -0
- package/dist/lib/strip.d.ts.map +1 -0
- package/dist/lib/strip.js +26 -0
- package/dist/lib/strip.js.map +1 -0
- 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"}
|