Skip to content

Releases: cuculhart/teaspoon-ide

Teaspoon IDE v0.9.1

Teaspoon IDE v0.9.1 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 04 Oct 08:42

Added

  • // CLOSE_PROJECT command: the AI can now close the open project when asked (e.g. "close the project"), routing through the same cleanup as File > Close Project. Reversible and non-destructive, so it runs without an approval dialog; commands emitted after it in the same reply fail cleanly. Previously the model had no way to close a project and would reply as if it had.
  • New Project now warns when the chosen target folder already exists and is not empty. Because directory creation is recursive, such a folder was previously adopted silently as the project - mixing new files into an existing directory and binding the conversation to a path another project already used. The dialog now shows the item count and requires a second "Open Anyway" click to adopt it; changing the name or parent resets the warning.

Changed

  • The command parser moved from Chat.tsx to services/commandParser.ts so it runs under plain node; npm run test:parser exercises it against every malformed model output seen in the wild (URL truncation, glued commands, JSON blobs, bare commands, fenced examples, CJK prose).

Fixed

  • Commands typed without the "//" prefix ("WRITE_FILE: x.md" as a bare line) were previously invisible to the parser - nothing ran and no retry fired. Bare WRITE_FILE/EDIT_FILE headings (body to the next END terminator or end of reply) and bare single-line commands now execute; the colon after the keyword is required so prose doesn't match. The prompt now notes that the "//" prefix is required.
  • Weak models sometimes emit commands as JSON blobs ([{"command": "WRITE_FILE", ...}]) instead of the // syntax; they used to sit in the reply as inert text. Objects that JSON.parse cleanly are now executed like real commands (common field names - path/file/cmd/target/content - are mapped), while blobs inside markdown fences or malformed JSON stay inert. The system prompt now also states that JSON is not a valid command format.
  • // RUN_COMMAND: start https://... (open a URL in the browser) always failed: the command argument was cut at the // inside the URL, so only start https: survived - the approval dialog showed that truncated prefix and the open attempt then failed. Command arguments now end only before whitespace + // or a // command keyword, keeping URLs and UNC paths intact; start/open/xdg-open targets given as a markdown link ([label](url)) now resolve to the real URL.
  • File commands whose path ran into the reply's next sentence with no separator ("// READ_FILE: .../Spec.md ...") tried to open the whole line as a filename and failed with ENOENT; the argument is now cut at the ".ext" boundary when non-ASCII prose is glued on (real CJK directory names are kept).
  • Command syntax shown for documentation now stays inert. Examples the model wrote inside markdown code fences used to execute like real commands - asking "what commands can you use" made READ_FILE/WRITE_FILE run on template paths and even closed the open project via a CLOSE_PROJECT example. Lines inside ``` fences are now left as visible text, and the prompt tells the model to fence examples. Template-looking "<file_path>" args are deliberately treated as real attempts, so they reach the create-project prompt or a visible error instead of being silently ignored.
  • Closing a project no longer disrupts the chat. Both the new CLOSE_PROJECT command and File > Close Project previously remounted the Chat panel: an in-flight agent loop was orphaned (its final reply was lost), the visible conversation was replaced by an older project-less one, and a leftover project-bound conversation could reopen its project when picked from the rail. The project now closes around the running chat, the editor releases the open file via the shared project-opened event, and the current conversation stays visible.
  • A conversation keeps its project binding when the project closes mid-chat (previously the next save rebound it to "no project"), so reopening the project restores that conversation instead of starting empty. Chats continued with no project open still mark themselves as the conversation to show in that state.
  • Reloading the app with a project open could show the wrong conversation: Chat's mount-time load ran before the Explorer's async project restore finished, saw "no project", and loaded the last project-less chat instead of the project's one. It now waits for the restore when a last-project path is configured. A stale "last project-less conversation" pointer is also cleared once its conversation gets bound to a project, so it can no longer hijack the startup load.
  • Markdown tables in assistant chat messages could overflow the message bubble and trigger a horizontal scrollbar in the chat pane. Tables now always fit the bubble width (cell text, including long file paths, wraps as needed), and the message list no longer scrolls horizontally.
  • Command result notes (Read file, Wrote file, Listed files, ...) showed the absolute path; they now show the project-relative path, so the OS user name no longer appears in chat history or gets echoed back to cloud providers.
  • The chat header could push its action buttons (Rollback, Clear, focus toggle, Settings) off the right edge on narrow panes whenever the title side grew - a long model name, the budget badge, or the Rollback button appearing. The title/badges now shrink with an ellipsis while the buttons stay fully visible.

Teaspoon IDE v0.9.0

Teaspoon IDE v0.9.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 03 Oct 13:33

Added

  • Chat focus mode: a toggle button in the chat header (or View > Toggle Chat Focus, Ctrl+Shift+B) hides the sidebar, editor, and terminal so the chat fills the window. The panes stay mounted and their widths are remembered; menu actions that need them (Open Project, Quick Open, Terminal, exports, ...) bring them back automatically. The mode is remembered across restarts.
  • Conversation list in chat focus: a rail beside the chat shows all saved conversations with title, project badge, and timestamp, like hosted chat apps. Entries load in place (opening the bound project, or clearing it for project-less chats), can be deleted, and "+ New chat" starts a fresh conversation.
  • Project-less conversations are persisted too: chats started with no folder open are saved and the last one is restored on the next run.
  • Create-project prompt: when the AI wants to write a file while no project is open, a dialog offers to create a project folder (default parent: Documents) instead of rejecting the write. The new folder opens in place without remounting the chat, so the pending operation continues to the normal approval step. Offered at most once per user turn.
  • Long-conversation compaction: chats longer than the recent window (20 messages) send older turns as a rolling summary instead of the full transcript, keeping requests within small-model context limits. The extra summarization call can be disabled in Settings > AI Context to keep request counts identical to before.
  • New theme Rich Wine (wine): a bar-lit wine palette - red-tinted near-black surfaces, silvery text and type (the cocktail spoon), copper-orange keywords, amber/champagne strings and numbers, and mauve functions, so no code color reads as an error.
  • Adversarial E2E suite (e2e/run.mjs, "npm run test:e2e"): launches the real app under Playwright's Electron support with a private --user-data-dir and stubs the Gemini endpoint via page.route(), so scripted model output exercises the command parser, file-access guards, approval dialogs, conversation storage, and markdown sanitization deterministically - no API key or network needed.

Changed

  • Assistant chat messages now render as Markdown (headings, lists, tables, code blocks) using the same marked + DOMPurify pipeline as the editor's .md preview. User messages and the streaming bubble stay plain text.
  • Chat history moved from localStorage to JSON files under userData/chat-history (one file per conversation plus an index), with atomic writes and an automatic one-time migration - the ~5MB quota no longer caps growth, rawContent blobs (raw model output incl. file bodies) are trimmed from older messages before saving, and exhausted saves can no longer be silently dropped.

Fixed

  • Security: file commands are now rejected unless they resolve inside an open project. With no project open, absolute paths used to pass through, so a bare "// READ_FILE: C:/..." could silently read any file on disk and send its contents to the model; ".." segments were not normalized, so "../../x" escaped the project root as a string that only looked root-relative; and reads/lists fell back to the raw command argument on resolution failure, which let a rejected relative path read relative to the app's working directory.
  • File commands emitted with markdown ":::" fences (:::WRITE_FILE: path ... :::) are now parsed as commands instead of shown as raw text - gemini-lite-class models emit that dialect reliably, so writes and the create-project prompt previously never fired.
  • The current user message is no longer sent twice per request (once in the history array, once as the prompt).
  • The model can no longer mistake a truncated history for the start of the conversation: when earlier turns are dropped by the recent-message window, the prompt discloses it (or attributes them to the summary), so questions like "answer my first question" get an honest answer instead of the first visible turn.
  • The app-context prompt now describes the app accurately - chat focus, supported platforms (Windows/macOS/Linux), the built-in providers (Gemini API / Ollama / LiteLLM proxy), and the text-tab sidebar - so the model no longer invents UI elements, platforms, or providers; a UI-state note covers "I can't see the sidebar" while chat focus is on.
  • The no-project prompt now matches actual behavior: WRITE_FILE and EDIT_FILE trigger the create-project dialog rather than failing, bare "create a project" requests are sent there directly via a starter file, the manual path (File > New Project... / the Explorer's New Project button) is named as the fallback, and the model is told not to repeat the "no project is open" note in every reply.

Teaspoon IDE v0.8.0

Teaspoon IDE v0.8.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 02 Oct 15:27

Fixed

  • Command failures are no longer fed back to the model as bare exit codes: RUN_COMMAND results now carry the output tail and an interpretation hint that distinguishes test-runner failures, command-not-found errors, and other non-zero exits. After three consecutive failed commands the model is told to stop probing alternate interpreters/PATHs.
  • Tests that were already failing before the agent's first edit are now reported as pre-existing failures rather than regressions.
  • A failed WRITE_FILE/EDIT_FILE can no longer be silently abandoned: it stays unresolved until a later write/edit succeeds, every continuation message reminds the model the file is still unchanged, and if the model declares completion anyway a warning tells the user the reported changes may not exist on disk.
  • Terminal: finished command blocks auto-collapse to a one-line status row (click to expand); running processes stay expanded.
  • Terminal input placeholder now reads "Type a command..." instead of the misleading npm install.
  • Open Project dialog: action buttons now wrap instead of overflowing the dialog.

Teaspoon IDE v0.7.0

Teaspoon IDE v0.7.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 01 Oct 14:24

Changed

  • The "Quiet Light" theme is renamed "Organic Light" - the palette is a muted warm-paper variant of our own rather than a port of VS Code's Quiet Light, so it gets its own name. The stored setting value stays quiet, so existing selections keep working.

Added

  • Four new themes (Settings > Theme): Muted Ocean (deep-sea blue, Night Owl-inspired but with reduced text luminance), Ancient Console (eye-friendly green-phosphor CRT homage with the editor pane as the brightest surface), Walnut (dark wood with cool silvery "new nail" text), and Heritage (pale woodgrain with reddish-black groove text, echoing beige-box PCs). Each theme ships with a matching Monaco editor palette; the internal ids are ocean, console, walnut, and heritage.
  • Post-edit test verification is now part of the agent's standard procedure: when the project has a test suite (a tests/ directory, test_*.py files, a test script in package.json, etc.), the prompt requires running it via RUN_COMMAND after edits and fixing regressions before the final answer. It also reminds the model to keep public signatures and semantics intact when the user asks for behavior-preserving changes.

Fixed

  • White text on --accent backgrounds is no longer hardcoded: a new --on-accent variable sets the label color per theme, so themes with light accents (Muted Ocean's gold, Ancient Console's green, Walnut's brass) now render near-black ink text on user chat bubbles, send and submit buttons, and dialogs - previously white on gold was barely readable.
  • EDIT_FILE parsing is far more tolerant of small-model output: delimiter runs of the wrong length (<<</>>>> instead of seven), missing SEARCH/REPLACE words, and diff blocks wrapped in markdown fences are all accepted instead of rejected. An EDIT_FILE opener that was never closed with // END_EDIT_FILE is now salvaged when the body already ends with a complete >>>>>>> REPLACE delimiter - previously the block was dropped and the model burned a step re-emitting it.
  • WRITE_FILE bodies that contain SEARCH/REPLACE diff markers are rejected before touching the disk (the markers would be written literally, producing a broken file). The model is told to re-emit the raw file content instead.
  • Repeated edit failures now escalate: the error feedback includes a complete minimal EDIT_FILE example, and after two consecutive failures the model is told to stop retrying diff syntax and emit a WRITE_FILE with the full file content instead.
  • The agent loop no longer lets a turn end on an unresolved failure: if the model gives its final answer while an earlier command or edit in the same session failed (e.g. tests still red), it gets one explicit nudge to either fix the failure or state why it is unrelated.
  • The continuation prompt now reports the remaining step budget (Step N of 6) and tells the model to reply with a plain final answer once the work is done - small models kept re-verifying finished work until the step budget ran out.

Teaspoon IDE v0.6.0

Teaspoon IDE v0.6.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 29 Sep 13:33

Changed

  • Renamed the project from Forger to Teaspoon IDE (package and
    repository forger-ide → teaspoon-ide) to avoid confusion with the many
    similarly named Forge/Forger projects. The name reflects the design goal:
    getting real work done on a teaspoon of tokens.

Added

  • Explorer file watching: the main process watches the open project
    folder (fs.watch recursive on Windows/macOS, per-directory watchers
    elsewhere) and the Explorer tree reloads automatically when files or
    folders are added, deleted, or renamed outside the app - external
    editors, Windows Explorer, terminal commands, git checkout, etc.
    Events are debounced, expanded folders stay expanded, and changes
    inside ignored directories (node_modules, .git, dist, ...) are
    not reported, matching the project-search ignore policy. The Git
    panel refreshes its status on the same signal, so external git
    operations are reflected without a manual refresh. A refresh button
    (⟳) in the Explorer header triggers a manual reload as well.

Forger v0.5.0

Forger v0.5.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 26 Sep 14:35

What's New

Added

  • Organization (managed) mode for centrally managed deployments: enabling "Require organization sign-in" in Settings locks the app behind a sign-in gate until the user authenticates against the organization server. The server issues a per-user virtual API key that talks to an LLM proxy (e.g. LiteLLM), so real provider keys never leave the server. "Continue without an organization" switches back to local/personal use at any time.

  • Organization-controlled model selection: the sign-in response carries the list of models the issued key may use; the Organization section shows a restricted model dropdown and the personal Model Selection is locked while a managed session is active.

  • Budget indicator in the chat header: the remaining allotted budget is shown as a percentage (e.g. 99.9%) - never a currency amount - next to the model badge while signed in to an organization. It warns below 20% and turns red at 0%, refreshes after each response and every 60 seconds, and its tooltip shows the reset date.

  • Managed-mode error messages: a spent personal budget, an exhausted organization-wide provider quota, a rate limit, and a model that is not permitted by the organization each produce a clear localized message instead of raw proxy/provider errors.

Changed

  • In managed mode the provider/model fallback is disabled: the organization controls the model list and the fallback no longer rewrites the personal model setting.

Fixed

  • Clearing the API key in Settings now notifies the chat immediately, so the configured/unconfigured state updates without a restart.

Full Changelog: https://github.com/cuculhart/forger-ide/blob/main/CHANGELOG.md

Forger v0.4.0

Forger v0.4.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 26 Sep 01:10

Forger 0.4.0

This release includes all changes from v0.3.1, v0.3.2, and v0.4.0.

Highlights

  • Complete Git workflow support: clone repositories, initialize repositories, configure remotes, create the initial commit, set upstream on first push, and configure local/global Git identity without using the terminal.
  • Open the current project folder in the OS file manager from the Explorer or File menu.
  • Chat history controls for clearing the current conversation or all saved project conversations.
  • Improved terminal and chat scrolling, including automatic follow-at-bottom behavior and fixes for clipped terminal headers.
  • Better editor reliability, including preserved undo history and working Edit > Undo / Redo actions.
  • Improved privacy: project paths sent to LLM providers are now relative to the project root instead of exposing absolute host paths and usernames.
  • Additional hardening for small local models, including recovery from malformed file writes, invented command terminators, command-like text in file contents, and browser-open commands with appended prose.
  • Added a right-click context menu and improved settings behavior for Ollama, theme selection, and API-key handling.
  • Documented cloning and Node.js v22 installation for Linux environments.

Added

  • Git Clone from the Open Project dialog or File menu.
  • Clone into an empty project folder from the Git panel.
  • Remote Setup dialog for adding or updating remotes.
  • Initial Commit action for repositories with no commits.
  • Push with upstream tracking, including automatic upstream setup from the toolbar when the remote is unambiguous.
  • Git Config dialog for local/global user.name and user.email.
  • Open Project Folder action using Electron's cross-platform shell support.
  • Current-project and all-project chat history clearing.
  • Right-click context menu for editable and selectable text.
  • Linux installation documentation for Node.js v22 via n or nvm.

Changed

  • Each open file now uses its own Monaco model, preserving undo history and cursor position across file switches and markdown preview toggles.
  • LLM project context and command feedback now use project-relative paths.
  • Small Ollama models use a compact prompt and reduced history to improve protocol adherence.
  • Browser-open prompts now specify only the host OS's opener command.

Fixed

  • Terminal auto-scroll, first-show header clipping, and chat auto-follow.
  • Settings controls becoming unresponsive after native confirmation dialogs.
  • Monaco undo/redo not working from the Edit menu or keyboard shortcuts.
  • Markdown code fences being saved literally into generated files.
  • Small models using incorrect file paths, terminators, or command-like text inside file contents.
  • Explorer recent-project buttons using unreadable accent styling in some themes.
  • Push failures on branches without an upstream remote.
  • Git dialog buttons appearing disabled when they were still actionable.

Forger v0.3.0

Forger v0.3.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 24 Sep 15:12

Added

  • Cross-platform "open in browser": the agent prompt now documents the per-OS opener (start / open / xdg-open), and RUN_COMMAND intercepts all three plus cmd /c start, routing them through Electron's shell.openPath / shell.openExternal on every platform.
  • Application icon (assets/icon.ico multi-size, assets/icon.png, transparent background): applied to the packaged exe, the Squirrel installer (setupIcon), the Add/Remove Programs entry (iconUrl), the Linux window/deb icon, and the About dialog.
  • "Quiet Light" theme: a muted warm-paper light theme for users who find pure white backgrounds glaring. Covers the full UI (CSS variables), Monaco (forger-quiet editor theme), and the terminal, selectable via Settings > Theme.

Changed

  • About dialog: the tagline is now the brand slogan "Standalone, Privacy-First AI IDE", the app icon is shown, and the app name uses the brand gold (#f1af10; darker amber on light themes).
  • Agent prompt: explicitly requires emitting // WRITE_FILE: when asked to create a file (never a bare markdown code fence), using the exact file name the user asked for (no renames, extension changes, or subdirectory moves), the correct block terminator, and only opening/running files that already exist. Fixes small local models (e.g. qwen2.5-coder:1.5b) rewriting "index.html" into "routes/TestIndex.tsx" and opening files before creating them.
  • Small Ollama models (<3B params, detected from the model tag) now use a compact system prompt (command protocol only, no app-context text) and only the last 8 history turns - long prompts and polluted history degrade instruction-following at that size.
  • When no project is open, the model is told that file-operation and shell commands are unavailable and to ask the user to open a project first (both Ollama and Gemini), instead of receiving commands that all fail and hallucinating fake files and results on retry.

Fixed

  • A successful "open in browser" (start/open/xdg-open) no longer continues the agent loop: it produces no terminal output, and feeding "(no output)" back made small models read it as a failure - retrying, guessing the wrong OS, and abricating results. The turn now ends with a success note and closing summary. The host OS is also stated in the system prompt so models stop emitting Linux commands on Windows.
  • Invented commands (e.g. "// CREATE_INDEX.HTML") are detected and reported back to the model with the list of valid commands so it can retry, instead of being shown as raw text that ends the turn.
  • start/open/xdg-open no longer chokes on trailing prose: the prompt example itself showed "(or start http://localhost:3000)" inside the command, which small models copy verbatim. The example was fixed and unquoted trailing parenthetical text is stripped from the target.
  • Writes into a subdirectory the user never asked for are rejected before touching the disk: when the request names a bare file (e.g. "index.html") but the model targets "views/index.html", the write is refused and the model is told to emit it at the project root instead.
  • Malformed file-command blocks are handled more gracefully: commands without a colon (// READ_FILE file.js) and blocks closed with another language's comment marker (# END_WRITE_FILE) now parse correctly; a // WRITE_FILE / // EDIT_FILE opener that still cannot be parsed is reported back to the model (naming the correct terminator) so it can re-emit a complete block, and the chat shows a retry note instead of raw command text.

Forger v0.2.0

Forger v0.2.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 23 Sep 13:54

Fixed

  • RUN_COMMAND start <target> (open in browser) now launches the app reliably: start inside a transient ConPTY cmd could exit before the browser appeared. File/URL targets are opened via Electron's shell.openPath / shell.openExternal instead, confined to the project root for files.
  • Small local models no longer imitate "▶️ Ran: ..." execution notes: chat history sent to the model now uses the raw response, so display notes (including notes saved in older chats) can no longer leak into the context and be parroted back as fake results.
  • Switching provider/model in Settings mid-generation no longer retargets the in-flight request: the provider and model are pinned when Send is pressed, so every agent-loop step (and the model label) of one turn always uses the model that was selected at send time.

Added

  • Response time display: each assistant message now shows the LLM call's round-trip time (e.g. (6.1s)). In multi-step agent runs each turn shows its own turnaround, which makes comparing local model speeds easy.
  • Streaming responses for the Ollama provider: replies appear token-by-token like AnythingLLM/Ollama CLI, so slow local models feel alive instead of sitting on "Generating response..." for a minute. Cancelling now actually aborts the in-flight HTTP request. (Gemini path unchanged.)
  • Per-message model label: assistant messages show the model that produced them (e.g. assistant (ollama:qwen3.5:4b)), so switching models mid-chat stays verifiable.

Forger v0.1.0

Forger v0.1.0 Pre-release
Pre-release

Choose a tag to compare

@cuculhart cuculhart released this 22 Sep 09:24

First public release of Forger — a standalone Electron-based AI coding assistant.

Forger = File / Omni Chat / Repository / Generative Agent / Editor / Runtime

Features

  • 📁 File explorer with project management & session restore
  • 📝 Monaco Editor — syntax highlighting, minimap, quick open (Ctrl+P), full-text search
  • 🤖 Agentic AI chat — AI reads/writes files and runs commands autonomously with your approval
  • 🌿 Git panel — stage, commit, push/pull, side-by-side diff view
  • 💻 True PTY terminal (node-pty + xterm.js) — interactive CLI support
  • ✍️ Markdown preview + PDF/HTML export
  • ↩️ Checkpoint & rollback for AI file edits
  • 🌐 Multi-language UI (add your own via lang/<code>.json)

LLM Providers

  • Gemini API (cloud) — optional LiteLLM proxy support
  • Ollama (local) — fully offline capable

Installation (Windows)

  1. Download Forger-0.1.0-win-x64.zip
  2. Extract and run Forger.exe
  3. Open Settings (⚙️) and configure your LLM provider (Gemini API key or local Ollama)

Requirements

  • Windows 10/11 (64-bit)
  • For Gemini: API key from Google AI Studio
  • For Ollama: Ollama installed locally

License

FSL-1.1-MIT (Functional Source License) — converts to MIT 2 years after each release.
See LICENSE and THIRD_PARTY_LICENSES.md.