@doist/twist-cli 2.24.1 → 2.26.0

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 (41) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/commands/channel.d.ts.map +1 -1
  3. package/dist/commands/channel.js +142 -20
  4. package/dist/commands/channel.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +9 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +325 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/update/action.d.ts +0 -1
  10. package/dist/commands/update/action.d.ts.map +1 -1
  11. package/dist/commands/update/action.js +5 -39
  12. package/dist/commands/update/action.js.map +1 -1
  13. package/dist/index.js +7 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/lib/api.d.ts +1 -0
  16. package/dist/lib/api.d.ts.map +1 -1
  17. package/dist/lib/api.js +6 -2
  18. package/dist/lib/api.js.map +1 -1
  19. package/dist/lib/auth.d.ts +10 -0
  20. package/dist/lib/auth.d.ts.map +1 -1
  21. package/dist/lib/auth.js +45 -0
  22. package/dist/lib/auth.js.map +1 -1
  23. package/dist/lib/config.d.ts +1 -0
  24. package/dist/lib/config.d.ts.map +1 -1
  25. package/dist/lib/config.js +42 -0
  26. package/dist/lib/config.js.map +1 -1
  27. package/dist/lib/errors.d.ts +1 -1
  28. package/dist/lib/errors.d.ts.map +1 -1
  29. package/dist/lib/errors.js.map +1 -1
  30. package/dist/lib/permissions.d.ts.map +1 -1
  31. package/dist/lib/permissions.js +1 -0
  32. package/dist/lib/permissions.js.map +1 -1
  33. package/dist/lib/skills/content.d.ts +1 -1
  34. package/dist/lib/skills/content.d.ts.map +1 -1
  35. package/dist/lib/skills/content.js +15 -1
  36. package/dist/lib/skills/content.js.map +1 -1
  37. package/dist/lib/update.d.ts +17 -0
  38. package/dist/lib/update.d.ts.map +1 -0
  39. package/dist/lib/update.js +49 -0
  40. package/dist/lib/update.js.map +1 -0
  41. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [2.26.0](https://github.com/Doist/twist-cli/compare/v2.25.0...v2.26.0) (2026-04-07)
2
+
3
+ ### Features
4
+
5
+ - add tw doctor command ([#150](https://github.com/Doist/twist-cli/issues/150)) ([0993103](https://github.com/Doist/twist-cli/commit/09931034c8aea01799e14ccbf5500169b48563dc))
6
+
7
+ ## [2.25.0](https://github.com/Doist/twist-cli/compare/v2.24.1...v2.25.0) (2026-04-07)
8
+
9
+ ### Features
10
+
11
+ - add channel discovery and archive filters ([#151](https://github.com/Doist/twist-cli/issues/151)) ([3d89761](https://github.com/Doist/twist-cli/commit/3d897616104351b24d8c193025436638794d53ef))
12
+
1
13
  ## [2.24.1](https://github.com/Doist/twist-cli/compare/v2.24.0...v2.24.1) (2026-04-07)
2
14
 
3
15
  ### Bug Fixes
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8DnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiB7D"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8MnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwC7D"}
@@ -3,57 +3,179 @@ import { CliError } from '../lib/errors.js';
3
3
  import { includePrivateChannels } from '../lib/global-args.js';
4
4
  import { colors, formatJson, formatNdjson } from '../lib/output.js';
5
5
  import { resolveWorkspaceRef } from '../lib/refs.js';
6
- async function listChannels(workspaceRef, options) {
6
+ const CHANNEL_SCOPES = ['joined', 'public', 'discoverable'];
7
+ const CHANNEL_STATES = ['active', 'all', 'archived'];
8
+ function parseChannelScope(scope) {
9
+ const resolved = scope ?? 'joined';
10
+ if (CHANNEL_SCOPES.includes(resolved)) {
11
+ return resolved;
12
+ }
13
+ throw new CliError('INVALID_SCOPE', `Invalid channel scope: ${resolved}. Use one of: ${CHANNEL_SCOPES.join(', ')}.`);
14
+ }
15
+ function parseChannelState(state) {
16
+ const resolved = state ?? 'active';
17
+ if (CHANNEL_STATES.includes(resolved)) {
18
+ return resolved;
19
+ }
20
+ throw new CliError('INVALID_STATE', `Invalid channel state: ${resolved}. Use one of: ${CHANNEL_STATES.join(', ')}.`);
21
+ }
22
+ function summarizeChannel(channel) {
23
+ return {
24
+ id: channel.id,
25
+ name: channel.name,
26
+ workspaceId: channel.workspaceId,
27
+ archived: channel.archived,
28
+ ...(channel.joined !== undefined ? { joined: channel.joined } : {}),
29
+ };
30
+ }
31
+ function formatListedChannelsJson(channels, _scope, full = false) {
32
+ if (full) {
33
+ return formatJson(channels, 'channel', true);
34
+ }
35
+ return JSON.stringify(channels.map(summarizeChannel), null, 2);
36
+ }
37
+ function formatListedChannelsNdjson(channels, _scope, full = false) {
38
+ if (full) {
39
+ return formatNdjson(channels, 'channel', true);
40
+ }
41
+ return channels.map((channel) => JSON.stringify(summarizeChannel(channel))).join('\n');
42
+ }
43
+ function matchesChannelState(channel, state) {
44
+ switch (state) {
45
+ case 'active':
46
+ return !channel.archived;
47
+ case 'all':
48
+ return true;
49
+ case 'archived':
50
+ return channel.archived;
51
+ }
52
+ }
53
+ function getStateLabel(state) {
54
+ switch (state) {
55
+ case 'active':
56
+ return 'active ';
57
+ case 'all':
58
+ return '';
59
+ case 'archived':
60
+ return 'archived ';
61
+ }
62
+ }
63
+ function getEmptyStateMessage(scope, state) {
64
+ const stateLabel = getStateLabel(state);
65
+ switch (scope) {
66
+ case 'joined':
67
+ return `No ${stateLabel}channels found.`;
68
+ case 'public':
69
+ return `No ${stateLabel}public channels found.`;
70
+ case 'discoverable':
71
+ return `No ${stateLabel}discoverable channels found.`;
72
+ }
73
+ }
74
+ async function getWorkspaceId(workspaceRef, options) {
7
75
  if (workspaceRef && options.workspace) {
8
76
  throw new CliError('CONFLICTING_OPTIONS', 'Cannot specify workspace both as argument and --workspace flag');
9
77
  }
10
- let workspaceId;
11
78
  const ref = workspaceRef || options.workspace;
12
79
  if (ref) {
13
80
  const workspace = await resolveWorkspaceRef(ref);
14
- workspaceId = workspace.id;
15
- }
16
- else {
17
- workspaceId = await getCurrentWorkspaceId();
81
+ return workspace.id;
18
82
  }
83
+ return getCurrentWorkspaceId();
84
+ }
85
+ function formatChannelLine(channel, scope) {
86
+ const id = colors.timestamp(`id:${channel.id}`);
87
+ const name = colors.channel(channel.name);
88
+ const archived = channel.archived ? colors.timestamp(' (archived)') : '';
89
+ const visibility = channel.public ? '' : colors.timestamp(' [private]');
90
+ const membership = scope === 'public' && channel.joined !== undefined
91
+ ? channel.joined
92
+ ? colors.timestamp(' [joined]')
93
+ : colors.timestamp(' [not joined]')
94
+ : '';
95
+ return `${id} ${name}${visibility}${membership}${archived}`;
96
+ }
97
+ async function listChannels(workspaceRef, options) {
98
+ const scope = parseChannelScope(options.scope);
99
+ const state = parseChannelState(options.state);
100
+ const workspaceId = await getWorkspaceId(workspaceRef, options);
19
101
  const client = await getTwistClient();
20
- let channels = await client.channels.getChannels({ workspaceId });
21
- if (!includePrivateChannels()) {
22
- channels = channels.filter((ch) => ch.public);
102
+ let channels;
103
+ if (scope === 'joined') {
104
+ switch (state) {
105
+ case 'active':
106
+ channels = await client.channels.getChannels({ workspaceId, archived: false });
107
+ break;
108
+ case 'all':
109
+ channels = await client.channels.getChannels({ workspaceId });
110
+ break;
111
+ case 'archived':
112
+ channels = await client.channels.getChannels({ workspaceId, archived: true });
113
+ break;
114
+ }
115
+ if (!includePrivateChannels()) {
116
+ channels = channels.filter((channel) => channel.public);
117
+ }
118
+ }
119
+ else {
120
+ const [joinedChannels, publicChannels] = await Promise.all([
121
+ client.channels.getChannels({ workspaceId }),
122
+ client.workspaces.getPublicChannels(workspaceId),
123
+ ]);
124
+ const joinedIds = new Set(joinedChannels.map((channel) => channel.id));
125
+ channels = publicChannels
126
+ .filter((channel) => matchesChannelState(channel, state))
127
+ .filter((channel) => scope === 'public' || !joinedIds.has(channel.id))
128
+ .map((channel) => ({
129
+ ...channel,
130
+ joined: joinedIds.has(channel.id),
131
+ }));
23
132
  }
24
133
  if (options.json) {
25
- console.log(formatJson(channels, 'channel', options.full));
134
+ console.log(formatListedChannelsJson(channels, scope, options.full));
26
135
  return;
27
136
  }
28
137
  if (options.ndjson) {
29
- console.log(formatNdjson(channels, 'channel', options.full));
138
+ console.log(formatListedChannelsNdjson(channels, scope, options.full));
30
139
  return;
31
140
  }
32
141
  if (channels.length === 0) {
33
- console.log('No channels found.');
142
+ console.log(getEmptyStateMessage(scope, state));
34
143
  return;
35
144
  }
36
- for (const ch of channels) {
37
- const id = colors.timestamp(`id:${ch.id}`);
38
- const name = colors.channel(ch.name);
39
- const archived = ch.archived ? colors.timestamp(' (archived)') : '';
40
- const visibility = ch.public ? '' : colors.timestamp(' [private]');
41
- console.log(`${id} ${name}${visibility}${archived}`);
145
+ for (const channel of channels) {
146
+ console.log(formatChannelLine(channel, scope));
42
147
  }
43
148
  }
44
149
  export function registerChannelCommand(program) {
45
150
  program
46
151
  .command('channels [workspace-ref]')
47
- .description('List channels in a workspace')
152
+ .description('List joined channels or discoverable public channels in a workspace')
48
153
  .option('--workspace <ref>', 'Workspace ID or name')
154
+ .option('--scope <scope>', 'Channel set to list: joined, public, or discoverable (default: joined)')
155
+ .option('--state <state>', 'Channel state to list: active, all, or archived (default: active)')
49
156
  .option('--json', 'Output as JSON')
50
157
  .option('--ndjson', 'Output as newline-delimited JSON')
51
158
  .option('--full', 'Include all fields in JSON output')
52
159
  .addHelpText('after', `
53
160
  Examples:
54
161
  tw channels
162
+ tw channels --state all
163
+ tw channels --scope discoverable
164
+ tw channels --scope public --state archived
165
+ tw channels --scope public --state all --json
55
166
  tw channels --json
56
- tw channels "My Workspace" --json`)
167
+ tw channels "My Workspace" --scope discoverable --json
168
+
169
+ Notes:
170
+ Defaults to active channels that you have joined.
171
+ joined Channels you have joined (private channels require --include-private-channels)
172
+ public Public channels visible in the workspace, whether joined or not
173
+ discoverable Public channels visible in the workspace that you have not joined
174
+ active Non-archived channels only
175
+ all Both active and archived channels
176
+ archived Archived channels only
177
+
178
+ Twist does not expose unjoined private channels, so public/discoverable scopes never include them.`)
57
179
  .action(listChannels);
58
180
  }
59
181
  //# sourceMappingURL=channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Command } from 'commander';
2
+ interface DoctorOptions {
3
+ json?: boolean;
4
+ offline?: boolean;
5
+ }
6
+ export declare function doctorAction(options: DoctorOptions): Promise<void>;
7
+ export declare function registerDoctorCommand(program: Command): void;
8
+ export {};
9
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgBxC,UAAU,aAAa;IACnB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AAgWD,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBxE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO5D"}
@@ -0,0 +1,325 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import chalk from 'chalk';
3
+ import pkg from '../../package.json' with { type: 'json' };
4
+ import { createWrappedTwistClient } from '../lib/api.js';
5
+ import { NoTokenError, TOKEN_ENV_VAR, probeApiToken } from '../lib/auth.js';
6
+ import { getConfigPath, validateConfigForDoctor } from '../lib/config.js';
7
+ import { formatJson } from '../lib/output.js';
8
+ import { compareVersions, fetchLatestVersion, getConfiguredUpdateChannel, isNewer, parseVersion, } from '../lib/update.js';
9
+ function summarize(checks) {
10
+ return checks.reduce((summary, check) => {
11
+ if (check.status === 'pass')
12
+ summary.passed += 1;
13
+ if (check.status === 'warn')
14
+ summary.warned += 1;
15
+ if (check.status === 'fail')
16
+ summary.failed += 1;
17
+ if (check.status === 'skip')
18
+ summary.skipped += 1;
19
+ return summary;
20
+ }, { passed: 0, warned: 0, failed: 0, skipped: 0 });
21
+ }
22
+ function buildSummaryLine(summary) {
23
+ const parts = [`${summary.passed} passed`];
24
+ if (summary.warned > 0)
25
+ parts.push(`${summary.warned} warning${summary.warned === 1 ? '' : 's'}`);
26
+ if (summary.failed > 0)
27
+ parts.push(`${summary.failed} failed`);
28
+ if (summary.skipped > 0)
29
+ parts.push(`${summary.skipped} skipped`);
30
+ return parts.join(', ');
31
+ }
32
+ function formatStatus(status) {
33
+ switch (status) {
34
+ case 'pass':
35
+ return chalk.green('PASS');
36
+ case 'warn':
37
+ return chalk.yellow('WARN');
38
+ case 'fail':
39
+ return chalk.red('FAIL');
40
+ case 'skip':
41
+ return chalk.gray('SKIP');
42
+ default:
43
+ return status;
44
+ }
45
+ }
46
+ function nextCaretUpperBound(version) {
47
+ const parsed = parseVersion(version);
48
+ if (parsed.major > 0) {
49
+ return `${parsed.major + 1}.0.0`;
50
+ }
51
+ if (parsed.minor > 0) {
52
+ return `0.${parsed.minor + 1}.0`;
53
+ }
54
+ return `0.0.${parsed.patch + 1}`;
55
+ }
56
+ function satisfiesComparator(currentVersion, comparator) {
57
+ const trimmed = comparator.trim();
58
+ if (!trimmed)
59
+ return true;
60
+ if (trimmed.startsWith('>=')) {
61
+ return compareVersions(currentVersion, trimmed.slice(2).trim()) >= 0;
62
+ }
63
+ if (trimmed.startsWith('^')) {
64
+ const baseVersion = trimmed.slice(1).trim();
65
+ return (compareVersions(currentVersion, baseVersion) >= 0 &&
66
+ compareVersions(currentVersion, nextCaretUpperBound(baseVersion)) < 0);
67
+ }
68
+ if (/^v?\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?$/.test(trimmed)) {
69
+ return compareVersions(currentVersion, trimmed) === 0;
70
+ }
71
+ return null;
72
+ }
73
+ function satisfiesVersionRange(currentVersion, range) {
74
+ const clauses = range
75
+ .split('||')
76
+ .map((clause) => clause.trim())
77
+ .filter(Boolean);
78
+ let sawUnsupportedSyntax = false;
79
+ for (const clause of clauses) {
80
+ let clauseMatches = true;
81
+ for (const comparator of clause.split(/\s+/).filter(Boolean)) {
82
+ const result = satisfiesComparator(currentVersion, comparator);
83
+ if (result === null) {
84
+ sawUnsupportedSyntax = true;
85
+ clauseMatches = false;
86
+ break;
87
+ }
88
+ if (!result) {
89
+ clauseMatches = false;
90
+ break;
91
+ }
92
+ }
93
+ if (clauseMatches) {
94
+ return true;
95
+ }
96
+ }
97
+ return sawUnsupportedSyntax ? null : false;
98
+ }
99
+ function isNoTokenError(error) {
100
+ return (error instanceof NoTokenError ||
101
+ (error instanceof Error && error.message.includes('No API token found')));
102
+ }
103
+ function describeAuthSource(source) {
104
+ switch (source) {
105
+ case 'env':
106
+ return 'environment variable';
107
+ case 'config-file':
108
+ return 'plaintext config fallback';
109
+ case 'secure-store':
110
+ return 'secure-store';
111
+ default:
112
+ return source;
113
+ }
114
+ }
115
+ function checkNodeVersion() {
116
+ const requiredVersion = pkg.engines?.node;
117
+ if (typeof requiredVersion !== 'string' || !requiredVersion.trim()) {
118
+ return {
119
+ name: 'node',
120
+ status: 'warn',
121
+ message: 'Could not verify Node.js version because package.json has no engines.node range',
122
+ details: { currentVersion: process.version },
123
+ };
124
+ }
125
+ const currentVersion = process.version;
126
+ const isSupported = satisfiesVersionRange(currentVersion, requiredVersion);
127
+ if (isSupported === true) {
128
+ return null;
129
+ }
130
+ if (isSupported === null) {
131
+ return {
132
+ name: 'node',
133
+ status: 'warn',
134
+ message: `Could not verify Node.js version against unsupported engine range "${requiredVersion}"`,
135
+ details: { currentVersion, requiredVersion },
136
+ };
137
+ }
138
+ return {
139
+ name: 'node',
140
+ status: 'fail',
141
+ message: `Node.js ${currentVersion} does not satisfy ${requiredVersion}`,
142
+ details: { currentVersion, requiredVersion },
143
+ };
144
+ }
145
+ async function checkConfigFile() {
146
+ const configPath = getConfigPath();
147
+ try {
148
+ const content = await readFile(configPath, 'utf-8');
149
+ const parsed = JSON.parse(content);
150
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
151
+ return {
152
+ name: 'config',
153
+ status: 'fail',
154
+ message: `Config file must contain a JSON object (${configPath})`,
155
+ details: { path: configPath },
156
+ };
157
+ }
158
+ const issues = validateConfigForDoctor(parsed);
159
+ return {
160
+ name: 'config',
161
+ status: issues.length > 0 ? 'warn' : 'pass',
162
+ message: issues.length > 0
163
+ ? `Config file is readable but ${issues.join('; ')} (${configPath})`
164
+ : `Config file is readable (${configPath})`,
165
+ details: { path: configPath, exists: true, issues },
166
+ };
167
+ }
168
+ catch (error) {
169
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
170
+ return null;
171
+ }
172
+ const message = error instanceof Error ? error.message : String(error);
173
+ return {
174
+ name: 'config',
175
+ status: 'fail',
176
+ message: `Could not read config file ${configPath}: ${message}`,
177
+ details: { path: configPath },
178
+ };
179
+ }
180
+ }
181
+ async function checkAuthentication(offline) {
182
+ let token;
183
+ let metadata;
184
+ try {
185
+ const probe = await probeApiToken();
186
+ token = probe.token;
187
+ metadata = probe.metadata;
188
+ }
189
+ catch (error) {
190
+ if (isNoTokenError(error)) {
191
+ return {
192
+ name: 'auth',
193
+ status: 'warn',
194
+ message: `No Twist credentials found. Set ${TOKEN_ENV_VAR} or run \`tw auth login\``,
195
+ };
196
+ }
197
+ const message = error instanceof Error ? error.message : String(error);
198
+ return {
199
+ name: 'auth',
200
+ status: 'fail',
201
+ message: `Could not load saved credentials: ${message}`,
202
+ };
203
+ }
204
+ const details = {
205
+ source: metadata.source,
206
+ authMode: metadata.authMode,
207
+ };
208
+ if (metadata.authScope)
209
+ details.authScope = metadata.authScope;
210
+ if (offline) {
211
+ return {
212
+ name: 'auth',
213
+ status: metadata.source === 'config-file' ? 'warn' : 'skip',
214
+ message: metadata.source === 'config-file'
215
+ ? 'Token found in plaintext config fallback; skipped API validation (--offline)'
216
+ : `Auth validation skipped (--offline); credentials found via ${describeAuthSource(metadata.source)}`,
217
+ details,
218
+ };
219
+ }
220
+ try {
221
+ const api = createWrappedTwistClient(token);
222
+ const user = await api.users.getSessionUser();
223
+ details.email = user.email;
224
+ details.name = user.name;
225
+ return {
226
+ name: 'auth',
227
+ status: metadata.source === 'config-file' ? 'warn' : 'pass',
228
+ message: metadata.source === 'config-file'
229
+ ? `Authenticated as ${user.email}, but token is stored in plaintext config fallback`
230
+ : `Authenticated as ${user.email} via ${describeAuthSource(metadata.source)}`,
231
+ details,
232
+ };
233
+ }
234
+ catch (error) {
235
+ const message = error instanceof Error ? error.message : String(error);
236
+ return {
237
+ name: 'auth',
238
+ status: 'fail',
239
+ message: `Stored credentials failed validation: ${message}`,
240
+ details,
241
+ };
242
+ }
243
+ }
244
+ async function checkForUpdates(offline) {
245
+ const currentVersion = pkg.version;
246
+ const channel = await getConfiguredUpdateChannel();
247
+ if (offline) {
248
+ return {
249
+ name: 'update',
250
+ status: 'skip',
251
+ message: `Skipped npm registry check (--offline); current version is v${currentVersion}`,
252
+ details: { currentVersion, channel },
253
+ };
254
+ }
255
+ try {
256
+ const latestVersion = await fetchLatestVersion(channel);
257
+ if (isNewer(currentVersion, latestVersion)) {
258
+ return {
259
+ name: 'update',
260
+ status: 'warn',
261
+ message: `Update available on ${channel}: v${currentVersion} -> v${latestVersion}`,
262
+ details: { currentVersion, latestVersion, channel },
263
+ };
264
+ }
265
+ if (currentVersion === latestVersion) {
266
+ return {
267
+ name: 'update',
268
+ status: 'pass',
269
+ message: `CLI is up to date on ${channel} (v${currentVersion})`,
270
+ details: { currentVersion, latestVersion, channel },
271
+ };
272
+ }
273
+ return {
274
+ name: 'update',
275
+ status: 'pass',
276
+ message: `CLI version v${currentVersion} is ahead of ${channel} tag v${latestVersion}`,
277
+ details: { currentVersion, latestVersion, channel },
278
+ };
279
+ }
280
+ catch (error) {
281
+ const message = error instanceof Error ? error.message : String(error);
282
+ return {
283
+ name: 'update',
284
+ status: 'warn',
285
+ message: `Could not check npm registry for updates: ${message}`,
286
+ details: { currentVersion, channel },
287
+ };
288
+ }
289
+ }
290
+ async function runDoctorChecks(options) {
291
+ const checks = await Promise.all([
292
+ checkNodeVersion(),
293
+ checkConfigFile(),
294
+ checkAuthentication(Boolean(options.offline)),
295
+ checkForUpdates(Boolean(options.offline)),
296
+ ]);
297
+ return checks.filter((check) => check !== null);
298
+ }
299
+ export async function doctorAction(options) {
300
+ const checks = await runDoctorChecks(options);
301
+ const summary = summarize(checks);
302
+ const ok = summary.failed === 0;
303
+ if (options.json) {
304
+ console.log(formatJson({ ok, summary, checks }));
305
+ }
306
+ else {
307
+ for (const check of checks) {
308
+ console.log(`${formatStatus(check.status)} ${check.message}`);
309
+ }
310
+ const label = ok ? chalk.green('Doctor summary:') : chalk.red('Doctor summary:');
311
+ console.log(`${label} ${buildSummaryLine(summary)}`);
312
+ }
313
+ if (!ok) {
314
+ process.exitCode = 1;
315
+ }
316
+ }
317
+ export function registerDoctorCommand(program) {
318
+ program
319
+ .command('doctor')
320
+ .description('Diagnose common CLI setup and environment issues')
321
+ .option('--json', 'Output diagnostic results as JSON')
322
+ .option('--offline', 'Skip network checks against Twist and npm')
323
+ .action(doctorAction);
324
+ }
325
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- export declare function fetchLatestVersion(tag: string): Promise<string>;
2
1
  export declare function detectPackageManager(): string;
3
2
  export declare function runInstall(pm: string, tag: string): Promise<{
4
3
  exitCode: number;
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"AAmCA,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQrE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAejG;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGxE"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"AAaA,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAejG;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGxE"}