# Sprint 4: Professional Editor — Checklist (Revised)

> **Goal:** Transform the proof-of-concept GUI into a professional structured code editor
> by wiring the 18 unused backend components, integrating LSP for language intelligence,
> and adding real editor features with proper layout presets.
>
> **Current state:** Basic ImGui InputTextMultiline with preview panels. Tiny dockable
> windows that require manual resizing. Backend has 33 components; GUI uses only 5.
> Only Python/C++/Elisp tree-sitter grammars.
>
> **Target state:** A usable code editor with layout presets (VSCode/Emacs/JetBrains),
> inline syntax highlighting, LSP-powered diagnostics and navigation, native file dialogs,
> annotation UI, cross-language projection, optimization controls, and support for 8+ languages.
>
> **Key architectural decisions (from feature review):**
> - LSP integration provides standard language intelligence; Whetstone layers annotation-specific features on top
> - Layout presets are a first-class concept like keybinding profiles (not an afterthought)
> - AST extended with Import/ExternalModule concepts to prepare for Sprint 5 library-aware coding
> - Tree-sitter grammars added for JS/TS, Java, Rust, Go alongside existing Python/C++/Elisp

---

## Phase 4a: Layout & Code Editor Core (Steps 76–83)

The two highest-impact gaps: the docking layout starts broken (tiny panels)
and the editor area is a plain textbox. Fix both before anything else.

- [ ] **Step 76: Layout presets and docking configuration**
  Create `LayoutManager.h` with preset docking layouts, selectable like keybinding
  profiles. Programmatically configure ImGui DockBuilder on first launch or profile switch.
  Presets:
  - **VSCode**: Explorer 20% left, Editor 60% center, Panel 20% bottom, status bar
  - **Emacs**: Full-frame editor, optional side panels, minibuffer-style bottom bar
  - **JetBrains**: Project tree left, Editor center, tool windows right and bottom
  Menu: View > Layout > {VSCode, Emacs, JetBrains}. Default = VSCode.
  Store user's choice in `~/.whetstone/layout.json`. Restore on next launch.
  *New:* `LayoutManager.h`, modifies `main.cpp`

- [ ] **Step 77: Custom code editor renderer**
  Replace InputTextMultiline with a custom ImGui text renderer that draws
  characters individually with per-token colors from SyntaxHighlighter.
  Cursor position, text selection, keyboard input handled manually.
  Monospace grid layout. Blinking cursor. Visible whitespace toggle.
  *New:* `CodeEditorWidget.h`

- [ ] **Step 78: Line numbers and gutter**
  Fixed-width gutter on the left with line numbers (gray, right-aligned).
  Gutter also serves as anchor for future markers (errors, annotations, breakpoints).
  Click gutter = select entire line. Current line highlighted.
  Gutter width auto-adjusts for file length (3-digit vs 4-digit line numbers).
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 79: Auto-indent and smart editing**
  Wire `EditorMode.h` into the editor widget. On Enter: auto-indent based on
  language rules (Python: indent after colon, C++: indent after brace).
  Tab key inserts spaces per language config. Auto-close brackets/quotes.
  *Wires:* `EditorMode.h`

- [ ] **Step 80: Scroll, selection, clipboard**
  Smooth scrolling with mousewheel. Shift+click and Shift+arrow for selection.
  Ctrl+C/X/V clipboard integration (SDL clipboard API). Ctrl+A select all.
  Drag to select. Double-click selects word, triple-click selects line.
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 81: Code folding**
  Collapse/expand function bodies and block statements. Fold indicators in the
  gutter (▸/▾). Folded regions show `{...}` placeholder. Fold state per-buffer.
  Uses tree-sitter node types to identify foldable ranges.
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 82: Minimap**
  Narrow column on the right side of the editor showing a zoomed-out view of
  the full file. Click to scroll. Highlight viewport position. Color-coded
  to match syntax highlighting. Toggle via View menu.
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 83: Additional tree-sitter grammars**
  Add tree-sitter grammars via FetchContent for JavaScript, TypeScript, Java,
  Rust, and Go. Add `EditorMode` configs for each (indent rules, comment style,
  bracket pairs). Language menu updated. Syntax highlighting works for all 8
  languages. Parser CST-to-AST stubs (full conversion is Sprint 5).
  *Modifies:* `CMakeLists.txt`, `EditorMode.h`, `SyntaxHighlighter.h`

---

## Phase 4b: File Management (Steps 84–89)

Real file operations: native dialogs, filesystem tree, multi-tab.

- [ ] **Step 84: Native file dialogs**
  Integrate `tinyfiledialogs` (single C file, no dependency) or Portable File
  Dialogs via FetchContent. Replace the manual path-entry popup with OS-native
  Open/Save dialogs. Save As when file is `(untitled)`. Filter by language
  extension. Also used for "Open Folder" to set workspace root.
  *New dependency + modifies:* `main.cpp`

- [ ] **Step 85: Filesystem tree in Explorer**
  Replace hardcoded file list with a real recursive directory tree.
  Root = workspace folder (CWD or user-selected via Open Folder). Tree nodes
  for folders (expandable) and files (click to open). File/folder icons by
  extension/type. Respects `.gitignore` patterns for hiding.
  *Modifies:* `main.cpp`

- [ ] **Step 86: Multi-tab editing**
  Wire `BufferManager.h` into the GUI. Each open file = a tab in the editor.
  Click tab to switch. Middle-click or X button to close. Modified indicator (dot)
  on tab. Ctrl+Tab to cycle. Close confirmation if modified. Each buffer gets
  its own TextEditor + TextASTSync + CodeEditorWidget state.
  *Wires:* `BufferManager.h`

- [ ] **Step 87: Welcome screen**
  Wire `WelcomeScreen.h`. Show as a tab on startup when no file is open.
  Recent files list (persisted to `~/.whetstone/recent.json`). Quick actions:
  New File, Open File, Open Folder. Whetstone feature highlights. Keyboard
  shortcut cheat sheet. Dismisses when a file is opened.
  *Wires:* `WelcomeScreen.h`

- [ ] **Step 88: Drag-and-drop file open**
  Handle SDL_DROPFILE events. Drop a file onto the editor window → open it
  in a new tab. Drop a folder → set as workspace root. Visual feedback
  during drag (overlay "Drop to open").
  *Modifies:* `main.cpp`

- [ ] **Step 89: File watching and auto-reload**
  Detect external file changes (stat-based polling every 2s). If file changed
  on disk and buffer is clean → auto-reload. If buffer is dirty → prompt
  "File changed on disk. Reload?" Auto-save option (configurable interval).
  *New:* `FileWatcher.h`

---

## Phase 4c: LSP Client & Diagnostics (Steps 90–96)

Two-layer intelligence: LSP for standard language features, Whetstone for annotations.
This is the biggest architectural change from the original plan.

- [ ] **Step 90: LSP client core**
  Create `LSPClient.h` implementing the Language Server Protocol client.
  Communicates with external LSP servers via JSON-RPC over stdin/stdout pipes.
  Handles: initialize, initialized, shutdown, exit lifecycle.
  Spawns LSP server processes (configurable per language).
  *New:* `LSPClient.h`

- [ ] **Step 91: LSP diagnostics integration**
  Wire `textDocument/didOpen`, `textDocument/didChange`, `textDocument/didSave`.
  Receive `textDocument/publishDiagnostics` from LSP server. Parse diagnostic
  ranges, severity, messages. Display in new "Problems" tab in bottom panel.
  Click to jump to location. Merge with Whetstone-specific diagnostics.
  *Modifies:* `LSPClient.h`, `main.cpp`

- [ ] **Step 92: LSP auto-completion**
  Send `textDocument/completion` requests as user types (debounced).
  Show completion popup near cursor with candidates from LSP. Icons by
  completion kind (function, variable, keyword, snippet). Tab/Enter to accept.
  Escape to dismiss. Filter as user types.
  *Modifies:* `LSPClient.h`, `CodeEditorWidget.h`

- [ ] **Step 93: LSP hover and signature help**
  On hover over a symbol, send `textDocument/hover` → show tooltip with
  type info and docs. On typing `(` after a function, send
  `textDocument/signatureHelp` → show parameter info popup.
  *Modifies:* `LSPClient.h`, `CodeEditorWidget.h`

- [ ] **Step 94: Whetstone diagnostics layer**
  Run `AnnotationValidator` and `StrategyValidator` alongside LSP diagnostics.
  Whetstone diagnostics appear in the same Problems panel, tagged "[Whetstone]".
  Gutter shows both LSP errors (red) and Whetstone annotation warnings (orange).
  Wire `Pipeline.h` for full analysis pass (debounced, cached).
  *Wires:* `AnnotationValidator.h`, `StrategyValidator.h`, `Pipeline.h`

- [ ] **Step 94a: Source span tracking**
  Add source spans (start/end line/column) to AST nodes and propagate them from
  tree-sitter CST nodes. Serialize spans in `Serialization.h`. Whetstone diagnostics
  map to exact ranges using node spans (no heuristic line guessing).
  *Modifies:* `ast/ASTNode.h`, `ast/Parser.h`, `ast/Serialization.h`

- [ ] **Step 95: Gutter markers and inline squiggles**
  Red circle (error) and yellow triangle (warning) icons in the gutter for
  lines with diagnostics (from both LSP and Whetstone). Hover shows message
  as tooltip. Red wavy underline under the specific token range. Uses
  LSP diagnostic ranges directly; maps Whetstone node IDs → source positions.
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 96: LSP server configuration**
  Settings panel section for LSP servers. Default configs:
  - Python: `pylsp` or `pyright`
  - C/C++: `clangd`
  - Rust: `rust-analyzer`
  - Go: `gopls`
  - JS/TS: `typescript-language-server`
  - Java: `jdtls`
  User can override paths, add flags. Auto-detect installed servers.
  Schema validation via `ast/Schema.h` for Whetstone's AST layer.
  *Wires:* `ast/Schema.h`, modifies `SettingsManager.h`

---

## Phase 4d: Annotation UI (Steps 97–102)

Make Whetstone's unique memory annotations visible and editable.
This is what differentiates Whetstone from every other editor.

- [ ] **Step 97: Annotation gutter markers**
  Colored icons in the gutter for annotated functions/variables:
  blue = @Reclaim(Tracing), orange = @Owner(Single), red = @Deallocate(Explicit),
  green = @Lifetime(RAII), gray = @Allocate(Static). Hover shows annotation
  details. Click opens annotation editor.
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 98: Inline annotation decorations**
  Render annotation tags inline above or beside the annotated code:
  `@Reclaim(Tracing)` as a subtle colored label. Click to edit.
  Toggle visibility via View > Show Annotations. Respects layout preset
  (VSCode shows above, Emacs shows in margin, JetBrains shows beside).
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 99: Add/edit annotation context menu**
  Right-click on a function/variable → context menu with "Add Annotation...",
  "Edit Annotation", "Remove Annotation". Sub-menu lists available annotation
  types with strategy options. Mutations go through `ASTMutationAPI`.
  Changes recorded in orchestrator journal for undo.
  *Wires:* `ASTMutationAPI.h`

- [ ] **Step 100: Memory strategy suggestions**
  Wire `MemoryStrategyInference`. Show lightbulb icon in the gutter when
  the inferrer has a suggestion with confidence > 0.5. Click → popup showing
  suggested annotation with confidence score and reason. "Apply" button adds
  it via `ASTMutationAPI`. Suggestions refresh on language/code change.
  *Wires:* `MemoryStrategyInference.h`

- [ ] **Step 101: Annotation conflict highlighting**
  When `AnnotationValidator` detects a parent/child conflict, highlight both
  annotations with a red border and connecting line in the gutter. Tooltip
  explains the conflict. Quick-fix actions: "Remove child annotation",
  "Change to match parent".
  *Modifies:* `CodeEditorWidget.h`

- [ ] **Step 102: Memory strategy dashboard**
  New dockable panel: "Memory Strategies". Overview of all annotations in the
  current file. Grouped by type with counts. Click to navigate. Shows
  inference confidence for unannotated functions. Module-level strategy summary.
  Export annotations as JSON.
  *New:* `StrategyDashboard` panel in `main.cpp`

---

## Phase 4e: Cross-Language & Optimization (Steps 103–108)

Surface the code generation and optimization pipeline in the UI.

- [ ] **Step 103: Side-by-side generated code view**
  Split the editor area: source on left, generated code on right (read-only,
  syntax highlighted). Scroll-locked. Clicking a line in source highlights
  the corresponding generated output. Target language selector dropdown.
  *Wires:* `ast/Generator.h` (already used, now in split view)

- [ ] **Step 104: Cross-language projection button**
  Toolbar button: "Project to..." with dropdown (C++, Python, Elisp, plus
  new languages as generators are added). Uses `CrossLanguageProjector`
  to create a projected AST, opens generated code in a new tab (read-only,
  with annotations adapted). Shows annotation mapping summary in Output.
  *Wires:* `CrossLanguageProjector.h`

- [ ] **Step 105: Optimization controls panel**
  New "Optimize" panel or toolbar section. Buttons: "Constant Fold", "Dead Code
  Elimination", "Apply All". Each shows a result summary (nodes modified, warnings).
  Respects `StrategyAwareOptimizer` constraints — blocked operations grayed-out
  with tooltip explaining which annotation prevents them.
  *Wires:* `TransformEngine.h`, `StrategyAwareOptimizer.h`

- [ ] **Step 106: Transform history panel**
  New panel showing `IncrementalOptimizer.getTransformHistory()`. Each entry
  shows transform name, affected nodes, time. "Undo" button per entry.
  "Undo All" button. Provenance: hover a node in AST view → see which
  transform created/modified it. Color-coded by transform type.
  *Wires:* `IncrementalOptimizer.h`

- [x] **Step 107: Before/after diff view**
    When a transform is applied, show a diff view: original code on left,
    transformed on right. Changed lines highlighted in green/red.
    Accept/reject per-transform. "Preview" mode shows diff without applying.
    *Modifies:* `main.cpp`

  - [x] **Step 107a: Text-Editor Mode toggle**
    Add a per-buffer mode selector (Text vs Structured) in status bar or View menu.
    Text mode disables AST sync, generator/projection, and optimization panels.
    *Modifies:* `main.cpp`, `TextASTSync.h` (if needed for bypass)

  - [x] **Step 107b: UI behavior by mode**
    Hide or disable AST/Generated/Transforms/Optimize panels in Text mode.
    Generated split view collapses to single editor in Text mode.
    *Modifies:* `main.cpp`, `CodeEditorWidget.h`

  - [x] **Step 107c: Buffer persistence**
    Store mode per buffer and preserve on open/reopen; include in recent files.
    *Modifies:* `BufferManager.h`, `main.cpp`, `WelcomeScreen` persistence if needed

  - [x] **Step 108: Batch mutation UI**
    "Refactor" menu with batch operations: "Rename Variable", "Extract Function",
    "Inline Variable". Each uses `BatchMutationAPI.applySequence()` with atomic
    rollback on failure. Preview changes in diff view before applying.
    *Wires:* `BatchMutationAPI.h`

---

## Phase 4f: Navigation & Commands (Steps 109–114)

IDE-quality navigation, powered by LSP for standard features and ContextAPI for
Whetstone-specific AST navigation.

- [x] **Step 109: Command palette**
  Ctrl+Shift+P opens a fuzzy-searchable command list. All menu actions registered
  as commands. Type to filter. Shows keybinding next to each command.
  Most-recently-used commands float to top. Extensible for plugins.
  *New:* `CommandPalette.h`

- [x] **Step 110: Go-to-definition (LSP + Whetstone)**
  Ctrl+click on a symbol → jump to its definition. Primary: send
  `textDocument/definition` to LSP server. Fallback: use `ContextAPI.getInScopeSymbols()`
  for Whetstone AST-level resolution. Hover shows definition preview popup.
  Works across files when LSP supports it.
  *Wires:* `ContextAPI.h`, `LSPClient.h`

- [x] **Step 111: Symbol outline panel**
  New "Outline" panel. Primary: use LSP `textDocument/documentSymbol` for the
  symbol tree. Fallback: walk Whetstone AST for functions/variables/parameters.
  Click to navigate. Icons by symbol kind. Search/filter box.
  *Wires:* `ContextAPI.h`, `LSPClient.h`

- [x] **Step 112: Breadcrumb navigation**
  Bar above the editor showing the current scope path:
  `Module > Function:add > body > Return`. Click any segment to jump.
  Updates as cursor moves. Uses Whetstone AST parent chain (our unique feature —
  LSPs don't provide this annotation-aware scope path).
  *Modifies:* `CodeEditorWidget.h`

- [x] **Step 113: Project-wide search**
  Ctrl+Shift+F opens search panel. Searches all files in the workspace.
  Results grouped by file with line previews. Click to open file at location.
  Regex support. Include/exclude glob filters.
  *New:* `ProjectSearch.h`

- [x] **Step 114: Go-to-line**
  Ctrl+G opens a quick input: type line number → jump. Supports `:line:col`
  format. Shows total line count.
  *Modifies:* `main.cpp`

---

## Phase 4g: Infrastructure & Persistence (Steps 115–121)

Wire the orchestrator, serialization, session management, and prepare
AST extensions for Sprint 5.

- [x] **Step 115: Wire Orchestrator**
  Connect `Orchestrator.h` to the GUI. All AST mutations go through the
  orchestrator's undo/redo journal (replacing TextEditor's simple stack).
  Orchestrator manages the canonical AST state. GUI reads from it.
  Emacs daemon config path exposed as a setting (prepares for Sprint 5
  Emacs library integration — defaults to system Emacs, user can point to
  their own `~/.emacs.d/`).
  *Wires:* `Orchestrator.h`

- [x] **Step 116: Project save/load (AST serialization)**
  Save/load `.whetstone` project files using `ast/Serialization.h`.
  JSON format preserving the full AST with annotations. File > Save Project /
  Open Project. Includes workspace root path and open buffer list.
  *Wires:* `ast/Serialization.h`

- [x] **Step 117: Session persistence**
  Remember window layout (docking configuration), open files, active tab,
  cursor positions, fold state, and layout preset across sessions.
  Saved to `~/.whetstone/session.json`. Restore on next launch.
  *New:* `SessionManager.h`

- [x] **Step 118: Settings panel**
  View > Settings opens a dockable panel. Options: font size (12–24),
  tab size (2/4/8), theme variant (Dark/Light), auto-save interval,
  show minimap, show line numbers, LSP server paths, layout preset,
  keybinding profile. Persisted to `~/.whetstone/settings.json`.
  *New:* `SettingsManager.h`

- [x] **Step 119: Zoom**
  Ctrl+= zoom in, Ctrl+- zoom out, Ctrl+0 reset. Scales the editor font
  size dynamically. Status bar shows current zoom level.
  *Modifies:* `main.cpp`

- [x] **Step 120: Undo/Redo rework**
  Unify undo stacks: orchestrator journal is the single source of truth.
  TextEditor undo feeds into orchestrator. Undo/redo affects both text and
  AST atomically. Status bar shows undo depth.
  *Modifies:* `Orchestrator.h`, `main.cpp`

- [x] **Step 121: AST Import/ExternalModule concepts**
  Extend `ASTNode.h` with new concept types: `Import` (represents `import numpy`,
  `#include <vector>`, `(require 'cl-lib)`), `ExternalModule` (represents an
  external library with its public API surface), `TypeSignature` (function
  parameter and return types from external APIs). Serialization support.
  These are data-only stubs in Sprint 4 — Sprint 5 populates them with real
  library metadata.
  *Modifies:* `ast/ASTNode.h`, `ast/Serialization.h`

---

## Phase 4h: Agent & Terminal (Steps 122–126)

External tool integration and agent connectivity.

- [x] **Step 122: Integrated terminal**
  New "Terminal" tab in the bottom panel. Subprocess output capture (not a
  full terminal emulator — captures stdout/stderr from spawned processes).
  Run shell commands, see output. Ctrl+` to toggle. Working directory =
  workspace root. Scrollable output with ANSI color support.
  *New:* `TerminalPanel.h`

- [x] **Step 123: Run code button**
  Toolbar button (play icon) to run the current file. Auto-detects runner:
  Python: `python file.py`, C++: compile and run, Rust: `cargo run`,
  Go: `go run`, JS: `node file.js`. Output goes to Terminal panel.
  Status bar shows "Running..." / exit code. Ctrl+Shift+B for build.
  *Modifies:* `main.cpp`

- [x] **Step 124: Wire WebSocket agent server**
  Start `WebSocketAgentServer` when the editor launches (configurable port).
  External AI agents can connect, query the AST, and apply mutations via
  JSON-RPC. Agent activity logged in "Agents" tab in the bottom panel.
  Agents receive LSP diagnostics and Whetstone annotations as context.
  *Wires:* `WebSocketServer.h`

- [x] **Step 125: Connected agents panel**
  "Agents" tab shows currently connected agents: name, session ID, last activity.
  Manual disconnect button. Live activity log showing JSON-RPC method calls
  and results. Agents can be granted/revoked mutation permissions.
  *Modifies:* `main.cpp`

- [x] **Step 126: Build system integration**
  Detect project type (CMakeLists.txt, setup.py, Cargo.toml, package.json,
  Makefile, go.mod) and offer build commands. Build output in Terminal panel.
  Error parsing: click compiler errors to jump to source location.
  *New:* `BuildSystem.h`

---

## Summary

| Phase | Steps | Description | Key Components Wired |
|-------|-------|-------------|---------------------|
| 4a | 76–83 | Layout presets + code editor core | LayoutManager, EditorMode, 5 new tree-sitter grammars |
| 4b | 84–89 | File management | BufferManager, WelcomeScreen, FileWatcher |
| 4c | 90–96 | LSP client + diagnostics | LSPClient, AnnotationValidator, StrategyValidator, Pipeline, Schema |
| 4d | 97–102 | Annotation UI | ASTMutationAPI, MemoryStrategyInference |
| 4e | 103–108 | Cross-language + optimization | CrossLanguageProjector, TransformEngine, StrategyAwareOptimizer, IncrementalOptimizer, BatchMutationAPI |
| 4f | 109–114 | Navigation + commands | ContextAPI, LSPClient |
| 4g | 115–121 | Infrastructure + persistence + AST extensions | Orchestrator, Serialization, Import/ExternalModule AST concepts |
| 4h | 122–126 | Agent + terminal | WebSocketServer, BuildSystem |

**Total: 51 steps across 8 phases.**

**Key changes from original plan:**
1. Layout presets added as Step 76 (first thing built)
2. Phase 4c rebuilt around LSP client as primary intelligence, Whetstone as overlay
3. Phase 4f navigation uses LSP with Whetstone AST fallback
4. 5 new tree-sitter grammars added (JS/TS, Java, Rust, Go) in Phase 4a
5. Import/ExternalModule AST concepts added (Step 121) to prepare for Sprint 5
6. Emacs daemon config exposed as a setting (Step 115) for Sprint 5 Emacs libs
