jupyter-claude-plugin 0.1.0a1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jupyter_claude_plugin-0.1.0a1/.copier-answers.yml +16 -0
- jupyter_claude_plugin-0.1.0a1/.gitignore +137 -0
- jupyter_claude_plugin-0.1.0a1/.prettierignore +8 -0
- jupyter_claude_plugin-0.1.0a1/.yarnrc.yml +2 -0
- jupyter_claude_plugin-0.1.0a1/CHANGELOG.md +42 -0
- jupyter_claude_plugin-0.1.0a1/CONTRIBUTING.md +102 -0
- jupyter_claude_plugin-0.1.0a1/LICENSE +29 -0
- jupyter_claude_plugin-0.1.0a1/PKG-INFO +207 -0
- jupyter_claude_plugin-0.1.0a1/README.md +131 -0
- jupyter_claude_plugin-0.1.0a1/RELEASE.md +88 -0
- jupyter_claude_plugin-0.1.0a1/babel.config.js +1 -0
- jupyter_claude_plugin-0.1.0a1/conftest.py +8 -0
- jupyter_claude_plugin-0.1.0a1/docs/Architecture.md +72 -0
- jupyter_claude_plugin-0.1.0a1/docs/DECISIONS.md +232 -0
- jupyter_claude_plugin-0.1.0a1/docs/PLAN.md +176 -0
- jupyter_claude_plugin-0.1.0a1/docs/USER_GUIDE.md +352 -0
- jupyter_claude_plugin-0.1.0a1/eslint.config.mjs +68 -0
- jupyter_claude_plugin-0.1.0a1/install.json +5 -0
- jupyter_claude_plugin-0.1.0a1/jest.config.js +28 -0
- jupyter_claude_plugin-0.1.0a1/jupyter-config/server-config/jupyter_claude.json +7 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/__init__.py +16 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/_version.py +4 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/agent.py +83 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/chat_handler.py +196 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/config.py +141 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/build_log.json +740 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/package.json +168 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/schemas/@dckartasoft/jupyter-claude/package.json.orig +163 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/schemas/@dckartasoft/jupyter-claude/plugin.json +108 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/static/lib_index_js.20279de24b4acc02.js +642 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/static/lib_index_js.20279de24b4acc02.js.map +1 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/static/remoteEntry.eeee1a2475eeaf0d.js +6332 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/static/remoteEntry.eeee1a2475eeaf0d.js.map +1 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/static/style.js +4 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/static/style_index_js.4635a81209f9bc25.js +626 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/labextension/static/style_index_js.4635a81209f9bc25.js.map +1 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/mcp_discovery.py +41 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/routes.py +85 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/tests/__init__.py +1 -0
- jupyter_claude_plugin-0.1.0a1/jupyter_claude/tests/test_routes.py +17 -0
- jupyter_claude_plugin-0.1.0a1/package.json +163 -0
- jupyter_claude_plugin-0.1.0a1/pyproject.toml +111 -0
- jupyter_claude_plugin-0.1.0a1/schema/plugin.json +108 -0
- jupyter_claude_plugin-0.1.0a1/setup.py +1 -0
- jupyter_claude_plugin-0.1.0a1/src/__tests__/jupyter_claude.spec.ts +9 -0
- jupyter_claude_plugin-0.1.0a1/src/commands.ts +240 -0
- jupyter_claude_plugin-0.1.0a1/src/icons.ts +13 -0
- jupyter_claude_plugin-0.1.0a1/src/index.ts +60 -0
- jupyter_claude_plugin-0.1.0a1/src/mcpDialog.tsx +118 -0
- jupyter_claude_plugin-0.1.0a1/src/panel.tsx +220 -0
- jupyter_claude_plugin-0.1.0a1/src/request.ts +51 -0
- jupyter_claude_plugin-0.1.0a1/src/ws.ts +158 -0
- jupyter_claude_plugin-0.1.0a1/style/base.css +208 -0
- jupyter_claude_plugin-0.1.0a1/style/index.css +1 -0
- jupyter_claude_plugin-0.1.0a1/style/index.js +1 -0
- jupyter_claude_plugin-0.1.0a1/tsconfig.json +25 -0
- jupyter_claude_plugin-0.1.0a1/tsconfig.test.json +3 -0
- jupyter_claude_plugin-0.1.0a1/ui-tests/README.md +167 -0
- jupyter_claude_plugin-0.1.0a1/ui-tests/jupyter_server_test_config.py +12 -0
- jupyter_claude_plugin-0.1.0a1/ui-tests/package.json +15 -0
- jupyter_claude_plugin-0.1.0a1/ui-tests/playwright.config.js +14 -0
- jupyter_claude_plugin-0.1.0a1/ui-tests/tests/jupyter_claude.spec.ts +25 -0
- jupyter_claude_plugin-0.1.0a1/ui-tests/yarn.lock +0 -0
- jupyter_claude_plugin-0.1.0a1/yarn.lock +10440 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
|
|
2
|
+
_commit: v4.6.2
|
|
3
|
+
_src_path: https://github.com/jupyterlab/extension-template
|
|
4
|
+
advanced: false
|
|
5
|
+
author_email: david.cleminson@kartasoft.com
|
|
6
|
+
author_name: David Cleminson
|
|
7
|
+
has_ai_rules: false
|
|
8
|
+
has_binder: false
|
|
9
|
+
has_settings: true
|
|
10
|
+
kind: frontend-and-server
|
|
11
|
+
labextension_name: '@dckartasoft/jupyter-claude'
|
|
12
|
+
project_short_description: Collaborate with Claude on Jupyter notebook code and documentation
|
|
13
|
+
python_name: jupyter_claude
|
|
14
|
+
repository: https://github.com/DCKartasoft/Jupyter-Claude_Plugin
|
|
15
|
+
test: true
|
|
16
|
+
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
*.bundle.*
|
|
2
|
+
lib/
|
|
3
|
+
node_modules/
|
|
4
|
+
*.log
|
|
5
|
+
.eslintcache
|
|
6
|
+
.stylelintcache
|
|
7
|
+
*.egg-info/
|
|
8
|
+
.ipynb_checkpoints
|
|
9
|
+
*.tsbuildinfo
|
|
10
|
+
jupyter_claude/labextension
|
|
11
|
+
# Version file is handled by hatchling
|
|
12
|
+
jupyter_claude/_version.py
|
|
13
|
+
|
|
14
|
+
# Integration tests
|
|
15
|
+
ui-tests/test-results/
|
|
16
|
+
ui-tests/playwright-report/
|
|
17
|
+
|
|
18
|
+
# Created by https://www.gitignore.io/api/python
|
|
19
|
+
# Edit at https://www.gitignore.io/?templates=python
|
|
20
|
+
|
|
21
|
+
### Python ###
|
|
22
|
+
# Virtual environments
|
|
23
|
+
.venv
|
|
24
|
+
|
|
25
|
+
# Byte-compiled / optimized / DLL files
|
|
26
|
+
__pycache__/
|
|
27
|
+
*.py[cod]
|
|
28
|
+
*$py.class
|
|
29
|
+
|
|
30
|
+
# C extensions
|
|
31
|
+
*.so
|
|
32
|
+
|
|
33
|
+
# Distribution / packaging
|
|
34
|
+
.Python
|
|
35
|
+
build/
|
|
36
|
+
develop-eggs/
|
|
37
|
+
dist/
|
|
38
|
+
downloads/
|
|
39
|
+
eggs/
|
|
40
|
+
.eggs/
|
|
41
|
+
lib/
|
|
42
|
+
lib64/
|
|
43
|
+
parts/
|
|
44
|
+
sdist/
|
|
45
|
+
var/
|
|
46
|
+
wheels/
|
|
47
|
+
pip-wheel-metadata/
|
|
48
|
+
share/python-wheels/
|
|
49
|
+
.installed.cfg
|
|
50
|
+
*.egg
|
|
51
|
+
MANIFEST
|
|
52
|
+
|
|
53
|
+
# PyInstaller
|
|
54
|
+
# Usually these files are written by a python script from a template
|
|
55
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
56
|
+
*.manifest
|
|
57
|
+
*.spec
|
|
58
|
+
|
|
59
|
+
# Installer logs
|
|
60
|
+
pip-log.txt
|
|
61
|
+
pip-delete-this-directory.txt
|
|
62
|
+
|
|
63
|
+
# Unit test / coverage reports
|
|
64
|
+
htmlcov/
|
|
65
|
+
.tox/
|
|
66
|
+
.nox/
|
|
67
|
+
.coverage
|
|
68
|
+
.coverage.*
|
|
69
|
+
.cache
|
|
70
|
+
nosetests.xml
|
|
71
|
+
coverage/
|
|
72
|
+
coverage.xml
|
|
73
|
+
*.cover
|
|
74
|
+
.hypothesis/
|
|
75
|
+
.pytest_cache/
|
|
76
|
+
|
|
77
|
+
# Translations
|
|
78
|
+
*.mo
|
|
79
|
+
*.pot
|
|
80
|
+
|
|
81
|
+
# Scrapy stuff:
|
|
82
|
+
.scrapy
|
|
83
|
+
|
|
84
|
+
# Sphinx documentation
|
|
85
|
+
docs/_build/
|
|
86
|
+
|
|
87
|
+
# PyBuilder
|
|
88
|
+
target/
|
|
89
|
+
|
|
90
|
+
# pyenv
|
|
91
|
+
.python-version
|
|
92
|
+
|
|
93
|
+
# celery beat schedule file
|
|
94
|
+
celerybeat-schedule
|
|
95
|
+
|
|
96
|
+
# SageMath parsed files
|
|
97
|
+
*.sage.py
|
|
98
|
+
|
|
99
|
+
# Spyder project settings
|
|
100
|
+
.spyderproject
|
|
101
|
+
.spyproject
|
|
102
|
+
|
|
103
|
+
# Rope project settings
|
|
104
|
+
.ropeproject
|
|
105
|
+
|
|
106
|
+
# Mr Developer
|
|
107
|
+
.mr.developer.cfg
|
|
108
|
+
.project
|
|
109
|
+
.pydevproject
|
|
110
|
+
|
|
111
|
+
# mkdocs documentation
|
|
112
|
+
/site
|
|
113
|
+
|
|
114
|
+
# mypy
|
|
115
|
+
.mypy_cache/
|
|
116
|
+
.dmypy.json
|
|
117
|
+
dmypy.json
|
|
118
|
+
|
|
119
|
+
# Pyre type checker
|
|
120
|
+
.pyre/
|
|
121
|
+
|
|
122
|
+
# End of https://www.gitignore.io/api/python
|
|
123
|
+
|
|
124
|
+
# OSX files
|
|
125
|
+
.DS_Store
|
|
126
|
+
|
|
127
|
+
# Yarn cache
|
|
128
|
+
.yarn/
|
|
129
|
+
|
|
130
|
+
# Claude Code
|
|
131
|
+
.claude/scheduled_tasks.lock
|
|
132
|
+
.claude/settings.local.json
|
|
133
|
+
|
|
134
|
+
# Jupyter runtime state
|
|
135
|
+
.jupyter/
|
|
136
|
+
.jupyter_ystore.db
|
|
137
|
+
Untitled*.ipynb
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
<!-- <START NEW CHANGELOG ENTRY> -->
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
- PyPI publish prep — package renamed `jupyter-claude-plugin`, version 0.1.0a1: renamed distribution to `jupyter-claude-plugin` (internal Python package stays `jupyter_claude`); PEP 440 pre-release tag `0.1.0a1` prevents auto-install; added `claude-agent-sdk`, `jupyter-mcp-server`, `jupyter-collaboration` to `[project].dependencies`; moved project URLs from `dynamic` to explicit `[project.urls]` block; fixed wheel discovery; validated wheel installation (`jupyter_claude_plugin-0.1.0a1-py3-none-any.whl`); updated install instructions (prefer `pip install --pre jupyter-claude-plugin` over source).
|
|
8
|
+
- SageMaker deployment section added to `docs/USER_GUIDE.md`: covers JupyterLab 4 environment setup, required IAM permissions (bedrock InvokeModel + ResponseStream + ListInferenceProfiles + GetInferenceProfile), lifecycle config/terminal install script (Node 20 + Claude Code CLI + deps + extension), and SageMaker-specific gotchas (leave aws_profile empty for IAM role, ephemeral extension links in Studio, region-specific model IDs, no egress rules needed).
|
|
9
|
+
- User guide added at `docs/USER_GUIDE.md`: comprehensive install & operation manual covering requirements, dev setup, both backend paths (Anthropic + Bedrock SSO), launching, all five v1 commands, per-tier model reference, troubleshooting (including page_config.json disable gotcha), and uninstall.
|
|
10
|
+
- MCP server enumeration + runtime selector: `jupyter_claude/mcp_discovery.py` reads `~/.claude.json`, new `enabled_mcp_servers` trait with GET/POST REST endpoints at `/jupyter-claude/mcp-servers`, frontend dialog to enable/disable individual servers (default: `["jupyter"]`), MCP client restarts with fresh filter on selection change.
|
|
11
|
+
- Runtime model selector in chat panel: dropdown to switch tier (opus/sonnet/haiku) per conversation without editing config; disabled for Anthropic direct or during requests; tier selection resets conversation history.
|
|
12
|
+
- `main_model_tier` trait for speed/quality tradeoff: Sonnet 4.6 is default; Opus for max quality, Haiku for max speed; resolved model sent back in `ready` frame.
|
|
13
|
+
- Panel spinner and command-triggered busy state: animated "Claude is thinking…" indicator while processing; command flows now set busy state alongside panel updates.
|
|
14
|
+
- Full command set on notebook toolbar: all four Claude commands (Open Chat, Generate, Explain, Fix) plus MCP Servers selector now appear as icon-only toolbar buttons (ranks 60–63) with tooltips; cell toolbar keeps just Explain.
|
|
15
|
+
- Custom `claudeIcon` (blue SVG spark): new `src/icons.ts` exports an inline LabIcon showing a stylised blue 4-point spark (`#4361ee`), replacing generic `codeIcon` on sidebar tab and Open Chat button.
|
|
16
|
+
- Command dialogs use JupyterLab InputDialog instead of `window.prompt()` (browser-blocked); fixed last-error tracking by notebook ID consistency.
|
|
17
|
+
- Cell-type dropdown for Generate command: select code/markdown/raw before description; prompts adapt by type and respect no-execute for markdown/raw cells.
|
|
18
|
+
- `page_config.json` cleaned: removed stale disabled/locked extension entries that silently blocked activation.
|
|
19
|
+
- Labextension linked as symlink via `jupyter labextension develop . --overwrite` in dev workflow; clears stale bundled copies.
|
|
20
|
+
- Bedrock config expanded: added `aws_profile` trait for shared AWS SSO, plus `default_opus_model`, `default_sonnet_model`, `default_haiku_model` traits for per-tier inference-profile IDs (defaults: `us.anthropic.claude-opus-4-7`, `us.anthropic.claude-sonnet-4-6`, `us.anthropic.claude-haiku-4-5-20251001-v1:0`).
|
|
21
|
+
- Frontend cell-write path: Claude calls `mcp__jupyter__*` tools (insert_cell, insert_execute_code_cell) directly; frontend does not parse code blocks. Cleaner separation of concerns.
|
|
22
|
+
- React 18 pinned to `^18.2.0` for JupyterLab 4 type compatibility; `tsconfig.json` moduleResolution set to `bundler`.
|
|
23
|
+
- Frontend built: React chat panel with message list, WebSocket client with auto-reconnect, five v1 commands (chat, generate, explain, fix, mcp-servers), cell toolbar buttons and context menu entries.
|
|
24
|
+
- Server extension built: `ClaudeExtensionApp` with configurable backend/model/region traits, `ClaudeSDKClient` per WS connection, chat handler at `/jupyter-claude/chat`.
|
|
25
|
+
- JupyterLab extension scaffold generated via copier (frontend-and-server, package `@dckartasoft/jupyter-claude`, Python `jupyter_claude`).
|
|
26
|
+
- Fixed malformed `labextension_name` (`myextension@dc-ks/jupyter-claude` → `@dckartasoft/jupyter-claude`) across all config and code files.
|
|
27
|
+
- Root `CHANGELOG.md` is now the single changelog; `docs/CHANGELOG.md` removed.
|
|
28
|
+
- Initial commit landed (root `6e4db50`): plan, decisions, doc-keeper cron config, uv boilerplate, stub.
|
|
29
|
+
- Haiku doc-keeper cron: every 10 minutes reads `docs/DECISIONS.md` and syncs `PLAN.md`, `README.md`, `CHANGELOG.md`, `Architecture.md`.
|
|
30
|
+
- Corrected MCP server registration: `fetch` and `git` are Python packages; use `uvx` not `npx`.
|
|
31
|
+
- Plan location: dual (`~/.claude/plans/...` internal + `docs/PLAN.md` versioned).
|
|
32
|
+
- Dev environment locked to Homebrew + `uv` (no pipx); `uvx` replaces pipx for one-shot tools.
|
|
33
|
+
- Global MCP servers registered at user scope: filesystem, memory, sequential-thinking, fetch (Python), git (Python), jupyter (HTTP).
|
|
34
|
+
- Support both Anthropic direct and AWS Bedrock backends; env-var driven, inference-profile model IDs for Bedrock.
|
|
35
|
+
- MCP on both sides: plugin backend acts as MCP client; connects to `jupyter-mcp-server` for cell R/W/execute. No hand-rolled cell tools.
|
|
36
|
+
- Target: JupyterLab frontend-and-server extension (not classic + magics); richest UX with sidebar chat, cell toolbar, context menus.
|
|
37
|
+
- Four v1 interactions: chat about notebook, generate cell, explain/document cell, fix last error.
|
|
38
|
+
- Project initialized (2026-07-07).
|
|
39
|
+
|
|
40
|
+
_This changelog is maintained by an automated doc-keeper — it re-writes from [docs/DECISIONS.md](docs/DECISIONS.md) every 10 minutes._
|
|
41
|
+
|
|
42
|
+
<!-- <END NEW CHANGELOG ENTRY> -->
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Development install
|
|
4
|
+
|
|
5
|
+
Note: You will need Node.js to build the extension package.
|
|
6
|
+
You may install it from [nodejs.org](https://nodejs.org/en/download). We
|
|
7
|
+
recommend using the latest LTS version of Node.js.
|
|
8
|
+
|
|
9
|
+
The `jlpm` command is JupyterLab's pinned version of
|
|
10
|
+
[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use
|
|
11
|
+
`yarn` or `npm` in lieu of `jlpm` below.
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Clone the repo to your local environment
|
|
15
|
+
# Change directory to the jupyter_claude directory
|
|
16
|
+
|
|
17
|
+
# Set up a virtual environment and install package in development mode
|
|
18
|
+
python -m venv .venv
|
|
19
|
+
source .venv/bin/activate
|
|
20
|
+
pip install --editable ".[dev,test]"
|
|
21
|
+
|
|
22
|
+
# Link your development version of the extension with JupyterLab
|
|
23
|
+
jupyter-builder develop . --overwrite
|
|
24
|
+
# Server extension must be manually installed in develop mode
|
|
25
|
+
jupyter server extension enable jupyter_claude
|
|
26
|
+
|
|
27
|
+
# Rebuild extension Typescript source after making changes
|
|
28
|
+
# IMPORTANT: Unlike the steps above which are performed only once, do this step
|
|
29
|
+
# every time you make a change.
|
|
30
|
+
jlpm build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension.
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Watch the source directory in one terminal, automatically rebuilding when needed
|
|
37
|
+
jlpm watch
|
|
38
|
+
# Run JupyterLab in another terminal
|
|
39
|
+
jupyter lab
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
With the watch command running, every saved change will immediately be built locally and available in your running JupyterLab. Refresh JupyterLab to load the change in your browser (you may need to wait several seconds for the extension to be rebuilt).
|
|
43
|
+
|
|
44
|
+
By default, the `jlpm build` command generates the source maps for this extension to make it easier to debug using the browser dev tools. To also generate source maps for the JupyterLab core extensions, you can run the following command:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
jupyter lab build --minimize=False
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Development uninstall
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Server extension must be manually disabled in develop mode
|
|
54
|
+
jupyter server extension disable jupyter_claude
|
|
55
|
+
pip uninstall jupyter_claude
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
In development mode, you will also need to remove the symlink created by `jupyter-builder develop`
|
|
59
|
+
command. To find its location, you can run `jupyter labextension list` to figure out where the `labextensions`
|
|
60
|
+
folder is located. Then you can remove the symlink named `@dckartasoft/jupyter-claude` within that folder.
|
|
61
|
+
|
|
62
|
+
## Testing the extension
|
|
63
|
+
|
|
64
|
+
### Server tests
|
|
65
|
+
|
|
66
|
+
This extension is using [Pytest](https://docs.pytest.org/) for Python code testing.
|
|
67
|
+
|
|
68
|
+
Install test dependencies (needed only once):
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
pip install -e ".[test]"
|
|
72
|
+
# Each time you install the Python package, you need to restore the front-end extension link
|
|
73
|
+
jupyter-builder develop . --overwrite
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
To execute them, run:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
pytest -vv -r ap --cov jupyter_claude
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
#### Frontend tests
|
|
83
|
+
|
|
84
|
+
This extension is using [Jest](https://jestjs.io/) for JavaScript code testing.
|
|
85
|
+
|
|
86
|
+
To execute them, execute:
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
jlpm
|
|
90
|
+
jlpm test
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Integration tests
|
|
94
|
+
|
|
95
|
+
This extension uses [Playwright](https://playwright.dev/docs/intro) for the integration tests (aka user level tests).
|
|
96
|
+
More precisely, the JupyterLab helper [Galata](https://github.com/jupyterlab/jupyterlab/tree/master/galata) is used to handle testing the extension in JupyterLab.
|
|
97
|
+
|
|
98
|
+
More information is provided within the [ui-tests](./ui-tests/README.md) README.
|
|
99
|
+
|
|
100
|
+
## Packaging the extension
|
|
101
|
+
|
|
102
|
+
See [RELEASE](RELEASE.md)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, David Cleminson
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
17
|
+
contributors may be used to endorse or promote products derived from
|
|
18
|
+
this software without specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
24
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
26
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
27
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
28
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: jupyter-claude-plugin
|
|
3
|
+
Version: 0.1.0a1
|
|
4
|
+
Summary: Collaborate with Claude on Jupyter notebook code and documentation
|
|
5
|
+
Project-URL: Homepage, https://github.com/DCKartasoft/Jupyter-Claude_Plugin
|
|
6
|
+
Project-URL: Documentation, https://github.com/DCKartasoft/Jupyter-Claude_Plugin/blob/main/docs/USER_GUIDE.md
|
|
7
|
+
Project-URL: Repository, https://github.com/DCKartasoft/Jupyter-Claude_Plugin
|
|
8
|
+
Project-URL: Issues, https://github.com/DCKartasoft/Jupyter-Claude_Plugin/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/DCKartasoft/Jupyter-Claude_Plugin/blob/main/CHANGELOG.md
|
|
10
|
+
Author-email: David Cleminson <david.cleminson@kartasoft.com>
|
|
11
|
+
License: BSD 3-Clause License
|
|
12
|
+
|
|
13
|
+
Copyright (c) 2026, David Cleminson
|
|
14
|
+
All rights reserved.
|
|
15
|
+
|
|
16
|
+
Redistribution and use in source and binary forms, with or without
|
|
17
|
+
modification, are permitted provided that the following conditions are met:
|
|
18
|
+
|
|
19
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
20
|
+
list of conditions and the following disclaimer.
|
|
21
|
+
|
|
22
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
23
|
+
this list of conditions and the following disclaimer in the documentation
|
|
24
|
+
and/or other materials provided with the distribution.
|
|
25
|
+
|
|
26
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
27
|
+
contributors may be used to endorse or promote products derived from
|
|
28
|
+
this software without specific prior written permission.
|
|
29
|
+
|
|
30
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
31
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
32
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
33
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
34
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
35
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
36
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
37
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
38
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
39
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
40
|
+
License-File: LICENSE
|
|
41
|
+
Keywords: ai,anthropic,bedrock,claude,jupyter,jupyterlab,jupyterlab-extension,llm
|
|
42
|
+
Classifier: Development Status :: 3 - Alpha
|
|
43
|
+
Classifier: Framework :: Jupyter
|
|
44
|
+
Classifier: Framework :: Jupyter :: JupyterLab
|
|
45
|
+
Classifier: Framework :: Jupyter :: JupyterLab :: 4
|
|
46
|
+
Classifier: Framework :: Jupyter :: JupyterLab :: Extensions
|
|
47
|
+
Classifier: Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt
|
|
48
|
+
Classifier: Intended Audience :: Developers
|
|
49
|
+
Classifier: Intended Audience :: Science/Research
|
|
50
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
51
|
+
Classifier: Operating System :: OS Independent
|
|
52
|
+
Classifier: Programming Language :: Python
|
|
53
|
+
Classifier: Programming Language :: Python :: 3
|
|
54
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
55
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
56
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
57
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
58
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
59
|
+
Classifier: Topic :: Scientific/Engineering
|
|
60
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
61
|
+
Requires-Python: >=3.10
|
|
62
|
+
Requires-Dist: claude-agent-sdk>=0.1
|
|
63
|
+
Requires-Dist: jupyter-collaboration>=2.0
|
|
64
|
+
Requires-Dist: jupyter-mcp-server>=1.0
|
|
65
|
+
Requires-Dist: jupyter-server<3,>=2.4.0
|
|
66
|
+
Provides-Extra: dev
|
|
67
|
+
Requires-Dist: jupyter-builder>=1.0.0; extra == 'dev'
|
|
68
|
+
Requires-Dist: jupyterlab>=4; extra == 'dev'
|
|
69
|
+
Provides-Extra: test
|
|
70
|
+
Requires-Dist: coverage; extra == 'test'
|
|
71
|
+
Requires-Dist: pytest; extra == 'test'
|
|
72
|
+
Requires-Dist: pytest-asyncio; extra == 'test'
|
|
73
|
+
Requires-Dist: pytest-cov; extra == 'test'
|
|
74
|
+
Requires-Dist: pytest-jupyter[server]>=0.6.0; extra == 'test'
|
|
75
|
+
Description-Content-Type: text/markdown
|
|
76
|
+
|
|
77
|
+
# Jupyter Claude Plugin
|
|
78
|
+
|
|
79
|
+
A JupyterLab extension enabling collaborative development between users and Claude. Chat about your notebook, generate cells from prompts, explain and document existing code, and fix errors — all within JupyterLab.
|
|
80
|
+
|
|
81
|
+
> **Status:** early development, scaffold phase complete. See [docs/PLAN.md](docs/PLAN.md) for the implementation plan and [docs/DECISIONS.md](docs/DECISIONS.md) for the decision log.
|
|
82
|
+
|
|
83
|
+
## Features (v1)
|
|
84
|
+
|
|
85
|
+
- **Chat about the notebook** — ask Claude to analyze, summarize, or answer questions about your entire notebook
|
|
86
|
+
- **Generate a cell** — describe what you want; choose cell type (code/markdown/raw); Claude generates and inserts it
|
|
87
|
+
- **Explain a cell** — Claude documents an existing cell with a markdown explanation
|
|
88
|
+
- **Fix last error** — Claude sees the error from your last cell run and offers a corrected version
|
|
89
|
+
- **Runtime tier selector** — switch between opus/sonnet/haiku in the chat panel for quality/speed tradeoffs (Bedrock only)
|
|
90
|
+
- **MCP server management** — enable/disable individual MCP servers from `~/.claude.json` per session via dialog command (defaults to Jupyter only for faster startup)
|
|
91
|
+
- **Notebook toolbar buttons** — all five commands as icons in toolbar: Open Chat, Generate cell, Explain cell, Fix last error, and MCP server selector
|
|
92
|
+
- **Visual feedback** — animated "Claude is thinking…" spinner while processing; disabled tier selector during requests
|
|
93
|
+
|
|
94
|
+
## Requirements
|
|
95
|
+
|
|
96
|
+
- JupyterLab >= 4.0.0
|
|
97
|
+
- Node >= 20
|
|
98
|
+
- Python >= 3.10 (this project targets 3.13)
|
|
99
|
+
- `uv` package manager (via Homebrew: `brew install uv`)
|
|
100
|
+
|
|
101
|
+
## Install (from PyPI, recommended)
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
pip install --pre jupyter-claude-plugin
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`--pre` is required for alpha releases. Runtime dependencies (`claude-agent-sdk`, `jupyter-mcp-server`, `jupyter-collaboration`) are pulled in automatically. See [docs/USER_GUIDE.md](docs/USER_GUIDE.md) for backend configuration and usage.
|
|
108
|
+
|
|
109
|
+
## Development install (from source)
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
cd /path/to/Jupyter-Claude_Plugin
|
|
113
|
+
uv venv
|
|
114
|
+
source .venv/bin/activate
|
|
115
|
+
|
|
116
|
+
jlpm install
|
|
117
|
+
uv pip install -e ".[dev,test]"
|
|
118
|
+
jlpm build
|
|
119
|
+
jupyter labextension develop . --overwrite
|
|
120
|
+
jupyter server extension enable jupyter_claude
|
|
121
|
+
|
|
122
|
+
jupyter lab
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Global MCP servers (user scope, one-time)
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
claude mcp add --scope user filesystem -- npx -y @modelcontextprotocol/server-filesystem $HOME
|
|
129
|
+
claude mcp add --scope user memory -- npx -y @modelcontextprotocol/server-memory
|
|
130
|
+
claude mcp add --scope user sequential-thinking -- npx -y @modelcontextprotocol/server-sequential-thinking
|
|
131
|
+
claude mcp add --scope user fetch -- uvx mcp-server-fetch
|
|
132
|
+
claude mcp add --scope user git -- uvx mcp-server-git
|
|
133
|
+
claude mcp add --scope user jupyter --transport http http://localhost:8888/mcp
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Backend
|
|
137
|
+
|
|
138
|
+
The extension supports two Claude backends. Pick one in the JupyterLab Settings Editor (or via `jupyter_server_config.py`) — everything else is derived from that choice.
|
|
139
|
+
|
|
140
|
+
### Anthropic direct
|
|
141
|
+
|
|
142
|
+
Set `ANTHROPIC_API_KEY` in the environment before launching Jupyter. The extension will use the `model` trait (default `claude-opus-4-8`).
|
|
143
|
+
|
|
144
|
+
### AWS Bedrock via shared SSO
|
|
145
|
+
|
|
146
|
+
Configuration lives in the extension traits (not shell env — the extension writes the right vars into the Claude Agent SDK subprocess itself):
|
|
147
|
+
|
|
148
|
+
- `backend = "bedrock"`
|
|
149
|
+
- `aws_region = "us-east-1"` (or your region)
|
|
150
|
+
- `aws_profile = "<your profile>"` — a named profile from `~/.aws/config` (enables shared AWS SSO; profile and region are forwarded to the SDK subprocess)
|
|
151
|
+
- `default_opus_model`, `default_sonnet_model`, `default_haiku_model` — inference-profile model IDs (defaults: `us.anthropic.claude-opus-4-7`, `us.anthropic.claude-sonnet-4-6`, `us.anthropic.claude-haiku-4-5-20251001-v1:0`)
|
|
152
|
+
|
|
153
|
+
Refresh your SSO session and start Jupyter with `aws-vault` so the subprocess inherits temporary STS credentials without leaking them to disk:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
aws sso login --profile <your profile> # once per session
|
|
157
|
+
aws-vault exec <your profile> -- jupyter lab
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
If you prefer not to use `aws-vault`, `AWS_PROFILE=<name> AWS_REGION=<region> jupyter lab` also works — the extension forwards those to the SDK.
|
|
161
|
+
|
|
162
|
+
See [docs/PLAN.md](docs/PLAN.md) for design details.
|
|
163
|
+
|
|
164
|
+
## Architecture
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
JupyterLab (browser)
|
|
168
|
+
└─ Frontend extension (TS/React)
|
|
169
|
+
├─ Right-side chat panel
|
|
170
|
+
├─ Cell toolbar buttons
|
|
171
|
+
└─ Context-menu items
|
|
172
|
+
↓ WebSocket
|
|
173
|
+
Server extension (Python)
|
|
174
|
+
└─ ClaudeSDKClient
|
|
175
|
+
├─ Anthropic API | AWS Bedrock
|
|
176
|
+
└─ Jupyter MCP server (same process)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Claude reads/writes/executes cells via MCP tools; the extension provides no custom cell tools.
|
|
180
|
+
|
|
181
|
+
## Troubleshoot
|
|
182
|
+
|
|
183
|
+
If the frontend extension is not working, check that the server extension is enabled:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
jupyter server extension list
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
If the server extension is installed and enabled but the frontend is not showing up, check that the frontend extension is installed:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
jupyter labextension list
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Documentation
|
|
196
|
+
|
|
197
|
+
- **[docs/USER_GUIDE.md](docs/USER_GUIDE.md) — install & operation guide (start here)**
|
|
198
|
+
- [docs/PLAN.md](docs/PLAN.md) — step-by-step implementation roadmap
|
|
199
|
+
- [docs/DECISIONS.md](docs/DECISIONS.md) — decision log and rationale
|
|
200
|
+
- [docs/Architecture.md](docs/Architecture.md) — component diagram and data flow
|
|
201
|
+
- [CHANGELOG.md](CHANGELOG.md) — human-readable milestone log
|
|
202
|
+
|
|
203
|
+
## Contributing
|
|
204
|
+
|
|
205
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
206
|
+
|
|
207
|
+
_This README is maintained by an automated doc-keeper — it re-writes from [docs/DECISIONS.md](docs/DECISIONS.md) every 10 minutes._
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Jupyter Claude Plugin
|
|
2
|
+
|
|
3
|
+
A JupyterLab extension enabling collaborative development between users and Claude. Chat about your notebook, generate cells from prompts, explain and document existing code, and fix errors — all within JupyterLab.
|
|
4
|
+
|
|
5
|
+
> **Status:** early development, scaffold phase complete. See [docs/PLAN.md](docs/PLAN.md) for the implementation plan and [docs/DECISIONS.md](docs/DECISIONS.md) for the decision log.
|
|
6
|
+
|
|
7
|
+
## Features (v1)
|
|
8
|
+
|
|
9
|
+
- **Chat about the notebook** — ask Claude to analyze, summarize, or answer questions about your entire notebook
|
|
10
|
+
- **Generate a cell** — describe what you want; choose cell type (code/markdown/raw); Claude generates and inserts it
|
|
11
|
+
- **Explain a cell** — Claude documents an existing cell with a markdown explanation
|
|
12
|
+
- **Fix last error** — Claude sees the error from your last cell run and offers a corrected version
|
|
13
|
+
- **Runtime tier selector** — switch between opus/sonnet/haiku in the chat panel for quality/speed tradeoffs (Bedrock only)
|
|
14
|
+
- **MCP server management** — enable/disable individual MCP servers from `~/.claude.json` per session via dialog command (defaults to Jupyter only for faster startup)
|
|
15
|
+
- **Notebook toolbar buttons** — all five commands as icons in toolbar: Open Chat, Generate cell, Explain cell, Fix last error, and MCP server selector
|
|
16
|
+
- **Visual feedback** — animated "Claude is thinking…" spinner while processing; disabled tier selector during requests
|
|
17
|
+
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
- JupyterLab >= 4.0.0
|
|
21
|
+
- Node >= 20
|
|
22
|
+
- Python >= 3.10 (this project targets 3.13)
|
|
23
|
+
- `uv` package manager (via Homebrew: `brew install uv`)
|
|
24
|
+
|
|
25
|
+
## Install (from PyPI, recommended)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install --pre jupyter-claude-plugin
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`--pre` is required for alpha releases. Runtime dependencies (`claude-agent-sdk`, `jupyter-mcp-server`, `jupyter-collaboration`) are pulled in automatically. See [docs/USER_GUIDE.md](docs/USER_GUIDE.md) for backend configuration and usage.
|
|
32
|
+
|
|
33
|
+
## Development install (from source)
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cd /path/to/Jupyter-Claude_Plugin
|
|
37
|
+
uv venv
|
|
38
|
+
source .venv/bin/activate
|
|
39
|
+
|
|
40
|
+
jlpm install
|
|
41
|
+
uv pip install -e ".[dev,test]"
|
|
42
|
+
jlpm build
|
|
43
|
+
jupyter labextension develop . --overwrite
|
|
44
|
+
jupyter server extension enable jupyter_claude
|
|
45
|
+
|
|
46
|
+
jupyter lab
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Global MCP servers (user scope, one-time)
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
claude mcp add --scope user filesystem -- npx -y @modelcontextprotocol/server-filesystem $HOME
|
|
53
|
+
claude mcp add --scope user memory -- npx -y @modelcontextprotocol/server-memory
|
|
54
|
+
claude mcp add --scope user sequential-thinking -- npx -y @modelcontextprotocol/server-sequential-thinking
|
|
55
|
+
claude mcp add --scope user fetch -- uvx mcp-server-fetch
|
|
56
|
+
claude mcp add --scope user git -- uvx mcp-server-git
|
|
57
|
+
claude mcp add --scope user jupyter --transport http http://localhost:8888/mcp
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Backend
|
|
61
|
+
|
|
62
|
+
The extension supports two Claude backends. Pick one in the JupyterLab Settings Editor (or via `jupyter_server_config.py`) — everything else is derived from that choice.
|
|
63
|
+
|
|
64
|
+
### Anthropic direct
|
|
65
|
+
|
|
66
|
+
Set `ANTHROPIC_API_KEY` in the environment before launching Jupyter. The extension will use the `model` trait (default `claude-opus-4-8`).
|
|
67
|
+
|
|
68
|
+
### AWS Bedrock via shared SSO
|
|
69
|
+
|
|
70
|
+
Configuration lives in the extension traits (not shell env — the extension writes the right vars into the Claude Agent SDK subprocess itself):
|
|
71
|
+
|
|
72
|
+
- `backend = "bedrock"`
|
|
73
|
+
- `aws_region = "us-east-1"` (or your region)
|
|
74
|
+
- `aws_profile = "<your profile>"` — a named profile from `~/.aws/config` (enables shared AWS SSO; profile and region are forwarded to the SDK subprocess)
|
|
75
|
+
- `default_opus_model`, `default_sonnet_model`, `default_haiku_model` — inference-profile model IDs (defaults: `us.anthropic.claude-opus-4-7`, `us.anthropic.claude-sonnet-4-6`, `us.anthropic.claude-haiku-4-5-20251001-v1:0`)
|
|
76
|
+
|
|
77
|
+
Refresh your SSO session and start Jupyter with `aws-vault` so the subprocess inherits temporary STS credentials without leaking them to disk:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
aws sso login --profile <your profile> # once per session
|
|
81
|
+
aws-vault exec <your profile> -- jupyter lab
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
If you prefer not to use `aws-vault`, `AWS_PROFILE=<name> AWS_REGION=<region> jupyter lab` also works — the extension forwards those to the SDK.
|
|
85
|
+
|
|
86
|
+
See [docs/PLAN.md](docs/PLAN.md) for design details.
|
|
87
|
+
|
|
88
|
+
## Architecture
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
JupyterLab (browser)
|
|
92
|
+
└─ Frontend extension (TS/React)
|
|
93
|
+
├─ Right-side chat panel
|
|
94
|
+
├─ Cell toolbar buttons
|
|
95
|
+
└─ Context-menu items
|
|
96
|
+
↓ WebSocket
|
|
97
|
+
Server extension (Python)
|
|
98
|
+
└─ ClaudeSDKClient
|
|
99
|
+
├─ Anthropic API | AWS Bedrock
|
|
100
|
+
└─ Jupyter MCP server (same process)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Claude reads/writes/executes cells via MCP tools; the extension provides no custom cell tools.
|
|
104
|
+
|
|
105
|
+
## Troubleshoot
|
|
106
|
+
|
|
107
|
+
If the frontend extension is not working, check that the server extension is enabled:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
jupyter server extension list
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
If the server extension is installed and enabled but the frontend is not showing up, check that the frontend extension is installed:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
jupyter labextension list
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Documentation
|
|
120
|
+
|
|
121
|
+
- **[docs/USER_GUIDE.md](docs/USER_GUIDE.md) — install & operation guide (start here)**
|
|
122
|
+
- [docs/PLAN.md](docs/PLAN.md) — step-by-step implementation roadmap
|
|
123
|
+
- [docs/DECISIONS.md](docs/DECISIONS.md) — decision log and rationale
|
|
124
|
+
- [docs/Architecture.md](docs/Architecture.md) — component diagram and data flow
|
|
125
|
+
- [CHANGELOG.md](CHANGELOG.md) — human-readable milestone log
|
|
126
|
+
|
|
127
|
+
## Contributing
|
|
128
|
+
|
|
129
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
130
|
+
|
|
131
|
+
_This README is maintained by an automated doc-keeper — it re-writes from [docs/DECISIONS.md](docs/DECISIONS.md) every 10 minutes._
|