@productbrain/cli 0.1.0-beta.32 → 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 (169) hide show
  1. package/dist/__tests__/capture.test.js +2 -11
  2. package/dist/__tests__/capture.test.js.map +1 -1
  3. package/dist/__tests__/config.test.d.ts +8 -0
  4. package/dist/__tests__/config.test.d.ts.map +1 -0
  5. package/dist/__tests__/config.test.js +166 -0
  6. package/dist/__tests__/config.test.js.map +1 -0
  7. package/dist/__tests__/constellation.test.js +2 -8
  8. package/dist/__tests__/constellation.test.js.map +1 -1
  9. package/dist/__tests__/fields.test.js +14 -14
  10. package/dist/__tests__/fields.test.js.map +1 -1
  11. package/dist/__tests__/handshake.test.js +9 -17
  12. package/dist/__tests__/handshake.test.js.map +1 -1
  13. package/dist/__tests__/init.test.d.ts +7 -0
  14. package/dist/__tests__/init.test.d.ts.map +1 -0
  15. package/dist/__tests__/init.test.js +146 -0
  16. package/dist/__tests__/init.test.js.map +1 -0
  17. package/dist/__tests__/login.test.js +28 -29
  18. package/dist/__tests__/login.test.js.map +1 -1
  19. package/dist/__tests__/onboarding.test.d.ts +6 -0
  20. package/dist/__tests__/onboarding.test.d.ts.map +1 -0
  21. package/dist/__tests__/onboarding.test.js +199 -0
  22. package/dist/__tests__/onboarding.test.js.map +1 -0
  23. package/dist/__tests__/promote.test.js +4 -16
  24. package/dist/__tests__/promote.test.js.map +1 -1
  25. package/dist/__tests__/prompts.test.d.ts +6 -0
  26. package/dist/__tests__/prompts.test.d.ts.map +1 -0
  27. package/dist/__tests__/prompts.test.js +146 -0
  28. package/dist/__tests__/prompts.test.js.map +1 -0
  29. package/dist/__tests__/proposals.test.js +6 -29
  30. package/dist/__tests__/proposals.test.js.map +1 -1
  31. package/dist/__tests__/relate.test.js +6 -23
  32. package/dist/__tests__/relate.test.js.map +1 -1
  33. package/dist/__tests__/runner.test.js +19 -15
  34. package/dist/__tests__/runner.test.js.map +1 -1
  35. package/dist/__tests__/session.test.js +2 -8
  36. package/dist/__tests__/session.test.js.map +1 -1
  37. package/dist/__tests__/setup.test.js +39 -25
  38. package/dist/__tests__/setup.test.js.map +1 -1
  39. package/dist/__tests__/spinner-labels.test.d.ts +2 -0
  40. package/dist/__tests__/spinner-labels.test.d.ts.map +1 -0
  41. package/dist/__tests__/spinner-labels.test.js +23 -0
  42. package/dist/__tests__/spinner-labels.test.js.map +1 -0
  43. package/dist/__tests__/update.test.js +27 -61
  44. package/dist/__tests__/update.test.js.map +1 -1
  45. package/dist/__tests__/workspace.test.d.ts +2 -0
  46. package/dist/__tests__/workspace.test.d.ts.map +1 -0
  47. package/dist/__tests__/workspace.test.js +308 -0
  48. package/dist/__tests__/workspace.test.js.map +1 -0
  49. package/dist/commands/accept.d.ts.map +1 -1
  50. package/dist/commands/accept.js +6 -2
  51. package/dist/commands/accept.js.map +1 -1
  52. package/dist/commands/brief.d.ts.map +1 -1
  53. package/dist/commands/brief.js +6 -1
  54. package/dist/commands/brief.js.map +1 -1
  55. package/dist/commands/capture.d.ts.map +1 -1
  56. package/dist/commands/capture.js +17 -10
  57. package/dist/commands/capture.js.map +1 -1
  58. package/dist/commands/chain-walk.d.ts.map +1 -1
  59. package/dist/commands/chain-walk.js +6 -1
  60. package/dist/commands/chain-walk.js.map +1 -1
  61. package/dist/commands/changes.d.ts.map +1 -1
  62. package/dist/commands/changes.js +6 -1
  63. package/dist/commands/changes.js.map +1 -1
  64. package/dist/commands/codex-prep.d.ts.map +1 -1
  65. package/dist/commands/codex-prep.js +6 -2
  66. package/dist/commands/codex-prep.js.map +1 -1
  67. package/dist/commands/collections.d.ts.map +1 -1
  68. package/dist/commands/collections.js +6 -2
  69. package/dist/commands/collections.js.map +1 -1
  70. package/dist/commands/constellation.d.ts.map +1 -1
  71. package/dist/commands/constellation.js +6 -1
  72. package/dist/commands/constellation.js.map +1 -1
  73. package/dist/commands/context.d.ts.map +1 -1
  74. package/dist/commands/context.js +6 -1
  75. package/dist/commands/context.js.map +1 -1
  76. package/dist/commands/doctor.d.ts.map +1 -1
  77. package/dist/commands/doctor.js +30 -20
  78. package/dist/commands/doctor.js.map +1 -1
  79. package/dist/commands/doctor.test.d.ts +1 -0
  80. package/dist/commands/doctor.test.d.ts.map +1 -1
  81. package/dist/commands/doctor.test.js +54 -21
  82. package/dist/commands/doctor.test.js.map +1 -1
  83. package/dist/commands/fields.d.ts.map +1 -1
  84. package/dist/commands/fields.js +6 -2
  85. package/dist/commands/fields.js.map +1 -1
  86. package/dist/commands/get.d.ts.map +1 -1
  87. package/dist/commands/get.js +11 -3
  88. package/dist/commands/get.js.map +1 -1
  89. package/dist/commands/handshake.d.ts.map +1 -1
  90. package/dist/commands/handshake.js +21 -22
  91. package/dist/commands/handshake.js.map +1 -1
  92. package/dist/commands/ingest.d.ts.map +1 -1
  93. package/dist/commands/ingest.js +11 -3
  94. package/dist/commands/ingest.js.map +1 -1
  95. package/dist/commands/init.d.ts +14 -0
  96. package/dist/commands/init.d.ts.map +1 -0
  97. package/dist/commands/init.js +117 -0
  98. package/dist/commands/init.js.map +1 -0
  99. package/dist/commands/login.d.ts.map +1 -1
  100. package/dist/commands/login.js +32 -20
  101. package/dist/commands/login.js.map +1 -1
  102. package/dist/commands/promote.d.ts.map +1 -1
  103. package/dist/commands/promote.js +21 -7
  104. package/dist/commands/promote.js.map +1 -1
  105. package/dist/commands/reject.d.ts.map +1 -1
  106. package/dist/commands/reject.js +11 -5
  107. package/dist/commands/reject.js.map +1 -1
  108. package/dist/commands/relate.d.ts.map +1 -1
  109. package/dist/commands/relate.js +21 -10
  110. package/dist/commands/relate.js.map +1 -1
  111. package/dist/commands/session.d.ts.map +1 -1
  112. package/dist/commands/session.js +16 -6
  113. package/dist/commands/session.js.map +1 -1
  114. package/dist/commands/setup.d.ts +1 -2
  115. package/dist/commands/setup.d.ts.map +1 -1
  116. package/dist/commands/setup.js +17 -38
  117. package/dist/commands/setup.js.map +1 -1
  118. package/dist/commands/update.d.ts.map +1 -1
  119. package/dist/commands/update.js +45 -27
  120. package/dist/commands/update.js.map +1 -1
  121. package/dist/commands/verify.d.ts.map +1 -1
  122. package/dist/commands/verify.js +11 -5
  123. package/dist/commands/verify.js.map +1 -1
  124. package/dist/commands/workspace.d.ts +41 -0
  125. package/dist/commands/workspace.d.ts.map +1 -0
  126. package/dist/commands/workspace.js +239 -0
  127. package/dist/commands/workspace.js.map +1 -0
  128. package/dist/index.js +109 -21
  129. package/dist/index.js.map +1 -1
  130. package/dist/lib/client.d.ts +2 -0
  131. package/dist/lib/client.d.ts.map +1 -1
  132. package/dist/lib/client.js +113 -57
  133. package/dist/lib/client.js.map +1 -1
  134. package/dist/lib/config.d.ts +57 -4
  135. package/dist/lib/config.d.ts.map +1 -1
  136. package/dist/lib/config.js +189 -32
  137. package/dist/lib/config.js.map +1 -1
  138. package/dist/lib/errors.d.ts +1 -0
  139. package/dist/lib/errors.d.ts.map +1 -1
  140. package/dist/lib/errors.js +2 -0
  141. package/dist/lib/errors.js.map +1 -1
  142. package/dist/lib/format.d.ts +10 -0
  143. package/dist/lib/format.d.ts.map +1 -0
  144. package/dist/lib/format.js +27 -0
  145. package/dist/lib/format.js.map +1 -0
  146. package/dist/lib/onboarding.d.ts +19 -0
  147. package/dist/lib/onboarding.d.ts.map +1 -0
  148. package/dist/lib/onboarding.js +373 -0
  149. package/dist/lib/onboarding.js.map +1 -0
  150. package/dist/lib/prompts.d.ts +38 -0
  151. package/dist/lib/prompts.d.ts.map +1 -0
  152. package/dist/lib/prompts.js +90 -0
  153. package/dist/lib/prompts.js.map +1 -0
  154. package/dist/lib/runner.d.ts.map +1 -1
  155. package/dist/lib/runner.js +4 -19
  156. package/dist/lib/runner.js.map +1 -1
  157. package/dist/lib/spinner.d.ts +27 -0
  158. package/dist/lib/spinner.d.ts.map +1 -0
  159. package/dist/lib/spinner.js +76 -0
  160. package/dist/lib/spinner.js.map +1 -0
  161. package/dist/lib/spinner.test.d.ts +2 -0
  162. package/dist/lib/spinner.test.d.ts.map +1 -0
  163. package/dist/lib/spinner.test.js +39 -0
  164. package/dist/lib/spinner.test.js.map +1 -0
  165. package/dist/lib/workspace-probe.d.ts +16 -0
  166. package/dist/lib/workspace-probe.d.ts.map +1 -0
  167. package/dist/lib/workspace-probe.js +33 -0
  168. package/dist/lib/workspace-probe.js.map +1 -0
  169. package/package.json +2 -1
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Prompt gate — TTY-aware, cancel-safe, mode-aware.
3
+ * All interactive CLI prompts flow through this module.
4
+ * WP-303 Slice 1: replaces raw readline with @clack/prompts.
5
+ */
6
+ import * as clack from '@clack/prompts';
7
+ import { CLIError, ErrorCode } from './errors.js';
8
+ import { isJsonMode, isQuietMode } from './runner.js';
9
+ // --- Guards ---
10
+ const CANCEL = Symbol.for('cancel');
11
+ function isCancelled(value) {
12
+ return value === CANCEL || clack.isCancel(value);
13
+ }
14
+ function assertInteractive() {
15
+ if (!process.stdin.isTTY) {
16
+ throw new CLIError('Non-interactive environment detected.', {
17
+ code: ErrorCode.NON_INTERACTIVE,
18
+ category: 'config',
19
+ guidance: 'Run with explicit args or use --json mode.',
20
+ });
21
+ }
22
+ if (isJsonMode()) {
23
+ throw new CLIError('Prompt skipped in JSON mode.', {
24
+ code: ErrorCode.NON_INTERACTIVE,
25
+ category: 'config',
26
+ guidance: 'Provide values via command-line arguments instead of interactive prompts.',
27
+ });
28
+ }
29
+ if (isQuietMode()) {
30
+ throw new CLIError('Prompt skipped in quiet mode.', {
31
+ code: ErrorCode.NON_INTERACTIVE,
32
+ category: 'config',
33
+ guidance: 'Provide values via command-line arguments.',
34
+ });
35
+ }
36
+ }
37
+ function handleCancel(value) {
38
+ if (isCancelled(value)) {
39
+ process.exit(130);
40
+ }
41
+ }
42
+ // --- Exports ---
43
+ /** Returns true if the CLI is running in a context where prompts are safe. */
44
+ export function isInteractive() {
45
+ return !!process.stdin.isTTY && !isQuietMode() && !isJsonMode();
46
+ }
47
+ /** Text input — wraps clack.text(). */
48
+ export async function ask(opts) {
49
+ assertInteractive();
50
+ const result = await clack.text({
51
+ message: opts.message,
52
+ placeholder: opts.placeholder,
53
+ defaultValue: opts.defaultValue,
54
+ validate: opts.validate,
55
+ });
56
+ handleCancel(result);
57
+ return result;
58
+ }
59
+ /** Yes/no confirmation — wraps clack.confirm(). */
60
+ export async function confirm(opts) {
61
+ assertInteractive();
62
+ const result = await clack.confirm({
63
+ message: opts.message,
64
+ initialValue: opts.initialValue,
65
+ });
66
+ handleCancel(result);
67
+ return result;
68
+ }
69
+ /** Single-select menu — wraps clack.select(). */
70
+ export async function select(opts) {
71
+ assertInteractive();
72
+ // Cast needed: TypeScript can't reduce clack's conditional Option<T> for arbitrary T
73
+ const result = await clack.select({
74
+ message: opts.message,
75
+ options: opts.options,
76
+ });
77
+ handleCancel(result);
78
+ return result;
79
+ }
80
+ /** Password input (masked) — wraps clack.password(). */
81
+ export async function password(opts) {
82
+ assertInteractive();
83
+ const result = await clack.password({
84
+ message: opts.message,
85
+ validate: opts.validate,
86
+ });
87
+ handleCancel(result);
88
+ return result;
89
+ }
90
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
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"}
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,CAwBtF"}
@@ -68,27 +68,12 @@ export async function runCliCommand(options) {
68
68
  }
69
69
  }
70
70
  catch (err) {
71
+ // Re-throw to the central handleError() in index.ts for formatting and exit.
72
+ // CLIErrors pass through directly; unknown errors are wrapped.
71
73
  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
- }
74
+ throw err;
81
75
  }
82
- else {
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
- }
90
- }
91
- process.exit(1);
76
+ throw new CLIError(err instanceof Error ? err.message : String(err), { code: 'INTERNAL', category: 'internal' });
92
77
  }
93
78
  }
94
79
  //# sourceMappingURL=runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;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;AAED;;;;GAIG;AACH,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,8DAA8D;IAC9D,IAAI,UAAU,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,SAAS,CAAC;AACnB,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,6EAA6E;QAC7E,+DAA+D;QAC/D,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAChD,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Contextual spinner for async operations.
3
+ * WP-303 Slice 2: Ambient Feedback (Spinners).
4
+ *
5
+ * - TTY: shows animated spinner with 200ms delayed start
6
+ * - Non-TTY / quiet / json: silent (no output)
7
+ * - On success: replaces spinner with success message
8
+ * - On failure: replaces spinner with failure message, rethrows
9
+ *
10
+ * Uses raw ANSI escape codes to stay consistent with style.ts (no @clack dependency).
11
+ */
12
+ /**
13
+ * Run an async function with a contextual spinner.
14
+ *
15
+ * In interactive TTY mode, a spinner appears after 200ms (avoids flicker for
16
+ * fast operations). In non-TTY / quiet / JSON mode, the function runs silently.
17
+ *
18
+ * @param label - Text shown next to the spinner (e.g. "Loading orient data")
19
+ * @param fn - The async operation to run
20
+ * @param options.successMessage - Optional override for the completion message
21
+ * @returns The result of fn()
22
+ * @throws Rethrows any error from fn() after displaying failure
23
+ */
24
+ export declare function withSpinner<T>(label: string, fn: () => Promise<T>, options?: {
25
+ successMessage?: string;
26
+ }): Promise<T>;
27
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,OAAO,CAAC,CAAC,CAAC,CA4CZ"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Contextual spinner for async operations.
3
+ * WP-303 Slice 2: Ambient Feedback (Spinners).
4
+ *
5
+ * - TTY: shows animated spinner with 200ms delayed start
6
+ * - Non-TTY / quiet / json: silent (no output)
7
+ * - On success: replaces spinner with success message
8
+ * - On failure: replaces spinner with failure message, rethrows
9
+ *
10
+ * Uses raw ANSI escape codes to stay consistent with style.ts (no @clack dependency).
11
+ */
12
+ import { isQuietMode, isJsonMode } from './runner.js';
13
+ import { green, red, icons } from './style.js';
14
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
15
+ const FRAME_INTERVAL_MS = 80;
16
+ const DELAYED_START_MS = 200;
17
+ /** Returns true if spinner output should be suppressed. */
18
+ function isSilent() {
19
+ return !process.stdout.isTTY || isQuietMode() || isJsonMode();
20
+ }
21
+ /**
22
+ * Run an async function with a contextual spinner.
23
+ *
24
+ * In interactive TTY mode, a spinner appears after 200ms (avoids flicker for
25
+ * fast operations). In non-TTY / quiet / JSON mode, the function runs silently.
26
+ *
27
+ * @param label - Text shown next to the spinner (e.g. "Loading orient data")
28
+ * @param fn - The async operation to run
29
+ * @param options.successMessage - Optional override for the completion message
30
+ * @returns The result of fn()
31
+ * @throws Rethrows any error from fn() after displaying failure
32
+ */
33
+ export async function withSpinner(label, fn, options) {
34
+ // Non-interactive: just run the function
35
+ if (isSilent()) {
36
+ return fn();
37
+ }
38
+ let frameIndex = 0;
39
+ let spinnerInterval;
40
+ let started = false;
41
+ const write = (text) => {
42
+ // Clear line and write
43
+ process.stderr.write(`\r\x1b[K${text}`);
44
+ };
45
+ const startSpinner = () => {
46
+ started = true;
47
+ spinnerInterval = setInterval(() => {
48
+ const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];
49
+ write(`${frame} ${label}`);
50
+ frameIndex++;
51
+ }, FRAME_INTERVAL_MS);
52
+ };
53
+ // Delayed start — avoids spinner flash for fast operations
54
+ const delayTimer = setTimeout(startSpinner, DELAYED_START_MS);
55
+ try {
56
+ const result = await fn();
57
+ clearTimeout(delayTimer);
58
+ if (spinnerInterval)
59
+ clearInterval(spinnerInterval);
60
+ if (started) {
61
+ const msg = options?.successMessage || label;
62
+ write(`${green(icons.pass)} ${msg}\n`);
63
+ }
64
+ return result;
65
+ }
66
+ catch (err) {
67
+ clearTimeout(delayTimer);
68
+ if (spinnerInterval)
69
+ clearInterval(spinnerInterval);
70
+ if (started) {
71
+ write(`${red(icons.fail)} ${label} \u2014 failed\n`);
72
+ }
73
+ throw err;
74
+ }
75
+ }
76
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1E,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,2DAA2D;AAC3D,SAAS,QAAQ;IACf,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,WAAW,EAAE,IAAI,UAAU,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,EAAoB,EACpB,OAAqC;IAErC,yCAAyC;IACzC,IAAI,QAAQ,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAA2D,CAAC;IAChE,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,uBAAuB;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,OAAO,GAAG,IAAI,CAAC;QACf,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACjE,KAAK,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;YAC3B,UAAU,EAAE,CAAC;QACf,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,2DAA2D;IAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,eAAe;YAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC;YAC7C,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,eAAe;YAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spinner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.test.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * withSpinner — unit tests.
3
+ * WP-303 Slice 2: Ambient Feedback (Spinners).
4
+ *
5
+ * Tests run in a non-TTY environment (vitest), so the spinner is always silent.
6
+ * This validates the critical contract: withSpinner is transparent in non-TTY mode.
7
+ */
8
+ import { describe, expect, it } from 'vitest';
9
+ import { withSpinner } from './spinner.js';
10
+ describe('withSpinner', () => {
11
+ it('returns the function result in non-TTY mode', async () => {
12
+ const result = await withSpinner('Loading', async () => 42);
13
+ expect(result).toBe(42);
14
+ });
15
+ it('returns complex objects unchanged', async () => {
16
+ const data = { entries: [{ id: 'BET-1', name: 'Test' }], total: 1 };
17
+ const result = await withSpinner('Loading', async () => data);
18
+ expect(result).toEqual(data);
19
+ });
20
+ it('rethrows errors from the wrapped function', async () => {
21
+ const err = new Error('network failure');
22
+ await expect(withSpinner('Loading', async () => {
23
+ throw err;
24
+ })).rejects.toThrow('network failure');
25
+ });
26
+ it('passes through the success message option without affecting result', async () => {
27
+ const result = await withSpinner('Loading', async () => 'done', { successMessage: 'Loaded successfully' });
28
+ expect(result).toBe('done');
29
+ });
30
+ it('completes without hanging on fast operations', async () => {
31
+ // This validates the 200ms delay timer is properly cleaned up
32
+ const start = Date.now();
33
+ await withSpinner('Fast op', async () => 'quick');
34
+ const elapsed = Date.now() - start;
35
+ // Should complete well under the 200ms delay threshold
36
+ expect(elapsed).toBeLessThan(100);
37
+ });
38
+ });
39
+ //# sourceMappingURL=spinner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.test.js","sourceRoot":"","sources":["../../src/lib/spinner.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,MAAM,CACV,WAAW,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YAChC,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,SAAS,EACT,KAAK,IAAI,EAAE,CAAC,MAAM,EAClB,EAAE,cAAc,EAAE,qBAAqB,EAAE,CAC1C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,8DAA8D;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,uDAAuD;QACvD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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.32",
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"