Monday, 6 July 2026

Roject — Session Summary

File tree rename/delete, locale generator rewrite, locale documentation, doc/ renamed to workspace/, fixed navigation header system, Guides/Actions workspace restructure, and Update History action rewrite.

What we built

File Tree: Rename and Delete

Right-clicking any file or directory label in the file tree now opens a context menu with Rename… and Delete entries. Rename shows an inline overlay (same pattern as Add File) with the current name pre-filled. Delete requires confirmation via <confirm-dialog> before proceeding.

Two new server-side storage functions were added: renameProjectEntry (validates new name has no path separators, target does not already exist, result stays within project root) and deleteProjectEntry (uses fs.rmSync with recursive: true). Exposed as POST /:projectId/rename and POST /:projectId/delete in server/routes/files.ts. confirm-dialog.css and confirm-dialog.js were added to public/editor.html.

file-tree-panel.ts server/storage.ts server/routes/files.ts confirm-dialog

Locale Generator Rewrite

server/localeGenerator.ts was rewritten to generate one .ts file per source directory instead of a single monolithic Locales.ts. Output goes to src/locales/generated/. The root directory generates Locales.ts; each subdirectory generates a file named in PascalCase (e.g. commands/Commands.ts).

Naming rules: directory names → PascalCase class names; file names → camelCase member names, with all dots replaced by underscores first, then dashes converted to camelCase on the remaining segments. The extension is always kept as a suffix after an underscore. Example: add-file.txtaddFile_txt, config.min.jsonconfig_min_json. Parent classes re-expose child classes as static readonly members, so paths like Locales.Commands.FileTreeCommands.addFile_txt work naturally.

LocaleManager.$ was changed from a static method to a static getter, so usage is LocaleManager.$.get(…) without parentheses.

server/localeGenerator.ts src/locales/generated/ LocaleManager.ts static get $

Locale Documentation

A full reference guide was written at workspace/guides/locales/index.html covering: what the locale system is, how source files are structured under locales/en/, how the generator turns them into TypeScript, the naming conventions (PascalCase directories, camelCase+extension members), how to add a new locale file, and how to use it in code via LocaleManager.$.get( Locales.X.Y.member_ext ).

workspace/guides/locales/index.html naming conventions usage examples

doc/ Renamed to workspace/

The documentation root was renamed from doc/ to workspace/. Because the directory was open in the IDE, PowerShell Rename-Item and Bash mv both failed with Permission Denied. The workaround was to copy the tree with robocopy then delete the original with Remove-Item -Recurse -Force. CLAUDE.md was updated to point to workspace/outline/index.html.

robocopy workaround CLAUDE.md workspace/

Workspace Navigation Header

Every workspace HTML page now includes a fixed navigation header generated from a central sitemap. The system consists of three files in workspace/_assets_/:

  • nav-data.js — declares var NAV_DATA, a tree of { title, path, children? } nodes mirroring all workspace pages.
  • nav.js — finds the current page in the tree and renders a three-row header: breadcrumb (ancestors), siblings row (peers at the same level), and children row (direct children). After inserting the <nav>, it sets document.body.style.paddingTop dynamically to prevent content hiding under the fixed bar.
  • nav.css.wsnav is position: fixed spanning the full viewport width; .wsnav-inner is centered at 57 em to keep the content aligned with the page body.

Each page sets var NAV_ROOT to its relative depth from workspace/ so nav links resolve correctly regardless of nesting level. Day entries use '../../../../'; the outline uses '../'.

workspace/_assets_/nav-data.js workspace/_assets_/nav.js workspace/_assets_/nav.css position: fixed NAV_ROOT

Workspace Restructure: Guides and Actions

The workspace was reorganised into four top-level sections: Outline, Guides, Actions, and History. Guides hold informational reference material (how to approach a type of work). Actions hold repeatable procedures that an agent can be told to execute.

Pages created: workspace/guides/index.html, workspace/guides/writing-typescript-code/index.html, workspace/guides/locales/index.html, workspace/actions/index.html, workspace/actions/update-history/index.html, workspace/actions/update-outline/index.html. The outline index was updated with Guides and Actions summary cards. nav-data.js was updated to include both sections.

workspace/guides/ workspace/actions/ nav-data.js outline/index.html

Update History Action: Commit and Push

The Update History action was rewritten with two new behaviours. First, when no entry exists for today, the agent now always asks which day to use (a session may have started the previous day) and waits for an answer before continuing. Second, a Step 5 was added: before running any git command, the agent presents a confirmation prompt stating the exact date, the commit message (a one-liner summary), and the push target (main), then waits for the user to approve. After approval it runs git add ., git commit -m "…", and git push. A push failure is reported to the user without any automatic recovery attempt. Same-day updates append new cards when there is enough new material, or adjust existing content in place for minor changes.

workspace/actions/update-history/index.html git add . / commit / push confirmation prompt

Key Decisions

Right-click context menu for rename/delete (not header buttons)

The file tree header already had Add File and Add Directory buttons. Adding more buttons would crowd the header. Right-click is the conventional gesture for per-item operations on file trees and uses the existing ContextMenu infrastructure.

One generated .ts file per locale directory

A single flat Locales.ts would grow unbounded and force a full regeneration for every locale change. Per-directory files allow TypeScript to cache unchanged files and make the generated output easier to read and trace back to source.

All dots in file names become underscores before dash-to-camelCase

File names like config.min.json have structural dots that are not word separators in the same way dashes are. Replacing all dots with underscores first produces unambiguous member names (config_min_json) without any special-casing for extensions.

LocaleManager.$ as a static getter, not a method

LocaleManager.$ is a singleton accessor. Callers should read it like a property, not invoke it like a factory. Removing the parentheses at every call site makes the access pattern clear and consistent.

Fixed nav with .wsnav-inner for centered content

position: fixed and margin: auto cannot coexist on the same element because fixed positioning takes the element out of normal flow. Splitting into an outer full-width .wsnav and an inner .wsnav-inner (57 em, margin auto) solves this cleanly.

Guides for style/approach, Actions for repeatable procedures

"Guides" describes informational reference material that helps a contributor understand how to work in an area. "Actions" describes discrete, repeatable procedures that a human or agent can be told to execute by name — they have concrete steps, not just advice.

Structural Changes

doc/workspace/ — root rename
workspace/_assets_/nav-data.js — new: sitemap for nav system
workspace/_assets_/nav.js — new: nav renderer
workspace/_assets_/nav.css — new: fixed nav styles
workspace/guides/ — new section
workspace/guides/writing-typescript-code/index.html — new
workspace/guides/locales/index.html — new
workspace/actions/ — new section
workspace/actions/update-history/index.html — new
workspace/actions/update-outline/index.html — new
server/storage.ts — added renameProjectEntry, deleteProjectEntry
server/routes/files.ts — added POST /:projectId/rename, POST /:projectId/delete
src/components/file-tree-panel/file-tree-panel.ts — added showItemMenu, startInlineRename, renameEntry, deleteEntry
public/editor.html — added confirm-dialog CSS and script
server/localeGenerator.ts — complete rewrite (per-directory output)
src/locales/generated/ — new: generated locale classes
src/locales/LocaleManager.tsstatic $ changed to static get $
CLAUDE.md — updated to point to workspace/outline/index.html