Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/build-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ jobs:
python-version: '3.12'
- run: python3 -m pip install 'packaging>=26'
- run: npm run test:pip-resolver
- run: npm run test:autocomplete-core
- run: node server.js &
- run: sleep 2 && curl -sf http://localhost:8085/ > /dev/null
- run: node test_appearance.mjs
Expand All @@ -48,6 +49,7 @@ jobs:
- run: node test_whats_new.mjs
- run: npm run test:header-shortcuts
- run: npm run test:math-palette
- run: npm run test:autocomplete
- run: npm run test:pip-cell
- run: node test_rtl_layout.mjs
- run: node test_i18n_dynamic.mjs
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ jobs:
- name: Pip resolver unit tests (deterministic, fixture lockfile)
run: node test_pip_resolver.mjs

- name: Local completion core
run: npm run test:autocomplete-core

- name: Start dev server
run: node server.js &

Expand Down Expand Up @@ -107,6 +110,9 @@ jobs:
- name: Math palette, contexts, layout invariants
run: node test_math_palette.mjs

- name: Local completion — composer and existing cells
run: npm run test:autocomplete

- name: Pip cell semantics (failed installs stop the cell; dep healing)
run: node test_pip_cell.mjs

Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,22 @@ jobs:
echo "suite not on this tag — skipped"
fi

- name: Local completion core regressions (when present on this tag)
run: |
if test -f test_autocomplete_core.mjs; then
node test_autocomplete_core.mjs
else
echo "suite not on this tag — skipped"
fi

- name: Local completion browser regressions (when present on this tag)
run: |
if test -f test_autocomplete.mjs; then
node test_autocomplete.mjs
else
echo "suite not on this tag — skipped"
fi

- name: Run cell operations tests
run: node test_cell_ops.mjs

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ JSON.stringify({pi: Math.PI, e: Math.E}, null, 2)
| **Package ecosystem** | `%pip install` (pure-Python PyPI) | Full pip | Full pip |
| **Performance** | WASM (slower for heavy compute) | Native Python | Native + free GPU/TPU |
| **Collaboration** | Single user | JupyterHub | Real-time multi-user |
| **Code completion** | Not yet | Extensions available | Built-in |
| **Code completion** | Local Python keywords + live namespace | Extensions available | Built-in |
| **WASM FFI** | Call Rust WASM from any kernel | No | No |
| **Size** | ~2MB app + CDN runtimes | ~500MB with Anaconda | Cloud-based |

Expand Down Expand Up @@ -376,7 +376,7 @@ Near-term items to make R and cross-language features demo-ready:
- [x] **Memory & Storage panel** — Per-kernel WASM heap usage, storage quota breakdown, kernel unload, clear VFS/cache
- [ ] **Cell output collapse/expand** — Toggle long outputs with a click, especially useful on mobile
- [ ] **Execution counter** — `In [N]` / `Out [N]` numbering like Jupyter to track execution order
- [ ] **Basic tab-completion** — Keyword/variable completion in the input textarea
- [x] **Basic tab-completion** — Offline Python keyword/namespace ghost text in the composer and editable cells
- [ ] **Variable inspector** — Panel showing current variables and types across kernels
- [ ] **Undo delete cell** — Undo stack to recover accidentally deleted cells
- [ ] **Dark/light theme toggle** — Light theme option for classrooms/sunlight
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@
"test:header-shortcuts": "node test_header_shortcuts.mjs",
"test:android-back": "node test_android_back.mjs",
"test:lang-selector": "node test_lang_selector.mjs",
"test:math-palette": "node test_math_palette.mjs"
"test:math-palette": "node test_math_palette.mjs",
"test:autocomplete-core": "node test_autocomplete_core.mjs",
"test:autocomplete": "node test_autocomplete.mjs"
},
"keywords": [
"python",
Expand Down
2 changes: 1 addition & 1 deletion scripts/check-translations.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const IDENTIFIERS = [
];

/** Inline markup the renderer keeps; anything else is stripped at runtime. */
const ALLOWED_TAGS = new Set(['code', 'strong', 'em', 'b', 'i', 'br', 'a', 'span']);
const ALLOWED_TAGS = new Set(['code', 'kbd', 'strong', 'em', 'b', 'i', 'br', 'a', 'span']);

/** Sentence terminators across the scripts we ship. */
const TERMINATORS = /[.!?。!?।॥؟…]+/g;
Expand Down
5 changes: 3 additions & 2 deletions test_appearance.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ try {
document.body.appendChild(host);
const cat = window.i18n.catalogues[window.i18n.current]
= window.i18n.catalogues[window.i18n.current] || {};
cat.__keepprobe = 'Use <code>%pip install</code> or see '
cat.__keepprobe = 'Use <code>%pip install</code>, press <kbd>Tab</kbd>, or see '
+ '<a href="https://example.com">docs</a> <strong>now</strong>.';
window.i18n.applyToDom(document.body);
const rendered = host.innerHTML;
Expand All @@ -575,7 +575,8 @@ try {
return rendered;
});
check('safe inline markup is preserved',
/<code>%pip install<\/code>/.test(kept) && /<strong>now<\/strong>/.test(kept)
/<code>%pip install<\/code>/.test(kept) && /<kbd>Tab<\/kbd>/.test(kept)
&& /<strong>now<\/strong>/.test(kept)
&& /href="https:\/\/example\.com"/.test(kept), kept.slice(0, 100));

/* --------- applying CSS through the visibly-open dialog ------------- */
Expand Down
Loading
Loading