mise-expert について
mise-expertは、miseに関する質問への対応を支援するスキルです。構文や設定を案内する前に、インストール済みバージョンと最新ドキュメントの確認を優先します。バックエンド、安全性検証、設定の信頼、最近の変更を扱い、参照元とバージョンの明記を求めます。
主な機能
- 01インストール済みmiseと最新ドキュメントの確認を優先
- 02変更頻度に応じて情報を分類
- 03ツール導入バックエンドの選択を解説
- 04整合性検証と設定の信頼を扱う
- 05参照元とバージョンの明記を要求
活用シーン
- 01miseの特定バージョンで使えるコマンドや設定を確認
- 02ツール導入やバックエンド選択の問題を調査
- 03署名や来歴の検証失敗を調査
- 04設定の信頼やバージョン差異に対応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ samhvw8/ dotfiles --skill mise-expertインストール後、Claude Code で/mise-expertを入力して読み込まれたか確認します。
詳細
Mise エキスパートスキル
まず最新のドキュメントを確認する
mise は月に数回リリースされ、バックエンド、設定、環境変数、フラグはリリースごとに変更されます。このファイルは mise 2026.10.11(2026-10-15) のリリースノートとドキュメント、および 2026.10.10 のバイナリで確認した設定とバックエンドに基づくスナップショットです。現在の正確な情報ではなく、参照先を探すための地図として扱ってください。
構文、設定名、環境変数、フラグ、バックエンドの推奨事項を提示する前に、次の順番で最新の情報源を確認してください。
- インストール済みのバイナリ —
mise --version、mise help <command>、mise settings ls、mise registry <tool>、mise doctor。このマシンで実行される内容については、これが権威ある情報源です。 - 最新のドキュメント — context7(
miseのライブラリ ID を解決してから、トピックを検索)、または https://mise.jdx.dev。WebFetch が失敗した場合は、mcp__parallax__fetch_pageを使用してください。 - スナップショット以降の変更 — インストール済みのバージョンが上記より新しい場合、またはユーザーがこのファイルの記述と一致しない動作に遭遇した場合は、https://github.com/jdx/mise/releases のリリースノートを確認してください。
このファイルの各項目について、確認が必要な頻度は次のとおりです。
| ラベル | セクション | 最新のドキュメントを確認するタイミング |
|---|---|---|
| 変動あり | バックエンド、セキュリティ検証、信頼性、アテステーションと ubi のトラブルシューティング項目、CI/CD 統合 | 毎回 |
| ずれが発生する | 最近の機能、設定パターン、変数と環境管理、移行戦略 | 正確なキーや構文を引用するとき |
| 安定 | タスク設定の原則、判断フレームワーク、ベストプラクティスのチェックリスト、避けるべきアンチパターン | ユーザーから不一致の報告があった場合のみ |
ユーザーに提示する情報には、確認した情報源とバージョンを明記してください(「2026.10.11 の mise help use によると」、「mise.jdx.dev/configuration によると」など)。このファイルしか参照できなかった場合は、「スキルの 2026.10.11 スナップショットに基づくもので、最新情報での検証は未実施」と伝えてください。最新の情報源がこのファイルと矛盾する場合は、最新の情報源に従い、このスキルの情報が古くなっていることをユーザーに伝えてください。
バックエンド
mise はバックエンドを使用してツールをインストールします。バックエンドの選択は、セキュリティ検証、パフォーマンス、互換性に影響します。
`mise backends ls` を実行すると、インストール済みバイナリがサポートするバックエンドを確認できます。まずはレジストリの短縮名を確認します(`mise registry ` でバックエンドの一覧が優先順に表示されます)。バックエンドを自分で選ぶ場合、ドキュメントに記載されている順序に従い、公開元が署名したリリース、または公開元がビルドしたリリースを優先してください。推奨(ビルド済みリリース)
| バックエンド | 構文 | 用途 |
|---|---|---|
| core | node、python、go(core:node) | 組み込みツール(node、python、bun、deno、java、go、rust、erlang、...)。 |
| packslip | packslip:github.com/owner/repo(GitHub の場合は packslip:owner/repo) | 公開元が署名したリリースマニフェスト。mise は署名者とすべてのアーティファクトダイジェストを検証します。補完、man ページ、エージェントスキルが含まれます。レジストリでは、hk、usage、fnox、pitchfork、aube、helmfile、timoni、dagu、worktrunk にすでに優先設定されています。オプション workflow = [...] で署名ワークフローを固定できます。 |
| aqua | aqua:owner/repo | aqua レジストリにあるツール。ネイティブ検証(cosign、SLSA、証明、minisign)に対応しています。ツールごとに libc = "musl" オプションを指定できます。 |
| github / gitlab / forgejo | github:owner/repo | Forge のリリースアセット。来歴を検証します。ubi の後継です。 |
| http / s3 | http:name + url、s3:name + url = "s3://..." | ホストするアーカイブ。http では認証用に headers を指定でき、s3 は AWS の認証情報チェーンを使用します。 |
言語パッケージ(ツールがパッケージとしてのみ提供されている場合、またはパッケージオプションが必要な場合)
| バックエンド | 構文 | 用途 |
|---|---|---|
| cargo | cargo:crate | crates.io の Rust ツール。cargo-binstall に対応しています。 |
| go | go:module | go install による Go ツール。 |
| npm | npm:package、npm:github:owner/repo@ref | Git からもインストールできる Node パッケージ。npm/pnpm/bun/aube に対応しています。 |
pypi(エイリアス pipx:) | pypi:package、pypi:owner/repo、pypi:git+https://...#subdirectory=x | 分離された環境で実行する Python CLI アプリ。uv を使用し、uv がない場合は pipx を使用します。mise が Python を管理している場合は、その Python 上でビルドします。pipx:x と pypi:x は同じツールです。 |
| gem | gem:package | Ruby gem。プライベートレジストリの場合は source = "<url>" を指定します。 |
| dotnet | dotnet:Package.Name | NuGet の .NET ツール。 |
| spm | spm:owner/repo | Swift パッケージの実行ファイル。Swift が必要です。 |
| conda | conda:package | Conda パッケージとその依存関係。 |
プラグインとその他
| バックエンド | 構文 | 用途 |
|---|---|---|
| vfox | vfox:owner/plugin | Lua プラグイン。インストール時にカスタムロジックが必要な場合にのみ使用します。 |
| spinel | spinel:owner/repo | 試験的機能です。Ruby プログラムをネイティブコードに AOT コンパイルします。experimental = true と spinel コンパイラーが必要です。 |
| asdf | asdf:plugin | レガシーです。任意のシェルプラグインコードを実行し、Windows には対応していません。新しいツールには使用しないでください。 |
非推奨
| バックエンド | 置き換え先 | 移行 |
|---|---|---|
| ubi | github / gitlab / http | 2026.4.0 以降で警告が表示され、mise 2027.1.0 で削除されます。ubi:owner/repo → github:owner/repo、provider = "gitlab" → gitlab:、直接 URL → url を指定した http: に置き換えます。通常、exe は不要です。rename_exe は rename_exe = { "gh" = "gh-cli" } に変更します。その後、mise lock と mise uninstall --all ubi:owner/repo を実行します。 |
短縮名の解決順序(明示的な backend: プレフィックスが常に優先されます):MISE_BACKENDS_<TOOL> 環境変数 → バックエンドを指定する [tool_alias] エントリー(例:node = "core:node")→ [plugins] URL → mise.lock に記録されたバックエンド(そのバージョンに対応する場合)→ 同名のインストール済みプラグイン → この環境で実行でき、disable_backends に含まれず、そのバージョンに対応する最初のレジストリバックエンド。mise tool <name> --backend で確認できます。レジストリでツールのバックエンドが変更された場合、mise backends switch でロックエントリーを移動します。
推奨順位:core > packslip > aqua > github/gitlab/forgejo > http/s3 > 言語パッケージ(cargo/go/npm/pypi/gem/dotnet)> vfox > asdf
バックエンドの上書き例:
[tools]
# Default (registry decides backend — usually aqua)
uv = "latest"
# Explicit backend
"aqua:astral-sh/uv" = "latest"
"github:astral-sh/uv" = "latest"
# CLI override
mise use "github:astral-sh/uv@latest"
## セキュリティ検証
aqua バックエンドは、ネイティブの Rust 実装を通じてツールの整合性を検証します。外部 CLI ツール(cosign、slsa-verifier、minisign、gh)は不要です。すべての方法はデフォルトで有効です。
<security_verification> 検証方法
| 方法 | 環境変数 | 設定キー | デフォルト |
|---|---|---|---|
| Cosign 署名 | MISE_AQUA_COSIGN | aqua.cosign | true |
| SLSA プロベナンス | MISE_AQUA_SLSA | aqua.slsa | true |
| GitHub Attestations | MISE_AQUA_GITHUB_ATTESTATIONS | aqua.github_attestations | true |
| Minisign | MISE_AQUA_MINISIGN | aqua.minisign | true |
| チェックサム | 常時有効 | N/A | 常時 |
すべてのバックエンドに適用されるグローバルな切り替え:MISE_GITHUB_ATTESTATIONS=0(github_attestations を設定)。github バックエンドには独自の github.github_attestations があります。
追加の cosign 引数:MISE_AQUA_COSIGN_EXTRA_ARGS="--key /path/to/key.pub"
署名者の ID が必須になりました(2026.9.16 – 2026.10.0)
- SLSA プロベナンスは、想定される署名者からのものである必要があります。レジストリエントリに署名者が設定されていない
github:およびaqua:ツール(例:aqua:google/osv-scanner)には、ツールオプションとしてslsa_signer_identityとslsa_signer_issuerを設定してください。両方が設定されていない場合、mise は SLSA チェックをスキップし、他の方法を使用します。 - キーレスの cosign バンドルは、レジストリで固定された
--certificate-identity/--certificate-oidc-issuerと一致する必要があります。キーを使用する(--key)場合に変更はありません。 - GitHub attestation の
signer_workflowは、部分文字列ではなくパスのセグメント全体で照合します。
リリース経過時間のしきい値:minimum_release_age(デフォルトは 24h)により、ツールと mise self-update の新しいリリースの利用を保留します。最新バージョンをすぐに取得するには、ツールごとに --tool-option minimum_release_age=0s を指定します。minimum_release_age_excludes には、除外するツールを列挙します。
Attestation の検証に失敗した場合
よくある原因:GitHub Actions を使わずにリリースが手動で公開された(attestation が生成されていない)、sigstore ライブラリとの互換性がない、GitHub API の形式が変更された。
# Fix 1: Update mise first (many attestation bugs fixed in newer releases)
mise self-update
# Fix 2: Disable only the failing method
export MISE_AQUA_GITHUB_ATTESTATIONS=false
mise install <tool>@<version>
# Fix 3: Settings-based (persistent)
# In mise.toml or ~/.config/mise/config.toml
[settings]
aqua.github_attestations = false
# Fix 4: Debug to identify which method fails
MISE_DEBUG=1 mise install <tool>@<version>
ツールごとに既知の attestation の問題: 一部のリリースは手動で公開されたか、GitHub attestation のサポート開始前のものであるため、attestation が付属していません。隣接するバージョンをインストールするか、ツールの aqua-registry エントリでバージョンごとの免除設定を確認してください。 </security_verification>
信頼
mise は、信頼されていない設定をスキップするか拒否します。次の形式は、読み込む前に mise trust が必要になりました。
- インラインオプション付きのツールキー(
"github:o/r[api_url=...]")。mise.tomlと.tool-versionsの両方が対象です。信頼されていないファイルによって、GITHUB_TOKENが別のホストに送信される可能性があります。 path:ツールバージョン。ディレクトリがPATHの先頭に追加されます。{ ... }オプションテーブル、Tera テンプレート、および#MISEヘッダーにテンプレートを含むリモートタスクファイル。
node = "24" などの単純なキーは、信頼されていなくても引き続き読み込まれます。信頼されていないプロジェクト設定が mise activate を妨げることはなくなりました。警告を表示してスキップされますが、mise run と mise x は引き続きエラーになります。パラノイアモードでは、--yes/CI による自動確認で信頼が付与されることはありません。MISE_SAFE=1 は、プロジェクトの [bootstrap]、[dotfiles]、および include を無視します。
最近の機能
2026.9.15 から 2026.10.11 の間に追加されました。共有設定で使用する前に min_version を確認してください。
<recent_features> 設定
include = ["./local.toml", "git::<url>//mise.toml?ref=main", "oci::ghcr.io/org/cfg@sha256:..."]は、読み込み元のファイルより下位に、共有の[tools]、[env]、[vars]、[hooks]、[bootstrap]などをマージします。インクルードにはタスクや[settings]を含められません。- 優先順位の変更(2026.10.5): 同じディレクトリ内での優先順位は、高い順に
mise.<env>.local.toml>mise.local.toml>mise.<env>.toml>mise.tomlです。 promptとdefaultまたはrequiredを指定した[vars.<name>]は、マシンごとに一度だけプロンプトを表示し(mise vars prompt)、回答を$MISE_STATE_DIR/vars.tomlに保存します。~/.config/mise/miserc.local.tomlで、特定のマシンの環境を選択できます(env = ["work"])。settings.write_targetsは、新しいグローバル[tools]エントリの書き込み先をconf.dファイルに設定します。
ツール
- グローバルツールに
auto_update = true | "6h"を設定するか、すべてのグローバルツールに[settings] tool_update.global_auto = "12h"を設定できます。バージョンを厳密に固定したものは更新されません。CI、オフライン、またはlockedの場合は何も実行されません。 - mise 自体の更新設定は
self_update.auto/self_update.check_durationに移動しました(以前のauto_updateキーも引き続き使用できます)。 postinstall = { run = "...", when = "always" }は、mise installのたびに実行されます。mise upgrade --global/mise outdated --globalは、グローバル設定のみを対象とします。java@21、java@lts、java@latestは、現在 Temurin をインストールします(java.shorthand_vendor)。古いロックエントリを使用するには、mise lock --bump javaを実行するか、java.shorthand_vendor = "openjdk"を設定してください。install_layout = "identity"(実験的機能。experimental = trueの場合、Windows ではデフォルトで有効)は、コンテンツハッシュを使ってインストールを保存します。mise installs ls|select|migrateを使用してください。- 各ツールのインストールディレクトリには、グローバルバージョンを指す
globalシンボリックリンクがあります。IDE からこのリンクを指定してください。 mise env --pathsは、mise が追加する PATH エントリのみを出力します。- GitHub の公開メタデータ(リリース一覧、タグ、アテステーション)は mise-versions から取得するようになりました(
use_versions_host = true)。そのため、トークンのないユーザーがレート制限に達することはほとんどありません。
ロックファイル
- 新しいロックファイルの
lockfile_versionは3です。古い mise ではこれを読み込めません。全ユーザーが 2026.9.16 以降を使用するようになったら、mise lock --upgradeを一度実行して古いファイルをアップグレードしてください。 - ドキュメントでは、
mise.lockをコミットし、mise install --lockedでインストールすることを推奨するようになりました。mise lock --platform linux-x64,linux-arm64,macos-arm64は、各ランナーのエントリを書き込みます。 lockfile_auto_prune = falseを設定すると、有効な設定にないツールのエントリが保持されます。
タスク
skip_if = "test -f .initialized"を設定すると、コマンドが終了コード 0 で終了した場合にタスクをスキップします。mise run --forceを使うと、この設定を無視します。confirm = { message = "...", yes = "Deploy", no = "Cancel", default = "no" }。- タスクに
secrets = ["DEPLOY_KEY"]を設定できます(実験的機能、fnox 1.39 以降、[secrets.fnox])。値はそのタスクにのみ渡され、出力ではマスキングされます。mise run --secrets KEY taskを使用してください。 mise run --affectedは実験的機能ではなくなり、未コミットおよび未追跡のファイルも対象として数えるようになりました。以前の動作を使うには--affected-committedを指定してください。mise tasks validateは、解析できないusage仕様がある場合に失敗するようになりました。[monorepo.path_aliases]を使うと、深い階層にある設定ルートに短い名前を付けられます(mise run //123:build)。
</recent_features>
運用ガイドライン
タスク設定の原則
<task_design_principles>
- キャッシュを優先:キャッシュ可能なタスクでは、必ず
sourcesとoutputsを定義します - デフォルトで並列実行:並列実行には
depends配列を使用します - 単一責任:各タスクには、明確な目的を 1 つだけ持たせます
- 名前空間の使用:関連するタスクは接頭辞でグループ化します(例:
db:migrate、test:unit) - 冪等性:タスクは複数回実行しても安全なものにします
- プラットフォームへの配慮:クロスプラットフォーム互換性のために
run_windowsを使用します - 監視モードへの対応:
mise watchと互換性のあるタスクを設計します </task_design_principles>
判断フレームワーク
<when_to_use_mise> mise を選ぶ場合:
- バージョン管理が必要なマルチ言語プロジェクト(Python + Node + Go)
- ディレクトリごとに環境変数を設定する必要があるプロジェクト
- クロスプラットフォームの開発チーム(Linux/Mac/Windows)
- 複雑な Makefile や npm スクリプトを置き換える場合
- タスクの並列実行が必要なプロジェクト
- 一貫した開発環境を求めるチーム(新しい開発者のオンボーディング)
- 複数のツール(asdf + direnv + make)を 1 つに置き換える場合
- 再現可能なビルドが必要な CI/CD パイプライン
mise を使わない場合:
- ビルド手順がシンプルな単一言語プロジェクト
- npm スクリプトで十分なプロジェクト
- TOML に不慣れで、学習に時間を割けないチーム
- 既存のタスクシステムが問題なく機能しており、困りごとがないプロジェクト
- 組み込みシステムや制約のある環境 </when_to_use_mise>
ツールのバージョン管理パターン
<tool_installation_patterns> プロジェクト固有のツール
# mise.toml - Project root configuration
[tools]
# Exact versions for reproducibility (illustrative — look up current ones with `mise latest <tool>`)
node = "<x.y.z>"
python = "<x.y.z>"
go = "<x.y.z>"
terraform = "<x.y.z>"
# Read from version file
ruby = { file = ".ruby-version" }
java = { file = ".java-version" }
# Latest patch version
postgres = "16"
redis = "7"
# Multiple versions (switch with mise use)
# mise use node@18 (temporarily override)
グローバルな開発ツール
# Install globally useful CLI tools
mise use -g ripgrep@latest # Better grep
mise use -g bat@latest # Better cat
バージョンファイルの移行
# Migrate from existing version files
echo "20.10.0" > .node-version
echo "3.11.6" > .python-version
# mise.toml
[tools]
node = { file = ".node-version" }
python = { file = ".python-version" }
</tool_installation_patterns>
プロジェクトのセットアップワークフロー
<project_setup_patterns> 新規プロジェクトのブートストラップ
# mise.toml
[tools]
node = "20"
python = "3.11"
[env]
PROJECT_ROOT = "{{cwd}}"
LOG_LEVEL = "debug"
[vars]
project_name = "my-app"
[tasks.setup]
description = "Setup development environment"
run = [
"mise install",
"npm install",
"pip install -r requirements.txt",
"cp .env.example .env"
]
[tasks.dev]
alias = "d"
description = "Start development server"
depends = ["setup"]
env = { NODE_ENV = "development" }
run = "npm run dev"
モノレポの構成
# Root mise.toml
[tools]
node = "20"
go = "1.21"
[tasks.install]
description = "Install all dependencies"
run = [
"cd frontend && npm install",
"cd backend && go mod download"
]
# frontend/mise.toml
[tasks.dev]
dir = "{{cwd}}/frontend"
run = "npm run dev"
# backend/mise.toml
[tools]
go = "1.21"
[tasks.dev]
dir = "{{cwd}}/backend"
run = "go run main.go"
</project_setup_patterns>
構成パターン
<common_patterns> 開発ワークフロー
[tasks.dev]
alias = "d"
description = "Start development server with hot reload"
env = { NODE_ENV = "development", DEBUG = "true" }
run = "npm run dev"
[tasks.dev-watch]
description = "Watch and rebuild on changes"
run = "mise watch build"
キャッシュを使ったビルドパイプライン
[tasks.clean]
description = "Remove build artifacts"
run = "rm -rf dist"
[tasks.build]
alias = "b"
description = "Build production bundle"
depends = ["clean"]
sources = ["src/**/*", "package.json", "tsconfig.json"]
outputs = ["dist/**/*"]
env = { NODE_ENV = "production" }
run = "npm run build"
[tasks.build-watch]
description = "Rebuild on source changes"
run = "mise watch build"
テストスイート
[tasks.test]
alias = "t"
description = "Run all tests"
depends = ["test:unit", "test:integration"] # Runs in parallel
[tasks."test:unit"]
description = "Run unit tests"
sources = ["src/**/*.ts", "tests/unit/**/*.ts"]
run = "npm test -- --testPathPattern=unit"
[tasks."test:integration"]
description = "Run integration tests"
sources = ["src/**/*.ts", "tests/integration/**/*.ts"]
run = "npm test -- --testPathPattern=integration"
[tasks."test:watch"]
description = "Run tests in watch mode"
run = "npm test -- --watch"
[tasks."test:coverage"]
description = "Generate coverage report"
run = "npm test -- --coverage"
[tasks."test:e2e"]
description = "Run end-to-end tests"
depends = ["build"]
run = "playwright test"
データベースのワークフロー
[tasks."db:migrate"]
description = "Run database migrations"
run = "npx prisma migrate deploy"
[tasks."db:seed"]
description = "Seed database with test data"
depends = ["db:migrate"]
run = "npx prisma db seed"
[tasks."db:reset"]
description = "Reset database to clean state"
run = ["npx prisma migrate reset --force", "mise run db:seed"]
[tasks."db:studio"]
description = "Open Prisma Studio"
run = "npx prisma studio"
リンティングとフォーマット
[tasks.lint]
description = "Lint code"
sources = ["src/**/*.ts"]
run = "eslint src"
[tasks.format]
description = "Format code"
sources = ["src/**/*.ts"]
run = "prettier --write src"
[tasks."lint:fix"]
description = "Lint and auto-fix issues"
run = "eslint src --fix"
[tasks.check]
description = "Run all checks"
depends = ["lint", "format", "test"] # Runs in parallel
デプロイパイプライン
[tasks.deploy]
description = "Deploy to production"
usage = '''
arg "environment" description="Target environment" default="staging"
flag "-f --force" description="Skip confirmation"
'''
depends = ["build", "test"]
depends_post = ["notify:slack"]
run = './scripts/deploy.sh {{arg(name="environment")}} {{flag(name="force")}}'
[tasks."deploy:staging"]
description = "Deploy to staging"
depends = ["build", "test"]
run = "./scripts/deploy.sh staging"
[tasks."deploy:production"]
description = "Deploy to production"
depends = ["build", "test"]
run = "./scripts/deploy.sh production"
[tasks."notify:slack"]
hide = true
run = 'curl -X POST $SLACK_WEBHOOK -d "Deployment complete"'
Docker との統合
[tasks."docker:build"]
description = "Build Docker image"
sources = ["Dockerfile", "src/**/*"]
run = "docker build -t myapp:latest ."
[tasks."docker:run"]
description = "Run Docker container"
depends = ["docker:build"]
run = "docker run -p 3000:3000 myapp:latest"
[tasks."docker:compose"]
description = "Start services with docker-compose"
run = "docker-compose up -d"
Go プラグインのビルドシステム
[tasks."build:plugins"]
description = "Build all Go plugins in parallel"
sources = ["plugins/**/*.go"]
outputs = ["plugins/**/main.so"]
run = '''
for plugin in plugins/*/; do
(cd "$plugin" && go build -buildmode=plugin -o main.so main.go) &
done
wait
'''
[tasks."rebuild:plugins"]
description = "Rebuild plugins when engine changes"
sources = ["engine/**/*.go"]
depends = ["build:engine"]
run = "mise run build:plugins"
</common_patterns>
変数と環境の管理
<environment_patterns> 環境別の変数
[vars]
# Default development values
api_url = "http://localhost:3000"
db_host = "localhost"
db_port = "5432"
debug_mode = "true"
# Load additional vars from .env
_.file = ".env"
[env]
# Static environment variables
NODE_ENV = "development"
LOG_LEVEL = "debug"
# Reference variables
API_URL = "{{vars.api_url}}"
DATABASE_URL = "postgres://{{vars.db_host}}:{{vars.db_port}}/myapp"
DEBUG = "{{vars.debug_mode}}"
[tasks.dev]
env = {
NODE_ENV = "development",
API_URL = "{{vars.api_url}}"
}
run = "npm run dev"
複数環境のセットアップ
# mise.toml (base development config)
[vars]
environment = "development"
api_url = "http://localhost:3000"
[env]
NODE_ENV = "development"
# mise.staging.toml
[vars]
environment = "staging"
api_url = "https://api.staging.example.com"
[env]
NODE_ENV = "staging"
# mise.production.toml
[vars]
environment = "production"
api_url = "https://api.example.com"
debug_mode = "false"
[env]
NODE_ENV = "production"
シークレットの管理
# mise.toml (checked into git)
[vars]
# Non-sensitive defaults
api_url = "http://localhost:3000"
# Load secrets from .env (gitignored)
_.file = ".env"
[env]
# Reference secrets loaded from .env
API_KEY = "{{vars.api_key}}"
DATABASE_PASSWORD = "{{vars.db_password}}"
# .env (NOT in git)
api_key=secret-key-here
db_password=secret-password
</environment_patterns>
構成の検証
mise の構成を変更したら、確認します。mise install(ツールが解決されること)、mise tasks ls(タスクが登録されること)、mise run <task>(タスクが実行されること)、診断には mise doctor を使います。
移行戦略
<migration_from_asdf> .tool-versions から mise.toml への移行
.tool-versions:
nodejs 20.10.0
python 3.11.6
golang 1.21.5
terraform 1.6.6
mise.toml:
[tools]
node = "20.10.0"
python = "3.11.6"
go = "1.21.5"
terraform = "1.6.6"
移行コマンド:
# Mise can read .tool-versions directly
mise install
# Or convert to mise.toml
mise use [email protected] [email protected] [email protected] [email protected]
</migration_from_asdf>
<migration_from_make> Makefile から mise.toml への移行
Makefile:
.PHONY: build test clean deploy
clean:
rm -rf dist
build: clean
npm run build
test: build
npm test
deploy: build test
./deploy.sh
mise.toml:
[tasks.clean]
description = "Remove build artifacts"
run = "rm -rf dist"
[tasks.build]
alias = "b"
description = "Build production bundle"
depends = ["clean"]
sources = ["src/**/*", "package.json"]
outputs = ["dist/**/*"]
run = "npm run build"
[tasks.test]
alias = "t"
description = "Run tests"
depends = ["build"]
run = "npm test"
[tasks.deploy]
description = "Deploy to production"
depends = ["build", "test"] # test already depends on build, so these run in order
run = "./deploy.sh"
メリット:
- sources/outputs による自動キャッシュ
- 独立したタスクの並列実行
- クロスプラットフォーム互換性
- 環境変数の管理
- ツールのバージョン管理を統合 </migration_from_make>
<migration_from_npm> package.json のスクリプトから mise.toml への移行
package.json:
{
"scripts": {
"dev": "NODE_ENV=development npm start",
"build": "webpack --mode production",
"test": "jest",
"lint": "eslint src",
"deploy": "npm run build && npm run test && ./deploy.sh"
}
}
mise.toml:
[tasks.dev]
alias = "d"
description = "Start development server"
env = { NODE_ENV = "development" }
run = "npm start"
[tasks.build]
alias = "b"
description = "Build production bundle"
sources = ["src/**/*", "webpack.config.js"]
outputs = ["dist/**/*"]
run = "webpack --mode production"
[tasks.test]
alias = "t"
description = "Run tests"
run = "jest"
[tasks.lint]
description = "Lint code"
sources = ["src/**/*.js"]
run = "eslint src"
[tasks.deploy]
description = "Deploy to production"
depends = ["build", "test"] # Runs in parallel
run = "./deploy.sh"
メリット:
- 依存関係をより適切に管理(build と test を並列実行)
- キャッシュにより不要な再ビルドを防止
- 構成で環境変数を管理
- 異なる種類のプロジェクトで一貫したインターフェースを使用
- Node.js だけでなく、あらゆる言語で動作 </migration_from_npm>
<migration_from_direnv> .envrc から mise.toml への移行
.envrc:
export NODE_ENV=development
export API_URL=http://localhost:3000
export DATABASE_URL=postgres://localhost/myapp
mise.toml:
[env]
NODE_ENV = "development"
API_URL = "http://localhost:3000"
DATABASE_URL = "postgres://localhost/myapp"
# Or use variables for DRY
[vars]
api_host = "localhost"
api_port = "3000"
[env]
API_URL = "http://{{vars.api_host}}:{{vars.api_port}}"
メリット:
- TOML 形式は bash よりも読みやすく、編集しやすい
- DRY な構成のための変数
- タスクランナーやツールのバージョンと統合
- シェル固有の構文が不要 </migration_from_direnv>
CI/CD との統合
<ci_integration> GitHub Actions
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
# Installs mise and the repo's tools. With a committed mise.lock it runs
# `mise install --locked` itself. Pin mise with `version:` if needed.
- uses: jdx/mise-action@v5
- name: Run tests
run: mise run test
- name: Build
run: mise run build
mise-action v5 は GitHub トークンを後続のステップにエクスポートしません。ツールをインストールするステップには、トークンを渡してください。mise generate github-action --write --task=ci を実行すると、ワークフローのひな形が生成されます。
インストールではなくダウンロードをキャッシュします(mise.lock をコミットしている場合)。mise はキャッシュされた各ダウンロードをロックファイルと照合して再ハッシュするため、汚染されたキャッシュによってインストールされる内容が変わることはありません。復元された インストール キャッシュは、そのまま信頼されます。
- uses: actions/checkout@v7
- uses: actions/cache@v6
with:
path: ~/.cache/mise/downloads-cas # macOS: ~/Library/Caches/mise/downloads-cas
key: mise-downloads-${{ runner.os }}-${{ hashFiles('mise.lock') }}
- uses: jdx/mise-action@v5
with:
cache: false
GitLab CI
image: ubuntu:latest
before_script:
- curl https://mise.run | sh # set MISE_VERSION=<x> for a reproducible mise
- export PATH="$HOME/.local/bin:$PATH"
- mise install --locked
test:
script:
- mise run test
build:
script:
- mise run build
Docker
FROM ubuntu:latest
# Install mise
RUN curl https://mise.run | sh
ENV PATH="/root/.local/bin:$PATH"
# Copy project files
COPY . /app
WORKDIR /app
# Install tools from the committed lockfile
RUN mise install --locked
# Run build
RUN mise run build
CMD ["mise", "run", "start"]
</ci_integration>
トラブルシューティングガイド
<common_issues> ツールが見つからない/バージョンが違う
# Symptom: Command not found or using system version
mise ls # List installed tools
mise install # Install missing tools
mise use node@20 # Set specific version
mise doctor # Diagnose configuration
which node # Verify mise shim
mise reshim # Rebuild shims if needed
タスクが見つからない
# Symptom: "Task 'xyz' not found"
mise tasks ls # List all tasks
mise config # Show active config files
cat mise.toml # Verify task definition
mise tasks info <task> # Get task details
タスクのキャッシュに関する問題
# Symptom: Task not re-running when files change
[tasks.build]
sources = ["src/**/*"] # Check glob patterns are correct
outputs = ["dist/**/*"] # Verify output paths match actual outputs
run = "npm run build"
# Debug: Remove outputs and re-run
# rm -rf dist && mise run build
環境変数が読み込まれない
# Symptom: Environment variables not set in tasks
mise config # Verify mise.toml location (project root)
mise run --verbose <task> # Check env loading with verbose output
mise doctor # Diagnostic check
env | grep VAR_NAME # Check if var is actually set
クロスプラットフォームに関する問題
# Symptom: Task fails on Windows
[tasks.build]
run = "npm run build" # Use cross-platform commands
run_windows = "npm.cmd run build" # Windows-specific override
# Or use mise variables for paths
run = "{{cwd}}/scripts/build.sh"
並列実行が機能しない
# Symptom: Tasks running sequentially instead of parallel
[tasks.ci]
depends = ["lint", "test", "build"] # Runs in parallel by default
# For sequential execution, use run array
[tasks.sequential]
run = [
"mise run step1",
"mise run step2",
"mise run step3"
]
ツールのインストールに失敗する
# Symptom: mise install fails for a tool
mise doctor # Check for system dependencies
mise ls-remote node # List available versions
mise install node@20 --verbose # Verbose installation
mise cache clear # Clear cache and retry
アテステーション/検証に失敗する
# Symptom: "GitHub artifact attestations verification failed"
# or "Workflow verification failed: expected '...', found certificate: None"
# Step 1: Update mise (most attestation bugs are fixed in newer releases)
mise self-update
# Step 2: If still failing, disable ONLY the method Step 5's debug output names — one of:
export MISE_AQUA_GITHUB_ATTESTATIONS=false # GitHub attestations
# export MISE_AQUA_COSIGN=false # Cosign signatures
# export MISE_AQUA_SLSA=false # SLSA provenance
# Step 3: Try an adjacent version (some releases lack attestations)
mise install <tool>@<other-version>
# Step 4: Switch backend as workaround
mise use "github:owner/repo@version" # github backend instead of aqua
# Step 5: Debug for details
MISE_DEBUG=1 mise install tool@version
SLSA「no signer_identity and signer_issuer」
# Symptom: a locked or SLSA-checked aqua/github tool fails with no expected signer.
# Fix: refresh the entry with `mise lock`, or set both signer options:
[tools]
"aqua:google/osv-scanner" = { version = "latest", slsa_signer_identity = "<cert URI>", slsa_signer_issuer = "https://token.actions.githubusercontent.com" }
以前は読み込めていた設定が「is not trusted」と表示される
# Symptom: inline tool options ("tool[opt=x]") or path: versions are skipped.
mise trust # in the project directory, after reading the file
非推奨の ubi バックエンドを使用する
# Symptom: ubi backend warnings or failures (ubi is removed in 2027.1.0)
# Fix: Replace ubi with github backend
# Old: ubi:owner/repo → New: github:owner/repo
# In mise.toml
# Before (deprecated):
# "ubi:goreleaser/goreleaser" = "latest"
# After (recommended):
# "github:goreleaser/goreleaser" = "latest"
</common_issues>
ベストプラクティスのチェックリスト
<best_practices> ツール管理:
- 共有プロジェクトや CI プロジェクトでは正確なバージョンを固定します。個人用ツールではメジャーバージョンのプレフィックス(node = "22")でも問題ありません
- バージョンを選んだ理由をコメントに記載します
- 互換性の確保には .tool-versions やバージョンファイルを使用します
- 新しくクローンした環境でツールのインストールをテストします
タスクの設定:
- 頻繁に使用するタスクにはすべて短いエイリアスを設定します
- ビルドタスクでは、キャッシュ用にソースと出力を定義します
- 関連するタスクには名前空間のプレフィックス(db:、test:、docker:)を使用します
- 複雑なタスクにはわかりやすい説明を付けます
- 引数を取るタスクでは、ドキュメント用に使用方法の仕様を設定します
- 非表示の内部タスクには hide = true を設定します
環境管理:
- DRY を実現するため、環境変数には mise 変数を使用します
- シークレットは .env(gitignore 対象)から読み込みます
- 開発環境のデフォルト値は mise.toml(バージョン管理対象)に設定します
- 本番環境での上書き設定には別の設定ファイルを使用します
パフォーマンス:
- depends 配列を使って並列実行を活用します
- sources/outputs を使ってキャッシュを設定します
- 反復的な開発で使えるよう、ウォッチモードを利用できるようにします
- システムリソースに合わせて jobs 設定を最適化します
クロスプラットフォーム:
- プラットフォーム固有のコマンドには run_windows を使用します
- ハードコードした値の代わりに {{cwd}} を使ってパスを指定します
- 対象プラットフォーム(Linux/Mac/Windows)でテストします
チームと CI:
- mise.toml をバージョン管理します
- README に mise のインストール方法と使い方を記載します
- 一貫性のある環境を実現するため、CI/CD で mise を使用します
-
mise doctorで検証します </best_practices>
出力基準
既存の mise.toml を編集する場合は、依頼の対象となるセクションのみを変更してください。ユーザー向けのタスクには description を設定し、コメントは自明でない設定にのみ付けてください。
避けるべきアンチパターン
<anti_patterns> しないでください:
- ❌ 共有プロジェクトや CI プロジェクトで広いバージョン範囲を指定する(
node = "22"はマシンごとに異なるバージョンへずれていきます) - ❌ 説明なしでタスクを作成する(保守が困難になります)
- ❌ ビルドタスクでソース/出力を指定しない(キャッシュのメリットを活用できません)
- ❌
dependsで並列実行できる場合に、逐次実行の配列を使用する - ❌ 環境固有の値をハードコードする(代わりに
varsを使用してください) - ❌ 巨大なタスクを作成する(より小さく再利用可能な要素に分割してください)
- ❌ チームプロジェクトでクロスプラットフォームへの配慮を省く
- ❌
mise.tomlのバージョン管理を忘れる - ❌ 単一の簡単なコマンドだけを使うプロジェクトで mise を使用する
- ❌
mise.tomlにシークレットをコミットする(.envを使用してください) - ❌
ubi:バックエンドを使用する(非推奨です。代わりにgithub:を使用してください) - ❌
MISE_AQUA_REGISTRY_COSIGNを使用する(環境変数が誤っています。MISE_AQUA_COSIGNを使用してください) - ❌ 1 つの検証方法が失敗しただけで、検証をすべてグローバルに無効化する
- ❌ ロックファイルがあるのに、CI でインストール済みツールをキャッシュする(代わりに
downloads-casをキャッシュしてください) - ❌ 読んでいないリポジトリで
mise trustを実行する — trust は現在、path:バージョンとインラインのツールオプションも制御します
してください:
- ✅ 再現性を確保するため、ツールのバージョンを正確に固定する
- ✅ 関連するタスクには名前空間を使用する
- ✅ 頻繁に使うタスクにはエイリアスを追加する
- ✅ キャッシュ可能なタスクではソース/出力を定義する
- ✅
dependsで並列実行を活用する - ✅ DRY な設定には変数を使用する
- ✅ 複雑なタスクの引数を usage spec で文書化する
- ✅ コミット前に
mise doctorでテストする - ✅ チームメンバー向けに明確な説明を記載する
- ✅ Git で無視する
.envファイルからシークレットを読み込む - ✅ GitHub リリースのツールには
ubi:よりgithub:を優先する - ✅ アテステーションの失敗をデバッグする前に
mise self-updateを実行する - ✅ すべてではなく、失敗している特定の検証方法だけを無効化する
- ✅
mise.lockをコミットし、CI と Docker では--lockedを指定してインストールする - ✅ 公開者が packslip マニフェストに署名する場合は、
packslip:を優先する </anti_patterns>