- Rust 93.2%
- Swift 4.4%
- HTML 0.8%
- Common Lisp 0.5%
- QML 0.3%
- Other 0.5%
Mixed commit, and worth saying so: the bulk here is in-flight Bastion and
crate work that predates this session. What belongs to the Daily Note work is
the Swift shell.
Noosphere.setNoteBody read the reply with `call', which casts to a dictionary.
`note-body-set' is registered in the keyword convention and answers a BARE
boolean, so the cast failed, the function fell through to `!r.isEmpty' and
returned false after every successful save. ParchmentView.flush reads that as
a failed write and moves to its fallbacks; a Daily Note tile is addressed
`title://' and has no disk twin, so it wrote a rescue file and raised SAVE
FAILED, and save() will not call load() on a failed flush -- and load() is
what sets editing = false. Hence: the words were saved and the tile stayed in
the editor. It now reads the result raw.
CitadelBridge is `window.citadel.call(verb, payload)' lifted out of
EngineTileView so WebFace has it too. A vault web face could previously reach
the engine only through routes hand-written in VaultServer, one case per
question, which made every new question a build of this app. The dead
/country route is removed: the Dossier drawer asks dossier-entity,
country-factbook and dossier-story directly now.
CitadelLink gains raw(), because call() coerces to a dictionary and a verb
answering a bare array or boolean reached the caller as {} -- which is the
same fault, one layer down, that hid the save failure.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Nm9e1e8qJvJYSUEWd9SjE
|
||
|---|---|---|
| .foundry | ||
| .qwen/skills/auto-skill-stagecraft | ||
| .understand-anything | ||
| _external/rustcash | ||
| bootstrap | ||
| crates | ||
| docs | ||
| projects | ||
| specs | ||
| .gitignore | ||
| Bastion.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| DragonpunkOS.md | ||
| JOURNAL.md | ||
| LICENSE | ||
| META-HARNESS.md | ||
| README.md | ||
| The Foundry.md | ||
Bastion
Bastion is a portable whole-computer TUI workspace.
It is inspired by the shape of dpn-tui-next and the opinionated module model of
Citadel, but it is intended to be a new portable application rather than a port of
either project.
Vision
Bastion treats the computer as the workspace, not a single vault or a single
project. A Bastion process is the same on every machine it runs on; the
machine-specific wiring lives in ~/.config/bastion/ and is kept separate from
the portable ~/Settings/*.md documents that describe the user's intent.
The core shell owns layout, focus, navigation, key handling, settings loading, and plugin lifecycle. Everything domain-specific — file browsers, editors, viewers, agent harnesses, project diagnostics — enters through the plugin contract. Plugins are first-party Rust crates compiled into the bastion binary, not dynamically loaded extensions. The same binary runs everywhere.
Current Slice
- Citadel-style terminal UI built with Rust and Ratatui: Calendar over browser on the left, full-height Hero in the center, settings/plugins on the right.
- LHSB: custom filesystem browser with create, read/open, rename, and trash commands.
- Hero: scrollable selected file preview with syntax highlighting.
- RHSB: built-in status/settings panel plus plugin panes.
- Plugin API workspace with compiled-in Rust plugin crates.
- RHSB clock and calendar plugins for portable time/date surfaces.
~/Settingsdiscovery for Markdown settings documents withtype: "[[Settings]]"frontmatter and body fenced config blocks.- DPN-aligned terminal chrome using void/smoke/bone with cyan, magenta, purple, gold, and crimson accents.
LHSB Commands
Ctrl-Space/Ctrl-P: open the command palette.Tab/Shift-Tab: move focus between Calendar, LHSB, Hero, and RHSB.Enter: open selected directory or read the selected file into Hero preview.n: create a file under the current LHSB directory.N: create a directory under the current LHSB directory.u: rename the selected entry.Shift-D: move the selected entry to the platform trash after typing its name.Backspace/Left: move to parent directory..: toggle hidden files.r: refresh.
Command Palette
- Command ids use
<scope>:<action>form, for examplelhsb:create-fileandcalendar:focus. - The palette shows command titles, shortcut hints, descriptions, and ids.
- Adding commands is documented in
docs/commands.md.
Hero Commands
e: toggle Hero preview/edit mode when Hero is focused.j/k, Up/Down, PageUp/PageDown, Home/End: scroll Hero preview when Hero is focused.Ctrl-S: save the current Hero edit buffer.Esc: leave Hero edit mode or cancel an active prompt.
RHSB Plugin Commands
- Calendar:
h/lor left/right move one day,j/kor up/down move one week,[/]move one month,{/}move one year,Tjumps to today, andEnteremits a selected-date event. The selected date persists in~/.config/bastion/calendar.toml;week_start = "saturday"and other weekday names control header order. Week labels use the first configured week-start day of the year as W01, and~/Settings/calendar.mdcan point Bastion at local daily notes for date navigation. Full notes live indocs/widgets/calendar.md. - Clock: renders local time plus up to three IANA timezones configured in
~/.config/bastion/clock.toml; supports 12h/24h display, optional seconds, and configurable accent color. Full notes live indocs/widgets/clock.md.
Create and rename prompts reject paths that leave the current LHSB directory. Delete uses trash semantics instead of direct removal.
Direction
Bastion treats the computer as the workspace. It should be able to move between machines while keeping machine-specific wiring separate from portable settings.
~/Settings/*.mdcontains human-editable settings and control documents: frontmatter classifies the note, body fences configure the app.~/.config/bastion/is reserved for local runtime configuration, caches, and plugin install state..envand other gitignored local files hold secrets and machine-local credentials;~/Settingsshould reference environment variable names, not secret values. Use uppercase environment variable names, normally under YAML keys ending in_env.- Plugins declare panels, commands, file handlers, resource viewers, and settings schemas through explicit manifests and Rust trait implementations.
- Plugins are compiled-in Rust crates. There is no dynamic plugin loading at runtime. Adding a plugin is a build-time concern, not an admin-time concern.
- Plugin authoring notes live in
docs/PLUGINS.md.
Roadmap
Phases are narrative groupings. Each phase decomposes into one or more Forgejo
Milestones (in specs/Milestones/), each of which decomposes into Issues. The
phases below describe shape and intent; the per-Milestone specs describe what
ships.
Phase 1 — Foundation (in progress)
The portable framework. Everything that makes Bastion a working TUI workspace before any noosphere-specific wiring, machine-specific wiring, or external data sources enter. The framework must be complete enough that Phase 2+ work is strictly additive — no Phase 1 piece should require rework when Phase 2 lands.
Forgejo Milestones in specs/Milestones/:
M1-Pane-Focus-And-Switching.mdM2-Hero-Edit-Mode.mdM3-Command-Dispatcher-And-Palette.mdM4-Plugin-Trait-Contracts.mdM5-Refactor-Builtins-To-Plugins.mdM6-Calendar-Widget.mdM7-Clock-Widget.md
Phase 2 — Noosphere Integration
Bastion becomes useful as a noosphere editor. Markdown-aware Hero, wikilink resolution, daily-note opener, calendar wired to the Temporal/ cascade, doc indexer. This is where Bastion stops being a generic TUI workspace and starts being Nathan's noosphere editor on the Mac Studio.
Phase 3 — Federation
~/Settings/*.md synchronises across machines via a git remote (Forgejo by
default). Machine-local state in ~/.config/bastion/ stays local. A Bastion
running on the Mac Studio and a Bastion running on the laptop share portable
intent without overwriting each other's local wiring. This is what makes the
"portable whole-computer workspace" claim true.
Phase 4 — Agent Surfaces
Right-sidebar panels for Claudian, Nova, and Hermes. Chronicle viewer
(addressable-mailbox view over master_chronicle.conversations). Thin REPL
pane for agent-shape interactions. Demonstrates that the plugin model can host
agent surfaces, not just file/edit tooling.
Team
| Role | Ghost |
|---|---|
| Owner | NathanEckenrode |
| Spec author | Claudian (laptop) |
| Builder | Nova (Mac Studio) |
| Reviewer | Claudian (laptop) |
The workflow rotation follows the T.A.S.K.S. doctrine: 🜔 spec → ☤/☿ implement → 🜔 verify. For Bastion specifically: Claudian writes the spec, Nova builds and tests against it, Claudian verifies completion before close.
Project Board
Forgejo Milestones + Issues at
forgejo.eckenrodemuziekopname.com/n8k99/bastion/milestones.
The board is the source of truth for what is/isn't done; the spec .md files
in specs/Milestones/ carry the longer-form objective + success criteria for
each Milestone.
Repository
Primary remote: forgejo.eckenrodemuziekopname.com/n8k99/bastion.
Codeberg may become a public mirror once the project is further along.
Notes
The 4-tier spec model used by Citadel and Innatescript
(Project > Milestone > Goal > Issue) is collapsed here to 3 tiers
(README > Milestone > Issue) to match Forgejo's native primitives. The
Project template content is absorbed into this README; the Goal layer is
gone; what we used to call Goals are now Forgejo Milestones.