@productbrain/cli 0.1.0-beta.29 → 0.1.0-beta.32

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 (106) hide show
  1. package/README.md +62 -178
  2. package/dist/__tests__/constants.test.d.ts +2 -0
  3. package/dist/__tests__/constants.test.d.ts.map +1 -0
  4. package/dist/__tests__/constants.test.js +94 -0
  5. package/dist/__tests__/constants.test.js.map +1 -0
  6. package/dist/__tests__/errors.test.d.ts +2 -0
  7. package/dist/__tests__/errors.test.d.ts.map +1 -0
  8. package/dist/__tests__/errors.test.js +117 -0
  9. package/dist/__tests__/errors.test.js.map +1 -0
  10. package/dist/__tests__/glossary.test.d.ts +2 -0
  11. package/dist/__tests__/glossary.test.d.ts.map +1 -0
  12. package/dist/__tests__/glossary.test.js +32 -0
  13. package/dist/__tests__/glossary.test.js.map +1 -0
  14. package/dist/__tests__/login.test.d.ts +2 -0
  15. package/dist/__tests__/login.test.d.ts.map +1 -0
  16. package/dist/__tests__/login.test.js +168 -0
  17. package/dist/__tests__/login.test.js.map +1 -0
  18. package/dist/__tests__/profiles.test.d.ts +2 -0
  19. package/dist/__tests__/profiles.test.d.ts.map +1 -0
  20. package/dist/__tests__/profiles.test.js +168 -0
  21. package/dist/__tests__/profiles.test.js.map +1 -0
  22. package/dist/__tests__/setup.test.d.ts +2 -0
  23. package/dist/__tests__/setup.test.d.ts.map +1 -0
  24. package/dist/__tests__/setup.test.js +170 -0
  25. package/dist/__tests__/setup.test.js.map +1 -0
  26. package/dist/commands/capture.d.ts.map +1 -1
  27. package/dist/commands/capture.js +23 -2
  28. package/dist/commands/capture.js.map +1 -1
  29. package/dist/commands/doctor.d.ts +18 -0
  30. package/dist/commands/doctor.d.ts.map +1 -0
  31. package/dist/commands/doctor.js +211 -0
  32. package/dist/commands/doctor.js.map +1 -0
  33. package/dist/commands/doctor.test.d.ts +7 -0
  34. package/dist/commands/doctor.test.d.ts.map +1 -0
  35. package/dist/commands/doctor.test.js +265 -0
  36. package/dist/commands/doctor.test.js.map +1 -0
  37. package/dist/commands/login.d.ts +4 -0
  38. package/dist/commands/login.d.ts.map +1 -1
  39. package/dist/commands/login.js +53 -27
  40. package/dist/commands/login.js.map +1 -1
  41. package/dist/commands/profile.d.ts +24 -0
  42. package/dist/commands/profile.d.ts.map +1 -0
  43. package/dist/commands/profile.js +82 -0
  44. package/dist/commands/profile.js.map +1 -0
  45. package/dist/commands/promote.d.ts.map +1 -1
  46. package/dist/commands/promote.js +3 -2
  47. package/dist/commands/promote.js.map +1 -1
  48. package/dist/commands/setup.d.ts +16 -0
  49. package/dist/commands/setup.d.ts.map +1 -0
  50. package/dist/commands/setup.js +213 -0
  51. package/dist/commands/setup.js.map +1 -0
  52. package/dist/formatters/promote.d.ts +1 -0
  53. package/dist/formatters/promote.d.ts.map +1 -1
  54. package/dist/formatters/promote.js +1 -0
  55. package/dist/formatters/promote.js.map +1 -1
  56. package/dist/index.js +251 -284
  57. package/dist/index.js.map +1 -1
  58. package/dist/lib/activation.d.ts +28 -0
  59. package/dist/lib/activation.d.ts.map +1 -0
  60. package/dist/lib/activation.js +57 -0
  61. package/dist/lib/activation.js.map +1 -0
  62. package/dist/lib/activation.test.d.ts +6 -0
  63. package/dist/lib/activation.test.d.ts.map +1 -0
  64. package/dist/lib/activation.test.js +121 -0
  65. package/dist/lib/activation.test.js.map +1 -0
  66. package/dist/lib/client.d.ts +19 -2
  67. package/dist/lib/client.d.ts.map +1 -1
  68. package/dist/lib/client.js +71 -11
  69. package/dist/lib/client.js.map +1 -1
  70. package/dist/lib/config.d.ts +9 -3
  71. package/dist/lib/config.d.ts.map +1 -1
  72. package/dist/lib/config.js +54 -15
  73. package/dist/lib/config.js.map +1 -1
  74. package/dist/lib/constants.d.ts +21 -0
  75. package/dist/lib/constants.d.ts.map +1 -0
  76. package/dist/lib/constants.js +39 -0
  77. package/dist/lib/constants.js.map +1 -0
  78. package/dist/lib/errors.d.ts +57 -0
  79. package/dist/lib/errors.d.ts.map +1 -0
  80. package/dist/lib/errors.js +65 -0
  81. package/dist/lib/errors.js.map +1 -0
  82. package/dist/lib/glossary.d.ts +19 -0
  83. package/dist/lib/glossary.d.ts.map +1 -0
  84. package/dist/lib/glossary.js +53 -0
  85. package/dist/lib/glossary.js.map +1 -0
  86. package/dist/lib/profiles.d.ts +34 -0
  87. package/dist/lib/profiles.d.ts.map +1 -0
  88. package/dist/lib/profiles.js +173 -0
  89. package/dist/lib/profiles.js.map +1 -0
  90. package/dist/lib/runner.d.ts +2 -0
  91. package/dist/lib/runner.d.ts.map +1 -1
  92. package/dist/lib/runner.js +33 -4
  93. package/dist/lib/runner.js.map +1 -1
  94. package/dist/lib/style.d.ts +65 -0
  95. package/dist/lib/style.d.ts.map +1 -0
  96. package/dist/lib/style.js +108 -0
  97. package/dist/lib/style.js.map +1 -0
  98. package/dist/lib/style.test.d.ts +7 -0
  99. package/dist/lib/style.test.d.ts.map +1 -0
  100. package/dist/lib/style.test.js +195 -0
  101. package/dist/lib/style.test.js.map +1 -0
  102. package/dist/lib/telemetry.d.ts +15 -0
  103. package/dist/lib/telemetry.d.ts.map +1 -0
  104. package/dist/lib/telemetry.js +29 -0
  105. package/dist/lib/telemetry.js.map +1 -0
  106. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/lib/profiles.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,8 @@ export declare function setOutputMode(mode: 'auto' | 'json' | 'pretty'): void;
14
14
  export declare function getOutputMode(): 'auto' | 'json' | 'pretty';
15
15
  /** Returns true if the current output mode resolves to JSON. */
16
16
  export declare function isJsonMode(): boolean;
17
+ export declare function setQuietMode(quiet: boolean): void;
18
+ export declare function isQuietMode(): boolean;
17
19
  export interface RunCliCommandOptions<T> {
18
20
  /** The async function that performs the MCP call and returns data. */
19
21
  fn: () => Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEpE;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ,CAE1D;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,sEAAsE;IACtE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtF"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEpE;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ,CAE1D;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AASD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,OAAO,CAIrC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,sEAAsE;IACtE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCtF"}
@@ -11,6 +11,7 @@
11
11
  * Chain: DEC-299 (JSON-default), STD-65 (agent responses: structured, parseable, minimal)
12
12
  */
13
13
  import { stripConvexInternals } from './strip.js';
14
+ import { CLIError } from './errors.js';
14
15
  /**
15
16
  * Global output mode — set by the CLI entry point when --json or --pretty flags are parsed.
16
17
  * 'auto' = detect via TTY; 'json' = force JSON; 'pretty' = force human.
@@ -31,6 +32,21 @@ export function isJsonMode() {
31
32
  // auto: non-TTY (piped) → JSON, TTY → human
32
33
  return !process.stdout.isTTY;
33
34
  }
35
+ /**
36
+ * Quiet mode — suppresses non-essential output (banners, hints, progress).
37
+ * Only the essential result (data line or error) is shown.
38
+ * WP-302 Slice 1.
39
+ */
40
+ let quietMode = false;
41
+ export function setQuietMode(quiet) {
42
+ quietMode = quiet;
43
+ }
44
+ export function isQuietMode() {
45
+ // JSON mode is inherently quiet — no decorative output needed
46
+ if (isJsonMode())
47
+ return true;
48
+ return quietMode;
49
+ }
34
50
  /**
35
51
  * Execute a CLI command with unified output handling.
36
52
  *
@@ -52,12 +68,25 @@ export async function runCliCommand(options) {
52
68
  }
53
69
  }
54
70
  catch (err) {
55
- const message = err instanceof Error ? err.message : String(err);
56
- if (json) {
57
- process.stderr.write(JSON.stringify({ error: message }) + '\n');
71
+ if (err instanceof CLIError) {
72
+ if (json) {
73
+ process.stderr.write(JSON.stringify(err.toJSON()) + '\n');
74
+ }
75
+ else {
76
+ process.stderr.write(err.message + '\n');
77
+ if (err.guidance) {
78
+ process.stderr.write(err.guidance + '\n');
79
+ }
80
+ }
58
81
  }
59
82
  else {
60
- process.stderr.write(message + '\n');
83
+ const message = err instanceof Error ? err.message : String(err);
84
+ if (json) {
85
+ process.stderr.write(JSON.stringify({ error: message, code: 'INTERNAL', category: 'internal' }) + '\n');
86
+ }
87
+ else {
88
+ process.stderr.write(message + '\n');
89
+ }
61
90
  }
62
91
  process.exit(1);
63
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD;;;GAGG;AACH,IAAI,UAAU,GAA+B,MAAM,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,IAAgC;IAC5D,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,UAAU;IACxB,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,4CAA4C;IAC5C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/B,CAAC;AASD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,OAAgC;IACrE,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC;QAEhC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjE,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * CLI voice and style — centralized output formatting for Product Brain CLI.
3
+ * WP-302 Slice 1: Brand Voice + --quiet.
4
+ *
5
+ * Design: "instrument panel" — clear status, clear next action.
6
+ * Tone: confident, concise, helpful. Not chatty. Not corporate.
7
+ *
8
+ * All color output respects NO_COLOR env (https://no-color.org/) and TTY detection.
9
+ * Quiet mode suppresses banners, hints, and progress — only essential results show.
10
+ */
11
+ /** Returns true if the terminal supports color output. */
12
+ export declare function supportsColor(): boolean;
13
+ export declare const green: (s: string) => string;
14
+ export declare const red: (s: string) => string;
15
+ export declare const yellow: (s: string) => string;
16
+ export declare const cyan: (s: string) => string;
17
+ export declare const dim: (s: string) => string;
18
+ export declare const bold: (s: string) => string;
19
+ export declare const icons: {
20
+ readonly pass: "✓";
21
+ readonly fail: "✗";
22
+ readonly warn: "⚠";
23
+ readonly arrow: "→";
24
+ readonly dot: "·";
25
+ };
26
+ export declare const copy: {
27
+ readonly captured: "Captured.";
28
+ readonly promoted: "Promoted.";
29
+ readonly linked: "Linked.";
30
+ readonly updated: "Updated.";
31
+ readonly sessionStarted: "Session started.";
32
+ readonly sessionClosed: "Session closed.";
33
+ readonly noSession: "No active session. Run `pb session start` first.";
34
+ readonly sessionRequired: "Write access requires a tracked session (DEC-9).";
35
+ readonly notFound: "Not found.";
36
+ readonly authFailed: "Authentication failed.";
37
+ readonly nextOrient: "Next: pb orient -b";
38
+ readonly nextCapture: "Next: pb capture \"...\"";
39
+ readonly nextGet: (entryId: string) => string;
40
+ readonly nextFields: (collection: string) => string;
41
+ };
42
+ /**
43
+ * Print a command banner. Suppressed in quiet mode.
44
+ * Example: "Product Brain — Doctor"
45
+ */
46
+ export declare function banner(title: string): void;
47
+ /**
48
+ * Print an actionable hint line. Suppressed in quiet mode.
49
+ * Example: " Hint: Run `pb orient -b` to see your workspace."
50
+ */
51
+ export declare function hint(text: string): void;
52
+ /**
53
+ * Print a progress line (e.g. "Classifying..."). Suppressed in quiet mode.
54
+ */
55
+ export declare function progress(text: string): void;
56
+ /**
57
+ * Format a section heading — bold cyan text.
58
+ */
59
+ export declare function heading(text: string): string;
60
+ /**
61
+ * Format a check result line for doctor-style output.
62
+ * Uses colored icons for pass/fail/warn.
63
+ */
64
+ export declare function formatCheck(status: 'pass' | 'fail' | 'warn', label: string, detail: string): string;
65
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/lib/style.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,0DAA0D;AAC1D,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAMD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,MAAuD,CAAC;AAC1F,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,KAAG,MAAuD,CAAC;AACxF,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,KAAG,MAAuD,CAAC;AAC3F,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAAuD,CAAC;AACzF,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,KAAG,MAAsD,CAAC;AACvF,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAAsD,CAAC;AAMxF,eAAO,MAAM,KAAK;;;;;;CAMR,CAAC;AAMX,eAAO,MAAM,IAAI;;;;;;;;;;;;;gCAkBI,MAAM;sCACA,MAAM;CACvB,CAAC;AAMX;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG1C;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGvC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG3C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASnG"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * CLI voice and style — centralized output formatting for Product Brain CLI.
3
+ * WP-302 Slice 1: Brand Voice + --quiet.
4
+ *
5
+ * Design: "instrument panel" — clear status, clear next action.
6
+ * Tone: confident, concise, helpful. Not chatty. Not corporate.
7
+ *
8
+ * All color output respects NO_COLOR env (https://no-color.org/) and TTY detection.
9
+ * Quiet mode suppresses banners, hints, and progress — only essential results show.
10
+ */
11
+ import { isQuietMode } from './runner.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Color support detection
14
+ // ---------------------------------------------------------------------------
15
+ /** Returns true if the terminal supports color output. */
16
+ export function supportsColor() {
17
+ return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Color helpers — degrade gracefully when NO_COLOR is set or not a TTY
21
+ // ---------------------------------------------------------------------------
22
+ export const green = (s) => (supportsColor() ? `\x1b[32m${s}\x1b[0m` : s);
23
+ export const red = (s) => (supportsColor() ? `\x1b[31m${s}\x1b[0m` : s);
24
+ export const yellow = (s) => (supportsColor() ? `\x1b[33m${s}\x1b[0m` : s);
25
+ export const cyan = (s) => (supportsColor() ? `\x1b[36m${s}\x1b[0m` : s);
26
+ export const dim = (s) => (supportsColor() ? `\x1b[2m${s}\x1b[0m` : s);
27
+ export const bold = (s) => (supportsColor() ? `\x1b[1m${s}\x1b[0m` : s);
28
+ // ---------------------------------------------------------------------------
29
+ // Status icons
30
+ // ---------------------------------------------------------------------------
31
+ export const icons = {
32
+ pass: '\u2713', // checkmark
33
+ fail: '\u2717', // x
34
+ warn: '\u26A0', // warning triangle
35
+ arrow: '\u2192', // right arrow
36
+ dot: '\u00B7', // middle dot
37
+ };
38
+ // ---------------------------------------------------------------------------
39
+ // Copy constants — instrument panel voice
40
+ // ---------------------------------------------------------------------------
41
+ export const copy = {
42
+ // Success preambles
43
+ captured: 'Captured.',
44
+ promoted: 'Promoted.',
45
+ linked: 'Linked.',
46
+ updated: 'Updated.',
47
+ sessionStarted: 'Session started.',
48
+ sessionClosed: 'Session closed.',
49
+ // Error preambles
50
+ noSession: 'No active session. Run `pb session start` first.',
51
+ sessionRequired: 'Write access requires a tracked session (DEC-9).',
52
+ notFound: 'Not found.',
53
+ authFailed: 'Authentication failed.',
54
+ // Next-step prompts
55
+ nextOrient: 'Next: pb orient -b',
56
+ nextCapture: 'Next: pb capture "..."',
57
+ nextGet: (entryId) => `View: pb get ${entryId}`,
58
+ nextFields: (collection) => `Fields: pb fields ${collection}`,
59
+ };
60
+ // ---------------------------------------------------------------------------
61
+ // Structured output helpers
62
+ // ---------------------------------------------------------------------------
63
+ /**
64
+ * Print a command banner. Suppressed in quiet mode.
65
+ * Example: "Product Brain — Doctor"
66
+ */
67
+ export function banner(title) {
68
+ if (isQuietMode())
69
+ return;
70
+ process.stdout.write(`\n${bold(`Product Brain — ${title}`)}\n\n`);
71
+ }
72
+ /**
73
+ * Print an actionable hint line. Suppressed in quiet mode.
74
+ * Example: " Hint: Run `pb orient -b` to see your workspace."
75
+ */
76
+ export function hint(text) {
77
+ if (isQuietMode())
78
+ return;
79
+ process.stdout.write(` ${dim(text)}\n`);
80
+ }
81
+ /**
82
+ * Print a progress line (e.g. "Classifying..."). Suppressed in quiet mode.
83
+ */
84
+ export function progress(text) {
85
+ if (isQuietMode())
86
+ return;
87
+ process.stdout.write(`${text}\n`);
88
+ }
89
+ /**
90
+ * Format a section heading — bold cyan text.
91
+ */
92
+ export function heading(text) {
93
+ return bold(cyan(text));
94
+ }
95
+ /**
96
+ * Format a check result line for doctor-style output.
97
+ * Uses colored icons for pass/fail/warn.
98
+ */
99
+ export function formatCheck(status, label, detail) {
100
+ const icon = status === 'pass'
101
+ ? green(icons.pass)
102
+ : status === 'fail'
103
+ ? red(icons.fail)
104
+ : yellow(icons.warn);
105
+ const paddedLabel = label.padEnd(16);
106
+ return `${icon} ${paddedLabel}${detail}`;
107
+ }
108
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/lib/style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for CLI style module — WP-302 Slice 1.
3
+ * Verifies color helpers respect NO_COLOR, quiet mode suppresses banners,
4
+ * and copy constants are non-empty strings.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=style.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.test.d.ts","sourceRoot":"","sources":["../../src/lib/style.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Tests for CLI style module — WP-302 Slice 1.
3
+ * Verifies color helpers respect NO_COLOR, quiet mode suppresses banners,
4
+ * and copy constants are non-empty strings.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ // Mock runner.js for quiet mode control
8
+ vi.mock('./runner.js', () => ({
9
+ isQuietMode: vi.fn(() => false),
10
+ isJsonMode: vi.fn(() => false),
11
+ }));
12
+ import { green, red, yellow, dim, bold, supportsColor, icons, copy, banner, hint, progress, formatCheck, } from './style.js';
13
+ import { isQuietMode } from './runner.js';
14
+ const mockIsQuietMode = vi.mocked(isQuietMode);
15
+ describe('color helpers', () => {
16
+ const originalEnv = process.env.NO_COLOR;
17
+ const originalIsTTY = process.stdout.isTTY;
18
+ afterEach(() => {
19
+ if (originalEnv === undefined) {
20
+ delete process.env.NO_COLOR;
21
+ }
22
+ else {
23
+ process.env.NO_COLOR = originalEnv;
24
+ }
25
+ Object.defineProperty(process.stdout, 'isTTY', { value: originalIsTTY, writable: true });
26
+ });
27
+ it('returns ANSI-wrapped string when color is supported', () => {
28
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, writable: true });
29
+ delete process.env.NO_COLOR;
30
+ expect(green('ok')).toContain('\x1b[32m');
31
+ expect(green('ok')).toContain('ok');
32
+ expect(red('err')).toContain('\x1b[31m');
33
+ expect(yellow('warn')).toContain('\x1b[33m');
34
+ expect(dim('faint')).toContain('\x1b[2m');
35
+ expect(bold('strong')).toContain('\x1b[1m');
36
+ });
37
+ it('returns plain string when NO_COLOR is set', () => {
38
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, writable: true });
39
+ process.env.NO_COLOR = '1';
40
+ expect(green('ok')).toBe('ok');
41
+ expect(red('err')).toBe('err');
42
+ expect(yellow('warn')).toBe('warn');
43
+ expect(dim('faint')).toBe('faint');
44
+ expect(bold('strong')).toBe('strong');
45
+ });
46
+ it('returns plain string when not a TTY', () => {
47
+ Object.defineProperty(process.stdout, 'isTTY', { value: false, writable: true });
48
+ delete process.env.NO_COLOR;
49
+ expect(green('ok')).toBe('ok');
50
+ expect(red('err')).toBe('err');
51
+ });
52
+ });
53
+ describe('supportsColor', () => {
54
+ const originalEnv = process.env.NO_COLOR;
55
+ const originalIsTTY = process.stdout.isTTY;
56
+ afterEach(() => {
57
+ if (originalEnv === undefined) {
58
+ delete process.env.NO_COLOR;
59
+ }
60
+ else {
61
+ process.env.NO_COLOR = originalEnv;
62
+ }
63
+ Object.defineProperty(process.stdout, 'isTTY', { value: originalIsTTY, writable: true });
64
+ });
65
+ it('returns true for TTY without NO_COLOR', () => {
66
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, writable: true });
67
+ delete process.env.NO_COLOR;
68
+ expect(supportsColor()).toBe(true);
69
+ });
70
+ it('returns false when NO_COLOR is set', () => {
71
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, writable: true });
72
+ process.env.NO_COLOR = '1';
73
+ expect(supportsColor()).toBe(false);
74
+ });
75
+ it('returns false when not a TTY', () => {
76
+ Object.defineProperty(process.stdout, 'isTTY', { value: false, writable: true });
77
+ delete process.env.NO_COLOR;
78
+ expect(supportsColor()).toBe(false);
79
+ });
80
+ });
81
+ describe('icons', () => {
82
+ it('has all expected icon keys', () => {
83
+ expect(icons.pass).toBeTruthy();
84
+ expect(icons.fail).toBeTruthy();
85
+ expect(icons.warn).toBeTruthy();
86
+ expect(icons.arrow).toBeTruthy();
87
+ expect(icons.dot).toBeTruthy();
88
+ });
89
+ });
90
+ describe('copy constants', () => {
91
+ it('all string constants are non-empty', () => {
92
+ expect(copy.captured.length).toBeGreaterThan(0);
93
+ expect(copy.promoted.length).toBeGreaterThan(0);
94
+ expect(copy.linked.length).toBeGreaterThan(0);
95
+ expect(copy.updated.length).toBeGreaterThan(0);
96
+ expect(copy.noSession.length).toBeGreaterThan(0);
97
+ expect(copy.sessionRequired.length).toBeGreaterThan(0);
98
+ expect(copy.notFound.length).toBeGreaterThan(0);
99
+ expect(copy.authFailed.length).toBeGreaterThan(0);
100
+ expect(copy.nextOrient.length).toBeGreaterThan(0);
101
+ expect(copy.nextCapture.length).toBeGreaterThan(0);
102
+ expect(copy.sessionStarted.length).toBeGreaterThan(0);
103
+ expect(copy.sessionClosed.length).toBeGreaterThan(0);
104
+ });
105
+ it('function constants return non-empty strings', () => {
106
+ expect(copy.nextGet('BET-42').length).toBeGreaterThan(0);
107
+ expect(copy.nextGet('BET-42')).toContain('BET-42');
108
+ expect(copy.nextFields('tensions').length).toBeGreaterThan(0);
109
+ expect(copy.nextFields('tensions')).toContain('tensions');
110
+ });
111
+ });
112
+ describe('banner', () => {
113
+ let writeSpy;
114
+ beforeEach(() => {
115
+ writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
116
+ mockIsQuietMode.mockReturnValue(false);
117
+ });
118
+ afterEach(() => {
119
+ writeSpy.mockRestore();
120
+ });
121
+ it('writes title to stdout in normal mode', () => {
122
+ banner('Doctor');
123
+ expect(writeSpy).toHaveBeenCalled();
124
+ const output = writeSpy.mock.calls.map((c) => c[0]).join('');
125
+ expect(output).toContain('Doctor');
126
+ });
127
+ it('suppresses output in quiet mode', () => {
128
+ mockIsQuietMode.mockReturnValue(true);
129
+ banner('Doctor');
130
+ expect(writeSpy).not.toHaveBeenCalled();
131
+ });
132
+ });
133
+ describe('hint', () => {
134
+ let writeSpy;
135
+ beforeEach(() => {
136
+ writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
137
+ mockIsQuietMode.mockReturnValue(false);
138
+ });
139
+ afterEach(() => {
140
+ writeSpy.mockRestore();
141
+ });
142
+ it('writes hint text in normal mode', () => {
143
+ hint('Run `pb orient -b` to see your workspace.');
144
+ expect(writeSpy).toHaveBeenCalled();
145
+ });
146
+ it('suppresses output in quiet mode', () => {
147
+ mockIsQuietMode.mockReturnValue(true);
148
+ hint('Run `pb orient -b`');
149
+ expect(writeSpy).not.toHaveBeenCalled();
150
+ });
151
+ });
152
+ describe('progress', () => {
153
+ let writeSpy;
154
+ beforeEach(() => {
155
+ writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
156
+ mockIsQuietMode.mockReturnValue(false);
157
+ });
158
+ afterEach(() => {
159
+ writeSpy.mockRestore();
160
+ });
161
+ it('writes progress text in normal mode', () => {
162
+ progress('Classifying...');
163
+ expect(writeSpy).toHaveBeenCalled();
164
+ const output = writeSpy.mock.calls.map((c) => c[0]).join('');
165
+ expect(output).toContain('Classifying...');
166
+ });
167
+ it('suppresses output in quiet mode', () => {
168
+ mockIsQuietMode.mockReturnValue(true);
169
+ progress('Classifying...');
170
+ expect(writeSpy).not.toHaveBeenCalled();
171
+ });
172
+ });
173
+ describe('formatCheck', () => {
174
+ it('formats pass result with label and detail', () => {
175
+ const result = formatCheck('pass', 'Config file', '/path/to/.env');
176
+ expect(result).toContain('Config file');
177
+ expect(result).toContain('/path/to/.env');
178
+ });
179
+ it('formats fail result', () => {
180
+ const result = formatCheck('fail', 'API key', 'Not set');
181
+ expect(result).toContain('API key');
182
+ expect(result).toContain('Not set');
183
+ });
184
+ it('formats warn result', () => {
185
+ const result = formatCheck('warn', 'CLI', 'Unable to read');
186
+ expect(result).toContain('CLI');
187
+ expect(result).toContain('Unable to read');
188
+ });
189
+ it('pads label to 16 chars', () => {
190
+ const result = formatCheck('pass', 'Node', 'v22.0.0');
191
+ // "Node" (4 chars) padded to 16
192
+ expect(result).toContain('Node v22.0.0');
193
+ });
194
+ });
195
+ //# sourceMappingURL=style.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.test.js","sourceRoot":"","sources":["../../src/lib/style.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Telemetry — fire-and-forget event tracking for CLI onboarding and usage.
3
+ *
4
+ * Contract: trackEvent(event, properties?) → void. Never blocks, errors silently swallowed.
5
+ * Event names follow STD-155: setup_started, key_validated, workspace_bound,
6
+ * first_capture_prompted, setup_completed.
7
+ *
8
+ * Current implementation: no-op placeholder that logs to console.debug in dev mode only.
9
+ * The actual PostHog integration comes later — the contract matters more than the transport.
10
+ */
11
+ /**
12
+ * Fire-and-forget telemetry event. Never throws, never blocks.
13
+ */
14
+ export declare function trackEvent(event: string, properties?: Record<string, unknown>): void;
15
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/lib/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUpF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Telemetry — fire-and-forget event tracking for CLI onboarding and usage.
3
+ *
4
+ * Contract: trackEvent(event, properties?) → void. Never blocks, errors silently swallowed.
5
+ * Event names follow STD-155: setup_started, key_validated, workspace_bound,
6
+ * first_capture_prompted, setup_completed.
7
+ *
8
+ * Current implementation: no-op placeholder that logs to console.debug in dev mode only.
9
+ * The actual PostHog integration comes later — the contract matters more than the transport.
10
+ */
11
+ function isDevMode() {
12
+ return process.env.NODE_ENV === 'development' || process.env.PB_DEV === '1';
13
+ }
14
+ /**
15
+ * Fire-and-forget telemetry event. Never throws, never blocks.
16
+ */
17
+ export function trackEvent(event, properties) {
18
+ try {
19
+ if (isDevMode()) {
20
+ console.debug(`[telemetry] ${event}`, properties ?? '');
21
+ }
22
+ // Future: POST to PostHog or telemetry endpoint here.
23
+ // Must remain fire-and-forget — wrap in a non-awaited promise, swallow errors.
24
+ }
25
+ catch {
26
+ // Telemetry must never break the CLI flow.
27
+ }
28
+ }
29
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/lib/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,UAAoC;IAC5E,IAAI,CAAC;QACH,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,EAAE,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,sDAAsD;QACtD,+EAA+E;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productbrain/cli",
3
- "version": "0.1.0-beta.29",
3
+ "version": "0.1.0-beta.32",
4
4
  "description": "Product Brain — Chain knowledge and write-back CLI",
5
5
  "type": "module",
6
6
  "bin": {