notebook-intelligence 4.8.0__tar.gz → 5.0.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.
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/.gitignore +10 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/CHANGELOG.md +68 -1
- notebook_intelligence-5.0.0a1/CONTRIBUTING.md +202 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/PKG-INFO +66 -19
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/README.md +57 -15
- notebook_intelligence-5.0.0a1/docs/admin-guide.md +713 -0
- notebook_intelligence-5.0.0a1/docs/admin-tour-config.md +180 -0
- notebook_intelligence-5.0.0a1/docs/skills.md +121 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/docs/troubleshooting.md +6 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/jest.config.js +5 -1
- notebook_intelligence-5.0.0a1/notebook_intelligence/_claude_cli.py +173 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/_version.py +1 -1
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/ai_service_manager.py +28 -4
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/base_chat_participant.py +1 -1
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/built_in_toolsets.py +60 -50
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/claude.py +268 -53
- notebook_intelligence-5.0.0a1/notebook_intelligence/claude_mcp_manager.py +350 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/claude_sessions.py +161 -103
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/config.py +38 -7
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/extension.py +1192 -68
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/feature_flags.py +10 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/github_copilot.py +136 -6
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/package.json +10 -3
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/schemas/@notebook-intelligence/notebook-intelligence/package.json.orig +9 -2
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/schemas/@notebook-intelligence/notebook-intelligence/plugin.json +8 -1
- notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/830.eecfb0cd62e605cbbd1e.js → notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/537.68c5c50a288e5b270e48.js +1 -1
- notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/313.d3668bf2674eafcf4573.js → notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/694.d0b052d80c0397c7f1ea.js +1 -1
- notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/728.016ac7669136de5c3c2a.js +1 -0
- notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/745.54aab870383fe1bf44c8.js → notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/745.91853ba797812144d939.js +2 -2
- notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/784.df0a6747fa83ae63d0cc.js +1 -0
- notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/editor.worker.js +1407 -0
- notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/remoteEntry.0be495f71cbab93a657d.js +1 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/third-party-licenses.json +10 -4
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +34 -10
- notebook_intelligence-5.0.0a1/notebook_intelligence/mcp_client.py +152 -0
- notebook_intelligence-5.0.0a1/notebook_intelligence/mcp_config_validation.py +218 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/mcp_manager.py +6 -3
- notebook_intelligence-5.0.0a1/notebook_intelligence/plugin_manager.py +595 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/skill_github_import.py +32 -29
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/skill_manager.py +115 -2
- notebook_intelligence-5.0.0a1/notebook_intelligence/skill_manifest.py +342 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/skill_reconciler.py +93 -49
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/skillset.py +24 -1
- notebook_intelligence-5.0.0a1/notebook_intelligence/tour_config.py +337 -0
- notebook_intelligence-5.0.0a1/notebook_intelligence/util.py +538 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/package.json +9 -2
- notebook_intelligence-5.0.0a1/pyproject.toml +139 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/schema/plugin.json +8 -1
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/conftest.py +34 -1
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_ai_service_manager_integration.py +100 -2
- notebook_intelligence-5.0.0a1/tests/test_builtin_toolset_cwd_sandbox.py +202 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_cell_output_features_response.py +9 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_claude_client.py +98 -0
- notebook_intelligence-5.0.0a1/tests/test_claude_mcp_manager.py +790 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_claude_sessions.py +317 -12
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_claude_sessions_handler.py +80 -11
- notebook_intelligence-5.0.0a1/tests/test_claude_system_prompt.py +118 -0
- notebook_intelligence-5.0.0a1/tests/test_claude_tool_humanizer.py +68 -0
- notebook_intelligence-5.0.0a1/tests/test_claude_tool_path_sandbox.py +319 -0
- notebook_intelligence-5.0.0a1/tests/test_coding_agent_launchers.py +129 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_config_atomic_save.py +35 -0
- notebook_intelligence-5.0.0a1/tests/test_config_integration.py +375 -0
- notebook_intelligence-5.0.0a1/tests/test_file_upload.py +301 -0
- notebook_intelligence-5.0.0a1/tests/test_github_copilot_llm_provider.py +166 -0
- notebook_intelligence-5.0.0a1/tests/test_github_copilot_user_data_mode.py +72 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_image_context.py +100 -0
- notebook_intelligence-5.0.0a1/tests/test_mcp_client_shim.py +302 -0
- notebook_intelligence-5.0.0a1/tests/test_mcp_config_validation.py +315 -0
- notebook_intelligence-5.0.0a1/tests/test_plugin_manager.py +1243 -0
- notebook_intelligence-5.0.0a1/tests/test_policy_gate.py +294 -0
- notebook_intelligence-5.0.0a1/tests/test_redact_process_secrets.py +207 -0
- notebook_intelligence-5.0.0a1/tests/test_response_emitter.py +83 -0
- notebook_intelligence-5.0.0a1/tests/test_safe_anchor_uri.py +132 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_skill_github_import.py +129 -20
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_skill_manager.py +262 -0
- notebook_intelligence-5.0.0a1/tests/test_skill_manifest.py +502 -0
- notebook_intelligence-5.0.0a1/tests/test_skill_reconciler.py +775 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_skills_handlers.py +442 -0
- notebook_intelligence-5.0.0a1/tests/test_tour_config.py +584 -0
- notebook_intelligence-5.0.0a1/tests/test_websocket_handler_integration.py +775 -0
- notebook_intelligence-5.0.0a1/tests/test_ws_callback_handler_leak.py +126 -0
- notebook_intelligence-5.0.0a1/tests/test_ws_handler_auth.py +105 -0
- notebook_intelligence-5.0.0a1/tests/ts/__mocks__/jupyterlab-apputils.ts +12 -0
- notebook_intelligence-5.0.0a1/tests/ts/__mocks__/jupyterlab-filebrowser.ts +9 -0
- notebook_intelligence-5.0.0a1/tests/ts/ask-user-question.test.tsx +168 -0
- notebook_intelligence-5.0.0a1/tests/ts/chat-progress-feedback.test.ts +76 -0
- notebook_intelligence-5.0.0a1/tests/ts/checkbox.test.tsx +76 -0
- notebook_intelligence-5.0.0a1/tests/ts/choose-workspace-directory.test.ts +89 -0
- notebook_intelligence-5.0.0a1/tests/ts/claude-mcp-paste.test.ts +198 -0
- notebook_intelligence-5.0.0a1/tests/ts/coding-agent-launchers.test.ts +77 -0
- notebook_intelligence-5.0.0a1/tests/ts/launcher-picker.test.tsx +73 -0
- notebook_intelligence-5.0.0a1/tests/ts/open-file-refresh-watcher.test.ts +523 -0
- notebook_intelligence-5.0.0a1/tests/ts/plugins-panel.test.tsx +303 -0
- notebook_intelligence-5.0.0a1/tests/ts/setup.ts +23 -0
- notebook_intelligence-5.0.0a1/tests/ts/skill-wire-format.test.ts +84 -0
- notebook_intelligence-5.0.0a1/tests/ts/task-target-notebook.test.ts +99 -0
- notebook_intelligence-5.0.0a1/tests/ts/terminal-drag.test.ts +183 -0
- notebook_intelligence-5.0.0a1/tests/ts/tour-config.test.ts +193 -0
- notebook_intelligence-5.0.0a1/tests/ts/tour-events.test.ts +40 -0
- notebook_intelligence-5.0.0a1/tests/ts/tour-overlay.test.tsx +422 -0
- notebook_intelligence-5.0.0a1/tests/ts/tour-state.test.ts +55 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/utils.test.ts +102 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tsconfig.json +1 -1
- notebook_intelligence-5.0.0a1/ui-tests/.eslintrc.js +12 -0
- notebook_intelligence-5.0.0a1/ui-tests/README.md +73 -0
- notebook_intelligence-5.0.0a1/ui-tests/jupyter_server_test_config.py +26 -0
- notebook_intelligence-5.0.0a1/ui-tests/package.json +17 -0
- notebook_intelligence-5.0.0a1/ui-tests/playwright.config.ts +55 -0
- notebook_intelligence-5.0.0a1/ui-tests/tests/cell-output.spec.ts +85 -0
- notebook_intelligence-5.0.0a1/ui-tests/tests/chat-sidebar.spec.ts +149 -0
- notebook_intelligence-5.0.0a1/ui-tests/tests/claude-mcp-patch.spec.ts +88 -0
- notebook_intelligence-5.0.0a1/ui-tests/tests/extension.spec.ts +36 -0
- notebook_intelligence-5.0.0a1/ui-tests/tests/helpers.ts +35 -0
- notebook_intelligence-5.0.0a1/ui-tests/tests/launcher.spec.ts +89 -0
- notebook_intelligence-5.0.0a1/ui-tests/tests/notebook-toolbar.spec.ts +123 -0
- notebook_intelligence-5.0.0a1/ui-tests/tsconfig.json +11 -0
- notebook_intelligence-5.0.0a1/ui-tests/yarn.lock +5540 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/yarn.lock +132 -61
- notebook_intelligence-4.8.0/CONTRIBUTING.md +0 -135
- notebook_intelligence-4.8.0/docs/admin-guide.md +0 -508
- notebook_intelligence-4.8.0/docs/skills.md +0 -80
- notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/694.3bcf1107fa397004be17.js +0 -1
- notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/728.c436df7c2664f4cf8e16.js +0 -1
- notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
- notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/remoteEntry.64319537c5af580d82c4.js +0 -1
- notebook_intelligence-4.8.0/notebook_intelligence/skill_manifest.py +0 -193
- notebook_intelligence-4.8.0/notebook_intelligence/util.py +0 -117
- notebook_intelligence-4.8.0/pyproject.toml +0 -90
- notebook_intelligence-4.8.0/tests/test_config_integration.py +0 -166
- notebook_intelligence-4.8.0/tests/test_file_upload.py +0 -143
- notebook_intelligence-4.8.0/tests/test_skill_manifest.py +0 -195
- notebook_intelligence-4.8.0/tests/test_skill_reconciler.py +0 -394
- notebook_intelligence-4.8.0/tests/test_websocket_handler_integration.py +0 -266
- notebook_intelligence-4.8.0/tests/ts/setup.ts +0 -13
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/.copier-answers.yml +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/.prettierignore +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/.yarnrc.yml +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/LICENSE +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/PRIVACY.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/RELEASE.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/SECURITY.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/docs/rulesets.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/install.json +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/jupyter-config/server-config/notebook_intelligence.json +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/__init__.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/api.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/cell_output.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/context_factory.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/196.db3f5562c0372c6e07f6.js +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/327.fe6b84491254fcaf64bf.js +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/327.fe6b84491254fcaf64bf.js.LICENSE.txt +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/631.a549782dde8c94a5612d.js +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/671.1797d409270b24758991.js +0 -0
- /notebook_intelligence-4.8.0/notebook_intelligence/labextension/static/745.54aab870383fe1bf44c8.js.LICENSE.txt → /notebook_intelligence-5.0.0a1/notebook_intelligence/labextension/static/745.91853ba797812144d939.js.LICENSE.txt +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/977.7e3d66ffc344a0af7a4e.js +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/be02dcbf2787b0b29ec8.module.wasm +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/e589c9ba04e3e5a90081.module.wasm +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/labextension/static/style.js +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/prompts.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/rule_injector.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/rule_manager.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/notebook_intelligence/ruleset.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/setup.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/fixtures/rules/01-test-global.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/fixtures/rules/02-test-security.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/fixtures/rules/03-invalid-rule.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_api_hygiene.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_base_chat_participant_integration.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_cell_output.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_claude_models.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_context_factory.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_end_to_end_rule_integration.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_feature_flags.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_feedback.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_mcp_manager.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_models.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_rule_auto_reload.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_rule_injector.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_rule_manager.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/test_skill_fetch_redirects.py +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/__mocks__/svg.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/__mocks__/tiktoken.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/cell-output-bundle.test.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/cell-output-features.test.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/cell-output-toolbar.test.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/mcp-util.test.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/notebook-generation.test.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/tsconfig.json +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/tests/ts/workspace-skips.test.ts +0 -0
- {notebook_intelligence-4.8.0 → notebook_intelligence-5.0.0a1}/webpack.config.js +0 -0
|
@@ -122,12 +122,22 @@ dmypy.json
|
|
|
122
122
|
|
|
123
123
|
# End of https://www.gitignore.io/api/python
|
|
124
124
|
|
|
125
|
+
# Galata / Playwright UI tests
|
|
126
|
+
ui-tests/test-results/
|
|
127
|
+
ui-tests/playwright-report/
|
|
128
|
+
ui-tests/.cache/
|
|
129
|
+
ui-tests/.tsbuild/
|
|
130
|
+
|
|
125
131
|
# OSX files
|
|
126
132
|
.DS_Store
|
|
127
133
|
|
|
128
134
|
# Yarn cache
|
|
129
135
|
.yarn/
|
|
130
136
|
|
|
137
|
+
# Local AI assistant config and runtime state
|
|
138
|
+
.codex/
|
|
139
|
+
.claude/scheduled_tasks.lock
|
|
140
|
+
|
|
131
141
|
# gh-pages
|
|
132
142
|
_site/
|
|
133
143
|
Gemfile.lock
|
|
@@ -8,6 +8,72 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
|
|
|
8
8
|
|
|
9
9
|
<!-- <START NEW CHANGELOG ENTRY> -->
|
|
10
10
|
|
|
11
|
+
## [Unreleased]
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **Skills as a top-level Settings tab** (#224). Promoted from a Claude-mode sub-tab; the tab is now visible in any mode, with a hint banner when Claude mode is off. New admin policy `skills_management_policy` (env `NBI_SKILLS_MANAGEMENT_POLICY`); `force-off` hides the tab, returns HTTP 403 from every `/notebook-intelligence/skills/*` route, and suppresses the managed-skills reconciler.
|
|
16
|
+
- **Claude MCP Servers tab** (#225) for managing the user, project, and local-scope MCP entries Claude Code reads from `~/.claude.json` and `<project>/.mcp.json`. Independent of the existing NBI MCP tab; the two never appear at the same time. New admin policy `claude_mcp_management_policy` (env `NBI_CLAUDE_MCP_MANAGEMENT_POLICY`).
|
|
17
|
+
- **Claude Plugins tab** (#226) wrapping `claude plugin` for install / uninstall / enable / disable / marketplace add. New admin policies `claude_plugins_management_policy` (env `NBI_CLAUDE_PLUGINS_MANAGEMENT_POLICY`) and `allow_github_plugin_import` (env `NBI_ALLOW_GITHUB_PLUGIN_IMPORT`), the latter mirroring the existing `allow_github_skill_import` knob for marketplace sources.
|
|
18
|
+
- **GitHub auth for plugin marketplace add**. Marketplace sources that resolve as GitHub URLs or `owner/repo` shorthand reuse Skills' `GITHUB_TOKEN` / `GH_TOKEN` / `gh auth token` precedence; tokens are injected into the `claude plugin marketplace add` subprocess via env, never argv.
|
|
19
|
+
- **Launcher tiles for opencode, Pi, and GitHub Copilot CLI** (#268), with a follow-on for **OpenAI Codex**. Each tile appears when the corresponding binary is on `PATH` and opens a Jupyter terminal at the file-browser's current directory. CLI path overrides: `NBI_OPENCODE_CLI_PATH`, `NBI_PI_CLI_PATH`, `NBI_GITHUB_COPILOT_CLI_PATH`, `NBI_CODEX_CLI_PATH`. The capabilities response gains matching `*_cli_available` booleans.
|
|
20
|
+
- **Claude Code launcher tile is no longer gated by Claude chat mode** (#239); it appears whenever the `claude` CLI is on `PATH`.
|
|
21
|
+
- **Dynamic GitHub Copilot model discovery** (#269). NBI now queries `https://api.githubcopilot.com/models` on each Copilot token refresh and the chat-model dropdown rebuilds from the live response, falling back to a hardcoded list on transient failure.
|
|
22
|
+
- **Newer GitHub Copilot chat models** added to the fallback list (#255).
|
|
23
|
+
- **Skill GitHub archive cap raised to 100 MB**, configurable (#257). New traitlet `skill_max_archive_mb` (env `NBI_SKILL_MAX_ARCHIVE_MB`); `0` disables the cap.
|
|
24
|
+
- **`additional_skipped_workspace_directories` accepted in NBI `config.json`** (#241), layered additively on top of the existing traitlet, env, and env-prefix layers so a per-user override can extend (rather than replace) the org-wide list.
|
|
25
|
+
- **Real progress feedback during long Claude tasks** (#254). The chat sidebar shows an elapsed-time counter, a heartbeat-driven pulse with a "may be slow" copy flip after 30 seconds, and inline tool-call narration.
|
|
26
|
+
- **"New chat session" button** in the chat sidebar header restarts the Claude SDK client, mirroring the `/clear` slash command (#246).
|
|
27
|
+
- **Terminal drag-drop file attach** with `@`-mention or shell-escaped raw modes and a per-terminal toolbar toggle (#256). New admin policy `NBI_TERMINAL_DRAG_DROP_POLICY`; tunables `NBI_UPLOAD_MAX_MB` (default `50`) and `NBI_UPLOAD_RETENTION_HOURS` (default `24`) govern the shared upload-staging endpoint used by both terminal drops and chat-sidebar attachments.
|
|
28
|
+
- **Hover preview for image context thumbnails** in the chat sidebar (#267).
|
|
29
|
+
- **First-run tour of the chat sidebar**. Highlights the gear, file-attach button, chat-mode dropdown, and (when available) the Claude session history icon so new users can discover the popovers and mode picker without scrolling the README. Replays from the command palette via "Show NBI tour"; capability-aware so steps for unavailable CLIs are skipped.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- Settings tabs are now an ARIA tablist with arrow-key navigation (#206).
|
|
34
|
+
- Accessibility pass across the chat sidebar and popovers covering keyboard and screen-reader behavior (#205).
|
|
35
|
+
- Chat-input footer icons reworded for clarity; the gear button gains a `title` attribute (#271).
|
|
36
|
+
- Cell-tool descriptions mention zero-based indexing so models pick the right cell (#265).
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- Websocket writes from worker threads no longer raise `BufferError` after `/clear` or "new chat" on Python 3.13+ (#270). All emitter writes now route through `tornado.IOLoop.call_soon_threadsafe`.
|
|
41
|
+
- Cell tools follow the active notebook when the user switches tabs (#253).
|
|
42
|
+
- `is_connected()` stabilized against the Claude worker-spawn resurrection race (#250).
|
|
43
|
+
- Persisted Claude model now displays after a JupyterLab restart (#244).
|
|
44
|
+
- `/clear` no longer duplicated in the `@`-mention autocomplete (#243).
|
|
45
|
+
- `@`-mention picker refreshes when workspace files change (#251) and closes on Escape from the search input (#266).
|
|
46
|
+
- Notebook-toolbar prompt textarea focuses when the popover opens (#240); the update button works outside Claude mode (#238).
|
|
47
|
+
- Inline chat anchors to the cursor line (#191).
|
|
48
|
+
- Disabled send button is styled neutrally instead of as a primary action (#276); Claude tool-result check renders on the right of its label (#277).
|
|
49
|
+
- Plugin Settings row shows the plugin name even when the CLI returns only `id` (#280).
|
|
50
|
+
|
|
51
|
+
### Internal
|
|
52
|
+
|
|
53
|
+
- CVE-driven dependency upgrades (#197); `react-icons` bumped to `~5.6.0` (#245).
|
|
54
|
+
- Galata-based Playwright UI test suite scaffolded (#207) and expanded with user-flow specs covering the chat sidebar, notebook toolbar, cell outputs, and the launcher (#272).
|
|
55
|
+
- Contributor docs cover the traitlet vs env var vs config-file decision (#242).
|
|
56
|
+
|
|
57
|
+
<!-- <END NEW CHANGELOG ENTRY> -->
|
|
58
|
+
|
|
59
|
+
## [4.8.0] - 2026-05-11
|
|
60
|
+
|
|
61
|
+
### Added
|
|
62
|
+
|
|
63
|
+
- **`allow_github_skill_import` traitlet** (env `NBI_ALLOW_GITHUB_SKILL_IMPORT`) gating user-initiated skill imports from GitHub independently of the managed-skills reconciler (#222). When `False`, the **Import from GitHub** button hides and `/skills/import` returns HTTP 403.
|
|
64
|
+
- **Workspace picker honors `.gitignore`** and gains the `additional_skipped_workspace_directories` traitlet (env `NBI_ADDITIONAL_SKIPPED_WORKSPACE_DIRECTORIES`, layered additively) for extending the built-in skip list (#223). Dot-prefixed files are also skipped by default (#221).
|
|
65
|
+
- Workspace file scan in the `@`-mention picker now runs in parallel (#227).
|
|
66
|
+
|
|
67
|
+
### Changed
|
|
68
|
+
|
|
69
|
+
- Skill imports from GitHub block and scope HTTP redirects, including refusing HTTPS-to-HTTP downgrades (#203).
|
|
70
|
+
- Settings tab content scrolls correctly when its body is taller than the dialog (#228); the tab bar styling is standardized across tabs.
|
|
71
|
+
|
|
72
|
+
### Fixed
|
|
73
|
+
|
|
74
|
+
- `NBIConfig.save()` is atomic (#202): symlinks are preserved, file mode is preserved across the swap, and the rename is parent-dir fsynced. Prevents the corrupt-config failure mode where a crash mid-write left an empty `config.json`.
|
|
75
|
+
- The NBI notebook toolbar is disabled outside Claude mode where its buttons did not work (#228); a stray new-notebook button was removed.
|
|
76
|
+
|
|
11
77
|
## [4.7.0] — 2026-05-07
|
|
12
78
|
|
|
13
79
|
### Added
|
|
@@ -181,7 +247,8 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
|
|
|
181
247
|
- Settings UI restructured around Claude vs default mode.
|
|
182
248
|
- WebSocket connection reliability improvements.
|
|
183
249
|
|
|
184
|
-
[unreleased]: https://github.com/notebook-intelligence/notebook-intelligence/compare/v4.
|
|
250
|
+
[unreleased]: https://github.com/notebook-intelligence/notebook-intelligence/compare/v4.8.0...HEAD
|
|
251
|
+
[4.8.0]: https://github.com/notebook-intelligence/notebook-intelligence/compare/v4.7.0...v4.8.0
|
|
185
252
|
[4.7.0]: https://github.com/notebook-intelligence/notebook-intelligence/compare/v4.6.0...v4.7.0
|
|
186
253
|
[4.6.0]: https://github.com/notebook-intelligence/notebook-intelligence/compare/v4.5.0...v4.6.0
|
|
187
254
|
[4.5.0]: https://github.com/notebook-intelligence/notebook-intelligence/compare/v4.4.0...v4.5.0
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for considering a contribution to Notebook Intelligence!
|
|
4
|
+
|
|
5
|
+
> **Just want to use NBI?** You don't need to read this file. `pip install notebook-intelligence` and the [README](README.md) quick start are all you need.
|
|
6
|
+
|
|
7
|
+
## Filing a good bug report
|
|
8
|
+
|
|
9
|
+
Include the following so we can reproduce the issue:
|
|
10
|
+
|
|
11
|
+
- **NBI version** — output of `pip show notebook-intelligence`.
|
|
12
|
+
- **JupyterLab version** — output of `jupyter --version`.
|
|
13
|
+
- **Python version and OS** — `python --version`; macOS, Linux, or Windows plus version.
|
|
14
|
+
- **Browser** — Chrome, Firefox, or Safari plus version, if the issue is in the chat sidebar or settings UI.
|
|
15
|
+
- **LLM provider** — GitHub Copilot, OpenAI-compatible, LiteLLM-compatible, Ollama, or Claude mode, plus the model name.
|
|
16
|
+
- **Claude mode** — on or off.
|
|
17
|
+
- **Reproduction steps** — minimum sequence of clicks and messages.
|
|
18
|
+
- **Logs** — relevant excerpts from the JupyterLab terminal (server-side errors), the browser DevTools console (frontend errors), and any redacted contents of `~/.jupyter/nbi/config.json` if the issue is configuration-related.
|
|
19
|
+
|
|
20
|
+
See [`docs/troubleshooting.md`](docs/troubleshooting.md) for common problems with copy-pasteable fixes — check there first.
|
|
21
|
+
|
|
22
|
+
## Reporting a security issue
|
|
23
|
+
|
|
24
|
+
Do not open a public GitHub issue. See [SECURITY.md](SECURITY.md) for the private-disclosure address.
|
|
25
|
+
|
|
26
|
+
## Architecture overview
|
|
27
|
+
|
|
28
|
+
NBI has two halves:
|
|
29
|
+
|
|
30
|
+
- **Server extension** — Python package `notebook_intelligence/`. Runs inside Jupyter Server. Key entry points:
|
|
31
|
+
- `notebook_intelligence/extension.py` — tornado handlers, traitlets, route registration, server lifecycle.
|
|
32
|
+
- `notebook_intelligence/ai_service_manager.py` — composes LLM providers, MCP, skills, and rules into the request pipeline.
|
|
33
|
+
- `notebook_intelligence/llm_providers/` — provider adapters (GitHub Copilot, OpenAI-compatible, LiteLLM-compatible, Ollama).
|
|
34
|
+
- `notebook_intelligence/claude.py` + `notebook_intelligence/claude_sessions.py` — Claude Code integration via [`claude-agent-sdk`](https://pypi.org/project/claude-agent-sdk/).
|
|
35
|
+
- `notebook_intelligence/mcp_manager.py` — MCP server management via [`fastmcp`](https://pypi.org/project/fastmcp/).
|
|
36
|
+
- `notebook_intelligence/skill_manager.py`, `skill_github_import.py`, `skill_manifest.py`, `skill_reconciler.py`, `skillset.py` — Claude Skills storage, GitHub import, and managed-manifest reconciliation.
|
|
37
|
+
- `notebook_intelligence/rule_manager.py`, `rule_injector.py`, `ruleset.py` — ruleset discovery and prompt injection.
|
|
38
|
+
- `notebook_intelligence/built_in_toolsets.py` — built-in tool implementations (`nbi-notebook-edit`, `nbi-command-execute`, etc.).
|
|
39
|
+
- `notebook_intelligence/github_copilot.py` — GitHub Copilot device-flow auth and token storage.
|
|
40
|
+
- **Frontend extension** — TypeScript package `src/`. Compiled to a JupyterLab labextension. Key entry points:
|
|
41
|
+
- `src/index.ts` — JupyterLab plugin registration.
|
|
42
|
+
- `src/chat-sidebar.tsx` — chat sidebar React tree.
|
|
43
|
+
- `src/components/settings-panel.tsx` — settings dialog.
|
|
44
|
+
- `src/components/skills-panel.tsx` — Claude Skills management UI.
|
|
45
|
+
- `src/api.ts` — high-level client for the server extension (chat WebSocket, capabilities, config).
|
|
46
|
+
- `src/handler.ts` — thin wrapper over Jupyter's `ServerConnection.makeRequest`.
|
|
47
|
+
|
|
48
|
+
The two halves communicate over the routes registered in `extension.py` (REST and WebSocket). All routes live under `/notebook-intelligence/`. See [`docs/admin-guide.md`](docs/admin-guide.md#http-api-surface) for the full list.
|
|
49
|
+
|
|
50
|
+
## Configuration mechanisms
|
|
51
|
+
|
|
52
|
+
NBI has three places a setting can be configured: a Python traitlet, an `NBI_*` environment variable, and an NBI config file (the Settings dialog is a friendly editor for the user-scope copy of the config file). They look similar but they exist for different audiences, and they override each other in a specific order.
|
|
53
|
+
|
|
54
|
+
Before adding a new knob at all, ask whether you actually need one. Hardcoded defaults are the simplest thing that works, and settings nobody ever changes shouldn't be settings — most candidates fail this gate.
|
|
55
|
+
|
|
56
|
+
### Who decides the value?
|
|
57
|
+
|
|
58
|
+
There are three audiences, and the audience picks the mechanism.
|
|
59
|
+
|
|
60
|
+
**The end user, via the Settings dialog.** They change their own preference and want it to stick across restarts without touching files. Examples: `default_chat_mode`, `store_github_access_token`.
|
|
61
|
+
|
|
62
|
+
→ Add a getter on `NBIConfig` (which reads `~/.jupyter/nbi/config.json`), surface the value in `/capabilities`, and add a control in `src/components/settings-panel.tsx`. Writes persist immediately.
|
|
63
|
+
|
|
64
|
+
**A server admin who runs `jupyter lab` directly.** They set an org-wide baseline in `jupyter_server_config.py` — typical for local installs and dev images. Examples: `disabled_providers`, `*_management_policy`.
|
|
65
|
+
|
|
66
|
+
→ Declare a traitlet on `NotebookIntelligence` in `extension.py`. The `help=` text shows up in `jupyter` CLI output and in generated config templates.
|
|
67
|
+
|
|
68
|
+
**A deployment admin running JupyterHub / KubeSpawner.** They need the same setting to vary by pod without rebuilding the container image. Editing Python at spawn time is awkward; env vars are how Kubernetes-style deployments wire per-pod policy. Examples: `NBI_ALLOW_GITHUB_SKILL_IMPORT`, `NBI_*_POLICY`.
|
|
69
|
+
|
|
70
|
+
→ Pair the traitlet with an `NBI_*` env var resolved at server startup. Use one of the fail-loud helpers in `extension.py`: `_resolve_bool_with_env`, `_resolve_policy_with_env`, or `_resolve_csv_appended`. A typo in the env var must surface at server startup, not silently fall through to the default — that's how deployment-admin debugging spirals into half-day investigations.
|
|
71
|
+
|
|
72
|
+
#### Rule: admin-policy flags must ship with an env var pair
|
|
73
|
+
|
|
74
|
+
If the setting is an admin-policy flag, the env var pairing isn't optional. A flag counts as an admin-policy flag when all three are true:
|
|
75
|
+
|
|
76
|
+
- Small shape: boolean, policy enum (e.g. `force-on` / `force-off` / `user-choice`), or short string-list.
|
|
77
|
+
- An admin (not the user) decides the value.
|
|
78
|
+
- The intent is to enforce, allow, or block a behavior.
|
|
79
|
+
|
|
80
|
+
`allow_github_skill_import` and every `*_management_policy` qualify. Numeric tuning knobs (`skills_manifest_interval`, `inline_completion_debouncer_delay`) don't — they aren't enforcement. Nested configs (`mcp_server_settings`, `claude_settings`) don't either — they're too big for a single env var and live in user `config.json` anyway.
|
|
81
|
+
|
|
82
|
+
The rule exists because every prior PR that shipped a policy traitlet without an env var pair got a follow-up adding the env var: deployment admins always need per-pod variance for policy flags. Doing the pair once is cheaper than doing it twice.
|
|
83
|
+
|
|
84
|
+
### How values override each other
|
|
85
|
+
|
|
86
|
+
When more than one source supplies the same value, NBI resolves them in this order (top wins):
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
1. NBI_* environment variable
|
|
90
|
+
2. user ~/.jupyter/nbi/config.json
|
|
91
|
+
3. env-prefix <env>/share/jupyter/nbi/config.json
|
|
92
|
+
4. traitlet in jupyter_server_config.py
|
|
93
|
+
5. hardcoded default
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The mental model: items 2–5 are a chain of _defaults_, each more specific than the last (a default for everyone → installs → users → "what this user picked"). The env var is different — it's not a default, it's _policy enforcement_. A deployment admin sets an env var when they want to force a value regardless of what the user chose. That's why it sits on top of the user's own preference.
|
|
97
|
+
|
|
98
|
+
Worked example: a user unchecks "Store GitHub access token" in the Settings dialog. The toggle persists to user `config.json` and the value sticks across restarts — until an admin sets `NBI_STORE_GITHUB_ACCESS_TOKEN_POLICY=force-on` on the pod. After the next server restart, the user's `config.json` still says "off" but the value NBI uses is "on" — the env var wins.
|
|
99
|
+
|
|
100
|
+
That's the trap to know about: **if you expose a Settings-dialog control for a value that also has an admin override path, the user can see their save "stick" in the UI in-session and watch it silently revert on restart.** Two ways to avoid it:
|
|
101
|
+
|
|
102
|
+
1. **Don't put it in the dialog at all.** If admins are supposed to enforce the value, the user shouldn't be able to toggle it via the UI. Manual `config.json` editing is fine for niche admin-overridable knobs (issue #232 is an example).
|
|
103
|
+
2. **Use the policy triad and `settingLocks`.** For admin-enforceable settings, follow `*_management_policy`: the admin picks `force-on`, `force-off`, or `user-choice`. When the admin forces a value, the frontend's `settingLocks` shows a lock icon and disables the control — the user can see their choice is overridden rather than fighting an invisible policy.
|
|
104
|
+
|
|
105
|
+
### When override-semantics are wrong: the additivity carve-out
|
|
106
|
+
|
|
107
|
+
Most settings overwrite each other (one layer wins). A small number of settings _append_ across layers instead — each layer can add to the resolved value but none can remove from it. `additional_skipped_workspace_directories` (#232) is the only example today: traitlet + env var + env-prefix config + user config all merge into one combined list, deduped.
|
|
108
|
+
|
|
109
|
+
If you add a new additive setting, document the polarity explicitly in both the traitlet `help=` and the admin-guide entry. Readers assume override-semantics by default; additivity has to be called out or it's a trap.
|
|
110
|
+
|
|
111
|
+
### Adding a new admin policy is currently tedious
|
|
112
|
+
|
|
113
|
+
For historical reasons, every new admin policy has to be wired in seven places: the frontend type union (`src/api.ts`), the capabilities response builder (`extension.py`), the policy resolver, the handler class attribute, the README admin policies table, the admin-guide entry, and at least one pinning test. Miss one and the knob breaks in one direction without any error (e.g. the backend enforces but the UI doesn't lock the control, or vice versa).
|
|
114
|
+
|
|
115
|
+
The comment above `FEATURE_POLICY_SPEC` in `extension.py` lists every site — that's the closest thing to a guardrail today. A future registration helper that derived most of these from a single declaration would be a welcome cleanup.
|
|
116
|
+
|
|
117
|
+
## Development install
|
|
118
|
+
|
|
119
|
+
You'll need Node.js 18 or newer to build the frontend. The `jlpm` command is JupyterLab's pinned version of [yarn](https://yarnpkg.com/) — install JupyterLab first to get it.
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Clone the repo and change into the directory.
|
|
123
|
+
# Install the package in development mode.
|
|
124
|
+
pip install -e "."
|
|
125
|
+
|
|
126
|
+
# Link the development version of the extension with JupyterLab.
|
|
127
|
+
jupyter labextension develop . --overwrite
|
|
128
|
+
|
|
129
|
+
# Server extension must be manually installed in develop mode.
|
|
130
|
+
jupyter server extension enable notebook_intelligence
|
|
131
|
+
|
|
132
|
+
# Build the TypeScript source.
|
|
133
|
+
jlpm build
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Run JupyterLab and the watch loop in two terminals to pick up source changes automatically:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Terminal 1
|
|
140
|
+
jlpm watch
|
|
141
|
+
# Terminal 2
|
|
142
|
+
jupyter lab
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Refresh the browser tab to load the rebuilt frontend. To get source maps for JupyterLab core extensions as well:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
jupyter lab build --minimize=False
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Development uninstall
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
jupyter server extension disable notebook_intelligence
|
|
155
|
+
pip uninstall notebook_intelligence
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The `jupyter labextension develop` command leaves a symlink behind. Run `jupyter labextension list` to find the labextensions directory, then remove the `@notebook-intelligence/notebook-intelligence` symlink there.
|
|
159
|
+
|
|
160
|
+
## Running tests
|
|
161
|
+
|
|
162
|
+
TypeScript unit tests:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
jlpm test
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
There is no Python test suite at the moment. Manual end-to-end verification is documented per change in pull request descriptions.
|
|
169
|
+
|
|
170
|
+
## Linting
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
jlpm lint:check # check, no fixes
|
|
174
|
+
jlpm lint # check and auto-fix prettier, eslint, and stylelint
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
CI runs `lint:check`. Identifiers prefixed with `_` are treated as intentionally unused and excluded from the unused-vars rule.
|
|
178
|
+
|
|
179
|
+
If `jlpm install` produces unexpected lockfile changes, your local Yarn version probably differs from the one bundled with JupyterLab. `jlpm` ships with JupyterLab — use it directly instead of a system-wide `yarn`.
|
|
180
|
+
|
|
181
|
+
## Packaging
|
|
182
|
+
|
|
183
|
+
See [RELEASE.md](RELEASE.md).
|
|
184
|
+
|
|
185
|
+
## Frontend extension layout sanity check
|
|
186
|
+
|
|
187
|
+
If you see the frontend extension but it isn't working, check the server extension is enabled:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
jupyter server extension list
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
If the server extension is enabled but the frontend isn't loading:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
jupyter labextension list
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Resources
|
|
200
|
+
|
|
201
|
+
- [Copilot Internals blog post](https://thakkarparth007.github.io/copilot-explorer/posts/copilot-internals.html)
|
|
202
|
+
- [B00TK1D/copilot-api](https://github.com/B00TK1D/copilot-api) — GitHub Copilot auth and inline completions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: notebook_intelligence
|
|
3
|
-
Version:
|
|
3
|
+
Version: 5.0.0a1
|
|
4
4
|
Summary: AI coding assistant for JupyterLab
|
|
5
5
|
Project-URL: Homepage, https://github.com/notebook-intelligence/notebook-intelligence
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/notebook-intelligence/notebook-intelligence/issues
|
|
@@ -697,15 +697,20 @@ Requires-Python: >=3.10
|
|
|
697
697
|
Requires-Dist: anthropic>=0.22.1
|
|
698
698
|
Requires-Dist: claude-agent-sdk
|
|
699
699
|
Requires-Dist: cryptography
|
|
700
|
-
Requires-Dist: fastmcp>=2.11.2
|
|
701
700
|
Requires-Dist: fuzy-jon==0.1.0
|
|
702
|
-
Requires-Dist: jupyter-server<3,>=2.0
|
|
703
|
-
Requires-Dist: litellm>=1.
|
|
701
|
+
Requires-Dist: jupyter-server<3,>=2.18.0
|
|
702
|
+
Requires-Dist: litellm>=1.83.7
|
|
703
|
+
Requires-Dist: mcp>=1.27.0
|
|
704
|
+
Requires-Dist: mistune>=3.2.1
|
|
704
705
|
Requires-Dist: ollama
|
|
705
706
|
Requires-Dist: openai
|
|
707
|
+
Requires-Dist: python-multipart>=0.0.27
|
|
706
708
|
Requires-Dist: sseclient-py
|
|
707
709
|
Requires-Dist: tiktoken
|
|
710
|
+
Requires-Dist: urllib3>=2.7.0
|
|
708
711
|
Provides-Extra: test
|
|
712
|
+
Requires-Dist: psutil; extra == 'test'
|
|
713
|
+
Requires-Dist: pytest-timeout>=2.3.0; extra == 'test'
|
|
709
714
|
Requires-Dist: pytest<9,>=7.0; extra == 'test'
|
|
710
715
|
Requires-Dist: pyyaml; extra == 'test'
|
|
711
716
|
Description-Content-Type: text/markdown
|
|
@@ -737,6 +742,8 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
737
742
|
- [MCP config example](#mcp-config-example)
|
|
738
743
|
- [Rulesets](#rulesets)
|
|
739
744
|
- [Claude Skills](#claude-skills)
|
|
745
|
+
- [Claude MCP Servers](#claude-mcp-servers)
|
|
746
|
+
- [Claude Plugins](#claude-plugins)
|
|
740
747
|
- [Chat feedback](#chat-feedback)
|
|
741
748
|
- [Documentation](#documentation)
|
|
742
749
|
- [Further reading](#further-reading)
|
|
@@ -776,6 +783,8 @@ A short glossary you'll see referenced throughout these docs.
|
|
|
776
783
|
- **Claude Code vs the Anthropic API** — the _Anthropic API_ (`api.anthropic.com`) is the HTTPS endpoint NBI calls directly for inline chat and auto-complete in Claude mode. _Claude Code_ is Anthropic's local CLI agent that NBI shells out to for the chat panel; it talks to Anthropic itself.
|
|
777
784
|
- **MCP** — [Model Context Protocol](https://modelcontextprotocol.io/). A way for the LLM to call out to external tools (read files, hit APIs, run scripts).
|
|
778
785
|
- **Ruleset** — markdown files in `~/.jupyter/nbi/rules/` that get injected into the system prompt to enforce conventions, coding standards, or domain rules.
|
|
786
|
+
- **Skill**: a directory under `~/.claude/skills/` (or `<project>/.claude/skills/`) holding a `SKILL.md` plus helper files. Claude can invoke it like a callable plugin scoped to a workspace.
|
|
787
|
+
- **Claude plugin**: a unit packaged for `claude plugin install`, distributed through a **marketplace** (typically a GitHub repo that publishes a manifest of plugins). Distinct from NBI's own labextension; plugins run inside Claude Code sessions.
|
|
779
788
|
|
|
780
789
|
## Feature highlights
|
|
781
790
|
|
|
@@ -803,7 +812,18 @@ When Claude mode is on, the chat sidebar shows a history icon next to the gear.
|
|
|
803
812
|
|
|
804
813
|
#### Claude Code launcher tile
|
|
805
814
|
|
|
806
|
-
When
|
|
815
|
+
When the Claude CLI is on `PATH`, the JupyterLab launcher (the panel that opens with new tabs) shows a **Claude Code** tile alongside the standard kernel launchers. Clicking it opens a session picker; search across past transcripts and resume one in a fresh terminal, or start a new session in the file browser's active subdirectory. Session IDs are copyable from the picker for paste into a `claude --resume <id>` command.
|
|
816
|
+
|
|
817
|
+
#### Other coding-agent launcher tiles
|
|
818
|
+
|
|
819
|
+
When any of the following CLIs are on `PATH`, the launcher adds a tile for each. Clicking a tile opens a terminal at the file browser's current directory and runs the CLI:
|
|
820
|
+
|
|
821
|
+
- **opencode** (override path with `NBI_OPENCODE_CLI_PATH`)
|
|
822
|
+
- **Pi** (override path with `NBI_PI_CLI_PATH`)
|
|
823
|
+
- **GitHub Copilot CLI** (override path with `NBI_GITHUB_COPILOT_CLI_PATH`)
|
|
824
|
+
- **OpenAI Codex** (override path with `NBI_CODEX_CLI_PATH`)
|
|
825
|
+
|
|
826
|
+
Tiles add and remove themselves as CLIs become available or unavailable; they do not require Claude mode.
|
|
807
827
|
|
|
808
828
|
### Agent mode
|
|
809
829
|
|
|
@@ -865,18 +885,22 @@ Most settings panel toggles can be locked by org administrators. Two shapes:
|
|
|
865
885
|
|
|
866
886
|
**Boolean policies** use the `*_POLICY` suffix and accept three values: `user-choice` (default — user toggles freely), `force-on` (locked enabled), `force-off` (locked disabled). When forced, the panel control is disabled with a "Locked by your administrator" tooltip and any client-side write is ignored.
|
|
867
887
|
|
|
868
|
-
| Env var | Locks the Settings panel control for
|
|
869
|
-
| ------------------------------------------ |
|
|
870
|
-
| `NBI_EXPLAIN_ERROR_POLICY` | "Explain cell errors"
|
|
871
|
-
| `NBI_OUTPUT_FOLLOWUP_POLICY` | "Ask about cell outputs"
|
|
872
|
-
| `NBI_OUTPUT_TOOLBAR_POLICY` | "Show output toolbar"
|
|
873
|
-
| `NBI_CLAUDE_MODE_POLICY` | "Enable Claude mode"
|
|
874
|
-
| `NBI_CLAUDE_CONTINUE_CONVERSATION_POLICY` | "Remember conversation history"
|
|
875
|
-
| `NBI_CLAUDE_CODE_TOOLS_POLICY` | "Claude Code tools"
|
|
876
|
-
| `NBI_CLAUDE_JUPYTER_UI_TOOLS_POLICY` | "Jupyter UI tools"
|
|
877
|
-
| `NBI_CLAUDE_SETTING_SOURCE_USER_POLICY` | Setting source: User
|
|
878
|
-
| `NBI_CLAUDE_SETTING_SOURCE_PROJECT_POLICY` | Setting source: Project
|
|
879
|
-
| `NBI_STORE_GITHUB_ACCESS_TOKEN_POLICY` | "Remember my GitHub Copilot access token"
|
|
888
|
+
| Env var | Locks the Settings panel control for |
|
|
889
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
890
|
+
| `NBI_EXPLAIN_ERROR_POLICY` | "Explain cell errors" |
|
|
891
|
+
| `NBI_OUTPUT_FOLLOWUP_POLICY` | "Ask about cell outputs" |
|
|
892
|
+
| `NBI_OUTPUT_TOOLBAR_POLICY` | "Show output toolbar" |
|
|
893
|
+
| `NBI_CLAUDE_MODE_POLICY` | "Enable Claude mode" |
|
|
894
|
+
| `NBI_CLAUDE_CONTINUE_CONVERSATION_POLICY` | "Remember conversation history" |
|
|
895
|
+
| `NBI_CLAUDE_CODE_TOOLS_POLICY` | "Claude Code tools" |
|
|
896
|
+
| `NBI_CLAUDE_JUPYTER_UI_TOOLS_POLICY` | "Jupyter UI tools" |
|
|
897
|
+
| `NBI_CLAUDE_SETTING_SOURCE_USER_POLICY` | Setting source: User |
|
|
898
|
+
| `NBI_CLAUDE_SETTING_SOURCE_PROJECT_POLICY` | Setting source: Project |
|
|
899
|
+
| `NBI_STORE_GITHUB_ACCESS_TOKEN_POLICY` | "Remember my GitHub Copilot access token" |
|
|
900
|
+
| `NBI_SKILLS_MANAGEMENT_POLICY` | The Skills tab (force-off hides it and 403s the API; also disables the managed-skills reconciler) |
|
|
901
|
+
| `NBI_CLAUDE_MCP_MANAGEMENT_POLICY` | The Claude-mode MCP Servers tab (force-off hides it and 403s `/claude-mcp/*`; independent of the non-Claude MCP Servers tab) |
|
|
902
|
+
| `NBI_CLAUDE_PLUGINS_MANAGEMENT_POLICY` | The Claude-mode Plugins tab (force-off hides it and 403s `/plugins/*`) |
|
|
903
|
+
| `NBI_TERMINAL_DRAG_DROP_POLICY` | Terminal drag-drop file attach feature |
|
|
880
904
|
|
|
881
905
|
The first three also have matching traitlets on `NotebookIntelligence` (`explain_error_policy`, `output_followup_policy`, `output_toolbar_policy`); add the others as needed in the same shape:
|
|
882
906
|
|
|
@@ -887,6 +911,8 @@ c.NotebookIntelligence.claude_jupyter_ui_tools_policy = "force-off"
|
|
|
887
911
|
|
|
888
912
|
Per-user preferences (default on for the cell-output features) live in `config.json` as `enable_explain_error`, `enable_output_followup`, `enable_output_toolbar`.
|
|
889
913
|
|
|
914
|
+
**List-shaped denylists** (LLM providers, built-in tools, coding-agent launcher tiles) use traitlets rather than `*_POLICY` env vars. See [`docs/admin-guide.md`](docs/admin-guide.md#restricting-features-for-managed-deployments) for the `disabled_providers`, `disabled_tools`, and `disabled_coding_agent_launchers` recipes.
|
|
915
|
+
|
|
890
916
|
**Value-presence locks** for non-boolean settings: setting the env var to a non-empty value pins the control to that value and disables it. Empty/unset = user-choice.
|
|
891
917
|
|
|
892
918
|
| Env var | Pins |
|
|
@@ -902,6 +928,15 @@ Per-user preferences (default on for the cell-output features) live in `config.j
|
|
|
902
928
|
|
|
903
929
|
Provider IDs: `github-copilot`, `openai-compatible`, `litellm-compatible`, `ollama`, `none`. The `*_MODEL_ID` value is whatever the chosen provider exposes (e.g. `gpt-4o`, `llama3:latest`). Claude model IDs are the literal IDs from the Anthropic API (e.g. `claude-opus-4-7`, `claude-sonnet-4-6`); empty string = "Default (recommended)"; `NBI_CLAUDE_INLINE_COMPLETION_MODEL` also accepts `none` (no inline completion in Claude mode) or `inherit` (use the General-tab Auto-complete model).
|
|
904
930
|
|
|
931
|
+
**Upload tunables** govern the shared upload endpoint used by both chat-sidebar file attachments and terminal drag-drop:
|
|
932
|
+
|
|
933
|
+
| Env var | Default | Behavior |
|
|
934
|
+
| ---------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
935
|
+
| `NBI_UPLOAD_MAX_MB` | `50` | Per-file size cap in megabytes. Requests over the cap return HTTP 413. Set to `0` to disable the cap entirely. |
|
|
936
|
+
| `NBI_UPLOAD_RETENTION_HOURS` | `24` | How long staged uploads survive in the temp directory before the next upload sweeps them. Set to `0` to keep only the atexit purge (uploads survive the session). |
|
|
937
|
+
|
|
938
|
+
The same values are also configurable via the `upload_max_mb` and `upload_retention_hours` traitlets on `NotebookIntelligence`.
|
|
939
|
+
|
|
905
940
|
### Remembering GitHub Copilot login
|
|
906
941
|
|
|
907
942
|
NBI can remember your GitHub Copilot login so you don't have to sign in again after a JupyterLab or system restart.
|
|
@@ -1021,12 +1056,24 @@ For full details (frontmatter reference, mode-specific rules, auto-reload), see
|
|
|
1021
1056
|
|
|
1022
1057
|
## Claude Skills
|
|
1023
1058
|
|
|
1024
|
-
|
|
1059
|
+
The Settings panel exposes a top-level **Skills** tab for managing the skills that Claude can invoke. Skills are stored under `~/.claude/skills/` (user) or `<project>/.claude/skills/` (project). You can create and edit skills inline, duplicate, rename, delete (with undo), or import from a public GitHub repo. The tab is visible in any mode; when Claude mode is off, a hint banner notes that skills only take effect inside Claude sessions (handy for authoring skills now and using them when you turn Claude mode on later).
|
|
1025
1060
|
|
|
1026
|
-
For organization-wide deployments,
|
|
1061
|
+
For organization-wide deployments, your admin can ship a curated manifest of skills and keep them in sync by setting `NBI_SKILLS_MANIFEST`. Skills installed this way are marked **Managed** and are read-only in the UI. Admins who want to keep managed skills but disallow ad-hoc GitHub imports use `NBI_ALLOW_GITHUB_SKILL_IMPORT=false`.
|
|
1027
1062
|
|
|
1028
1063
|
For full details, see [`docs/skills.md`](docs/skills.md).
|
|
1029
1064
|
|
|
1065
|
+
## Claude MCP Servers
|
|
1066
|
+
|
|
1067
|
+
When Claude mode is enabled and the Claude CLI is available, the Settings panel exposes an **MCP Servers** tab that manages the user, project, and local-scope MCP entries Claude Code reads from `~/.claude.json` and the project's `.mcp.json`. This is a different tab from NBI's own MCP Servers tab (which manages the servers used by the non-Claude chat path); the two never appear together, and the Settings dialog shows whichever one applies to your current mode.
|
|
1068
|
+
|
|
1069
|
+
Reads come from Claude's JSON config files directly. Writes (add and remove) shell out to `claude mcp add` and `claude mcp remove` so Claude remains the source of truth for any side effects (project-trust prompts, OAuth bookkeeping). Admins can lock the tab with `NBI_CLAUDE_MCP_MANAGEMENT_POLICY=force-off`.
|
|
1070
|
+
|
|
1071
|
+
## Claude Plugins
|
|
1072
|
+
|
|
1073
|
+
When Claude mode is enabled and the Claude CLI is available, the Settings panel exposes a **Plugins** tab wrapping `claude plugin` for install, uninstall, enable, disable, and marketplace add (for example: add a marketplace from a GitHub repo, then install plugins it publishes). Marketplaces hosted on GitHub reuse the same `GITHUB_TOKEN` / `GH_TOKEN` / `gh auth token` precedence as Skills imports; the token is passed via env to the subprocess and never appears in argv or DEBUG logs. See Anthropic's [plugin docs](https://code.claude.com/docs/en/plugins) for what a plugin is and how marketplaces work.
|
|
1074
|
+
|
|
1075
|
+
Admins can lock the entire tab with `NBI_CLAUDE_PLUGINS_MANAGEMENT_POLICY=force-off`, or keep the tab and block only GitHub-sourced marketplaces with `NBI_ALLOW_GITHUB_PLUGIN_IMPORT=false`.
|
|
1076
|
+
|
|
1030
1077
|
## Chat feedback
|
|
1031
1078
|
|
|
1032
1079
|
Enable thumbs-up/down feedback on AI responses by setting:
|
|
@@ -25,6 +25,8 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
|
|
|
25
25
|
- [MCP config example](#mcp-config-example)
|
|
26
26
|
- [Rulesets](#rulesets)
|
|
27
27
|
- [Claude Skills](#claude-skills)
|
|
28
|
+
- [Claude MCP Servers](#claude-mcp-servers)
|
|
29
|
+
- [Claude Plugins](#claude-plugins)
|
|
28
30
|
- [Chat feedback](#chat-feedback)
|
|
29
31
|
- [Documentation](#documentation)
|
|
30
32
|
- [Further reading](#further-reading)
|
|
@@ -64,6 +66,8 @@ A short glossary you'll see referenced throughout these docs.
|
|
|
64
66
|
- **Claude Code vs the Anthropic API** — the _Anthropic API_ (`api.anthropic.com`) is the HTTPS endpoint NBI calls directly for inline chat and auto-complete in Claude mode. _Claude Code_ is Anthropic's local CLI agent that NBI shells out to for the chat panel; it talks to Anthropic itself.
|
|
65
67
|
- **MCP** — [Model Context Protocol](https://modelcontextprotocol.io/). A way for the LLM to call out to external tools (read files, hit APIs, run scripts).
|
|
66
68
|
- **Ruleset** — markdown files in `~/.jupyter/nbi/rules/` that get injected into the system prompt to enforce conventions, coding standards, or domain rules.
|
|
69
|
+
- **Skill**: a directory under `~/.claude/skills/` (or `<project>/.claude/skills/`) holding a `SKILL.md` plus helper files. Claude can invoke it like a callable plugin scoped to a workspace.
|
|
70
|
+
- **Claude plugin**: a unit packaged for `claude plugin install`, distributed through a **marketplace** (typically a GitHub repo that publishes a manifest of plugins). Distinct from NBI's own labextension; plugins run inside Claude Code sessions.
|
|
67
71
|
|
|
68
72
|
## Feature highlights
|
|
69
73
|
|
|
@@ -91,7 +95,18 @@ When Claude mode is on, the chat sidebar shows a history icon next to the gear.
|
|
|
91
95
|
|
|
92
96
|
#### Claude Code launcher tile
|
|
93
97
|
|
|
94
|
-
When
|
|
98
|
+
When the Claude CLI is on `PATH`, the JupyterLab launcher (the panel that opens with new tabs) shows a **Claude Code** tile alongside the standard kernel launchers. Clicking it opens a session picker; search across past transcripts and resume one in a fresh terminal, or start a new session in the file browser's active subdirectory. Session IDs are copyable from the picker for paste into a `claude --resume <id>` command.
|
|
99
|
+
|
|
100
|
+
#### Other coding-agent launcher tiles
|
|
101
|
+
|
|
102
|
+
When any of the following CLIs are on `PATH`, the launcher adds a tile for each. Clicking a tile opens a terminal at the file browser's current directory and runs the CLI:
|
|
103
|
+
|
|
104
|
+
- **opencode** (override path with `NBI_OPENCODE_CLI_PATH`)
|
|
105
|
+
- **Pi** (override path with `NBI_PI_CLI_PATH`)
|
|
106
|
+
- **GitHub Copilot CLI** (override path with `NBI_GITHUB_COPILOT_CLI_PATH`)
|
|
107
|
+
- **OpenAI Codex** (override path with `NBI_CODEX_CLI_PATH`)
|
|
108
|
+
|
|
109
|
+
Tiles add and remove themselves as CLIs become available or unavailable; they do not require Claude mode.
|
|
95
110
|
|
|
96
111
|
### Agent mode
|
|
97
112
|
|
|
@@ -153,18 +168,22 @@ Most settings panel toggles can be locked by org administrators. Two shapes:
|
|
|
153
168
|
|
|
154
169
|
**Boolean policies** use the `*_POLICY` suffix and accept three values: `user-choice` (default — user toggles freely), `force-on` (locked enabled), `force-off` (locked disabled). When forced, the panel control is disabled with a "Locked by your administrator" tooltip and any client-side write is ignored.
|
|
155
170
|
|
|
156
|
-
| Env var | Locks the Settings panel control for
|
|
157
|
-
| ------------------------------------------ |
|
|
158
|
-
| `NBI_EXPLAIN_ERROR_POLICY` | "Explain cell errors"
|
|
159
|
-
| `NBI_OUTPUT_FOLLOWUP_POLICY` | "Ask about cell outputs"
|
|
160
|
-
| `NBI_OUTPUT_TOOLBAR_POLICY` | "Show output toolbar"
|
|
161
|
-
| `NBI_CLAUDE_MODE_POLICY` | "Enable Claude mode"
|
|
162
|
-
| `NBI_CLAUDE_CONTINUE_CONVERSATION_POLICY` | "Remember conversation history"
|
|
163
|
-
| `NBI_CLAUDE_CODE_TOOLS_POLICY` | "Claude Code tools"
|
|
164
|
-
| `NBI_CLAUDE_JUPYTER_UI_TOOLS_POLICY` | "Jupyter UI tools"
|
|
165
|
-
| `NBI_CLAUDE_SETTING_SOURCE_USER_POLICY` | Setting source: User
|
|
166
|
-
| `NBI_CLAUDE_SETTING_SOURCE_PROJECT_POLICY` | Setting source: Project
|
|
167
|
-
| `NBI_STORE_GITHUB_ACCESS_TOKEN_POLICY` | "Remember my GitHub Copilot access token"
|
|
171
|
+
| Env var | Locks the Settings panel control for |
|
|
172
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
173
|
+
| `NBI_EXPLAIN_ERROR_POLICY` | "Explain cell errors" |
|
|
174
|
+
| `NBI_OUTPUT_FOLLOWUP_POLICY` | "Ask about cell outputs" |
|
|
175
|
+
| `NBI_OUTPUT_TOOLBAR_POLICY` | "Show output toolbar" |
|
|
176
|
+
| `NBI_CLAUDE_MODE_POLICY` | "Enable Claude mode" |
|
|
177
|
+
| `NBI_CLAUDE_CONTINUE_CONVERSATION_POLICY` | "Remember conversation history" |
|
|
178
|
+
| `NBI_CLAUDE_CODE_TOOLS_POLICY` | "Claude Code tools" |
|
|
179
|
+
| `NBI_CLAUDE_JUPYTER_UI_TOOLS_POLICY` | "Jupyter UI tools" |
|
|
180
|
+
| `NBI_CLAUDE_SETTING_SOURCE_USER_POLICY` | Setting source: User |
|
|
181
|
+
| `NBI_CLAUDE_SETTING_SOURCE_PROJECT_POLICY` | Setting source: Project |
|
|
182
|
+
| `NBI_STORE_GITHUB_ACCESS_TOKEN_POLICY` | "Remember my GitHub Copilot access token" |
|
|
183
|
+
| `NBI_SKILLS_MANAGEMENT_POLICY` | The Skills tab (force-off hides it and 403s the API; also disables the managed-skills reconciler) |
|
|
184
|
+
| `NBI_CLAUDE_MCP_MANAGEMENT_POLICY` | The Claude-mode MCP Servers tab (force-off hides it and 403s `/claude-mcp/*`; independent of the non-Claude MCP Servers tab) |
|
|
185
|
+
| `NBI_CLAUDE_PLUGINS_MANAGEMENT_POLICY` | The Claude-mode Plugins tab (force-off hides it and 403s `/plugins/*`) |
|
|
186
|
+
| `NBI_TERMINAL_DRAG_DROP_POLICY` | Terminal drag-drop file attach feature |
|
|
168
187
|
|
|
169
188
|
The first three also have matching traitlets on `NotebookIntelligence` (`explain_error_policy`, `output_followup_policy`, `output_toolbar_policy`); add the others as needed in the same shape:
|
|
170
189
|
|
|
@@ -175,6 +194,8 @@ c.NotebookIntelligence.claude_jupyter_ui_tools_policy = "force-off"
|
|
|
175
194
|
|
|
176
195
|
Per-user preferences (default on for the cell-output features) live in `config.json` as `enable_explain_error`, `enable_output_followup`, `enable_output_toolbar`.
|
|
177
196
|
|
|
197
|
+
**List-shaped denylists** (LLM providers, built-in tools, coding-agent launcher tiles) use traitlets rather than `*_POLICY` env vars. See [`docs/admin-guide.md`](docs/admin-guide.md#restricting-features-for-managed-deployments) for the `disabled_providers`, `disabled_tools`, and `disabled_coding_agent_launchers` recipes.
|
|
198
|
+
|
|
178
199
|
**Value-presence locks** for non-boolean settings: setting the env var to a non-empty value pins the control to that value and disables it. Empty/unset = user-choice.
|
|
179
200
|
|
|
180
201
|
| Env var | Pins |
|
|
@@ -190,6 +211,15 @@ Per-user preferences (default on for the cell-output features) live in `config.j
|
|
|
190
211
|
|
|
191
212
|
Provider IDs: `github-copilot`, `openai-compatible`, `litellm-compatible`, `ollama`, `none`. The `*_MODEL_ID` value is whatever the chosen provider exposes (e.g. `gpt-4o`, `llama3:latest`). Claude model IDs are the literal IDs from the Anthropic API (e.g. `claude-opus-4-7`, `claude-sonnet-4-6`); empty string = "Default (recommended)"; `NBI_CLAUDE_INLINE_COMPLETION_MODEL` also accepts `none` (no inline completion in Claude mode) or `inherit` (use the General-tab Auto-complete model).
|
|
192
213
|
|
|
214
|
+
**Upload tunables** govern the shared upload endpoint used by both chat-sidebar file attachments and terminal drag-drop:
|
|
215
|
+
|
|
216
|
+
| Env var | Default | Behavior |
|
|
217
|
+
| ---------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
218
|
+
| `NBI_UPLOAD_MAX_MB` | `50` | Per-file size cap in megabytes. Requests over the cap return HTTP 413. Set to `0` to disable the cap entirely. |
|
|
219
|
+
| `NBI_UPLOAD_RETENTION_HOURS` | `24` | How long staged uploads survive in the temp directory before the next upload sweeps them. Set to `0` to keep only the atexit purge (uploads survive the session). |
|
|
220
|
+
|
|
221
|
+
The same values are also configurable via the `upload_max_mb` and `upload_retention_hours` traitlets on `NotebookIntelligence`.
|
|
222
|
+
|
|
193
223
|
### Remembering GitHub Copilot login
|
|
194
224
|
|
|
195
225
|
NBI can remember your GitHub Copilot login so you don't have to sign in again after a JupyterLab or system restart.
|
|
@@ -309,12 +339,24 @@ For full details (frontmatter reference, mode-specific rules, auto-reload), see
|
|
|
309
339
|
|
|
310
340
|
## Claude Skills
|
|
311
341
|
|
|
312
|
-
|
|
342
|
+
The Settings panel exposes a top-level **Skills** tab for managing the skills that Claude can invoke. Skills are stored under `~/.claude/skills/` (user) or `<project>/.claude/skills/` (project). You can create and edit skills inline, duplicate, rename, delete (with undo), or import from a public GitHub repo. The tab is visible in any mode; when Claude mode is off, a hint banner notes that skills only take effect inside Claude sessions (handy for authoring skills now and using them when you turn Claude mode on later).
|
|
313
343
|
|
|
314
|
-
For organization-wide deployments,
|
|
344
|
+
For organization-wide deployments, your admin can ship a curated manifest of skills and keep them in sync by setting `NBI_SKILLS_MANIFEST`. Skills installed this way are marked **Managed** and are read-only in the UI. Admins who want to keep managed skills but disallow ad-hoc GitHub imports use `NBI_ALLOW_GITHUB_SKILL_IMPORT=false`.
|
|
315
345
|
|
|
316
346
|
For full details, see [`docs/skills.md`](docs/skills.md).
|
|
317
347
|
|
|
348
|
+
## Claude MCP Servers
|
|
349
|
+
|
|
350
|
+
When Claude mode is enabled and the Claude CLI is available, the Settings panel exposes an **MCP Servers** tab that manages the user, project, and local-scope MCP entries Claude Code reads from `~/.claude.json` and the project's `.mcp.json`. This is a different tab from NBI's own MCP Servers tab (which manages the servers used by the non-Claude chat path); the two never appear together, and the Settings dialog shows whichever one applies to your current mode.
|
|
351
|
+
|
|
352
|
+
Reads come from Claude's JSON config files directly. Writes (add and remove) shell out to `claude mcp add` and `claude mcp remove` so Claude remains the source of truth for any side effects (project-trust prompts, OAuth bookkeeping). Admins can lock the tab with `NBI_CLAUDE_MCP_MANAGEMENT_POLICY=force-off`.
|
|
353
|
+
|
|
354
|
+
## Claude Plugins
|
|
355
|
+
|
|
356
|
+
When Claude mode is enabled and the Claude CLI is available, the Settings panel exposes a **Plugins** tab wrapping `claude plugin` for install, uninstall, enable, disable, and marketplace add (for example: add a marketplace from a GitHub repo, then install plugins it publishes). Marketplaces hosted on GitHub reuse the same `GITHUB_TOKEN` / `GH_TOKEN` / `gh auth token` precedence as Skills imports; the token is passed via env to the subprocess and never appears in argv or DEBUG logs. See Anthropic's [plugin docs](https://code.claude.com/docs/en/plugins) for what a plugin is and how marketplaces work.
|
|
357
|
+
|
|
358
|
+
Admins can lock the entire tab with `NBI_CLAUDE_PLUGINS_MANAGEMENT_POLICY=force-off`, or keep the tab and block only GitHub-sourced marketplaces with `NBI_ALLOW_GITHUB_PLUGIN_IMPORT=false`.
|
|
359
|
+
|
|
318
360
|
## Chat feedback
|
|
319
361
|
|
|
320
362
|
Enable thumbs-up/down feedback on AI responses by setting:
|