@doist/twist-cli 2.21.1 → 2.21.2
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.
- package/CHANGELOG.md +6 -0
- package/dist/__mocks__/chalk.d.ts +3 -0
- package/dist/__mocks__/chalk.d.ts.map +1 -0
- package/dist/__mocks__/chalk.js +8 -0
- package/dist/__mocks__/chalk.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +155 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/away.d.ts +3 -0
- package/dist/commands/away.d.ts.map +1 -0
- package/dist/commands/away.js +120 -0
- package/dist/commands/away.js.map +1 -0
- package/dist/commands/changelog.d.ts +8 -0
- package/dist/commands/changelog.d.ts.map +1 -0
- package/dist/commands/changelog.js +113 -0
- package/dist/commands/changelog.js.map +1 -0
- package/dist/commands/channel.d.ts +3 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +53 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/comment.d.ts +3 -0
- package/dist/commands/comment.d.ts.map +1 -0
- package/dist/commands/comment.js +99 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +121 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/conversation.d.ts +3 -0
- package/dist/commands/conversation.d.ts.map +1 -0
- package/dist/commands/conversation.js +458 -0
- package/dist/commands/conversation.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +127 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/msg.d.ts +3 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +103 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/react.d.ts +3 -0
- package/dist/commands/react.d.ts.map +1 -0
- package/dist/commands/react.js +102 -0
- package/dist/commands/react.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +160 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +119 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/thread/create.d.ts +7 -0
- package/dist/commands/thread/create.d.ts.map +1 -0
- package/dist/commands/thread/create.js +45 -0
- package/dist/commands/thread/create.js.map +1 -0
- package/dist/commands/thread/helpers.d.ts +10 -0
- package/dist/commands/thread/helpers.d.ts.map +1 -0
- package/dist/commands/thread/helpers.js +27 -0
- package/dist/commands/thread/helpers.js.map +1 -0
- package/dist/commands/thread/mutate.d.ts +5 -0
- package/dist/commands/thread/mutate.d.ts.map +1 -0
- package/dist/commands/thread/mutate.js +21 -0
- package/dist/commands/thread/mutate.js.map +1 -0
- package/dist/commands/thread/mute.d.ts +8 -0
- package/dist/commands/thread/mute.d.ts.map +1 -0
- package/dist/commands/thread/mute.js +58 -0
- package/dist/commands/thread/mute.js.map +1 -0
- package/dist/commands/thread/reply.d.ts +9 -0
- package/dist/commands/thread/reply.d.ts.map +1 -0
- package/dist/commands/thread/reply.js +68 -0
- package/dist/commands/thread/reply.js.map +1 -0
- package/dist/commands/thread/view.d.ts +9 -0
- package/dist/commands/thread/view.d.ts.map +1 -0
- package/dist/commands/thread/view.js +175 -0
- package/dist/commands/thread/view.js.map +1 -0
- package/dist/commands/thread.d.ts +3 -0
- package/dist/commands/thread.d.ts.map +1 -0
- package/dist/commands/thread.js +70 -0
- package/dist/commands/thread.js.map +1 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +91 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +3 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +67 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/view.d.ts +3 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +63 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +48 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +20 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +229 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +21 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +189 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/completion.d.ts +31 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +173 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/config.d.ts +13 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +26 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dates.d.ts +3 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +44 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/input.d.ts +3 -0
- package/dist/lib/input.d.ts.map +1 -0
- package/dist/lib/input.js +52 -0
- package/dist/lib/input.js.map +1 -0
- package/dist/lib/markdown.d.ts +2 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +16 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/oauth-server.d.ts +13 -0
- package/dist/lib/oauth-server.d.ts.map +1 -0
- package/dist/lib/oauth-server.js +824 -0
- package/dist/lib/oauth-server.js.map +1 -0
- package/dist/lib/oauth.d.ts +31 -0
- package/dist/lib/oauth.d.ts.map +1 -0
- package/dist/lib/oauth.js +140 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/options.d.ts +17 -0
- package/dist/lib/options.d.ts.map +1 -0
- package/dist/lib/options.js +2 -0
- package/dist/lib/options.js.map +1 -0
- package/dist/lib/output.d.ts +25 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +128 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/permissions.d.ts +4 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +35 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/lib/pkce.d.ts +16 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +35 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/lib/progress.d.ts +29 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +101 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/public-channels.d.ts +5 -0
- package/dist/lib/public-channels.d.ts.map +1 -0
- package/dist/lib/public-channels.js +35 -0
- package/dist/lib/public-channels.js.map +1 -0
- package/dist/lib/refs.d.ts +37 -0
- package/dist/lib/refs.d.ts.map +1 -0
- package/dist/lib/refs.js +219 -0
- package/dist/lib/refs.js.map +1 -0
- package/dist/lib/search-api.d.ts +25 -0
- package/dist/lib/search-api.d.ts.map +1 -0
- package/dist/lib/search-api.js +85 -0
- package/dist/lib/search-api.js.map +1 -0
- package/dist/lib/secure-store.d.ts +11 -0
- package/dist/lib/secure-store.d.ts.map +1 -0
- package/dist/lib/secure-store.js +57 -0
- package/dist/lib/secure-store.js.map +1 -0
- package/dist/lib/skills/content.d.ts +5 -0
- package/dist/lib/skills/content.d.ts.map +1 -0
- package/dist/lib/skills/content.js +286 -0
- package/dist/lib/skills/content.js.map +1 -0
- package/dist/lib/skills/create-installer.d.ts +9 -0
- package/dist/lib/skills/create-installer.d.ts.map +1 -0
- package/dist/lib/skills/create-installer.js +60 -0
- package/dist/lib/skills/create-installer.js.map +1 -0
- package/dist/lib/skills/index.d.ts +7 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/index.js +54 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/types.d.ts +30 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/dist/lib/skills/types.js +2 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/skills/update-installed.d.ts +9 -0
- package/dist/lib/skills/update-installed.d.ts.map +1 -0
- package/dist/lib/skills/update-installed.js +20 -0
- package/dist/lib/skills/update-installed.js.map +1 -0
- package/dist/lib/spinner.d.ts +24 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +126 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/postinstall.d.ts +2 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +3 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import pkg from '../../package.json' with { type: 'json' };
|
|
4
|
+
import { withSpinner } from '../lib/spinner.js';
|
|
5
|
+
const PACKAGE_NAME = '@doist/twist-cli';
|
|
6
|
+
const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
7
|
+
export async function fetchLatestVersion() {
|
|
8
|
+
const response = await fetch(REGISTRY_URL);
|
|
9
|
+
if (!response.ok) {
|
|
10
|
+
throw new Error(`Registry returned ${response.status}`);
|
|
11
|
+
}
|
|
12
|
+
const data = (await response.json());
|
|
13
|
+
return data.version;
|
|
14
|
+
}
|
|
15
|
+
export function detectPackageManager() {
|
|
16
|
+
const execPath = process.env.npm_execpath ?? '';
|
|
17
|
+
if (execPath.includes('pnpm')) {
|
|
18
|
+
return 'pnpm';
|
|
19
|
+
}
|
|
20
|
+
return 'npm';
|
|
21
|
+
}
|
|
22
|
+
export function runInstall(pm) {
|
|
23
|
+
const command = pm === 'pnpm' ? 'add' : 'install';
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const child = spawn(pm, [command, '-g', `${PACKAGE_NAME}@latest`], {
|
|
26
|
+
stdio: 'pipe',
|
|
27
|
+
});
|
|
28
|
+
let stderr = '';
|
|
29
|
+
child.stderr?.on('data', (data) => {
|
|
30
|
+
stderr += data.toString();
|
|
31
|
+
});
|
|
32
|
+
child.on('error', reject);
|
|
33
|
+
child.on('close', (code) => resolve({ exitCode: code ?? 1, stderr }));
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function updateAction(options) {
|
|
37
|
+
const currentVersion = pkg.version;
|
|
38
|
+
let latestVersion;
|
|
39
|
+
try {
|
|
40
|
+
latestVersion = await withSpinner({ text: 'Checking for updates...' }, fetchLatestVersion);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
44
|
+
console.error(chalk.red('Failed to check for updates:'), message);
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (currentVersion === latestVersion) {
|
|
49
|
+
console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
|
|
53
|
+
if (options.check) {
|
|
54
|
+
console.log(chalk.dim('Run `tw update` to install'));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const pm = detectPackageManager();
|
|
58
|
+
let result;
|
|
59
|
+
try {
|
|
60
|
+
result = await withSpinner({ text: `Updating to v${latestVersion}...`, color: 'blue' }, () => runInstall(pm));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error instanceof Error && 'code' in error && error.code === 'EACCES') {
|
|
64
|
+
console.error(chalk.red('Permission denied.'), `Try running with sudo: sudo ${pm} ${pm === 'pnpm' ? 'add' : 'install'} -g ${PACKAGE_NAME}@latest`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
68
|
+
console.error(chalk.red('Update failed:'), message);
|
|
69
|
+
}
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (result.exitCode !== 0) {
|
|
74
|
+
console.error(chalk.red('Update failed:'), `${pm} exited with code ${result.exitCode}`);
|
|
75
|
+
if (result.stderr) {
|
|
76
|
+
console.error(chalk.dim(result.stderr.trim()));
|
|
77
|
+
}
|
|
78
|
+
process.exitCode = 1;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
console.log(chalk.green('✓'), `Updated to v${latestVersion}`);
|
|
82
|
+
console.log(chalk.dim(' Run'), chalk.cyan('tw changelog'), chalk.dim('to see what changed'));
|
|
83
|
+
}
|
|
84
|
+
export function registerUpdateCommand(program) {
|
|
85
|
+
program
|
|
86
|
+
.command('update')
|
|
87
|
+
.description('Update the CLI to the latest version')
|
|
88
|
+
.option('--check', 'Check for updates without installing')
|
|
89
|
+
.action(updateAction);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsEnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAY1D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getCurrentWorkspaceId, getSessionUser, getWorkspaceUsers } from '../lib/api.js';
|
|
3
|
+
import { colors, formatJson, formatNdjson } from '../lib/output.js';
|
|
4
|
+
import { resolveWorkspaceRef } from '../lib/refs.js';
|
|
5
|
+
async function showCurrentUser() {
|
|
6
|
+
const user = await getSessionUser();
|
|
7
|
+
console.log(chalk.bold(user.name));
|
|
8
|
+
console.log('');
|
|
9
|
+
console.log(`ID: ${user.id}`);
|
|
10
|
+
console.log(`Email: ${user.email}`);
|
|
11
|
+
console.log(`Timezone: ${user.timezone}`);
|
|
12
|
+
if (user.defaultWorkspace) {
|
|
13
|
+
console.log(`Default: workspace id:${user.defaultWorkspace}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function listUsers(workspaceRef, options) {
|
|
17
|
+
if (workspaceRef && options.workspace) {
|
|
18
|
+
throw new Error('Cannot specify workspace both as argument and --workspace flag');
|
|
19
|
+
}
|
|
20
|
+
let workspaceId;
|
|
21
|
+
const ref = workspaceRef || options.workspace;
|
|
22
|
+
if (ref) {
|
|
23
|
+
const workspace = await resolveWorkspaceRef(ref);
|
|
24
|
+
workspaceId = workspace.id;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
workspaceId = await getCurrentWorkspaceId();
|
|
28
|
+
}
|
|
29
|
+
let users = await getWorkspaceUsers(workspaceId);
|
|
30
|
+
if (options.search) {
|
|
31
|
+
const search = options.search.toLowerCase();
|
|
32
|
+
users = users.filter((u) => u.name.toLowerCase().includes(search) || u.email?.toLowerCase().includes(search));
|
|
33
|
+
}
|
|
34
|
+
if (users.length === 0) {
|
|
35
|
+
console.log('No users found.');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (options.json) {
|
|
39
|
+
console.log(formatJson(users, 'user', options.full));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (options.ndjson) {
|
|
43
|
+
console.log(formatNdjson(users, 'user', options.full));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const u of users) {
|
|
47
|
+
const id = colors.timestamp(`id:${u.id}`);
|
|
48
|
+
const name = u.name;
|
|
49
|
+
const email = u.email ? colors.timestamp(`<${u.email}>`) : '';
|
|
50
|
+
const type = colors.channel(`[${u.userType}]`);
|
|
51
|
+
const bot = u.bot ? chalk.yellow(' [bot]') : '';
|
|
52
|
+
console.log(`${id} ${name} ${email} ${type}${bot}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function registerUserCommand(program) {
|
|
56
|
+
program.command('user').description('Show current user info').action(showCurrentUser);
|
|
57
|
+
program
|
|
58
|
+
.command('users [workspace-ref]')
|
|
59
|
+
.description('List users in a workspace')
|
|
60
|
+
.option('--workspace <ref>', 'Workspace ID or name')
|
|
61
|
+
.option('--search <text>', 'Filter by name/email')
|
|
62
|
+
.option('--json', 'Output as JSON')
|
|
63
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
64
|
+
.option('--full', 'Include all fields in JSON output')
|
|
65
|
+
.action(listUsers);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6BnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4D1D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { classifyTwistUrl } from '../lib/refs.js';
|
|
3
|
+
function looksLikeTwistAppUrl(token) {
|
|
4
|
+
return /^https?:\/\/twist\.com\/a\/\S+/.test(token);
|
|
5
|
+
}
|
|
6
|
+
function extractViewInvocation(parsedUrl) {
|
|
7
|
+
const rawArgs = process.argv;
|
|
8
|
+
const viewIdx = rawArgs.indexOf('view');
|
|
9
|
+
const afterView = viewIdx >= 0 ? rawArgs.slice(viewIdx + 1) : [];
|
|
10
|
+
const passthroughArgs = afterView.filter((arg) => arg !== parsedUrl);
|
|
11
|
+
return { url: parsedUrl, passthroughArgs };
|
|
12
|
+
}
|
|
13
|
+
async function runRoutedCommand(loadRegister, argv) {
|
|
14
|
+
const proxy = new Command();
|
|
15
|
+
proxy.exitOverride();
|
|
16
|
+
const register = await loadRegister();
|
|
17
|
+
register(proxy);
|
|
18
|
+
await proxy.parseAsync(['node', 'tw', ...argv]);
|
|
19
|
+
}
|
|
20
|
+
export function registerViewCommand(program) {
|
|
21
|
+
program
|
|
22
|
+
.command('view <url> [args...]')
|
|
23
|
+
.description('View any Twist entity by URL')
|
|
24
|
+
.allowUnknownOption(true)
|
|
25
|
+
.addHelpText('after', `
|
|
26
|
+
Route mapping:
|
|
27
|
+
Message URL → tw msg view <url>
|
|
28
|
+
Conversation URL → tw conversation view <url>
|
|
29
|
+
Comment URL → tw thread view <url> (comment ID extracted from URL)
|
|
30
|
+
Thread URL → tw thread view <url>
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
tw view https://twist.com/a/1585/ch/100/t/200
|
|
34
|
+
tw view https://twist.com/a/1585/ch/100/t/200/c/300
|
|
35
|
+
tw view https://twist.com/a/1585/msg/400
|
|
36
|
+
tw view https://twist.com/a/1585/msg/400/m/500
|
|
37
|
+
tw view https://twist.com/a/1585/msg/400/m/500 --json`)
|
|
38
|
+
.action(async (url) => {
|
|
39
|
+
if (!looksLikeTwistAppUrl(url)) {
|
|
40
|
+
throw new Error(`Not a recognized Twist URL: ${url}`);
|
|
41
|
+
}
|
|
42
|
+
const { url: resolvedUrl, passthroughArgs } = extractViewInvocation(url);
|
|
43
|
+
const route = classifyTwistUrl(resolvedUrl);
|
|
44
|
+
if (!route) {
|
|
45
|
+
throw new Error(`Not a recognized Twist URL: ${resolvedUrl}`);
|
|
46
|
+
}
|
|
47
|
+
switch (route.entityType) {
|
|
48
|
+
case 'thread':
|
|
49
|
+
await runRoutedCommand(async () => (await import('./thread.js')).registerThreadCommand, ['thread', 'view', resolvedUrl, ...passthroughArgs]);
|
|
50
|
+
break;
|
|
51
|
+
case 'comment':
|
|
52
|
+
await runRoutedCommand(async () => (await import('./thread.js')).registerThreadCommand, ['thread', 'view', resolvedUrl, ...passthroughArgs]);
|
|
53
|
+
break;
|
|
54
|
+
case 'conversation':
|
|
55
|
+
await runRoutedCommand(async () => (await import('./conversation.js')).registerConversationCommand, ['conversation', 'view', resolvedUrl, ...passthroughArgs]);
|
|
56
|
+
break;
|
|
57
|
+
case 'message':
|
|
58
|
+
await runRoutedCommand(async () => (await import('./msg.js')).registerMsgCommand, ['msg', 'view', resolvedUrl, ...passthroughArgs]);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA4CnC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe/D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { fetchWorkspaces, getCurrentWorkspaceId } from '../lib/api.js';
|
|
3
|
+
import { updateConfig } from '../lib/config.js';
|
|
4
|
+
import { colors, formatJson, formatNdjson } from '../lib/output.js';
|
|
5
|
+
import { resolveWorkspaceRef } from '../lib/refs.js';
|
|
6
|
+
async function listWorkspaces(options) {
|
|
7
|
+
const workspaces = await fetchWorkspaces();
|
|
8
|
+
if (workspaces.length === 0) {
|
|
9
|
+
console.log('No workspaces found.');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (options.json) {
|
|
13
|
+
console.log(formatJson(workspaces, 'workspace', options.full));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (options.ndjson) {
|
|
17
|
+
console.log(formatNdjson(workspaces, 'workspace', options.full));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const currentWorkspaceId = await getCurrentWorkspaceId().catch(() => null);
|
|
21
|
+
for (const w of workspaces) {
|
|
22
|
+
const id = colors.timestamp(`id:${w.id}`);
|
|
23
|
+
const name = w.id === currentWorkspaceId ? chalk.bold(w.name) : w.name;
|
|
24
|
+
const current = w.id === currentWorkspaceId ? chalk.green(' (current)') : '';
|
|
25
|
+
const plan = w.plan ? colors.channel(`[${w.plan}]`) : '';
|
|
26
|
+
console.log(`${id} ${name}${current} ${plan}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function useWorkspace(ref) {
|
|
30
|
+
const workspace = await resolveWorkspaceRef(ref);
|
|
31
|
+
await updateConfig({ currentWorkspace: workspace.id });
|
|
32
|
+
console.log(`Switched to workspace: ${workspace.name}`);
|
|
33
|
+
}
|
|
34
|
+
export function registerWorkspaceCommand(program) {
|
|
35
|
+
program
|
|
36
|
+
.command('workspaces')
|
|
37
|
+
.description('List all workspaces')
|
|
38
|
+
.option('--json', 'Output as JSON')
|
|
39
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
40
|
+
.option('--full', 'Include all fields in JSON output')
|
|
41
|
+
.action(listWorkspaces);
|
|
42
|
+
const workspace = program.command('workspace').description('Manage workspace');
|
|
43
|
+
workspace
|
|
44
|
+
.command('use <workspace-ref>')
|
|
45
|
+
.description('Set the current workspace')
|
|
46
|
+
.action(useWorkspace);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { program } from 'commander';
|
|
3
|
+
import pkg from '../package.json' with { type: 'json' };
|
|
4
|
+
import { startEarlySpinner, stopEarlySpinner } from './lib/spinner.js';
|
|
5
|
+
const loadWorkspaceCommand = async () => (await import('./commands/workspace.js')).registerWorkspaceCommand;
|
|
6
|
+
const loadUserCommand = async () => (await import('./commands/user.js')).registerUserCommand;
|
|
7
|
+
const loadChannelCommand = async () => (await import('./commands/channel.js')).registerChannelCommand;
|
|
8
|
+
const loadInboxCommand = async () => (await import('./commands/inbox.js')).registerInboxCommand;
|
|
9
|
+
const loadThreadCommand = async () => (await import('./commands/thread.js')).registerThreadCommand;
|
|
10
|
+
const loadConversationCommand = async () => (await import('./commands/conversation.js')).registerConversationCommand;
|
|
11
|
+
const loadMsgCommand = async () => (await import('./commands/msg.js')).registerMsgCommand;
|
|
12
|
+
const loadCommentCommand = async () => (await import('./commands/comment.js')).registerCommentCommand;
|
|
13
|
+
const loadSearchCommand = async () => (await import('./commands/search.js')).registerSearchCommand;
|
|
14
|
+
const loadReactCommand = async () => (await import('./commands/react.js')).registerReactCommand;
|
|
15
|
+
const loadAuthCommand = async () => (await import('./commands/auth.js')).registerAuthCommand;
|
|
16
|
+
const loadSkillCommand = async () => (await import('./commands/skill.js')).registerSkillCommand;
|
|
17
|
+
const loadViewCommand = async () => (await import('./commands/view.js')).registerViewCommand;
|
|
18
|
+
const loadCompletionCommand = async () => (await import('./commands/completion.js')).registerCompletionCommand;
|
|
19
|
+
const loadAwayCommand = async () => (await import('./commands/away.js')).registerAwayCommand;
|
|
20
|
+
const loadUpdateCommand = async () => (await import('./commands/update.js')).registerUpdateCommand;
|
|
21
|
+
const loadChangelogCommand = async () => (await import('./commands/changelog.js')).registerChangelogCommand;
|
|
22
|
+
const commands = {
|
|
23
|
+
workspaces: ['List all workspaces', loadWorkspaceCommand],
|
|
24
|
+
workspace: ['Manage workspace', loadWorkspaceCommand],
|
|
25
|
+
user: ['Show current user info', loadUserCommand],
|
|
26
|
+
users: ['List users in a workspace', loadUserCommand],
|
|
27
|
+
channels: ['List channels in a workspace', loadChannelCommand],
|
|
28
|
+
inbox: ['Show inbox threads', loadInboxCommand],
|
|
29
|
+
thread: ['Thread operations', loadThreadCommand],
|
|
30
|
+
conversation: ['Conversation (DM/group) operations', loadConversationCommand],
|
|
31
|
+
msg: ['Conversation message operations (view, update, delete)', loadMsgCommand],
|
|
32
|
+
comment: ['Thread comment operations (view, update, delete)', loadCommentCommand],
|
|
33
|
+
search: ['Search content across a workspace', loadSearchCommand],
|
|
34
|
+
away: ['Manage away status', loadAwayCommand],
|
|
35
|
+
react: ['Add an emoji reaction (target-type: thread, comment, message)', loadReactCommand],
|
|
36
|
+
unreact: ['Remove an emoji reaction (target-type: thread, comment, message)', loadReactCommand],
|
|
37
|
+
auth: ['Manage authentication', loadAuthCommand],
|
|
38
|
+
skill: ['Manage agent skill integrations', loadSkillCommand],
|
|
39
|
+
view: ['View a Twist entity by URL', loadViewCommand],
|
|
40
|
+
completion: ['Manage shell completions', loadCompletionCommand],
|
|
41
|
+
update: ['Update the CLI to the latest version', loadUpdateCommand],
|
|
42
|
+
changelog: ['Show recent changelog entries', loadChangelogCommand],
|
|
43
|
+
};
|
|
44
|
+
const commandAliases = {
|
|
45
|
+
convo: 'conversation',
|
|
46
|
+
message: 'msg',
|
|
47
|
+
};
|
|
48
|
+
program
|
|
49
|
+
.name('tw')
|
|
50
|
+
.description('Twist CLI')
|
|
51
|
+
.version(pkg.version)
|
|
52
|
+
.option('--no-spinner', 'Disable loading animations')
|
|
53
|
+
.option('--progress-jsonl [path]', 'Output progress events as JSONL to stderr or file')
|
|
54
|
+
.option('--include-private-channels', 'Include private channels in output (env: TWIST_INCLUDE_PRIVATE_CHANNELS)')
|
|
55
|
+
.option('--accessible', 'Add text labels to color-coded output (also: TW_ACCESSIBLE=1)')
|
|
56
|
+
.addHelpText('after', `
|
|
57
|
+
Note for AI/LLM agents:
|
|
58
|
+
Use --json or --ndjson flags for unambiguous, parseable output.
|
|
59
|
+
Default JSON shows essential fields; use --full for all fields.`);
|
|
60
|
+
// Register lightweight placeholders so --help lists all commands
|
|
61
|
+
for (const [name, [description]] of Object.entries(commands)) {
|
|
62
|
+
const cmd = program.command(name).description(description);
|
|
63
|
+
// Add aliases to placeholder commands so --help shows them
|
|
64
|
+
const alias = Object.entries(commandAliases).find(([, target]) => target === name)?.[0];
|
|
65
|
+
if (alias) {
|
|
66
|
+
cmd.alias(alias);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// completion-server needs the command tree to walk for completions.
|
|
70
|
+
// Only load the completion module + the specific command being completed
|
|
71
|
+
// (extracted from COMP_LINE) to keep startup fast.
|
|
72
|
+
if (process.argv[2] === 'completion-server') {
|
|
73
|
+
const { parseCompLine } = await import('./lib/completion.js');
|
|
74
|
+
const compWords = parseCompLine(process.env.COMP_LINE ?? '');
|
|
75
|
+
const compCmd = compWords.find((w) => !w.startsWith('-') && (w in commands || w in commandAliases));
|
|
76
|
+
const resolvedCompCmd = compCmd ? (commandAliases[compCmd] ?? compCmd) : undefined;
|
|
77
|
+
const completionLoader = commands.completion[1];
|
|
78
|
+
// Build loader set so command aliases that share a module only register once.
|
|
79
|
+
const loadersToRun = resolvedCompCmd
|
|
80
|
+
? [
|
|
81
|
+
completionLoader,
|
|
82
|
+
...(commands[resolvedCompCmd][1] !== completionLoader
|
|
83
|
+
? [commands[resolvedCompCmd][1]]
|
|
84
|
+
: []),
|
|
85
|
+
]
|
|
86
|
+
: [...new Set(Object.values(commands).map(([, loader]) => loader))];
|
|
87
|
+
for (const [name, [, loader]] of Object.entries(commands)) {
|
|
88
|
+
if (!loadersToRun.includes(loader))
|
|
89
|
+
continue;
|
|
90
|
+
const idx = program.commands.findIndex((c) => c.name() === name);
|
|
91
|
+
if (idx !== -1)
|
|
92
|
+
program.commands.splice(idx, 1);
|
|
93
|
+
}
|
|
94
|
+
await Promise.all(loadersToRun.map(async (loader) => {
|
|
95
|
+
const register = await loader();
|
|
96
|
+
register(program);
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Detect which command is being invoked (resolve aliases first)
|
|
101
|
+
const commandArg = process.argv
|
|
102
|
+
.slice(2)
|
|
103
|
+
.find((a) => !a.startsWith('-') && (a in commands || a in commandAliases));
|
|
104
|
+
const commandName = commandArg ? (commandAliases[commandArg] ?? commandArg) : undefined;
|
|
105
|
+
if (commandName && commands[commandName]) {
|
|
106
|
+
const loader = commands[commandName][1];
|
|
107
|
+
// Remove all placeholders that map to the same loader to avoid
|
|
108
|
+
// duplicate command registration from alias entries.
|
|
109
|
+
for (const [name, [, entryLoader]] of Object.entries(commands)) {
|
|
110
|
+
if (entryLoader !== loader)
|
|
111
|
+
continue;
|
|
112
|
+
const idx = program.commands.findIndex((c) => c.name() === name);
|
|
113
|
+
if (idx !== -1)
|
|
114
|
+
program.commands.splice(idx, 1);
|
|
115
|
+
}
|
|
116
|
+
startEarlySpinner();
|
|
117
|
+
try {
|
|
118
|
+
const register = await loader();
|
|
119
|
+
register(program);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
stopEarlySpinner();
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
await program.parseAsync();
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
stopEarlySpinner();
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { TwistApi, type User, type Workspace, type WorkspaceUser } from '@doist/twist-sdk';
|
|
2
|
+
export declare function getTwistClient(): Promise<TwistApi>;
|
|
3
|
+
export declare function fetchWorkspaces(): Promise<Workspace[]>;
|
|
4
|
+
export declare function clearWorkspaceCache(): void;
|
|
5
|
+
export declare function getCurrentWorkspaceId(flagValue?: number): Promise<number>;
|
|
6
|
+
export declare function getSessionUser(): Promise<User>;
|
|
7
|
+
export declare function getWorkspaceUsers(workspaceId: number): Promise<WorkspaceUser[]>;
|
|
8
|
+
export declare function clearUserCache(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Validates a batch response and returns the data, throwing on errors.
|
|
11
|
+
* Also handles the case where the SDK fails to validate the response schema
|
|
12
|
+
* (e.g. when the batch API wraps entities in a key like `{comment: {...}}`).
|
|
13
|
+
* In that case, the raw transformed data is returned — check for expected fields.
|
|
14
|
+
*/
|
|
15
|
+
export declare function assertBatchData<T>(response: {
|
|
16
|
+
code: number;
|
|
17
|
+
data: T;
|
|
18
|
+
}, label: string): T;
|
|
19
|
+
export type { User, Workspace, WorkspaceUser };
|
|
20
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AA4M1F,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,CAOxD;AAKD,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAO5D;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAsB,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/E;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAOpD;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGrF;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAKxF;AAED,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA"}
|