1085667d7b
package-windows.bat builds gosentry.exe then bundles it with README and CHANGELOG into a versioned .zip via PowerShell Compress-Archive. package-linux.sh does the same for linux-amd64 and linux-arm64 (arm64 cross-compiles via aarch64-linux-gnu-gcc; skips gracefully if absent), producing .tar.gz archives with files at the archive root. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
140 lines
8.3 KiB
Markdown
140 lines
8.3 KiB
Markdown
# Release 0.10.0 — Task List
|
||
|
||
Execution checklist for [RELEASE-0.10-PLAN.md](RELEASE-0.10-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; confirm the
|
||
Linux test build with `GOOS=linux go vet ./...`.
|
||
|
||
## Phase 1 — Log-name fix + one-line activity (§3, §1)
|
||
|
||
Done first because both share a compact, single-line record formatter.
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T1.1 | `app/format.go`: add a compact one-line formatter (`EventLine`) that drops the full log path and uses `filepath.Base(e.LogFile)`; keep verbose `EventText` for History. | sonnet | low |
|
||
| T1.2 | `ui/jobs_view.go`: set the `jobLogs` row label `Wrapping = fyne.TextTruncate` and render via the compact formatter so each entry is one line. | sonnet | low |
|
||
| T1.3 | `ui/history_view.go`: verify column width/truncation never clips `.log` to `..lo`; keep the full path available (tooltip/row). | sonnet | low |
|
||
| T1.4 | `app/format_test.go`: cover the compact formatter (log-file present/absent, base-name output). | haiku | low |
|
||
|
||
## Phase 2 — Job execution-time statistics (§2)
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T2.1 | `domain/record.go`: add `DurationMS int64` (tag consistent with existing fields). | haiku | low |
|
||
| T2.2 | `runner/runner.go`: measure wall-clock start→finish and set duration on the record; `StartOnly` jobs record `0`. | sonnet | medium |
|
||
| T2.3 | `runner/logfile.go`: write a `duration` line into the log header. | haiku | low |
|
||
| T2.4 | `domain/runtime.go` + `app/run.go`: add the aggregate (`RunCount`, `FailCount`, `LastDurationMS`, `AvgDurationMS`, `MaxDurationMS`); update it in `executeRun`. | sonnet | medium |
|
||
| T2.5 | Seed stats from existing log files on startup: a `runner` helper that parses `duration`/`state` headers (suffix-matched, bounded by `MaxLogFiles`, tolerant of duration-less logs), folded into `JobRuntime` at build time. | opus | high |
|
||
| T2.6 | `app/format.go` `DisplayStats(rt)` one-line summary + `ui/jobs_view.go` "Statistics" detail row (refreshed in `updateDetails`). | sonnet | medium |
|
||
| T2.7 | Tests: `format_test.go` (DisplayStats), `app/run_test.go` (aggregate updates after fake runs), `runner` seed test incl. a duration-less legacy log. | sonnet | medium |
|
||
|
||
## Phase 3 — Per-job run policy (§4)
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T3.1 | `domain/job.go`: add `OverlapPolicy` (`json:"overlap_policy,omitempty"`); empty = inherit global. | haiku | low |
|
||
| T3.2 | `app/run.go` `RunDue`: resolve the effective policy per job (job value else `Config.OverlapPolicy`); `normalizeJob`/`normalizeJobs` leave empty as inherit. | opus | high |
|
||
| T3.3 | `ui/job_dialog.go`: overlap-policy `widget.Select` with "(Use global default)" → empty; `settings_view.go` wording; `app/format.go` reflects effective policy in details. | sonnet | medium |
|
||
| T3.4 | `app/run_test.go`: per-job `queue` overrides global `skip` (and vice versa); empty inherits. | opus | high |
|
||
|
||
## Phase 4 — Persist global pause state (§6)
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T4.1 | `domain/config.go`: add `Paused bool` (`json:"paused,omitempty"`). | haiku | low |
|
||
| T4.2 | `app/operations.go` `SetGlobalPause`: persist into `s.store.Config` + `SaveConfig`. `app/service.go`: init `s.paused` from `Config.Paused` and apply paused next-run text at startup. | sonnet | medium |
|
||
| T4.3 | `ui/jobs_view.go`: init `schedulerPaused`, the Pause-all/Resume-all button, and the scheduler-state label from the persisted state. | sonnet | low |
|
||
| T4.4 | `app/operations_test.go`: `SetGlobalPause(true)` persists; a Service rebuilt from that store starts paused and refuses `RunDue`/`RunNow`. | sonnet | medium |
|
||
|
||
## Phase 5 — Window sizing (§5)
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T5.1 | `ui/run.go`: lower default to a 720p-safe size (~`1024×660`) + sensible `MinSize`; re-check `commandOutputScroll` min size and `minJobsSidebarWidth` in `jobs_view.go`. Manual check on 1366×768. | sonnet | medium |
|
||
|
||
## Phase 6 — Refactor + cleanup (§7)
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T6.1 | `ui/jobs_view.go`: split a clean seam (details-panel build or toolbar/button wiring) to bring it back under the size guideline after the §1/§2/§4/§6 edits. | sonnet | medium |
|
||
| T6.2 | Post-field-test cleanup sweep: stale diagnostics, over-defensive checks, obsolete autostart-migration code, noisy README notes, ignore rules. **Keep** the startup-timing History event. | sonnet | medium |
|
||
| T6.3 | Drop the one-time YAML→JSON import: shadow structs + `importYAML*` + legacy branches in `storage/store.go`; legacy names in `paths.go`; `go.yaml.in/yaml/v4` via `go mod tidy`; YAML-import tests + `writeYAML` helper; `*.yaml` ignore rules. | sonnet | medium |
|
||
| T6.4 | `docs/ARCHITECTURE.md`: document per-job overlap policy, run-time statistics (incl. log-file seeding), the persisted pause flag, and the `jobs_view.go` split. | sonnet | medium |
|
||
|
||
## Phase 7 — Portable packaging (§8)
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T7.1 | `scripts\package-windows.*`: build + bundle `gosentry.exe`, `README.md`, `CHANGELOG.md` into a portable `.zip`. | sonnet | medium |
|
||
| T7.2 | `scripts/package-linux.*`: build + bundle binary, `README.md`, `CHANGELOG.md` into `.tar.gz` for `linux-amd64` and `linux-arm64`. | sonnet | medium |
|
||
|
||
## Phase 8 — Release docs + version
|
||
|
||
| Task | Description | Model | Thinking |
|
||
|------|-------------|-------|----------|
|
||
| T8.1 | Bump `src/app/version.go` to `0.10.0`; update `docs/CHANGELOG.md`; tick the addressed `docs/ROADMAP.md` items; append any startup re-measure to `docs/PERFORMANCE.md`. | haiku | low |
|
||
|
||
---
|
||
|
||
## Completion checklist
|
||
|
||
### Phase 1 — Log-name + one-line activity
|
||
- [x] T1.1 — compact one-line formatter
|
||
- [x] T1.2 — `jobLogs` single-line rows
|
||
- [x] T1.3 — History `.log` truncation verified
|
||
- [x] T1.4 — formatter tests
|
||
|
||
### Phase 2 — Execution-time statistics
|
||
- [x] T2.1 — `DurationMS` on `RunRecord`
|
||
- [x] T2.2 — measure duration in runner
|
||
- [x] T2.3 — `duration` log header
|
||
- [x] T2.4 — runtime aggregate + `executeRun` update
|
||
- [x] T2.5 — seed stats from log files
|
||
- [x] T2.6 — `DisplayStats` + Statistics row
|
||
- [x] T2.7 — stats tests
|
||
|
||
### Phase 3 — Per-job run policy
|
||
- [x] T3.1 — `Job.OverlapPolicy` field
|
||
- [x] T3.2 — effective-policy dispatch + inherit
|
||
- [x] T3.3 — dialog select + settings/format wording
|
||
- [x] T3.4 — per-job override tests
|
||
|
||
### Phase 4 — Persist global pause state
|
||
- [x] T4.1 — `Config.Paused` field
|
||
- [x] T4.2 — persist in `SetGlobalPause` + init from config
|
||
- [x] T4.3 — UI inits from persisted state
|
||
- [x] T4.4 — persistence + restored-paused tests
|
||
|
||
### Phase 5 — Window sizing
|
||
- [x] T5.1 — 720p-safe default + MinSize
|
||
|
||
### Phase 6 — Refactor + cleanup
|
||
- [x] T6.1 — `jobs_view.go` split
|
||
- [x] T6.2 — post-field-test cleanup (keep startup timing)
|
||
- [x] T6.3 — drop YAML→JSON migration
|
||
- [x] T6.4 — ARCHITECTURE.md update
|
||
|
||
### Phase 7 — Portable packaging
|
||
- [x] T7.1 — Windows `.zip`
|
||
- [x] T7.2 — Linux `.tar.gz` (amd64 + arm64)
|
||
|
||
### Phase 8 — Release docs + version
|
||
- [ ] T8.1 — version bump + CHANGELOG + ROADMAP + PERFORMANCE
|
||
|
||
## Definition of done
|
||
|
||
- `go vet ./...` clean; `go test ./...` green on Windows (CGO) and Linux.
|
||
- Activity panel entries are one line; log file names show the base name with a
|
||
full `.log` extension (no `..lo`).
|
||
- Details panel shows run-time statistics that update after runs and survive a
|
||
restart (seeded from log files).
|
||
- A per-job overlap policy overrides the global default; an unset job inherits it.
|
||
- "Pause all" survives a restart: a paused install relaunches paused.
|
||
- The window opens fully visible on a 1366×768 / 720p screen.
|
||
- No YAML→JSON import code remains; `go.yaml.in/yaml/v4` is gone from `go.mod`.
|
||
- Portable `.zip` and `.tar.gz` artifacts build; ARCHITECTURE.md, CHANGELOG, and
|
||
ROADMAP reflect the release; version is `0.10.0`.
|