Skip to content

Commit f583db4

Browse files
GabrielDufclaude
andcommitted
Merge origin/main into feature/download-verification
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2 parents 59bd043 + 24a76d0 commit f583db4

132 files changed

Lines changed: 4986 additions & 668 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎AGENTS.md‎

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,27 @@ place under the same version keeps showing the icon it had until a restart.
7676
|---|---|
7777
| `SearchQueryService` (3.5.0 → 3.0.0-beta → unversioned) | package search |
7878
| `PackageBaseAddress/3.0.0` | version enumeration, update detection, `.nupkg` and embedded-icon URLs |
79-
| `RegistrationsBaseUrl` (3.6.0 → 3.4.0 → 3.0.0-rc → 3.0.0-beta → unversioned) | package metadata, listed/unlisted checks |
79+
| `RegistrationsBaseUrl` (3.6.0 → 3.4.0 → 3.0.0-rc → 3.0.0-beta → unversioned) | package metadata, listed/unlisted checks; versions, `.nupkg` URLs and metadata when there is no `PackageBaseAddress` |
8080

8181
A feed needs `PackageBaseAddress` or `RegistrationsBaseUrl` to be usable. If it advertises no
8282
`SearchQueryService` — or its search returns nothing — search degrades to an exact
8383
package-id lookup against the flat container. Flat-container version lists include unlisted
8484
versions, so an update candidate is confirmed against its registration leaf before being
85-
surfaced.
85+
surfaced. A version index answering 404 means the package is not on that feed, not a failed
86+
check, since .NET Tool asks every configured feed about every installed tool.
87+
88+
A registration-only feed (JFrog Artifactory serves no flat container) is read through its
89+
registration index instead: versions come from its pages, fetching only the pages above the
90+
installed version during an update check; the `.nupkg` URL comes from the registration leaf;
91+
and metadata comes from the version's page entry when the leaf carries no `catalogEntry`.
92+
None of this runs for a feed that has a flat container.
93+
94+
On V2, Artifactory answers `GetUpdates()` with nothing unless `includeAllVersions` is true, and
95+
then truncates the list at 100 without a next link. So when every `GetUpdates()` batch of a
96+
source comes back empty, one `includeAllVersions=true` request tells "nothing is newer" (still
97+
empty: stop there) from "this server ignores the request", in which case each installed package
98+
is looked up with `FindPackagesById()?$filter=IsLatestVersion` (`IsAbsoluteLatestVersion` with
99+
pre-releases). V2 version lists follow `next` links, up to 50 pages.
86100

87101
### Fallback behaviour
88102

@@ -92,9 +106,24 @@ retried against a fabricated V2 endpoint. V2-only feeds never enter the V3 path
92106

93107
### Which feed is which
94108

95-
- **.NET Tool** — `https://api.nuget.org/v3/index.json`. Safe to repoint because the manager
96-
does not support custom sources and never passes the source URL to the `dotnet` CLI. Also
97-
filters search on `packageType=DotnetTool`.
109+
- **.NET Tool** — the enabled sources of the user's NuGet configuration, read (not edited) by
110+
`DotNetSourceHelper` from `dotnet nuget list source --format Detailed` run in the user profile
111+
with `DOTNET_CLI_UI_LANGUAGE=en`, so `disabledPackageSources` and the whole config hierarchy
112+
apply as they do for `dotnet tool install`. Output it cannot read, or a failed command, falls
113+
back to nuget.org. The files from `dotnet nuget config paths` supply `packageSourceMapping`
114+
(an installed package is never sent to a feed the mapping does not allow for its id) and basic
115+
`packageSourceCredentials` (clear text, or DPAPI-encrypted with the `NuGet` entropy on
116+
Windows; a closer file's entry wins even when it cannot be used, such as one restricted to
117+
`negotiate`). `NuGetFeedCredentials` keys each credential by its feed, since feeds sharing a
118+
server (Azure Artifacts) carry different ones, and sends it only on requests made for that
119+
feed and only to that feed's own server; every request site passes the feed it belongs to.
120+
The snapshot is kept until a config file's write time changes, or for ten minutes. Updates are
121+
checked on every enabled feed and the newest wins; the feed at nuget.org's URL is always
122+
`DefaultSource`, whatever its key. `dotnet tool list` names no feed, so installed tools sit
123+
under nuget.org when it is enabled, else the first feed, and `InstalledPackagesKeepTheirSource`
124+
is false so loaders match them to updates and search results from any feed by id. Search
125+
filters on `packageType=DotnetTool` on V3 feeds and local folders; V2 feeds have no such
126+
filter and may list libraries. Icons and installer downloads do not carry credentials.
98127
- **PowerShell / PowerShell 7** — sources are enumerated from `Get-PSRepository` (or
99128
`Get-PSResourceRepository` on PowerShell 7), so the URL is CLI-owned identity
100129
(`PowerShellSourceHelper` compares it literally to choose `Register-PSRepository -Default`)

‎docs/CLI.md‎

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,17 +201,48 @@ symbolic links and junctions are not followed.
201201

202202
| Command | Required options | Optional options | Notes |
203203
| --- | --- | --- | --- |
204-
| `manager list` | None | None | Lists managers and their automation-relevant capability flags. |
205-
| `manager maintenance` | `--manager <id>` | None | Returns maintenance metadata for one manager. |
204+
| `manager list` | None | None | Lists managers, their automation-relevant capability flags and their listing health (see below). |
205+
| `manager maintenance` | `--manager <id>` | None | Returns maintenance metadata for one manager, including the actions it supports in `supportedActions` and its listing health. |
206206
| `manager reload` | `--manager <id>` | None | Reloads one manager. |
207207
| `manager set-executable` | `--manager <id>`, `--path <path>` | None | Sets a custom executable override, then reloads the manager. |
208208
| `manager clear-executable` | `--manager <id>` | None | Clears the custom executable override, then reloads the manager. |
209-
| `manager action` | `--manager <id>`, `--action <action>` | `--confirm` | Runs a manager-specific maintenance action. |
209+
| `manager action` | `--manager <id>`, `--action <action>` | `--confirm` | Runs one of the actions the manager lists in `supportedActions`. Every action except `reload` requires `--confirm`. |
210210
| `manager enable` | `--manager <id>` | None | Enables the manager. |
211211
| `manager disable` | `--manager <id>` | None | Disables the manager. |
212212
| `manager notifications enable` | `--manager <id>` | None | Enables update notifications for the manager. |
213213
| `manager notifications disable` | `--manager <id>` | None | Disables update notifications for the manager. |
214214

215+
Maintenance actions, as `manager action --action` accepts them:
216+
217+
| Action | Managers | Notes |
218+
| --- | --- | --- |
219+
| `reload` | All | Looks for the manager again and reloads its configuration. |
220+
| `stop-stuck-listings` | All | Kills the processes of any search, package listing or maintenance command the manager is still running. |
221+
| `repair-winget` | WinGet (Windows) | Clears WinGet's temp folder, resets its sources, repairs it through `Microsoft.WinGet.Client` and resets App Installer. Elevated. |
222+
| `reset-sources` | WinGet (Windows) | Runs `winget source reset --force`. Elevated. |
223+
| `install-scoop`, `uninstall-scoop` | Scoop (Windows) | Installs Scoop (elevated), or removes it with every package it installed. |
224+
| `cleanup-scoop` | Scoop (Windows) | Removes old app versions, per user and machine-wide (the machine-wide half is elevated), then empties Scoop's download cache, which both scopes share. |
225+
| `clear-cache` | Chocolatey, Pip, Npm, Bun, .NET Tool, Homebrew | Runs the manager's own cache-cleaning command. |
226+
227+
Actions that need the manager's own executable are only listed once the manager has been found. `repair-winget`, `reset-sources` and `install-scoop` are listed even when it has not. A maintenance command that runs for more than 15 minutes is stopped and reported as failed.
228+
229+
#### Manager health
230+
231+
`manager list` and `manager maintenance` include a `health` object built from a record UniGetUI keeps
232+
for each manager across restarts, in `ManagerHealth.json` in its data folder:
233+
234+
| Field | Meaning |
235+
| --- | --- |
236+
| `state` | `loading` (still starting), `unknown` (nothing listed yet), `healthy`, `failing`, `malfunctioning`, `not-found` or `disabled`. |
237+
| `needsAttention` | `true` when the app shows its health banner: a malfunction, or a listing that failed at least twice in a row with its last failure in the past 24 hours. For WinGet, Apt, Dnf and Pacman a single failed installed listing is enough. |
238+
| `failingListing` | `search`, `installed` or `updates`: the listing that failed most recently, or `installed` for a malfunction. |
239+
| `reason`, `consecutiveFailures` | The failing listing's last error and how many times in a row it failed. |
240+
| `search`, `installed`, `updates` | Per listing: `lastSuccessUtc`, `lastFailureUtc`, `lastFailureReason`, `lastFailureWasTimeout`, `consecutiveFailures`, `lastPackageCount`, `lastFastRepairUtc`, `lastFastRepairReason` (a first attempt that failed and was retried) and `recentDurationsMs` (the last ten). |
241+
242+
A manager is `malfunctioning` when it is ready, its installed listing succeeded and returned no package
243+
at all, and a working installation of it always lists something (WinGet, Apt, Dnf and Pacman). The
244+
`DisableWinGetMalfunctionDetector` setting still turns this off for WinGet.
245+
215246
### Sources
216247

217248
| Command | Required options | Optional options | Notes |

‎docs/IPC.md‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,15 +273,19 @@ the machine must be restarted before the change takes effect. See
273273

274274
| Method | Path | Auth | Parameters/body | CLI equivalent |
275275
| --- | --- | --- | --- | --- |
276-
| `GET` | `/uniget/v1/managers` | Yes | None | `manager list` |
277-
| `GET` | `/uniget/v1/managers/maintenance` | Yes | Query `manager` | `manager maintenance` |
276+
| `GET` | `/uniget/v1/managers` | Yes | None | `manager list`; each manager carries a `health` object |
277+
| `GET` | `/uniget/v1/managers/maintenance` | Yes | Query `manager` | `manager maintenance`; includes `supportedActions` and `health` |
278278
| `POST` | `/uniget/v1/managers/maintenance/reload` | Yes | JSON body: manager maintenance request body | `manager reload` |
279279
| `POST` | `/uniget/v1/managers/maintenance/executable/set` | Yes | JSON body: manager maintenance request body | `manager set-executable` |
280280
| `POST` | `/uniget/v1/managers/maintenance/executable/clear` | Yes | JSON body: manager maintenance request body | `manager clear-executable` |
281281
| `POST` | `/uniget/v1/managers/maintenance/action` | Yes | JSON body: manager maintenance request body | `manager action` |
282282
| `POST` | `/uniget/v1/managers/set-enabled` | Yes | Query `manager`, `enabled` | `manager enable`, `manager disable` |
283283
| `POST` | `/uniget/v1/managers/set-update-notifications` | Yes | Query `manager`, `enabled` | `manager notifications enable`, `manager notifications disable` |
284284

285+
`/managers/maintenance/action` accepts any action the manager lists in `supportedActions`, and refuses
286+
every action but `reload` unless the body sets `confirm` to `true`. The actions and the `health` fields
287+
are described in [docs/CLI.md](CLI.md#manager-health).
288+
285289
### Sources
286290

287291
| Method | Path | Auth | Parameters/body | CLI equivalent |

‎src/Languages/lang_af.json‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,5 +2216,9 @@
22162216
"Make the window wider to show package details here": "Maak die venster wyer om pakketbesonderhede hier te wys",
22172217
"Details panel": "Besonderhede-paneel",
22182218
"Show details panel": "Wys besonderhede-paneel",
2219-
"Hide details panel": "Versteek besonderhede-paneel"
2219+
"Hide details panel": "Versteek besonderhede-paneel",
2220+
"Fit columns to the window": "Pas kolomme by die venster aan",
2221+
"How to set up {0}": "Hoe om {0} op te stel",
2222+
"Install it with this command:": "Installeer dit met hierdie opdrag:",
2223+
"Open in a terminal": "Maak in 'n terminaal oop"
22202224
}

‎src/Languages/lang_ar.json‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,5 +2216,9 @@
22162216
"Make the window wider to show package details here": "وسّع النافذة لعرض تفاصيل الحزمة هنا",
22172217
"Details panel": "لوحة التفاصيل",
22182218
"Show details panel": "إظهار لوحة التفاصيل",
2219-
"Hide details panel": "إخفاء لوحة التفاصيل"
2219+
"Hide details panel": "إخفاء لوحة التفاصيل",
2220+
"Fit columns to the window": "ملاءمة الأعمدة مع النافذة",
2221+
"How to set up {0}": "كيفية إعداد {0}",
2222+
"Install it with this command:": "ثبّته باستخدام هذا الأمر:",
2223+
"Open in a terminal": "فتح في نافذة طرفية"
22202224
}

‎src/Languages/lang_be.json‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,5 +2216,9 @@
22162216
"Make the window wider to show package details here": "Павялічце шырыню акна, каб паказаць тут звесткі пра пакет",
22172217
"Details panel": "Панэль звестак",
22182218
"Show details panel": "Паказваць панэль звестак",
2219-
"Hide details panel": "Схаваць панэль звестак"
2219+
"Hide details panel": "Схаваць панэль звестак",
2220+
"Fit columns to the window": "Падагнаць слупкі пад памер акна",
2221+
"How to set up {0}": "Як наладзіць {0}",
2222+
"Install it with this command:": "Усталюйце яго з дапамогай гэтай каманды:",
2223+
"Open in a terminal": "Адкрыць у тэрмінале"
22202224
}

‎src/Languages/lang_bg.json‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,5 +2216,9 @@
22162216
"Make the window wider to show package details here": "Разширете прозореца, за да покажете подробностите за пакета тук",
22172217
"Details panel": "Панел с подробности",
22182218
"Show details panel": "Показване на панела с подробности",
2219-
"Hide details panel": "Скриване на панела с подробности"
2219+
"Hide details panel": "Скриване на панела с подробности",
2220+
"Fit columns to the window": "Побери колоните в прозореца",
2221+
"How to set up {0}": "Как да настроите {0}",
2222+
"Install it with this command:": "Инсталирайте го със следната команда:",
2223+
"Open in a terminal": "Отваряне в терминал"
22202224
}

‎src/Languages/lang_bn.json‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,5 +2216,9 @@
22162216
"Make the window wider to show package details here": "এখানে প্যাকেজের বিবরণ দেখাতে উইন্ডোটি আরও প্রশস্ত করুন",
22172217
"Details panel": "বিবরণ প্যানেল",
22182218
"Show details panel": "বিবরণ প্যানেল দেখান",
2219-
"Hide details panel": "বিবরণ প্যানেল লুকান"
2219+
"Hide details panel": "বিবরণ প্যানেল লুকান",
2220+
"Fit columns to the window": "উইন্ডোর সঙ্গে কলাম মানানসই করুন",
2221+
"How to set up {0}": "{0} কীভাবে সেট আপ করবেন",
2222+
"Install it with this command:": "এই কমান্ডটি দিয়ে এটি ইনস্টল করুন:",
2223+
"Open in a terminal": "টার্মিনালে খুলুন"
22202224
}

‎src/Languages/lang_ca.json‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,5 +2216,9 @@
22162216
"Make the window wider to show package details here": "Amplieu la finestra per mostrar aquí els detalls del paquet",
22172217
"Details panel": "Panell de detalls",
22182218
"Show details panel": "Mostra el panell de detalls",
2219-
"Hide details panel": "Amaga el panell de detalls"
2219+
"Hide details panel": "Amaga el panell de detalls",
2220+
"Fit columns to the window": "Ajusta les columnes a la finestra",
2221+
"How to set up {0}": "Com configurar {0}",
2222+
"Install it with this command:": "Instal·la'l amb aquesta ordre:",
2223+
"Open in a terminal": "Obre-ho en un terminal"
22202224
}

‎src/Languages/lang_cs.json‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,5 +2216,9 @@
22162216
"Make the window wider to show package details here": "Zvětšete šířku okna, aby se zde zobrazily podrobnosti o balíčku",
22172217
"Details panel": "Panel podrobností",
22182218
"Show details panel": "Zobrazit panel podrobností",
2219-
"Hide details panel": "Skrýt panel podrobností"
2219+
"Hide details panel": "Skrýt panel podrobností",
2220+
"Fit columns to the window": "Přizpůsobit sloupce šířce okna",
2221+
"How to set up {0}": "Jak nastavit {0}",
2222+
"Install it with this command:": "Nainstalujte pomocí tohoto příkazu:",
2223+
"Open in a terminal": "Otevřít v terminálu"
22202224
}

0 commit comments

Comments
 (0)