savepoint 1.0.4 → 1.0.7
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/package.json +11 -4
- package/savepoint.exe +0 -0
- package/.claude/settings.local.json +0 -38
- package/.github/workflows/ci.yml +0 -20
- package/.golangci.yml +0 -11
- package/.prettierignore +0 -4
- package/.savepoint/Design.md +0 -207
- package/.savepoint/PRD.md +0 -58
- package/.savepoint/config.yml +0 -27
- package/.savepoint/releases/v1/epics/E01-go-setup/E01-Detail.md +0 -39
- package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T001-init-module.md +0 -42
- package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T002-entrypoint.md +0 -23
- package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T003-directory-structure.md +0 -24
- package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T004-makefile.md +0 -23
- package/.savepoint/releases/v1/epics/E02-data-readers/E02-Detail.md +0 -61
- package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T001-task-struct.md +0 -29
- package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T002-frontmatter-parser.md +0 -30
- package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T003-router-reader.md +0 -29
- package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T004-config-reader.md +0 -29
- package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T005-discovery.md +0 -30
- package/.savepoint/releases/v1/epics/E03-board-tui-core/E03-Detail.md +0 -38
- package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T001-model.md +0 -29
- package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T002-update-loop.md +0 -30
- package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T003-view.md +0 -34
- package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T004-styles.md +0 -29
- package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T005-layout.md +0 -42
- package/.savepoint/releases/v1/epics/E04-board-components/E04-Detail.md +0 -44
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T001-column.md +0 -34
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T002-card.md +0 -33
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T003-epic-panel.md +0 -49
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T004-detail-overlay.md +0 -40
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T005-release-dropdown.md +0 -33
- package/.savepoint/releases/v1/epics/E04-board-components/tasks/T006-help-overlay.md +0 -34
- package/.savepoint/releases/v1/epics/E05-phase-transitions/E05-Detail.md +0 -38
- package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T001-phase-stepping.md +0 -29
- package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T002-gates.md +0 -31
- package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T003-write-task.md +0 -31
- package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T004-write-router.md +0 -31
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/E06-Detail.md +0 -62
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T001-color-system.md +0 -39
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T002-header-and-dividers.md +0 -52
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T003-footer-status-bar.md +0 -52
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T004-component-refinement.md +0 -53
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T005-restore-nav-hints.md +0 -39
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T007-detail-card-fixes.md +0 -36
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T008-checkbox-states.md +0 -40
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T009-router-priority-marker.md +0 -48
- package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T010-auto-refresh-watcher.md +0 -66
- package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/Design.md +0 -39
- package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T001-archive-epics.md +0 -20
- package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T002-rewrite-prd.md +0 -22
- package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T003-create-epic-stubs.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T004-update-router.md +0 -22
- package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/Design.md +0 -118
- package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/handoff.md +0 -9
- package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T001-package-baseline.md +0 -45
- package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T002-typescript-build.md +0 -48
- package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T003-vitest-smoke.md +0 -43
- package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T004-lint-format-gates.md +0 -45
- package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T005-scaffold-verification.md +0 -40
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/Design.md +0 -142
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T001-domain-ids-status.md +0 -27
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T002-markdown-frontmatter-boundary.md +0 -28
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T003-task-documents.md +0 -29
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T004-release-epic-router-config-readers.md +0 -30
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T005-dependency-validation.md +0 -29
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T006-epic-task-set-reader.md +0 -29
- package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T007-quality-gates.md +0 -31
- package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/Design.md +0 -40
- package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T001-phase-types.md +0 -27
- package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T002-phase-frontmatter.md +0 -25
- package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T003-simplify-config.md +0 -26
- package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T004-simplify-router-domain.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/Design.md +0 -122
- package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T001-argument-parser-contract.md +0 -28
- package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T002-help-text-generation.md +0 -28
- package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T003-terminal-environment-detection.md +0 -27
- package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T004-command-stub-modules.md +0 -29
- package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T005-cli-runner-dispatch.md +0 -34
- package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T006-entrypoint-quality-gates.md +0 -32
- package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/Design.md +0 -43
- package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T001-strip-args.md +0 -26
- package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T002-strip-help.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T003-strip-run.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T004-delete-commands.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T005-update-cli-tests.md +0 -22
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/Design.md +0 -48
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T001-board-data-phases.md +0 -26
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T002-phase-rendering.md +0 -28
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T003-detail-pane-phases.md +0 -27
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T004-phase-transitions.md +0 -42
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T005-phase-gates.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T006-phase-write-back.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T007-remove-audit-flow.md +0 -27
- package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T008-board-tests.md +0 -25
- package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/Design.md +0 -85
- package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T001-project-template-assets.md +0 -17
- package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T002-release-and-prompt-assets.md +0 -20
- package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T003-template-registry-renderer.md +0 -22
- package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T004-template-integrity-tests.md +0 -17
- package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T005-template-closeout-quality-gates.md +0 -16
- package/.savepoint/releases/v1/epics/_archived/E05-init-command/Design.md +0 -88
- package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T001-init-cli-contract.md +0 -22
- package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T002-target-validation.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T003-scaffold-writer.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T004-magic-prompt-and-clipboard.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T005-dev-deps-install-option.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T006-init-command-integration.md +0 -28
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/Design.md +0 -53
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T001-delete-dead-src.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T002-delete-dead-tests.md +0 -26
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T003-delete-assets.md +0 -25
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T004-clean-savepoint.md +0 -28
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T005-rewrite-agents-md.md +0 -28
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T006-clean-package-json.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T007-verify.md +0 -25
- package/.savepoint/releases/v1/epics/_archived/E06-tui-board/Design.md +0 -104
- package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T001-board-command-data.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T002-board-view-state.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T003-transition-gates-and-writes.md +0 -25
- package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T004-terminal-theme.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T005-ink-board-ui.md +0 -26
- package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T006-board-integration-audit-entry.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/Design.md +0 -88
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T001-audit-cli-contract.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T002-quality-gate-runner.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T003-snapshot-and-prompt.md +0 -23
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T004-audit-orchestration-router.md +0 -27
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T005-proposal-validation-apply.md +0 -25
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T006-audit-review-state.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T007-audit-review-ui.md +0 -26
- package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T008-audit-pipeline-integration.md +0 -24
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/Design.md +0 -103
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T001-acceptance-criteria-model.md +0 -30
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T002-release-task-set-reader.md +0 -33
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T003-board-data-and-plain-output.md +0 -34
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T004-board-selection-state.md +0 -33
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T005-ink-board-layout-cleanup.md +0 -37
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T006-task-detail-popup.md +0 -36
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T007-templates-acceptance-criteria.md +0 -34
- package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T008-board-workflow-integration.md +0 -41
- package/.savepoint/releases/v1/epics/_archived/E09-doctor-command/Design.md +0 -70
- package/.savepoint/releases/v1/epics/_archived/E10-docs-and-packaging/Design.md +0 -68
- package/.savepoint/releases/v1/epics/_archived/E11-release-validation/Design.md +0 -68
- package/.savepoint/releases/v1/v1-PRD.md +0 -66
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/E01-Detail.md +0 -40
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T001-next-activity-header.md +0 -56
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T002-rename-epic-design-files.md +0 -38
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T003-rename-release-prd.md +0 -28
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T004-update-instruction-files.md +0 -51
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T005-update-cross-references.md +0 -45
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T006-column-and-detail-scrolling.md +0 -68
- package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T007-column-focus-border-stability.md +0 -57
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md +0 -124
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Detail.md +0 -49
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T001-fix-makefile.md +0 -37
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T002-linux-build-target.md +0 -38
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T003-macos-build-target.md +0 -36
- package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md +0 -59
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Audit.md +0 -195
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +0 -45
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T001-border-resize-fix.md +0 -40
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md +0 -64
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T003-checkbox-rendering-fix.md +0 -56
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md +0 -65
- package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +0 -36
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Audit.md +0 -167
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md +0 -51
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md +0 -65
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T002-epic-detail-overlay.md +0 -73
- package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md +0 -73
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Audit.md +0 -237
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +0 -54
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +0 -45
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +0 -40
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +0 -47
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +0 -98
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +0 -33
- package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +0 -62
- package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Audit.md +0 -56
- package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Detail.md +0 -63
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T005-proposals.md +0 -44
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T007-apply-close.md +0 -35
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T009-integration.md +0 -40
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T010-audit-file-migration.md +0 -45
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T011-model-tab-state.md +0 -26
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T012-epic-audit-render.md +0 -33
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T013-handle-tab-keys.md +0 -34
- package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T014-tab-indicator.md +0 -33
- package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Audit.md +0 -336
- package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md +0 -61
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T001-cli-entrypoint.md +0 -37
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T002-target-validation.md +0 -28
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T003-scaffold-writer.md +0 -46
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T004-atomic-writes.md +0 -27
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T005-magic-prompt.md +0 -25
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md +0 -26
- package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T007-integration-test.md +0 -26
- package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Audit.md +0 -333
- package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Detail.md +0 -68
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T001-cli-entrypoint.md +0 -26
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T002-non-tty-fallback.md +0 -27
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T003-tui-app-shell.md +0 -28
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T004-board-model.md +0 -29
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T005-detail-pane.md +0 -27
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T006-status-transitions.md +0 -29
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T007-theme-fallbacks.md +0 -29
- package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T008-integration-test.md +0 -27
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Audit.md +0 -207
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Detail.md +0 -65
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T001-cli-entrypoint.md +0 -24
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T002-config-router-validation.md +0 -28
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T003-structure-checks.md +0 -29
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T004-dependency-checks.md +0 -27
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T005-audit-orphan-checks.md +0 -28
- package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T006-quality-gates-report.md +0 -31
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/E11-Detail.md +0 -36
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T001-debug-logging.md +0 -25
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T002-increase-debounce.md +0 -21
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T003-error-handling.md +0 -22
- package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T004-test-verify.md +0 -29
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Audit.md +0 -444
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Detail.md +0 -45
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T001-default-phase.md +0 -35
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T002-default-status.md +0 -19
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T003-better-errors.md +0 -29
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T004-validate-on-write.md +0 -25
- package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T005-tests.md +0 -37
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Audit.md +0 -118
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Detail.md +0 -73
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T001-safe-cleanup.md +0 -66
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T002-bug-fixes.md +0 -35
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T003-centralize-duplication.md +0 -60
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T004-infrastructure.md +0 -33
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T005-decompose-update.md +0 -37
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T006-async-io.md +0 -40
- package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T007-test-coverage.md +0 -37
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Audit.md +0 -267
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Detail.md +0 -54
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T001-group-model.md +0 -39
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T002-data-interfaces.md +0 -42
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T003-discover-orphans.md +0 -33
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T004-epic-panel-headings.md +0 -35
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T005-shell-tokenization.md +0 -27
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T006-unify-enums.md +0 -29
- package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T007-testutil-package.md +0 -28
- package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Audit.md +0 -272
- package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Detail.md +0 -60
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T001-benchmarks.md +0 -31
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T002-fuzz-targets.md +0 -34
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T003-debug-flag.md +0 -30
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T004-dist-checksums.md +0 -27
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T005-windows-targets.md +0 -28
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T006-abbreviation-splitting.md +0 -26
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T007-root-test-allowlist.md +0 -33
- package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T008-ci-and-release-automation.md +0 -46
- package/.savepoint/releases/v1.1/epics/_archived/T001-cli-entrypoint.md +0 -25
- package/.savepoint/releases/v1.1/epics/_archived/T002-quality-gates.md +0 -27
- package/.savepoint/releases/v1.1/epics/_archived/T003-snapshot.md +0 -27
- package/.savepoint/releases/v1.1/epics/_archived/T004-ai-reconcile.md +0 -29
- package/.savepoint/releases/v1.1/epics/_archived/T006-tui-review.md +0 -31
- package/.savepoint/releases/v1.1/epics/_archived/T008-skip-handling.md +0 -34
- package/.savepoint/releases/v1.1/v1.1-PRD.md +0 -139
- package/.savepoint/router.md +0 -57
- package/.savepoint/visual-identity.md +0 -125
- package/AGENTS.md +0 -99
- package/CLAUDE.md +0 -1
- package/GEMINI.md +0 -1
- package/Makefile +0 -31
- package/agent-skills/ink-tui-design/SKILL.md +0 -309
- package/agent-skills/ink-tui-design/references/component-patterns.md +0 -371
- package/agent-skills/ink-tui-design/references/hooks-guide.md +0 -436
- package/agent-skills/ink-tui-design/references/ink-gotchas.md +0 -330
- package/agent-skills/ink-tui-design/references/testing-patterns.md +0 -384
- package/agent-skills/savepoint-audit/SKILL.md +0 -87
- package/agent-skills/savepoint-build-task/SKILL.md +0 -44
- package/agent-skills/savepoint-create-plan/SKILL.md +0 -33
- package/agent-skills/savepoint-create-task/SKILL.md +0 -44
- package/agent-skills/savepoint-draft-prd/SKILL.md +0 -37
- package/agent-skills/savepoint-system-design/SKILL.md +0 -38
- package/agent-skills/superpowers/brainstorming/SKILL.md +0 -165
- package/agent-skills/superpowers/brainstorming/visual-companion.md +0 -304
- package/agent-skills/superpowers/dispatching-parallel-agents/SKILL.md +0 -193
- package/agent-skills/superpowers/executing-plans/SKILL.md +0 -77
- package/agent-skills/superpowers/finishing-a-development-branch/SKILL.md +0 -213
- package/agent-skills/superpowers/receiving-code-review/SKILL.md +0 -226
- package/agent-skills/superpowers/requesting-code-review/SKILL.md +0 -115
- package/agent-skills/superpowers/requesting-code-review/code-reviewer.md +0 -160
- package/agent-skills/superpowers/subagent-driven-development/SKILL.md +0 -292
- package/agent-skills/superpowers/subagent-driven-development/code-quality-reviewer-prompt.md +0 -27
- package/agent-skills/superpowers/subagent-driven-development/implementer-prompt.md +0 -113
- package/agent-skills/superpowers/subagent-driven-development/spec-reviewer-prompt.md +0 -61
- package/agent-skills/superpowers/systematic-debugging/SKILL.md +0 -305
- package/agent-skills/superpowers/systematic-debugging/condition-based-waiting.md +0 -122
- package/agent-skills/superpowers/systematic-debugging/defense-in-depth.md +0 -130
- package/agent-skills/superpowers/systematic-debugging/root-cause-tracing.md +0 -183
- package/agent-skills/superpowers/test-driven-development/SKILL.md +0 -389
- package/agent-skills/superpowers/test-driven-development/testing-anti-patterns.md +0 -317
- package/agent-skills/superpowers/verification-before-completion/SKILL.md +0 -147
- package/agent-skills/superpowers/writing-plans/SKILL.md +0 -159
- package/agent-skills/superpowers/writing-plans/plan-document-reviewer-prompt.md +0 -49
- package/agent_skills_test.go +0 -91
- package/assets/banner.png +0 -0
- package/assets/logo.png +0 -0
- package/assets/strawman.png +0 -0
- package/cmd/board.go +0 -59
- package/cmd/board_test.go +0 -137
- package/cmd/doctor.go +0 -53
- package/cmd/doctor_test.go +0 -146
- package/cmd/init.go +0 -63
- package/cmd/init_test.go +0 -104
- package/go.mod +0 -36
- package/go.sum +0 -75
- package/internal/board/board.go +0 -181
- package/internal/board/board_test.go +0 -168
- package/internal/board/card.go +0 -129
- package/internal/board/card_test.go +0 -287
- package/internal/board/column.go +0 -156
- package/internal/board/column_test.go +0 -210
- package/internal/board/debug.go +0 -26
- package/internal/board/debug_test.go +0 -108
- package/internal/board/detail.go +0 -218
- package/internal/board/detail_test.go +0 -388
- package/internal/board/epic_panel.go +0 -264
- package/internal/board/epic_panel_test.go +0 -869
- package/internal/board/help.go +0 -41
- package/internal/board/help_test.go +0 -86
- package/internal/board/integration_test.go +0 -266
- package/internal/board/interfaces.go +0 -65
- package/internal/board/interfaces_test.go +0 -114
- package/internal/board/io.go +0 -93
- package/internal/board/layout.go +0 -68
- package/internal/board/layout_test.go +0 -106
- package/internal/board/model.go +0 -235
- package/internal/board/model_test.go +0 -67
- package/internal/board/plain.go +0 -88
- package/internal/board/plain_test.go +0 -117
- package/internal/board/release.go +0 -34
- package/internal/board/release_test.go +0 -177
- package/internal/board/render_policy_test.go +0 -77
- package/internal/board/status.go +0 -23
- package/internal/board/theme.go +0 -24
- package/internal/board/theme_test.go +0 -31
- package/internal/board/transitions.go +0 -113
- package/internal/board/transitions_test.go +0 -164
- package/internal/board/tui.go +0 -32
- package/internal/board/update.go +0 -575
- package/internal/board/update_test.go +0 -602
- package/internal/board/util.go +0 -76
- package/internal/board/view.go +0 -317
- package/internal/board/view_test.go +0 -377
- package/internal/board/watch.go +0 -136
- package/internal/buildtool/main.go +0 -249
- package/internal/buildtool/main_test.go +0 -224
- package/internal/data/config.go +0 -101
- package/internal/data/config_test.go +0 -122
- package/internal/data/discover.go +0 -178
- package/internal/data/discover_test.go +0 -130
- package/internal/data/errors.go +0 -13
- package/internal/data/fuzz_test.go +0 -75
- package/internal/data/lifecycle.go +0 -44
- package/internal/data/lifecycle_test.go +0 -41
- package/internal/data/parser.go +0 -243
- package/internal/data/parser_test.go +0 -281
- package/internal/data/router.go +0 -52
- package/internal/data/router_test.go +0 -35
- package/internal/data/task.go +0 -57
- package/internal/data/task_test.go +0 -51
- package/internal/data/testdata/fuzz/FuzzSplitFrontmatterBody/68eb66b0fe91e7e3 +0 -2
- package/internal/data/write.go +0 -221
- package/internal/data/write_test.go +0 -623
- package/internal/doctor/checks.go +0 -567
- package/internal/doctor/checks_test.go +0 -716
- package/internal/doctor/gates.go +0 -193
- package/internal/doctor/gates_test.go +0 -166
- package/internal/doctor/interfaces.go +0 -64
- package/internal/doctor/interfaces_test.go +0 -104
- package/internal/doctor/repairs.go +0 -80
- package/internal/doctor/repairs_test.go +0 -81
- package/internal/doctor/report.go +0 -157
- package/internal/doctor/report_test.go +0 -89
- package/internal/init/clipboard.go +0 -146
- package/internal/init/clipboard_test.go +0 -74
- package/internal/init/install.go +0 -16
- package/internal/init/integration_test.go +0 -197
- package/internal/init/prompt.go +0 -14
- package/internal/init/prompt_test.go +0 -77
- package/internal/init/scaffold.go +0 -59
- package/internal/init/scaffold_test.go +0 -179
- package/internal/init/template_freshness_test.go +0 -56
- package/internal/init/validate.go +0 -85
- package/internal/init/validate_test.go +0 -141
- package/internal/init/write.go +0 -73
- package/internal/init/write_test.go +0 -91
- package/internal/styles/palette.go +0 -49
- package/internal/styles/styles.go +0 -139
- package/internal/styles/styles_test.go +0 -133
- package/internal/testutil/fixture.go +0 -113
- package/internal/testutil/fs.go +0 -26
- package/main.go +0 -136
- package/project-audit/audit_report_glm_5.1.md +0 -411
- package/project-audit/audit_report_opus_4.6.md +0 -406
- package/project-audit/consolidated-audit-report.md +0 -456
- package/scripts/vitest-preload.cjs +0 -95
- package/templates/project/.savepoint/Design.md +0 -47
- package/templates/project/.savepoint/PRD.md +0 -34
- package/templates/project/.savepoint/config.yml +0 -27
- package/templates/project/.savepoint/router.md +0 -153
- package/templates/project/.savepoint/visual-identity.md +0 -122
- package/templates/project/AGENTS.md +0 -88
- package/templates/project/agent-skills/savepoint-audit/SKILL.md +0 -87
- package/templates/project/agent-skills/savepoint-build-task/SKILL.md +0 -44
- package/templates/project/agent-skills/savepoint-create-plan/SKILL.md +0 -33
- package/templates/project/agent-skills/savepoint-create-task/SKILL.md +0 -44
- package/templates/project/agent-skills/savepoint-draft-prd/SKILL.md +0 -37
- package/templates/project/agent-skills/savepoint-system-design/SKILL.md +0 -38
- package/templates/prompts/audit-reconciliation.prompt.md +0 -72
- package/templates/prompts/design.prompt.md +0 -45
- package/templates/prompts/epic-design.prompt.md +0 -43
- package/templates/prompts/magic-prompt.prompt.md +0 -7
- package/templates/prompts/prd.prompt.md +0 -42
- package/templates/prompts/task-breakdown.prompt.md +0 -54
- package/templates/prompts/task-building.prompt.md +0 -38
- package/templates/prompts/task-planning.prompt.md +0 -53
- package/templates/release/v1/PRD.md +0 -37
|
@@ -1,411 +0,0 @@
|
|
|
1
|
-
# Codebase Audit Report
|
|
2
|
-
|
|
3
|
-
## 1. Executive Summary
|
|
4
|
-
|
|
5
|
-
**Savepoint** is a Go CLI/TUI tool (~5,600 lines of production code, ~5,600 lines of tests, 264 tests) that provides a kanban-style project workflow manager with a terminal UI. It uses the Bubble Tea framework and a custom "Atari-Noir" visual theme.
|
|
6
|
-
|
|
7
|
-
**What is working well:**
|
|
8
|
-
- Clean module separation: `cmd/` (CLI), `internal/data/` (persistence), `internal/board/` (TUI), `internal/doctor/` (diagnostics), `internal/init/` (scaffolding), `internal/styles/` (palette)
|
|
9
|
-
- Dependency injection in `cmd/` via function types (`InitRunner`, `BoardRunner`, `DoctorRunner`) makes commands trivially testable
|
|
10
|
-
- Good test coverage for the core modules (data, board, doctor, init, cmd) with 264 tests
|
|
11
|
-
- Atomic file writes in `data/write.go` and `init/write.go` prevent corruption
|
|
12
|
-
- Well-designed responsive TUI layout with breakpoint-based column rendering
|
|
13
|
-
- Policy tests (`render_policy_test.go`) enforce visual constraints cross-cutting
|
|
14
|
-
|
|
15
|
-
**Biggest risks:**
|
|
16
|
-
- Synchronous filesystem I/O inside the Bubble Tea `Update()` loop will freeze the TUI on slow disks or large files
|
|
17
|
-
- `update.go` (521 lines) is a monolithic switch that handles 5+ overlay types, keyboard input, and file writes in one function
|
|
18
|
-
- `doctor/checks.go` (585 lines) reimplements `strings.Contains`/`strings.Index` and the cycle detection has an accuracy issue
|
|
19
|
-
- No Windows build target in `buildtool`; no checksums in distribution archives
|
|
20
|
-
- `buildtool` and `styles` packages have zero tests
|
|
21
|
-
|
|
22
|
-
**Extensibility:** The architecture suits the current project size well. Adding new overlays, columns, or commands would be straightforward. The main risk to extensibility is the `update.go` monolith — every new keybind or overlay type adds more branches to an already complex function.
|
|
23
|
-
|
|
24
|
-
**Architecture fit:** Good for a small-to-medium project. The Bubble Tea pattern (Model-Update-View) is well-applied, and the rendering helpers are pure functions. The data layer correctly separates parsing, discovery, and writing. The main architectural debt is the I/O-in-update pattern and the size of `update.go`.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 2. Severity-Ranked Recommendations
|
|
29
|
-
|
|
30
|
-
### Critical
|
|
31
|
-
|
|
32
|
-
#### C1. Synchronous file I/O in the TUI update loop
|
|
33
|
-
|
|
34
|
-
- **Finding:** `update.go` performs filesystem reads and writes directly inside `Update()`: `writeTaskStatus()`, `writeRouterTask()`, `writeRouterReleaseEpic()`, `readEpicDetailFile()`, `selectEpicPanelEpic()`. These block the TUI event loop.
|
|
35
|
-
- **Why it matters:** Any disk latency (network drives, slow SSDs, virus scanners) freezes the entire TUI. Bubble Tea's design intent is for `Update()` to be pure — I/O should happen in `tea.Cmd` functions that return messages.
|
|
36
|
-
- **Evidence:** `internal/board/update.go:285-330` (writeRouterTask, writeRouterReleaseEpic), `internal/board/update.go:217-250` (readEpicDetailFile), `internal/board/model.go:235-280` (writeRouterReleaseEpic, writeRouterTask)
|
|
37
|
-
- **Recommended fix:** Extract I/O operations into `tea.Cmd` functions. E.g., `writeTaskStatusCmd(task, path, mtime) tea.Cmd` returns a `tea.Msg` on completion. `Update()` dispatches the command and handles the result message. This is the standard Bubble Tea pattern.
|
|
38
|
-
- **Estimated effort:** Medium (requires refactoring `update.go` to emit commands for each I/O operation, add result message types, and handle them in separate `Update()` branches)
|
|
39
|
-
|
|
40
|
-
#### C2. Cycle detection produces inaccurate paths
|
|
41
|
-
|
|
42
|
-
- **Finding:** `detectCycles` in `checks.go` uses a `parent` map that gets overwritten when a node is visited from multiple paths. When a cycle is found, the path reconstructed via `parent` may not represent the actual cycle.
|
|
43
|
-
- **Why it matters:** Users could be shown a cycle path that doesn't actually exist, causing confusion or incorrect doctor reports.
|
|
44
|
-
- **Evidence:** `internal/doctor/checks.go` — the DFS `parent` map is a simple `map[string]string` that gets overwritten per-visit
|
|
45
|
-
- **Recommended fix:** Either use a stack-based cycle reconstruction (track the current DFS path as a slice) or validate the reconstructed path actually forms a cycle before reporting it.
|
|
46
|
-
- **Estimated effort:** Small
|
|
47
|
-
|
|
48
|
-
### High
|
|
49
|
-
|
|
50
|
-
#### H1. `update.go` is a monolithic 521-line file handling all input, overlays, and I/O
|
|
51
|
-
|
|
52
|
-
- **Finding:** The `Update()` method alone is ~190 lines with deeply nested switches. Overlay handling mixes 5 overlay types in one `updateOverlay()` function.
|
|
53
|
-
- **Why it matters:** Every new feature (new keybind, new overlay) increases the branching complexity. It's hard to reason about which keys do what in which state.
|
|
54
|
-
- **Evidence:** `internal/board/update.go` — single file handling quit, navigation, task transitions, overlays for help/epic/release/detail/epic-detail, file watching, phase management
|
|
55
|
-
- **Recommended fix:** Extract `updateOverlay()` into per-type handlers (`updateHelpOverlay`, `updateEpicOverlay`, etc.). Extract board key handling into `handleBoardKey()`. Consider a key-to-handler dispatch map rather than a switch chain.
|
|
56
|
-
- **Estimated effort:** Medium
|
|
57
|
-
|
|
58
|
-
#### H2. Stdlib reimplementation in `repairs.go` and `buildtool/main.go`
|
|
59
|
-
|
|
60
|
-
- **Finding:** `contains()` and `indexOf()` in `repairs.go` reimplement `strings.Contains` and `strings.Index`. `trimSpace()` in `buildtool/main.go` reimplements `bytes.TrimSpace`.
|
|
61
|
-
- **Why it matters:** Makes code harder to read for Go developers expecting standard library calls. The custom implementations may have subtle differences from the stdlib versions (e.g., Unicode whitespace handling).
|
|
62
|
-
- **Evidence:** `internal/doctor/repairs.go:67-79`, `internal/buildtool/main.go:211-219`
|
|
63
|
-
- **Recommended fix:** Replace with `strings.Contains`, `strings.Index`, and `bytes.TrimSpace` respectively. Import the relevant packages.
|
|
64
|
-
- **Estimated effort:** Small
|
|
65
|
-
|
|
66
|
-
#### H3. Fragile repair suggestion matching via substring search on error messages
|
|
67
|
-
|
|
68
|
-
- **Finding:** `SuggestRepair()` pattern-matches against error message substrings to suggest fixes. If error messages change format, repairs silently break.
|
|
69
|
-
- **Evidence:** `internal/doctor/repairs.go:8-66` — hard-coded substring matching against messages like `"not found"`, `"invalid"`, `"missing"`
|
|
70
|
-
- **Recommended fix:** Define typed error codes or sentinel errors in `data/` and `doctor/`, and match on error type rather than substring. E.g., `func SuggestRepair(err error) string` switches on `errors.Is(err, ErrNoFrontmatter)` instead of `contains(err.Error(), "no frontmatter")`.
|
|
71
|
-
- **Estimated effort:** Medium
|
|
72
|
-
|
|
73
|
-
#### H4. Quality gate command execution has no timeout
|
|
74
|
-
|
|
75
|
-
- **Finding:** `RunQualityGates` executes commands from `config.yml` with no timeout. A hung command blocks the doctor indefinitely.
|
|
76
|
-
- **Evidence:** `internal/doctor/gates.go:32-55` — `exec.Command` with `Run()` and no `Context` timeout
|
|
77
|
-
- **Recommended fix:** Use `exec.CommandContext(ctx, ...)` with a configurable timeout (default: 60s). Add a `gate_timeout` config option.
|
|
78
|
-
- **Estimated effort:** Small
|
|
79
|
-
|
|
80
|
-
#### H5. `\r\n` normalization is scattered across files instead of centralized
|
|
81
|
-
|
|
82
|
-
- **Finding:** `strings.ReplaceAll(content, "\r\n", "\n")` appears in `parser.go`, `write.go` (3 times), `epic_panel.go`, and likely elsewhere. This is a cross-cutting concern that should be handled once.
|
|
83
|
-
- **Why it matters:** If the normalization logic changes (e.g., also handling `\r` alone), every call site must be found and updated. Missing a call site causes subtle cross-platform bugs.
|
|
84
|
-
- **Evidence:** `internal/data/parser.go:92`, `internal/data/write.go:22,46,104`, `internal/board/epic_panel.go`
|
|
85
|
-
- **Recommended fix:** Create a `normalizeLineEndings(s string) string` function in `internal/data/` and use it everywhere. Or read files with a `bufio.Scanner` which handles line endings, or use `strings.ReplaceAll` once at the point of file reading.
|
|
86
|
-
- **Estimated effort:** Small
|
|
87
|
-
|
|
88
|
-
### Medium
|
|
89
|
-
|
|
90
|
-
#### M1. Dead code in `column.go` and `report.go`
|
|
91
|
-
|
|
92
|
-
- **Finding:** `taskLabel()` in `column.go` is defined but never called. `CheckResult` in `report.go` is defined but never used. `GateSuggestion` has an unused `exitCode` parameter.
|
|
93
|
-
- **Evidence:** `internal/board/column.go`, `internal/doctor/report.go`
|
|
94
|
-
- **Recommended fix:** Remove `taskLabel`. Remove `CheckResult` type. Remove or use the `exitCode` parameter in `GateSuggestion`.
|
|
95
|
-
- **Estimated effort:** Small
|
|
96
|
-
|
|
97
|
-
#### M2. Hardcoded state constants in `checks.go` duplicate `data/` definitions
|
|
98
|
-
|
|
99
|
-
- **Finding:** `validStates` map in `checks.go` duplicates the canonical state names defined in `data/lifecycle.go`. If a state is added to `lifecycle.go`, `checks.go` must be manually updated.
|
|
100
|
-
- **Evidence:** `internal/doctor/checks.go` — `validStates` map vs `data.IsCanonicalColumn()` / `data.IsCanonicalStage()`
|
|
101
|
-
- **Recommended fix:** Remove `validStates` and use `data.IsCanonicalColumn()` / `data.IsCanonicalStage()` for validation.
|
|
102
|
-
- **Estimated effort:** Small
|
|
103
|
-
|
|
104
|
-
#### M3. Inconsistent directory abstraction: `CheckOrphans` bypasses `data.Discover`
|
|
105
|
-
|
|
106
|
-
- **Finding:** Most of `checks.go` uses `data.Discover` for filesystem traversal, but `CheckOrphans` uses `os.ReadDir` directly.
|
|
107
|
-
- **Evidence:** `internal/doctor/checks.go` — `CheckOrphans` function
|
|
108
|
-
- **Recommended fix:** Add a `ListRootDirs()` or similar method to `data.Discover` and use it in `CheckOrphans`.
|
|
109
|
-
- **Estimated effort:** Small
|
|
110
|
-
|
|
111
|
-
#### M4. `shortID()` and `WrapText()`/`SplitLongWord()` should be in a shared utilities file
|
|
112
|
-
|
|
113
|
-
- **Finding:** `shortID()` is defined in `card.go` but used in `board.go`, `view.go`, `update.go`, and `detail.go`. `WrapText()` and `SplitLongWord()` in `detail.go` are general-purpose text utilities.
|
|
114
|
-
- **Why it matters:** Scattered utility functions make it hard to find shared logic and risk duplication.
|
|
115
|
-
- **Recommended fix:** Create `internal/board/util.go` (or `internal/text/util.go`) for `shortID`, `WrapText`, `SplitLongWord`, and `truncate`. Move `epicIndex`/`releaseIndex` to a generic `indexOrZero` helper.
|
|
116
|
-
- **Estimated effort:** Small
|
|
117
|
-
|
|
118
|
-
#### M5. Layout constants split between `layout.go` and `column.go`
|
|
119
|
-
|
|
120
|
-
- **Finding:** `colOverhead` is defined in `column.go` (value 4) and used in both `column.go` and `layout.go`. `minColWidth` is in `layout.go`. These layout-related constants should be co-located.
|
|
121
|
-
- **Evidence:** `internal/board/column.go:17` (`const colOverhead = 4`), `internal/board/layout.go:8-15`
|
|
122
|
-
- **Recommended fix:** Move all layout constants to `layout.go`.
|
|
123
|
-
- **Estimated effort:** Small
|
|
124
|
-
|
|
125
|
-
#### M6. `AtomicWrite` cross-device rename fallback doesn't actually solve cross-device moves
|
|
126
|
-
|
|
127
|
-
- **Finding:** `replaceFile()` in `init/write.go` tries `os.Rename` first, then falls back to creating a backup and renaming, but `os.Rename` will still fail on cross-device moves. The fallback should use `os.Link` + `os.Remove` or a plain copy.
|
|
128
|
-
- **Evidence:** `internal/init/write.go:52-63`
|
|
129
|
-
- **Recommended fix:** In the fallback path, use `os.Open` + `io.Copy` + `os.Remove` instead of `os.Rename` for cross-filesystem cases.
|
|
130
|
-
- **Estimated effort:** Small
|
|
131
|
-
|
|
132
|
-
#### M7. Ad-hoc Markdown parsing in `epic_panel.go` is fragile
|
|
133
|
-
|
|
134
|
-
- **Finding:** `epicDetailBody()` and `epicAuditBody()` contain hand-rolled markdown section extraction that skips headings containing "component" or "files" via substring matching. Any heading with those substrings will be silently hidden.
|
|
135
|
-
- **Evidence:** `internal/board/epic_panel.go` — text manipulation functions
|
|
136
|
-
- **Recommended fix:** Either use a proper markdown parser (e.g., `goldmark`) for section extraction, or use exact heading matches with a configurable allowlist/blocklist rather than substring matching.
|
|
137
|
-
- **Estimated effort:** Medium (if switching to a markdown parser) / Small (if switching substring to exact match)
|
|
138
|
-
|
|
139
|
-
#### M8. `Config.Theme` defaults not filling individual accent colors
|
|
140
|
-
|
|
141
|
-
- **Finding:** `fillThemeDefaults()` fills base theme colors when empty, but for accents, it's all-or-nothing: if the user specifies any accent, they must specify all accents, since the function only uses defaults when `len(theme.Accents) == 0`.
|
|
142
|
-
- **Evidence:** `internal/data/config.go:91-94`
|
|
143
|
-
- **Recommended fix:** Fill missing accent keys individually from `defaultTheme.Accents` instead of replacing the entire map.
|
|
144
|
-
- **Estimated effort:** Small
|
|
145
|
-
|
|
146
|
-
#### M9. No Windows build target in `buildtool`
|
|
147
|
-
|
|
148
|
-
- **Finding:** The `targets` list only includes linux/amd64, linux/arm64, darwin/amd64, darwin/arm64. No Windows target despite the project running on Windows (there's a `localExecutable()` Windows branch).
|
|
149
|
-
- **Evidence:** `internal/buildtool/main.go:21-26`
|
|
150
|
-
- **Recommended fix:** Add `{os: "windows", arch: "amd64"}` and `{os: "windows", arch: "arm64"}` to the targets list. Add `.exe` suffix handling in `writeTarGz`.
|
|
151
|
-
- **Estimated effort:** Small
|
|
152
|
-
|
|
153
|
-
### Low
|
|
154
|
-
|
|
155
|
-
#### L1. Audit section allowlist in `epic_panel.go` should be configurable or data-driven
|
|
156
|
-
|
|
157
|
-
- **Finding:** `allowedSections` is a hard-coded map that determines which audit sections render in the TUI.
|
|
158
|
-
- **Recommended fix:** Either extract to a constant with a comment explaining why these sections are allowed, or make it configurable via config.
|
|
159
|
-
- **Estimated effort:** Small
|
|
160
|
-
|
|
161
|
-
#### L2. No distribution checksums
|
|
162
|
-
|
|
163
|
-
- **Finding:** `dist()` creates tar.gz archives but no SHA256 checksums file.
|
|
164
|
-
- **Recommended fix:** Generate a `checksums.txt` file during `dist` with SHA256 hashes of each archive.
|
|
165
|
-
- **Estimated effort:** Small
|
|
166
|
-
|
|
167
|
-
#### L3. `GateSuggestion` has unused `exitCode` parameter
|
|
168
|
-
|
|
169
|
-
- **Finding:** The second parameter is never referenced in the function body.
|
|
170
|
-
- **Evidence:** `internal/doctor/repairs.go:67`
|
|
171
|
-
- **Recommended fix:** Remove the parameter or use it to provide exit-code-specific suggestions.
|
|
172
|
-
- **Estimated effort:** Small
|
|
173
|
-
|
|
174
|
-
#### L4. `agent_skills_test.go` hardcodes expected skill count of 6
|
|
175
|
-
|
|
176
|
-
- **Finding:** The test asserts exactly 6 skills exist. Adding or removing a skill requires updating this test.
|
|
177
|
-
- **Recommended fix:** Remove the count assertion and just verify each skill has valid frontmatter, or derive the expected count from the directory listing.
|
|
178
|
-
- **Estimated effort:** Small
|
|
179
|
-
|
|
180
|
-
#### L5. Test helper duplication across packages
|
|
181
|
-
|
|
182
|
-
- **Finding:** File-writing helpers (`writeFile`, `writeTaskFixture`, etc.) are reimplemented in `board_test.go`, `checks_test.go`, and `write_test.go`.
|
|
183
|
-
- **Recommended fix:** Create an `internal/testutil` package with shared fixtures.
|
|
184
|
-
- **Estimated effort:** Medium
|
|
185
|
-
|
|
186
|
-
#### L6. `splitChecklistSentences` doesn't handle abbreviations
|
|
187
|
-
|
|
188
|
-
- **Finding:** Text splitting on `.`, `!`, `?` doesn't account for abbreviations like "e.g." or "i.e.", which could cause incorrect sentence breaks.
|
|
189
|
-
- **Recommended fix:** Use a more careful sentence boundary detector, or at minimum skip periods preceded by known abbreviations.
|
|
190
|
-
- **Estimated effort:** Small
|
|
191
|
-
|
|
192
|
-
#### L7. `Package main` test file at root level
|
|
193
|
-
|
|
194
|
-
- **Finding:** `agent_skills_test.go` is in `package main` but tests structural properties of the `agent-skills/` directory, not main package functionality. This makes it invisible to per-package test runs.
|
|
195
|
-
- **Recommended fix:** Move it to an appropriate subdirectory or create a `build/` or `meta/` test package.
|
|
196
|
-
- **Estimated effort:** Small
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## 3. Complexity & Modularity Review
|
|
201
|
-
|
|
202
|
-
### Overly large files
|
|
203
|
-
|
|
204
|
-
| File | Lines | Concern |
|
|
205
|
-
|------|-------|---------|
|
|
206
|
-
| `internal/board/update.go` | 521 | Monolithic switch handling all input, overlays, and I/O dispatch |
|
|
207
|
-
| `internal/doctor/checks.go` | 585 | "Check everything" monolith; each check function is OK but they share no common validation abstractions |
|
|
208
|
-
| `internal/data/write.go` | 216 | Two write paths (`WriteTaskStatus` and `WriteRouterState`) share YAML manipulation boilerplate |
|
|
209
|
-
| `internal/board/epic_panel.go` | 256 | Sidebar, detail, audit, and dropdown rendering mixed |
|
|
210
|
-
|
|
211
|
-
### Tight coupling
|
|
212
|
-
|
|
213
|
-
- `internal/board/model.go` is a god struct (25+ fields) that every file in the board package mutates. This is idiomatic for Bubble Tea but creates a wide coupling surface.
|
|
214
|
-
- `update.go` directly calls I/O functions that modify the filesystem. The TUI update loop should not know about filesystem paths.
|
|
215
|
-
|
|
216
|
-
### Mixed responsibilities
|
|
217
|
-
|
|
218
|
-
- `internal/board/board.go`'s `newProjectModel()` does discovery, file loading, watcher creation, and router reading. It's an initialization bottleneck mixing concerns.
|
|
219
|
-
- `model.go` contains both UI state and filesystem mutation functions (`writeRouterReleaseEpic`, `writeRouterTask`). Disk writes should be `tea.Cmd`s.
|
|
220
|
-
|
|
221
|
-
### Repeated logic
|
|
222
|
-
|
|
223
|
-
- `\r\n` normalization appears in 4+ call sites across 2 packages
|
|
224
|
-
- `shortID()` is defined in `card.go` but consumed by 6+ files
|
|
225
|
-
- `epicIndex` and `releaseIndex` are structurally identical
|
|
226
|
-
- YAML frontmatter extraction + reconstruction appears in `write.go` twice with significant duplication between `updateFrontmatterField()` and `WriteTaskStatus()`
|
|
227
|
-
|
|
228
|
-
### Unclear data flow
|
|
229
|
-
|
|
230
|
-
- `syncTaskStatus` in `transitions.go` sets `Status = string(Column)`, creating a dual-field synchronization issue. The `Task` struct has both `Status` and `Column`, and it's unclear which is authoritative.
|
|
231
|
-
- The `watch.go` reload silently swallows errors (returns `nil` on error).
|
|
232
|
-
|
|
233
|
-
### Excessive abstraction (minor)
|
|
234
|
-
|
|
235
|
-
- `data.NewParser()`, `data.NewDiscover()`, `data.NewConfigReader()`, `data.NewRouterReader()` all return pointer-to-empty-struct. These could be package-level functions instead of methods on empty structs, removing unnecessary allocation and indirection.
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## 4. Architecture Review
|
|
240
|
-
|
|
241
|
-
### Folder organisation
|
|
242
|
-
|
|
243
|
-
```
|
|
244
|
-
.
|
|
245
|
-
├── main.go # CLI entrypoint, --version, command dispatch
|
|
246
|
-
├── cmd/ # CLI arg parsing (3 commands: init, board, doctor)
|
|
247
|
-
├── internal/
|
|
248
|
-
│ ├── board/ # TUI (17 source files, ~2300 lines)
|
|
249
|
-
│ ├── data/ # Models, parsing, discovery, writing (8 files)
|
|
250
|
-
│ ├── doctor/ # Diagnostics, checks, gates, repairs (4 files)
|
|
251
|
-
│ ├── init/ # Scaffolding, validation, clipboard (7 files)
|
|
252
|
-
│ ├── buildtool/ # Build helper (1 file, 219 lines)
|
|
253
|
-
│ └── styles/ # Palette + lipgloss styles (2 files)
|
|
254
|
-
├── templates/ # Embedded project templates
|
|
255
|
-
└── agent-skills/ # Skill guides for AI agents
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
This is well-organised. The `cmd/` → `internal/` boundary is clean: `cmd/` handles arg parsing and delegates to `internal/` via dependency-injected function types. The `internal/` packages have clear responsibilities.
|
|
259
|
-
|
|
260
|
-
### Domain boundaries
|
|
261
|
-
|
|
262
|
-
- **Data layer** (`internal/data/`): Task lifecycle, parsing, discovery, config, writing. This is the right boundary.
|
|
263
|
-
- **Board/TUI** (`internal/board/`): Rendering, interaction, file watching. This package is the largest and could benefit from sub-packages, but Go's convention is to keep it flat.
|
|
264
|
-
- **Doctor** (`internal/doctor/`): Checks, gates, repairs, report. Each file has one job. Clean.
|
|
265
|
-
- **Init** (`internal/init/`): Scaffold, validate, write, clipboard, prompt. Clean.
|
|
266
|
-
|
|
267
|
-
### State management
|
|
268
|
-
|
|
269
|
-
State management follows Bubble Tea's Elm Architecture: `Model` holds state, `Update()` processes messages and returns commands, `View()` renders. This is solid. The issue is I/O leaking into `Update()` rather than being emitted as `tea.Cmd`.
|
|
270
|
-
|
|
271
|
-
### API/data layer structure
|
|
272
|
-
|
|
273
|
-
The data layer has no interfaces — all types are concrete structs. For this project size, this is appropriate. The `NewParser()` / `NewDiscover()` pattern returns `*Parser` / `*Discover` which are empty structs — these could just be package-level functions.
|
|
274
|
-
|
|
275
|
-
### Configuration approach
|
|
276
|
-
|
|
277
|
-
Config is read from `.savepoint/config.yml` with sensible defaults. The `QualityGates` struct allows project-specific lint/test/typecheck commands. Theme customization supports three color tiers (truecolor, ANSI256, ANSI16). This is well-designed.
|
|
278
|
-
|
|
279
|
-
### Error handling strategy
|
|
280
|
-
|
|
281
|
-
- **Data layer:** Uses sentinel errors (`ErrNoFrontmatter`, `ErrSavepointDirectoryMissing`, `ErrMtimeConflict`, `ErrProposalNotFound`) — good.
|
|
282
|
-
- **Board:** Errors from I/O inside `Update()` are displayed as status messages to the user — acceptable for a TUI.
|
|
283
|
-
- **Doctor:** Errors are collected into a structured `DiagnosticReport` with repair suggestions — well-designed.
|
|
284
|
-
- **Init:** Errors propagate up to `main.go` which prints to stderr and exits — simple and correct.
|
|
285
|
-
|
|
286
|
-
One gap: `watch.go`'s `reloadTasks` silently returns `nil` on filesystem errors, meaning a watcher failure silently blanks the board.
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
## 5. Best-Practice Review
|
|
291
|
-
|
|
292
|
-
### Framework conventions
|
|
293
|
-
|
|
294
|
-
- Bubble Tea conventions are generally followed: `Init()`, `Update()`, `View()` pattern. However, I/O in `Update()` violates the framework's core principle that `Update()` should be pure. This is the biggest convention deviation.
|
|
295
|
-
|
|
296
|
-
### Type safety
|
|
297
|
-
|
|
298
|
-
- `ColumnType`, `ProgressStage`, and `TaskStatus` are all `string` types. `TaskStatus` is defined but `Task.Column` uses `ColumnType` while `Task.Status` is a plain `string`. The `Status` field is redundant with `Column` and creates a dual-source-of-truth risk.
|
|
299
|
-
- `RouterState` uses `string` fields for `State`, `Release`, `Epic`, `Task` — these could benefit from typed constants similar to `ColumnType`.
|
|
300
|
-
|
|
301
|
-
### Linting/formatting
|
|
302
|
-
|
|
303
|
-
- No linter configuration found (no `.golangci.yml`, no `golint` config). Assuming `go fmt` and `go vet` are used via `make test`.
|
|
304
|
-
- **Recommended:** Add `golangci-lint` with at least `errcheck`, `gosimple`, `staticcheck`, `unused`, and `ineffassign` linters.
|
|
305
|
-
|
|
306
|
-
### Testing approach
|
|
307
|
-
|
|
308
|
-
- 264 tests across 39 test files — good coverage for core logic.
|
|
309
|
-
- Missing: `internal/buildtool/` (0 tests), `internal/styles/` (0 tests).
|
|
310
|
-
- Test helpers are duplicated across packages (write fixtures, temp directories).
|
|
311
|
-
- No benchmarks, no fuzz tests for the YAML parser.
|
|
312
|
-
- No `testdata/` directory — all fixtures are constructed inline.
|
|
313
|
-
|
|
314
|
-
### Dependency management
|
|
315
|
-
|
|
316
|
-
- Dependencies are minimal and appropriate: `bubbletea`, `lipgloss`, `fsnotify`, `yaml.v3`, `clipboard`.
|
|
317
|
-
- No dependency is used for a single call that could be replaced by stdlib (except clipboard, which is inherently platform-specific).
|
|
318
|
-
- `gopkg.in/yaml.v3` is the only YAML parser — used consistently.
|
|
319
|
-
|
|
320
|
-
### Build/deployment setup
|
|
321
|
-
|
|
322
|
-
- `Makefile` + `buildtool/main.go` provides `build`, `test`, `clean`, `dist`, `smoke-test`.
|
|
323
|
-
- The `go:embed` directive properly bundles templates.
|
|
324
|
-
- Missing: Windows cross-compilation, checksum generation, version injection via git tags (present but falls back to `v0.0.0`).
|
|
325
|
-
|
|
326
|
-
### Environment variable handling
|
|
327
|
-
|
|
328
|
-
- `buildtool/version()` checks `VERSION` env var — appropriate.
|
|
329
|
-
- Clipboard detection uses `runtime.GOOS` — correct.
|
|
330
|
-
|
|
331
|
-
### Logging/debugging practices
|
|
332
|
-
|
|
333
|
-
- No structured logging. Errors are printed to stderr in `main.go`.
|
|
334
|
-
- The TUI shows error messages as status bars. This is acceptable for a TUI app.
|
|
335
|
-
- **Gap:** No verbose/debug flag for TUI troubleshooting. Adding `--debug` or `SAVEPOINT_DEBUG` env var would help.
|
|
336
|
-
|
|
337
|
-
---
|
|
338
|
-
|
|
339
|
-
## 6. Refactor Roadmap
|
|
340
|
-
|
|
341
|
-
### Phase 1 — Safe cleanup
|
|
342
|
-
|
|
343
|
-
**Objective:** Remove dead code, fix easy bugs, reduce cognitive load without behavior changes.
|
|
344
|
-
|
|
345
|
-
| Task | Risk |
|
|
346
|
-
|------|------|
|
|
347
|
-
| Remove `taskLabel()` from `column.go` (dead code) | Very Low |
|
|
348
|
-
| Remove `CheckResult` type from `report.go` (dead code) | Very Low |
|
|
349
|
-
| Remove unused `exitCode` parameter from `GateSuggestion` | Very Low |
|
|
350
|
-
| Replace `contains()`/`indexOf()` with `strings.Contains`/`strings.Index` in `repairs.go` | Very Low |
|
|
351
|
-
| Replace `trimSpace()` with `bytes.TrimSpace` in `buildtool/main.go` | Very Low |
|
|
352
|
-
| Replace `validStates` map with `data.IsCanonicalColumn()`/`data.IsCanonicalStage()` | Low |
|
|
353
|
-
| Co-locate layout constants (`colOverhead`) into `layout.go` | Low |
|
|
354
|
-
| Add `\r\n` normalization helper to `data/` package | Low |
|
|
355
|
-
| Centralize duplicated test helpers into `internal/testutil/` | Low |
|
|
356
|
-
| Fix cycle detection path reconstruction in `checks.go` | Low |
|
|
357
|
-
|
|
358
|
-
**Expected benefit:** Cleaner codebase, fewer surprises, eliminates one actual bug (cycle detection).
|
|
359
|
-
|
|
360
|
-
### Phase 2 — Structural improvements
|
|
361
|
-
|
|
362
|
-
**Objective:** Decompose the update monolith, improve data flow, extract shared utilities.
|
|
363
|
-
|
|
364
|
-
| Task | Risk |
|
|
365
|
-
|------|------|
|
|
366
|
-
| Extract overlay handlers from `update.go` into per-overlay functions | Medium |
|
|
367
|
-
| Extract `handleBoardKey()` from `update.go` | Medium |
|
|
368
|
-
| Move `shortID`, `WrapText`, `SplitLongWord`, `truncate` to a utility file | Medium |
|
|
369
|
-
| Generalize `epicIndex`/`releaseIndex` into `indexOrZero` | Low |
|
|
370
|
-
| Make `data.NewParser/Discover/ConfigReader/RouterReader` package-level functions | Low |
|
|
371
|
-
| Fix `AtomicWrite` cross-device fallback to use `io.Copy` | Medium |
|
|
372
|
-
| Make `Config.Theme.Accents` fill missing keys individually | Low |
|
|
373
|
-
| Add Windows build targets to `buildtool` | Low |
|
|
374
|
-
| Add checksum generation to `dist` | Low |
|
|
375
|
-
|
|
376
|
-
**Expected benefit:** Reduced file complexity, better separation of concerns, cross-platform correctness.
|
|
377
|
-
|
|
378
|
-
### Phase 3 — Hardening
|
|
379
|
-
|
|
380
|
-
**Objective:** Fix the I/O-in-update anti-pattern, add missing tests, improve security.
|
|
381
|
-
|
|
382
|
-
| Task | Risk |
|
|
383
|
-
|------|------|
|
|
384
|
-
| Refactor all filesystem I/O in `update.go` to `tea.Cmd` functions | Medium-High |
|
|
385
|
-
| Add `tea.Cmd`-based router writing for priority key and epic selection | Medium |
|
|
386
|
-
| Add timeout to quality gate execution (`exec.CommandContext`) | Low |
|
|
387
|
-
| Convert `SuggestRepair` to typed error matching | Medium |
|
|
388
|
-
| Add tests for `buildtool/` | Low |
|
|
389
|
-
| Add tests for `styles/` | Low |
|
|
390
|
-
| Add benchmark tests for render functions (`RenderColumn`, `RenderCard`, `RenderDetail`) | Low |
|
|
391
|
-
| Add fuzz targets for YAML frontmatter parsing | Low |
|
|
392
|
-
| Fix `watch.go` error handling (don't silently swallow errors) | Medium |
|
|
393
|
-
| Add `--debug`/`SAVEPOINT_DEBUG` flag for TUI troubleshooting | Low |
|
|
394
|
-
| Improve `splitChecklistSentences` for abbreviation handling | Low |
|
|
395
|
-
|
|
396
|
-
**Expected benefit:** TUI responsiveness, correct error propagation, test coverage completeness, security.
|
|
397
|
-
|
|
398
|
-
---
|
|
399
|
-
|
|
400
|
-
## 7. Top 10 Action List
|
|
401
|
-
|
|
402
|
-
- [ ] **Extract I/O from `update.go` into `tea.Cmd` functions** — Critical — `internal/board/update.go`, `internal/board/model.go` — Prevents TUI freezes on slow disk; follows Bubble Tea conventions; highest architectural impact
|
|
403
|
-
- [ ] **Fix cycle detection path reconstruction in `checks.go`** — High (bug) — `internal/doctor/checks.go` — Produces inaccurate error messages today
|
|
404
|
-
- [ ] **Decompose `update.go` overlay handling into per-type handlers** — High — `internal/board/update.go` — Reduces 521-line file complexity; makes adding new overlays safe
|
|
405
|
-
- [ ] **Replace stdlib reimplmentations (`contains`, `indexOf`, `trimSpace`)** — High — `internal/doctor/repairs.go`, `internal/buildtool/main.go` — Eliminates confusing custom code
|
|
406
|
-
- [ ] **Add timeout to quality gate execution** — High — `internal/doctor/gates.go` — Prevents indefinite blocking
|
|
407
|
-
- [ ] **Centralize `\r\n` normalization into a shared function** — Medium — `internal/data/parser.go`, `internal/data/write.go`, `internal/board/epic_panel.go` — Single source of truth for cross-platform line endings
|
|
408
|
-
- [ ] **Consolidate layout constants and shared utilities** — Medium — `internal/board/column.go`, `internal/board/layout.go`, `internal/board/card.go`, `internal/board/detail.go` — Reduces scatter and makes layout logic findable
|
|
409
|
-
- [ ] **Fix `AtomicWrite` cross-device rename fallback** — Medium — `internal/init/write.go` — Prevents silent data loss on cross-filesystem moves
|
|
410
|
-
- [ ] **Remove dead code (`taskLabel`, `CheckResult`, unused params)** — Low — `internal/board/column.go`, `internal/doctor/report.go`, `internal/doctor/repairs.go` — Reduces clutter
|
|
411
|
-
- [ ] **Add tests for `buildtool/` and `styles/`** — Medium — `internal/buildtool/`, `internal/styles/` — Achieves baseline coverage for untested packages
|