Sourced from jdx/mise-action's releases.
v5.1.1: GitHub token is no longer exported to later steps by default
mise-action no longer exports its GitHub token as
MISE_GITHUB_TOKENto every later step in the job. A newpersist_github_tokeninput lets you turn that back on, or pass a different token to later steps. This changes the default behavior. If later steps need the token, see Breaking Changes below.Fixed
- The GitHub token now stays inside the action by default. Before this release, the
github_tokeninput (which defaults to${{ github.token }}) was written toGITHUB_ENVasMISE_GITHUB_TOKEN. That let any later step read the token and call the GitHub API with the job's permissions, even if the step never asked for a credential. Now the token is set only for the mise-action step and the processes it starts. The action masks the token in logs. (#658 by@jdx, reported in #657)Added
persist_github_tokeninput (defaultfalse). It takes one of three values:
false: the token stays inside the action.true: the token the action used is exported to later steps. Ifenv.MISE_GITHUB_TOKENis already set, it takes precedence overgithub_token.- A token value: that token is exported to later steps instead, for example a read-only token. The action still installs tools with
github_token, or withMISE_GITHUB_TOKENif it's already set.Setting
falsedoesn't clear aMISE_GITHUB_TOKENthat was already set at the job level or exported by an earlier step. (#658 by@jdx)Breaking Changes
Check your workflow if a later step needs
MISE_GITHUB_TOKEN, such as mise shims,mise exec,mise runor lazy tool installs that call the GitHub API. Those steps no longer get the token automatically and may hit GitHub API rate limits. To get the old behavior back, opt in:- uses: jdx/mise-action@v5 with: persist_github_token: trueOr give later steps a separate token:
- uses: jdx/mise-action@v5 with: persist_github_token: ${{ secrets.READ_ONLY_TOKEN }}Full Changelog: https://github.com/jdx/mise-action/compare/v5.1.0...v5.1.1
v5.1.0: Tool version outputs, plugins input, and cached mise reuse
mise-action now reports the tool versions it installed as step outputs, can install mise plugins before tools, and can save the cache at the end of the job. Several caching fixes stop the action from downloading mise again on every run.
Added
- Tool versions as step outputs. After install, the action runs
mise ls --json --currentand sets aversionsoutput. This is a JSON object of the active, installed tools. Each tool maps to a list of{version, requested_version, install_path, source}entries. Each tool also gets its own output with its resolved version, such assteps.mise.outputs.node. A tool only gets its own output if its name is a valid output name and isn'tcache-hitorversions. Names likenpm:@scope/pkgappear only inversions. If the action can't read the versions, it prints a warning and the step still succeeds. (#655 by@jdx)- uses: jdx/mise-action@v5 id: mise - run: echo "node ${{ steps.mise.outputs.node }}"pluginsinput. List plugins one per line asnameorname url. Blank lines and#comments are ignored. The action runsmise plugins install -yfor each one beforemise install. Plugins that are already installed, for example restored from the cache, are left as they are. An unknown plugin fails the step. Whenpluginsis set, its hash is added to the default cache key. Customcache_keytemplates can use it as{{plugins_hash}}. Ifpluginsis unset, existing cache keys don't change. (#656 by@jdx)- uses: jdx/mise-action@v5
... (truncated)
Sourced from jdx/mise-action's changelog.
Changelog
5.1.2 - 2026-10-10
🐛 Bug Fixes
- continue with the existing mise when auto-update cannot replace it (#665) by
@jdxin #665- export mise_dir as MISE_DATA_DIR so mise installs tools there (#672) by
@jdxin #672📚 Documentation
- explain MISE_ENABLE_TOOLS in GitHub Actions (#667) by
@zeitlingerin #667- update the Rust cache section for mise 2026.9.2 (#670) by
@jdxin #670⚙️ Miscellaneous Tasks
- (ci) update pr-closer to v1.3.0 by
@jdxin 076ebfb- (ci) lint workflows with jactionlint (#673) by
@jdxin #673- (ci) switch to jactionlint v2 and drop zizmor (#674) by
@jdxin #674- update pr-closer policy by
@jdxin 88f13e0- fix the upload-artifact version comment (#671) by
@jdxin #671
5.1.1 - 2026-10-04
🐛 Bug Fixes
5.1.0 - 2026-10-04
🚀 Features
- output active tool versions (#655) by
@jdxin #655- add opt-in cache_save_post input (#649) by
@jdxin #649- add plugins input (#656) by
@jdxin #656🐛 Bug Fixes
- (cache) keep a cached mise instead of re-downloading when version is unset (#642) by
@jdxin #642- save cache after inexact cache restore (#646) by
@jdxin #646- extract mise zip with PowerShell instead of unzip on Windows (#650) by
@jdxin #650- cache mise binary for caches saved without a version record (#648) by
@jdxin #648📚 Documentation
... (truncated)
2d8d4ca
chore: release v5.1.1 (#659)3eb43e3
fix: make GitHub token persistence opt-in (#658)94c60b3
chore: release v5.1.0 (#640)4fff0c6
feat: add plugins input (#656)893fc72
docs: add matrix and external cache guides; warn on shadowed mise_toml
(#654)41f5868
feat: add opt-in cache_save_post input (#649)2fe229b
fix: cache mise binary for caches saved without a version record (#648)abd75d9
fix: extract mise zip with PowerShell instead of unzip on Windows (#650)4b9c295
docs: explain the Rust cache caveat and workarounds (#651)7927c6f
feat: output active tool versions (#655)Sourced from actions/upload-artifact's releases.
v7.0.2
What's Changed
- Improves artifact download retries when the service returns HTTP 429 (rate limiting), including honoring valid Retry-After headers.
- Updates
@actions/artifactto v6.3.1.New Contributors
@tunc-dmade their first contribution in actions/upload-artifact#821Full Changelog: https://github.com/actions/upload-artifact/compare/v7.0.1...v7.0.2
Sourced from cisco-ai-skill-scanner's releases.
Skill Scanner 2.2.2
This release improves static detection while keeping the measured false-positive rate steady on the pull-request development corpus.
Changes
- Detect whole process-environment value dumps in Python, JavaScript/TypeScript, and shell code. Targeted reads, keys-only enumeration, literal examples, and comments stay below the HIGH rule boundary.
- Avoid quadratic regex work on scripts padded with long runs of blank lines.
- Stop
PG_PII_CREDIT_CARDfrom treating digits in decimal fractions as card numbers.- Disable reasoning by default for short adjudicator verdicts and allow a separate output-token limit through
SKILL_SCANNER_ADJUDICATOR_LLM_MAX_TOKENS.- Update locked fsspec and multidict versions to resolve the two dependency audit findings.
Behavior notes
A shell prompt marker by itself no longer captures a command on the next line; prompt and command must share a line. The adjudicator's reasoning default is now disabled and can be overridden with
SKILL_SCANNER_ADJUDICATOR_LLM_REASONING_EFFORT.Validation
The PR detection-impact gate compares base and head on the same labelled development records and fixed real-skill sample, enforcing a 0.5 percentage point FPR-rise limit. On the combined change, benign flags stayed at 14/1,338 (1.05%) and real-skill flags at 130/2,000. The exact-SHA release evidence and mandatory release gate passed 3,551 checks. The release holdout compares CEL-off and active modes of this revision; both flagged 23/545 benign samples (4.22%).
2.2.1
A patch release with a security fix for untrusted archives and Markdown, report-format fixes, and a working Homebrew formula. Upgrading from 2.2.0 is recommended.
Security
- Bounded TAR extraction and linear-time Markdown parsing (#246, by
@ihabler; reported by Koh Jun Sheng).
- TAR archives used to be expanded with no compression-ratio, size or member-count limit; only ZIP archives had decompression-bomb checks. A 20 KB
.tar.gzcould expand to 20 MB with no finding. The scanner now copies the TAR payload through a bounded buffer and checks every member before it writes anything. The checks cover member count, declared size, compression ratio, path traversal and links. An archive over a limit raisesARCHIVE_ZIP_BOMB(CRITICAL) and nothing is extracted.- Markdown link discovery and inline-pipeline extraction used overlapping greedy regular expressions that ran in quadratic time on crafted input. Both now run in linear time.
Fixes
- SARIF artifact URIs are valid URI references (#242, by
@xujiantop-crypto). Paths are percent-encoded, so#,?,%, spaces and non-ASCII file names no longer become fragments, queries or the wrong file. Absolute paths are emitted asfile:URIs withouturiBaseId, as SARIF §3.4.4 requires.- Markdown reports contain incomplete code fences (#245, by
@xujiantop-crypto). A snippet with literal or truncated backtick fences could make renderers treat the remediation text and the findings after it as part of the snippet. Snippets with complete fences are kept as they are; any other snippet is wrapped in a fence longer than its longest backtick run.- Homebrew (#243, #244). The formula installs with current Homebrew again:
brew tap cisco-ai-defense/skill-scanner https://github.com/cisco-ai-defense/skill-scanner && brew install cisco-ai-defense/skill-scanner/skill-scanner. Each release now gets a reproducible formula, and the unusedrustbuild dependency, about 2.3 GB withllvm, is gone.Behavior changes
- A TAR archive over the size, ratio or member-count limit is reported as
ARCHIVE_ZIP_BOMB(CRITICAL) and is not extracted. Previously it was expanded silently.- SARIF
artifactLocation.urivalues for paths with reserved or non-ASCII characters are now percent-encoded, and absolute paths arefile:URIs withouturiBaseId. Tools that match SARIF paths as raw strings should decode them.Detection impact on the development split and a 2,000-skill real-skill sample was unchanged: recall 31.45% to 31.43%, FPR unchanged at 1.05%, and real-skill flag rate unchanged at 6.50%.
Full Changelog: https://github.com/cisco-ai-defense/skill-scanner/compare/2.2.0...2.2.1
2.2.0
Highlights
A setup guide built from measurements. Recommended Settings lists setups by goal. Every recommended setup runs the LLM judge. Results on MaliciousSkillBench's held-out split (839 malicious, 545 benign), judge on Gemma 4 26B-A4B:
| Goal | Setup | Recall | FPR | F1 |
... (truncated)
ef5cfee
Transfer release corpus through exact-run cache (#260)c5254dc
fix: download release snapshot through GitHub CLI (#259)4431d85
fix: install scanner runtime for release corpus validation (#258)587dd8b
docs: pin examples to 2.2.2 (#257)5b2e3d6
fix(adjudicator): turn off reasoning so the 200-token verdict is not cut
off ...d0c85a0
fix(promptguard): PG_PII_CREDIT_CARD matches digits inside decimal
fractions ...c8d33bd
feat(rules): add DATA_EXFIL_ENV_DUMP whole-environment dump rule (#251)bfd5986
perf(pipeline): stop quadratic backtracking on blank-line runs in
shell-promp...253cb77
fix(deps): update audited fsspec and multidict locks (#256)c3d7fd9
ci(homebrew): least-privilege workflow token and a pull-requests write
guard ...662df63
Restore unaffected emSign roots (#439)
(#440)5cb238c
Remove emsign (#437)69494a7
Bump actions/download-artifact from 8.0.1 to 8.0.2 (#436)029c7b0
Bump actions/upload-artifact from 7.0.1 to 7.0.2 (#435)9d0a8f1
Add support for Python 3.15 (#432)db472ab
Bump pypa/gh-action-pypi-publish from 1.14.1 to 1.14.2 (#431)Sourced from jdx/mise-action's releases.
v5.2.0: Periodic cache rebuilds, signed packslip verification, and monorepo installs
The default cache key now rolls over every 30 days, so long-lived caches pick up newer mise releases. The action also checks the downloaded mise binary against the release's signed packslip, and it runs
mise install --monorepoautomatically in monorepos. Existing caches miss once after you upgrade, because the default cache key format has changed.Added
- The cache is rebuilt every 30 days by default. GitHub never evicts a cache that keeps getting hits. Before this release, an active repo could keep the same mise binary and tools for months, until a config file changed. The default cache key now includes a period suffix (
-p<N>), so the cache is rebuilt from scratch at least once per period. All repos roll over on the same calendar boundary. Use the newcache_max_age_daysinput to change the period, or set it to0to keep the old key that never expires. Customcache_keytemplates can use the new{{cache_period}}variable, which{{default}}already includes. A custom key that doesn't use it behaves as before. On self-hosted runners that keep mise data between runs, you may also needauto_update: trueto pick up a newer mise. (#689 by@jdx, fixes #688)- uses: jdx/mise-action@v5 with: cache_max_age_days: 14 # default 30; 0 disables periodic rebuilds- Throttled cache restores and saves can be retried. Before this release, when GitHub's cache service returned HTTP 429, the action gave up right away: a restore counted as a miss and a save was skipped. The new
cache_restore_retry_budgetandcache_save_retry_budgetinputs set how long the action may wait. Each retry waits for theRetry-Aftervalue plus some random jitter. Once the budget runs out, the action falls back to the old behavior. Retries apply to the main cache, the post-step save and the binary cache. Real cache misses and reservation conflicts are never retried. Both budgets default to0s(no retries).@actions/cachedoesn't report 429 errors directly, so the action detects throttling from its warning messages. If those messages change in a future@actions/cacherelease, throttling won't be detected and nothing will be retried. (#692 by@jdx, fixes #691)- uses: jdx/mise-action@v5 with: cache_restore_retry_budget: 60s cache_save_retry_budget: 120s- The latest mise binary can fall back to a second download source. When the action downloads the latest mise version, it can fall back between GitHub and mise.jdx.dev if the first source fails. The
fetch_from_githubsetting decides which source it tries first. Pinned versions andminimum_release_ageinstalls are only downloaded from GitHub. The binary is still checked against the signed checksums for the resolved version, whichever source it came from. (#692 by@jdx)- The mise binary is checked against its signed packslip. If a mise release includes
packslip.sigstore.json, the action checks the downloaded binary against it. The bundle must be signed by mise's release workflow for that exact tag. After a successful check, the log showsVerified <asset> against the signed packslip. If the check fails, the install stops instead of falling back to a weaker check. Releases without a packslip use the existing minisign andSHASUMS256check. An explicitsha256input still takes precedence. (#693 by@jdx)- Monorepo-aware installs. If your mise config sets
[monorepo].config_roots, the action now adds--monorepotomise install, so tools configured anywhere in the monorepo get installed. Repos without that setting aren't affected. To opt out, setmonorepo: false. (#679 by@zeitlinger)Fixed
- Tool directories that mise moves to the front of
PATHare now exported. The action used to find mise'sPATHchanges by comparing mise'sPATHwith the runner's. If a tool's bin directory was already on the runner'sPATH, such as~/.cargo/bin, mise only moved it to the front, so the action didn't export it. Later steps then found the mise shim first. For example,rustupresolved to the shim instead of~/.cargo/bin/rustup. The action now asks mise for its entries withmise env --pathsand exports them in the order mise reports. This fix needs a mise version that supports--paths. With older versions, the action uses the old comparison. (#685 by@jdx)Documentation
- The new "Release workflows" section of the README says that jobs that publish releases shouldn't restore caches. A lower-trust workflow that can write to default-branch caches could otherwise slip files into a release. In those jobs, use
cache: falseor GitHub'scache-mode: none. (#682 by@jdx)- The README explains how to cache mise's downloads, keyed on
mise.lock, instead of installed tools. It includes a Windows example that setsMISE_CACHE_DIRfrom${{ runner.temp }}, becauseactions/cachedoesn't expand%TEMP%. (#686, #690 by@zeitlinger)Breaking Changes
- The default cache key has a new format, so the first run after upgrading is a cache miss and saves a fresh cache. After that, the cache is rebuilt every 30 days by default. To keep the old cache key that never expires, set
cache_max_age_days: 0. Workflows that set a customcache_keywithout{{default}}or{{cache_period}}aren't affected.Full Changelog: https://github.com/jdx/mise-action/compare/v5.1.2...v5.2.0
v5.1.2: mise_dir now sets MISE_DATA_DIR; auto_update handles a locked mise binary
The
mise_dirinput now also sets where mise installs tools, so those tools end up in the cache. Withauto_update: true, the action no longer crashes on Windows when the mise binary is still in use.Fixed
mise_dirnow exportsMISE_DATA_DIR. Before this release,mise_dirmoved the mise binary and the cache path, but mise kept installing tools to~/.local/share/mise. The saved cache didn't include the tools. On runners where~/.localisn't writable, the step failed withEACCES: permission denied. Whenmise_diris set, the action now exportsMISE_DATA_DIR=<mise_dir>, so tools are installed into the directory that gets cached. If your workflow sets a differentMISE_DATA_DIR, themise_dirinput overrides it. Ifmise_dirisn't set, nothing changes. mise's state directory (~/.local/state/mise) stays where it is. If that path also can't be written, setMISE_STATE_DIRyourself. (#672 by@jdx, fixes #668)- uses: jdx/mise-action@v5 with: mise_dir: ${{ runner.tool_cache }}/mise/dataauto_updateno longer crashes when it can't replacemise.exe. On Windows, the step used to fail with a bareEPERM: operation not permitted, unlink '…\mise.exe'if another process was still using the binary. Now, ifversionisn't pinned and the existing binary passes verification against its recorded version, the action prints a warning and continues with that version. In any other case, the step fails with a message that says the file is in use and how to fix it. A pinnedversionnever quietly keeps an older binary. (#665 by@jdx, fixes #664)
... (truncated)
Sourced from jdx/mise-action's changelog.
Changelog
5.2.2 - 2026-10-21
🐛 Bug Fixes
- hash conf.d config fragments in cache key (#698) by
@rileymichaelin #698New Contributors
@rileymichaelmade their first contribution in #698
5.2.1 - 2026-10-19
🐛 Bug Fixes
5.2.0 - 2026-10-16
🚀 Features
- (cache) rebuild the cache every 30 days by default (#689) by
@jdxin #689- (cache) retry throttled cache restores and saves (#692) by
@jdxin #692- verify the mise binary against its signed packslip (#693) by
@jdxin #693🐛 Bug Fixes
🔍 Other Changes
- Use monorepo install when configured (#679) by
@zeitlingerin #679- Change minimum age for auto-merging release PRs by
@jdxin b511e8d📚 Documentation
- tell release workflows not to use the cache (#682) by
@jdxin #682- explain caching mise downloads instead of installs (#686) by
@zeitlingerin #686- use resolved Windows downloads cache path (#690) by
@zeitlingerin #690⚙️ Miscellaneous Tasks
- stop restoring caches in release jobs (#683) by
@jdxin #683- replace prettier with oxfmt (#694) by
@jdxin #694
... (truncated)
9b200bc
chore: release v5.2.0 (#680)b511e8d
Change minimum age for auto-merging release PRs887d1f4
docs: use resolved Windows downloads cache path (#690)93c62ad
chore: replace prettier with oxfmt (#694)04716d4
feat: verify the mise binary against its signed packslip (#693)5108104
feat(cache): retry throttled cache restores and saves (#692)d401260
docs: explain caching mise downloads instead of installs (#686)e7cf35f
feat(cache): rebuild the cache every 30 days by default (#689)cd02696
fix: export the PATH entries mise reports with mise env --paths (#685)6784481
docs: tell release workflows not to use the cache (#682)Sourced from cisco-ai-skill-scanner's releases.
Skill Scanner 2.3.0
This release maps every finding to the Cisco AI Security and Safety Taxonomy, closes several ways to hide text from the frontmatter scan, and stops silently skipping symlinks and unloadable skills, while keeping the measured false-positive rate steady on the pull-request development corpus.
Changes
- Attach a Cisco AI taxonomy code to findings: an AITech code and, where one fits, an AISubtech code, with names and OWASP, MITRE ATLAS and NIST AML crosswalks, from a hash-pinned taxonomy 2.0.0 snapshot bundled with the scanner. Every bundled rule declares its code, operational findings are
not_applicable, and a code that cannot be resolved isunmappedrather than guessed. New finding metadata:aitech,aitech_name,aisubtech,aisubtech_name,aitech_mappings,aisubtech_mappings,framework_mappings,taxonomy_statusandtaxonomy_source, plus scan-level counts inscan_metadata.taxonomyand SARIF result properties. (#267)- Scan every
SKILL.mdfrontmatter value and comment exceptallowed-tools, as the loader parses it. Quoted and complex keys, YAML aliases and merge keys, escape sequences,!!binaryvalues and values folded over several lines no longer hide text from the static rules. (#265, #268)- Detect plain-language instructions to read a local credential file and send it to a remote host in
ACTIVE_SENSITIVE_EXFILTRATION. (#264)- Report symlinks among a skill's files, which are not followed, as
SYMLINK_NOT_SCANNED(HIGH when the target leaves the skill root), and skills that fail to load asSKILL_LOAD_FAILEDfindings inscan-all. (#265)- Avoid quadratic regex work in two rules on long lines. (#265)
Behavior notes
Taxonomy codes follow taxonomy 2.0.0, so some change: jailbreak rules move from
AITech-2.1toAITech-1.1/AISubtech-1.1.5, and hardcoded secrets fromAISubtech-8.2.2toAISubtech-14.1.1. TheAITech-99.9/AISubtech-99.9.9placeholders are no longer emitted. Update any filters on 1.x codes.scan-allnow reports folders with unloadable skills or symlinks as findings instead of skipping them, so SARIF, markdown output and--fail-on-severityexit codes include them.Validation
The PR detection-impact gate compares base and head on the same labelled development records and fixed real-skill sample, enforcing a 0.5 percentage point FPR-rise limit. Across this release, benign flags stayed at 14/1,338 (1.05%) and real-skill flags at 130/2,000, while development-split recall rose from 31.43% to 31.94%. The exact-SHA release evidence and mandatory release gate passed 3,551 checks. The release holdout compares CEL-off and active modes of this revision; both flagged 23/545 benign samples (4.22%), and holdout recall (7.75%) and macro-F1 (35.41%) are unchanged from 2.2.2.
e4e334f
docs: pin examples to 2.3.0 and describe the 2.3.0 scanning changes (#269)5b0eda6
feat: detect plain-language instructions to send local secrets to a
remote ho...55bd732
feat: map every finding to a Cisco AI taxonomy code (#267)010ae2c
fix: scan SKILL.md frontmatter values as the loader parses them (#268)64101c5
fix: close silent-skip paths in the scanner and two quadratic rules (#265)f18074a
docs: pin site examples to skill-scanner 2.2.2 (#262)e5a3d3e
chore: update Homebrew formula to 2.2.2 (#261)