Ashley's upstream .github/workflows/ci.yml targets GitHub-hosted
ubuntu-latest/windows-latest/macos-latest runners, which aren't
registered on git.opensourcesolarpunk.com for non-org repos - every
matrix job on eva/focus-flow's PR #18 shows "Has been cancelled"
rather than a real pass/fail. This adds a Forgejo-native workflow at
.forgejo/workflows/ci.yml using ubuntu-latest only, matching the
pattern already proven working for circuitforge-core/peregrine/kiwi
on this instance. Also runs the Flutter app's own analyze/test/format,
which the upstream workflow (root dart workspace test.dart only)
never covered.
Closes: #9
Merges 20 commits from Ashley's smolblocks.com instance (main branch),
bringing in the full Backlog Board screen (BacklogBoardController, board
columns/cards, task detail drawer, summary panel, search/filter/sort/group,
Break Up and Someday actions) plus the unified FocusFlowSection navigation
model.
Reconciled with our own in-flight work:
- Replaced our placeholder BacklogPane/createBacklogController wiring with
Ashley's real BacklogBoardScreen/BacklogBoardController (same problem,
more complete implementation - avoids two competing Backlog UIs).
- Adopted the FocusFlowSection-based Sidebar API in place of our bespoke
SidebarScreen enum; the Settings nav item now intercepts
FocusFlowSection.settings in _selectSection to open our Settings dialog
instead of falling through to a placeholder screen.
- Gave every sidebar nav item a stable key (not just the active one) so the
Settings dialog tests can still target it reliably.
- Kept our additive owner-settings read controller, Settings dialog, and
timeline Break-up wiring; renamed the Today controller field to
todayController throughout to match upstream's now-multi-controller
naming.
- Fixed a test-only regression: backlog_board_screen_test.dart's standalone
SchedulerCommandController construction needed the new `management` param.
- Added .gitleaks.toml allowlisting the local, gitignored
.claude/settings.local.json path (recorded bash command patterns, not
repo secrets) that was blocking commits.
Verified via focusflow-flutter-ci:3.44.4 (Flutter 3.44.4/Dart 3.12.2):
flutter analyze clean, dart format clean, 106/106 Flutter tests passing,
348/348 scheduler_core + scheduler_persistence_sqlite tests passing.
Closes: #9
Adds a getOwnerSettings read query to scheduler_core (previously only
an internal helper existed) and an updateOwnerSettings command on the
Flutter command controller, then builds a shared Settings dialog
surfacing timezone, day window, compact mode, and backlog staleness
thresholds. Both existing no-op entry points (sidebar nav item, top
bar button) now open the same dialog and persist edits through the
existing OwnerSettings/BacklogStalenessSettings backend.
Per the design spec (circuitforge-plans/focus-flow/superpowers/specs/
2026-07-07-settings-screen-design.md), the compact-mode toggle
persists but is disclosed in-UI as not yet affecting Today rendering,
since that wiring is separate scope (#11).
Closes: eva/focus-flow#16
Extracts the break-up dialog into a shared widgets/dialogs library so
the task modal and timeline card quick actions reuse the same flow
instead of duplicating it, then wires a Break up icon through
TimelineView/TaskTimelineCard to the existing breakUpTask command path.
Closes: eva/focus-flow#14
Backend was already V1-complete for these paths (moveFlexibleToBacklog,
breakUpTask); this closes the UI-wiring gap identified in the V1
feature-complete audit.
- Add createBacklogController() to SchedulerAppComposition and implement it
in PersistentSchedulerComposition (only the demo composition had one).
- Sidebar now switches the main content area between Today and Backlog via
a real SidebarScreen enum instead of hardcoded onTap: () {} stubs.
- Task modal's "Backlog" quick-action reuses the existing onPushToBacklog
wiring (same backend command as the Push menu's "Push to backlog").
- Add a break-up dialog (row-level title/priority/reward/duration per
MVP-AC-11) and SchedulerCommandController.breakUpTask(), wired to the
modal's "Break up" button.
- Fix a latent bug where the active sidebar nav item's key was hardcoded
to nav-today-active regardless of which item was active.
Closes: #9
Closes: #12
Closes: #13