Skip to content
Merged
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: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
node-version: "24"
- name: Extension unit tests
run: |
cd extensions/atom-ai
cd extensions/levelcode-ai
for t in test/*.test.js; do node "$t"; done

build:
Expand Down
26 changes: 13 additions & 13 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ lives in the tracked repo and is re-applied onto a clean clone:

| Ours (edit here, tracked) | Gets installed into (generated) | By |
| --- | --- | --- |
| `extensions/atom-npp-pack/`, `extensions/atom-ai/` | `vscode/extensions/*` | `apply-branding.mjs` (copy) |
| `extensions/levelcode-npp-pack/`, `extensions/levelcode-ai/` | `vscode/extensions/*` | `apply-branding.mjs` (copy) |
| `branding/product.overlay.json`, `branding/icons/` | `vscode/product.json`, `vscode/resources/...` | `apply-branding.mjs` (merge/copy) |
| `patches/levelcode-core.patch` | edits to `vscode/src/**`, `vscode/build/**` | `bootstrap.sh` (`git apply`) |

Expand All @@ -33,12 +33,12 @@ docs/CORE-PATCHES.md log of every edit inside vscode/ (tagged // [LevelCo
docs/M0-RUNBOOK.md, EXIT-TEST.md, M1-SPEC.md
branding/product.overlay.json LevelCode identity + Open VSX gallery (deep-merged onto product.json)
branding/icons/ app icon source PNG, generated .icns, 1024 png
extensions/atom-npp-pack/ Notepad++ power-editing pack (plain JS, no build step)
extensions/atom-ai/ native Claude AI (chat, inline completion, providers, edit-with-diff, LM provider)
extensions/atom-themes/ signature One Dark / One Light themes (JSON, default via configurationDefaults)
extensions/atom-hackability/ user init script + Atom/NPP keymap presets + package generator & hot-reload dev loader
extensions/atom-sync/ 'levelcode' auth provider that lights up the built-in Settings Sync (LevelCode Sync, S0)
extensions/atom-updater/ notify-only update checker (polls the update feed; never auto-applies)
extensions/levelcode-npp-pack/ Notepad++ power-editing pack (plain JS, no build step)
extensions/levelcode-ai/ native Claude AI (chat, inline completion, providers, edit-with-diff, LM provider)
extensions/levelcode-themes/ signature One Dark / One Light themes (JSON, default via configurationDefaults)
extensions/levelcode-hackability/ user init script + Atom/NPP keymap presets + package generator & hot-reload dev loader
extensions/levelcode-sync/ 'levelcode' auth provider that lights up the built-in Settings Sync (LevelCode Sync, S0)
extensions/levelcode-updater/ notify-only update checker (polls the update feed; never auto-applies)
patches/levelcode-core.patch our core source edits, applied on bootstrap
scripts/ bootstrap.sh, apply-branding.mjs, run-dev.sh, build-macos.sh, make-dmg.sh, make-icon.sh; atom (CLI launcher) + install-level.sh
tools/ dependency-free reference servers: sync-server (/v1 Settings-Sync), update-server (/api/update feed)
Expand Down Expand Up @@ -83,17 +83,17 @@ Tracked in `patches/levelcode-core.patch`, tagged with `// [LevelCode]`. Find th
## Settings shipped as defaults (via extension `configurationDefaults` or core patch)

- `files.hotExit = onExitAndWindowClose` (core patch — application-scoped).
- `workbench.editorLargeFileConfirmation = 2048`, `chat.commandCenter.enabled = false`, `chat.disableAIFeatures = true` (atom-npp-pack).
- `workbench.editorLargeFileConfirmation = 2048`, `chat.commandCenter.enabled = false`, `chat.disableAIFeatures = true` (levelcode-npp-pack).
- Extensions can only override **machine-overridable / window / resource / language-overridable** scoped settings — NOT application/machine. (That's why hotExit needed a core patch.)

## Feature status

**M1 — Notepad++ pack (`extensions/atom-npp-pack/`, all done, plain JS):**
**M1 — Notepad++ pack (`extensions/levelcode-npp-pack/`, all done, plain JS):**
macros (`Cmd+Shift+R`/`Cmd+Alt+P`), Duplicate file (`Cmd+D` / Explorer menu), Sublime hot-exit,
line operations (sort/dedup/case/…), column incrementing numbers, encoding/EOL status-bar toggle,
big-file mode badge. Files: extension.js + fileOps/lineOps/columnOps/encodingEol/bigFile.js.

**M2 — native AI (`extensions/atom-ai/`, working):**
**M2 — native AI (`extensions/levelcode-ai/`, working):**
- `providers/` — **multi-provider BYOK (P1)**. A registry data table (`providers/index.js` `PROVIDERS` +
`getProvider`/`normId`/`secretStorageKey`/`isInsecureCustomUrl`) dispatches `streamChat()`/`complete()` on the
row's `kind`: **Anthropic** keeps its native adapter (`providers/anthropic.js` — prompt caching + full tool-use,
Expand Down Expand Up @@ -147,13 +147,13 @@ big-file mode badge. Files: extension.js + fileOps/lineOps/columnOps/encodingEol
multi-session core effort. We use the diff-tab review instead.
- Built since M2 shipped: inline tab-completion (`inlineComplete.js`), multi-file + auto-retrieval chat context
(`gatherAutoContext`), chat moved to the right side bar, typewriter streaming, `make-dmg.sh` packaging.
- M3 so far: One Dark/Light themes (`atom-themes`); user init script + Atom/Notepad++ keymap presets +
package generator with live hot-reload (`atom-hackability`). The Atom/NPP keymap also clears the old M1 leftover.
- M3 so far: One Dark/Light themes (`levelcode-themes`); user init script + Atom/Notepad++ keymap presets +
package generator with live hot-reload (`levelcode-hackability`). The Atom/NPP keymap also clears the old M1 leftover.
- M4 agentic multi-file tasks: DONE. `agent.js` has the full tool loop — list_files/read_file/search,
update_plan, edit_file/write_file/**delete_file** (apply-then-review with Keep/Undo + per-turn checkpoint
restore via `reviewSession.js`), run_command(+background)/read_command_output, ask_user, use_skill — plus the
M5 auto-verify loop. `delete_file` also enables rename/move (write new path → delete old).
- LevelCode Sync (S0) + notify-only updater (U0): see `extensions/atom-sync` / `extensions/atom-updater` + `tools/`.
- LevelCode Sync (S0) + notify-only updater (U0): see `extensions/levelcode-sync` / `extensions/levelcode-updater` + `tools/`.
- Not yet built: remaining M3 hackability — settings UI, theme studio, VS Code settings import.

## Conventions
Expand Down
2 changes: 1 addition & 1 deletion blog/atom-style-package-hot-reload.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,5 +169,5 @@ Write, save, see it. Welcome back.
---

*LevelCode is an AI-native, hackable, Notepad++-powered editor for macOS, built on the MIT
Code-OSS core. The package generator and hot-reload loader live in the `atom-hackability`
Code-OSS core. The package generator and hot-reload loader live in the `levelcode-hackability`
extension, alongside the user init script and the Atom/Notepad++ keymap presets.*
8 changes: 4 additions & 4 deletions branding/product.overlay.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,15 @@
"urlProtocol": "levelcode",
"quality": "stable",

"_syncComment": "LevelCode Sync (built-in Settings Sync + the `levelcode` auth provider from extensions/atom-sync) was REMOVED for now — the managed sync host isn't built and it duplicated the LevelCode Cloud sign-in. Removed at source: the atom-sync extension, this configurationSync.store block, and the Welcome 'Sync' step. Re-add when the managed sync host ships.",
"_syncComment": "LevelCode Sync (built-in Settings Sync + the `levelcode` auth provider from extensions/levelcode-sync) was REMOVED for now — the managed sync host isn't built and it duplicated the LevelCode Cloud sign-in. Removed at source: the levelcode-sync extension, this configurationSync.store block, and the Welcome 'Sync' step. Re-add when the managed sync host ships.",

"licenseName": "MIT",
"licenseUrl": "https://github.com/levelcode/levelcode/blob/main/LICENSE",
"reportIssueUrl": "https://github.com/levelcode/levelcode/issues/new",
"licenseUrl": "https://github.com/levelcodeai/levelcode/blob/main/LICENSE",
"reportIssueUrl": "https://github.com/levelcodeai/levelcode/issues/new",

"_downloadComment": "Download + update funnel through levelcode.ai (see site/app/download/[arch]/route.ts). downloadUrl is where the notify-only updater's Download button sends the user; releaseNotesUrl backs its 'Release Notes' button. updateUrl is the feed base — the updater GETs {updateUrl}/api/update/{target}/{quality}/{commit}; until that endpoint is live it returns 404 and the updater silently treats it as 'up to date' (notify-only, non-fatal). RELEASE NOTE: levelcode.ai must resolve to the deployed site before these links work.",
"downloadUrl": "https://levelcode.ai/download",
"releaseNotesUrl": "https://github.com/levelcode/levelcode/releases/latest",
"releaseNotesUrl": "https://github.com/levelcodeai/levelcode/releases/latest",
"updateUrl": "https://levelcode.ai",

"enableTelemetry": false,
Expand Down
2 changes: 1 addition & 1 deletion docs/CORE-PATCHES.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ comment in the code, so a rebase onto a newer Code-OSS tag is easy to re-apply/v
that is *ours* lives in the tracked repo and is re-installed onto a clean clone:

- **Branding** → `branding/product.overlay.json` (+ `branding/icons/`), applied by `apply-branding.mjs`.
- **Extensions** → `extensions/atom-npp-pack/`, `extensions/atom-ai/` are the **canonical source**;
- **Extensions** → `extensions/levelcode-npp-pack/`, `extensions/levelcode-ai/` are the **canonical source**;
`apply-branding.mjs` copies them into `vscode/extensions/`. Edit them *here*, not in `vscode/`.
- **Core source edits** → captured as `patches/levelcode-core.patch`; `bootstrap.sh` applies it
(`git apply --3way`) onto the fresh checkout.
Expand Down
6 changes: 3 additions & 3 deletions docs/M1-SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ Goal of M1: make LevelCode feel like Notepad++ for the editing muscle-memory Ser

## Design principle: isolate, don't scatter

Everything that **can** live in a first-party bundled extension **does** — shipped enabled by default as the "Notepad++ Pack" (`extensions/atom-npp-pack/`). This keeps our code out of upstream core files so rebasing onto new Code-OSS stays cheap (PLAN.md §8). We only touch core where the extension API genuinely can't reach: large-file rendering and the encoding/EOL status-bar affordances. Those core touches are kept in clearly marked, self-contained modules.
Everything that **can** live in a first-party bundled extension **does** — shipped enabled by default as the "Notepad++ Pack" (`extensions/levelcode-npp-pack/`). This keeps our code out of upstream core files so rebasing onto new Code-OSS stays cheap (PLAN.md §8). We only touch core where the extension API genuinely can't reach: large-file rendering and the encoding/EOL status-bar affordances. Those core touches are kept in clearly marked, self-contained modules.

Two buckets:

- **Bucket A — bundled extension** (`atom-npp-pack`): macros, line operations, column-mode extras, NPP keymap. No core edits.
- **Bucket A — bundled extension** (`levelcode-npp-pack`): macros, line operations, column-mode extras, NPP keymap. No core edits.
- **Bucket B — core touches** (small, isolated): big-file mode, always-visible encoding/EOL status bar items. Each guarded behind an `_atomPlusPlus` product.json flag so it's easy to diff and toggle.

---
Expand Down Expand Up @@ -73,7 +73,7 @@ Ship a selectable **"Notepad++"** keymap (alongside an "Atom" keymap from M3) so

## Build order & milestone gates

1. **Scaffold `atom-npp-pack`** bundled extension + "Notepad++ Pack" settings namespace (`levelcode.*`). Wire it into the build's built-in extensions list.
1. **Scaffold `levelcode-npp-pack`** bundled extension + "Notepad++ Pack" settings namespace (`levelcode.*`). Wire it into the build's built-in extensions list.
2. **Macros** (headline) → demo + exit test.
3. **Line ops + column extras** (fast wins, pure extension) → exit tests.
4. **Encoding/EOL status bar** (Bucket B, small core touch) → exit test.
Expand Down
2 changes: 1 addition & 1 deletion docs/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ from **levelcode.ai/download**.

## 5. Point the update feed at the release

The notify-only updater (`extensions/atom-updater`) polls a feed from `tools/update-server`. After
The notify-only updater (`extensions/levelcode-updater`) polls a feed from `tools/update-server`. After
publishing, update the feed's release entry (version + the release-asset URLs above) so running installs
see the new version. Keep the feed version in lockstep with the tag.

Expand Down
2 changes: 1 addition & 1 deletion docs/levelcode-agent-sketch-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Everything below sits on the multi-provider layer already shipped:
## 1. The SK1 skeleton (shipped)

```
extensions/atom-ai/
extensions/levelcode-ai/
sketch.js controller: panel, persistence, THE RUNNER (reentrancy-guarded, abortable)
sketch/agentCatalog.js 96 agent archetypes in 13 palette groups (derived from ruflo, MIT © ruvnet — names + one-line roles only)
sketch/templates.js ready-made topologies — incl. the "Design a Key-Value Store" hero template [unit-tested]
Expand Down
4 changes: 2 additions & 2 deletions docs/levelcode-multiprovider-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ Everything reduces to **OpenAI Chat Completions**, **Anthropic Messages** (block

## 2. Recommended architecture for LevelCode

### 2.1 Module layout — `extensions/atom-ai/providers/`
### 2.1 Module layout — `extensions/levelcode-ai/providers/`

Today everything is one flat `providers.js` with eight provider-named exports and hard-coded Anthropic assumptions in 4 places. Evolve it into a directory (keep `providers.js` as a thin re-export shim during migration so nothing breaks mid-refactor):

```
extensions/atom-ai/providers/
extensions/levelcode-ai/providers/
index.js # registry (PROVIDERS data table) + getProvider(id) + resolveProvider(id) + shared readLines()
anthropic.js # native Anthropic Messages adapter (streamClaude/completeClaude/streamClaudeAgentTurn moved here)
openaiCompat.js # THE universal adapter — /v1/chat/completions, param'd by {baseURL, apiKey, headers}
Expand Down
Loading