Manual-commit notebook snapshot extension (JupyterLab 4):
Backend
- Storage adapter layer (Local + S3 via boto3, pip extra)
- Dumb put/get/list/delete contract; key validation
- S3Storage: lazy boto3 import, S3ConnectionError with friendly
messages + connectivity check at startup
- SnapshotStore
- Strip code outputs/execution_count, MD5 on cleaned JSON
- Gzipped envelope (id/timestamp/name/description/hash/size/notebook)
- Append-only manifest.json (rebuildable from version files)
- SnapshotUnchangedError when new hash matches most recent version
- REST API (commit / list / content) under /snapshot/ namespace
- traitlets config (storage_type, local_root, s3_* + S3_* env fallback)
Frontend
- snapshot:commit command (toolbar button + command palette)
- Dialog for name + description
- SnapshotPanel (left sidebar timeline) + DiffWidget (main area)
- Cell diff: id-match first, LCS fallback; jsdiff for line diff
- Restore via model.fromJSON() + context.save() (no refresh)
- All AGENTS.md hard conventions enforced
Tests: 33 backend pytest passing (storage + store + routes)
Docs: AGENTS.md, design.md, README.md synced with implementation.
Co-Authored-By: Claude <noreply@anthropic.com>
59 lines
1.8 KiB
YAML
59 lines
1.8 KiB
YAML
name: "Step 2: Publish Release"
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
branch:
|
|
description: "The target branch"
|
|
required: false
|
|
release_url:
|
|
description: "The URL of the draft GitHub release"
|
|
required: false
|
|
steps_to_skip:
|
|
description: "Comma separated list of steps to skip"
|
|
required: false
|
|
|
|
jobs:
|
|
publish_release:
|
|
runs-on: ubuntu-latest
|
|
environment: release
|
|
permissions:
|
|
id-token: write
|
|
steps:
|
|
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
|
|
|
- uses: actions/create-github-app-token@v1
|
|
id: app-token
|
|
with:
|
|
app-id: ${{ vars.APP_ID }}
|
|
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
|
|
- name: Populate Release
|
|
id: populate-release
|
|
uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2
|
|
with:
|
|
token: ${{ steps.app-token.outputs.token }}
|
|
branch: ${{ github.event.inputs.branch }}
|
|
release_url: ${{ github.event.inputs.release_url }}
|
|
steps_to_skip: ${{ github.event.inputs.steps_to_skip }}
|
|
|
|
- name: Finalize Release
|
|
id: finalize-release
|
|
env:
|
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2
|
|
with:
|
|
token: ${{ steps.app-token.outputs.token }}
|
|
release_url: ${{ steps.populate-release.outputs.release_url }}
|
|
|
|
- name: "** Next Step **"
|
|
if: ${{ success() }}
|
|
run: |
|
|
echo "Verify the final release"
|
|
echo ${{ steps.finalize-release.outputs.release_url }}
|
|
|
|
- name: "** Failure Message **"
|
|
if: ${{ failure() }}
|
|
run: |
|
|
echo "Failed to Publish the Draft Release Url:"
|
|
echo ${{ steps.populate-release.outputs.release_url }}
|