pack-template do the rest: lint, typecheck, test, Helm lint, manifest validation, release tag, publish. This page walks through the inherited pipeline and explains what lands where.
The flow
Open a PR
The
ci.yml workflow runs: typecheck, lint, test, helm lint, and a check that khal-app.json exists. All four must pass before merge.Merge to `main`
The
release.yml workflow runs on push: main. It:- Reads the version from
package/package.json. - Tags
v${VERSION}and pushes the tag. - Creates a GitHub Release with auto-generated notes from commits since the previous tag.
Publish
The frontend npm package publishes to GitHub Packages as
@khal-os/pack-<name>. If your pack has a backend, the Docker image publishes to ghcr.io/khal-os/pack-<name>-service and the Helm chart to oci://ghcr.io/khal-os/charts/pack-<name>.Install
A customer admin installs the published version through their platform’s install flow. See Customer install.
You never SSH into a cluster. You never run
kubectl apply. You never push a Docker image by hand. Your job ends at “merge the PR”. The rest is CI.Inherited workflows
Every pack scaffolded frompack-template ships these workflows in .github/workflows/:
| Workflow | Trigger | Does |
|---|---|---|
ci.yml | PR to dev or main | Typecheck, lint, test, Helm lint, manifest validation. |
ci-guards.yml | PR | Secret scanning (gitleaks), CLAUDE.md presence check, CODEOWNERS check. |
release.yml | Push to main | Tag + GitHub Release + version-driven publish. |
Versioning
Pack versions live inpackage/package.json and are the single source of truth. Bump the version field in the same PR that merits a release, and release.yml will tag + release automatically on merge.
What a merge does not do
- Does not deploy to a customer’s instance. Customers pull new pack versions through their own platform flow.
- Does not guarantee your new pack version is the default. Customers may pin to earlier versions.
- Does not invalidate existing users’ sessions in the shell.
What’s next
Customer install
How a customer admin consumes your published pack.
Local dev and testing
Test before you push.