@doist/twist-cli 2.20.0 → 2.21.1

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 (198) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/package.json +3 -5
  3. package/dist/__mocks__/chalk.d.ts +0 -3
  4. package/dist/__mocks__/chalk.d.ts.map +0 -1
  5. package/dist/__mocks__/chalk.js +0 -8
  6. package/dist/__mocks__/chalk.js.map +0 -1
  7. package/dist/commands/auth.d.ts +0 -3
  8. package/dist/commands/auth.d.ts.map +0 -1
  9. package/dist/commands/auth.js +0 -155
  10. package/dist/commands/auth.js.map +0 -1
  11. package/dist/commands/away.d.ts +0 -3
  12. package/dist/commands/away.d.ts.map +0 -1
  13. package/dist/commands/away.js +0 -120
  14. package/dist/commands/away.js.map +0 -1
  15. package/dist/commands/changelog.d.ts +0 -8
  16. package/dist/commands/changelog.d.ts.map +0 -1
  17. package/dist/commands/changelog.js +0 -113
  18. package/dist/commands/changelog.js.map +0 -1
  19. package/dist/commands/channel.d.ts +0 -3
  20. package/dist/commands/channel.d.ts.map +0 -1
  21. package/dist/commands/channel.js +0 -53
  22. package/dist/commands/channel.js.map +0 -1
  23. package/dist/commands/comment.d.ts +0 -3
  24. package/dist/commands/comment.d.ts.map +0 -1
  25. package/dist/commands/comment.js +0 -99
  26. package/dist/commands/comment.js.map +0 -1
  27. package/dist/commands/completion.d.ts +0 -3
  28. package/dist/commands/completion.d.ts.map +0 -1
  29. package/dist/commands/completion.js +0 -121
  30. package/dist/commands/completion.js.map +0 -1
  31. package/dist/commands/conversation.d.ts +0 -3
  32. package/dist/commands/conversation.d.ts.map +0 -1
  33. package/dist/commands/conversation.js +0 -394
  34. package/dist/commands/conversation.js.map +0 -1
  35. package/dist/commands/inbox.d.ts +0 -3
  36. package/dist/commands/inbox.d.ts.map +0 -1
  37. package/dist/commands/inbox.js +0 -127
  38. package/dist/commands/inbox.js.map +0 -1
  39. package/dist/commands/msg.d.ts +0 -3
  40. package/dist/commands/msg.d.ts.map +0 -1
  41. package/dist/commands/msg.js +0 -103
  42. package/dist/commands/msg.js.map +0 -1
  43. package/dist/commands/react.d.ts +0 -3
  44. package/dist/commands/react.d.ts.map +0 -1
  45. package/dist/commands/react.js +0 -102
  46. package/dist/commands/react.js.map +0 -1
  47. package/dist/commands/search.d.ts +0 -3
  48. package/dist/commands/search.d.ts.map +0 -1
  49. package/dist/commands/search.js +0 -160
  50. package/dist/commands/search.js.map +0 -1
  51. package/dist/commands/skill.d.ts +0 -3
  52. package/dist/commands/skill.d.ts.map +0 -1
  53. package/dist/commands/skill.js +0 -119
  54. package/dist/commands/skill.js.map +0 -1
  55. package/dist/commands/thread/create.d.ts +0 -7
  56. package/dist/commands/thread/create.d.ts.map +0 -1
  57. package/dist/commands/thread/create.js +0 -45
  58. package/dist/commands/thread/create.js.map +0 -1
  59. package/dist/commands/thread/helpers.d.ts +0 -10
  60. package/dist/commands/thread/helpers.d.ts.map +0 -1
  61. package/dist/commands/thread/helpers.js +0 -27
  62. package/dist/commands/thread/helpers.js.map +0 -1
  63. package/dist/commands/thread/mutate.d.ts +0 -5
  64. package/dist/commands/thread/mutate.d.ts.map +0 -1
  65. package/dist/commands/thread/mutate.js +0 -21
  66. package/dist/commands/thread/mutate.js.map +0 -1
  67. package/dist/commands/thread/reply.d.ts +0 -9
  68. package/dist/commands/thread/reply.d.ts.map +0 -1
  69. package/dist/commands/thread/reply.js +0 -68
  70. package/dist/commands/thread/reply.js.map +0 -1
  71. package/dist/commands/thread/view.d.ts +0 -9
  72. package/dist/commands/thread/view.d.ts.map +0 -1
  73. package/dist/commands/thread/view.js +0 -175
  74. package/dist/commands/thread/view.js.map +0 -1
  75. package/dist/commands/thread.d.ts +0 -3
  76. package/dist/commands/thread.d.ts.map +0 -1
  77. package/dist/commands/thread.js +0 -54
  78. package/dist/commands/thread.js.map +0 -1
  79. package/dist/commands/update.d.ts +0 -14
  80. package/dist/commands/update.d.ts.map +0 -1
  81. package/dist/commands/update.js +0 -91
  82. package/dist/commands/update.js.map +0 -1
  83. package/dist/commands/user.d.ts +0 -3
  84. package/dist/commands/user.d.ts.map +0 -1
  85. package/dist/commands/user.js +0 -67
  86. package/dist/commands/user.js.map +0 -1
  87. package/dist/commands/view.d.ts +0 -3
  88. package/dist/commands/view.d.ts.map +0 -1
  89. package/dist/commands/view.js +0 -63
  90. package/dist/commands/view.js.map +0 -1
  91. package/dist/commands/workspace.d.ts +0 -3
  92. package/dist/commands/workspace.d.ts.map +0 -1
  93. package/dist/commands/workspace.js +0 -48
  94. package/dist/commands/workspace.js.map +0 -1
  95. package/dist/index.d.ts +0 -3
  96. package/dist/index.d.ts.map +0 -1
  97. package/dist/index.js +0 -133
  98. package/dist/index.js.map +0 -1
  99. package/dist/lib/api.d.ts +0 -20
  100. package/dist/lib/api.d.ts.map +0 -1
  101. package/dist/lib/api.js +0 -220
  102. package/dist/lib/api.js.map +0 -1
  103. package/dist/lib/auth.d.ts +0 -21
  104. package/dist/lib/auth.d.ts.map +0 -1
  105. package/dist/lib/auth.js +0 -189
  106. package/dist/lib/auth.js.map +0 -1
  107. package/dist/lib/completion.d.ts +0 -31
  108. package/dist/lib/completion.d.ts.map +0 -1
  109. package/dist/lib/completion.js +0 -173
  110. package/dist/lib/completion.js.map +0 -1
  111. package/dist/lib/config.d.ts +0 -13
  112. package/dist/lib/config.d.ts.map +0 -1
  113. package/dist/lib/config.js +0 -26
  114. package/dist/lib/config.js.map +0 -1
  115. package/dist/lib/dates.d.ts +0 -3
  116. package/dist/lib/dates.d.ts.map +0 -1
  117. package/dist/lib/dates.js +0 -44
  118. package/dist/lib/dates.js.map +0 -1
  119. package/dist/lib/input.d.ts +0 -3
  120. package/dist/lib/input.d.ts.map +0 -1
  121. package/dist/lib/input.js +0 -52
  122. package/dist/lib/input.js.map +0 -1
  123. package/dist/lib/markdown.d.ts +0 -2
  124. package/dist/lib/markdown.d.ts.map +0 -1
  125. package/dist/lib/markdown.js +0 -16
  126. package/dist/lib/markdown.js.map +0 -1
  127. package/dist/lib/oauth-server.d.ts +0 -13
  128. package/dist/lib/oauth-server.d.ts.map +0 -1
  129. package/dist/lib/oauth-server.js +0 -824
  130. package/dist/lib/oauth-server.js.map +0 -1
  131. package/dist/lib/oauth.d.ts +0 -31
  132. package/dist/lib/oauth.d.ts.map +0 -1
  133. package/dist/lib/oauth.js +0 -140
  134. package/dist/lib/oauth.js.map +0 -1
  135. package/dist/lib/options.d.ts +0 -17
  136. package/dist/lib/options.d.ts.map +0 -1
  137. package/dist/lib/options.js +0 -2
  138. package/dist/lib/options.js.map +0 -1
  139. package/dist/lib/output.d.ts +0 -25
  140. package/dist/lib/output.d.ts.map +0 -1
  141. package/dist/lib/output.js +0 -128
  142. package/dist/lib/output.js.map +0 -1
  143. package/dist/lib/permissions.d.ts +0 -4
  144. package/dist/lib/permissions.d.ts.map +0 -1
  145. package/dist/lib/permissions.js +0 -35
  146. package/dist/lib/permissions.js.map +0 -1
  147. package/dist/lib/pkce.d.ts +0 -16
  148. package/dist/lib/pkce.d.ts.map +0 -1
  149. package/dist/lib/pkce.js +0 -35
  150. package/dist/lib/pkce.js.map +0 -1
  151. package/dist/lib/progress.d.ts +0 -29
  152. package/dist/lib/progress.d.ts.map +0 -1
  153. package/dist/lib/progress.js +0 -101
  154. package/dist/lib/progress.js.map +0 -1
  155. package/dist/lib/public-channels.d.ts +0 -5
  156. package/dist/lib/public-channels.d.ts.map +0 -1
  157. package/dist/lib/public-channels.js +0 -35
  158. package/dist/lib/public-channels.js.map +0 -1
  159. package/dist/lib/refs.d.ts +0 -37
  160. package/dist/lib/refs.d.ts.map +0 -1
  161. package/dist/lib/refs.js +0 -219
  162. package/dist/lib/refs.js.map +0 -1
  163. package/dist/lib/search-api.d.ts +0 -25
  164. package/dist/lib/search-api.d.ts.map +0 -1
  165. package/dist/lib/search-api.js +0 -85
  166. package/dist/lib/search-api.js.map +0 -1
  167. package/dist/lib/secure-store.d.ts +0 -11
  168. package/dist/lib/secure-store.d.ts.map +0 -1
  169. package/dist/lib/secure-store.js +0 -57
  170. package/dist/lib/secure-store.js.map +0 -1
  171. package/dist/lib/skills/content.d.ts +0 -5
  172. package/dist/lib/skills/content.d.ts.map +0 -1
  173. package/dist/lib/skills/content.js +0 -274
  174. package/dist/lib/skills/content.js.map +0 -1
  175. package/dist/lib/skills/create-installer.d.ts +0 -9
  176. package/dist/lib/skills/create-installer.d.ts.map +0 -1
  177. package/dist/lib/skills/create-installer.js +0 -60
  178. package/dist/lib/skills/create-installer.js.map +0 -1
  179. package/dist/lib/skills/index.d.ts +0 -7
  180. package/dist/lib/skills/index.d.ts.map +0 -1
  181. package/dist/lib/skills/index.js +0 -54
  182. package/dist/lib/skills/index.js.map +0 -1
  183. package/dist/lib/skills/types.d.ts +0 -30
  184. package/dist/lib/skills/types.d.ts.map +0 -1
  185. package/dist/lib/skills/types.js +0 -2
  186. package/dist/lib/skills/types.js.map +0 -1
  187. package/dist/lib/skills/update-installed.d.ts +0 -9
  188. package/dist/lib/skills/update-installed.d.ts.map +0 -1
  189. package/dist/lib/skills/update-installed.js +0 -20
  190. package/dist/lib/skills/update-installed.js.map +0 -1
  191. package/dist/lib/spinner.d.ts +0 -24
  192. package/dist/lib/spinner.d.ts.map +0 -1
  193. package/dist/lib/spinner.js +0 -126
  194. package/dist/lib/spinner.js.map +0 -1
  195. package/dist/postinstall.d.ts +0 -2
  196. package/dist/postinstall.d.ts.map +0 -1
  197. package/dist/postinstall.js +0 -3
  198. package/dist/postinstall.js.map +0 -1
package/dist/lib/api.js DELETED
@@ -1,220 +0,0 @@
1
- import { TwistApi } from '@doist/twist-sdk';
2
- import { getApiToken } from './auth.js';
3
- import { getConfig, updateConfig } from './config.js';
4
- import { ensureWriteAllowed, isMutatingMethod } from './permissions.js';
5
- import { getProgressTracker } from './progress.js';
6
- import { withSpinner } from './spinner.js';
7
- // Mapping of API method paths to user-friendly spinner messages
8
- const API_SPINNER_MESSAGES = {
9
- // User operations
10
- 'users.getSessionUser': { text: 'Checking authentication...', color: 'blue' },
11
- 'users.update': { text: 'Updating user...', color: 'yellow' },
12
- // Workspace operations
13
- 'workspaces.getWorkspaces': { text: 'Loading workspaces...', color: 'blue' },
14
- 'workspaceUsers.getWorkspaceUsers': { text: 'Loading workspace users...', color: 'blue' },
15
- 'workspaceUsers.getUserById': { text: 'Loading user details...', color: 'blue' },
16
- // Thread operations
17
- 'threads.getThread': { text: 'Loading thread...', color: 'blue' },
18
- 'threads.getUnread': { text: 'Loading unread threads...', color: 'blue' },
19
- 'threads.createThread': { text: 'Creating thread...', color: 'green' },
20
- // Comment operations
21
- 'comments.getComment': { text: 'Loading comment...', color: 'blue' },
22
- 'comments.getComments': { text: 'Loading comments...', color: 'blue' },
23
- 'comments.createComment': { text: 'Creating comment...', color: 'green' },
24
- 'comments.updateComment': { text: 'Updating comment...', color: 'yellow' },
25
- 'comments.deleteComment': { text: 'Deleting comment...', color: 'yellow' },
26
- // Channel operations
27
- 'channels.getChannel': { text: 'Loading channel...', color: 'blue' },
28
- 'channels.getChannels': { text: 'Loading channels...', color: 'blue' },
29
- 'channels.createChannel': { text: 'Creating channel...', color: 'green' },
30
- 'channels.updateChannel': { text: 'Updating channel...', color: 'yellow' },
31
- 'channels.deleteChannel': { text: 'Deleting channel...', color: 'yellow' },
32
- // Conversation operations
33
- 'conversations.getConversations': { text: 'Loading conversations...', color: 'blue' },
34
- 'conversations.getConversation': { text: 'Loading conversation...', color: 'blue' },
35
- 'conversations.getUnread': { text: 'Loading unread conversations...', color: 'blue' },
36
- 'conversations.createConversation': { text: 'Creating conversation...', color: 'green' },
37
- 'conversations.archiveConversation': { text: 'Archiving conversation...', color: 'yellow' },
38
- 'conversations.unarchiveConversation': {
39
- text: 'Unarchiving conversation...',
40
- color: 'yellow',
41
- },
42
- // Conversation message operations
43
- 'conversationMessages.getMessage': { text: 'Loading message...', color: 'blue' },
44
- 'conversationMessages.getMessages': { text: 'Loading messages...', color: 'blue' },
45
- 'conversationMessages.createMessage': { text: 'Sending message...', color: 'green' },
46
- 'conversationMessages.updateMessage': { text: 'Updating message...', color: 'yellow' },
47
- 'conversationMessages.deleteMessage': { text: 'Deleting message...', color: 'yellow' },
48
- // Inbox operations
49
- 'inbox.getInbox': { text: 'Loading inbox...', color: 'blue' },
50
- 'inbox.archiveThread': { text: 'Archiving thread...', color: 'yellow' },
51
- // Batch operations
52
- batch: { text: 'Processing batch operations...', color: 'blue' },
53
- };
54
- function createSpinnerWrappedApi(api) {
55
- return new Proxy(api, {
56
- get(target, property, receiver) {
57
- const value = Reflect.get(target, property, receiver);
58
- // If this is a nested object (like workspaces, users, etc.), wrap it too
59
- if (value &&
60
- typeof value === 'object' &&
61
- !Array.isArray(value) &&
62
- typeof property === 'string') {
63
- return createNestedSpinnerProxy(value, property);
64
- }
65
- return value;
66
- },
67
- });
68
- }
69
- function createNestedSpinnerProxy(obj, basePath) {
70
- return new Proxy(obj, {
71
- get(target, property, receiver) {
72
- const originalMethod = Reflect.get(target, property, receiver);
73
- if (typeof originalMethod !== 'function' || typeof property !== 'string') {
74
- return originalMethod;
75
- }
76
- const fullPath = `${basePath}.${property}`;
77
- const spinnerConfig = API_SPINNER_MESSAGES[fullPath];
78
- const shouldCheckPermissions = isMutatingMethod(fullPath);
79
- if (!spinnerConfig && !shouldCheckPermissions) {
80
- return originalMethod;
81
- }
82
- return (...args) => {
83
- const progressTracker = getProgressTracker();
84
- // Extract cursor from args for paginated methods
85
- let cursor = null;
86
- if (args.length > 0 && typeof args[0] === 'object' && args[0] !== null) {
87
- const options = args[0];
88
- if ('cursor' in options && typeof options.cursor === 'string') {
89
- cursor = options.cursor;
90
- }
91
- }
92
- // Emit progress event for API call start
93
- if (progressTracker.isEnabled()) {
94
- progressTracker.emitApiCall(property, cursor);
95
- }
96
- // For mutating methods, check permissions before calling the API
97
- if (shouldCheckPermissions) {
98
- return ensureWriteAllowed().then(() => {
99
- const result = originalMethod.apply(target, args);
100
- return wrapResult(result, progressTracker, spinnerConfig);
101
- });
102
- }
103
- const result = originalMethod.apply(target, args);
104
- return wrapResult(result, progressTracker, spinnerConfig);
105
- };
106
- },
107
- });
108
- }
109
- function wrapResult(result, progressTracker, spinnerConfig) {
110
- // If the method returns a non-thenable (e.g. batch request builder), return as-is
111
- if (!result || typeof result.then !== 'function') {
112
- return result;
113
- }
114
- const wrappedPromise = result
115
- .then((response) => {
116
- if (progressTracker.isEnabled()) {
117
- analyzeAndEmitApiResponse(progressTracker, response);
118
- }
119
- return response;
120
- })
121
- .catch((error) => {
122
- if (progressTracker.isEnabled()) {
123
- progressTracker.emitError(error.name || 'API_ERROR', error.message);
124
- }
125
- throw error;
126
- });
127
- if (spinnerConfig) {
128
- return withSpinner(spinnerConfig, () => wrappedPromise);
129
- }
130
- return wrappedPromise;
131
- }
132
- function analyzeAndEmitApiResponse(progressTracker, response) {
133
- // For paginated responses, extract metadata
134
- if (response && typeof response === 'object' && response !== null) {
135
- const resp = response;
136
- // Check if it's a paginated response with results array
137
- if ('results' in resp && Array.isArray(resp.results)) {
138
- progressTracker.emitApiResponse(resp.results.length, Boolean(resp.nextCursor), typeof resp.nextCursor === 'string' ? resp.nextCursor : null);
139
- return;
140
- }
141
- // For array responses (legacy or simple lists)
142
- if (Array.isArray(response)) {
143
- progressTracker.emitApiResponse(response.length, false, null);
144
- return;
145
- }
146
- }
147
- // For other responses, emit minimal info
148
- progressTracker.emitApiResponse(1, false, null);
149
- }
150
- let apiClient = null;
151
- export async function getTwistClient() {
152
- if (!apiClient) {
153
- const token = await getApiToken();
154
- const rawApi = new TwistApi(token);
155
- apiClient = createSpinnerWrappedApi(rawApi);
156
- }
157
- return apiClient;
158
- }
159
- let workspaceCache = null;
160
- let sessionUserCache = null;
161
- export async function fetchWorkspaces() {
162
- if (workspaceCache) {
163
- return workspaceCache;
164
- }
165
- const client = await getTwistClient();
166
- workspaceCache = await client.workspaces.getWorkspaces();
167
- return workspaceCache;
168
- }
169
- export function clearWorkspaceCache() {
170
- workspaceCache = null;
171
- }
172
- export async function getCurrentWorkspaceId(flagValue) {
173
- if (flagValue) {
174
- return flagValue;
175
- }
176
- const config = await getConfig();
177
- if (config.currentWorkspace) {
178
- return config.currentWorkspace;
179
- }
180
- const sessionUser = await getSessionUser();
181
- if (sessionUser.defaultWorkspace) {
182
- await updateConfig({ currentWorkspace: sessionUser.defaultWorkspace });
183
- return sessionUser.defaultWorkspace;
184
- }
185
- const workspaces = await fetchWorkspaces();
186
- if (workspaces.length === 0) {
187
- throw new Error('No workspaces found for this user');
188
- }
189
- const defaultWorkspace = workspaces[0];
190
- await updateConfig({ currentWorkspace: defaultWorkspace.id });
191
- return defaultWorkspace.id;
192
- }
193
- export async function getSessionUser() {
194
- if (sessionUserCache) {
195
- return sessionUserCache;
196
- }
197
- const client = await getTwistClient();
198
- sessionUserCache = await client.users.getSessionUser();
199
- return sessionUserCache;
200
- }
201
- export async function getWorkspaceUsers(workspaceId) {
202
- const client = await getTwistClient();
203
- return client.workspaceUsers.getWorkspaceUsers({ workspaceId });
204
- }
205
- export function clearUserCache() {
206
- sessionUserCache = null;
207
- }
208
- /**
209
- * Validates a batch response and returns the data, throwing on errors.
210
- * Also handles the case where the SDK fails to validate the response schema
211
- * (e.g. when the batch API wraps entities in a key like `{comment: {...}}`).
212
- * In that case, the raw transformed data is returned — check for expected fields.
213
- */
214
- export function assertBatchData(response, label) {
215
- if (response.code >= 400 || response.data == null) {
216
- throw new Error(`Failed to fetch ${label}.`);
217
- }
218
- return response.data;
219
- }
220
- //# sourceMappingURL=api.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import { type AuthMode } from './config.js';
2
- export declare const TOKEN_ENV_VAR = "TWIST_API_TOKEN";
3
- export type TokenStorageLocation = 'secure-store' | 'config-file';
4
- export interface TokenStorageResult {
5
- storage: TokenStorageLocation;
6
- warning?: string;
7
- }
8
- export interface SaveApiTokenOptions {
9
- authMode?: AuthMode;
10
- authScope?: string;
11
- }
12
- export interface AuthMetadata {
13
- authMode: AuthMode;
14
- authScope?: string;
15
- source: 'env' | 'config';
16
- }
17
- export declare function getApiToken(): Promise<string>;
18
- export declare function getAuthMetadata(): Promise<AuthMetadata>;
19
- export declare function saveApiToken(token: string, options?: SaveApiTokenOptions): Promise<TokenStorageResult>;
20
- export declare function clearApiToken(): Promise<TokenStorageResult>;
21
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAoD,MAAM,aAAa,CAAA;AAO7F,eAAO,MAAM,aAAa,oBAAoB,CAAA;AAC9C,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,aAAa,CAAA;AAEjE,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,oBAAoB,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAA;CAC3B;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAmEnD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAY7D;AAED,wBAAsB,YAAY,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAyBjE"}
package/dist/lib/auth.js DELETED
@@ -1,189 +0,0 @@
1
- import { unlink } from 'node:fs/promises';
2
- import { getConfig, getConfigPath, setConfig } from './config.js';
3
- import { createSecureStore, SECURE_STORE_DESCRIPTION, SecureStoreUnavailableError, } from './secure-store.js';
4
- export const TOKEN_ENV_VAR = 'TWIST_API_TOKEN';
5
- export async function getApiToken() {
6
- // Priority 1: Environment variable
7
- const envToken = process.env[TOKEN_ENV_VAR];
8
- if (envToken) {
9
- return envToken;
10
- }
11
- const config = await getConfig();
12
- const configToken = getConfigToken(config);
13
- const secureStore = createSecureStore();
14
- if (configToken) {
15
- try {
16
- await secureStore.setSecret(configToken);
17
- const cleanupWarning = await cleanupAuthFallbackState(config, 'Token was migrated to secure storage,');
18
- if (cleanupWarning) {
19
- warn(cleanupWarning);
20
- }
21
- }
22
- catch (error) {
23
- if (error instanceof SecureStoreUnavailableError) {
24
- warnSecureStoreFallback('using plaintext token from');
25
- }
26
- else {
27
- throw error;
28
- }
29
- }
30
- return configToken;
31
- }
32
- if (config.pendingSecureStoreClear) {
33
- try {
34
- await secureStore.deleteSecret();
35
- const cleanupWarning = await cleanupAuthFallbackState(config, 'Secure-store token was removed,');
36
- if (cleanupWarning) {
37
- warn(cleanupWarning);
38
- }
39
- }
40
- catch (error) {
41
- if (!(error instanceof SecureStoreUnavailableError)) {
42
- throw error;
43
- }
44
- }
45
- throw new Error(`No API token found. Set ${TOKEN_ENV_VAR} or run \`tw auth login\` or \`tw auth token <token>\`.`);
46
- }
47
- try {
48
- const storedToken = await secureStore.getSecret();
49
- if (storedToken?.trim()) {
50
- return storedToken;
51
- }
52
- }
53
- catch (error) {
54
- if (!(error instanceof SecureStoreUnavailableError)) {
55
- throw error;
56
- }
57
- }
58
- throw new Error(`No API token found. Set ${TOKEN_ENV_VAR} or run \`tw auth login\` or \`tw auth token <token>\`.`);
59
- }
60
- export async function getAuthMetadata() {
61
- const envToken = process.env[TOKEN_ENV_VAR];
62
- if (envToken) {
63
- return { authMode: 'unknown', source: 'env' };
64
- }
65
- const config = await getConfig();
66
- return {
67
- authMode: config.authMode ?? 'unknown',
68
- authScope: config.authScope,
69
- source: 'config',
70
- };
71
- }
72
- export async function saveApiToken(token, options = {}) {
73
- // Validate token (non-empty, reasonable length)
74
- if (!token || token.trim().length < 10) {
75
- throw new Error('Invalid token: Token must be at least 10 characters');
76
- }
77
- const trimmedToken = token.trim();
78
- const secureStore = createSecureStore();
79
- try {
80
- await secureStore.setSecret(trimmedToken);
81
- const existingConfig = await getConfig();
82
- const warning = await cleanupAuthFallbackState(existingConfig, 'Token was stored securely,');
83
- // Persist auth metadata to config — needed for ensureWriteAllowed() enforcement
84
- try {
85
- await saveAuthMetadata(options);
86
- }
87
- catch {
88
- if (options.authMode && options.authMode !== 'unknown') {
89
- warn(`Could not persist auth mode '${options.authMode}' to config. CLI-side write protection may not work in future sessions.`);
90
- }
91
- }
92
- return warning ? { storage: 'secure-store', warning } : { storage: 'secure-store' };
93
- }
94
- catch (error) {
95
- if (!(error instanceof SecureStoreUnavailableError)) {
96
- throw error;
97
- }
98
- }
99
- const config = await getConfig();
100
- config.token = trimmedToken;
101
- delete config.pendingSecureStoreClear;
102
- config.authMode = options.authMode ?? 'unknown';
103
- config.authScope = options.authScope;
104
- await writeConfig(config);
105
- return {
106
- storage: 'config-file',
107
- warning: buildFallbackWarning('token saved as plaintext in'),
108
- };
109
- }
110
- export async function clearApiToken() {
111
- const config = await getConfig();
112
- const secureStore = createSecureStore();
113
- // Clear auth metadata from the in-memory config object so all subsequent
114
- // writes (cleanupAuthFallbackState, withPendingSecureStoreClear) persist
115
- // the removal atomically alongside other state changes.
116
- delete config.authMode;
117
- delete config.authScope;
118
- try {
119
- await secureStore.deleteSecret();
120
- const warning = await cleanupAuthFallbackState(config, 'Secure-store token was removed,');
121
- return warning ? { storage: 'secure-store', warning } : { storage: 'secure-store' };
122
- }
123
- catch (error) {
124
- if (!(error instanceof SecureStoreUnavailableError)) {
125
- throw error;
126
- }
127
- }
128
- await writeConfig(withPendingSecureStoreClear(config));
129
- return {
130
- storage: 'config-file',
131
- warning: buildFallbackWarning('local auth state cleared in'),
132
- };
133
- }
134
- async function saveAuthMetadata(options) {
135
- const config = await getConfig();
136
- config.authMode = options.authMode ?? 'unknown';
137
- config.authScope = options.authScope;
138
- await setConfig(config);
139
- }
140
- async function writeConfig(config) {
141
- if (Object.keys(config).length === 0) {
142
- try {
143
- await unlink(getConfigPath());
144
- }
145
- catch (error) {
146
- if (!isMissingFileError(error)) {
147
- throw error;
148
- }
149
- }
150
- return;
151
- }
152
- await setConfig(config);
153
- }
154
- async function cleanupAuthFallbackState(config, warningPrefix) {
155
- try {
156
- await writeConfig(withoutAuthFallbackState(config));
157
- return undefined;
158
- }
159
- catch (error) {
160
- return buildConfigCleanupWarning(warningPrefix, error);
161
- }
162
- }
163
- function getConfigToken(config) {
164
- return typeof config.token === 'string' && config.token.trim() ? config.token.trim() : null;
165
- }
166
- function withoutAuthFallbackState(config) {
167
- const { token: _token, pendingSecureStoreClear: _pending, ...rest } = config;
168
- return rest;
169
- }
170
- function withPendingSecureStoreClear(config) {
171
- return { ...withoutAuthFallbackState(config), pendingSecureStoreClear: true };
172
- }
173
- function buildFallbackWarning(action) {
174
- return `${SECURE_STORE_DESCRIPTION} unavailable; ${action} ${getConfigPath()}`;
175
- }
176
- function buildConfigCleanupWarning(prefix, error) {
177
- const detail = error instanceof Error && error.message ? ` (${error.message})` : '';
178
- return `${prefix} but could not remove legacy plaintext token from ${getConfigPath()}${detail}`;
179
- }
180
- function isMissingFileError(error) {
181
- return error instanceof Error && 'code' in error && error.code === 'ENOENT';
182
- }
183
- function warn(message) {
184
- console.error(`Warning: ${message}`);
185
- }
186
- function warnSecureStoreFallback(action) {
187
- warn(buildFallbackWarning(action));
188
- }
189
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,173 +0,0 @@
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