Thanks for your interest in contributing to the Upjack framework.
- Python >= 3.13
- Node.js >= 18
- uv (Python package manager)
git clone https://github.com/NimbleBrainInc/upjack.git
cd upjack
# Python library
cd lib/python
uv sync --group dev
# TypeScript library
cd ../typescript
npm install
# Schema tooling
cd ../../schemas
npm install# From repo root
make checkThis validates schemas and runs both library test suites. For the full check (format, lint, typecheck, tests), run make check from within each library directory.
cd lib/python
# Run tests
make test
# Format code
make format
# Lint
make lint
# Type check
make typecheck
# All checks (format, lint, typecheck, tests)
make check| Tool | Purpose |
|---|---|
| ruff | Linting and formatting |
| ty | Type checking |
| pytest | Testing |
| uv | Package management |
Do not use black, flake8, isort, mypy, or pyright — we use ruff and ty exclusively.
cd lib/typescript
# Run tests
make test
# Format code
make format
# Lint
make lint
# Type check
make typecheck
# Build (ESM + .d.ts)
make build
# All checks (format, lint, typecheck, tests)
make check| Tool | Purpose |
|---|---|
| Biome | Linting and formatting |
| tsc | Type checking |
| vitest | Testing |
| tsup | Build (ESM + .d.ts) |
Do not use ESLint, Prettier, or Jest — we use Biome and vitest exclusively.
cd schemas
# Bundle schemas (dereference $refs)
make bundle
# Validate with AJV
make validateSchemas are JSON Schema draft 2020-12. Edit source schemas in schemas/v1/, then run make validate to verify.
Example apps demonstrate Upjack features. Each example should include:
manifest.json— Complete manifest with upjack extensionschemas/— Entity schemas usingallOfcomposition with the base entity schemaskills/— Markdown skill documentscontext.md— Domain knowledgeseed/— Initial data (optional)
When adding or modifying examples, ensure schemas validate against upjack-manifest.schema.json.
A skill is included that generates a complete, spec-compliant example app from a description:
> create me a todo app
This produces the full directory structure (manifest, schemas, skills, context, seed data, server entry point, README) and adds E2E tests to lib/tests/test_e2e.py. See skills/upjack-app-builder/SKILL.md for the full spec it follows.
- Fork the repo and create a feature branch
- Make your changes
- Run
make checkfrom the repo root — all checks must pass - Submit a PR with a clear description of what changed and why
Use concise, imperative commit messages:
Fix schema validation for singleton entities
Add recruitment pipeline example app
Update entity model to support custom ID prefixes
- Python: ruff handles formatting and linting. Run
make formatbefore committing. - JSON: 2-space indentation, trailing newline.
- Markdown: No hard line wrapping. One sentence per line is fine but not required.
Releases are automated via GitHub Actions with trusted publishers. Each library is released independently using prefixed tags.
| Library | Tag format | Example | Workflow |
|---|---|---|---|
Python (lib/python/) |
python-v{semver} |
python-v0.1.0 |
publish-python.yml |
TypeScript (lib/typescript/) |
typescript-v{semver} |
typescript-v0.1.0 |
publish-typescript.yml |
Skill (skills/) |
skill-v{semver} |
skill-v0.1.0 |
publish-skill.yml |
- Update the version in the library's manifest:
- Python:
lib/python/pyproject.toml(version) andlib/python/src/upjack/__init__.py(__version__) - TypeScript:
lib/typescript/package.json(version) - Skill:
skills/upjack-app-builder/SKILL.md(metadata.version) andskills/upjack-app-builder/version.txt
- Python:
- Update
CHANGELOG.mdwith the new version and date - Run
make checkfrom the repo root - Commit:
git commit -m "Release python-v0.X.Y"(ortypescript-v0.X.Y) - Tag and push:
git tag python-v0.X.Y git push origin main --tags
- The workflow verifies the tag version matches the manifest, runs all checks, and publishes
- Create a GitHub release with the changelog entry:
gh release create v0.X.Y --title "v0.X.Y" --notes "<changelog entry>" --target main --latest
- PyPI: Configure a trusted publisher for the
upjackproject. Set the GitHub repository toNimbleBrainInc/upjack, workflow topublish-python.yml, and environment topypi. - npm: Configure provenance for the
upjackpackage. Create a GitHub environment callednpmin the repository settings.
Open an issue on GitHub. Include:
- What you expected to happen
- What actually happened
- Steps to reproduce
- Python version and OS
By contributing, you agree that your contributions will be licensed under the Apache 2.0 license.