Commit Graph
942 Commits
Author SHA1 Message Date
Michael BiancoandGitHub 1b4469cb4f fix(ruby): upgrade to jemalloc2 (#338)
* fix: use jemalloc2

* test(ruby): add jemalloc example

* docs: update jemalloc docs

* test: snapshot update
2026-03-12 12:27:48 -06:00
Michael BiancoandGitHub fa7d5ce430 fix(ruby): pin default ruby to minor, not patch (#488)
* test: ruby no version checks minor version and http connection

* fix: pin ruby to minor version, not specific patch

* fix(ruby): bind to 0.0.0.0 to fix start for non-rails applications

* test: snapshot update
2026-03-12 12:22:13 -06:00
Michael BiancoandGitHub 7880518e62 fix: warning when start command is missing (#490)
* fix: warn user in build plan when no start command is found

previously this would only happen if error-missing-start is enabled, which is not enabled by default.

* test: warning when start is not found
2026-03-12 12:14:16 -06:00
Michael BiancoandGitHub d9dbd97950 test: ruby 4 example project (#492)
* test: ruby 4 example project

* test: update snapshot
2026-03-12 12:13:42 -06:00
Michael BiancoandGitHub 94adfeb242 test: snapshot update (#499) 2026-03-12 12:12:13 -06:00
Michael BiancoandGitHub 1502459adb feat: bunfig.toml support (#477)
* fix: support bunfig.toml

* test: bunfig config
2026-03-12 12:05:18 -06:00
Michael BiancoandGitHub 38e31fcd66 test: benchmark gha job summaries (#484)
* build: docker client timeout doesn't do anything anymore

this has been deprecated for years

* Revert "test: correct benchmark workflow permissions (#480)"

This reverts commit d3b14c29ae.

* docs: comment on why py + pipx are needed for java

* test: increase ci timeouts

* test: attempt to add benchmark summary to gha job

* docs: note about rerunning a release
2026-03-12 12:04:00 -06:00
Michael BiancoandGitHub 8a61bb5167 test: cache go deps (#491)
should speed up test runs a bit
2026-03-12 12:01:26 -06:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>Michael Bianco
545c344830 chore: mise update 2026.3.5 (#486)
* update mise 2026.3.5

* build: fix newline in mise

* build: fix mise newline

* test: snapshot update

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Michael Bianco <[email protected]>
2026-03-12 11:58:27 -06:00
Michael BiancoandGitHub f20bb14873 docs: faq page (#476)
* docs: faq page

* docs: basic comparison
2026-03-09 14:30:13 -06:00
Michael BiancoandGitHub 7df856b505 test: don't start docker compose files unless they are used in a test (#489) 2026-03-09 14:04:34 -06:00
Michael BiancoandGitHub 7608ae0428 test: automatically generate mise upgrade PRs (#485)
* build: ignore all gemini stuff for now

* build: add workflow for automated mise update PRs

* tmp tweaks to test if the PR workflow operates

* tmp fix to test workflow

* build: don't rely on a specific remote, use hardcoded canonical repo when pushing a mise update
2026-03-09 11:20:24 -06:00
Michael BiancoandGitHub 262a147029 build: only install from mise.lock (#483)
* test: latest tags are automatically added

* test: only install from mise.lock in ci

* build: use golintci backend that has x86 locks

* test: update mise action
2026-03-09 10:15:21 -06:00
Michael BiancoandGitHub 55a0475a86 test: fix release tag references (#482) 2026-03-09 09:45:53 -06:00
Michael BiancoandGitHub d3b14c29ae test: correct benchmark workflow permissions (#480) 2026-03-09 08:23:11 -06:00
Michael BiancoandGitHub d890d56005 feat: use consistent mise version in the builder image (#471)
* build: remove Dockerfiles/ folder to keep image management consistent

* docs: document purpose of various docker images

* docs: internal documentation on the how the build system works

* build: merge all of the image building workflows into a single release workflow

* build: use the mise installer for installing the mise binary

* docs: document purposes of the various images

* refactor: move builder to where it's used

* feat: pin mise build and runtime image versions to specific mise versions

* refactor: use mise task for starting buildkit runner

* test: build new builder and runtime mise images if needed for integration tests

* build: add mise.lock file

* refactor: rename integration tests

* test: add MISE_ENV=ci to all workflows

* fix: mise upgrade

* build: move the docs build and install process into mise

* test: use mise CI vars for tagged release process

* fix: cpp-meson installation process

something changed with mise pipx backend that requires us to manually install python and pipx

* fix: revert mise version

to separate out the build improvements from mise upgrades

* test: snapshot update

* docs: update ex to use mise reference example

* build: move ci bun logic into mise

* docs: explain how docker images are used in public docs

* build: don't push stable tags on prod so we can test a dry run release

* test: bump checkout actions

* docs: minor LLM rule tweak

* fix: remove yml frontend image reference

* docs: why mise.ci.toml is used
2026-03-09 08:09:00 -06:00
Michael BiancoandGitHub 4c5d94c972 test: generate master sizes.json to inspect image sizes over time (#475) 2026-03-08 09:06:05 -06:00
Michael BiancoandGitHub 8580298191 test: track image sizes over time (#473)
* test: track size of images in size.json

* test: upload all tracked sizes as artifacts and merge them for benchmarking

* docs: some LLM tweaks
2026-03-08 07:18:05 -06:00
Michael BiancoandGitHub fb756462a3 docs: install bin builder step (#468)
* fix: remove custom bin install step builder

* test: snapshot update

* Revert "fix: remove custom bin install step builder"

This reverts commit eee63373c86360e05ae9b0dc2bc302424bd072fd.

* Revert "test: snapshot update"

This reverts commit fa506b4e959265ed90d8720d5079c768eb19a5ef.

* docs: explain why the bin builder exists

* build: ensure mise versions go first in dev

* test: bad `env` key in node-bun test

* test: fail loudly if unexpected keys are found in test.json

* build: task to build an example project

* test: snapshot update
2026-03-08 06:44:19 -06:00
Michael BiancoandGitHub 0fa7d879f7 test: ensure mise version file is formatted properly (#470)
* test: ensure mise version file is formatted properly

* fix: stop trimming mise version in railpack
2026-03-01 10:46:53 -07:00
Michael Bianco da144e2957 build: fetch don't pull when upgrading mise 2026-02-27 14:40:57 -07:00
Michael Bianco cbd7efd2e4 test: update caddy version in snapshots 2026-02-27 14:14:14 -07:00
Michael Bianco e2fa7b141b update mise 2026.2.22 2026-02-27 14:14:14 -07:00
Ray ChenandGitHub a66d8d94b5 feat(python): Scan nested dependency files in usesDep (#457)
* feat(python): Scan nested dependency files in usesDep

* snapshot

* remove readme

* use single brace-expanded glob instead of three separate globs
2026-02-12 07:30:43 +08:00
Michael BiancoandGitHub 0990f0df18 fix: eliminate additional logs when using --dump-lbb (#452) 2026-02-02 15:26:37 -07:00
Michael BiancoandGitHub 6621e0926d chore: mise update 2026.1.12 (#451)
* update mise 2026.1.12

* style: whitespace fix

* test(rust): use latest version of rust and rocket

* test: snapshot update
2026-01-31 10:48:34 -07:00
Michael BiancoandGitHub 3355f7feb5 Revert "feat: automatically install packages required for playwright, and playwright browser (#348)" (#447)
This reverts commit c20ada430f.
2026-01-19 15:48:42 -07:00
07099287f6 docs: Fix broken pnpm-workspaces-example link in Node.js (#445)
* Initial plan

* Fix broken pnpm-workspaces-example link in Node.js docs

Replace broken link reference with link to examples folder. Added note about workspace examples for different package managers.

Co-authored-by: iloveitaly <[email protected]>

---------

Co-authored-by: iloveitaly <[email protected]>

Co-authored-by: Hanzo Dev <[email protected]>
2026-01-19 08:32:42 -07:00
Michael BiancoandGitHub 9080a2794e refactor: simplify dockerignore parser (#441)
* docs: minor docs + comment improvements

* refactor: simplify dockerignore parsing

* test: update tests to work with new dockerignore structure
2026-01-17 16:38:43 -07:00
Michael BiancoandGitHub 94fc0ca78c docs: dockerignore and playwright (#439)
* docs: playwright support on node and python

* docs: add dockerignore info
2026-01-17 15:23:24 -07:00
Michael BiancoandGitHub 1972427448 test: add bun workspace test (#430)
* docs: add note about lockb

ref #386

* test: add bun workspace test

* fix: add bun runtime log when it is selected as the runtime

* test: adding bun with pnpm test

* test: remove stderrAllowed when we can write directly to stdout

* test: update test since we've stopped using console.log

* test: ensure pnpm is used on bun-pnpm example

* test: update snapshots
2026-01-17 12:08:44 -07:00
Michael BiancoandGitHub 7a53f95999 update mise 2026.1.3 (#438) 2026-01-17 12:08:16 -07:00
Michael BiancoandGitHub 61f76ab3a6 fix: allow dockerignore negation rules for files and folders that do not exist (#437)
* test: failing case where a dockerignore negation dne

* fix: allow .dockerignore negations that dne

* test: expand unit tests for negation tests

* test: negation test for a directory that DOES exist

* test: snapshot update
2026-01-17 11:32:40 -07:00
Michael BiancoandGitHub c20ada430f feat: automatically install packages required for playwright, and playwright browser (#348)
* feat: support playwright on node and python

* test: update snapshot

* fix: log when SPA framework can't be detected

* fix: install playwright headless on node provider

* build: remove node_modules and venv during cleanup process

* refactor(node): cleanup apt package mapping and playwright/puppeteer install

* test: snapshot update

* refactor: simplify playwright install flow
2026-01-17 11:30:14 -07:00
Michael BiancoandGitHub d5476c0a90 fix: don't require provider in railpack schema (#436)
* fix: allow schemas with empty providers to still be valid

* test: for required provider field
2026-01-17 10:52:51 -07:00
5568301223 test: expand node monorepo test coverage (#361)
* docs: add monorepo support section to Node.js documentation

Addresses user questions about monorepo support by documenting that
Railpack automatically handles npm/pnpm/yarn workspaces and Turborepo
configurations with links to example projects.

* test: improve monorepo example tests to verify workspace functionality

Enhanced integration tests for monorepo examples to properly test that
workspace package linking and dependencies work correctly:

**node-npm-workspaces:**
- Root now imports and uses functions from pkg-a and pkg-b workspace packages
- pkg-a uses its dependency (abbrev) to demonstrate transitive deps work
- pkg-b exports a simple function
- Updated to ES modules for consistency
- Test now verifies all workspace packages load and execute correctly

**node-pnpm-workspaces:**
- Root now imports and uses functions from pkg-a and pkg-b workspace packages
- pkg-a uses its dependency (abbrev) to demonstrate transitive deps work
- pkg-b exports a simple function
- Updated to ES modules for consistency
- Test now verifies all workspace packages load and execute correctly

**node-turborepo:**
- Changed from justBuild to httpCheck since this is a Next.js web server
- Added start script to root package.json to run the web app
- Test now verifies the built app starts and responds to HTTP requests
- This properly tests that the @repo/ui workspace package is built and linked

These changes ensure that monorepo builds are actually testing workspace
functionality, not just that the root package builds in isolation.

Fixes #332

* feat: add yarn workspaces and full-stack monorepo examples

Added two new monorepo examples to complete coverage:

**node-yarn-workspaces:**
- Demonstrates yarn workspaces with workspace package imports
- Uses the packageManager field for corepack
- Similar structure to npm/pnpm workspace examples for consistency
- Tests that workspace packages load and transitive dependencies work

**node-monorepo-fullstack:**
- Real-world example with Express API + frontend + shared package
- Shows how to share code (@monorepo/shared) between API and web packages
- API uses Express and shared utilities/constants
- Frontend demonstrates importing shared code
- Uses HTTP checks to verify API endpoints work correctly
- Demonstrates common full-stack monorepo pattern

Updated documentation to link to the yarn workspaces example and added
a note about the full-stack example for users looking for a more
realistic monorepo setup.

Addresses #332

* fix: format pkg-b package.json properly

Fixed uglified JSON that was created with echo instead of proper editing.

* fix: add yarn.lock and workspace deps to yarn-workspaces example

- Added yarn.lock file required by yarn 4
- Added workspace package dependencies (pkg-a, pkg-b) to root package.json
- Yarn requires lockfile to exist and won't create one in CI mode

* fix: update yarn.lock with correct workspace references

- Added workspace:* aliases to pkg-a and pkg-b entries
- Removed unused transitive dependencies that aren't in package.json
- Yarn requires both the workspace:* and workspace:packages/* forms

* docs: add lockfile guidelines to CLAUDE.md

Never manually update lockfiles - always use the package manager to
generate them properly with correct checksums.

* fix: add workspace deps to pnpm-workspaces package.json

ES module imports require workspace packages to be listed as dependencies
in the root package.json for Node.js to resolve them correctly.

* fix: generate yarn.lock with proper checksums using yarn

Used yarn install via corepack to generate proper yarn.lock with real
checksums instead of manually creating fake ones. Also includes Yarn PnP
files (.pnp.cjs, .pnp.loader.mjs, .yarn/) generated by yarn 4.

* fix: regenerate lockfiles using package managers

Regenerated pnpm-lock.yaml and yarn install-state.gz using the actual
package managers (pnpm and yarn via corepack) instead of manual edits.

- pnpm-lock.yaml: Updated for new workspace dependencies
- .yarn/install-state.gz: Regenerated by yarn install

* fix: remove Yarn PnP files and add .gitignore

Yarn PnP files (.pnp.cjs, .pnp.loader.mjs, .yarn/install-state.gz) should
not be committed as they contain environment-specific paths. They will be
generated during yarn install at build time.

Added .gitignore matching the pattern used in node-yarn-3 example.

* test: update snapshots

* refactor: merge the more realistic monorepo example into existing npm workspaces example

* build: ignore example claude folders

* test: snapshot update

* test: improve unit tests for node workspaces

* docs: deslop AI documentation

* test: improve turborepo example

* test: update snapshots

* test: update unit test for changed monorepo structure

* test: update snapshot

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-01-17 08:40:43 -07:00
Michael BiancoandGitHub 907047145f feat(shell): support mise package install step (#433)
* docs: misc build process documentation

from exploring how we should do secrets + variables

* test: adding explicit int truthy test case

* refactor: centralize all str => list conversion into a single method

it's a one-liner, but self-documents what we are doing better

* refactor: add helper for parsing env as list

* docs: adding todo for ugly direct getenv access

* test: railpack env var configuration options

* test: check version-less RAILPACK_PACKAGES parsing

* test: snapshot update

* feat: support install phase on shell script provider

allows for more advanced install processes

* docs: note that version-less mise packages are allowed in shell config

* docs: more shell provider examples
2026-01-17 07:47:15 -07:00
Michael BiancoandGitHub 5e3746a272 fix: handle whitespace in packageManager key (#432)
* docs: maint task list

* refactor: DRY up yarn detection logic

* fix: handle whitespace in packageManager key

this did not originate from a specific issue, but part of overall debugging of bun multi-workspace
2026-01-16 09:11:04 -07:00
Michael BiancoandGitHub 4514ee617c fix: use mise idiomatic version parsing for node (#431)
* test: make sure nvmrc and node-version are tested

* fix: remove custom parsers for nvmrc and node-version in favor of mise idiomatic parsing

* test: update snapshots

* test: removing snapshot that it doesn't look like we need anymore?

* test: update snapshot

* test: increase docker pull timeout
2026-01-16 08:55:11 -07:00
86314dc9d8 fix: avoid apt package when psycopg-binary is used (#379)
* feat: detect psycopg[binary] and skip apt packages

When using psycopg2-binary or psycopg[binary], the PostgreSQL client
libraries (libpq-dev, libpq5) are not needed because these variants
ship with pre-compiled binaries. This change:

- Adds usesBinaryPsycopg() to detect binary variants
- Updates usesPostgres() to return false when binary variants are used
- Skips libpq-dev (build) and libpq5 (runtime) apt package installation
- Adds comprehensive unit tests for binary psycopg detection

This reduces image size and build time for projects using binary variants.

* test: add psycopg[binary] integration test

Adds a dedicated test example for psycopg[binary] to verify that the
bracket syntax for optional dependencies is correctly detected. This
ensures the binary detection works for both psycopg2-binary and
psycopg[binary] variants.

Test coverage now includes:
- psycopg2-binary (existing python-system-deps example)
- psycopg[binary] (new python-psycopg-binary example)
- psycopg non-binary (existing python-latest-psycopg example)
- psycopg2 non-binary (existing python-django example)

* test: snapshot update

* test: add binary pyscogp test

* test: ensure libpq is installed for pyscog operation

* build: add helper for running the current dir tests

* test: check to make sure the libpg library is not installed when a binary postgres connection is requested

* test: update snapshot

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-01-15 11:32:30 -07:00
Michael BiancoandGitHub 6847fd2132 fix: use mise for idiomatic ruby file parsing (#429)
* fix: remove custom .ruby-version parsing

* test: assert against specific ruby 2 version

makes sure .ruby-version is properly being parsed

* test: add ruby version output to ruby server tests

* docs: some future ruby TODOs
2026-01-15 10:52:59 -07:00
0f95654ac5 fix: add dockerignore usage metadata (#351)
* feat: add dockerIgnore metadata field when .dockerignore exists

When a .dockerignore file is present and successfully parsed, the build
result metadata now includes "dockerIgnore": "true". This allows
consumers of the build plan to know whether dockerignore filtering was
applied during the build.

Changes:
- Set dockerIgnore metadata field in GenerateContext when .dockerignore exists
- Add tests to verify metadata is set correctly in both context and BuildResult
- Fix pre-existing test that fails when running as root

* refactor: move dockerIgnore metadata setting to dockerignore parsing logic

Move the responsibility of setting the dockerIgnore metadata from the
GenerateContext creation to the dockerignore parsing implementation.
This creates better separation of concerns by keeping dockerignore-
related logic in one place.

Changes:
- Add MetadataSetter interface to core/plan/dockerignore.go
- Update ParseWithLogging to accept metadata parameter and set metadata when dockerignore exists
- Update GenerateContext to pass metadata to ParseWithLogging
- Update tests to verify metadata is set during parsing
- Remove separate metadata setting logic from context creation

* refactor: simplify dockerignore metadata logic

Simplify the implementation to just check the parse results and set
metadata based on that. This removes the MetadataSetter interface and
keeps the logic straightforward - just 2 lines of code after parsing.

Also fix pre-existing tests that fail when running as root by adding
skip logic for permission-based tests.

Changes:
- Remove MetadataSetter interface from dockerignore.go
- Set dockerIgnore metadata after parsing based on parse results
- Add skip logic for permission tests that don't work as root

* refactor: remove unrelated skip logic from tests

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-01-15 10:25:42 -07:00
Michael BiancoandGitHub 25d9662825 test: add http content assertion to integration tests (#428)
* build: ignore local claude settings

* test: add httpCheck expectedOutput assertions

* test: add expectedOutput to httpCheck to assert against http response content

* test: remove expectedOutput for FE rendered content
2026-01-15 09:49:44 -07:00
Michael BiancoandGitHub 2c152cffdd docs(python): update detection logic and entry files (#427) 2026-01-15 09:16:46 -07:00
c8ba047c41 fix: use consistent node version resolution when using bun (#359)
* fix: use consistent node version resolution when bun is detected

When Bun is detected as the package manager but Node is still needed
for native module compilation (node-gyp), the Node version was always
set to "latest" instead of following the same version resolution logic
used when Node is the primary runtime.

This change extracts the Node version resolution logic into a reusable
helper function `applyNodeVersionResolution` that checks version sources
in this order:
1. NODE_VERSION environment variable
2. package.json > engines > node
3. .nvmrc file
4. .node-version file

The same logic is now consistently applied whether Node is required in
the final image or just needed during the build process for Bun projects.

Resolves the TODO comment at line 332 in the original code.

* chore: add tmp/ to .gitignore for temporary test files

* docs: document node version resolution consistency

Add comprehensive documentation explaining why consistent Node version
resolution is critical and how it works:

1. Added detailed godoc to applyNodeVersionResolution method explaining:
   - Why the method exists (to ensure consistency)
   - Why consistency matters (Bun projects, user expectations, dev/prod parity)
   - The priority order of version sources

2. Updated Node.js language documentation to:
   - Clarify the version resolution priority order
   - Add .node-version file to the list (was missing)
   - Emphasize that version resolution is consistent across all scenarios
   - Improve the Bun section to explain when Node is installed
   - Add explicit note about version specifications being respected

This documentation ensures users understand that their version
specifications (.nvmrc, package.json engines, etc.) are always
honored, regardless of whether Node is the primary runtime or just
a build-time dependency.

* Revert "chore: add tmp/ to .gitignore for temporary test files"

This reverts commit 45c5e51f57c070740f1afc0e9f391ddf6c3a6b53.

* docs: remove ai slop

* test: specify and assert against specific node version in bun project

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-01-15 07:21:42 -07:00
db4b126204 fix: support idiomatic version files when determining resolved python version (#378)
* fix: ensure idiomatic version files are detected via explicit environment variables

When mise is run with MISE_CEILING_PATHS to sandbox the environment, it
cannot read the root mise.toml which contains the
idiomatic_version_file_enable_tools setting. This caused .python-version,
.node-version, and .ruby-version files to potentially be ignored.

This fix explicitly sets MISE_IDIOMATIC_VERSION_FILE_ENABLE_TOOLS via
environment variable to ensure these version files are always detected,
regardless of whether the root mise.toml is accessible.

* chore: add tmp/ to gitignore for temporary test files

* refactor: extract idiomatic version file tools to shared constant and add test

- Create IdiomaticVersionFileTools constant in core/mise package
- Update both mise.go and mise_step_builder.go to use shared constant
- Add TestGetPackageVersionsWithIdiomaticVersionFile to test .python-version detection

Why the original tests didn't catch this:
- TestGetPackageVersions uses python-uv-tool-versions which has .tool-versions
- Mise reads .tool-versions by default without idiomatic_version_file setting
- The new test uses python-uv which has .python-version (idiomatic version file)
- This ensures idiomatic version file detection is properly tested going forward

* test: add .python-version integration test to python-pip example

- Remove unit test in favor of integration test coverage
- Add .python-version (3.11) to python-pip example
- Update app.py to print Python version
- Update test.json to assert Python 3.11 is used

This ensures .python-version files (different from default 3.13) are
properly detected and used during builds. The integration test covers
the full build pipeline, catching issues that unit tests alone would miss.

* docs: document why python-pip uses Python 3.11 for testing

Explain that .python-version is set to 3.11 (different from default 3.13)
to ensure idiomatic version file detection is properly tested.

* refactor: use specific patch version and remove unnecessary MISE_EXPERIMENTAL

- Update .python-version to 3.11.14 (specific patch version)
- Update test.json to assert full version 3.11.14
- Remove MISE_EXPERIMENTAL=1 (testing confirms it's not needed)
- Update README to reflect patch version

Using a specific patch version makes the test more precise and better
validates that the exact version from .python-version is being used.

* refactor: improve python-pip test clarity and use 3.11.11

- Change patch version to 3.11.11
- Move documentation to inline comment in .python-version
- Fix output message from "Hello from UV" to "Hello from pip"
- Remove separate README.md file

The inline comment explains why this specific version is used without
needing a separate documentation file.

* Revert "chore: add tmp/ to gitignore for temporary test files"

This reverts commit 2f767deca2ae04ee12f866182bee6c82354dbbce.

* test: remove comment from .python-version

interesting, found a mise idiomatic parsing bug

* test: update snapshots

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-01-15 07:19:18 -07:00
luo jiyinandGitHub df7bd5c4c3 fix: remove duplicate bun version file read (#412)
Signed-off-by: luojiyin <[email protected]>
2026-01-15 05:39:37 -07:00
Michael BiancoandGitHub 92481485b7 fix: support elixir projects without dependencies, test latest elixir and erlang versions (#403)
* fix: support elixir projects with no dependencies

* test: add elixir project with latest otp and elixir versions

* test: update snapshots

* fix: touch mix.lock to avoid error when no dependencies are required

* fix: exclude mkdir -p command from plan on elixir builds
2026-01-14 16:00:27 -07:00
Michael BiancoandGitHub 6419f422ef docs: note that windows is not officially support (#425) 2026-01-14 15:53:05 -07:00
Michael BiancoandGitHub a9ac4b6077 docs: misc AI typo fixes (#424) 2026-01-14 12:00:25 -07:00