@doist/twist-cli 2.4.0 → 2.5.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 (98) hide show
  1. package/dist/commands/conversation.d.ts.map +1 -1
  2. package/dist/commands/conversation.js +4 -3
  3. package/dist/commands/conversation.js.map +1 -1
  4. package/dist/commands/inbox.js +2 -2
  5. package/dist/commands/inbox.js.map +1 -1
  6. package/dist/commands/thread.d.ts.map +1 -1
  7. package/dist/commands/thread.js +3 -2
  8. package/dist/commands/thread.js.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/output.d.ts +1 -0
  12. package/dist/lib/output.d.ts.map +1 -1
  13. package/dist/lib/output.js +3 -0
  14. package/dist/lib/output.js.map +1 -1
  15. package/dist/lib/skills/content.d.ts +2 -2
  16. package/dist/lib/skills/content.d.ts.map +1 -1
  17. package/dist/lib/skills/content.js +1 -0
  18. package/dist/lib/skills/content.js.map +1 -1
  19. package/dist/lib/skills/index.d.ts.map +1 -1
  20. package/dist/lib/skills/index.js +5 -0
  21. package/dist/lib/skills/index.js.map +1 -1
  22. package/package.json +3 -3
  23. package/dist/__tests__/auth.test.d.ts +0 -2
  24. package/dist/__tests__/auth.test.d.ts.map +0 -1
  25. package/dist/__tests__/auth.test.js +0 -340
  26. package/dist/__tests__/auth.test.js.map +0 -1
  27. package/dist/__tests__/channel.test.d.ts +0 -2
  28. package/dist/__tests__/channel.test.d.ts.map +0 -1
  29. package/dist/__tests__/channel.test.js +0 -30
  30. package/dist/__tests__/channel.test.js.map +0 -1
  31. package/dist/__tests__/completion.test.d.ts +0 -2
  32. package/dist/__tests__/completion.test.d.ts.map +0 -1
  33. package/dist/__tests__/completion.test.js +0 -106
  34. package/dist/__tests__/completion.test.js.map +0 -1
  35. package/dist/__tests__/conversation.test.d.ts +0 -2
  36. package/dist/__tests__/conversation.test.d.ts.map +0 -1
  37. package/dist/__tests__/conversation.test.js +0 -47
  38. package/dist/__tests__/conversation.test.js.map +0 -1
  39. package/dist/__tests__/inbox.test.d.ts +0 -2
  40. package/dist/__tests__/inbox.test.d.ts.map +0 -1
  41. package/dist/__tests__/inbox.test.js +0 -31
  42. package/dist/__tests__/inbox.test.js.map +0 -1
  43. package/dist/__tests__/lib/dates.test.d.ts +0 -2
  44. package/dist/__tests__/lib/dates.test.d.ts.map +0 -1
  45. package/dist/__tests__/lib/dates.test.js +0 -58
  46. package/dist/__tests__/lib/dates.test.js.map +0 -1
  47. package/dist/__tests__/lib/public-channels.test.d.ts +0 -2
  48. package/dist/__tests__/lib/public-channels.test.d.ts.map +0 -1
  49. package/dist/__tests__/lib/public-channels.test.js +0 -124
  50. package/dist/__tests__/lib/public-channels.test.js.map +0 -1
  51. package/dist/__tests__/lib/refs.test.d.ts +0 -2
  52. package/dist/__tests__/lib/refs.test.d.ts.map +0 -1
  53. package/dist/__tests__/lib/refs.test.js +0 -191
  54. package/dist/__tests__/lib/refs.test.js.map +0 -1
  55. package/dist/__tests__/msg.test.d.ts +0 -2
  56. package/dist/__tests__/msg.test.d.ts.map +0 -1
  57. package/dist/__tests__/msg.test.js +0 -31
  58. package/dist/__tests__/msg.test.js.map +0 -1
  59. package/dist/__tests__/postinstall.test.d.ts +0 -2
  60. package/dist/__tests__/postinstall.test.d.ts.map +0 -1
  61. package/dist/__tests__/postinstall.test.js +0 -20
  62. package/dist/__tests__/postinstall.test.js.map +0 -1
  63. package/dist/__tests__/progress.test.d.ts +0 -2
  64. package/dist/__tests__/progress.test.d.ts.map +0 -1
  65. package/dist/__tests__/progress.test.js +0 -258
  66. package/dist/__tests__/progress.test.js.map +0 -1
  67. package/dist/__tests__/react.test.d.ts +0 -2
  68. package/dist/__tests__/react.test.d.ts.map +0 -1
  69. package/dist/__tests__/react.test.js +0 -59
  70. package/dist/__tests__/react.test.js.map +0 -1
  71. package/dist/__tests__/search.test.d.ts +0 -2
  72. package/dist/__tests__/search.test.d.ts.map +0 -1
  73. package/dist/__tests__/search.test.js +0 -77
  74. package/dist/__tests__/search.test.js.map +0 -1
  75. package/dist/__tests__/skill.test.d.ts +0 -2
  76. package/dist/__tests__/skill.test.d.ts.map +0 -1
  77. package/dist/__tests__/skill.test.js +0 -271
  78. package/dist/__tests__/skill.test.js.map +0 -1
  79. package/dist/__tests__/spinner.test.d.ts +0 -2
  80. package/dist/__tests__/spinner.test.d.ts.map +0 -1
  81. package/dist/__tests__/spinner.test.js +0 -252
  82. package/dist/__tests__/spinner.test.js.map +0 -1
  83. package/dist/__tests__/thread.test.d.ts +0 -2
  84. package/dist/__tests__/thread.test.d.ts.map +0 -1
  85. package/dist/__tests__/thread.test.js +0 -54
  86. package/dist/__tests__/thread.test.js.map +0 -1
  87. package/dist/__tests__/update.test.d.ts +0 -2
  88. package/dist/__tests__/update.test.d.ts.map +0 -1
  89. package/dist/__tests__/update.test.js +0 -166
  90. package/dist/__tests__/update.test.js.map +0 -1
  91. package/dist/__tests__/user.test.d.ts +0 -2
  92. package/dist/__tests__/user.test.d.ts.map +0 -1
  93. package/dist/__tests__/user.test.js +0 -28
  94. package/dist/__tests__/user.test.js.map +0 -1
  95. package/dist/__tests__/view.test.d.ts +0 -2
  96. package/dist/__tests__/view.test.d.ts.map +0 -1
  97. package/dist/__tests__/view.test.js +0 -68
  98. package/dist/__tests__/view.test.js.map +0 -1
@@ -1,271 +0,0 @@
1
- import { mkdir, readFile, rm, stat } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { Command } from 'commander';
5
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
- vi.mock('chalk');
7
- import { registerSkillCommand } from '../commands/skill.js';
8
- import { SKILL_FILE_CONTENT } from '../lib/skills/content.js';
9
- import { createInstaller } from '../lib/skills/create-installer.js';
10
- import { getInstaller, listAgentNames, listAgents, skillInstallers } from '../lib/skills/index.js';
11
- function createProgram() {
12
- const program = new Command();
13
- program.exitOverride();
14
- registerSkillCommand(program);
15
- return program;
16
- }
17
- describe('skill registry', () => {
18
- it('returns claude-code installer', () => {
19
- const installer = getInstaller('claude-code');
20
- expect(installer).not.toBeNull();
21
- expect(installer?.name).toBe('claude-code');
22
- });
23
- it('returns codex installer', () => {
24
- const installer = getInstaller('codex');
25
- expect(installer).not.toBeNull();
26
- expect(installer?.name).toBe('codex');
27
- });
28
- it('returns cursor installer', () => {
29
- const installer = getInstaller('cursor');
30
- expect(installer).not.toBeNull();
31
- expect(installer?.name).toBe('cursor');
32
- });
33
- it('returns null for unknown agent', () => {
34
- const installer = getInstaller('unknown-agent');
35
- expect(installer).toBeNull();
36
- });
37
- it('lists all available agents', () => {
38
- const names = listAgentNames();
39
- expect(names).toContain('claude-code');
40
- expect(names).toContain('codex');
41
- expect(names).toContain('cursor');
42
- });
43
- });
44
- describe('installer paths', () => {
45
- const cases = [
46
- { agent: 'claude-code', dir: '.claude', desc: 'Claude Code skill for Twist CLI' },
47
- { agent: 'codex', dir: '.codex', desc: 'Codex skill for Twist CLI' },
48
- { agent: 'cursor', dir: '.cursor', desc: 'Cursor skill for Twist CLI' },
49
- ];
50
- for (const { agent, dir, desc } of cases) {
51
- describe(agent, () => {
52
- const installer = skillInstallers[agent];
53
- it('has correct name and description', () => {
54
- expect(installer.name).toBe(agent);
55
- expect(installer.description).toBe(desc);
56
- });
57
- it(`returns global path containing ${dir}/skills`, () => {
58
- const globalPath = installer.getInstallPath({ local: false });
59
- expect(globalPath).toContain(dir);
60
- expect(globalPath).toContain('skills');
61
- expect(globalPath).toContain('twist-cli');
62
- expect(globalPath).toContain('SKILL.md');
63
- });
64
- it('returns local path containing cwd', () => {
65
- const localPath = installer.getInstallPath({ local: true });
66
- expect(localPath).toContain(dir);
67
- expect(localPath).toContain('skills');
68
- expect(localPath).toContain('twist-cli');
69
- expect(localPath).toContain('SKILL.md');
70
- expect(localPath).toContain(process.cwd());
71
- });
72
- });
73
- }
74
- });
75
- describe('installer operations', () => {
76
- let testDir;
77
- const originalCwd = process.cwd();
78
- beforeEach(async () => {
79
- testDir = join(tmpdir(), `twist-cli-test-${Date.now()}`);
80
- await mkdir(testDir, { recursive: true });
81
- process.chdir(testDir);
82
- });
83
- afterEach(async () => {
84
- process.chdir(originalCwd);
85
- await rm(testDir, { recursive: true, force: true });
86
- });
87
- it('installs and reads skill content', async () => {
88
- const installer = skillInstallers['claude-code'];
89
- await installer.install({ local: true });
90
- const skillPath = installer.getInstallPath({ local: true });
91
- const content = await readFile(skillPath, 'utf-8');
92
- expect(content).toBe(SKILL_FILE_CONTENT);
93
- });
94
- it('reports not installed initially', async () => {
95
- const installer = skillInstallers.codex;
96
- const installed = await installer.isInstalled({ local: true });
97
- expect(installed).toBe(false);
98
- });
99
- it('throws when installing without force if exists', async () => {
100
- const installer = skillInstallers.cursor;
101
- await installer.install({ local: true });
102
- await expect(installer.install({ local: true })).rejects.toThrow(/already installed.*Use --force/);
103
- });
104
- it('allows force install over existing', async () => {
105
- const installer = skillInstallers['claude-code'];
106
- await installer.install({ local: true });
107
- await expect(installer.install({ local: true, force: true })).resolves.not.toThrow();
108
- });
109
- it('uninstalls skill', async () => {
110
- const installer = skillInstallers.codex;
111
- await installer.install({ local: true });
112
- await installer.uninstall({ local: true });
113
- const installed = await installer.isInstalled({ local: true });
114
- expect(installed).toBe(false);
115
- });
116
- it('throws when uninstalling non-existent skill', async () => {
117
- const installer = skillInstallers.cursor;
118
- await expect(installer.uninstall({ local: true })).rejects.toThrow(/not installed/);
119
- });
120
- it('updates installed skill', async () => {
121
- const installer = skillInstallers['claude-code'];
122
- await installer.install({ local: true });
123
- await expect(installer.update({ local: true })).resolves.not.toThrow();
124
- const skillPath = installer.getInstallPath({ local: true });
125
- const content = await readFile(skillPath, 'utf-8');
126
- expect(content).toBe(SKILL_FILE_CONTENT);
127
- });
128
- it('throws when updating non-installed skill', async () => {
129
- const installer = skillInstallers.codex;
130
- await expect(installer.update({ local: true })).rejects.toThrow(/not installed/);
131
- });
132
- });
133
- describe('listAgents', () => {
134
- let testDir;
135
- const originalCwd = process.cwd();
136
- beforeEach(async () => {
137
- testDir = join(tmpdir(), `twist-cli-test-${Date.now()}`);
138
- await mkdir(testDir, { recursive: true });
139
- process.chdir(testDir);
140
- });
141
- afterEach(async () => {
142
- process.chdir(originalCwd);
143
- await rm(testDir, { recursive: true, force: true });
144
- });
145
- it('returns agent info with installed status', async () => {
146
- const agents = await listAgents(true);
147
- expect(agents.length).toBe(3);
148
- for (const name of ['claude-code', 'codex', 'cursor']) {
149
- const agent = agents.find((a) => a.name === name);
150
- expect(agent).toBeDefined();
151
- expect(agent?.installed).toBe(false);
152
- expect(agent?.path).toBeNull();
153
- }
154
- });
155
- it('shows installed path when installed', async () => {
156
- const installer = skillInstallers['claude-code'];
157
- await installer.install({ local: true });
158
- const agents = await listAgents(true);
159
- const claudeCode = agents.find((a) => a.name === 'claude-code');
160
- expect(claudeCode?.installed).toBe(true);
161
- expect(claudeCode?.path).toContain('SKILL.md');
162
- });
163
- });
164
- describe('skill command', () => {
165
- let consoleSpy;
166
- let consoleErrorSpy;
167
- let testDir;
168
- const originalCwd = process.cwd();
169
- beforeEach(async () => {
170
- vi.clearAllMocks();
171
- consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
172
- consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
173
- testDir = join(tmpdir(), `twist-cli-test-${Date.now()}`);
174
- await mkdir(testDir, { recursive: true });
175
- process.chdir(testDir);
176
- });
177
- afterEach(async () => {
178
- consoleSpy.mockRestore();
179
- consoleErrorSpy.mockRestore();
180
- process.chdir(originalCwd);
181
- await rm(testDir, { recursive: true, force: true });
182
- });
183
- it('lists agents', async () => {
184
- const program = createProgram();
185
- await program.parseAsync(['node', 'tw', 'skill', 'list', '--local']);
186
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Available agents'));
187
- });
188
- it('installs agent locally', async () => {
189
- const program = createProgram();
190
- await program.parseAsync(['node', 'tw', 'skill', 'install', 'claude-code', '--local']);
191
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Installed'));
192
- const skillPath = join(testDir, '.claude', 'skills', 'twist-cli', 'SKILL.md');
193
- const stats = await stat(skillPath);
194
- expect(stats.isFile()).toBe(true);
195
- const content = await readFile(skillPath, 'utf-8');
196
- expect(content).toBe(SKILL_FILE_CONTENT);
197
- });
198
- it('installs codex agent locally', async () => {
199
- const program = createProgram();
200
- await program.parseAsync(['node', 'tw', 'skill', 'install', 'codex', '--local']);
201
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Installed'));
202
- const skillPath = join(testDir, '.codex', 'skills', 'twist-cli', 'SKILL.md');
203
- const stats = await stat(skillPath);
204
- expect(stats.isFile()).toBe(true);
205
- });
206
- it('installs cursor agent locally', async () => {
207
- const program = createProgram();
208
- await program.parseAsync(['node', 'tw', 'skill', 'install', 'cursor', '--local']);
209
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Installed'));
210
- const skillPath = join(testDir, '.cursor', 'skills', 'twist-cli', 'SKILL.md');
211
- const stats = await stat(skillPath);
212
- expect(stats.isFile()).toBe(true);
213
- });
214
- it('uninstalls agent', async () => {
215
- const installer = skillInstallers['claude-code'];
216
- await installer.install({ local: true });
217
- const program = createProgram();
218
- await program.parseAsync(['node', 'tw', 'skill', 'uninstall', 'claude-code', '--local']);
219
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Uninstalled'));
220
- });
221
- it('errors on unknown agent', async () => {
222
- const program = createProgram();
223
- const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
224
- throw new Error('process.exit');
225
- });
226
- await expect(program.parseAsync(['node', 'tw', 'skill', 'install', 'unknown-agent', '--local'])).rejects.toThrow();
227
- expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Unknown agent'));
228
- exitSpy.mockRestore();
229
- });
230
- it('updates a specific agent', async () => {
231
- const installer = skillInstallers['claude-code'];
232
- await installer.install({ local: true });
233
- const program = createProgram();
234
- await program.parseAsync(['node', 'tw', 'skill', 'update', 'claude-code', '--local']);
235
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Updated'));
236
- });
237
- it('errors on update of unknown agent', async () => {
238
- const program = createProgram();
239
- const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
240
- throw new Error('process.exit');
241
- });
242
- await expect(program.parseAsync(['node', 'tw', 'skill', 'update', 'unknown-agent', '--local'])).rejects.toThrow();
243
- expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Unknown agent'));
244
- exitSpy.mockRestore();
245
- });
246
- it('updates all installed agents', async () => {
247
- await skillInstallers['claude-code'].install({ local: true });
248
- await skillInstallers.codex.install({ local: true });
249
- const program = createProgram();
250
- await program.parseAsync(['node', 'tw', 'skill', 'update', 'all', '--local']);
251
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Updated claude-code'));
252
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Updated codex'));
253
- });
254
- it('defaults to all when no agent specified', async () => {
255
- await skillInstallers.cursor.install({ local: true });
256
- const program = createProgram();
257
- await program.parseAsync(['node', 'tw', 'skill', 'update', '--local']);
258
- expect(consoleSpy).toHaveBeenCalledWith('✓', expect.stringContaining('Updated cursor'));
259
- });
260
- });
261
- describe('install detection', () => {
262
- it('throws when agent directory does not exist', async () => {
263
- const installer = createInstaller({
264
- name: 'fake-agent',
265
- description: 'Fake agent',
266
- dirName: '.nonexistent-agent-dir-xyz',
267
- });
268
- await expect(installer.install({ local: false })).rejects.toThrow('fake-agent does not appear to be installed');
269
- });
270
- });
271
- //# sourceMappingURL=skill.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill.test.js","sourceRoot":"","sources":["../../src/__tests__/skill.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=spinner.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/spinner.test.ts"],"names":[],"mappings":""}
@@ -1,252 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import yoctoSpinnerFactory from 'yocto-spinner';
3
- import { LoadingSpinner, resetEarlySpinner, startEarlySpinner, stopEarlySpinner, withSpinner, } from '../lib/spinner.js';
4
- // Mock yocto-spinner
5
- const mockSpinnerInstance = {
6
- start: vi.fn().mockReturnThis(),
7
- success: vi.fn(),
8
- error: vi.fn(),
9
- stop: vi.fn(),
10
- text: '',
11
- };
12
- vi.mock('yocto-spinner', () => ({
13
- default: vi.fn(() => mockSpinnerInstance),
14
- }));
15
- // Mock chalk to avoid colors in tests
16
- vi.mock('chalk');
17
- describe('withSpinner', () => {
18
- beforeEach(() => {
19
- vi.clearAllMocks();
20
- resetEarlySpinner();
21
- // Reset environment variables
22
- delete process.env.TW_SPINNER;
23
- delete process.env.CI;
24
- // Mock TTY as true by default
25
- Object.defineProperty(process.stdout, 'isTTY', {
26
- value: true,
27
- configurable: true,
28
- });
29
- // Clear process.argv
30
- process.argv = ['node', 'tw'];
31
- });
32
- afterEach(() => {
33
- vi.clearAllMocks();
34
- resetEarlySpinner();
35
- });
36
- it('should handle successful operations', async () => {
37
- const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
38
- expect(result).toBe('success');
39
- expect(mockSpinnerInstance.start).toHaveBeenCalled();
40
- expect(mockSpinnerInstance.stop).toHaveBeenCalled();
41
- expect(mockSpinnerInstance.error).not.toHaveBeenCalled();
42
- });
43
- it('should handle failed operations', async () => {
44
- await expect(withSpinner({ text: 'Testing...', color: 'blue' }, async () => {
45
- throw new Error('test error');
46
- })).rejects.toThrow('test error');
47
- expect(mockSpinnerInstance.start).toHaveBeenCalled();
48
- expect(mockSpinnerInstance.error).toHaveBeenCalled();
49
- expect(mockSpinnerInstance.stop).not.toHaveBeenCalled();
50
- });
51
- it('should not show spinner when noSpinner option is true', async () => {
52
- const result = await withSpinner({ text: 'Testing...', color: 'blue', noSpinner: true }, async () => 'success');
53
- expect(result).toBe('success');
54
- expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
55
- });
56
- it('should not show spinner when TW_SPINNER=false', async () => {
57
- process.env.TW_SPINNER = 'false';
58
- const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
59
- expect(result).toBe('success');
60
- expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
61
- });
62
- it('should not show spinner in CI environment', async () => {
63
- process.env.CI = 'true';
64
- const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
65
- expect(result).toBe('success');
66
- expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
67
- });
68
- it('should not show spinner when not in TTY', async () => {
69
- Object.defineProperty(process.stdout, 'isTTY', {
70
- value: false,
71
- configurable: true,
72
- });
73
- const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
74
- expect(result).toBe('success');
75
- expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
76
- });
77
- it.each([
78
- ['--json', ['node', 'tw', 'auth', 'status', '--json']],
79
- ['--ndjson', ['node', 'tw', 'auth', 'status', '--ndjson']],
80
- ['--no-spinner', ['node', 'tw', 'auth', 'status', '--no-spinner']],
81
- ['--progress-jsonl', ['node', 'tw', 'threads', '--progress-jsonl']],
82
- [
83
- '--progress-jsonl=path',
84
- ['node', 'tw', 'threads', '--progress-jsonl=/tmp/progress.jsonl'],
85
- ],
86
- ])('should not show spinner with %s flag', async (_flagName, argv) => {
87
- process.argv = argv;
88
- const result = await withSpinner({ text: 'Testing...', color: 'blue' }, async () => 'success');
89
- expect(result).toBe('success');
90
- expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
91
- });
92
- });
93
- describe('LoadingSpinner', () => {
94
- beforeEach(() => {
95
- vi.clearAllMocks();
96
- resetEarlySpinner();
97
- // Reset environment variables
98
- delete process.env.TW_SPINNER;
99
- delete process.env.CI;
100
- // Mock TTY as true by default
101
- Object.defineProperty(process.stdout, 'isTTY', {
102
- value: true,
103
- configurable: true,
104
- });
105
- // Clear process.argv
106
- process.argv = ['node', 'tw'];
107
- });
108
- afterEach(() => {
109
- vi.clearAllMocks();
110
- resetEarlySpinner();
111
- });
112
- it('should start and stop spinner', () => {
113
- const spinner = new LoadingSpinner();
114
- spinner.start({ text: 'Testing...', color: 'blue' });
115
- expect(mockSpinnerInstance.start).toHaveBeenCalled();
116
- spinner.stop();
117
- expect(mockSpinnerInstance.stop).toHaveBeenCalled();
118
- });
119
- it('should show success message', () => {
120
- const spinner = new LoadingSpinner();
121
- spinner.start({ text: 'Testing...', color: 'blue' });
122
- spinner.succeed('Operation completed');
123
- expect(mockSpinnerInstance.success).toHaveBeenCalledWith('✓ Operation completed');
124
- });
125
- it('should show failure message', () => {
126
- const spinner = new LoadingSpinner();
127
- spinner.start({ text: 'Testing...', color: 'blue' });
128
- spinner.fail('Operation failed');
129
- expect(mockSpinnerInstance.error).toHaveBeenCalledWith('✗ Operation failed');
130
- });
131
- it('should handle multiple calls to stop gracefully', () => {
132
- const spinner = new LoadingSpinner();
133
- spinner.start({ text: 'Testing...', color: 'blue' });
134
- spinner.stop();
135
- spinner.stop(); // Should not throw
136
- expect(mockSpinnerInstance.stop).toHaveBeenCalledTimes(1);
137
- });
138
- it('should handle succeed/fail without starting', () => {
139
- const spinner = new LoadingSpinner();
140
- spinner.succeed('Test'); // Should not throw
141
- spinner.fail('Test'); // Should not throw
142
- expect(mockSpinnerInstance.success).not.toHaveBeenCalled();
143
- expect(mockSpinnerInstance.error).not.toHaveBeenCalled();
144
- });
145
- });
146
- describe('early spinner', () => {
147
- let savedStdoutWrite;
148
- beforeEach(() => {
149
- vi.clearAllMocks();
150
- resetEarlySpinner();
151
- savedStdoutWrite = process.stdout.write;
152
- delete process.env.TW_SPINNER;
153
- delete process.env.CI;
154
- Object.defineProperty(process.stdout, 'isTTY', {
155
- value: true,
156
- configurable: true,
157
- });
158
- process.argv = ['node', 'tw'];
159
- });
160
- afterEach(() => {
161
- process.stdout.write = savedStdoutWrite;
162
- resetEarlySpinner();
163
- vi.clearAllMocks();
164
- });
165
- it('should start and stop early spinner', () => {
166
- startEarlySpinner();
167
- expect(yoctoSpinnerFactory).toHaveBeenCalledWith({ text: 'Loading...' });
168
- expect(mockSpinnerInstance.start).toHaveBeenCalled();
169
- stopEarlySpinner();
170
- expect(mockSpinnerInstance.stop).toHaveBeenCalled();
171
- });
172
- it('should not start when not TTY', () => {
173
- Object.defineProperty(process.stdout, 'isTTY', {
174
- value: false,
175
- configurable: true,
176
- });
177
- startEarlySpinner();
178
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
179
- });
180
- it('should not start with --json flag', () => {
181
- process.argv = ['node', 'tw', 'inbox', '--json'];
182
- startEarlySpinner();
183
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
184
- });
185
- it('should not start with --ndjson flag', () => {
186
- process.argv = ['node', 'tw', 'inbox', '--ndjson'];
187
- startEarlySpinner();
188
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
189
- });
190
- it('should not start with --no-spinner flag', () => {
191
- process.argv = ['node', 'tw', 'inbox', '--no-spinner'];
192
- startEarlySpinner();
193
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
194
- });
195
- it('should not start in CI', () => {
196
- process.env.CI = 'true';
197
- startEarlySpinner();
198
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
199
- });
200
- it('should not start when TW_SPINNER=false', () => {
201
- process.env.TW_SPINNER = 'false';
202
- startEarlySpinner();
203
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
204
- });
205
- it('should be adopted by LoadingSpinner.start()', () => {
206
- startEarlySpinner();
207
- vi.clearAllMocks();
208
- const spinner = new LoadingSpinner();
209
- spinner.start({ text: 'Fetching data...', color: 'blue' });
210
- // Should NOT create a new spinner — it adopts the early one
211
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
212
- expect(mockSpinnerInstance.start).not.toHaveBeenCalled();
213
- // Should update the text on the adopted instance
214
- expect(mockSpinnerInstance.text).toBe('Fetching data...');
215
- });
216
- it('should release back on stop() so next API call can re-adopt', () => {
217
- startEarlySpinner();
218
- vi.clearAllMocks();
219
- const spinner1 = new LoadingSpinner();
220
- spinner1.start({ text: 'First call...', color: 'blue' });
221
- spinner1.stop();
222
- // Should NOT have called stop — released back
223
- expect(mockSpinnerInstance.stop).not.toHaveBeenCalled();
224
- // Second spinner should also adopt (not create new)
225
- const spinner2 = new LoadingSpinner();
226
- spinner2.start({ text: 'Second call...', color: 'blue' });
227
- expect(yoctoSpinnerFactory).not.toHaveBeenCalled();
228
- expect(mockSpinnerInstance.text).toBe('Second call...');
229
- });
230
- it('should actually stop on fail() even if adopted', () => {
231
- startEarlySpinner();
232
- vi.clearAllMocks();
233
- const spinner = new LoadingSpinner();
234
- spinner.start({ text: 'Failing...', color: 'blue' });
235
- spinner.fail('Something went wrong');
236
- expect(mockSpinnerInstance.error).toHaveBeenCalledWith('✗ Something went wrong');
237
- });
238
- it('should auto-stop when stdout is written to', () => {
239
- startEarlySpinner();
240
- vi.clearAllMocks();
241
- // Writing to stdout should trigger auto-stop
242
- process.stdout.write('hello');
243
- expect(mockSpinnerInstance.stop).toHaveBeenCalled();
244
- });
245
- it('should be cleaned up by stopEarlySpinner() if never adopted', () => {
246
- startEarlySpinner();
247
- vi.clearAllMocks();
248
- stopEarlySpinner();
249
- expect(mockSpinnerInstance.stop).toHaveBeenCalled();
250
- });
251
- });
252
- //# sourceMappingURL=spinner.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.test.js","sourceRoot":"","sources":["../../src/__tests__/spinner.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=thread.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"thread.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/thread.test.ts"],"names":[],"mappings":""}
@@ -1,54 +0,0 @@
1
- import { Command } from 'commander';
2
- import { beforeEach, describe, expect, it, vi } from 'vitest';
3
- vi.mock('../lib/api.js', () => ({
4
- getTwistClient: vi.fn().mockRejectedValue(new Error('MOCK_API_REACHED')),
5
- }));
6
- vi.mock('../lib/public-channels.js', () => ({
7
- assertChannelIsPublic: vi.fn(),
8
- }));
9
- vi.mock('../lib/markdown.js', () => ({
10
- renderMarkdown: vi.fn((text) => text),
11
- }));
12
- vi.mock('../lib/input.js', () => ({
13
- readStdin: vi.fn().mockResolvedValue(''),
14
- openEditor: vi.fn().mockResolvedValue(''),
15
- }));
16
- vi.mock('chalk');
17
- import { registerThreadCommand } from '../commands/thread.js';
18
- function createProgram() {
19
- const program = new Command();
20
- program.exitOverride();
21
- registerThreadCommand(program);
22
- return program;
23
- }
24
- describe('thread implicit view', () => {
25
- beforeEach(() => {
26
- vi.clearAllMocks();
27
- });
28
- it('tw thread <ref> routes to view (not unknown command)', async () => {
29
- const program = createProgram();
30
- const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
31
- // If Commander routes to view, it will call getTwistClient which throws MOCK_API_REACHED.
32
- // If it doesn't route, Commander throws "unknown command '100'".
33
- await expect(program.parseAsync(['node', 'tw', 'thread', '100'])).rejects.toThrow('MOCK_API_REACHED');
34
- consoleSpy.mockRestore();
35
- });
36
- it('accepts id: prefixes in --notify for thread reply', async () => {
37
- const program = createProgram();
38
- const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
39
- await program.parseAsync([
40
- 'node',
41
- 'tw',
42
- 'thread',
43
- 'reply',
44
- '100',
45
- 'hello',
46
- '--notify',
47
- 'id:123,456',
48
- '--dry-run',
49
- ]);
50
- expect(consoleSpy).toHaveBeenCalledWith('Dry run: would post comment to thread', 100);
51
- consoleSpy.mockRestore();
52
- });
53
- });
54
- //# sourceMappingURL=thread.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"thread.test.js","sourceRoot":"","sources":["../../src/__tests__/thread.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;CAC3E,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;CACjC,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;CAChD,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACxC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;CAC5C,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAEhB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,SAAS,aAAa;IAClB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,OAAO,CAAC,YAAY,EAAE,CAAA;IACtB,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC9B,OAAO,OAAO,CAAA;AAClB,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;QAC/B,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAExE,0FAA0F;QAC1F,iEAAiE;QACjE,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC7E,kBAAkB,CACrB,CAAA;QAED,UAAU,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;QAC/B,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAExE,MAAM,OAAO,CAAC,UAAU,CAAC;YACrB,MAAM;YACN,IAAI;YACJ,QAAQ;YACR,OAAO;YACP,KAAK;YACL,OAAO;YACP,UAAU;YACV,YAAY;YACZ,WAAW;SACd,CAAC,CAAA;QAEF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAA;QACrF,UAAU,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}