Monday, 6 July 2026
File tree rename/delete, locale generator rewrite, locale documentation, doc/ renamed to workspace/, fixed navigation header system, Guides/Actions workspace restructure, Update History action rewrite, and Rojo chibi bone animator prototype.
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.
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.txt → addFile_txt,
config.min.json → config_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.
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 ).
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.
Every workspace HTML page now includes a fixed navigation header generated
from a central sitemap. The system consists of three files in
workspace/_assets_/:
var NAV_DATA, a tree of
{ title, path, children? } nodes mirroring all workspace pages.<nav>,
it sets document.body.style.paddingTop dynamically to prevent content
hiding under the fixed bar..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
'../'.
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.
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.
A 2D skeletal animation prototype was started for an in-app chibi character
intended to accompany AI agent interactions. The source artwork is an Inkscape
SVG (src/rojos/rojo-base.svg) where each body part is a
<g> labelled *-transform and contains a
<circle> labelled *-pivot that marks the
rotation point. The pivot circle carries an inverse transform so its
cx/cy sits at the exact world-space pivot regardless of the
bone's own transform.
src/rojos/rojo-animator.ts provides RojoAnimator,
which walks all *-transform groups on load, applies the pivot
circle's transform to its cx/cy to recover the local-space pivot,
removes the circles, and strips Inkscape namespaced attributes. At runtime,
setBoneAngle(name, degrees) writes
restTransform translate(lx,ly) rotate(θ) translate(-lx,-ly)
directly onto the group element — no graphics library required. The parser
handles all three transform types present in the SVG:
translate, matrix, and rotate(angle,cx,cy).
public/rojos/rojo-demo.html fetches the SVG, injects it into
the page, and runs a requestAnimationFrame loop with three
switchable animations: Idle (breathing sway), Walk
(legs and arms in opposite phase), and Wave (right arm wave).
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.
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.
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.$ 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.
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" 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.
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.ts — static $ changed to static get $
CLAUDE.md — updated to point to workspace/outline/index.html
workspace/index.html — updated: added Guides and Actions cards
src/rojos/rojo-base.svg — new: Inkscape chibi character with bone/pivot structure
src/rojos/rojo-animator.ts — new: SVG bone animator (pivot parser + setBoneAngle)
public/rojos/rojo-base.svg — new: copy of SVG for static serving
public/rojos/rojo-demo.html — new: interactive animation demo (idle/walk/wave)