From a22028798b34b18014c917635620be759fc446bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 18 Jun 2026 23:32:30 +0000 Subject: [PATCH 01/17] chore: update Nix flake to 2.0.0 --- flake.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index e17dce6..642649a 100644 --- a/flake.nix +++ b/flake.nix @@ -25,19 +25,19 @@ platforms = { x86_64-linux = { artifact = "vibe-linux-x64"; - hash = "sha256-KNYAfX4F3tIsTgsZ14pNqHsLlOKbcn+0X/bU9YUqlME="; + hash = "sha256-zR9OUIcJWfXOHnnBArbPmLNciUO9kYmhbabApYXhSnc="; }; aarch64-linux = { artifact = "vibe-linux-arm64"; - hash = "sha256-1ENhKncBo+GvRFY7G+jXfWj9EH0tl05rhybzQ2fXEX8="; + hash = "sha256-hD0QBZaXPRB+rMyzvYtADFK1qcmn6R8k1MXvGrnXtdo="; }; x86_64-darwin = { artifact = "vibe-darwin-x64"; - hash = "sha256-UuMHOtyBufuI1twY3zNml/428VAx2d7cgblwVF15rYE="; + hash = "sha256-1qIB2aARjAg6AIkW66pCsxa+AAfjj3Iw3lUXmR5voX0="; }; aarch64-darwin = { artifact = "vibe-darwin-arm64"; - hash = "sha256-m4jgnuA6LhH1wOkMyqf5asLiDIHzYGHuHZ2UMmLDUE0="; + hash = "sha256-A5CNtmIejiCsbLZd5zPeNilt2mmIErOj/Qyr5ypVghg="; }; }; in From 8bd6c2aa8bf1ce2b3ff2fb47749e7fc29eae1156 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Fri, 19 Jun 2026 14:05:03 +0900 Subject: [PATCH 02/17] ci: move Nix binary hash updates to release docs --- .github/workflows/release.yml | 101 ---------------------------------- CONTRIBUTING.md | 33 +++++++++++ 2 files changed, 33 insertions(+), 101 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 28be739..fb3c697 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -380,104 +380,3 @@ jobs: git commit -m "Update ${FORMULA_NAME} to $VERSION" git push --quiet https://x-access-token:${GH_TOKEN}@github.com/kexi/homebrew-tap.git HEAD:main - - update-nix: - if: github.event.action == 'released' - needs: release - runs-on: ubuntu-latest - concurrency: - group: update-nix - cancel-in-progress: false - - steps: - - name: Harden Runner - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 - with: - egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - with: - ref: develop - # PAT (not GITHUB_TOKEN) so gh pr create is not blocked by the - # repo-level "Allow GitHub Actions to create pull requests" setting. - token: ${{ secrets.HOMEBREW_TAP_TOKEN }} - - - name: Download artifacts - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - path: artifacts - merge-multiple: true - - - uses: DeterminateSystems/nix-installer-action@ef8a148080ab6020fd15196c2084a2eea5ff2d25 # v22 - - - name: Calculate SRI hashes - id: hashes - run: | - for file in darwin-arm64 darwin-x64 linux-arm64 linux-x64; do - raw=$(sha256sum "artifacts/vibe-${file}" | cut -d ' ' -f 1) - sri=$(nix hash convert --hash-algo sha256 --to sri "$raw") - - # Validate SRI hash format - if ! echo "$sri" | grep -qE '^sha256-[A-Za-z0-9+/=]{43,44}$'; then - echo "Error: Invalid SRI hash format for vibe-${file}: $sri" - exit 1 - fi - - key=$(echo "$file" | tr '-' '_') - echo "${key}=${sri}" >> "$GITHUB_OUTPUT" - done - - - name: Update flake.nix binary hashes - id: version - run: | - VERSION="${GITHUB_REF_NAME#v}" - - # Validate version format (bash built-in to prevent newline bypass) - if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$ ]]; then - echo "Error: Invalid version format: $VERSION" - exit 1 - fi - echo "value=$VERSION" >> "$GITHUB_OUTPUT" - - # flake.nix derives `version` from package.json, so there is no version - # line to bump here. Only the prebuilt-binary SRI hashes need updating, - # and they are unknowable until the release assets exist (post-tag) — - # that is why this job runs after release rather than in the release PR. - # Anchor each replace on its artifact name so the pnpm/native version - # pins are never touched (a blanket s/version = ".*"/ once clobbered all - # three and broke the source build). - sed -i '/vibe-linux-x64/,/};/s|hash = ".*"|hash = "${{ steps.hashes.outputs.linux_x64 }}"|' flake.nix - sed -i '/vibe-linux-arm64/,/};/s|hash = ".*"|hash = "${{ steps.hashes.outputs.linux_arm64 }}"|' flake.nix - sed -i '/vibe-darwin-x64/,/};/s|hash = ".*"|hash = "${{ steps.hashes.outputs.darwin_x64 }}"|' flake.nix - sed -i '/vibe-darwin-arm64/,/};/s|hash = ".*"|hash = "${{ steps.hashes.outputs.darwin_arm64 }}"|' flake.nix - - - name: Update flake.lock - run: nix flake lock --update-input nixpkgs --update-input flake-utils - - - name: Verify build - run: nix build && ./result/bin/vibe --help - - - name: Open PR and merge - env: - GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }} - run: | - VERSION="${{ steps.version.outputs.value }}" - # Suffix with run_id and run_attempt so re-runs and concurrent releases - # never collide on an existing remote branch. - BRANCH="chore/update-nix-flake-${VERSION}-${{ github.run_id }}-${{ github.run_attempt }}" - - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git checkout -b "$BRANCH" - git add flake.nix flake.lock - git commit -m "chore: update Nix flake to ${VERSION}" - git push --quiet origin "$BRANCH" - - gh pr create \ - --base develop \ - --head "$BRANCH" \ - --title "chore: update Nix flake to ${VERSION}" \ - --body "Automated update of \`flake.nix\` and \`flake.lock\` for v${VERSION}." - - # --admin bypasses develop's branch-protection policy, which otherwise - # rejects this bot merge ("base branch policy prohibits the merge"). - gh pr merge "$BRANCH" --merge --admin --delete-branch diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e84dea..00c74da 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -138,6 +138,39 @@ See [AGENTS.md](./AGENTS.md) for detailed branching workflow. gh release create vX.X.X --generate-notes ``` +5. **Update Nix binary hashes, if needed:** + + The default Nix package builds from source. The prebuilt binary fast path + (`#binary`) needs `flake.nix` hashes that match the final GitHub Release + assets, so update those hashes only after the release workflow uploads the + assets. + + ```fish + set -l version X.X.X + mkdir -p artifacts + gh release download "v$version" --pattern 'vibe-*' --dir artifacts + + for file in darwin-arm64 darwin-x64 linux-arm64 linux-x64 + set -l sri (nix hash file --type sha256 --sri "artifacts/vibe-$file") + printf "%s %s\n" "$file" "$sri" + end + ``` + + Copy the SRI hashes into the matching `platforms.*.hash` entries in + `flake.nix`, then verify and open a PR against `develop`: + + ```fish + nix build .#binary; and ./result/bin/vibe --help + git checkout -b chore/update-nix-binary-hashes-vX.X.X + git add flake.nix + git commit -m "chore: update Nix binary hashes for X.X.X" + git push -u origin chore/update-nix-binary-hashes-vX.X.X + gh pr create --base develop --title "chore: update Nix binary hashes for X.X.X" --body "Updates flake.nix binary hashes for vX.X.X release assets." + ``` + + Do not update `flake.lock` as part of the release. Update `nixpkgs` and + `flake-utils` in a separate maintenance PR when needed. + ### Automated Release Tasks When a release is created, GitHub Actions automatically: From 7b09ed226eeb85b7e7805453b8050a69e172bb0e Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Mon, 22 Jun 2026 21:03:56 +0900 Subject: [PATCH 03/17] feat: add submodule auto init config --- .../src/content/docs/configuration/hooks.mdx | 46 ++--- .../content/docs/configuration/vibe-toml.mdx | 18 ++ .../content/docs/ja/configuration/hooks.mdx | 36 ++-- .../docs/ja/configuration/vibe-toml.mdx | 18 ++ rust/crates/vibe-core/src/commands/start.rs | 70 +++++++- .../vibe-core/src/commands/start_tests.rs | 169 +++++++++++++++++- rust/crates/vibe-core/src/config.rs | 77 ++++++++ 7 files changed, 391 insertions(+), 43 deletions(-) diff --git a/packages/docs/src/content/docs/configuration/hooks.mdx b/packages/docs/src/content/docs/configuration/hooks.mdx index e53377f..10cd1da 100644 --- a/packages/docs/src/content/docs/configuration/hooks.mdx +++ b/packages/docs/src/content/docs/configuration/hooks.mdx @@ -9,12 +9,12 @@ Hooks allow you to run commands automatically during the worktree lifecycle. ## Available Hooks -| Hook | When | Working Directory | -| ------------ | ------------------------ | ----------------- | -| `pre_start` | Before worktree creation | Origin repository | -| `post_start` | After worktree creation | New worktree | -| `pre_clean` | Before worktree removal | Current worktree | -| `post_clean` | After worktree removal | Main repository | +| Hook | When | Working Directory | +| ------------ | ----------------------- | ----------------- | +| `pre_start` | After worktree creation | Origin repository | +| `post_start` | After worktree creation | New worktree | +| `pre_clean` | Before worktree removal | Current worktree | +| `post_clean` | After worktree removal | Main repository | ## Configuration @@ -78,10 +78,11 @@ Progress display auto-disables in non-TTY environments (e.g., CI/CD), and hook o For `vibe start`: -1. `pre_start` hooks run in origin repository -2. Worktree is created -3. Files/directories are copied -4. `post_start` hooks run in new worktree +1. Worktree is created +2. Submodules are initialized when `[submodules] auto_init = true` +3. `pre_start` hooks run in origin repository +4. Files/directories are copied +5. `post_start` hooks run in new worktree For `vibe clean`: @@ -138,15 +139,17 @@ pre_clean = ["docker-compose down"] ### Git Submodules +Prefer first-class submodule initialization when recursive defaults are enough: + ```toml -[hooks] -post_start = [ - "git submodule update --init --recursive || true" -] +[submodules] +auto_init = true ``` -:::tip -`|| true` prevents the hook from failing when submodule initialization encounters network issues. Remove it if you want strict error handling. +This runs `git submodule update --init --recursive` in the new worktree before `pre_start` hooks. Failures abort `vibe start` so authentication and network errors are visible. + +:::note +Use a hook instead when you need custom submodule behavior, such as non-recursive updates, filtered updates, or intentionally ignoring failures. ::: ## Skipping Hooks @@ -199,11 +202,12 @@ When Claude Code creates a worktree (via natural language, `isolation: "worktree **WorktreeCreate:** 1. Reads worktree name from stdin (Claude Code hook protocol) -2. Runs `pre_start` hooks in the origin repository -3. Creates the git worktree -4. Copies files/directories using CoW -5. Runs `post_start` hooks in the new worktree (e.g., `pnpm install`) -6. Outputs the worktree path to stdout for Claude Code +2. Creates the git worktree +3. Initializes submodules when `[submodules] auto_init = true` +4. Runs `pre_start` hooks in the origin repository +5. Copies files/directories using CoW +6. Runs `post_start` hooks in the new worktree (e.g., `pnpm install`) +7. Outputs the worktree path to stdout for Claude Code **WorktreeRemove:** diff --git a/packages/docs/src/content/docs/configuration/vibe-toml.mdx b/packages/docs/src/content/docs/configuration/vibe-toml.mdx index 274c63b..133b5f9 100644 --- a/packages/docs/src/content/docs/configuration/vibe-toml.mdx +++ b/packages/docs/src/content/docs/configuration/vibe-toml.mdx @@ -116,6 +116,21 @@ vibe automatically selects the best copy strategy based on your system: See [Hooks](/configuration/hooks/) for details on configuring pre/post hooks. +## Submodules Configuration + +Initialize git submodules automatically after the worktree is created and before `pre_start` hooks run: + +```toml +[submodules] +auto_init = true +``` + +- **Default**: `false` +- Runs `git submodule update --init --recursive` in the new worktree +- `--no-hooks` does not skip submodule initialization +- Repositories without `.gitmodules` are treated as a successful no-op by git +- Submodule update failures abort `vibe start` and leave the created worktree available for inspection + ## Worktree Configuration Customize the worktree directory path using an external script. @@ -176,6 +191,9 @@ post_start = [ pre_clean = ["git stash"] post_clean = ["echo 'Cleanup complete'"] +[submodules] +auto_init = true + [worktree] path_script = "~/.config/vibe/worktree-path.sh" ``` diff --git a/packages/docs/src/content/docs/ja/configuration/hooks.mdx b/packages/docs/src/content/docs/ja/configuration/hooks.mdx index fcd77cb..65af272 100644 --- a/packages/docs/src/content/docs/ja/configuration/hooks.mdx +++ b/packages/docs/src/content/docs/ja/configuration/hooks.mdx @@ -11,7 +11,7 @@ sidebar: | フック | 実行タイミング | 作業ディレクトリ | | ------------ | -------------- | ---------------- | -| `pre_start` | Worktree作成前 | 元リポジトリ | +| `pre_start` | Worktree作成後 | 元リポジトリ | | `post_start` | Worktree作成後 | 新しいWorktree | | `pre_clean` | Worktree削除前 | 現在のWorktree | | `post_clean` | Worktree削除後 | メインリポジトリ | @@ -78,10 +78,11 @@ vibeはフック実行中にリアルタイム進捗ツリーを表示します `vibe start`の場合: -1. `pre_start`フックが元リポジトリで実行 -2. Worktreeが作成される -3. ファイル/ディレクトリがコピーされる -4. `post_start`フックが新しいWorktreeで実行 +1. Worktreeが作成される +2. `[submodules] auto_init = true`の場合、サブモジュールが初期化される +3. `pre_start`フックが元リポジトリで実行 +4. ファイル/ディレクトリがコピーされる +5. `post_start`フックが新しいWorktreeで実行 `vibe clean`の場合: @@ -138,15 +139,17 @@ pre_clean = ["docker-compose down"] ### Gitサブモジュール +再帰的な既定動作で十分な場合は、ファーストクラスのサブモジュール初期化を優先してください: + ```toml -[hooks] -post_start = [ - "git submodule update --init --recursive || true" -] +[submodules] +auto_init = true ``` -:::tip -`|| true`を付けることで、ネットワークエラー等でサブモジュールの初期化に失敗してもフック全体が失敗しません。厳密なエラーハンドリングが必要な場合は除去してください。 +これは新しいWorktree内で、`pre_start`フックより前に`git submodule update --init --recursive`を実行します。失敗時は`vibe start`を中断するため、認証やネットワークの問題が見える状態になります。 + +:::note +非再帰更新、フィルタ付き更新、失敗を意図的に無視する場合など、カスタムのサブモジュール動作が必要な場合はフックを使用してください。 ::: ## フックのスキップ @@ -199,11 +202,12 @@ Claude CodeがWorktreeを作成する場合(自然言語、`isolation: "worktr **WorktreeCreate:** 1. stdinからWorktree名を読み取り(Claude Codeフックプロトコル) -2. 元リポジトリで`pre_start`フックを実行 -3. git Worktreeを作成 -4. CoWを使用してファイル/ディレクトリをコピー -5. 新しいWorktreeで`post_start`フックを実行(例:`pnpm install`) -6. Claude Code向けにWorktreeパスをstdoutに出力 +2. git Worktreeを作成 +3. `[submodules] auto_init = true`の場合、サブモジュールを初期化 +4. 元リポジトリで`pre_start`フックを実行 +5. CoWを使用してファイル/ディレクトリをコピー +6. 新しいWorktreeで`post_start`フックを実行(例:`pnpm install`) +7. Claude Code向けにWorktreeパスをstdoutに出力 **WorktreeRemove:** diff --git a/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx b/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx index 767f681..23b3ae4 100644 --- a/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx +++ b/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx @@ -116,6 +116,21 @@ vibeはシステムに応じて最適なコピー戦略を自動選択します フック設定の詳細は[フック](/ja/configuration/hooks/)を参照してください。 +## サブモジュール設定 + +Worktree作成後、`pre_start`フックの実行前にgitサブモジュールを自動初期化します: + +```toml +[submodules] +auto_init = true +``` + +- **デフォルト**: `false` +- 新しいWorktree内で`git submodule update --init --recursive`を実行します +- `--no-hooks`ではサブモジュール初期化はスキップされません +- `.gitmodules`がないリポジトリでは、gitにより成功したno-opとして扱われます +- サブモジュール更新に失敗すると`vibe start`は中断され、作成済みWorktreeは調査用に残ります + ## Worktree設定 外部スクリプトを使用してWorktreeディレクトリパスをカスタマイズできます。 @@ -176,6 +191,9 @@ post_start = [ pre_clean = ["git stash"] post_clean = ["echo 'クリーンアップ完了'"] +[submodules] +auto_init = true + [worktree] path_script = "~/.config/vibe/worktree-path.sh" ``` diff --git a/rust/crates/vibe-core/src/commands/start.rs b/rust/crates/vibe-core/src/commands/start.rs index 0b381f0..ff736a9 100644 --- a/rust/crates/vibe-core/src/commands/start.rs +++ b/rust/crates/vibe-core/src/commands/start.rs @@ -3,7 +3,8 @@ //! Ported from `packages/core/src/commands/start.ts`. The validation cascade, //! existing-branch navigate, same-branch idempotent re-entry, different-branch //! Overwrite/Reuse/Cancel select, worktree creation, and the -//! pre_start → copy → post_start config-and-hooks sequence mirror the TS. The +//! submodule init → pre_start → copy → post_start config-and-hooks sequence +//! mirror the TS. The //! Claude-Code `--claude-code-worktree-hook` mode reads a name from stdin and //! outputs the worktree PATH to stdout (not a `cd`), with non-fatal post-setup. //! @@ -501,8 +502,8 @@ where ))) } -/// Run config-driven hooks + copy: pre_start (in repo_root) → copy files + dirs → -/// post_start (in worktree_path). +/// Run config-driven operations: submodule init → pre_start (in repo_root) → +/// copy files + dirs → post_start (in worktree_path). fn run_config_and_hooks( deps: &StartDeps, config: Option<&VibeConfig>, @@ -530,6 +531,8 @@ where deps.tracker.start(); } + init_submodules(deps, config, worktree_path, options.dry_run)?; + // pre_start hooks (in repo_root). if !options.skip_hooks { run_lifecycle_hooks( @@ -610,6 +613,7 @@ where /// Whether config has any hook/copy operation (drives starting the tracker). fn config_has_operations(config: &VibeConfig, options: &ConfigAndHooks) -> bool { + let has_submodule_init = submodules_auto_init_enabled(config); let hooks_count = if options.skip_hooks { 0 } else { @@ -634,7 +638,65 @@ fn config_has_operations(config: &VibeConfig, options: &ConfigAndHooks) -> bool }) .unwrap_or(0) }; - hooks_count + copy_count > 0 + has_submodule_init || hooks_count + copy_count > 0 +} + +fn submodules_auto_init_enabled(config: &VibeConfig) -> bool { + config + .submodules + .as_ref() + .and_then(|s| s.auto_init) + .unwrap_or(false) +} + +fn init_submodules( + deps: &StartDeps, + config: &VibeConfig, + worktree_path: &str, + dry_run: bool, +) -> Result<()> +where + I: Io, + G: GitRunner, + R: RepoResolver, + S: ScriptRunner, + P: Prompt, + Sr: StdinReader, +{ + if !submodules_auto_init_enabled(config) { + return Ok(()); + } + + let command = format!("git -C {worktree_path} submodule update --init --recursive"); + if dry_run { + log_dry_run(deps.io, &format!("Would run: {command}")); + return Ok(()); + } + + let phase = deps.tracker.add_phase("Initializing submodules"); + let task = deps + .tracker + .add_task(phase, "git submodule update --init --recursive"); + deps.tracker.start_task(task); + let result = deps.git.run(&[ + "-C", + worktree_path, + "submodule", + "update", + "--init", + "--recursive", + ]); + + match result { + Ok(_) => { + deps.tracker.complete_task(task); + Ok(()) + } + Err(err) => { + deps.tracker.fail_task(task, &err.to_string()); + Err(err) + } + } } /// Run a lifecycle hook list with a phase/tasks on the tracker. diff --git a/rust/crates/vibe-core/src/commands/start_tests.rs b/rust/crates/vibe-core/src/commands/start_tests.rs index 01434a0..b7c59f3 100644 --- a/rust/crates/vibe-core/src/commands/start_tests.rs +++ b/rust/crates/vibe-core/src/commands/start_tests.rs @@ -7,7 +7,7 @@ use crate::error::VibeError; use crate::git::RepoInfo; use crate::hooks::FakeHookRunner; use crate::io::FakeIo; -use crate::progress::RecordingTracker; +use crate::progress::{RecordingTracker, TrackerEvent}; use crate::stdin::FakeStdin; use crate::worktree_path::ScriptOutput; use std::cell::RefCell; @@ -23,6 +23,7 @@ struct MockGit { local_branches: Vec, remote_branches: Vec, existing_revisions: Vec, + fail_prefix: Option>, pub calls: RefCell>>, } @@ -34,6 +35,7 @@ impl MockGit { local_branches: vec![], remote_branches: vec![], existing_revisions: vec![], + fail_prefix: None, calls: RefCell::new(vec![]), } } @@ -41,12 +43,28 @@ impl MockGit { self.existing_revisions.push(r.to_string()); self } + fn failing_on(mut self, prefix: &[&str]) -> Self { + self.fail_prefix = Some(prefix.iter().map(|s| s.to_string()).collect()); + self + } fn calls_contain(&self, prefix: &[&str]) -> bool { self.calls .borrow() .iter() .any(|c| c.len() >= prefix.len() && c[..prefix.len()] == *prefix) } + fn submodule_update_calls(&self) -> usize { + self.calls + .borrow() + .iter() + .filter(|c| { + c.iter().any(|arg| arg == "submodule") + && c.iter().any(|arg| arg == "update") + && c.iter().any(|arg| arg == "--init") + && c.iter().any(|arg| arg == "--recursive") + }) + .count() + } } impl GitRunner for MockGit { @@ -55,6 +73,21 @@ impl GitRunner for MockGit { .borrow_mut() .push(args.iter().map(|s| s.to_string()).collect()); + if let Some(prefix) = &self.fail_prefix { + let is_matching_prefix = args.len() >= prefix.len() + && args + .iter() + .take(prefix.len()) + .zip(prefix.iter()) + .all(|(actual, expected)| actual == expected); + if is_matching_prefix { + return Err(VibeError::GitOperation { + command: args.join(" "), + message: "failed: submodule update".into(), + }); + } + } + if args.contains(&"--show-toplevel") { return Ok(self.repo_root.clone()); } @@ -700,6 +733,12 @@ fn different_branch_cancel_emits_no_cd() { /// Build a trusted-config fixture + resolver, returning (fixture, io, resolver, /// repo_root). The config has a pre_start, a copy file, and a post_start hook. fn trusted_config_repo() -> (Fixture, FakeIo, TrustResolver, String) { + trusted_config_repo_with_content( + "[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n", + ) +} + +fn trusted_config_repo_with_content(content: &str) -> (Fixture, FakeIo, TrustResolver, String) { use crate::hash::hash_content; use crate::settings::{AllowEntry, RepoId, VibeSettings}; use crate::settings_io::save_user_settings; @@ -707,7 +746,6 @@ fn trusted_config_repo() -> (Fixture, FakeIo, TrustResolver, String) { let fx = Fixture::new(); let repo = fx.mkdir("repo"); - let content = "[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n"; fx.write("repo/.vibe.toml", content); fx.write("repo/.env", "SECRET=1"); @@ -742,6 +780,49 @@ fn trusted_config_repo() -> (Fixture, FakeIo, TrustResolver, String) { ) } +fn start_with_config( + content: &str, + fail_prefix: Option<&[&str]>, + flags: &StartFlags, +) -> ( + Fixture, + FakeIo, + TrustResolver, + String, + MockGit, + Fakes, + Result, +) { + let (fx, io, resolver, repo_root) = trusted_config_repo_with_content(content); + let mut git = MockGit::new( + &repo_root, + &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), + ); + if let Some(prefix) = fail_prefix { + git = git.failing_on(prefix); + } + let s = NoScript; + let p = ScriptPrompt::confirming(true); + let sin = FakeStdin::none(); + let fk = Fakes::new(); + let result = { + let d = StartDeps { + io: &io, + git: &git, + resolver: &resolver, + script_runner: &s, + prompt: &p, + stdin: &sin, + hook_runner: &fk.hooks, + executor: &fk.exec, + tracker: &fk.tracker, + version: V, + }; + start_command(&d, "feat", flags, OutputOptions::default()) + }; + (fx, io, resolver, repo_root, git, fk, result) +} + struct TrustResolver { repos: std::collections::HashMap, } @@ -830,6 +911,90 @@ fn no_hooks_and_no_copy_skip_operations() { assert!(fk.exec.file_copies.lock().unwrap().is_empty()); } +#[test] +fn submodules_auto_init_runs_before_pre_start() { + let content = "[submodules]\nauto_init = true\n[hooks]\npre_start = [\"echo pre\"]\n"; + let (_fx, _io, _resolver, repo_root, git, fk, result) = + start_with_config(content, None, &StartFlags::default()); + result.unwrap(); + + assert!(git.calls_contain(&[ + "-C", + &format!("{}-feat", repo_root), + "submodule", + "update", + "--init", + "--recursive" + ])); + let events = fk.tracker.events(); + let submodule_phase = events.iter().position( + |event| matches!(event, TrackerEvent::Phase(label) if label == "Initializing submodules"), + ); + let pre_start_phase = events.iter().position( + |event| matches!(event, TrackerEvent::Phase(label) if label == "Pre-start hooks"), + ); + assert!(submodule_phase.is_some()); + assert!(pre_start_phase.is_some()); + assert!(submodule_phase < pre_start_phase); +} + +#[test] +fn submodules_auto_init_false_and_omitted_do_not_run() { + for content in [ + "[submodules]\nauto_init = false\n", + "[hooks]\npre_start = [\"echo pre\"]\n", + ] { + let (_fx, _io, _resolver, _repo_root, git, _fk, result) = + start_with_config(content, None, &StartFlags::default()); + result.unwrap(); + assert_eq!(git.submodule_update_calls(), 0); + } +} + +#[test] +fn submodules_auto_init_runs_with_no_hooks() { + let content = "[submodules]\nauto_init = true\n[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n"; + let flags = StartFlags { + no_hooks: true, + ..Default::default() + }; + let (_fx, _io, _resolver, _repo_root, git, fk, result) = + start_with_config(content, None, &flags); + result.unwrap(); + + assert_eq!(git.submodule_update_calls(), 1); + assert!(fk.hooks.calls.borrow().is_empty()); +} + +#[test] +fn submodules_auto_init_dry_run_logs_without_running_git() { + let content = "[submodules]\nauto_init = true\n"; + let flags = StartFlags { + dry_run: true, + ..Default::default() + }; + let (_fx, io, _resolver, _repo_root, git, _fk, result) = + start_with_config(content, None, &flags); + result.unwrap(); + + assert_eq!(git.submodule_update_calls(), 0); + assert!(io.stderr_text().contains("Would run: git -C")); + assert!(io + .stderr_text() + .contains("submodule update --init --recursive")); +} + +#[test] +fn submodules_auto_init_failure_aborts_remaining_operations() { + let content = "[submodules]\nauto_init = true\n[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n"; + let (_fx, _io, _resolver, _repo_root, _git, fk, result) = + start_with_config(content, Some(&["-C"]), &StartFlags::default()); + + assert!(result.is_err()); + assert!(fk.hooks.calls.borrow().is_empty()); + assert!(fk.exec.file_copies.lock().unwrap().is_empty()); +} + // --- claude-code worktree hook mode: stdout path --- #[test] diff --git a/rust/crates/vibe-core/src/config.rs b/rust/crates/vibe-core/src/config.rs index d9df1a5..b677cc9 100644 --- a/rust/crates/vibe-core/src/config.rs +++ b/rust/crates/vibe-core/src/config.rs @@ -22,6 +22,8 @@ pub struct VibeConfig { pub worktree: Option, #[serde(skip_serializing_if = "Option::is_none")] pub clean: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub submodules: Option, } #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] @@ -87,6 +89,13 @@ pub struct CleanConfig { pub delete_branch: Option, } +#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct SubmodulesConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub auto_init: Option, +} + /// Parse a `VibeConfig` from TOML text, validating it like the Zod schema. /// /// `file_path` is woven into the error message exactly as the TS @@ -222,6 +231,16 @@ pub fn merge_configs(base: &VibeConfig, local: &VibeConfig) -> VibeConfig { merged.clean = Some(CleanConfig { delete_branch }); } + // submodules: present if either side has it; auto_init local > base. + if base.submodules.is_some() || local.submodules.is_some() { + let auto_init = local + .submodules + .as_ref() + .and_then(|s| s.auto_init) + .or_else(|| base.submodules.as_ref().and_then(|s| s.auto_init)); + merged.submodules = Some(SubmodulesConfig { auto_init }); + } + merged } @@ -448,6 +467,47 @@ mod tests { ); } + #[test] + fn submodules_local_auto_init_wins() { + let base = VibeConfig { + submodules: Some(SubmodulesConfig { + auto_init: Some(false), + }), + ..Default::default() + }; + let local = VibeConfig { + submodules: Some(SubmodulesConfig { + auto_init: Some(true), + }), + ..Default::default() + }; + assert_eq!( + merge_configs(&base, &local).submodules.unwrap().auto_init, + Some(true) + ); + } + + #[test] + fn submodules_base_auto_init_survives_with_unrelated_local() { + let base = VibeConfig { + submodules: Some(SubmodulesConfig { + auto_init: Some(true), + }), + ..Default::default() + }; + let local = VibeConfig { + copy: Some(CopyConfig { + files: Some(vec!["x".into()]), + ..Default::default() + }), + ..Default::default() + }; + assert_eq!( + merge_configs(&base, &local).submodules.unwrap().auto_init, + Some(true) + ); + } + // --- parse_vibe_config --- #[test] @@ -474,16 +534,26 @@ path_script = "p.sh" [clean] delete_branch = true + +[submodules] +auto_init = true "#; let cfg = parse_vibe_config(toml, "/p/.vibe.toml").unwrap(); assert_eq!(cfg.copy.as_ref().unwrap().concurrency, Some(8)); assert_eq!(cfg.clean.as_ref().unwrap().delete_branch, Some(true)); + assert_eq!(cfg.submodules.as_ref().unwrap().auto_init, Some(true)); assert_eq!( cfg.worktree.as_ref().unwrap().path_script.as_deref(), Some("p.sh") ); } + #[test] + fn parses_submodules_auto_init_true() { + let cfg = parse_vibe_config("[submodules]\nauto_init = true\n", "/p/.vibe.toml").unwrap(); + assert_eq!(cfg.submodules.unwrap().auto_init, Some(true)); + } + #[test] fn rejects_unknown_top_level_property() { let err = parse_vibe_config("unknown_property = true\n", "/path/.vibe.toml").unwrap_err(); @@ -498,6 +568,13 @@ delete_branch = true assert!(err.to_string().contains("/path/.vibe.toml")); } + #[test] + fn rejects_unknown_submodules_field() { + let toml = "[submodules]\nbogus = 1\n"; + let err = parse_vibe_config(toml, "/path/.vibe.toml").unwrap_err(); + assert!(err.to_string().contains("/path/.vibe.toml")); + } + #[test] fn rejects_concurrency_below_minimum() { let err = parse_vibe_config("[copy]\nconcurrency = 0\n", "/path/.vibe.toml").unwrap_err(); From fc3d198a9dc4315b67783b14a9708ea07e156486 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Mon, 22 Jun 2026 21:25:07 +0900 Subject: [PATCH 04/17] Revert "feat: add submodule auto init config" --- .../src/content/docs/configuration/hooks.mdx | 46 +++-- .../content/docs/configuration/vibe-toml.mdx | 18 -- .../content/docs/ja/configuration/hooks.mdx | 36 ++-- .../docs/ja/configuration/vibe-toml.mdx | 18 -- rust/crates/vibe-core/src/commands/start.rs | 70 +------- .../vibe-core/src/commands/start_tests.rs | 169 +----------------- rust/crates/vibe-core/src/config.rs | 77 -------- 7 files changed, 43 insertions(+), 391 deletions(-) diff --git a/packages/docs/src/content/docs/configuration/hooks.mdx b/packages/docs/src/content/docs/configuration/hooks.mdx index 10cd1da..e53377f 100644 --- a/packages/docs/src/content/docs/configuration/hooks.mdx +++ b/packages/docs/src/content/docs/configuration/hooks.mdx @@ -9,12 +9,12 @@ Hooks allow you to run commands automatically during the worktree lifecycle. ## Available Hooks -| Hook | When | Working Directory | -| ------------ | ----------------------- | ----------------- | -| `pre_start` | After worktree creation | Origin repository | -| `post_start` | After worktree creation | New worktree | -| `pre_clean` | Before worktree removal | Current worktree | -| `post_clean` | After worktree removal | Main repository | +| Hook | When | Working Directory | +| ------------ | ------------------------ | ----------------- | +| `pre_start` | Before worktree creation | Origin repository | +| `post_start` | After worktree creation | New worktree | +| `pre_clean` | Before worktree removal | Current worktree | +| `post_clean` | After worktree removal | Main repository | ## Configuration @@ -78,11 +78,10 @@ Progress display auto-disables in non-TTY environments (e.g., CI/CD), and hook o For `vibe start`: -1. Worktree is created -2. Submodules are initialized when `[submodules] auto_init = true` -3. `pre_start` hooks run in origin repository -4. Files/directories are copied -5. `post_start` hooks run in new worktree +1. `pre_start` hooks run in origin repository +2. Worktree is created +3. Files/directories are copied +4. `post_start` hooks run in new worktree For `vibe clean`: @@ -139,17 +138,15 @@ pre_clean = ["docker-compose down"] ### Git Submodules -Prefer first-class submodule initialization when recursive defaults are enough: - ```toml -[submodules] -auto_init = true +[hooks] +post_start = [ + "git submodule update --init --recursive || true" +] ``` -This runs `git submodule update --init --recursive` in the new worktree before `pre_start` hooks. Failures abort `vibe start` so authentication and network errors are visible. - -:::note -Use a hook instead when you need custom submodule behavior, such as non-recursive updates, filtered updates, or intentionally ignoring failures. +:::tip +`|| true` prevents the hook from failing when submodule initialization encounters network issues. Remove it if you want strict error handling. ::: ## Skipping Hooks @@ -202,12 +199,11 @@ When Claude Code creates a worktree (via natural language, `isolation: "worktree **WorktreeCreate:** 1. Reads worktree name from stdin (Claude Code hook protocol) -2. Creates the git worktree -3. Initializes submodules when `[submodules] auto_init = true` -4. Runs `pre_start` hooks in the origin repository -5. Copies files/directories using CoW -6. Runs `post_start` hooks in the new worktree (e.g., `pnpm install`) -7. Outputs the worktree path to stdout for Claude Code +2. Runs `pre_start` hooks in the origin repository +3. Creates the git worktree +4. Copies files/directories using CoW +5. Runs `post_start` hooks in the new worktree (e.g., `pnpm install`) +6. Outputs the worktree path to stdout for Claude Code **WorktreeRemove:** diff --git a/packages/docs/src/content/docs/configuration/vibe-toml.mdx b/packages/docs/src/content/docs/configuration/vibe-toml.mdx index 133b5f9..274c63b 100644 --- a/packages/docs/src/content/docs/configuration/vibe-toml.mdx +++ b/packages/docs/src/content/docs/configuration/vibe-toml.mdx @@ -116,21 +116,6 @@ vibe automatically selects the best copy strategy based on your system: See [Hooks](/configuration/hooks/) for details on configuring pre/post hooks. -## Submodules Configuration - -Initialize git submodules automatically after the worktree is created and before `pre_start` hooks run: - -```toml -[submodules] -auto_init = true -``` - -- **Default**: `false` -- Runs `git submodule update --init --recursive` in the new worktree -- `--no-hooks` does not skip submodule initialization -- Repositories without `.gitmodules` are treated as a successful no-op by git -- Submodule update failures abort `vibe start` and leave the created worktree available for inspection - ## Worktree Configuration Customize the worktree directory path using an external script. @@ -191,9 +176,6 @@ post_start = [ pre_clean = ["git stash"] post_clean = ["echo 'Cleanup complete'"] -[submodules] -auto_init = true - [worktree] path_script = "~/.config/vibe/worktree-path.sh" ``` diff --git a/packages/docs/src/content/docs/ja/configuration/hooks.mdx b/packages/docs/src/content/docs/ja/configuration/hooks.mdx index 65af272..fcd77cb 100644 --- a/packages/docs/src/content/docs/ja/configuration/hooks.mdx +++ b/packages/docs/src/content/docs/ja/configuration/hooks.mdx @@ -11,7 +11,7 @@ sidebar: | フック | 実行タイミング | 作業ディレクトリ | | ------------ | -------------- | ---------------- | -| `pre_start` | Worktree作成後 | 元リポジトリ | +| `pre_start` | Worktree作成前 | 元リポジトリ | | `post_start` | Worktree作成後 | 新しいWorktree | | `pre_clean` | Worktree削除前 | 現在のWorktree | | `post_clean` | Worktree削除後 | メインリポジトリ | @@ -78,11 +78,10 @@ vibeはフック実行中にリアルタイム進捗ツリーを表示します `vibe start`の場合: -1. Worktreeが作成される -2. `[submodules] auto_init = true`の場合、サブモジュールが初期化される -3. `pre_start`フックが元リポジトリで実行 -4. ファイル/ディレクトリがコピーされる -5. `post_start`フックが新しいWorktreeで実行 +1. `pre_start`フックが元リポジトリで実行 +2. Worktreeが作成される +3. ファイル/ディレクトリがコピーされる +4. `post_start`フックが新しいWorktreeで実行 `vibe clean`の場合: @@ -139,17 +138,15 @@ pre_clean = ["docker-compose down"] ### Gitサブモジュール -再帰的な既定動作で十分な場合は、ファーストクラスのサブモジュール初期化を優先してください: - ```toml -[submodules] -auto_init = true +[hooks] +post_start = [ + "git submodule update --init --recursive || true" +] ``` -これは新しいWorktree内で、`pre_start`フックより前に`git submodule update --init --recursive`を実行します。失敗時は`vibe start`を中断するため、認証やネットワークの問題が見える状態になります。 - -:::note -非再帰更新、フィルタ付き更新、失敗を意図的に無視する場合など、カスタムのサブモジュール動作が必要な場合はフックを使用してください。 +:::tip +`|| true`を付けることで、ネットワークエラー等でサブモジュールの初期化に失敗してもフック全体が失敗しません。厳密なエラーハンドリングが必要な場合は除去してください。 ::: ## フックのスキップ @@ -202,12 +199,11 @@ Claude CodeがWorktreeを作成する場合(自然言語、`isolation: "worktr **WorktreeCreate:** 1. stdinからWorktree名を読み取り(Claude Codeフックプロトコル) -2. git Worktreeを作成 -3. `[submodules] auto_init = true`の場合、サブモジュールを初期化 -4. 元リポジトリで`pre_start`フックを実行 -5. CoWを使用してファイル/ディレクトリをコピー -6. 新しいWorktreeで`post_start`フックを実行(例:`pnpm install`) -7. Claude Code向けにWorktreeパスをstdoutに出力 +2. 元リポジトリで`pre_start`フックを実行 +3. git Worktreeを作成 +4. CoWを使用してファイル/ディレクトリをコピー +5. 新しいWorktreeで`post_start`フックを実行(例:`pnpm install`) +6. Claude Code向けにWorktreeパスをstdoutに出力 **WorktreeRemove:** diff --git a/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx b/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx index 23b3ae4..767f681 100644 --- a/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx +++ b/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx @@ -116,21 +116,6 @@ vibeはシステムに応じて最適なコピー戦略を自動選択します フック設定の詳細は[フック](/ja/configuration/hooks/)を参照してください。 -## サブモジュール設定 - -Worktree作成後、`pre_start`フックの実行前にgitサブモジュールを自動初期化します: - -```toml -[submodules] -auto_init = true -``` - -- **デフォルト**: `false` -- 新しいWorktree内で`git submodule update --init --recursive`を実行します -- `--no-hooks`ではサブモジュール初期化はスキップされません -- `.gitmodules`がないリポジトリでは、gitにより成功したno-opとして扱われます -- サブモジュール更新に失敗すると`vibe start`は中断され、作成済みWorktreeは調査用に残ります - ## Worktree設定 外部スクリプトを使用してWorktreeディレクトリパスをカスタマイズできます。 @@ -191,9 +176,6 @@ post_start = [ pre_clean = ["git stash"] post_clean = ["echo 'クリーンアップ完了'"] -[submodules] -auto_init = true - [worktree] path_script = "~/.config/vibe/worktree-path.sh" ``` diff --git a/rust/crates/vibe-core/src/commands/start.rs b/rust/crates/vibe-core/src/commands/start.rs index ff736a9..0b381f0 100644 --- a/rust/crates/vibe-core/src/commands/start.rs +++ b/rust/crates/vibe-core/src/commands/start.rs @@ -3,8 +3,7 @@ //! Ported from `packages/core/src/commands/start.ts`. The validation cascade, //! existing-branch navigate, same-branch idempotent re-entry, different-branch //! Overwrite/Reuse/Cancel select, worktree creation, and the -//! submodule init → pre_start → copy → post_start config-and-hooks sequence -//! mirror the TS. The +//! pre_start → copy → post_start config-and-hooks sequence mirror the TS. The //! Claude-Code `--claude-code-worktree-hook` mode reads a name from stdin and //! outputs the worktree PATH to stdout (not a `cd`), with non-fatal post-setup. //! @@ -502,8 +501,8 @@ where ))) } -/// Run config-driven operations: submodule init → pre_start (in repo_root) → -/// copy files + dirs → post_start (in worktree_path). +/// Run config-driven hooks + copy: pre_start (in repo_root) → copy files + dirs → +/// post_start (in worktree_path). fn run_config_and_hooks( deps: &StartDeps, config: Option<&VibeConfig>, @@ -531,8 +530,6 @@ where deps.tracker.start(); } - init_submodules(deps, config, worktree_path, options.dry_run)?; - // pre_start hooks (in repo_root). if !options.skip_hooks { run_lifecycle_hooks( @@ -613,7 +610,6 @@ where /// Whether config has any hook/copy operation (drives starting the tracker). fn config_has_operations(config: &VibeConfig, options: &ConfigAndHooks) -> bool { - let has_submodule_init = submodules_auto_init_enabled(config); let hooks_count = if options.skip_hooks { 0 } else { @@ -638,65 +634,7 @@ fn config_has_operations(config: &VibeConfig, options: &ConfigAndHooks) -> bool }) .unwrap_or(0) }; - has_submodule_init || hooks_count + copy_count > 0 -} - -fn submodules_auto_init_enabled(config: &VibeConfig) -> bool { - config - .submodules - .as_ref() - .and_then(|s| s.auto_init) - .unwrap_or(false) -} - -fn init_submodules( - deps: &StartDeps, - config: &VibeConfig, - worktree_path: &str, - dry_run: bool, -) -> Result<()> -where - I: Io, - G: GitRunner, - R: RepoResolver, - S: ScriptRunner, - P: Prompt, - Sr: StdinReader, -{ - if !submodules_auto_init_enabled(config) { - return Ok(()); - } - - let command = format!("git -C {worktree_path} submodule update --init --recursive"); - if dry_run { - log_dry_run(deps.io, &format!("Would run: {command}")); - return Ok(()); - } - - let phase = deps.tracker.add_phase("Initializing submodules"); - let task = deps - .tracker - .add_task(phase, "git submodule update --init --recursive"); - deps.tracker.start_task(task); - let result = deps.git.run(&[ - "-C", - worktree_path, - "submodule", - "update", - "--init", - "--recursive", - ]); - - match result { - Ok(_) => { - deps.tracker.complete_task(task); - Ok(()) - } - Err(err) => { - deps.tracker.fail_task(task, &err.to_string()); - Err(err) - } - } + hooks_count + copy_count > 0 } /// Run a lifecycle hook list with a phase/tasks on the tracker. diff --git a/rust/crates/vibe-core/src/commands/start_tests.rs b/rust/crates/vibe-core/src/commands/start_tests.rs index b7c59f3..01434a0 100644 --- a/rust/crates/vibe-core/src/commands/start_tests.rs +++ b/rust/crates/vibe-core/src/commands/start_tests.rs @@ -7,7 +7,7 @@ use crate::error::VibeError; use crate::git::RepoInfo; use crate::hooks::FakeHookRunner; use crate::io::FakeIo; -use crate::progress::{RecordingTracker, TrackerEvent}; +use crate::progress::RecordingTracker; use crate::stdin::FakeStdin; use crate::worktree_path::ScriptOutput; use std::cell::RefCell; @@ -23,7 +23,6 @@ struct MockGit { local_branches: Vec, remote_branches: Vec, existing_revisions: Vec, - fail_prefix: Option>, pub calls: RefCell>>, } @@ -35,7 +34,6 @@ impl MockGit { local_branches: vec![], remote_branches: vec![], existing_revisions: vec![], - fail_prefix: None, calls: RefCell::new(vec![]), } } @@ -43,28 +41,12 @@ impl MockGit { self.existing_revisions.push(r.to_string()); self } - fn failing_on(mut self, prefix: &[&str]) -> Self { - self.fail_prefix = Some(prefix.iter().map(|s| s.to_string()).collect()); - self - } fn calls_contain(&self, prefix: &[&str]) -> bool { self.calls .borrow() .iter() .any(|c| c.len() >= prefix.len() && c[..prefix.len()] == *prefix) } - fn submodule_update_calls(&self) -> usize { - self.calls - .borrow() - .iter() - .filter(|c| { - c.iter().any(|arg| arg == "submodule") - && c.iter().any(|arg| arg == "update") - && c.iter().any(|arg| arg == "--init") - && c.iter().any(|arg| arg == "--recursive") - }) - .count() - } } impl GitRunner for MockGit { @@ -73,21 +55,6 @@ impl GitRunner for MockGit { .borrow_mut() .push(args.iter().map(|s| s.to_string()).collect()); - if let Some(prefix) = &self.fail_prefix { - let is_matching_prefix = args.len() >= prefix.len() - && args - .iter() - .take(prefix.len()) - .zip(prefix.iter()) - .all(|(actual, expected)| actual == expected); - if is_matching_prefix { - return Err(VibeError::GitOperation { - command: args.join(" "), - message: "failed: submodule update".into(), - }); - } - } - if args.contains(&"--show-toplevel") { return Ok(self.repo_root.clone()); } @@ -733,12 +700,6 @@ fn different_branch_cancel_emits_no_cd() { /// Build a trusted-config fixture + resolver, returning (fixture, io, resolver, /// repo_root). The config has a pre_start, a copy file, and a post_start hook. fn trusted_config_repo() -> (Fixture, FakeIo, TrustResolver, String) { - trusted_config_repo_with_content( - "[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n", - ) -} - -fn trusted_config_repo_with_content(content: &str) -> (Fixture, FakeIo, TrustResolver, String) { use crate::hash::hash_content; use crate::settings::{AllowEntry, RepoId, VibeSettings}; use crate::settings_io::save_user_settings; @@ -746,6 +707,7 @@ fn trusted_config_repo_with_content(content: &str) -> (Fixture, FakeIo, TrustRes let fx = Fixture::new(); let repo = fx.mkdir("repo"); + let content = "[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n"; fx.write("repo/.vibe.toml", content); fx.write("repo/.env", "SECRET=1"); @@ -780,49 +742,6 @@ fn trusted_config_repo_with_content(content: &str) -> (Fixture, FakeIo, TrustRes ) } -fn start_with_config( - content: &str, - fail_prefix: Option<&[&str]>, - flags: &StartFlags, -) -> ( - Fixture, - FakeIo, - TrustResolver, - String, - MockGit, - Fakes, - Result, -) { - let (fx, io, resolver, repo_root) = trusted_config_repo_with_content(content); - let mut git = MockGit::new( - &repo_root, - &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), - ); - if let Some(prefix) = fail_prefix { - git = git.failing_on(prefix); - } - let s = NoScript; - let p = ScriptPrompt::confirming(true); - let sin = FakeStdin::none(); - let fk = Fakes::new(); - let result = { - let d = StartDeps { - io: &io, - git: &git, - resolver: &resolver, - script_runner: &s, - prompt: &p, - stdin: &sin, - hook_runner: &fk.hooks, - executor: &fk.exec, - tracker: &fk.tracker, - version: V, - }; - start_command(&d, "feat", flags, OutputOptions::default()) - }; - (fx, io, resolver, repo_root, git, fk, result) -} - struct TrustResolver { repos: std::collections::HashMap, } @@ -911,90 +830,6 @@ fn no_hooks_and_no_copy_skip_operations() { assert!(fk.exec.file_copies.lock().unwrap().is_empty()); } -#[test] -fn submodules_auto_init_runs_before_pre_start() { - let content = "[submodules]\nauto_init = true\n[hooks]\npre_start = [\"echo pre\"]\n"; - let (_fx, _io, _resolver, repo_root, git, fk, result) = - start_with_config(content, None, &StartFlags::default()); - result.unwrap(); - - assert!(git.calls_contain(&[ - "-C", - &format!("{}-feat", repo_root), - "submodule", - "update", - "--init", - "--recursive" - ])); - let events = fk.tracker.events(); - let submodule_phase = events.iter().position( - |event| matches!(event, TrackerEvent::Phase(label) if label == "Initializing submodules"), - ); - let pre_start_phase = events.iter().position( - |event| matches!(event, TrackerEvent::Phase(label) if label == "Pre-start hooks"), - ); - assert!(submodule_phase.is_some()); - assert!(pre_start_phase.is_some()); - assert!(submodule_phase < pre_start_phase); -} - -#[test] -fn submodules_auto_init_false_and_omitted_do_not_run() { - for content in [ - "[submodules]\nauto_init = false\n", - "[hooks]\npre_start = [\"echo pre\"]\n", - ] { - let (_fx, _io, _resolver, _repo_root, git, _fk, result) = - start_with_config(content, None, &StartFlags::default()); - result.unwrap(); - assert_eq!(git.submodule_update_calls(), 0); - } -} - -#[test] -fn submodules_auto_init_runs_with_no_hooks() { - let content = "[submodules]\nauto_init = true\n[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n"; - let flags = StartFlags { - no_hooks: true, - ..Default::default() - }; - let (_fx, _io, _resolver, _repo_root, git, fk, result) = - start_with_config(content, None, &flags); - result.unwrap(); - - assert_eq!(git.submodule_update_calls(), 1); - assert!(fk.hooks.calls.borrow().is_empty()); -} - -#[test] -fn submodules_auto_init_dry_run_logs_without_running_git() { - let content = "[submodules]\nauto_init = true\n"; - let flags = StartFlags { - dry_run: true, - ..Default::default() - }; - let (_fx, io, _resolver, _repo_root, git, _fk, result) = - start_with_config(content, None, &flags); - result.unwrap(); - - assert_eq!(git.submodule_update_calls(), 0); - assert!(io.stderr_text().contains("Would run: git -C")); - assert!(io - .stderr_text() - .contains("submodule update --init --recursive")); -} - -#[test] -fn submodules_auto_init_failure_aborts_remaining_operations() { - let content = "[submodules]\nauto_init = true\n[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n"; - let (_fx, _io, _resolver, _repo_root, _git, fk, result) = - start_with_config(content, Some(&["-C"]), &StartFlags::default()); - - assert!(result.is_err()); - assert!(fk.hooks.calls.borrow().is_empty()); - assert!(fk.exec.file_copies.lock().unwrap().is_empty()); -} - // --- claude-code worktree hook mode: stdout path --- #[test] diff --git a/rust/crates/vibe-core/src/config.rs b/rust/crates/vibe-core/src/config.rs index b677cc9..d9df1a5 100644 --- a/rust/crates/vibe-core/src/config.rs +++ b/rust/crates/vibe-core/src/config.rs @@ -22,8 +22,6 @@ pub struct VibeConfig { pub worktree: Option, #[serde(skip_serializing_if = "Option::is_none")] pub clean: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub submodules: Option, } #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] @@ -89,13 +87,6 @@ pub struct CleanConfig { pub delete_branch: Option, } -#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct SubmodulesConfig { - #[serde(skip_serializing_if = "Option::is_none")] - pub auto_init: Option, -} - /// Parse a `VibeConfig` from TOML text, validating it like the Zod schema. /// /// `file_path` is woven into the error message exactly as the TS @@ -231,16 +222,6 @@ pub fn merge_configs(base: &VibeConfig, local: &VibeConfig) -> VibeConfig { merged.clean = Some(CleanConfig { delete_branch }); } - // submodules: present if either side has it; auto_init local > base. - if base.submodules.is_some() || local.submodules.is_some() { - let auto_init = local - .submodules - .as_ref() - .and_then(|s| s.auto_init) - .or_else(|| base.submodules.as_ref().and_then(|s| s.auto_init)); - merged.submodules = Some(SubmodulesConfig { auto_init }); - } - merged } @@ -467,47 +448,6 @@ mod tests { ); } - #[test] - fn submodules_local_auto_init_wins() { - let base = VibeConfig { - submodules: Some(SubmodulesConfig { - auto_init: Some(false), - }), - ..Default::default() - }; - let local = VibeConfig { - submodules: Some(SubmodulesConfig { - auto_init: Some(true), - }), - ..Default::default() - }; - assert_eq!( - merge_configs(&base, &local).submodules.unwrap().auto_init, - Some(true) - ); - } - - #[test] - fn submodules_base_auto_init_survives_with_unrelated_local() { - let base = VibeConfig { - submodules: Some(SubmodulesConfig { - auto_init: Some(true), - }), - ..Default::default() - }; - let local = VibeConfig { - copy: Some(CopyConfig { - files: Some(vec!["x".into()]), - ..Default::default() - }), - ..Default::default() - }; - assert_eq!( - merge_configs(&base, &local).submodules.unwrap().auto_init, - Some(true) - ); - } - // --- parse_vibe_config --- #[test] @@ -534,26 +474,16 @@ path_script = "p.sh" [clean] delete_branch = true - -[submodules] -auto_init = true "#; let cfg = parse_vibe_config(toml, "/p/.vibe.toml").unwrap(); assert_eq!(cfg.copy.as_ref().unwrap().concurrency, Some(8)); assert_eq!(cfg.clean.as_ref().unwrap().delete_branch, Some(true)); - assert_eq!(cfg.submodules.as_ref().unwrap().auto_init, Some(true)); assert_eq!( cfg.worktree.as_ref().unwrap().path_script.as_deref(), Some("p.sh") ); } - #[test] - fn parses_submodules_auto_init_true() { - let cfg = parse_vibe_config("[submodules]\nauto_init = true\n", "/p/.vibe.toml").unwrap(); - assert_eq!(cfg.submodules.unwrap().auto_init, Some(true)); - } - #[test] fn rejects_unknown_top_level_property() { let err = parse_vibe_config("unknown_property = true\n", "/path/.vibe.toml").unwrap_err(); @@ -568,13 +498,6 @@ auto_init = true assert!(err.to_string().contains("/path/.vibe.toml")); } - #[test] - fn rejects_unknown_submodules_field() { - let toml = "[submodules]\nbogus = 1\n"; - let err = parse_vibe_config(toml, "/path/.vibe.toml").unwrap_err(); - assert!(err.to_string().contains("/path/.vibe.toml")); - } - #[test] fn rejects_concurrency_below_minimum() { let err = parse_vibe_config("[copy]\nconcurrency = 0\n", "/path/.vibe.toml").unwrap_err(); From d7dc669fd6b7e46c5113790443bab27ce6c53b73 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Mon, 22 Jun 2026 21:48:06 +0900 Subject: [PATCH 05/17] feat: read trusted submodule configs --- .../src/content/docs/configuration/hooks.mdx | 47 ++- .../content/docs/configuration/vibe-toml.mdx | 21 + .../content/docs/ja/configuration/hooks.mdx | 37 +- .../docs/ja/configuration/vibe-toml.mdx | 21 + rust/crates/vibe-core/src/commands/start.rs | 324 ++++++++++++++- .../vibe-core/src/commands/start_tests.rs | 389 +++++++++++++++++- rust/crates/vibe-core/src/config.rs | 84 ++++ 7 files changed, 876 insertions(+), 47 deletions(-) diff --git a/packages/docs/src/content/docs/configuration/hooks.mdx b/packages/docs/src/content/docs/configuration/hooks.mdx index e53377f..70b88ec 100644 --- a/packages/docs/src/content/docs/configuration/hooks.mdx +++ b/packages/docs/src/content/docs/configuration/hooks.mdx @@ -9,12 +9,12 @@ Hooks allow you to run commands automatically during the worktree lifecycle. ## Available Hooks -| Hook | When | Working Directory | -| ------------ | ------------------------ | ----------------- | -| `pre_start` | Before worktree creation | Origin repository | -| `post_start` | After worktree creation | New worktree | -| `pre_clean` | Before worktree removal | Current worktree | -| `post_clean` | After worktree removal | Main repository | +| Hook | When | Working Directory | +| ------------ | ----------------------- | ----------------- | +| `pre_start` | After worktree creation | Origin repository | +| `post_start` | After worktree creation | New worktree | +| `pre_clean` | Before worktree removal | Current worktree | +| `post_clean` | After worktree removal | Main repository | ## Configuration @@ -78,10 +78,12 @@ Progress display auto-disables in non-TTY environments (e.g., CI/CD), and hook o For `vibe start`: -1. `pre_start` hooks run in origin repository -2. Worktree is created -3. Files/directories are copied -4. `post_start` hooks run in new worktree +1. Worktree is created +2. Listed submodules are initialized when `[submodules] configs = [...]` +3. Each listed submodule's trusted `pre_start`, copy rules, and `post_start` run from that submodule root +4. Parent `pre_start` hooks run in origin repository +5. Parent files/directories are copied +6. Parent `post_start` hooks run in new worktree For `vibe clean`: @@ -138,15 +140,17 @@ pre_clean = ["docker-compose down"] ### Git Submodules +Use first-class submodule configs when a direct submodule has its own setup files or hooks: + ```toml -[hooks] -post_start = [ - "git submodule update --init --recursive || true" -] +[submodules] +configs = ["libs/foo"] ``` -:::tip -`|| true` prevents the hook from failing when submodule initialization encounters network issues. Remove it if you want strict error handling. +This runs `git submodule update --init -- libs/foo` in the new worktree, then loads `libs/foo/.vibe.toml` through the normal trust store. The submodule's copy rules and hooks resolve paths from `libs/foo`, and they run before the parent repository's `pre_start` hooks. + +:::note +Use a hook instead when you need custom submodule behavior, such as recursive updates, filtered updates, or intentionally ignoring failures. ::: ## Skipping Hooks @@ -199,11 +203,12 @@ When Claude Code creates a worktree (via natural language, `isolation: "worktree **WorktreeCreate:** 1. Reads worktree name from stdin (Claude Code hook protocol) -2. Runs `pre_start` hooks in the origin repository -3. Creates the git worktree -4. Copies files/directories using CoW -5. Runs `post_start` hooks in the new worktree (e.g., `pnpm install`) -6. Outputs the worktree path to stdout for Claude Code +2. Creates the git worktree +3. Initializes listed submodules and runs their trusted setup when `[submodules] configs = [...]` +4. Runs parent `pre_start` hooks in the origin repository +5. Copies parent files/directories using CoW +6. Runs parent `post_start` hooks in the new worktree (e.g., `pnpm install`) +7. Outputs the worktree path to stdout for Claude Code **WorktreeRemove:** diff --git a/packages/docs/src/content/docs/configuration/vibe-toml.mdx b/packages/docs/src/content/docs/configuration/vibe-toml.mdx index 274c63b..774c926 100644 --- a/packages/docs/src/content/docs/configuration/vibe-toml.mdx +++ b/packages/docs/src/content/docs/configuration/vibe-toml.mdx @@ -116,6 +116,24 @@ vibe automatically selects the best copy strategy based on your system: See [Hooks](/configuration/hooks/) for details on configuring pre/post hooks. +## Submodules Configuration + +Load trusted `.vibe.toml` files from selected direct submodules after the worktree is created and before the parent repository's `pre_start` hooks run: + +```toml +[submodules] +configs = ["libs/foo", "vendor/bar"] +``` + +- **Default**: `[]` +- Each entry must exactly match a direct submodule path in `.gitmodules` +- Runs `git submodule update --init -- ` in the new worktree +- Loads each submodule's `.vibe.toml` / `.vibe.local.toml` with that submodule's own trust entry +- Runs the submodule config's hooks and copy rules with paths resolved from the submodule root +- `--no-hooks` skips submodule hooks, but does not skip submodule initialization +- `--no-copy` skips submodule copy rules +- Submodule update, trust, path validation, or setup failures abort `vibe start` and leave the created worktree available for inspection + ## Worktree Configuration Customize the worktree directory path using an external script. @@ -176,6 +194,9 @@ post_start = [ pre_clean = ["git stash"] post_clean = ["echo 'Cleanup complete'"] +[submodules] +configs = ["libs/foo"] + [worktree] path_script = "~/.config/vibe/worktree-path.sh" ``` diff --git a/packages/docs/src/content/docs/ja/configuration/hooks.mdx b/packages/docs/src/content/docs/ja/configuration/hooks.mdx index fcd77cb..e830a85 100644 --- a/packages/docs/src/content/docs/ja/configuration/hooks.mdx +++ b/packages/docs/src/content/docs/ja/configuration/hooks.mdx @@ -11,7 +11,7 @@ sidebar: | フック | 実行タイミング | 作業ディレクトリ | | ------------ | -------------- | ---------------- | -| `pre_start` | Worktree作成前 | 元リポジトリ | +| `pre_start` | Worktree作成後 | 元リポジトリ | | `post_start` | Worktree作成後 | 新しいWorktree | | `pre_clean` | Worktree削除前 | 現在のWorktree | | `post_clean` | Worktree削除後 | メインリポジトリ | @@ -78,10 +78,12 @@ vibeはフック実行中にリアルタイム進捗ツリーを表示します `vibe start`の場合: -1. `pre_start`フックが元リポジトリで実行 -2. Worktreeが作成される -3. ファイル/ディレクトリがコピーされる -4. `post_start`フックが新しいWorktreeで実行 +1. Worktreeが作成される +2. `[submodules] configs = [...]`の場合、指定されたサブモジュールが初期化される +3. 各サブモジュールの信頼済み`pre_start`、copyルール、`post_start`がサブモジュールルート基準で実行される +4. 親の`pre_start`フックが元リポジトリで実行 +5. 親のファイル/ディレクトリがコピーされる +6. 親の`post_start`フックが新しいWorktreeで実行 `vibe clean`の場合: @@ -138,15 +140,17 @@ pre_clean = ["docker-compose down"] ### Gitサブモジュール +直接サブモジュールに独自のsetupファイルやフックがある場合は、ファーストクラスのサブモジュール設定を使用してください: + ```toml -[hooks] -post_start = [ - "git submodule update --init --recursive || true" -] +[submodules] +configs = ["libs/foo"] ``` -:::tip -`|| true`を付けることで、ネットワークエラー等でサブモジュールの初期化に失敗してもフック全体が失敗しません。厳密なエラーハンドリングが必要な場合は除去してください。 +これは新しいWorktree内で`git submodule update --init -- libs/foo`を実行し、その後`libs/foo/.vibe.toml`を通常のtrust store経由で読み込みます。サブモジュールのcopyルールとフックは`libs/foo`基準で解決され、親リポジトリの`pre_start`フックより前に実行されます。 + +:::note +再帰更新、フィルタ付き更新、失敗を意図的に無視する場合など、カスタムのサブモジュール動作が必要な場合はフックを使用してください。 ::: ## フックのスキップ @@ -199,11 +203,12 @@ Claude CodeがWorktreeを作成する場合(自然言語、`isolation: "worktr **WorktreeCreate:** 1. stdinからWorktree名を読み取り(Claude Codeフックプロトコル) -2. 元リポジトリで`pre_start`フックを実行 -3. git Worktreeを作成 -4. CoWを使用してファイル/ディレクトリをコピー -5. 新しいWorktreeで`post_start`フックを実行(例:`pnpm install`) -6. Claude Code向けにWorktreeパスをstdoutに出力 +2. git Worktreeを作成 +3. `[submodules] configs = [...]`の場合、指定されたサブモジュールを初期化し、信頼済みsetupを実行 +4. 元リポジトリで親の`pre_start`フックを実行 +5. CoWを使用して親のファイル/ディレクトリをコピー +6. 新しいWorktreeで親の`post_start`フックを実行(例:`pnpm install`) +7. Claude Code向けにWorktreeパスをstdoutに出力 **WorktreeRemove:** diff --git a/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx b/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx index 767f681..b7127d3 100644 --- a/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx +++ b/packages/docs/src/content/docs/ja/configuration/vibe-toml.mdx @@ -116,6 +116,24 @@ vibeはシステムに応じて最適なコピー戦略を自動選択します フック設定の詳細は[フック](/ja/configuration/hooks/)を参照してください。 +## サブモジュール設定 + +Worktree作成後、親リポジトリの`pre_start`フックの実行前に、指定した直接サブモジュールの信頼済み`.vibe.toml`を読み込みます: + +```toml +[submodules] +configs = ["libs/foo", "vendor/bar"] +``` + +- **デフォルト**: `[]` +- 各エントリは`.gitmodules`内の直接サブモジュールpathと完全一致する必要があります +- 新しいWorktree内で`git submodule update --init -- `を実行します +- 各サブモジュールの`.vibe.toml` / `.vibe.local.toml`は、そのサブモジュール自身のtrust entryで読み込まれます +- サブモジュール設定内のフックとcopyルールは、サブモジュールルート基準で実行されます +- `--no-hooks`はサブモジュールのフックをスキップしますが、サブモジュール初期化はスキップしません +- `--no-copy`はサブモジュールのcopyルールをスキップします +- サブモジュール更新、trust、path検証、setupのいずれかに失敗すると`vibe start`は中断され、作成済みWorktreeは調査用に残ります + ## Worktree設定 外部スクリプトを使用してWorktreeディレクトリパスをカスタマイズできます。 @@ -176,6 +194,9 @@ post_start = [ pre_clean = ["git stash"] post_clean = ["echo 'クリーンアップ完了'"] +[submodules] +configs = ["libs/foo"] + [worktree] path_script = "~/.config/vibe/worktree-path.sh" ``` diff --git a/rust/crates/vibe-core/src/commands/start.rs b/rust/crates/vibe-core/src/commands/start.rs index 0b381f0..42ef8b6 100644 --- a/rust/crates/vibe-core/src/commands/start.rs +++ b/rust/crates/vibe-core/src/commands/start.rs @@ -3,7 +3,8 @@ //! Ported from `packages/core/src/commands/start.ts`. The validation cascade, //! existing-branch navigate, same-branch idempotent re-entry, different-branch //! Overwrite/Reuse/Cancel select, worktree creation, and the -//! pre_start → copy → post_start config-and-hooks sequence mirror the TS. The +//! submodule init → pre_start → copy → post_start config-and-hooks sequence +//! mirror the TS. The //! Claude-Code `--claude-code-worktree-hook` mode reads a name from stdin and //! outputs the worktree PATH to stdout (not a `cd`), with non-fatal post-setup. //! @@ -17,7 +18,7 @@ use crate::commands::Outcome; use crate::config::VibeConfig; -use crate::config_loader::load_vibe_config; +use crate::config_loader::{load_vibe_config, VIBE_TOML}; use crate::copy::strategies::CopyExecutor; use crate::copy_runner::{copy_directories, copy_files, resolve_copy_concurrency}; use crate::error::{Result, VibeError}; @@ -37,6 +38,8 @@ use crate::worktree_path::{resolve_worktree_path, ScriptRunner, WorktreePathCont use crate::worktree_validator::{ check_worktree_conflict, validate_branch_for_worktree, ConflictType, }; +use std::collections::HashSet; +use std::path::{Component, Path, PathBuf}; /// Flags controlling a `start` run (mirrors the TS `StartOptions`). #[derive(Debug, Clone, Default)] @@ -501,8 +504,8 @@ where ))) } -/// Run config-driven hooks + copy: pre_start (in repo_root) → copy files + dirs → -/// post_start (in worktree_path). +/// Run config-driven operations: listed submodule configs → pre_start (in +/// repo_root) → copy files + dirs → post_start (in worktree_path). fn run_config_and_hooks( deps: &StartDeps, config: Option<&VibeConfig>, @@ -530,6 +533,35 @@ where deps.tracker.start(); } + run_submodule_configs(deps, config, repo_root, worktree_path, options)?; + + run_config_body(deps, config, repo_root, worktree_path, options)?; + + if has_ops { + deps.tracker.finish(); + } + + Ok(()) +} + +/// Run hooks/copy for one already-loaded config. Submodule configs use this +/// helper directly so their own `[submodules]` section is intentionally not +/// followed recursively. +fn run_config_body( + deps: &StartDeps, + config: &VibeConfig, + repo_root: &str, + worktree_path: &str, + options: &ConfigAndHooks, +) -> Result<()> +where + I: Io, + G: GitRunner, + R: RepoResolver, + S: ScriptRunner, + P: Prompt, + Sr: StdinReader, +{ // pre_start hooks (in repo_root). if !options.skip_hooks { run_lifecycle_hooks( @@ -601,15 +633,13 @@ where )?; } - if has_ops { - deps.tracker.finish(); - } - Ok(()) } /// Whether config has any hook/copy operation (drives starting the tracker). fn config_has_operations(config: &VibeConfig, options: &ConfigAndHooks) -> bool { + let has_submodule_configs = + submodule_config_paths(config).is_some_and(|paths| !paths.is_empty()); let hooks_count = if options.skip_hooks { 0 } else { @@ -634,7 +664,283 @@ fn config_has_operations(config: &VibeConfig, options: &ConfigAndHooks) -> bool }) .unwrap_or(0) }; - hooks_count + copy_count > 0 + has_submodule_configs || hooks_count + copy_count > 0 +} + +fn submodule_config_paths(config: &VibeConfig) -> Option<&[String]> { + config + .submodules + .as_ref() + .and_then(|s| s.configs.as_deref()) +} + +fn run_submodule_configs( + deps: &StartDeps, + config: &VibeConfig, + repo_root: &str, + worktree_path: &str, + options: &ConfigAndHooks, +) -> Result<()> +where + I: Io, + G: GitRunner, + R: RepoResolver, + S: ScriptRunner, + P: Prompt, + Sr: StdinReader, +{ + let Some(paths) = submodule_config_paths(config).filter(|paths| !paths.is_empty()) else { + return Ok(()); + }; + + let paths = validate_submodule_config_paths(deps, repo_root, paths)?; + init_submodules(deps, worktree_path, &paths, options.dry_run)?; + + for path in &paths { + let roots = resolve_submodule_roots(repo_root, worktree_path, path, options.dry_run)?; + let Some(submodule_config) = + load_vibe_config(deps.io, deps.resolver, deps.version, &roots.origin)? + else { + return Err(VibeError::Configuration(format!( + "Submodule '{path}' is listed in [submodules] configs, but {}/{} does not exist", + roots.origin, VIBE_TOML + ))); + }; + + run_config_body( + deps, + &submodule_config, + &roots.origin, + &roots.worktree, + options, + )?; + } + + Ok(()) +} + +fn init_submodules( + deps: &StartDeps, + worktree_path: &str, + paths: &[String], + dry_run: bool, +) -> Result<()> +where + I: Io, + G: GitRunner, + R: RepoResolver, + S: ScriptRunner, + P: Prompt, + Sr: StdinReader, +{ + let joined_paths = paths.join(" "); + let command = format!("git -C {worktree_path} submodule update --init -- {joined_paths}"); + + if dry_run { + log_dry_run(deps.io, &format!("Would run: {command}")); + return Ok(()); + } + + let phase = deps.tracker.add_phase("Initializing submodules"); + let task = deps.tracker.add_task( + phase, + &format!("git submodule update --init -- {joined_paths}"), + ); + deps.tracker.start_task(task); + let mut args = vec!["-C", worktree_path, "submodule", "update", "--init", "--"]; + args.extend(paths.iter().map(String::as_str)); + let result = deps.git.run(&args); + + match result { + Ok(_) => { + deps.tracker.complete_task(task); + Ok(()) + } + Err(err) => { + deps.tracker.fail_task(task, &err.to_string()); + Err(err) + } + } +} + +fn validate_submodule_config_paths( + deps: &StartDeps, + repo_root: &str, + paths: &[String], +) -> Result> +where + I: Io, + G: GitRunner, + R: RepoResolver, + S: ScriptRunner, + P: Prompt, + Sr: StdinReader, +{ + let mut seen = HashSet::new(); + let mut validated = Vec::new(); + + for path in paths { + validate_submodule_config_path(path)?; + } + + let direct_submodules = direct_submodule_paths(deps, repo_root)?; + for path in paths { + let is_direct_submodule = direct_submodules.contains(path); + if !is_direct_submodule { + return Err(VibeError::Configuration(format!( + "[submodules] configs entry '{path}' must exactly match a direct path in .gitmodules" + ))); + } + let is_new = seen.insert(path.clone()); + if is_new { + validated.push(path.clone()); + } + } + + Ok(validated) +} + +fn validate_submodule_config_path(path: &str) -> Result<()> { + let has_surrounding_whitespace = path.trim() != path; + if path.is_empty() || has_surrounding_whitespace { + return Err(invalid_submodule_config_path(path)); + } + let has_control_chars = path.chars().any(char::is_control); + let has_glob_chars = path + .chars() + .any(|c| matches!(c, '*' | '?' | '[' | ']' | '{' | '}')); + if has_control_chars || has_glob_chars { + return Err(invalid_submodule_config_path(path)); + } + + let candidate = Path::new(path); + if candidate.is_absolute() { + return Err(invalid_submodule_config_path(path)); + } + + let mut has_component = false; + for component in candidate.components() { + match component { + Component::Normal(_) => has_component = true, + Component::CurDir + | Component::ParentDir + | Component::RootDir + | Component::Prefix(_) => { + return Err(invalid_submodule_config_path(path)); + } + } + } + + if !has_component { + return Err(invalid_submodule_config_path(path)); + } + + Ok(()) +} + +fn invalid_submodule_config_path(path: &str) -> VibeError { + VibeError::Configuration(format!( + "[submodules] configs entry '{path}' must be a parent-repo-relative submodule path without absolute paths, traversal, glob characters, or control characters" + )) +} + +fn direct_submodule_paths( + deps: &StartDeps, + repo_root: &str, +) -> Result> +where + I: Io, + G: GitRunner, + R: RepoResolver, + S: ScriptRunner, + P: Prompt, + Sr: StdinReader, +{ + let gitmodules = Path::new(repo_root).join(".gitmodules"); + if !gitmodules.exists() { + return Err(VibeError::Configuration( + "[submodules] configs requires a .gitmodules file".to_string(), + )); + } + + let output = deps.git.run(&[ + "-C", + repo_root, + "config", + "--file", + ".gitmodules", + "--get-regexp", + r"^submodule\..*\.path$", + ])?; + + let mut paths = HashSet::new(); + for line in output.lines() { + let Some((_, path)) = line.split_once(' ') else { + continue; + }; + paths.insert(path.trim().to_string()); + } + Ok(paths) +} + +struct SubmoduleRoots { + origin: String, + worktree: String, +} + +fn resolve_submodule_roots( + repo_root: &str, + worktree_path: &str, + submodule_path: &str, + dry_run: bool, +) -> Result { + let origin_parent = canonicalize_existing(Path::new(repo_root), "repository root")?; + let origin = canonicalize_existing( + &PathBuf::from(repo_root).join(submodule_path), + "origin submodule", + )?; + ensure_child_path(&origin_parent, &origin, submodule_path, "origin submodule")?; + + let worktree = if dry_run { + PathBuf::from(worktree_path).join(submodule_path) + } else { + let worktree_parent = canonicalize_existing(Path::new(worktree_path), "worktree root")?; + let worktree = canonicalize_existing( + &PathBuf::from(worktree_path).join(submodule_path), + "worktree submodule", + )?; + ensure_child_path( + &worktree_parent, + &worktree, + submodule_path, + "worktree submodule", + )?; + worktree + }; + + Ok(SubmoduleRoots { + origin: origin.to_string_lossy().into_owned(), + worktree: worktree.to_string_lossy().into_owned(), + }) +} + +fn canonicalize_existing(path: &Path, label: &str) -> Result { + path.canonicalize().map_err(|e| { + VibeError::Configuration(format!( + "Failed to resolve {label} path '{}': {e}", + path.display() + )) + }) +} + +fn ensure_child_path(parent: &Path, child: &Path, submodule_path: &str, label: &str) -> Result<()> { + if child.starts_with(parent) { + return Ok(()); + } + + Err(VibeError::Configuration(format!( + "Resolved {label} path for '{submodule_path}' escapes its parent repository" + ))) } /// Run a lifecycle hook list with a phase/tasks on the tracker. diff --git a/rust/crates/vibe-core/src/commands/start_tests.rs b/rust/crates/vibe-core/src/commands/start_tests.rs index 01434a0..3d7ae3a 100644 --- a/rust/crates/vibe-core/src/commands/start_tests.rs +++ b/rust/crates/vibe-core/src/commands/start_tests.rs @@ -23,6 +23,7 @@ struct MockGit { local_branches: Vec, remote_branches: Vec, existing_revisions: Vec, + fail_prefix: Option>, pub calls: RefCell>>, } @@ -34,6 +35,7 @@ impl MockGit { local_branches: vec![], remote_branches: vec![], existing_revisions: vec![], + fail_prefix: None, calls: RefCell::new(vec![]), } } @@ -41,12 +43,27 @@ impl MockGit { self.existing_revisions.push(r.to_string()); self } + fn failing_on(mut self, prefix: &[&str]) -> Self { + self.fail_prefix = Some(prefix.iter().map(|s| s.to_string()).collect()); + self + } fn calls_contain(&self, prefix: &[&str]) -> bool { self.calls .borrow() .iter() .any(|c| c.len() >= prefix.len() && c[..prefix.len()] == *prefix) } + fn submodule_update_calls(&self) -> usize { + self.calls + .borrow() + .iter() + .filter(|c| { + c.iter().any(|arg| arg == "submodule") + && c.iter().any(|arg| arg == "update") + && c.iter().any(|arg| arg == "--init") + }) + .count() + } } impl GitRunner for MockGit { @@ -55,9 +72,44 @@ impl GitRunner for MockGit { .borrow_mut() .push(args.iter().map(|s| s.to_string()).collect()); + if let Some(prefix) = &self.fail_prefix { + let is_matching_prefix = args.len() >= prefix.len() + && args + .iter() + .take(prefix.len()) + .zip(prefix.iter()) + .all(|(actual, expected)| actual == expected); + if is_matching_prefix { + return Err(VibeError::GitOperation { + command: args.join(" "), + message: "failed: submodule update".into(), + }); + } + } + if args.contains(&"--show-toplevel") { return Ok(self.repo_root.clone()); } + if args.contains(&"config") && args.contains(&"--file") && args.contains(&".gitmodules") { + let gitmodules = std::path::Path::new(&self.repo_root).join(".gitmodules"); + let content = + std::fs::read_to_string(&gitmodules).map_err(|e| VibeError::GitOperation { + command: args.join(" "), + message: format!("failed: {e}"), + })?; + let paths = parse_gitmodules_paths_for_test(&content); + if paths.is_empty() { + return Err(VibeError::GitOperation { + command: args.join(" "), + message: "failed: no submodule paths".into(), + }); + } + return Ok(paths + .into_iter() + .map(|path| format!("submodule.test.path {path}")) + .collect::>() + .join("\n")); + } if args.contains(&"list") && args.contains(&"worktree") { return Ok(self.worktree_list.clone()); } @@ -97,6 +149,15 @@ impl GitRunner for MockGit { } } +fn parse_gitmodules_paths_for_test(content: &str) -> Vec { + content + .lines() + .filter_map(|line| line.trim().strip_prefix("path")) + .filter_map(|line| line.trim_start().strip_prefix('=')) + .map(|path| path.trim().trim_matches('"').to_string()) + .collect() +} + /// Resolver returning no repo info (config load → none). #[derive(Default)] struct NoResolver; @@ -700,6 +761,12 @@ fn different_branch_cancel_emits_no_cd() { /// Build a trusted-config fixture + resolver, returning (fixture, io, resolver, /// repo_root). The config has a pre_start, a copy file, and a post_start hook. fn trusted_config_repo() -> (Fixture, FakeIo, TrustResolver, String) { + trusted_config_repo_with_content( + "[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n", + ) +} + +fn trusted_config_repo_with_content(content: &str) -> (Fixture, FakeIo, TrustResolver, String) { use crate::hash::hash_content; use crate::settings::{AllowEntry, RepoId, VibeSettings}; use crate::settings_io::save_user_settings; @@ -707,7 +774,6 @@ fn trusted_config_repo() -> (Fixture, FakeIo, TrustResolver, String) { let fx = Fixture::new(); let repo = fx.mkdir("repo"); - let content = "[hooks]\npre_start = [\"echo pre\"]\npost_start = [\"echo post\"]\n[copy]\nfiles = [\".env\"]\n"; fx.write("repo/.vibe.toml", content); fx.write("repo/.env", "SECRET=1"); @@ -742,6 +808,113 @@ fn trusted_config_repo() -> (Fixture, FakeIo, TrustResolver, String) { ) } +fn trusted_repo_with_submodule_config() -> (Fixture, FakeIo, TrustResolver, String) { + use crate::hash::hash_content; + use crate::settings::{AllowEntry, RepoId, VibeSettings}; + use crate::settings_io::save_user_settings; + use std::collections::HashMap; + + let fx = Fixture::new(); + let repo_raw = fx.mkdir("repo"); + let submodule_origin_raw = fx.mkdir("repo/libs/foo"); + let worktree_raw = fx.mkdir("repo-feat"); + let _ = fx.mkdir("repo-feat/libs/foo"); + + let parent = "[submodules]\nconfigs = [\"libs/foo\"]\n[hooks]\npre_start = [\"echo parent\"]\n"; + let submodule = "[hooks]\npre_start = [\"echo sub-pre\"]\npost_start = [\"echo sub-post\"]\n[copy]\nfiles = [\".env\"]\n"; + fx.write("repo/.vibe.toml", parent); + fx.write( + "repo/.gitmodules", + "[submodule \"libs/foo\"]\n\tpath = libs/foo\n\turl = https://example.com/foo.git\n", + ); + fx.write("repo/libs/foo/.vibe.toml", submodule); + fx.write("repo/libs/foo/.env", "SUB=1"); + + let repo = repo_raw.canonicalize().unwrap(); + let submodule_origin = submodule_origin_raw.canonicalize().unwrap(); + let worktree = worktree_raw.canonicalize().unwrap(); + + let io = FakeIo::new().with_env("HOME", fx.path().to_str().unwrap()); + let mut settings = VibeSettings::default_settings(); + for (root, file, content) in [ + (&repo, ".vibe.toml", parent), + (&submodule_origin, ".vibe.toml", submodule), + ] { + settings.permissions.allow.push(AllowEntry { + repo_id: RepoId { + remote_url: None, + repo_root: Some(root.to_string_lossy().into_owned()), + }, + relative_path: file.into(), + hashes: vec![hash_content(content.as_bytes())], + skip_hash_check: None, + }); + } + save_user_settings(&io, &settings, V).unwrap(); + + let mut repos = HashMap::new(); + for (root, file) in [(&repo, ".vibe.toml"), (&submodule_origin, ".vibe.toml")] { + repos.insert( + root.join(file).to_string_lossy().into_owned(), + RepoInfo { + remote_url: None, + repo_root: root.to_string_lossy().into_owned(), + relative_path: file.into(), + }, + ); + } + let _ = worktree; + ( + fx, + io, + TrustResolver { repos }, + repo.to_string_lossy().into_owned(), + ) +} + +fn start_with_config( + content: &str, + fail_prefix: Option<&[&str]>, + flags: &StartFlags, +) -> ( + Fixture, + FakeIo, + TrustResolver, + String, + MockGit, + Fakes, + Result, +) { + let (fx, io, resolver, repo_root) = trusted_config_repo_with_content(content); + let mut git = MockGit::new( + &repo_root, + &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), + ); + if let Some(prefix) = fail_prefix { + git = git.failing_on(prefix); + } + let s = NoScript; + let p = ScriptPrompt::confirming(true); + let sin = FakeStdin::none(); + let fk = Fakes::new(); + let result = { + let d = StartDeps { + io: &io, + git: &git, + resolver: &resolver, + script_runner: &s, + prompt: &p, + stdin: &sin, + hook_runner: &fk.hooks, + executor: &fk.exec, + tracker: &fk.tracker, + version: V, + }; + start_command(&d, "feat", flags, OutputOptions::default()) + }; + (fx, io, resolver, repo_root, git, fk, result) +} + struct TrustResolver { repos: std::collections::HashMap, } @@ -830,6 +1003,220 @@ fn no_hooks_and_no_copy_skip_operations() { assert!(fk.exec.file_copies.lock().unwrap().is_empty()); } +#[test] +fn submodule_configs_run_before_parent_pre_start_with_submodule_roots() { + let (fx, io, resolver, repo_root) = trusted_repo_with_submodule_config(); + let _ = &fx; + let git = MockGit::new( + &repo_root, + &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), + ); + let s = NoScript; + let p = ScriptPrompt::confirming(true); + let sin = FakeStdin::none(); + let fk = Fakes::new(); + let d = StartDeps { + io: &io, + git: &git, + resolver: &resolver, + script_runner: &s, + prompt: &p, + stdin: &sin, + hook_runner: &fk.hooks, + executor: &fk.exec, + tracker: &fk.tracker, + version: V, + }; + start_command(&d, "feat", &StartFlags::default(), OutputOptions::default()).unwrap(); + + assert!(git.calls_contain(&[ + "-C", + &format!("{}-feat", repo_root), + "submodule", + "update", + "--init", + "--", + "libs/foo" + ])); + + let hooks = fk.hooks.calls.borrow(); + assert_eq!(hooks[0].0, "echo sub-pre"); + assert!(hooks[0].1.ends_with("repo/libs/foo")); + assert_eq!(hooks[1].0, "echo sub-post"); + assert!(hooks[1].1.ends_with("repo-feat/libs/foo")); + assert_eq!(hooks[2].0, "echo parent"); + assert_eq!(hooks[2].1, repo_root); + + let file_copies = fk.exec.file_copies.lock().unwrap(); + assert_eq!(file_copies.len(), 1); + assert!(file_copies[0].0.ends_with("repo/libs/foo/.env")); + assert!(file_copies[0].1.ends_with("repo-feat/libs/foo/.env")); +} + +#[test] +fn submodule_configs_are_skipped_when_omitted() { + let content = "[hooks]\npre_start = [\"echo pre\"]\n"; + let (_fx, _io, _resolver, _repo_root, git, _fk, result) = + start_with_config(content, None, &StartFlags::default()); + result.unwrap(); + assert_eq!(git.submodule_update_calls(), 0); +} + +#[test] +fn submodule_configs_respect_no_hooks_and_no_copy() { + let (fx, io, resolver, repo_root) = trusted_repo_with_submodule_config(); + let _ = &fx; + let git = MockGit::new( + &repo_root, + &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), + ); + let s = NoScript; + let p = ScriptPrompt::confirming(true); + let sin = FakeStdin::none(); + let fk = Fakes::new(); + let d = StartDeps { + io: &io, + git: &git, + resolver: &resolver, + script_runner: &s, + prompt: &p, + stdin: &sin, + hook_runner: &fk.hooks, + executor: &fk.exec, + tracker: &fk.tracker, + version: V, + }; + let flags = StartFlags { + no_hooks: true, + no_copy: true, + ..Default::default() + }; + start_command(&d, "feat", &flags, OutputOptions::default()).unwrap(); + + assert_eq!(git.submodule_update_calls(), 1); + assert!(fk.hooks.calls.borrow().is_empty()); + assert!(fk.exec.file_copies.lock().unwrap().is_empty()); +} + +#[test] +fn submodule_configs_dry_run_logs_without_running_git() { + let (fx, io, resolver, repo_root) = trusted_repo_with_submodule_config(); + let _ = &fx; + std::fs::remove_dir_all(format!("{repo_root}-feat")).unwrap(); + let git = MockGit::new( + &repo_root, + &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), + ); + let s = NoScript; + let p = ScriptPrompt::confirming(true); + let sin = FakeStdin::none(); + let fk = Fakes::new(); + let d = StartDeps { + io: &io, + git: &git, + resolver: &resolver, + script_runner: &s, + prompt: &p, + stdin: &sin, + hook_runner: &fk.hooks, + executor: &fk.exec, + tracker: &fk.tracker, + version: V, + }; + let flags = StartFlags { + dry_run: true, + ..Default::default() + }; + start_command(&d, "feat", &flags, OutputOptions::default()).unwrap(); + + assert_eq!(git.submodule_update_calls(), 0); + assert!(io.stderr_text().contains("Would run: git -C")); + assert!(io + .stderr_text() + .contains("submodule update --init -- libs/foo")); +} + +#[test] +fn submodule_config_update_failure_aborts_remaining_operations() { + let (fx, io, resolver, repo_root) = trusted_repo_with_submodule_config(); + let _ = &fx; + let git = MockGit::new( + &repo_root, + &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), + ) + .failing_on(&["-C", &format!("{}-feat", repo_root), "submodule"]); + let s = NoScript; + let p = ScriptPrompt::confirming(true); + let sin = FakeStdin::none(); + let fk = Fakes::new(); + let d = StartDeps { + io: &io, + git: &git, + resolver: &resolver, + script_runner: &s, + prompt: &p, + stdin: &sin, + hook_runner: &fk.hooks, + executor: &fk.exec, + tracker: &fk.tracker, + version: V, + }; + let result = start_command(&d, "feat", &StartFlags::default(), OutputOptions::default()); + + assert!(result.is_err()); + assert!(fk.hooks.calls.borrow().is_empty()); + assert!(fk.exec.file_copies.lock().unwrap().is_empty()); +} + +#[test] +fn submodule_config_invalid_path_is_rejected_before_git_update() { + let content = "[submodules]\nconfigs = [\"../foo\"]\n"; + let (_fx, _io, _resolver, _repo_root, git, _fk, result) = + start_with_config(content, None, &StartFlags::default()); + + let err = result.unwrap_err(); + assert!(err + .to_string() + .contains("must be a parent-repo-relative submodule path")); + assert_eq!(git.submodule_update_calls(), 0); +} + +#[test] +fn submodule_config_requires_its_own_trust() { + let (fx, io, mut resolver, repo_root) = trusted_repo_with_submodule_config(); + let _ = &fx; + resolver + .repos + .retain(|path, _| !path.ends_with("repo/libs/foo/.vibe.toml")); + let git = MockGit::new( + &repo_root, + &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), + ); + let s = NoScript; + let p = ScriptPrompt::confirming(true); + let sin = FakeStdin::none(); + let fk = Fakes::new(); + let d = StartDeps { + io: &io, + git: &git, + resolver: &resolver, + script_runner: &s, + prompt: &p, + stdin: &sin, + hook_runner: &fk.hooks, + executor: &fk.exec, + tracker: &fk.tracker, + version: V, + }; + let err = + start_command(&d, "feat", &StartFlags::default(), OutputOptions::default()).unwrap_err(); + + assert!(err + .to_string() + .contains(".vibe.toml file is not trusted or has been modified")); + assert!(fk.hooks.calls.borrow().is_empty()); +} + // --- claude-code worktree hook mode: stdout path --- #[test] diff --git a/rust/crates/vibe-core/src/config.rs b/rust/crates/vibe-core/src/config.rs index d9df1a5..0685f05 100644 --- a/rust/crates/vibe-core/src/config.rs +++ b/rust/crates/vibe-core/src/config.rs @@ -22,6 +22,8 @@ pub struct VibeConfig { pub worktree: Option, #[serde(skip_serializing_if = "Option::is_none")] pub clean: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub submodules: Option, } #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] @@ -87,6 +89,13 @@ pub struct CleanConfig { pub delete_branch: Option, } +#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct SubmodulesConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub configs: Option>, +} + /// Parse a `VibeConfig` from TOML text, validating it like the Zod schema. /// /// `file_path` is woven into the error message exactly as the TS @@ -222,6 +231,16 @@ pub fn merge_configs(base: &VibeConfig, local: &VibeConfig) -> VibeConfig { merged.clean = Some(CleanConfig { delete_branch }); } + // submodules: present if either side has it; configs local > base. + if base.submodules.is_some() || local.submodules.is_some() { + let configs = local + .submodules + .as_ref() + .and_then(|s| s.configs.clone()) + .or_else(|| base.submodules.as_ref().and_then(|s| s.configs.clone())); + merged.submodules = Some(SubmodulesConfig { configs }); + } + merged } @@ -448,6 +467,47 @@ mod tests { ); } + #[test] + fn submodules_local_configs_win() { + let base = VibeConfig { + submodules: Some(SubmodulesConfig { + configs: Some(vec!["libs/base".into()]), + }), + ..Default::default() + }; + let local = VibeConfig { + submodules: Some(SubmodulesConfig { + configs: Some(vec!["libs/local".into()]), + }), + ..Default::default() + }; + assert_eq!( + merge_configs(&base, &local).submodules.unwrap().configs, + Some(vec!["libs/local".into()]) + ); + } + + #[test] + fn submodules_base_configs_survive_with_unrelated_local() { + let base = VibeConfig { + submodules: Some(SubmodulesConfig { + configs: Some(vec!["libs/base".into()]), + }), + ..Default::default() + }; + let local = VibeConfig { + copy: Some(CopyConfig { + files: Some(vec!["x".into()]), + ..Default::default() + }), + ..Default::default() + }; + assert_eq!( + merge_configs(&base, &local).submodules.unwrap().configs, + Some(vec!["libs/base".into()]) + ); + } + // --- parse_vibe_config --- #[test] @@ -474,16 +534,33 @@ path_script = "p.sh" [clean] delete_branch = true + +[submodules] +configs = ["libs/foo"] "#; let cfg = parse_vibe_config(toml, "/p/.vibe.toml").unwrap(); assert_eq!(cfg.copy.as_ref().unwrap().concurrency, Some(8)); assert_eq!(cfg.clean.as_ref().unwrap().delete_branch, Some(true)); + assert_eq!( + cfg.submodules.as_ref().unwrap().configs, + Some(vec!["libs/foo".into()]) + ); assert_eq!( cfg.worktree.as_ref().unwrap().path_script.as_deref(), Some("p.sh") ); } + #[test] + fn parses_submodules_configs() { + let cfg = + parse_vibe_config("[submodules]\nconfigs = [\"libs/foo\"]\n", "/p/.vibe.toml").unwrap(); + assert_eq!( + cfg.submodules.unwrap().configs, + Some(vec!["libs/foo".into()]) + ); + } + #[test] fn rejects_unknown_top_level_property() { let err = parse_vibe_config("unknown_property = true\n", "/path/.vibe.toml").unwrap_err(); @@ -498,6 +575,13 @@ delete_branch = true assert!(err.to_string().contains("/path/.vibe.toml")); } + #[test] + fn rejects_unknown_submodules_field() { + let toml = "[submodules]\nbogus = 1\n"; + let err = parse_vibe_config(toml, "/path/.vibe.toml").unwrap_err(); + assert!(err.to_string().contains("/path/.vibe.toml")); + } + #[test] fn rejects_concurrency_below_minimum() { let err = parse_vibe_config("[copy]\nconcurrency = 0\n", "/path/.vibe.toml").unwrap_err(); From 7160503d9de4b7e8b2175c32c3b9280f3d4d5a49 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Mon, 22 Jun 2026 22:31:53 +0900 Subject: [PATCH 06/17] fix: read submodule configs from worktrees --- rust/crates/vibe-core/src/commands/start.rs | 11 +++++--- .../vibe-core/src/commands/start_tests.rs | 25 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/rust/crates/vibe-core/src/commands/start.rs b/rust/crates/vibe-core/src/commands/start.rs index 42ef8b6..e1281bb 100644 --- a/rust/crates/vibe-core/src/commands/start.rs +++ b/rust/crates/vibe-core/src/commands/start.rs @@ -698,19 +698,24 @@ where for path in &paths { let roots = resolve_submodule_roots(repo_root, worktree_path, path, options.dry_run)?; + let config_root = if options.dry_run { + &roots.origin + } else { + &roots.worktree + }; let Some(submodule_config) = - load_vibe_config(deps.io, deps.resolver, deps.version, &roots.origin)? + load_vibe_config(deps.io, deps.resolver, deps.version, config_root)? else { return Err(VibeError::Configuration(format!( "Submodule '{path}' is listed in [submodules] configs, but {}/{} does not exist", - roots.origin, VIBE_TOML + config_root, VIBE_TOML ))); }; run_config_body( deps, &submodule_config, - &roots.origin, + config_root, &roots.worktree, options, )?; diff --git a/rust/crates/vibe-core/src/commands/start_tests.rs b/rust/crates/vibe-core/src/commands/start_tests.rs index 3d7ae3a..e14eaf0 100644 --- a/rust/crates/vibe-core/src/commands/start_tests.rs +++ b/rust/crates/vibe-core/src/commands/start_tests.rs @@ -821,24 +821,28 @@ fn trusted_repo_with_submodule_config() -> (Fixture, FakeIo, TrustResolver, Stri let _ = fx.mkdir("repo-feat/libs/foo"); let parent = "[submodules]\nconfigs = [\"libs/foo\"]\n[hooks]\npre_start = [\"echo parent\"]\n"; - let submodule = "[hooks]\npre_start = [\"echo sub-pre\"]\npost_start = [\"echo sub-post\"]\n[copy]\nfiles = [\".env\"]\n"; + let origin_submodule = "[hooks]\npre_start = [\"echo origin-sub-pre\"]\n"; + let worktree_submodule = "[hooks]\npre_start = [\"echo sub-pre\"]\npost_start = [\"echo sub-post\"]\n[copy]\nfiles = [\".env\"]\n"; fx.write("repo/.vibe.toml", parent); fx.write( "repo/.gitmodules", "[submodule \"libs/foo\"]\n\tpath = libs/foo\n\turl = https://example.com/foo.git\n", ); - fx.write("repo/libs/foo/.vibe.toml", submodule); - fx.write("repo/libs/foo/.env", "SUB=1"); + fx.write("repo/libs/foo/.vibe.toml", origin_submodule); + fx.write("repo-feat/libs/foo/.vibe.toml", worktree_submodule); + fx.write("repo-feat/libs/foo/.env", "SUB=1"); let repo = repo_raw.canonicalize().unwrap(); let submodule_origin = submodule_origin_raw.canonicalize().unwrap(); let worktree = worktree_raw.canonicalize().unwrap(); + let submodule_worktree = worktree.join("libs/foo").canonicalize().unwrap(); let io = FakeIo::new().with_env("HOME", fx.path().to_str().unwrap()); let mut settings = VibeSettings::default_settings(); for (root, file, content) in [ (&repo, ".vibe.toml", parent), - (&submodule_origin, ".vibe.toml", submodule), + (&submodule_origin, ".vibe.toml", origin_submodule), + (&submodule_worktree, ".vibe.toml", worktree_submodule), ] { settings.permissions.allow.push(AllowEntry { repo_id: RepoId { @@ -853,7 +857,11 @@ fn trusted_repo_with_submodule_config() -> (Fixture, FakeIo, TrustResolver, Stri save_user_settings(&io, &settings, V).unwrap(); let mut repos = HashMap::new(); - for (root, file) in [(&repo, ".vibe.toml"), (&submodule_origin, ".vibe.toml")] { + for (root, file) in [ + (&repo, ".vibe.toml"), + (&submodule_origin, ".vibe.toml"), + (&submodule_worktree, ".vibe.toml"), + ] { repos.insert( root.join(file).to_string_lossy().into_owned(), RepoInfo { @@ -863,7 +871,6 @@ fn trusted_repo_with_submodule_config() -> (Fixture, FakeIo, TrustResolver, Stri }, ); } - let _ = worktree; ( fx, io, @@ -1041,7 +1048,7 @@ fn submodule_configs_run_before_parent_pre_start_with_submodule_roots() { let hooks = fk.hooks.calls.borrow(); assert_eq!(hooks[0].0, "echo sub-pre"); - assert!(hooks[0].1.ends_with("repo/libs/foo")); + assert!(hooks[0].1.ends_with("repo-feat/libs/foo")); assert_eq!(hooks[1].0, "echo sub-post"); assert!(hooks[1].1.ends_with("repo-feat/libs/foo")); assert_eq!(hooks[2].0, "echo parent"); @@ -1049,7 +1056,7 @@ fn submodule_configs_run_before_parent_pre_start_with_submodule_roots() { let file_copies = fk.exec.file_copies.lock().unwrap(); assert_eq!(file_copies.len(), 1); - assert!(file_copies[0].0.ends_with("repo/libs/foo/.env")); + assert!(file_copies[0].0.ends_with("repo-feat/libs/foo/.env")); assert!(file_copies[0].1.ends_with("repo-feat/libs/foo/.env")); } @@ -1187,7 +1194,7 @@ fn submodule_config_requires_its_own_trust() { let _ = &fx; resolver .repos - .retain(|path, _| !path.ends_with("repo/libs/foo/.vibe.toml")); + .retain(|path, _| !path.ends_with("repo-feat/libs/foo/.vibe.toml")); let git = MockGit::new( &repo_root, &format!("worktree {repo_root}\nbranch refs/heads/main\n\n"), From a5357d6d5e114a23be6f1cf506f96658a72a14f7 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Mon, 22 Jun 2026 22:48:24 +0900 Subject: [PATCH 07/17] test: cover submodule vibe configs in e2e --- packages/e2e/start.test.ts | 144 ++++++++++++++++++++++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/packages/e2e/start.test.ts b/packages/e2e/start.test.ts index 3712df4..86490d8 100644 --- a/packages/e2e/start.test.ts +++ b/packages/e2e/start.test.ts @@ -1,5 +1,5 @@ import { execFileSync } from "child_process"; -import { existsSync, writeFileSync } from "fs"; +import { existsSync, mkdirSync, writeFileSync } from "fs"; import { basename, dirname, join } from "path"; import { afterEach, describe, expect, test } from "vitest"; import { getVibePath, VibeCommandRunner } from "./helpers/pty.js"; @@ -11,6 +11,66 @@ import { waitForCondition, } from "./helpers/assertions.js"; +function git(args: string[], cwd: string, homePath: string): string { + return execFileSync("git", args, { + cwd, + encoding: "utf-8", + env: { + ...process.env, + HOME: homePath, + }, + stdio: "pipe", + }); +} + +async function trustConfig(vibePath: string, cwd: string, homePath: string): Promise { + const trustRunner = new VibeCommandRunner(vibePath, cwd, homePath); + try { + await trustRunner.spawn(["trust"]); + await trustRunner.waitForExit(); + const trustOutput = trustRunner.getOutput(); + assertExitCode(trustRunner.getExitCode(), 0, trustOutput); + } finally { + trustRunner.dispose(); + } +} + +function createSubmoduleSource( + homePath: string, + name: string, + markerFile: string, +): string { + const sourcePath = join(homePath, `${name}-source`); + mkdirSync(sourcePath, { recursive: true }); + git(["init"], sourcePath, homePath); + git(["config", "user.email", "test@example.com"], sourcePath, homePath); + git(["config", "user.name", "Test User"], sourcePath, homePath); + git(["remote", "add", "origin", sourcePath], sourcePath, homePath); + writeFileSync(join(sourcePath, "README.md"), `# ${name}\n`); + writeFileSync( + join(sourcePath, ".vibe.toml"), + `[hooks]\npost_start = ["touch ${markerFile}"]\n`, + ); + git(["add", "README.md", ".vibe.toml"], sourcePath, homePath); + git(["commit", "-m", `Add ${name} config`], sourcePath, homePath); + git(["branch", "-M", "main"], sourcePath, homePath); + return sourcePath; +} + +function addSubmodule( + repoPath: string, + homePath: string, + sourcePath: string, + submodulePath: string, +): void { + git(["config", "--global", "protocol.file.allow", "always"], repoPath, homePath); + git( + ["-c", "protocol.file.allow=always", "submodule", "add", sourcePath, submodulePath], + repoPath, + homePath, + ); +} + describe("start command", () => { let cleanup: (() => Promise) | null = null; @@ -461,6 +521,88 @@ post_start = ["touch $VIBE_WORKTREE_PATH/.hook-ran"] } }); + test("runs .vibe.toml from one initialized submodule", async () => { + const { repoPath, homePath, cleanup: repoCleanup } = await setupTestGitRepo(); + cleanup = repoCleanup; + + const vibePath = getVibePath(); + const fooSource = createSubmoduleSource(homePath, "foo", ".foo-submodule-hook-ran"); + addSubmodule(repoPath, homePath, fooSource, "libs/foo"); + + writeFileSync(join(repoPath, ".vibe.toml"), '[submodules]\nconfigs = ["libs/foo"]\n'); + git(["add", ".vibe.toml", ".gitmodules", "libs/foo"], repoPath, homePath); + git(["commit", "-m", "Add one submodule config"], repoPath, homePath); + + await trustConfig(vibePath, repoPath, homePath); + await trustConfig(vibePath, fooSource, homePath); + + const runner = new VibeCommandRunner(vibePath, repoPath, homePath); + try { + await runner.spawn(["start", "feat/one-submodule"]); + await runner.waitForExit(); + + const output = runner.getOutput(); + assertExitCode(runner.getExitCode(), 0, output); + + const parentDir = dirname(repoPath); + const repoName = basename(repoPath); + const worktreePath = `${parentDir}/${repoName}-feat-one-submodule`; + const submoduleWorktreePath = join(worktreePath, "libs/foo"); + + await assertDirectoryExists(submoduleWorktreePath); + expect(existsSync(join(submoduleWorktreePath, ".vibe.toml"))).toBe(true); + expect(existsSync(join(submoduleWorktreePath, ".foo-submodule-hook-ran"))).toBe(true); + } finally { + runner.dispose(); + } + }); + + test("runs .vibe.toml from multiple initialized submodules", async () => { + const { repoPath, homePath, cleanup: repoCleanup } = await setupTestGitRepo(); + cleanup = repoCleanup; + + const vibePath = getVibePath(); + const fooSource = createSubmoduleSource(homePath, "foo", ".foo-submodule-hook-ran"); + const barSource = createSubmoduleSource(homePath, "bar", ".bar-submodule-hook-ran"); + addSubmodule(repoPath, homePath, fooSource, "libs/foo"); + addSubmodule(repoPath, homePath, barSource, "vendor/bar"); + + writeFileSync( + join(repoPath, ".vibe.toml"), + '[submodules]\nconfigs = ["libs/foo", "vendor/bar"]\n', + ); + git(["add", ".vibe.toml", ".gitmodules", "libs/foo", "vendor/bar"], repoPath, homePath); + git(["commit", "-m", "Add multiple submodule configs"], repoPath, homePath); + + await trustConfig(vibePath, repoPath, homePath); + await trustConfig(vibePath, fooSource, homePath); + await trustConfig(vibePath, barSource, homePath); + + const runner = new VibeCommandRunner(vibePath, repoPath, homePath); + try { + await runner.spawn(["start", "feat/multiple-submodules"]); + await runner.waitForExit(); + + const output = runner.getOutput(); + assertExitCode(runner.getExitCode(), 0, output); + + const parentDir = dirname(repoPath); + const repoName = basename(repoPath); + const worktreePath = `${parentDir}/${repoName}-feat-multiple-submodules`; + const fooWorktreePath = join(worktreePath, "libs/foo"); + const barWorktreePath = join(worktreePath, "vendor/bar"); + + await assertDirectoryExists(fooWorktreePath); + await assertDirectoryExists(barWorktreePath); + expect(existsSync(join(fooWorktreePath, ".vibe.toml"))).toBe(true); + expect(existsSync(join(barWorktreePath, ".vibe.toml"))).toBe(true); + expect(existsSync(join(fooWorktreePath, ".foo-submodule-hook-ran"))).toBe(true); + expect(existsSync(join(barWorktreePath, ".bar-submodule-hook-ran"))).toBe(true); + } finally { + runner.dispose(); + } + }); + test("worktree.path_script in .vibe.toml determines worktree path", async () => { const { repoPath, homePath, cleanup: repoCleanup } = await setupTestGitRepo(); cleanup = repoCleanup; From acdf07e961f26062cef3a591110abb9d6129e02f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:55:15 +0000 Subject: [PATCH 08/17] chore(deps): bump the npm_and_yarn group across 3 directories with 2 updates Bumps the npm_and_yarn group with 1 update in the /packages/npm directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /packages/e2e directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /packages/docs directory: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `vitest` from 2.1.9 to 3.2.6 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v3.2.6/packages/vitest) Updates `vitest` from 2.1.9 to 3.2.6 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v3.2.6/packages/vitest) Updates `astro` from 5.16.9 to 6.4.6 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@6.4.6/packages/astro) --- updated-dependencies: - dependency-name: vitest dependency-version: 3.2.6 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vitest dependency-version: 3.2.6 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: astro dependency-version: 6.4.6 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- packages/docs/package.json | 2 +- packages/e2e/package.json | 2 +- packages/npm/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/docs/package.json b/packages/docs/package.json index d4d37e1..d4dd805 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -18,7 +18,7 @@ "dependencies": { "@astrojs/starlight": "^0.37.2", "@resvg/resvg-js": "^2.6.2", - "astro": "^5.6.1", + "astro": "^6.4.6", "satori": "^0.18.3", "sharp": "^0.34.2" }, diff --git a/packages/e2e/package.json b/packages/e2e/package.json index 744a0b9..fb77fbf 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -14,6 +14,6 @@ "@vitest/ui": "^2.1.8", "node-pty": "^1.1.0", "typescript": "^5.7.2", - "vitest": "^2.1.8" + "vitest": "^3.2.6" } } diff --git a/packages/npm/package.json b/packages/npm/package.json index 03dd25a..c8b535f 100644 --- a/packages/npm/package.json +++ b/packages/npm/package.json @@ -22,7 +22,7 @@ "@kexi/vibe-win32-x64": "2.0.0" }, "devDependencies": { - "vitest": "^2.1.0" + "vitest": "^3.2.6" }, "engines": { "node": ">=18.0.0" From a22ff4b57c8531e4c9be7c514a2a7e1cfe48cd2a Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Mon, 22 Jun 2026 23:49:03 +0900 Subject: [PATCH 09/17] fix: copy submodule files from origin checkout --- packages/e2e/start.test.ts | 16 ++++++++++++++-- rust/crates/vibe-core/src/commands/start.rs | 8 +++++--- .../crates/vibe-core/src/commands/start_tests.rs | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/e2e/start.test.ts b/packages/e2e/start.test.ts index 86490d8..6db89dd 100644 --- a/packages/e2e/start.test.ts +++ b/packages/e2e/start.test.ts @@ -1,5 +1,5 @@ import { execFileSync } from "child_process"; -import { existsSync, mkdirSync, writeFileSync } from "fs"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; import { basename, dirname, join } from "path"; import { afterEach, describe, expect, test } from "vitest"; import { getVibePath, VibeCommandRunner } from "./helpers/pty.js"; @@ -49,7 +49,7 @@ function createSubmoduleSource( writeFileSync(join(sourcePath, "README.md"), `# ${name}\n`); writeFileSync( join(sourcePath, ".vibe.toml"), - `[hooks]\npost_start = ["touch ${markerFile}"]\n`, + `[hooks]\npost_start = ["touch ${markerFile}"]\n[copy]\nfiles = [".env"]\n`, ); git(["add", "README.md", ".vibe.toml"], sourcePath, homePath); git(["commit", "-m", `Add ${name} config`], sourcePath, homePath); @@ -528,6 +528,7 @@ post_start = ["touch $VIBE_WORKTREE_PATH/.hook-ran"] const vibePath = getVibePath(); const fooSource = createSubmoduleSource(homePath, "foo", ".foo-submodule-hook-ran"); addSubmodule(repoPath, homePath, fooSource, "libs/foo"); + writeFileSync(join(repoPath, "libs/foo/.env"), "FOO_FROM_ORIGIN=1\n"); writeFileSync(join(repoPath, ".vibe.toml"), '[submodules]\nconfigs = ["libs/foo"]\n'); git(["add", ".vibe.toml", ".gitmodules", "libs/foo"], repoPath, homePath); @@ -551,6 +552,9 @@ post_start = ["touch $VIBE_WORKTREE_PATH/.hook-ran"] await assertDirectoryExists(submoduleWorktreePath); expect(existsSync(join(submoduleWorktreePath, ".vibe.toml"))).toBe(true); + expect(readFileSync(join(submoduleWorktreePath, ".env"), "utf-8")).toBe( + "FOO_FROM_ORIGIN=1\n", + ); expect(existsSync(join(submoduleWorktreePath, ".foo-submodule-hook-ran"))).toBe(true); } finally { runner.dispose(); @@ -566,6 +570,8 @@ post_start = ["touch $VIBE_WORKTREE_PATH/.hook-ran"] const barSource = createSubmoduleSource(homePath, "bar", ".bar-submodule-hook-ran"); addSubmodule(repoPath, homePath, fooSource, "libs/foo"); addSubmodule(repoPath, homePath, barSource, "vendor/bar"); + writeFileSync(join(repoPath, "libs/foo/.env"), "FOO_FROM_ORIGIN=1\n"); + writeFileSync(join(repoPath, "vendor/bar/.env"), "BAR_FROM_ORIGIN=1\n"); writeFileSync( join(repoPath, ".vibe.toml"), @@ -596,6 +602,12 @@ post_start = ["touch $VIBE_WORKTREE_PATH/.hook-ran"] await assertDirectoryExists(barWorktreePath); expect(existsSync(join(fooWorktreePath, ".vibe.toml"))).toBe(true); expect(existsSync(join(barWorktreePath, ".vibe.toml"))).toBe(true); + expect(readFileSync(join(fooWorktreePath, ".env"), "utf-8")).toBe( + "FOO_FROM_ORIGIN=1\n", + ); + expect(readFileSync(join(barWorktreePath, ".env"), "utf-8")).toBe( + "BAR_FROM_ORIGIN=1\n", + ); expect(existsSync(join(fooWorktreePath, ".foo-submodule-hook-ran"))).toBe(true); expect(existsSync(join(barWorktreePath, ".bar-submodule-hook-ran"))).toBe(true); } finally { diff --git a/rust/crates/vibe-core/src/commands/start.rs b/rust/crates/vibe-core/src/commands/start.rs index e1281bb..4e8c8b5 100644 --- a/rust/crates/vibe-core/src/commands/start.rs +++ b/rust/crates/vibe-core/src/commands/start.rs @@ -535,7 +535,7 @@ where run_submodule_configs(deps, config, repo_root, worktree_path, options)?; - run_config_body(deps, config, repo_root, worktree_path, options)?; + run_config_body(deps, config, repo_root, worktree_path, repo_root, options)?; if has_ops { deps.tracker.finish(); @@ -552,6 +552,7 @@ fn run_config_body( config: &VibeConfig, repo_root: &str, worktree_path: &str, + copy_source_root: &str, options: &ConfigAndHooks, ) -> Result<()> where @@ -587,7 +588,7 @@ where .as_ref() .and_then(|c| c.files.as_deref()) .unwrap_or(&[]), - repo_root, + copy_source_root, worktree_path, options.dry_run, ); @@ -606,7 +607,7 @@ where &deps.executor, &deps.tracker, dirs, - repo_root, + copy_source_root, worktree_path, options.dry_run, concurrency, @@ -717,6 +718,7 @@ where &submodule_config, config_root, &roots.worktree, + &roots.origin, options, )?; } diff --git a/rust/crates/vibe-core/src/commands/start_tests.rs b/rust/crates/vibe-core/src/commands/start_tests.rs index e14eaf0..886bb31 100644 --- a/rust/crates/vibe-core/src/commands/start_tests.rs +++ b/rust/crates/vibe-core/src/commands/start_tests.rs @@ -1056,7 +1056,7 @@ fn submodule_configs_run_before_parent_pre_start_with_submodule_roots() { let file_copies = fk.exec.file_copies.lock().unwrap(); assert_eq!(file_copies.len(), 1); - assert!(file_copies[0].0.ends_with("repo-feat/libs/foo/.env")); + assert!(file_copies[0].0.ends_with("repo/libs/foo/.env")); assert!(file_copies[0].1.ends_with("repo-feat/libs/foo/.env")); } From 5f76096cc8202298b49449774a9b2c344e3bca49 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Tue, 23 Jun 2026 01:08:31 +0900 Subject: [PATCH 10/17] docs: update legacy Deno references --- docs/architecture.ja.md | 6 +++--- docs/architecture.md | 6 +++--- docs/specifications/clean-strategies.ja.md | 12 ++++++------ docs/specifications/clean-strategies.md | 10 +++++----- docs/specifications/multi-runtime.ja.md | 2 +- docs/specifications/multi-runtime.md | 2 +- docs/specifications/native-clone.ja.md | 8 ++++---- docs/specifications/native-clone.md | 8 ++++---- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/architecture.ja.md b/docs/architecture.ja.md index b66fb31..92df8ca 100644 --- a/docs/architecture.ja.md +++ b/docs/architecture.ja.md @@ -8,7 +8,7 @@ ## ランタイム抽象化レイヤー -Vibe はランタイム抽象化レイヤーを通じて、複数の JavaScript ランタイム(Deno と Node.js)をサポートしています。 +TypeScript 時代の実装では、Vibe はランタイム抽象化レイヤーを通じて、複数の JavaScript ランタイム(Deno と Node.js)をサポートしていました。現在の実装は単一の Rust バイナリであり、Deno はサポートしていません。 ```mermaid flowchart TD @@ -98,8 +98,8 @@ flowchart TD | 方法 | プラットフォーム | 説明 | | ----------------------- | ----------------------------- | ---------------------------------------------------------- | -| Native Trash | Node.js(全プラットフォーム) | trash crate を使用した @kexi/vibe-native | -| AppleScript | Deno on macOS | osascript 経由の Finder フォールバック | +| Native Trash | Rust バイナリ | trash crate を使用 | +| AppleScript | macOS の Rust バイナリ | osascript 経由の Finder フォールバック | | /tmp + Background | Linux(デスクトップなし) | /tmp に移動後、バックグラウンドで削除 | | Parent Dir + Background | クロスデバイス | ネットワークマウント用の同一ファイルシステムフォールバック | diff --git a/docs/architecture.md b/docs/architecture.md index 7c9e3dc..ba62355 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -8,7 +8,7 @@ This document describes the architecture of the Vibe CLI tool. ## Runtime Abstraction Layer -Vibe supports multiple JavaScript runtimes (Deno and Node.js) through a runtime abstraction layer. +In the TypeScript-era implementation, Vibe supported multiple JavaScript runtimes (Deno and Node.js) through a runtime abstraction layer. The current implementation is a single Rust binary and does not support Deno. ```mermaid flowchart TD @@ -98,8 +98,8 @@ flowchart TD | Method | Platform | Description | | ----------------------- | ----------------------- | ------------------------------------------- | -| Native Trash | Node.js (all platforms) | Uses @kexi/vibe-native with trash crate | -| AppleScript | Deno on macOS | Fallback using Finder via osascript | +| Native Trash | Rust binary | Uses the trash crate | +| AppleScript | Rust binary on macOS | Fallback using Finder via osascript | | /tmp + Background | Linux (no desktop) | Moves to /tmp and deletes in background | | Parent Dir + Background | Cross-device | Same filesystem fallback for network mounts | diff --git a/docs/specifications/clean-strategies.ja.md b/docs/specifications/clean-strategies.ja.md index f441a4d..9e7fe17 100644 --- a/docs/specifications/clean-strategies.ja.md +++ b/docs/specifications/clean-strategies.ja.md @@ -25,7 +25,7 @@ Trash Strategy は、ディレクトリを即座に削除するのではなく ### ネイティブゴミ箱サポート -vibe は [trash crate](https://lib.rs/crates/trash) (`@kexi/vibe-native` 経由) を使用してクロスプラットフォームのゴミ箱機能を提供します: +vibe は Rust バイナリから [trash crate](https://lib.rs/crates/trash) を使用してクロスプラットフォームのゴミ箱機能を提供します: - **macOS**: Finder Trash(従来と同じ) - **Linux**: XDG Trash (`~/.local/share/Trash`) [FreeDesktop.org 仕様](https://specifications.freedesktop.org/trash-spec/trashspec-latest.html)準拠 @@ -37,15 +37,15 @@ XDG Trash に移動されたファイルは、デスクトップ環境のゴミ ### macOS -1. **主要 (Node.js)**: ネイティブモジュール (`@kexi/vibe-native`) 経由で Finder Trash に移動 +1. **主要 (Rust)**: `trash` crate 経由で Finder Trash に移動 - 内部的に Rust の `trash` crate を使用 - Finder のゴミ箱フォルダに表示される -2. **フォールバック (Deno)**: AppleScript (`osascript`) 経由で Finder Trash に移動 +2. **フォールバック (Rust/macOS)**: AppleScript (`osascript`) 経由で Finder Trash に移動 3. **フォールバック**: 両方とも失敗した場合(例:SSH セッション)、/tmp + バックグラウンド削除にフォールバック ### Linux -1. **主要 (Node.js)**: ネイティブモジュール (`@kexi/vibe-native`) 経由で XDG Trash に移動 +1. **主要 (Rust)**: `trash` crate 経由で XDG Trash に移動 - [XDG Trash 仕様](https://specifications.freedesktop.org/trash-spec/trashspec-latest.html)を実装した Rust の `trash` crate を使用 - ファイルは `~/.local/share/Trash/files/` に移動 - メタデータは `~/.local/share/Trash/info/` に保存 @@ -148,7 +148,7 @@ packages/ │ ├── isFastRemoveSupported() │ ├── generateTrashName() │ ├── moveToSystemTrash() - │ ├── moveToMacOSTrashViaAppleScript() + │ ├── move_to_macos_trash_via_osascript() │ ├── spawnBackgroundDelete() │ ├── fastRemoveDirectory() │ └── cleanupStaleTrash() @@ -163,7 +163,7 @@ packages/ | `isFastRemoveSupported()` | プラットフォームサポートの確認 | | `generateTrashName()` | 一意のゴミ箱ディレクトリ名を生成 | | `moveToSystemTrash()` | ネイティブゴミ箱 + プラットフォーム固有フォールバック | -| `moveToMacOSTrashViaAppleScript()` | Deno macOS フォールバック | +| `move_to_macos_trash_via_osascript()` | Rust macOS フォールバック | | `spawnBackgroundDelete()` | デタッチされたバックグラウンド削除 | | `fastRemoveDirectory()` | メインの高速削除関数 | | `cleanupStaleTrash()` | 残存ゴミ箱ディレクトリのクリーンアップ | diff --git a/docs/specifications/clean-strategies.md b/docs/specifications/clean-strategies.md index af3a8b7..fe93ba1 100644 --- a/docs/specifications/clean-strategies.md +++ b/docs/specifications/clean-strategies.md @@ -25,7 +25,7 @@ Trash Strategy moves directories to a temporary location instead of deleting the ### Native Trash Support -vibe uses the [trash crate](https://lib.rs/crates/trash) (via `@kexi/vibe-native`) for cross-platform trash support: +vibe uses the [trash crate](https://lib.rs/crates/trash) through the Rust binary for cross-platform trash support: - **macOS**: Finder Trash (same as before) - **Linux**: XDG Trash (`~/.local/share/Trash`) following [FreeDesktop.org specification](https://specifications.freedesktop.org/trash-spec/trashspec-latest.html) @@ -37,15 +37,15 @@ Files moved to XDG Trash appear in your desktop environment's trash folder (GNOM ### macOS -1. **Primary (Node.js)**: Move to Finder Trash via native module (`@kexi/vibe-native`) +1. **Primary (Rust)**: Move to Finder Trash via the `trash` crate - Uses the Rust `trash` crate internally - Appears in Finder's Trash folder -2. **Fallback (Deno)**: Move to Finder Trash via AppleScript (`osascript`) +2. **Fallback (Rust/macOS)**: Move to Finder Trash via AppleScript (`osascript`) 3. **Fallback**: If both fail (e.g., SSH session), falls back to /tmp + background deletion ### Linux -1. **Primary (Node.js)**: Move to XDG Trash via native module (`@kexi/vibe-native`) +1. **Primary (Rust)**: Move to XDG Trash via the `trash` crate - Uses the Rust `trash` crate implementing [XDG Trash specification](https://specifications.freedesktop.org/trash-spec/trashspec-latest.html) - Files moved to `~/.local/share/Trash/files/` - Metadata stored in `~/.local/share/Trash/info/` @@ -148,7 +148,7 @@ packages/ │ ├── isFastRemoveSupported() │ ├── generateTrashName() │ ├── moveToSystemTrash() # Native trash + platform fallback - │ ├── moveToMacOSTrashViaAppleScript() # Deno macOS fallback + │ ├── move_to_macos_trash_via_osascript() # Rust macOS fallback │ ├── spawnBackgroundDelete() │ ├── fastRemoveDirectory() │ └── cleanupStaleTrash() diff --git a/docs/specifications/multi-runtime.ja.md b/docs/specifications/multi-runtime.ja.md index 928eaab..d312f34 100644 --- a/docs/specifications/multi-runtime.ja.md +++ b/docs/specifications/multi-runtime.ja.md @@ -4,7 +4,7 @@ > **歴史的な注記:** ここで説明している TypeScript 実装は、Rust 移植の Phase 6 で削除されました。vibe は現在単一の Rust バイナリであり、worktree のロジックは `rust/crates/vibe-core` にあります。このドキュメントは設計の歴史として残しています。 -vibe は、Deno、Node.js、Bun を含む複数の JavaScript/TypeScript ランタイムで CLI を実行できるランタイム抽象化レイヤーを提供します。 +TypeScript 時代の実装では、vibe は Deno、Node.js、Bun を含む複数の JavaScript/TypeScript ランタイムで CLI を実行できるランタイム抽象化レイヤーを提供していました。現在の実装は単一の Rust バイナリであり、Deno はサポートしていません。 ## ランタイム抽象化レイヤーとは? diff --git a/docs/specifications/multi-runtime.md b/docs/specifications/multi-runtime.md index fba3693..ed07db7 100644 --- a/docs/specifications/multi-runtime.md +++ b/docs/specifications/multi-runtime.md @@ -4,7 +4,7 @@ > **Historical note:** The TypeScript implementation described here was removed in Phase 6 of the Rust port. vibe is now a single Rust binary and the worktree logic lives in `rust/crates/vibe-core`. This document is retained as design history. -vibe provides a runtime abstraction layer that enables the CLI to run on multiple JavaScript/TypeScript runtimes including Deno, Node.js, and Bun. +In the TypeScript-era implementation, vibe provided a runtime abstraction layer that enabled the CLI to run on multiple JavaScript/TypeScript runtimes including Deno, Node.js, and Bun. The current implementation is a single Rust binary and does not support Deno. ## What is the Runtime Abstraction Layer? diff --git a/docs/specifications/native-clone.ja.md b/docs/specifications/native-clone.ja.md index 4658c68..8ba5adb 100644 --- a/docs/specifications/native-clone.ja.md +++ b/docs/specifications/native-clone.ja.md @@ -4,11 +4,11 @@ > **歴史的な注記:** ここで説明している TypeScript ランタイムの分岐は、Rust 移植の Phase 6 で削除されました。vibe は現在単一の Rust バイナリであり、ネイティブの CoW 実装は `rust/crates/vibe-native`(`rust/crates/vibe-core` に静的リンク)にあります。このドキュメントは設計の歴史として残しています。 -このドキュメントでは、vibeがネイティブのCopy-on-Write(CoW)操作にRustを使用する理由と、DenoとNode.jsランタイム間での実装の違いについて説明します。 +この履歴ドキュメントでは、TypeScript 時代の実装がネイティブの Copy-on-Write(CoW)操作に Rust を使用していた理由と、Deno と Node.js ランタイム間での実装の違いについて説明します。 ## なぜRustなのか? -vibeは`@kexi/vibe-native`パッケージで[napi-rs](https://napi.rs/)を介したRustを使用しています。これは、JavaScriptランタイムの標準APIでは利用できないOSレベルのCoW APIを呼び出すためです。 +TypeScript 時代の実装では、JavaScript ランタイムの標準 API では利用できない OS レベルの CoW API を呼び出すため、`@kexi/vibe-native` パッケージで [napi-rs](https://napi.rs/) を介した Rust を使用していました。 ### 代替案との比較 @@ -26,7 +26,7 @@ Rustを選択した理由: ## アーキテクチャ概要 -Deno 2.x以降、両ランタイムはネイティブCoW操作に同じ`@kexi/vibe-native` N-APIモジュールを使用しています。この統一により、メンテナンスが簡素化され、ランタイム間で一貫した動作が保証されます。 +TypeScript 時代の実装では、Deno 2.x と Node.js がネイティブ CoW 操作に同じ `@kexi/vibe-native` N-API モジュールを使用していました。現在の実装では Deno はサポートしておらず、Rust crate を直接使用しています。 ```mermaid flowchart TD @@ -89,7 +89,7 @@ pub fn clone_sync(src: String, dest: String) -> Result<()> { - 一般的なプラットフォーム向けのプリビルドバイナリ(macOS x64/arm64、Linux x64/arm64) - DenoとNode.js間で一貫した動作 -**要件:** +**当時の要件:** - Deno 2.x または Node.js 18+ - プリビルドバイナリ、またはコンパイル用のRustツールチェーン diff --git a/docs/specifications/native-clone.md b/docs/specifications/native-clone.md index 43680e1..865ad49 100644 --- a/docs/specifications/native-clone.md +++ b/docs/specifications/native-clone.md @@ -4,11 +4,11 @@ > **Historical note:** The TypeScript runtime split described here was removed in Phase 6 of the Rust port. vibe is now a single Rust binary and the native CoW implementation lives in `rust/crates/vibe-native` (statically linked into `rust/crates/vibe-core`). This document is retained as design history. -This document explains why vibe uses Rust for native Copy-on-Write (CoW) operations and how the implementation differs between Deno and Node.js runtimes. +This historical document explains why the TypeScript-era implementation used Rust for native Copy-on-Write (CoW) operations and how that implementation differed between Deno and Node.js runtimes. ## Why Rust? -vibe uses Rust (via [napi-rs](https://napi.rs/)) for the `@kexi/vibe-native` package to call OS-level CoW APIs that are not available through JavaScript runtimes' standard APIs. +The TypeScript-era implementation used Rust (via [napi-rs](https://napi.rs/)) for the `@kexi/vibe-native` package to call OS-level CoW APIs that were not available through JavaScript runtimes' standard APIs. ### Comparison with Alternatives @@ -26,7 +26,7 @@ Rust was chosen because: ## Architecture Overview -As of Deno 2.x, both runtimes use the same `@kexi/vibe-native` N-API module for native CoW operations. This unification simplifies maintenance and ensures consistent behavior across runtimes. +In the TypeScript-era implementation, Deno 2.x and Node.js used the same `@kexi/vibe-native` N-API module for native CoW operations. The current implementation no longer supports Deno and uses the Rust crates directly. ```mermaid flowchart TD @@ -89,7 +89,7 @@ pub fn clone_sync(src: String, dest: String) -> Result<()> { - Prebuilt binaries for common platforms (macOS x64/arm64, Linux x64/arm64) - Consistent behavior across Deno and Node.js -**Requirements:** +**Historical requirements:** - Deno 2.x or Node.js 18+ - Prebuilt binaries or Rust toolchain for compilation From 7ff562147494592ad371a4a4a1d58644576ea375 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Tue, 23 Jun 2026 09:37:35 +0900 Subject: [PATCH 11/17] docs: align clean strategy function names --- docs/architecture.ja.md | 2 +- docs/architecture.md | 2 +- docs/specifications/clean-strategies.ja.md | 92 +++++++++++----------- docs/specifications/clean-strategies.md | 86 +++++++++++--------- 4 files changed, 99 insertions(+), 83 deletions(-) diff --git a/docs/architecture.ja.md b/docs/architecture.ja.md index 92df8ca..26a1ca8 100644 --- a/docs/architecture.ja.md +++ b/docs/architecture.ja.md @@ -76,7 +76,7 @@ Vibe はゴミ箱サポート付きの高速ディレクトリ削除を提供し ```mermaid flowchart TD - A[fastRemoveDirectory] --> B{Native Trash Available?} + A[fast_remove_directory] --> B{Native Trash Available?} B -->|Yes| C[Native Trash Module] B -->|No| D{macOS?} diff --git a/docs/architecture.md b/docs/architecture.md index ba62355..9b23d61 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -76,7 +76,7 @@ Vibe provides fast directory removal with trash support. ```mermaid flowchart TD - A[fastRemoveDirectory] --> B{Native Trash Available?} + A[fast_remove_directory] --> B{Native Trash Available?} B -->|Yes| C[Native Trash Module] B -->|No| D{macOS?} diff --git a/docs/specifications/clean-strategies.ja.md b/docs/specifications/clean-strategies.ja.md index 9e7fe17..4049a81 100644 --- a/docs/specifications/clean-strategies.ja.md +++ b/docs/specifications/clean-strategies.ja.md @@ -82,20 +82,20 @@ Trash Strategy は、対象ディレクトリを一時的な場所に rename し **クリーンアップ機構:** -`cleanupStaleTrash()` 関数は、残存する `.vibe-trash-*` ディレクトリをスキャンして削除します: +`cleanup_stale_trash()` 関数は、残存する `.vibe-trash-*` ディレクトリをスキャンして削除します: - 削除された worktree の親ディレクトリ - システムの temp ディレクトリ このクリーンアップは各 clean 操作後に自動的に実行されます。 -**実装ファイル:** `packages/core/src/utils/fast-remove.ts` +**実装ファイル:** `rust/crates/vibe-core/src/fast_remove.rs` ### Standard Strategy 標準の `git worktree remove` コマンドを使用します。Trash Strategy が失敗した場合や無効化されている場合のフォールバックとして使用されます。 -**実装ファイル:** `packages/core/src/commands/clean.ts` +**実装ファイル:** `rust/crates/vibe-core/src/commands/clean.rs` ## 設定 @@ -133,58 +133,60 @@ post_clean = ["echo 'Cleanup complete'"] ## ファイル構造 ``` -packages/ -├── native/ -│ ├── Cargo.toml # Rust 依存関係(trash crate を含む) -│ ├── src/lib.rs # ネイティブモジュール(moveToTrash, moveToTrashAsync) -│ └── index.d.ts # TypeScript 型定義 -└── core/src/ - ├── native/ - │ └── index.ts # NativeTrashAdapter インターフェース - ├── runtime/node/ - │ └── native.ts # NodeNativeTrash 実装 - ├── utils/ - │ └── fast-remove.ts # Trash Strategy 実装 - │ ├── isFastRemoveSupported() - │ ├── generateTrashName() - │ ├── moveToSystemTrash() - │ ├── move_to_macos_trash_via_osascript() - │ ├── spawnBackgroundDelete() - │ ├── fastRemoveDirectory() - │ └── cleanupStaleTrash() +rust/crates/ +├── vibe-native/ +│ └── src/lib.rs # trash crate 経由のクロスプラットフォームゴミ箱連携 +└── vibe-core/src/ + ├── fast_remove.rs # Trash Strategy 実装 + │ ├── is_fast_remove_supported() + │ ├── trash_name() + │ ├── move_to_system_trash() + │ ├── move_to_macos_trash_via_osascript() + │ ├── spawn_background_delete() + │ ├── fast_remove_directory() + │ └── cleanup_stale_trash() └── commands/ - └── clean.ts # Clean command 実装 + └── clean.rs # Clean command 実装 ``` **関数の説明:** -| 関数 | 説明 | -| ---------------------------------- | ----------------------------------------------------- | -| `isFastRemoveSupported()` | プラットフォームサポートの確認 | -| `generateTrashName()` | 一意のゴミ箱ディレクトリ名を生成 | -| `moveToSystemTrash()` | ネイティブゴミ箱 + プラットフォーム固有フォールバック | -| `move_to_macos_trash_via_osascript()` | Rust macOS フォールバック | -| `spawnBackgroundDelete()` | デタッチされたバックグラウンド削除 | -| `fastRemoveDirectory()` | メインの高速削除関数 | -| `cleanupStaleTrash()` | 残存ゴミ箱ディレクトリのクリーンアップ | +| 関数 | 説明 | +| --------------------------------------- | ----------------------------------------------------- | +| `is_fast_remove_supported()` | 高速削除サポートの確認 | +| `trash_name()` | 一意のゴミ箱ディレクトリ名を生成 | +| `move_to_system_trash()` | ネイティブゴミ箱 + プラットフォーム固有フォールバック | +| `move_to_macos_trash_via_osascript()` | Rust macOS Finder Trash フォールバック | +| `spawn_background_delete()` | デタッチされたバックグラウンド削除 | +| `fast_remove_directory()` | メインの高速削除関数 | +| `cleanup_stale_trash()` | 残存ゴミ箱ディレクトリのクリーンアップ | ## Strategy 選択機構 clean コマンドはユーザー設定に基づいて適切な strategy を自動選択します: -```typescript -// packages/core/src/commands/clean.ts より -const settings = await loadUserSettings(ctx); -const useFastRemove = settings.clean?.fast_remove ?? true; // デフォルト: true - -if (useFastRemove && isFastRemoveSupported()) { - // Trash Strategy を試行 - const result = await fastRemoveDirectory(worktreePath, ctx); - if (result.success) { - // 成功 - git worktree クリーンアップを実行 - return; - } - // Standard Strategy にフォールスルー +```rust +// rust/crates/vibe-core/src/commands/clean.rs より +let should_fast = use_fast_remove && is_fast_remove_supported(); + +if should_fast { + let result = fast_remove_directory( + deps.io, + &deps.native, + &deps.spawner, + &deps.clock, + &deps.random, + worktree_path, + opts, + ); + + if result.success { + // 空の worktree marker を再作成し、Git に登録解除させる。 + cleanup_stale_trash(deps.io, &deps.spawner, &parent); + return Ok(()); + } + + // Standard Strategy にフォールスルー } // Standard Strategy: git worktree remove diff --git a/docs/specifications/clean-strategies.md b/docs/specifications/clean-strategies.md index fe93ba1..6cc7115 100644 --- a/docs/specifications/clean-strategies.md +++ b/docs/specifications/clean-strategies.md @@ -82,20 +82,20 @@ Example: `.vibe-trash-1705123456789-a1b2c3d4` **Cleanup mechanism:** -The `cleanupStaleTrash()` function scans for and removes any leftover `.vibe-trash-*` directories from: +The `cleanup_stale_trash()` function scans for and removes any leftover `.vibe-trash-*` directories from: - The parent directory of the removed worktree - The system temp directory This cleanup runs automatically after each clean operation. -**Implementation file:** `packages/core/src/utils/fast-remove.ts` +**Implementation file:** `rust/crates/vibe-core/src/fast_remove.rs` ### Standard Strategy Uses the standard `git worktree remove` command. This is used as a fallback when the Trash Strategy fails or is disabled. -**Implementation file:** `packages/core/src/commands/clean.ts` +**Implementation file:** `rust/crates/vibe-core/src/commands/clean.rs` ## Configuration @@ -133,46 +133,60 @@ post_clean = ["echo 'Cleanup complete'"] ## File Structure ``` -packages/ -├── native/ -│ ├── Cargo.toml # Rust dependencies (includes trash crate) -│ ├── src/lib.rs # Native module (moveToTrash, moveToTrashAsync) -│ └── index.d.ts # TypeScript type definitions -└── core/src/ - ├── native/ - │ └── index.ts # NativeTrashAdapter interface - ├── runtime/node/ - │ └── native.ts # NodeNativeTrash implementation - ├── utils/ - │ └── fast-remove.ts # Trash Strategy implementation - │ ├── isFastRemoveSupported() - │ ├── generateTrashName() - │ ├── moveToSystemTrash() # Native trash + platform fallback - │ ├── move_to_macos_trash_via_osascript() # Rust macOS fallback - │ ├── spawnBackgroundDelete() - │ ├── fastRemoveDirectory() - │ └── cleanupStaleTrash() +rust/crates/ +├── vibe-native/ +│ └── src/lib.rs # Cross-platform trash binding via the trash crate +└── vibe-core/src/ + ├── fast_remove.rs # Trash Strategy implementation + │ ├── is_fast_remove_supported() + │ ├── trash_name() + │ ├── move_to_system_trash() # Native trash + platform fallback + │ ├── move_to_macos_trash_via_osascript() + │ ├── spawn_background_delete() + │ ├── fast_remove_directory() + │ └── cleanup_stale_trash() └── commands/ - └── clean.ts # Clean command implementation + └── clean.rs # Clean command implementation ``` +**Function Reference:** + +| Function | Description | +| ------------------------------------- | ----------------------------------------- | +| `is_fast_remove_supported()` | Checks fast-remove support | +| `trash_name()` | Generates a unique trash directory name | +| `move_to_system_trash()` | Native trash + platform-specific fallback | +| `move_to_macos_trash_via_osascript()` | Rust macOS Finder Trash fallback | +| `spawn_background_delete()` | Detached background deletion | +| `fast_remove_directory()` | Main fast-remove function | +| `cleanup_stale_trash()` | Cleanup for leftover trash directories | + ## Strategy Selection Mechanism The clean command automatically selects the appropriate strategy based on user settings: -```typescript -// From packages/core/src/commands/clean.ts -const settings = await loadUserSettings(ctx); -const useFastRemove = settings.clean?.fast_remove ?? true; // Default: true - -if (useFastRemove && isFastRemoveSupported()) { - // Try Trash Strategy - const result = await fastRemoveDirectory(worktreePath, ctx); - if (result.success) { - // Success - perform git worktree cleanup - return; - } - // Fall through to Standard Strategy +```rust +// From rust/crates/vibe-core/src/commands/clean.rs +let should_fast = use_fast_remove && is_fast_remove_supported(); + +if should_fast { + let result = fast_remove_directory( + deps.io, + &deps.native, + &deps.spawner, + &deps.clock, + &deps.random, + worktree_path, + opts, + ); + + if result.success { + // Recreate the empty worktree marker and let Git unregister it. + cleanup_stale_trash(deps.io, &deps.spawner, &parent); + return Ok(()); + } + + // Fall through to Standard Strategy. } // Standard Strategy: git worktree remove From b1ef6bc2df9c18f91a503ef29eeaf0984087d2de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 03:43:27 +0000 Subject: [PATCH 12/17] chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/beta-release.yml | 6 +++--- .github/workflows/ci.yml | 18 +++++++++--------- .github/workflows/docs.yml | 2 +- .github/workflows/nix.yml | 2 +- .github/workflows/publish-npm.yml | 10 +++++----- .github/workflows/release.yml | 8 ++++---- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/beta-release.yml b/.github/workflows/beta-release.yml index 34f4d25..392335f 100644 --- a/.github/workflows/beta-release.yml +++ b/.github/workflows/beta-release.yml @@ -23,7 +23,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Determine beta version id: version @@ -80,7 +80,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain @@ -205,7 +205,7 @@ jobs: echo "linux_arm64=$(sha256sum artifacts/vibe-linux-arm64 | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT echo "linux_x64=$(sha256sum artifacts/vibe-linux-x64 | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: path: vibe-source diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ec3fc6..6c3ac43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - uses: ./.github/actions/setup-takumi-guard with: @@ -46,7 +46,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - name: Check formatting working-directory: rust @@ -87,7 +87,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - name: Add Rust target run: rustup target add ${{ matrix.target }} @@ -132,7 +132,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - uses: ./.github/actions/setup-takumi-guard with: @@ -178,7 +178,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - uses: ./.github/actions/setup-takumi-guard @@ -268,7 +268,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - name: Read version @@ -416,7 +416,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - uses: ./.github/actions/setup-takumi-guard with: @@ -440,7 +440,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain - run: pinact run --check @@ -462,7 +462,7 @@ jobs: # every commit in the range (not just the tip), catching a secret added in # an intermediate commit even if a later commit removes it. On push it # scans the full history of the pushed ref. - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 # Why the official action instead of the dev-shell gitleaks via a plain diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 94b72c6..f046252 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -26,7 +26,7 @@ jobs: with: egress-policy: audit - name: Checkout - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Setup toolchain uses: ./.github/actions/setup-toolchain diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index cfb1986..9037f15 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -36,7 +36,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index a7c7542..219aa51 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -41,7 +41,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Resolve release tag and enforce stable-release gate id: meta @@ -92,7 +92,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain @@ -129,7 +129,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain @@ -178,7 +178,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain @@ -296,7 +296,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fb3c697..35f250f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,7 +54,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain @@ -144,7 +144,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain @@ -207,7 +207,7 @@ jobs: uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 with: egress-policy: audit - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: ./.github/actions/setup-toolchain @@ -294,7 +294,7 @@ jobs: echo "template=vibe.rb" >> $GITHUB_OUTPUT fi - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: path: vibe-source From 9a24c18451d18400f6804d4017801bce9c6f2170 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 03:43:31 +0000 Subject: [PATCH 13/17] chore(deps): bump softprops/action-gh-release from 3.0.0 to 3.0.1 Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/b4309332981a82ec1c5618f44dd2e27cc8bfbfda...718ea10b132b3b2eba29c1007bb80653f286566b) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 3.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fb3c697..06f78a4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -255,7 +255,7 @@ jobs: merge-multiple: true - name: Create Release - uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0 + uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1 with: files: artifacts/* generate_release_notes: true From 8ac652900220b4ed64b54a200e01c191f2d4851e Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Tue, 23 Jun 2026 18:47:34 +0900 Subject: [PATCH 14/17] fix: show progress tree during worktree creation --- rust/crates/vibe-core/src/commands/start.rs | 36 +++++++++- .../vibe-core/src/commands/start_tests.rs | 31 ++++++++- rust/crates/vibe-core/src/progress.rs | 66 ++++++++++++++----- 3 files changed, 114 insertions(+), 19 deletions(-) diff --git a/rust/crates/vibe-core/src/commands/start.rs b/rust/crates/vibe-core/src/commands/start.rs index 0b381f0..d6b5dee 100644 --- a/rust/crates/vibe-core/src/commands/start.rs +++ b/rust/crates/vibe-core/src/commands/start.rs @@ -227,7 +227,7 @@ where &format!("Running: {}", get_create_worktree_command(&create_opts)), opts, ); - create_worktree(deps.git, &create_opts)?; + run_create_worktree_with_progress(deps, branch_name, &create_opts)?; } run_config_and_hooks( @@ -253,6 +253,40 @@ where Ok(Outcome::cd(worktree_path)) } +fn run_create_worktree_with_progress( + deps: &StartDeps, + branch_name: &str, + create_opts: &CreateWorktreeOptions<'_>, +) -> Result<()> +where + I: Io, + G: GitRunner, + R: RepoResolver, + S: ScriptRunner, + P: Prompt, + Sr: StdinReader, +{ + deps.tracker.start(); + let phase = deps + .tracker + .add_phase(&format!("Setting up worktree {branch_name}")); + let task = deps.tracker.add_task(phase, "Create worktree"); + deps.tracker.start_task(task); + + match create_worktree(deps.git, create_opts) { + Ok(()) => {} + Err(err) => { + deps.tracker.fail_task(task, &err.to_string()); + deps.tracker.finish(); + return Err(err); + } + } + + deps.tracker.complete_task(task); + deps.tracker.finish(); + Ok(()) +} + /// Outcome of resolving the `--base` flag, self-describing so the caller cannot /// confuse "not given" with "given but invalid". enum BaseRef { diff --git a/rust/crates/vibe-core/src/commands/start_tests.rs b/rust/crates/vibe-core/src/commands/start_tests.rs index 01434a0..e3b97f0 100644 --- a/rust/crates/vibe-core/src/commands/start_tests.rs +++ b/rust/crates/vibe-core/src/commands/start_tests.rs @@ -7,7 +7,7 @@ use crate::error::VibeError; use crate::git::RepoInfo; use crate::hooks::FakeHookRunner; use crate::io::FakeIo; -use crate::progress::RecordingTracker; +use crate::progress::{RecordingTracker, TrackerEvent}; use crate::stdin::FakeStdin; use crate::worktree_path::ScriptOutput; use std::cell::RefCell; @@ -245,6 +245,35 @@ fn existing_branch_worktree_navigates_on_confirm() { assert!(!git.calls_contain(&["worktree", "add"])); } +#[test] +fn new_worktree_creation_is_tracked_even_without_config_operations() { + let (_fx, io) = io_with_home(); + let git = MockGit::new("/repo", "worktree /repo\nbranch refs/heads/main\n\n"); + let (r, s, p, sin, fk) = ( + NoResolver, + NoScript, + ScriptPrompt::confirming(true), + FakeStdin::none(), + Fakes::new(), + ); + let d = deps(&io, &git, &r, &s, &p, &sin, &fk); + let outcome = + start_command(&d, "feat", &StartFlags::default(), OutputOptions::default()).unwrap(); + + assert!(outcome.cd_path.is_some()); + assert!(git.calls_contain(&["worktree", "add"])); + + let events = fk.tracker.events(); + let create_task = events.iter().any(|event| match event { + TrackerEvent::Task(label) => label == "Create worktree", + _ => false, + }); + assert!(create_task, "create task should be tracked: {events:?}"); + assert!(events.contains(&TrackerEvent::Started)); + assert!(events.contains(&TrackerEvent::Finished)); + assert!(events.contains(&TrackerEvent::Phase("Setting up worktree feat".into()))); +} + #[test] fn existing_branch_worktree_cancels_on_decline() { let (_fx, io) = io_with_home(); diff --git a/rust/crates/vibe-core/src/progress.rs b/rust/crates/vibe-core/src/progress.rs index bd675f8..a174309 100644 --- a/rust/crates/vibe-core/src/progress.rs +++ b/rust/crates/vibe-core/src/progress.rs @@ -79,7 +79,14 @@ impl ProgressTracker for NullTracker { /// Live progress tracker backed by `indicatif`, drawing to STDERR only. pub struct IndicatifTracker { multi: indicatif::MultiProgress, - bars: std::sync::Mutex>, + bars: std::sync::Mutex>, +} + +struct BarNode { + bar: indicatif::ProgressBar, + prefix: String, + label: String, + done: bool, } impl Default for IndicatifTracker { @@ -99,48 +106,73 @@ impl IndicatifTracker { } } - fn push_bar(&self, label: &str) -> NodeId { + fn push_bar(&self, label: &str, prefix: &str) -> NodeId { let bar = self.multi.add(indicatif::ProgressBar::new_spinner()); + let style = indicatif::ProgressStyle::with_template("{prefix}{spinner} {msg}") + .expect("static progress template must be valid") + .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]); + bar.set_style(style); + bar.set_prefix(prefix.to_string()); bar.set_message(label.to_string()); let mut bars = self.bars.lock().expect("progress mutex poisoned"); let id = NodeId(bars.len()); - bars.push(bar); + bars.push(BarNode { + bar, + prefix: prefix.to_string(), + label: label.to_string(), + done: false, + }); id } - fn with_bar(&self, id: NodeId, f: impl FnOnce(&indicatif::ProgressBar)) { - let bars = self.bars.lock().expect("progress mutex poisoned"); - if let Some(bar) = bars.get(id.0) { - f(bar); + fn with_bar(&self, id: NodeId, f: impl FnOnce(&mut BarNode)) { + let mut bars = self.bars.lock().expect("progress mutex poisoned"); + if let Some(node) = bars.get_mut(id.0) { + f(node); } } } impl ProgressTracker for IndicatifTracker { fn add_phase(&self, label: &str) -> NodeId { - self.push_bar(label) + self.push_bar(label, "┗ ") } fn add_task(&self, _phase: NodeId, label: &str) -> NodeId { - self.push_bar(label) + self.push_bar(label, " ┗ ") } fn start_task(&self, id: NodeId) { - self.with_bar(id, |b| { - b.enable_steady_tick(std::time::Duration::from_millis(80)) + self.with_bar(id, |node| { + node.bar + .enable_steady_tick(std::time::Duration::from_millis(80)) }); } fn complete_task(&self, id: NodeId) { - self.with_bar(id, |b| b.finish()); + self.with_bar(id, |node| { + node.done = true; + node.bar.set_prefix(""); + node.bar + .finish_with_message(format!("{}☒ {}", node.prefix, node.label)); + }); } fn fail_task(&self, id: NodeId, err: &str) { let msg = format!("failed: {err}"); - self.with_bar(id, |b| b.abandon_with_message(msg)); + self.with_bar(id, |node| { + node.done = true; + node.bar.set_prefix(""); + node.bar + .abandon_with_message(format!("{}☒ {} ({msg})", node.prefix, node.label)); + }); } fn start(&self) {} fn finish(&self) { - let bars = self.bars.lock().expect("progress mutex poisoned"); - for bar in bars.iter() { - if !bar.is_finished() { - bar.finish_and_clear(); + let mut bars = self.bars.lock().expect("progress mutex poisoned"); + for node in bars.iter_mut() { + let is_unfinished = !node.done; + if is_unfinished { + node.done = true; + node.bar.set_prefix(""); + node.bar + .finish_with_message(format!("{}☒ {}", node.prefix, node.label)); } } } From 06d32fd9caa9372d7deba9c91695effcd7eeaa91 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Tue, 23 Jun 2026 20:14:27 +0900 Subject: [PATCH 15/17] chore(deps): align dependabot npm updates Keep the lockfile, Starlight, and Vitest UI peers compatible with Astro 6 and Vitest 3. --- packages/docs/astro.config.ts | 8 +- packages/docs/package.json | 2 +- packages/e2e/package.json | 2 +- pnpm-lock.yaml | 3196 +++++++++------------------------ 4 files changed, 889 insertions(+), 2319 deletions(-) diff --git a/packages/docs/astro.config.ts b/packages/docs/astro.config.ts index f9111f3..c944e46 100644 --- a/packages/docs/astro.config.ts +++ b/packages/docs/astro.config.ts @@ -78,22 +78,22 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= { label: "Configuration", translations: { ja: "設定" }, - autogenerate: { directory: "configuration" }, + items: [{ autogenerate: { directory: "configuration" } }], }, { label: "Commands", translations: { ja: "コマンド" }, - autogenerate: { directory: "commands" }, + items: [{ autogenerate: { directory: "commands" } }], }, { label: "Recipes", translations: { ja: "レシピ集" }, - autogenerate: { directory: "recipes" }, + items: [{ autogenerate: { directory: "recipes" } }], }, { label: "Security", translations: { ja: "セキュリティ" }, - autogenerate: { directory: "security" }, + items: [{ autogenerate: { directory: "security" } }], }, { slug: "changelog", diff --git a/packages/docs/package.json b/packages/docs/package.json index d4dd805..d6a785a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -16,7 +16,7 @@ "ci": "pnpm lint && pnpm format && pnpm check && pnpm build" }, "dependencies": { - "@astrojs/starlight": "^0.37.2", + "@astrojs/starlight": "^0.40.0", "@resvg/resvg-js": "^2.6.2", "astro": "^6.4.6", "satori": "^0.18.3", diff --git a/packages/e2e/package.json b/packages/e2e/package.json index fb77fbf..03412fb 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@types/node": "^22.10.2", - "@vitest/ui": "^2.1.8", + "@vitest/ui": "^3.2.6", "node-pty": "^1.1.0", "typescript": "^5.7.2", "vitest": "^3.2.6" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05520c8..ec5b704 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,14 +28,14 @@ importers: packages/docs: dependencies: '@astrojs/starlight': - specifier: ^0.37.2 - version: 0.37.3(astro@5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + specifier: ^0.40.0 + version: 0.40.0(astro@6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2))(typescript@5.9.3) '@resvg/resvg-js': specifier: ^2.6.2 version: 2.6.2 astro: - specifier: ^5.6.1 - version: 5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + specifier: ^6.4.6 + version: 6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2) satori: specifier: ^0.18.3 version: 0.18.3 @@ -65,8 +65,8 @@ importers: specifier: ^22.10.2 version: 22.19.7 '@vitest/ui': - specifier: ^2.1.8 - version: 2.1.9(vitest@2.1.9) + specifier: ^3.2.6 + version: 3.2.6(vitest@3.2.6) node-pty: specifier: ^1.1.0 version: 1.1.0 @@ -74,14 +74,14 @@ importers: specifier: ^5.7.2 version: 5.9.3 vitest: - specifier: ^2.1.8 - version: 2.1.9(@types/node@22.19.7)(@vitest/ui@2.1.9)(terser@5.46.0) + specifier: ^3.2.6 + version: 3.2.6(@types/debug@4.1.12)(@types/node@22.19.7)(@vitest/ui@3.2.6)(terser@5.46.0)(yaml@2.8.2) packages/npm: devDependencies: vitest: - specifier: ^2.1.0 - version: 2.1.9(@types/node@22.19.7)(@vitest/ui@2.1.9)(terser@5.46.0) + specifier: ^3.2.6 + version: 3.2.6(@types/debug@4.1.12)(@types/node@24.13.2)(@vitest/ui@3.2.6)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: '@kexi/vibe-darwin-arm64': specifier: 2.0.0 @@ -120,8 +120,11 @@ packages: '@astrojs/compiler@2.13.0': resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} - '@astrojs/internal-helpers@0.7.5': - resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} + '@astrojs/compiler@4.0.0': + resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==} + + '@astrojs/internal-helpers@0.10.0': + resolution: {integrity: sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==} '@astrojs/language-server@2.16.3': resolution: {integrity: sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==} @@ -135,64 +138,71 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@6.3.10': - resolution: {integrity: sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==} + '@astrojs/markdown-remark@7.2.0': + resolution: {integrity: sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw==} - '@astrojs/mdx@4.3.13': - resolution: {integrity: sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/mdx@6.0.3': + resolution: {integrity: sha512-+4P3ZvwsRAqAbBgY+uZMewFo3ficlIBPZfu/Luk+v4ia/ZOuFhpsw7r+7672uT2Fc1UPdp7yW0eU5egvSq0wbw==} + engines: {node: '>=22.12.0'} peerDependencies: - astro: ^5.0.0 + '@astrojs/markdown-satteri': 0.3.0 + astro: ^6.4.0 + peerDependenciesMeta: + '@astrojs/markdown-satteri': + optional: true - '@astrojs/prism@3.3.0': - resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/prism@4.0.2': + resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} + engines: {node: '>=22.12.0'} - '@astrojs/sitemap@3.7.0': - resolution: {integrity: sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==} + '@astrojs/sitemap@3.7.3': + resolution: {integrity: sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==} - '@astrojs/starlight@0.37.3': - resolution: {integrity: sha512-p7cqbAkBYkBTiK1NIomxAEoF9Wko+mTV503qDm5Wgh+0MGGJnSsIzCSSJ+rWm8toFk9mnzNwNbxcnjwzIBEU3w==} + '@astrojs/starlight@0.40.0': + resolution: {integrity: sha512-H1NBIXx4Xw6YzKMsoMkazYxFgnTTj6pD4IReUGWj1fqw82AOAgj+WnZLpTDWRExf3b9ZM7Popbl583i4IvDNVQ==} peerDependencies: - astro: ^5.5.0 + '@astrojs/markdown-satteri': ^0.2.0 + astro: ^6.4.5 + peerDependenciesMeta: + '@astrojs/markdown-satteri': + optional: true - '@astrojs/telemetry@3.3.0': - resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + '@astrojs/telemetry@3.3.2': + resolution: {integrity: sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} '@astrojs/yaml2ts@0.2.2': resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.1': - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@capsizecss/unpack@4.0.0': resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} engines: {node: '>=18'} + '@clack/core@1.4.2': + resolution: {integrity: sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.6.0': + resolution: {integrity: sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==} + engines: {node: '>= 20.12.0'} + '@ctrl/tinycolor@4.2.0': resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} engines: {node: '>=14'} @@ -221,35 +231,17 @@ packages: '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} - cpu: [arm64] - os: [android] + cpu: [ppc64] + os: [aix] '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} @@ -257,16 +249,10 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] os: [android] '@esbuild/android-arm@0.25.12': @@ -275,16 +261,10 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm] os: [android] '@esbuild/android-x64@0.25.12': @@ -293,17 +273,11 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} @@ -311,16 +285,10 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.25.12': @@ -329,17 +297,11 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} @@ -347,16 +309,10 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.25.12': @@ -365,17 +321,11 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} @@ -383,16 +333,10 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} - cpu: [arm] + cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.25.12': @@ -401,16 +345,10 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.25.12': @@ -419,16 +357,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} - cpu: [loong64] + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.25.12': @@ -437,16 +369,10 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} - cpu: [mips64el] + cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.25.12': @@ -455,16 +381,10 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.25.12': @@ -473,16 +393,10 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.25.12': @@ -491,16 +405,10 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} - cpu: [s390x] + cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.25.12': @@ -509,20 +417,20 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -533,16 +441,10 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.25.12': @@ -551,11 +453,11 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + cpu: [x64] + os: [netbsd] '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} @@ -563,20 +465,20 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -587,17 +489,11 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} - cpu: [x64] - os: [sunos] + cpu: [arm64] + os: [openharmony] '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} @@ -605,17 +501,11 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} @@ -623,16 +513,10 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} - cpu: [ia32] + cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.25.12': @@ -641,35 +525,35 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@expressive-code/core@0.41.6': - resolution: {integrity: sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==} + '@expressive-code/core@0.43.1': + resolution: {integrity: sha512-H4rUJXKyS6y2q9Ig9bIp3dFhWhkZQIeH/jRGl3DROlslrGvfD4OC9qzmvKEFExm+/DtdvvHMQ8/Olmrcfxp+wQ==} - '@expressive-code/plugin-frames@0.41.6': - resolution: {integrity: sha512-d+hkSYXIQot6fmYnOmWAM+7TNWRv/dhfjMsNq+mIZz8Tb4mPHOcgcfZeEM5dV9TDL0ioQNvtcqQNuzA1sRPjxg==} + '@expressive-code/plugin-frames@0.43.1': + resolution: {integrity: sha512-tENfLw2UDeq5h749tTLvUtQYvgjIiQc6W7PBCR5xQ4yuE/QftManKJfUQjwJo6RRsAimVQDN4alhFTJ3aq1Khg==} - '@expressive-code/plugin-shiki@0.41.6': - resolution: {integrity: sha512-Y6zmKBmsIUtWTzdefqlzm/h9Zz0Rc4gNdt2GTIH7fhHH2I9+lDYCa27BDwuBhjqcos6uK81Aca9dLUC4wzN+ng==} + '@expressive-code/plugin-shiki@0.43.1': + resolution: {integrity: sha512-NdceinYEROXODNgB/ix+7oCdIg+nGyok+E+p2lU9YlWd1xKshXdXpmmptKfkuU27MJ5jjnfhMCI78YYBGi9GtQ==} - '@expressive-code/plugin-text-markers@0.41.6': - resolution: {integrity: sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==} + '@expressive-code/plugin-text-markers@0.43.1': + resolution: {integrity: sha512-JWf8wdbZSNoGY4TFv3lmt3/NNDaCP7iYL6rRYD05g8YYjKL62hKUHLl5+B47+v0+bqbuMhXDN7qz2wywFUvMkg==} '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} @@ -1094,126 +978,46 @@ packages: resolution: {integrity: sha512-L5oSCA3Ehr2BvRCHy9e64InPnkfjeopwsP4VsxfZwcvZA9c7wRp48RXVt2q3OA8Z/uM6RFbE/VIB2ZYTA31guA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@pagefind/darwin-arm64@1.4.0': - resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} cpu: [arm64] os: [darwin] - '@pagefind/darwin-x64@1.4.0': - resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} cpu: [x64] os: [darwin] '@pagefind/default-ui@1.4.0': resolution: {integrity: sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==} - '@pagefind/freebsd-x64@1.4.0': - resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} cpu: [x64] os: [freebsd] - '@pagefind/linux-arm64@1.4.0': - resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} cpu: [arm64] os: [linux] - '@pagefind/linux-x64@1.4.0': - resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} cpu: [x64] os: [linux] - '@pagefind/windows-x64@1.4.0': - resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} - cpu: [x64] - os: [win32] - - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - - '@remotion/bundler@4.0.246': - resolution: {integrity: sha512-XgMU5AqE20TWR9xBqJNQqL5bzIhFH4liynFyrPj8QY5wxs+5o4o/IEbDz8T++9GqDmrHNDRq9SwspNY4+7lvKw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@remotion/cli@4.0.246': - resolution: {integrity: sha512-J+rPbRO5U+s3ynJIutRZtxXYT1KACMbSr4xahsTnBuX0OCEiedy+Ma5tmO8QhQbwRrInWFjcdsFhoEEek8OXnA==} - hasBin: true - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@remotion/compositor-darwin-arm64@4.0.246': - resolution: {integrity: sha512-ArOXpqF9Bgb3t5k5xfumohpLcwOgII2E6QNH+cD+LEPl5Rqs4ZI3a0mO2EyK6CLwof8XsytQiEY34GOjxDWjNA==} - cpu: [arm64] - os: [darwin] - - '@remotion/compositor-darwin-x64@4.0.246': - resolution: {integrity: sha512-x2tAjg+pzAEzRMHffggts9WdiRbS/CMupzsMgpMAxsk/lInHxRtyz40VqpHrt1lEUHar0sMqbtj83pw2EkFLRQ==} - cpu: [x64] - os: [darwin] - - '@remotion/compositor-linux-arm64-gnu@4.0.246': - resolution: {integrity: sha512-iWOpOA0DhG3UyYAa/8QfvOE/WVhG3/X5Bz9qiYahfIuZ8IdqRFadlrMqWaBqUrwfDlZeonGhUcrs7OZd+MmAsg==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@remotion/compositor-linux-arm64-musl@4.0.246': - resolution: {integrity: sha512-vaLfdALy1Rmt+4zhf2c3ber3X9zETPQQC+m5skKKM8AbivLK4bZ0O851uJku0qqTf73YbTWd3q7aLGNbNs8OYQ==} + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} cpu: [arm64] - os: [linux] - libc: [musl] - - '@remotion/compositor-linux-x64-gnu@4.0.246': - resolution: {integrity: sha512-abYnRjSzOX1py1iJ06pwpUqcMsH0hY9IN7D6Dj9sK8kzL0nOsXKPfcAUKZlwQvfyB0govnm1DhN/cxI6nvxO2w==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@remotion/compositor-linux-x64-musl@4.0.246': - resolution: {integrity: sha512-f+dwEi5gfaARTJ8lMIKrkeObh4RKw/cAid0FnNTO3UWm97N/b94rPNEFgjbZDg73CrhJ/8pJMSf6VqzCOB7Xdg==} - cpu: [x64] - os: [linux] - libc: [musl] + os: [win32] - '@remotion/compositor-win32-x64-msvc@4.0.246': - resolution: {integrity: sha512-QNQZVuCdQ+6Ec2+4IQtx+gImbvXFv0ANK+u2ccxUKm4ke8kGuAUS5ra8qJcWShrQPWV97z2MUCvnKbZEPoPvaw==} + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} cpu: [x64] os: [win32] - '@remotion/media-parser@4.0.246': - resolution: {integrity: sha512-u4t/IM6pJSSiwMXqxZbtIKXKrlGW+IRtZ18Yz0oC61Kz1YFIAoe4FcOrj3hKRvzkC3BMJOd9gdCjDOWPIYbIkQ==} - - '@remotion/media-utils@4.0.246': - resolution: {integrity: sha512-nCFPIco9ByYxJIadXW+CGST2t08n+h7NwzzMjDr8jzNUtUWVxNANbtVxyj0dis1xX+MUQH9a7IDY5DjWjH6ZpA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@remotion/player@4.0.246': - resolution: {integrity: sha512-FRWCdwDBJ1vhZnyMTNCRW0rsrzrB16KQVKO0uecudmsLs07vxnmpya97X6gdhb0jvA7hd6aDlW/h37yW/PWs3Q==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@remotion/renderer@4.0.246': - resolution: {integrity: sha512-OBIQ2ENoyNeoHMmf8yVH0pold9ommi6uDvmRopD2Ni3rP/Vre7x74q1mts3ig6cTmVGQuD9sp85b5Y+cpIlzRg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@remotion/streaming@4.0.246': - resolution: {integrity: sha512-lnPJx84O6jEk3yPLZ8GqdFDuq1Wj0LVSrzWQ30yXC8Jkc2ApB7ca4TyEelm3IFqS3Jx5jeldUFCSbW7tfsfMDA==} - - '@remotion/studio-server@4.0.246': - resolution: {integrity: sha512-35LD8mJT4JbRWRNWZvgoj9a/AzMyFFXqTgJUvYFM+hoJfaTKru1/JJnAkd5TT5iV4vrg5GCjMBKBOLWgvyyMUQ==} - - '@remotion/studio-shared@4.0.246': - resolution: {integrity: sha512-CdJ46mIrJGe/MaTAc7Y2svehcx5DSyfA2p+NoCK/KHQq/s5Y+NW0kvXm8nPADUZpRYM3XAgI8tGET65Ejppryw==} - - '@remotion/studio@4.0.246': - resolution: {integrity: sha512-Cy6/Jd8r1cAUUIP0yfWNL+YhEbTNS6Mg+LezVgtrwifwxVtkOP+EK2G2zcgMnG90FcrhHMJuSMc85KShWxy4Eg==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} '@resvg/resvg-js-android-arm-eabi@2.6.2': resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} @@ -1442,23 +1246,33 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@3.21.0': - resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==} + '@shikijs/core@4.2.0': + resolution: {integrity: sha512-Hc87Ab1Ld/vEbZRCbwx344I5v+4RU8CVToUTRkqXL1+TjbuOp9U5Xa0M23V4GEWHxVn+yO5otb+HkQVm3ptWQQ==} + engines: {node: '>=20'} - '@shikijs/engine-javascript@3.21.0': - resolution: {integrity: sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==} + '@shikijs/engine-javascript@4.2.0': + resolution: {integrity: sha512-fjETeq1k5ffyXqRgS6+3hpvqseLalp1kjNfRbXpUgWR8FpZ1CmQfiNHovc5lncYjt/Vg5JK/WJEmLahjwMa0og==} + engines: {node: '>=20'} - '@shikijs/engine-oniguruma@3.21.0': - resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==} + '@shikijs/engine-oniguruma@4.2.0': + resolution: {integrity: sha512-hTorK1dffPkpbMUk6Z+828PgRo7d07HbnizoP0hNPFjhxMHctj0Px/qoHeGMYafc6ju+u9iMldN4JbVzNQM++g==} + engines: {node: '>=20'} - '@shikijs/langs@3.21.0': - resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==} + '@shikijs/langs@4.2.0': + resolution: {integrity: sha512-bwrVRlJ0wUhZxAbVdvBbv2TTC9yLsh4C/IO5Ofz0T8MQntgDvyVnkbjw9vi50r1kx7RCIJdnJnjZAwmAsXFLZQ==} + engines: {node: '>=20'} - '@shikijs/themes@3.21.0': - resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==} + '@shikijs/primitive@4.2.0': + resolution: {integrity: sha512-NOq+DtUkVBJtZMVXL5A0vI0Xk8nvDYaXetFHSJFlOqjDZIVhIPRYFdGkSoElDqNuegikcc3A76SNUa8dTqtAYA==} + engines: {node: '>=20'} - '@shikijs/types@3.21.0': - resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==} + '@shikijs/themes@4.2.0': + resolution: {integrity: sha512-RX8IHYeLv8Cu2W6ruc3RxUqWn0IYCqSrMBzi/uRGAmfyDNOnNO5BF/Px7o97n4XTpmFTo5GbRaazuOWj+2ak2w==} + engines: {node: '>=20'} + + '@shikijs/types@4.2.0': + resolution: {integrity: sha512-VT/MKtlpOhEPZloSH3Pb9WCZEBDoQVMa9jedp5UAwmJOar1DVc9DRODAxmYPW9M93IK4ryuqRejFfmlvlVDemw==} + engines: {node: '>=20'} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1468,14 +1282,14 @@ packages: engines: {node: '>= 8.0.0'} hasBin: true + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -1489,9 +1303,6 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1504,22 +1315,11 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.19.7': resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} - peerDependencies: - '@types/react': ^18.0.0 - - '@types/react@18.3.18': - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/node@24.13.2': + resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -1530,46 +1330,43 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher - '@vitest/expect@2.1.9': - resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + '@vitest/expect@3.2.6': + resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} - '@vitest/mocker@2.1.9': - resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + '@vitest/mocker@3.2.6': + resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + '@vitest/pretty-format@3.2.6': + resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@vitest/runner@3.2.6': + resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} - '@vitest/snapshot@2.1.9': - resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + '@vitest/snapshot@3.2.6': + resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} - '@vitest/spy@2.1.9': - resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + '@vitest/spy@3.2.6': + resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} - '@vitest/ui@2.1.9': - resolution: {integrity: sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==} + '@vitest/ui@3.2.6': + resolution: {integrity: sha512-mATfG3zVdhobE9U1rIpvtYD3DGuSSxqZ3Aj/8ityGqKXy8YDJ9BoAjZmAz6dZ1IZ1xI5V+MerkCczvVa+3QK9Q==} peerDependencies: - vitest: 2.1.9 + vitest: 3.2.6 - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vitest/utils@3.2.6': + resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} '@volar/kit@2.4.27': resolution: {integrity: sha512-ilZoQDMLzqmSsImJRWx4YiZ4FcvvPrPnFVmL6hSsIWB6Bn3qc7k88J9yP32dagrs5Y8EXIlvvD/mAFaiuEOACQ==} @@ -1597,57 +1394,6 @@ packages: '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1658,6 +1404,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -1666,49 +1417,17 @@ packages: ajv: optional: true - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1730,22 +1449,18 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - astro-expressive-code@0.41.6: - resolution: {integrity: sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==} + astro-expressive-code@0.43.1: + resolution: {integrity: sha512-xddgwQxFRwpnnAnU7kSfrO82SsOAq7sQrYpXxVcrN9k/0aqNlTH2+mLrOMm1wXm6jdFKepst3hd8/qWojwuunw==} peerDependencies: astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta - astro@5.16.9: - resolution: {integrity: sha512-gJvoZv0v8xCcKBcsxz1ZfXqoJ7sJJcyoKP8bUTjkuD4vDShLe0N26em4LQxitVv/2HLOpldQg67bEHB/qGoxJA==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + astro@6.4.8: + resolution: {integrity: sha512-KK5lX90uU9EeVaTjINyj3sy9/NFXVa59aowaqbWBDDKLXZh4rr7GwIaCFYVetE22MJtsCNFerQXn0vlCLmpP/Q==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true axobject-query@4.1.0: @@ -1755,41 +1470,19 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - base64-js@0.0.8: resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} engines: {node: '>= 0.4'} - baseline-browser-mapping@2.9.15: - resolution: {integrity: sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==} - hasBin: true - bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} bcp-47@2.1.0: resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - boxen@8.0.1: - resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} - engines: {node: '>=18'} - - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1797,16 +1490,9 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - camelcase@8.0.0: - resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} - engines: {node: '>=16'} - camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001764: - resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} - ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1814,10 +1500,6 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -1842,18 +1524,10 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1882,20 +1556,17 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} - cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} @@ -1913,12 +1584,6 @@ packages: resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==} engines: {node: '>=16'} - css-loader@5.2.7: - resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.27.0 || ^5.0.0 - css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -1949,9 +1614,6 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1968,12 +1630,8 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -1986,27 +1644,20 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - deterministic-object-hash@2.0.2: - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} - engines: {node: '>=18'} - - devalue@5.6.2: - resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} + devalue@5.8.1: + resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} direction@2.0.1: resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} hasBin: true - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -2020,17 +1671,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv@9.0.2: - resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} - engines: {node: '>=10'} - dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} - emmet@2.4.11: resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} @@ -2038,23 +1682,9 @@ packages: resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} engines: {node: '>=10.0.0'} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} - engines: {node: '>=10.13.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2066,24 +1696,22 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true @@ -2098,27 +1726,6 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -2143,43 +1750,33 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - expressive-code@0.41.6: - resolution: {integrity: sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==} + expressive-code@0.43.1: + resolution: {integrity: sha512-JdOzanoU825iNvslmk6Kg8Ro61eSHmDK2Zz7BynOxObVrpIXZNzrIZOwQO2uDQcGsjSYShL/8vTrXgeWYnq3NA==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -2203,16 +1800,13 @@ packages: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} - fontace@0.4.0: - resolution: {integrity: sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==} + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} fontkitten@1.0.2: resolution: {integrity: sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==} engines: {node: '>=20'} - fs-monkey@1.0.3: - resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2222,33 +1816,15 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} - engines: {node: '>=18'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-tsconfig@5.0.0-beta.4: + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + engines: {node: '>=20.20.0'} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - h3@1.15.5: - resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} @@ -2326,21 +1902,13 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - i18next@23.16.8: - resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} - - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} + i18next@26.3.1: + resolution: {integrity: sha512-txQqd5EULsqEh9OJqRH15aCaOuy/nLJyhw5EHCSKLKJE1aBbb3Zve2+uQIxgWhPm1QqUQoWyQBm2kfmmIrzkcQ==} peerDependencies: - postcss: ^8.1.0 - - import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + typescript: ^5 || ^6 + peerDependenciesMeta: + typescript: + optional: true inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} @@ -2357,16 +1925,16 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -2383,56 +1951,26 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -2444,43 +1982,24 @@ packages: linebreak@1.1.0: resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} - engines: {node: '>=6.11.5'} - - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@11.2.4: - resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.5.1: - resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} @@ -2549,18 +2068,11 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - memfs@3.4.3: - resolution: {integrity: sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==} - engines: {node: '>= 4.0.0'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - micromark-extension-directive@3.0.2: - resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -2664,21 +2176,6 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - minimist@1.2.6: - resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -2694,9 +2191,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} @@ -2716,42 +2210,28 @@ packages: node-pty@1.1.0: resolution: {integrity: sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} - oniguruma-to-es@4.3.4: - resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} oxfmt@0.52.0: resolution: {integrity: sha512-nJlYM35F64zTDMecCNhoHNkf+D/eHv7xcjj9XDSj+bFAVtN93m7v8DQMdHd6nDG6Akf/kEYYHmDUBs2Dz27Sug==} @@ -2779,23 +2259,23 @@ packages: vite-plus: optional: true - p-limit@6.2.0: - resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} - engines: {node: '>=18'} + p-limit@7.3.0: + resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} + engines: {node: '>=20'} - p-queue@8.1.1: - resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} - engines: {node: '>=18'} + p-queue@9.3.0: + resolution: {integrity: sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==} + engines: {node: '>=20'} - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - pagefind@1.4.0: - resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} hasBin: true pako@0.2.9: @@ -2816,20 +2296,13 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pathval@2.0.1: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -2844,29 +2317,9 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} @@ -2878,10 +2331,6 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -2902,39 +2351,12 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-refresh@0.9.0: - resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} - engines: {node: '>=0.10.0'} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -2943,10 +2365,6 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} - recast@0.23.9: - resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} - engines: {node: '>= 4'} - recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -2970,8 +2388,8 @@ packages: regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - rehype-expressive-code@0.41.6: - resolution: {integrity: sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==} + rehype-expressive-code@0.43.1: + resolution: {integrity: sha512-CUOGQVlUcSMSXZgpcq9xL6B+dZqnI3w1R6EZj932XpGgj2Hmy7H6oMqa9W/Z7X2HOILWLWhqu1b9kuYcD+nd6w==} rehype-format@5.0.1: resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} @@ -2991,8 +2409,8 @@ packages: rehype@13.0.2: resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} - remark-directive@3.0.1: - resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + remark-directive@4.0.0: + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -3013,12 +2431,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - remotion@4.0.246: - resolution: {integrity: sha512-IMY19IXInkvWp7gnfoHLyA+iFAfBPFtCIcwapoCkQuq4NMT/VF/h7sbtHD/WEaeqSWGCO43Kt1ubd/nDLLhsbg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - request-light@0.5.8: resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} @@ -3033,6 +2445,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -3053,9 +2468,6 @@ packages: s.color@0.0.15: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - sass-formatter@0.7.9: resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} @@ -3063,55 +2475,31 @@ packages: resolution: {integrity: sha512-T3DzWNmnrfVmk2gCIlAxLRLbGkfp3K7TyRva+Byyojqu83BNvnMeqVeYRdmUw4TKCsyH4RiQ/KuF/I4yEzgR5A==} engines: {node: '>=16'} - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} - - semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shiki@3.21.0: - resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} + shiki@4.2.0: + resolution: {integrity: sha512-hjNax6o/ylDy9lefQEaSDtzaT3iVNtZ3WmpQnbuQNoG4xvnSKf2kSKbihZVO4JRG1TTMejs7CmNRYlWgAL66pQ==} + engines: {node: '>=20'} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} @@ -3119,9 +2507,9 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@8.0.2: - resolution: {integrity: sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==} - engines: {node: '>=14.0.0', npm: '>=6.0.0'} + sitemap@9.0.1: + resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} + engines: {node: '>=20.19.5', npm: '>=10.8.2'} hasBin: true smol-toml@1.6.0: @@ -3139,19 +2527,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -3168,10 +2547,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - string.prototype.codepointat@0.2.1: resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} @@ -3182,19 +2557,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - style-loader@2.0.0: - resolution: {integrity: sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -3205,35 +2569,11 @@ packages: suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - svgo@4.0.0: - resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} engines: {node: '>=16'} hasBin: true - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - terser@5.46.0: resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} engines: {node: '>=10'} @@ -3242,17 +2582,18 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyclip@0.1.14: + resolution: {integrity: sha512-F1oWdz8tjT17qe1d5JgDK6z03WGOhYYAN0lK3/D/fzNiy93xswLLEw7pk+3g05onhAy6Bsc6PLNUGhdgVjemMQ==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} tinyglobby@0.2.15: @@ -3267,55 +2608,33 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - typesafe-path@0.2.2: resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} typescript-auto-import-cache@0.3.6: resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -3333,14 +2652,17 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unifont@0.7.3: - resolution: {integrity: sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==} + unifont@0.7.4: + resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} @@ -3372,8 +2694,11 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - unstorage@1.17.4: - resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -3434,15 +2759,6 @@ packages: uploadthing: optional: true - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3455,27 +2771,32 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@2.1.9: - resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -3490,20 +2811,24 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -3531,28 +2856,31 @@ packages: yaml: optional: true - vitefu@1.1.1: - resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: vite: optional: true - vitest@2.1.9: - resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@3.2.6: + resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.9 - '@vitest/ui': 2.1.9 + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.6 + '@vitest/ui': 3.2.6 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -3656,74 +2984,22 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} - engines: {node: '>=10.13.0'} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - - webpack@5.96.1: - resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true - widest-line@5.0.0: - resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} - engines: {node: '>=18'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} @@ -3731,9 +3007,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml-language-server@1.19.2: resolution: {integrity: sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==} hasBin: true @@ -3752,41 +3025,23 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - yocto-spinner@0.2.3: - resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} - engines: {node: '>=18.19'} - - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} - yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 - - zod-to-ts@1.2.0: - resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} - peerDependencies: - typescript: ^4.9.4 || ^5.0.2 - zod: ^3 - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3806,7 +3061,18 @@ snapshots: '@astrojs/compiler@2.13.0': {} - '@astrojs/internal-helpers@0.7.5': {} + '@astrojs/compiler@4.0.0': {} + + '@astrojs/internal-helpers@0.10.0': + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + js-yaml: 4.1.1 + picomatch: 4.0.4 + retext-smartypants: 6.2.0 + shiki: 4.2.0 + smol-toml: 1.6.0 + unified: 11.0.5 '@astrojs/language-server@2.16.3(prettier-plugin-astro@0.14.1)(prettier@3.8.0)(typescript@5.9.3)': dependencies: @@ -3834,15 +3100,13 @@ snapshots: transitivePeerDependencies: - typescript - '@astrojs/markdown-remark@6.3.10': + '@astrojs/markdown-remark@7.2.0': dependencies: - '@astrojs/internal-helpers': 0.7.5 - '@astrojs/prism': 3.3.0 + '@astrojs/internal-helpers': 0.10.0 + '@astrojs/prism': 4.0.2 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 - import-meta-resolve: 4.2.0 - js-yaml: 4.1.1 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 rehype-stringify: 10.0.1 @@ -3850,23 +3114,22 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 remark-smartypants: 3.0.2 - shiki: 3.21.0 - smol-toml: 1.6.0 unified: 11.0.5 unist-util-remove-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 unist-util-visit-parents: 6.0.2 vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.13(astro@5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': + '@astrojs/mdx@6.0.3(astro@6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@astrojs/markdown-remark': 6.3.10 + '@astrojs/internal-helpers': 0.10.0 + '@astrojs/markdown-remark': 7.2.0 '@mdx-js/mdx': 3.1.1 - acorn: 8.15.0 - astro: 5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) - es-module-lexer: 1.7.0 + acorn: 8.17.0 + astro: 6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2) + es-module-lexer: 2.1.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 piccolore: 0.1.3 @@ -3874,93 +3137,96 @@ snapshots: remark-gfm: 4.0.1 remark-smartypants: 3.0.2 source-map: 0.7.6 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/prism@3.3.0': + '@astrojs/prism@4.0.2': dependencies: prismjs: 1.30.0 - '@astrojs/sitemap@3.7.0': + '@astrojs/sitemap@3.7.3': dependencies: - sitemap: 8.0.2 + sitemap: 9.0.1 stream-replace-string: 2.0.0 - zod: 3.25.76 + zod: 4.4.3 - '@astrojs/starlight@0.37.3(astro@5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))': + '@astrojs/starlight@0.40.0(astro@6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2))(typescript@5.9.3)': dependencies: - '@astrojs/markdown-remark': 6.3.10 - '@astrojs/mdx': 4.3.13(astro@5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) - '@astrojs/sitemap': 3.7.0 + '@astrojs/markdown-remark': 7.2.0 + '@astrojs/mdx': 6.0.3(astro@6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2)) + '@astrojs/sitemap': 3.7.3 '@pagefind/default-ui': 1.4.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) - astro-expressive-code: 0.41.6(astro@5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + astro: 6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2) + astro-expressive-code: 0.43.1(astro@6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 hast-util-to-string: 3.0.1 hastscript: 9.0.1 - i18next: 23.16.8 + i18next: 26.3.1(typescript@5.9.3) js-yaml: 4.1.1 klona: 2.0.6 magic-string: 0.30.21 mdast-util-directive: 3.1.0 mdast-util-to-markdown: 2.1.2 mdast-util-to-string: 4.0.0 - pagefind: 1.4.0 + pagefind: 1.5.2 rehype: 13.0.2 rehype-format: 5.0.1 - remark-directive: 3.0.1 + remark-directive: 4.0.0 ultrahtml: 1.6.0 unified: 11.0.5 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color + - typescript - '@astrojs/telemetry@3.3.0': + '@astrojs/telemetry@3.3.2': dependencies: - ci-info: 4.3.1 - debug: 4.4.3 - dlv: 1.1.3 + ci-info: 4.4.0 dset: 3.1.4 - is-docker: 3.0.0 - is-wsl: 3.1.0 + is-docker: 4.0.0 + is-wsl: 3.1.1 which-pm-runs: 1.1.0 - transitivePeerDependencies: - - supports-color '@astrojs/yaml2ts@0.2.2': dependencies: yaml: 2.8.2 - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.24.1': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.7 - '@babel/parser@7.28.6': + '@babel/types@7.29.7': dependencies: - '@babel/types': 7.28.6 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@babel/runtime@7.28.6': {} + '@capsizecss/unpack@4.0.0': + dependencies: + fontkitten: 1.0.2 - '@babel/types@7.28.6': + '@clack/core@1.4.2': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 - '@capsizecss/unpack@4.0.0': + '@clack/prompts@1.6.0': dependencies: - fontkitten: 1.0.2 + '@clack/core': 1.4.2 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 '@ctrl/tinycolor@4.2.0': {} @@ -3992,226 +3258,163 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/aix-ppc64@0.24.0': - optional: true - '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - - '@esbuild/android-arm64@0.24.0': + '@esbuild/aix-ppc64@0.27.7': optional: true '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - - '@esbuild/android-arm@0.24.0': + '@esbuild/android-arm64@0.27.7': optional: true '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - - '@esbuild/android-x64@0.24.0': + '@esbuild/android-arm@0.27.7': optional: true '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - - '@esbuild/darwin-arm64@0.24.0': + '@esbuild/android-x64@0.27.7': optional: true '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - - '@esbuild/darwin-x64@0.24.0': + '@esbuild/darwin-arm64@0.27.7': optional: true '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - - '@esbuild/freebsd-arm64@0.24.0': + '@esbuild/darwin-x64@0.27.7': optional: true '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - - '@esbuild/freebsd-x64@0.24.0': + '@esbuild/freebsd-arm64@0.27.7': optional: true '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.24.0': + '@esbuild/freebsd-x64@0.27.7': optional: true '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - - '@esbuild/linux-arm@0.24.0': + '@esbuild/linux-arm64@0.27.7': optional: true '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - - '@esbuild/linux-ia32@0.24.0': + '@esbuild/linux-arm@0.27.7': optional: true '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - - '@esbuild/linux-loong64@0.24.0': + '@esbuild/linux-ia32@0.27.7': optional: true '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-mips64el@0.24.0': + '@esbuild/linux-loong64@0.27.7': optional: true '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.24.0': + '@esbuild/linux-mips64el@0.27.7': optional: true '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - - '@esbuild/linux-riscv64@0.24.0': + '@esbuild/linux-ppc64@0.27.7': optional: true '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - - '@esbuild/linux-s390x@0.24.0': + '@esbuild/linux-riscv64@0.27.7': optional: true '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - - '@esbuild/linux-x64@0.24.0': + '@esbuild/linux-s390x@0.27.7': optional: true '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.24.0': + '@esbuild/netbsd-arm64@0.27.7': optional: true '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.24.0': + '@esbuild/netbsd-x64@0.27.7': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - - '@esbuild/openbsd-x64@0.24.0': + '@esbuild/openbsd-arm64@0.27.7': optional: true '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.24.0': + '@esbuild/openharmony-arm64@0.27.7': optional: true '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - - '@esbuild/win32-arm64@0.24.0': + '@esbuild/sunos-x64@0.27.7': optional: true '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - - '@esbuild/win32-ia32@0.24.0': + '@esbuild/win32-arm64@0.27.7': optional: true '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-x64@0.27.7': optional: true - '@expressive-code/core@0.41.6': + '@expressive-code/core@0.43.1': dependencies: '@ctrl/tinycolor': 4.2.0 hast-util-select: 6.0.4 @@ -4220,21 +3423,21 @@ snapshots: hastscript: 9.0.1 postcss: 8.5.6 postcss-nested: 6.2.0(postcss@8.5.6) - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 unist-util-visit-parents: 6.0.2 - '@expressive-code/plugin-frames@0.41.6': + '@expressive-code/plugin-frames@0.43.1': dependencies: - '@expressive-code/core': 0.41.6 + '@expressive-code/core': 0.43.1 - '@expressive-code/plugin-shiki@0.41.6': + '@expressive-code/plugin-shiki@0.43.1': dependencies: - '@expressive-code/core': 0.41.6 - shiki: 3.21.0 + '@expressive-code/core': 0.43.1 + shiki: 4.2.0 - '@expressive-code/plugin-text-markers@0.41.6': + '@expressive-code/plugin-text-markers@0.43.1': dependencies: - '@expressive-code/core': 0.41.6 + '@expressive-code/core': 0.43.1 '@img/colour@1.0.0': {} @@ -4336,13 +3539,16 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + optional: true - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/resolve-uri@3.1.2': + optional: true '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + optional: true '@jridgewell/sourcemap-codec@1.5.5': {} @@ -4350,6 +3556,7 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + optional: true '@mdx-js/mdx@3.1.1': dependencies: @@ -4357,7 +3564,7 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 - acorn: 8.15.0 + acorn: 8.17.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -4366,7 +3573,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.15.0) + recma-jsx: 1.0.1(acorn@8.17.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.1 @@ -4376,7 +3583,7 @@ snapshots: unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -4499,179 +3706,30 @@ snapshots: '@oxlint/plugins@1.67.0': {} - '@pagefind/darwin-arm64@1.4.0': + '@pagefind/darwin-arm64@1.5.2': optional: true - '@pagefind/darwin-x64@1.4.0': + '@pagefind/darwin-x64@1.5.2': optional: true '@pagefind/default-ui@1.4.0': {} - '@pagefind/freebsd-x64@1.4.0': - optional: true - - '@pagefind/linux-arm64@1.4.0': - optional: true - - '@pagefind/linux-x64@1.4.0': + '@pagefind/freebsd-x64@1.5.2': optional: true - '@pagefind/windows-x64@1.4.0': + '@pagefind/linux-arm64@1.5.2': optional: true - '@polka/url@1.0.0-next.29': {} - - '@remotion/bundler@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@remotion/studio': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/studio-shared': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - css-loader: 5.2.7(webpack@5.96.1) - esbuild: 0.24.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-refresh: 0.9.0 - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - source-map: 0.7.3 - style-loader: 2.0.0(webpack@5.96.1) - webpack: 5.96.1(esbuild@0.24.0) - transitivePeerDependencies: - - '@swc/core' - - bufferutil - - supports-color - - uglify-js - - utf-8-validate - - webpack-cli - - '@remotion/cli@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@remotion/bundler': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/media-utils': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/player': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/renderer': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/studio': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/studio-server': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/studio-shared': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - dotenv: 9.0.2 - minimist: 1.2.6 - prompts: 2.4.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - '@swc/core' - - bufferutil - - supports-color - - uglify-js - - utf-8-validate - - webpack-cli - - '@remotion/compositor-darwin-arm64@4.0.246': - optional: true - - '@remotion/compositor-darwin-x64@4.0.246': - optional: true - - '@remotion/compositor-linux-arm64-gnu@4.0.246': - optional: true - - '@remotion/compositor-linux-arm64-musl@4.0.246': - optional: true - - '@remotion/compositor-linux-x64-gnu@4.0.246': + '@pagefind/linux-x64@1.5.2': optional: true - '@remotion/compositor-linux-x64-musl@4.0.246': + '@pagefind/windows-arm64@1.5.2': optional: true - '@remotion/compositor-win32-x64-msvc@4.0.246': + '@pagefind/windows-x64@1.5.2': optional: true - '@remotion/media-parser@4.0.246': {} - - '@remotion/media-utils@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - '@remotion/player@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - '@remotion/renderer@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@remotion/streaming': 4.0.246 - execa: 5.1.1 - extract-zip: 2.0.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - source-map: 0.8.0-beta.0 - ws: 8.17.1 - optionalDependencies: - '@remotion/compositor-darwin-arm64': 4.0.246 - '@remotion/compositor-darwin-x64': 4.0.246 - '@remotion/compositor-linux-arm64-gnu': 4.0.246 - '@remotion/compositor-linux-arm64-musl': 4.0.246 - '@remotion/compositor-linux-x64-gnu': 4.0.246 - '@remotion/compositor-linux-x64-musl': 4.0.246 - '@remotion/compositor-win32-x64-msvc': 4.0.246 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@remotion/streaming@4.0.246': {} - - '@remotion/studio-server@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/parser': 7.24.1 - '@remotion/bundler': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/renderer': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/studio-shared': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - memfs: 3.4.3 - open: 8.4.2 - recast: 0.23.9 - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - semver: 7.5.3 - source-map: 0.7.3 - transitivePeerDependencies: - - '@swc/core' - - bufferutil - - react - - react-dom - - supports-color - - uglify-js - - utf-8-validate - - webpack-cli - - '@remotion/studio-shared@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - react - - react-dom - - '@remotion/studio@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@remotion/media-parser': 4.0.246 - '@remotion/media-utils': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/player': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/renderer': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remotion/studio-shared': 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - memfs: 3.4.3 - open: 8.4.2 - remotion: 4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - semver: 7.5.3 - source-map: 0.7.3 - transitivePeerDependencies: - - bufferutil - - react - - react-dom - - supports-color - - utf-8-validate + '@polka/url@1.0.0-next.29': {} '@resvg/resvg-js-android-arm-eabi@2.6.2': optional: true @@ -4728,7 +3786,7 @@ snapshots: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: rollup: 4.55.1 @@ -4807,33 +3865,40 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true - '@shikijs/core@3.21.0': + '@shikijs/core@4.2.0': dependencies: - '@shikijs/types': 3.21.0 + '@shikijs/primitive': 4.2.0 + '@shikijs/types': 4.2.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.21.0': + '@shikijs/engine-javascript@4.2.0': dependencies: - '@shikijs/types': 3.21.0 + '@shikijs/types': 4.2.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 + oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@3.21.0': + '@shikijs/engine-oniguruma@4.2.0': dependencies: - '@shikijs/types': 3.21.0 + '@shikijs/types': 4.2.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.21.0': + '@shikijs/langs@4.2.0': + dependencies: + '@shikijs/types': 4.2.0 + + '@shikijs/primitive@4.2.0': dependencies: - '@shikijs/types': 3.21.0 + '@shikijs/types': 4.2.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - '@shikijs/themes@3.21.0': + '@shikijs/themes@4.2.0': dependencies: - '@shikijs/types': 3.21.0 + '@shikijs/types': 4.2.0 - '@shikijs/types@3.21.0': + '@shikijs/types@4.2.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -4845,19 +3910,16 @@ snapshots: fflate: 0.7.4 string.prototype.codepointat: 0.2.1 - '@types/debug@4.1.12': + '@types/chai@5.2.3': dependencies: - '@types/ms': 2.1.0 + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 - '@types/eslint-scope@3.7.7': + '@types/debug@4.1.12': dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@types/ms': 2.1.0 - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 + '@types/deep-eql@4.0.2': {} '@types/estree-jsx@1.0.5': dependencies: @@ -4871,8 +3933,6 @@ snapshots: '@types/js-yaml@4.0.9': {} - '@types/json-schema@7.0.15': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -4885,22 +3945,13 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/node@17.0.45': {} - '@types/node@22.19.7': dependencies: undici-types: 6.21.0 - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.3.5(@types/react@18.3.18)': + '@types/node@24.13.2': dependencies: - '@types/react': 18.3.18 - - '@types/react@18.3.18': - dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.2.3 + undici-types: 7.18.2 '@types/sax@1.2.7': dependencies: @@ -4910,63 +3961,68 @@ snapshots: '@types/unist@3.0.3': {} - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 22.19.7 - optional: true - '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@2.1.9': + '@vitest/expect@3.2.6': dependencies: - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 chai: 5.3.3 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.6(vite@6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 3.2.6 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2) - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.7)(terser@5.46.0))': + '@vitest/mocker@3.2.6(vite@6.4.1(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 2.1.9 + '@vitest/spy': 3.2.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@22.19.7)(terser@5.46.0) + vite: 6.4.1(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2) - '@vitest/pretty-format@2.1.9': + '@vitest/pretty-format@3.2.6': dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/runner@2.1.9': + '@vitest/runner@3.2.6': dependencies: - '@vitest/utils': 2.1.9 - pathe: 1.1.2 + '@vitest/utils': 3.2.6 + pathe: 2.0.3 + strip-literal: 3.1.0 - '@vitest/snapshot@2.1.9': + '@vitest/snapshot@3.2.6': dependencies: - '@vitest/pretty-format': 2.1.9 + '@vitest/pretty-format': 3.2.6 magic-string: 0.30.21 - pathe: 1.1.2 + pathe: 2.0.3 - '@vitest/spy@2.1.9': + '@vitest/spy@3.2.6': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.4 - '@vitest/ui@2.1.9(vitest@2.1.9)': + '@vitest/ui@3.2.6(vitest@3.2.6)': dependencies: - '@vitest/utils': 2.1.9 + '@vitest/utils': 3.2.6 fflate: 0.8.2 flatted: 3.3.3 - pathe: 1.1.2 + pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 - tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@22.19.7)(@vitest/ui@2.1.9)(terser@5.46.0) + tinyrainbow: 2.0.0 + vitest: 3.2.6(@types/debug@4.1.12)(@types/node@22.19.7)(@vitest/ui@3.2.6)(terser@5.46.0)(yaml@2.8.2) - '@vitest/utils@2.1.9': + '@vitest/utils@3.2.6': dependencies: - '@vitest/pretty-format': 2.1.9 + '@vitest/pretty-format': 3.2.6 loupe: 3.2.1 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 '@volar/kit@2.4.27(typescript@5.9.3)': dependencies: @@ -5018,116 +4074,19 @@ snapshots: '@vscode/l10n@0.0.18': {} - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} + acorn: 8.17.0 - '@xtuc/long@4.2.2': {} - - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 + acorn@8.15.0: + optional: true - acorn@8.15.0: {} + acorn@8.17.0: {} ajv-draft-04@1.0.0(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -5135,20 +4094,12 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.3: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -5164,82 +4115,70 @@ snapshots: assertion-error@2.0.1: {} - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - astring@1.9.0: {} - astro-expressive-code@0.41.6(astro@5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): + astro-expressive-code@0.43.1(astro@6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2)): dependencies: - astro: 5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) - rehype-expressive-code: 0.41.6 + astro: 6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2) + rehype-expressive-code: 0.43.1 - astro@5.16.9(@types/node@22.19.7)(rollup@4.55.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2): + astro@6.4.8(@types/node@24.13.2)(rollup@4.55.1)(terser@5.46.0)(yaml@2.8.2): dependencies: - '@astrojs/compiler': 2.13.0 - '@astrojs/internal-helpers': 0.7.5 - '@astrojs/markdown-remark': 6.3.10 - '@astrojs/telemetry': 3.3.0 + '@astrojs/compiler': 4.0.0 + '@astrojs/internal-helpers': 0.10.0 + '@astrojs/markdown-remark': 7.2.0 + '@astrojs/telemetry': 3.3.2 '@capsizecss/unpack': 4.0.0 + '@clack/prompts': 1.6.0 '@oslojs/encoding': 1.1.0 '@rollup/pluginutils': 5.3.0(rollup@4.55.1) - acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 - boxen: 8.0.1 - ci-info: 4.3.1 + ci-info: 4.4.0 clsx: 2.1.1 - common-ancestor-path: 1.0.1 + common-ancestor-path: 2.0.0 cookie: 1.1.1 - cssesc: 3.0.0 - debug: 4.4.3 - deterministic-object-hash: 2.0.2 - devalue: 5.6.2 - diff: 5.2.0 - dlv: 1.1.3 + devalue: 5.8.1 + diff: 8.0.4 dset: 3.1.4 - es-module-lexer: 1.7.0 - esbuild: 0.25.12 - estree-walker: 3.0.3 + es-module-lexer: 2.1.0 + esbuild: 0.27.7 flattie: 1.1.1 - fontace: 0.4.0 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.4 github-slugger: 2.0.0 html-escaper: 3.0.3 http-cache-semantics: 4.2.0 - import-meta-resolve: 4.2.0 js-yaml: 4.1.1 + jsonc-parser: 3.3.1 magic-string: 0.30.21 - magicast: 0.5.1 + magicast: 0.5.3 mrmime: 2.0.1 neotraverse: 0.6.18 - p-limit: 6.2.0 - p-queue: 8.1.1 + obug: 2.1.3 + p-limit: 7.3.0 + p-queue: 9.3.0 package-manager-detector: 1.6.0 piccolore: 0.1.3 - picomatch: 4.0.3 - prompts: 2.4.2 + picomatch: 4.0.4 rehype: 13.0.2 - semver: 7.7.3 - shiki: 3.21.0 + semver: 7.8.5 + shiki: 4.2.0 smol-toml: 1.6.0 - svgo: 4.0.0 - tinyexec: 1.0.2 + svgo: 4.0.1 + tinyclip: 0.1.14 + tinyexec: 1.2.4 tinyglobby: 0.2.15 - tsconfck: 3.1.6(typescript@5.9.3) ultrahtml: 1.6.0 - unifont: 0.7.3 - unist-util-visit: 5.0.0 - unstorage: 1.17.4 + unifont: 0.7.4 + unist-util-visit: 5.1.0 + unstorage: 1.17.5 vfile: 6.0.3 - vite: 6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2)) + vite: 7.3.5(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.3(vite@7.3.5(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2)) xxhash-wasm: 1.1.0 - yargs-parser: 21.1.1 - yocto-spinner: 0.2.3 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + yargs-parser: 22.0.0 + zod: 4.4.3 optionalDependencies: sharp: 0.34.5 transitivePeerDependencies: @@ -5273,7 +4212,6 @@ snapshots: - supports-color - terser - tsx - - typescript - uploadthing - yaml @@ -5281,12 +4219,8 @@ snapshots: bail@2.0.2: {} - base-64@1.0.0: {} - base64-js@0.0.8: {} - baseline-browser-mapping@2.9.15: {} - bcp-47-match@2.0.3: {} bcp-47@2.1.0: @@ -5295,41 +4229,15 @@ snapshots: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 - big.js@5.2.2: {} - boolbase@1.0.0: {} - boxen@8.0.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 8.0.0 - chalk: 5.6.2 - cli-boxes: 3.0.0 - string-width: 7.2.0 - type-fest: 4.41.0 - widest-line: 5.0.0 - wrap-ansi: 9.0.2 - - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.9.15 - caniuse-lite: 1.0.30001764 - electron-to-chromium: 1.5.267 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - - buffer-crc32@0.2.13: {} - - buffer-from@1.1.2: {} + buffer-from@1.1.2: + optional: true cac@6.7.14: {} - camelcase@8.0.0: {} - camelize@1.0.1: {} - caniuse-lite@1.0.30001764: {} - ccount@2.0.1: {} chai@5.3.3: @@ -5340,8 +4248,6 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chalk@5.6.2: {} - character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -5360,11 +4266,7 @@ snapshots: dependencies: readdirp: 5.0.0 - chrome-trace-event@1.0.4: {} - - ci-info@4.3.1: {} - - cli-boxes@3.0.0: {} + ci-info@4.4.0: {} cliui@8.0.1: dependencies: @@ -5386,20 +4288,15 @@ snapshots: commander@11.1.0: {} - commander@2.20.3: {} + commander@2.20.3: + optional: true - common-ancestor-path@1.0.1: {} + common-ancestor-path@2.0.0: {} - cookie-es@1.2.2: {} + cookie-es@1.2.3: {} cookie@1.1.1: {} - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - crossws@0.3.5: dependencies: uncrypto: 0.1.3 @@ -5412,20 +4309,6 @@ snapshots: css-gradient-parser@0.0.17: {} - css-loader@5.2.7(webpack@5.96.1): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - loader-utils: 2.0.4 - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - postcss-value-parser: 4.2.0 - schema-utils: 3.3.0 - semver: 7.7.3 - webpack: 5.96.1(esbuild@0.24.0) - css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -5460,8 +4343,6 @@ snapshots: dependencies: css-tree: 2.2.1 - csstype@3.2.3: {} - debug@4.4.3: dependencies: ms: 2.1.3 @@ -5472,9 +4353,7 @@ snapshots: deep-eql@5.0.2: {} - define-lazy-prop@2.0.0: {} - - defu@6.1.4: {} + defu@6.1.7: {} dequal@2.0.3: {} @@ -5482,22 +4361,16 @@ snapshots: detect-libc@2.1.2: {} - deterministic-object-hash@2.0.2: - dependencies: - base-64: 1.0.0 - - devalue@5.6.2: {} + devalue@5.8.1: {} devlop@1.1.0: dependencies: dequal: 2.0.3 - diff@5.2.0: {} + diff@8.0.4: {} direction@2.0.1: {} - dlv@1.1.3: {} - dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -5516,12 +4389,8 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv@9.0.2: {} - dset@3.1.4: {} - electron-to-chromium@1.5.267: {} - emmet@2.4.11: dependencies: '@emmetio/abbreviation': 2.3.3 @@ -5529,27 +4398,16 @@ snapshots: emoji-regex-xs@2.0.1: {} - emoji-regex@10.6.0: {} - emoji-regex@8.0.0: {} - emojis-list@3.0.0: {} - - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - enhanced-resolve@5.18.4: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - entities@4.5.0: {} entities@6.0.1: {} es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} + esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -5560,63 +4418,10 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.15.0 + acorn: 8.17.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -5646,27 +4451,41 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + escalade@3.2.0: {} escape-html@1.0.3: {} escape-string-regexp@5.0.0: {} - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - esprima@4.0.1: {} - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.8 @@ -5702,57 +4521,41 @@ snapshots: dependencies: '@types/estree': 1.0.8 - eventemitter3@5.0.1: {} - - events@3.3.0: {} - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + eventemitter3@5.0.4: {} expect-type@1.3.0: {} - expressive-code@0.41.6: + expressive-code@0.43.1: dependencies: - '@expressive-code/core': 0.41.6 - '@expressive-code/plugin-frames': 0.41.6 - '@expressive-code/plugin-shiki': 0.41.6 - '@expressive-code/plugin-text-markers': 0.41.6 + '@expressive-code/core': 0.43.1 + '@expressive-code/plugin-frames': 0.43.1 + '@expressive-code/plugin-shiki': 0.43.1 + '@expressive-code/plugin-text-markers': 0.43.1 extend@3.0.2: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} - fast-json-stable-stringify@2.1.0: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 fast-uri@3.1.0: {} - fd-slicer@1.1.0: + fast-wrap-ansi@0.2.2: dependencies: - pend: 1.2.0 + fast-string-width: 3.0.2 fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + fflate@0.7.4: {} fflate@0.8.2: {} @@ -5761,7 +4564,7 @@ snapshots: flattie@1.1.1: {} - fontace@0.4.0: + fontace@0.4.1: dependencies: fontkitten: 1.0.2 @@ -5769,32 +4572,22 @@ snapshots: dependencies: tiny-inflate: 1.0.3 - fs-monkey@1.0.3: {} - fsevents@2.3.3: optional: true get-caller-file@2.0.5: {} - get-east-asian-width@1.4.0: {} - - get-stream@5.2.0: + get-tsconfig@5.0.0-beta.4: dependencies: - pump: 3.0.3 - - get-stream@6.0.1: {} + resolve-pkg-maps: 1.0.0 github-slugger@2.0.0: {} - glob-to-regexp@0.4.1: {} - - graceful-fs@4.2.11: {} - - h3@1.15.5: + h3@1.15.11: dependencies: - cookie-es: 1.2.2 + cookie-es: 1.2.3 crossws: 0.3.5 - defu: 6.1.4 + defu: 6.1.7 destr: 2.0.5 iron-webcrypto: 1.2.1 node-mock-http: 1.0.4 @@ -5802,8 +4595,6 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 - has-flag@4.0.0: {} - hast-util-embedded@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -5902,7 +4693,7 @@ snapshots: nth-check: 2.1.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 hast-util-to-estree@3.1.3: @@ -6003,17 +4794,9 @@ snapshots: http-cache-semantics@4.2.0: {} - human-signals@2.1.0: {} - - i18next@23.16.8: - dependencies: - '@babel/runtime': 7.28.6 - - icss-utils@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - import-meta-resolve@4.2.0: {} + i18next@26.3.1(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 inline-style-parser@0.2.7: {} @@ -6028,10 +4811,10 @@ snapshots: is-decimal@2.0.1: {} - is-docker@2.2.1: {} - is-docker@3.0.0: {} + is-docker@4.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-hexadecimal@2.0.1: {} @@ -6042,44 +4825,22 @@ snapshots: is-plain-obj@4.1.0: {} - is-stream@2.0.1: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - is-wsl@3.1.0: + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 - isexe@2.0.0: {} - - jest-worker@27.5.1: - dependencies: - '@types/node': 22.19.7 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - js-tokens@4.0.0: {} + js-tokens@9.0.1: {} js-yaml@4.1.1: dependencies: argparse: 2.0.1 - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} - json5@2.2.3: {} - jsonc-parser@2.3.1: {} jsonc-parser@3.3.1: {} - kleur@3.0.3: {} - kleur@4.1.5: {} klona@2.0.6: {} @@ -6089,40 +4850,22 @@ snapshots: base64-js: 0.0.8 unicode-trie: 2.0.0 - loader-runner@4.3.1: {} - - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - - lodash.sortby@4.7.0: {} - lodash@4.17.21: {} longest-streak@3.1.0: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - loupe@3.2.1: {} - lru-cache@11.2.4: {} - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 + lru-cache@11.5.1: {} magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.5.1: + magicast@0.5.3: dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 markdown-extensions@2.0.0: {} @@ -6305,7 +5048,7 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: @@ -6316,12 +5059,6 @@ snapshots: mdn-data@2.12.2: {} - memfs@3.4.3: - dependencies: - fs-monkey: 1.0.3 - - merge-stream@2.0.0: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -6341,7 +5078,7 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-directive@3.0.2: + micromark-extension-directive@4.0.0: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.1 @@ -6451,8 +5188,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -6596,16 +5333,6 @@ snapshots: transitivePeerDependencies: - supports-color - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mimic-fn@2.1.0: {} - - minimist@1.2.6: {} - mrmime@2.0.1: {} ms@2.1.3: {} @@ -6614,8 +5341,6 @@ snapshots: nanoid@3.3.11: {} - neo-async@2.6.2: {} - neotraverse@0.6.18: {} nlcst-to-string@4.0.0: @@ -6632,18 +5357,14 @@ snapshots: dependencies: node-addon-api: 7.1.1 - node-releases@2.0.27: {} - normalize-path@3.0.0: {} - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 + obug@2.1.3: {} + ofetch@1.5.1: dependencies: destr: 2.0.5 @@ -6652,28 +5373,14 @@ snapshots: ohash@2.0.11: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - oniguruma-parser@0.12.1: {} + oniguruma-parser@0.12.2: {} - oniguruma-to-es@4.3.4: + oniguruma-to-es@4.3.6: dependencies: - oniguruma-parser: 0.12.1 + oniguruma-parser: 0.12.2 regex: 6.1.0 regex-recursion: 6.0.2 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - oxfmt@0.52.0: dependencies: tinypool: 2.1.0 @@ -6720,27 +5427,28 @@ snapshots: '@oxlint/binding-win32-ia32-msvc': 1.67.0 '@oxlint/binding-win32-x64-msvc': 1.67.0 - p-limit@6.2.0: + p-limit@7.3.0: dependencies: yocto-queue: 1.2.2 - p-queue@8.1.1: + p-queue@9.3.0: dependencies: - eventemitter3: 5.0.1 - p-timeout: 6.1.4 + eventemitter3: 5.0.4 + p-timeout: 7.0.1 - p-timeout@6.1.4: {} + p-timeout@7.0.1: {} package-manager-detector@1.6.0: {} - pagefind@1.4.0: + pagefind@1.5.2: optionalDependencies: - '@pagefind/darwin-arm64': 1.4.0 - '@pagefind/darwin-x64': 1.4.0 - '@pagefind/freebsd-x64': 1.4.0 - '@pagefind/linux-arm64': 1.4.0 - '@pagefind/linux-x64': 1.4.0 - '@pagefind/windows-x64': 1.4.0 + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 pako@0.2.9: {} @@ -6774,14 +5482,10 @@ snapshots: path-browserify@1.0.1: {} - path-key@3.1.1: {} - - pathe@1.1.2: {} + pathe@2.0.3: {} pathval@2.0.1: {} - pend@1.2.0: {} - piccolore@0.1.3: {} picocolors@1.1.1: {} @@ -6790,26 +5494,7 @@ snapshots: picomatch@4.0.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 - postcss-value-parser: 4.2.0 - - postcss-modules-scope@3.2.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 - - postcss-modules-values@4.0.0(postcss@8.5.6): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + picomatch@4.0.4: {} postcss-nested@6.2.0(postcss@8.5.6): dependencies: @@ -6821,11 +5506,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} postcss@8.5.6: @@ -6844,60 +5524,24 @@ snapshots: prismjs@1.30.0: {} - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - property-information@7.1.0: {} - pump@3.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - - punycode@2.3.1: {} - radix3@1.1.2: {} - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-refresh@0.9.0: {} - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - readdirp@4.1.2: {} readdirp@5.0.0: {} - recast@0.23.9: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.1(acorn@8.15.0): + recma-jsx@1.0.1(acorn@8.17.0): dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -6927,9 +5571,9 @@ snapshots: dependencies: regex-utilities: 2.3.0 - rehype-expressive-code@0.41.6: + rehype-expressive-code@0.43.1: dependencies: - expressive-code: 0.41.6 + expressive-code: 0.43.1 rehype-format@5.0.1: dependencies: @@ -6969,11 +5613,11 @@ snapshots: rehype-stringify: 10.0.1 unified: 11.0.5 - remark-directive@3.0.1: + remark-directive@4.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-directive: 3.1.0 - micromark-extension-directive: 3.0.2 + micromark-extension-directive: 4.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -7026,11 +5670,6 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - remotion@4.0.246(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - request-light@0.5.8: {} request-light@0.7.0: {} @@ -7039,6 +5678,8 @@ snapshots: require-from-string@2.0.2: {} + resolve-pkg-maps@1.0.0: {} + retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -7097,8 +5738,6 @@ snapshots: s.color@0.0.15: {} - safe-buffer@5.2.1: {} - sass-formatter@0.7.9: dependencies: suf-log: 2.5.3 @@ -7117,34 +5756,11 @@ snapshots: postcss-value-parser: 4.2.0 yoga-layout: 3.2.1 - sax@1.4.4: {} - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - - semver@7.5.3: - dependencies: - lru-cache: 6.0.0 + sax@1.6.0: {} semver@7.7.3: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + semver@7.8.5: {} sharp@0.34.5: dependencies: @@ -7177,27 +5793,19 @@ snapshots: '@img/sharp-win32-ia32': 0.34.5 '@img/sharp-win32-x64': 0.34.5 - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shiki@3.21.0: + shiki@4.2.0: dependencies: - '@shikijs/core': 3.21.0 - '@shikijs/engine-javascript': 3.21.0 - '@shikijs/engine-oniguruma': 3.21.0 - '@shikijs/langs': 3.21.0 - '@shikijs/themes': 3.21.0 - '@shikijs/types': 3.21.0 + '@shikijs/core': 4.2.0 + '@shikijs/engine-javascript': 4.2.0 + '@shikijs/engine-oniguruma': 4.2.0 + '@shikijs/langs': 4.2.0 + '@shikijs/themes': 4.2.0 + '@shikijs/types': 4.2.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 siginfo@2.0.0: {} - signal-exit@3.0.7: {} - sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 @@ -7206,12 +5814,12 @@ snapshots: sisteransi@1.0.5: {} - sitemap@8.0.2: + sitemap@9.0.1: dependencies: - '@types/node': 17.0.45 + '@types/node': 24.13.2 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.4.4 + sax: 1.6.0 smol-toml@1.6.0: {} @@ -7221,17 +5829,13 @@ snapshots: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + optional: true - source-map@0.6.1: {} - - source-map@0.7.3: {} + source-map@0.6.1: + optional: true source-map@0.7.6: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} stackback@0.0.2: {} @@ -7246,12 +5850,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 - string.prototype.codepointat@0.2.1: {} stringify-entities@4.0.4: @@ -7263,17 +5861,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 - - strip-final-newline@2.0.0: {} - - style-loader@2.0.0(webpack@5.96.1): + strip-literal@3.1.0: dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.96.1(esbuild@0.24.0) + js-tokens: 9.0.1 style-to-js@1.1.21: dependencies: @@ -7287,11 +5877,7 @@ snapshots: dependencies: s.color: 0.0.15 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - svgo@4.0.0: + svgo@4.0.1: dependencies: commander: 11.1.0 css-select: 5.2.2 @@ -7299,20 +5885,7 @@ snapshots: css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 - sax: 1.4.4 - - tapable@2.3.0: {} - - terser-webpack-plugin@5.3.16(esbuild@0.24.0)(webpack@5.96.1): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.46.0 - webpack: 5.96.1(esbuild@0.24.0) - optionalDependencies: - esbuild: 0.24.0 + sax: 1.6.0 terser@5.46.0: dependencies: @@ -7320,47 +5893,39 @@ snapshots: acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 + optional: true tiny-inflate@1.0.3: {} - tiny-invariant@1.3.3: {} - tinybench@2.9.0: {} + tinyclip@0.1.14: {} + tinyexec@0.3.2: {} - tinyexec@1.0.2: {} + tinyexec@1.2.4: {} tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tinypool@1.1.1: {} tinypool@2.1.0: {} - tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.4: {} totalist@3.0.1: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - trim-lines@3.0.1: {} trough@2.2.0: {} - tsconfck@3.1.6(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - - tslib@2.8.1: {} - - type-fest@4.41.0: {} + tslib@2.8.1: + optional: true typesafe-path@0.2.2: {} @@ -7368,8 +5933,6 @@ snapshots: dependencies: semver: 7.7.3 - typescript@5.8.2: {} - typescript@5.9.3: {} ufo@1.6.3: {} @@ -7380,6 +5943,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.18.2: {} + unicode-trie@2.0.0: dependencies: pako: 0.2.9 @@ -7395,7 +5960,7 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unifont@0.7.3: + unifont@0.7.4: dependencies: css-tree: 3.1.0 ofetch: 1.5.1 @@ -7447,27 +6012,23 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - unstorage@1.17.4: + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unstorage@1.17.5: dependencies: anymatch: 3.1.3 chokidar: 5.0.0 destr: 2.0.5 - h3: 1.15.5 - lru-cache: 11.2.4 + h3: 1.15.11 + lru-cache: 11.5.1 node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.3 - update-browserslist-db@1.2.3(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - util-deprecate@1.0.2: {} vfile-location@5.0.3: @@ -7485,15 +6046,37 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@2.1.9(@types/node@22.19.7)(terser@5.46.0): + vite-node@3.2.4(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-node@3.2.4(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 - pathe: 1.1.2 - vite: 5.4.21(@types/node@22.19.7)(terser@5.46.0) + pathe: 2.0.3 + vite: 6.4.1(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -7502,18 +6085,24 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml - vite@5.4.21(@types/node@22.19.7)(terser@5.46.0): + vite@6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2): dependencies: - esbuild: 0.21.5 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.55.1 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.19.7 fsevents: 2.3.3 terser: 5.46.0 + yaml: 2.8.2 - vite@6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2): + vite@6.4.1(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -7522,41 +6111,103 @@ snapshots: rollup: 4.55.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.7 + '@types/node': 24.13.2 + fsevents: 2.3.3 + terser: 5.46.0 + yaml: 2.8.2 + + vite@7.3.5(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.13.2 fsevents: 2.3.3 terser: 5.46.0 yaml: 2.8.2 - vitefu@1.1.1(vite@6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2)): + vitefu@1.1.3(vite@7.3.5(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2)): optionalDependencies: + vite: 7.3.5(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2) + + vitest@3.2.6(@types/debug@4.1.12)(@types/node@22.19.7)(@vitest/ui@3.2.6)(terser@5.46.0)(yaml@2.8.2): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.6 + '@vitest/mocker': 3.2.6(vite@6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/pretty-format': 3.2.6 + '@vitest/runner': 3.2.6 + '@vitest/snapshot': 3.2.6 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 vite: 6.4.1(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@22.19.7)(terser@5.46.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 22.19.7 + '@vitest/ui': 3.2.6(vitest@3.2.6) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vitest@2.1.9(@types/node@22.19.7)(@vitest/ui@2.1.9)(terser@5.46.0): + vitest@3.2.6(@types/debug@4.1.12)(@types/node@24.13.2)(@vitest/ui@3.2.6)(terser@5.46.0)(yaml@2.8.2): dependencies: - '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.7)(terser@5.46.0)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.9 - '@vitest/snapshot': 2.1.9 - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.6 + '@vitest/mocker': 3.2.6(vite@6.4.1(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/pretty-format': 3.2.6 + '@vitest/runner': 3.2.6 + '@vitest/snapshot': 3.2.6 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 chai: 5.3.3 debug: 4.4.3 expect-type: 1.3.0 magic-string: 0.30.21 - pathe: 1.1.2 + pathe: 2.0.3 + picomatch: 4.0.3 std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 + tinyglobby: 0.2.15 tinypool: 1.1.1 - tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@22.19.7)(terser@5.46.0) - vite-node: 2.1.9(@types/node@22.19.7)(terser@5.46.0) + tinyrainbow: 2.0.0 + vite: 6.4.1(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.13.2)(terser@5.46.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.7 - '@vitest/ui': 2.1.9(vitest@2.1.9) + '@types/debug': 4.1.12 + '@types/node': 24.13.2 + '@vitest/ui': 3.2.6(vitest@3.2.6) transitivePeerDependencies: + - jiti - less - lightningcss - msw @@ -7566,6 +6217,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml volar-service-css@0.0.68(@volar/language-service@2.4.27): dependencies: @@ -7664,90 +6317,25 @@ snapshots: vscode-uri@3.1.0: {} - watchpack@2.5.1: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - web-namespaces@2.0.1: {} - webidl-conversions@4.0.2: {} - - webpack-sources@3.3.3: {} - - webpack@5.96.1(esbuild@0.24.0): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - browserslist: 4.28.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.24.0)(webpack@5.96.1) - watchpack: 2.5.1 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-pm-runs@1.1.0: {} - which@2.0.2: - dependencies: - isexe: 2.0.0 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - widest-line@5.0.0: - dependencies: - string-width: 7.2.0 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.1.2 - - wrappy@1.0.2: {} - - ws@8.17.1: {} - xxhash-wasm@1.1.0: {} y18n@5.0.8: {} - yallist@4.0.0: {} - yaml-language-server@1.19.2: dependencies: '@vscode/l10n': 0.0.18 @@ -7769,6 +6357,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -7779,30 +6369,10 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@1.2.2: {} - yocto-spinner@0.2.3: - dependencies: - yoctocolors: 2.1.2 - - yoctocolors@2.1.2: {} - yoga-layout@3.2.1: {} - zod-to-json-schema@3.25.1(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): - dependencies: - typescript: 5.9.3 - zod: 3.25.76 - - zod@3.25.76: {} + zod@4.4.3: {} zwitch@2.0.4: {} From 691202253819a26ca0993abec1ca659ae3e3f330 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Tue, 23 Jun 2026 21:27:26 +0900 Subject: [PATCH 16/17] chore: release v2.1.0 --- package.json | 2 +- packages/docs/src/content/docs/changelog.mdx | 14 ++++++++++++++ packages/docs/src/content/docs/ja/changelog.mdx | 14 ++++++++++++++ packages/npm/package.json | 12 ++++++------ packages/vibe-darwin-arm64/package.json | 2 +- packages/vibe-darwin-x64/package.json | 2 +- packages/vibe-linux-arm64/package.json | 2 +- packages/vibe-linux-x64/package.json | 2 +- packages/vibe-win32-x64/package.json | 2 +- rust/Cargo.lock | 6 +++--- rust/crates/vibe-core/Cargo.toml | 2 +- rust/crates/vibe-test-support/Cargo.toml | 2 +- rust/crates/vibe/Cargo.toml | 2 +- 13 files changed, 46 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index fc97308..0c2e968 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vibe-monorepo", - "version": "2.0.0", + "version": "2.1.0", "private": true, "type": "module", "description": "Monorepo for vibe CLI - Git worktree management tool", diff --git a/packages/docs/src/content/docs/changelog.mdx b/packages/docs/src/content/docs/changelog.mdx index a7c25a9..c281231 100644 --- a/packages/docs/src/content/docs/changelog.mdx +++ b/packages/docs/src/content/docs/changelog.mdx @@ -5,6 +5,20 @@ description: Version history and release notes for vibe All notable changes to vibe are documented here. +## v2.1.0 + +**Released:** 2026-06-23 + +### Added + +- `.vibe.toml` files inside git submodules are now loaded end-to-end. Trusted submodule configs are read, configs are picked up from inside worktrees (not just the origin checkout), and submodule directories are copied from the correct source so submodule contents are present at the worktree path. If your repository uses submodules, their `.vibe.toml` files now contribute to the merged configuration as you would expect. + +### Fixed + +- The progress tree is now shown again during worktree creation. The interactive progress display had regressed and stayed hidden until the operation finished; it now streams as the worktree is created. + +--- + ## v2.0.0 **Released:** 2026-06-19 diff --git a/packages/docs/src/content/docs/ja/changelog.mdx b/packages/docs/src/content/docs/ja/changelog.mdx index 712e0d5..026ef03 100644 --- a/packages/docs/src/content/docs/ja/changelog.mdx +++ b/packages/docs/src/content/docs/ja/changelog.mdx @@ -5,6 +5,20 @@ description: vibeのバージョン履歴とリリースノート vibeの主要な変更はここに記録されています。 +## v2.1.0 + +**リリース日:** 2026年6月23日 + +### 追加 + +- git submodule 内の `.vibe.toml` がエンドツーエンドで読み込まれるようになりました。信頼済み submodule の設定が読まれ、worktree 内(origin の checkout だけでなく)からも設定が拾われ、submodule ディレクトリが正しい元から worktree にコピーされるようになりました。submodule を使うリポジトリでは、その `.vibe.toml` がマージ済みの設定に期待どおり反映されます。 + +### 修正 + +- worktree 作成中に進捗ツリーが再び表示されるようになりました。インタラクティブな進捗表示が退行しており、処理が終わるまで非表示のままでしたが、worktree 作成中にリアルタイムで流れるようになりました。 + +--- + ## v2.0.0 **リリース日:** 2026年6月19日 diff --git a/packages/npm/package.json b/packages/npm/package.json index c8b535f..86d0116 100644 --- a/packages/npm/package.json +++ b/packages/npm/package.json @@ -1,6 +1,6 @@ { "name": "@kexi/vibe", - "version": "2.0.0", + "version": "2.1.0", "description": "Git worktree helper CLI", "type": "module", "bin": { @@ -15,11 +15,11 @@ "test:watch": "vitest" }, "optionalDependencies": { - "@kexi/vibe-linux-x64": "2.0.0", - "@kexi/vibe-linux-arm64": "2.0.0", - "@kexi/vibe-darwin-x64": "2.0.0", - "@kexi/vibe-darwin-arm64": "2.0.0", - "@kexi/vibe-win32-x64": "2.0.0" + "@kexi/vibe-linux-x64": "2.1.0", + "@kexi/vibe-linux-arm64": "2.1.0", + "@kexi/vibe-darwin-x64": "2.1.0", + "@kexi/vibe-darwin-arm64": "2.1.0", + "@kexi/vibe-win32-x64": "2.1.0" }, "devDependencies": { "vitest": "^3.2.6" diff --git a/packages/vibe-darwin-arm64/package.json b/packages/vibe-darwin-arm64/package.json index eef2335..7db43df 100644 --- a/packages/vibe-darwin-arm64/package.json +++ b/packages/vibe-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@kexi/vibe-darwin-arm64", - "version": "2.0.0", + "version": "2.1.0", "description": "macOS arm64 binary for the vibe CLI", "os": [ "darwin" diff --git a/packages/vibe-darwin-x64/package.json b/packages/vibe-darwin-x64/package.json index 1618504..f236e65 100644 --- a/packages/vibe-darwin-x64/package.json +++ b/packages/vibe-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@kexi/vibe-darwin-x64", - "version": "2.0.0", + "version": "2.1.0", "description": "macOS x64 binary for the vibe CLI", "os": [ "darwin" diff --git a/packages/vibe-linux-arm64/package.json b/packages/vibe-linux-arm64/package.json index 0bfa04e..ec893f8 100644 --- a/packages/vibe-linux-arm64/package.json +++ b/packages/vibe-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@kexi/vibe-linux-arm64", - "version": "2.0.0", + "version": "2.1.0", "description": "Linux arm64 binary for the vibe CLI", "os": [ "linux" diff --git a/packages/vibe-linux-x64/package.json b/packages/vibe-linux-x64/package.json index 4790fd5..7aa3d7d 100644 --- a/packages/vibe-linux-x64/package.json +++ b/packages/vibe-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@kexi/vibe-linux-x64", - "version": "2.0.0", + "version": "2.1.0", "description": "Linux x64 binary for the vibe CLI", "os": [ "linux" diff --git a/packages/vibe-win32-x64/package.json b/packages/vibe-win32-x64/package.json index f3bc852..90062ce 100644 --- a/packages/vibe-win32-x64/package.json +++ b/packages/vibe-win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@kexi/vibe-win32-x64", - "version": "2.0.0", + "version": "2.1.0", "description": "Windows x64 binary for the vibe CLI", "os": [ "win32" diff --git a/rust/Cargo.lock b/rust/Cargo.lock index da51747..1c3bc5f 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1091,7 +1091,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vibe" -version = "2.0.0" +version = "2.1.0" dependencies = [ "anyhow", "clap", @@ -1102,7 +1102,7 @@ dependencies = [ [[package]] name = "vibe-core" -version = "2.0.0" +version = "2.1.0" dependencies = [ "globset", "indicatif", @@ -1134,7 +1134,7 @@ dependencies = [ [[package]] name = "vibe-test-support" -version = "2.0.0" +version = "2.1.0" dependencies = [ "tempfile", ] diff --git a/rust/crates/vibe-core/Cargo.toml b/rust/crates/vibe-core/Cargo.toml index 0f57bf3..67e131f 100644 --- a/rust/crates/vibe-core/Cargo.toml +++ b/rust/crates/vibe-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vibe-core" -version = "2.0.0" +version = "2.1.0" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/rust/crates/vibe-test-support/Cargo.toml b/rust/crates/vibe-test-support/Cargo.toml index c368830..5805e44 100644 --- a/rust/crates/vibe-test-support/Cargo.toml +++ b/rust/crates/vibe-test-support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vibe-test-support" -version = "2.0.0" +version = "2.1.0" edition.workspace = true license.workspace = true repository.workspace = true diff --git a/rust/crates/vibe/Cargo.toml b/rust/crates/vibe/Cargo.toml index 667494d..8f885bc 100644 --- a/rust/crates/vibe/Cargo.toml +++ b/rust/crates/vibe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vibe" -version = "2.0.0" +version = "2.1.0" edition.workspace = true license.workspace = true repository.workspace = true From 0014d957fdf299f7a350aba0091a336ddc719a33 Mon Sep 17 00:00:00 2001 From: Kei Nakayama Date: Tue, 23 Jun 2026 21:35:01 +0900 Subject: [PATCH 17/17] chore: bump @kexi/vibe-* specifiers in pnpm-lock to 2.1.0 CI `pnpm install --frozen-lockfile` rejected the v2.1.0 bump because the workspace-link optionalDependencies in pnpm-lock.yaml still pointed at specifier 2.0.0 while packages/npm/package.json was updated to 2.1.0 by sync-version.ts. sync-version.ts only rewrites manifests; the lockfile specifier mirror needs to follow. --- pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec5b704..0e02980 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,19 +84,19 @@ importers: version: 3.2.6(@types/debug@4.1.12)(@types/node@24.13.2)(@vitest/ui@3.2.6)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: '@kexi/vibe-darwin-arm64': - specifier: 2.0.0 + specifier: 2.1.0 version: link:../vibe-darwin-arm64 '@kexi/vibe-darwin-x64': - specifier: 2.0.0 + specifier: 2.1.0 version: link:../vibe-darwin-x64 '@kexi/vibe-linux-arm64': - specifier: 2.0.0 + specifier: 2.1.0 version: link:../vibe-linux-arm64 '@kexi/vibe-linux-x64': - specifier: 2.0.0 + specifier: 2.1.0 version: link:../vibe-linux-x64 '@kexi/vibe-win32-x64': - specifier: 2.0.0 + specifier: 2.1.0 version: link:../vibe-win32-x64 packages/vibe-darwin-arm64: {}