Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
7d18865
chore(v0.3.2): bump to 0.3.2 + tune dev profile (build-override O3, l…
marlonsc Jun 7, 2026
65d3bbb
ci(release): resilient create-release (always/!cancelled + fail_on_un…
marlonsc Jun 7, 2026
bbd7875
ci(cache): fix inefficient CI cache — per-OS saving cache for test-cr…
marlonsc Jun 7, 2026
a210330
ci(cache): scope cache-on-failure to saver jobs only — it is a no-op …
marlonsc Jun 7, 2026
c2cefc6
build(tooling): add typos config + setup-ci install flags for cargo-n…
marlonsc Jun 7, 2026
5032dd2
build(hooks): tiered make hook verb (pre-commit fast / pre-push full)…
marlonsc Jun 7, 2026
5e33a0f
ci(test): install cargo-nextest (prebuilt via taiki-e) in test-linux/…
marlonsc Jun 7, 2026
f7c1018
ci(typos): add typos spell-check gate to lint job + baseline allowlis…
marlonsc Jun 7, 2026
267bb12
docs(agents): document beads (bd) task tracking + tiered hooks in AGE…
marlonsc Jun 7, 2026
1bbac69
docs(agents): FUNDAMENTAL rule — never hand-edit .beads/*.jsonl (gene…
marlonsc Jun 7, 2026
a6c6f17
chore(planning): remove stale .planning GSD tracker — content migrate…
marlonsc Jun 7, 2026
6a98399
docs(agents): MAXIMUM rule — never idle-wait on async actions (CI/bui…
marlonsc Jun 7, 2026
a17df0c
ci(concurrency): restrict push trigger to main so feature branches ru…
marlonsc Jun 7, 2026
62f38c6
docs(agents): FUNDAMENTAL rules — push frequently after every commit/…
marlonsc Jun 7, 2026
2213a6c
docs: migrate retired planning references to beads
marlonsc Jun 7, 2026
d478ce8
docs: fix retired docs validation flow
marlonsc Jun 7, 2026
d9fab95
test(nextest): serialize mcb-server integration tests via test-group …
marlonsc Jun 7, 2026
6c1b275
governance: coordinate beads audit
marlonsc Jun 7, 2026
80860f3
docs(adr-032): restore canonical '## Decision' heading (was '## Histo…
marlonsc Jun 7, 2026
9b84105
chore: migrate governance docs to beads
marlonsc Jun 7, 2026
203d825
ci(typos): exclude docs/archive + .bak (archived legacy Portuguese pl…
marlonsc Jun 7, 2026
e3bfaef
test(golden): propagate real provider-resolution error from shared te…
marlonsc Jun 7, 2026
d008530
docs: update beads server protocol
marlonsc Jun 7, 2026
478a021
chore: fix gitignore artifact hygiene
marlonsc Jun 7, 2026
8560a00
chore: enforce beads-first coordination gates
marlonsc Jun 7, 2026
861e907
ci(timeouts): raise coverage + test-cross (windows/macos) timeout-min…
marlonsc Jun 7, 2026
bd44822
chore(beads): bd-doctor hygiene — add Beads/Dolt .gitignore patterns …
marlonsc Jun 7, 2026
90e5562
refactor(test): collapse redundant try_shared_app_context pass-throug…
marlonsc Jun 7, 2026
ab0e366
Update implementation status across multiple ADRs to reflect historic…
marlonsc Jun 7, 2026
84ca06c
ci(gate): make Coverage advisory in the full-suite required-checks ga…
marlonsc Jun 7, 2026
45410b6
perf(build): mandatory sccache, CI cache-on-failure, dev-env optimizer
marlonsc Jun 9, 2026
102b968
fix(ci): move sccache-action before setup-ci.sh in all jobs
marlonsc Jun 9, 2026
9539c33
fix(ci): add sccache to validate-docs job
marlonsc Jun 9, 2026
65a4cb6
fix(docs): correct markdown table formatting in BENCHMARK.md
marlonsc Jun 9, 2026
befabdb
fix(docs): resolve markdown lint errors in BENCHMARK.md
marlonsc Jun 9, 2026
5f1885e
fix(docs): remove trailing punctuation from BENCHMARK.md heading
marlonsc Jun 9, 2026
10b63d7
docs: add CI fixes and consolidation design spec
marlonsc Jun 9, 2026
5f09eee
fix(ci): windows timeout 90→120min, tarpaulin --engine llvm
marlonsc Jun 9, 2026
d2a275e
feat(ci): build-ubuntu-debug job with artifact sharing
marlonsc Jun 9, 2026
b6f82ec
fix(ci): ignore docs/superpowers/ from markdownlint
marlonsc Jun 9, 2026
9b50153
revert(ci): remove build-ubuntu-debug artifact sharing
marlonsc Jun 9, 2026
fb739ae
fix(clippy): str_to_string in config loader
marlonsc Jun 9, 2026
121ca30
ci: stop sccache server before post-checkout cleanup
marlonsc Jun 9, 2026
63f8d40
ci: manual submodule init + sccache stop-server to fix post-checkout …
marlonsc Jun 9, 2026
dcb357b
ci: update actions/checkout to v4.2.2 (Node.js 24 compatible)
marlonsc Jun 9, 2026
db2e785
ci: disable checkout clean to prevent post-run hang
marlonsc Jun 9, 2026
7f57750
ci: use manual git clone to avoid actions/checkout post-run hang
marlonsc Jun 9, 2026
896777a
ci: fix empty step in CodeQL job causing workflow parse failure
marlonsc Jun 9, 2026
e90a12f
ci: create local branch in manual checkout for paths-filter compatibi…
marlonsc Jun 9, 2026
99dbf31
docs: add onboarding guide and enrich CLAUDE.md pointer
marlonsc Jun 13, 2026
3bcb09f
fix(guard): resolve baseline guard violations and remove dead http co…
marlonsc Jun 13, 2026
9ccbbf9
refactor(domain): split ProjectRepository into ISP sub-traits
marlonsc Jun 13, 2026
eccc560
refactor(vcs): extract helper methods in submodule provider
marlonsc Jun 13, 2026
c907be1
refactor(highlight): isolate sync tree-sitter logic in HighlightSyncS…
marlonsc Jun 13, 2026
f617255
fix(mcp): improve provenance fast-fail, auto-create error handling, a…
marlonsc Jun 13, 2026
8d1c312
feat(cli): add stdio-only serve mode and fail-fast provider config
marlonsc Jun 13, 2026
213226f
docs(adr): fix ADR-051 link labels in superseded references
marlonsc Jun 13, 2026
39252d7
ci(release): validate workflow_dispatch tag exists and use selected t…
marlonsc Jun 13, 2026
f7cad21
build(make): reuse MCB_TEST_UNIT in pre-commit and prefer cargo-binst…
marlonsc Jun 13, 2026
4d5ac6e
docs(beads): remove duplicate dolt mapping and tighten legacy bd-doct…
marlonsc Jun 13, 2026
731867e
test(contract): refresh provenance error snapshots after repo_id fiel…
marlonsc Jun 13, 2026
64d8dd7
test(mcp): supply execution_flow in provenance gate tests after flow …
marlonsc Jun 13, 2026
ccc923e
fix(ci): warm FastEmbed cache via Rust path so beta leg loads model o…
marlonsc Jun 13, 2026
67eed06
docs: add reuse-priority ladder and negative-LOC rule to AGENTS.md en…
marlonsc Jun 13, 2026
0a0b2f2
refactor: dedup CI and make via composite actions and BAD_WHAT macro …
marlonsc Jun 13, 2026
a688cb0
ci: give Windows test-cross leg 240min timeout for full nextest suite…
marlonsc Jun 13, 2026
757f32c
ci: reduce Windows test-cross scope to unit+startup to avoid >4h time…
marlonsc Jun 24, 2026
1d253e6
fix(deps): bump git2 to 0.21 and quinn-proto, adapt provider API usage
marlonsc Jun 24, 2026
392a451
Merge branch 'main' into feature/v0-3-2-ci-gates
marlon-costa-dc Jul 29, 2026
a5c3d9f
Merge branch 'main' into feature/v0-3-2-ci-gates
marlon-costa-dc Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 4 additions & 14 deletions .clinerules
Original file line number Diff line number Diff line change
@@ -1,17 +1,7 @@
# MCB — Cline Rules

All project rules, architecture, conventions, and commands are defined in
`CLAUDE.md` at the repository root. Read it fully before making changes.
`AGENTS.md` is the project single source of truth for all agent rules,
architecture, conventions, commands, beads workflow, validation, and Git policy.

See `AGENTS.md` for the full AI agent configuration index.

## Essential Rules

- **Architecture**: Clean Architecture — dependencies flow inward only. Run `make validate` to verify.
- **Error handling**: Use `Error::vcs("msg")` constructors, never `unwrap()`/`expect()` in production.
- **Lints**: `unsafe_code = "deny"`, `dead_code = "deny"`. Zero clippy warnings required.
- **Testing**: `make test` (1700+ tests). New logic must include tests.
- **Build**: Always use `make` targets (`make build`, `make lint`, `make test`, `make check`).
- **Commits**: Conventional Commits format — `feat(scope): description`.
- **Change philosophy**: Surgical edits, maximum reuse, no bypasses. Fix all warnings every cycle.
- **MVI 200**: Source files under ~200 lines; split into submodules when growing.
`CLAUDE.md` is intentionally only a thin pointer back to `AGENTS.md`; do not use
it as a second rule source and do not duplicate the universal core here.
23 changes: 23 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# cargo-nextest configuration.
#
# mcb-server integration tests share a process-wide test context
# (`tests/utils/test_fixtures.rs`: `OnceLock<Option<SharedTestContext>>` with a
# heavy provider/DB init). Under `cargo test` that context initializes ONCE per
# test binary and is shared by all threads. nextest instead runs ONE PROCESS PER
# TEST, so each test re-initializes the context; running them concurrently makes
# several heavy inits collide and return `None` ("shared test context init
# failed"). Serialize the integration tests so only one init runs at a time —
# this matches the cargo-test execution semantics without losing nextest's speed
# on the rest of the suite.

[test-groups]
serial-shared-context = { max-threads = 1 }

[[profile.default.overrides]]
filter = 'package(mcb-server) and kind(test)'

@cubic-dev-ai cubic-dev-ai Bot Jul 29, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: All mcb-server test binaries are now serialized, including hundreds of unit, e2e, and contract tests unrelated to SharedTestContext. Narrowing this override to the tests that initialize the shared context would retain nextest parallelism for the rest of the package.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .config/nextest.toml, line 17:

<comment>All `mcb-server` test binaries are now serialized, including hundreds of unit, e2e, and contract tests unrelated to `SharedTestContext`. Narrowing this override to the tests that initialize the shared context would retain nextest parallelism for the rest of the package.</comment>

<file context>
@@ -0,0 +1,23 @@
+serial-shared-context = { max-threads = 1 }
+
+[[profile.default.overrides]]
+filter = 'package(mcb-server) and kind(test)'
+test-group = 'serial-shared-context'
+# Defense-in-depth: the CI warm-up step (`make test SCOPE=warmup`) populates the
</file context>
Fix with cubic

test-group = 'serial-shared-context'
# Defense-in-depth: the CI warm-up step (`make test SCOPE=warmup`) populates the
# hf-hub cache in-job so these load the model offline. retries absorbs a residual
# transient HF 429 on a genuine cold-cache run — visible in nextest output, not a
# silent fallback. Primary fix is the warm-up; this is the safety net.
retries = 2
18 changes: 4 additions & 14 deletions .continue/rules/mcb.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,8 @@ globs: ["**/*.rs", "**/*.toml", "**/*.md"]

# MCB — Continue.dev Rules

All project rules, architecture, conventions, and commands are defined in
`CLAUDE.md` at the repository root. Read it fully before making changes.
`AGENTS.md` is the project single source of truth for all agent rules,
architecture, conventions, commands, beads workflow, validation, and Git policy.

See `AGENTS.md` for the full AI agent configuration index.

## Essential Rules

- **Architecture**: Clean Architecture — dependencies flow inward only. Run `make validate` to verify.
- **Error handling**: Use `Error::vcs("msg")` constructors, never `unwrap()`/`expect()` in production.
- **Lints**: `unsafe_code = "deny"`, `dead_code = "deny"`. Zero clippy warnings required.
- **Testing**: `make test` (1700+ tests). New logic must include tests.
- **Build**: Always use `make` targets (`make build`, `make lint`, `make test`, `make check`).
- **Commits**: Conventional Commits format — `feat(scope): description`.
- **Change philosophy**: Surgical edits, maximum reuse, no bypasses. Fix all warnings every cycle.
- **MVI 200**: Source files under ~200 lines; split into submodules when growing.
`CLAUDE.md` is intentionally only a thin pointer back to `AGENTS.md`; do not use
it as a second rule source and do not duplicate the universal core here.
11 changes: 6 additions & 5 deletions .gemini/styleguide.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# MCB — Gemini Code Assist Style Guide

> Single source of truth: [`CLAUDE.md`](../CLAUDE.md). This file adds Gemini-specific
> PR review priorities. See [`AGENTS.md`](../AGENTS.md) for the full agent configuration index.
> Single source of truth: [`AGENTS.md`](../AGENTS.md). `CLAUDE.md` is only a
> pointer back to `AGENTS.md`. This file adds Gemini-specific PR review
> priorities without restating the universal core.

## PR Review Priorities (ordered)

Expand Down Expand Up @@ -34,14 +35,14 @@

## Quality Gate Checklist

- `make lint` passes (clippy + fmt)
- `make check WHAT=lint` passes (clippy + fmt)
- `make test` passes (1700+ tests)
- `make validate` passes (zero architecture violations)
- `make check WHAT=validate` passes (zero architecture violations)
- Conventional Commits format used

## Key Documentation

- [`CLAUDE.md`](../CLAUDE.md) — all rules, patterns, commands (single source of truth)
- [`AGENTS.md`](../AGENTS.md) — all rules, patterns, commands, and beads workflow
- [`docs/architecture/ARCHITECTURE.md`](../docs/architecture/ARCHITECTURE.md) — architecture details
- [`docs/developer/CONTRIBUTING.md`](../docs/developer/CONTRIBUTING.md) — contributor guide
- [`docs/adr/`](../docs/adr/) — 52 Architecture Decision Records
53 changes: 53 additions & 0 deletions .github/actions/native-deps/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
# SSOT for native build dependencies (protoc + ONNX Runtime), cross-platform.
# Replaces the Unix `setup-ci.sh` call plus the Windows protoc/ONNX PowerShell
# blocks that were copy-pasted across ci.yml (test-cross, release-build) and
# release.yml. One definition, used everywhere.
name: Native build dependencies
description: Install protoc and ONNX Runtime for the current OS (Unix via setup-ci.sh, Windows via PowerShell).
inputs:
setup-flags:
description: Extra flags forwarded to .github/setup-ci.sh on Unix (e.g. --install-audit).
required: false
default: ""
runs:
using: composite
steps:
- name: Install dependencies (Unix)
if: runner.os != 'Windows'
shell: bash
run: bash .github/setup-ci.sh ${{ inputs.setup-flags }}
- name: Install protoc (Windows)
if: runner.os == 'Windows'
shell: pwsh
env:
PROTOC_VERSION: "29.3"
PROTOC_SHA256: "57ea59e9f551ad8d71ffaa9b5cfbe0ca1f4e720972a1db7ec2d12ab44bff9383"
run: |
$base = "https://github.com/protocolbuffers/protobuf/releases/download"
$url = "$base/v${env:PROTOC_VERSION}/protoc-${env:PROTOC_VERSION}-win64.zip"
$zip = "$env:TEMP\protoc.zip"
Invoke-WebRequest -Uri $url -OutFile $zip -ErrorAction Stop
$hash = (Get-FileHash $zip -Algorithm SHA256).Hash.ToLower()
if ($hash -ne $env:PROTOC_SHA256) {
throw "protoc checksum mismatch: expected $($env:PROTOC_SHA256), got $hash"
}
Expand-Archive $zip -DestinationPath "$env:TEMP\protoc" -Force
Add-Content -Path $env:GITHUB_PATH -Value "$env:TEMP\protoc\bin"
- name: Install ONNX Runtime (Windows)
if: runner.os == 'Windows'
shell: pwsh
env:
ORT_VERSION: "1.23.2"
run: |
$url = "https://github.com/microsoft/onnxruntime/releases/download/v${env:ORT_VERSION}/onnxruntime-win-x64-${env:ORT_VERSION}.zip"
$zip = "$env:TEMP\onnxruntime.zip"
$dest = "$env:TEMP\onnxruntime"
Write-Host "Installing ONNX Runtime ${env:ORT_VERSION} (Windows x64)..."
Invoke-WebRequest -Uri $url -OutFile $zip -ErrorAction Stop
Expand-Archive $zip -DestinationPath $dest -Force

@cubic-dev-ai cubic-dev-ai Bot Jul 29, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Windows CI extracts and loads an ONNX Runtime DLL without verifying the archive, leaving this executable dependency vulnerable to corrupted or replaced release content. Add a pinned SHA-256 and reject a mismatch before Expand-Archive, matching the protoc and Unix ONNX paths.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/actions/native-deps/action.yml, line 48:

<comment>Windows CI extracts and loads an ONNX Runtime DLL without verifying the archive, leaving this executable dependency vulnerable to corrupted or replaced release content. Add a pinned SHA-256 and reject a mismatch before `Expand-Archive`, matching the protoc and Unix ONNX paths.</comment>

<file context>
@@ -0,0 +1,53 @@
+        $dest = "$env:TEMP\onnxruntime"
+        Write-Host "Installing ONNX Runtime ${env:ORT_VERSION} (Windows x64)..."
+        Invoke-WebRequest -Uri $url -OutFile $zip -ErrorAction Stop
+        Expand-Archive $zip -DestinationPath $dest -Force
+        $ortDir = "$dest\onnxruntime-win-x64-${env:ORT_VERSION}"
+        $ortLib = "$ortDir\lib"
</file context>
Fix with cubic

$ortDir = "$dest\onnxruntime-win-x64-${env:ORT_VERSION}"
$ortLib = "$ortDir\lib"
Add-Content -Path $env:GITHUB_PATH -Value $ortLib
Add-Content -Path $env:GITHUB_ENV -Value "ORT_DYLIB_PATH=$ortLib\onnxruntime.dll"
Add-Content -Path $env:GITHUB_ENV -Value "PATH=$ortLib;$env:PATH"
22 changes: 22 additions & 0 deletions .github/actions/warm-fastembed/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
# SSOT for the FastEmbed cache warm-up (replaces 4 identical inline blocks).
# Populates .cache/mcb/fastembed via the SAME hf-hub Rust code path the tests use
# (make test SCOPE=warmup runs the init test once), so the on-disk
# blobs+refs+snapshots layout is valid in-job and tests resolve the model offline.
# The retry loop survives a transient HF 429 on a genuine cold-cache download.
name: Warm FastEmbed cache
description: Populate the FastEmbed model cache via the hf-hub Rust path for offline test loads.
runs:
using: composite
steps:
- name: Warm FastEmbed cache (Rust path)
shell: bash
env:
FASTEMBED_CACHE_DIR: .cache/mcb/fastembed
run: |
for attempt in 1 2 3 4 5; do
if make test SCOPE=warmup; then break; fi
[ "$attempt" -eq 5 ] && { echo 'FastEmbed warm-up failed after 5 attempts' >&2; exit 1; }
echo "warm-up attempt $attempt failed (likely HF 429); backing off $((attempt*20))s..."
sleep $((attempt * 20))
done
29 changes: 27 additions & 2 deletions .github/setup-ci.sh
Original file line number Diff line number Diff line change
Expand Up @@ -133,18 +133,35 @@ Darwin)
;;
esac

# Install a Rust crate. Prefer cargo-binstall when available for speed,
# but fall back to cargo install so environments without binstall still work.
_mcb_install_crate() {
local crate="$1"
if command -v cargo-binstall &>/dev/null; then
cargo binstall -y "$crate" >/dev/null 2>&1
else
cargo install "$crate" --locked --quiet
fi
}

# Parse optional flags
# Ensure sccache is available (mandatory compilation cache)
if ! command -v sccache &>/dev/null; then
echo "Installing sccache (mandatory compilation cache)..." >&2
_mcb_install_crate sccache
fi
Comment on lines +148 to +152

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

4. Setup-ci requires cargo pre-rust 🐞 Bug ☼ Reliability

The CI setup now assumes sccache is available by installing it via cargo in
.github/setup-ci.sh and by exporting RUSTC_WRAPPER=sccache in the Makefile, but several
release/publish workflows run the native-deps/setup step before the Rust toolchain is installed and
the Makefile’s best-effort install can be ignored. If cargo is not present or the install fails,
subsequent builds/releases can abort with cargo: command not found or because the sccache
wrapper binary cannot be executed.
Agent Prompt
## Issue description
CI/release/publish and local builds can fail because `sccache` is treated as mandatory in two places: `.github/setup-ci.sh` installs it using `cargo` when missing, but some workflows call the script before installing the Rust toolchain (so `cargo` may not exist), and the Makefile exports `RUSTC_WRAPPER=sccache` unconditionally while only best-effort attempting to install `sccache`, leaving Cargo configured to use a missing wrapper.

## Issue Context
- `native-deps` composite action runs `bash .github/setup-ci.sh ...` on Unix.
- `.github/setup-ci.sh` installs `sccache` via `_mcb_install_crate` / `cargo binstall/install` if it isn’t present.
- In `release.yml`, `native-deps` runs before `dtolnay/rust-toolchain` in `release-build`, and also in `publish-crates` when a registry token exists, so `cargo` may be unavailable when `setup-ci.sh` runs.
- The Makefile sets `RUSTC_WRAPPER := sccache` globally, and the installation attempt happens at Makefile parse-time with errors suppressed (`|| true`), so even if installation fails (or `cargo` is missing) subsequent `cargo` builds still attempt to invoke `sccache` and fail.

## Fix Focus Areas
- .github/setup-ci.sh[136-152]
- .github/workflows/release.yml[64-77]
- .github/workflows/release.yml[260-265]
- .github/actions/native-deps/action.yml[16-19]
- Makefile[35-44]

## Suggested fix
- Reorder `release.yml` steps so `dtolnay/rust-toolchain` runs before `./.github/actions/native-deps` (preferred), and/or
- Update `setup-ci.sh` to only attempt cargo-based installation when `cargo` exists (otherwise skip with a clear message or fail with instructions to install Rust first), and/or
- Install `sccache` via `mozilla-actions/sccache-action` in release/publish jobs before calling `native-deps`.
- In the Makefile, only export `RUSTC_WRAPPER` when `command -v sccache` succeeds, and consider moving installation to an explicit setup target (or making it opt-in via `SCCACHE=1`) so failures are explicit and there is a clean fallback when `sccache` is unavailable.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


while [[ $# -gt 0 ]]; do
case $1 in
--install-audit)
if ! command -v cargo-audit &>/dev/null; then
cargo install cargo-audit --locked --quiet
_mcb_install_crate cargo-audit
fi
shift
;;
--install-coverage)
if ! command -v cargo-tarpaulin &>/dev/null; then
cargo install cargo-tarpaulin --locked --quiet
_mcb_install_crate cargo-tarpaulin
fi
shift
;;
Expand All @@ -167,6 +184,14 @@ while [[ $# -gt 0 ]]; do
fi
shift
;;
--install-nextest)
command -v cargo-nextest &>/dev/null || _mcb_install_crate cargo-nextest
shift
;;
--install-typos)
command -v typos &>/dev/null || _mcb_install_crate typos-cli
shift
;;
*)
echo "Error: Unknown option: $1" >&2
exit 1
Expand Down
Loading
Loading