- Created sdt-workspace.json at repo root to enable workspace project switching - Cleaned up boilerplate Tauri template strings in Cargo.toml and tauri.conf.json (titles, identifiers, author name)
SDT — Stan's Dev Tools
Status: v0.1 — active development Phosphor-green TUI build orchestrator. Currently embedded in Project Journal; long-term goal is a standalone universal dev tool.
What It Is
SDT is a terminal UI (TUI) application for managing builds, toolchains, and multi-project workspaces. It reads a devtool.json from your project root and presents a menu-driven interface so you never have to remember which script to run, in what order, with what flags.
____ ____ _____
/ ___|| _ \|_ _|
\___ \| | | | | |
___) | |_| | | |
|____/|____/ |_|
─────────── Project Journal v0.1.0 ─────────────
root: E:\stansshit\csharp\journal-master\journal
What would you like to do?
BUILD
> Publish Sidecar Build Journal.Sidecar as self-contained exe
Build Web UI Build SvelteKit bundle
Publish WebGateway Publish ASP.NET host with embedded web UI
Build Tauri Desktop App Build desktop exe (no installer)
Full Release Build ✦ Sidecar → Web → WebGateway → Tauri, in order
...
SYSTEM
⬡ Toolchain management python / node
⚙ Edit environment variables
✗ Quit
Current Features (v0.1)
Build Target Runner
- Menu driven by
devtool.json— add/remove targets without touching SDT code - Dependency resolution: targets declare
dependsOn; SDT topologically sorts them and runs each step exactly once. Selectwebgatewayandwebruns first automatically. Selectalland everything runs in the right order. - Live output streaming: stdout in phosphor green, stderr in amber — you see the build as it happens
- Each step reports exit code and elapsed time
Environment Variable Editor
- All configurable env vars declared in
devtool.json - Dropdown selection for known options (e.g.
none/python-sidecarfor AI provider) - Free-text input for path overrides
- Changes apply to SDT's process environment for the current session
Toolchain Management
Python:
- Detect system Python and venv status in one health-check table
- Create / recreate venv (
python -m venv) - Install requirements profile — select cpu / gpu / nlp, handles
--extra-index-urlautomatically - Upgrade pip
- Cross-platform venv path resolution (
Scripts/on Windows,bin/on Linux/Mac)
Node / npm:
- Detect Node.js and npm versions
- Check
node_modulesstatus - Run
npm install(orpnpm/yarn— configurable per project)
Multi-Project Workspace Switcher
- Place
sdt-workspace.jsonin any parent directory listing your projects - SDT detects it automatically on startup
- Switch Project appears in SYSTEM menu when workspace is loaded with more than one project
- Selecting a different project hot-reloads config in-process — no restart needed
- Project table shows current (
►), path, and whetherdevtool.jsonexists
Running SDT
From the project root (where devtool.json lives):
dotnet run --project Journal.DevTool/Journal.DevTool.csproj
Or via just:
just sdt
SDT walks up the directory tree from wherever you launch it to find devtool.json. You don't need to be in any specific directory.
Config Files
devtool.json (per project)
{
"name": "My Project",
"version": "1.0.0",
"toolchains": {
"python": {
"executable": "python3",
"venvDir": ".venv",
"profiles": [
{ "id": "default", "label": "Default", "requirementsFile": "requirements.txt" }
]
},
"node": { "packageManager": "npm", "workingDir": "frontend" }
},
"targets": [
{
"id": "build",
"label": "Build",
"description": "Build everything",
"group": "Build",
"command": "dotnet",
"args": ["build"],
"workingDir": ".",
"dependsOn": []
}
],
"env": [
{
"key": "MY_VAR",
"description": "Controls something",
"default": "value",
"options": ["value", "other"]
}
]
}
Target fields:
| Field | Description |
|---|---|
id |
Unique identifier, referenced by dependsOn |
label |
Display name in the menu |
description |
Short hint shown in the menu |
group |
Menu category (BUILD / DEV / TEST / etc.) |
command |
Executable to run (dotnet, pwsh, npm, etc.) — null for virtual aggregator |
args |
Argument array passed to the executable |
workingDir |
Working directory relative to project root |
dependsOn |
List of target IDs that must run first |
sdt-workspace.json (per workspace, any parent directory)
{
"name": "My Dev Workspace",
"projects": [
{ "name": "Project A", "description": "Does X", "path": "project-a" },
{ "name": "Project B", "description": "Does Y", "path": "../other-repo/project-b" }
]
}
Paths are relative to the sdt-workspace.json file. Absolute paths also work.
Project Structure
Journal.DevTool/
├── Journal.DevTool.csproj net10.0 exe, outputs as 'sdt'
├── Program.cs Entry point — discovers workspace + project, run loop
├── Config/
│ ├── DevToolConfig.cs devtool.json models (BuildTarget, EnvVarDef, ToolchainConfig)
│ ├── ConfigLoader.cs Walks up dirs to find and parse devtool.json
│ ├── WorkspaceConfig.cs sdt-workspace.json model
│ └── WorkspaceLoader.cs Finds and parses sdt-workspace.json
├── Runner/
│ ├── ProcessRunner.cs Runs a process with live stdout/stderr streaming
│ └── TargetRunner.cs Topological dependency resolver
└── Tui/
├── Theme.cs Phosphor green palette (#00FF41 + amber + red)
├── App.cs Main TUI loop — banner, menu, target runner, env editor
├── ToolchainScreen.cs Python venv/pip + Node/npm management
└── WorkspaceScreen.cs Project switcher
Roadmap
v0.2 — Usability & Polish
--target <id>flag for non-interactive single-target run (CI use)--listflag to print targets and exit- Config validation with clear error messages on startup
- Build history — last run result + timestamp per target (persisted to
.sdt-state.json) - Parallel target execution for independent steps (opt-in per target)
v0.3 — Package Manager Depth
- Full pip environment health: list installed packages, outdated check
- npm/pnpm/yarn: show scripts from
package.json, run arbitrary script - Python version manager integration (pyenv, py launcher on Windows)
- Virtual environment activation hint for the current shell
v0.4 — Multi-Project & Workspace
- Workspace-level targets that span multiple projects (e.g. build all repos in order)
- Project dependency graph across workspace (project A's publish feeds project B's build)
- Workspace health dashboard — all projects' last-build status in one table
v0.5 — Env & Secrets
.envfile load/save support (per project and per workspace)- Secret redaction in log output (already in Journal's LogRedactor — port to SDT)
- Environment profiles: save/load named env var sets (e.g. "dev", "staging")
v1.0 — Standalone Universal Tool
- Extract from Journal repo into its own standalone repository
- Publish as a
dotnet tool(dotnet tool install sdt) - Plugin system: projects can register custom SDT commands via
IsdtPlugin - GUI mode (Avalonia or web UI) as an optional launch mode — default CLI,
--guifor graphical - Linux and macOS first-class support (already mostly there — mainly path/exe resolution)
- JSON schema for
devtool.jsonwith IDE autocompletion
Long-term Vision
SDT's goal is to be the single tool you open when you sit down at a project — regardless of language, framework, or OS. Instead of remembering 15 different CLI commands across dotnet, npm, pip, cargo, just, and pwsh, you open SDT and it knows your project's shape from devtool.json.
The workspace layer means you can manage a portfolio of projects — switching between them, running cross-project builds, and keeping a consistent interface across everything you work on.
Dependencies
Spectre.Console0.49.1— TUI rendering, selection prompts, tables, progress
No dependency on Journal.Core — SDT is intentionally standalone so it can be extracted cleanly.
Notes
- SDT does not set background colour — it renders on whatever your terminal's background is. A dark terminal is strongly recommended for the phosphor look.
- Environment variable changes made in SDT apply to SDT's own process environment for the session. They are not written to your system or shell permanently — by design.
- When a build step fails, SDT stops the plan and does not run subsequent steps.