@doist/twist-cli 2.41.2 → 2.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/commands/auth/login.d.ts.map +1 -1
  3. package/dist/commands/auth/login.js +2 -2
  4. package/dist/commands/auth/login.js.map +1 -1
  5. package/dist/commands/channel/add.d.ts +3 -0
  6. package/dist/commands/channel/add.d.ts.map +1 -0
  7. package/dist/commands/channel/add.js +5 -0
  8. package/dist/commands/channel/add.js.map +1 -0
  9. package/dist/commands/channel/index.d.ts.map +1 -1
  10. package/dist/commands/channel/index.js +77 -0
  11. package/dist/commands/channel/index.js.map +1 -1
  12. package/dist/commands/channel/members.d.ts +5 -0
  13. package/dist/commands/channel/members.d.ts.map +1 -0
  14. package/dist/commands/channel/members.js +57 -0
  15. package/dist/commands/channel/members.js.map +1 -0
  16. package/dist/commands/channel/membership-helpers.d.ts +20 -0
  17. package/dist/commands/channel/membership-helpers.d.ts.map +1 -0
  18. package/dist/commands/channel/membership-helpers.js +117 -0
  19. package/dist/commands/channel/membership-helpers.js.map +1 -0
  20. package/dist/commands/channel/remove.d.ts +3 -0
  21. package/dist/commands/channel/remove.d.ts.map +1 -0
  22. package/dist/commands/channel/remove.js +5 -0
  23. package/dist/commands/channel/remove.js.map +1 -0
  24. package/dist/commands/channel/set.d.ts +7 -0
  25. package/dist/commands/channel/set.d.ts.map +1 -0
  26. package/dist/commands/channel/set.js +70 -0
  27. package/dist/commands/channel/set.js.map +1 -0
  28. package/dist/lib/api.d.ts +2 -0
  29. package/dist/lib/api.d.ts.map +1 -1
  30. package/dist/lib/api.js +10 -0
  31. package/dist/lib/api.js.map +1 -1
  32. package/dist/lib/auth-provider.d.ts +19 -0
  33. package/dist/lib/auth-provider.d.ts.map +1 -1
  34. package/dist/lib/auth-provider.js +86 -144
  35. package/dist/lib/auth-provider.js.map +1 -1
  36. package/dist/lib/refs.d.ts +20 -0
  37. package/dist/lib/refs.d.ts.map +1 -1
  38. package/dist/lib/refs.js +76 -0
  39. package/dist/lib/refs.js.map +1 -1
  40. package/dist/lib/skills/content.d.ts +1 -1
  41. package/dist/lib/skills/content.d.ts.map +1 -1
  42. package/dist/lib/skills/content.js +10 -0
  43. package/dist/lib/skills/content.js.map +1 -1
  44. package/package.json +5 -4
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [2.43.0](https://github.com/Doist/twist-cli/compare/v2.42.0...v2.43.0) (2026-05-22)
2
+
3
+ ### Features
4
+
5
+ - **channel:** channel membership control (members/add/remove/sync) ([#244](https://github.com/Doist/twist-cli/issues/244)) ([84ea32b](https://github.com/Doist/twist-cli/commit/84ea32b6498597ecfbc0ce9ce5094c19dbc0ee07))
6
+
7
+ ## [2.42.0](https://github.com/Doist/twist-cli/compare/v2.41.2...v2.42.0) (2026-05-21)
8
+
9
+ ### Features
10
+
11
+ - **auth:** adopt cli-core createDcrProvider for OAuth ([#243](https://github.com/Doist/twist-cli/issues/243)) ([670d6df](https://github.com/Doist/twist-cli/commit/670d6dfac79c0e9059ff62a5a8defb4a7a2c00c7))
12
+
1
13
  ## [2.41.2](https://github.com/Doist/twist-cli/compare/v2.41.1...v2.41.2) (2026-05-20)
2
14
 
3
15
  ### Bug Fixes
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAIH,KAAK,eAAe,EACvB,MAAM,4BAA4B,CAAA;AAKnC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CA0BxF"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAGH,KAAK,eAAe,EACvB,MAAM,4BAA4B,CAAA;AAKnC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CA0BxF"}
@@ -1,7 +1,7 @@
1
1
  import { attachLoginCommand } from '@doist/cli-core/auth';
2
2
  import chalk from 'chalk';
3
3
  import { renderError, renderSuccess } from '../../lib/auth-pages.js';
4
- import { createTwistAuthProvider, READ_ONLY_SCOPES, READ_WRITE_SCOPES, } from '../../lib/auth-provider.js';
4
+ import { createTwistAuthProvider, getScopes, } from '../../lib/auth-provider.js';
5
5
  import { logTokenStorageResult } from './helpers.js';
6
6
  const PREFERRED_CALLBACK_PORT = 8766;
7
7
  export function attachTwistLoginCommand(parent, store) {
@@ -10,7 +10,7 @@ export function attachTwistLoginCommand(parent, store) {
10
10
  provider,
11
11
  store,
12
12
  preferredPort: PREFERRED_CALLBACK_PORT,
13
- resolveScopes: ({ readOnly }) => (readOnly ? READ_ONLY_SCOPES : READ_WRITE_SCOPES),
13
+ resolveScopes: ({ readOnly }) => getScopes(readOnly),
14
14
  renderSuccess,
15
15
  renderError,
16
16
  onSuccess({ view, account }) {
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EACH,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,GAEpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,uBAAuB,GAAG,IAAI,CAAA;AAEpC,MAAM,UAAU,uBAAuB,CAAC,MAAe,EAAE,KAAsB;IAC3E,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAA;IAE1C,OAAO,kBAAkB,CAAC,MAAM,EAAE;QAC9B,QAAQ;QACR,KAAK;QACL,aAAa,EAAE,uBAAuB;QACtC,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAClF,aAAa;QACb,WAAW;QACX,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YACvB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAA;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAA;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC3D,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAA;YAC3C,IAAI,MAAM,EAAE,CAAC;gBACT,qBAAqB,CACjB,MAAM,EACN,wDAAwD,EACxD,eAAe,CAClB,CAAA;YACL,CAAC;QACL,CAAC;KACJ,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EACH,uBAAuB,EACvB,SAAS,GAEZ,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,uBAAuB,GAAG,IAAI,CAAA;AAEpC,MAAM,UAAU,uBAAuB,CAAC,MAAe,EAAE,KAAsB;IAC3E,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAA;IAE1C,OAAO,kBAAkB,CAAC,MAAM,EAAE;QAC9B,QAAQ;QACR,KAAK;QACL,aAAa,EAAE,uBAAuB;QACtC,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC;QACpD,aAAa;QACb,WAAW;QACX,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YACvB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAA;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAA;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC3D,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAA;YAC3C,IAAI,MAAM,EAAE,CAAC;gBACT,qBAAqB,CACjB,MAAM,EACN,wDAAwD,EACxD,eAAe,CAClB,CAAA;YACL,CAAC;QACL,CAAC;KACJ,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ChannelMutationOptions } from './membership-helpers.js';
2
+ export declare function addChannelMembers(channelRef: string, refs: string[], options: ChannelMutationOptions): Promise<void>;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAA2B,MAAM,yBAAyB,CAAA;AAE9F,wBAAsB,iBAAiB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,5 @@
1
+ import { mutateChannelMembership } from './membership-helpers.js';
2
+ export async function addChannelMembers(channelRef, refs, options) {
3
+ return mutateChannelMembership(channelRef, refs, 'add', options);
4
+ }
5
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/channel/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAE9F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,UAAkB,EAClB,IAAc,EACd,OAA+B;IAE/B,OAAO,uBAAuB,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AACpE,CAAC"}
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAS3C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6K7D"}
@@ -1,6 +1,10 @@
1
1
  import { Option } from 'commander';
2
2
  import { withCaseInsensitiveChoices } from '../../lib/completion.js';
3
+ import { addChannelMembers } from './add.js';
3
4
  import { listChannels } from './list.js';
5
+ import { listChannelMembers } from './members.js';
6
+ import { removeChannelMembers } from './remove.js';
7
+ import { setChannelMembers } from './set.js';
4
8
  import { showChannelThreads } from './threads.js';
5
9
  export function registerChannelCommand(program) {
6
10
  const channel = program
@@ -63,5 +67,78 @@ Notes:
63
67
  Sorted newest-first by last activity. --limit, --cursor, --since, --until,
64
68
  and --unread are applied client-side; --archive-filter is applied server-side.`)
65
69
  .action(showChannelThreads);
70
+ const members = channel
71
+ .command('members')
72
+ .description('Channel membership operations (list, add, remove, set)');
73
+ members
74
+ .command('list <channel-ref>', { isDefault: true })
75
+ .description("List a channel's members and groups fully present in the channel")
76
+ .option('--json', 'Output as JSON')
77
+ .option('--ndjson', 'Output as newline-delimited JSON')
78
+ .option('--full', 'Include all fields in JSON output')
79
+ .addHelpText('after', `
80
+ Examples:
81
+ tw channel members 12345
82
+ tw channel members "general" --json
83
+ tw channel members add 12345 alice group:Design
84
+ tw channel members remove 12345 alice
85
+ tw channel members set 12345 group:Squad --apply
86
+
87
+ Notes:
88
+ "Groups fully in channel" lists groups whose entire current membership is
89
+ already in the channel — a hint, not a persistent link.`)
90
+ .action(listChannelMembers);
91
+ members
92
+ .command('add <channel-ref> [refs...]')
93
+ .description('Add users and/or groups to a channel')
94
+ .option('--dry-run', 'Show what would change without changing')
95
+ .option('--json', 'Output result as JSON')
96
+ .option('--full', 'Include the full updated channel in JSON output')
97
+ .addHelpText('after', `
98
+ Examples:
99
+ tw channel members add 12345 alice@doist.com bob@doist.com
100
+ tw channel members add "general" group:Frontend
101
+ tw channel members add 12345 alice group:Design id:789 --json
102
+
103
+ Notes:
104
+ Refs accept user identifiers (id:N, email, name) or "group:<ref>" to expand
105
+ a group to its current members. Group expansion is one-shot — users added
106
+ later to the group will not auto-join the channel.`)
107
+ .action(addChannelMembers);
108
+ members
109
+ .command('remove <channel-ref> [refs...]')
110
+ .description('Remove users and/or groups from a channel')
111
+ .option('--dry-run', 'Show what would change without changing')
112
+ .option('--json', 'Output result as JSON')
113
+ .option('--full', 'Include the full updated channel in JSON output')
114
+ .addHelpText('after', `
115
+ Examples:
116
+ tw channel members remove 12345 alice@doist.com
117
+ tw channel members remove "general" group:Frontend
118
+
119
+ Notes:
120
+ Refs accept user identifiers (id:N, email, name) or "group:<ref>" to expand
121
+ a group to its current members.`)
122
+ .action(removeChannelMembers);
123
+ members
124
+ .command('set <channel-ref> [refs...]')
125
+ .description('Replace channel membership with the resolved set of refs')
126
+ .option('--apply', 'Actually mutate (otherwise dry-run)')
127
+ .option('--include-self', 'Allow set to remove the acting user')
128
+ .option('--dry-run', 'Force dry-run (default behaviour)')
129
+ .option('--json', 'Output result as JSON')
130
+ .option('--full', 'Include the full updated channel in JSON output')
131
+ .addHelpText('after', `
132
+ Examples:
133
+ tw channel members set 12345 group:Frontend group:Design
134
+ tw channel members set "general" alice bob carol --apply
135
+ tw channel members set 12345 group:Squad --apply --include-self
136
+
137
+ Notes:
138
+ Dry-run by default. Pass --apply to mutate.
139
+ Refuses to remove the acting user unless --include-self is also passed.
140
+ Group expansion is one-shot — users added later to a referenced group will
141
+ not auto-join the channel.`)
142
+ .action(setChannelMembers);
66
143
  }
67
144
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ViewOptions } from '../../lib/options.js';
2
+ export declare function listChannelMembers(channelRef: string, options: ViewOptions & {
3
+ full?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/members.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAKvD,wBAAsB,kBAAkB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CA4Df"}
@@ -0,0 +1,57 @@
1
+ import { getCurrentWorkspaceId, getWorkspaceGroups } from '../../lib/api.js';
2
+ import { colors, formatJson, formatNdjson, pluralize } from '../../lib/output.js';
3
+ import { resolveChannelRef } from '../../lib/refs.js';
4
+ import { channelUserIds, fetchUsersByIds, groupsFullyInChannel } from './membership-helpers.js';
5
+ export async function listChannelMembers(channelRef, options) {
6
+ const workspaceId = await getCurrentWorkspaceId();
7
+ const [channel, groups] = await Promise.all([
8
+ resolveChannelRef(channelRef, workspaceId),
9
+ getWorkspaceGroups(workspaceId),
10
+ ]);
11
+ const userIds = channelUserIds(channel);
12
+ const userMap = await fetchUsersByIds(workspaceId, userIds);
13
+ const userIdSet = new Set(userIds);
14
+ const fullyInChannel = groupsFullyInChannel(groups, userIdSet);
15
+ const members = userIds.map((id) => {
16
+ const user = userMap.get(id);
17
+ return { id, name: user?.name ?? null, email: user?.email ?? null };
18
+ });
19
+ const slimPayload = {
20
+ id: channel.id,
21
+ name: channel.name,
22
+ workspaceId: channel.workspaceId,
23
+ members,
24
+ groupsFullyInChannel: fullyInChannel.map((g) => ({
25
+ id: g.id,
26
+ name: g.name,
27
+ userIds: g.userIds,
28
+ })),
29
+ };
30
+ const fullPayload = { ...channel, members, groupsFullyInChannel: fullyInChannel };
31
+ if (options.json) {
32
+ console.log(formatJson(options.full ? fullPayload : slimPayload));
33
+ return;
34
+ }
35
+ if (options.ndjson) {
36
+ console.log(formatNdjson([options.full ? fullPayload : slimPayload]));
37
+ return;
38
+ }
39
+ console.log(colors.channel(channel.name));
40
+ console.log(colors.timestamp(`id:${channel.id}`));
41
+ console.log('');
42
+ console.log(`${members.length} ${pluralize(members.length, 'member')}`);
43
+ for (const m of members) {
44
+ const name = m.name ?? `user:${m.id}`;
45
+ const email = m.email ? colors.timestamp(`<${m.email}>`) : '';
46
+ const id = colors.timestamp(`id:${m.id}`);
47
+ console.log(` ${id} ${colors.author(name)} ${email}`.trimEnd());
48
+ }
49
+ if (fullyInChannel.length > 0) {
50
+ console.log('');
51
+ console.log(`Groups fully in channel (${fullyInChannel.length}):`);
52
+ for (const g of fullyInChannel) {
53
+ console.log(` ${colors.timestamp(`id:${g.id}`)} ${g.name} ${colors.timestamp(`(${g.userIds.length} ${pluralize(g.userIds.length, 'member')})`)}`);
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../../src/commands/channel/members.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Channel, Group, WorkspaceUser } from '@doist/twist-sdk';
2
+ import type { MutationOptions } from '../../lib/options.js';
3
+ export type ChannelMutationOptions = MutationOptions;
4
+ export type ExpandedGroup = {
5
+ groupId: number;
6
+ groupName: string;
7
+ userIds: number[];
8
+ };
9
+ export declare function channelUserIds(channel: Channel): number[];
10
+ export declare function fetchUsersByIds(workspaceId: number, userIds: number[]): Promise<Map<number, WorkspaceUser>>;
11
+ export declare function logExpansion(expandedFrom: ExpandedGroup[]): void;
12
+ export declare function describeExpansion(expandedFrom: ExpandedGroup[]): string | undefined;
13
+ export declare function groupsFullyInChannel(groups: Group[], channelUserIdSet: Set<number>): Group[];
14
+ /**
15
+ * Shared add/remove mutation flow. Resolves the channel and the requested refs
16
+ * concurrently, diffs against current membership, then either previews
17
+ * (`--dry-run`) or applies the mutation and prints / emits JSON.
18
+ */
19
+ export declare function mutateChannelMembership(channelRef: string, refs: string[], action: 'add' | 'remove', options: ChannelMutationOptions): Promise<void>;
20
+ //# sourceMappingURL=membership-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"membership-helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/membership-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAQrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAI3D,MAAM,MAAM,sBAAsB,GAAG,eAAe,CAAA;AAEpD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAErF,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAsB,eAAe,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAarC;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,IAAI,CAQhE;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,GAAG,SAAS,CAKnF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAI5F;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CACzC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,KAAK,GAAG,QAAQ,EACxB,OAAO,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC,CAqFf"}
@@ -0,0 +1,117 @@
1
+ import { addUsersToChannel, getCurrentWorkspaceId, getOptionalBatchData, getTwistClient, removeUsersFromChannel, } from '../../lib/api.js';
2
+ import { colors, formatJson, pluralize, printDryRun } from '../../lib/output.js';
3
+ import { resolveChannelMemberRefs, resolveChannelRef } from '../../lib/refs.js';
4
+ export function channelUserIds(channel) {
5
+ return channel.userIds ?? [];
6
+ }
7
+ export async function fetchUsersByIds(workspaceId, userIds) {
8
+ if (userIds.length === 0)
9
+ return new Map();
10
+ const client = await getTwistClient();
11
+ const calls = userIds.map((userId) => client.workspaceUsers.getUserById({ workspaceId, userId }, { batch: true }));
12
+ const responses = await client.batch(...calls);
13
+ const map = new Map();
14
+ userIds.forEach((id, i) => {
15
+ const user = getOptionalBatchData(responses[i], `user ${id}`);
16
+ if (user)
17
+ map.set(id, user);
18
+ });
19
+ return map;
20
+ }
21
+ export function logExpansion(expandedFrom) {
22
+ for (const g of expandedFrom) {
23
+ console.log(colors.timestamp(`Expanded group "${g.groupName}" → ${g.userIds.length} ${pluralize(g.userIds.length, 'user')}`));
24
+ }
25
+ }
26
+ export function describeExpansion(expandedFrom) {
27
+ if (expandedFrom.length === 0)
28
+ return undefined;
29
+ return expandedFrom
30
+ .map((g) => `${g.groupName} (id:${g.groupId}, ${g.userIds.length} users)`)
31
+ .join('\n');
32
+ }
33
+ export function groupsFullyInChannel(groups, channelUserIdSet) {
34
+ return groups.filter((g) => g.userIds.length > 0 && g.userIds.every((id) => channelUserIdSet.has(id)));
35
+ }
36
+ /**
37
+ * Shared add/remove mutation flow. Resolves the channel and the requested refs
38
+ * concurrently, diffs against current membership, then either previews
39
+ * (`--dry-run`) or applies the mutation and prints / emits JSON.
40
+ */
41
+ export async function mutateChannelMembership(channelRef, refs, action, options) {
42
+ const workspaceId = await getCurrentWorkspaceId();
43
+ const [channel, { userIds: requested, expandedFrom }] = await Promise.all([
44
+ resolveChannelRef(channelRef, workspaceId),
45
+ resolveChannelMemberRefs(refs, workspaceId),
46
+ ]);
47
+ const current = new Set(channelUserIds(channel));
48
+ const actionable = action === 'add'
49
+ ? requested.filter((id) => !current.has(id))
50
+ : requested.filter((id) => current.has(id));
51
+ const skipped = action === 'add'
52
+ ? requested.filter((id) => current.has(id))
53
+ : requested.filter((id) => !current.has(id));
54
+ const actionLabel = action === 'add' ? 'add users to' : 'remove users from';
55
+ const skippedLabel = action === 'add' ? 'Already members' : 'Not members';
56
+ if (options.dryRun) {
57
+ printDryRun(`${actionLabel} channel`, {
58
+ Channel: `${channel.name} (id:${channel.id})`,
59
+ 'Expanded from groups': describeExpansion(expandedFrom),
60
+ [`Users to ${action}`]: actionable.length > 0 ? actionable.join(', ') : '(none)',
61
+ [skippedLabel]: skipped.length > 0 ? skipped.join(', ') : undefined,
62
+ });
63
+ return;
64
+ }
65
+ if (actionable.length > 0) {
66
+ if (action === 'add') {
67
+ await addUsersToChannel(channel.id, actionable);
68
+ }
69
+ else {
70
+ await removeUsersFromChannel(channel.id, actionable);
71
+ }
72
+ }
73
+ const newMemberCount = action === 'add'
74
+ ? channelUserIds(channel).length + actionable.length
75
+ : channelUserIds(channel).length - actionable.length;
76
+ if (options.json) {
77
+ if (options.full) {
78
+ const client = await getTwistClient();
79
+ const updated = await client.channels.getChannel(channel.id);
80
+ console.log(formatJson(updated, 'channel', true));
81
+ }
82
+ else {
83
+ const result = {
84
+ id: channel.id,
85
+ memberCount: newMemberCount,
86
+ };
87
+ if (expandedFrom.length > 0)
88
+ result.expandedFrom = expandedFrom;
89
+ if (action === 'add') {
90
+ result.added = actionable;
91
+ result.alreadyMembers = skipped;
92
+ }
93
+ else {
94
+ result.removed = actionable;
95
+ result.notMembers = skipped;
96
+ }
97
+ console.log(formatJson(result));
98
+ }
99
+ return;
100
+ }
101
+ const pastVerb = action === 'add' ? 'Added' : 'Removed';
102
+ const preposition = action === 'add' ? 'to' : 'from';
103
+ const noneMsg = action === 'add'
104
+ ? `No new members added to "${channel.name}" (already in channel).`
105
+ : `No members removed from "${channel.name}" (none of the users were in channel).`;
106
+ logExpansion(expandedFrom);
107
+ if (actionable.length === 0) {
108
+ console.log(noneMsg);
109
+ }
110
+ else {
111
+ console.log(`${pastVerb} ${actionable.length} ${pluralize(actionable.length, 'user')} ${preposition} "${channel.name}" (now ${newMemberCount} ${pluralize(newMemberCount, 'member')}).`);
112
+ }
113
+ if (skipped.length > 0) {
114
+ console.log(`${skippedLabel}: ${skipped.join(', ')}`);
115
+ }
116
+ }
117
+ //# sourceMappingURL=membership-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"membership-helpers.js","sourceRoot":"","sources":["../../../src/commands/channel/membership-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ChannelMutationOptions } from './membership-helpers.js';
2
+ export declare function removeChannelMembers(channelRef: string, refs: string[], options: ChannelMutationOptions): Promise<void>;
3
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAA2B,MAAM,yBAAyB,CAAA;AAE9F,wBAAsB,oBAAoB,CACtC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,5 @@
1
+ import { mutateChannelMembership } from './membership-helpers.js';
2
+ export async function removeChannelMembers(channelRef, refs, options) {
3
+ return mutateChannelMembership(channelRef, refs, 'remove', options);
4
+ }
5
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/channel/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAE9F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,UAAkB,EAClB,IAAc,EACd,OAA+B;IAE/B,OAAO,uBAAuB,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;AACvE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { MutationOptions } from '../../lib/options.js';
2
+ export type SetOptions = MutationOptions & {
3
+ apply?: boolean;
4
+ includeSelf?: boolean;
5
+ };
6
+ export declare function setChannelMembers(channelRef: string, refs: string[], options: SetOptions): Promise<void>;
7
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/set.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAK3D,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG;IACvC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,wBAAsB,iBAAiB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,UAAU,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
@@ -0,0 +1,70 @@
1
+ import { addUsersToChannel, getCurrentWorkspaceId, getSessionUser, getTwistClient, removeUsersFromChannel, } from '../../lib/api.js';
2
+ import { CliError } from '../../lib/errors.js';
3
+ import { formatJson, pluralize, printDryRun } from '../../lib/output.js';
4
+ import { resolveChannelMemberRefs, resolveChannelRef } from '../../lib/refs.js';
5
+ import { channelUserIds, describeExpansion, logExpansion } from './membership-helpers.js';
6
+ export async function setChannelMembers(channelRef, refs, options) {
7
+ const workspaceId = await getCurrentWorkspaceId();
8
+ const [channel, sessionUser, memberRefs] = await Promise.all([
9
+ resolveChannelRef(channelRef, workspaceId),
10
+ getSessionUser(),
11
+ resolveChannelMemberRefs(refs, workspaceId),
12
+ ]);
13
+ const { userIds: targetIds, expandedFrom } = memberRefs;
14
+ const desired = new Set(targetIds);
15
+ const current = new Set(channelUserIds(channel));
16
+ const toAdd = [...desired].filter((id) => !current.has(id));
17
+ const toRemoveAll = [...current].filter((id) => !desired.has(id));
18
+ const selfId = sessionUser.id;
19
+ const wouldRemoveSelf = toRemoveAll.includes(selfId);
20
+ if (wouldRemoveSelf && !options.includeSelf) {
21
+ throw new CliError('INVALID_VALUE', `Set would remove you (id:${selfId}) from "${channel.name}".`, [
22
+ 'Pass --include-self to allow removing yourself, or include yourself in the ref list.',
23
+ ]);
24
+ }
25
+ const toRemove = wouldRemoveSelf && !options.includeSelf
26
+ ? toRemoveAll.filter((id) => id !== selfId)
27
+ : toRemoveAll;
28
+ const isDryRun = options.dryRun || !options.apply;
29
+ if (isDryRun) {
30
+ printDryRun(`set channel membership`, {
31
+ Channel: `${channel.name} (id:${channel.id})`,
32
+ 'Expanded from groups': describeExpansion(expandedFrom),
33
+ 'To add': toAdd.length > 0 ? toAdd.join(', ') : '(none)',
34
+ 'To remove': toRemove.length > 0 ? toRemove.join(', ') : '(none)',
35
+ Note: options.apply ? undefined : 'set is dry-run by default; pass --apply to mutate.',
36
+ });
37
+ return;
38
+ }
39
+ await Promise.all([
40
+ toAdd.length > 0 ? addUsersToChannel(channel.id, toAdd) : Promise.resolve(),
41
+ toRemove.length > 0 ? removeUsersFromChannel(channel.id, toRemove) : Promise.resolve(),
42
+ ]);
43
+ const newMemberCount = current.size + toAdd.length - toRemove.length;
44
+ if (options.json) {
45
+ const result = {
46
+ id: channel.id,
47
+ memberCount: newMemberCount,
48
+ added: toAdd,
49
+ removed: toRemove,
50
+ };
51
+ if (expandedFrom.length > 0)
52
+ result.expandedFrom = expandedFrom;
53
+ if (options.full) {
54
+ const client = await getTwistClient();
55
+ const updated = await client.channels.getChannel(channel.id);
56
+ console.log(formatJson({ ...updated, ...result }, 'channel', true));
57
+ }
58
+ else {
59
+ console.log(formatJson(result));
60
+ }
61
+ return;
62
+ }
63
+ logExpansion(expandedFrom);
64
+ console.log(`Set "${channel.name}": +${toAdd.length} / -${toRemove.length} (now ${newMemberCount} ${pluralize(newMemberCount, 'member')}).`);
65
+ if (toAdd.length > 0)
66
+ console.log(` Added: ${toAdd.join(', ')}`);
67
+ if (toRemove.length > 0)
68
+ console.log(` Removed: ${toRemove.join(', ')}`);
69
+ }
70
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/channel/set.ts"],"names":[],"mappings":"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"}
package/dist/lib/api.d.ts CHANGED
@@ -20,6 +20,8 @@ export declare function updateGroup(args: {
20
20
  export declare function deleteGroup(id: number): Promise<void>;
21
21
  export declare function addUsersToGroup(id: number, userIds: number[]): Promise<void>;
22
22
  export declare function removeUsersFromGroup(id: number, userIds: number[]): Promise<void>;
23
+ export declare function addUsersToChannel(id: number, userIds: number[]): Promise<void>;
24
+ export declare function removeUsersFromChannel(id: number, userIds: number[]): Promise<void>;
23
25
  export declare function clearUserCache(): void;
24
26
  type BatchResult<T> = Pick<BatchResponse<T>, 'code' | 'data'>;
25
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
package/dist/lib/api.js CHANGED
@@ -38,6 +38,8 @@ const API_SPINNER_MESSAGES = {
38
38
  'channels.createChannel': { text: 'Creating channel...', color: 'green' },
39
39
  'channels.updateChannel': { text: 'Updating channel...', color: 'yellow' },
40
40
  'channels.deleteChannel': { text: 'Deleting channel...', color: 'yellow' },
41
+ 'channels.addUsers': { text: 'Adding users to channel...', color: 'green' },
42
+ 'channels.removeUsers': { text: 'Removing users from channel...', color: 'yellow' },
41
43
  // Conversation operations
42
44
  'conversations.getConversations': { text: 'Loading conversations...', color: 'blue' },
43
45
  'conversations.getConversation': { text: 'Loading conversation...', color: 'blue' },
@@ -261,6 +263,14 @@ export async function removeUsersFromGroup(id, userIds) {
261
263
  const client = await getTwistClient();
262
264
  await client.groups.removeUsers({ id, userIds });
263
265
  }
266
+ export async function addUsersToChannel(id, userIds) {
267
+ const client = await getTwistClient();
268
+ await client.channels.addUsers({ id, userIds });
269
+ }
270
+ export async function removeUsersFromChannel(id, userIds) {
271
+ const client = await getTwistClient();
272
+ await client.channels.removeUsers({ id, userIds });
273
+ }
264
274
  export function clearUserCache() {
265
275
  sessionUserCache = null;
266
276
  }