From ded9cebb2749f3e1da0302c103a631002d227d3f Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sat, 7 Nov 2026 21:16:33 +0800 Subject: [PATCH 01/14] refactor(dev): reuse devkit hooks and release conventions --- .agents/skills/release/SKILL.md | 14 - .claude/skills | 1 - .cspell/words.txt | 4 + .github/actions/setup-nix/action.yml | 37 - .github/renovate.json | 2 +- .github/workflows/ci.yml | 15 +- .github/workflows/formula.yml | 3 +- .github/workflows/nix-cache.yml | 2 +- .gitignore | 2 - .prettierignore | 2 - AGENTS.md | 6 +- RELEASING.md | 99 +- docs/conventions/development.md | 10 +- docs/conventions/github.md | 2 +- docs/design/persistence.md | 2 +- docs/research/api/system-prompt.md | 24 +- flake.lock | 48 +- flake.nix | 107 +- package.json | 13 - pnpm-lock.yaml | 1506 -------------------------- 20 files changed, 94 insertions(+), 1805 deletions(-) delete mode 100644 .agents/skills/release/SKILL.md delete mode 120000 .claude/skills delete mode 100644 .github/actions/setup-nix/action.yml delete mode 100644 .prettierignore delete mode 100644 package.json delete mode 100644 pnpm-lock.yaml diff --git a/.agents/skills/release/SKILL.md b/.agents/skills/release/SKILL.md deleted file mode 100644 index 80300dee2..000000000 --- a/.agents/skills/release/SKILL.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: release -description: Cut an oxide-code release, from the release PR through the published Release and Homebrew formula. Use when asked to release, tag, ship, or cut a version. ---- - -# Cut an oxide-code Release - -Read the root `RELEASING.md` and follow its release procedure step by step. It is the source of truth for releases. These steps are the easiest to skip: - -- [Curate the section](../../../RELEASING.md#curate-the-section) before opening the release PR. -- [Tag](../../../RELEASING.md#tag) only after separate approval. -- [Verify publication](../../../RELEASING.md#verify-publication) once the Release workflow finishes. -- If the workflow opens a Homebrew formula PR, merge it as [Verify publication](../../../RELEASING.md#verify-publication) describes. -- Report the URLs of the release PR, the GitHub Release, and any formula PR. diff --git a/.claude/skills b/.claude/skills deleted file mode 120000 index 2b7a412b8..000000000 --- a/.claude/skills +++ /dev/null @@ -1 +0,0 @@ -../.agents/skills \ No newline at end of file diff --git a/.cspell/words.txt b/.cspell/words.txt index cac14c152..999aec1c2 100644 --- a/.cspell/words.txt +++ b/.cspell/words.txt @@ -1,6 +1,7 @@ acked acking acks +agentic ALPN anthropics APFS @@ -21,6 +22,7 @@ DECRC DECSC deque desync +devkit direnv disambiguable doas @@ -48,6 +50,7 @@ fsmonitor fullfsync getpgid Ghostty +GHSA GOARCH GOEXPERIMENT gsub @@ -103,6 +106,7 @@ pkgs pname popd POSIXLY +prek procs pushd pytest diff --git a/.github/actions/setup-nix/action.yml b/.github/actions/setup-nix/action.yml deleted file mode 100644 index 7a9596a21..000000000 --- a/.github/actions/setup-nix/action.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Set up Nix -description: Install Nix and configure the hakula Cachix substituter - -inputs: - cachix_auth_token: - description: Upload token for main and maintainer runs (omit for read-only cache access) - -runs: - using: composite - steps: - - name: Install Nix - uses: cachix/install-nix-action@v31 - with: - # `sandbox-fallback = false` fails a build that cannot get a sandbox, which Nix would - # otherwise run without one. `fallback = true` builds a path whose substitute fails to - # download, which Nix would otherwise report as a failed build. - extra_nix_config: | - fallback = true - sandbox = true - sandbox-fallback = false - - - name: Set up Cachix - id: cachix - # Also covers the action's post step, which pushes the job's builds. - continue-on-error: true - uses: cachix/cachix-action@v17 - with: - name: hakula - authToken: ${{ inputs.cachix_auth_token }} - skipPush: >- - ${{ !inputs.cachix_auth_token || - !(github.ref == 'refs/heads/main' || github.actor == 'hakula139') }} - - - name: Report Cachix failure - if: ${{ steps.cachix.outcome == 'failure' }} - shell: bash - run: echo "::warning title=Cachix unavailable::Cachix setup failed, so this job builds without the hakula cache." diff --git a/.github/renovate.json b/.github/renovate.json index e6920b62b..552febc2b 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/nixos-config//.github/renovate-preset"], + "extends": ["github>hakula139/devkit#v1.0.0-rc.3"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3293889ac..412468603 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,21 +27,10 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: ./.github/actions/setup-nix + uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} - - name: Format - run: nix develop .#lint -c pnpm format - - - name: Lint Markdown - if: ${{ !cancelled() }} - run: nix develop .#lint -c pnpm lint - - - name: Spell check - if: ${{ !cancelled() }} - run: nix develop .#lint -c pnpm spellcheck - - name: Check dependencies if: ${{ !cancelled() }} run: nix develop .#lint -c cargo deny --locked check @@ -173,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: ./.github/actions/setup-nix + uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index dc89f00f6..f59cdd0e3 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -3,7 +3,6 @@ name: Homebrew Formula on: pull_request: paths: - - .github/actions/setup-nix/** - .github/workflows/formula.yml - .github/workflows/release.yml - Formula/oxide-code.rb @@ -47,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: ./.github/actions/setup-nix + uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index e6782cd25..7c27369d0 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: ./.github/actions/setup-nix + uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.gitignore b/.gitignore index 5adf3a481..3ec7b4297 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,6 @@ /target/ # Dependencies -.pnpm-store/ -node_modules/ # Local environment .env.local diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 618d4984f..000000000 --- a/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -licenses/*.hbs -pnpm-lock.yaml diff --git a/AGENTS.md b/AGENTS.md index 940836a43..a4beef5a3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,8 +10,6 @@ The tree lists only the top-level entries whose names leave their purpose unclea ```text . -├── .agents/ # Agent skills for the release procedure -├── .claude/ # Link to the agent skills for Claude Code ├── about.toml # Release dependency license selection ├── crates/ox/ # The `ox` binary crate with the CLI and headless frontend, mapped in docs/design/architecture.md ├── crates/ox-core/ # The `ox-core` library crate with the agent core, mapped in docs/design/architecture.md @@ -57,9 +55,7 @@ cargo clippy # Lint without test target cargo doc --no-deps # Check rustdoc lints cargo llvm-cov # Run tests and check coverage cargo deny check # Check dependencies when they change -pnpm format # Check JSON, Markdown, and YAML formatting -pnpm lint # Lint Markdown -pnpm spellcheck # Spell check +prek run --all-files # Run the shared formatting and lint hooks ``` [Development](docs/conventions/development.md#ci) lists which CI job runs each check. diff --git a/RELEASING.md b/RELEASING.md index 0d1ed9718..bf6d7de51 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -31,47 +31,17 @@ The TUI layout, prompt text, slash-command output wording, and log format are ou Before 0.1.0, config, environment variable, and session format changes may freely break earlier setups and files, with no migration hints, legacy fallbacks, or compatibility shims. -## Changelog +## Release Preparation -[git-cliff](https://git-cliff.org) drafts each release's `CHANGELOG.md` section from `cliff.toml`, and the release PR curates the draft into the published notes. Curate a section only in its release PR after git-cliff drafts it, and never regenerate an older section. The GitHub Release keeps its own copy of the notes, so once a PR that corrects a published section merges, run the Release workflow on `main` with the tag in its `notes` input, which republishes the tag's section from `main`'s `CHANGELOG.md` and builds nothing: +Follow the [shared release procedure](https://github.com/hakula139/devkit/blob/main/docs/releasing.md) for changelog curation, the release PR, tagging its exact merged commit after separate approval, and CI recovery. Use this repository's `cliff.toml` and `CHANGELOG.md`. Stable sections roll up changes since the previous stable tag, and prereleases compare against the previous tag. Keep compare-link references at the end of the changelog. -```bash -gh workflow run release.yml --ref main -f notes=vX.Y.Z -``` +Security fixes describe the gap, affected releases, and published advisory as [SECURITY.md](SECURITY.md) promises. Add an advisory published later to every affected changelog section through a correction PR. -- Each squash-merged PR title becomes one draft entry. -- `feat`, `fix`, `perf`, and `revert` titles appear under Added, Fixed, Changed, and Removed, respectively. Titles with `!` appear under Breaking changes. All other types are skipped, including routine `chore(deps)` and `chore(flake)` bumps. Use `fix(deps): ...` for a bump that fixes an advisory or changes behavior in the shipped `ox`. `.github/dependabot.yml` applies this title to every Cargo security update. npm packages are development tools that never ship in `ox`, so their bumps remain `chore`, including advisory fixes. -- Within each group, the draft lists unscoped entries first, then the rest sorted by scope in merge order, so related entries sit together. Each `(#N)` links to its PR. -- A stable section includes every change since the previous stable release. A prerelease section includes only changes since the previous tag. -- `--prepend` adds one section while preserving the rest. Avoid `--output CHANGELOG.md`, which regenerates the whole file with a single tag pattern, so it drops every curated section and compare link, along with either the prerelease sections or the stable roll-ups. +1. Set `[workspace.package].version` in `Cargo.toml`, then run `cargo update --workspace`. -### Curate the Section +2. Set the `VERSION=` line in `docs/guide/install.md` to the release tag. -The draft lists PR titles, which are too short to explain each change to users. Before opening the release PR, rewrite the draft for users, reading a PR's description wherever its title leaves the effect unclear. Follow these rules: - -- For a stable section, start from the curated sections of the prereleases it rolls up and carry over every entry. The draft rebuilds entries from PR titles, so it drops the curated wording and omits PRs whose titles it skips, such as advisory bumps merged as `chore(deps)`. Then add the draft entries for changes since the last prerelease, and apply the rules below to the whole section. -- Describe what users can now do, what no longer breaks, and what now works differently, such as a check that now fails or a value that is now rejected. Omit implementation details. -- For a fix that closes a security gap, such as a permission bypass, state what the gap let through and which releases it affected, and link its published advisory after the PR links, as [SECURITY.md](SECURITY.md) promises. When the advisory is published after the release, add the link in a PR that [corrects each section](#changelog) listing the fix. -- Merge entries that describe the same user-visible change, keeping every PR link, as in `([#223](...), [#224](...))`. Fold a fix to a feature that is new in the same section into that feature's entries, and describe the feature as it now works. A merged entry takes the scope of the feature or main change it describes, and a PR with unrelated effects may be split across entries. -- Move each entry to the group that matches its effect. For example, move a `fix` that adds a capability to Added. Keep entries under Breaking changes there. -- Drop entries with no user-visible effect, such as a CI-only or test-only change titled `fix`. -- Within each group, order entries by user impact and keep their scope labels. -- Describe only what the PRs changed. -- Lead with the highlights when the release has any, and curate them like the entries. - -## Prepare a Release - -1. Branch off `main` as `chore/release-vX.Y.Z`. - -2. Set `version` under `[workspace.package]` in `Cargo.toml` to `X.Y.Z`, then refresh `Cargo.lock`: - - ```bash - cargo update --workspace - ``` - -3. Pin the install snippets to the tag by setting the `VERSION=` line in `docs/guide/install.md` to `VERSION=vX.Y.Z`. - -4. For a stable tag, add the release's two [session resume fixtures](docs/design/persistence.md#compatibility), the SQL dump and the export snapshots with their insta headers deleted by `sed` from the first line through the second `---` line. `INSTA_UPDATE=unseen` then records how the new fixtures resume, while still failing if an earlier release's fixture now resumes differently: +3. For a stable tag, add the release's two [session resume fixtures](docs/design/persistence.md#compatibility), the SQL dump and the export snapshots with their insta headers deleted by `sed` from the first line through the second `---` line. `INSTA_UPDATE=unseen` then records how the new fixtures resume, while still failing if an earlier release's fixture now resumes differently: ```bash session=crates/ox-core/src/session @@ -82,49 +52,7 @@ The draft lists PR titles, which are too short to explain each change to users. INSTA_UPDATE=unseen cargo test -p ox-core --lib session_format::resumes_from_every_release_fixture ``` -5. Inside the Nix dev shell, which provides git-cliff, prepend the changelog section. Because `cliff.toml` bounds sections at stable tags only, a prerelease adds a `--tag-pattern` that bounds its section at every tag: - - ```bash - git cliff --unreleased --tag vX.Y.Z --prepend CHANGELOG.md # Stable - git cliff --unreleased --tag vX.Y.Z --tag-pattern '^v[0-9]+\.' --prepend CHANGELOG.md # Prerelease - ``` - - For a notable release, list the highlights as Markdown bullets in `highlights.md` and add `--with-tag-message="$(..vX.Y.Z - ``` - - When the stable lookup finds no tag, as for `v0.1.0`, link `https://github.com/hakula139/oxide-code/releases/tag/vX.Y.Z` instead. - -7. [Curate the section](#curate-the-section) that git-cliff prepended. - -8. Run the [verification block](AGENTS.md#verification). Because `cspell` scans `CHANGELOG.md`, add any unknown words from the section to `.cspell/words.txt`. - -9. Commit, then open a PR titled `chore(release): vX.Y.Z`, whose title becomes the squash commit title on `main`. Record the checks in the PR's Test plan. The diff should touch only `Cargo.toml`, `Cargo.lock`, `CHANGELOG.md`, `docs/guide/install.md`, and possibly `.cspell/words.txt`, plus, for a stable tag, the two new fixtures under `crates/ox-core/src/session/fixtures/` and their snapshots. - -10. Merge after CI passes and the review is approved. If another PR merges first, recreate the branch from `main` and repeat the steps before curation, because updating the branch leaves a section that misses the new commit. Carry the curated entries over from the old branch, then curate the new ones. - -## Tag - -Pushing the tag starts the Release workflow and is hard to undo, so get approval for it separately from the release PR. Push it soon after the merge, because the pinned install snippets on `main` return 404 until the release publishes. - -Tag the release PR's squash commit by its SHA, since a later PR may already sit on top of `main`: - -```bash -git fetch origin -sha=$(gh pr view --json mergeCommit --jq .mergeCommit.oid) -git tag vX.Y.Z "$sha" && git push origin vX.Y.Z -``` - -The workflow reuses the CI run that the merge started on `main` and waits up to an hour for it to finish. It publishes nothing unless a push or dispatched CI run on that commit passed, so a tag on a commit that never ran CI on `main` needs `gh workflow run ci.yml --ref vX.Y.Z` first, and a failed run needs its failed jobs rerun. Then rerun the Release workflow's failed jobs. +4. Run the [verification block](AGENTS.md#verification), including session compatibility checks for stable releases. The release PR changes the version files, changelog, pinned install snippet, any needed spelling entries, and stable-release fixtures and snapshots. ## Verify Publication @@ -136,16 +64,9 @@ Watch the [Release workflow](https://github.com/hakula139/oxide-code/actions/wor The workflow then renders the formula from the release sidecars, installs it through a local tap on `macos-latest` and `ubuntu-latest`, and runs `brew test` there before it opens a `chore(release): refresh Homebrew formula for vX.Y.Z` PR. The same check runs on pull requests that touch the formula, its rendering script, or the release workflows. Merging that PR once its checks pass is the final release step. The formula follows the latest release, or the newest prerelease until the first stable release, so other tags skip this job. If the job fails, fix the cause and rerun it, since a rerun rebuilds the branch and reuses an open PR. -## Re-Cut an Existing Tag - -The PR-based flow tags only reviewed, CI-green commits, so re-cutting should be rare. If a release still needs to be redone (e.g., bad assets), let any in-flight release run finish first. To rebuild the same commit, delete only the release with `gh release delete vX.Y.Z --yes` and run the release workflow from the Actions tab against the tag. To release a different commit, delete the release and its tag, then move and push the tag: - -```bash -gh release delete vX.Y.Z --cleanup-tag --yes -git tag -f vX.Y.Z && git push origin vX.Y.Z -``` +## Recovery -Either way, the new run updates the open formula PR with the new checksums, or opens a new one. +Follow the shared release procedure for notes corrections and CI retries. Let an in-flight release finish before rebuilding assets. Rebuild the original commit when rebuilding the same tag. A source change requires a new version and release PR. A release workflow rerun refreshes the open formula PR or opens one with the rebuilt checksums. ## Stable Gates for 0.1.0 @@ -163,7 +84,7 @@ Before tagging `v0.1.0`: - A whole-repo review at the rc commit has no open findings. Fix each finding or file it into the milestone. - The rc serves as the daily driver for the full soak without a new bug. -The `v0.1.0` release PR also switches the install snippets to `releases/latest/download/`, then removes the `VERSION=` lines and the [Prepare a Release](#prepare-a-release) step that pins them. Because it adds the first session resume fixtures, it also drops `allow_empty_glob` from the fixture test in `crates/ox-core/src/session/handle.rs`, so the test fails again when no fixture matches. +The `v0.1.0` release PR also switches the install snippets to `releases/latest/download/`, then removes the `VERSION=` lines and the [Release Preparation](#release-preparation) step that pins them. Because it adds the first session resume fixtures, it also drops `allow_empty_glob` from the fixture test in `crates/ox-core/src/session/handle.rs`, so the test fails again when no fixture matches. ## Targets diff --git a/docs/conventions/development.md b/docs/conventions/development.md index 7697deb89..cbb910422 100644 --- a/docs/conventions/development.md +++ b/docs/conventions/development.md @@ -4,11 +4,11 @@ Conventions for the dev shell, pre-commit hooks, toolchain, Nix and config file ## Dev Shell -The Nix flake provides the pinned Rust toolchain, `cargo-deny`, `cargo-insta`, `cargo-llvm-cov`, `cargo-mutants`, `git-cliff`, Node.js, pnpm, and the `sqlite3` shell: +The Nix flake provides the pinned Rust toolchain, `cargo-deny`, `cargo-insta`, `cargo-llvm-cov`, `cargo-mutants`, `git-cliff`, and the `sqlite3` shell: ```bash -nix develop # Dev shell with the toolchain, hooks, and Node tools -nix flake check # Run most hooks, the Home Manager module tests, and the test suite +nix develop # Dev shell with the toolchain and hooks +nix flake check # Run shared hooks, the Home Manager module tests, and the test suite nix build # Build ox from source without running the tests ``` @@ -20,7 +20,7 @@ Entering the dev shell in this repository installs a [pre-commit](https://pre-co The hook runs the compile-free subset of the [verification](../../AGENTS.md#verification) checks on staged files: file hygiene, Nix formatting and lints, ShellCheck, `rustfmt`, Prettier and Taplo formatting, `markdownlint`, and `cspell`. Hooks that fix files in place fail the commit if they make changes, so stage the fixes and commit again. Checks that compile the workspace are excluded because their build cost would gate every commit. -The Node-based hooks run tools pinned in `node_modules`, which pnpm installs before running them whenever it is missing or out of date with the lockfile. `nix flake check` leaves them out because its sandbox cannot install `node_modules`, and it leaves out `rustfmt` so that it never fetches the pinned toolchain. CI's Lint job runs the Node tools, and its Rust (Linux) job runs `cargo fmt --check`. Run `pnpm format`, `pnpm lint`, and `pnpm spellcheck` directly when changing documentation, comments, or config files. +The shared devkit hook baseline provides formatting and lint tools directly from Nix, so the sandbox checks them without installing `node_modules`. Only `rustfmt` is a development-only hook, since fetching the pinned Rust toolchain is left to CI's Rust job. Run `prek run --all-files` in the dev shell to check the whole repository. ## Toolchain @@ -78,7 +78,7 @@ CI runs on pushes to `main`, pull requests, and manual dispatch. The release wor | Job | Checks | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Lint | `pnpm format`, `pnpm lint`, `pnpm spellcheck`, and `cargo deny check` in the flake's `lint` shell, which leaves out the pinned toolchain | +| Lint | `cargo deny check` in the flake's `lint` shell, which leaves out the pinned toolchain | | Rust (Linux, macOS, Windows) | `cargo fmt --check` on Linux, then `cargo clippy --all-targets`, `cargo clippy`, `cargo doc --no-deps`, and the test suite under `cargo llvm-cov`, uploaded to Codecov, then on Linux a check that every snapshot baseline has a test | | MSRV | `cargo hack check --rust-version` against `rust-version` | | Nix (Linux, macOS) | `nix flake check`, which also runs the test suite in the build sandbox, then the package build with its `ox --version` check | diff --git a/docs/conventions/github.md b/docs/conventions/github.md index 7ec61371c..34fd76b0a 100644 --- a/docs/conventions/github.md +++ b/docs/conventions/github.md @@ -12,7 +12,7 @@ Conventions for commits, branches, pull requests, and issues. ## Pull Requests -- Merge into `main` only with squash merges. The squash commit uses the PR title, which becomes the PR's draft [changelog](../../RELEASING.md#changelog) entry, so write the title for users. +- Merge into `main` only with squash merges. The squash commit uses the PR title, which becomes the PR's draft [changelog](../../RELEASING.md#release-preparation) entry, so write the title for users. - Fill in `.github/pull_request_template.md`. Start the Summary with prose describing the problem and resulting behavior, then cover each part of the change in a bullet with a bold label. In the Test plan, list the checks actually run and note any verification limits. - Add `Closes #N` for each resolved issue. - Do not request a review from the PR author because GitHub rejects the request. diff --git a/docs/design/persistence.md b/docs/design/persistence.md index ae07494d6..17a2529fb 100644 --- a/docs/design/persistence.md +++ b/docs/design/persistence.md @@ -56,7 +56,7 @@ Generated text blocks carry an optional `origin`: `system_reminder`, `interrupti Tests in `session/handle.rs` enforce the guarantee for stable releases, using two fixtures per release starting with `v0.1.0`, in `crates/ox-core/src/session/fixtures/` and named after the tag: -- **Fixture source.** One test writes a session holding every row kind and content block, with messages, prompt contexts, and metadata after its compaction so a resume reads them. `session_format::writes_every_row_kind` snapshots a deterministic SQL dump of the store, its schema and then its rows with per-run UUIDs and timestamps masked, and `session_format::exports_every_row_kind` snapshots the session's masked export. For each stable tag, the release PR copies the two snapshots as `{tag}.sql` and `{tag}.jsonl`, as [Prepare a Release](../../RELEASING.md#prepare-a-release) describes. +- **Fixture source.** One test writes a session holding every row kind and content block, with messages, prompt contexts, and metadata after its compaction so a resume reads them. `session_format::writes_every_row_kind` snapshots a deterministic SQL dump of the store, its schema and then its rows with per-run UUIDs and timestamps masked, and `session_format::exports_every_row_kind` snapshots the session's masked export. For each stable tag, the release PR copies the two snapshots as `{tag}.sql` and `{tag}.jsonl`, as [Release Preparation](../../RELEASING.md#release-preparation) describes. - **Resume check.** `session_format::resumes_from_every_release_fixture` fills each fixture's masks with fixed values, loads the dump or imports the export into a fresh store, then lists and resumes the session. It snapshots what the listing and the resume recovered: the title, branch, archive state, compaction, prompt context, transcript, tool metadata, recorded usage, and file snapshots. It then appends a message and checks that the message continues the resumed chain. The same check runs on the dump this build writes, so a pull request that changes the format also shows how its sessions will resume. - **Changed behavior.** If a change alters how an old release's session resumes, that fixture's snapshot fails. Fixtures are frozen release output, so never edit them. Accept a changed fixture snapshot only when this section allows the change. diff --git a/docs/research/api/system-prompt.md b/docs/research/api/system-prompt.md index 5514cd7fb..89c1b00d6 100644 --- a/docs/research/api/system-prompt.md +++ b/docs/research/api/system-prompt.md @@ -153,21 +153,21 @@ Claude Code transforms its flat sections array into the block layout actually se **First-party base URL** (`api.anthropic.com`), global cache active: -| # | Content | `cache_control` | -| --- | -------------------------------- | --------------------------------------------------- | -| 0 | Billing / attribution header | - | -| 1 | Identity prefix | - | -| 2 | Static sections joined (`\n\n`) | `{ type: "ephemeral", scope: "global", ttl: "1h" }` | -| 3 | Dynamic sections joined (`\n\n`) | - | +| # | Content | `cache_control` | +| - | -------------------------------- | --------------------------------------------------- | +| 0 | Billing / attribution header | - | +| 1 | Identity prefix | - | +| 2 | Static sections joined (`\n\n`) | `{ type: "ephemeral", scope: "global", ttl: "1h" }` | +| 3 | Dynamic sections joined (`\n\n`) | - | **Third-party base URL** (gateway, self-hosted, anything else), default scope: -| # | Content | `cache_control` | -| --- | -------------------------------- | ---------------------------------- | -| 0 | Billing / attribution header | - | -| 1 | Identity prefix | - | -| 2 | Static sections joined (`\n\n`) | `{ type: "ephemeral", ttl: "1h" }` | -| 3 | Dynamic sections joined (`\n\n`) | - | +| # | Content | `cache_control` | +| - | -------------------------------- | ---------------------------------- | +| 0 | Billing / attribution header | - | +| 1 | Identity prefix | - | +| 2 | Static sections joined (`\n\n`) | `{ type: "ephemeral", ttl: "1h" }` | +| 3 | Dynamic sections joined (`\n\n`) | - | Omitting the `scope` field is deliberate: org is the absent-field default, and the resulting wire shape is what the Anthropic SDK ships for non-global ephemeral caches. `ttl` follows `prompt_cache_ttl`: `"1h"` is shown, and with `"5m"` the field is omitted because that is the server default. diff --git a/flake.lock b/flake.lock index 65158ad33..926c35465 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,28 @@ { "nodes": { + "devkit": { + "inputs": { + "git-hooks-nix": "git-hooks-nix", + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-unstable": "nixpkgs-unstable" + }, + "locked": { + "lastModified": 1793969014, + "narHash": "sha256-zv3AmKieMhtUt/H3dh44x6mX4moUwsXHE7gKSEtYGs8=", + "owner": "hakula139", + "repo": "devkit", + "rev": "9666b7261a94b5d7ed9a13a839dfc5360d96dd4d", + "type": "github" + }, + "original": { + "owner": "hakula139", + "ref": "v1.0.0-rc.3", + "repo": "devkit", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -20,15 +43,16 @@ "inputs": { "flake-compat": "flake-compat", "nixpkgs": [ + "devkit", "nixpkgs" ] }, "locked": { - "lastModified": 1793686154, - "narHash": "sha256-Zb/0L3soxrkfcrywpfp0J++0WFLB3tzh0Xtx9up+VNc=", + "lastModified": 1791909798, + "narHash": "sha256-VAhpCOmrun/KXimYfR8NM88bciKCui7CqHHhThSzgag=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "204b6977e00caac19e2313015a598543ca7be150", + "rev": "1ba1dbfe28738c9a71c266be6efa5b89e75491a9", "type": "github" }, "original": { @@ -74,9 +98,25 @@ "type": "github" } }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1793540411, + "narHash": "sha256-fiPJ88izTVucjeo2EQ3jk4aWmLg03I1D4vxnX2QjEgE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0bb2eedc20e4739f29e8045034f2828ad7054f8f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { - "git-hooks-nix": "git-hooks-nix", + "devkit": "devkit", "home-manager": "home-manager", "nixpkgs": "nixpkgs", "rust-overlay": "rust-overlay" diff --git a/flake.nix b/flake.nix index 2c6bbc635..7621466c6 100644 --- a/flake.nix +++ b/flake.nix @@ -23,8 +23,8 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - git-hooks-nix = { - url = "github:cachix/git-hooks.nix"; + devkit = { + url = "github:hakula139/devkit/v1.0.0-rc.3"; inputs.nixpkgs.follows = "nixpkgs"; }; @@ -42,7 +42,7 @@ self, nixpkgs, rust-overlay, - git-hooks-nix, + devkit, home-manager, ... }: @@ -89,7 +89,7 @@ system: let pkgs = nixpkgs.legacyPackages.${system}; - nodejs = pkgs.nodejs_26; + dk = devkit.lib.mkLib pkgs; rustBin = rust-overlay.lib.mkRustBin { } pkgs; rustToolchain = rustBin.fromRustupToolchainFile ./rust-toolchain.toml; @@ -105,21 +105,12 @@ # ------------------------------------------------------------------------------------------ # Pre-commit Hooks # ------------------------------------------------------------------------------------------ - hooks = { - end-of-file-fixer.enable = true; - trim-trailing-whitespace.enable = true; - check-added-large-files.enable = true; - check-shebang-scripts-are-executable.enable = true; - check-yaml.enable = true; - taplo.enable = true; - - nixfmt.enable = true; - deadnix.enable = true; - statix.enable = true; - - shellcheck.enable = true; + preCommit = dk.preCommit { + src = ./.; + hooks.check-shebang-scripts-are-executable.enable = true; - rustfmt = { + # CI checks formatting without fetching the pinned toolchain in the Nix sandbox. + devHooks.rustfmt = { enable = true; packageOverrides = { cargo = rustToolchain; @@ -128,64 +119,6 @@ }; }; - # These hooks run tools pinned in node_modules, which the Nix sandbox lacks. The flake check - # leaves them to CI's Lint job. - nodeHook = - name: cmd: - pkgs.lib.getExe ( - pkgs.writeShellApplication { - inherit name; - runtimeInputs = with pkgs; [ - nodejs - pnpm - ]; - - text = '' - pnpm exec ${cmd} "$@" - ''; - } - ); - - nodeHooks = { - prettier-write = { - enable = true; - name = "prettier"; - entry = nodeHook "prettier-write" "prettier --write --ignore-unknown"; - require_serial = true; - types = [ "text" ]; - }; - - cspell = { - enable = true; - package = null; - entry = nodeHook "cspell" "cspell --no-must-find-files --no-progress"; - require_serial = true; - types = [ "text" ]; - }; - - markdownlint = { - enable = true; - name = "markdownlint-cli2"; - package = null; - entry = nodeHook "markdownlint" "markdownlint-cli2 --fix"; - require_serial = true; - files = "\\.md$"; - }; - }; - - preCommit = git-hooks-nix.lib.${system}.run { - hooks = hooks // nodeHooks; - src = ./.; - }; - - # The flake check leaves rustfmt to CI's Rust job, so it never fetches the pinned toolchain. - preCommitCheck = git-hooks-nix.lib.${system}.run { - hooks = removeAttrs hooks [ "rustfmt" ]; - src = ./.; - }; - - flock = pkgs.lib.getExe pkgs.flock; - git = pkgs.lib.getExe pkgs.git; in { # ------------------------------------------------------------------------------------------ @@ -198,32 +131,16 @@ packages = [ rustDevToolchain ] - ++ preCommit.enabledPackages - ++ [ preCommit.config.package ] ++ (with pkgs; [ cargo-deny cargo-insta cargo-llvm-cov cargo-mutants git-cliff - nodejs - pnpm sqlite ]); - # Use shared hooks to avoid the relative path bug in linked worktrees (git-hooks.nix#688). - # Serialize installation, and leave sibling repositories that borrow this shell untouched. - shellHook = '' - if common=$(${git} rev-parse --path-format=absolute --git-common-dir 2>/dev/null) && - top=$(${git} rev-parse --show-toplevel 2>/dev/null) && - [ -f "$top/crates/ox/Cargo.toml" ]; then - ( - ${flock} 9 - ${preCommit.config.installationScript} - ${git} config --local --unset-all core.hooksPath || true - ) 9>"$common/git-hooks.lock" - fi - ''; + inputsFrom = [ preCommit.shell ]; }; # CI's Lint job runs in this shell, which leaves out the pinned toolchain so that every tool @@ -235,9 +152,7 @@ packages = with pkgs; [ cargo cargo-deny - nodejs nushell - pnpm ]; }; @@ -253,7 +168,7 @@ # Checks # ------------------------------------------------------------------------------------------ checks = { - pre-commit = preCommitCheck; + pre-commit = preCommit.check; home-manager = import ./nix/home-manager-tests.nix { inherit home-manager oxide-code pkgs; diff --git a/package.json b/package.json deleted file mode 100644 index 7797c5817..000000000 --- a/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "private": true, - "scripts": { - "format": "prettier --check .", - "lint": "markdownlint-cli2 \"**/*.md\"", - "spellcheck": "git ls-files | cspell --no-progress --file-list stdin" - }, - "devDependencies": { - "cspell": "^10.4.0", - "markdownlint-cli2": "^0.24.0", - "prettier": "^3.9.10" - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 2d13b49ea..000000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,1506 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -overrides: - markdownlint>re2js: ~2.9.0 - micromark-extension-math>katex: ^0.19.0 - -importers: - - .: - devDependencies: - cspell: - specifier: ^10.4.0 - version: 10.4.1 - markdownlint-cli2: - specifier: ^0.24.0 - version: 0.24.0 - prettier: - specifier: ^3.9.10 - version: 3.9.10 - -packages: - - '@cspell/cspell-bundled-dicts@10.4.1': - resolution: {integrity: sha512-QkDsQSUa6qK/2/AF43YYTrN1rpsJN3Yn1ckA3qH9zmBn0N/tkCWaJ675wo8j1CguPjZdPBF1t4J5tLcjiQv/Dg==} - engines: {node: '>=22.18.0'} - - '@cspell/cspell-json-reporter@10.4.1': - resolution: {integrity: sha512-PV0fshBdl78839JMs0H8rpq6766TTdZQPdT+tiZ1+atarso+gZLxM4DXMqePdCBbhgV46jbW91DoN4KZIYUysA==} - engines: {node: '>=22.18.0'} - - '@cspell/cspell-performance-monitor@10.4.1': - resolution: {integrity: sha512-hVYcJ3i8vnuo+8lK+awOsuYHIA2rlFS/DIW/ZIjKmCcVjgdNTVAWtx/EQs3mqGZGegJTOPaSv1uGvLpLgtLTHw==} - engines: {node: '>=22.18.0'} - - '@cspell/cspell-pipe@10.4.1': - resolution: {integrity: sha512-7P4srvEo/LUyoGTwwsnijCZzUKTyC39N9seYyk7/u4DHmww4cQpKW3ktWdZu90hOP1hV+zdAptUMnHTHxa5NmQ==} - engines: {node: '>=22.18.0'} - - '@cspell/cspell-resolver@10.4.1': - resolution: {integrity: sha512-7aKxe59PqwVHUIQQJaN//RiiooCudG4sU+ycKUUUcEKN04vxQuo582Desa1WQQsKMH4VjCLZF1XD5lCmnpS0rw==} - engines: {node: '>=22.18.0'} - - '@cspell/cspell-service-bus@10.4.1': - resolution: {integrity: sha512-sC7dR3kfGIugcAjVjIfKKfI1T/r+2E1ps9a7aXqAJRmfLZAKXbnKGO5aeVGHKmtxGw/odZEDDOis2uwq2tdUfQ==} - engines: {node: '>=22.18.0'} - - '@cspell/cspell-types@10.4.1': - resolution: {integrity: sha512-FfaRrnrZ3xD09Tq6C49BdAZSx+tLM38Z60vFR/1+qQMQejUOHhv/lQ3UNN4I9z+P3BhmKutcLf8M8IOwlMfOtQ==} - engines: {node: '>=22.18.0'} - - '@cspell/cspell-worker@10.4.1': - resolution: {integrity: sha512-H6+jTNdXsb5NYRG0g29axVVVS3VHvtXCeggD3p0tRVnBF/SBJZVdsHkQJPFSSAjgMNXPq8S1zhEJzmQECG9G6A==} - engines: {node: '>=22.18.0'} - - '@cspell/dict-ada@4.1.1': - resolution: {integrity: sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==} - - '@cspell/dict-al@1.1.1': - resolution: {integrity: sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==} - - '@cspell/dict-aws@4.0.17': - resolution: {integrity: sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==} - - '@cspell/dict-bash@4.2.3': - resolution: {integrity: sha512-ljUZoKHbDqw5Sx0qpL2qTUlmkmr+vhZH/sCNrNaBZKTbdgiswErSnIF1jRbGmEitJNxHRHWsuZyVgnTGfVO1Yw==} - - '@cspell/dict-companies@3.2.14': - resolution: {integrity: sha512-3EeCXEjd6ocbKNEHsPHViHJrDduJsVo9ixr0EMrzUO6OVCXlLSCLosDUzeANQidu/u6WA1ln63uRJ9fAGAKHzw==} - - '@cspell/dict-cpp@7.2.0': - resolution: {integrity: sha512-hxz+OyQKV96/Bk2JYGsDuSOheYA5gd8KybXnoZMMu/mhZPnwhPi+qiS0Kjc0gLNbXjJ6wbBuXIQWi1UWpQBU/g==} - - '@cspell/dict-cryptocurrencies@5.0.5': - resolution: {integrity: sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==} - - '@cspell/dict-csharp@4.0.8': - resolution: {integrity: sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==} - - '@cspell/dict-css@4.1.2': - resolution: {integrity: sha512-+ylGoKdwZ2sVOCOnU2Eq5wDZx+RaVX3HoKyNHGGsFvhSw6IidQ6tH/mAPKBDofViHJoWCPNlklE0lTr6MDG3QA==} - - '@cspell/dict-dart@2.3.2': - resolution: {integrity: sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==} - - '@cspell/dict-data-science@2.0.17': - resolution: {integrity: sha512-6KuM1tXc1PROGu2VJjRMIkFI3lf/1c3ReFqbjV148m5w8SwNVej4Jp6nJa2f64xyaR5Z+LSRTr5RvDDJVovP8A==} - - '@cspell/dict-django@4.1.7': - resolution: {integrity: sha512-94LIxiF/StBTxDkmBhi1eoOX9D/B7gk6pabBvIZFh0gmREAU6ESqU2Wv/RfGARdueMQMPfOJka+vbtL4yKv0oA==} - - '@cspell/dict-docker@1.1.17': - resolution: {integrity: sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==} - - '@cspell/dict-dotnet@5.0.15': - resolution: {integrity: sha512-j2MUKPlzMeDy/mnb1EjmtkX8e6VzZdw60Qyf6vPlp7WZhUwwp2LBlKOWx7+hASjP6k4a0nDpmn77G+4upxvbZA==} - - '@cspell/dict-elixir@4.0.8': - resolution: {integrity: sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==} - - '@cspell/dict-en-common-misspellings@2.2.6': - resolution: {integrity: sha512-RMOmCPOJuBfcC8IVLKjs9aqssjLKmhwVI8Yw/xgEnO9trWAiUzESassDATE229xqi1sdtRIIMGHyuxlkL75Xjg==} - - '@cspell/dict-en-gb-mit@3.1.32': - resolution: {integrity: sha512-bEASyTAzXLowmFWrZIJjeAeCpY9g3jcYDO3tVyFDL/UaAuz0UvCVgOEyg+Ym7bclijqvXmj0xXOD/cW2XWG8iw==} - - '@cspell/dict-en_us@4.4.43': - resolution: {integrity: sha512-RK0zfFXSPi0G/zmV9YgUhS2xw9eTV/8DtQ+ouLIiRZ8ejWRt2zhAonu5di+qmIhzhQ62fg7d3tMz3WwRy82yJA==} - - '@cspell/dict-filetypes@3.0.18': - resolution: {integrity: sha512-yU7RKD/x1IWmDLzWeiItMwgV+6bUcU/af23uS0+uGiFUbsY1qWV/D4rxlAAO6Z7no3J2z8aZOkYIOvUrJq0Rcw==} - - '@cspell/dict-flutter@1.1.1': - resolution: {integrity: sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==} - - '@cspell/dict-fonts@4.0.6': - resolution: {integrity: sha512-aR/0csY01dNb0A1tw/UmN9rKgHruUxsYsvXu6YlSBJFu60s26SKr/k1o4LavpHTQ+lznlYMqAvuxGkE4Flliqw==} - - '@cspell/dict-fsharp@1.1.1': - resolution: {integrity: sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==} - - '@cspell/dict-fullstack@3.2.9': - resolution: {integrity: sha512-diZX+usW5aZ4/b2T0QM/H/Wl9aNMbdODa1Jq0ReBr/jazmNeWjd+PyqeVgzd1joEaHY+SAnjrf/i9CwKd2ZtWQ==} - - '@cspell/dict-gaming-terms@1.1.3': - resolution: {integrity: sha512-hLGzd/f+KX5B/5YxAXuQi4DYEfu6IKudtNFO/Nima3JLXD+8Xn+d0q6VdaBxkWVhGYlzow9o+dce+S9mNtgpMg==} - - '@cspell/dict-git@3.1.1': - resolution: {integrity: sha512-XvuGVYj9YEu4EzntqyhH8XlTRyy57C6j8oxkIbUQfR2UYzxZGAP77XHl7qY7eC/40r/haDwnBaccyFR6BRmUCg==} - - '@cspell/dict-golang@6.0.29': - resolution: {integrity: sha512-EZCgfxrr5lPnYQLmSvB6YtpfoDFt2KKxAD4ppq2xGSIgDFXAF7Mv4doiXIFUQaynCBIEfAMl3f/uDfrIUo4fyQ==} - - '@cspell/dict-google@1.0.9': - resolution: {integrity: sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==} - - '@cspell/dict-haskell@4.0.6': - resolution: {integrity: sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==} - - '@cspell/dict-html-symbol-entities@4.0.5': - resolution: {integrity: sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==} - - '@cspell/dict-html@4.0.16': - resolution: {integrity: sha512-9B6/Cpb5YVcYgsEAlKudun1yd4ONllYS/ZibKLYea2apPR+l2vQdARnPrP9kTqa7NUNfRKl7m9Fb6k9rjimnow==} - - '@cspell/dict-java@5.0.12': - resolution: {integrity: sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==} - - '@cspell/dict-julia@1.1.1': - resolution: {integrity: sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==} - - '@cspell/dict-k8s@1.0.13': - resolution: {integrity: sha512-ELGkS13k7K/NEfVimBSrxVTfqXvOF/Kvxj4I62YxRm8bvHbfoXgrGaOx28lPiNRz+dmu+yYtvuXbnURKtYbC6g==} - - '@cspell/dict-kotlin@1.1.1': - resolution: {integrity: sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==} - - '@cspell/dict-latex@5.1.0': - resolution: {integrity: sha512-qxT4guhysyBt0gzoliXYEBYinkAdEtR2M7goRaUH0a7ltCsoqqAeEV8aXYRIdZGcV77gYSobvu3jJL038tlPAw==} - - '@cspell/dict-lorem-ipsum@4.0.5': - resolution: {integrity: sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==} - - '@cspell/dict-lua@4.0.8': - resolution: {integrity: sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==} - - '@cspell/dict-makefile@1.0.5': - resolution: {integrity: sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==} - - '@cspell/dict-markdown@2.0.18': - resolution: {integrity: sha512-KLRSwVrwKDz4n7bl2XQjzvaBZbGgx5QKkP5Ok1b24xaO3TpXsLhAbAn1mItvFlI2tF6Rkt83iYjQcYppywuf5Q==} - peerDependencies: - '@cspell/dict-css': ^4.1.2 - '@cspell/dict-html': ^4.0.16 - '@cspell/dict-html-symbol-entities': ^4.0.5 - '@cspell/dict-typescript': ^3.2.3 - - '@cspell/dict-monkeyc@1.1.2': - resolution: {integrity: sha512-4VzwdSUVqyUVmAKAzMkVwVa7AkvSi1l1OHdQr58MWq4VR4NQDO8sVQSibd2PMxruXTkxJt9UwVQVHgaaVTiV1Q==} - - '@cspell/dict-node@5.0.9': - resolution: {integrity: sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==} - - '@cspell/dict-npm@5.2.56': - resolution: {integrity: sha512-VqN/f97X64gYR7zVXLu2PN6t5Sm6EljZEFp4htmbOL9tGqs0XVErl9B9kwfaLlKJqfLU6vYcupjRBjqTQ6rQ4Q==} - - '@cspell/dict-php@4.1.3': - resolution: {integrity: sha512-41oKzl7rLVrrVZA/Gs0ESnP6KliEX7c+IwaaNmOL3PAoHasFDVEmIFeENIzuDdM12UcHT+MlLkAm3Qw/lS/ERA==} - - '@cspell/dict-powershell@5.0.17': - resolution: {integrity: sha512-khOoIdBgKRk2scnr7888pf70yJ1Tr3RGdnYcAN0MJ2vtaNRKoOTCFc13gXUkNDHwEyhMI1h9oz3KsT180F2amw==} - - '@cspell/dict-public-licenses@2.0.17': - resolution: {integrity: sha512-Asdumgg3oZ4ki//b2a+beiVIsNZA5thim4t4v3lTDLY/6a8VAPmTjzC3Y2t0x7ywC/bzAhi1KW/fg8JlwHDgig==} - - '@cspell/dict-python@4.5.3': - resolution: {integrity: sha512-I226HEEJW4fleE0HMxRaecnzcJICFK6TOqIjqVkOJZzaVZTTjE7fojM+f5XECAwhf4BImW7HVOKMu4rMtza6ZA==} - - '@cspell/dict-r@2.1.1': - resolution: {integrity: sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==} - - '@cspell/dict-ruby@5.1.4': - resolution: {integrity: sha512-Slw1dLY/pW5liJ5Fle+MIPphIdleZkIM6STDoXCN7sy298GfbfT34sJTcSZcXzZJVXiCEAvlLp+s1YNr6DuWNg==} - - '@cspell/dict-rust@4.1.2': - resolution: {integrity: sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==} - - '@cspell/dict-scala@5.0.11': - resolution: {integrity: sha512-+D59847Y61KZ0MBoXJzBMtOXfFhezEb6ShjvJlL7bnryyy6iBwAfozbz7OJAe+KrEpYm+GlVV7Wy4FmJSgxBag==} - - '@cspell/dict-shell@1.2.0': - resolution: {integrity: sha512-PVctvT22lJ49niMiakO8xieY7ELCAzjSqhejWR7bAMb5AZ9F4WDEs+XdGMnoVHWeXq7K5rcepLPmEJb+37zzIw==} - - '@cspell/dict-software-terms@5.4.9': - resolution: {integrity: sha512-bB5L+OGW0F8Vt83j0XFcMEWCbCNqquLgjlQjm/iCp1jcYi/pQbqDLkXIPbINgbeG0vRqiu5yCPDFCsv4Qb6miQ==} - - '@cspell/dict-sql@2.2.1': - resolution: {integrity: sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==} - - '@cspell/dict-svelte@1.0.7': - resolution: {integrity: sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==} - - '@cspell/dict-swift@2.0.6': - resolution: {integrity: sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==} - - '@cspell/dict-terraform@1.1.4': - resolution: {integrity: sha512-Ere42ilvMFvQA4GlcN0OKlruMPR6EsvaB+iTHzj2xc+NJGRK64V7yApUcWrOrSgTiM/vhWXPIsK3OMfiAiNdmA==} - - '@cspell/dict-typescript@3.2.3': - resolution: {integrity: sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==} - - '@cspell/dict-vue@3.0.5': - resolution: {integrity: sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==} - - '@cspell/dict-zig@1.0.0': - resolution: {integrity: sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==} - - '@cspell/dynamic-import@10.4.1': - resolution: {integrity: sha512-0TlwRH0VHL3atb2QC7l8PK0CRGNmVqRPCqL84rqWlEHrh1bOqvK+2EvMRnf9nSSx5IdS2rXZYibrSfcEY0cUqQ==} - engines: {node: '>=22.18.0'} - - '@cspell/filetypes@10.4.1': - resolution: {integrity: sha512-ztHYeAA/cKAJdX90xjVY+RjJN9im2POkY2wAztDQjOUtP+8qztWHtdk5mOBcRXv7Q93ivBY9N0ZmctakE3+A7Q==} - engines: {node: '>=22.18.0'} - - '@cspell/rpc@10.4.1': - resolution: {integrity: sha512-rkNS7F1q+aofcex3lun2YzxMybx2pUXgVB1mFRC7LOQhrFOqs85FYg0Absc2sKr2QmedckgWj3Du91ZJn0eChA==} - engines: {node: '>=22.18.0'} - - '@cspell/strong-weak-map@10.4.1': - resolution: {integrity: sha512-Bap/Gs0/G4NE6KQtT+dNvyGBC2iHws+5il/nvFUuZ1D5dLEK/SYeOuLCX/hdCvcPEF02kr8NxJfY7oK/w8YFiQ==} - engines: {node: '>=22.18.0'} - - '@cspell/url@10.4.1': - resolution: {integrity: sha512-QoFi7+fMsBMz9l1wULNcVfyih2DarTv9Z+QKkQGuC/a1Xq70Veoh/JRtczDoOXCAsgutX12VHlHtu9nPRhahoQ==} - engines: {node: '>=22.18.0'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - - '@streetsidesoftware/unindent@1.0.1': - resolution: {integrity: sha512-ZXfg7MT3AT9ZOq/hgzbqNc01zVPG+PFkr+kbB2OHlMcNrtvK10ZPkNgy38MqTErjNeajh4VG1sSSv5zIyjOXxg==} - engines: {node: '>=22.18.0'} - - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - - '@types/katex@0.16.8': - resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - ansi-regex@6.5.0: - resolution: {integrity: sha512-zhvbbbdt1kbw7EJ9OQoxmQcuaNR9P5kTj7e/YdmOSU10aHWbycofJxA6jKfoEy3vlLdctOF9ZHaxLtmSm998wQ==} - engines: {node: '>=12'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - argparse@3.0.4: - resolution: {integrity: sha512-fwWK3Zq22l4XJJjx5mcBHGikIk+hJqO+32dPm0Jur7+rtG5x1scOjSfdT9ZKeWHPpsya/l0HHK4tDImBkTrtvA==} - - array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - chalk-template@1.1.3: - resolution: {integrity: sha512-KDt7oQ+LRF2VLFsTAZd76ZNCKQa8LuW7SZkNJMkriMzvlSNj6dI+S+f41mfK9oTtil49seHVyabtt1753sFL2w==} - engines: {node: '>=14.16'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@6.0.1: - resolution: {integrity: sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==} - engines: {node: '>=22'} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - - commander@15.0.0: - resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} - engines: {node: '>=22.12.0'} - - comment-json@5.0.0: - resolution: {integrity: sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==} - engines: {node: '>= 6'} - - cspell-config-lib@10.4.1: - resolution: {integrity: sha512-g6XYIdwwIlvakGsIaBtddakSXe35DIwREDptBxLhf0rcIdMv0n4Ii9BluaX+RgzMzRavkBlLS19quNLl80g+LA==} - engines: {node: '>=22.18.0'} - - cspell-dictionary@10.4.1: - resolution: {integrity: sha512-o9aIAsY0R+MMBbhFEF7aP77NaNETdp1YbZTRN0Xt4JsXQzjX9CMSXOm7WepRVk4Cf9DSSBdyhOYVbECu+2T0wg==} - engines: {node: '>=22.18.0'} - - cspell-gitignore@10.4.1: - resolution: {integrity: sha512-YGX9WrxBOma0zNbR8RrVQWmtVJzHMy71ouljbJ/iC8HHTFwaVUlKEFMzvpSYLTAMSMVpa1Cc+9HpUjCcxiyOaA==} - engines: {node: '>=22.18.0'} - hasBin: true - - cspell-glob@10.4.1: - resolution: {integrity: sha512-bgLVOtD1sDSE0NxTXva6A9HSoxPhet4y709czloJ2bEDb0FNLl+kKJl2hEX0GtMztaNuLWK8nmb9y4RiJbON1Q==} - engines: {node: '>=22.18.0'} - - cspell-grammar@10.4.1: - resolution: {integrity: sha512-LqXg57TQp/7UPH2XJC6WZTfTLvV0iP+8Ox0Gkyo0tFr+ijBWBB2KnPGEX1udtzZqaRpGokT2xi5rB3zO/lAxgg==} - engines: {node: '>=22.18.0'} - hasBin: true - - cspell-io@10.4.1: - resolution: {integrity: sha512-4AtNoBOFDHKDul2teL+PsmvZlIM+U1uWxFVGmzCtP4xVENKm1WlgwOoSSsQVvZDBlMRLjkWbsHJAKIR3f97wfg==} - engines: {node: '>=22.18.0'} - - cspell-lib@10.4.1: - resolution: {integrity: sha512-mX9UfN3hpcfdbqLWYIzLiJ81W2dhcgJfBDo3H1YAPK+yXZobSxtHeyQQBBapJ6Ca84U2R6AWNjuSjCneeISogg==} - engines: {node: '>=22.18.0'} - - cspell-trie-lib@10.4.1: - resolution: {integrity: sha512-MOxZ3b2MLNfRWXz1Seh6xXGvUclMxA9h11tCBj6+Y0pd+7KtNk7YMlzmHIGOnbF9W5YZNtA2bMuYbVlefcOa1w==} - engines: {node: '>=22.18.0'} - peerDependencies: - '@cspell/cspell-types': 10.4.1 - - cspell@10.4.1: - resolution: {integrity: sha512-/6r9R7Pv78VFuD4uKogu2g6SG+Lms78sLBesgEPR8YJ/VEbEYAz6cbXv86m3FMlqWJdccvnG6WiPNt2Ce8SZAw==} - engines: {node: '>=22.18.0'} - hasBin: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - entities@8.1.0: - resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} - engines: {node: '>=20.19.0'} - - env-paths@4.0.0: - resolution: {integrity: sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==} - engines: {node: '>=20'} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - fast-equals@6.2.2: - resolution: {integrity: sha512-n+XqoarWCgcar0O3om3DeNYx6xTuLWGTUF1bRZ9iuO00tsPepzP1L4V7rqtxxZ4PEya34UCESReimFvxmEVwIA==} - engines: {node: '>=6.0.0'} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fastq@1.20.3: - resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - flatted@3.4.4: - resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} - - gensequence@8.0.8: - resolution: {integrity: sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==} - engines: {node: '>=20'} - - get-east-asian-width@1.7.0: - resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} - engines: {node: '>=18'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - global-directory@5.0.0: - resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} - engines: {node: '>=20'} - - globby@16.2.4: - resolution: {integrity: sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==} - engines: {node: '>=20'} - - ignore@7.0.14: - resolution: {integrity: sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==} - engines: {node: '>= 4'} - - import-fresh@4.0.1: - resolution: {integrity: sha512-/XFeXYgkuWgbtqPC7qPKvciXTvhtz7WMNQKQsAM1Kz+j0I5OWJDrybfiya6QtHF9oEvPkLwTHmC9+4OR/MmfIA==} - engines: {node: '>=22.15'} - - import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - - ini@6.0.0: - resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@4.0.0: - resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} - engines: {node: '>=12'} - - is-safe-filename@0.1.1: - resolution: {integrity: sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==} - engines: {node: '>=20'} - - js-yaml@5.4.3: - resolution: {integrity: sha512-yzzNtgczwgoVHNigCyKTXcQJU4Y8t/ikU4UxXW0BvrLfHTGWZhsNcOT2s/a7vn81/4KqVnNmHjaUEPlvWnNwVw==} - hasBin: true - - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - - jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - - katex@0.19.1: - resolution: {integrity: sha512-jG8uKntjSEcm2EpQOh0XturpPuuC9r3Sq5HLHdsFdWZT27E672SF19QEi+of0/YeOy15lDgRhKvr5614uRrEfA==} - hasBin: true - - linkify-it@6.1.0: - resolution: {integrity: sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==} - - markdown-it@15.0.3: - resolution: {integrity: sha512-+Az7Ojz3iRGu8KYMvJ6xVhvrxP3eE+vEtJX75Ow88XBpcQNV/0lGX5ZynIIBftREo4DC2jsveAMDaeltmm8QvQ==} - hasBin: true - - markdownlint-cli2-formatter-default@0.0.6: - resolution: {integrity: sha512-VVDGKsq9sgzu378swJ0fcHfSicUnMxnL8gnLm/Q4J/xsNJ4e5bA6lvAz7PCzIl0/No0lHyaWdqVD2jotxOSFMQ==} - peerDependencies: - markdownlint-cli2: '>=0.0.4' - - markdownlint-cli2@0.24.0: - resolution: {integrity: sha512-c5hU2MDoTlS230MLzdNlkIyxImXq5acxGKz4nYz4aDhH/2BgFtpsA7iK9/OoTHMgZ4FuR0wedTQA31K6Lp9I/Q==} - engines: {node: '>=22'} - hasBin: true - - markdownlint@0.42.0: - resolution: {integrity: sha512-kzsCV/rPWRFn3jUhcB919YF4Qgeh0g9tcogoXFadGSo6Zxj6662YOqWXv0jDn8nv5KCCxDfMKJZv6N4HkNkvTg==} - engines: {node: '>=22'} - - mdurl@2.1.0: - resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromark-core-commonmark@2.0.4: - resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} - - 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==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-table@2.1.2: - resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==} - - micromark-extension-math@3.1.0: - resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@2.1.0: - resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-edit-map@1.0.0: - resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.3: - resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} - - micromark@4.0.3: - resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - - picomatch@4.0.7: - resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} - engines: {node: '>=12'} - - prettier@3.9.10: - resolution: {integrity: sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==} - engines: {node: '>=14'} - hasBin: true - - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - re2js@2.9.1: - resolution: {integrity: sha512-JIT3bEEUZTOR2YS1walNEIfH4cF/cQeZcBUFq7ldqO6lR6g0X5CBq/S8rsa9omzZcsNf8qc36jCkWpKKtncrZg==} - engines: {node: '>=20.0.0'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - semver@7.8.6: - resolution: {integrity: sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==} - engines: {node: '>=10'} - hasBin: true - - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - - smol-toml@1.9.1: - resolution: {integrity: sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==} - engines: {node: '>= 18'} - - string-width@8.3.0: - resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} - engines: {node: '>=20'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - uc.micro@3.0.0: - resolution: {integrity: sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==} - - unicorn-magic@0.4.1: - resolution: {integrity: sha512-lzlXPoVB0Uy/FvTaUgX39RbixYiSKoc3JSoSf01+0c2B6FR3qdYIPN7Qjo/AV7n6sqLCk0509cT3LRj1oSZ1+A==} - engines: {node: '>=20'} - - vscode-languageserver-textdocument@1.0.16: - resolution: {integrity: sha512-qeNEuOi9a3qkqRf7Gfez2WL2VwlBTLCNekHBGO9kxPVUp9XuY15yfTJ9jwvOwKI0I2MhUUfZq95NSp+LK1CLQg==} - - vscode-uri@3.2.0: - resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} - - xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - - yaml@2.9.1: - resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} - engines: {node: '>= 14.6'} - hasBin: true - -snapshots: - - '@cspell/cspell-bundled-dicts@10.4.1': - dependencies: - '@cspell/dict-ada': 4.1.1 - '@cspell/dict-al': 1.1.1 - '@cspell/dict-aws': 4.0.17 - '@cspell/dict-bash': 4.2.3 - '@cspell/dict-companies': 3.2.14 - '@cspell/dict-cpp': 7.2.0 - '@cspell/dict-cryptocurrencies': 5.0.5 - '@cspell/dict-csharp': 4.0.8 - '@cspell/dict-css': 4.1.2 - '@cspell/dict-dart': 2.3.2 - '@cspell/dict-data-science': 2.0.17 - '@cspell/dict-django': 4.1.7 - '@cspell/dict-docker': 1.1.17 - '@cspell/dict-dotnet': 5.0.15 - '@cspell/dict-elixir': 4.0.8 - '@cspell/dict-en-common-misspellings': 2.2.6 - '@cspell/dict-en-gb-mit': 3.1.32 - '@cspell/dict-en_us': 4.4.43 - '@cspell/dict-filetypes': 3.0.18 - '@cspell/dict-flutter': 1.1.1 - '@cspell/dict-fonts': 4.0.6 - '@cspell/dict-fsharp': 1.1.1 - '@cspell/dict-fullstack': 3.2.9 - '@cspell/dict-gaming-terms': 1.1.3 - '@cspell/dict-git': 3.1.1 - '@cspell/dict-golang': 6.0.29 - '@cspell/dict-google': 1.0.9 - '@cspell/dict-haskell': 4.0.6 - '@cspell/dict-html': 4.0.16 - '@cspell/dict-html-symbol-entities': 4.0.5 - '@cspell/dict-java': 5.0.12 - '@cspell/dict-julia': 1.1.1 - '@cspell/dict-k8s': 1.0.13 - '@cspell/dict-kotlin': 1.1.1 - '@cspell/dict-latex': 5.1.0 - '@cspell/dict-lorem-ipsum': 4.0.5 - '@cspell/dict-lua': 4.0.8 - '@cspell/dict-makefile': 1.0.5 - '@cspell/dict-markdown': 2.0.18(@cspell/dict-css@4.1.2)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.16)(@cspell/dict-typescript@3.2.3) - '@cspell/dict-monkeyc': 1.1.2 - '@cspell/dict-node': 5.0.9 - '@cspell/dict-npm': 5.2.56 - '@cspell/dict-php': 4.1.3 - '@cspell/dict-powershell': 5.0.17 - '@cspell/dict-public-licenses': 2.0.17 - '@cspell/dict-python': 4.5.3 - '@cspell/dict-r': 2.1.1 - '@cspell/dict-ruby': 5.1.4 - '@cspell/dict-rust': 4.1.2 - '@cspell/dict-scala': 5.0.11 - '@cspell/dict-shell': 1.2.0 - '@cspell/dict-software-terms': 5.4.9 - '@cspell/dict-sql': 2.2.1 - '@cspell/dict-svelte': 1.0.7 - '@cspell/dict-swift': 2.0.6 - '@cspell/dict-terraform': 1.1.4 - '@cspell/dict-typescript': 3.2.3 - '@cspell/dict-vue': 3.0.5 - '@cspell/dict-zig': 1.0.0 - - '@cspell/cspell-json-reporter@10.4.1': - dependencies: - '@cspell/cspell-types': 10.4.1 - - '@cspell/cspell-performance-monitor@10.4.1': {} - - '@cspell/cspell-pipe@10.4.1': {} - - '@cspell/cspell-resolver@10.4.1': - dependencies: - global-directory: 5.0.0 - - '@cspell/cspell-service-bus@10.4.1': {} - - '@cspell/cspell-types@10.4.1': {} - - '@cspell/cspell-worker@10.4.1': - dependencies: - cspell-lib: 10.4.1 - - '@cspell/dict-ada@4.1.1': {} - - '@cspell/dict-al@1.1.1': {} - - '@cspell/dict-aws@4.0.17': {} - - '@cspell/dict-bash@4.2.3': - dependencies: - '@cspell/dict-shell': 1.2.0 - - '@cspell/dict-companies@3.2.14': {} - - '@cspell/dict-cpp@7.2.0': {} - - '@cspell/dict-cryptocurrencies@5.0.5': {} - - '@cspell/dict-csharp@4.0.8': {} - - '@cspell/dict-css@4.1.2': {} - - '@cspell/dict-dart@2.3.2': {} - - '@cspell/dict-data-science@2.0.17': {} - - '@cspell/dict-django@4.1.7': {} - - '@cspell/dict-docker@1.1.17': {} - - '@cspell/dict-dotnet@5.0.15': {} - - '@cspell/dict-elixir@4.0.8': {} - - '@cspell/dict-en-common-misspellings@2.2.6': {} - - '@cspell/dict-en-gb-mit@3.1.32': {} - - '@cspell/dict-en_us@4.4.43': {} - - '@cspell/dict-filetypes@3.0.18': {} - - '@cspell/dict-flutter@1.1.1': {} - - '@cspell/dict-fonts@4.0.6': {} - - '@cspell/dict-fsharp@1.1.1': {} - - '@cspell/dict-fullstack@3.2.9': {} - - '@cspell/dict-gaming-terms@1.1.3': {} - - '@cspell/dict-git@3.1.1': {} - - '@cspell/dict-golang@6.0.29': {} - - '@cspell/dict-google@1.0.9': {} - - '@cspell/dict-haskell@4.0.6': {} - - '@cspell/dict-html-symbol-entities@4.0.5': {} - - '@cspell/dict-html@4.0.16': {} - - '@cspell/dict-java@5.0.12': {} - - '@cspell/dict-julia@1.1.1': {} - - '@cspell/dict-k8s@1.0.13': {} - - '@cspell/dict-kotlin@1.1.1': {} - - '@cspell/dict-latex@5.1.0': {} - - '@cspell/dict-lorem-ipsum@4.0.5': {} - - '@cspell/dict-lua@4.0.8': {} - - '@cspell/dict-makefile@1.0.5': {} - - '@cspell/dict-markdown@2.0.18(@cspell/dict-css@4.1.2)(@cspell/dict-html-symbol-entities@4.0.5)(@cspell/dict-html@4.0.16)(@cspell/dict-typescript@3.2.3)': - dependencies: - '@cspell/dict-css': 4.1.2 - '@cspell/dict-html': 4.0.16 - '@cspell/dict-html-symbol-entities': 4.0.5 - '@cspell/dict-typescript': 3.2.3 - - '@cspell/dict-monkeyc@1.1.2': {} - - '@cspell/dict-node@5.0.9': {} - - '@cspell/dict-npm@5.2.56': {} - - '@cspell/dict-php@4.1.3': {} - - '@cspell/dict-powershell@5.0.17': {} - - '@cspell/dict-public-licenses@2.0.17': {} - - '@cspell/dict-python@4.5.3': - dependencies: - '@cspell/dict-data-science': 2.0.17 - - '@cspell/dict-r@2.1.1': {} - - '@cspell/dict-ruby@5.1.4': {} - - '@cspell/dict-rust@4.1.2': {} - - '@cspell/dict-scala@5.0.11': {} - - '@cspell/dict-shell@1.2.0': {} - - '@cspell/dict-software-terms@5.4.9': {} - - '@cspell/dict-sql@2.2.1': {} - - '@cspell/dict-svelte@1.0.7': {} - - '@cspell/dict-swift@2.0.6': {} - - '@cspell/dict-terraform@1.1.4': {} - - '@cspell/dict-typescript@3.2.3': {} - - '@cspell/dict-vue@3.0.5': {} - - '@cspell/dict-zig@1.0.0': {} - - '@cspell/dynamic-import@10.4.1': - dependencies: - '@cspell/url': 10.4.1 - import-meta-resolve: 4.2.0 - - '@cspell/filetypes@10.4.1': {} - - '@cspell/rpc@10.4.1': {} - - '@cspell/strong-weak-map@10.4.1': {} - - '@cspell/url@10.4.1': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.3 - - '@sindresorhus/merge-streams@4.0.0': {} - - '@streetsidesoftware/unindent@1.0.1': {} - - '@types/debug@4.1.13': - dependencies: - '@types/ms': 2.1.0 - - '@types/katex@0.16.8': {} - - '@types/ms@2.1.0': {} - - '@types/unist@2.0.11': {} - - ansi-regex@6.5.0: {} - - argparse@2.0.1: {} - - argparse@3.0.4: {} - - array-timsort@1.0.3: {} - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - chalk-template@1.1.3: - dependencies: - chalk: 5.6.2 - - chalk@5.6.2: {} - - chalk@6.0.1: {} - - character-entities-legacy@3.0.0: {} - - character-entities@2.0.2: {} - - character-reference-invalid@2.0.1: {} - - commander@15.0.0: {} - - comment-json@5.0.0: - dependencies: - array-timsort: 1.0.3 - esprima: 4.0.1 - - cspell-config-lib@10.4.1: - dependencies: - '@cspell/cspell-types': 10.4.1 - comment-json: 5.0.0 - smol-toml: 1.9.1 - yaml: 2.9.1 - - cspell-dictionary@10.4.1: - dependencies: - '@cspell/cspell-performance-monitor': 10.4.1 - '@cspell/cspell-pipe': 10.4.1 - '@cspell/cspell-types': 10.4.1 - cspell-trie-lib: 10.4.1(@cspell/cspell-types@10.4.1) - fast-equals: 6.2.2 - - cspell-gitignore@10.4.1: - dependencies: - '@cspell/url': 10.4.1 - cspell-glob: 10.4.1 - cspell-io: 10.4.1 - - cspell-glob@10.4.1: - dependencies: - '@cspell/url': 10.4.1 - picomatch: 4.0.7 - - cspell-grammar@10.4.1: - dependencies: - '@cspell/cspell-pipe': 10.4.1 - '@cspell/cspell-types': 10.4.1 - - cspell-io@10.4.1: - dependencies: - '@cspell/cspell-service-bus': 10.4.1 - '@cspell/url': 10.4.1 - - cspell-lib@10.4.1: - dependencies: - '@cspell/cspell-bundled-dicts': 10.4.1 - '@cspell/cspell-performance-monitor': 10.4.1 - '@cspell/cspell-pipe': 10.4.1 - '@cspell/cspell-resolver': 10.4.1 - '@cspell/cspell-types': 10.4.1 - '@cspell/dynamic-import': 10.4.1 - '@cspell/filetypes': 10.4.1 - '@cspell/rpc': 10.4.1 - '@cspell/strong-weak-map': 10.4.1 - '@cspell/url': 10.4.1 - cspell-config-lib: 10.4.1 - cspell-dictionary: 10.4.1 - cspell-glob: 10.4.1 - cspell-grammar: 10.4.1 - cspell-io: 10.4.1 - cspell-trie-lib: 10.4.1(@cspell/cspell-types@10.4.1) - env-paths: 4.0.0 - gensequence: 8.0.8 - import-fresh: 4.0.1 - resolve-from: 5.0.0 - vscode-languageserver-textdocument: 1.0.16 - vscode-uri: 3.2.0 - xdg-basedir: 5.1.0 - - cspell-trie-lib@10.4.1(@cspell/cspell-types@10.4.1): - dependencies: - '@cspell/cspell-types': 10.4.1 - - cspell@10.4.1: - dependencies: - '@cspell/cspell-json-reporter': 10.4.1 - '@cspell/cspell-performance-monitor': 10.4.1 - '@cspell/cspell-pipe': 10.4.1 - '@cspell/cspell-types': 10.4.1 - '@cspell/cspell-worker': 10.4.1 - '@cspell/dynamic-import': 10.4.1 - '@cspell/url': 10.4.1 - '@streetsidesoftware/unindent': 1.0.1 - ansi-regex: 6.5.0 - chalk: 6.0.1 - chalk-template: 1.1.3 - commander: 15.0.0 - cspell-config-lib: 10.4.1 - cspell-dictionary: 10.4.1 - cspell-gitignore: 10.4.1 - cspell-glob: 10.4.1 - cspell-io: 10.4.1 - cspell-lib: 10.4.1 - flatted: 3.4.4 - semver: 7.8.6 - tinyglobby: 0.2.17 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decode-named-character-reference@1.3.0: - dependencies: - character-entities: 2.0.2 - - dequal@2.0.3: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - entities@8.1.0: {} - - env-paths@4.0.0: - dependencies: - is-safe-filename: 0.1.1 - - esprima@4.0.1: {} - - fast-equals@6.2.2: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fastq@1.20.3: - dependencies: - reusify: 1.1.0 - - fdir@6.5.0(picomatch@4.0.7): - optionalDependencies: - picomatch: 4.0.7 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - flatted@3.4.4: {} - - gensequence@8.0.8: {} - - get-east-asian-width@1.7.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - global-directory@5.0.0: - dependencies: - ini: 6.0.0 - - globby@16.2.4: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - fast-glob: 3.3.3 - ignore: 7.0.14 - is-path-inside: 4.0.0 - micromatch: 4.0.8 - slash: 5.1.0 - unicorn-magic: 0.4.1 - - ignore@7.0.14: {} - - import-fresh@4.0.1: {} - - import-meta-resolve@4.2.0: {} - - ini@6.0.0: {} - - is-alphabetical@2.0.1: {} - - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - - is-decimal@2.0.1: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hexadecimal@2.0.1: {} - - is-number@7.0.0: {} - - is-path-inside@4.0.0: {} - - is-safe-filename@0.1.1: {} - - js-yaml@5.4.3: - dependencies: - argparse: 2.0.1 - - jsonc-parser@3.3.1: {} - - jsonpointer@5.0.1: {} - - katex@0.19.1: - dependencies: - commander: 15.0.0 - - linkify-it@6.1.0: - dependencies: - uc.micro: 3.0.0 - - markdown-it@15.0.3: - dependencies: - argparse: 3.0.4 - entities: 8.1.0 - linkify-it: 6.1.0 - mdurl: 2.1.0 - punycode.js: 2.3.1 - uc.micro: 3.0.0 - - markdownlint-cli2-formatter-default@0.0.6(markdownlint-cli2@0.24.0): - dependencies: - markdownlint-cli2: 0.24.0 - - markdownlint-cli2@0.24.0: - dependencies: - globby: 16.2.4 - js-yaml: 5.4.3 - jsonc-parser: 3.3.1 - jsonpointer: 5.0.1 - markdown-it: 15.0.3 - markdownlint: 0.42.0 - markdownlint-cli2-formatter-default: 0.0.6(markdownlint-cli2@0.24.0) - micromatch: 4.0.8 - smol-toml: 1.9.1 - transitivePeerDependencies: - - supports-color - - markdownlint@0.42.0: - dependencies: - micromark: 4.0.3 - micromark-core-commonmark: 2.0.4 - micromark-extension-directive: 4.0.0 - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-table: 2.1.2 - micromark-extension-math: 3.1.0 - micromark-util-types: 2.0.3 - re2js: 2.9.1 - string-width: 8.3.0 - transitivePeerDependencies: - - supports-color - - mdurl@2.1.0: {} - - merge2@1.4.1: {} - - micromark-core-commonmark@2.0.4: - dependencies: - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.1.0 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-edit-map: 1.0.0 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-directive@4.0.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.1.0 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - parse-entities: 4.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.4 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-gfm-table@2.1.2: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-extension-math@3.1.0: - dependencies: - '@types/katex': 0.16.8 - devlop: 1.1.0 - katex: 0.19.1 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-factory-space@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.3 - - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-edit-map@1.0.0: - dependencies: - micromark-util-types: 2.0.3 - - micromark-util-encode@2.0.1: {} - - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.3 - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.3: {} - - micromark@4.0.3: - dependencies: - '@types/debug': 4.1.13 - debug: 4.4.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.4 - micromark-factory-space: 2.1.0 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-edit-map: 1.0.0 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.3 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - - ms@2.1.3: {} - - parse-entities@4.0.2: - dependencies: - '@types/unist': 2.0.11 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.3.0 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - - picomatch@2.3.2: {} - - picomatch@4.0.7: {} - - prettier@3.9.10: {} - - punycode.js@2.3.1: {} - - queue-microtask@1.2.3: {} - - re2js@2.9.1: {} - - resolve-from@5.0.0: {} - - reusify@1.1.0: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - semver@7.8.6: {} - - slash@5.1.0: {} - - smol-toml@1.9.1: {} - - string-width@8.3.0: - dependencies: - get-east-asian-width: 1.7.0 - strip-ansi: 7.2.0 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.5.0 - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.7) - picomatch: 4.0.7 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - uc.micro@3.0.0: {} - - unicorn-magic@0.4.1: {} - - vscode-languageserver-textdocument@1.0.16: {} - - vscode-uri@3.2.0: {} - - xdg-basedir@5.1.0: {} - - yaml@2.9.1: {} From ac707a92730502421bf520bb72b0d72c15e5abf4 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sat, 7 Nov 2026 21:28:42 +0800 Subject: [PATCH 02/14] refactor(ci): share release actions and result gates --- .cspell/words.txt | 1 + .github/renovate.json | 2 +- .github/workflows/ci.yml | 35 ++----------------- .github/workflows/formula.yml | 2 +- .github/workflows/nix-cache.yml | 2 +- .github/workflows/release.yml | 62 ++++++--------------------------- cspell.json | 2 +- docs/conventions/development.md | 2 +- flake.lock | 8 ++--- flake.nix | 12 ++----- 10 files changed, 25 insertions(+), 103 deletions(-) diff --git a/.cspell/words.txt b/.cspell/words.txt index 999aec1c2..79ad17adb 100644 --- a/.cspell/words.txt +++ b/.cspell/words.txt @@ -127,6 +127,7 @@ rustls serde serie sess +shfmt shopt SIGTTIN smol diff --git a/.github/renovate.json b/.github/renovate.json index 552febc2b..6433349c7 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/devkit#v1.0.0-rc.3"], + "extends": ["github>hakula139/devkit#88f619538cc3a79bf223e538504251264e02b4e9"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 412468603..34357a84c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 + uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -162,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 + uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -184,33 +184,4 @@ jobs: actions: read steps: - name: Check results - # Unlike the default shell, `bash` sets pipefail, so a failed API call fails the gate. - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GATE_ID: ${{ job.check_run_id }} - run: | - # `needs` misses a matrix leg cancelled before it starts, so read each job from the API. - failed=$( - gh api "repos/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID/jobs?filter=all&per_page=100" \ - --paginate \ - --slurp | - jq -r --argjson gate "$GATE_ID" ' - [.[].jobs[]] - | group_by(.name) - | map(max_by(.run_attempt)) as $jobs - | first($jobs[] | select(.id == $gate)) - // error("job \($gate) is missing from this workflow run") - # Jobs of a calling workflow share this run, so check only names with this prefix. - | (.name | sub("[^/]*$"; "")) as $prefix - | $jobs[] - | select(.id != $gate and (.name | startswith($prefix))) - | select(.conclusion != "success" and .conclusion != "skipped") - | "::error::\(.name): \(.conclusion // .status)" - ' - ) - - if [[ -n "$failed" ]]; then - echo "$failed" - exit 1 - fi + uses: hakula139/devkit/actions/ci-result@88f619538cc3a79bf223e538504251264e02b4e9 diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index f59cdd0e3..9b9f0e8af 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 + uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index 7c27369d0..d75248632 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@v1.0.0-rc.3 + uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 38277bb66..4cf7b50bf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,37 +53,7 @@ jobs: actions: read steps: - name: Wait for CI on the tagged commit - shell: bash - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Pull request runs test a merge commit, so only push and dispatched runs count. - while true; do - verdict=$( - gh api "repos/$GITHUB_REPOSITORY/actions/workflows/ci.yml/runs?head_sha=$GITHUB_SHA&per_page=100" \ - --paginate \ - --slurp | - jq -r '[.[].workflow_runs[] | select(.event == "push" or .event == "workflow_dispatch")] - | if any(.[]; .conclusion == "success") then - "passed \(map(select(.conclusion == "success"))[0].html_url)" - elif any(.[]; .status != "completed") then "running" - else "failed" end' - ) - case "$verdict" in - passed*) - echo "CI passed on $GITHUB_SHA: ${verdict#passed }" - exit 0 - ;; - running) - sleep 30 - ;; - *) - echo "::error::No push or dispatched CI run passed on $GITHUB_SHA." \ - "Rerun its failed jobs, or run ci.yml on $GITHUB_REF_NAME, then rerun this job." - exit 1 - ;; - esac - done + uses: hakula139/devkit/actions/tagged-ci@88f619538cc3a79bf223e538504251264e02b4e9 build: name: Build (${{ matrix.target }}) @@ -244,28 +214,16 @@ jobs: release-assets/*.tar.gz release-assets/*.zip - - name: Install changelog parser - uses: taiki-e/install-action@parse-changelog - - name: Publish release - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - parse-changelog CHANGELOG.md "${GITHUB_REF_NAME#v}" > release-notes.md - - options=(--verify-tag --title "$GITHUB_REF_NAME" --notes-file release-notes.md) - if [[ "$GITHUB_REF_NAME" == *-* ]]; then - options+=(--prerelease) - fi - - gh release create "$GITHUB_REF_NAME" \ - release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz \ - release-assets/oxide-code-x86_64-unknown-linux-gnu.sha256 \ - release-assets/oxide-code-aarch64-apple-darwin.tar.gz \ - release-assets/oxide-code-aarch64-apple-darwin.sha256 \ - release-assets/oxide-code-x86_64-pc-windows-msvc.zip \ - release-assets/oxide-code-x86_64-pc-windows-msvc.sha256 \ - "${options[@]}" + uses: hakula139/devkit/actions/publish-release@88f619538cc3a79bf223e538504251264e02b4e9 + with: + assets: | + release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz + release-assets/oxide-code-x86_64-unknown-linux-gnu.sha256 + release-assets/oxide-code-aarch64-apple-darwin.tar.gz + release-assets/oxide-code-aarch64-apple-darwin.sha256 + release-assets/oxide-code-x86_64-pc-windows-msvc.zip + release-assets/oxide-code-x86_64-pc-windows-msvc.sha256 formula: name: Check Homebrew Formula diff --git a/cspell.json b/cspell.json index 8a8c19bfa..a380bfbff 100644 --- a/cspell.json +++ b/cspell.json @@ -12,5 +12,5 @@ } ], "dictionaries": ["project-words"], - "ignorePaths": ["Cargo.lock", "pnpm-lock.yaml", "**/snapshots/*.snap", "licenses/**"] + "ignorePaths": ["Cargo.lock", "**/snapshots/*.snap", "licenses/**"] } diff --git a/docs/conventions/development.md b/docs/conventions/development.md index cbb910422..c0b29460d 100644 --- a/docs/conventions/development.md +++ b/docs/conventions/development.md @@ -61,7 +61,7 @@ The shared devkit hook baseline provides formatting and lint tools directly from ## Config Style -Prettier and Taplo leave long strings alone, and no formatter covers shell code, so wrap YAML, TOML, and shell files by hand: +Prettier, Taplo, and shfmt format YAML, TOML, and shell files. Wrap comments and long strings by hand: - Wrap comments as [Writing](writing.md#comments) describes, and keep other lines within about 100 columns, counting the indent. Leave a line long when it holds an unbreakable token, such as a URL or path, or sits in a heredoc body or literal block whose line breaks are content. - Wrap a long string only where its value stays the same, and break it where [Rust](rust.md#strings) breaks a continued literal. diff --git a/flake.lock b/flake.lock index 926c35465..0004523de 100644 --- a/flake.lock +++ b/flake.lock @@ -9,17 +9,17 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1793969014, - "narHash": "sha256-zv3AmKieMhtUt/H3dh44x6mX4moUwsXHE7gKSEtYGs8=", + "lastModified": 1794057919, + "narHash": "sha256-Ce4vVA4hckhNnCjnS/OfmKPMGAcdG/sz8Jwfmom3vCQ=", "owner": "hakula139", "repo": "devkit", - "rev": "9666b7261a94b5d7ed9a13a839dfc5360d96dd4d", + "rev": "88f619538cc3a79bf223e538504251264e02b4e9", "type": "github" }, "original": { "owner": "hakula139", - "ref": "v1.0.0-rc.3", "repo": "devkit", + "rev": "88f619538cc3a79bf223e538504251264e02b4e9", "type": "github" } }, diff --git a/flake.nix b/flake.nix index 7621466c6..a7d5a7e78 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ }; devkit = { - url = "github:hakula139/devkit/v1.0.0-rc.3"; + url = "github:hakula139/devkit/88f619538cc3a79bf223e538504251264e02b4e9"; inputs.nixpkgs.follows = "nixpkgs"; }; @@ -47,8 +47,6 @@ ... }: let - inherit (nixpkgs) lib; - # git-hooks.nix has dropped x86_64-darwin, which Nixpkgs supports only through 26.05. systems = [ "aarch64-darwin" @@ -56,13 +54,7 @@ "x86_64-linux" ]; - eachSystem = - f: - let - bySystem = lib.genAttrs systems f; - outputs = builtins.attrNames bySystem.${builtins.head systems}; - in - lib.genAttrs outputs (output: builtins.mapAttrs (_: attrs: attrs.${output}) bySystem); + eachSystem = devkit.lib.eachSystem systems; packageFor = pkgs: From 422e1478aa427017d05a204e7f5e68f43bfefcd4 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sat, 7 Nov 2026 21:56:55 +0800 Subject: [PATCH 03/14] chore(devkit): pin coherent shared tooling fixes --- .github/renovate.json | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/formula.yml | 2 +- .github/workflows/nix-cache.yml | 2 +- .github/workflows/release.yml | 4 ++-- flake.lock | 8 ++++---- flake.nix | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 6433349c7..178b56c44 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/devkit#88f619538cc3a79bf223e538504251264e02b4e9"], + "extends": ["github>hakula139/devkit#b3c36cb40179dcc4c226b0fee6e474577accecfb"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34357a84c..4c27adee0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 + uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -162,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 + uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -184,4 +184,4 @@ jobs: actions: read steps: - name: Check results - uses: hakula139/devkit/actions/ci-result@88f619538cc3a79bf223e538504251264e02b4e9 + uses: hakula139/devkit/actions/ci-result@b3c36cb40179dcc4c226b0fee6e474577accecfb diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index 9b9f0e8af..981011874 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 + uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index d75248632..7d806729d 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@88f619538cc3a79bf223e538504251264e02b4e9 + uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4cf7b50bf..41b7f2de3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: actions: read steps: - name: Wait for CI on the tagged commit - uses: hakula139/devkit/actions/tagged-ci@88f619538cc3a79bf223e538504251264e02b4e9 + uses: hakula139/devkit/actions/tagged-ci@b3c36cb40179dcc4c226b0fee6e474577accecfb build: name: Build (${{ matrix.target }}) @@ -215,7 +215,7 @@ jobs: release-assets/*.zip - name: Publish release - uses: hakula139/devkit/actions/publish-release@88f619538cc3a79bf223e538504251264e02b4e9 + uses: hakula139/devkit/actions/publish-release@b3c36cb40179dcc4c226b0fee6e474577accecfb with: assets: | release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz diff --git a/flake.lock b/flake.lock index 0004523de..fe9d62788 100644 --- a/flake.lock +++ b/flake.lock @@ -9,17 +9,17 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1794057919, - "narHash": "sha256-Ce4vVA4hckhNnCjnS/OfmKPMGAcdG/sz8Jwfmom3vCQ=", + "lastModified": 1794059538, + "narHash": "sha256-o7dk7PS9O8FqxOYKuF823dfBz7vmokePz2s8e/aJqOM=", "owner": "hakula139", "repo": "devkit", - "rev": "88f619538cc3a79bf223e538504251264e02b4e9", + "rev": "b3c36cb40179dcc4c226b0fee6e474577accecfb", "type": "github" }, "original": { "owner": "hakula139", "repo": "devkit", - "rev": "88f619538cc3a79bf223e538504251264e02b4e9", + "rev": "b3c36cb40179dcc4c226b0fee6e474577accecfb", "type": "github" } }, diff --git a/flake.nix b/flake.nix index a7d5a7e78..aa5b97441 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ }; devkit = { - url = "github:hakula139/devkit/88f619538cc3a79bf223e538504251264e02b4e9"; + url = "github:hakula139/devkit/b3c36cb40179dcc4c226b0fee6e474577accecfb"; inputs.nixpkgs.follows = "nixpkgs"; }; From 7c37aa2f2658d8f494a39887e5e1c23fab38f5c1 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sat, 7 Nov 2026 22:30:30 +0800 Subject: [PATCH 04/14] chore(devkit): pin canonical shared tooling source --- .github/renovate.json | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/formula.yml | 2 +- .github/workflows/nix-cache.yml | 2 +- .github/workflows/release.yml | 4 ++-- flake.lock | 8 ++++---- flake.nix | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 178b56c44..4a7b4d04e 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/devkit#b3c36cb40179dcc4c226b0fee6e474577accecfb"], + "extends": ["github>hakula139/devkit#44782b619d0c4cd9562c5000f6230aa9582e67ac"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c27adee0..dc06b46dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb + uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -162,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb + uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -184,4 +184,4 @@ jobs: actions: read steps: - name: Check results - uses: hakula139/devkit/actions/ci-result@b3c36cb40179dcc4c226b0fee6e474577accecfb + uses: hakula139/devkit/actions/ci-result@44782b619d0c4cd9562c5000f6230aa9582e67ac diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index 981011874..34de0f248 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb + uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index 7d806729d..2528f08a9 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@b3c36cb40179dcc4c226b0fee6e474577accecfb + uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41b7f2de3..2f741e81f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: actions: read steps: - name: Wait for CI on the tagged commit - uses: hakula139/devkit/actions/tagged-ci@b3c36cb40179dcc4c226b0fee6e474577accecfb + uses: hakula139/devkit/actions/tagged-ci@44782b619d0c4cd9562c5000f6230aa9582e67ac build: name: Build (${{ matrix.target }}) @@ -215,7 +215,7 @@ jobs: release-assets/*.zip - name: Publish release - uses: hakula139/devkit/actions/publish-release@b3c36cb40179dcc4c226b0fee6e474577accecfb + uses: hakula139/devkit/actions/publish-release@44782b619d0c4cd9562c5000f6230aa9582e67ac with: assets: | release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz diff --git a/flake.lock b/flake.lock index fe9d62788..86fd76d0f 100644 --- a/flake.lock +++ b/flake.lock @@ -9,17 +9,17 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1794059538, - "narHash": "sha256-o7dk7PS9O8FqxOYKuF823dfBz7vmokePz2s8e/aJqOM=", + "lastModified": 1794061602, + "narHash": "sha256-OFGwcF6EbJO1vNPurOvpftfR9FTFm+byPsa2EqMNDEE=", "owner": "hakula139", "repo": "devkit", - "rev": "b3c36cb40179dcc4c226b0fee6e474577accecfb", + "rev": "44782b619d0c4cd9562c5000f6230aa9582e67ac", "type": "github" }, "original": { "owner": "hakula139", "repo": "devkit", - "rev": "b3c36cb40179dcc4c226b0fee6e474577accecfb", + "rev": "44782b619d0c4cd9562c5000f6230aa9582e67ac", "type": "github" } }, diff --git a/flake.nix b/flake.nix index aa5b97441..802fc07bd 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ }; devkit = { - url = "github:hakula139/devkit/b3c36cb40179dcc4c226b0fee6e474577accecfb"; + url = "github:hakula139/devkit/44782b619d0c4cd9562c5000f6230aa9582e67ac"; inputs.nixpkgs.follows = "nixpkgs"; }; From 063df88c5d67d8e741ce15437240564bd5c01c19 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sat, 7 Nov 2026 23:06:47 +0800 Subject: [PATCH 05/14] chore(devkit): pin final shared tooling source --- .github/renovate.json | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/formula.yml | 2 +- .github/workflows/nix-cache.yml | 2 +- .github/workflows/release.yml | 4 ++-- flake.lock | 8 ++++---- flake.nix | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 4a7b4d04e..ffeafd455 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/devkit#44782b619d0c4cd9562c5000f6230aa9582e67ac"], + "extends": ["github>hakula139/devkit#61682dd34d15732234bac835f3603de8de5b86f1"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc06b46dc..f4bdbb753 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac + uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -162,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac + uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -184,4 +184,4 @@ jobs: actions: read steps: - name: Check results - uses: hakula139/devkit/actions/ci-result@44782b619d0c4cd9562c5000f6230aa9582e67ac + uses: hakula139/devkit/actions/ci-result@61682dd34d15732234bac835f3603de8de5b86f1 diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index 34de0f248..14ec30ca0 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac + uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index 2528f08a9..9e3fe7482 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@44782b619d0c4cd9562c5000f6230aa9582e67ac + uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2f741e81f..980b70cc4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: actions: read steps: - name: Wait for CI on the tagged commit - uses: hakula139/devkit/actions/tagged-ci@44782b619d0c4cd9562c5000f6230aa9582e67ac + uses: hakula139/devkit/actions/tagged-ci@61682dd34d15732234bac835f3603de8de5b86f1 build: name: Build (${{ matrix.target }}) @@ -215,7 +215,7 @@ jobs: release-assets/*.zip - name: Publish release - uses: hakula139/devkit/actions/publish-release@44782b619d0c4cd9562c5000f6230aa9582e67ac + uses: hakula139/devkit/actions/publish-release@61682dd34d15732234bac835f3603de8de5b86f1 with: assets: | release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz diff --git a/flake.lock b/flake.lock index 86fd76d0f..c467a4ece 100644 --- a/flake.lock +++ b/flake.lock @@ -9,17 +9,17 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1794061602, - "narHash": "sha256-OFGwcF6EbJO1vNPurOvpftfR9FTFm+byPsa2EqMNDEE=", + "lastModified": 1794063903, + "narHash": "sha256-CoNqfd2XpZvWwTavQGioU1rvNOE1pSKUJ7IqzcAOwq4=", "owner": "hakula139", "repo": "devkit", - "rev": "44782b619d0c4cd9562c5000f6230aa9582e67ac", + "rev": "61682dd34d15732234bac835f3603de8de5b86f1", "type": "github" }, "original": { "owner": "hakula139", "repo": "devkit", - "rev": "44782b619d0c4cd9562c5000f6230aa9582e67ac", + "rev": "61682dd34d15732234bac835f3603de8de5b86f1", "type": "github" } }, diff --git a/flake.nix b/flake.nix index 802fc07bd..fd4e15335 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ }; devkit = { - url = "github:hakula139/devkit/44782b619d0c4cd9562c5000f6230aa9582e67ac"; + url = "github:hakula139/devkit/61682dd34d15732234bac835f3603de8de5b86f1"; inputs.nixpkgs.follows = "nixpkgs"; }; From efa514652d660640b6a707be3e4e379f736fe59a Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 00:00:13 +0800 Subject: [PATCH 06/14] chore(devkit): pin isolated formatter configuration --- .github/renovate.json | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/formula.yml | 2 +- .github/workflows/nix-cache.yml | 2 +- .github/workflows/release.yml | 4 ++-- flake.lock | 8 ++++---- flake.nix | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index ffeafd455..4db793c88 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/devkit#61682dd34d15732234bac835f3603de8de5b86f1"], + "extends": ["github>hakula139/devkit#e0d835ba91cf38c7f6d950c8a56c0d68e74366bd"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4bdbb753..bd7e1a9a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 + uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -162,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 + uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -184,4 +184,4 @@ jobs: actions: read steps: - name: Check results - uses: hakula139/devkit/actions/ci-result@61682dd34d15732234bac835f3603de8de5b86f1 + uses: hakula139/devkit/actions/ci-result@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index 14ec30ca0..c6ea492a2 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 + uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index 9e3fe7482..3a4e74c4f 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@61682dd34d15732234bac835f3603de8de5b86f1 + uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 980b70cc4..9ab0a6346 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: actions: read steps: - name: Wait for CI on the tagged commit - uses: hakula139/devkit/actions/tagged-ci@61682dd34d15732234bac835f3603de8de5b86f1 + uses: hakula139/devkit/actions/tagged-ci@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd build: name: Build (${{ matrix.target }}) @@ -215,7 +215,7 @@ jobs: release-assets/*.zip - name: Publish release - uses: hakula139/devkit/actions/publish-release@61682dd34d15732234bac835f3603de8de5b86f1 + uses: hakula139/devkit/actions/publish-release@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd with: assets: | release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz diff --git a/flake.lock b/flake.lock index c467a4ece..4739df33d 100644 --- a/flake.lock +++ b/flake.lock @@ -9,17 +9,17 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1794063903, - "narHash": "sha256-CoNqfd2XpZvWwTavQGioU1rvNOE1pSKUJ7IqzcAOwq4=", + "lastModified": 1794066062, + "narHash": "sha256-pSdWDL9z4NIRbERvN2R7x8/h5ucaWoAaUSV61E3Soho=", "owner": "hakula139", "repo": "devkit", - "rev": "61682dd34d15732234bac835f3603de8de5b86f1", + "rev": "e0d835ba91cf38c7f6d950c8a56c0d68e74366bd", "type": "github" }, "original": { "owner": "hakula139", "repo": "devkit", - "rev": "61682dd34d15732234bac835f3603de8de5b86f1", + "rev": "e0d835ba91cf38c7f6d950c8a56c0d68e74366bd", "type": "github" } }, diff --git a/flake.nix b/flake.nix index fd4e15335..f039db40c 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ }; devkit = { - url = "github:hakula139/devkit/61682dd34d15732234bac835f3603de8de5b86f1"; + url = "github:hakula139/devkit/e0d835ba91cf38c7f6d950c8a56c0d68e74366bd"; inputs.nixpkgs.follows = "nixpkgs"; }; From b6f79a86ce1d8ed584ac1972a1d1c9a3d4b41829 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 02:11:37 +0800 Subject: [PATCH 07/14] refactor(dev): select shared hooks explicitly --- flake.nix | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index f039db40c..0a90c3085 100644 --- a/flake.nix +++ b/flake.nix @@ -99,7 +99,20 @@ # ------------------------------------------------------------------------------------------ preCommit = dk.preCommit { src = ./.; - hooks.check-shebang-scripts-are-executable.enable = true; + hooks = { + actionlint.enable = true; + check-shebang-scripts-are-executable.enable = true; + check-yaml.enable = true; + cspell.enable = true; + deadnix.enable = true; + dprint.enable = true; + markdownlint-cli2.enable = true; + nixfmt.enable = true; + prettier.enable = true; + sort-file-contents.enable = true; + statix.enable = true; + taplo.enable = true; + }; # CI checks formatting without fetching the pinned toolchain in the Nix sandbox. devHooks.rustfmt = { From 70b9bc119ca2ca358cf20f8ce11e5786f744a743 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 02:13:57 +0800 Subject: [PATCH 08/14] refactor(dev): check the tracked direnv shell script --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index 0a90c3085..b32be1e4b 100644 --- a/flake.nix +++ b/flake.nix @@ -109,6 +109,8 @@ markdownlint-cli2.enable = true; nixfmt.enable = true; prettier.enable = true; + shellcheck.enable = true; + shfmt.enable = true; sort-file-contents.enable = true; statix.enable = true; taplo.enable = true; From ad6ef74083ca32a3ea5bcc33980a6458dcc8d3da Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 19:12:41 +0800 Subject: [PATCH 09/14] chore(devkit): adopt the released v1 interface --- .github/renovate.json | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/formula.yml | 2 +- .github/workflows/nix-cache.yml | 2 +- .github/workflows/release.yml | 4 ++-- RELEASING.md | 2 +- flake.lock | 8 ++++---- flake.nix | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 4db793c88..bc1a890c8 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/devkit#e0d835ba91cf38c7f6d950c8a56c0d68e74366bd"], + "extends": ["github>hakula139/devkit#v1"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd7e1a9a5..54901a8e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd + uses: hakula139/devkit/.github/actions/setup-nix@v1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -162,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd + uses: hakula139/devkit/.github/actions/setup-nix@v1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -184,4 +184,4 @@ jobs: actions: read steps: - name: Check results - uses: hakula139/devkit/actions/ci-result@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd + uses: hakula139/devkit/.github/actions/ci-result@v1 diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index c6ea492a2..61d6285ba 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd + uses: hakula139/devkit/.github/actions/setup-nix@v1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index 3a4e74c4f..d562f21e2 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: hakula139/devkit/actions/setup-nix@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd + uses: hakula139/devkit/.github/actions/setup-nix@v1 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ab0a6346..dfc281992 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: actions: read steps: - name: Wait for CI on the tagged commit - uses: hakula139/devkit/actions/tagged-ci@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd + uses: hakula139/devkit/.github/actions/tagged-ci@v1 build: name: Build (${{ matrix.target }}) @@ -215,7 +215,7 @@ jobs: release-assets/*.zip - name: Publish release - uses: hakula139/devkit/actions/publish-release@e0d835ba91cf38c7f6d950c8a56c0d68e74366bd + uses: hakula139/devkit/.github/actions/publish-release@v1 with: assets: | release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz diff --git a/RELEASING.md b/RELEASING.md index bf6d7de51..99adf2a18 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -33,7 +33,7 @@ Before 0.1.0, config, environment variable, and session format changes may freel ## Release Preparation -Follow the [shared release procedure](https://github.com/hakula139/devkit/blob/main/docs/releasing.md) for changelog curation, the release PR, tagging its exact merged commit after separate approval, and CI recovery. Use this repository's `cliff.toml` and `CHANGELOG.md`. Stable sections roll up changes since the previous stable tag, and prereleases compare against the previous tag. Keep compare-link references at the end of the changelog. +Follow the [shared release procedure](https://github.com/hakula139/devkit/blob/v1/docs/releasing.md) for changelog curation, the release PR, tagging its exact merged commit after separate approval, and CI recovery. Use this repository's `cliff.toml` and `CHANGELOG.md`. Stable sections roll up changes since the previous stable tag, and prereleases compare against the previous tag. Keep compare-link references at the end of the changelog. Security fixes describe the gap, affected releases, and published advisory as [SECURITY.md](SECURITY.md) promises. Add an advisory published later to every affected changelog section through a correction PR. diff --git a/flake.lock b/flake.lock index 4739df33d..eccf9816d 100644 --- a/flake.lock +++ b/flake.lock @@ -9,17 +9,17 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1794066062, - "narHash": "sha256-pSdWDL9z4NIRbERvN2R7x8/h5ucaWoAaUSV61E3Soho=", + "lastModified": 1794135239, + "narHash": "sha256-sB3L22DBlqdr59I1vyFur73TunnLQpQwkld2W9fsUQY=", "owner": "hakula139", "repo": "devkit", - "rev": "e0d835ba91cf38c7f6d950c8a56c0d68e74366bd", + "rev": "ab441d00685573d83046f0eb2d6400e4e273771a", "type": "github" }, "original": { "owner": "hakula139", + "ref": "v1", "repo": "devkit", - "rev": "e0d835ba91cf38c7f6d950c8a56c0d68e74366bd", "type": "github" } }, diff --git a/flake.nix b/flake.nix index b32be1e4b..7ec94980b 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ }; devkit = { - url = "github:hakula139/devkit/e0d835ba91cf38c7f6d950c8a56c0d68e74366bd"; + url = "github:hakula139/devkit/v1"; inputs.nixpkgs.follows = "nixpkgs"; }; From 2f228ed519957694f7cbb15daaa9c4333e1023c6 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 21:31:21 +0800 Subject: [PATCH 10/14] refactor(devkit): use shared systems and formatter defaults --- .github/dependabot.yml | 10 ------ .gitignore | 2 -- .markdownlint-cli2.jsonc | 1 - .prettierrc.json | 4 +-- .taplo.toml | 2 -- RELEASING.md | 2 +- cliff.toml | 67 ---------------------------------------- flake.lock | 6 ++-- flake.nix | 11 +------ pnpm-workspace.yaml | 5 --- 10 files changed, 6 insertions(+), 104 deletions(-) delete mode 100644 .taplo.toml delete mode 100644 cliff.toml delete mode 100644 pnpm-workspace.yaml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1d68833cd..4a407853d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,16 +14,6 @@ updates: include: scope labels: - dependencies - - package-ecosystem: npm - directory: / - schedule: - interval: weekly - open-pull-requests-limit: 0 - commit-message: - prefix: chore - include: scope - labels: - - dependencies - package-ecosystem: github-actions # `/` covers the workflows, and the glob adds the composite actions they share. directories: diff --git a/.gitignore b/.gitignore index 3ec7b4297..4f53d498e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,6 @@ /mutants.out*/ /target/ -# Dependencies - # Local environment .env.local .envrc.local diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index b71d2ca2a..afadb871d 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -1,6 +1,5 @@ { "config": { - "default": true, "code-block-style": { "style": "fenced" }, "code-fence-style": { "style": "backtick" }, "emphasis-style": { "style": "underscore" }, diff --git a/.prettierrc.json b/.prettierrc.json index cdc406f8f..1f5ea7e9d 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,7 +1,5 @@ { - "embeddedLanguageFormatting": "off", "printWidth": 100, "quoteProps": "consistent", - "singleQuote": true, - "trailingComma": "all" + "singleQuote": true } diff --git a/.taplo.toml b/.taplo.toml deleted file mode 100644 index ccfe63c0a..000000000 --- a/.taplo.toml +++ /dev/null @@ -1,2 +0,0 @@ -[formatting] -column_width = 100 diff --git a/RELEASING.md b/RELEASING.md index 99adf2a18..84d82abca 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -33,7 +33,7 @@ Before 0.1.0, config, environment variable, and session format changes may freel ## Release Preparation -Follow the [shared release procedure](https://github.com/hakula139/devkit/blob/v1/docs/releasing.md) for changelog curation, the release PR, tagging its exact merged commit after separate approval, and CI recovery. Use this repository's `cliff.toml` and `CHANGELOG.md`. Stable sections roll up changes since the previous stable tag, and prereleases compare against the previous tag. Keep compare-link references at the end of the changelog. +Follow the [shared release procedure](https://github.com/hakula139/devkit/blob/v1/docs/releasing.md) for changelog curation, the release PR, tagging its exact merged commit after separate approval, and CI recovery. Draft `CHANGELOG.md` with the shared configuration. Security fixes describe the gap, affected releases, and published advisory as [SECURITY.md](SECURITY.md) promises. Add an advisory published later to every affected changelog section through a correction PR. diff --git a/cliff.toml b/cliff.toml deleted file mode 100644 index a07f442ce..000000000 --- a/cliff.toml +++ /dev/null @@ -1,67 +0,0 @@ -[changelog] -header = """ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), \ -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -""" - -# Tera's `sort` rejects a null key, so unscoped entries render first in their own loop. -body = """ - -{% if version -%} - ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} -{% else -%} - ## [Unreleased] -{% endif %} -{% if message %} - ### Highlights - - {{ message | trim }} -{% endif %} -{% for group, commits in commits | group_by(attribute="group") %} - ### {{ group | split(pat="-->") | last | trim | upper_first }} - - {% for commit in commits -%} - {% if not commit.scope -%} - - {{ commit.message | upper_first | trim }} - {% endif -%} - {% endfor -%} - {% for commit in commits | filter(attribute="scope") | sort(attribute="scope") -%} - - _({{ commit.scope }})_ {{ commit.message | upper_first | trim }} - {% endfor %} -{%- endfor -%} -""" - -trim = true -postprocessors = [{ pattern = '\n{3,}', replace = "\n\n" }] - -[git] -conventional_commits = true -filter_unconventional = true -filter_commits = true -# Stable release boundaries include all changes from their prereleases. -tag_pattern = '^v[0-9]+\.[0-9]+\.[0-9]+$' -use_branch_tags = true -sort_commits = "oldest" - -commit_preprocessors = [ - # Backtick inline HTML so Markdown renders it as code. `(^|[^`])` stands in for the lookbehind - # that Rust regex lacks, so already-fenced spans stay as they are. - { pattern = '(^|[^`])(<\/?[a-zA-Z][^>]*>)', replace = '$1`$2`' }, - # GitHub autolinks `#N` in release notes but not in rendered files. - { pattern = '\(#([0-9]+)\)', replace = '([#$1](https://github.com/hakula139/oxide-code/pull/$1))' }, -] - -# `` prefixes, which the body template strips, order the sections. The first match wins, -# so the catch-all `!:` parser precedes the type prefixes. `filter_commits` drops the other types. -commit_parsers = [ - { message = '^[a-z]+(\([^)]+\))?!:', group = "Breaking changes" }, - - { message = "^feat", group = "Added" }, - { message = "^fix", group = "Fixed" }, - { message = "^perf", group = "Changed" }, - { message = "^revert", group = "Removed" }, -] diff --git a/flake.lock b/flake.lock index eccf9816d..8bb1054a4 100644 --- a/flake.lock +++ b/flake.lock @@ -9,11 +9,11 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1794135239, - "narHash": "sha256-sB3L22DBlqdr59I1vyFur73TunnLQpQwkld2W9fsUQY=", + "lastModified": 1794142809, + "narHash": "sha256-ZtQhNN+JJwsVeitesXzeBqcBAdjCgwSRHQfq3qxfDG4=", "owner": "hakula139", "repo": "devkit", - "rev": "ab441d00685573d83046f0eb2d6400e4e273771a", + "rev": "d714f2f48b26cbf80d9db01b6a4e353abbbe3ad7", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 7ec94980b..50d538785 100644 --- a/flake.nix +++ b/flake.nix @@ -47,15 +47,6 @@ ... }: let - # git-hooks.nix has dropped x86_64-darwin, which Nixpkgs supports only through 26.05. - systems = [ - "aarch64-darwin" - "aarch64-linux" - "x86_64-linux" - ]; - - eachSystem = devkit.lib.eachSystem systems; - packageFor = pkgs: self.packages.${pkgs.stdenv.hostPlatform.system}.oxide-code @@ -77,7 +68,7 @@ imports = [ (import ./nix/home-manager.nix { inherit packageFor; }) ]; }; } - // eachSystem ( + // devkit.lib.eachSystem devkit.lib.systems ( system: let pkgs = nixpkgs.legacyPackages.${system}; diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 4913fa6f2..000000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,5 +0,0 @@ -verifyDepsBeforeRun: install - -overrides: - markdownlint>re2js: ~2.9.0 - micromark-extension-math>katex: ^0.19.0 From 7ca55d7e73c0298e177c351d6f9d8bf48736aa11 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 21:35:26 +0800 Subject: [PATCH 11/14] style(toml): apply shared Taplo defaults --- Cargo.toml | 24 +++++++++++++++++++----- about.toml | 10 +++++++++- deny.toml | 10 +++++++++- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3288f9b1f..7ca91771b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,9 @@ private_intra_doc_links = "allow" [workspace.dependencies] anyhow = "1" -arboard = { version = "3.7", default-features = false, features = ["wayland-data-control"] } +arboard = { version = "3.7", default-features = false, features = [ + "wayland-data-control", +] } base64 = "0.23" bytes = "1" caseless = "0.2" @@ -69,11 +71,23 @@ ratatui = "0.30" ratatui-textarea = "0.9.3" regex = "1" regex-syntax = "0.8" -reqwest = { version = "0.13", default-features = false, features = ["json", "rustls", "stream"] } -rusqlite = { version = "0.41", default-features = false, features = ["bundled"] } -rustls = { version = "0.23", default-features = false, features = ["aws-lc-rs", "std", "tls12"] } +reqwest = { version = "0.13", default-features = false, features = [ + "json", + "rustls", + "stream", +] } +rusqlite = { version = "0.41", default-features = false, features = [ + "bundled", +] } +rustls = { version = "0.23", default-features = false, features = [ + "aws-lc-rs", + "std", + "tls12", +] } rustls-platform-verifier = "0.7" -rustls-webpki = { version = "0.103", default-features = false, features = ["std"] } +rustls-webpki = { version = "0.103", default-features = false, features = [ + "std", +] } same-file = "1" security-framework = "3" serde = { version = "1", features = ["derive"] } diff --git a/about.toml b/about.toml index 04888b347..e919f3e89 100644 --- a/about.toml +++ b/about.toml @@ -1,4 +1,12 @@ -accepted = ["Apache-2.0", "BSD-3-Clause", "BSL-1.0", "ISC", "MIT", "Unicode-3.0", "Zlib"] +accepted = [ + "Apache-2.0", + "BSD-3-Clause", + "BSL-1.0", + "ISC", + "MIT", + "Unicode-3.0", + "Zlib", +] ignore-dev-dependencies = true ignore-build-dependencies = true private = { ignore = true } diff --git a/deny.toml b/deny.toml index e0da54e38..6c0ee01f3 100644 --- a/deny.toml +++ b/deny.toml @@ -15,7 +15,15 @@ id = "RUSTSEC-2025-0141" reason = "bincode 1.3.3 is unmaintained and unpatched, and the latest syntect, 5.3.0, requires it" [licenses] -allow = ["Apache-2.0", "BSD-3-Clause", "BSL-1.0", "ISC", "MIT", "Unicode-3.0", "Zlib"] +allow = [ + "Apache-2.0", + "BSD-3-Clause", + "BSL-1.0", + "ISC", + "MIT", + "Unicode-3.0", + "Zlib", +] [bans] multiple-versions = "warn" From 0d7864530fa74707d7a20c079fa0680c5c15c9a1 Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 21:37:40 +0800 Subject: [PATCH 12/14] docs(development): align cache uploads with shared policy --- docs/conventions/development.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conventions/development.md b/docs/conventions/development.md index c0b29460d..090e25ea8 100644 --- a/docs/conventions/development.md +++ b/docs/conventions/development.md @@ -85,7 +85,7 @@ CI runs on pushes to `main`, pull requests, and manual dispatch. The release wor Branch protection requires only the CI Result job and Codecov's `codecov/patch` status. CI Result reads every attempt's jobs from the Actions API, keeps the latest attempt for each job name, and fails when any job of the CI workflow, including each matrix leg, concludes anything other than success or skipped. That catches a leg cancelled before a runner picks it up, which the `needs` results of a matrix job omit, and retains earlier failures when only the gate reruns. CI Result runs once the jobs in its `needs` finish and counts any unfinished job as a failure, so list each new job there. -The Lint and Nix jobs pull from the `hakula` Cachix cache, and runs on `main` or by the maintainer push their builds to it. The cache only saves build time, so a failed Cachix setup, download, or push does not fail a job: a failed setup logs a warning and the job builds without the cache, a failed download makes Nix build that path from source, and a failed push at the end of the job shows Cachix's error annotation on a green job. Every other failed step still fails its job and CI Result. A download that stalls without failing still runs the job into its timeout, which [#715](https://github.com/hakula139/oxide-code/issues/715) tracks. +The Lint and Nix jobs pull from the `hakula` Cachix cache and push their builds only on the default branch. The cache only saves build time, so a failed Cachix setup, download, or push does not fail a job: a failed setup logs a warning and the job builds without the cache, a failed download makes Nix build that path from source, and a failed push at the end of the job shows Cachix's error annotation on a green job. Every other failed step still fails its job and CI Result. A download that stalls without failing still runs the job into its timeout, which [#715](https://github.com/hakula139/oxide-code/issues/715) tracks. A push to a pull request cancels the CI it supersedes, while every push to `main` gets its own run, which a later push never cancels. From 3273394dfa17d8fffa7f117429f24cda8b43e3ea Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Sun, 8 Nov 2026 21:38:45 +0800 Subject: [PATCH 13/14] refactor(dependencies): use the shared Renovate policy --- .github/dependabot.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 4a407853d..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Renovate opens version updates, so `open-pull-requests-limit: 0` leaves Dependabot only security -# updates. Each entry sets its commit type, which Dependabot would otherwise infer from recent -# commits, and its label, which drops the ecosystem label Dependabot adds by default. Only the cargo -# entry uses `fix`, since Rust advisory bumps ship in `ox` and belong under Fixed in the changelog. -version: 2 -updates: - - package-ecosystem: cargo - directory: / - schedule: - interval: weekly - open-pull-requests-limit: 0 - commit-message: - prefix: fix - include: scope - labels: - - dependencies - - package-ecosystem: github-actions - # `/` covers the workflows, and the glob adds the composite actions they share. - directories: - - / - - /.github/actions/* - schedule: - interval: weekly - open-pull-requests-limit: 0 - commit-message: - prefix: ci - include: scope - labels: - - dependencies From 9bb3dfc9c0fb4c5fa64725b40d92d09411e49efa Mon Sep 17 00:00:00 2001 From: Hakula Chen Date: Mon, 9 Nov 2026 14:22:09 +0800 Subject: [PATCH 14/14] refactor(devkit): adopt v2 shared formatter configuration --- .github/renovate.json | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/formula.yml | 2 +- .github/workflows/nix-cache.yml | 2 +- .github/workflows/release.yml | 4 ++-- .markdownlint-cli2.jsonc | 12 ------------ .prettierrc.json | 5 ----- Cargo.toml | 24 +++++------------------- RELEASING.md | 2 +- about.toml | 10 +--------- deny.toml | 10 +--------- flake.lock | 8 ++++---- flake.nix | 2 +- 13 files changed, 21 insertions(+), 68 deletions(-) delete mode 100644 .prettierrc.json diff --git a/.github/renovate.json b/.github/renovate.json index bc1a890c8..d9b6f72e3 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>hakula139/devkit#v1"], + "extends": ["github>hakula139/devkit#v2"], "packageRules": [ { "matchManagers": ["rust-toolchain"], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54901a8e3..061930e24 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/.github/actions/setup-nix@v1 + uses: hakula139/devkit/.github/actions/setup-nix@v2 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -162,7 +162,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/.github/actions/setup-nix@v1 + uses: hakula139/devkit/.github/actions/setup-nix@v2 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} @@ -184,4 +184,4 @@ jobs: actions: read steps: - name: Check results - uses: hakula139/devkit/.github/actions/ci-result@v1 + uses: hakula139/devkit/.github/actions/ci-result@v2 diff --git a/.github/workflows/formula.yml b/.github/workflows/formula.yml index 61d6285ba..828ca3cb8 100644 --- a/.github/workflows/formula.yml +++ b/.github/workflows/formula.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v7 - name: Set up Nix - uses: hakula139/devkit/.github/actions/setup-nix@v1 + uses: hakula139/devkit/.github/actions/setup-nix@v2 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/nix-cache.yml b/.github/workflows/nix-cache.yml index d562f21e2..f69811827 100644 --- a/.github/workflows/nix-cache.yml +++ b/.github/workflows/nix-cache.yml @@ -43,7 +43,7 @@ jobs: ref: refs/tags/${{ inputs.tag }} - name: Set up Nix - uses: hakula139/devkit/.github/actions/setup-nix@v1 + uses: hakula139/devkit/.github/actions/setup-nix@v2 with: cachix_auth_token: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dfc281992..4dbe29623 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: actions: read steps: - name: Wait for CI on the tagged commit - uses: hakula139/devkit/.github/actions/tagged-ci@v1 + uses: hakula139/devkit/.github/actions/tagged-ci@v2 build: name: Build (${{ matrix.target }}) @@ -215,7 +215,7 @@ jobs: release-assets/*.zip - name: Publish release - uses: hakula139/devkit/.github/actions/publish-release@v1 + uses: hakula139/devkit/.github/actions/publish-release@v2 with: assets: | release-assets/oxide-code-x86_64-unknown-linux-gnu.tar.gz diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index afadb871d..956136477 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -1,17 +1,5 @@ { "config": { - "code-block-style": { "style": "fenced" }, - "code-fence-style": { "style": "backtick" }, - "emphasis-style": { "style": "underscore" }, - // GitHub shows a PR's title above its body, so the PR template starts at `##`. "first-line-heading": false, - "heading-style": { "style": "atx" }, - "line-length": false, - "no-duplicate-heading": { "siblings_only": true }, - "ol-prefix": { "style": "ordered" }, - "strong-style": { "style": "asterisk" }, - "ul-style": { "style": "dash" }, }, - - "gitignore": true, } diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 1f5ea7e9d..000000000 --- a/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 100, - "quoteProps": "consistent", - "singleQuote": true -} diff --git a/Cargo.toml b/Cargo.toml index 7ca91771b..3288f9b1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,9 +36,7 @@ private_intra_doc_links = "allow" [workspace.dependencies] anyhow = "1" -arboard = { version = "3.7", default-features = false, features = [ - "wayland-data-control", -] } +arboard = { version = "3.7", default-features = false, features = ["wayland-data-control"] } base64 = "0.23" bytes = "1" caseless = "0.2" @@ -71,23 +69,11 @@ ratatui = "0.30" ratatui-textarea = "0.9.3" regex = "1" regex-syntax = "0.8" -reqwest = { version = "0.13", default-features = false, features = [ - "json", - "rustls", - "stream", -] } -rusqlite = { version = "0.41", default-features = false, features = [ - "bundled", -] } -rustls = { version = "0.23", default-features = false, features = [ - "aws-lc-rs", - "std", - "tls12", -] } +reqwest = { version = "0.13", default-features = false, features = ["json", "rustls", "stream"] } +rusqlite = { version = "0.41", default-features = false, features = ["bundled"] } +rustls = { version = "0.23", default-features = false, features = ["aws-lc-rs", "std", "tls12"] } rustls-platform-verifier = "0.7" -rustls-webpki = { version = "0.103", default-features = false, features = [ - "std", -] } +rustls-webpki = { version = "0.103", default-features = false, features = ["std"] } same-file = "1" security-framework = "3" serde = { version = "1", features = ["derive"] } diff --git a/RELEASING.md b/RELEASING.md index 84d82abca..a983daead 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -33,7 +33,7 @@ Before 0.1.0, config, environment variable, and session format changes may freel ## Release Preparation -Follow the [shared release procedure](https://github.com/hakula139/devkit/blob/v1/docs/releasing.md) for changelog curation, the release PR, tagging its exact merged commit after separate approval, and CI recovery. Draft `CHANGELOG.md` with the shared configuration. +Follow the [shared release procedure](https://github.com/hakula139/devkit/blob/v2/docs/releasing.md) for changelog curation, the release PR, tagging its exact merged commit after separate approval, and CI recovery. Draft `CHANGELOG.md` with the shared configuration. Security fixes describe the gap, affected releases, and published advisory as [SECURITY.md](SECURITY.md) promises. Add an advisory published later to every affected changelog section through a correction PR. diff --git a/about.toml b/about.toml index e919f3e89..04888b347 100644 --- a/about.toml +++ b/about.toml @@ -1,12 +1,4 @@ -accepted = [ - "Apache-2.0", - "BSD-3-Clause", - "BSL-1.0", - "ISC", - "MIT", - "Unicode-3.0", - "Zlib", -] +accepted = ["Apache-2.0", "BSD-3-Clause", "BSL-1.0", "ISC", "MIT", "Unicode-3.0", "Zlib"] ignore-dev-dependencies = true ignore-build-dependencies = true private = { ignore = true } diff --git a/deny.toml b/deny.toml index 6c0ee01f3..e0da54e38 100644 --- a/deny.toml +++ b/deny.toml @@ -15,15 +15,7 @@ id = "RUSTSEC-2025-0141" reason = "bincode 1.3.3 is unmaintained and unpatched, and the latest syntect, 5.3.0, requires it" [licenses] -allow = [ - "Apache-2.0", - "BSD-3-Clause", - "BSL-1.0", - "ISC", - "MIT", - "Unicode-3.0", - "Zlib", -] +allow = ["Apache-2.0", "BSD-3-Clause", "BSL-1.0", "ISC", "MIT", "Unicode-3.0", "Zlib"] [bans] multiple-versions = "warn" diff --git a/flake.lock b/flake.lock index 8bb1054a4..41b61a743 100644 --- a/flake.lock +++ b/flake.lock @@ -9,16 +9,16 @@ "nixpkgs-unstable": "nixpkgs-unstable" }, "locked": { - "lastModified": 1794142809, - "narHash": "sha256-ZtQhNN+JJwsVeitesXzeBqcBAdjCgwSRHQfq3qxfDG4=", + "lastModified": 1794204530, + "narHash": "sha256-kcljoojFDwhCLZd3GTFwDA0jM+QcRqDfwBHxHIE/38o=", "owner": "hakula139", "repo": "devkit", - "rev": "d714f2f48b26cbf80d9db01b6a4e353abbbe3ad7", + "rev": "1fb13ed3f76630638d442677abd25c6d20b1d954", "type": "github" }, "original": { "owner": "hakula139", - "ref": "v1", + "ref": "v2", "repo": "devkit", "type": "github" } diff --git a/flake.nix b/flake.nix index 50d538785..60a213374 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ }; devkit = { - url = "github:hakula139/devkit/v1"; + url = "github:hakula139/devkit/v2"; inputs.nixpkgs.follows = "nixpkgs"; };