journal/devtool.json
stan44 5b383858ae feat(sdt): add Journal.DevTool TUI, devtool.json, and justfile
- Journal.DevTool: C# TUI dev tool (SDT) using Spectre.Console
  - Phosphor green (#00FF41) terminal aesthetic with amber/red accents
  - Grouped build target menu driven by devtool.json config
  - Topological dependency resolver for DependsOn chains
  - Live stdout/stderr streaming per target step
  - Interactive environment variable editor (dropdown + free-text)
  - Toolchain management screen: Python venv create/install/upgrade, Node npm install
  - Workspace switcher: reads sdt-workspace.json, hot-switches between projects
  - Outputs as 'sdt' executable (net10.0)

- devtool.json: project config for SDT
  - All build targets: sidecar, web, webgateway, tauri, tauri-nsis, all (virtual)
  - Dev targets: run-gateway
  - Test targets: test (smoke), gate (migration)
  - Cache targets: nuget-export, nuget-import
  - Toolchains: Python 3.14 (cpu/gpu/nlp profiles) + Node/npm (Journal.App)
  - Env vars: AI provider, log level, NLP backend, path overrides

- justfile: just command runner recipes wrapping existing scripts
  - Correct dependency ordering (sidecar before tauri, web before webgateway)
  - OS-aware runtime detection (win-x64 / linux-x64)
  - Recipes: sidecar, web, webgateway, tauri, tauri-nsis, all, run, dev-app, test, gate, build, nuget-export/import, sdt

- Journal.slnx: added Journal.DevTool project
2026-02-27 13:12:36 -06:00

301 lines
8.8 KiB
JSON

{
"name": "Project Journal",
"version": "0.1.0",
"toolchains": {
"python": {
"executable": "python3.14",
"windowsExecutable": "py",
"launcherVersion": "-3.14",
"venvDir": ".venv",
"pipScript": "scripts/pip-min.ps1",
"profiles": [
{
"id": "cpu",
"label": "CPU only (default)",
"requirementsFile": "requirements_cpu_only.txt",
"extraIndexUrl": "https://download.pytorch.org/whl/cpu"
},
{
"id": "gpu",
"label": "GPU / CUDA",
"requirementsFile": "requirements_gpu.txt"
},
{
"id": "nlp",
"label": "NLP / spaCy (optional)",
"requirementsFile": "requirements_nlp_optional.txt",
"postInstallCommands": [
"spacy download en_core_web_sm"
]
}
]
},
"node": {
"packageManager": "npm",
"workingDir": "Journal.App"
}
},
"targets": [
{
"id": "sidecar",
"label": "Publish Sidecar",
"description": "Build Journal.Sidecar as self-contained exe → output/",
"group": "Build",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/publish-sidecar.ps1",
"-Configuration",
"Release",
"-Runtime",
"win-x64"
],
"workingDir": ".",
"dependsOn": []
},
{
"id": "web",
"label": "Build Web UI",
"description": "Build SvelteKit bundle → Journal.App/build/",
"group": "Build",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/publish-app.ps1",
"-Target",
"web"
],
"workingDir": ".",
"dependsOn": []
},
{
"id": "webgateway",
"label": "Publish WebGateway",
"description": "Publish ASP.NET host with embedded web UI → output/webgateway/",
"group": "Build",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/publish-webgateway.ps1",
"-Configuration",
"Release",
"-Runtime",
"win-x64"
],
"workingDir": ".",
"dependsOn": [
"web"
]
},
{
"id": "tauri",
"label": "Build Tauri Desktop App",
"description": "Build desktop exe (no installer) → Journal.App/src-tauri/target/release/",
"group": "Build",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/publish-app.ps1",
"-Target",
"tauri",
"-TauriBundles",
"none"
],
"workingDir": ".",
"dependsOn": [
"sidecar"
]
},
{
"id": "tauri-nsis",
"label": "Build Tauri + NSIS Installer",
"description": "Build desktop exe with NSIS installer package",
"group": "Build",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/publish-app.ps1",
"-Target",
"tauri",
"-TauriBundles",
"nsis"
],
"workingDir": ".",
"dependsOn": [
"sidecar"
]
},
{
"id": "build-dotnet",
"label": "Build .NET Projects",
"description": "dotnet build — all C# projects in solution",
"group": "Build",
"command": "dotnet",
"args": [
"build"
],
"workingDir": ".",
"dependsOn": []
},
{
"id": "all",
"label": "Full Release Build ✦",
"description": "Sidecar → Web → WebGateway → Tauri, in dependency order",
"group": "Build",
"command": null,
"args": [],
"workingDir": ".",
"dependsOn": [
"sidecar",
"web",
"webgateway",
"tauri"
]
},
{
"id": "run-gateway",
"label": "Run WebGateway",
"description": "Start HTTP gateway dev server at http://localhost:5180",
"group": "Dev",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/run-webgateway.ps1"
],
"workingDir": ".",
"dependsOn": []
},
{
"id": "test",
"label": "Run Smoke Tests",
"description": "Run all ~80 integration tests in Journal.SmokeTests",
"group": "Test",
"command": "dotnet",
"args": [
"run",
"--project",
"Journal.SmokeTests/Journal.SmokeTests.csproj"
],
"workingDir": ".",
"dependsOn": []
},
{
"id": "gate",
"label": "Run Migration Gate",
"description": "Full build + smoke tests + parity check",
"group": "Test",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/migration-gate.ps1"
],
"workingDir": ".",
"dependsOn": []
},
{
"id": "nuget-export",
"label": "Export NuGet Cache",
"description": "Prime and export .nuget cache to zip for offline use",
"group": "Cache",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/nuget-export-cache.ps1"
],
"workingDir": ".",
"dependsOn": []
},
{
"id": "nuget-import",
"label": "Import NuGet Cache",
"description": "Import cache zip and validate restore",
"group": "Cache",
"command": "pwsh",
"args": [
"-NoProfile",
"-ExecutionPolicy",
"Bypass",
"-File",
"scripts/nuget-import-cache.ps1"
],
"workingDir": ".",
"dependsOn": []
}
],
"env": [
{
"key": "JOURNAL_AI_PROVIDER",
"description": "AI provider bridge mode",
"default": "none",
"options": [
"none",
"python-sidecar"
]
},
{
"key": "JOURNAL_LOG_LEVEL",
"description": "Log verbosity for C# backend",
"default": "warning",
"options": [
"trace",
"debug",
"information",
"warning",
"error",
"critical"
]
},
{
"key": "JOURNAL_NLP_BACKEND",
"description": "Python NLP backend selection",
"default": "auto",
"options": [
"auto",
"spacy",
"fallback"
]
},
{
"key": "JOURNAL_PROJECT_ROOT",
"description": "Override project root path (blank = auto-detect)",
"default": "",
"options": []
},
{
"key": "JOURNAL_VAULT_DIR",
"description": "Override vault directory path",
"default": "",
"options": []
},
{
"key": "JOURNAL_DATA_DIR",
"description": "Override decrypted data directory path",
"default": "",
"options": []
}
]
}