savepoint 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +12 -1
- package/.github/workflows/ci.yml +20 -0
- package/.golangci.yml +11 -0
- package/.savepoint/Design.md +40 -38
- package/.savepoint/{audit/v1.1/E02-cross-platform-compatibility/proposals.md → releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md} +48 -38
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Audit.md +195 -0
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +14 -1
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +3 -3
- package/.savepoint/{audit/v1.1/E04-epic-navigation/proposals.md → releases/v1.1/epics/E04-epic-navigation/E04-Audit.md} +65 -54
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Audit.md +237 -0
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +25 -16
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +17 -6
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +15 -5
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +19 -5
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +11 -1
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +9 -6
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +29 -13
- package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Audit.md +56 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Detail.md +63 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T005-proposals.md +44 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T007-apply-close.md +35 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T009-integration.md +40 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T010-audit-file-migration.md +45 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T011-model-tab-state.md +26 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T012-epic-audit-render.md +33 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T013-handle-tab-keys.md +34 -0
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T014-tab-indicator.md +33 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Audit.md +336 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md +61 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T001-cli-entrypoint.md +37 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T002-target-validation.md +28 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T003-scaffold-writer.md +46 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T004-atomic-writes.md +27 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T005-magic-prompt.md +25 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md +26 -0
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T007-integration-test.md +26 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Audit.md +333 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Detail.md +68 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T001-cli-entrypoint.md +26 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T002-non-tty-fallback.md +27 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T003-tui-app-shell.md +28 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T004-board-model.md +29 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T005-detail-pane.md +27 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T006-status-transitions.md +29 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T007-theme-fallbacks.md +29 -0
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T008-integration-test.md +27 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Audit.md +207 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Detail.md +65 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T001-cli-entrypoint.md +24 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T002-config-router-validation.md +28 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T003-structure-checks.md +29 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T004-dependency-checks.md +27 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T005-audit-orphan-checks.md +28 -0
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T006-quality-gates-report.md +31 -0
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/E11-Detail.md +36 -0
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T001-debug-logging.md +25 -0
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T002-increase-debounce.md +21 -0
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T003-error-handling.md +22 -0
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T004-test-verify.md +29 -0
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Audit.md +444 -0
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Detail.md +45 -0
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T001-default-phase.md +35 -0
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T002-default-status.md +19 -0
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T003-better-errors.md +29 -0
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T004-validate-on-write.md +25 -0
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T005-tests.md +37 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Audit.md +118 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Detail.md +73 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T001-safe-cleanup.md +66 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T002-bug-fixes.md +35 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T003-centralize-duplication.md +60 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T004-infrastructure.md +33 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T005-decompose-update.md +37 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T006-async-io.md +40 -0
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T007-test-coverage.md +37 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Audit.md +267 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Detail.md +54 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T001-group-model.md +39 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T002-data-interfaces.md +42 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T003-discover-orphans.md +33 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T004-epic-panel-headings.md +35 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T005-shell-tokenization.md +27 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T006-unify-enums.md +29 -0
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T007-testutil-package.md +28 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Audit.md +272 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Detail.md +60 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T001-benchmarks.md +31 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T002-fuzz-targets.md +34 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T003-debug-flag.md +30 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T004-dist-checksums.md +27 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T005-windows-targets.md +28 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T006-abbreviation-splitting.md +26 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T007-root-test-allowlist.md +33 -0
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T008-ci-and-release-automation.md +46 -0
- package/.savepoint/releases/v1.1/epics/_archived/T001-cli-entrypoint.md +25 -0
- package/.savepoint/releases/v1.1/epics/_archived/T002-quality-gates.md +27 -0
- package/.savepoint/releases/v1.1/epics/_archived/T003-snapshot.md +27 -0
- package/.savepoint/releases/v1.1/epics/_archived/T004-ai-reconcile.md +29 -0
- package/.savepoint/releases/v1.1/epics/_archived/T006-tui-review.md +31 -0
- package/.savepoint/releases/v1.1/epics/_archived/T008-skip-handling.md +34 -0
- package/.savepoint/releases/v1.1/v1.1-PRD.md +67 -7
- package/.savepoint/router.md +10 -17
- package/AGENTS.md +39 -24
- package/Makefile +3 -1
- package/README.md +0 -1
- package/agent-skills/savepoint-audit/SKILL.md +86 -34
- package/agent-skills/savepoint-build-task/SKILL.md +7 -2
- package/agent-skills/savepoint-create-plan/SKILL.md +7 -2
- package/agent-skills/savepoint-create-task/SKILL.md +44 -31
- package/agent-skills/savepoint-draft-prd/SKILL.md +7 -2
- package/agent-skills/savepoint-system-design/SKILL.md +7 -2
- package/agent_skills_test.go +91 -0
- package/cmd/board.go +59 -0
- package/cmd/board_test.go +137 -0
- package/cmd/doctor.go +53 -0
- package/cmd/doctor_test.go +146 -0
- package/cmd/init.go +63 -0
- package/cmd/init_test.go +104 -0
- package/internal/board/board.go +44 -36
- package/internal/board/board_test.go +27 -82
- package/internal/board/card.go +43 -23
- package/internal/board/card_test.go +74 -5
- package/internal/board/column.go +75 -15
- package/internal/board/column_test.go +76 -2
- package/internal/board/debug.go +26 -0
- package/internal/board/debug_test.go +108 -0
- package/internal/board/detail.go +33 -47
- package/internal/board/detail_test.go +48 -0
- package/internal/board/epic_panel.go +120 -22
- package/internal/board/epic_panel_test.go +302 -17
- package/internal/board/help.go +1 -0
- package/internal/board/help_test.go +1 -0
- package/internal/board/integration_test.go +266 -0
- package/internal/board/interfaces.go +65 -0
- package/internal/board/interfaces_test.go +114 -0
- package/internal/board/io.go +93 -0
- package/internal/board/model.go +79 -118
- package/internal/board/plain.go +88 -0
- package/internal/board/plain_test.go +117 -0
- package/internal/board/release.go +1 -9
- package/internal/board/release_test.go +6 -6
- package/internal/board/status.go +4 -4
- package/internal/board/theme.go +24 -0
- package/internal/board/theme_test.go +31 -0
- package/internal/board/transitions.go +113 -88
- package/internal/board/transitions_test.go +164 -141
- package/internal/board/tui.go +32 -0
- package/internal/board/update.go +344 -215
- package/internal/board/update_test.go +326 -18
- package/internal/board/util.go +76 -0
- package/internal/board/view.go +31 -28
- package/internal/board/view_test.go +74 -2
- package/internal/board/watch.go +41 -5
- package/internal/buildtool/main.go +45 -15
- package/internal/buildtool/main_test.go +224 -0
- package/internal/data/config.go +17 -3
- package/internal/data/config_test.go +49 -0
- package/internal/data/discover.go +26 -0
- package/internal/data/discover_test.go +34 -10
- package/internal/data/errors.go +4 -0
- package/internal/data/fuzz_test.go +75 -0
- package/internal/data/lifecycle.go +13 -6
- package/internal/data/lifecycle_test.go +14 -11
- package/internal/data/parser.go +22 -6
- package/internal/data/parser_test.go +31 -7
- package/internal/data/task.go +0 -9
- package/internal/data/testdata/fuzz/FuzzSplitFrontmatterBody/68eb66b0fe91e7e3 +2 -0
- package/internal/data/write.go +88 -11
- package/internal/data/write_test.go +167 -0
- package/internal/doctor/checks.go +567 -0
- package/internal/doctor/checks_test.go +716 -0
- package/internal/doctor/gates.go +193 -0
- package/internal/doctor/gates_test.go +166 -0
- package/internal/doctor/interfaces.go +64 -0
- package/internal/doctor/interfaces_test.go +104 -0
- package/internal/doctor/repairs.go +80 -0
- package/internal/doctor/repairs_test.go +81 -0
- package/internal/doctor/report.go +157 -0
- package/internal/doctor/report_test.go +89 -0
- package/internal/init/clipboard.go +146 -0
- package/internal/init/clipboard_test.go +74 -0
- package/internal/init/install.go +16 -0
- package/internal/init/integration_test.go +197 -0
- package/internal/init/prompt.go +14 -0
- package/internal/init/prompt_test.go +77 -0
- package/internal/init/scaffold.go +59 -0
- package/internal/init/scaffold_test.go +179 -0
- package/internal/init/template_freshness_test.go +56 -0
- package/internal/init/validate.go +85 -0
- package/internal/init/validate_test.go +141 -0
- package/internal/init/write.go +73 -0
- package/internal/init/write_test.go +91 -0
- package/internal/styles/styles_test.go +133 -0
- package/internal/testutil/fixture.go +113 -0
- package/internal/testutil/fs.go +26 -0
- package/main.go +120 -4
- package/package.json +2 -2
- package/project-audit/audit_report_glm_5.1.md +411 -0
- package/project-audit/audit_report_opus_4.6.md +406 -0
- package/project-audit/consolidated-audit-report.md +456 -0
- package/templates/project/.savepoint/Design.md +2 -2
- package/templates/project/.savepoint/router.md +10 -10
- package/templates/project/AGENTS.md +33 -21
- package/templates/project/agent-skills/savepoint-audit/SKILL.md +87 -0
- package/templates/project/agent-skills/savepoint-build-task/SKILL.md +44 -0
- package/templates/project/agent-skills/savepoint-create-plan/SKILL.md +33 -0
- package/templates/project/agent-skills/savepoint-create-task/SKILL.md +44 -0
- package/templates/project/agent-skills/savepoint-draft-prd/SKILL.md +37 -0
- package/templates/project/agent-skills/savepoint-system-design/SKILL.md +38 -0
- package/templates/prompts/audit-reconciliation.prompt.md +33 -28
- package/templates/prompts/design.prompt.md +3 -1
- package/.savepoint/audit/v1/E01/proposals.md +0 -168
- package/.savepoint/audit/v1/E01/snapshot.md +0 -78
- package/.savepoint/audit/v1/E01-go-setup/proposals.md +0 -166
- package/.savepoint/audit/v1/E01-go-setup/snapshot.md +0 -71
- package/.savepoint/audit/v1/E01-scaffolding/proposals/AGENTS.md +0 -66
- package/.savepoint/audit/v1/E01-scaffolding/proposals/Design.md +0 -210
- package/.savepoint/audit/v1/E01-scaffolding/proposals/epic-Design.md +0 -117
- package/.savepoint/audit/v1/E01-scaffolding/proposals/quality-review.md +0 -101
- package/.savepoint/audit/v1/E01-scaffolding/snapshot.md +0 -54
- package/.savepoint/audit/v1/E02-data-model/snapshot.md +0 -128
- package/.savepoint/audit/v1/E02-data-readers/proposals.md +0 -123
- package/.savepoint/audit/v1/E02-data-readers/snapshot.md +0 -54
- package/.savepoint/audit/v1/E03-board-tui-core/proposals.md +0 -146
- package/.savepoint/audit/v1/E03-board-tui-core/snapshot.md +0 -57
- package/.savepoint/audit/v1/E03-cli-foundation/snapshot.md +0 -106
- package/.savepoint/audit/v1/E04-board-components/proposals.md +0 -118
- package/.savepoint/audit/v1/E04-board-components/snapshot.md +0 -77
- package/.savepoint/audit/v1/E04-templates-and-prompts/snapshot.md +0 -115
- package/.savepoint/audit/v1/E05-init-command/snapshot.md +0 -125
- package/.savepoint/audit/v1/E05-phase-transitions/proposals.md +0 -83
- package/.savepoint/audit/v1/E05-phase-transitions/snapshot.md +0 -36
- package/.savepoint/audit/v1/E06-atari-noir-layout/proposals.md +0 -130
- package/.savepoint/audit/v1/E06-atari-noir-layout/snapshot.md +0 -84
- package/.savepoint/audit/v1/E06-tui-board/snapshot.md +0 -64
- package/.savepoint/audit/v1/E07-audit-pipeline/snapshot.md +0 -165
- package/.savepoint/audit/v1/E08-board-workflow-cleanup/snapshot.md +0 -65
- package/.savepoint/audit/v1.1/E02-cross-platform-compatibility/snapshot.md +0 -41
- package/.savepoint/audit/v1.1/E04-epic-navigation/snapshot.md +0 -48
- package/ink-cli-ui-design.zip +0 -0
- package/savepoint +0 -0
- package/savepoint.exe +0 -0
|
@@ -21,7 +21,18 @@
|
|
|
21
21
|
"Bash(go doc *)",
|
|
22
22
|
"Bash(make clean *)",
|
|
23
23
|
"Bash(make build-linux *)",
|
|
24
|
-
"Bash(./savepoint_test_bin --version)"
|
|
24
|
+
"Bash(./savepoint_test_bin --version)",
|
|
25
|
+
"PowerShell(go run *)",
|
|
26
|
+
"Bash(go run *)",
|
|
27
|
+
"PowerShell(Get-ChildItem -Path \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\" -Force | Select-Object Name, @{Name=\"Type\"; Expression={if\\($_.PSIsContainer\\){\"DIR\"}else{\"FILE\"}}} | Format-Table -AutoSize)",
|
|
28
|
+
"PowerShell(Get-ChildItem *)",
|
|
29
|
+
"Bash(Get-ChildItem -Path \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\\\\.savepoint\\\\releases\\\\v1.1\\\\epics\\\\E08-board-command\" -Recurse -Filter \"*.md\")",
|
|
30
|
+
"Bash(Select-Object -ExpandProperty FullName)",
|
|
31
|
+
"Bash(cmd\")",
|
|
32
|
+
"PowerShell(go build *)",
|
|
33
|
+
"PowerShell(go test *)",
|
|
34
|
+
"PowerShell(cd \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\"; $files = @\\(\"agent-skills\\\\savepoint-create-task\\\\SKILL.md\", \"templates\\\\project\\\\agent-skills\\\\savepoint-create-task\\\\SKILL.md\"\\); foreach \\($f in $files\\) { $bytes = [System.IO.File]::ReadAllBytes\\($f\\); Write-Host \"$f first bytes: $\\($bytes[0..9] -join ','\\) \\(CRLF: $\\($bytes[3] -eq 13\\)\\)\" })",
|
|
35
|
+
"PowerShell(cd \"C:\\\\Users\\\\User\\\\Branding\\\\03-VIBE-LAB\\\\savepoint\"; $others = Get-ChildItem agent-skills -Recurse -Filter \"SKILL.md\" | Where-Object { $_.DirectoryName -notmatch \"savepoint-create-task\" }; foreach \\($f in $others\\) { $bytes = [System.IO.File]::ReadAllBytes\\($f.FullName\\); Write-Host \"$\\($f.Name\\) dir=$\\($f.Directory.Name\\) CRLF=$\\($bytes[3] -eq 13\\)\" })"
|
|
25
36
|
]
|
|
26
37
|
}
|
|
27
38
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [master]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [master]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
ci:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- uses: actions/setup-go@v5
|
|
16
|
+
with:
|
|
17
|
+
go-version: '1.26'
|
|
18
|
+
check-latest: true
|
|
19
|
+
|
|
20
|
+
- run: make ci
|
package/.golangci.yml
ADDED
package/.savepoint/Design.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: project-design
|
|
3
3
|
status: active
|
|
4
|
-
last_audited: v1.1/
|
|
4
|
+
last_audited: v1.1/E15-hardening
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Savepoint — System Architecture
|
|
@@ -20,11 +20,15 @@ last_audited: v1.1/E02-cross-platform-compatibility (2026-05-02)
|
|
|
20
20
|
- Per-task incremental: <2KB.
|
|
21
21
|
- Audit: 5–15KB.
|
|
22
22
|
- Anything that breaks these bounds violates the wedge.
|
|
23
|
-
- **Go data-reader boundary:** established in epic `E02-data-readers` (2026-05-01). `internal/data` owns Savepoint file parsing and discovery for the Go implementation: task frontmatter models, markdown YAML extraction, router state parsing, config theme defaults, release/epic/task directory listing, and boundary error sentinels.
|
|
23
|
+
- **Go data-reader boundary:** established in epic `E02-data-readers` (2026-05-01). `internal/data` owns Savepoint file parsing and discovery for the Go implementation: task frontmatter models, markdown YAML extraction, router state parsing, config theme defaults, release/epic/task directory listing, task lifecycle validation/defaulting, write-time status validation, and boundary error sentinels.
|
|
24
24
|
- **Template assets** live under `templates/` with helpers in `src/templates/` (epic E04).
|
|
25
|
-
- **Init command** (`savepoint init`) validates, scaffolds
|
|
26
|
-
- **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release
|
|
27
|
-
- **
|
|
25
|
+
- **Init command** (`savepoint init`) validates target directories, scaffolds rendered copies of `templates/project/`, prints the rendered magic prompt, attempts best-effort clipboard copy, and optionally runs `npm install` after scaffolding (v1.1 E07).
|
|
26
|
+
- **Board command** (`savepoint board`, and bare `savepoint`) reads project state, renders the Atari-Noir TUI board when stdout is a TTY, falls back to a deterministic plain table in non-TTY mode, supports `--release`/`--epic` filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), dedicated phase-colored Next Activity line below the header, sentence-boundary checklist rendering in task details, shared status glyph mapping for task cards and the epic sidebar, a forced ANSI256 Lipgloss color profile for board startup (v1.1 E03), a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04), and an epic Detail/Audit tab switch that renders user-facing audit findings from `{epic}/E##-Audit.md` (v1.1 E06).
|
|
27
|
+
- **Doctor command** (`savepoint doctor`, `savepoint doctor --epic E##`) runs read-only integrity diagnostics for config, router state, release/epic/task structure, frontmatter validity, acceptance criteria presence, dependencies, duplicate task IDs, stale audit files, orphaned task IDs, and configured quality gates. It prints a human-readable report with repair suggestions and exits 0 when clean, 1 when problems are diagnosed, and 2 for internal or invocation failures.
|
|
28
|
+
- **Audit remediation baseline** (v1.1 E13) centralizes frontmatter/body splitting and line-ending normalization in `internal/data`, uses typed sentinel errors for doctor repair suggestions, applies a configurable `quality_gates.gate_timeout`, removes tracked build artifacts from source control, adds `.golangci.yml`, and moves board filesystem reads/writes behind Bubble Tea command messages while preserving direct file I/O inside command helpers.
|
|
29
|
+
- **Structural improvement baseline** (v1.1 E14) groups board `Model` fields into focused embedded state structs, defines consumer-side board/doctor data-access interfaces, routes doctor orphan discovery through `Discover.ListRootDirs`, renders audit-tab hidden sections via exact heading matches, improves quality-gate shell tokenization for quoted and escaped arguments, removes the separate `TaskStatus` enum in favor of `ColumnType`, and adds `internal/testutil` for shared Go test fixtures.
|
|
30
|
+
- **Hardening baseline** (v1.1 E15) adds board render/layout benchmarks, data frontmatter fuzz targets, debug logging via CLI `--debug` or `SAVEPOINT_DEBUG`, abbreviation-aware task checklist sentence splitting, root test package isolation, documented audit-tab hidden-section allowlisting, repo-local CI, `make ci`, distribution SHA256 checksums, and Windows amd64/arm64 build outputs.
|
|
31
|
+
- **Agent audit workflow** is skill-driven, not a CLI pipeline. At `audit-pending`, a fresh audit agent writes one epic-local `E##-Audit.md`; the user reviews its Audit tab, then asks an agent to apply the admin proposal blocks, update the visible audit findings to reflect the applied outcome, and close the epic.
|
|
28
32
|
|
|
29
33
|
## 2. Directory layout
|
|
30
34
|
|
|
@@ -37,16 +41,13 @@ last_audited: v1.1/E02-cross-platform-compatibility (2026-05-02)
|
|
|
37
41
|
├── visual-identity.md ← design system; loaded conditionally for TUI work
|
|
38
42
|
├── router.md ← state-machine routing
|
|
39
43
|
├── config.yml ← theme, quality_gates, verify_strict
|
|
40
|
-
├── audit/
|
|
41
|
-
│ └── {E##-epic}/
|
|
42
|
-
│ ├── snapshot.md
|
|
43
|
-
│ └── proposals.md
|
|
44
44
|
└── releases/
|
|
45
45
|
└── {release}/ ← e.g. v1, v1.1
|
|
46
46
|
├── {release}-PRD.md ← release-scoped PRD
|
|
47
47
|
└── epics/
|
|
48
48
|
└── E##-{epic-name}/
|
|
49
49
|
├── E##-Detail.md ← epic delta
|
|
50
|
+
├── E##-Audit.md ← audit findings + admin apply proposals
|
|
50
51
|
└── tasks/
|
|
51
52
|
└── T001-slug.md
|
|
52
53
|
```
|
|
@@ -64,16 +65,18 @@ AGENTS.md at root (uppercase, cross-vendor spec). Design.md in `.savepoint/` (wo
|
|
|
64
65
|
|
|
65
66
|
## 4. Status model & gates
|
|
66
67
|
|
|
67
|
-
Three statuses, with explicit gates:
|
|
68
|
+
Three statuses, with explicit gates and ownership boundaries:
|
|
68
69
|
|
|
69
|
-
| Status | Meaning | Entry gate |
|
|
70
|
-
| ------------- | -------------------------- | --------------------------------------------------------------- |
|
|
71
|
-
| `planned` | Ready to build | plan section non-empty |
|
|
72
|
-
| `in_progress` | AI building | all `depends_on` are `done` |
|
|
73
|
-
| `done` | Complete for current scope | all implementation items checked; verification per project mode |
|
|
70
|
+
| Status | Meaning | Entry gate | Who may set it |
|
|
71
|
+
| ------------- | -------------------------- | --------------------------------------------------------------- | -------------------------------------- |
|
|
72
|
+
| `planned` | Ready to build | plan section non-empty | User or planning workflow |
|
|
73
|
+
| `in_progress` | AI building | all `depends_on` are `done` | Agent when starting implementation |
|
|
74
|
+
| `done` | Complete for current scope | all implementation items checked; verification per project mode | User only |
|
|
74
75
|
|
|
75
76
|
- `blocked` is a **flag**, not a status — `in_progress` + `blocked: "reason"` is valid.
|
|
76
|
-
-
|
|
77
|
+
- Agents may only advance a task into `in_progress`; they must not set `done` or retreat a task to an earlier status.
|
|
78
|
+
- Only the user may set a task to `done` or retreat it from `done` to `in_progress` when follow-up work is required.
|
|
79
|
+
- Router updates are explicit TUI actions: after setting a task to `in_progress`, the agent prompts the user to press `p` in the board to mark the focused task as router priority. Navigation alone must not change router task priority.
|
|
77
80
|
- Verification mode: see `config.yml`.
|
|
78
81
|
|
|
79
82
|
## 5. Dependencies
|
|
@@ -82,13 +85,12 @@ Three statuses, with explicit gates:
|
|
|
82
85
|
- `src/validation/dependencies.ts` detects duplicate task IDs, missing dependencies, and dependency cycles.
|
|
83
86
|
- Cross-epic deps allowed but warned (signal that epic boundaries may be wrong).
|
|
84
87
|
|
|
85
|
-
## 6. CLI surface (
|
|
88
|
+
## 6. CLI surface (3 commands, no extras)
|
|
86
89
|
|
|
87
90
|
| Command | Purpose |
|
|
88
91
|
| ---------------------- | --------------------------------------------------------------------------------- |
|
|
89
92
|
| `savepoint init` | Scaffold `.savepoint/`, print magic prompt to stdout + clipboard |
|
|
90
93
|
| `savepoint board` | Launch TUI; auto-falls-back to plain table on non-TTY |
|
|
91
|
-
| `savepoint audit` | Run audit pipeline (`--skip --reason`, `--epic`) |
|
|
92
94
|
| `savepoint doctor` | Integrity check + ad-hoc quality-gate run + Layer-2 prompt for AI semantic review |
|
|
93
95
|
| `--version` / `--help` | Standard global flags |
|
|
94
96
|
|
|
@@ -97,29 +99,29 @@ Three statuses, with explicit gates:
|
|
|
97
99
|
- **Explicitly rejected:** `task new`, `epic new`, `release new`, `plan`, `next`, `status`, `task done`. All are file edits or TUI actions.
|
|
98
100
|
|
|
99
101
|
**Names:** npm package `savepoint`; binary `savepoint`. No `vk` alias.
|
|
100
|
-
## 7.
|
|
102
|
+
## 7. Agent audit workflow
|
|
101
103
|
|
|
102
104
|
```
|
|
103
|
-
0. Quality Gates —
|
|
104
|
-
1.
|
|
105
|
-
2.
|
|
106
|
-
3.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
5. Commit — Approved proposals overwrite live files. Epic gets status: audited. Next epic unlocks.
|
|
105
|
+
0. Quality Gates — Build agent runs configured build/test gates before audit handoff.
|
|
106
|
+
1. Audit Pending — Router enters `audit-pending` for the completed epic.
|
|
107
|
+
2. Reconcile — Fresh audit agent reads router, epic detail, task files, Design.md, AGENTS.md, and scoped source/test files.
|
|
108
|
+
3. Findings — Agent writes exactly one `{epic}/E##-Audit.md`.
|
|
109
|
+
4. Review — User reviews the TUI Epic Detail Audit tab.
|
|
110
|
+
5. Apply + Close — After user approval, agent applies proposal blocks, updates the audit file's visible findings, marks the epic audited, updates `last_audited`, and advances router.
|
|
110
111
|
```
|
|
111
112
|
|
|
112
|
-
- `
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
-
|
|
116
|
-
-
|
|
117
|
-
-
|
|
113
|
+
- `audit-pending` is a **hard gate**: next epic's tasks cannot enter `in_progress` until prior epic is `audited` or the user explicitly skips the audit.
|
|
114
|
+
- `E##-Audit.md` has two user-facing sections: `## Main Findings` and `## Code Style Review`.
|
|
115
|
+
- `## Main Findings` contains narrative audit findings only: AC verification, important drift, and notable risks. It must not contain file-specific replacement blocks.
|
|
116
|
+
- `## Code Style Review` contains the 10 AGENTS.md code style checks.
|
|
117
|
+
- `## Proposed Changes` contains admin/apply metadata using `### Target File`, `### Replace`, and `### With`. The TUI Audit tab intentionally does not render this section to avoid stale file-change details in the Epic Detail panel.
|
|
118
|
+
- Apply/close must rewrite `## Main Findings` and `## Code Style Review` in the same `E##-Audit.md` so the TUI Audit tab shows resolved findings and remaining risks instead of stale pre-apply blockers. `## Proposed Changes` stays as the trace of what was applied unless the user asks otherwise.
|
|
119
|
+
- There is no `savepoint audit` CLI pipeline in the active design. Audit is performed by agents using `agent-skills/savepoint-audit/SKILL.md`.
|
|
118
120
|
|
|
119
121
|
Three layers:
|
|
120
122
|
|
|
121
123
|
- **Layer 1 (mechanical):** user's chosen linter. Recommended: eslint+dependency-cruiser (TS), radon+pylint (Python), gocyclo+staticcheck (Go). Cross-language fallback: `lizard`. Quality gate config: see `.savepoint/config.yml`.
|
|
122
|
-
- **Layer 2 (AI semantic review):** baked into the audit reconcile prompt. Outputs
|
|
124
|
+
- **Layer 2 (AI semantic review):** baked into the audit reconcile prompt. Outputs Main Findings and Code Style Review in the epic-local audit file. **Advisory, not blocking.**
|
|
123
125
|
- **Layer 3:** `savepoint doctor` runs Layer 1 + prints Layer 2 prompt for ad-hoc use.
|
|
124
126
|
|
|
125
127
|
## 8. TUI
|
|
@@ -130,7 +132,7 @@ Acknowledged terminal limits: fonts, scanlines, glows, letter-spacing, mouse-dri
|
|
|
130
132
|
|
|
131
133
|
**Render fallbacks:** 256-color → 16-color hard-coded → `NO_COLOR=1` monochrome with glyphs → non-TTY plain table.
|
|
132
134
|
|
|
133
|
-
**Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints.
|
|
135
|
+
**Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. Active router `next_action` renders as a dedicated full-width line below the header with phase-colored `PLAN`, `BUILD`, or `AUDIT` prefix styling and truncates to terminal width. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. Task detail implementation-plan checkboxes render once per semantic sentence, not once per hard-wrapped markdown line. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Task card and epic sidebar status glyphs share `internal/board/status.go`; task cards use explicit `Task.Status` when available and retain the legacy column/stage glyph fallback when it is not. Non-TTY output remains a plain table fallback.
|
|
134
136
|
|
|
135
137
|
**Visual guardrail:** the terminal board intentionally uses one black background for Background, Surface, and Surface 2. Do not restore subtly different dark panel fills; depth should come from spacing, dividers, glyphs, and focused Atari Orange borders.
|
|
136
138
|
|
|
@@ -138,11 +140,11 @@ Acknowledged terminal limits: fonts, scanlines, glows, letter-spacing, mouse-dri
|
|
|
138
140
|
|
|
139
141
|
**Border policy:** focus must not change geometry or introduce terminal-specific broken border rendering. Use one consistent box-border family across columns, cards, and overlays. If rounded borders render as dash bars or broken segments in Warp, prefer the single-line border style already allowed by `.savepoint/visual-identity.md`; do not mix rounded and single-line borders as an ad-hoc per-component workaround.
|
|
140
142
|
|
|
141
|
-
**Board persistence and refresh:** task status transitions write canonical task frontmatter through `internal/data.WriteTaskStatus` with mtime conflict checks. The board treats `Model.Root` as the `.savepoint` directory, watches `.savepoint/releases/` recursively with fsnotify, adds watches for newly-created release/epic/task directories, and reloads task plus release/epic index data plus epic status metadata after debounced file changes. Router priority markers match release + epic + task, not only the short `T###` value; completed cards render with the orange build glyph even if they previously matched router priority. Epic status glyphs are cached from each epic's `E##-Detail.md` frontmatter and shown in the wide epic sidebar only.
|
|
143
|
+
**Board persistence and refresh:** task status transitions write canonical task frontmatter through `internal/data.WriteTaskStatus` with mtime conflict checks. Board update handlers dispatch filesystem reads and writes through Bubble Tea command helpers (`routerWriteMsg`, `taskWriteMsg`, `epicDetailMsg`, `auditContentMsg`, and `errorMsg`) so `Update()` remains an event/message reducer. The board treats `Model.Root` as the `.savepoint` directory, watches `.savepoint/releases/` recursively with fsnotify, adds watches for newly-created release/epic/task directories, and reloads task plus release/epic index data plus epic status metadata after debounced file changes. Router priority markers match release + epic + task, not only the short `T###` value; completed cards render with the orange build glyph even if they previously matched router priority. The `p` key explicitly writes the focused non-done task to router state as `task-building`; it does not infer `audit-pending` from task position. Epic status glyphs are cached from each epic's `E##-Detail.md` frontmatter and shown in the wide epic sidebar only.
|
|
142
144
|
|
|
143
145
|
**Implementation modules:** see AGENTS.md Codebase Map.
|
|
144
146
|
|
|
145
|
-
**Keybindings:** arrow/vim navigation, enter advances, backspace retreats, r
|
|
147
|
+
**Keybindings:** arrow/vim navigation, enter opens focused task detail, space advances, backspace retreats, `p` marks the focused non-done task as router priority, `r`/`R` opens release selection or refreshes where supported, `?` opens help, and `q` quits or closes overlays.
|
|
146
148
|
|
|
147
149
|
## 9. Concurrency
|
|
148
150
|
|
|
@@ -177,8 +179,8 @@ All failure modes are diagnosed by `savepoint doctor`. Doctor diagnoses and prop
|
|
|
177
179
|
- **License:** MIT.
|
|
178
180
|
- **Runtime:** Go CLI binary. Source builds with `go build`; tests run with `go test ./...`.
|
|
179
181
|
- **Local build:** `make build` delegates to `internal/buildtool`, builds `savepoint` or `savepoint.exe`, and injects `main.version` from `VERSION` or the latest git tag.
|
|
180
|
-
- **Cross-platform builds:** `make build-all` cross-compiles linux-amd64, linux-arm64, darwin-amd64, and
|
|
181
|
-
- **Artifacts:** `make dist` creates versioned `.tar.gz` archives in `dist/` for
|
|
182
|
+
- **Cross-platform builds:** `make build-all` cross-compiles linux-amd64, linux-arm64, darwin-amd64, darwin-arm64, windows-amd64, and windows-arm64 raw binaries into `dist/{platform}-{arch}/savepoint` or `savepoint.exe` for Windows. `make ci` runs the repo-local verification sequence used by CI.
|
|
183
|
+
- **Artifacts:** `make dist` creates versioned `.tar.gz` archives in `dist/` for Linux, Darwin, and Windows targets using Go archive APIs, not shell `tar`, and writes SHA256 hashes to `dist/checksums.txt`.
|
|
182
184
|
- **Smoke validation:** `make smoke-test` builds the local binary and runs `--version` as a headless exit-0 check.
|
|
183
185
|
- **No telemetry.** Ever.
|
|
184
186
|
|
|
@@ -1,10 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
---
|
|
2
|
+
type: audit-findings
|
|
3
|
+
audited: 2026-05-02
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Audit Findings: E02 Cross-Platform Compatibility
|
|
7
|
+
|
|
8
|
+
## Main Findings
|
|
9
|
+
|
|
10
|
+
E02 found that the cross-platform build work moved Savepoint further into its Go-based distribution path, including version handling, Linux/Darwin build targets, archive generation, and smoke-test coverage.
|
|
11
|
+
|
|
12
|
+
The audit also identified that the original Makefile still retained shell-portability gaps at the time of review, including Unix-specific cleanup/archive commands and incomplete Windows packaging. Those details are retained under Proposed Changes for apply/close testing, while this visible section stays focused on the user-facing audit outcome.
|
|
13
|
+
|
|
14
|
+
## Code Style Review
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
- [ ] One job per file
|
|
18
|
+
- [ ] One-sentence functions
|
|
19
|
+
- [ ] Test branches
|
|
20
|
+
- [ ] Types are documentation
|
|
21
|
+
- [ ] Build, don't speculate
|
|
22
|
+
- [ ] Errors at boundaries
|
|
23
|
+
- [ ] One source of truth
|
|
24
|
+
- [ ] Comments explain WHY
|
|
25
|
+
- [ ] Content in data files
|
|
26
|
+
- [ ] Small diffs
|
|
27
|
+
|
|
28
|
+
## Proposed Changes
|
|
29
|
+
|
|
30
|
+
### Target File
|
|
4
31
|
|
|
5
32
|
`.savepoint/Design.md`
|
|
6
33
|
|
|
7
|
-
|
|
34
|
+
### Replace
|
|
8
35
|
|
|
9
36
|
```md
|
|
10
37
|
## 12. Distribution & build
|
|
@@ -18,7 +45,7 @@
|
|
|
18
45
|
- **No telemetry.** Ever.
|
|
19
46
|
```
|
|
20
47
|
|
|
21
|
-
|
|
48
|
+
### With
|
|
22
49
|
|
|
23
50
|
```md
|
|
24
51
|
## 12. Distribution & build
|
|
@@ -34,38 +61,37 @@
|
|
|
34
61
|
- **No telemetry.** Ever.
|
|
35
62
|
```
|
|
36
63
|
|
|
37
|
-
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
### Target File
|
|
38
67
|
|
|
39
68
|
`AGENTS.md`
|
|
40
69
|
|
|
41
|
-
|
|
70
|
+
### Replace
|
|
42
71
|
|
|
43
72
|
```md
|
|
44
73
|
| `main.go` | CLI Entrypoint and root command wiring |
|
|
45
74
|
```
|
|
46
75
|
|
|
47
|
-
|
|
76
|
+
### With
|
|
48
77
|
|
|
49
78
|
```md
|
|
50
79
|
| `main.go` | CLI entrypoint, root command wiring, and `--version` handling via build-time version injection |
|
|
51
80
|
```
|
|
52
81
|
|
|
53
|
-
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### Target File
|
|
54
85
|
|
|
55
86
|
`.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Detail.md`
|
|
56
87
|
|
|
57
|
-
|
|
88
|
+
### Insert After
|
|
58
89
|
|
|
59
90
|
```md
|
|
60
91
|
## Architectural notes
|
|
61
|
-
|
|
62
|
-
- All Go code uses `path/filepath` — no syscalls are platform-specific
|
|
63
|
-
- Bubble Tea handles terminal differences across platforms
|
|
64
|
-
- No Go build tags or platform-specific files needed
|
|
65
|
-
- This is purely a build-tooling and release-workflow epic
|
|
66
92
|
```
|
|
67
93
|
|
|
68
|
-
|
|
94
|
+
### With
|
|
69
95
|
|
|
70
96
|
```md
|
|
71
97
|
## Implemented as
|
|
@@ -77,38 +103,22 @@
|
|
|
77
103
|
- Windows zip packaging was not implemented in this epic; the final implementation covers the Linux and Darwin targets named in the epic's build-all definition of done.
|
|
78
104
|
```
|
|
79
105
|
|
|
80
|
-
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### Target File
|
|
81
109
|
|
|
82
110
|
`.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Detail.md`
|
|
83
111
|
|
|
84
|
-
|
|
112
|
+
### Replace
|
|
85
113
|
|
|
86
114
|
```md
|
|
87
115
|
- [x] Makefile replaced with Go-native commands (no `rm`, `cp`, `mkdir`)
|
|
88
116
|
```
|
|
89
117
|
|
|
90
|
-
|
|
118
|
+
### With
|
|
91
119
|
|
|
92
120
|
```md
|
|
93
121
|
- [ ] Makefile replaced with Go-native commands (no `rm`, `cp`, `mkdir`)
|
|
94
122
|
```
|
|
95
123
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
## Must Fix Before Close
|
|
99
|
-
|
|
100
|
-
- `Makefile`: `clean` still runs `rm -rf dist/`, which violates T001 acceptance criteria: "`make clean` removes the binary without using `rm -f` or other Unix-only commands" and "No shell commands in Makefile are platform-dependent."
|
|
101
|
-
- `Makefile`: `build-linux` and `build-darwin` still use `mkdir -p` and inline `GOOS=... GOARCH=...` environment assignment. That is fine for Linux, macOS, Git Bash, and WSL, but it is not a shell-agnostic Makefile implementation.
|
|
102
|
-
- `Makefile`: `dist` relies on `tar`, so packaging is not yet toolchain-native or Windows-shell portable.
|
|
103
|
-
- `.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md`: the task says `go test ./...` was not run even though the task completion protocol requires the full quality-gate suite before `status: done`.
|
|
104
|
-
|
|
105
|
-
## Carry Forward
|
|
106
|
-
|
|
107
|
-
- Windows `.zip` artifacts were deferred in T004. Keep that as a known scope gap unless the project narrows E02 explicitly to Linux and Darwin distribution.
|
|
108
|
-
- Consider moving cross-platform build and archive logic into a tiny Go helper if the project wants true shell portability while keeping `make` as the human entrypoint.
|
|
109
|
-
|
|
110
|
-
## Already Fixed
|
|
111
|
-
|
|
112
|
-
- `main.go` has a headless `--version` path, so smoke testing no longer needs to start the TUI.
|
|
113
|
-
- Linux and Darwin raw binary targets exist for amd64 and arm64.
|
|
114
|
-
- `AGENTS.md` already documents `build-all`, `dist`, and `smoke-test`.
|
|
124
|
+
---
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: audit-findings
|
|
3
|
+
audited: 2026-05-02
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Audit Findings: E03 UI Visual Refinement
|
|
7
|
+
|
|
8
|
+
## Main Findings
|
|
9
|
+
|
|
10
|
+
E03 verified the visual refinement work around the board header, Next Activity line, task detail checklist rendering, shared status glyphs, and deterministic ANSI256 color profile behavior.
|
|
11
|
+
|
|
12
|
+
The audit found no blocking product-code issue in the reviewed E03 scope. The main drift was documentation/process cleanup: update architecture notes to match the implemented rendering behavior, record where the color profile was actually applied, and check off the completed T006 implementation plan.
|
|
13
|
+
|
|
14
|
+
## Code Style Review
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
- [ ] One job per file
|
|
18
|
+
- [ ] One-sentence functions
|
|
19
|
+
- [ ] Test branches
|
|
20
|
+
- [ ] Types are documentation
|
|
21
|
+
- [ ] Build, don't speculate
|
|
22
|
+
- [ ] Errors at boundaries
|
|
23
|
+
- [ ] One source of truth
|
|
24
|
+
- [ ] Comments explain WHY
|
|
25
|
+
- [ ] Content in data files
|
|
26
|
+
- [ ] Small diffs
|
|
27
|
+
|
|
28
|
+
## Proposed Changes
|
|
29
|
+
|
|
30
|
+
### Target File
|
|
31
|
+
|
|
32
|
+
`.savepoint/Design.md`
|
|
33
|
+
|
|
34
|
+
### Replace
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
last_audited: v1.1/E02-cross-platform-compatibility (2026-05-02)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### With
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
last_audited: v1.1/E03-ui-visual-refinement (2026-05-02)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
### Target File
|
|
49
|
+
|
|
50
|
+
`.savepoint/Design.md`
|
|
51
|
+
|
|
52
|
+
### Replace
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
- **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release/epic filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), and a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04).
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### With
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
- **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release/epic filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), dedicated phase-colored Next Activity line below the header, sentence-boundary checklist rendering in task details, shared status glyph mapping for task cards and the epic sidebar, a forced ANSI256 Lipgloss color profile for board startup (v1.1 E03), and a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04).
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
### Target File
|
|
67
|
+
|
|
68
|
+
`.savepoint/Design.md`
|
|
69
|
+
|
|
70
|
+
### Replace
|
|
71
|
+
|
|
72
|
+
```markdown
|
|
73
|
+
**Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. The header can show a compact right-aligned Next Activity value from router state. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Non-TTY output remains a plain table fallback.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### With
|
|
77
|
+
|
|
78
|
+
```markdown
|
|
79
|
+
**Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. Active router `next_action` renders as a dedicated full-width line below the header with phase-colored `PLAN`, `BUILD`, or `AUDIT` prefix styling and truncates to terminal width. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. Task detail implementation-plan checkboxes render once per semantic sentence, not once per hard-wrapped markdown line. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Task card and epic sidebar status glyphs share `internal/board/status.go`; task cards use explicit `Task.Status` when available and retain the legacy column/stage glyph fallback when it is not. Non-TTY output remains a plain table fallback.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### Target File
|
|
85
|
+
|
|
86
|
+
`AGENTS.md`
|
|
87
|
+
|
|
88
|
+
### Replace
|
|
89
|
+
|
|
90
|
+
```markdown
|
|
91
|
+
| `internal/board/` | TUI board, overlays, epic sidebar, status glyphs |
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## With
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
| `internal/board/` | TUI board, overlays, epic sidebar, Next Activity line, detail checklist rendering, status glyphs, forced color profile |
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### Target File
|
|
103
|
+
|
|
104
|
+
`.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
|
|
105
|
+
|
|
106
|
+
### Replace
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
status: planned
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### With
|
|
113
|
+
|
|
114
|
+
```yaml
|
|
115
|
+
status: audited
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### Target File
|
|
121
|
+
|
|
122
|
+
`.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
|
|
123
|
+
|
|
124
|
+
### Replace
|
|
125
|
+
|
|
126
|
+
```markdown
|
|
127
|
+
| `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
|
|
128
|
+
| `internal/board/view_test.go` | Header, formatting, and checkbox tests |
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### With
|
|
132
|
+
|
|
133
|
+
```markdown
|
|
134
|
+
| `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
|
|
135
|
+
| `internal/board/board.go` | Board startup; sets the Lipgloss color profile to ANSI256 before model initialization |
|
|
136
|
+
| `internal/board/view_test.go` | Header, formatting, and checkbox tests |
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### Target File
|
|
142
|
+
|
|
143
|
+
`.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
|
|
144
|
+
|
|
145
|
+
### Insert After
|
|
146
|
+
|
|
147
|
+
```markdown
|
|
148
|
+
| `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
|
|
149
|
+
| `internal/board/board.go` | Board startup; sets the Lipgloss color profile to ANSI256 before model initialization |
|
|
150
|
+
| `internal/board/view_test.go` | Header, formatting, and checkbox tests |
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### With
|
|
154
|
+
|
|
155
|
+
```markdown
|
|
156
|
+
## Implemented as
|
|
157
|
+
|
|
158
|
+
- `internal/board/view.go` renders `next_action` as a separate line below the header through `renderNextActivityLine`, using existing footer phase styles for `PLAN`, `BUILD`, and `AUDIT`.
|
|
159
|
+
- `internal/board/layout.go` accounts for the optional Next Activity line when calculating board chrome and content height.
|
|
160
|
+
- `internal/data/parser.go` joins hard-wrapped checklist continuation lines before rendering so markdown wrap points do not create duplicate checklist items.
|
|
161
|
+
- `internal/board/detail.go` splits checklist item text on semantic sentence boundaries and emits one `[ ]` or `[x]` marker per sentence.
|
|
162
|
+
- `internal/data/task.go` adds `Task.Status` plus status constants, including `audited`, for shared board glyph rendering.
|
|
163
|
+
- `internal/board/status.go` centralizes the planned, in-progress, done, and audited status glyph mapping used by task cards and the epic sidebar.
|
|
164
|
+
- `internal/board/card.go` uses explicit `Task.Status` when present, while preserving the legacy column/stage glyph fallback for older task data.
|
|
165
|
+
- `internal/board/epic_panel.go` delegates epic status glyph rendering to the shared status helper.
|
|
166
|
+
- `internal/board/board.go` sets Lipgloss to the ANSI256 color profile at board startup. This satisfies the deterministic 256-color rendering intent, although the implementation lives at the board boundary instead of `main.go`.
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### Target File
|
|
172
|
+
|
|
173
|
+
`.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md`
|
|
174
|
+
|
|
175
|
+
### Replace
|
|
176
|
+
|
|
177
|
+
```markdown
|
|
178
|
+
## Implementation Plan
|
|
179
|
+
|
|
180
|
+
- [ ] Read `main.go` — understand startup flow and identify where to inject profile forcing
|
|
181
|
+
- [ ] Edit `main.go` — add `lipgloss.SetColorProfile(lipgloss.Force256Color)` call before `board.Run()`
|
|
182
|
+
- [ ] Run `make build && make test` to verify no regressions
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### With
|
|
186
|
+
|
|
187
|
+
```markdown
|
|
188
|
+
## Implementation Plan
|
|
189
|
+
|
|
190
|
+
- [x] Read board startup flow and identify where to inject profile forcing
|
|
191
|
+
- [x] Edit `internal/board/board.go` — add `lipgloss.SetColorProfile(termenv.ANSI256)` before model initialization
|
|
192
|
+
- [x] Run equivalent build and test gates in this Windows shell
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: epic-design
|
|
3
|
-
status:
|
|
3
|
+
status: audited
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Epic E03: UI Visual Refinement
|
|
@@ -29,4 +29,17 @@ Polish the Atari-Noir TUI rendering across Next Activity indicator repositioning
|
|
|
29
29
|
| `internal/data/task.go` | Task markdown parsing for checkbox placement |
|
|
30
30
|
| `internal/board/status.go` | Shared status glyph mapping helper (new) |
|
|
31
31
|
| `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
|
|
32
|
+
| `internal/board/board.go` | Board startup; sets the Lipgloss color profile to ANSI256 before model initialization |
|
|
32
33
|
| `internal/board/view_test.go` | Header, formatting, and checkbox tests |
|
|
34
|
+
|
|
35
|
+
## Implemented As
|
|
36
|
+
|
|
37
|
+
- `internal/board/view.go` renders `next_action` as a separate line below the header through `renderNextActivityLine`, using existing footer phase styles for `PLAN`, `BUILD`, and `AUDIT`.
|
|
38
|
+
- `internal/board/layout.go` accounts for the optional Next Activity line when calculating board chrome and content height.
|
|
39
|
+
- `internal/data/parser.go` joins hard-wrapped checklist continuation lines before rendering so markdown wrap points do not create duplicate checklist items.
|
|
40
|
+
- `internal/board/detail.go` splits checklist item text on semantic sentence boundaries and emits one `[ ]` or `[x]` marker per sentence.
|
|
41
|
+
- `internal/data/task.go` adds `Task.Status` plus status constants, including `audited`, for shared board glyph rendering.
|
|
42
|
+
- `internal/board/status.go` centralizes the planned, in-progress, done, and audited status glyph mapping used by task cards and the epic sidebar.
|
|
43
|
+
- `internal/board/card.go` uses explicit `Task.Status` when present, while preserving the legacy column/stage glyph fallback for older task data.
|
|
44
|
+
- `internal/board/epic_panel.go` delegates epic status glyph rendering to the shared status helper.
|
|
45
|
+
- `internal/board/board.go` sets Lipgloss to the ANSI256 color profile at board startup. This satisfies the deterministic 256-color rendering intent, although the implementation lives at the board boundary instead of `main.go`.
|
|
@@ -17,9 +17,9 @@ depends_on: []
|
|
|
17
17
|
|
|
18
18
|
## Implementation Plan
|
|
19
19
|
|
|
20
|
-
- [
|
|
21
|
-
- [
|
|
22
|
-
- [
|
|
20
|
+
- [x] Read board startup flow and identify where to inject profile forcing
|
|
21
|
+
- [x] Edit `internal/board/board.go` — add `lipgloss.SetColorProfile(termenv.ANSI256)` before model initialization
|
|
22
|
+
- [x] Run equivalent build and test gates in this Windows shell
|
|
23
23
|
|
|
24
24
|
## Context Log
|
|
25
25
|
|