Skip to content
Closed
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1265095
feat(wings): add CLI auth and OCI install path
jdx May 7, 2026
10b6d6a
feat(wings): consume mocito install config
jdx May 10, 2026
e97a345
feat(wings): apply mocito install env
jdx May 10, 2026
056f740
fix(wings): recursively merge mocito layers
jdx May 10, 2026
d60ea1e
Update wings login for device auth API
jdx May 10, 2026
978c8fa
Address wings review feedback
jdx May 10, 2026
18aed3e
Gate wings installed env loading
jdx May 10, 2026
e33a195
Use apex wings login URL
jdx May 10, 2026
b4909d3
Canonicalize wings device login URLs
jdx May 10, 2026
3a27c4f
Use app wings login URLs
jdx May 10, 2026
2e58e3e
Address wings review feedback
jdx May 10, 2026
66b3981
Avoid redundant wings enable hint
jdx May 11, 2026
284909f
Add wings rebuild command
jdx May 11, 2026
c5d3665
[autofix.ci] apply automated fixes
autofix-ci[bot] May 11, 2026
2b694f9
Address wings rebuild feedback
jdx May 11, 2026
81d8321
Mark Wings-installed tool env
jdx May 11, 2026
afc5524
[autofix.ci] apply automated fixes
autofix-ci[bot] May 11, 2026
ed0fed0
Refresh Wings token while polling
jdx May 11, 2026
b202eb8
Tighten Wings auth retry paths
jdx May 11, 2026
3554b36
[autofix.ci] apply automated fixes
autofix-ci[bot] May 11, 2026
02a5511
Use resolved ToolVersion for Wings cleanup
jdx May 11, 2026
aabed8e
Handle Wings path env and install replacement
jdx May 11, 2026
bd33d99
Allow Wings raw binary installs without bin metadata
jdx May 11, 2026
1e77c16
Verify Wings evidence referrers during install
jdx May 11, 2026
dc62af5
Verify Wings policy bundles during install
jdx May 11, 2026
18176d0
Address Wings PR feedback
jdx May 11, 2026
6175e4e
Replay locked Wings artifact digests
jdx May 11, 2026
741fb3b
Use referrer artifact type for SBOM inspect
jdx May 11, 2026
c26d53d
Address Wings install feedback
jdx May 11, 2026
f1c0205
Box large Wings rebuild command
jdx May 11, 2026
f8030b5
Address Wings review nits
jdx May 11, 2026
a98e4fd
Harden Wings fallback handling
jdx May 11, 2026
a9bcfdb
Harden Wings policy and referrer validation
jdx May 12, 2026
34fe1ea
Add Wings inventory reporting
jdx May 13, 2026
6cbac57
Harden Wings feedback paths
jdx May 13, 2026
7529a1e
Address Wings PR feedback
jdx May 13, 2026
a313e70
Fix GitHub retry URL classification
jdx May 13, 2026
fcfe1f8
Render Wings inventory docs
jdx May 13, 2026
3b8d6db
Address Wings lockfile feedback
jdx May 13, 2026
ce6c129
Preserve Wings pins for same URL
jdx May 13, 2026
86bf24f
Address Wings install feedback
jdx May 13, 2026
dfacc4f
Allow Wings lock fallback without auth
jdx May 13, 2026
0c3bcb1
Report restored Wings installs as fallback
jdx May 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,19 @@ jobs:
docs:
if: github.repository == 'jdx/mise'
runs-on: namespace-profile-endev-linux-amd64;overrides.cache-tag=mise-pr-rust-linux
# `id-token: write` lets the runner mint the OIDC token mise
# exchanges for a wings session at `POST /auth`. Combined
# with the explicit `MISE_WINGS_ENABLED=1` opt-in below,
# normal tool installs can resolve through the mise-wings
# catalog and OCI registry.
permissions:
contents: read
id-token: write
env:
# Opt in to wings for this workflow. Required for the
# auto-OIDC exchange to fire; without it mise leaves wings
# inactive (no identity data sent to wings).
MISE_WINGS_ENABLED: "1"
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
Expand Down
29 changes: 29 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ demand = "2"
digest = "0.11.0"
dotenvy = "0.15"
duct = "1.0"
ed25519-dalek = "2"
homedir = "0.3"
expr-lang = "1"
eyre = "0.6"
Expand All @@ -117,6 +118,7 @@ clx = "2"
indoc = "2"
itertools = "0.14"
jiff = "0.2"
jsonwebtoken = "9"
junction = "2"
log = "0.4"
minisign-verify = "0.2"
Expand Down
23 changes: 23 additions & 0 deletions docs/.vitepress/cli_commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -409,4 +409,27 @@ export const commands: { [key: string]: Command } = {
which: {
hide: false,
},
wings: {
hide: false,
subcommands: {
inspect: {
hide: false,
},
login: {
hide: false,
},
logout: {
hide: false,
},
rebuild: {
hide: false,
},
status: {
hide: false,
},
whoami: {
hide: false,
},
},
},
Comment thread
cursor[bot] marked this conversation as resolved.
};
11 changes: 11 additions & 0 deletions docs/cli/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,14 @@ Can also use `MISE_NO_HOOKS=1`
- [`mise watch [FLAGS] [TASK] [ARGS]…`](/cli/watch.md)
- [`mise where <TOOL@VERSION>`](/cli/where.md)
- [`mise which [FLAGS] [BIN_NAME]`](/cli/which.md)
- [`mise wings <SUBCOMMAND>`](/cli/wings.md)
- [`mise wings inspect <SUBCOMMAND>`](/cli/wings/inspect.md)
- [`mise wings inspect manifest [--digest <DIGEST>] <REFERENCE>`](/cli/wings/inspect/manifest.md)
- [`mise wings inspect referrers [--digest <DIGEST>] <REFERENCE>`](/cli/wings/inspect/referrers.md)
- [`mise wings inspect sbom [--digest <DIGEST>] <REFERENCE>`](/cli/wings/inspect/sbom.md)
- [`mise wings inventory`](/cli/wings/inventory.md)
- [`mise wings login`](/cli/wings/login.md)
- [`mise wings logout [FLAGS]`](/cli/wings/logout.md)
- [`mise wings rebuild <TOOL@VERSION>`](/cli/wings/rebuild.md)
- [`mise wings status`](/cli/wings/status.md)
- [`mise wings whoami`](/cli/wings/whoami.md)
30 changes: 30 additions & 0 deletions docs/cli/wings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings`

- **Usage**: `mise wings <SUBCOMMAND>`
- **Source code**: [`src/cli/wings/mod.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/mod.rs)

Manage `mise wings` authentication

`mise-wings` is a paid asset cache for tool installs. Run
`mise wings login` once to authenticate; subsequent installs
resolve through the mise-wings catalog and OCI registry when
`wings.enabled` is set. Set `wings = false` on a specific
`[tools]` entry to keep that tool on its normal backend path.

`mise wings inspect` provides read-only OCI debugging commands
for artifact manifests, referrers, and evidence blobs such as
SBOMs.

Bare `mise wings` with no subcommand prints the same status
summary as `mise wings status`.

## Subcommands

- [`mise wings inspect <SUBCOMMAND>`](/cli/wings/inspect.md)
- [`mise wings inventory`](/cli/wings/inventory.md)
- [`mise wings login`](/cli/wings/login.md)
- [`mise wings logout [FLAGS]`](/cli/wings/logout.md)
- [`mise wings rebuild <TOOL@VERSION>`](/cli/wings/rebuild.md)
- [`mise wings status`](/cli/wings/status.md)
- [`mise wings whoami`](/cli/wings/whoami.md)
20 changes: 20 additions & 0 deletions docs/cli/wings/inspect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings inspect`

- **Usage**: `mise wings inspect <SUBCOMMAND>`
- **Source code**: [`src/cli/wings/mod.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/mod.rs)

Inspect Wings OCI artifacts and attached evidence.

Examples:

```sh
$ mise wings inspect manifest registry.mise-wings.en.dev/acme/node:20
{"schemaVersion":2,"mediaType":"application/vnd.oci.image.manifest.v1+json","layers":[{"mediaType":"application/vnd.mise-wings.artifact.v1","digest":"sha256:..."}]}
```

## Subcommands

- [`mise wings inspect manifest [--digest <DIGEST>] <REFERENCE>`](/cli/wings/inspect/manifest.md)
- [`mise wings inspect referrers [--digest <DIGEST>] <REFERENCE>`](/cli/wings/inspect/referrers.md)
- [`mise wings inspect sbom [--digest <DIGEST>] <REFERENCE>`](/cli/wings/inspect/sbom.md)
33 changes: 33 additions & 0 deletions docs/cli/wings/inspect/manifest.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings inspect manifest`

- **Usage**: `mise wings inspect manifest [--digest <DIGEST>] <REFERENCE>`
- **Source code**: [`src/cli/wings/inspect/manifest.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/inspect/manifest.rs)

Print the OCI image manifest for a Wings artifact.

Examples:

```sh
$ mise wings inspect manifest registry.mise-wings.en.dev/acme/node:20
{"schemaVersion":2,"mediaType":"application/vnd.oci.image.manifest.v1+json","layers":[{"mediaType":"application/vnd.mise-wings.artifact.v1","digest":"sha256:..."}]}
```

Fetch and verify a specific manifest digest:

```sh
$ mise wings inspect manifest registry.mise-wings.en.dev/acme/node --digest sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
{"schemaVersion":2,"mediaType":"application/vnd.oci.image.manifest.v1+json"}
```

## Arguments

### `<REFERENCE>`

Wings OCI reference, optionally including @sha256:&lt;digest>

## Flags

### `--digest <DIGEST>`

Manifest digest to fetch when the reference does not include one
26 changes: 26 additions & 0 deletions docs/cli/wings/inspect/referrers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings inspect referrers`

- **Usage**: `mise wings inspect referrers [--digest <DIGEST>] <REFERENCE>`
- **Source code**: [`src/cli/wings/inspect/referrers.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/inspect/referrers.rs)

Print the OCI referrers index for a Wings artifact.

Examples:

```sh
$ mise wings inspect referrers registry.mise-wings.en.dev/acme/node@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
{"schemaVersion":2,"mediaType":"application/vnd.oci.image.index.v1+json","manifests":[{"mediaType":"application/vnd.oci.image.manifest.v1+json","artifactType":"application/spdx+json","digest":"sha256:..."}]}
```

## Arguments

### `<REFERENCE>`

Wings OCI reference, including @sha256:&lt;digest> or paired with --digest

## Flags

### `--digest <DIGEST>`

Subject manifest digest when the reference does not include one
33 changes: 33 additions & 0 deletions docs/cli/wings/inspect/sbom.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings inspect sbom`

- **Usage**: `mise wings inspect sbom [--digest <DIGEST>] <REFERENCE>`
- **Source code**: [`src/cli/wings/inspect/sbom.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/inspect/sbom.rs)

Print the first SPDX or CycloneDX SBOM attached to a Wings artifact.

Examples:

```sh
$ mise wings inspect sbom registry.mise-wings.en.dev/acme/node@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
{"spdxVersion":"SPDX-2.3","name":"node-20.11.1-linux-x64","packages":[]}
```

If no SBOM is attached:

```sh
$ mise wings inspect sbom registry.mise-wings.en.dev/acme/node@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
no SBOM referrer found for sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; Wings may not have published SBOM referrers for this artifact yet
```

## Arguments

### `<REFERENCE>`

Wings OCI reference, including @sha256:&lt;digest> or paired with --digest

## Flags

### `--digest <DIGEST>`

Subject manifest digest when the reference does not include one
12 changes: 12 additions & 0 deletions docs/cli/wings/inventory.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings inventory`

- **Usage**: `mise wings inventory`
- **Source code**: [`src/cli/wings/inventory.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/inventory.rs)

Upload current installed-tool inventory to mise-wings

Reports the current machine's installed tool versions, platform, and
Wings artifact digests when present. The snapshot is scoped to the
authenticated Wings org and intentionally excludes local paths, usernames,
hostnames, environment values, command arguments, and package-manager logs.
23 changes: 23 additions & 0 deletions docs/cli/wings/login.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings login`

- **Usage**: `mise wings login`
- **Source code**: [`src/cli/wings/login.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/login.rs)

Authenticate with mise-wings

By default, starts device-code auth and stores a device-bound
credential.

Examples:

```sh
$ mise wings login
To sign in to mise-wings, open:

https://app.mise-wings.en.dev/cli-device?code=AB12CD34

Enter code: AB12-CD34
Waiting for browser approval...
Signed in to mise-wings as user_123 (acme).
```
50 changes: 50 additions & 0 deletions docs/cli/wings/logout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings logout`

- **Usage**: `mise wings logout [FLAGS]`
- **Source code**: [`src/cli/wings/logout.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/logout.rs)

Sign out of mise-wings.

Deletes the local credentials file. With `--token-stdin`
or `--token`, also POSTs to `/auth/dev/revoke` to invalidate
every wings session belonging to the calling user
(including ones on other machines).

Examples:

```sh
$ mise wings logout --local-only
Local mise-wings credentials cleared.
```

Revoke all server-side sessions for the current user:

```sh
$ pbpaste | mise wings logout --token-stdin
Revoked every active mise-wings session for your user.
```

Without a token, logout still clears local credentials:

```sh
$ mise wings logout
Local mise-wings credentials cleared. Server-side revoke skipped (no Clerk session token).
To revoke every session for your user (including other machines), run:

mise wings logout --token-stdin
```

## Flags

### `--local-only`

Skip the server-side revoke; only delete the local credentials file. Use this when you don't have a fresh Clerk session JWT handy and just want this machine signed out — the wings session JWT remains valid on the server until its `exp` (24 h default)

### `--token <TOKEN>`

Clerk session JWT for the server-side revoke

### `--token-stdin`

Read the Clerk session JWT from stdin (avoids shell history)
23 changes: 23 additions & 0 deletions docs/cli/wings/rebuild.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!-- @generated by usage-cli from usage spec -->
# `mise wings rebuild`

- **Usage**: `mise wings rebuild <TOOL@VERSION>`
- **Source code**: [`src/cli/wings/rebuild.rs`](https://github.com/jdx/mise/blob/main/src/cli/wings/rebuild.rs)

Rebuild a Wings artifact for a tool version.

Resolves the tool exactly like an install would, asks the Wings API to evict
the current packaged catalog row for this org/tool/platform, and queues a
fresh server-side packaging job.

Examples:

```sh
mise wings rebuild jq@1.7.1
```

## Arguments

### `<TOOL@VERSION>`

Tool version to rebuild e.g.: node@20
Loading
Loading