savepoint 1.0.1 → 1.0.3
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 +15 -1
- package/.golangci.yml +11 -0
- package/.savepoint/Design.md +52 -46
- package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T001-init-module.md +1 -1
- package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T005-layout.md +1 -1
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T002-card.md +1 -1
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T006-help-overlay.md +1 -1
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/{Design.md → E06-Detail.md} +5 -3
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T002-header-and-dividers.md +1 -1
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T003-footer-status-bar.md +1 -1
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T004-component-refinement.md +1 -1
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T010-auto-refresh-watcher.md +2 -0
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/{Design.md → E01-Detail.md} +9 -1
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/{T007-next-activity-header.md → T001-next-activity-header.md} +13 -12
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T002-rename-epic-design-files.md +9 -9
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T003-rename-release-prd.md +2 -2
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T004-update-instruction-files.md +13 -12
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T005-update-cross-references.md +14 -13
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T006-column-and-detail-scrolling.md +25 -15
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T007-column-focus-border-stability.md +57 -0
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md +124 -0
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/{Design.md → E02-Detail.md} +12 -3
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T001-fix-makefile.md +11 -8
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T002-linux-build-target.md +12 -7
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T003-macos-build-target.md +9 -5
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md +30 -9
- 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 +45 -0
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T001-border-resize-fix.md +40 -0
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md +64 -0
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T003-checkbox-rendering-fix.md +56 -0
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md +65 -0
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +36 -0
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Audit.md +167 -0
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md +51 -0
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md +65 -0
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T002-epic-detail-overlay.md +73 -0
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md +73 -0
- 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 +54 -0
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +45 -0
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +40 -0
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +47 -0
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +98 -0
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +33 -0
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +62 -0
- 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-Detail.md +43 -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 +28 -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 +28 -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 +139 -0
- package/.savepoint/router.md +29 -108
- package/AGENTS.md +69 -111
- package/Makefile +19 -3
- package/README.md +6 -6
- package/agent-skills/savepoint-audit/SKILL.md +87 -35
- package/agent-skills/savepoint-build-task/SKILL.md +9 -4
- package/agent-skills/savepoint-create-plan/SKILL.md +10 -5
- package/agent-skills/savepoint-create-task/SKILL.md +44 -31
- package/agent-skills/savepoint-draft-prd/SKILL.md +8 -3
- package/agent-skills/savepoint-system-design/SKILL.md +8 -3
- 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 +69 -49
- package/internal/board/board_test.go +83 -67
- package/internal/board/card.go +71 -20
- package/internal/board/card_test.go +141 -12
- package/internal/board/column.go +77 -11
- package/internal/board/column_test.go +63 -13
- package/internal/board/detail.go +107 -72
- package/internal/board/detail_test.go +117 -26
- package/internal/board/epic_panel.go +211 -18
- package/internal/board/epic_panel_test.go +637 -14
- 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/layout.go +12 -2
- package/internal/board/layout_test.go +17 -0
- package/internal/board/model.go +130 -52
- 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/render_policy_test.go +77 -0
- package/internal/board/status.go +23 -0
- 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 +472 -94
- package/internal/board/update_test.go +447 -0
- package/internal/board/util.go +76 -0
- package/internal/board/view.go +139 -22
- package/internal/board/view_test.go +171 -3
- package/internal/board/watch.go +57 -9
- package/internal/buildtool/main.go +211 -0
- package/internal/buildtool/main_test.go +46 -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/lifecycle.go +13 -6
- package/internal/data/lifecycle_test.go +14 -11
- package/internal/data/parser.go +29 -6
- package/internal/data/parser_test.go +66 -7
- package/internal/data/task.go +1 -0
- package/internal/data/write.go +85 -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/palette.go +3 -3
- package/internal/styles/styles.go +39 -12
- 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 +107 -1
- package/package.json +2 -2
- package/project-audit/audit_report_glm_5.1.md +411 -0
- package/project-audit/audit_report_opus_4.6 +406 -0
- package/project-audit/consolidated-audit-report.md +456 -0
- package/savepoint +0 -0
- package/templates/project/.savepoint/Design.md +2 -2
- package/templates/project/.savepoint/router.md +15 -14
- package/templates/project/AGENTS.md +56 -98
- 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 +35 -30
- package/templates/prompts/design.prompt.md +3 -1
- package/templates/prompts/epic-design.prompt.md +3 -3
- package/templates/prompts/task-breakdown.prompt.md +1 -1
- package/templates/prompts/task-building.prompt.md +1 -1
- package/templates/prompts/task-planning.prompt.md +1 -1
- package/.savepoint/audit/E01-go-setup/proposals.md +0 -166
- package/.savepoint/audit/E01-go-setup/snapshot.md +0 -71
- package/.savepoint/audit/E01-scaffolding/proposals/AGENTS.md +0 -66
- package/.savepoint/audit/E01-scaffolding/proposals/Design.md +0 -210
- package/.savepoint/audit/E01-scaffolding/proposals/epic-Design.md +0 -117
- package/.savepoint/audit/E01-scaffolding/proposals/quality-review.md +0 -101
- package/.savepoint/audit/E01-scaffolding/snapshot.md +0 -54
- package/.savepoint/audit/E02-data-model/snapshot.md +0 -128
- package/.savepoint/audit/E02-data-readers/proposals.md +0 -123
- package/.savepoint/audit/E02-data-readers/snapshot.md +0 -54
- package/.savepoint/audit/E03-board-tui-core/proposals.md +0 -146
- package/.savepoint/audit/E03-board-tui-core/snapshot.md +0 -57
- package/.savepoint/audit/E03-cli-foundation/snapshot.md +0 -106
- package/.savepoint/audit/E04-board-components/proposals.md +0 -118
- package/.savepoint/audit/E04-board-components/snapshot.md +0 -77
- package/.savepoint/audit/E04-templates-and-prompts/snapshot.md +0 -115
- package/.savepoint/audit/E05-init-command/snapshot.md +0 -125
- package/.savepoint/audit/E05-phase-transitions/proposals.md +0 -83
- package/.savepoint/audit/E05-phase-transitions/snapshot.md +0 -36
- package/.savepoint/audit/E06-atari-noir-layout/proposals.md +0 -130
- package/.savepoint/audit/E06-atari-noir-layout/snapshot.md +0 -84
- package/.savepoint/audit/E06-tui-board/snapshot.md +0 -64
- package/.savepoint/audit/E07-audit-pipeline/snapshot.md +0 -165
- package/.savepoint/audit/E08-board-workflow-cleanup/snapshot.md +0 -65
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T001-border-resize-fix.md +0 -36
- package/ink-cli-ui-design.zip +0 -0
- package/main.exe +0 -0
- package/savepoint.exe +0 -0
- /package/.savepoint/releases/v1/epics/E01-go-setup/{Design.md → E01-Detail.md} +0 -0
- /package/.savepoint/releases/v1/epics/E02-data-readers/{Design.md → E02-Detail.md} +0 -0
- /package/.savepoint/releases/v1/epics/E03-board-tui-core/{Design.md → E03-Detail.md} +0 -0
- /package/.savepoint/releases/v1/epics/E04-board-components/{Design.md → E04-Detail.md} +0 -0
- /package/.savepoint/releases/v1/epics/E05-phase-transitions/{Design.md → E05-Detail.md} +0 -0
- /package/.savepoint/releases/v1/{PRD.md → v1-PRD.md} +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: epic-design
|
|
3
|
+
status: audited
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Epic E03: UI Visual Refinement
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Polish the Atari-Noir TUI rendering across Next Activity indicator repositioning below the header with phase-aligned styling, checkbox rendering at sentence boundaries (not line breaks), unify icon/glyph determination across task cards and the epic sidebar, and force a consistent 256-color terminal profile for reliable cross-terminal rendering.
|
|
11
|
+
|
|
12
|
+
## Definition of Done
|
|
13
|
+
|
|
14
|
+
- Next Activity renders as a dedicated line below the header with phase-aligned coloring
|
|
15
|
+
- Checkboxes render at sentence starts, not at line break positions
|
|
16
|
+
- ~~Total content width equals available space at every breakpoint with no underflow~~ (absorbed into T001, which is marked done; existing layout tests pass)
|
|
17
|
+
- Task card and epic sidebar glyphs are determined by a shared helper, unified on the same status→glyph mapping
|
|
18
|
+
- Terminal color profile is forced to 256-color, ensuring consistent background rendering on all terminals including PowerShell
|
|
19
|
+
|
|
20
|
+
## Components and files
|
|
21
|
+
|
|
22
|
+
| Path | Purpose |
|
|
23
|
+
|------|---------|
|
|
24
|
+
| `internal/board/layout.go` | Width arithmetic, layout breakpoints, min width guard (stable — existing implementation verified) |
|
|
25
|
+
| `internal/board/view.go` | Header rendering, Next Activity line, checkbox rendering point |
|
|
26
|
+
| `internal/board/update.go` | Resize handling, terminal dimension clamping |
|
|
27
|
+
| `internal/styles/styles.go` | Phase-aligned styles for Next Activity |
|
|
28
|
+
| `internal/data/router.go` | RouterState model |
|
|
29
|
+
| `internal/data/task.go` | Task markdown parsing for checkbox placement |
|
|
30
|
+
| `internal/board/status.go` | Shared status glyph mapping helper (new) |
|
|
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 |
|
|
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`.
|
package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T001-border-resize-fix.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: E03-ui-visual-refinement/T001-border-resize-fix
|
|
3
|
+
status: done
|
|
4
|
+
objective: "Fix right-border clipping and ensure clean rendering on terminal resize"
|
|
5
|
+
depends_on: []
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# T001: Fix Right-Border Clipping and Resize Robustness
|
|
9
|
+
|
|
10
|
+
## Acceptance Criteria
|
|
11
|
+
|
|
12
|
+
- The board frame right border (`│` or rounded corner) is always visible at any terminal width ≥ 40 chars
|
|
13
|
+
- Reducing terminal width below a breakpoint (120→119, 80→79) does not leave stray pixels or broken border artifacts
|
|
14
|
+
- Reducing to very narrow widths (< 50) degrades gracefully (no visual corruption)
|
|
15
|
+
- Expanding terminal width back renders cleanly with no leftover characters from previous dimensions
|
|
16
|
+
- All existing layout breakpoints (120/80) still function correctly
|
|
17
|
+
- At every layout breakpoint (120+, 80–119, 40–79), total rendered column width + borders + padding equals the available terminal width with zero underflow
|
|
18
|
+
- Column widths are calculated as `floor(innerWidth / colCount)` and the remainder is distributed as 1 extra column to the first `remainder` columns
|
|
19
|
+
- The board frame overhead (left border + inter-column separators + right border) is exactly accounted for in every breakpoint
|
|
20
|
+
- Reducing terminal width by 1 character removes exactly 1 column of content (no more, no less)
|
|
21
|
+
- All existing layout tests pass
|
|
22
|
+
|
|
23
|
+
## Implementation Plan
|
|
24
|
+
|
|
25
|
+
- [x] Verified — no artifacts observed. Existing layout.go + tests satisfy acceptance criteria.
|
|
26
|
+
|
|
27
|
+
## Context Log
|
|
28
|
+
|
|
29
|
+
Files read:
|
|
30
|
+
- `internal/board/layout.go`
|
|
31
|
+
- `internal/board/view.go`
|
|
32
|
+
- `internal/board/update.go`
|
|
33
|
+
- `internal/board/layout_test.go`
|
|
34
|
+
|
|
35
|
+
Estimated input tokens: 800
|
|
36
|
+
|
|
37
|
+
Notes:
|
|
38
|
+
- Consolidated from former T001 + T004 (duplicate width arithmetic scopes).
|
|
39
|
+
- Former T004 at `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T004-width-arithmetic-audit.md` has been deleted.
|
|
40
|
+
- Moved from `E06-atari-noir-layout/T006-border-resize-fix` (release v1) to `E03-ui-visual-refinement` (release v1.1).
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: E03-ui-visual-refinement/T002-next-activity-below-header
|
|
3
|
+
status: done
|
|
4
|
+
objective: "Reposition Next Activity below header as a dedicated line with phase-aligned styling"
|
|
5
|
+
depends_on:
|
|
6
|
+
- E03-ui-visual-refinement/T001-border-resize-fix
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# T002: Reposition Next Activity Below Header with Phase-Aligned Styling
|
|
10
|
+
|
|
11
|
+
## Acceptance Criteria
|
|
12
|
+
|
|
13
|
+
- Next Activity renders as a dedicated full-width line immediately below the header bar
|
|
14
|
+
- The line is hidden (not rendered) when no activity is active or router state is idle
|
|
15
|
+
- The line uses `phase:` prefix mapped to existing footer phase styles:
|
|
16
|
+
- `task-building` → FooterPhaseBuild (orange + bold)
|
|
17
|
+
- `audit-pending` → FooterPhaseAudit (green + bold)
|
|
18
|
+
- `pre-implementation` / `epic-design` / `epic-task-breakdown` → FooterPhasePlan (purple + bold)
|
|
19
|
+
- Format: `"PLAN: Build T010 (E06) v1"` — phase prefix in styled tag, activity text follows
|
|
20
|
+
- Activity text is the `next_action` value from router state (already populated)
|
|
21
|
+
- At narrow widths (< 60 chars), the line truncates gracefully: `"PLAN: Build T0…"`
|
|
22
|
+
- Existing header layout is preserved — nothing shifts or wraps incorrectly
|
|
23
|
+
|
|
24
|
+
## Implementation Plan
|
|
25
|
+
|
|
26
|
+
- [x] Read `internal/board/view.go` — locate current header rendering and any existing Next Activity right-aligned logic
|
|
27
|
+
- [x] Read `internal/styles/styles.go` — verify FooterPhaseBuild/FooterPhaseAudit/FooterPhasePlan are available for reuse, or add them if missing
|
|
28
|
+
- [x] Read `internal/data/router.go` — confirm RouterState model exposes `state` and `next_action` fields
|
|
29
|
+
- [x] Edit `internal/board/view.go` — add `renderNextActivityLine(state)` that returns a styled string using phase-mapped style
|
|
30
|
+
- [x] Edit `internal/board/view.go` — insert the rendered line immediately after header output in the `View()` function
|
|
31
|
+
- [x] Edit `internal/board/layout.go` — adjust vertical layout height calculation to account for the new line
|
|
32
|
+
- [x] Add tests in `internal/board/view_test.go` — verify phase mapping, truncation, and hidden state
|
|
33
|
+
- [x] Run `make build && make test` to verify no regressions
|
|
34
|
+
|
|
35
|
+
## Context Log
|
|
36
|
+
|
|
37
|
+
Files read:
|
|
38
|
+
- `.savepoint/router.md`
|
|
39
|
+
- `agent-skills/savepoint-build-task/SKILL.md`
|
|
40
|
+
- `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Design.md`
|
|
41
|
+
- `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md`
|
|
42
|
+
- `.savepoint/visual-identity.md`
|
|
43
|
+
- `agent-skills/ink-tui-design/SKILL.md`
|
|
44
|
+
- `internal/board/view.go`
|
|
45
|
+
- `internal/board/layout.go`
|
|
46
|
+
- `internal/styles/styles.go`
|
|
47
|
+
- `internal/data/router.go`
|
|
48
|
+
- `internal/board/view_test.go`
|
|
49
|
+
- `internal/board/layout_test.go`
|
|
50
|
+
|
|
51
|
+
Files edited:
|
|
52
|
+
- `internal/board/view.go`
|
|
53
|
+
- `internal/board/layout.go`
|
|
54
|
+
- `internal/board/view_test.go`
|
|
55
|
+
- `internal/board/layout_test.go`
|
|
56
|
+
- `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md`
|
|
57
|
+
- `.savepoint/router.md`
|
|
58
|
+
|
|
59
|
+
Estimated input tokens: 9800
|
|
60
|
+
|
|
61
|
+
Notes:
|
|
62
|
+
- Key design decision from user: placement below header as dedicated line (not right-aligned in header); reuse existing FooterPhase* styles
|
|
63
|
+
- Acceptance criteria verified by `go test ./internal/board` covering dedicated line ordering, hidden nil/idle/empty states, phase tag mapping, `next_action` text, narrow truncation, and header preservation.
|
|
64
|
+
- Quality gates: `make build` could not run because `make` is not installed in this Windows shell. Equivalent `go run ./internal/buildtool build` passed. Equivalent `go test ./...` passed.
|
package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T003-checkbox-rendering-fix.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: E03-ui-visual-refinement/T003-checkbox-rendering-fix
|
|
3
|
+
status: done
|
|
4
|
+
objective: "Fix checkbox rendering to place checkboxes at sentence start, not at line break positions"
|
|
5
|
+
depends_on:
|
|
6
|
+
- E03-ui-visual-refinement/T001-border-resize-fix
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# T003: Fix Checkbox Rendering — Place at Sentence Start
|
|
10
|
+
|
|
11
|
+
## Acceptance Criteria
|
|
12
|
+
|
|
13
|
+
- Checkboxes (`[ ]` / `[x]`) render at the beginning of each task description sentence, not at arbitrary line-break positions
|
|
14
|
+
- If a task description is hard-wrapped in markdown at column 80, the checkbox appears only once per sentence
|
|
15
|
+
- Multi-sentence tasks show one checkbox per sentence, visually aligned at column 0 of each sentence
|
|
16
|
+
- Already-checked tasks show `[x]` at sentence start consistently
|
|
17
|
+
- No duplicate checkboxes for the same sentence
|
|
18
|
+
- Single-sentence tasks (most common case) render exactly one checkbox at the start, unchanged from current behavior
|
|
19
|
+
|
|
20
|
+
## Implementation Plan
|
|
21
|
+
|
|
22
|
+
- [x] Read `internal/data/task.go` — locate the markdown parsing / TUI rendering path for task descriptions
|
|
23
|
+
- [x] Read `internal/board/view.go` — locate where task items are rendered in the board columns
|
|
24
|
+
- [x] Identify the parsing layer — this is likely where markdown task body text is split into the displayed description string before being passed to rendering
|
|
25
|
+
- [x] Edit the identified file(s) — change the sentence-splitting logic to split on sentence boundaries (`. `, `!\n`, `?\n`) rather than on hard line breaks
|
|
26
|
+
- [x] In the rendering layer, emit one checkbox per sentence start, aligned to column 0 of each sentence block
|
|
27
|
+
- [x] Add tests in the relevant test file for sentence-boundary detection, single-sentence, multi-sentence, and hard-wrapped cases
|
|
28
|
+
- [x] Run `make build && make test` to verify no regressions
|
|
29
|
+
|
|
30
|
+
## Context Log
|
|
31
|
+
|
|
32
|
+
Files read:
|
|
33
|
+
- `internal/data/task.go`
|
|
34
|
+
- `internal/data/parser.go`
|
|
35
|
+
- `internal/data/parser_test.go`
|
|
36
|
+
- `internal/board/view.go`
|
|
37
|
+
- `internal/board/detail.go`
|
|
38
|
+
- `internal/board/detail_test.go`
|
|
39
|
+
- `agent-skills/savepoint-build-task/SKILL.md`
|
|
40
|
+
- `agent-skills/ink-tui-design/SKILL.md`
|
|
41
|
+
- `.savepoint/visual-identity.md`
|
|
42
|
+
|
|
43
|
+
Files edited:
|
|
44
|
+
- `internal/data/parser.go`
|
|
45
|
+
- `internal/data/parser_test.go`
|
|
46
|
+
- `internal/board/detail.go`
|
|
47
|
+
- `internal/board/detail_test.go`
|
|
48
|
+
|
|
49
|
+
Estimated input tokens: 8,500
|
|
50
|
+
|
|
51
|
+
Notes:
|
|
52
|
+
- Parser now joins hard-wrapped continuation lines into the current checklist item.
|
|
53
|
+
- Detail rendering now splits checklist item text into semantic sentences and emits `[ ]` / `[x]` only at sentence starts; wrapped continuation lines are indented under the sentence text.
|
|
54
|
+
- Focused tests: `go test ./internal/data ./internal/board` passed.
|
|
55
|
+
- Required literal quality gate: `make build` could not run because `make` is not installed in this PowerShell environment.
|
|
56
|
+
- Equivalent gates: `go run ./internal/buildtool build` passed; `go test ./...` passed.
|
package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: E03-ui-visual-refinement/T005-unify-status-glyphs
|
|
3
|
+
status: done
|
|
4
|
+
objective: "Unify icon/glyph determination across task cards and epic sidebar via a shared statusGlyph helper with backward compatibility"
|
|
5
|
+
depends_on: []
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# T005: Unify Task Status Glyph Determination
|
|
9
|
+
|
|
10
|
+
## Acceptance Criteria
|
|
11
|
+
|
|
12
|
+
- A new `status` field is added to the `data.Task` struct (one of: `planned`, `in_progress`, `done`, `audited`)
|
|
13
|
+
- A shared `statusGlyph(status string) (styled string)` helper exists in `internal/board/status.go` that maps status strings to the same glyph+style used by the epic sidebar
|
|
14
|
+
- `RenderCard` in `card.go` uses the unified helper when `Task.Status` is set, otherwise falls back to the existing Column+Stage logic with identical behavior
|
|
15
|
+
- The epic sidebar's `epicSidebarGlyph` function is refactored to call the shared `statusGlyph` helper instead of its own switch
|
|
16
|
+
- All existing tests pass without modification
|
|
17
|
+
- New tests cover the explicit `Status` path for each status value
|
|
18
|
+
- No changes to existing task files are required
|
|
19
|
+
- `make build && make test` pass
|
|
20
|
+
|
|
21
|
+
## Implementation Plan
|
|
22
|
+
|
|
23
|
+
- [x] Read `internal/data/task.go` — study Task struct and existing columns/stage types
|
|
24
|
+
- [x] Read `internal/board/card.go` — study current RenderCard glyph determination path
|
|
25
|
+
- [x] Read `internal/board/epic_panel.go` — study epicSidebarGlyph for extraction opportunity
|
|
26
|
+
- [x] Edit `internal/data/task.go` — add `Status string` field to Task struct and Status constants
|
|
27
|
+
- [x] Create `internal/board/status.go` — shared `statusGlyph(status string) string` function with the unified glyph mapping
|
|
28
|
+
- [x] Edit `internal/board/epic_panel.go` — refactor `epicSidebarGlyph` to call the shared `statusGlyph`
|
|
29
|
+
- [x] Edit `internal/board/card.go` — update `RenderCard` to use `statusGlyph` when Status is set, else existing backward-compat path
|
|
30
|
+
- [x] Edit `internal/board/card_test.go` — add tests for explicit Status path (planned/in_progress/done/audited)
|
|
31
|
+
- [x] Run `make build && make test` to verify no regressions
|
|
32
|
+
|
|
33
|
+
## Context Log
|
|
34
|
+
|
|
35
|
+
Files read:
|
|
36
|
+
- `.savepoint/router.md`
|
|
37
|
+
- `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
|
|
38
|
+
- `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md`
|
|
39
|
+
- `agent-skills/savepoint-build-task/SKILL.md`
|
|
40
|
+
- `agent-skills/ink-tui-design/SKILL.md`
|
|
41
|
+
- `.savepoint/visual-identity.md`
|
|
42
|
+
- `internal/data/task.go`
|
|
43
|
+
- `internal/data/parser.go`
|
|
44
|
+
- `internal/data/write.go`
|
|
45
|
+
- `internal/data/task_test.go`
|
|
46
|
+
- `internal/board/card.go`
|
|
47
|
+
- `internal/board/epic_panel.go`
|
|
48
|
+
- `internal/styles/styles.go`
|
|
49
|
+
- `internal/board/card_test.go`
|
|
50
|
+
- `internal/board/epic_panel_test.go`
|
|
51
|
+
- `.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md`
|
|
52
|
+
|
|
53
|
+
Estimated input tokens: 11000
|
|
54
|
+
|
|
55
|
+
Notes:
|
|
56
|
+
- Option A approach: backward compatible when `Status` is unset
|
|
57
|
+
- The unified glyph mapping matches epic sidebar: planned→○, in_progress→▶, done→◉, audited→✓
|
|
58
|
+
- Old `Column`+`Stage` path reproduces exact current behavior (▣/◇/◆ with column-level overrides)
|
|
59
|
+
- `go test ./internal/board ./internal/data` initially hit a sandbox AppData build-cache permission error; rerun outside the sandbox passed.
|
|
60
|
+
- Literal `make build && make test` could not run because `make` is not installed in this Windows shell.
|
|
61
|
+
- Equivalent quality gates passed: `go run ./internal/buildtool build`; `go test ./...`.
|
|
62
|
+
|
|
63
|
+
## Drift Notes
|
|
64
|
+
|
|
65
|
+
- Drift: `internal/board/status.go` added, not yet in Codebase Map.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: E03-ui-visual-refinement/T006-forced-256-color-profile
|
|
3
|
+
status: done
|
|
4
|
+
objective: "Force 256-color terminal profile at init to ensure consistent background rendering across all terminals"
|
|
5
|
+
depends_on: []
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# T006: Forced 256-Color Profile for Terminal Consistency
|
|
9
|
+
|
|
10
|
+
## Acceptance Criteria
|
|
11
|
+
|
|
12
|
+
- On startup, `lipgloss` is configured to use `Force256Color` profile instead of relying on terminal detection
|
|
13
|
+
- The board's background renders as uniform black (`"#000000"` / ANSI256 `"232"`) on every color-capable terminal including PowerShell, CMD, Windows Terminal, VS Code terminal, and all Unix terminals
|
|
14
|
+
- No color artifacts or background mismatches are visible when running on PowerShell
|
|
15
|
+
- Existing style definitions using TrueColor hex values still resolve correctly via Lipgloss's 256-color fallback
|
|
16
|
+
- `make build && make test` pass with no regressions
|
|
17
|
+
|
|
18
|
+
## Implementation Plan
|
|
19
|
+
|
|
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
|
+
|
|
24
|
+
## Context Log
|
|
25
|
+
|
|
26
|
+
Files read:
|
|
27
|
+
- `main.go`
|
|
28
|
+
- `internal/styles/palette.go`
|
|
29
|
+
- `internal/styles/styles.go`
|
|
30
|
+
|
|
31
|
+
Estimated input tokens: 400
|
|
32
|
+
|
|
33
|
+
Notes:
|
|
34
|
+
- `lipgloss.Force256Color` is supported on all Go platforms and all color-capable terminals
|
|
35
|
+
- This is a single-line change — no new dependencies or imports beyond the existing `github.com/charmbracelet/lipgloss` package
|
|
36
|
+
- TrueColor hex values (`"#000000"`) are mapped to nearest 256-color values (`"232"`) via palette.go's `color()` helper; these are already configured
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: audit-findings
|
|
3
|
+
audited: 2026-05-02
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Audit Findings: E04 Epic Navigation
|
|
7
|
+
|
|
8
|
+
## Main Findings
|
|
9
|
+
|
|
10
|
+
E04 verified the wide-screen epic navigation work: focusable epic sidebar, purple epic focus styling, epic detail overlay, and epic status glyph loading from epic detail frontmatter.
|
|
11
|
+
|
|
12
|
+
The audit found no must-fix product issue before close. Carry-forward notes were limited to documenting accepted overlay filtering behavior, the permissive epic detail file fallback, and a minor unused sidebar paging helper.
|
|
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: E01-tui-optimisation (2026-05-02)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### With
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
last_audited: E04-epic-navigation (2026-05-02)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
### Target File
|
|
49
|
+
|
|
50
|
+
`.savepoint/Design.md`
|
|
51
|
+
|
|
52
|
+
### Replace
|
|
53
|
+
|
|
54
|
+
```md
|
|
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, and stable focused/unfocused column border geometry (v1.1 E01).
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### With
|
|
59
|
+
|
|
60
|
+
```md
|
|
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), 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
|
+
```md
|
|
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 detail, 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. Non-TTY output remains a plain table fallback.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### With
|
|
77
|
+
|
|
78
|
+
```md
|
|
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. 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.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### Target File
|
|
85
|
+
|
|
86
|
+
`.savepoint/Design.md`
|
|
87
|
+
|
|
88
|
+
### Replace
|
|
89
|
+
|
|
90
|
+
```md
|
|
91
|
+
**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 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.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### With
|
|
95
|
+
|
|
96
|
+
```md
|
|
97
|
+
**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.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### Target File
|
|
103
|
+
|
|
104
|
+
`AGENTS.md`
|
|
105
|
+
|
|
106
|
+
### Replace
|
|
107
|
+
|
|
108
|
+
```md
|
|
109
|
+
| `internal/board/` | TUI board models, layout, rendering, overlays, task transitions, router priority markers, and fsnotify refresh |
|
|
110
|
+
| `internal/data/` | Task/router/config models, frontmatter parsing, checklist state parsing, mtime-guarded writes, discovery, and generic file readers |
|
|
111
|
+
| `internal/styles/` | Atari-Noir palette constants, terminal color fallbacks, shared TUI styles, stable column border styles, scroll indicators, semantic glyph/tag styles, and footer/header styling |
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### With
|
|
115
|
+
|
|
116
|
+
```md
|
|
117
|
+
| `internal/board/` | TUI board models, layout, rendering, overlays, focusable epic sidebar navigation, epic detail overlays, epic status glyph loading, task transitions, router priority markers, and fsnotify refresh |
|
|
118
|
+
| `internal/data/` | Task/router/config models, frontmatter parsing, checklist state parsing, mtime-guarded writes, discovery, and generic file readers |
|
|
119
|
+
| `internal/styles/` | Atari-Noir palette constants, terminal color fallbacks, shared TUI styles, stable column border styles, scroll indicators, purple epic navigation/detail styles, semantic glyph/tag styles, and footer/header styling |
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### Target File
|
|
125
|
+
|
|
126
|
+
`.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md`
|
|
127
|
+
|
|
128
|
+
### Replace
|
|
129
|
+
|
|
130
|
+
```yaml
|
|
131
|
+
status: planned
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### With
|
|
135
|
+
|
|
136
|
+
```yaml
|
|
137
|
+
status: audited
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### Target File
|
|
143
|
+
|
|
144
|
+
`.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md`
|
|
145
|
+
|
|
146
|
+
### Replace
|
|
147
|
+
|
|
148
|
+
```md
|
|
149
|
+
## Architectural notes
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### With
|
|
153
|
+
|
|
154
|
+
```md
|
|
155
|
+
## Implemented as
|
|
156
|
+
|
|
157
|
+
- `internal/board/model.go` adds `EpicPanelFocus`, `EpicPanelCursor`, `EpicDetailOffset`, `EpicDetailContent`, and `EpicStatus` model state.
|
|
158
|
+
- `internal/board/update.go` handles global keys before epic-panel routing, focuses the panel from the Planned column on wide layouts, changes the selected epic during panel cursor movement, writes router release/epic state, and opens the epic detail overlay on Enter.
|
|
159
|
+
- `internal/board/epic_panel.go` renders the purple-accented epic sidebar focus state, purple epic detail overlay, markdown detail body, and side-panel-only status glyph prefixes.
|
|
160
|
+
- `internal/board/board.go` loads epic status frontmatter during board-data loading; `internal/board/watch.go` carries that status map through reloads.
|
|
161
|
+
- Epic navigation deliberately uses `VibePurple` (`#B1A1DF`) for focused epic panel borders, focused epic labels, epic detail overlays, and epic/audit accents, while task-column focus remains Atari Orange.
|
|
162
|
+
- Implementation deviation: T001 originally said Enter in epic-panel focus selected the focused epic. The final behavior from T002 is that up/down selects and filters immediately, while Enter opens the epic detail overlay.
|
|
163
|
+
|
|
164
|
+
## Architectural notes
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: epic-design
|
|
3
|
+
status: audited
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Epic E04: Epic Navigation
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Make the epic sidebar an active, focusable UI component. The sidebar currently lists epics as static text — the only way to switch epics is through the `E` key dropdown popup. This epic gives the sidebar parity with task columns: ↑/↓ navigation, focus highlighting, and an Enter-triggered "Epic Detail" overlay.
|
|
11
|
+
|
|
12
|
+
## Definition of Done
|
|
13
|
+
|
|
14
|
+
- Epic sidebar is focusable — left arrow from `Planned` column moves focus to sidebar
|
|
15
|
+
- In sidebar focus: ↑/↓ navigates through epics, right arrow returns to column view
|
|
16
|
+
- Focused epic filters tasks in all three columns (same filtering as current `SelectedEpic`)
|
|
17
|
+
- A focused epic entry in the sidebar is visually distinct from unfocused ones
|
|
18
|
+
- Enter on a focused epic opens an "Epic Detail" overlay showing the epic's `E##-Detail.md` content
|
|
19
|
+
- Overlay supports scrolling (↑/↓, PgUp/PgDown) identical to task detail overlay
|
|
20
|
+
- `E` key dropdown behavior is preserved unchanged
|
|
21
|
+
- All above works only when epic panel is visible (≥120 terminal width)
|
|
22
|
+
|
|
23
|
+
## Components and files
|
|
24
|
+
|
|
25
|
+
| Path | Purpose |
|
|
26
|
+
|------|---------|
|
|
27
|
+
| `internal/board/model.go` | Add `EpicPanelFocus`, `EpicPanelCursor`, `EpicDetailOffset`, `EpicDetailContent` state |
|
|
28
|
+
| `internal/board/update.go` | Handle left arrow to enter panel, ↑/↓ within, Enter to open detail, right arrow to exit |
|
|
29
|
+
| `internal/board/view.go` | Pass focus/cursor to `RenderEpicSidebar`, render epic detail overlay |
|
|
30
|
+
| `internal/board/epic_panel.go` | Update `RenderEpicSidebar` for focus/cursor, add `RenderEpicDetail` |
|
|
31
|
+
| `internal/board/detail.go` | Reuse `visibleDetailLines`, `WrapText`, scroll helpers for epic detail |
|
|
32
|
+
| `internal/board/board.go` | Load epic status from detail files in `loadBoardData` |
|
|
33
|
+
| `internal/board/watch.go` | Carry `epicStatuses` in `reloadMsg` for dynamic reloads |
|
|
34
|
+
| `internal/data/parser.go` | Reuse `ParseFrontmatter` to extract status YAML field |
|
|
35
|
+
|
|
36
|
+
## Architectural notes
|
|
37
|
+
|
|
38
|
+
- `EpicPanelFocus bool` is a lightweight flag replacing the need for a new column type
|
|
39
|
+
- The epic detail overlay content is read from `E##-Detail.md` on the filesystem when Enter is pressed (not pre-loaded)
|
|
40
|
+
- Detail file path is deterministic: `{root}/releases/{release}/epics/{epic-slug}/{shortID}-Detail.md`
|
|
41
|
+
- If the detail file is missing, the overlay shows a "(no detail available)" message
|
|
42
|
+
- Column selection, task selection, and existing overlay behavior are completely unchanged
|
|
43
|
+
|
|
44
|
+
## Implemented as
|
|
45
|
+
|
|
46
|
+
- `internal/board/model.go` adds `EpicPanelFocus`, `EpicPanelCursor`, `EpicDetailOffset`, `EpicDetailContent`, and `EpicStatus` model state.
|
|
47
|
+
- `internal/board/update.go` handles global keys before epic-panel routing, focuses the panel from the Planned column on wide layouts, changes the selected epic during panel cursor movement, writes router release/epic state, and opens the epic detail overlay on Enter.
|
|
48
|
+
- `internal/board/epic_panel.go` renders the purple-accented epic sidebar focus state, purple epic detail overlay, markdown detail body, and side-panel-only status glyph prefixes.
|
|
49
|
+
- `internal/board/board.go` loads epic status frontmatter during board-data loading; `internal/board/watch.go` carries that status map through reloads.
|
|
50
|
+
- Epic navigation deliberately uses `VibePurple` (`#B1A1DF`) for focused epic panel borders, focused epic labels, epic detail overlays, and epic/audit accents, while task-column focus remains Atari Orange.
|
|
51
|
+
- Implementation deviation: T001 originally said Enter in epic-panel focus selected the focused epic. The final behavior from T002 is that up/down selects and filters immediately, while Enter opens the epic detail overlay.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: E04-epic-navigation/T001-sidebar-focusable-navigation
|
|
3
|
+
status: done
|
|
4
|
+
objective: "Make the epic sidebar focusable with up/down navigation to select epics"
|
|
5
|
+
depends_on: []
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# T001: Sidebar Focusable Navigation
|
|
9
|
+
|
|
10
|
+
## Acceptance Criteria
|
|
11
|
+
|
|
12
|
+
- Left arrow (`←`/`h`) from the `Planned` column moves keyboard focus to the epic panel (when panel is visible at ≥120 width)
|
|
13
|
+
- In epic panel focus mode, `↑`/`k` moves the cursor up through the epic list (clamped to bounds)
|
|
14
|
+
- In epic panel focus mode, `↓`/`j` moves the cursor down through the epic list (clamped to bounds)
|
|
15
|
+
- The focused epic entry in the sidebar is highlighted with the same focused style used in task columns
|
|
16
|
+
- `Enter` in epic panel focus mode selects the focused epic: tasks are filtered to that epic, and focus remains in the panel
|
|
17
|
+
- Right arrow (`→`/`l`) from epic panel focus exits back to the `Planned` column with `FocusedTask=0`
|
|
18
|
+
- The existing `E` key dropdown overlay still works unchanged
|
|
19
|
+
- When no epics exist in the current release, the panel shows no navigable cursor
|
|
20
|
+
- All navigation is blocked when any overlay is open (existing behavior)
|
|
21
|
+
|
|
22
|
+
## Implementation Plan
|
|
23
|
+
|
|
24
|
+
- [x] Add `EpicPanelFocus bool` and `EpicPanelCursor int` to `Model` in `model.go`
|
|
25
|
+
- [x] Add `EpicPanelFocus` tracking to `refreshEpicsForRelease()` — clamp cursor and clear focus if epics list becomes empty
|
|
26
|
+
- [x] In `update.go` — before the `switch msg.String()` block, check `m.Overlay == OverlayNone && m.EpicPanelFocus` and route to a new `updateEpicPanel` method
|
|
27
|
+
- [x] In `updateEpicPanel` — handle `up`/`k` (decrement cursor), `down`/`j` (increment cursor), `enter` (call `m.selectEpicPanelEpic()`), `right`/`l` (exit to Planned column), `left`/`h` (no-op or wrap)
|
|
28
|
+
- [x] In `update.go` main switch — handle `left`/`h` when `FocusedColumn == Planned` by setting `EpicPanelFocus = true` (only when epic panel is visible, i.e. `CalculateLayout(m.Width, m.Height).EpicPanelVisible`)
|
|
29
|
+
|
|
30
|
+
- [x] Add `m.selectEpicPanelEpic()` method: set `m.SelectedEpic = m.Epics[m.EpicPanelCursor]`, reset `m.FocusedTask = 0`, `m.DetailOffset = 0`, call `m.refreshTasks()`, call `m.ensureFocusedTaskVisible()`, write router state
|
|
31
|
+
- [x] Update `epic_panel.go` — update `RenderEpicSidebar` signature to accept `focus bool, cursor int` params; when focused, render the item at cursor with `styles.TaskItemFocused` and `epicActiveMarker`; when not focused, keep current rendering with `SelectedEpic` marker
|
|
32
|
+
- [x] Update `view.go` — pass `m.EpicPanelFocus` and `m.EpicPanelCursor` to `RenderEpicSidebar` in `renderEpicPanel`
|
|
33
|
+
- [x] Add `m.epicPanelPageSize()` helper returning `m.Height / 2` (or similar) for eventual PgUp/PgDown support
|
|
34
|
+
- [x] Run `make build && make test` to verify no regressions
|
|
35
|
+
|
|
36
|
+
## Context Log
|
|
37
|
+
|
|
38
|
+
Files read:
|
|
39
|
+
- `.savepoint/router.md`
|
|
40
|
+
- `agent-skills/savepoint-build-task/SKILL.md`
|
|
41
|
+
- `agent-skills/ink-tui-design/SKILL.md`
|
|
42
|
+
- `.savepoint/visual-identity.md`
|
|
43
|
+
- `.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md`
|
|
44
|
+
- `.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md`
|
|
45
|
+
- `internal/board/model.go`
|
|
46
|
+
- `internal/board/update.go`
|
|
47
|
+
- `internal/board/view.go`
|
|
48
|
+
- `internal/board/epic_panel.go`
|
|
49
|
+
- `internal/board/layout.go`
|
|
50
|
+
- `internal/board/board.go`
|
|
51
|
+
- `internal/board/epic_panel_test.go`
|
|
52
|
+
- `internal/board/update_test.go`
|
|
53
|
+
- `internal/board/model_test.go`
|
|
54
|
+
- `internal/board/view_test.go`
|
|
55
|
+
|
|
56
|
+
Estimated input tokens: 12000
|
|
57
|
+
|
|
58
|
+
Notes:
|
|
59
|
+
- Model's `EpicCursor` field (used in dropdown) is distinct from new `EpicPanelCursor`
|
|
60
|
+
- The epic panel visibility is determined by `layout.EpicPanelVisible` in `CalculateLayout`
|
|
61
|
+
- Focused board tests: `go test ./internal/board` passed.
|
|
62
|
+
- Required quality gate `make build && make test`: failed to start because `make` is not installed in this shell.
|
|
63
|
+
- Equivalent quality gates: `go build -o savepoint main.go` passed; `go test ./...` passed.
|
|
64
|
+
- Follow-up fix after manual review: epic panel focus now renders with the focused panel border and focused title so entering the sidebar is visually apparent even when the cursor starts on the already selected epic. Re-ran `go test ./internal/board`, `go build -o savepoint main.go`, and `go test ./...`; all passed.
|
|
65
|
+
- Follow-up input-routing fix: global `q`, `e`, `r`, and `?` keys now run before epic-panel-specific key handling, so quit and dropdown overlays still work when the epic panel is focused. Added regression tests for `q`, `e`, and `r` from epic panel focus. Re-ran `go test ./internal/board`, `go build -o savepoint main.go`, and `go test ./...`; all passed.
|