Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
13e3a02
ci(release): generate signed SBOM on each release
dgokeeffe May 16, 2026
3671a63
docs(legal): add Project Support / AS-IS disclaimer to README
dgokeeffe May 17, 2026
1f084a8
docs: move SBOM verification to docs/SECURITY.md, drop stale plans
mpkrass7 May 19, 2026
3fdad07
chore(deps-dev): update pytest-playwright requirement
dependabot[bot] Jun 7, 2026
64ca345
chore(deps): bump click from 8.3.3 to 8.4.1
dependabot[bot] Jun 7, 2026
574ad2f
chore(deps): bump idna from 3.16 to 3.17
dependabot[bot] Jun 7, 2026
b03d354
chore(deps): bump pydantic-core from 2.46.4 to 2.47.0
dependabot[bot] Jun 7, 2026
681d91f
chore(deps): bump actions/setup-python from 6.2.0 to 7.0.0
dependabot[bot] Jul 26, 2026
adc436b
chore(deps): bump softprops/action-gh-release from 3.0.0 to 3.0.2
dependabot[bot] Jul 26, 2026
b3d2fc4
chore(deps): bump actions/checkout from 7.0.0 to 7.0.1
dependabot[bot] Jul 26, 2026
0eb89ce
chore(deps): bump astral-sh/setup-uv from 8.1.0 to 9.0.0
dependabot[bot] Aug 2, 2026
70a3839
fix(tests): scope e2e prerequisite skip to the e2e directory
dgokeeffe Aug 5, 2026
c4b0b31
Merge PR #102
dgokeeffe Aug 5, 2026
a6cca67
Merge PR #103
dgokeeffe Aug 5, 2026
6ad8723
Merge PR #104
dgokeeffe Aug 5, 2026
2d249fb
Merge PR #105
dgokeeffe Aug 5, 2026
e1d9459
Merge PR #80
dgokeeffe Aug 5, 2026
de4f2fa
Merge PR #81
dgokeeffe Aug 5, 2026
f181567
Merge PR #83
dgokeeffe Aug 5, 2026
cacb024
Merge PR #84
dgokeeffe Aug 5, 2026
831cbcf
Merge branch 'staging-main' into pr41-merge
dgokeeffe Aug 5, 2026
2c0f843
docs: keep litellm design doc referenced by app.py/setup_opencode/set…
dgokeeffe Aug 5, 2026
71a0abd
Merge PR #41: signed SBOM on release
dgokeeffe Aug 5, 2026
4f4a9a5
Merge branch 'staging-main' into pr43-merge
dgokeeffe Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/dependency-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ jobs:
runs-on: databrickslabs-protected-runner-group
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"

- name: Install uv
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Install audit tools
run: pip install pip-audit==2.9.0
Expand Down
49 changes: 47 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@ jobs:
runs-on: databrickslabs-protected-runner-group
permissions:
contents: write
# id-token: write is required for cosign keyless signing via GitHub OIDC.
# Without it, cosign falls back to interactive auth and the workflow hangs.
id-token: write

steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0

Expand Down Expand Up @@ -111,10 +114,52 @@ jobs:
git tag -a "$TAG" -m "Release $TAG"
git push origin "$TAG"

# ----- Supply-chain provenance: SBOM + cosign keyless signature ---------
# Generates a CycloneDX SBOM from the repo (Python + npm package metadata),
# then signs it with cosign using a short-lived OIDC token from GitHub.
# Verifiers can confirm the SBOM came from this workflow at this tag via:
# cosign verify-blob --bundle coda-sbom.cdx.json.cosign.bundle \
# --certificate-identity-regexp 'https://github.com/databrickslabs/coding-agents-databricks-apps/.+' \
# --certificate-oidc-issuer https://token.actions.githubusercontent.com \
# coda-sbom.cdx.json
- name: Generate CycloneDX SBOM
uses: anchore/sbom-action@9f7302141466aa6482940f15371237e9d9f4c34a # v0.20.5
with:
path: .
format: cyclonedx-json
output-file: coda-sbom.cdx.json
# Don't auto-upload; we attach via softprops below for one consistent release.
upload-artifact: false
upload-release-assets: false

- name: Install cosign
uses: sigstore/cosign-installer@d7d6e07ee54d2049ce5cdfc7eed4d6a6ccd80f5b # v3.5.0
with:
cosign-release: v2.4.1

- name: Sign SBOM with cosign (keyless OIDC)
run: |
# --yes auto-confirms the Sigstore transparency log entry (Rekor).
# The resulting bundle contains the signature + certificate + Rekor
# inclusion proof in one self-contained file — easier for downstream
# verifiers than separate .sig/.cert files.
cosign sign-blob --yes \
--bundle coda-sbom.cdx.json.cosign.bundle \
coda-sbom.cdx.json
# Sanity check: verify what we just signed before publishing.
cosign verify-blob \
--bundle coda-sbom.cdx.json.cosign.bundle \
--certificate-identity-regexp 'https://github.com/${{ github.repository }}/.+' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
coda-sbom.cdx.json

- name: Create GitHub Release
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3
with:
tag_name: "${{ steps.version.outputs.TAG }}"
name: "${{ steps.version.outputs.TAG }}"
body: ${{ steps.notes.outputs.NOTES }}
prerelease: ${{ inputs.prerelease }}
files: |
coda-sbom.cdx.json
coda-sbom.cdx.json.cosign.bundle
6 changes: 3 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ jobs:
runs-on: databrickslabs-protected-runner-group
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"

- name: Install uv
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Run tests
run: uv run pytest tests/ -v
6 changes: 3 additions & 3 deletions .github/workflows/update-lockfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"

- name: Install uv
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Regenerate requirements.lock
run: uv pip compile requirements.txt -o requirements.lock --generate-hashes
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,22 @@

---

## 💬 Project Support

Please note that this project is provided for your exploration only and is not
formally supported by Databricks with Service Level Agreements (SLAs). It is
provided AS-IS, and we do not make any guarantees. Please do not submit a
support ticket relating to any issues arising from the use of this project.

Any issues discovered through the use of this project should be filed as GitHub
[Issues on this repository](https://github.com/databrickslabs/coding-agents-databricks-apps/issues).

See [LICENSE.md](LICENSE.md) for full terms, including the warranty disclaimer
and limitation of liability. See [NOTICE.md](NOTICE.md) for third-party software
attribution.

---

<div align="center">
<video src="https://github.com/user-attachments/assets/40405b46-532a-4f14-82e3-414cb3744684" controls width="900"></video>
</div>
Expand Down Expand Up @@ -330,6 +346,8 @@ Open [http://localhost:8000](http://localhost:8000) — type `claude`, `codex`,

Single-user app — the owner is resolved via the app's service principal and Apps API (`app.creator`), with no PAT required at deploy time. Authorization checks `X-Forwarded-Email` against `app.creator`. On first terminal session, the user pastes a short-lived PAT interactively. Tokens auto-rotate every 10 minutes (15-minute lifetime), with old tokens proactively revoked. On restart, the user re-pastes (no persistence by design).

Each GitHub Release ships a signed CycloneDX SBOM — see [docs/SECURITY.md](./docs/SECURITY.md) for verification steps.

### Gunicorn

Production uses `workers=1` (PTY state is process-local), `threads=16` (concurrent polling + WebSocket), `gthread` worker class, `timeout=60` (long-lived WebSocket connections).
Expand Down
23 changes: 23 additions & 0 deletions docs/SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Security

## Verifying release provenance

Each GitHub Release ships with:

- `coda-sbom.cdx.json` — CycloneDX SBOM of every Python + npm dependency (generated by [syft](https://github.com/anchore/syft)).
- `coda-sbom.cdx.json.cosign.bundle` — [Sigstore](https://www.sigstore.dev/) keyless signature bundle (cert + signature + Rekor inclusion proof in one file).

To verify a release came from this repo's release workflow:

```bash
TAG=v1.0.0 # the release you downloaded
gh release download "$TAG" -p 'coda-sbom.cdx.json*'

cosign verify-blob \
--bundle coda-sbom.cdx.json.cosign.bundle \
--certificate-identity-regexp 'https://github.com/databrickslabs/coding-agents-databricks-apps/.+' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
coda-sbom.cdx.json
```

Signing uses GitHub's OIDC token — no long-lived signing keys exist. The signing identity is anchored to the workflow path + tag ref, and a public transparency-log entry is recorded in Rekor.
170 changes: 0 additions & 170 deletions docs/plans/2025-02-03-bundled-skills-design.md

This file was deleted.

Loading