23 KiB
Sprint 5: Library-Aware Constructive Coding — Plan
Goal: Make Whetstone a library-aware, multi-language, agent-powered coding environment where imported libraries inform suggestions, completions, and agent recommendations — as a convenience, not a hard constraint. Users can always write whatever code they want. Integrate Emacs ecosystem for Elisp users. Expand language coverage with full generators. Build the constructive coding flow that makes Whetstone unique.
Prerequisites: Sprint 4 complete (LSP integration, layout presets, annotation UI, AST Import/ExternalModule concept stubs, Orchestrator wired, 8+ tree-sitter grammars).
Key themes:
- Library/dependency management and API indexing
- Constructive coding flow — agents prioritize imported library primitives (convenience, not constraint)
- Emacs ecosystem integration (user libraries, packages, init.el)
- Full code generators for all supported languages
- Advanced agent capabilities
Phase 5a: Library & Dependency Management (Steps 127–133)
The foundation: import libraries, parse their APIs, index their symbols.
-
Step 127: Package registry abstraction Create
PackageRegistry.hwith a unified interface for querying package metadata across ecosystems. Adapters for:- Python: PyPI (REST API for package info, version listing)
- JavaScript/TypeScript: npm registry
- Rust: crates.io
- Go: pkg.go.dev / Go module proxy
- Java: Maven Central
- C/C++: vcpkg manifest / Conan
Each adapter returns: package name, available versions, description,
dependencies, homepage URL.
New:
PackageRegistry.h
-
Step 128: Dependency file parsing Parse existing dependency files to discover what's already imported:
- Python:
requirements.txt,pyproject.toml,setup.py - JS/TS:
package.json - Rust:
Cargo.toml - Go:
go.mod - Java:
pom.xml,build.gradle - C/C++:
vcpkg.json,CMakeLists.txt(find_package) PopulateImportAST nodes from parsed dependencies. New:DependencyParser.h, modifiesast/ASTNode.h(Import concept)
- Python:
-
Step 129: Dependency management UI New dockable panel: "Dependencies". Lists all imported packages with version. "Add Package" button → search dialog (queries PackageRegistry). Version selector dropdown. "Remove" button. "Update" shows available newer versions. Changes write back to the appropriate dependency file. New:
DependencyPanelinmain.cpp -
Step 130: Library API indexing via LSP When a package is imported, leverage the LSP server to extract its public API surface. Send
workspace/symbolqueries andtextDocument/completionwith library prefix to discover available functions, classes, constants. Cache results inExternalModuleAST nodes (name, public symbols, type signatures). Modifies:LSPClient.h,ExternalModuleAST concept -
Step 131: Library API indexing via type stubs Fallback for when LSP isn't available or insufficient. Parse type stub files:
- Python:
.pyistub files (typeshed, bundled stubs) - TypeScript:
.d.tsdeclaration files - C/C++: header files (tree-sitter parse for function signatures)
- Rust: parse
lib.rspublic items Extract function signatures, class/struct definitions, constants intoTypeSignatureAST nodes attached toExternalModule. New:StubParser.h, modifiesExternalModuleAST concept
- Python:
-
Step 132: Library symbol browser New panel or Explorer sub-section: "Libraries". Tree view of imported libraries → modules → classes/functions → parameters. Click to see documentation (from LSP hover or stub docstrings). Search/filter box. Drag a symbol into the editor → inserts a usage template. New:
LibraryBrowserpanel -
Step 133: Import statement generation When user references a symbol from an
ExternalModule, auto-generate the correct import statement for the target language:- Python:
from numpy import array - JS:
import { useState } from 'react' - C++:
#include <vector> - Rust:
use std::collections::HashMap; - Go:
import "fmt" - Elisp:
(require 'cl-lib)Imports auto-sorted per language convention. Unused imports flagged. Modifies: generators inGenerator.h,CodeEditorWidget.h
- Python:
Phase 5b: Constructive Coding Flow (Steps 134–140)
The core innovation: agents and completions prioritize the primitives available in the user's imported libraries. Code is built UP from library building blocks rather than hallucinated from training data. Imported libraries are a convenience, not a 100% constraint — users can always write any code they want, but the system surfaces library functions first and nudges toward what's already available.
-
Step 134: Available primitives registry Create
PrimitivesRegistry.hthat aggregates all available symbols:- Built-in language primitives (Python builtins, C++ std library, etc.)
- Imported library symbols (from
ExternalModuleAST nodes) - User-defined symbols (from the current module's AST)
Registry provides:
getAvailableFunctions(),getAvailableTypes(),getAvailableConstants(), filtered by scope and import state. New:PrimitivesRegistry.h
-
Step 135: Library-aware completion Modify the completion system (LSP + Whetstone) to prioritize symbols from
PrimitivesRegistrywithout excluding others. When an agent or user types, completion candidates are ranked: imported library functions first, then builtins, then other known symbols. Unimported symbols shown dimmed with "auto-import" action. Users can always type and use anything — library awareness is a convenience, not a gate. Completions include parameter types fromTypeSignature. Modifies:CodeEditorWidget.h,LSPClient.h -
Step 136: Agent library-aware mode New agent capability flag:
preferImports. When set, the agent (via WebSocket API) prefers inserting code that references symbols inPrimitivesRegistry, and warns (not rejects) when using symbols outside imported libraries. TheASTMutationAPIchecks mutations: if a mutation references a function not in anyExternalModuleor the current module, return a warning listing available alternatives — but still allow the mutation. An optionalstrictModeflag is available for users who DO want hard enforcement, but it defaults to off. Modifies:ASTMutationAPI.h,WebSocketServer.h -
Step 137: Function composition builder New UI mode: "Compose". Shows a visual flow of available library functions. User picks a function → sees its inputs/outputs → picks the next function whose input matches the previous output. Builds a pipeline/chain visually. Generates code from the composition. Think: visual dataflow programming backed by real library APIs. New:
CompositionBuilder.h,CompositionPanelinmain.cpp -
Step 138: Type-aware code generation Enhance generators to use
TypeSignatureinformation from imported libraries. When generating C++ from Python code that uses numpy, the generator knowsnumpy.arraymaps tostd::vector<double>(or Eigen::MatrixXd). Cross-language projection respects library type mappings. Modifies:CrossLanguageProjector.h,Generator.h -
Step 139: Library compatibility matrix Track which libraries have equivalents across languages. Example:
numpy(Python) ↔Eigen(C++) ↔ndarray(Rust). When projecting code cross-language, suggest equivalent libraries. User confirms library mapping before projection. Stored as a configurable JSON mapping file. New:LibraryCompatibility.h -
Step 140: Constructive coding tests End-to-end tests verifying:
- Import numpy → agent prioritizes numpy/builtin functions in suggestions
- Remove import → agent's prioritized primitives shrink (but arbitrary code still allowed)
- Agent with
preferImportswarns on out-of-library usage but doesn't block - Agent with optional
strictModedoes block out-of-library usage - Cross-language projection with library mapping works
- Function composition builder generates correct code
- Type-aware generation produces compilable output
New:
step140_test.cppand supporting test infrastructure
Phase 5c: Emacs Ecosystem Integration (Steps 141–146)
For Emacs users: respect their init.el, load their packages, expose Emacs functionality through the Whetstone UI.
-
Step 141: Emacs daemon with user config Modify the Orchestrator's Emacs daemon to start with the user's init file. Setting: "Emacs Config Path" (defaults to
~/.emacs.d/init.el). Daemon loads user's packages (MELPA, ELPA, straight.el, use-package). Startup log shown in Output panel. Errors in init.el reported as diagnostics. Modifies:EmacsIntegration.h,Orchestrator.h -
Step 142: Elisp package browser New panel section for Emacs users: "Emacs Packages". Lists loaded packages from the running daemon (query via
package-alist). Shows: package name, version, description. "Load Package" button sends(require 'package-name)to the daemon. Status: loaded/available/not-installed. New:EmacsPackageBrowserpanel -
Step 143: Elisp function discovery Query the running Emacs daemon for available functions from loaded packages. Send
(apropos-internal "prefix")→ get function list. Send(describe-function 'name)→ get docstring and signature. PopulateExternalModuleAST nodes for Elisp libraries. Feed intoPrimitivesRegistryfor constrained coding. Modifies:ElispCommandBuilder,PrimitivesRegistry.h -
Step 144: Emacs keybinding deep integration Go beyond the simple keybinding profile. In Emacs layout mode, support:
- M-x command execution (sends to Emacs daemon)
- Emacs-style prefix keys (C-x C-f, C-x C-s, C-c prefix maps)
- Minibuffer emulation at the bottom of the editor
- Mode line showing major/minor modes
Keybindings loaded from user's Emacs config (key-binding query to daemon).
Modifies:
KeybindingManager.h,LayoutManager.h
-
Step 145: Org-mode and Literate programming support Parse
.orgfiles using a tree-sitter-org grammar. Render org-mode documents with headings, source blocks, and prose. Source blocks are editable with full syntax highlighting and LSP support. Execute source blocks via the Emacs daemon or language runners. Results rendered inline (like Jupyter notebooks). New: tree-sitter-org grammar,OrgMode.h -
Step 146: Emacs-Whetstone bridge Bidirectional sync: Emacs buffers ↔ Whetstone buffers. When the user has the Emacs layout active, they can switch to pure Emacs (daemon connected to a graphical frame) for operations Whetstone doesn't support yet, then switch back. Buffer state synchronized via the Orchestrator's RPC channel. Modifies:
Orchestrator.h,EmacsIntegration.h
Phase 5d: Full Language Coverage (Steps 147–153)
Complete generators and CST-to-AST conversion for all supported languages. Sprint 4 added tree-sitter grammars for syntax highlighting; Sprint 5 adds full semantic support.
-
Step 147: JavaScript/TypeScript CST-to-AST Full tree-sitter CST-to-AST conversion for JavaScript and TypeScript. Handle: functions (arrow, declaration, expression), classes, async/await, destructuring, template literals, modules (import/export), JSX. TypeScript: type annotations mapped to Whetstone Type AST nodes. Modifies:
Parser.h -
Step 148: JavaScript/TypeScript generator Generate JavaScript and TypeScript source from Whetstone AST. Handle: function declarations, arrow functions, classes, async/await, destructuring, template literals, import/export statements. TypeScript generator includes type annotations. Memory annotations map to WeakRef/FinalizationRegistry for @Reclaim, ownership comments for documentation. Modifies:
Generator.h -
Step 149: Java CST-to-AST and generator Full tree-sitter Java parsing: classes, interfaces, methods, generics, annotations (Java @annotations map to Whetstone annotations), try/catch, lambdas. Generator produces compilable Java with proper class wrapping, imports, access modifiers. Memory annotations map to: @Reclaim(Tracing) → GC-managed (default), @Owner(Single) → AutoCloseable/try-with-resources. Modifies:
Parser.h,Generator.h -
Step 150: Rust CST-to-AST and generator Full tree-sitter Rust parsing: functions, structs, enums, traits, impls, lifetimes, pattern matching, Result/Option. Generator produces Rust with proper ownership semantics. Memory annotations map naturally: @Owner(Single) → owned types, @Owner(Shared_ARC) → Arc, @Lifetime(RAII) → Drop trait, @Reclaim(Tracing) → Rc with caution note. Modifies:
Parser.h,Generator.h -
Step 151: Go CST-to-AST and generator Full tree-sitter Go parsing: functions, structs, interfaces, goroutines, channels, defer, multiple return values. Generator produces Go with proper package/import structure. Memory annotations map to: @Reclaim(Escape) → heap allocation via escape analysis, @Deallocate(Explicit) → manual Close()/Release() patterns, @Owner(Single) → ownership convention comments. Modifies:
Parser.h,Generator.h -
Step 152: Cross-language projection for new languages Extend
CrossLanguageProjectorto handle projection between all pairs of supported languages (Python, C++, Elisp, JS/TS, Java, Rust, Go). Annotation adaptation rules for each target. Library compatibility mappings (Phase 5b) used to suggest equivalent libraries. Modifies:CrossLanguageProjector.h -
Step 153: Language coverage tests End-to-end tests for each new language: parse → annotate → validate → optimize → generate. Cross-language projection tests between all supported pairs. Verify memory annotation semantics are preserved across projections. New:
step153_test.cpp(multi-language integration test)
Phase 5e: Advanced Agent Capabilities (Steps 154–159)
Make agents truly useful: they understand libraries, prioritize available primitives, and assist with constructive coding.
-
Step 154: Agent library context When an agent connects via WebSocket, it receives the current
PrimitivesRegistrystate: available libraries, their functions, type signatures. The agent'sgetASTresponse includesExternalModulenodes. Agents can query:getAvailablePrimitives(scope)to see what libraries are imported — this informs their suggestions but doesn't limit what they can produce. Modifies:WebSocketServer.h,ASTQueryAPI -
Step 155: Agent library-aware code generation New agent RPC method:
generateCode(spec, preferences). Agent provides a natural language spec ("sort this list, then filter by threshold"), Whetstone generates code preferring available library primitives. UsesPrimitivesRegistryto select appropriate functions when possible, falls back to standard library or raw code when no library match exists. Returns AST nodes that the agent can review before insertion. New:AgentCodeGen.h -
Step 156: Agent annotation assistant Agent can request annotation suggestions for a code region. Whetstone runs
MemoryStrategyInferenceandAnnotationValidator, returns suggestions with confidence scores. Agent can apply suggestions viaASTMutationAPI. The agent learns from user's accept/reject decisions to improve future suggestions. Modifies:WebSocketServer.h,MemoryStrategyInference.h -
Step 157: Multi-agent collaboration Support multiple agents connected simultaneously with different roles:
- "Linter" agent: reads AST, reports issues, doesn't mutate
- "Refactor" agent: can mutate with user approval
- "Generator" agent: can insert new code
Permission model: each agent role has allowed RPC methods.
Agent actions appear in the transform history with agent name as provenance.
Modifies:
WebSocketServer.h,IncrementalOptimizer.h
-
Step 158: Agent workflow recording Record agent actions as reproducible workflows. A sequence of agent RPC calls → saved as a "workflow script" (JSON). User can replay workflows on different codebases. Workflows are shareable. New:
WorkflowRecorder.h -
Step 159: Agent marketplace / plugin registry Directory of available Whetstone agents (local + remote). Each agent has: name, description, capabilities, required permissions. "Install Agent" connects to the agent's WebSocket endpoint. Community agents discoverable via a registry URL (configurable). New:
AgentRegistry.h,AgentMarketplacepanel
Phase 5f: Polish & Ecosystem (Steps 160–165)
Final polish, documentation, and ecosystem features.
-
Step 160: Theme engine Full theme system beyond Dark/Light. Load themes from JSON files. Theme affects: editor colors, syntax highlighting colors, gutter colors, annotation marker colors, panel backgrounds. Ship with: VSCode Dark, Monokai, Solarized Dark, Solarized Light, Dracula, Nord. Theme gallery in Settings panel. New:
ThemeEngine.h -
Step 161: Extension/plugin API Define a stable plugin interface. Plugins can:
- Register new AST concept types
- Add generators for new languages
- Add tree-sitter grammars
- Register custom annotations
- Add panels to the UI
- Register commands and keybindings
Plugins loaded from
~/.whetstone/plugins/. Each plugin = a shared library (.dll/.so) with a defined entry point. New:PluginAPI.h,PluginLoader.h
-
Step 162: User documentation In-editor help system. Help > Documentation opens a panel with:
- Getting Started guide
- Annotation reference (all annotation types with examples)
- Keyboard shortcuts (generated from KeybindingManager)
- Language support matrix
- Agent API reference
Content in Markdown, rendered in ImGui.
New:
HelpPanel.h, markdown renderer
-
Step 163: Telemetry and crash reporting (opt-in) Optional, anonymous usage telemetry to understand feature adoption. Crash handler that captures stack traces on unhandled exceptions. User must explicitly opt-in during first launch. Clear privacy policy. Data sent to configurable endpoint (or saved locally). New:
Telemetry.h -
Step 164: Installer and distribution updates Update the installer (Inno Setup for Windows, .deb/.rpm for Linux) to include all new dependencies. Auto-update check on launch (checks a release URL). Portable mode (no install, run from folder). Modifies:
installer/ -
Step 165: Sprint 5 integration tests Comprehensive integration tests covering the full Sprint 5 feature set:
- Import library → API indexed → library-aware completion prioritizes imports
- Emacs daemon with user config → packages loaded → Elisp functions available
- Agent connects → library primitives prioritized → generates valid code (can use non-imported symbols too)
- Cross-language projection Python→Rust with library mapping
- Function composition builder → generated code compiles
- Full pipeline across all 8+ languages
New:
step165_test.cpp
Summary
| Phase | Steps | Description |
|---|---|---|
| 5a | 127–133 | Library & dependency management (package registry, API indexing, import generation) |
| 5b | 134–140 | Constructive coding flow (primitives registry, library-aware completion, agent library preference, composition builder) |
| 5c | 141–146 | Emacs ecosystem (user config, package browser, function discovery, Org-mode, Emacs-Whetstone bridge) |
| 5d | 147–153 | Full language coverage (JS/TS, Java, Rust, Go generators + CST-to-AST) |
| 5e | 154–159 | Advanced agents (library context, library-aware generation, multi-agent, workflows, marketplace) |
| 5f | 160–165 | Polish & ecosystem (themes, plugins, docs, distribution) |
Total: 39 steps across 6 phases.
Context for Future Agents
What exists after Sprint 4 (prerequisites):
- 33+ backend components all wired into the GUI
- LSP client communicating with external language servers
- Layout presets (VSCode/Emacs/JetBrains) with proper docking
- Custom code editor widget with syntax highlighting, line numbers, gutter
- Annotation UI (gutter markers, inline decorations, context menu, suggestions)
- Cross-language projection and optimization controls
- AST with Import/ExternalModule/TypeSignature stub concepts
- 8+ tree-sitter grammars (Python, C++, Elisp, JS/TS, Java, Rust, Go)
- Orchestrator wired with Emacs daemon config as a setting
- WebSocket agent server running with JSON-RPC
Key source files to understand:
| File | What it does |
|---|---|
editor/src/ast/ASTNode.h |
Base AST node + Import/ExternalModule (added Sprint 4 Step 121) |
editor/src/ast/Parser.h |
TreeSitterParser — CST-to-AST for Python/C++/Elisp (extend for new languages) |
editor/src/ast/Generator.h |
PythonGenerator, CppGenerator, ElispGenerator (extend for new languages) |
editor/src/LSPClient.h |
LSP protocol client (added Sprint 4 Phase 4c) |
editor/src/Pipeline.h |
End-to-end parse→infer→validate→optimize→generate |
editor/src/CrossLanguageProjector.h |
AST deep-copy with language change and annotation adaptation |
editor/src/MemoryStrategyInference.h |
Infers annotations from language + patterns |
editor/src/WebSocketServer.h |
Agent WebSocket endpoint with JSON-RPC |
editor/src/ASTMutationAPI.h |
AST mutations with OptimizationLock checking |
editor/src/EmacsIntegration.h |
ElispCommandBuilder + EmacsConnection daemon lifecycle |
editor/src/Orchestrator.h |
Central state manager, undo journal, Emacs integration |
editor/src/CodeEditorWidget.h |
Custom ImGui code editor (added Sprint 4 Phase 4a) |
editor/src/LayoutManager.h |
Docking layout presets (added Sprint 4 Step 76) |
Architecture principles:
- Two-layer intelligence: LSP for standard language features, Whetstone for annotations/memory/optimization
- Constructive coding: imported libraries are a convenience, not a constraint — they inform suggestions and prioritization, but users/agents can always write arbitrary code
- Cross-language: single AST, multiple generators, annotation-aware projection
- Agent-friendly: all features accessible via WebSocket JSON-RPC, not just GUI
- User choice: layout/keybinding/theme presets let users work in their preferred style
Build system:
- C++20, CMake, vcpkg (Windows), FetchContent for tree-sitter grammars
- Dear ImGui + SDL2 + OpenGL3 for GUI
- nlohmann-json for JSON
- tree-sitter for parsing (grammars: python, cpp, elisp, + 5 more in Sprint 4)
- Build:
cmake --preset windows-msvc && cmake --build build --config Release - Tests:
build/Release/stepNN_test.exe(each step has its own test executable)
Git structure:
- Branch:
001-core-ast-structure(all work so far) - Main branch:
main(merge target) - Sprint plans:
sprint4_plan.md,sprint5_plan.md - Progress tracker:
progress.md(authoritative, updated after each session)