@productbrain/cli 0.1.0-beta.30 → 0.1.0-beta.34

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 (214) hide show
  1. package/README.md +62 -178
  2. package/dist/__tests__/capture.test.js +2 -11
  3. package/dist/__tests__/capture.test.js.map +1 -1
  4. package/dist/__tests__/config.test.d.ts +8 -0
  5. package/dist/__tests__/config.test.d.ts.map +1 -0
  6. package/dist/__tests__/config.test.js +166 -0
  7. package/dist/__tests__/config.test.js.map +1 -0
  8. package/dist/__tests__/constants.test.js +1 -1
  9. package/dist/__tests__/constants.test.js.map +1 -1
  10. package/dist/__tests__/constellation.test.js +2 -8
  11. package/dist/__tests__/constellation.test.js.map +1 -1
  12. package/dist/__tests__/errors.test.d.ts +2 -0
  13. package/dist/__tests__/errors.test.d.ts.map +1 -0
  14. package/dist/__tests__/errors.test.js +117 -0
  15. package/dist/__tests__/errors.test.js.map +1 -0
  16. package/dist/__tests__/fields.test.js +14 -14
  17. package/dist/__tests__/fields.test.js.map +1 -1
  18. package/dist/__tests__/glossary.test.d.ts +2 -0
  19. package/dist/__tests__/glossary.test.d.ts.map +1 -0
  20. package/dist/__tests__/glossary.test.js +32 -0
  21. package/dist/__tests__/glossary.test.js.map +1 -0
  22. package/dist/__tests__/handshake.test.js +9 -17
  23. package/dist/__tests__/handshake.test.js.map +1 -1
  24. package/dist/__tests__/init.test.d.ts +7 -0
  25. package/dist/__tests__/init.test.d.ts.map +1 -0
  26. package/dist/__tests__/init.test.js +146 -0
  27. package/dist/__tests__/init.test.js.map +1 -0
  28. package/dist/__tests__/login.test.js +29 -30
  29. package/dist/__tests__/login.test.js.map +1 -1
  30. package/dist/__tests__/onboarding.test.d.ts +6 -0
  31. package/dist/__tests__/onboarding.test.d.ts.map +1 -0
  32. package/dist/__tests__/onboarding.test.js +199 -0
  33. package/dist/__tests__/onboarding.test.js.map +1 -0
  34. package/dist/__tests__/profiles.test.d.ts +2 -0
  35. package/dist/__tests__/profiles.test.d.ts.map +1 -0
  36. package/dist/__tests__/profiles.test.js +168 -0
  37. package/dist/__tests__/profiles.test.js.map +1 -0
  38. package/dist/__tests__/promote.test.js +4 -16
  39. package/dist/__tests__/promote.test.js.map +1 -1
  40. package/dist/__tests__/prompts.test.d.ts +6 -0
  41. package/dist/__tests__/prompts.test.d.ts.map +1 -0
  42. package/dist/__tests__/prompts.test.js +146 -0
  43. package/dist/__tests__/prompts.test.js.map +1 -0
  44. package/dist/__tests__/proposals.test.js +6 -29
  45. package/dist/__tests__/proposals.test.js.map +1 -1
  46. package/dist/__tests__/relate.test.js +6 -23
  47. package/dist/__tests__/relate.test.js.map +1 -1
  48. package/dist/__tests__/runner.test.js +19 -15
  49. package/dist/__tests__/runner.test.js.map +1 -1
  50. package/dist/__tests__/session.test.js +2 -8
  51. package/dist/__tests__/session.test.js.map +1 -1
  52. package/dist/__tests__/setup.test.js +39 -25
  53. package/dist/__tests__/setup.test.js.map +1 -1
  54. package/dist/__tests__/spinner-labels.test.d.ts +2 -0
  55. package/dist/__tests__/spinner-labels.test.d.ts.map +1 -0
  56. package/dist/__tests__/spinner-labels.test.js +23 -0
  57. package/dist/__tests__/spinner-labels.test.js.map +1 -0
  58. package/dist/__tests__/update.test.js +27 -61
  59. package/dist/__tests__/update.test.js.map +1 -1
  60. package/dist/__tests__/workspace.test.d.ts +2 -0
  61. package/dist/__tests__/workspace.test.d.ts.map +1 -0
  62. package/dist/__tests__/workspace.test.js +308 -0
  63. package/dist/__tests__/workspace.test.js.map +1 -0
  64. package/dist/commands/accept.d.ts.map +1 -1
  65. package/dist/commands/accept.js +6 -2
  66. package/dist/commands/accept.js.map +1 -1
  67. package/dist/commands/brief.d.ts.map +1 -1
  68. package/dist/commands/brief.js +6 -1
  69. package/dist/commands/brief.js.map +1 -1
  70. package/dist/commands/capture.d.ts.map +1 -1
  71. package/dist/commands/capture.js +20 -12
  72. package/dist/commands/capture.js.map +1 -1
  73. package/dist/commands/chain-walk.d.ts.map +1 -1
  74. package/dist/commands/chain-walk.js +6 -1
  75. package/dist/commands/chain-walk.js.map +1 -1
  76. package/dist/commands/changes.d.ts.map +1 -1
  77. package/dist/commands/changes.js +6 -1
  78. package/dist/commands/changes.js.map +1 -1
  79. package/dist/commands/codex-prep.d.ts.map +1 -1
  80. package/dist/commands/codex-prep.js +6 -2
  81. package/dist/commands/codex-prep.js.map +1 -1
  82. package/dist/commands/collections.d.ts.map +1 -1
  83. package/dist/commands/collections.js +6 -2
  84. package/dist/commands/collections.js.map +1 -1
  85. package/dist/commands/constellation.d.ts.map +1 -1
  86. package/dist/commands/constellation.js +6 -1
  87. package/dist/commands/constellation.js.map +1 -1
  88. package/dist/commands/context.d.ts.map +1 -1
  89. package/dist/commands/context.js +6 -1
  90. package/dist/commands/context.js.map +1 -1
  91. package/dist/commands/doctor.d.ts +9 -2
  92. package/dist/commands/doctor.d.ts.map +1 -1
  93. package/dist/commands/doctor.js +125 -28
  94. package/dist/commands/doctor.js.map +1 -1
  95. package/dist/commands/doctor.test.d.ts +3 -1
  96. package/dist/commands/doctor.test.d.ts.map +1 -1
  97. package/dist/commands/doctor.test.js +206 -10
  98. package/dist/commands/doctor.test.js.map +1 -1
  99. package/dist/commands/fields.d.ts.map +1 -1
  100. package/dist/commands/fields.js +6 -2
  101. package/dist/commands/fields.js.map +1 -1
  102. package/dist/commands/get.d.ts.map +1 -1
  103. package/dist/commands/get.js +11 -3
  104. package/dist/commands/get.js.map +1 -1
  105. package/dist/commands/handshake.d.ts.map +1 -1
  106. package/dist/commands/handshake.js +21 -22
  107. package/dist/commands/handshake.js.map +1 -1
  108. package/dist/commands/ingest.d.ts.map +1 -1
  109. package/dist/commands/ingest.js +11 -3
  110. package/dist/commands/ingest.js.map +1 -1
  111. package/dist/commands/init.d.ts +14 -0
  112. package/dist/commands/init.d.ts.map +1 -0
  113. package/dist/commands/init.js +117 -0
  114. package/dist/commands/init.js.map +1 -0
  115. package/dist/commands/login.d.ts.map +1 -1
  116. package/dist/commands/login.js +32 -20
  117. package/dist/commands/login.js.map +1 -1
  118. package/dist/commands/profile.d.ts +24 -0
  119. package/dist/commands/profile.d.ts.map +1 -0
  120. package/dist/commands/profile.js +82 -0
  121. package/dist/commands/profile.js.map +1 -0
  122. package/dist/commands/promote.d.ts.map +1 -1
  123. package/dist/commands/promote.js +22 -7
  124. package/dist/commands/promote.js.map +1 -1
  125. package/dist/commands/reject.d.ts.map +1 -1
  126. package/dist/commands/reject.js +11 -5
  127. package/dist/commands/reject.js.map +1 -1
  128. package/dist/commands/relate.d.ts.map +1 -1
  129. package/dist/commands/relate.js +21 -10
  130. package/dist/commands/relate.js.map +1 -1
  131. package/dist/commands/session.d.ts.map +1 -1
  132. package/dist/commands/session.js +16 -6
  133. package/dist/commands/session.js.map +1 -1
  134. package/dist/commands/setup.d.ts +1 -2
  135. package/dist/commands/setup.d.ts.map +1 -1
  136. package/dist/commands/setup.js +17 -38
  137. package/dist/commands/setup.js.map +1 -1
  138. package/dist/commands/update.d.ts.map +1 -1
  139. package/dist/commands/update.js +45 -27
  140. package/dist/commands/update.js.map +1 -1
  141. package/dist/commands/verify.d.ts.map +1 -1
  142. package/dist/commands/verify.js +11 -5
  143. package/dist/commands/verify.js.map +1 -1
  144. package/dist/commands/workspace.d.ts +41 -0
  145. package/dist/commands/workspace.d.ts.map +1 -0
  146. package/dist/commands/workspace.js +239 -0
  147. package/dist/commands/workspace.js.map +1 -0
  148. package/dist/formatters/promote.d.ts +1 -0
  149. package/dist/formatters/promote.d.ts.map +1 -1
  150. package/dist/formatters/promote.js +1 -0
  151. package/dist/formatters/promote.js.map +1 -1
  152. package/dist/index.js +328 -299
  153. package/dist/index.js.map +1 -1
  154. package/dist/lib/client.d.ts +4 -2
  155. package/dist/lib/client.d.ts.map +1 -1
  156. package/dist/lib/client.js +143 -68
  157. package/dist/lib/client.js.map +1 -1
  158. package/dist/lib/config.d.ts +63 -4
  159. package/dist/lib/config.d.ts.map +1 -1
  160. package/dist/lib/config.js +230 -36
  161. package/dist/lib/config.js.map +1 -1
  162. package/dist/lib/constants.d.ts +1 -1
  163. package/dist/lib/constants.d.ts.map +1 -1
  164. package/dist/lib/constants.js +1 -1
  165. package/dist/lib/constants.js.map +1 -1
  166. package/dist/lib/errors.d.ts +58 -0
  167. package/dist/lib/errors.d.ts.map +1 -0
  168. package/dist/lib/errors.js +67 -0
  169. package/dist/lib/errors.js.map +1 -0
  170. package/dist/lib/format.d.ts +10 -0
  171. package/dist/lib/format.d.ts.map +1 -0
  172. package/dist/lib/format.js +27 -0
  173. package/dist/lib/format.js.map +1 -0
  174. package/dist/lib/glossary.d.ts +19 -0
  175. package/dist/lib/glossary.d.ts.map +1 -0
  176. package/dist/lib/glossary.js +53 -0
  177. package/dist/lib/glossary.js.map +1 -0
  178. package/dist/lib/onboarding.d.ts +19 -0
  179. package/dist/lib/onboarding.d.ts.map +1 -0
  180. package/dist/lib/onboarding.js +373 -0
  181. package/dist/lib/onboarding.js.map +1 -0
  182. package/dist/lib/profiles.d.ts +34 -0
  183. package/dist/lib/profiles.d.ts.map +1 -0
  184. package/dist/lib/profiles.js +173 -0
  185. package/dist/lib/profiles.js.map +1 -0
  186. package/dist/lib/prompts.d.ts +38 -0
  187. package/dist/lib/prompts.d.ts.map +1 -0
  188. package/dist/lib/prompts.js +90 -0
  189. package/dist/lib/prompts.js.map +1 -0
  190. package/dist/lib/runner.d.ts +2 -0
  191. package/dist/lib/runner.d.ts.map +1 -1
  192. package/dist/lib/runner.js +21 -7
  193. package/dist/lib/runner.js.map +1 -1
  194. package/dist/lib/spinner.d.ts +27 -0
  195. package/dist/lib/spinner.d.ts.map +1 -0
  196. package/dist/lib/spinner.js +76 -0
  197. package/dist/lib/spinner.js.map +1 -0
  198. package/dist/lib/spinner.test.d.ts +2 -0
  199. package/dist/lib/spinner.test.d.ts.map +1 -0
  200. package/dist/lib/spinner.test.js +39 -0
  201. package/dist/lib/spinner.test.js.map +1 -0
  202. package/dist/lib/style.d.ts +65 -0
  203. package/dist/lib/style.d.ts.map +1 -0
  204. package/dist/lib/style.js +108 -0
  205. package/dist/lib/style.js.map +1 -0
  206. package/dist/lib/style.test.d.ts +7 -0
  207. package/dist/lib/style.test.d.ts.map +1 -0
  208. package/dist/lib/style.test.js +195 -0
  209. package/dist/lib/style.test.js.map +1 -0
  210. package/dist/lib/workspace-probe.d.ts +16 -0
  211. package/dist/lib/workspace-probe.d.ts.map +1 -0
  212. package/dist/lib/workspace-probe.js +33 -0
  213. package/dist/lib/workspace-probe.js.map +1 -0
  214. package/package.json +2 -1
@@ -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,16 @@
1
+ /**
2
+ * Shared workspace probe utility — single source of truth for workspace connectivity check.
3
+ * Used by both `pb init` and the no-args dashboard in `index.ts`.
4
+ *
5
+ * Design: lightweight orient call to detect workspace reachability. Returns structured
6
+ * workspace info on success, null on any failure (network, auth, offline).
7
+ */
8
+ /**
9
+ * Attempt to detect workspace connectivity via a lightweight API call.
10
+ * Returns workspace info on success, null on any failure.
11
+ */
12
+ export declare function probeWorkspace(): Promise<{
13
+ name: string;
14
+ entryCount?: number;
15
+ } | null>;
16
+ //# sourceMappingURL=workspace-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-probe.d.ts","sourceRoot":"","sources":["../../src/lib/workspace-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAuB5F"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared workspace probe utility — single source of truth for workspace connectivity check.
3
+ * Used by both `pb init` and the no-args dashboard in `index.ts`.
4
+ *
5
+ * Design: lightweight orient call to detect workspace reachability. Returns structured
6
+ * workspace info on success, null on any failure (network, auth, offline).
7
+ */
8
+ import { mcpCall } from './client.js';
9
+ /**
10
+ * Attempt to detect workspace connectivity via a lightweight API call.
11
+ * Returns workspace info on success, null on any failure.
12
+ */
13
+ export async function probeWorkspace() {
14
+ try {
15
+ const result = await mcpCall('orient', { brief: true });
16
+ const name = result?.workspace?.name || 'unknown';
17
+ // Sum entry counts from orient sections if available
18
+ let entryCount;
19
+ if (result?.sections) {
20
+ entryCount = result.sections.reduce((sum, s) => {
21
+ if (s.counts) {
22
+ return sum + Object.values(s.counts).reduce((a, b) => a + (b || 0), 0);
23
+ }
24
+ return sum;
25
+ }, 0);
26
+ }
27
+ return { name, entryCount };
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ //# sourceMappingURL=workspace-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-probe.js","sourceRoot":"","sources":["../../src/lib/workspace-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAIzB,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,SAAS,CAAC;QAClD,qDAAqD;QACrD,IAAI,UAA8B,CAAC;QACnC,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;YACrB,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBAC7C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACb,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzE,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productbrain/cli",
3
- "version": "0.1.0-beta.30",
3
+ "version": "0.1.0-beta.34",
4
4
  "description": "Product Brain — Chain knowledge and write-back CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,6 +20,7 @@
20
20
  "version:prerelease": "npm version prerelease --no-git-tag-version"
21
21
  },
22
22
  "dependencies": {
23
+ "@clack/prompts": "^0.10.0",
23
24
  "commander": "^12.0.0",
24
25
  "glob": "^11.0.0",
25
26
  "undici": "^7.24.5"