@doist/twist-cli 2.21.1 → 2.21.3

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 (202) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__mocks__/chalk.d.ts +3 -0
  3. package/dist/__mocks__/chalk.d.ts.map +1 -0
  4. package/dist/__mocks__/chalk.js +8 -0
  5. package/dist/__mocks__/chalk.js.map +1 -0
  6. package/dist/commands/auth.d.ts +3 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +155 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/away.d.ts +3 -0
  11. package/dist/commands/away.d.ts.map +1 -0
  12. package/dist/commands/away.js +120 -0
  13. package/dist/commands/away.js.map +1 -0
  14. package/dist/commands/changelog.d.ts +8 -0
  15. package/dist/commands/changelog.d.ts.map +1 -0
  16. package/dist/commands/changelog.js +113 -0
  17. package/dist/commands/changelog.js.map +1 -0
  18. package/dist/commands/channel.d.ts +3 -0
  19. package/dist/commands/channel.d.ts.map +1 -0
  20. package/dist/commands/channel.js +53 -0
  21. package/dist/commands/channel.js.map +1 -0
  22. package/dist/commands/comment.d.ts +3 -0
  23. package/dist/commands/comment.d.ts.map +1 -0
  24. package/dist/commands/comment.js +99 -0
  25. package/dist/commands/comment.js.map +1 -0
  26. package/dist/commands/completion.d.ts +3 -0
  27. package/dist/commands/completion.d.ts.map +1 -0
  28. package/dist/commands/completion.js +121 -0
  29. package/dist/commands/completion.js.map +1 -0
  30. package/dist/commands/conversation.d.ts +3 -0
  31. package/dist/commands/conversation.d.ts.map +1 -0
  32. package/dist/commands/conversation.js +458 -0
  33. package/dist/commands/conversation.js.map +1 -0
  34. package/dist/commands/inbox.d.ts +3 -0
  35. package/dist/commands/inbox.d.ts.map +1 -0
  36. package/dist/commands/inbox.js +127 -0
  37. package/dist/commands/inbox.js.map +1 -0
  38. package/dist/commands/msg.d.ts +3 -0
  39. package/dist/commands/msg.d.ts.map +1 -0
  40. package/dist/commands/msg.js +103 -0
  41. package/dist/commands/msg.js.map +1 -0
  42. package/dist/commands/react.d.ts +3 -0
  43. package/dist/commands/react.d.ts.map +1 -0
  44. package/dist/commands/react.js +102 -0
  45. package/dist/commands/react.js.map +1 -0
  46. package/dist/commands/search.d.ts +3 -0
  47. package/dist/commands/search.d.ts.map +1 -0
  48. package/dist/commands/search.js +160 -0
  49. package/dist/commands/search.js.map +1 -0
  50. package/dist/commands/skill.d.ts +3 -0
  51. package/dist/commands/skill.d.ts.map +1 -0
  52. package/dist/commands/skill.js +119 -0
  53. package/dist/commands/skill.js.map +1 -0
  54. package/dist/commands/thread/create.d.ts +7 -0
  55. package/dist/commands/thread/create.d.ts.map +1 -0
  56. package/dist/commands/thread/create.js +45 -0
  57. package/dist/commands/thread/create.js.map +1 -0
  58. package/dist/commands/thread/helpers.d.ts +10 -0
  59. package/dist/commands/thread/helpers.d.ts.map +1 -0
  60. package/dist/commands/thread/helpers.js +27 -0
  61. package/dist/commands/thread/helpers.js.map +1 -0
  62. package/dist/commands/thread/mutate.d.ts +5 -0
  63. package/dist/commands/thread/mutate.d.ts.map +1 -0
  64. package/dist/commands/thread/mutate.js +21 -0
  65. package/dist/commands/thread/mutate.js.map +1 -0
  66. package/dist/commands/thread/mute.d.ts +8 -0
  67. package/dist/commands/thread/mute.d.ts.map +1 -0
  68. package/dist/commands/thread/mute.js +58 -0
  69. package/dist/commands/thread/mute.js.map +1 -0
  70. package/dist/commands/thread/reply.d.ts +9 -0
  71. package/dist/commands/thread/reply.d.ts.map +1 -0
  72. package/dist/commands/thread/reply.js +68 -0
  73. package/dist/commands/thread/reply.js.map +1 -0
  74. package/dist/commands/thread/view.d.ts +9 -0
  75. package/dist/commands/thread/view.d.ts.map +1 -0
  76. package/dist/commands/thread/view.js +175 -0
  77. package/dist/commands/thread/view.js.map +1 -0
  78. package/dist/commands/thread.d.ts +3 -0
  79. package/dist/commands/thread.d.ts.map +1 -0
  80. package/dist/commands/thread.js +70 -0
  81. package/dist/commands/thread.js.map +1 -0
  82. package/dist/commands/update.d.ts +14 -0
  83. package/dist/commands/update.d.ts.map +1 -0
  84. package/dist/commands/update.js +91 -0
  85. package/dist/commands/update.js.map +1 -0
  86. package/dist/commands/user.d.ts +3 -0
  87. package/dist/commands/user.d.ts.map +1 -0
  88. package/dist/commands/user.js +67 -0
  89. package/dist/commands/user.js.map +1 -0
  90. package/dist/commands/view.d.ts +3 -0
  91. package/dist/commands/view.d.ts.map +1 -0
  92. package/dist/commands/view.js +63 -0
  93. package/dist/commands/view.js.map +1 -0
  94. package/dist/commands/workspace.d.ts +3 -0
  95. package/dist/commands/workspace.d.ts.map +1 -0
  96. package/dist/commands/workspace.js +48 -0
  97. package/dist/commands/workspace.js.map +1 -0
  98. package/dist/index.d.ts +3 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +133 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/lib/api.d.ts +20 -0
  103. package/dist/lib/api.d.ts.map +1 -0
  104. package/dist/lib/api.js +229 -0
  105. package/dist/lib/api.js.map +1 -0
  106. package/dist/lib/auth.d.ts +21 -0
  107. package/dist/lib/auth.d.ts.map +1 -0
  108. package/dist/lib/auth.js +183 -0
  109. package/dist/lib/auth.js.map +1 -0
  110. package/dist/lib/completion.d.ts +31 -0
  111. package/dist/lib/completion.d.ts.map +1 -0
  112. package/dist/lib/completion.js +173 -0
  113. package/dist/lib/completion.js.map +1 -0
  114. package/dist/lib/config.d.ts +13 -0
  115. package/dist/lib/config.d.ts.map +1 -0
  116. package/dist/lib/config.js +26 -0
  117. package/dist/lib/config.js.map +1 -0
  118. package/dist/lib/dates.d.ts +3 -0
  119. package/dist/lib/dates.d.ts.map +1 -0
  120. package/dist/lib/dates.js +44 -0
  121. package/dist/lib/dates.js.map +1 -0
  122. package/dist/lib/input.d.ts +3 -0
  123. package/dist/lib/input.d.ts.map +1 -0
  124. package/dist/lib/input.js +52 -0
  125. package/dist/lib/input.js.map +1 -0
  126. package/dist/lib/markdown.d.ts +2 -0
  127. package/dist/lib/markdown.d.ts.map +1 -0
  128. package/dist/lib/markdown.js +16 -0
  129. package/dist/lib/markdown.js.map +1 -0
  130. package/dist/lib/oauth-server.d.ts +13 -0
  131. package/dist/lib/oauth-server.d.ts.map +1 -0
  132. package/dist/lib/oauth-server.js +824 -0
  133. package/dist/lib/oauth-server.js.map +1 -0
  134. package/dist/lib/oauth.d.ts +31 -0
  135. package/dist/lib/oauth.d.ts.map +1 -0
  136. package/dist/lib/oauth.js +140 -0
  137. package/dist/lib/oauth.js.map +1 -0
  138. package/dist/lib/options.d.ts +17 -0
  139. package/dist/lib/options.d.ts.map +1 -0
  140. package/dist/lib/options.js +2 -0
  141. package/dist/lib/options.js.map +1 -0
  142. package/dist/lib/output.d.ts +25 -0
  143. package/dist/lib/output.d.ts.map +1 -0
  144. package/dist/lib/output.js +128 -0
  145. package/dist/lib/output.js.map +1 -0
  146. package/dist/lib/permissions.d.ts +4 -0
  147. package/dist/lib/permissions.d.ts.map +1 -0
  148. package/dist/lib/permissions.js +35 -0
  149. package/dist/lib/permissions.js.map +1 -0
  150. package/dist/lib/pkce.d.ts +16 -0
  151. package/dist/lib/pkce.d.ts.map +1 -0
  152. package/dist/lib/pkce.js +35 -0
  153. package/dist/lib/pkce.js.map +1 -0
  154. package/dist/lib/progress.d.ts +29 -0
  155. package/dist/lib/progress.d.ts.map +1 -0
  156. package/dist/lib/progress.js +101 -0
  157. package/dist/lib/progress.js.map +1 -0
  158. package/dist/lib/public-channels.d.ts +5 -0
  159. package/dist/lib/public-channels.d.ts.map +1 -0
  160. package/dist/lib/public-channels.js +35 -0
  161. package/dist/lib/public-channels.js.map +1 -0
  162. package/dist/lib/refs.d.ts +37 -0
  163. package/dist/lib/refs.d.ts.map +1 -0
  164. package/dist/lib/refs.js +219 -0
  165. package/dist/lib/refs.js.map +1 -0
  166. package/dist/lib/search-api.d.ts +25 -0
  167. package/dist/lib/search-api.d.ts.map +1 -0
  168. package/dist/lib/search-api.js +85 -0
  169. package/dist/lib/search-api.js.map +1 -0
  170. package/dist/lib/secure-store.d.ts +11 -0
  171. package/dist/lib/secure-store.d.ts.map +1 -0
  172. package/dist/lib/secure-store.js +57 -0
  173. package/dist/lib/secure-store.js.map +1 -0
  174. package/dist/lib/skills/content.d.ts +5 -0
  175. package/dist/lib/skills/content.d.ts.map +1 -0
  176. package/dist/lib/skills/content.js +286 -0
  177. package/dist/lib/skills/content.js.map +1 -0
  178. package/dist/lib/skills/create-installer.d.ts +9 -0
  179. package/dist/lib/skills/create-installer.d.ts.map +1 -0
  180. package/dist/lib/skills/create-installer.js +60 -0
  181. package/dist/lib/skills/create-installer.js.map +1 -0
  182. package/dist/lib/skills/index.d.ts +7 -0
  183. package/dist/lib/skills/index.d.ts.map +1 -0
  184. package/dist/lib/skills/index.js +54 -0
  185. package/dist/lib/skills/index.js.map +1 -0
  186. package/dist/lib/skills/types.d.ts +30 -0
  187. package/dist/lib/skills/types.d.ts.map +1 -0
  188. package/dist/lib/skills/types.js +2 -0
  189. package/dist/lib/skills/types.js.map +1 -0
  190. package/dist/lib/skills/update-installed.d.ts +9 -0
  191. package/dist/lib/skills/update-installed.d.ts.map +1 -0
  192. package/dist/lib/skills/update-installed.js +20 -0
  193. package/dist/lib/skills/update-installed.js.map +1 -0
  194. package/dist/lib/spinner.d.ts +24 -0
  195. package/dist/lib/spinner.d.ts.map +1 -0
  196. package/dist/lib/spinner.js +126 -0
  197. package/dist/lib/spinner.js.map +1 -0
  198. package/dist/postinstall.d.ts +2 -0
  199. package/dist/postinstall.d.ts.map +1 -0
  200. package/dist/postinstall.js +3 -0
  201. package/dist/postinstall.js.map +1 -0
  202. package/package.json +5 -4
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Set argChoices on an option without enabling Commander's built-in
3
+ * validation. The choices are surfaced for shell completions but the
4
+ * option still accepts any value at parse time.
5
+ */
6
+ export function withUnvalidatedChoices(opt, values) {
7
+ opt.argChoices = values;
8
+ return opt;
9
+ }
10
+ export function withCaseInsensitiveChoices(opt, values) {
11
+ opt.choices(values);
12
+ // choices() sets parseArg internally. Assert so we catch upstream changes.
13
+ const original = opt.parseArg;
14
+ if (!original) {
15
+ throw new Error('Expected Commander choices() to set parseArg');
16
+ }
17
+ opt.parseArg = (arg, prev) => original(arg.toLowerCase(), prev);
18
+ return opt;
19
+ }
20
+ /**
21
+ * Parse COMP_LINE into words, stripping the binary name and the
22
+ * 'completion-server' token that tabtab injects.
23
+ *
24
+ * FIXME: This splits on whitespace and does not handle quoted arguments.
25
+ * This is acceptable for command/flag traversal. It can be improved once
26
+ * tabtab exposes shell-provided tokenized words.
27
+ */
28
+ export function parseCompLine(compLine) {
29
+ const words = compLine.split(/\s+/).slice(1); // remove binary name (tw)
30
+ if (words[0] === 'completion-server')
31
+ words.shift();
32
+ return words;
33
+ }
34
+ /** Names to exclude from completion results (internal commands) */
35
+ const HIDDEN_COMMAND_NAMES = new Set(['completion-server']);
36
+ /**
37
+ * Check if a Commander Option expects a value argument (not a boolean flag).
38
+ */
39
+ function optionExpectsValue(opt) {
40
+ // required means <value>, optional means [value] — both expect a value
41
+ return opt.required || opt.optional;
42
+ }
43
+ /**
44
+ * Find an option by its long or short flag in a command.
45
+ */
46
+ function findOption(cmd, flag) {
47
+ return cmd.options.find((o) => o.long === flag || o.short === flag);
48
+ }
49
+ /**
50
+ * Get completions for the current command line context.
51
+ *
52
+ * @param program - The root Commander program with all commands registered
53
+ * @param words - The words on the command line (excluding the binary name)
54
+ * @param current - The current word being typed (may be empty string)
55
+ * @returns Array of completion items
56
+ */
57
+ export function getCompletions(program, words, current) {
58
+ let activeCmd = program;
59
+ let seenDoubleDash = false;
60
+ const usedOptions = new Set();
61
+ // Walk the words to find the active command context
62
+ let i = 0;
63
+ while (i < words.length) {
64
+ const word = words[i];
65
+ // If we hit the current word (last position), stop walking
66
+ if (i === words.length - 1 && word === current) {
67
+ break;
68
+ }
69
+ if (word === '--') {
70
+ seenDoubleDash = true;
71
+ i++;
72
+ continue;
73
+ }
74
+ if (!seenDoubleDash && word.startsWith('-')) {
75
+ // Handle --flag=value syntax
76
+ const eqIdx = word.indexOf('=');
77
+ const flag = eqIdx > 0 ? word.slice(0, eqIdx) : word;
78
+ usedOptions.add(flag);
79
+ // If this option expects a value and no = was used, consume the next word
80
+ if (eqIdx < 0) {
81
+ const opt = findOption(activeCmd, flag);
82
+ if (opt && optionExpectsValue(opt)) {
83
+ i++; // skip the value word
84
+ }
85
+ }
86
+ i++;
87
+ continue;
88
+ }
89
+ // Try to descend into a subcommand
90
+ const sub = activeCmd.commands.find((c) => c.name() === word || c.aliases().includes(word));
91
+ if (sub) {
92
+ activeCmd = sub;
93
+ usedOptions.clear();
94
+ }
95
+ i++;
96
+ }
97
+ // Check if previous word was an option expecting a value
98
+ if (words.length >= 2) {
99
+ const prevWord = words[words.length - 2];
100
+ if (prevWord?.startsWith('-') && prevWord !== '--') {
101
+ const eqIdx = prevWord.indexOf('=');
102
+ const flag = eqIdx > 0 ? prevWord.slice(0, eqIdx) : prevWord;
103
+ const opt = findOption(activeCmd, flag);
104
+ if (opt && optionExpectsValue(opt) && eqIdx < 0) {
105
+ const enumValues = opt.argChoices;
106
+ if (enumValues) {
107
+ return enumValues.filter((v) => v.startsWith(current)).map((v) => ({ name: v }));
108
+ }
109
+ return [];
110
+ }
111
+ }
112
+ }
113
+ // Handle --flag=<TAB> — suggest values after =
114
+ if (current.includes('=')) {
115
+ const eqIdx = current.indexOf('=');
116
+ const flag = current.slice(0, eqIdx);
117
+ const partial = current.slice(eqIdx + 1);
118
+ const opt = findOption(activeCmd, flag);
119
+ if (opt) {
120
+ const enumValues = opt.argChoices;
121
+ if (enumValues) {
122
+ return enumValues
123
+ .filter((v) => v.startsWith(partial))
124
+ .map((v) => ({ name: `${flag}=${v}` }));
125
+ }
126
+ }
127
+ return [];
128
+ }
129
+ // After --, everything is positional — no more commands or options
130
+ if (seenDoubleDash) {
131
+ return [];
132
+ }
133
+ // If current word starts with -, suggest options
134
+ if (current.startsWith('-')) {
135
+ return getOptionCompletions(activeCmd, current, usedOptions);
136
+ }
137
+ // Suggest subcommands, and if there are none, suggest options instead
138
+ const subcommands = getSubcommandCompletions(activeCmd, current);
139
+ if (subcommands.length > 0) {
140
+ return subcommands;
141
+ }
142
+ return getOptionCompletions(activeCmd, current, usedOptions);
143
+ }
144
+ function getSubcommandCompletions(cmd, prefix) {
145
+ return cmd.commands
146
+ .filter((c) => !c._hidden &&
147
+ !HIDDEN_COMMAND_NAMES.has(c.name()))
148
+ .filter((c) => c.name().startsWith(prefix))
149
+ .map((c) => ({
150
+ name: c.name(),
151
+ description: c.description(),
152
+ }));
153
+ }
154
+ function getOptionCompletions(cmd, prefix, usedOptions) {
155
+ return cmd.options
156
+ .filter((o) => {
157
+ if (!o.long)
158
+ return false;
159
+ if (o.hidden)
160
+ return false;
161
+ // Exclude already-used options
162
+ if (usedOptions.has(o.long))
163
+ return false;
164
+ if (o.short && usedOptions.has(o.short))
165
+ return false;
166
+ return o.long.startsWith(prefix);
167
+ })
168
+ .map((o) => ({
169
+ name: o.long,
170
+ description: o.description,
171
+ }));
172
+ }
173
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/lib/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type AuthMode = 'read-only' | 'read-write' | 'unknown';
2
+ export interface Config {
3
+ token?: string;
4
+ pendingSecureStoreClear?: boolean;
5
+ currentWorkspace?: number;
6
+ authMode?: AuthMode;
7
+ authScope?: string;
8
+ }
9
+ export declare function getConfig(): Promise<Config>;
10
+ export declare function setConfig(config: Config): Promise<void>;
11
+ export declare function updateConfig(updates: Partial<Config>): Promise<void>;
12
+ export declare function getConfigPath(): string;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAA;AAE7D,MAAM,WAAW,MAAM;IAEnB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAOjD;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,26 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ const CONFIG_PATH = join(homedir(), '.config', 'twist-cli', 'config.json');
5
+ export async function getConfig() {
6
+ try {
7
+ const content = await readFile(CONFIG_PATH, 'utf-8');
8
+ return JSON.parse(content);
9
+ }
10
+ catch {
11
+ return {};
12
+ }
13
+ }
14
+ export async function setConfig(config) {
15
+ const dir = dirname(CONFIG_PATH);
16
+ await mkdir(dir, { recursive: true });
17
+ await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));
18
+ }
19
+ export async function updateConfig(updates) {
20
+ const config = await getConfig();
21
+ await setConfig({ ...config, ...updates });
22
+ }
23
+ export function getConfigPath() {
24
+ return CONFIG_PATH;
25
+ }
26
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;AAe1E,MAAM,CAAC,KAAK,UAAU,SAAS;IAC3B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAA;IACb,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAChC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAwB;IACvD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;IAChC,MAAM,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,WAAW,CAAA;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function formatRelativeDate(date: Date | string): string;
2
+ export declare function parseDate(dateStr: string): Date | null;
3
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../src/lib/dates.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAiC9D;AAaD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGtD"}
@@ -0,0 +1,44 @@
1
+ const SECOND = 1000;
2
+ const MINUTE = 60 * SECOND;
3
+ const HOUR = 60 * MINUTE;
4
+ const DAY = 24 * HOUR;
5
+ export function formatRelativeDate(date) {
6
+ const d = typeof date === 'string' ? new Date(date) : date;
7
+ const now = new Date();
8
+ const diff = now.getTime() - d.getTime();
9
+ if (diff < 0) {
10
+ return formatAbsoluteDate(d);
11
+ }
12
+ if (diff < MINUTE) {
13
+ return 'just now';
14
+ }
15
+ if (diff < HOUR) {
16
+ const mins = Math.floor(diff / MINUTE);
17
+ return `${mins} minute${mins === 1 ? '' : 's'} ago`;
18
+ }
19
+ if (diff < DAY) {
20
+ const hours = Math.floor(diff / HOUR);
21
+ return `${hours} hour${hours === 1 ? '' : 's'} ago`;
22
+ }
23
+ if (diff < 2 * DAY) {
24
+ return 'yesterday';
25
+ }
26
+ if (diff < 7 * DAY) {
27
+ const days = Math.floor(diff / DAY);
28
+ return `${days} days ago`;
29
+ }
30
+ return formatAbsoluteDate(d);
31
+ }
32
+ function formatAbsoluteDate(date) {
33
+ const now = new Date();
34
+ const sameYear = date.getFullYear() === now.getFullYear();
35
+ if (sameYear) {
36
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
37
+ }
38
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
39
+ }
40
+ export function parseDate(dateStr) {
41
+ const d = new Date(dateStr);
42
+ return Number.isNaN(d.getTime()) ? null : d;
43
+ }
44
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../../src/lib/dates.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,IAAI,CAAA;AACnB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;AAC1B,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,CAAA;AACxB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA;AAErB,MAAM,UAAU,kBAAkB,CAAC,IAAmB;IAClD,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IAExC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACX,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;QAChB,OAAO,UAAU,CAAA;IACrB,CAAC;IAED,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;QACtC,OAAO,GAAG,IAAI,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;IACvD,CAAC;IAED,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;QACrC,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;IACvD,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QACjB,OAAO,WAAW,CAAA;IACtB,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;QACnC,OAAO,GAAG,IAAI,WAAW,CAAA;IAC7B,CAAC;IAED,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAU;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAA;IAEzD,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;IAC/E,CAAC;IAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAChG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACrC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function readStdin(): Promise<string | null>;
2
+ export declare function openEditor(): Promise<string | null>;
3
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/lib/input.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgCzD"}
@@ -0,0 +1,52 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFile, unlink, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ export async function readStdin() {
6
+ if (process.stdin.isTTY) {
7
+ return null;
8
+ }
9
+ return new Promise((resolve) => {
10
+ let data = '';
11
+ process.stdin.setEncoding('utf8');
12
+ process.stdin.on('data', (chunk) => {
13
+ data += chunk;
14
+ });
15
+ process.stdin.on('end', () => {
16
+ resolve(data.trim() || null);
17
+ });
18
+ process.stdin.on('error', () => {
19
+ resolve(null);
20
+ });
21
+ });
22
+ }
23
+ export async function openEditor() {
24
+ const editor = process.env.EDITOR || process.env.VISUAL || 'vi';
25
+ const tmpFile = join(tmpdir(), `twist-cli-${Date.now()}.md`);
26
+ await writeFile(tmpFile, '');
27
+ return new Promise((resolve) => {
28
+ const child = spawn(editor, [tmpFile], {
29
+ stdio: 'inherit',
30
+ });
31
+ child.on('exit', async (code) => {
32
+ if (code !== 0) {
33
+ await unlink(tmpFile).catch(() => { });
34
+ resolve(null);
35
+ return;
36
+ }
37
+ try {
38
+ const content = await readFile(tmpFile, 'utf8');
39
+ await unlink(tmpFile).catch(() => { });
40
+ resolve(content.trim() || null);
41
+ }
42
+ catch {
43
+ resolve(null);
44
+ }
45
+ });
46
+ child.on('error', async () => {
47
+ await unlink(tmpFile).catch(() => { });
48
+ resolve(null);
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/lib/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC3B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACf,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,IAAI,IAAI,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAA;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAE5D,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAE5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;YACnC,KAAK,EAAE,SAAS;SACnB,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACb,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACb,OAAM;YACV,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAC/C,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBACrC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAA;YACnC,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,CAAC,IAAI,CAAC,CAAA;YACjB,CAAC;QACL,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YACrC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function renderMarkdown(content: string): string;
2
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/lib/markdown.ts"],"names":[],"mappings":"AASA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQtD"}
@@ -0,0 +1,16 @@
1
+ import { marked } from 'marked';
2
+ import { markedTerminal } from 'marked-terminal';
3
+ let initialized = false;
4
+ function preprocessMentions(content) {
5
+ return content.replace(/\[([^\]]+)\]\((twist-mention:\/\/\d+)\)/g, '[@$1]($2)');
6
+ }
7
+ export function renderMarkdown(content) {
8
+ if (!initialized) {
9
+ marked.use(markedTerminal());
10
+ initialized = true;
11
+ }
12
+ const processed = preprocessMentions(content);
13
+ const rendered = marked.parse(processed, { async: false });
14
+ return rendered.trimEnd();
15
+ }
16
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/lib/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,MAAM,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,IAAI,WAAW,GAAG,KAAK,CAAA;AAEvB,SAAS,kBAAkB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,0CAA0C,EAAE,WAAW,CAAC,CAAA;AACnF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,cAAc,EAAgC,CAAC,CAAA;QAC1D,WAAW,GAAG,IAAI,CAAA;IACtB,CAAC;IACD,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAW,CAAA;IACpE,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const PORT = 8766;
2
+ export declare const OAUTH_REDIRECT_URI = "http://localhost:8766/callback";
3
+ interface CallbackResult {
4
+ code: string;
5
+ cleanup: () => void;
6
+ }
7
+ /**
8
+ * Start a local HTTP server to handle OAuth callback
9
+ * Returns a promise that resolves when the callback is received with valid state
10
+ */
11
+ export declare function startCallbackServer(expectedState: string): Promise<CallbackResult>;
12
+ export {};
13
+ //# sourceMappingURL=oauth-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../src/lib/oauth-server.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,IAAI,OAAO,CAAA;AACxB,eAAO,MAAM,kBAAkB,mCAAmC,CAAA;AAKlE,UAAU,cAAc;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA2DxF"}