Skip to content

Latest commit

 

History

History
281 lines (221 loc) · 14.3 KB

File metadata and controls

281 lines (221 loc) · 14.3 KB

dev-prompt — remaining work

Everything below is discussed-but-not-built, ordered easiest → hardest. The config schema itself (markers / programs / rules / universal, templates, merge model) is implemented — read src-tauri/src/default_config.yaml for the canonical shape.

6. task-targets provider · medium, three small parsers

Parse target lists and emit one terminal action per target.

  • Makefile: lines matching ^([A-Za-z0-9_.-]+):(?!=) minus .PHONY etc.
  • justfile: just --summary if just on PATH, else parse ^([a-z0-9_-]+).
  • Taskfile.yml: YAML parse, keys under tasks:.

Cap at ~20. Register "task-targets" in rules.rs::provider_actions, then add the [Makefile, justfile, Taskfile.yml] rule to default_config.yaml.

Files: rules.rs (or a providers/ split if it grows), default_config.yaml.


10. Terminal abstraction — non-Windows · hard; now testable on Linux

The Windows half shipped (see Done): TermKind table (wt / alacritty / wezterm), a terminal: pin and terminal_template: override, the shell: knob + per-shell shell_wrap, list_terminals / list_shells, and the Settings dropdowns. The Linux distribution work (see shipped-alongside) means there's a real CachyOS/KDE box to validate against now. Left:

  • Linux emulator tableterminalize()'s #[cfg(not(windows))] branch still spawns the bare command with no window. Add the same table shape:
    • alacritty --working-directory D -e CMD · kitty --directory D CMD
    • wezterm start --cwd D -- CMD · gnome-terminal --working-directory=D -- CMD
    • konsole --workdir D -e CMD · foot --working-directory=D CMD
    • xterm -e sh -c 'cd D; CMD; exec $SHELL'
    • Wayland-only emulators + the x-terminal-emulator alias. Verify on WSLg / VM.
  • shell_wrap on non-Windows — currently the branch runs the command bare; wire config.shell + the per-shell "run and hold" flags in there too.

Files: rules.rs (terminalize, shell_wrap), default_config.yaml.


16. App launcher — phase 2 · incremental on the shipped V1

The > app scope shipped (see Done): Windows discovery (Start Menu + Store + Uninstall keys + bounded %LOCALAPPDATA%\Programs scan), extracted+cached icons, frecency, apps.{enabled,extra_dirs,exclude}, Settings controls. Left:

  • Blended overflow — when a no-prefix repo query has few/no matches, show the top ~4 app hits under a dim — Apps — divider without leaving repo scope. Needs the keyboard-nav model to walk a mixed list and Enter to branch (repo → action menu, app → launch).
  • App action menu — Tab on an app row → Open / Open file location / Run as administrator / Copy path. Currently Tab is a no-op in the > scope.
  • Native enumeration — replace the embedded PowerShell script with direct registry reads + IShellLink if the ~4 s cold rescan ever matters.

Files: src-tauri/src/apps.rs, src/App.svelte, src/lib/components/AppList.svelte.


11. fs watcher / incremental reindex · hard — new dep, concurrency, cross-platform

Avoid the "stale until next open + rescan" model.

  • notify crate (+ notify-debouncer-full).
  • Shallow, non-recursive watch on each root (recursive inotify on ~/git blows past max_user_watches on Linux). React only to dir create/remove/rename.
  • Debounce ~750 ms → scan_root(one_root) (new incremental fn) → cache::merge → emit repos:updated.
  • Watchers start in setup(), restart when roots changes; keep the TTL rescan as the backstop for deeper changes a shallow watch misses.

Files: new watch.rs, scan.rs (scan_root), lib.rs, commands.rs, Cargo.toml.


12. Linux X11/Wayland hotkey hardening · partly out of our hands; lower urgency now

tauri-plugin-global-shortcutglobal-hotkey is X11-only on Linux. Wayland has no global-grab; it needs the GlobalShortcuts XDG portal (compositor support varies), and the plugin has no portal support upstream yet.

Status: the X11 grab via XWayland is confirmed working on KDE Wayland (native and inside the Flatpak with --socket=x11), and the limitation is now documented in docs/linux-distribution/phase-4-flatpak.md. So this is no longer "the hotkey is broken on Wayland" — it's the portal path as a nice-to-have.

  • Detect session type via tauri-plugin-os.
  • On Wayland without XWayland: attempt the portal; if unavailable, surface a clear message and fall back (tray-only activation).

Files: lib.rs, docs. Blocked on upstream tauri-plugin-global-shortcut portal support.


13. Eclipse / Anypoint project provisioner · milestone-sized, Eclipse-version-coupled

Eclipse-family IDEs have no CLI to open an arbitrary project — only -data <workspace>, and the project must already be registered in that workspace's .metadata. The fatten pass ships the naive form ("Open in Anypoint Studio" = -data {{path}}), which is one-click only when the scanned folder is the workspace.

A real "open this repo as a project" needs a pre-launch provisioner — a new action-type concept (provision: step that runs before the spawn):

  • Option A (preferred): write <workspace>/.metadata/.plugins/org.eclipse.core.resources/.projects/<name>/.location (semi-documented binary URI format, stable since 3.x) for a repo that has a .project on disk, then -data <workspace> launch. Nothing to ship; degrades to "import once by hand" if the format drifts. Needs an anypoint: { workspace: <path> } config knob.
  • Option B: bundle a ~50-line headless Eclipse plugin (loadProjectDescriptioncreateopen → open workbench) in dropins/. Correct, but you then maintain it per Studio / Eclipse / STS version.

Files: new provisioner hook in rules.rs / launch.rs, config.rs (workspace knob), default_config.yaml.


14. More workspace-manifest providers · bigger passes

Same manifest → [(name, dir)] → per-module terminal actions shape as the dotnet / go-work / maven-modules / gradle-modules providers, for the ecosystems that need more than a flat parse:

  • Cargo workspaces — root Cargo.toml [workspace] members = [...] incl. globs (crates/*). Needs a TOML parser (new dep) or a careful hand-parse. cargo build -p <member> from the root. Largely redundant with inspect's crates/ discovery — low ROI.
  • Nx / Turborepo / Bazel — build graphs, not flat lists: nx.json + scattered project.json, turbo.json + workspace globs, or bazel query //.... Heavier; niche.

Files: rules.rs (one provider arm each) + a small parser module per tool; default_config.yaml.


15. Conditional / computed template expansion · config-language feature

Today {{...}} is plain string substitution — no conditionals, no fallbacks, no computed values. That's the wall every "detect X, then adapt" case hits, and it's why things like venv-aware Python had to be built in Rust rather than authored in rules.yaml.

Concretely, a user can already:

  • match a rule on a directory (match: [.venv, venv] — dir names are in the file list), and
  • use {{path}} / {{file}} in a template-expanded program:, e.g. program: "{{file}}/bin/python", with when: windows / when: unix for the Scripts vs bin split.

What they can't do:

  • Fallback — one action that uses the venv interpreter if .venv exists and bare python otherwise. No {{venv_python | default: python}}. You end up duplicating every action (venv set + plain set → noise), or hardcoding a path that's broken on projects without a venv.
  • Existence-guard an action — a rule action's raw program: isn't verified to be a real file the way a programs: candidate is; it's used as typed.
  • Compute once, use manyvenv threads into pip + pytest + django + run uniformly in Rust; in config you'd repeat the literal in each action.
  • Project-relative programs:programs: entries resolve once, process-wide, before any project is known, so {{path}} isn't available there; no reusable project-scoped program key.

Possible directions (pick one, keep it small):

  • {{a | default: b}} / {{a ?? b}} coalescing in expand().
  • A rule/action-level when_file: / unless_file: guard (glob, relative to the project dir) so an action only emits when a path exists — covers the venv case without a full expression language.
  • Computed vars: a rule let: block (venv_py: "{{path}}/.venv/bin/python") whose values are only bound when their referenced path exists.

Files: rules.rs (expand + build_action), config.rs (schema), docs/rules-engine.md.


17. glib RUSTSEC advisory (GHSA-wrw7-89jp-8q8g) · blocked upstream, nothing to do here

Dependabot flags a moderate-severity soundness bug in glib 0.15–0.19's VariantStrIter iterator impl (NULL-deref crash under specific GVariant string-array iteration; RUSTSEC-2024-0429). It's transitive — pulled in by gtk 0.18.x, itself required by tauri 2.11.5's Linux tray/window backend — and can't be bumped independently: cargo update -p glib --precise 0.20.0 fails because tauri hard-pins gtk = "^0.18".

Linux-only at compile/runtime (Windows never links glib/gtk); dev-prompt doesn't call the affected iterator itself, so realistic exposure is low. No action possible until Tauri ships on a gtk-rs 0.20+ base — check Tauri's own releases rather than re-investigating this alert from scratch.

Tracking: Dependabot alert #1.


Done

  • #1 Fatten default_config.yaml — 2026-08-31
  • #2 VCS row badge — 2026-08-31 (PR #1)
  • #3 Folder picker for roots — 2026-08-31 (PR #1)
  • #4 Start at login — 2026-08-31 (PR #1); extended 2026-09-07 to work inside the Flatpak sandbox via the org.freedesktop.portal.Background portal (src-tauri/src/autostart.rs, ashpd)
  • #5 collapse_nested toggle (true / false / auto) — 2026-09-01
  • #8 per-repo rule trace in Settings ("Trace a repo") — 2026-09-01
  • #7 dotnet provider — .sln / .slnx / lone .??proj → build/run/test — 2026-09-01
  • go-work / maven-modules / gradle-modules providers (#14's cheap tier) — 2026-09-01
  • Sub-project discovery generalizedhas_any_marker() used to hardcode 5 ecosystems (.sln, package.json, Cargo.toml, go.mod, Python); the other 13 rule-based ones (compose, Maven, Gradle ×2, CMake, Bundler, Mix, Composer, Deno, Nix ×2, Docker, Eclipse) only ever worked at a repo root, invisible as a sub-project. Now checks proj.files against the same discovery_globs scan.rs uses to find repos, so any rule — present or future — is automatically enough. — 2026-09-01
  • Flutter/Dart supportpubspec.yaml rule (pub get/run/build/test), plus flutter-android reaching into android/ for the Gradle project Flutter generates there (one level below the project root, invisible to gradle-modules); uses the bundled gradlew wrapper when present. — 2026-09-01
  • Python provider fleshed out — was just pip/uv/poetry install. Now: venv-aware interpreter (.venv/venvScripts/python.exe), Django (manage.py → runserver/migrate/test), pytest (conftest.py/pytest.ini/ tox.ini/tests/), run entry (main.py/app.py/__main__.py), pipenv + pdm runners, and more markers (setup.py, setup.cfg, Pipfile, manage.py) so non-requirements.txt projects get detected. — 2026-09-01
  • Terminal emulator selector (Windows)TermKind table (wt / alacritty / wezterm), terminal: pin + terminal_template: override in config.yaml, list_terminals command, Settings dropdown. — 2026-09-01
  • #9 "Run command…" + shell default (Windows)prompt: true actions + {{input}}; a 4th overlay mode (RunCommand.svelte) with a per-run shell picker; run_command / list_shells; config.shell + per-shell shell_wrap ("run and hold" for pwsh / cmd / bash / nu / …) + a Settings Shell dropdown. — 2026-09-01
  • App launcher — > scope (Windows) — type > in the search bar to search installed apps instead of repos. apps.rs discovery via one embedded PowerShell script (Start Menu + Get-StartApps Store + Uninstall hives + bounded %LOCALAPPDATA%\Programs scan), extracted + disk-cached icons, keep_entry noise filter + path dedupe; apps.json cache (24 h TTL), list_apps / rescan_apps / run_app, app-usage.json frecency; AppList / AppRow, config.apps.{enabled,extra_dirs,exclude} + Settings controls. Phase 2 in #16. — 2026-09-01
  • Second app-launcher hotkey + hotkey guardconfig.apps_hotkey (default Ctrl+Shift+.) opens straight into the > scope; scoped overlay:shown payload. hotkeys.ts::classifyHotkey block/warn list in the recorder (extracted to HotkeyRecorder.svelte, used for both hotkeys). Settings: hotkeys side-by-side, Shell inline with Terminal, "Start at login" to the top, a zero-height sticky Save, save-first "Rescan" buttons. — 2026-09-01

Remaining, hardest-first: #6 task-targets provider, #16 app-launcher phase 2, #15 conditional template expansion, #14 (Cargo-workspace / Xcode / Nx-Turbo- Bazel), #10 terminal abstraction (non-Windows), #11 fs watcher, #12 Wayland hotkey, #13 Eclipse provisioner.

Not on this list (shipped alongside)

Release pipeline (CalVer + GitHub Actions + signed auto-update), config.yaml / rules.yaml split, per-action icons + Settings icon browser, proactive update notifications (launch + daily check, footer chip, tray tooltip, system notification), CI workflow + main branch protection, empty-state guidance, mouse back/forward navigation, hover/scroll fix.

Linux distribution (its own roadmap: docs/linux-distribution/) — Aug–Sep 2026. Phase 1 packaging metadata (.desktop + AppStream, CI validation); Phase 3 self-hosted signed apt + rpm + pacman repo on GitHub Pages (repo.yml, build-repo.sh); Phase 4 self-hosted GPG-signed Flatpak (sandbox-aware flatpak-spawn --host launch, host tool detection, /run/host app discovery, Background-portal autostart, built in the flathub-infra container); the > app scope on Linux (freedesktop .desktop discovery, theme icons, gtk-launch); Dependabot (grouped weekly). Phase 2 (AUR) parked on registration, Phase 5 (Snap) skipped (can't self-host), Phase 6 (official repos) passive. Reviewed + hardened 2026-09-07 (docs/review/20260907/).