@doist/twist-cli 2.21.3 → 2.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -124
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +1 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/update/action.d.ts +12 -0
- package/dist/commands/update/action.d.ts.map +1 -0
- package/dist/commands/update/action.js +125 -0
- package/dist/commands/update/action.js.map +1 -0
- package/dist/commands/update/channel.d.ts +2 -0
- package/dist/commands/update/channel.d.ts.map +1 -0
- package/dist/commands/update/channel.js +13 -0
- package/dist/commands/update/channel.js.map +1 -0
- package/dist/commands/update/index.d.ts +3 -0
- package/dist/commands/update/index.d.ts.map +1 -0
- package/dist/commands/update/index.js +18 -0
- package/dist/commands/update/index.js.map +1 -0
- package/dist/commands/update/switch.d.ts +5 -0
- package/dist/commands/update/switch.d.ts.map +1 -0
- package/dist/commands/update/switch.js +31 -0
- package/dist/commands/update/switch.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/skills/content.d.ts +1 -1
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +4 -1
- package/dist/lib/skills/content.js.map +1 -1
- package/package.json +6 -8
- package/dist/commands/update.d.ts +0 -14
- package/dist/commands/update.d.ts.map +0 -1
- package/dist/commands/update.js +0 -91
- package/dist/commands/update.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,265 +1,237 @@
|
|
|
1
|
+
## [2.22.0](https://github.com/Doist/twist-cli/compare/v2.21.3...v2.22.0) (2026-04-02)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
- allow switching between stable and pre-release update channels ([#126](https://github.com/Doist/twist-cli/issues/126)) ([78ee76f](https://github.com/Doist/twist-cli/commit/78ee76f0776e98b5f5782ffde24044115cc9f658))
|
|
6
|
+
|
|
1
7
|
## [2.21.3](https://github.com/Doist/twist-cli/compare/v2.21.2...v2.21.3) (2026-04-01)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
|
4
10
|
|
|
5
|
-
|
|
11
|
+
- suppress credential manager warning on every command ([#121](https://github.com/Doist/twist-cli/issues/121)) ([8423867](https://github.com/Doist/twist-cli/commit/8423867c7c43db7ae13cb7a78d027e8d9cbb98f5))
|
|
6
12
|
|
|
7
13
|
## [2.21.2](https://github.com/Doist/twist-cli/compare/v2.21.1...v2.21.2) (2026-03-29)
|
|
8
14
|
|
|
9
15
|
### Bug Fixes
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
- add prepublishOnly script for release safety ([#115](https://github.com/Doist/twist-cli/issues/115)) ([7b50727](https://github.com/Doist/twist-cli/commit/7b5072700f8fac968161ade717cde247ff5e87fe))
|
|
12
18
|
|
|
13
19
|
## [2.21.1](https://github.com/Doist/twist-cli/compare/v2.21.0...v2.21.1) (2026-03-28)
|
|
14
20
|
|
|
15
21
|
### Bug Fixes
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
- use Node 22 for release workflow ([#114](https://github.com/Doist/twist-cli/issues/114)) ([3c1463d](https://github.com/Doist/twist-cli/commit/3c1463d23ffcf74e182414f80b3adf1a81790899))
|
|
18
24
|
|
|
19
25
|
# [2.21.0](https://github.com/Doist/twist-cli/compare/v2.20.0...v2.21.0) (2026-03-27)
|
|
20
26
|
|
|
21
|
-
|
|
22
27
|
### Features
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
- add mute and unmute commands for threads and conversations ([#111](https://github.com/Doist/twist-cli/issues/111)) ([57eae83](https://github.com/Doist/twist-cli/commit/57eae8386fc582ac8981b415deb2386fcc5a8e9c))
|
|
25
30
|
|
|
26
31
|
# [2.20.0](https://github.com/Doist/twist-cli/compare/v2.19.0...v2.20.0) (2026-03-27)
|
|
27
32
|
|
|
28
|
-
|
|
29
33
|
### Features
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
- add --close and --reopen flags to thread reply ([#110](https://github.com/Doist/twist-cli/issues/110)) ([fc3880e](https://github.com/Doist/twist-cli/commit/fc3880ed7f8365c58cbdff2f643caf2a28b40130))
|
|
32
36
|
|
|
33
37
|
# [2.19.0](https://github.com/Doist/twist-cli/compare/v2.18.4...v2.19.0) (2026-03-27)
|
|
34
38
|
|
|
35
|
-
|
|
36
39
|
### Features
|
|
37
40
|
|
|
38
|
-
|
|
41
|
+
- add comment edit and delete commands ([#109](https://github.com/Doist/twist-cli/issues/109)) ([2c740e5](https://github.com/Doist/twist-cli/commit/2c740e5677e78f019e85fdb96ee098884972f902))
|
|
39
42
|
|
|
40
43
|
## [2.18.4](https://github.com/Doist/twist-cli/compare/v2.18.3...v2.18.4) (2026-03-26)
|
|
41
44
|
|
|
42
|
-
|
|
43
45
|
### Bug Fixes
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
- upgrade Twist SDK for proxy env var support ([#107](https://github.com/Doist/twist-cli/issues/107)) ([ad5bfc4](https://github.com/Doist/twist-cli/commit/ad5bfc4363975b45857cc0b799c40e6fe5f94718))
|
|
46
48
|
|
|
47
49
|
## [2.18.3](https://github.com/Doist/twist-cli/compare/v2.18.2...v2.18.3) (2026-03-26)
|
|
48
50
|
|
|
49
|
-
|
|
50
51
|
### Bug Fixes
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
- remove inline token placeholder from skill auth example ([#106](https://github.com/Doist/twist-cli/issues/106)) ([ce0683d](https://github.com/Doist/twist-cli/commit/ce0683dea1645d33f456f2812c4d02a1a21ba0eb))
|
|
53
54
|
|
|
54
55
|
## [2.18.2](https://github.com/Doist/twist-cli/compare/v2.18.1...v2.18.2) (2026-03-25)
|
|
55
56
|
|
|
56
|
-
|
|
57
57
|
### Bug Fixes
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
- use JSON.stringify for robust YAML description escaping ([#103](https://github.com/Doist/twist-cli/issues/103)) ([9adab77](https://github.com/Doist/twist-cli/commit/9adab777b395e43e7ebc23ed73930b188c768290))
|
|
60
60
|
|
|
61
61
|
## [2.18.1](https://github.com/Doist/twist-cli/compare/v2.18.0...v2.18.1) (2026-03-25)
|
|
62
62
|
|
|
63
|
-
|
|
64
63
|
### Bug Fixes
|
|
65
64
|
|
|
66
|
-
|
|
65
|
+
- use cross-platform postinstall script ([#102](https://github.com/Doist/twist-cli/issues/102)) ([dabe906](https://github.com/Doist/twist-cli/commit/dabe9069eb106349488ae79b1b0e92f21fae979b))
|
|
67
66
|
|
|
68
67
|
# [2.18.0](https://github.com/Doist/twist-cli/compare/v2.17.1...v2.18.0) (2026-03-25)
|
|
69
68
|
|
|
70
|
-
|
|
71
69
|
### Features
|
|
72
70
|
|
|
73
|
-
|
|
71
|
+
- add new agent skills ([#101](https://github.com/Doist/twist-cli/issues/101)) ([37fa53f](https://github.com/Doist/twist-cli/commit/37fa53f899a9031c957a81d6266ad4073023440e))
|
|
74
72
|
|
|
75
73
|
## [2.17.1](https://github.com/Doist/twist-cli/compare/v2.17.0...v2.17.1) (2026-03-23)
|
|
76
74
|
|
|
77
|
-
|
|
78
75
|
### Bug Fixes
|
|
79
76
|
|
|
80
|
-
|
|
77
|
+
- **deps:** update dependency @doist/twist-sdk to v2.1.2 ([#100](https://github.com/Doist/twist-cli/issues/100)) ([cd5d313](https://github.com/Doist/twist-cli/commit/cd5d3135868b28ae38c32d9b7850a752b0e99cd7))
|
|
81
78
|
|
|
82
79
|
# [2.17.0](https://github.com/Doist/twist-cli/compare/v2.16.0...v2.17.0) (2026-03-21)
|
|
83
80
|
|
|
84
|
-
|
|
85
81
|
### Features
|
|
86
82
|
|
|
87
|
-
|
|
83
|
+
- add changelog command and post-update hint ([#96](https://github.com/Doist/twist-cli/issues/96)) ([daed3da](https://github.com/Doist/twist-cli/commit/daed3da5c11d79c8c3da9d102c8f73f10276817e))
|
|
88
84
|
|
|
89
85
|
# [2.16.0](https://github.com/Doist/twist-cli/compare/v2.15.0...v2.16.0) (2026-03-21)
|
|
90
86
|
|
|
91
|
-
|
|
92
87
|
### Features
|
|
93
88
|
|
|
94
|
-
|
|
89
|
+
- add thread create command and document stdin piping ([#95](https://github.com/Doist/twist-cli/issues/95)) ([5d9a9c3](https://github.com/Doist/twist-cli/commit/5d9a9c373a138647c70b3a953287d7f2e6be7732))
|
|
95
90
|
|
|
96
91
|
# [2.15.0](https://github.com/Doist/twist-cli/compare/v2.14.2...v2.15.0) (2026-03-19)
|
|
97
92
|
|
|
98
|
-
|
|
99
93
|
### Features
|
|
100
94
|
|
|
101
|
-
|
|
95
|
+
- add --json output to auth status command ([#93](https://github.com/Doist/twist-cli/issues/93)) ([7bdec70](https://github.com/Doist/twist-cli/commit/7bdec7071e4e711f1c67d6a300d8db6d857c7eb1))
|
|
102
96
|
|
|
103
97
|
## [2.14.2](https://github.com/Doist/twist-cli/compare/v2.14.1...v2.14.2) (2026-03-18)
|
|
104
98
|
|
|
105
|
-
|
|
106
99
|
### Bug Fixes
|
|
107
100
|
|
|
108
|
-
|
|
101
|
+
- handle batch response errors in thread view ([#91](https://github.com/Doist/twist-cli/issues/91)) ([a6e7fd6](https://github.com/Doist/twist-cli/commit/a6e7fd6ae81ef50a5fc7575dcaa95056de9c0af8))
|
|
109
102
|
|
|
110
103
|
## [2.14.1](https://github.com/Doist/twist-cli/compare/v2.14.0...v2.14.1) (2026-03-15)
|
|
111
104
|
|
|
112
|
-
|
|
113
105
|
### Bug Fixes
|
|
114
106
|
|
|
115
|
-
|
|
107
|
+
- make thread view --unread filter correctly across all output modes ([#86](https://github.com/Doist/twist-cli/issues/86)) ([92478c9](https://github.com/Doist/twist-cli/commit/92478c98811124d3d87738f7288a0451574562b0))
|
|
116
108
|
|
|
117
109
|
# [2.14.0](https://github.com/Doist/twist-cli/compare/v2.13.0...v2.14.0) (2026-03-15)
|
|
118
110
|
|
|
119
|
-
|
|
120
111
|
### Features
|
|
121
112
|
|
|
122
|
-
|
|
113
|
+
- Add read-only OAuth mode for safe autonomous tool use ([#81](https://github.com/Doist/twist-cli/issues/81)) ([6e4ea5d](https://github.com/Doist/twist-cli/commit/6e4ea5dfffa89fe1bf176753e57ad93879a9cd25))
|
|
123
114
|
|
|
124
115
|
# [2.13.0](https://github.com/Doist/twist-cli/compare/v2.12.0...v2.13.0) (2026-03-15)
|
|
125
116
|
|
|
126
|
-
|
|
127
117
|
### Features
|
|
128
118
|
|
|
129
|
-
|
|
119
|
+
- show version transition during tw update ([#85](https://github.com/Doist/twist-cli/issues/85)) ([99134d8](https://github.com/Doist/twist-cli/commit/99134d8280283ecd2f72a6f300d3a356d89a592b))
|
|
130
120
|
|
|
131
121
|
# [2.12.0](https://github.com/Doist/twist-cli/compare/v2.11.0...v2.12.0) (2026-03-14)
|
|
132
122
|
|
|
133
|
-
|
|
134
123
|
### Features
|
|
135
124
|
|
|
136
|
-
|
|
125
|
+
- add --json support to mutating commands ([#84](https://github.com/Doist/twist-cli/issues/84)) ([738ecf2](https://github.com/Doist/twist-cli/commit/738ecf209fccf3675f52b92fe8c697d94c562496))
|
|
137
126
|
|
|
138
127
|
# [2.11.0](https://github.com/Doist/twist-cli/compare/v2.10.0...v2.11.0) (2026-03-12)
|
|
139
128
|
|
|
140
|
-
|
|
141
129
|
### Features
|
|
142
130
|
|
|
143
|
-
|
|
131
|
+
- add away status command ([#79](https://github.com/Doist/twist-cli/issues/79)) ([9fd71e7](https://github.com/Doist/twist-cli/commit/9fd71e7a7ce05c4092e65944be52390ddec9b7ff))
|
|
144
132
|
|
|
145
133
|
# [2.10.0](https://github.com/Doist/twist-cli/compare/v2.9.1...v2.10.0) (2026-03-11)
|
|
146
134
|
|
|
147
|
-
|
|
148
135
|
### Features
|
|
149
136
|
|
|
150
|
-
|
|
137
|
+
- store auth tokens in OS credential storage ([#77](https://github.com/Doist/twist-cli/issues/77)) ([b67a11b](https://github.com/Doist/twist-cli/commit/b67a11b36ecf82aed2f21a9e5deecc52146f801e))
|
|
151
138
|
|
|
152
139
|
## [2.9.1](https://github.com/Doist/twist-cli/compare/v2.9.0...v2.9.1) (2026-03-11)
|
|
153
140
|
|
|
154
|
-
|
|
155
141
|
### Bug Fixes
|
|
156
142
|
|
|
157
|
-
|
|
143
|
+
- **deps:** update dependency open to v11 ([#66](https://github.com/Doist/twist-cli/issues/66)) ([3503e7f](https://github.com/Doist/twist-cli/commit/3503e7fb52b0b5e471a81b63fedf6a099ec2836e))
|
|
158
144
|
|
|
159
145
|
# [2.9.0](https://github.com/Doist/twist-cli/compare/v2.8.0...v2.9.0) (2026-03-11)
|
|
160
146
|
|
|
161
|
-
|
|
162
147
|
### Features
|
|
163
148
|
|
|
164
|
-
|
|
149
|
+
- add conversation lookup by user ([#76](https://github.com/Doist/twist-cli/issues/76)) ([50ebe3b](https://github.com/Doist/twist-cli/commit/50ebe3bd43019703e80a7fc5dace94c82182aad7))
|
|
165
150
|
|
|
166
151
|
# [2.8.0](https://github.com/Doist/twist-cli/compare/v2.7.2...v2.8.0) (2026-03-09)
|
|
167
152
|
|
|
168
|
-
|
|
169
153
|
### Features
|
|
170
154
|
|
|
171
|
-
|
|
155
|
+
- include reactions in essential JSON output fields ([72b6bca](https://github.com/Doist/twist-cli/commit/72b6bca15422252db0fbd5ebbaa721cc11becd8f))
|
|
172
156
|
|
|
173
157
|
## [2.7.2](https://github.com/Doist/twist-cli/compare/v2.7.1...v2.7.2) (2026-02-26)
|
|
174
158
|
|
|
175
|
-
|
|
176
159
|
### Bug Fixes
|
|
177
160
|
|
|
178
|
-
|
|
161
|
+
- **deps:** update dependency yocto-spinner to v1.1.0 ([#63](https://github.com/Doist/twist-cli/issues/63)) ([e1ddeb2](https://github.com/Doist/twist-cli/commit/e1ddeb260c193e23d1dd38bc9a3c99394f1e277c))
|
|
179
162
|
|
|
180
163
|
## [2.7.1](https://github.com/Doist/twist-cli/compare/v2.7.0...v2.7.1) (2026-02-25)
|
|
181
164
|
|
|
182
|
-
|
|
183
165
|
### Bug Fixes
|
|
184
166
|
|
|
185
|
-
|
|
167
|
+
- **deps:** update dependency commander to v14.0.3 ([#57](https://github.com/Doist/twist-cli/issues/57)) ([5e92b39](https://github.com/Doist/twist-cli/commit/5e92b398973c09c76dfae8cad3c03b45305a3038))
|
|
186
168
|
|
|
187
169
|
# [2.7.0](https://github.com/Doist/twist-cli/compare/v2.6.0...v2.7.0) (2026-02-25)
|
|
188
170
|
|
|
189
|
-
|
|
190
171
|
### Features
|
|
191
172
|
|
|
192
|
-
|
|
173
|
+
- suppress package manager output during `tw update` ([#55](https://github.com/Doist/twist-cli/issues/55)) ([fdc9d88](https://github.com/Doist/twist-cli/commit/fdc9d88026f481d1063722fdeedfcf6847fbdf5b))
|
|
193
174
|
|
|
194
175
|
# [2.6.0](https://github.com/Doist/twist-cli/compare/v2.5.1...v2.6.0) (2026-02-25)
|
|
195
176
|
|
|
196
|
-
|
|
197
177
|
### Features
|
|
198
178
|
|
|
199
|
-
|
|
179
|
+
- upgrade OAuth pages with twist-cli branding icon ([#52](https://github.com/Doist/twist-cli/issues/52)) ([880649f](https://github.com/Doist/twist-cli/commit/880649fcdc381e6e6e94503d7173cdd60e3f1f6e))
|
|
200
180
|
|
|
201
181
|
## [2.5.1](https://github.com/Doist/twist-cli/compare/v2.5.0...v2.5.1) (2026-02-21)
|
|
202
182
|
|
|
203
|
-
|
|
204
183
|
### Bug Fixes
|
|
205
184
|
|
|
206
|
-
|
|
185
|
+
- remove inaccessible renovate-config-internal preset ([#50](https://github.com/Doist/twist-cli/issues/50)) ([b36a16d](https://github.com/Doist/twist-cli/commit/b36a16db0835e10d79f34c44027c336d6af42eb9))
|
|
207
186
|
|
|
208
187
|
# [2.5.0](https://github.com/Doist/twist-cli/compare/v2.4.0...v2.5.0) (2026-02-21)
|
|
209
188
|
|
|
210
|
-
|
|
211
189
|
### Features
|
|
212
190
|
|
|
213
|
-
|
|
214
|
-
|
|
191
|
+
- add --accessible flag for screen-reader-friendly output ([#47](https://github.com/Doist/twist-cli/issues/47)) ([5317cdf](https://github.com/Doist/twist-cli/commit/5317cdf729e6faa43f339cbb4ef4ab1a0e7ad02a))
|
|
192
|
+
- add Gemini CLI skill ([#48](https://github.com/Doist/twist-cli/issues/48)) ([7992c26](https://github.com/Doist/twist-cli/commit/7992c26f11eb9d5b23d00270a3779a05b4ed9e6c))
|
|
215
193
|
|
|
216
194
|
# [2.4.0](https://github.com/Doist/twist-cli/compare/v2.3.0...v2.4.0) (2026-02-21)
|
|
217
195
|
|
|
218
|
-
|
|
219
196
|
### Features
|
|
220
197
|
|
|
221
|
-
|
|
198
|
+
- add `tw update` self-update command ([#46](https://github.com/Doist/twist-cli/issues/46)) ([b6a019b](https://github.com/Doist/twist-cli/commit/b6a019bf3f8a0178754125165591ae8fe71f7a67))
|
|
222
199
|
|
|
223
200
|
# [2.3.0](https://github.com/Doist/twist-cli/compare/v2.2.0...v2.3.0) (2026-02-20)
|
|
224
201
|
|
|
225
|
-
|
|
226
202
|
### Features
|
|
227
203
|
|
|
228
|
-
|
|
204
|
+
- add shell completions for tw CLI ([#40](https://github.com/Doist/twist-cli/issues/40)) ([3ad6797](https://github.com/Doist/twist-cli/commit/3ad6797075013f9b0c7ee7947025f0cba9d800af))
|
|
229
205
|
|
|
230
206
|
# [2.2.0](https://github.com/Doist/twist-cli/compare/v2.1.0...v2.2.0) (2026-02-20)
|
|
231
207
|
|
|
232
|
-
|
|
233
208
|
### Features
|
|
234
209
|
|
|
235
|
-
|
|
210
|
+
- Improve lenient reference handling across CLI commands ([#38](https://github.com/Doist/twist-cli/issues/38)) ([bbf3a9b](https://github.com/Doist/twist-cli/commit/bbf3a9b550a3cf2f03299d2c81ab2d440d016291))
|
|
236
211
|
|
|
237
212
|
# [2.1.0](https://github.com/Doist/twist-cli/compare/v2.0.0...v2.1.0) (2026-02-19)
|
|
238
213
|
|
|
239
|
-
|
|
240
214
|
### Features
|
|
241
215
|
|
|
242
|
-
|
|
216
|
+
- add `tw view <url>` router command ([#42](https://github.com/Doist/twist-cli/issues/42)) ([b5263fa](https://github.com/Doist/twist-cli/commit/b5263faaded723964b7c65f50a2efac78d491288))
|
|
243
217
|
|
|
244
218
|
# [2.0.0](https://github.com/Doist/twist-cli/compare/v1.11.0...v2.0.0) (2026-02-19)
|
|
245
219
|
|
|
246
|
-
|
|
247
|
-
* feat!: rename `tw msg` to `tw conversation`, repurpose `tw msg` for message operations ([#41](https://github.com/Doist/twist-cli/issues/41)) ([786e97a](https://github.com/Doist/twist-cli/commit/786e97a6d20572a8edb5beccb233c93f9091c38b))
|
|
248
|
-
|
|
220
|
+
- feat!: rename `tw msg` to `tw conversation`, repurpose `tw msg` for message operations ([#41](https://github.com/Doist/twist-cli/issues/41)) ([786e97a](https://github.com/Doist/twist-cli/commit/786e97a6d20572a8edb5beccb233c93f9091c38b))
|
|
249
221
|
|
|
250
222
|
### BREAKING CHANGES
|
|
251
223
|
|
|
252
|
-
|
|
253
|
-
(alias: `convo`) for conversation-level operations (unread, view, reply, done).
|
|
254
|
-
`tw msg` (alias: `message`) now operates on individual conversation messages
|
|
255
|
-
(view, update, delete).
|
|
224
|
+
- `tw msg` no longer operates on conversations. Use `tw conversation`
|
|
225
|
+
(alias: `convo`) for conversation-level operations (unread, view, reply, done).
|
|
226
|
+
`tw msg` (alias: `message`) now operates on individual conversation messages
|
|
227
|
+
(view, update, delete).
|
|
256
228
|
|
|
257
229
|
Also adds alias support to the lazy-loading system and a missing spinner entry
|
|
258
230
|
for `conversationMessages.getMessage`.
|
|
259
231
|
|
|
260
232
|
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
261
233
|
|
|
262
|
-
|
|
234
|
+
- fix: apply field filtering to ndjson output in msg view
|
|
263
235
|
|
|
264
236
|
Ensures --ndjson applies the same essential field filtering as --json,
|
|
265
237
|
as flagged in PR review.
|
|
@@ -268,148 +240,127 @@ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
|
268
240
|
|
|
269
241
|
# [1.11.0](https://github.com/Doist/twist-cli/compare/v1.10.1...v1.11.0) (2026-02-17)
|
|
270
242
|
|
|
271
|
-
|
|
272
243
|
### Features
|
|
273
244
|
|
|
274
|
-
|
|
245
|
+
- add `tw skill update` command and postinstall auto-update ([#37](https://github.com/Doist/twist-cli/issues/37)) ([6b977f0](https://github.com/Doist/twist-cli/commit/6b977f0b232889656ee9e4903a844e1d2af60b52))
|
|
275
246
|
|
|
276
247
|
## [1.10.1](https://github.com/Doist/twist-cli/compare/v1.10.0...v1.10.1) (2026-02-13)
|
|
277
248
|
|
|
278
|
-
|
|
279
249
|
### Performance Improvements
|
|
280
250
|
|
|
281
|
-
|
|
251
|
+
- lazy-load commands and show early spinner for instant feedback ([#35](https://github.com/Doist/twist-cli/issues/35)) ([1f3629f](https://github.com/Doist/twist-cli/commit/1f3629fddb06bf8524faea5680b4918d3a363dfa))
|
|
282
252
|
|
|
283
253
|
# [1.10.0](https://github.com/Doist/twist-cli/compare/v1.9.1...v1.10.0) (2026-02-12)
|
|
284
254
|
|
|
285
|
-
|
|
286
255
|
### Features
|
|
287
256
|
|
|
288
|
-
|
|
257
|
+
- lenient CLI ergonomics — implicit view, workspace flag aliases, conflict detection ([#34](https://github.com/Doist/twist-cli/issues/34)) ([d5c8339](https://github.com/Doist/twist-cli/commit/d5c83391a6bf37edca365bd47d66a1e44a0373bd))
|
|
289
258
|
|
|
290
259
|
## [1.9.1](https://github.com/Doist/twist-cli/compare/v1.9.0...v1.9.1) (2026-02-10)
|
|
291
260
|
|
|
292
|
-
|
|
293
261
|
### Bug Fixes
|
|
294
262
|
|
|
295
|
-
|
|
263
|
+
- **deps:** Update to 2.0.2 of `@doist/twist-sdk` ([#32](https://github.com/Doist/twist-cli/issues/32)) ([bd33220](https://github.com/Doist/twist-cli/commit/bd332208901b1d45396e9227d6117b7b4a226e0c))
|
|
296
264
|
|
|
297
265
|
# [1.9.0](https://github.com/Doist/twist-cli/compare/v1.8.0...v1.9.0) (2026-02-09)
|
|
298
266
|
|
|
299
|
-
|
|
300
267
|
### Features
|
|
301
268
|
|
|
302
|
-
|
|
269
|
+
- upgrade twist-sdk to v2.0.1 and use entity.url instead of getFullTwistURL() ([#31](https://github.com/Doist/twist-cli/issues/31)) ([ce8742b](https://github.com/Doist/twist-cli/commit/ce8742b5e134ab6ee119720f5688ed651c581ed0))
|
|
303
270
|
|
|
304
271
|
# [1.8.0](https://github.com/Doist/twist-cli/compare/v1.7.0...v1.8.0) (2026-02-09)
|
|
305
272
|
|
|
306
|
-
|
|
307
273
|
### Features
|
|
308
274
|
|
|
309
|
-
|
|
275
|
+
- Default to public channels only, add --include-private-channels option ([#27](https://github.com/Doist/twist-cli/issues/27)) ([77c0a18](https://github.com/Doist/twist-cli/commit/77c0a181ab9b2b21db828687cdfd71f25a33800a))
|
|
310
276
|
|
|
311
277
|
# [1.7.0](https://github.com/Doist/twist-cli/compare/v1.6.1...v1.7.0) (2026-02-09)
|
|
312
278
|
|
|
313
|
-
|
|
314
279
|
### Features
|
|
315
280
|
|
|
316
|
-
|
|
281
|
+
- add --comment flag to thread view ([#28](https://github.com/Doist/twist-cli/issues/28)) ([60fd075](https://github.com/Doist/twist-cli/commit/60fd075a8562b0bd18ad6f10f8805dd87fef2574))
|
|
317
282
|
|
|
318
283
|
## [1.6.1](https://github.com/Doist/twist-cli/compare/v1.6.0...v1.6.1) (2026-02-08)
|
|
319
284
|
|
|
320
|
-
|
|
321
285
|
### Bug Fixes
|
|
322
286
|
|
|
323
|
-
|
|
287
|
+
- add missing flags and commands to skill content ([#30](https://github.com/Doist/twist-cli/issues/30)) ([479485a](https://github.com/Doist/twist-cli/commit/479485a387acd1e99894f15bda0078b30efda891))
|
|
324
288
|
|
|
325
289
|
# [1.6.0](https://github.com/Doist/twist-cli/compare/v1.5.0...v1.6.0) (2026-02-07)
|
|
326
290
|
|
|
327
|
-
|
|
328
291
|
### Bug Fixes
|
|
329
292
|
|
|
330
|
-
|
|
331
|
-
|
|
293
|
+
- strictly validate user IDs in --notify to reject non-numeric input ([d8e9ee5](https://github.com/Doist/twist-cli/commit/d8e9ee598e970dca1e5d1d98b9f74d8985b9b0f8))
|
|
332
294
|
|
|
333
295
|
### Features
|
|
334
296
|
|
|
335
|
-
|
|
297
|
+
- add recipients option ([91fdc05](https://github.com/Doist/twist-cli/commit/91fdc0592e567fb4832bdb59473de746f3034f5f))
|
|
336
298
|
|
|
337
299
|
# [1.5.0](https://github.com/Doist/twist-cli/compare/v1.4.0...v1.5.0) (2026-01-29)
|
|
338
300
|
|
|
339
|
-
|
|
340
301
|
### Features
|
|
341
302
|
|
|
342
|
-
|
|
303
|
+
- add --progress-jsonl flag for machine-readable progress reporting ([#24](https://github.com/Doist/twist-cli/issues/24)) ([3d7a266](https://github.com/Doist/twist-cli/commit/3d7a266574f97bcc480f5023d5251f1839309318))
|
|
343
304
|
|
|
344
305
|
# [1.4.0](https://github.com/Doist/twist-cli/compare/v1.3.1...v1.4.0) (2026-01-29)
|
|
345
306
|
|
|
346
|
-
|
|
347
307
|
### Bug Fixes
|
|
348
308
|
|
|
349
|
-
|
|
350
|
-
|
|
309
|
+
- **deps:** update to latest `@doist/twist-sdk` package ([8a8cd6d](https://github.com/Doist/twist-cli/commit/8a8cd6de86bcce56bb01f2f64edd9835fe89407d))
|
|
351
310
|
|
|
352
311
|
### Features
|
|
353
312
|
|
|
354
|
-
|
|
313
|
+
- add GitHub Action workflow for automated @doist/twist-sdk updates ([7cbdeb1](https://github.com/Doist/twist-cli/commit/7cbdeb184876b244ef26d948fc751c8b6a98b94a))
|
|
355
314
|
|
|
356
315
|
## [1.3.1](https://github.com/Doist/twist-cli/compare/v1.3.0...v1.3.1) (2026-01-27)
|
|
357
316
|
|
|
358
|
-
|
|
359
317
|
### Bug Fixes
|
|
360
318
|
|
|
361
|
-
|
|
319
|
+
- Ensure that client registration provides a logo ([#21](https://github.com/Doist/twist-cli/issues/21)) ([ad5333c](https://github.com/Doist/twist-cli/commit/ad5333cb451c5766555d4b0fa88671ec48475b17))
|
|
362
320
|
|
|
363
321
|
# [1.3.0](https://github.com/Doist/twist-cli/compare/v1.2.0...v1.3.0) (2026-01-24)
|
|
364
322
|
|
|
365
|
-
|
|
366
323
|
### Features
|
|
367
324
|
|
|
368
|
-
|
|
325
|
+
- add hidden interactive prompt for auth token input ([#20](https://github.com/Doist/twist-cli/issues/20)) ([1a5b7be](https://github.com/Doist/twist-cli/commit/1a5b7bef835fa5b752285e1954d7857e07c6c28c))
|
|
369
326
|
|
|
370
327
|
# [1.2.0](https://github.com/Doist/twist-cli/compare/v1.1.0...v1.2.0) (2026-01-23)
|
|
371
328
|
|
|
372
|
-
|
|
373
329
|
### Features
|
|
374
330
|
|
|
375
|
-
|
|
331
|
+
- add codex and cursor agent skill support ([#18](https://github.com/Doist/twist-cli/issues/18)) ([1a3b182](https://github.com/Doist/twist-cli/commit/1a3b182ae6f4cd5d439e26bfba6df65ab66c7684))
|
|
376
332
|
|
|
377
333
|
# [1.1.0](https://github.com/Doist/twist-cli/compare/v1.0.1...v1.1.0) (2026-01-23)
|
|
378
334
|
|
|
379
|
-
|
|
380
335
|
### Bug Fixes
|
|
381
336
|
|
|
382
|
-
|
|
383
|
-
|
|
337
|
+
- Format error message on single line ([89f3ef8](https://github.com/Doist/twist-cli/commit/89f3ef8b410565e3e0186447d7cf57ab50a12011))
|
|
384
338
|
|
|
385
339
|
### Features
|
|
386
340
|
|
|
387
|
-
|
|
341
|
+
- Add tw skill command for agent skill integrations ([1228ce6](https://github.com/Doist/twist-cli/commit/1228ce63f2dc0b7ac2ed17b3121660ff7c760514))
|
|
388
342
|
|
|
389
343
|
## [1.0.1](https://github.com/Doist/twist-cli/compare/v1.0.0...v1.0.1) (2026-01-22)
|
|
390
344
|
|
|
391
|
-
|
|
392
345
|
### Bug Fixes
|
|
393
346
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
347
|
+
- remove registry-url from setup-node for provenance publishing ([#14](https://github.com/Doist/twist-cli/issues/14)) ([1fe3f49](https://github.com/Doist/twist-cli/commit/1fe3f49e9c504c9c17b29b4e36494bc76e7829fe))
|
|
348
|
+
- upgrade semantic-release to v25 and fix trusted publishing ([#16](https://github.com/Doist/twist-cli/issues/16)) ([7d45c08](https://github.com/Doist/twist-cli/commit/7d45c0841343d35ef1eb4ba4cee99497d90937e6))
|
|
349
|
+
- use Node 22 for release job to satisfy semantic-release v25 requirements ([#17](https://github.com/Doist/twist-cli/issues/17)) ([96b0d9d](https://github.com/Doist/twist-cli/commit/96b0d9de8b95dd0b39eac78f56f492ff01671ca9))
|
|
397
350
|
|
|
398
351
|
# 1.0.0 (2026-01-22)
|
|
399
352
|
|
|
400
|
-
|
|
401
353
|
### Bug Fixes
|
|
402
354
|
|
|
403
|
-
|
|
404
|
-
|
|
355
|
+
- add UTF-8 charset to OAuth callback HTML responses ([#8](https://github.com/Doist/twist-cli/issues/8)) ([fcb2d49](https://github.com/Doist/twist-cli/commit/fcb2d49664720292d066993dacab5c0cb7ee5f53))
|
|
405
356
|
|
|
406
357
|
### Features
|
|
407
358
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
359
|
+
- Add Biome linting, upgrade to Node 20, and add CI workflows ([#3](https://github.com/Doist/twist-cli/issues/3)) ([57f802e](https://github.com/Doist/twist-cli/commit/57f802e60f7133b7cc4fedfe7a9fd0058faa4e61))
|
|
360
|
+
- add loading animations with global API proxy integration ([#7](https://github.com/Doist/twist-cli/issues/7)) ([bf53bfb](https://github.com/Doist/twist-cli/commit/bf53bfbcc99daa086b9883b33848c7226ee33499))
|
|
361
|
+
- Add OAuth authentication with dynamic client registration ([#6](https://github.com/Doist/twist-cli/issues/6)) ([2845ebd](https://github.com/Doist/twist-cli/commit/2845ebd916b3d7a5e390135d8ebe52c668641a71)), closes [#5](https://github.com/Doist/twist-cli/issues/5)
|
|
362
|
+
- add semantic release automation for NPM publishing ([#10](https://github.com/Doist/twist-cli/issues/10)) ([c756324](https://github.com/Doist/twist-cli/commit/c7563244f20f769c6573b89562e9f9c3b2728444))
|
|
363
|
+
- Refactor login command to auth with status/logout subcommands ([#4](https://github.com/Doist/twist-cli/issues/4)) ([59e6493](https://github.com/Doist/twist-cli/commit/59e6493455f3f6034a3a7183b423fdf1ceddee91))
|
|
413
364
|
|
|
414
365
|
# Changelog
|
|
415
366
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0KnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB1D"}
|
package/dist/commands/auth.js
CHANGED
|
@@ -3,8 +3,8 @@ import chalk from 'chalk';
|
|
|
3
3
|
import open from 'open';
|
|
4
4
|
import { getSessionUser } from '../lib/api.js';
|
|
5
5
|
import { clearApiToken, getAuthMetadata, saveApiToken, } from '../lib/auth.js';
|
|
6
|
-
import { buildAuthorizationUrl, exchangeCodeForToken, READ_ONLY_SCOPES, READ_WRITE_SCOPES, registerDynamicClient, } from '../lib/oauth.js';
|
|
7
6
|
import { startCallbackServer } from '../lib/oauth-server.js';
|
|
7
|
+
import { buildAuthorizationUrl, exchangeCodeForToken, READ_ONLY_SCOPES, READ_WRITE_SCOPES, registerDynamicClient, } from '../lib/oauth.js';
|
|
8
8
|
import { generateCodeChallenge, generateCodeVerifier, generateState } from '../lib/pkce.js';
|
|
9
9
|
async function loginWithOAuth(options) {
|
|
10
10
|
const modeLabel = options.readOnly ? 'read-only' : 'read-write';
|
|
@@ -66,7 +66,6 @@ function promptHiddenInput(prompt) {
|
|
|
66
66
|
input: process.stdin,
|
|
67
67
|
output: process.stdout,
|
|
68
68
|
});
|
|
69
|
-
// biome-ignore lint/suspicious/noExplicitAny: accessing private readline property
|
|
70
69
|
const origWrite = rl._writeToOutput;
|
|
71
70
|
rl._writeToOutput = (str) => {
|
|
72
71
|
if (str.includes(prompt)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EACH,aAAa,EACb,eAAe,EACf,YAAY,GAEf,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACH,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function fetchLatestVersion(tag: string): Promise<string>;
|
|
2
|
+
export declare function detectPackageManager(): string;
|
|
3
|
+
export declare function runInstall(pm: string, tag: string): Promise<{
|
|
4
|
+
exitCode: number;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}>;
|
|
7
|
+
interface UpdateOptions {
|
|
8
|
+
check?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function updateAction(options: UpdateOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"AAkCA,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQrE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAejG;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FxE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import pkg from '../../../package.json' with { type: 'json' };
|
|
4
|
+
import { getConfig } from '../../lib/config.js';
|
|
5
|
+
import { withSpinner } from '../../lib/spinner.js';
|
|
6
|
+
const PACKAGE_NAME = '@doist/twist-cli';
|
|
7
|
+
function parseVersion(version) {
|
|
8
|
+
const [core, ...rest] = version.split('-');
|
|
9
|
+
const [major, minor, patch] = core.split('.').map(Number);
|
|
10
|
+
return { major, minor, patch, prerelease: rest.length > 0 ? rest.join('-') : undefined };
|
|
11
|
+
}
|
|
12
|
+
function isNewer(current, candidate) {
|
|
13
|
+
const a = parseVersion(current);
|
|
14
|
+
const b = parseVersion(candidate);
|
|
15
|
+
for (const key of ['major', 'minor', 'patch']) {
|
|
16
|
+
if (b[key] !== a[key])
|
|
17
|
+
return b[key] > a[key];
|
|
18
|
+
}
|
|
19
|
+
if (!a.prerelease && b.prerelease)
|
|
20
|
+
return false;
|
|
21
|
+
if (a.prerelease && !b.prerelease)
|
|
22
|
+
return true;
|
|
23
|
+
if (a.prerelease && b.prerelease)
|
|
24
|
+
return b.prerelease.localeCompare(a.prerelease, undefined, { numeric: true }) > 0;
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
export async function fetchLatestVersion(tag) {
|
|
28
|
+
const url = `https://registry.npmjs.org/${PACKAGE_NAME}/${tag}`;
|
|
29
|
+
const response = await fetch(url);
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(`Registry returned ${response.status}`);
|
|
32
|
+
}
|
|
33
|
+
const data = (await response.json());
|
|
34
|
+
return data.version;
|
|
35
|
+
}
|
|
36
|
+
export function detectPackageManager() {
|
|
37
|
+
const execPath = process.env.npm_execpath ?? '';
|
|
38
|
+
if (execPath.includes('pnpm')) {
|
|
39
|
+
return 'pnpm';
|
|
40
|
+
}
|
|
41
|
+
return 'npm';
|
|
42
|
+
}
|
|
43
|
+
export function runInstall(pm, tag) {
|
|
44
|
+
const command = pm === 'pnpm' ? 'add' : 'install';
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
const child = spawn(pm, [command, '-g', `${PACKAGE_NAME}@${tag}`], {
|
|
47
|
+
stdio: 'pipe',
|
|
48
|
+
});
|
|
49
|
+
let stderr = '';
|
|
50
|
+
child.stderr?.on('data', (data) => {
|
|
51
|
+
stderr += data.toString();
|
|
52
|
+
});
|
|
53
|
+
child.on('error', reject);
|
|
54
|
+
child.on('close', (code) => resolve({ exitCode: code ?? 1, stderr }));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export async function updateAction(options) {
|
|
58
|
+
const currentVersion = pkg.version;
|
|
59
|
+
const config = await getConfig();
|
|
60
|
+
const channel = config.updateChannel ?? 'stable';
|
|
61
|
+
const tag = channel === 'pre-release' ? 'next' : 'latest';
|
|
62
|
+
const label = channel === 'pre-release' ? ` ${chalk.magenta('(pre-release)')}` : '';
|
|
63
|
+
let latestVersion;
|
|
64
|
+
try {
|
|
65
|
+
latestVersion = await withSpinner({ text: `Checking for updates${label}...` }, () => fetchLatestVersion(tag));
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
69
|
+
console.error(chalk.red('Failed to check for updates:'), message);
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const updateAvailable = currentVersion !== latestVersion;
|
|
74
|
+
if (options.check) {
|
|
75
|
+
const channelLine = channel === 'pre-release'
|
|
76
|
+
? ` Channel: ${chalk.magenta('pre-release')}`
|
|
77
|
+
: ` Channel: ${chalk.green('stable')}`;
|
|
78
|
+
if (updateAvailable) {
|
|
79
|
+
console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}${label}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
|
|
83
|
+
}
|
|
84
|
+
console.log(channelLine);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!updateAvailable) {
|
|
88
|
+
console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const newer = isNewer(currentVersion, latestVersion);
|
|
92
|
+
console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}${label}`);
|
|
93
|
+
if (!newer) {
|
|
94
|
+
console.log(chalk.yellow('Note:'), `v${latestVersion}${channel === 'pre-release' ? ' (pre-release)' : ''} is older than your current v${currentVersion}`);
|
|
95
|
+
}
|
|
96
|
+
const pm = detectPackageManager();
|
|
97
|
+
let result;
|
|
98
|
+
try {
|
|
99
|
+
result = await withSpinner({ text: `Updating to v${latestVersion}${label}...`, color: 'blue' }, () => runInstall(pm, tag));
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error instanceof Error && 'code' in error && error.code === 'EACCES') {
|
|
103
|
+
console.error(chalk.red('Permission denied.'), `Try running with sudo: sudo ${pm} ${pm === 'pnpm' ? 'add' : 'install'} -g ${PACKAGE_NAME}@${tag}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
107
|
+
console.error(chalk.red('Update failed:'), message);
|
|
108
|
+
}
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (result.exitCode !== 0) {
|
|
113
|
+
console.error(chalk.red('Update failed:'), `${pm} exited with code ${result.exitCode}`);
|
|
114
|
+
if (result.stderr) {
|
|
115
|
+
console.error(chalk.dim(result.stderr.trim()));
|
|
116
|
+
}
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log(chalk.green('✓'), `Updated to v${latestVersion}`);
|
|
121
|
+
if (channel !== 'pre-release') {
|
|
122
|
+
console.log(chalk.dim(' Run'), chalk.cyan('tw changelog'), chalk.dim('to see what changed'));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/commands/update/channel.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAQjD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getConfig } from '../../lib/config.js';
|
|
3
|
+
export async function showChannel() {
|
|
4
|
+
const config = await getConfig();
|
|
5
|
+
const channel = config.updateChannel ?? 'stable';
|
|
6
|
+
if (channel === 'pre-release') {
|
|
7
|
+
console.log(`Update channel: ${chalk.magenta('pre-release')}`);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
console.log(`Update channel: ${chalk.green('stable')}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../../src/commands/update/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC7B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAA;IAChD,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAClE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/update/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe5D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { updateAction } from './action.js';
|
|
2
|
+
import { showChannel } from './channel.js';
|
|
3
|
+
import { switchChannel } from './switch.js';
|
|
4
|
+
export function registerUpdateCommand(program) {
|
|
5
|
+
const update = program
|
|
6
|
+
.command('update')
|
|
7
|
+
.description('Update the CLI to the latest version for the configured channel')
|
|
8
|
+
.option('--check', 'Check for updates without installing')
|
|
9
|
+
.action(updateAction);
|
|
10
|
+
update.command('channel').description('Show the current update channel').action(showChannel);
|
|
11
|
+
update
|
|
12
|
+
.command('switch')
|
|
13
|
+
.description('Switch update channel between stable and pre-release')
|
|
14
|
+
.option('--stable', 'Use the stable release channel')
|
|
15
|
+
.option('--pre-release', 'Use the pre-release (next) channel')
|
|
16
|
+
.action(switchChannel);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/update/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,MAAM,MAAM,GAAG,OAAO;SACjB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;SACzD,MAAM,CAAC,YAAY,CAAC,CAAA;IAEzB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAE5F,MAAM;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,UAAU,EAAE,gCAAgC,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC7D,MAAM,CAAC,aAAa,CAAC,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/commands/update/switch.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IACzC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getConfig, setConfig } from '../../lib/config.js';
|
|
3
|
+
export async function switchChannel(options) {
|
|
4
|
+
if (options.stable && options.preRelease) {
|
|
5
|
+
console.error(chalk.red('Error:'), 'Specify either --stable or --pre-release, not both.');
|
|
6
|
+
process.exitCode = 1;
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (!options.stable && !options.preRelease) {
|
|
10
|
+
console.error(chalk.red('Error:'), 'Specify --stable or --pre-release.');
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const channel = options.preRelease ? 'pre-release' : 'stable';
|
|
15
|
+
const config = await getConfig();
|
|
16
|
+
config.updateChannel = channel;
|
|
17
|
+
await setConfig(config);
|
|
18
|
+
if (channel === 'pre-release') {
|
|
19
|
+
console.log(chalk.green('✓'), `Update channel set to ${chalk.magenta('pre-release')}`);
|
|
20
|
+
console.log();
|
|
21
|
+
console.log(chalk.yellow('Note:'), 'Pre-release updates follow the', chalk.cyan('next'), 'branch.');
|
|
22
|
+
console.log('When pre-release changes are merged into a stable release, no further');
|
|
23
|
+
console.log('pre-release updates will be published until a new pre-release cycle begins.');
|
|
24
|
+
console.log('Remember to switch back to stable when done:');
|
|
25
|
+
console.log(chalk.dim(' tw update switch --stable'));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(chalk.green('✓'), 'Update channel set to stable');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/commands/update/switch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAA;AAE9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAGnC;IACG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,qDAAqD,CAAC,CAAA;QACzF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,oCAAoC,CAAC,CAAA;QACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAkB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC5E,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;IAChC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAA;IAC9B,MAAM,SAAS,CAAC,MAAM,CAAC,CAAA;IAEvB,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,yBAAyB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QACtF,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EACrB,gCAAgC,EAChC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,SAAS,CACZ,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;QACpF,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;QAC1F,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAA;IACjE,CAAC;AACL,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ const loadSkillCommand = async () => (await import('./commands/skill.js')).regis
|
|
|
17
17
|
const loadViewCommand = async () => (await import('./commands/view.js')).registerViewCommand;
|
|
18
18
|
const loadCompletionCommand = async () => (await import('./commands/completion.js')).registerCompletionCommand;
|
|
19
19
|
const loadAwayCommand = async () => (await import('./commands/away.js')).registerAwayCommand;
|
|
20
|
-
const loadUpdateCommand = async () => (await import('./commands/update.js')).registerUpdateCommand;
|
|
20
|
+
const loadUpdateCommand = async () => (await import('./commands/update/index.js')).registerUpdateCommand;
|
|
21
21
|
const loadChangelogCommand = async () => (await import('./commands/changelog.js')).registerChangelogCommand;
|
|
22
22
|
const commands = {
|
|
23
23
|
workspaces: ['List all workspaces', loadWorkspaceCommand],
|
|
@@ -38,7 +38,7 @@ const commands = {
|
|
|
38
38
|
skill: ['Manage agent skill integrations', loadSkillCommand],
|
|
39
39
|
view: ['View a Twist entity by URL', loadViewCommand],
|
|
40
40
|
completion: ['Manage shell completions', loadCompletionCommand],
|
|
41
|
-
update: ['Update the CLI to the latest version', loadUpdateCommand],
|
|
41
|
+
update: ['Update the CLI to the latest version for the configured channel', loadUpdateCommand],
|
|
42
42
|
changelog: ['Show recent changelog entries', loadChangelogCommand],
|
|
43
43
|
};
|
|
44
44
|
const commandAliases = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAgB,OAAO,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEtE,MAAM,oBAAoB,GAAG,KAAK,IAAI,EAAE,CACpC,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC,wBAAwB,CAAA;AACtE,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC5F,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE,CAClC,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,sBAAsB,CAAA;AAClE,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB,CAAA;AAC/F,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,qBAAqB,CAAA;AAClG,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE,CACvC,CAAC,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC,2BAA2B,CAAA;AAC5E,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAA;AACzF,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE,CAClC,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,sBAAsB,CAAA;AAClE,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,qBAAqB,CAAA;AAClG,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB,CAAA;AAC/F,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC5F,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB,CAAA;AAC/F,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC5F,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE,CACrC,CAAC,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC,yBAAyB,CAAA;AACxE,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC5F,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export type AuthMode = 'read-only' | 'read-write' | 'unknown';
|
|
2
|
+
export type UpdateChannel = 'stable' | 'pre-release';
|
|
2
3
|
export interface Config {
|
|
3
4
|
token?: string;
|
|
4
5
|
pendingSecureStoreClear?: boolean;
|
|
5
6
|
currentWorkspace?: number;
|
|
6
7
|
authMode?: AuthMode;
|
|
7
8
|
authScope?: string;
|
|
9
|
+
updateChannel?: UpdateChannel;
|
|
8
10
|
}
|
|
9
11
|
export declare function getConfig(): Promise<Config>;
|
|
10
12
|
export declare function setConfig(config: Config): Promise<void>;
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAC7D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAA;AAEpD,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;IAClB,aAAa,CAAC,EAAE,aAAa,CAAA;CAChC;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"}
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +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;
|
|
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;AAiB1E,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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const SKILL_NAME = "twist-cli";
|
|
2
2
|
export declare const SKILL_DESCRIPTION = "Twist messaging CLI for team communication";
|
|
3
|
-
export declare const SKILL_CONTENT = "# Twist CLI (tw)\n\nAccess Twist messaging via the `tw` CLI. Use when the user asks about their Twist workspaces, threads, messages, or wants to interact with Twist in any way.\n\n## Setup\n\n```bash\ntw auth login # OAuth login (opens browser, read-write)\ntw auth login --read-only # OAuth login with read-only scope\ntw auth token # Save API token manually (prompts securely; scope unknown, assumed write-capable)\ntw auth status # Verify authentication + show mode\ntw auth status --json # JSON output: { id, email, name }\ntw auth logout # Remove saved token and auth metadata\ntw workspaces # List available workspaces\ntw workspace use <ref> # Set current workspace\ntw completion install # Install shell completions\ntw update # Update CLI to latest version\ntw changelog # Show recent changelog entries\n```\n\nStored auth uses the system credential manager when available. If secure storage is unavailable, `tw` warns and falls back to `~/.config/twist-cli/config.json`. `TWIST_API_TOKEN` always takes priority over the stored token, and legacy plaintext config tokens are migrated automatically when secure storage is available.\n\nIn read-only mode (`tw auth login --read-only`), commands that modify Twist data (reply, archive, react, delete, etc.) are blocked by the CLI. Externally provided tokens (`TWIST_API_TOKEN` or `tw auth token`) are treated as unknown scope and assumed write-capable.\n\n## View by URL\n\n```bash\ntw view <url> # View any Twist entity by URL\n```\n\nRoutes automatically based on URL structure:\n- Message URL \u2192 `tw msg view`\n- Conversation URL \u2192 `tw conversation view`\n- Thread+comment URL \u2192 `tw thread view` (comment ID extracted from URL)\n- Thread URL \u2192 `tw thread view`\n\nAll target command flags pass through (e.g. `--json`, `--raw`, `--full`).\n\n## Inbox\n\n```bash\ntw inbox # Show inbox threads\ntw inbox --unread # Only unread threads\ntw inbox --channel <filter> # Filter by channel name (fuzzy)\ntw inbox --since <date> # Filter by date (ISO format)\ntw inbox --limit <n> # Max items (default: 50)\n```\n\n## Threads\n\n```bash\ntw thread <thread-ref> # View thread (shorthand for view)\ntw thread view <thread-ref> # View thread with comments\ntw thread view <ref> --comment <id> # View a specific comment\ntw thread view <url-with-/c/id> # Comment ID extracted from URL\ntw thread view <ref> --unread # Show only unread comments\ntw thread view <ref> --context 3 # Include 3 read comments before unread\ntw thread view <ref> --limit 20 # Limit number of comments\ntw thread view <ref> --since <date> # Comments newer than date\ntw thread view <ref> --raw # Show raw markdown\ntw thread create <channel-ref> \"Title\" \"content\" # Create a new thread\ntw thread create <channel-ref> \"Title\" \"content\" --json # Create and return as JSON\ntw thread create <channel-ref> \"Title\" \"content\" --json --full # Include all thread fields\ntw thread create <channel-ref> \"Title\" \"content\" --notify 123,456 # Notify specific users\ntw thread create <channel-ref> \"Title\" \"content\" --dry-run # Preview without posting\ntw thread reply <ref> \"content\" # Post a comment (notifies EVERYONE_IN_THREAD by default)\ntw thread reply <ref> \"content\" --notify EVERYONE # Notify all workspace members\ntw thread reply <ref> \"content\" --notify 123,id:456 # Notify specific user IDs\ntw thread reply <ref> \"content\" --json # Post and return comment as JSON\ntw thread reply <ref> \"content\" --json --full # Include all comment fields\ntw thread reply <ref> \"content\" --close # Reply and close the thread\ntw thread reply <ref> \"content\" --reopen # Reply and reopen a closed thread\ntw thread done <ref> # Archive thread (mark done)\ntw thread done <ref> --json # Archive and return status as JSON\ntw thread mute <ref> # Mute thread for 60 minutes (default)\ntw thread mute <ref> --minutes 480 # Mute for custom duration\ntw thread mute <ref> --json # Mute and return { id, mutedUntil } as JSON\ntw thread mute <ref> --json --full # Mute and return full thread as JSON\ntw thread unmute <ref> # Unmute a muted thread\ntw thread unmute <ref> --json # Unmute and return { id, mutedUntil } as JSON\n```\n\nDefault `--notify` for reply is EVERYONE_IN_THREAD, which may notify more people than intended. Before posting, confirm with the user whether specific people should be notified instead (via `--notify <user-ids>`). Options: EVERYONE, EVERYONE_IN_THREAD, or comma-separated user ID refs.\n\n## Thread Comments\n\n```bash\ntw comment <comment-ref> # View a comment (shorthand for view)\ntw comment view <comment-ref> # View a single thread comment\ntw comment view <comment-ref> --raw # Show raw markdown\ntw comment view <comment-ref> --json # Output as JSON\ntw comment view <comment-ref> --json --full # Include all fields in JSON output\ntw comment update <comment-ref> \"new content\" # Update a thread comment\ntw comment update <comment-ref> \"content\" --json # Update and return updated comment as JSON\ntw comment update <comment-ref> \"content\" --json --full # Include all comment fields\ntw comment delete <comment-ref> # Delete a thread comment\ntw comment delete <comment-ref> --json # Delete and return status as JSON\n```\n\n## Conversations (DMs/Groups)\n\n```bash\ntw conversation unread # List unread conversations\ntw conversation <conversation-ref> # View conversation (shorthand for view)\ntw conversation view <conversation-ref> # View conversation messages\ntw conversation with <user-ref> # Find your 1:1 DM with a user\ntw conversation with <user-ref> --snippet # Include the latest message preview\ntw conversation with <user-ref> --include-groups # List any conversations with that user\ntw conversation reply <ref> \"content\" # Send a message\ntw conversation reply <ref> \"content\" --json # Send and return message as JSON\ntw conversation reply <ref> \"content\" --json --full # Include all message fields\ntw conversation done <ref> # Archive conversation\ntw conversation done <ref> --json # Archive and return status as JSON\ntw conversation mute <ref> # Mute conversation for 60 minutes (default)\ntw conversation mute <ref> --minutes 480 # Mute for custom duration\ntw conversation mute <ref> --json # Mute and return { id, mutedUntil } as JSON\ntw conversation mute <ref> --json --full # Mute and return full conversation as JSON\ntw conversation unmute <ref> # Unmute a muted conversation\ntw conversation unmute <ref> --json # Unmute and return { id, mutedUntil } as JSON\n```\n\nAlias: `tw convo` works the same as `tw conversation`.\n\n## Conversation Messages\n\n```bash\ntw msg <message-ref> # View a message (shorthand for view)\ntw msg view <message-ref> # View a single conversation message\ntw msg update <ref> \"content\" # Edit a conversation message\ntw msg update <ref> \"content\" --json # Edit and return updated message as JSON\ntw msg update <ref> \"content\" --json --full # Include all message fields\ntw msg delete <ref> # Delete a conversation message\ntw msg delete <ref> --json # Delete and return status as JSON\n```\n\nAlias: `tw message` works the same as `tw msg`.\n\n## Search\n\n```bash\ntw search \"query\" # Search content\ntw search \"query\" --type threads # Filter: threads, messages, or all\ntw search \"query\" --author <ref> # Filter by author\ntw search \"query\" --to <ref> # Messages sent to user\ntw search \"query\" --title-only # Search thread titles only\ntw search \"query\" --mention-me # Results mentioning current user\ntw search \"query\" --conversation <refs> # Limit to conversations (comma-separated refs)\ntw search \"query\" --since <date> # Content from date\ntw search \"query\" --until <date> # Content until date\ntw search \"query\" --channel <refs> # Filter by channel refs (comma-separated)\ntw search \"query\" --limit <n> # Max results (default: 50)\ntw search \"query\" --cursor <cur> # Pagination cursor\n```\n\n## Users & Channels\n\n```bash\ntw user # Show current user info\ntw users # List workspace users\ntw users --search <text> # Filter by name/email\ntw channels # List workspace channels\n```\n\n## Away Status\n\n```bash\ntw away # Show current away status\ntw away set <type> [until] # Set away (type: vacation, parental, sickleave, other)\ntw away set vacation 2026-03-20 # Away until March 20\ntw away set vacation 2026-03-20 --from 2026-03-15 # Custom start date\ntw away clear # Clear away status\n```\n\n## Reactions\n\n```bash\ntw react thread <ref> \uD83D\uDC4D # Add reaction to thread\ntw react comment <ref> +1 # Add reaction (shortcode)\ntw react message <ref> heart # Add reaction to DM message\ntw unreact thread <ref> \uD83D\uDC4D # Remove reaction\n```\n\nSupported shortcodes: +1, -1, heart, tada, smile, laughing, thinking, fire, check, x, eyes, pray, clap, rocket, wave\n\n## Shell Completions\n\n```bash\ntw completion install # Install tab completions (prompts for shell)\ntw completion install bash # Install for specific shell\ntw completion install zsh\ntw completion install fish\ntw completion uninstall # Remove completions\n```\n\n### Update\n\n```bash\ntw update # Update CLI to latest version\ntw update --check # Check for updates without installing\n```\n\n### Changelog\n```bash\ntw changelog # Show last 5 versions\ntw changelog -n 3 # Show last 3 versions\ntw changelog --count 10 # Show last 10 versions\n```\n\n## Global Options\n\n```bash\n--no-spinner # Disable loading animations\n--progress-jsonl # Machine-readable progress events (JSONL to stderr)\n--accessible # Add text labels to color-coded output (also: TW_ACCESSIBLE=1)\n```\n\n## Output Formats\n\nAll list/view commands support:\n\n```bash\n--json # Output as JSON\n--ndjson # Output as newline-delimited JSON (for streaming)\n--full # Include all fields (default shows essential fields only)\n```\n\n## Reference System\n\nCommands accept flexible references:\n- **Numeric IDs**: `123` or `id:123`\n- **Twist URLs**: Full `https://twist.com/...` URLs (parsed automatically)\n- **Fuzzy names**: For workspaces/users - `\"My Workspace\"` or partial matches\n\n## Piping Content\n\nCommands that accept content (`thread create`, `thread reply`, `comment update`, `conversation reply`, `msg update`) auto-detect piped stdin:\n\n```bash\ncat notes.md | tw thread reply <ref>\ntw thread create <channel-ref> \"Title\" < body.md\necho \"Quick reply\" | tw conversation reply <ref>\n```\n\nIf no content argument is provided and no stdin is piped, the CLI opens `$EDITOR` for interactive input.\n\n## Common Workflows\n\n**View by URL (auto-routes to the right command):**\n```bash\ntw view https://twist.com/a/1585/ch/100/t/200 # View thread\ntw view https://twist.com/a/1585/ch/100/t/200/c/300 # View comment\ntw view https://twist.com/a/1585/msg/400 # View conversation\ntw view https://twist.com/a/1585/msg/400/m/500 --json # View message as JSON\n```\n\n**Check inbox and respond:**\n```bash\ntw inbox --unread --json\ntw thread view <id> --unread\ntw thread reply <id> \"Thanks, I'll look into this.\"\ntw thread done <id>\n```\n\n**Search and review:**\n```bash\ntw search \"deployment\" --type threads --json\ntw thread view <thread-id>\n```\n\n**Check DMs:**\n```bash\ntw conversation unread --json\ntw conversation view <conversation-id>\ntw conversation with \"Alice Example\"\ntw conversation reply <id> \"Got it, thanks!\"\n```\n";
|
|
3
|
+
export declare const SKILL_CONTENT = "# Twist CLI (tw)\n\nAccess Twist messaging via the `tw` CLI. Use when the user asks about their Twist workspaces, threads, messages, or wants to interact with Twist in any way.\n\n## Setup\n\n```bash\ntw auth login # OAuth login (opens browser, read-write)\ntw auth login --read-only # OAuth login with read-only scope\ntw auth token # Save API token manually (prompts securely; scope unknown, assumed write-capable)\ntw auth status # Verify authentication + show mode\ntw auth status --json # JSON output: { id, email, name }\ntw auth logout # Remove saved token and auth metadata\ntw workspaces # List available workspaces\ntw workspace use <ref> # Set current workspace\ntw completion install # Install shell completions\ntw update # Update CLI to latest version\ntw changelog # Show recent changelog entries\n```\n\nStored auth uses the system credential manager when available. If secure storage is unavailable, `tw` warns and falls back to `~/.config/twist-cli/config.json`. `TWIST_API_TOKEN` always takes priority over the stored token, and legacy plaintext config tokens are migrated automatically when secure storage is available.\n\nIn read-only mode (`tw auth login --read-only`), commands that modify Twist data (reply, archive, react, delete, etc.) are blocked by the CLI. Externally provided tokens (`TWIST_API_TOKEN` or `tw auth token`) are treated as unknown scope and assumed write-capable.\n\n## View by URL\n\n```bash\ntw view <url> # View any Twist entity by URL\n```\n\nRoutes automatically based on URL structure:\n- Message URL \u2192 `tw msg view`\n- Conversation URL \u2192 `tw conversation view`\n- Thread+comment URL \u2192 `tw thread view` (comment ID extracted from URL)\n- Thread URL \u2192 `tw thread view`\n\nAll target command flags pass through (e.g. `--json`, `--raw`, `--full`).\n\n## Inbox\n\n```bash\ntw inbox # Show inbox threads\ntw inbox --unread # Only unread threads\ntw inbox --channel <filter> # Filter by channel name (fuzzy)\ntw inbox --since <date> # Filter by date (ISO format)\ntw inbox --limit <n> # Max items (default: 50)\n```\n\n## Threads\n\n```bash\ntw thread <thread-ref> # View thread (shorthand for view)\ntw thread view <thread-ref> # View thread with comments\ntw thread view <ref> --comment <id> # View a specific comment\ntw thread view <url-with-/c/id> # Comment ID extracted from URL\ntw thread view <ref> --unread # Show only unread comments\ntw thread view <ref> --context 3 # Include 3 read comments before unread\ntw thread view <ref> --limit 20 # Limit number of comments\ntw thread view <ref> --since <date> # Comments newer than date\ntw thread view <ref> --raw # Show raw markdown\ntw thread create <channel-ref> \"Title\" \"content\" # Create a new thread\ntw thread create <channel-ref> \"Title\" \"content\" --json # Create and return as JSON\ntw thread create <channel-ref> \"Title\" \"content\" --json --full # Include all thread fields\ntw thread create <channel-ref> \"Title\" \"content\" --notify 123,456 # Notify specific users\ntw thread create <channel-ref> \"Title\" \"content\" --dry-run # Preview without posting\ntw thread reply <ref> \"content\" # Post a comment (notifies EVERYONE_IN_THREAD by default)\ntw thread reply <ref> \"content\" --notify EVERYONE # Notify all workspace members\ntw thread reply <ref> \"content\" --notify 123,id:456 # Notify specific user IDs\ntw thread reply <ref> \"content\" --json # Post and return comment as JSON\ntw thread reply <ref> \"content\" --json --full # Include all comment fields\ntw thread reply <ref> \"content\" --close # Reply and close the thread\ntw thread reply <ref> \"content\" --reopen # Reply and reopen a closed thread\ntw thread done <ref> # Archive thread (mark done)\ntw thread done <ref> --json # Archive and return status as JSON\ntw thread mute <ref> # Mute thread for 60 minutes (default)\ntw thread mute <ref> --minutes 480 # Mute for custom duration\ntw thread mute <ref> --json # Mute and return { id, mutedUntil } as JSON\ntw thread mute <ref> --json --full # Mute and return full thread as JSON\ntw thread unmute <ref> # Unmute a muted thread\ntw thread unmute <ref> --json # Unmute and return { id, mutedUntil } as JSON\n```\n\nDefault `--notify` for reply is EVERYONE_IN_THREAD, which may notify more people than intended. Before posting, confirm with the user whether specific people should be notified instead (via `--notify <user-ids>`). Options: EVERYONE, EVERYONE_IN_THREAD, or comma-separated user ID refs.\n\n## Thread Comments\n\n```bash\ntw comment <comment-ref> # View a comment (shorthand for view)\ntw comment view <comment-ref> # View a single thread comment\ntw comment view <comment-ref> --raw # Show raw markdown\ntw comment view <comment-ref> --json # Output as JSON\ntw comment view <comment-ref> --json --full # Include all fields in JSON output\ntw comment update <comment-ref> \"new content\" # Update a thread comment\ntw comment update <comment-ref> \"content\" --json # Update and return updated comment as JSON\ntw comment update <comment-ref> \"content\" --json --full # Include all comment fields\ntw comment delete <comment-ref> # Delete a thread comment\ntw comment delete <comment-ref> --json # Delete and return status as JSON\n```\n\n## Conversations (DMs/Groups)\n\n```bash\ntw conversation unread # List unread conversations\ntw conversation <conversation-ref> # View conversation (shorthand for view)\ntw conversation view <conversation-ref> # View conversation messages\ntw conversation with <user-ref> # Find your 1:1 DM with a user\ntw conversation with <user-ref> --snippet # Include the latest message preview\ntw conversation with <user-ref> --include-groups # List any conversations with that user\ntw conversation reply <ref> \"content\" # Send a message\ntw conversation reply <ref> \"content\" --json # Send and return message as JSON\ntw conversation reply <ref> \"content\" --json --full # Include all message fields\ntw conversation done <ref> # Archive conversation\ntw conversation done <ref> --json # Archive and return status as JSON\ntw conversation mute <ref> # Mute conversation for 60 minutes (default)\ntw conversation mute <ref> --minutes 480 # Mute for custom duration\ntw conversation mute <ref> --json # Mute and return { id, mutedUntil } as JSON\ntw conversation mute <ref> --json --full # Mute and return full conversation as JSON\ntw conversation unmute <ref> # Unmute a muted conversation\ntw conversation unmute <ref> --json # Unmute and return { id, mutedUntil } as JSON\n```\n\nAlias: `tw convo` works the same as `tw conversation`.\n\n## Conversation Messages\n\n```bash\ntw msg <message-ref> # View a message (shorthand for view)\ntw msg view <message-ref> # View a single conversation message\ntw msg update <ref> \"content\" # Edit a conversation message\ntw msg update <ref> \"content\" --json # Edit and return updated message as JSON\ntw msg update <ref> \"content\" --json --full # Include all message fields\ntw msg delete <ref> # Delete a conversation message\ntw msg delete <ref> --json # Delete and return status as JSON\n```\n\nAlias: `tw message` works the same as `tw msg`.\n\n## Search\n\n```bash\ntw search \"query\" # Search content\ntw search \"query\" --type threads # Filter: threads, messages, or all\ntw search \"query\" --author <ref> # Filter by author\ntw search \"query\" --to <ref> # Messages sent to user\ntw search \"query\" --title-only # Search thread titles only\ntw search \"query\" --mention-me # Results mentioning current user\ntw search \"query\" --conversation <refs> # Limit to conversations (comma-separated refs)\ntw search \"query\" --since <date> # Content from date\ntw search \"query\" --until <date> # Content until date\ntw search \"query\" --channel <refs> # Filter by channel refs (comma-separated)\ntw search \"query\" --limit <n> # Max results (default: 50)\ntw search \"query\" --cursor <cur> # Pagination cursor\n```\n\n## Users & Channels\n\n```bash\ntw user # Show current user info\ntw users # List workspace users\ntw users --search <text> # Filter by name/email\ntw channels # List workspace channels\n```\n\n## Away Status\n\n```bash\ntw away # Show current away status\ntw away set <type> [until] # Set away (type: vacation, parental, sickleave, other)\ntw away set vacation 2026-03-20 # Away until March 20\ntw away set vacation 2026-03-20 --from 2026-03-15 # Custom start date\ntw away clear # Clear away status\n```\n\n## Reactions\n\n```bash\ntw react thread <ref> \uD83D\uDC4D # Add reaction to thread\ntw react comment <ref> +1 # Add reaction (shortcode)\ntw react message <ref> heart # Add reaction to DM message\ntw unreact thread <ref> \uD83D\uDC4D # Remove reaction\n```\n\nSupported shortcodes: +1, -1, heart, tada, smile, laughing, thinking, fire, check, x, eyes, pray, clap, rocket, wave\n\n## Shell Completions\n\n```bash\ntw completion install # Install tab completions (prompts for shell)\ntw completion install bash # Install for specific shell\ntw completion install zsh\ntw completion install fish\ntw completion uninstall # Remove completions\n```\n\n### Update\n\n```bash\ntw update # Update CLI to latest version\ntw update --check # Check for updates without installing, show channel\ntw update channel # Show current update channel\ntw update switch --stable # Switch to stable release channel\ntw update switch --pre-release # Switch to pre-release (next) channel\n```\n\n### Changelog\n```bash\ntw changelog # Show last 5 versions\ntw changelog -n 3 # Show last 3 versions\ntw changelog --count 10 # Show last 10 versions\n```\n\n## Global Options\n\n```bash\n--no-spinner # Disable loading animations\n--progress-jsonl # Machine-readable progress events (JSONL to stderr)\n--accessible # Add text labels to color-coded output (also: TW_ACCESSIBLE=1)\n```\n\n## Output Formats\n\nAll list/view commands support:\n\n```bash\n--json # Output as JSON\n--ndjson # Output as newline-delimited JSON (for streaming)\n--full # Include all fields (default shows essential fields only)\n```\n\n## Reference System\n\nCommands accept flexible references:\n- **Numeric IDs**: `123` or `id:123`\n- **Twist URLs**: Full `https://twist.com/...` URLs (parsed automatically)\n- **Fuzzy names**: For workspaces/users - `\"My Workspace\"` or partial matches\n\n## Piping Content\n\nCommands that accept content (`thread create`, `thread reply`, `comment update`, `conversation reply`, `msg update`) auto-detect piped stdin:\n\n```bash\ncat notes.md | tw thread reply <ref>\ntw thread create <channel-ref> \"Title\" < body.md\necho \"Quick reply\" | tw conversation reply <ref>\n```\n\nIf no content argument is provided and no stdin is piped, the CLI opens `$EDITOR` for interactive input.\n\n## Common Workflows\n\n**View by URL (auto-routes to the right command):**\n```bash\ntw view https://twist.com/a/1585/ch/100/t/200 # View thread\ntw view https://twist.com/a/1585/ch/100/t/200/c/300 # View comment\ntw view https://twist.com/a/1585/msg/400 # View conversation\ntw view https://twist.com/a/1585/msg/400/m/500 --json # View message as JSON\n```\n\n**Check inbox and respond:**\n```bash\ntw inbox --unread --json\ntw thread view <id> --unread\ntw thread reply <id> \"Thanks, I'll look into this.\"\ntw thread done <id>\n```\n\n**Search and review:**\n```bash\ntw search \"deployment\" --type threads --json\ntw thread view <thread-id>\n```\n\n**Check DMs:**\n```bash\ntw conversation unread --json\ntw conversation view <conversation-id>\ntw conversation with \"Alice Example\"\ntw conversation reply <id> \"Got it, thanks!\"\n```\n";
|
|
4
4
|
export declare const SKILL_FILE_CONTENT: string;
|
|
5
5
|
//# sourceMappingURL=content.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,cAAc,CAAA;AAErC,eAAO,MAAM,iBAAiB,+CAA+C,CAAA;AAE7E,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,cAAc,CAAA;AAErC,eAAO,MAAM,iBAAiB,+CAA+C,CAAA;AAE7E,eAAO,MAAM,aAAa,stYAuRzB,CAAA;AAED,eAAO,MAAM,kBAAkB,QAKd,CAAA"}
|
|
@@ -198,7 +198,10 @@ tw completion uninstall # Remove completions
|
|
|
198
198
|
|
|
199
199
|
\`\`\`bash
|
|
200
200
|
tw update # Update CLI to latest version
|
|
201
|
-
tw update --check # Check for updates without installing
|
|
201
|
+
tw update --check # Check for updates without installing, show channel
|
|
202
|
+
tw update channel # Show current update channel
|
|
203
|
+
tw update switch --stable # Switch to stable release channel
|
|
204
|
+
tw update switch --pre-release # Switch to pre-release (next) channel
|
|
202
205
|
\`\`\`
|
|
203
206
|
|
|
204
207
|
### Changelog
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAA;AAErC,MAAM,CAAC,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAE7E,MAAM,CAAC,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/lib/skills/content.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAA;AAErC,MAAM,CAAC,MAAM,iBAAiB,GAAG,4CAA4C,CAAA;AAE7E,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuR5B,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;QAC1B,UAAU;eACH,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;;;EAG9C,aAAa,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@doist/twist-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.22.0",
|
|
4
4
|
"description": "TypeScript CLI for Twist",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,10 +12,8 @@
|
|
|
12
12
|
"dev": "tsc -p tsconfig.build.json --watch",
|
|
13
13
|
"start": "node dist/index.js",
|
|
14
14
|
"type-check": "tsc --noEmit",
|
|
15
|
-
"lint": "
|
|
16
|
-
"lint:check": "
|
|
17
|
-
"format": "biome format --write . && prettier --write '**/*.{md,yml,yaml,css}'",
|
|
18
|
-
"format:check": "biome check --formatter-enabled=true . && prettier --check '**/*.{md,yml,yaml,css}'",
|
|
15
|
+
"lint": "oxlint . --fix && oxfmt",
|
|
16
|
+
"lint:check": "oxlint . && oxfmt --check",
|
|
19
17
|
"postinstall": "node scripts/postinstall.js",
|
|
20
18
|
"check:skill-sync": "node scripts/check-skill-sync.js",
|
|
21
19
|
"sync:skill": "npm run build && node scripts/sync-skill.js",
|
|
@@ -32,7 +30,7 @@
|
|
|
32
30
|
"author": "Ernesto García <ernesto@ernesto.dev>",
|
|
33
31
|
"license": "MIT",
|
|
34
32
|
"engines": {
|
|
35
|
-
"node": ">=
|
|
33
|
+
"node": "^20.19.0 || >=22.12.0"
|
|
36
34
|
},
|
|
37
35
|
"repository": {
|
|
38
36
|
"type": "git",
|
|
@@ -62,14 +60,14 @@
|
|
|
62
60
|
"yocto-spinner": "1.1.0"
|
|
63
61
|
},
|
|
64
62
|
"devDependencies": {
|
|
65
|
-
"
|
|
63
|
+
"oxfmt": "0.42.0",
|
|
64
|
+
"oxlint": "1.57.0",
|
|
66
65
|
"@semantic-release/changelog": "6.0.3",
|
|
67
66
|
"@semantic-release/exec": "7.1.0",
|
|
68
67
|
"@semantic-release/git": "10.0.1",
|
|
69
68
|
"@types/node": "25.5.0",
|
|
70
69
|
"conventional-changelog-conventionalcommits": "9.3.0",
|
|
71
70
|
"lefthook": "2.1.4",
|
|
72
|
-
"prettier": "3.8.1",
|
|
73
71
|
"semantic-release": "25.0.3",
|
|
74
72
|
"typescript": "6.0.2",
|
|
75
73
|
"vitest": "4.1.2"
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Command } from 'commander';
|
|
2
|
-
export declare function fetchLatestVersion(): Promise<string>;
|
|
3
|
-
export declare function detectPackageManager(): string;
|
|
4
|
-
export declare function runInstall(pm: string): Promise<{
|
|
5
|
-
exitCode: number;
|
|
6
|
-
stderr: string;
|
|
7
|
-
}>;
|
|
8
|
-
interface UpdateOptions {
|
|
9
|
-
check?: boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare function updateAction(options: UpdateOptions): Promise<void>;
|
|
12
|
-
export declare function registerUpdateCommand(program: Command): void;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=update.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOxC,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAO1D;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAepF;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DxE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAM5D"}
|
package/dist/commands/update.js
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import pkg from '../../package.json' with { type: 'json' };
|
|
4
|
-
import { withSpinner } from '../lib/spinner.js';
|
|
5
|
-
const PACKAGE_NAME = '@doist/twist-cli';
|
|
6
|
-
const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
7
|
-
export async function fetchLatestVersion() {
|
|
8
|
-
const response = await fetch(REGISTRY_URL);
|
|
9
|
-
if (!response.ok) {
|
|
10
|
-
throw new Error(`Registry returned ${response.status}`);
|
|
11
|
-
}
|
|
12
|
-
const data = (await response.json());
|
|
13
|
-
return data.version;
|
|
14
|
-
}
|
|
15
|
-
export function detectPackageManager() {
|
|
16
|
-
const execPath = process.env.npm_execpath ?? '';
|
|
17
|
-
if (execPath.includes('pnpm')) {
|
|
18
|
-
return 'pnpm';
|
|
19
|
-
}
|
|
20
|
-
return 'npm';
|
|
21
|
-
}
|
|
22
|
-
export function runInstall(pm) {
|
|
23
|
-
const command = pm === 'pnpm' ? 'add' : 'install';
|
|
24
|
-
return new Promise((resolve, reject) => {
|
|
25
|
-
const child = spawn(pm, [command, '-g', `${PACKAGE_NAME}@latest`], {
|
|
26
|
-
stdio: 'pipe',
|
|
27
|
-
});
|
|
28
|
-
let stderr = '';
|
|
29
|
-
child.stderr?.on('data', (data) => {
|
|
30
|
-
stderr += data.toString();
|
|
31
|
-
});
|
|
32
|
-
child.on('error', reject);
|
|
33
|
-
child.on('close', (code) => resolve({ exitCode: code ?? 1, stderr }));
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
export async function updateAction(options) {
|
|
37
|
-
const currentVersion = pkg.version;
|
|
38
|
-
let latestVersion;
|
|
39
|
-
try {
|
|
40
|
-
latestVersion = await withSpinner({ text: 'Checking for updates...' }, fetchLatestVersion);
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
44
|
-
console.error(chalk.red('Failed to check for updates:'), message);
|
|
45
|
-
process.exitCode = 1;
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (currentVersion === latestVersion) {
|
|
49
|
-
console.log(chalk.green('✓'), `Already up to date (v${currentVersion})`);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
console.log(`Update available: ${chalk.dim(`v${currentVersion}`)} → ${chalk.green(`v${latestVersion}`)}`);
|
|
53
|
-
if (options.check) {
|
|
54
|
-
console.log(chalk.dim('Run `tw update` to install'));
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const pm = detectPackageManager();
|
|
58
|
-
let result;
|
|
59
|
-
try {
|
|
60
|
-
result = await withSpinner({ text: `Updating to v${latestVersion}...`, color: 'blue' }, () => runInstall(pm));
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
if (error instanceof Error && 'code' in error && error.code === 'EACCES') {
|
|
64
|
-
console.error(chalk.red('Permission denied.'), `Try running with sudo: sudo ${pm} ${pm === 'pnpm' ? 'add' : 'install'} -g ${PACKAGE_NAME}@latest`);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
68
|
-
console.error(chalk.red('Update failed:'), message);
|
|
69
|
-
}
|
|
70
|
-
process.exitCode = 1;
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
if (result.exitCode !== 0) {
|
|
74
|
-
console.error(chalk.red('Update failed:'), `${pm} exited with code ${result.exitCode}`);
|
|
75
|
-
if (result.stderr) {
|
|
76
|
-
console.error(chalk.dim(result.stderr.trim()));
|
|
77
|
-
}
|
|
78
|
-
process.exitCode = 1;
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
console.log(chalk.green('✓'), `Updated to v${latestVersion}`);
|
|
82
|
-
console.log(chalk.dim(' Run'), chalk.cyan('tw changelog'), chalk.dim('to see what changed'));
|
|
83
|
-
}
|
|
84
|
-
export function registerUpdateCommand(program) {
|
|
85
|
-
program
|
|
86
|
-
.command('update')
|
|
87
|
-
.description('Update the CLI to the latest version')
|
|
88
|
-
.option('--check', 'Check for updates without installing')
|
|
89
|
-
.action(updateAction);
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=update.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,YAAY,GAAG,kBAAkB,CAAA;AACvC,MAAM,YAAY,GAAG,8BAA8B,YAAY,SAAS,CAAA;AAExE,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAA;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAA;IAC3D,OAAO,IAAI,CAAC,OAAO,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;IAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAA;IACjB,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACjC,MAAM,OAAO,GAAG,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,SAAS,CAAC,EAAE;YAC/D,KAAK,EAAE,MAAM;SAChB,CAAC,CAAA;QAEF,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACzB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACN,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAsB;IACrD,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAA;IAElC,IAAI,aAAqB,CAAA;IACzB,IAAI,CAAC;QACD,aAAa,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,kBAAkB,CAAC,CAAA;IAC9F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;QACxE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,OAAO,CAAC,CAAA;QACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,wBAAwB,cAAc,GAAG,CAAC,CAAA;QACxE,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CACP,qBAAqB,KAAK,CAAC,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,CAC/F,CAAA;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAA;QACpD,OAAM;IACV,CAAC;IAED,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAA;IAEjC,IAAI,MAA4C,CAAA;IAChD,IAAI,CAAC;QACD,MAAM,GAAG,MAAM,WAAW,CACtB,EAAE,IAAI,EAAE,gBAAgB,aAAa,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAC3D,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CACvB,CAAA;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvE,OAAO,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAC/B,+BAA+B,EAAE,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,OAAO,YAAY,SAAS,CACrG,CAAA;QACL,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;YACxE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QACvF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAClD,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAe,aAAa,EAAE,CAAC,CAAA;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAA;AACjG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,OAAO;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;SACzD,MAAM,CAAC,YAAY,CAAC,CAAA;AAC7B,CAAC"}
|