This project uses a small trunk-based workflow, GitHub Actions CI, and Docker images published to GitHub Container Registry.
.github/workflows/ci.yml runs on pull requests and pushes to main.
The node job runs:
npm ci
npm run typecheck
npm run typecheck:all
npm run build
npm testThe docker job builds the image on pull requests. On pushes to main, it also publishes these moving tags:
ghcr.io/sousekd/llm-context-loader:edgeghcr.io/sousekd/llm-context-loader:main
Use :edge or :main for staging or for testing unreleased changes.
mainis the long-lived branch and is always deployable.- Short-lived
feat/<topic>,fix/<topic>, orchore/<topic>branches are optional. - Direct push to
mainis acceptable for this repository when appropriate. - Let a pull request's
nodeanddockerchecks finish before merging. A squash merge deletes the head branch, which cancels any of its still-running checks.
Releases use SemVer with a v git tag prefix, such as v0.1.1 or v0.2.0-rc.1.
Do not edit package.json version by hand and do not create tags with git tag. Use npm version, which updates package.json, creates a version commit, and creates the matching v* tag in a single atomic step.
npm version patch # 0.1.0 -> 0.1.1
npm version minor # 0.1.0 -> 0.2.0
npm version major # 0.1.0 -> 1.0.0
npm version 0.2.0-rc.1 # explicit pre-release
git push --follow-tagsWhile the project is in 0.x.y, breaking changes may ship in a minor release, but the release notes should make that clear.
npm version runs the preversion script first, which invokes npm run typecheck:all && npm run build && npm test. A failing local suite aborts the version bump before the commit or tag is created, so a broken tree can never be tagged.
- Working tree is clean and current commit is pushed.
- CI is green on
main. - Commits since the previous tag follow Conventional Commits — the release notes are generated from them.
.github/workflows/release.yml runs when a v*.*.* tag is pushed. It re-runs the Node typecheck, build, and tests; builds the Docker image; pushes image tags computed by docker/metadata-action; and creates a GitHub Release with auto-generated notes from the commits since the last tag.
| Tag | Published when | Stability |
|---|---|---|
:X.Y.Z |
Stable vX.Y.Z tag |
Immutable release pin. |
:X.Y |
Stable vX.Y.Z tag |
Moving latest patch in a minor series. |
:latest |
Stable vX.Y.Z tag |
Moving latest stable release. |
:X.Y.Z-rc.N |
Pre-release tag | Immutable pre-release pin. |
:edge, :main |
Push to main after CI passes |
Moving unreleased build. |
Pre-release tags do not move :latest or a stable minor-series tag (docker/metadata-action is configured with enable=${{ !contains(github.ref_name, '-') }} for both).
compose.yaml is for local builds from the current checkout. compose.deploy.yaml is for server deployment with the published GHCR image. Both files read .env through Docker Compose variable interpolation, expose port 3010 by default, set every supported environment variable, and mount ./templates into the container read-only.
First-time install, update, and rollback are the same three commands — only the LLMC_IMAGE_TAG value changes:
cp .env.example .env
# edit .env for provider URLs, model, keys, and LLMC_IMAGE_TAG (e.g. 0.1.0, 0.1.1, edge)
docker compose -f compose.deploy.yaml pull
docker compose -f compose.deploy.yaml up -d- Install / update: pin
LLMC_IMAGE_TAGto a newer immutable release such as0.1.1. - Roll back: pin
LLMC_IMAGE_TAGto the previous immutable release such as0.1.0. - Staging on every push to
main: pinLLMC_IMAGE_TAG=edgeand repeatpull+up -dwhenever you want to take the latest build.
compose.deploy.yaml uses pull_policy: missing, so Docker only fetches an image the first time it sees a tag locally. Immutable pins such as :0.1.0 never need a refresh. Moving tags such as :latest, :0.1, :edge, and :main only update when you explicitly run docker compose -f compose.deploy.yaml pull before up -d.
After upgrades, docker image prune -f removes the now-unused previous image layers.