Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
7968567
docs(console): mockups, spec and plan for the Filesmith console (appr…
Maxaubert Oct 5, 2026
c40901b
feat(console): line tokenizer and classifier
Maxaubert Oct 5, 2026
65c474c
feat(console): catalog-driven Tab completion
Maxaubert Oct 5, 2026
b2e4a80
feat(cli): event channel and IPC interrupt for the in-app console
Maxaubert Oct 5, 2026
204b493
feat(console): run filesmith in a child process, folders, restore reveal
Maxaubert Oct 5, 2026
d0325d0
feat(console): open a real terminal with filesmith on PATH
Maxaubert Oct 5, 2026
0353118
feat(console): scrollback, history, height and folder model
Maxaubert Oct 5, 2026
e6b7477
feat(console): bottom panel, toolbar button and Ctrl+backquote
Maxaubert Oct 5, 2026
f30148d
fix(console): complete from the typed text while the list is open
Maxaubert Oct 5, 2026
5f551bf
fix(console): a long folder no longer pushes the prompt out of the panel
Maxaubert Oct 5, 2026
ad2c7e7
test(console): e2e, docs and version 0.8.0
Maxaubert Oct 5, 2026
16176a6
fix(console): the echo line keeps its status inside the panel
Maxaubert Oct 5, 2026
e34845f
docs(console): refresh the implementation shots from the final build
Maxaubert Oct 5, 2026
8318179
fix(console): bottom strip with the Console button, toggling menus, 6…
Maxaubert Oct 6, 2026
ae9b427
fix(ui): drop tooltips that repeat visible labels
Maxaubert Oct 6, 2026
843963b
fix(console): panel replaces the strip, head is only close and Stop
Maxaubert Oct 6, 2026
d75ad6c
feat(console): minimise instead of close, and a Clear button that res…
Maxaubert Oct 6, 2026
e8f33b4
refactor(console): drop Open in terminal and the key hints
Maxaubert Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,12 @@ src/
(planned) jobQueue.ts batch queue: spawn, stream progress, cancel
(planned) output.ts collision-safe output naming (ported from RCMM Get-UniqueOutPath)
(planned) ipc.ts renderer <-> engine wiring
console/ in-app console: catalog, CLI runner (fork, staged cancel), cd
preload/ contextBridge — the typed `window.filesmith` API
renderer/ React UI: shell/ (title bar, sidebar, status bar), queue/ (files table),
inspector/ (Options, Preview, Info), options/ (one settings file per verb),
views/ (Generate, Tools, Completed, Settings), ui/ (primitives), icons/, theme/ (tokens, CSS)
console/ (bottom panel: output model, history, completion list)
shared/ types.ts — Job, ToolId, FileKind, Options, progress events
tabs.ts — the VERB-first navigation model (rail tabs + Tools cards)
cli/ the filesmith command line: parse, plan, run, report
Expand Down
23 changes: 23 additions & 0 deletions docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,29 @@ fields that do not apply are left out, never `null` (except `pct`).
Schema v1 is additive-only: new events, fields and codes may appear; renaming or removing one bumps `v`.
The source of this table is `resources/skill/filesmith/reference.md` (Events section).

## In-app console

The app has a console panel at the bottom of the files view (spec
`docs/superpowers/specs/2026-10-06-console-design.md`). Open or close it with Ctrl+` (anywhere in the
app), the **Console** button in the bottom strip (hidden while the panel is open), or the close X in
the panel's top-right corner.

- Type commands without the prefix: `convert *.heic --to webp`, `doctor`, `formats`. The line is split
into plain arguments and handed to the CLI; nothing runs through a shell, so `&`, `|` and `>` are
just text. Anything that is not a filesmith command is refused, in the panel and again in the main
process.
- Built-ins: `cd <folder>` (the folder commands run in; the last one is remembered, else Downloads),
`clear` (or Ctrl+L), `help`, `history` (the last 100 commands; Up and Down recall them). Tab
completes commands, flags, values and file names.
- One command at a time. Console runs do not join the app's queue, and the queue keeps working while
one runs. Outputs use the same never-overwrite naming as the CLI; a finished run offers **Show in File
Explorer**.
- **Stop** or Ctrl+C cancels a run: the current file is stopped, part files are removed and the run
ends with exit 130. A second Stop ends it at once (the process tree is killed after 5 s at most).
- Plumbing: each command forks `out/main/cli.js` with `ELECTRON_RUN_AS_NODE`. When `CliIO.events` is
set, the CLI tees its NDJSON events to it; under a fork they travel over the IPC channel. The parent
cancels with the `'interrupt'` IPC message (twice for a hard stop), never with a console Ctrl+C.

## AI tools

Jobs never download anything. `filesmith setup <tool>` is the only command that does, with byte progress,
Expand Down
2 changes: 2 additions & 0 deletions docs/design/redesign-direction.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,5 @@ Mockup rounds live in `docs/mockups/terminal*/` (each has an `index.html` galler
`docs/superpowers/specs/2026-10-05-view-sizes-design.md`.
- View menu (2026-10-05, #41): View menu = 3 sizes (Details, Tiles, Extra large icons), no icons, no
shortcuts; the other sizes via Ctrl+wheel.
- Console (2026-10-06, #39, feedback on 0.8.0): the totals row is removed; the bottom strip of the centre
column holds only the Console button (Ctrl+`), and the open console sits above it.
972 changes: 972 additions & 0 deletions docs/mockups/console/01-bottom-panel.html

Large diffs are not rendered by default.

825 changes: 825 additions & 0 deletions docs/mockups/console/02-full-width-drawer.html

Large diffs are not rendered by default.

711 changes: 711 additions & 0 deletions docs/mockups/console/03-inspector-tab.html

Large diffs are not rendered by default.

675 changes: 675 additions & 0 deletions docs/mockups/console/04-command-bar.html

Large diffs are not rendered by default.

36 changes: 36 additions & 0 deletions docs/mockups/console/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Console Mockups</title>
<style>
:root{--bg:#000000;--fg1:#ededed;--fg2:#b4b4b4;--fg3:#8c8c8c;--line:#262626;
--mono:"IBM Plex Mono",Consolas,ui-monospace,monospace;color-scheme:dark}
*{box-sizing:border-box;border-radius:0}
body{margin:0;background:var(--bg);color:var(--fg2);font:13px/1.5 var(--mono);padding:32px 24px 48px}
h1{margin:0 0 4px;font-size:18px;font-weight:600;color:var(--fg1)}
.lead{margin:0 0 28px;color:var(--fg3);max-width:1100px}
.lead b{color:var(--fg1);font-weight:600}
section{border-top:1px solid var(--line);padding:20px 0 24px}
h2{margin:0 0 4px;font-size:14px;font-weight:600}
h2 a{color:var(--fg1);text-decoration:none}
h2 a:hover{text-decoration:underline}
section p{margin:0 0 14px;color:var(--fg3);max-width:1000px}
.row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:10px}
.fig{display:block;color:var(--fg3);text-decoration:none;border:1px solid var(--line);background:#0a0a0a}
.fig:hover,.fig:focus-visible{border-color:#5c5c5c;color:var(--fg1);outline:none}
.fig img{display:block;width:100%;aspect-ratio:1440/900;object-fit:cover}
.fig span{display:block;padding:6px 8px;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-top:1px solid var(--line)}
@media (max-width:900px){.row{grid-template-columns:repeat(2,minmax(0,1fr))}}
</style>
</head>
<body>
<h1>Filesmith console</h1>
<p class="lead">Four concepts for the limited in-app console: it runs <b>filesmith commands only</b>, typed without the prefix; anything else gets one calm line pointing to <b>Open in terminal</b>. Console jobs never join the queue or Completed; each finished run offers Show in File Explorer. Each screenshot opens the live mockup in that state: <b>press Ctrl+` or click Console, then type</b> (try convert *.heic --to webp, del *.*, Tab, Up/Down, Ctrl+C while running).</p>
<section><h2><a href="01-bottom-panel.html#state=open-idle">01 Bottom panel</a></h2><p>A VS Code style panel under the files view; the inspector keeps full height. Console button in the toolbar, Stop sits red in the panel header while a run is going.</p><div class="row"><a class="fig" href="01-bottom-panel.html#state=closed"><img src="shots/01-bottom-panel-closed.png" alt="01 Bottom panel, closed" loading="lazy"><span>#state=closed</span></a><a class="fig" href="01-bottom-panel.html#state=open-idle"><img src="shots/01-bottom-panel-open-idle.png" alt="01 Bottom panel, open-idle" loading="lazy"><span>#state=open-idle</span></a><a class="fig" href="01-bottom-panel.html#state=running"><img src="shots/01-bottom-panel-running.png" alt="01 Bottom panel, running" loading="lazy"><span>#state=running</span></a><a class="fig" href="01-bottom-panel.html#state=error"><img src="shots/01-bottom-panel-error.png" alt="01 Bottom panel, error" loading="lazy"><span>#state=error</span></a><a class="fig" href="01-bottom-panel.html#state=rejected"><img src="shots/01-bottom-panel-rejected.png" alt="01 Bottom panel, rejected" loading="lazy"><span>#state=rejected</span></a><a class="fig" href="01-bottom-panel.html#state=completion"><img src="shots/01-bottom-panel-completion.png" alt="01 Bottom panel, completion" loading="lazy"><span>#state=completion</span></a><a class="fig" href="01-bottom-panel.html#state=history"><img src="shots/01-bottom-panel-history.png" alt="01 Bottom panel, history" loading="lazy"><span>#state=history</span></a></div></section>
<section><h2><a href="02-full-width-drawer.html#state=open-idle">02 Full-width drawer</a></h2><p>Slides up across files and inspector, about 40% of the height; opened from a Console item at the bottom of the sidebar, so it is reachable on every tab.</p><div class="row"><a class="fig" href="02-full-width-drawer.html#state=closed"><img src="shots/02-full-width-drawer-closed.png" alt="02 Full-width drawer, closed" loading="lazy"><span>#state=closed</span></a><a class="fig" href="02-full-width-drawer.html#state=open-idle"><img src="shots/02-full-width-drawer-open-idle.png" alt="02 Full-width drawer, open-idle" loading="lazy"><span>#state=open-idle</span></a><a class="fig" href="02-full-width-drawer.html#state=running"><img src="shots/02-full-width-drawer-running.png" alt="02 Full-width drawer, running" loading="lazy"><span>#state=running</span></a><a class="fig" href="02-full-width-drawer.html#state=error"><img src="shots/02-full-width-drawer-error.png" alt="02 Full-width drawer, error" loading="lazy"><span>#state=error</span></a><a class="fig" href="02-full-width-drawer.html#state=rejected"><img src="shots/02-full-width-drawer-rejected.png" alt="02 Full-width drawer, rejected" loading="lazy"><span>#state=rejected</span></a><a class="fig" href="02-full-width-drawer.html#state=completion"><img src="shots/02-full-width-drawer-completion.png" alt="02 Full-width drawer, completion" loading="lazy"><span>#state=completion</span></a><a class="fig" href="02-full-width-drawer.html#state=history"><img src="shots/02-full-width-drawer-history.png" alt="02 Full-width drawer, history" loading="lazy"><span>#state=history</span></a></div></section>
<section><h2><a href="03-inspector-tab.html#state=open-idle">03 Inspector tab</a></h2><p>A fourth inspector tab next to Options, Preview and Info; narrow log in the right column, the red Stop takes the place of the run button.</p><div class="row"><a class="fig" href="03-inspector-tab.html#state=closed"><img src="shots/03-inspector-tab-closed.png" alt="03 Inspector tab, closed" loading="lazy"><span>#state=closed</span></a><a class="fig" href="03-inspector-tab.html#state=open-idle"><img src="shots/03-inspector-tab-open-idle.png" alt="03 Inspector tab, open-idle" loading="lazy"><span>#state=open-idle</span></a><a class="fig" href="03-inspector-tab.html#state=running"><img src="shots/03-inspector-tab-running.png" alt="03 Inspector tab, running" loading="lazy"><span>#state=running</span></a><a class="fig" href="03-inspector-tab.html#state=error"><img src="shots/03-inspector-tab-error.png" alt="03 Inspector tab, error" loading="lazy"><span>#state=error</span></a><a class="fig" href="03-inspector-tab.html#state=rejected"><img src="shots/03-inspector-tab-rejected.png" alt="03 Inspector tab, rejected" loading="lazy"><span>#state=rejected</span></a><a class="fig" href="03-inspector-tab.html#state=completion"><img src="shots/03-inspector-tab-completion.png" alt="03 Inspector tab, completion" loading="lazy"><span>#state=completion</span></a><a class="fig" href="03-inspector-tab.html#state=history"><img src="shots/03-inspector-tab-history.png" alt="03 Inspector tab, history" loading="lazy"><span>#state=history</span></a></div></section>
<section><h2><a href="04-command-bar.html#state=open-idle">04 Command bar</a></h2><p>A one-line filesmith prompt docked under the files list that grows upward into a log when a command runs or you press Up.</p><div class="row"><a class="fig" href="04-command-bar.html#state=closed"><img src="shots/04-command-bar-closed.png" alt="04 Command bar, closed" loading="lazy"><span>#state=closed</span></a><a class="fig" href="04-command-bar.html#state=open-idle"><img src="shots/04-command-bar-open-idle.png" alt="04 Command bar, open-idle" loading="lazy"><span>#state=open-idle</span></a><a class="fig" href="04-command-bar.html#state=running"><img src="shots/04-command-bar-running.png" alt="04 Command bar, running" loading="lazy"><span>#state=running</span></a><a class="fig" href="04-command-bar.html#state=error"><img src="shots/04-command-bar-error.png" alt="04 Command bar, error" loading="lazy"><span>#state=error</span></a><a class="fig" href="04-command-bar.html#state=rejected"><img src="shots/04-command-bar-rejected.png" alt="04 Command bar, rejected" loading="lazy"><span>#state=rejected</span></a><a class="fig" href="04-command-bar.html#state=completion"><img src="shots/04-command-bar-completion.png" alt="04 Command bar, completion" loading="lazy"><span>#state=completion</span></a><a class="fig" href="04-command-bar.html#state=history"><img src="shots/04-command-bar-history.png" alt="04 Command bar, history" loading="lazy"><span>#state=history</span></a></div></section>
</body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/mockups/console/shots/_index.png
Binary file added docs/mockups/console/shots/impl-completion.png
Binary file added docs/mockups/console/shots/impl-idle.png
Binary file added docs/mockups/console/shots/impl-refused.png
Binary file added docs/mockups/console/shots/impl-running.png
Binary file modified docs/mockups/terminal-v5/shots/impl-10-s2.png
Binary file modified docs/mockups/terminal-v5/shots/impl-collapsed.png
Binary file modified docs/mockups/terminal-v5/shots/impl-completed.png
Binary file modified docs/mockups/terminal-v5/shots/impl-empty.png
Binary file modified docs/mockups/terminal-v5/shots/impl-generate.png
Binary file modified docs/mockups/terminal-v5/shots/impl-info.png
Binary file modified docs/mockups/terminal-v5/shots/impl-menu.png
Binary file modified docs/mockups/terminal-v5/shots/impl-preview.png
Binary file modified docs/mockups/terminal-v5/shots/impl-settings.png
Binary file modified docs/mockups/terminal-v5/shots/impl-tools.png
Binary file modified docs/mockups/view-zoom/shots/impl-menu.png
Binary file modified docs/mockups/view-zoom/shots/impl-size0.png
Binary file modified docs/mockups/view-zoom/shots/impl-size1.png
Binary file modified docs/mockups/view-zoom/shots/impl-size2.png
Binary file modified docs/mockups/view-zoom/shots/impl-size3.png
Binary file modified docs/mockups/view-zoom/shots/impl-size4.png
Binary file modified docs/mockups/view-zoom/shots/impl-size5.png
Loading
Loading