94a8dcc62a
Add Execution mode and Overlap policy widget.Select controls in ui/settings_view.go under a new Queue section group, between the Application and Storage sections. Both selects are primed from the current config on open and their selected values are written back into the config struct on save, passing through the existing UpdateSettings validation path. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8.3 KiB
8.3 KiB
Pre-Release Milestone — Task List
Execution checklist for PRE-RELEASE-PLAN.md. Each task names
the recommended model and thinking depth. Model: haiku / sonnet / opus.
Thinking: low / medium / high. Section numbers (§) reference the plan.
Build/test note: the GUI needs CGO + MSYS2 UCRT64; the default Bash env has CGO
off. Use scripts\test.bat / scripts\build-windows.bat on Windows.
Phase 1 — Storage JSON + exit-code removal (§1, §10)
These land together because both edit domain/job.go and storage/store.go.
| Task | Description | Model | Thinking |
|---|---|---|---|
| P1.1 | domain/job.go, domain/config.go, domain.JobsFile: swap yaml:"…" tags for json:"…", keep omitempty. |
sonnet | low |
| P1.2 | storage/store.go: replace writeYAML with writeJSON (json.MarshalIndent 2-space); switch the two Unmarshal calls to json. |
opus | high |
| P1.3 | storage/paths.go: rename files to gosentry.json / jobs.json; remove LegacyConfigFileName; add legacyYAMLConfigFileName / legacyYAMLJobsFileName. |
sonnet | medium |
| P1.4 | One-time YAML import in store.go: read gosentry.yaml / jobs.yaml via private yaml-tagged shadow structs when JSON is absent; rely on existing SaveConfig/SaveJobs to rewrite as JSON. |
opus | high |
| P1.5 | Drop SuccessExitCodes field; delete runner/exitcodes.go; simplify runStateDetail (0 = OK, non-zero = Failed); strip the field from runner/logfile.go, app/format.go, app/operations.go (runningOutput, normalizeJob), storage/store.go (normalizeJobs). |
sonnet | medium |
| P1.6 | Update tests/docs: storage/store_test.go (JSON write helper + YAML-import test, drop pysentry-migration test), remove exit-code tests in runner/runner_test.go + app/format_test.go, update docs/TESTS.md. |
sonnet | medium |
Phase 2 — PySentry legacy removal (§7)
| Task | Description | Model | Thinking |
|---|---|---|---|
| P2.1 | autostart_windows.go: remove legacyAutostartName, cleanupLegacyRegistryAutostart, legacyRegistryAutostartExists, parseRegistryRunValue, and their use in Set/Status; drop readShortcutTarget if unused. |
sonnet | medium |
| P2.2 | autostart_linux.go: remove legacy systemd + desktop cleanup functions and their Set/Status calls. |
sonnet | medium |
| P2.3 | Delete the legacy tests in autostart_windows_test.go / autostart_linux_test.go. |
haiku | low |
| P2.4 | .gitignore / .dockerignore: drop pysentry.yaml; add gosentry.json / jobs.json; keep *.yaml ignores for the import window. |
haiku | low |
Phase 3 — Task-queue model + settings (§2, §9 split)
| Task | Description | Model | Thinking |
|---|---|---|---|
| P3.1 | domain/config.go: add ExecutionMode / OverlapPolicy (+ JSON tags) and exported constants; defaults (parallel / skip) in loadOrCreateConfig and validateConfig. domain/runtime.go: add Pending bool. |
sonnet | medium |
| P3.2 | Create src/app/run.go; move RunDue, RunNow, startRunLocked, executeRun and helpers out of operations.go. |
sonnet | medium |
| P3.3 | Rework dispatch: startRunLocked advances NextDue instead of zeroing it; RunDue scans all due jobs and applies execution mode (parallel/sequential) + overlap policy (skip/queue); executeRun re-runs a Pending job; add anyRunningLocked; sequential guard in RunNow. |
opus | high |
| P3.4 | ui/settings_view.go: add a Queue group with widget.Select for execution mode and overlap policy, wired into the saved config. |
sonnet | medium |
| P3.5 | Extend app/operations_test.go (or new run_test.go): parallel multi-start, sequential serialization, skip drops overlap, queue re-runs after finish. Reuse fake-runJob + StartWith(fakeClock). |
opus | high |
Phase 4 — Notifications + Command browse (§4, §3)
| Task | Description | Model | Thinking |
|---|---|---|---|
| P4.1 | Add Service.ShouldNotifyOnFailure() (reads config under mu); in ui/mainwindow.go listener, SendNotification on a failed real-run when enabled. Update Settings wording. |
sonnet | medium |
| P4.2 | ui/job_dialog.go: wrap Command entry with a Browse button; add chooseFile helper (dialog.NewFileOpen) in settings_view.go. |
sonnet | low |
Phase 5 — Icons (§5)
| Task | Description | Model | Thinking |
|---|---|---|---|
| P5.1 | assets/assets.go: embed gosentry-icon-16x16.png; add IconSmall(); keep Icon()/IconBytes() (large). |
haiku | low |
| P5.2 | ui/tray.go: desk.SetSystemTrayIcon(assets.IconSmall()); confirm window/app icon stays large in run.go. Verify gosentry.ico carries both sizes. |
sonnet | low |
Phase 6 — Fyne 2.7 upgrade + tray click (§6)
| Task | Description | Model | Thinking |
|---|---|---|---|
| P6.1 | go.mod: bump fyne.io/fyne/v2 to 2.7.x (go get + go mod tidy); rebuild under MSYS2 UCRT64; review 2.7 changelog for breaking changes. |
opus | high |
| P6.2 | ui/tray.go: add desk.SetSystemTrayWindow(w) for left-click-to-show; keep the "Show" menu item. |
sonnet | low |
| P6.3 | Re-measure startup via the History "Started … in Xms" event; append the result to docs/PERFORMANCE.md. |
haiku | low |
Phase 7 — Roadmap follow-ups (§9)
| Task | Description | Model | Thinking |
|---|---|---|---|
| P7.1 | Move Windows-only runner tests (TestShellCommandHidesWindow, TestShellCommandUsesWindowsSafeQuoting, peers touching SysProcAttr/windowsShellCommandLine) into runner/runner_windows_test.go guarded by //go:build windows; confirm Linux test build compiles. |
sonnet | medium |
Phase 8 — Docs + version (§8, §7)
| Task | Description | Model | Thinking |
|---|---|---|---|
| P8.1 | New docs/DEVELOPMENT.md: move Requirements, Build, Run From Source, Project Layout, Dependencies/mirroring out of README. |
sonnet | medium |
| P8.2 | Rewrite README.md for end users: Features, Storage (JSON), Schedules, Using the App, Queue settings, notifications, Autostart, Troubleshooting; add a Documentation link list; fix 0.3.0 → current version. |
sonnet | medium |
| P8.3 | Update docs/CHANGELOG.md; mark the addressed docs/ROADMAP.md items done. |
haiku | low |
Completion checklist
Phase 1 — Storage JSON + exit-code removal
- P1.1 — JSON struct tags
- P1.2 —
writeJSON+ JSON unmarshal - P1.3 —
gosentry.json/jobs.jsonpaths; drop pysentry name - P1.4 — One-time YAML import
- P1.5 — Remove
SuccessExitCodesacross code - P1.6 — Update storage/runner/format tests + TESTS.md
Phase 2 — PySentry legacy removal
- P2.1 — Windows autostart legacy code
- P2.2 — Linux autostart legacy code
- P2.3 — Delete legacy autostart tests
- P2.4 —
.gitignore/.dockerignore
Phase 3 — Task-queue model + settings
- P3.1 — Config/runtime fields + defaults
- P3.2 — Split dispatch into
app/run.go - P3.3 — Rework
RunDue/executeRunfor mode + overlap policy - P3.4 — Settings Queue selects
- P3.5 — Queue tests
Phase 4 — Notifications + Command browse
- P4.1 — Failure notifications
- P4.2 — Command Browse button
Phase 5 — Icons
- P5.1 — Embed small icon +
IconSmall() - P5.2 — Tray uses small icon; verify
.ico
Phase 6 — Fyne 2.7 upgrade + tray click
- P6.1 — Bump Fyne to 2.7.x; rebuild
- P6.2 —
SetSystemTrayWindowleft-click-to-show - P6.3 — Re-measure startup → PERFORMANCE.md
Phase 7 — Roadmap follow-ups
- P7.1 — Linux test build fix (build-tagged Windows tests)
Phase 8 — Docs + version
- P8.1 —
docs/DEVELOPMENT.md - P8.2 — End-user README rewrite
- P8.3 — CHANGELOG + ROADMAP updates
Definition of done
go vet ./...clean;go test ./...green on Windows and Linux (CGO on).- Storage reads/writes JSON; an existing
*.yamlinstall imports once into JSON. - Queue execution mode + overlap policy are configurable and exercised by tests.
- A failed real run raises a desktop notification when enabled.
- Tray left-click shows the window; tray uses the small icon, window/taskbar the large one.
- No PySentry legacy code remains; README is end-user-focused with dev docs split
into
docs/DEVELOPMENT.md.