@doist/twist-cli 2.32.2 → 2.34.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/CHANGELOG.md +17 -0
- package/dist/commands/channel/helpers.d.ts +3 -0
- package/dist/commands/channel/helpers.d.ts.map +1 -0
- package/dist/commands/channel/helpers.js +24 -0
- package/dist/commands/channel/helpers.js.map +1 -0
- package/dist/commands/{channel.d.ts → channel/index.d.ts} +1 -1
- package/dist/commands/channel/index.d.ts.map +1 -0
- package/dist/commands/channel/index.js +67 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/channel/list.d.ts +8 -0
- package/dist/commands/channel/list.d.ts.map +1 -0
- package/dist/commands/{channel.js → channel/list.js} +7 -39
- package/dist/commands/channel/list.js.map +1 -0
- package/dist/commands/channel/threads.d.ts +11 -0
- package/dist/commands/channel/threads.d.ts.map +1 -0
- package/dist/commands/channel/threads.js +97 -0
- package/dist/commands/channel/threads.js.map +1 -0
- package/dist/commands/config/index.d.ts +3 -0
- package/dist/commands/config/index.d.ts.map +1 -0
- package/dist/commands/config/index.js +29 -0
- package/dist/commands/config/index.js.map +1 -0
- package/dist/commands/config/set.d.ts +3 -0
- package/dist/commands/config/set.d.ts.map +1 -0
- package/dist/commands/config/set.js +41 -0
- package/dist/commands/config/set.js.map +1 -0
- package/dist/commands/config/view.d.ts +6 -0
- package/dist/commands/config/view.d.ts.map +1 -0
- package/dist/commands/config/view.js +108 -0
- package/dist/commands/config/view.js.map +1 -0
- package/dist/commands/thread/create.d.ts +1 -0
- package/dist/commands/thread/create.d.ts.map +1 -1
- package/dist/commands/thread/create.js +13 -0
- package/dist/commands/thread/create.js.map +1 -1
- package/dist/commands/thread/index.d.ts.map +1 -1
- package/dist/commands/thread/index.js +4 -1
- package/dist/commands/thread/index.js.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +2 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +17 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +57 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +1 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +3 -0
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/refs.d.ts +2 -1
- package/dist/lib/refs.d.ts.map +1 -1
- package/dist/lib/refs.js +43 -1
- package/dist/lib/refs.js.map +1 -1
- package/dist/lib/skills/content.d.ts +1 -1
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +26 -1
- package/dist/lib/skills/content.js.map +1 -1
- package/package.json +4 -4
- package/dist/__mocks__/chalk.d.ts +0 -3
- package/dist/__mocks__/chalk.d.ts.map +0 -1
- package/dist/__mocks__/chalk.js +0 -8
- package/dist/__mocks__/chalk.js.map +0 -1
- package/dist/commands/channel.d.ts.map +0 -1
- package/dist/commands/channel.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
## [2.34.0](https://github.com/Doist/twist-cli/compare/v2.33.0...v2.34.0) (2026-04-27)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
- **thread:** opt-in unarchive of newly-created threads ([#196](https://github.com/Doist/twist-cli/issues/196)) ([1872225](https://github.com/Doist/twist-cli/commit/1872225d3ae23b0322c1ed6c6e08d088fb872580))
|
|
6
|
+
|
|
7
|
+
## [2.33.0](https://github.com/Doist/twist-cli/compare/v2.32.2...v2.33.0) (2026-04-23)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
- **channel:** add channel threads listing with pagination ([#191](https://github.com/Doist/twist-cli/issues/191)) ([f17f09f](https://github.com/Doist/twist-cli/commit/f17f09fbfc3a11ee3bf641bc40a9e5702d3b311f))
|
|
12
|
+
- **config:** add `tw config view` to inspect the CLI config file ([#192](https://github.com/Doist/twist-cli/issues/192)) ([f7d0d9b](https://github.com/Doist/twist-cli/commit/f7d0d9bbc3fbee03825032d6c54f293429bee45f))
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- **deps:** update dependency marked to v18.0.2 ([#189](https://github.com/Doist/twist-cli/issues/189)) ([f4caf89](https://github.com/Doist/twist-cli/commit/f4caf8978a12a547050a7649de2285d41330abe6))
|
|
17
|
+
|
|
1
18
|
## [2.32.2](https://github.com/Doist/twist-cli/compare/v2.32.1...v2.32.2) (2026-04-22)
|
|
2
19
|
|
|
3
20
|
### Bug Fixes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/helpers.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqB/D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CliError } from '../../lib/errors.js';
|
|
2
|
+
export function encodeCursor(offset) {
|
|
3
|
+
return Buffer.from(JSON.stringify({ offset })).toString('base64url');
|
|
4
|
+
}
|
|
5
|
+
export function decodeCursor(cursor) {
|
|
6
|
+
if (!cursor)
|
|
7
|
+
return 0;
|
|
8
|
+
let parsed;
|
|
9
|
+
try {
|
|
10
|
+
parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new CliError('INVALID_CURSOR', `Invalid cursor: ${cursor}`);
|
|
14
|
+
}
|
|
15
|
+
if (!parsed ||
|
|
16
|
+
typeof parsed !== 'object' ||
|
|
17
|
+
typeof parsed.offset !== 'number' ||
|
|
18
|
+
!Number.isFinite(parsed.offset) ||
|
|
19
|
+
parsed.offset < 0) {
|
|
20
|
+
throw new CliError('INVALID_CURSOR', `Invalid cursor: ${cursor}`);
|
|
21
|
+
}
|
|
22
|
+
return parsed.offset;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/channel/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,MAAM,UAAU,YAAY,CAAC,MAAc;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA0B;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAA;IAErB,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,IACI,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAQ,MAA+B,CAAC,MAAM,KAAK,QAAQ;QAC3D,CAAC,MAAM,CAAC,QAAQ,CAAE,MAA6B,CAAC,MAAM,CAAC;QACtD,MAA6B,CAAC,MAAM,GAAG,CAAC,EAC3C,CAAC;QACC,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,OAAQ,MAA6B,CAAC,MAAM,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAK3C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmF7D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
2
|
+
import { withCaseInsensitiveChoices } from '../../lib/completion.js';
|
|
3
|
+
import { listChannels } from './list.js';
|
|
4
|
+
import { showChannelThreads } from './threads.js';
|
|
5
|
+
export function registerChannelCommand(program) {
|
|
6
|
+
const channel = program
|
|
7
|
+
.command('channel')
|
|
8
|
+
.alias('channels')
|
|
9
|
+
.description('Channel operations (list, threads)');
|
|
10
|
+
channel
|
|
11
|
+
.command('list [workspace-ref]', { isDefault: true })
|
|
12
|
+
.description('List joined channels or discoverable public channels in a workspace')
|
|
13
|
+
.option('--workspace <ref>', 'Workspace ID or name')
|
|
14
|
+
.option('--scope <scope>', 'Channel set to list: joined, public, or discoverable (default: joined)')
|
|
15
|
+
.option('--state <state>', 'Channel state to list: active, all, or archived (default: active)')
|
|
16
|
+
.option('--json', 'Output as JSON')
|
|
17
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
18
|
+
.option('--full', 'Include all fields in JSON output')
|
|
19
|
+
.addHelpText('after', `
|
|
20
|
+
Examples:
|
|
21
|
+
tw channels
|
|
22
|
+
tw channels --state all
|
|
23
|
+
tw channels --scope discoverable
|
|
24
|
+
tw channels --scope public --state archived
|
|
25
|
+
tw channels --scope public --state all --json
|
|
26
|
+
tw channels --json
|
|
27
|
+
tw channels "My Workspace" --scope discoverable --json
|
|
28
|
+
|
|
29
|
+
Notes:
|
|
30
|
+
Defaults to active channels that you have joined.
|
|
31
|
+
joined Channels you have joined (private channels require --include-private-channels)
|
|
32
|
+
public Public channels visible in the workspace, whether joined or not
|
|
33
|
+
discoverable Public channels visible in the workspace that you have not joined
|
|
34
|
+
active Non-archived channels only
|
|
35
|
+
all Both active and archived channels
|
|
36
|
+
archived Archived channels only
|
|
37
|
+
|
|
38
|
+
Twist does not expose unjoined private channels, so public/discoverable scopes never include them.`)
|
|
39
|
+
.action(listChannels);
|
|
40
|
+
channel
|
|
41
|
+
.command('threads <channel-ref> [workspace-ref]')
|
|
42
|
+
.description('List threads in a channel with pagination and filtering')
|
|
43
|
+
.option('--workspace <ref>', 'Workspace ID or name')
|
|
44
|
+
.option('--unread', 'Only show unread threads')
|
|
45
|
+
.addOption(withCaseInsensitiveChoices(new Option('--archive-filter <filter>', 'Show active, archived, or all threads (default: active)'), ['active', 'archived', 'all']))
|
|
46
|
+
.option('--since <date>', 'Threads updated on/after this date (ISO format)')
|
|
47
|
+
.option('--until <date>', 'Threads updated before this date (ISO format)')
|
|
48
|
+
.option('--limit <n>', 'Max threads per page (default: 50)')
|
|
49
|
+
.option('--cursor <cursor>', 'Pagination cursor from a previous response')
|
|
50
|
+
.option('--json', 'Output as JSON')
|
|
51
|
+
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
52
|
+
.option('--full', 'Include all fields in JSON output')
|
|
53
|
+
.addHelpText('after', `
|
|
54
|
+
Examples:
|
|
55
|
+
tw channel threads 12345
|
|
56
|
+
tw channel threads "general"
|
|
57
|
+
tw channel threads id:12345 --unread
|
|
58
|
+
tw channel threads 12345 --archive-filter all --since 2026-01-01
|
|
59
|
+
tw channel threads 12345 --limit 20 --json
|
|
60
|
+
tw channel threads 12345 --limit 20 --cursor <cursor-from-previous>
|
|
61
|
+
|
|
62
|
+
Notes:
|
|
63
|
+
Sorted newest-first by last activity. --limit, --cursor, --since, --until,
|
|
64
|
+
and --unread are applied client-side; --archive-filter is applied server-side.`)
|
|
65
|
+
.action(showChannelThreads);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACnD,MAAM,OAAO,GAAG,OAAO;SAClB,OAAO,CAAC,SAAS,CAAC;SAClB,KAAK,CAAC,UAAU,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC,CAAA;IAEtD,OAAO;SACF,OAAO,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpD,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CACH,iBAAiB,EACjB,wEAAwE,CAC3E;SACA,MAAM,CACH,iBAAiB,EACjB,mEAAmE,CACtE;SACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,WAAW,CACR,OAAO,EACP;;;;;;;;;;;;;;;;;;;qGAmByF,CAC5F;SACA,MAAM,CAAC,YAAY,CAAC,CAAA;IAEzB,OAAO;SACF,OAAO,CAAC,uCAAuC,CAAC;SAChD,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,SAAS,CACN,0BAA0B,CACtB,IAAI,MAAM,CACN,2BAA2B,EAC3B,yDAAyD,CAC5D,EACD,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAChC,CACJ;SACA,MAAM,CAAC,gBAAgB,EAAE,iDAAiD,CAAC;SAC3E,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,aAAa,EAAE,oCAAoC,CAAC;SAC3D,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,WAAW,CACR,OAAO,EACP;;;;;;;;;;;iFAWqE,CACxE;SACA,MAAM,CAAC,kBAAkB,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ViewOptions } from '../../lib/options.js';
|
|
2
|
+
export type ListChannelsOptions = ViewOptions & {
|
|
3
|
+
workspace?: string;
|
|
4
|
+
scope?: string;
|
|
5
|
+
state?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function listChannels(workspaceRef: string | undefined, options: ListChannelsOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/list.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAWvD,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAkID,wBAAsB,YAAY,CAC9B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyDf"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { getCurrentWorkspaceId, getTwistClient } from '
|
|
2
|
-
import { CliError } from '
|
|
3
|
-
import { includePrivateChannels } from '
|
|
4
|
-
import { colors, formatJson, formatNdjson } from '
|
|
5
|
-
import { resolveWorkspaceRef } from '
|
|
1
|
+
import { getCurrentWorkspaceId, getTwistClient } from '../../lib/api.js';
|
|
2
|
+
import { CliError } from '../../lib/errors.js';
|
|
3
|
+
import { includePrivateChannels } from '../../lib/global-args.js';
|
|
4
|
+
import { colors, formatJson, formatNdjson } from '../../lib/output.js';
|
|
5
|
+
import { resolveWorkspaceRef } from '../../lib/refs.js';
|
|
6
6
|
const CHANNEL_SCOPES = ['joined', 'public', 'discoverable'];
|
|
7
7
|
const CHANNEL_STATES = ['active', 'all', 'archived'];
|
|
8
8
|
function parseChannelScope(scope) {
|
|
@@ -94,7 +94,7 @@ function formatChannelLine(channel, scope) {
|
|
|
94
94
|
: '';
|
|
95
95
|
return `${id} ${name}${visibility}${membership}${archived}`;
|
|
96
96
|
}
|
|
97
|
-
async function listChannels(workspaceRef, options) {
|
|
97
|
+
export async function listChannels(workspaceRef, options) {
|
|
98
98
|
const scope = parseChannelScope(options.scope);
|
|
99
99
|
const state = parseChannelState(options.state);
|
|
100
100
|
const workspaceId = await getWorkspaceId(workspaceRef, options);
|
|
@@ -146,36 +146,4 @@ async function listChannels(workspaceRef, options) {
|
|
|
146
146
|
console.log(formatChannelLine(channel, scope));
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
|
-
|
|
150
|
-
program
|
|
151
|
-
.command('channels [workspace-ref]')
|
|
152
|
-
.description('List joined channels or discoverable public channels in a workspace')
|
|
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)')
|
|
156
|
-
.option('--json', 'Output as JSON')
|
|
157
|
-
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
158
|
-
.option('--full', 'Include all fields in JSON output')
|
|
159
|
-
.addHelpText('after', `
|
|
160
|
-
Examples:
|
|
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
|
|
166
|
-
tw channels --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.`)
|
|
179
|
-
.action(listChannels);
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=channel.js.map
|
|
149
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/channel/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ArchiveFilter } from '@doist/twist-sdk';
|
|
2
|
+
import type { PaginatedViewOptions } from '../../lib/options.js';
|
|
3
|
+
type ChannelThreadsOptions = PaginatedViewOptions & {
|
|
4
|
+
workspace?: string;
|
|
5
|
+
unread?: boolean;
|
|
6
|
+
archiveFilter?: ArchiveFilter;
|
|
7
|
+
cursor?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function showChannelThreads(channelRef: string, workspaceRef: string | undefined, options: ChannelThreadsOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=threads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAU,MAAM,kBAAkB,CAAA;AAM7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAWhE,KAAK,qBAAqB,GAAG,oBAAoB,GAAG;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AA0BD,wBAAsB,kBAAkB,CACpC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,qBAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAgGf"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getCurrentWorkspaceId, getTwistClient } from '../../lib/api.js';
|
|
3
|
+
import { formatRelativeDate } from '../../lib/dates.js';
|
|
4
|
+
import { CliError } from '../../lib/errors.js';
|
|
5
|
+
import { isAccessible } from '../../lib/global-args.js';
|
|
6
|
+
import { colors, formatPaginatedJson, formatPaginatedNdjson, } from '../../lib/output.js';
|
|
7
|
+
import { assertChannelIsPublic } from '../../lib/public-channels.js';
|
|
8
|
+
import { resolveChannelRef, resolveWorkspaceRef } from '../../lib/refs.js';
|
|
9
|
+
import { decodeCursor, encodeCursor } from './helpers.js';
|
|
10
|
+
function archiveFilterToFlag(filter) {
|
|
11
|
+
switch (filter ?? 'active') {
|
|
12
|
+
case 'active':
|
|
13
|
+
return false;
|
|
14
|
+
case 'archived':
|
|
15
|
+
return true;
|
|
16
|
+
case 'all':
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function parseDateFilter(value, flag) {
|
|
21
|
+
const ts = new Date(value).getTime();
|
|
22
|
+
if (Number.isNaN(ts)) {
|
|
23
|
+
throw new CliError('INVALID_DATE', `Invalid ${flag} value: "${value}". Use an ISO-8601 date (e.g. 2026-01-15 or 2026-01-15T09:00:00Z).`);
|
|
24
|
+
}
|
|
25
|
+
return ts;
|
|
26
|
+
}
|
|
27
|
+
export async function showChannelThreads(channelRef, workspaceRef, options) {
|
|
28
|
+
if (workspaceRef && options.workspace) {
|
|
29
|
+
throw new CliError('CONFLICTING_OPTIONS', 'Cannot specify workspace both as argument and --workspace flag');
|
|
30
|
+
}
|
|
31
|
+
const sinceTs = options.since ? parseDateFilter(options.since, '--since') : undefined;
|
|
32
|
+
const untilTs = options.until ? parseDateFilter(options.until, '--until') : undefined;
|
|
33
|
+
let workspaceId;
|
|
34
|
+
const ref = workspaceRef || options.workspace;
|
|
35
|
+
if (ref) {
|
|
36
|
+
const workspace = await resolveWorkspaceRef(ref);
|
|
37
|
+
workspaceId = workspace.id;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
workspaceId = await getCurrentWorkspaceId();
|
|
41
|
+
}
|
|
42
|
+
const channel = await resolveChannelRef(channelRef, workspaceId);
|
|
43
|
+
await assertChannelIsPublic(channel.id, workspaceId);
|
|
44
|
+
const archived = archiveFilterToFlag(options.archiveFilter);
|
|
45
|
+
const client = await getTwistClient();
|
|
46
|
+
const [threadsResp, unreadResp] = await client.batch(client.threads.getThreads(archived === undefined
|
|
47
|
+
? { workspaceId, channelId: channel.id }
|
|
48
|
+
: { workspaceId, channelId: channel.id, archived }, { batch: true }), client.threads.getUnread(workspaceId, { batch: true }));
|
|
49
|
+
const unreadThreadIds = new Set(unreadResp.data.map((u) => u.threadId));
|
|
50
|
+
let threads = threadsResp.data.map((t) => ({
|
|
51
|
+
...t,
|
|
52
|
+
isUnread: unreadThreadIds.has(t.id),
|
|
53
|
+
}));
|
|
54
|
+
if (options.unread) {
|
|
55
|
+
threads = threads.filter((t) => t.isUnread);
|
|
56
|
+
}
|
|
57
|
+
if (sinceTs !== undefined) {
|
|
58
|
+
threads = threads.filter((t) => new Date(t.lastUpdated).getTime() >= sinceTs);
|
|
59
|
+
}
|
|
60
|
+
if (untilTs !== undefined) {
|
|
61
|
+
threads = threads.filter((t) => new Date(t.lastUpdated).getTime() < untilTs);
|
|
62
|
+
}
|
|
63
|
+
threads.sort((a, b) => new Date(b.lastUpdated).getTime() - new Date(a.lastUpdated).getTime());
|
|
64
|
+
const limitNum = options.limit ? parseInt(options.limit, 10) : 50;
|
|
65
|
+
const limit = Number.isFinite(limitNum) && limitNum > 0 ? limitNum : 50;
|
|
66
|
+
const offset = decodeCursor(options.cursor);
|
|
67
|
+
const page = threads.slice(offset, offset + limit);
|
|
68
|
+
const nextCursor = offset + limit < threads.length ? encodeCursor(offset + limit) : null;
|
|
69
|
+
const paginated = { results: page, nextCursor };
|
|
70
|
+
if (options.json) {
|
|
71
|
+
console.log(formatPaginatedJson(paginated, 'thread', options.full));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (options.ndjson) {
|
|
75
|
+
console.log(formatPaginatedNdjson(paginated, 'thread', options.full));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (page.length === 0) {
|
|
79
|
+
console.log(`No threads in #${channel.name}.`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log(chalk.bold.blue(`[${channel.name}]`));
|
|
83
|
+
console.log('');
|
|
84
|
+
for (const thread of page) {
|
|
85
|
+
const title = thread.isUnread ? chalk.bold(thread.title) : thread.title;
|
|
86
|
+
const time = colors.timestamp(formatRelativeDate(thread.lastUpdated));
|
|
87
|
+
const unreadBadge = thread.isUnread ? chalk.blue(isAccessible() ? ' (unread)' : ' *') : '';
|
|
88
|
+
console.log(` ${title}${unreadBadge}`);
|
|
89
|
+
console.log(` ${time} ${colors.timestamp(`id:${thread.id}`)}`);
|
|
90
|
+
console.log(` ${colors.url(thread.url)}`);
|
|
91
|
+
console.log('');
|
|
92
|
+
}
|
|
93
|
+
if (nextCursor) {
|
|
94
|
+
console.log(colors.timestamp(`More threads available. Use --cursor ${nextCursor}`));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC5D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { listSettableKeys, setConfigValue } from './set.js';
|
|
2
|
+
import { viewConfig } from './view.js';
|
|
3
|
+
export function registerConfigCommand(program) {
|
|
4
|
+
const config = program.command('config').description('Manage CLI configuration');
|
|
5
|
+
config
|
|
6
|
+
.command('view', { isDefault: true })
|
|
7
|
+
.description('Show the current CLI configuration file')
|
|
8
|
+
.option('--json', 'Output the raw config as JSON')
|
|
9
|
+
.option('--show-token', 'Include the full token instead of masking it')
|
|
10
|
+
.action(viewConfig);
|
|
11
|
+
config
|
|
12
|
+
.command('set <key> <value>')
|
|
13
|
+
.description('Set a user preference in the config file')
|
|
14
|
+
.addHelpText('after', `
|
|
15
|
+
Settable keys:
|
|
16
|
+
${listSettableKeys()}
|
|
17
|
+
|
|
18
|
+
Examples:
|
|
19
|
+
$ tw config set unarchive-new-threads true
|
|
20
|
+
$ tw config set unarchive-new-threads false`)
|
|
21
|
+
.action(setConfigValue);
|
|
22
|
+
config.addHelpText('after', `
|
|
23
|
+
Examples:
|
|
24
|
+
$ tw config view # pretty-printed, token masked
|
|
25
|
+
$ tw config view --json # raw JSON, token masked
|
|
26
|
+
$ tw config view --show-token # include the full token
|
|
27
|
+
$ tw config set unarchive-new-threads true # change a user preference`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAA;IAEhF,MAAM;SACD,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpC,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,+BAA+B,CAAC;SACjD,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;SACtE,MAAM,CAAC,UAAU,CAAC,CAAA;IAEvB,MAAM;SACD,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,0CAA0C,CAAC;SACvD,WAAW,CACR,OAAO,EACP;;EAEV,gBAAgB,EAAE;;;;8CAI0B,CACrC;SACA,MAAM,CAAC,cAAc,CAAC,CAAA;IAE3B,MAAM,CAAC,WAAW,CACd,OAAO,EACP;;;;;2EAKmE,CACtE,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/config/set.ts"],"names":[],"mappings":"AA8BA,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9E;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { readConfigStrict, setConfig } from '../../lib/config.js';
|
|
3
|
+
import { CliError } from '../../lib/errors.js';
|
|
4
|
+
const TRUE_VALUES = new Set(['true', 'on', '1', 'yes']);
|
|
5
|
+
const FALSE_VALUES = new Set(['false', 'off', '0', 'no']);
|
|
6
|
+
function parseBoolean(raw, key) {
|
|
7
|
+
const normalized = raw.trim().toLowerCase();
|
|
8
|
+
if (TRUE_VALUES.has(normalized))
|
|
9
|
+
return true;
|
|
10
|
+
if (FALSE_VALUES.has(normalized))
|
|
11
|
+
return false;
|
|
12
|
+
throw new CliError('INVALID_VALUE', `Invalid boolean value "${raw}" for ${key}. Use one of: true, false, on, off, 1, 0.`);
|
|
13
|
+
}
|
|
14
|
+
const SETTERS = {
|
|
15
|
+
'unarchive-new-threads': {
|
|
16
|
+
description: 'Unarchive newly-created threads so they appear in your Inbox',
|
|
17
|
+
apply: (config, value) => {
|
|
18
|
+
const parsed = parseBoolean(value, 'unarchive-new-threads');
|
|
19
|
+
config.userSettings = { ...config.userSettings, unarchiveNewThreads: parsed };
|
|
20
|
+
return `userSettings.unarchiveNewThreads = ${parsed}`;
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export async function setConfigValue(key, value) {
|
|
25
|
+
const setter = SETTERS[key];
|
|
26
|
+
if (!setter) {
|
|
27
|
+
const known = Object.keys(SETTERS).join(', ');
|
|
28
|
+
throw new CliError('UNKNOWN_KEY', `Unknown config key "${key}". Known keys: ${known}.`);
|
|
29
|
+
}
|
|
30
|
+
const read = await readConfigStrict();
|
|
31
|
+
const config = read.state === 'present' ? read.config : {};
|
|
32
|
+
const summary = setter.apply(config, value);
|
|
33
|
+
await setConfig(config);
|
|
34
|
+
console.log(chalk.green('✓'), `Set ${chalk.cyan(summary)}`);
|
|
35
|
+
}
|
|
36
|
+
export function listSettableKeys() {
|
|
37
|
+
return Object.entries(SETTERS)
|
|
38
|
+
.map(([key, { description }]) => ` ${key.padEnd(28)} ${description}`)
|
|
39
|
+
.join('\n');
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/config/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAe,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;AACvD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;AAEzD,SAAS,YAAY,CAAC,GAAW,EAAE,GAAW;IAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC3C,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5C,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9C,MAAM,IAAI,QAAQ,CACd,eAAe,EACf,0BAA0B,GAAG,SAAS,GAAG,2CAA2C,CACvF,CAAA;AACL,CAAC;AAID,MAAM,OAAO,GAA2D;IACpE,uBAAuB,EAAE;QACrB,WAAW,EAAE,8DAA8D;QAC3E,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAA;YAC3D,MAAM,CAAC,YAAY,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAA;YAC7E,OAAO,sCAAsC,MAAM,EAAE,CAAA;QACzD,CAAC;KACJ;CACJ,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,uBAAuB,GAAG,kBAAkB,KAAK,GAAG,CAAC,CAAA;IAC3F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACrC,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC3C,MAAM,SAAS,CAAC,MAAM,CAAC,CAAA;IAEvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;SACrE,IAAI,CAAC,IAAI,CAAC,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/commands/config/view.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB;AA0GD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB1E"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { NoTokenError, probeApiToken, TOKEN_ENV_VAR, } from '../../lib/auth.js';
|
|
3
|
+
import { CONFIG_PATH, readConfigStrict } from '../../lib/config.js';
|
|
4
|
+
import { SECURE_STORE_DESCRIPTION, SecureStoreUnavailableError } from '../../lib/secure-store.js';
|
|
5
|
+
function maskToken(token) {
|
|
6
|
+
if (token.length < 5)
|
|
7
|
+
return '****';
|
|
8
|
+
return `****…${token.slice(-4)}`;
|
|
9
|
+
}
|
|
10
|
+
function describeTokenSource(source) {
|
|
11
|
+
switch (source) {
|
|
12
|
+
case 'env':
|
|
13
|
+
return `environment variable ${TOKEN_ENV_VAR}`;
|
|
14
|
+
case 'secure-store':
|
|
15
|
+
return SECURE_STORE_DESCRIPTION;
|
|
16
|
+
case 'config-file':
|
|
17
|
+
return 'config file (plaintext fallback)';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function probeTokenPresence() {
|
|
21
|
+
try {
|
|
22
|
+
const { token, metadata } = await probeApiToken();
|
|
23
|
+
return { state: 'present', token, metadata };
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof NoTokenError)
|
|
27
|
+
return { state: 'missing' };
|
|
28
|
+
if (error instanceof SecureStoreUnavailableError) {
|
|
29
|
+
return {
|
|
30
|
+
state: 'unavailable',
|
|
31
|
+
reason: `${SECURE_STORE_DESCRIPTION} unavailable (${error.message})`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function formatValue(value) {
|
|
38
|
+
if (value === undefined || value === null)
|
|
39
|
+
return chalk.dim('not set');
|
|
40
|
+
if (typeof value === 'boolean')
|
|
41
|
+
return value ? 'true' : 'false';
|
|
42
|
+
return String(value);
|
|
43
|
+
}
|
|
44
|
+
function renderTokenLine(token, showToken) {
|
|
45
|
+
switch (token.state) {
|
|
46
|
+
case 'present': {
|
|
47
|
+
const value = showToken ? token.token : maskToken(token.token);
|
|
48
|
+
return `${value} ${chalk.dim(`(${describeTokenSource(token.metadata.source)})`)}`;
|
|
49
|
+
}
|
|
50
|
+
case 'unavailable':
|
|
51
|
+
return chalk.dim(`unknown — ${token.reason}`);
|
|
52
|
+
case 'missing':
|
|
53
|
+
return formatValue(undefined);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function formatConfigView(config, token, showToken, configMissing) {
|
|
57
|
+
const lines = [];
|
|
58
|
+
const headerSuffix = configMissing ? ` ${chalk.dim('(not created yet)')}` : '';
|
|
59
|
+
lines.push(`${chalk.dim('Config file:')} ${CONFIG_PATH}${headerSuffix}`);
|
|
60
|
+
lines.push('');
|
|
61
|
+
// When a token is present, its metadata is the ground truth for the active
|
|
62
|
+
// mode/scope — this matters most for env-sourced tokens, whose scope the CLI
|
|
63
|
+
// does not know and where config.auth* may be stale from an unrelated
|
|
64
|
+
// `tw auth login`. For missing/unavailable tokens, fall back to the config
|
|
65
|
+
// file values (what the CLI would attempt once auth recovers).
|
|
66
|
+
const effectiveMode = token.state === 'present' ? token.metadata.authMode : config.authMode;
|
|
67
|
+
const effectiveScope = token.state === 'present' ? token.metadata.authScope : config.authScope;
|
|
68
|
+
// When the mode is 'unknown' and no scope is recorded, the scope is
|
|
69
|
+
// genuinely unintrospectable (env-sourced tokens, or tokens saved via
|
|
70
|
+
// `tw auth token` without metadata). Render 'unknown' rather than
|
|
71
|
+
// 'not set' to avoid reading as an explicit empty scope.
|
|
72
|
+
const scopeDisplay = effectiveMode === 'unknown' && effectiveScope === undefined
|
|
73
|
+
? 'unknown'
|
|
74
|
+
: formatValue(effectiveScope);
|
|
75
|
+
lines.push(chalk.bold('Authentication'));
|
|
76
|
+
lines.push(` Token: ${renderTokenLine(token, showToken)}`);
|
|
77
|
+
lines.push(` Mode: ${formatValue(effectiveMode)}`);
|
|
78
|
+
lines.push(` Scope: ${scopeDisplay}`);
|
|
79
|
+
lines.push('');
|
|
80
|
+
lines.push(chalk.bold('Workspace'));
|
|
81
|
+
lines.push(` Current: ${formatValue(config.currentWorkspace)}`);
|
|
82
|
+
lines.push('');
|
|
83
|
+
lines.push(chalk.bold('Updates'));
|
|
84
|
+
lines.push(` Channel: ${formatValue(config.updateChannel)}`);
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push(chalk.bold('User settings'));
|
|
87
|
+
lines.push(` Unarchive new threads: ${formatValue(config.userSettings?.unarchiveNewThreads)}`);
|
|
88
|
+
return lines.join('\n');
|
|
89
|
+
}
|
|
90
|
+
export async function viewConfig(options) {
|
|
91
|
+
const read = await readConfigStrict();
|
|
92
|
+
const config = read.state === 'present' ? read.config : {};
|
|
93
|
+
if (options.json) {
|
|
94
|
+
const output = { ...config };
|
|
95
|
+
if (output.token && !options.showToken) {
|
|
96
|
+
output.token = maskToken(output.token);
|
|
97
|
+
}
|
|
98
|
+
console.log(JSON.stringify(output, null, 2));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const token = await probeTokenPresence();
|
|
102
|
+
if (read.state === 'missing' && token.state === 'missing') {
|
|
103
|
+
console.log(`${chalk.dim('Config file:')} ${CONFIG_PATH} ${chalk.dim('(not created yet)')}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.log(formatConfigView(config, token, options.showToken ?? false, read.state === 'missing'));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/commands/config/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { MutationOptions } from '../../lib/options.js';
|
|
2
2
|
type CreateOptions = MutationOptions & {
|
|
3
3
|
notify?: string;
|
|
4
|
+
unarchive?: boolean;
|
|
4
5
|
};
|
|
5
6
|
export declare function createThread(channelRef: string, title: string, content: string | undefined, options: CreateOptions): Promise<void>;
|
|
6
7
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/thread/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/thread/create.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAM3D,KAAK,aAAa,GAAG,eAAe,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,wBAAsB,YAAY,CAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,IAAI,CAAC,CA2Ef"}
|