Skip to content

PackC GitHub Action

The PackC GitHub Action enables teams to compile prompt packs and publish them to OCI-compliant registries directly from CI/CD pipelines.

The action:

  • Downloads and caches PackC and ORAS binaries automatically
  • Compiles prompt configurations into distributable packs
  • Publishes packs to any OCI-compliant registry (GHCR, Docker Hub, etc.)
  • Supports artifact signing with Cosign for supply chain security
  • Outputs structured results for downstream workflow steps
name: Build and Publish Pack
on:
push:
branches: [main]
release:
types: [published]
jobs:
build-pack:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build and publish pack
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
registry: ghcr.io
repository: ${{ github.repository }}/prompts
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
version: ${{ github.ref_name }}

InputDescriptionRequiredDefault
config-filePath to Arena YAML configuration fileYes-
pack-idUnique identifier for the packNoDerived from config
versionPack version for publishingNolatest
packc-versionPackC binary versionNolatest
outputOutput file path for compiled packNo{pack-id}.pack.json
validateRun validation after compileNotrue
registryOCI registry URL (e.g., ghcr.io)No-
repositoryRepository path within registryNo-
usernameRegistry usernameNo-
passwordRegistry password/tokenNo-
signSign with CosignNofalse
cosign-keyCosign private key (path or content)No-
cosign-passwordCosign key passwordNo-
working-directoryWorking directoryNo.

OutputDescription
pack-filePath to compiled pack file
pack-idPack identifier
promptsNumber of prompts in pack
toolsNumber of tools in pack
registry-urlFull OCI registry URL (if published)
digestOCI content digest (if published)
signatureCosign signature reference (if signed)

Compile a pack without publishing:

- name: Build pack
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
pack-id: my-prompts
- name: Upload pack artifact
uses: actions/upload-artifact@v4
with:
name: prompt-pack
path: my-prompts.pack.json
- name: Build and publish pack
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
registry: ghcr.io
repository: ${{ github.repository }}/prompts
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
version: ${{ github.sha }}

Use release tags for versioning:

name: Publish Pack
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Publish pack
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
registry: ghcr.io
repository: ${{ github.repository }}/prompts
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
version: ${{ github.event.release.tag_name }}

Add supply chain security with artifact signing:

- name: Build, publish, and sign
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
registry: ghcr.io
repository: ${{ github.repository }}/prompts
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
version: v1.0.0
sign: 'true'
cosign-key: ${{ secrets.COSIGN_PRIVATE_KEY }}
cosign-password: ${{ secrets.COSIGN_PASSWORD }}
- name: Publish to Docker Hub
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
registry: docker.io
repository: myorg/prompt-packs
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
version: latest
- name: Build pack
id: packc
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
registry: ghcr.io
repository: ${{ github.repository }}/prompts
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Summary
run: |
echo "## Pack Published" >> $GITHUB_STEP_SUMMARY
echo "- Pack ID: ${{ steps.packc.outputs.pack-id }}" >> $GITHUB_STEP_SUMMARY
echo "- Prompts: ${{ steps.packc.outputs.prompts }}" >> $GITHUB_STEP_SUMMARY
echo "- Tools: ${{ steps.packc.outputs.tools }}" >> $GITHUB_STEP_SUMMARY
echo "- Registry: ${{ steps.packc.outputs.registry-url }}" >> $GITHUB_STEP_SUMMARY
echo "- Digest: ${{ steps.packc.outputs.digest }}" >> $GITHUB_STEP_SUMMARY

Run from a specific directory:

- name: Build pack
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
working-directory: packages/customer-support
- name: Build pack with custom output
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
output: dist/prompts.pack.json
pack-id: my-pack

Packs are published with the custom media type:

application/vnd.promptkit.pack.v1+json

This allows OCI-compliant tools to identify and handle prompt packs appropriately.


username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

Requires packages: write permission in your workflow:

permissions:
packages: write
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

Create an access token at: https://hub.docker.com/settings/security

Use the AWS ECR login action first:

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Login to ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build and publish
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
registry: ${{ steps.login-ecr.outputs.registry }}
repository: prompt-packs
version: ${{ github.sha }}

The action supports signing artifacts with Cosign for supply chain security.

Terminal window
cosign generate-key-pair
# Creates cosign.key (private) and cosign.pub (public)
  1. Add COSIGN_PRIVATE_KEY (contents of cosign.key)
  2. Add COSIGN_PASSWORD (key password)
Terminal window
cosign verify --key cosign.pub ghcr.io/myorg/prompts:v1.0.0

The action uses GitHub’s tool cache to store downloaded binaries:

  • PackC binary (from PromptKit releases)
  • ORAS CLI (for OCI publishing)
  • Cosign (for signing, when enabled)

Cache keys:

  • packc-{version}-{platform}-{arch}
  • oras-{version}-{platform}-{arch}
  • cosign-{version}-{platform}-{arch}

PlatformArchitectureStatus
Linuxx64✅ Supported
Linuxarm64✅ Supported
macOSx64✅ Supported
macOSarm64✅ Supported
Windowsx64✅ Supported
Windowsarm64✅ Supported

Ensure proper permissions and secrets:

permissions:
contents: read
packages: write
jobs:
build:
steps:
- name: Publish pack
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
# ...
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

Ensure config-file path is relative to working-directory:

- uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml # Not packages/my-pack/config.arena.yaml
working-directory: packages/my-pack

Pack validation may show warnings for non-critical issues. The action continues unless validation fails completely.

- uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
with:
config-file: config.arena.yaml
validate: 'false' # Skip validation if needed

Check registry connectivity and authentication:

Terminal window
# Test manually
oras login ghcr.io -u $GITHUB_ACTOR
oras push ghcr.io/myorg/test:latest ./test.json

The action is released alongside PromptKit and uses the same version numbers:

ReferenceDescription
@v1.0.0Specific version (recommended for reproducibility)
@v1Latest v1.x.x release (auto-updated)
@mainDevelopment branch (may be unstable)

Example references:

# Specific version (most stable)
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1.0.0
# Major version (gets patch updates automatically)
uses: AltairaLabs/PromptKit/.github/actions/packc-action@v1
# Latest development (not recommended for production)
uses: AltairaLabs/PromptKit/.github/actions/packc-action@main


The action source code is located at:

.github/actions/packc-action/
├── action.yml # Action metadata
├── src/ # TypeScript source
├── dist/ # Compiled bundle
└── README.md # Quick reference

To modify the action:

Terminal window
cd .github/actions/packc-action
npm install
npm run lint
npm run test
npm run build

Last Updated: January 2026