@doist/twist-cli 1.9.1 → 1.10.1

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 (58) hide show
  1. package/dist/__tests__/channel.test.d.ts +2 -0
  2. package/dist/__tests__/channel.test.d.ts.map +1 -0
  3. package/dist/__tests__/channel.test.js +38 -0
  4. package/dist/__tests__/channel.test.js.map +1 -0
  5. package/dist/__tests__/inbox.test.d.ts +2 -0
  6. package/dist/__tests__/inbox.test.d.ts.map +1 -0
  7. package/dist/__tests__/inbox.test.js +39 -0
  8. package/dist/__tests__/inbox.test.js.map +1 -0
  9. package/dist/__tests__/msg.test.d.ts +2 -0
  10. package/dist/__tests__/msg.test.d.ts.map +1 -0
  11. package/dist/__tests__/msg.test.js +47 -0
  12. package/dist/__tests__/msg.test.js.map +1 -0
  13. package/dist/__tests__/search.test.d.ts +2 -0
  14. package/dist/__tests__/search.test.d.ts.map +1 -0
  15. package/dist/__tests__/search.test.js +39 -0
  16. package/dist/__tests__/search.test.js.map +1 -0
  17. package/dist/__tests__/spinner.test.js +113 -1
  18. package/dist/__tests__/spinner.test.js.map +1 -1
  19. package/dist/__tests__/thread.test.d.ts +2 -0
  20. package/dist/__tests__/thread.test.d.ts.map +1 -0
  21. package/dist/__tests__/thread.test.js +41 -0
  22. package/dist/__tests__/thread.test.js.map +1 -0
  23. package/dist/__tests__/user.test.d.ts +2 -0
  24. package/dist/__tests__/user.test.d.ts.map +1 -0
  25. package/dist/__tests__/user.test.js +33 -0
  26. package/dist/__tests__/user.test.js.map +1 -0
  27. package/dist/commands/channel.d.ts.map +1 -1
  28. package/dist/commands/channel.js +6 -6
  29. package/dist/commands/channel.js.map +1 -1
  30. package/dist/commands/inbox.d.ts.map +1 -1
  31. package/dist/commands/inbox.js +6 -6
  32. package/dist/commands/inbox.js.map +1 -1
  33. package/dist/commands/msg.d.ts.map +1 -1
  34. package/dist/commands/msg.js +14 -8
  35. package/dist/commands/msg.js.map +1 -1
  36. package/dist/commands/search.d.ts.map +1 -1
  37. package/dist/commands/search.js +6 -6
  38. package/dist/commands/search.js.map +1 -1
  39. package/dist/commands/thread.d.ts.map +1 -1
  40. package/dist/commands/thread.js +8 -2
  41. package/dist/commands/thread.js.map +1 -1
  42. package/dist/commands/user.d.ts.map +1 -1
  43. package/dist/commands/user.js +6 -6
  44. package/dist/commands/user.js.map +1 -1
  45. package/dist/index.js +73 -27
  46. package/dist/index.js.map +1 -1
  47. package/dist/lib/markdown.d.ts.map +1 -1
  48. package/dist/lib/markdown.js +5 -1
  49. package/dist/lib/markdown.js.map +1 -1
  50. package/dist/lib/skills/content.d.ts +2 -2
  51. package/dist/lib/skills/content.d.ts.map +1 -1
  52. package/dist/lib/skills/content.js +2 -0
  53. package/dist/lib/skills/content.js.map +1 -1
  54. package/dist/lib/spinner.d.ts +5 -1
  55. package/dist/lib/spinner.d.ts.map +1 -1
  56. package/dist/lib/spinner.js +74 -18
  57. package/dist/lib/spinner.js.map +1 -1
  58. package/package.json +1 -1
@@ -1,54 +1,110 @@
1
1
  import chalk from 'chalk';
2
2
  import yoctoSpinner from 'yocto-spinner';
3
+ function shouldDisableSpinner() {
4
+ // Check for environment variables that should disable spinners
5
+ if (process.env.TW_SPINNER === 'false') {
6
+ return true;
7
+ }
8
+ // Check if we're in CI environment
9
+ if (process.env.CI) {
10
+ return true;
11
+ }
12
+ // Check process arguments for flags that should disable spinner
13
+ const args = process.argv;
14
+ const spinnerDisablingFlags = ['--json', '--ndjson', '--no-spinner', '--progress-jsonl'];
15
+ // Check for both exact matches and prefix matches (to handle --flag=value variants)
16
+ return spinnerDisablingFlags.some((flag) => args.includes(flag) || // exact match
17
+ args.some((arg) => arg.startsWith(`${flag}=`)));
18
+ }
19
+ // ── Early spinner (shown before command module is loaded) ──────────────
20
+ let earlySpinnerInstance = null;
21
+ let originalStdoutWrite = null;
22
+ export function startEarlySpinner() {
23
+ if (!process.stdout.isTTY || shouldDisableSpinner()) {
24
+ return;
25
+ }
26
+ earlySpinnerInstance = yoctoSpinner({ text: chalk.blue('Loading...') });
27
+ earlySpinnerInstance.start();
28
+ // Intercept stdout.write so the spinner auto-stops before any command output
29
+ originalStdoutWrite = process.stdout.write.bind(process.stdout);
30
+ process.stdout.write = ((...args) => {
31
+ stopEarlySpinner();
32
+ return process.stdout.write(...args);
33
+ });
34
+ }
35
+ export function stopEarlySpinner() {
36
+ if (originalStdoutWrite) {
37
+ process.stdout.write = originalStdoutWrite;
38
+ originalStdoutWrite = null;
39
+ }
40
+ if (earlySpinnerInstance) {
41
+ earlySpinnerInstance.stop();
42
+ earlySpinnerInstance = null;
43
+ }
44
+ }
45
+ /** For tests only — reset singleton state without stopping */
46
+ export function resetEarlySpinner() {
47
+ earlySpinnerInstance = null;
48
+ originalStdoutWrite = null;
49
+ }
50
+ // ── LoadingSpinner (used by API calls) ─────────────────────────────────
3
51
  class LoadingSpinner {
4
52
  spinnerInstance = null;
53
+ adopted = false;
5
54
  start(options) {
6
55
  // Don't show spinner in non-interactive environments, when disabled via options, or when JSON output is expected
7
- if (!process.stdout.isTTY || options.noSpinner || this.shouldDisableSpinner()) {
56
+ if (!process.stdout.isTTY || options.noSpinner || shouldDisableSpinner()) {
57
+ return this;
58
+ }
59
+ // If an early spinner is running, adopt it instead of creating a new one
60
+ if (earlySpinnerInstance) {
61
+ this.spinnerInstance = earlySpinnerInstance;
62
+ this.spinnerInstance.text = chalk[options.color || 'blue'](options.text);
63
+ earlySpinnerInstance = null;
64
+ this.adopted = true;
8
65
  return this;
9
66
  }
10
67
  const colorFn = chalk[options.color || 'blue'];
11
68
  this.spinnerInstance = yoctoSpinner({
12
69
  text: colorFn(options.text),
13
- // yocto-spinner uses dots spinner by default which matches NPM's braille pattern
14
70
  });
15
71
  this.spinnerInstance.start();
16
72
  return this;
17
73
  }
18
74
  succeed(text) {
19
75
  if (this.spinnerInstance) {
76
+ if (this.adopted) {
77
+ // Release back so subsequent API calls can re-adopt
78
+ earlySpinnerInstance = this.spinnerInstance;
79
+ this.spinnerInstance = null;
80
+ this.adopted = false;
81
+ return;
82
+ }
20
83
  this.spinnerInstance.success(text ? chalk.green(`✓ ${text}`) : undefined);
21
84
  this.spinnerInstance = null;
22
85
  }
23
86
  }
24
87
  fail(text) {
25
88
  if (this.spinnerInstance) {
89
+ // Errors always stop the spinner for real
26
90
  this.spinnerInstance.error(text ? chalk.red(`✗ ${text}`) : undefined);
27
91
  this.spinnerInstance = null;
92
+ this.adopted = false;
28
93
  }
29
94
  }
30
95
  stop() {
31
96
  if (this.spinnerInstance) {
97
+ if (this.adopted) {
98
+ // Release back so subsequent API calls can re-adopt
99
+ earlySpinnerInstance = this.spinnerInstance;
100
+ this.spinnerInstance = null;
101
+ this.adopted = false;
102
+ return;
103
+ }
32
104
  this.spinnerInstance.stop();
33
105
  this.spinnerInstance = null;
34
106
  }
35
107
  }
36
- shouldDisableSpinner() {
37
- // Check for environment variables that should disable spinners
38
- if (process.env.TW_SPINNER === 'false') {
39
- return true;
40
- }
41
- // Check if we're in CI environment
42
- if (process.env.CI) {
43
- return true;
44
- }
45
- // Check process arguments for flags that should disable spinner
46
- const args = process.argv;
47
- const spinnerDisablingFlags = ['--json', '--ndjson', '--no-spinner', '--progress-jsonl'];
48
- // Check for both exact matches and prefix matches (to handle --flag=value variants)
49
- return spinnerDisablingFlags.some((flag) => args.includes(flag) || // exact match
50
- args.some((arg) => arg.startsWith(`${flag}=`)));
51
- }
52
108
  }
53
109
  /**
54
110
  * High-level wrapper function for running async operations with a loading spinner.
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doist/twist-cli",
3
- "version": "1.9.1",
3
+ "version": "1.10.1",
4
4
  "description": "TypeScript CLI for Twist",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",