@doist/twist-cli 2.1.0 → 2.3.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.
- package/README.md +20 -8
- package/dist/__tests__/completion.test.d.ts +2 -0
- package/dist/__tests__/completion.test.d.ts.map +1 -0
- package/dist/__tests__/completion.test.js +106 -0
- package/dist/__tests__/completion.test.js.map +1 -0
- package/dist/__tests__/lib/refs.test.js +30 -1
- package/dist/__tests__/lib/refs.test.js.map +1 -1
- package/dist/__tests__/react.test.d.ts +2 -0
- package/dist/__tests__/react.test.d.ts.map +1 -0
- package/dist/__tests__/react.test.js +59 -0
- package/dist/__tests__/react.test.js.map +1 -0
- package/dist/__tests__/search.test.js +50 -7
- package/dist/__tests__/search.test.js.map +1 -1
- package/dist/__tests__/thread.test.js +21 -0
- package/dist/__tests__/thread.test.js.map +1 -1
- package/dist/commands/channel.d.ts.map +1 -1
- package/dist/commands/channel.js.map +1 -1
- 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.map +1 -1
- package/dist/commands/conversation.js.map +1 -1
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/msg.d.ts.map +1 -1
- package/dist/commands/msg.js.map +1 -1
- package/dist/commands/react.d.ts.map +1 -1
- package/dist/commands/react.js +10 -8
- package/dist/commands/react.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +25 -10
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/thread.d.ts.map +1 -1
- package/dist/commands/thread.js +16 -6
- package/dist/commands/thread.js.map +1 -1
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js.map +1 -1
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js.map +1 -1
- package/dist/index.js +83 -65
- package/dist/index.js.map +1 -1
- 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/options.d.ts +15 -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/refs.d.ts +2 -0
- package/dist/lib/refs.d.ts.map +1 -1
- package/dist/lib/refs.js +36 -17
- package/dist/lib/refs.js.map +1 -1
- package/dist/lib/skills/content.d.ts +2 -2
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +19 -8
- package/dist/lib/skills/content.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -2,55 +2,36 @@
|
|
|
2
2
|
import { program } from 'commander';
|
|
3
3
|
import pkg from '../package.json' with { type: 'json' };
|
|
4
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 loadSearchCommand = async () => (await import('./commands/search.js')).registerSearchCommand;
|
|
13
|
+
const loadReactCommand = async () => (await import('./commands/react.js')).registerReactCommand;
|
|
14
|
+
const loadAuthCommand = async () => (await import('./commands/auth.js')).registerAuthCommand;
|
|
15
|
+
const loadSkillCommand = async () => (await import('./commands/skill.js')).registerSkillCommand;
|
|
16
|
+
const loadViewCommand = async () => (await import('./commands/view.js')).registerViewCommand;
|
|
17
|
+
const loadCompletionCommand = async () => (await import('./commands/completion.js')).registerCompletionCommand;
|
|
5
18
|
const commands = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
],
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
],
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
],
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
],
|
|
22
|
-
thread: [
|
|
23
|
-
'Thread operations',
|
|
24
|
-
async () => (await import('./commands/thread.js')).registerThreadCommand,
|
|
25
|
-
],
|
|
26
|
-
conversation: [
|
|
27
|
-
'Conversation (DM/group) operations',
|
|
28
|
-
async () => (await import('./commands/conversation.js')).registerConversationCommand,
|
|
29
|
-
],
|
|
30
|
-
msg: [
|
|
31
|
-
'Conversation message operations (view, update, delete)',
|
|
32
|
-
async () => (await import('./commands/msg.js')).registerMsgCommand,
|
|
33
|
-
],
|
|
34
|
-
search: [
|
|
35
|
-
'Search content across a workspace',
|
|
36
|
-
async () => (await import('./commands/search.js')).registerSearchCommand,
|
|
37
|
-
],
|
|
38
|
-
react: [
|
|
39
|
-
'Add an emoji reaction (target-type: thread, comment, message)',
|
|
40
|
-
async () => (await import('./commands/react.js')).registerReactCommand,
|
|
41
|
-
],
|
|
42
|
-
auth: [
|
|
43
|
-
'Manage authentication',
|
|
44
|
-
async () => (await import('./commands/auth.js')).registerAuthCommand,
|
|
45
|
-
],
|
|
46
|
-
skill: [
|
|
47
|
-
'Manage agent skill integrations',
|
|
48
|
-
async () => (await import('./commands/skill.js')).registerSkillCommand,
|
|
49
|
-
],
|
|
50
|
-
view: [
|
|
51
|
-
'View a Twist entity by URL',
|
|
52
|
-
async () => (await import('./commands/view.js')).registerViewCommand,
|
|
53
|
-
],
|
|
19
|
+
workspaces: ['List all workspaces', loadWorkspaceCommand],
|
|
20
|
+
workspace: ['Manage workspace', loadWorkspaceCommand],
|
|
21
|
+
user: ['Show current user info', loadUserCommand],
|
|
22
|
+
users: ['List users in a workspace', loadUserCommand],
|
|
23
|
+
channels: ['List channels in a workspace', loadChannelCommand],
|
|
24
|
+
inbox: ['Show inbox threads', loadInboxCommand],
|
|
25
|
+
thread: ['Thread operations', loadThreadCommand],
|
|
26
|
+
conversation: ['Conversation (DM/group) operations', loadConversationCommand],
|
|
27
|
+
msg: ['Conversation message operations (view, update, delete)', loadMsgCommand],
|
|
28
|
+
search: ['Search content across a workspace', loadSearchCommand],
|
|
29
|
+
react: ['Add an emoji reaction (target-type: thread, comment, message)', loadReactCommand],
|
|
30
|
+
unreact: ['Remove an emoji reaction (target-type: thread, comment, message)', loadReactCommand],
|
|
31
|
+
auth: ['Manage authentication', loadAuthCommand],
|
|
32
|
+
skill: ['Manage agent skill integrations', loadSkillCommand],
|
|
33
|
+
view: ['View a Twist entity by URL', loadViewCommand],
|
|
34
|
+
completion: ['Manage shell completions', loadCompletionCommand],
|
|
54
35
|
};
|
|
55
36
|
const commandAliases = {
|
|
56
37
|
convo: 'conversation',
|
|
@@ -76,25 +57,62 @@ for (const [name, [description]] of Object.entries(commands)) {
|
|
|
76
57
|
cmd.alias(alias);
|
|
77
58
|
}
|
|
78
59
|
}
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
60
|
+
// completion-server needs the command tree to walk for completions.
|
|
61
|
+
// Only load the completion module + the specific command being completed
|
|
62
|
+
// (extracted from COMP_LINE) to keep startup fast.
|
|
63
|
+
if (process.argv[2] === 'completion-server') {
|
|
64
|
+
const { parseCompLine } = await import('./lib/completion.js');
|
|
65
|
+
const compWords = parseCompLine(process.env.COMP_LINE ?? '');
|
|
66
|
+
const compCmd = compWords.find((w) => !w.startsWith('-') && (w in commands || w in commandAliases));
|
|
67
|
+
const resolvedCompCmd = compCmd ? (commandAliases[compCmd] ?? compCmd) : undefined;
|
|
68
|
+
const completionLoader = commands.completion[1];
|
|
69
|
+
// Build loader set so command aliases that share a module only register once.
|
|
70
|
+
const loadersToRun = resolvedCompCmd
|
|
71
|
+
? [
|
|
72
|
+
completionLoader,
|
|
73
|
+
...(commands[resolvedCompCmd][1] !== completionLoader
|
|
74
|
+
? [commands[resolvedCompCmd][1]]
|
|
75
|
+
: []),
|
|
76
|
+
]
|
|
77
|
+
: [...new Set(Object.values(commands).map(([, loader]) => loader))];
|
|
78
|
+
for (const [name, [, loader]] of Object.entries(commands)) {
|
|
79
|
+
if (!loadersToRun.includes(loader))
|
|
80
|
+
continue;
|
|
81
|
+
const idx = program.commands.findIndex((c) => c.name() === name);
|
|
82
|
+
if (idx !== -1)
|
|
83
|
+
program.commands.splice(idx, 1);
|
|
84
|
+
}
|
|
85
|
+
await Promise.all(loadersToRun.map(async (loader) => {
|
|
92
86
|
const register = await loader();
|
|
93
87
|
register(program);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Detect which command is being invoked (resolve aliases first)
|
|
92
|
+
const commandArg = process.argv
|
|
93
|
+
.slice(2)
|
|
94
|
+
.find((a) => !a.startsWith('-') && (a in commands || a in commandAliases));
|
|
95
|
+
const commandName = commandArg ? (commandAliases[commandArg] ?? commandArg) : undefined;
|
|
96
|
+
if (commandName && commands[commandName]) {
|
|
97
|
+
const loader = commands[commandName][1];
|
|
98
|
+
// Remove all placeholders that map to the same loader to avoid
|
|
99
|
+
// duplicate command registration from alias entries.
|
|
100
|
+
for (const [name, [, entryLoader]] of Object.entries(commands)) {
|
|
101
|
+
if (entryLoader !== loader)
|
|
102
|
+
continue;
|
|
103
|
+
const idx = program.commands.findIndex((c) => c.name() === name);
|
|
104
|
+
if (idx !== -1)
|
|
105
|
+
program.commands.splice(idx, 1);
|
|
106
|
+
}
|
|
107
|
+
startEarlySpinner();
|
|
108
|
+
try {
|
|
109
|
+
const register = await loader();
|
|
110
|
+
register(program);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
stopEarlySpinner();
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
98
116
|
}
|
|
99
117
|
}
|
|
100
118
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAgB,OAAO,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEtE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Command, Option } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Set argChoices on an option without enabling Commander's built-in
|
|
4
|
+
* validation. The choices are surfaced for shell completions but the
|
|
5
|
+
* option still accepts any value at parse time.
|
|
6
|
+
*/
|
|
7
|
+
export declare function withUnvalidatedChoices(opt: Option, values: string[]): Option;
|
|
8
|
+
export declare function withCaseInsensitiveChoices(opt: Option, values: string[]): Option;
|
|
9
|
+
/**
|
|
10
|
+
* Parse COMP_LINE into words, stripping the binary name and the
|
|
11
|
+
* 'completion-server' token that tabtab injects.
|
|
12
|
+
*
|
|
13
|
+
* FIXME: This splits on whitespace and does not handle quoted arguments.
|
|
14
|
+
* This is acceptable for command/flag traversal. It can be improved once
|
|
15
|
+
* tabtab exposes shell-provided tokenized words.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseCompLine(compLine: string): string[];
|
|
18
|
+
export interface CompletionItem {
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get completions for the current command line context.
|
|
24
|
+
*
|
|
25
|
+
* @param program - The root Commander program with all commands registered
|
|
26
|
+
* @param words - The words on the command line (excluding the binary name)
|
|
27
|
+
* @param current - The current word being typed (may be empty string)
|
|
28
|
+
* @returns Array of completion items
|
|
29
|
+
*/
|
|
30
|
+
export declare function getCompletions(program: Command, words: string[], current: string): CompletionItem[];
|
|
31
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/lib/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEhD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAG5E;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAWhF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxD;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAoBD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,GAChB,cAAc,EAAE,CAsGlB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Set argChoices on an option without enabling Commander's built-in
|
|
3
|
+
* validation. The choices are surfaced for shell completions but the
|
|
4
|
+
* option still accepts any value at parse time.
|
|
5
|
+
*/
|
|
6
|
+
export function withUnvalidatedChoices(opt, values) {
|
|
7
|
+
opt.argChoices = values;
|
|
8
|
+
return opt;
|
|
9
|
+
}
|
|
10
|
+
export function withCaseInsensitiveChoices(opt, values) {
|
|
11
|
+
opt.choices(values);
|
|
12
|
+
// choices() sets parseArg internally. Assert so we catch upstream changes.
|
|
13
|
+
const original = opt.parseArg;
|
|
14
|
+
if (!original) {
|
|
15
|
+
throw new Error('Expected Commander choices() to set parseArg');
|
|
16
|
+
}
|
|
17
|
+
opt.parseArg = (arg, prev) => original(arg.toLowerCase(), prev);
|
|
18
|
+
return opt;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse COMP_LINE into words, stripping the binary name and the
|
|
22
|
+
* 'completion-server' token that tabtab injects.
|
|
23
|
+
*
|
|
24
|
+
* FIXME: This splits on whitespace and does not handle quoted arguments.
|
|
25
|
+
* This is acceptable for command/flag traversal. It can be improved once
|
|
26
|
+
* tabtab exposes shell-provided tokenized words.
|
|
27
|
+
*/
|
|
28
|
+
export function parseCompLine(compLine) {
|
|
29
|
+
const words = compLine.split(/\s+/).slice(1); // remove binary name (tw)
|
|
30
|
+
if (words[0] === 'completion-server')
|
|
31
|
+
words.shift();
|
|
32
|
+
return words;
|
|
33
|
+
}
|
|
34
|
+
/** Names to exclude from completion results (internal commands) */
|
|
35
|
+
const HIDDEN_COMMAND_NAMES = new Set(['completion-server']);
|
|
36
|
+
/**
|
|
37
|
+
* Check if a Commander Option expects a value argument (not a boolean flag).
|
|
38
|
+
*/
|
|
39
|
+
function optionExpectsValue(opt) {
|
|
40
|
+
// required means <value>, optional means [value] — both expect a value
|
|
41
|
+
return opt.required || opt.optional;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Find an option by its long or short flag in a command.
|
|
45
|
+
*/
|
|
46
|
+
function findOption(cmd, flag) {
|
|
47
|
+
return cmd.options.find((o) => o.long === flag || o.short === flag);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get completions for the current command line context.
|
|
51
|
+
*
|
|
52
|
+
* @param program - The root Commander program with all commands registered
|
|
53
|
+
* @param words - The words on the command line (excluding the binary name)
|
|
54
|
+
* @param current - The current word being typed (may be empty string)
|
|
55
|
+
* @returns Array of completion items
|
|
56
|
+
*/
|
|
57
|
+
export function getCompletions(program, words, current) {
|
|
58
|
+
let activeCmd = program;
|
|
59
|
+
let seenDoubleDash = false;
|
|
60
|
+
const usedOptions = new Set();
|
|
61
|
+
// Walk the words to find the active command context
|
|
62
|
+
let i = 0;
|
|
63
|
+
while (i < words.length) {
|
|
64
|
+
const word = words[i];
|
|
65
|
+
// If we hit the current word (last position), stop walking
|
|
66
|
+
if (i === words.length - 1 && word === current) {
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
if (word === '--') {
|
|
70
|
+
seenDoubleDash = true;
|
|
71
|
+
i++;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!seenDoubleDash && word.startsWith('-')) {
|
|
75
|
+
// Handle --flag=value syntax
|
|
76
|
+
const eqIdx = word.indexOf('=');
|
|
77
|
+
const flag = eqIdx > 0 ? word.slice(0, eqIdx) : word;
|
|
78
|
+
usedOptions.add(flag);
|
|
79
|
+
// If this option expects a value and no = was used, consume the next word
|
|
80
|
+
if (eqIdx < 0) {
|
|
81
|
+
const opt = findOption(activeCmd, flag);
|
|
82
|
+
if (opt && optionExpectsValue(opt)) {
|
|
83
|
+
i++; // skip the value word
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
i++;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Try to descend into a subcommand
|
|
90
|
+
const sub = activeCmd.commands.find((c) => c.name() === word || c.aliases().includes(word));
|
|
91
|
+
if (sub) {
|
|
92
|
+
activeCmd = sub;
|
|
93
|
+
usedOptions.clear();
|
|
94
|
+
}
|
|
95
|
+
i++;
|
|
96
|
+
}
|
|
97
|
+
// Check if previous word was an option expecting a value
|
|
98
|
+
if (words.length >= 2) {
|
|
99
|
+
const prevWord = words[words.length - 2];
|
|
100
|
+
if (prevWord?.startsWith('-') && prevWord !== '--') {
|
|
101
|
+
const eqIdx = prevWord.indexOf('=');
|
|
102
|
+
const flag = eqIdx > 0 ? prevWord.slice(0, eqIdx) : prevWord;
|
|
103
|
+
const opt = findOption(activeCmd, flag);
|
|
104
|
+
if (opt && optionExpectsValue(opt) && eqIdx < 0) {
|
|
105
|
+
const enumValues = opt.argChoices;
|
|
106
|
+
if (enumValues) {
|
|
107
|
+
return enumValues.filter((v) => v.startsWith(current)).map((v) => ({ name: v }));
|
|
108
|
+
}
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Handle --flag=<TAB> — suggest values after =
|
|
114
|
+
if (current.includes('=')) {
|
|
115
|
+
const eqIdx = current.indexOf('=');
|
|
116
|
+
const flag = current.slice(0, eqIdx);
|
|
117
|
+
const partial = current.slice(eqIdx + 1);
|
|
118
|
+
const opt = findOption(activeCmd, flag);
|
|
119
|
+
if (opt) {
|
|
120
|
+
const enumValues = opt.argChoices;
|
|
121
|
+
if (enumValues) {
|
|
122
|
+
return enumValues
|
|
123
|
+
.filter((v) => v.startsWith(partial))
|
|
124
|
+
.map((v) => ({ name: `${flag}=${v}` }));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
// After --, everything is positional — no more commands or options
|
|
130
|
+
if (seenDoubleDash) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
// If current word starts with -, suggest options
|
|
134
|
+
if (current.startsWith('-')) {
|
|
135
|
+
return getOptionCompletions(activeCmd, current, usedOptions);
|
|
136
|
+
}
|
|
137
|
+
// Suggest subcommands, and if there are none, suggest options instead
|
|
138
|
+
const subcommands = getSubcommandCompletions(activeCmd, current);
|
|
139
|
+
if (subcommands.length > 0) {
|
|
140
|
+
return subcommands;
|
|
141
|
+
}
|
|
142
|
+
return getOptionCompletions(activeCmd, current, usedOptions);
|
|
143
|
+
}
|
|
144
|
+
function getSubcommandCompletions(cmd, prefix) {
|
|
145
|
+
return cmd.commands
|
|
146
|
+
.filter((c) => !c._hidden &&
|
|
147
|
+
!HIDDEN_COMMAND_NAMES.has(c.name()))
|
|
148
|
+
.filter((c) => c.name().startsWith(prefix))
|
|
149
|
+
.map((c) => ({
|
|
150
|
+
name: c.name(),
|
|
151
|
+
description: c.description(),
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
function getOptionCompletions(cmd, prefix, usedOptions) {
|
|
155
|
+
return cmd.options
|
|
156
|
+
.filter((o) => {
|
|
157
|
+
if (!o.long)
|
|
158
|
+
return false;
|
|
159
|
+
if (o.hidden)
|
|
160
|
+
return false;
|
|
161
|
+
// Exclude already-used options
|
|
162
|
+
if (usedOptions.has(o.long))
|
|
163
|
+
return false;
|
|
164
|
+
if (o.short && usedOptions.has(o.short))
|
|
165
|
+
return false;
|
|
166
|
+
return o.long.startsWith(prefix);
|
|
167
|
+
})
|
|
168
|
+
.map((o) => ({
|
|
169
|
+
name: o.long,
|
|
170
|
+
description: o.description,
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/lib/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ViewOptions = {
|
|
2
|
+
json?: boolean;
|
|
3
|
+
ndjson?: boolean;
|
|
4
|
+
full?: boolean;
|
|
5
|
+
raw?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type PaginatedViewOptions = ViewOptions & {
|
|
8
|
+
limit?: string;
|
|
9
|
+
since?: string;
|
|
10
|
+
until?: string;
|
|
11
|
+
};
|
|
12
|
+
export type MutationOptions = {
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/lib/options.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/lib/options.ts"],"names":[],"mappings":""}
|
package/dist/lib/refs.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Workspace } from '@doist/twist-sdk';
|
|
2
2
|
export declare function isIdRef(ref: string): boolean;
|
|
3
3
|
export declare function extractId(ref: string): number;
|
|
4
|
+
export declare function looksLikeRawId(ref: string): boolean;
|
|
4
5
|
export interface ParsedTwistUrl {
|
|
5
6
|
workspaceId?: number;
|
|
6
7
|
channelId?: number;
|
|
@@ -22,6 +23,7 @@ export declare function parseRef(ref: string): {
|
|
|
22
23
|
};
|
|
23
24
|
export declare function resolveWorkspaceRef(ref: string): Promise<Workspace>;
|
|
24
25
|
export declare function resolveThreadId(ref: string): number;
|
|
26
|
+
export declare function resolveChannelId(ref: string): number;
|
|
25
27
|
export declare function resolveCommentId(ref: string): number;
|
|
26
28
|
export declare function resolveConversationId(ref: string): number;
|
|
27
29
|
export declare function resolveMessageId(ref: string): number;
|
package/dist/lib/refs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAOjD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAInD;AAED,MAAM,WAAW,cAAc;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA8ChE;AAED,wBAAgB,QAAQ,CACpB,GAAG,EAAE,MAAM,GAET;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmBnC;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqCzE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYpD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYpD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYpD;AAED,MAAM,MAAM,aAAa,GAAG;IACxB,UAAU,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC7D,GAAG,EAAE,MAAM,CAAA;CACd,CAAA;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUlE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgC1F"}
|
package/dist/lib/refs.js
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import { fetchWorkspaces } from './api.js';
|
|
2
|
+
function normalizeRef(ref) {
|
|
3
|
+
return ref.trim();
|
|
4
|
+
}
|
|
2
5
|
export function isIdRef(ref) {
|
|
3
|
-
return ref.startsWith('id:');
|
|
6
|
+
return normalizeRef(ref).startsWith('id:');
|
|
4
7
|
}
|
|
5
8
|
export function extractId(ref) {
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
if (
|
|
9
|
+
const normalized = normalizeRef(ref);
|
|
10
|
+
const idStr = isIdRef(normalized) ? normalized.slice(3).trim() : normalized;
|
|
11
|
+
if (!/^\d+$/.test(idStr)) {
|
|
9
12
|
throw new Error(`Invalid ID: ${ref}`);
|
|
10
13
|
}
|
|
11
|
-
return
|
|
14
|
+
return Number(idStr);
|
|
15
|
+
}
|
|
16
|
+
export function looksLikeRawId(ref) {
|
|
17
|
+
const normalized = normalizeRef(ref);
|
|
18
|
+
if (!normalized || normalized.includes(' '))
|
|
19
|
+
return false;
|
|
20
|
+
return /^\d+$/.test(normalized) || (/[a-zA-Z]/.test(normalized) && /\d/.test(normalized));
|
|
12
21
|
}
|
|
13
22
|
export function parseTwistUrl(url) {
|
|
14
23
|
try {
|
|
@@ -51,20 +60,20 @@ export function parseTwistUrl(url) {
|
|
|
51
60
|
}
|
|
52
61
|
}
|
|
53
62
|
export function parseRef(ref) {
|
|
54
|
-
|
|
55
|
-
|
|
63
|
+
const normalized = normalizeRef(ref);
|
|
64
|
+
if (isIdRef(normalized)) {
|
|
65
|
+
return { type: 'id', id: extractId(normalized) };
|
|
56
66
|
}
|
|
57
|
-
if (
|
|
58
|
-
const parsed = parseTwistUrl(
|
|
67
|
+
if (normalized.startsWith('http://') || normalized.startsWith('https://')) {
|
|
68
|
+
const parsed = parseTwistUrl(normalized);
|
|
59
69
|
if (parsed) {
|
|
60
70
|
return { type: 'url', parsed };
|
|
61
71
|
}
|
|
62
72
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return { type: 'id', id: bareId };
|
|
73
|
+
if (/^\d+$/.test(normalized)) {
|
|
74
|
+
return { type: 'id', id: Number(normalized) };
|
|
66
75
|
}
|
|
67
|
-
return { type: 'name', name:
|
|
76
|
+
return { type: 'name', name: normalized };
|
|
68
77
|
}
|
|
69
78
|
export async function resolveWorkspaceRef(ref) {
|
|
70
79
|
const workspaces = await fetchWorkspaces();
|
|
@@ -109,7 +118,17 @@ export function resolveThreadId(ref) {
|
|
|
109
118
|
if (parsed.type === 'url' && parsed.parsed.threadId) {
|
|
110
119
|
return parsed.parsed.threadId;
|
|
111
120
|
}
|
|
112
|
-
throw new Error(`Invalid thread reference: ${ref}. Use
|
|
121
|
+
throw new Error(`Invalid thread reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
122
|
+
}
|
|
123
|
+
export function resolveChannelId(ref) {
|
|
124
|
+
const parsed = parseRef(ref);
|
|
125
|
+
if (parsed.type === 'id') {
|
|
126
|
+
return parsed.id;
|
|
127
|
+
}
|
|
128
|
+
if (parsed.type === 'url' && parsed.parsed.channelId) {
|
|
129
|
+
return parsed.parsed.channelId;
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`Invalid channel reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
113
132
|
}
|
|
114
133
|
export function resolveCommentId(ref) {
|
|
115
134
|
const parsed = parseRef(ref);
|
|
@@ -119,7 +138,7 @@ export function resolveCommentId(ref) {
|
|
|
119
138
|
if (parsed.type === 'url' && parsed.parsed.commentId) {
|
|
120
139
|
return parsed.parsed.commentId;
|
|
121
140
|
}
|
|
122
|
-
throw new Error(`Invalid comment reference: ${ref}. Use
|
|
141
|
+
throw new Error(`Invalid comment reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
123
142
|
}
|
|
124
143
|
export function resolveConversationId(ref) {
|
|
125
144
|
const parsed = parseRef(ref);
|
|
@@ -129,7 +148,7 @@ export function resolveConversationId(ref) {
|
|
|
129
148
|
if (parsed.type === 'url' && parsed.parsed.conversationId) {
|
|
130
149
|
return parsed.parsed.conversationId;
|
|
131
150
|
}
|
|
132
|
-
throw new Error(`Invalid conversation reference: ${ref}. Use
|
|
151
|
+
throw new Error(`Invalid conversation reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
133
152
|
}
|
|
134
153
|
export function resolveMessageId(ref) {
|
|
135
154
|
const parsed = parseRef(ref);
|
|
@@ -139,7 +158,7 @@ export function resolveMessageId(ref) {
|
|
|
139
158
|
if (parsed.type === 'url' && parsed.parsed.messageId) {
|
|
140
159
|
return parsed.parsed.messageId;
|
|
141
160
|
}
|
|
142
|
-
throw new Error(`Invalid message reference: ${ref}. Use
|
|
161
|
+
throw new Error(`Invalid message reference: ${ref}. Use 123, id:123, or a Twist URL.`);
|
|
143
162
|
}
|
|
144
163
|
export function classifyTwistUrl(url) {
|
|
145
164
|
const parsed = parseTwistUrl(url);
|
package/dist/lib/refs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,MAAM,UAAU,OAAO,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"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"}
|