Skip to content

Conversation

@Artmann
Copy link
Member

@Artmann Artmann commented Sep 12, 2025

Fixes #

Summary by CodeRabbit

  • Refactor
    • Removed Jupyter UI surfaces (activity bar, variables panel) and notebook renderer; extension now focuses on Deepnote and Interactive notebooks.
    • Dropped Jupyter notebook preload; retained Deepnote and Interactive preloads.
    • Reduced activation events to Python, notebook tools, Deepnote, and Interactive.
    • Simplified keybindings, keeping only Escape for interactive input.
    • Renamed configuration titles from “Jupyter” to “Deepnote”.
  • Documentation
    • Removed walkthroughs related to Jupyter.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 12, 2025

📝 Walkthrough

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title "feat: Remove Jupyter bindings." succinctly and accurately summarizes the PR’s primary change—removing Jupyter-related activation events, keybindings, and UI declarations from the extension manifest as described in the summary. It is concise, specific, and free of noisy details, so a reviewer can quickly understand the main intent. The phrasing matches the changeset and does not mislead.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

Comment @coderabbitai help to get the list of available commands and usage tips.

@Artmann Artmann merged commit ec965a6 into main Sep 12, 2025
2 of 3 checks passed
@Artmann Artmann deleted the remove-bindings branch September 12, 2025 13:58
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (7)
package.json (7)

1868-2037: Language Model Tools still branded/typed for Jupyter.

If Jupyter support is removed, rename displays/tags and/or disable tools that assert “jupyter environment,” or they will confuse users and AI tools.


2054-2098: Scripts still Jupyter-centric.

CI/dev flows reference Jupyter pre-release flags and start/stop Jupyter server. Remove or guard to avoid accidental breakage.

-        "build:prerelease": "cross-env IS_PRE_RELEASE_VERSION_OF_JUPYTER_EXTENSION=true npm run build",
-        "build:stable": "cross-env IS_PRE_RELEASE_VERSION_OF_JUPYTER_EXTENSION=false npm run build",
+        "build:stable": "npm run build",
@@
-        "startJupyterServer": "node build/preDebugWebTest.js",
-        "stopJupyterServer": "node build/postDebugWebTest.js",
+        // (remove if unused)

2294-2314: Overrides pin Jupyter transitive deps.

These should disappear once Jupyter deps are removed; otherwise you’re carrying unneeded overrides.


68-74: Keybinding to interactive.input.clear — verify command availability.

If Interactive window isn’t supported, this binding becomes noise. Keep only if the Interactive story remains.


32-42: Keyword ‘jupyter’ — keep for discoverability or drop for accuracy.

Decide explicitly; either is fine, but be intentional.


43-49: Category “Extension Packs” likely inaccurate.

This isn’t a pack; consider removing to match Marketplace categorization.


25-27: Engine + proposals sanity check.

enabledApiProposals is large and Jupyter-heavy; prune to the ones you still use with ^1.103.0.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 07193fa and c41ed56.

📒 Files selected for processing (1)
  • package.json (2 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-09-12T12:52:09.700Z
Learnt from: CR
PR: deepnote/vscode-deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-09-12T12:52:09.700Z
Learning: Applies to src/notebooks/deepnote/deepnoteActivationService.ts : deepnoteActivationService.ts wires VSCode activation

Applied to files:

  • package.json
📚 Learning: 2025-09-03T12:55:29.175Z
Learnt from: CR
PR: deepnote/vscode-extension#0
File: .github/instructions/ipywidgets.instructions.md:0-0
Timestamp: 2025-09-03T12:55:29.175Z
Learning: Applies to src/webviews/webview-side/ipywidgets/kernel/manager.ts : Use a JupyterLab-compatible WidgetManager to manage widget models, synchronization, rendering, and disposal

Applied to files:

  • package.json
🔇 Additional comments (2)
package.json (2)

1796-1811: Ipywidgets preloads kept — confirm intent without Jupyter.

These still load ipywidgetsKernel for deepnote/interactive. If Jupyter is out, validate these entrypoints and their deps remain valid and minimal.


2099-2290: Heavy Jupyter/ZeroMQ dependency graph remains — remove if unused

package.json contains: @jupyter-widgets/base, @jupyter-widgets/controls, @jupyter-widgets/schema, @jupyterlab/coreutils, @jupyterlab/nbformat, @jupyterlab/services, @lumino/widgets, @nteract/messaging, @types/vscode-notebook-renderer, @vscode/zeromq, zeromq, zeromqold.

Drop or move these to optional/peer deps or lazy-load them to materially reduce VSIX size and install time; if kept, document why and consider lighter alternatives.

Comment on lines 50 to 57
"activationEvents": [
"onLanguage:jupyter",
"onLanguage:python",
"onLanguageModelTool:configure_notebook",
"onLanguageModelTool:notebook_install_packages",
"onLanguageModelTool:notebook_list_packages",
"onNotebook:deepnote",
"onNotebook:interactive",
"onNotebook:jupyter-notebook",
"onWebviewPanel:jupyter-variables",
"onWebviewPanel:jupyter"
"onNotebook:interactive"
],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Activation events trimmed, but Jupyter surface still contributed.

You removed Jupyter activation triggers, yet the extension still contributes hundreds of Jupyter commands/menus/views. This leaves dead UI, unnecessary payload, and risk of unresolved contexts. Either drop these contributions or hard‑gate them behind a feature flag set to false.

Apply at least these removals as a start:

@@
         "views": {
-            "jupyter-variables": [
-                {
-                    "type": "webview",
-                    "id": "jupyterViewVariables",
-                    "name": "Jupyter Variables",
-                    "when": "jupyter.hasNativeNotebookOrInteractiveWindowOpen"
-                }
-            ],
             "deepnote": [
@@
         "debuggers": [
-            {
-                "type": "Python Kernel Debug Adapter",
-                "label": "%jupyter.debuggers.kernel%"
-            },
-            {
-                "type": "Python Interactive Window Debug Adapter",
-                "label": "%jupyter.debuggers.interactive%"
-            }
+            // (remove entire block if not supporting Jupyter debugging)
         ],

🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "PWD: $(pwd)"

echo "Finding package.json files (excluding node_modules)..."
mapfile -t pkgs < <(find . -type f -name package.json -not -path "*/node_modules/*" -print)
if [ ${#pkgs[@]} -eq 0 ]; then
  echo "No package.json found"
  exit 0
fi

for f in "${pkgs[@]}"; do
  echo
  echo "=== $f ==="
  echo "--- Raw file head (first 300 lines) ---"
  sed -n '1,300p' "$f"
  echo "--- Parsed fields ---"
  python - <<'PY' "$f"
import sys, json, re
p=sys.argv[1]
with open(p) as fh:
  d=json.load(fh)
def jprint(x):
  import json
  print(json.dumps(x, indent=2))
print("activationEvents:")
jprint(d.get("activationEvents"))
print("contributes keys:")
jprint(list(d.get("contributes",{}).keys()))
contrib=d.get("contributes",{})
print("views keys:")
jprint(list(contrib.get("views",{}).keys()))
if "jupyter-variables" in contrib.get("views",{}):
  print("jupyter-variables entry:")
  jprint(contrib["views"]["jupyter-variables"])
print("debuggers:")
jprint(contrib.get("debuggers"))
s=json.dumps(contrib)
matches = sorted(set(re.findall(r'jupyter[^\"]*', s, flags=re.IGNORECASE)))
if matches:
  print("Found jupyter-related tokens in contributes:", matches)
else:
  print("No jupyter-related tokens found in contributes.")
PY
done

echo
echo "Repo-wide ripgrep for 'jupyter' (context):"
rg -n --hidden -S -C2 "jupyter" || true

Length of output: 135


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "PWD: $(pwd)"

echo "Counting package.json files (excluding node_modules)..."
count=$(find . -type f -name package.json -not -path "*/node_modules/*" -print | wc -l)
if [ "$count" -eq 0 ]; then
  echo "No package.json found"
  exit 0
fi
echo "Found $count package.json(s)"

PYTHON=python3
if ! command -v "$PYTHON" >/dev/null 2>&1; then
  PYTHON=python
fi

find . -type f -name package.json -not -path "*/node_modules/*" -print | while IFS= read -r f; do
  echo
  echo "=== $f ==="
  echo "--- head (1-300) ---"
  sed -n '1,300p' "$f" || true
  echo "--- parsed fields ---"
  "$PYTHON" - <<'PY' "$f"
import sys, json, re
p=sys.argv[1]
try:
  with open(p) as fh:
    d=json.load(fh)
except Exception as e:
  print("JSON parse error:", e)
  sys.exit(0)
def jprint(x):
  import json
  print(json.dumps(x, indent=2, ensure_ascii=False))
print("activationEvents:")
jprint(d.get("activationEvents"))
contrib=d.get("contributes",{})
print("contributes keys:")
jprint(list(contrib.keys()))
print("views keys:")
jprint(list(contrib.get("views",{}).keys()))
if "jupyter-variables" in contrib.get("views",{}):
  print("jupyter-variables entry:")
  jprint(contrib["views"]["jupyter-variables"])
print("debuggers:")
jprint(contrib.get("debuggers"))
s=json.dumps(contrib)
matches = sorted(set(re.findall(r'jupyter[^\"]*', s, flags=re.IGNORECASE)))
if matches:
  print("Found jupyter-related tokens in contributes:", matches)
else:
  print("No jupyter-related tokens found in contributes.")
PY
done

echo
echo "Repo-wide search for 'jupyter' (excluding node_modules and .git):"
if command -v rg >/dev/null 2>&1; then
  rg -n --hidden -S -C2 "jupyter" --glob '!node_modules/**' --glob '!.git/**' || true
else
  grep -RIn --exclude-dir=node_modules --exclude-dir=.git "jupyter" || true
fi

Length of output: 35767


Remove or gate leftover Jupyter contributions in package.json

activationEvents no longer include Jupyter triggers, but package.json still contributes Jupyter commands, views and debug adapters — remove these contributions or hard‑gate them behind a disabled feature flag to avoid dead UI and unresolved enablement contexts.

File: package.json (root) — remove or gate at least the following entries:

@@
         "views": {
-            "jupyter-variables": [
-                {
-                    "type": "webview",
-                    "id": "jupyterViewVariables",
-                    "name": "Jupyter Variables",
-                    "when": "jupyter.hasNativeNotebookOrInteractiveWindowOpen"
-                }
-            ],
             "deepnote": [
@@
         "debuggers": [
-            {
-                "type": "Python Kernel Debug Adapter",
-                "label": "%jupyter.debuggers.kernel%"
-            },
-            {
-                "type": "Python Interactive Window Debug Adapter",
-                "label": "%jupyter.debuggers.interactive%"
-            }
+            // (remove entire block if not supporting Jupyter debugging)
         ],

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In package.json around lines 50 to 57, remove or gate leftover Jupyter-related
contributions that no longer have activationEvents (specifically any
contributes.commands, contributes.views, contributes.debuggers or similar
entries referencing Jupyter/Notebook/Deepnote) — either delete those entries or
wrap them behind a new disabled feature flag (e.g., "features.enableJupyter":
false) and conditionally include their contributions using that flag; also
ensure any enablementContexts referencing those commands are removed or updated
so no dead UI or unresolved contexts remain.

"configuration": {
"type": "object",
"title": "Jupyter",
"title": "Deepnote",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Config title says “Deepnote” but all keys are jupyter. — confusing.*

Either revert the title or migrate/alias settings to deepnote.* (with code reading both). Rebrand without key migration misleads users and docs.

-            "title": "Deepnote",
+            "title": "Jupyter",

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Locating package.json files (excluding node_modules)..."
mapfile -t files < <(find . -type f -name package.json -not -path "*/node_modules/*" 2>/dev/null || true)

if [ ${#files[@]} -eq 0 ]; then
  echo "No package.json found."
  exit 0
fi

for f in "${files[@]}"; do
  echo
  echo "==== $f ===="
  echo "-- Lines around 1230-1245 (if file long enough) --"
  sed -n '1225,1250p' "$f" || true
  echo
  echo "-- Any 'title' entries matching Deepnote or Jupyter --"
  grep -nE '"title"[[:space:]]*:[[:space:]]*"(Deepnote|Jupyter)"' "$f" || echo "none"
  echo
  echo "-- Keys containing 'jupyter.' --"
  grep -nE '"jupyter\.' "$f" || echo "none"
  echo
  echo "-- Keys containing 'deepnote.' --"
  grep -nE '"deepnote\.' "$f" || echo "none"
done

Length of output: 112


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Locating package.json files (excluding node_modules)..."
files=$(find . -type f -name package.json -not -path "*/node_modules/*" 2>/dev/null || true)

if [ -z "$files" ]; then
  echo "No package.json found."
  exit 0
fi

for f in $files; do
  echo
  echo "==== $f ===="
  echo "-- Lines 1225-1250 (or whole file if shorter) --"
  total_lines=$(wc -l < "$f" || echo 0)
  if [ "$total_lines" -ge 1250 ]; then
    sed -n '1225,1250p' "$f" || true
  else
    sed -n '1,2000p' "$f" || true
  fi
  echo
  echo "-- 'title' entries matching Deepnote or Jupyter --"
  grep -nE '"title"[[:space:]]*:[[:space:]]*"(Deepnote|Jupyter)"' "$f" || echo "none"
  echo
  echo "-- Keys containing 'jupyter.' --"
  grep -nE '"jupyter\.' "$f" || echo "none"
  echo
  echo "-- Keys containing 'deepnote.' --"
  grep -nE '"deepnote\.' "$f" || echo "none"
done

Length of output: 23270


Config title is "Deepnote" but settings use jupyter. — revert title or migrate/alias keys.*
package.json (root) — "title": "Deepnote" at lines 1239 and 1816 while configuration keys are jupyter.; either change the title to "Jupyter" or add deepnote. aliases and a loader that reads both.

-            "title": "Deepnote",
+            "title": "Jupyter",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"title": "Deepnote",
"title": "Jupyter",
🤖 Prompt for AI Agents
In package.json around line 1239 (and also line 1816), the config "title" is set
to "Deepnote" while the actual configuration keys use the jupyter.* namespace;
either change the title to "Jupyter" to match the keys, or add deepnote.*
aliases and a loader that resolves both namespaces. Fix option A: update the
title fields at the indicated lines to "Jupyter". Fix option B: add deepnote.*
entries mirroring the jupyter.* keys and modify the config loader to check
deepnote.* first then fall back to jupyter.* (or vice versa), ensuring both
namespaces are supported and covered by tests/validation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants