Repository navigation
Expand file tree
/
Copy pathtool.json
More file actions
320 lines (320 loc) · 12.3 KB
/
Copy pathtool.json
File metadata and controls
320 lines (320 loc) · 12.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
{
"schemaVersion": 1,
"name": "tui-update",
"binary": "tui-update",
"tagline": "Pending package updates, what they restart, and a snapshot first",
"description": "A terminal UI for the updates waiting on your machine. It reads them from whichever package manager the machine runs — `pacman`, `apt` or `dnf` — and shows what a list of versions never tells you: what applying them will cost.\n\nEvery pending update is on one screen, with its current and new version, its repository, its size and its security flag where the manager publishes one, and the kernel and firmware sorted to the top.\n\n`enter` gives you the plan: the manager's own dry run, the restart classification — nothing, the services holding replaced code open, or a reboot with the reason — whether a `snapper` snapshot can be taken first, and the whole sequence in order.\n\n`U` applies it behind a confirm dialog carrying that sequence, streaming the output as it goes. It never reboots by itself: when the upgrade needs one it offers `R`, confirmed too.\n\nOn the plan, `m` cycles the upgrades the manager really has, security-only on dnf included, and `s` turns the snapshot pair off and on. On the list, `H` holds a package at its version, or lifts the hold.\n\nRun `tui-update --demo` to drive a sample machine: every key works, every command is previewed for real, and nothing touches your system.",
"category": "packages",
"homepage": "https://github.com/tui-tools/tui-update",
"repo": "https://github.com/tui-tools/tui-update",
"license": "MIT",
"platforms": [
"linux/amd64",
"linux/arm64"
],
"icon": "assets/icon.svg",
"logo": "assets/logo.png",
"screenshots": [
{
"path": "docs/screenshots/tui-update-main.png",
"caption": "The pending list: current to new, repository, size and the security flag, kernel and firmware first"
},
{
"path": "docs/screenshots/tui-update-plan.png",
"caption": "The plan: restart classification, the snapshot that would be taken, and the whole command sequence"
},
{
"path": "docs/screenshots/tui-update-confirm.png",
"caption": "The confirm dialog, carrying every command of the sequence before the first one runs"
},
{
"path": "docs/screenshots/tui-update-confirm-apt.png",
"caption": "An apt upgrade that asks nothing: the environment and the dpkg options that keep a locally changed config file, shown and explained"
},
{
"path": "docs/screenshots/tui-update-confirm-omarchy.png",
"caption": "Omarchy Server's updater, handed the terminal after the confirm, with the screen restored when it exits"
},
{
"path": "docs/screenshots/tui-update-apply.png",
"caption": "The reboot the upgrade asked for: offered afterwards, never taken by the tool itself"
},
{
"path": "docs/screenshots/tui-update-timers.png",
"caption": "The unattended-update timers, and what enabling one means"
},
{
"path": "docs/screenshots/tui-update-help.png",
"caption": "The help screen, generated from the same key table as the hint bar"
}
],
"keys": [
{
"key": "enter / p",
"action": "Plan: what applying the updates would do"
},
{
"key": "U",
"action": "Apply the plan, after confirming the whole sequence"
},
{
"key": "m",
"action": "On the plan: cycle upgrade, dist-upgrade (apt) and security-only (dnf)"
},
{
"key": "s",
"action": "On the plan: take the pre/post snapper snapshot, or do not"
},
{
"key": "h",
"action": "The package manager's own transaction history"
},
{
"key": "H",
"action": "Hold the selected package at its version, or lift the hold"
},
{
"key": "t",
"action": "The unattended-update timers, with enable and disable"
},
{
"key": "e / d",
"action": "On the timers screen: enable or disable the unit"
},
{
"key": "R",
"action": "Re-read; on a finished upgrade, offer the reboot"
},
{
"key": "/",
"action": "Filter the packages across every column"
},
{
"key": "?",
"action": "Help"
},
{
"key": "q",
"action": "Quit"
}
],
"backends": [
{
"name": "pacman",
"binary": "pacman",
"versionCommand": [
"pacman",
"--version"
],
"versionRegex": "Pacman v([0-9][0-9.]*)",
"minimum": "6.0",
"searchPaths": [
"/usr/bin/pacman",
"/bin/pacman"
],
"notes": [
{
"range": ">=6.0",
"impact": "pacman publishes no security metadata, so no update is ever marked as a security fix here; the column reads `n/a` rather than `no`"
},
{
"range": ">=6.0",
"impact": "there is no dry run that does not first synchronise the databases, which needs root, so the plan quotes the pending list instead of a simulated transaction"
},
{
"range": ">=6.0",
"impact": "`checkupdates` needs pacman-contrib *and* fakeroot, since it builds its private copy of the sync database under it; without either the pending list falls back to `pacman -Qu`, which is whatever the last `pacman -Sy` left on disk, and the screen says so"
},
{
"range": ">=6.0",
"impact": "on Omarchy Server the upgrade runs through `omarchy-server-update run --no-reboot`, and `omarchy-server-update-restart --dry-run` is what classifies the restarts; on plain Arch there is no classifier and the package names decide"
}
],
"tested": [
"7.1.0"
]
},
{
"name": "apt",
"binary": "apt",
"versionCommand": [
"apt",
"--version"
],
"versionRegex": "apt ([0-9][0-9.]*)",
"minimum": "2.0",
"searchPaths": [
"/usr/bin/apt",
"/bin/apt"
],
"features": [
{
"name": "solver3",
"since": "2.9.3"
}
],
"notes": [
{
"range": ">=2.0",
"impact": "a security update is one whose pocket ends in `-security`; apt publishes no advisory id, so that pocket name is the whole reference"
},
{
"range": ">=2.0",
"impact": "neither `apt list --upgradable` nor `apt-get -s upgrade` reports a per-package size, so the size column is not shown; the plan carries apt's own download and disk totals instead"
},
{
"range": ">=2.0",
"impact": "the services to restart come from `needrestart -b`, which reads other processes' memory maps and therefore needs root; without it the package names decide"
},
{
"range": ">=2.0",
"impact": "there is no upgrade that applies only the security updates; `unattended-upgrade` honours Unattended-Upgrade::Allowed-Origins, which on Debian includes the plain archive too and can reboot on its own, so the security-only mode is not offered here"
},
{
"range": ">=2.0",
"impact": "a package is held with `apt-mark hold`, the dpkg selection every apt front end honours; `apt-mark showhold` is the unprivileged read the pending list marks its rows from"
}
],
"tested": [
"2.8.3"
]
},
{
"name": "dnf",
"binary": "dnf",
"versionCommand": [
"dnf",
"--version"
],
"versionRegex": "([0-9]+\\.[0-9]+(?:\\.[0-9]+)?)",
"minimum": "4.0",
"searchPaths": [
"/usr/bin/dnf",
"/bin/dnf"
],
"features": [
{
"name": "dnf5",
"since": "5.0"
}
],
"notes": [
{
"range": ">=5.0",
"impact": "`dnf --version` prints `dnf5 version 5.2.18.0`, where dnf4 prints a bare `4.24.0` on its first line; both are read by the same pattern, which keeps three components because a four-part version is not one the family schema records"
},
{
"range": ">=5.0",
"impact": "`dnf needs-restarting` refreshes the repository metadata before answering, which a read path must not do, so the standalone `needs-restarting` binary from dnf-plugins-core is used instead and its absence falls back to the package names"
},
{
"range": ">=4.0",
"impact": "`dnf check-update` exits 100 when there are updates, so its exit code is interpreted rather than treated as a failure; it also prints only the new version, and the installed one is read from rpm"
},
{
"range": ">=4.0",
"impact": "`dnf upgrade --security` narrows the same transaction to the advisories, so the security-only mode is the plain upgrade with one flag rather than a second code path; dependencies with no advisory of their own still come along"
},
{
"range": ">=4.0",
"impact": "holding a package needs the versionlock plugin, which a minimal install does not carry; it is detected before the key is offered, and the refusal names python3-dnf-plugin-versionlock, or dnf-plugins-extras-versionlock on RHEL and its rebuilds"
}
],
"tested": [
"5.2.18",
"5.4.1"
]
}
],
"install": {
"repo_url": "https://pkgs.tui.tools",
"pacman": {
"available": true,
"package": "tui-update",
"repo": "tui-tools",
"requires_repo_setup": true,
"command": "sudo pacman -S tui-update",
"url": "https://pkgs.tui.tools/arch",
"note": "Upgrades then arrive with the rest of your system updates."
},
"aur": {
"available": false,
"package": "tui-update-bin",
"repo": "aur",
"command": "paru -S tui-update-bin",
"url": "https://aur.archlinux.org/packages/tui-update-bin",
"note": "The -bin package installs the released static binary."
},
"apt": {
"available": true,
"package": "tui-update",
"repo": "tui-tools",
"requires_repo_setup": true,
"command": "sudo apt install tui-update",
"url": "https://pkgs.tui.tools/deb",
"note": "Upgrades then arrive with the rest of your system updates."
},
"dnf": {
"available": true,
"package": "tui-update",
"repo": "tui-tools",
"requires_repo_setup": true,
"command": "sudo dnf install tui-update",
"url": "https://pkgs.tui.tools/rpm",
"note": "Upgrades then arrive with the rest of your system updates."
},
"zypper": {
"available": false,
"package": "tui-update",
"repo": "tui-tools",
"requires_repo_setup": true,
"command": "sudo zypper install tui-update",
"url": "https://pkgs.tui.tools/rpm",
"note": "The rpm repository is shared with dnf; zypper support is not tested yet."
},
"binary": {
"available": true,
"pattern": "tui-update_{version}_linux_{arch}.tar.gz",
"command": "curl -fsSL https://github.com/tui-tools/tui-update/releases/download/v{version}/tui-update_{version}_linux_{arch}.tar.gz | tar -xz tui-update\nsudo install -m0755 tui-update /usr/local/bin/tui-update",
"url": "https://github.com/tui-tools/tui-update/releases",
"note": "One static binary. Verify it against checksums.txt from the same release."
},
"source": {
"available": true,
"command": "git clone https://github.com/tui-tools/tui-update\ncd tui-update && make build\nsudo install -m0755 bin/tui-update /usr/local/bin/tui-update",
"url": "https://github.com/tui-tools/tui-update",
"note": "Needs Go 1.27 or newer."
}
},
"security": {
"needs_sudo": "Reads are unprivileged and never refresh the manager's metadata: `checkupdates`, `apt list --upgradable`, `dnf check-update` and `rpm -q` all answer to any user from what is on disk. Escalation is `sudo -n`, which never prompts, and covers the restart classifiers plus every change.",
"preview_before_run": true,
"no_daemon": true,
"no_network": true,
"static_binary": true,
"signed_releases": true,
"config_paths": [
"/etc/tui-update/config.toml",
"~/.config/tui-update/config.toml"
]
},
"maintainers": [
{
"name": "Edimar Cardoso",
"github": "edimarlnx"
}
],
"since": "2026-08-29",
"keywords": [
"updates",
"packages",
"pacman",
"apt",
"dnf",
"snapper",
"needrestart",
"reboot",
"tui",
"bubbletea"
]
}