loopflow 0.7.2__tar.gz → 0.8.2__tar.gz
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.
- loopflow-0.8.2/.claude/commands/ux-review.md +75 -0
- loopflow-0.8.2/.claude/commands/ux-synthesize-concerto.md +78 -0
- loopflow-0.8.2/.github/workflows/ci.yml +56 -0
- loopflow-0.8.2/.github/workflows/clear-scratch.yml +52 -0
- loopflow-0.8.2/.github/workflows/release.yml +144 -0
- {loopflow-0.7.2 → loopflow-0.8.2}/.gitignore +4 -1
- loopflow-0.8.2/.lf/SUMMARIZE.md +33 -0
- loopflow-0.8.2/.lf/config.yaml +23 -0
- loopflow-0.8.2/.lf/directions/conductor.md +13 -0
- loopflow-0.8.2/.lf/directions/improviser.md +13 -0
- loopflow-0.8.2/.lf/directions/listener.md +13 -0
- loopflow-0.8.2/AGENTS.md +316 -0
- loopflow-0.8.2/CLAUDE.md +1 -0
- loopflow-0.8.2/Cargo.lock +3527 -0
- loopflow-0.8.2/Cargo.toml +23 -0
- {loopflow-0.7.2 → loopflow-0.8.2}/PKG-INFO +50 -33
- loopflow-0.8.2/PROMPT_STYLE.md +197 -0
- {loopflow-0.7.2 → loopflow-0.8.2}/README.md +41 -11
- loopflow-0.8.2/RELEASE_NOTES.md +9 -0
- loopflow-0.8.2/STYLE.md +318 -0
- loopflow-0.8.2/TESTING.md +74 -0
- loopflow-0.8.2/VISUAL_DESIGN.md +402 -0
- loopflow-0.8.2/bin/test-summaries +108 -0
- loopflow-0.8.2/bin/waves-start +11 -0
- loopflow-0.8.2/bin/waves-stop +3 -0
- loopflow-0.8.2/docs/_config.yml +15 -0
- loopflow-0.8.2/docs/config.md +369 -0
- loopflow-0.8.2/docs/getting-started.md +137 -0
- loopflow-0.8.2/docs/index.md +239 -0
- loopflow-0.8.2/docs/lf.md +194 -0
- loopflow-0.8.2/docs/lfd.md +54 -0
- loopflow-0.8.2/docs/lfops.md +248 -0
- loopflow-0.8.2/docs/screenshots/concerto-main-uitest.png +0 -0
- loopflow-0.8.2/docs/screenshots/concerto-main.png +0 -0
- loopflow-0.8.2/docs/screenshots/concerto-wave-running-uitest.png +0 -0
- loopflow-0.8.2/docs/screenshots/concerto-wave-running.png +0 -0
- loopflow-0.8.2/docs/screenshots/concerto-wave-waiting-uitest.png +0 -0
- loopflow-0.8.2/docs/screenshots/concerto-wave-waiting.png +0 -0
- loopflow-0.8.2/docs/stubs/lf-context +22 -0
- loopflow-0.8.2/docs/troubleshooting.md +124 -0
- loopflow-0.8.2/docs/waves.md +169 -0
- loopflow-0.8.2/loopflow.code-workspace +7 -0
- loopflow-0.8.2/proto/README.md +160 -0
- loopflow-0.8.2/proto/VERSIONING.md +153 -0
- loopflow-0.8.2/proto/fixtures/events/output_line.json +8 -0
- loopflow-0.8.2/proto/fixtures/events/scheduler_slot_acquired.json +8 -0
- loopflow-0.8.2/proto/fixtures/events/scheduler_slot_released.json +8 -0
- loopflow-0.8.2/proto/fixtures/events/session_ended.json +11 -0
- loopflow-0.8.2/proto/fixtures/events/session_started.json +12 -0
- loopflow-0.8.2/proto/fixtures/events/wave_activated.json +8 -0
- loopflow-0.8.2/proto/fixtures/events/wave_created.json +8 -0
- loopflow-0.8.2/proto/fixtures/events/wave_started.json +7 -0
- loopflow-0.8.2/proto/fixtures/events/wave_stopped.json +7 -0
- loopflow-0.8.2/proto/fixtures/events/wave_waiting.json +12 -0
- loopflow-0.8.2/proto/fixtures/events/worktree_pruned.json +8 -0
- loopflow-0.8.2/proto/fixtures/events/worktree_updated.json +49 -0
- loopflow-0.8.2/proto/fixtures/requests/connect_wave.json +3 -0
- loopflow-0.8.2/proto/fixtures/requests/create_wave.json +8 -0
- loopflow-0.8.2/proto/fixtures/requests/gather_context.json +25 -0
- loopflow-0.8.2/proto/fixtures/responses/analyze_tokens.json +67 -0
- loopflow-0.8.2/proto/fixtures/responses/connect_wave.json +8 -0
- loopflow-0.8.2/proto/fixtures/responses/create_wave.json +21 -0
- loopflow-0.8.2/proto/fixtures/responses/error_detail.json +8 -0
- loopflow-0.8.2/proto/fixtures/responses/gather_context.json +50 -0
- loopflow-0.8.2/proto/fixtures/responses/get_health.json +20 -0
- loopflow-0.8.2/proto/fixtures/responses/get_status.json +6 -0
- loopflow-0.8.2/proto/fixtures/responses/list_worktrees.json +65 -0
- loopflow-0.8.2/proto/loopflow/control/v1/control.proto +771 -0
- loopflow-0.8.2/proto/loopflow/engine/v1/engine.proto +595 -0
- loopflow-0.8.2/pyproject.toml +52 -0
- loopflow-0.8.2/python/loopflow/__init__.py +1 -0
- loopflow-0.8.2/python/loopflow/api.py +133 -0
- loopflow-0.8.2/python/loopflow/cli.py +137 -0
- loopflow-0.8.2/python/loopflow/client.py +215 -0
- loopflow-0.8.2/python/loopflow/errors.py +6 -0
- loopflow-0.8.2/python/loopflow/models.py +52 -0
- loopflow-0.8.2/python/tests/conftest.py +63 -0
- loopflow-0.8.2/python/tests/test_client.py +135 -0
- loopflow-0.8.2/python/tests/test_models.py +49 -0
- loopflow-0.8.2/reports/cli/ux-polish.md +28 -0
- loopflow-0.8.2/reports/code-quality.md +29 -0
- loopflow-0.8.2/reports/concerto/00-overview.md +39 -0
- loopflow-0.8.2/reports/concerto/01-platform.md +41 -0
- loopflow-0.8.2/reports/concerto/02-auth.md +37 -0
- loopflow-0.8.2/reports/concerto/03-conduct-ux.md +67 -0
- loopflow-0.8.2/reports/concerto/04-improvise-ux.md +61 -0
- loopflow-0.8.2/reports/concerto/05-remote-terminal.md +44 -0
- loopflow-0.8.2/reports/concerto/06-data-structures.md +81 -0
- loopflow-0.8.2/reports/concerto/07-ux-experiments.md +124 -0
- loopflow-0.8.2/reports/concerto/08-notifications.md +56 -0
- loopflow-0.8.2/reports/concerto/09-phasing.md +60 -0
- loopflow-0.8.2/reports/concerto/README.md +30 -0
- loopflow-0.8.2/reports/concerto-vision.md +138 -0
- loopflow-0.8.2/reports/landscape.md +129 -0
- loopflow-0.8.2/reports/lfd-reliability.md +133 -0
- loopflow-0.8.2/reports/rust-lfd.md +225 -0
- loopflow-0.8.2/reports/target-customer.md +104 -0
- loopflow-0.8.2/reports/teams-vision.md +89 -0
- loopflow-0.8.2/reports/terminal-reference.md +581 -0
- loopflow-0.8.2/roadmap/concerto/02-studio-auth-v0.md +142 -0
- loopflow-0.8.2/roadmap/concerto/03-mobile-client-v0.md +238 -0
- loopflow-0.8.2/roadmap/concerto/README.md +88 -0
- loopflow-0.8.2/roadmap/concerto/agent-harness.md +60 -0
- loopflow-0.8.2/roadmap/concerto/chat-experience.md +61 -0
- loopflow-0.8.2/roadmap/concerto/ios-conduct-ui.md +31 -0
- loopflow-0.8.2/roadmap/concerto/ios-improvise-ui.md +30 -0
- loopflow-0.8.2/roadmap/concerto/push-notifications.md +40 -0
- loopflow-0.8.2/roadmap/concerto/remote-terminal-view.md +35 -0
- loopflow-0.8.2/roadmap/rust/02b-summarize.md +107 -0
- loopflow-0.8.2/roadmap/rust/02c-grpc-events.md +13 -0
- loopflow-0.8.2/roadmap/rust/03-service.md +485 -0
- loopflow-0.8.2/roadmap/rust/04-distribution.md +408 -0
- loopflow-0.8.2/roadmap/rust/05-auth.md +530 -0
- loopflow-0.8.2/roadmap/rust/06-executors.md +596 -0
- loopflow-0.8.2/roadmap/rust/07-deployment.md +524 -0
- loopflow-0.8.2/roadmap/rust/08-hosted.md +412 -0
- loopflow-0.8.2/roadmap/rust/ARCHITECTURE.md +346 -0
- loopflow-0.8.2/roadmap/rust/README.md +108 -0
- loopflow-0.8.2/rust/loopflow/Cargo.toml +74 -0
- loopflow-0.8.2/rust/loopflow/src/bin/lf-prompt.rs +75 -0
- loopflow-0.8.2/rust/loopflow/src/bin/lf.rs +273 -0
- loopflow-0.8.2/rust/loopflow/src/bin/lfd.rs +124 -0
- loopflow-0.8.2/rust/loopflow/src/engine/agent.rs +570 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/interactive/design.md +5 -1
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/init.md +1 -9
- loopflow-0.8.2/rust/loopflow/src/engine/builtins.rs +195 -0
- loopflow-0.8.2/rust/loopflow/src/engine/clipboard.rs +52 -0
- loopflow-0.8.2/rust/loopflow/src/engine/command.rs +72 -0
- loopflow-0.8.2/rust/loopflow/src/engine/config.rs +947 -0
- loopflow-0.8.2/rust/loopflow/src/engine/error.rs +99 -0
- loopflow-0.8.2/rust/loopflow/src/engine/event.rs +31 -0
- loopflow-0.8.2/rust/loopflow/src/engine/flow.rs +858 -0
- loopflow-0.8.2/rust/loopflow/src/engine/git.rs +708 -0
- loopflow-0.8.2/rust/loopflow/src/engine/mod.rs +37 -0
- loopflow-0.8.2/rust/loopflow/src/engine/naming.rs +236 -0
- loopflow-0.8.2/rust/loopflow/src/engine/platform.rs +11 -0
- loopflow-0.8.2/rust/loopflow/src/engine/prompt.rs +2283 -0
- loopflow-0.8.2/rust/loopflow/src/engine/stream.rs +920 -0
- loopflow-0.8.2/rust/loopflow/src/engine/worktree.rs +97 -0
- loopflow-0.8.2/rust/loopflow/src/engine/worktrees.rs +265 -0
- loopflow-0.8.2/rust/loopflow/src/lf/commands/flow.rs +68 -0
- loopflow-0.8.2/rust/loopflow/src/lf/commands/list.rs +251 -0
- loopflow-0.8.2/rust/loopflow/src/lf/commands/mod.rs +5 -0
- loopflow-0.8.2/rust/loopflow/src/lf/commands/ops/mod.rs +720 -0
- loopflow-0.8.2/rust/loopflow/src/lf/commands/run.rs +317 -0
- loopflow-0.8.2/rust/loopflow/src/lf/commands/util.rs +32 -0
- loopflow-0.8.2/rust/loopflow/src/lf/discovery.rs +575 -0
- loopflow-0.8.2/rust/loopflow/src/lf/mod.rs +234 -0
- loopflow-0.8.2/rust/loopflow/src/lf/output.rs +240 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/auth.rs +131 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/config.rs +56 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/credentials.rs +34 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/events.rs +26 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/executor.rs +788 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/dto.rs +214 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/mod.rs +110 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/flows.rs +152 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/hooks.rs +28 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/mod.rs +88 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/system.rs +110 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/wave_runs.rs +189 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/waves.rs +648 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/routes/ws.rs +111 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/http/state.rs +24 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/id.rs +120 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/machine_id.rs +33 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/mod.rs +82 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/obs.rs +6 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/output.rs +108 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/registration.rs +261 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/scheduler.rs +150 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/sessions.rs +104 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/store/migrations/postgres/001_initial.sql +103 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/store/migrations/postgres/002_flow_parents.sql +4 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/store/migrations/postgres/003_run_snapshots.sql +27 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/store/mod.rs +431 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/store/postgres.rs +1325 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/store/schema.rs +3 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/store/sqlite.rs +1208 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/triggers/common.rs +43 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/triggers/cron.rs +189 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/triggers/loop_ticker.rs +91 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/triggers/mod.rs +10 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/triggers/recovery.rs +65 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/triggers/watch.rs +264 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/types/agent.rs +69 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/types/event.rs +139 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/types/mod.rs +14 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/types/stimulus.rs +86 -0
- loopflow-0.8.2/rust/loopflow/src/lfd/types/wave.rs +179 -0
- loopflow-0.8.2/rust/loopflow/src/lib.rs +4 -0
- loopflow-0.8.2/rust/loopflow/src/ops/abandon.rs +79 -0
- loopflow-0.8.2/rust/loopflow/src/ops/commit.rs +238 -0
- loopflow-0.8.2/rust/loopflow/src/ops/error.rs +27 -0
- loopflow-0.8.2/rust/loopflow/src/ops/land.rs +291 -0
- loopflow-0.8.2/rust/loopflow/src/ops/lint.rs +141 -0
- loopflow-0.8.2/rust/loopflow/src/ops/messages.rs +268 -0
- loopflow-0.8.2/rust/loopflow/src/ops/mod.rs +24 -0
- loopflow-0.8.2/rust/loopflow/src/ops/next.rs +246 -0
- loopflow-0.8.2/rust/loopflow/src/ops/pr.rs +352 -0
- loopflow-0.8.2/rust/loopflow/src/ops/progress.rs +18 -0
- loopflow-0.8.2/rust/loopflow/src/ops/rebase.rs +108 -0
- loopflow-0.8.2/rust/loopflow/src/ops/trace.rs +123 -0
- loopflow-0.8.2/rust/loopflow/src/ops/util.rs +15 -0
- loopflow-0.8.2/rust/loopflow/tests/agent_tests.rs +144 -0
- loopflow-0.8.2/rust/loopflow/tests/commit_tests.rs +120 -0
- loopflow-0.8.2/rust/loopflow/tests/config_tests.rs +381 -0
- loopflow-0.8.2/rust/loopflow/tests/context_tests.rs +722 -0
- loopflow-0.8.2/rust/loopflow/tests/discovery_tests.rs +143 -0
- loopflow-0.8.2/rust/loopflow/tests/flow_tests.rs +275 -0
- loopflow-0.8.2/rust/loopflow/tests/git_tests.rs +171 -0
- loopflow-0.8.2/rust/loopflow/tests/golden_prompt.rs +95 -0
- loopflow-0.8.2/rust/loopflow/tests/land_tests.rs +166 -0
- loopflow-0.8.2/rust/loopflow/tests/next_tests.rs +138 -0
- loopflow-0.8.2/rust/loopflow/tests/pr_tests.rs +154 -0
- loopflow-0.8.2/rust/loopflow/tests/rebase_tests.rs +94 -0
- loopflow-0.8.2/rust/loopflow/tests/support/mod.rs +59 -0
- loopflow-0.8.2/rust/loopflow/tests/token_tests.rs +9 -0
- loopflow-0.8.2/rust/loopflow/tests/wave_worktree_tests.rs +125 -0
- loopflow-0.8.2/rust/loopflow/tests/worktree_tests.rs +72 -0
- loopflow-0.8.2/rust/loopflow-test-support/Cargo.toml +9 -0
- loopflow-0.8.2/rust/loopflow-test-support/src/lib.rs +161 -0
- loopflow-0.8.2/scripts/collapse_migrations.py +87 -0
- loopflow-0.8.2/scripts/dev-lf +14 -0
- loopflow-0.8.2/scripts/dev.py +394 -0
- loopflow-0.8.2/scripts/generate_screenshots.py +651 -0
- loopflow-0.8.2/scripts/publish.py +576 -0
- loopflow-0.8.2/scripts/screenshots.yaml +58 -0
- loopflow-0.8.2/swift/Concerto/AppIcon.icns +0 -0
- loopflow-0.8.2/swift/Concerto/BrandColors.swift +76 -0
- loopflow-0.8.2/swift/Concerto/Concerto.sdef +11 -0
- loopflow-0.8.2/swift/Concerto/ConcertoApp.swift +120 -0
- loopflow-0.8.2/swift/Concerto/DesignSystem.swift +152 -0
- loopflow-0.8.2/swift/Concerto/Flags.swift +11 -0
- loopflow-0.8.2/swift/Concerto/Info.plist +45 -0
- loopflow-0.8.2/swift/Concerto/Models/RecentRepo.swift +13 -0
- loopflow-0.8.2/swift/Concerto/ScriptCommands.swift +28 -0
- loopflow-0.8.2/swift/Concerto/Services/AppIconProvider.swift +95 -0
- loopflow-0.8.2/swift/Concerto/Services/Ghostty/GhosttyManager.swift +256 -0
- loopflow-0.8.2/swift/Concerto/Services/Ghostty/GhosttyTerminalView.swift +604 -0
- loopflow-0.8.2/swift/Concerto/Services/Ghostty/GhosttyTypes.swift +25 -0
- loopflow-0.8.2/swift/Concerto/Services/Ghostty/README.md +294 -0
- loopflow-0.8.2/swift/Concerto/Services/NameGenerator.swift +28 -0
- loopflow-0.8.2/swift/Concerto/Services/RecentAreasService.swift +40 -0
- loopflow-0.8.2/swift/Concerto/Services/RecentsService.swift +61 -0
- loopflow-0.8.2/swift/Concerto/Services/SetupService.swift +223 -0
- loopflow-0.8.2/swift/Concerto/Services/SnapshotService.swift +74 -0
- loopflow-0.8.2/swift/Concerto/Services/TerminalLauncher.swift +326 -0
- loopflow-0.8.2/swift/Concerto/State/OutputBuffer.swift +130 -0
- loopflow-0.8.2/swift/Concerto/State/RepoState.swift +527 -0
- loopflow-0.8.2/swift/Concerto/UX_DESIGN.md +115 -0
- loopflow-0.8.2/swift/Concerto/Views/AreaTypeahead.swift +202 -0
- loopflow-0.8.2/swift/Concerto/Views/CommandPalette.swift +226 -0
- loopflow-0.8.2/swift/Concerto/Views/ContentView.swift +135 -0
- loopflow-0.8.2/swift/Concerto/Views/DiagnosticsView.swift +42 -0
- loopflow-0.8.2/swift/Concerto/Views/DirectionTypeahead.swift +172 -0
- loopflow-0.8.2/swift/Concerto/Views/EmbeddedTerminalPanel.swift +141 -0
- loopflow-0.8.2/swift/Concerto/Views/FlowProgressPills.swift +137 -0
- loopflow-0.8.2/swift/Concerto/Views/FlowTypeahead.swift +233 -0
- loopflow-0.8.2/swift/Concerto/Views/InteractiveSessionView.swift +183 -0
- loopflow-0.8.2/swift/Concerto/Views/LiveOutput.swift +51 -0
- loopflow-0.8.2/swift/Concerto/Views/NextActionsBar.swift +288 -0
- loopflow-0.8.2/swift/Concerto/Views/QuickExperimentView.swift +213 -0
- loopflow-0.8.2/swift/Concerto/Views/RepoWindow.swift +84 -0
- loopflow-0.8.2/swift/Concerto/Views/ScreenshotWindow.swift +165 -0
- loopflow-0.8.2/swift/Concerto/Views/SetupView.swift +177 -0
- loopflow-0.8.2/swift/Concerto/Views/StepRunner.swift +199 -0
- loopflow-0.8.2/swift/Concerto/Views/TerminalTestWindow.swift +100 -0
- loopflow-0.8.2/swift/Concerto/Views/TypeaheadComponents.swift +203 -0
- loopflow-0.8.2/swift/Concerto/Views/WaitingStateCard.swift +221 -0
- loopflow-0.8.2/swift/Concerto/Views/WaveDetailPanel.swift +530 -0
- loopflow-0.8.2/swift/Concerto/Views/WaveRow.swift +259 -0
- loopflow-0.8.2/swift/Concerto/Views/WaveSidebar.swift +390 -0
- loopflow-0.8.2/swift/Concerto/Views/WelcomeWindow.swift +105 -0
- loopflow-0.8.2/swift/ConcertoTests/AuthServiceTests.swift +37 -0
- loopflow-0.8.2/swift/ConcertoTests/GhosttyTests.swift +153 -0
- loopflow-0.8.2/swift/ConcertoTests/WaveRowTests.swift +111 -0
- loopflow-0.8.2/swift/ConcertoTests/WaveTests.swift +515 -0
- loopflow-0.8.2/swift/ConcertoUITests/ScreenshotPipelineTests.swift +35 -0
- loopflow-0.8.2/swift/DESIGN.md +828 -0
- loopflow-0.8.2/swift/LoopflowCore/Info.plist +22 -0
- loopflow-0.8.2/swift/LoopflowCore/LoopflowCore.swift +17 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/AppPreferences.swift +33 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/AppearanceMode.swift +23 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/Flow.swift +56 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/PullRequest.swift +41 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/Step.swift +109 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/Wave.swift +179 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/WaveRun.swift +87 -0
- loopflow-0.8.2/swift/LoopflowCore/Models/WaveViewModel.swift +212 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/AuthError.swift +39 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/AuthService.swift +232 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/AuthState.swift +73 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/LocalEventService.swift +318 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/LocalWaveService.swift +802 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/LoggingService.swift +83 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/NotificationService.swift +107 -0
- loopflow-0.8.2/swift/LoopflowCore/Services/TokenProvider.swift +30 -0
- loopflow-0.8.2/swift/Package.resolved +15 -0
- loopflow-0.8.2/swift/Package.swift +64 -0
- loopflow-0.8.2/swift/README.md +102 -0
- loopflow-0.8.2/swift/Symphonia/SymphoniaApp.swift +16 -0
- loopflow-0.8.2/swift/Symphonia/Views/PlaceholderView.swift +31 -0
- loopflow-0.8.2/swift/SymphoniaTests/SymphoniaTests.swift +11 -0
- loopflow-0.8.2/swift/project.yml +79 -0
- loopflow-0.8.2/tests/e2e/test_full_cycle.sh +50 -0
- loopflow-0.8.2/tests/e2e/test_rebase_conflict.sh +59 -0
- loopflow-0.8.2/tests/e2e/test_smoke.sh +55 -0
- loopflow-0.8.2/tests/goldens/basic.md +85 -0
- loopflow-0.8.2/tests/goldens/basic.yaml +11 -0
- loopflow-0.8.2/tests/goldens/with_direction.md +92 -0
- loopflow-0.8.2/tests/goldens/with_direction.yaml +12 -0
- loopflow-0.8.2/tests/goldens/with_lfdocs.md +117 -0
- loopflow-0.8.2/tests/goldens/with_lfdocs.yaml +11 -0
- loopflow-0.8.2/tests/parity/fixtures/basic/.lf/steps/test.md +1 -0
- loopflow-0.8.2/tests/parity/fixtures/with_direction/.lf/directions/thorough.md +1 -0
- loopflow-0.8.2/tests/parity/fixtures/with_direction/.lf/steps/test.md +1 -0
- loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/.lf/steps/test.md +3 -0
- loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/README.md +3 -0
- loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/roadmap/rust/README.md +3 -0
- loopflow-0.8.2/tests/parity/fixtures/with_lfdocs/scratch/design.md +3 -0
- loopflow-0.8.2/uv.lock +1148 -0
- loopflow-0.7.2/pyproject.toml +0 -103
- loopflow-0.7.2/src/loopflow/STYLE.md +0 -130
- loopflow-0.7.2/src/loopflow/__init__.py +0 -1
- loopflow-0.7.2/src/loopflow/init_check.py +0 -40
- loopflow-0.7.2/src/loopflow/lf/__init__.py +0 -1
- loopflow-0.7.2/src/loopflow/lf/branch_names.py +0 -71
- loopflow-0.7.2/src/loopflow/lf/builtins/__init__.py +0 -1
- loopflow-0.7.2/src/loopflow/lf/builtins/prompts.py +0 -11
- loopflow-0.7.2/src/loopflow/lf/cli.py +0 -360
- loopflow-0.7.2/src/loopflow/lf/config.py +0 -243
- loopflow-0.7.2/src/loopflow/lf/context.py +0 -1077
- loopflow-0.7.2/src/loopflow/lf/deps.py +0 -154
- loopflow-0.7.2/src/loopflow/lf/design.py +0 -185
- loopflow-0.7.2/src/loopflow/lf/directions.py +0 -223
- loopflow-0.7.2/src/loopflow/lf/execution.py +0 -209
- loopflow-0.7.2/src/loopflow/lf/files.py +0 -382
- loopflow-0.7.2/src/loopflow/lf/flow.py +0 -1094
- loopflow-0.7.2/src/loopflow/lf/flows.py +0 -576
- loopflow-0.7.2/src/loopflow/lf/frontmatter.py +0 -271
- loopflow-0.7.2/src/loopflow/lf/git.py +0 -288
- loopflow-0.7.2/src/loopflow/lf/launcher.py +0 -684
- loopflow-0.7.2/src/loopflow/lf/logging.py +0 -72
- loopflow-0.7.2/src/loopflow/lf/messages.py +0 -340
- loopflow-0.7.2/src/loopflow/lf/naming.py +0 -185
- loopflow-0.7.2/src/loopflow/lf/ops/__init__.py +0 -0
- loopflow-0.7.2/src/loopflow/lf/ops/_helpers.py +0 -195
- loopflow-0.7.2/src/loopflow/lf/ops/abandon.py +0 -132
- loopflow-0.7.2/src/loopflow/lf/ops/add.py +0 -43
- loopflow-0.7.2/src/loopflow/lf/ops/commit.py +0 -111
- loopflow-0.7.2/src/loopflow/lf/ops/cp.py +0 -97
- loopflow-0.7.2/src/loopflow/lf/ops/git.py +0 -632
- loopflow-0.7.2/src/loopflow/lf/ops/init.py +0 -106
- loopflow-0.7.2/src/loopflow/lf/ops/land.py +0 -747
- loopflow-0.7.2/src/loopflow/lf/ops/next.py +0 -427
- loopflow-0.7.2/src/loopflow/lf/ops/pr.py +0 -256
- loopflow-0.7.2/src/loopflow/lf/ops/rebase.py +0 -62
- loopflow-0.7.2/src/loopflow/lf/ops/shell.py +0 -185
- loopflow-0.7.2/src/loopflow/lf/ops/summarize.py +0 -648
- loopflow-0.7.2/src/loopflow/lf/ops/sync.py +0 -35
- loopflow-0.7.2/src/loopflow/lf/ops/wt.py +0 -365
- loopflow-0.7.2/src/loopflow/lf/output.py +0 -87
- loopflow-0.7.2/src/loopflow/lf/roadmap.py +0 -267
- loopflow-0.7.2/src/loopflow/lf/skills.py +0 -398
- loopflow-0.7.2/src/loopflow/lf/step.py +0 -611
- loopflow-0.7.2/src/loopflow/lf/tokens.py +0 -231
- loopflow-0.7.2/src/loopflow/lf/wave.py +0 -119
- loopflow-0.7.2/src/loopflow/lf/worktrees.py +0 -497
- loopflow-0.7.2/src/loopflow/lfd/README.md +0 -113
- loopflow-0.7.2/src/loopflow/lfd/__init__.py +0 -4
- loopflow-0.7.2/src/loopflow/lfd/autoprune.py +0 -111
- loopflow-0.7.2/src/loopflow/lfd/cli.py +0 -1796
- loopflow-0.7.2/src/loopflow/lfd/daemon/__init__.py +0 -10
- loopflow-0.7.2/src/loopflow/lfd/daemon/client.py +0 -111
- loopflow-0.7.2/src/loopflow/lfd/daemon/grpc_server.py +0 -571
- loopflow-0.7.2/src/loopflow/lfd/daemon/http_server.py +0 -1007
- loopflow-0.7.2/src/loopflow/lfd/daemon/launchd.py +0 -283
- loopflow-0.7.2/src/loopflow/lfd/daemon/manager.py +0 -143
- loopflow-0.7.2/src/loopflow/lfd/daemon/metrics.py +0 -19
- loopflow-0.7.2/src/loopflow/lfd/daemon/process.py +0 -12
- loopflow-0.7.2/src/loopflow/lfd/daemon/protocol.py +0 -56
- loopflow-0.7.2/src/loopflow/lfd/daemon/server.py +0 -612
- loopflow-0.7.2/src/loopflow/lfd/daemon/status.py +0 -21
- loopflow-0.7.2/src/loopflow/lfd/db.py +0 -217
- loopflow-0.7.2/src/loopflow/lfd/draft_prs.py +0 -65
- loopflow-0.7.2/src/loopflow/lfd/execution/README.md +0 -141
- loopflow-0.7.2/src/loopflow/lfd/execution/__init__.py +0 -7
- loopflow-0.7.2/src/loopflow/lfd/execution/collector.py +0 -387
- loopflow-0.7.2/src/loopflow/lfd/execution/runner.py +0 -1098
- loopflow-0.7.2/src/loopflow/lfd/execution/worker.py +0 -447
- loopflow-0.7.2/src/loopflow/lfd/flow_run.py +0 -309
- loopflow-0.7.2/src/loopflow/lfd/git_hooks.py +0 -174
- loopflow-0.7.2/src/loopflow/lfd/logging.py +0 -49
- loopflow-0.7.2/src/loopflow/lfd/migrations/README.md +0 -44
- loopflow-0.7.2/src/loopflow/lfd/migrations/__init__.py +0 -0
- loopflow-0.7.2/src/loopflow/lfd/migrations/baseline.py +0 -116
- loopflow-0.7.2/src/loopflow/lfd/migrations/m_2025_01_23_zz_stimulus.py +0 -33
- loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_24_agent_worktree.py +0 -27
- loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_24_nullable_goal_area.py +0 -71
- loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_25_agent_paused.py +0 -17
- loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_26_step_index.py +0 -15
- loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_28_wave_stacking.py +0 -21
- loopflow-0.7.2/src/loopflow/lfd/migrations/m_2026_01_29_stimuli.py +0 -80
- loopflow-0.7.2/src/loopflow/lfd/migrations/registry.py +0 -37
- loopflow-0.7.2/src/loopflow/lfd/models.py +0 -408
- loopflow-0.7.2/src/loopflow/lfd/pr_poller.py +0 -237
- loopflow-0.7.2/src/loopflow/lfd/protocol_v1.py +0 -218
- loopflow-0.7.2/src/loopflow/lfd/step_run.py +0 -208
- loopflow-0.7.2/src/loopflow/lfd/stimulus.py +0 -321
- loopflow-0.7.2/src/loopflow/lfd/wave.py +0 -884
- loopflow-0.7.2/src/loopflow/lfd/worktree_state.py +0 -147
- loopflow-0.7.2/src/loopflow/proto/__init__.py +0 -23
- loopflow-0.7.2/src/loopflow/proto/generate.py +0 -88
- loopflow-0.7.2/src/loopflow/proto/loopflow/__init__.py +0 -0
- loopflow-0.7.2/src/loopflow/proto/loopflow/control/__init__.py +0 -0
- loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/__init__.py +0 -0
- loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2.py +0 -217
- loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2.pyi +0 -1216
- loopflow-0.7.2/src/loopflow/proto/loopflow/control/v1/control_pb2_grpc.py +0 -1202
- loopflow-0.7.2/src/loopflow/proto/loopflow/engine/__init__.py +0 -0
- loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/__init__.py +0 -0
- loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2.py +0 -163
- loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2.pyi +0 -1218
- loopflow-0.7.2/src/loopflow/proto/loopflow/engine/v1/engine_pb2_grpc.py +0 -779
- loopflow-0.7.2/src/loopflow/publish.py +0 -427
- loopflow-0.7.2/src/loopflow/templates/config.yaml +0 -36
- {loopflow-0.7.2/src/loopflow → loopflow-0.8.2/rust/loopflow/src/engine/builtins}/LOOPFLOW.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/ceo.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/designer.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/infra-engineer.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/roles/product-engineer.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/values/craft.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/values/flow.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/directions/values/scale.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/README.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/design-and-ship.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/grind.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/incident.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/pair.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/ship-roadmap.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/ship.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/code/start.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/publish.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/research.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/roadmap-expand.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/roadmap-polish.yaml +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/flows/plan/roadmap-reduce.yaml +0 -0
- /loopflow-0.7.2/src/loopflow/lf/builtins/commit_message.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/commit_message.md +0 -0
- /loopflow-0.7.2/src/loopflow/lf/builtins/pr_message.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/pr_message.md +0 -0
- /loopflow-0.7.2/src/loopflow/lf/builtins/release_notes.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/release_notes.md +0 -0
- /loopflow-0.7.2/src/loopflow/lf/builtins/summarize.txt → /loopflow-0.8.2/rust/loopflow/src/engine/builtins/ops/summarize.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/compress.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/debug.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/gate.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/code/implement.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/interactive/explore.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/interactive/refine.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/add-to-roadmap.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/commit.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/consolidate.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/lint.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/rebase.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/synthesize.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/ops/validate.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/5whys.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/expand.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/ingest.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/iterate.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/kickoff.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/polish.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/reduce.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/review.md +0 -0
- {loopflow-0.7.2/src/loopflow/lf → loopflow-0.8.2/rust/loopflow/src/engine}/builtins/steps/plan/roadmap.md +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
requires: screenshot(s) in area
|
|
3
|
+
produces: roadmap/concerto/<date>-<direction>-<order>-<slug>.md
|
|
4
|
+
interactive: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Review screenshot(s) through the lens of the given direction (persona).
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Review all screenshots with a persona
|
|
13
|
+
lf ux-review --direction conductor --area docs/screenshots/
|
|
14
|
+
|
|
15
|
+
# Review specific screenshot
|
|
16
|
+
lf ux-review --direction conductor --area docs/screenshots/concerto-main.png
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Process
|
|
20
|
+
|
|
21
|
+
For each screenshot in the area:
|
|
22
|
+
1. Read the screenshot
|
|
23
|
+
2. Apply each question from the direction
|
|
24
|
+
3. For each question that the UI fails to answer well, write a backlog item file
|
|
25
|
+
|
|
26
|
+
## Output format
|
|
27
|
+
|
|
28
|
+
For each issue found, write a backlog item file in `roadmap/<wave>/`:
|
|
29
|
+
|
|
30
|
+
- Use `--wave` if provided; otherwise infer from the worktree name.
|
|
31
|
+
- If no wave can be determined, default to `roadmap/concerto/`.
|
|
32
|
+
- Filename: `<date>-<direction>-<order>-<slug>.md`
|
|
33
|
+
- `date`: `YYYYMMDD`
|
|
34
|
+
- `direction`: the persona name
|
|
35
|
+
- `order`: zero-padded sequence number for this run (01, 02, 03...) in the order found
|
|
36
|
+
- `slug`: kebab-case title
|
|
37
|
+
- Keep one issue per file
|
|
38
|
+
- Use the format below
|
|
39
|
+
- After writing files, print an ordered list of filenames with their wave folder
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
---
|
|
43
|
+
status: todo
|
|
44
|
+
phase: 1
|
|
45
|
+
persona: <direction-name>
|
|
46
|
+
screenshot: <screenshot-path>
|
|
47
|
+
order: <order>
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
# <Title>
|
|
51
|
+
|
|
52
|
+
<One-line problem statement>
|
|
53
|
+
|
|
54
|
+
## Current
|
|
55
|
+
<What exists now>
|
|
56
|
+
|
|
57
|
+
## Problem
|
|
58
|
+
<Why it fails the persona question>
|
|
59
|
+
|
|
60
|
+
## Build
|
|
61
|
+
<What to change>
|
|
62
|
+
|
|
63
|
+
## Done when
|
|
64
|
+
<Persona question that should pass>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Guidelines
|
|
68
|
+
|
|
69
|
+
- Be specific about what you see in the screenshot
|
|
70
|
+
- Quote the exact persona question being failed
|
|
71
|
+
- Propose concrete changes, not vague improvements
|
|
72
|
+
- One issue per backlog item file
|
|
73
|
+
- Keep items right-sized: 1–2 concrete improvements, not a grab bag
|
|
74
|
+
- Order matters: use the sequence from this run so ingestion preserves priority
|
|
75
|
+
- Skip questions the UI already handles well
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
requires: roadmap items in persona waves
|
|
3
|
+
produces: roadmap/concerto/<date>-<order>-<slug>.md
|
|
4
|
+
interactive: true
|
|
5
|
+
---
|
|
6
|
+
Synthesize persona wave roadmaps into a single ordered Concerto backlog.
|
|
7
|
+
|
|
8
|
+
## Inputs
|
|
9
|
+
|
|
10
|
+
Read all items from these wave folders (if present):
|
|
11
|
+
- `roadmap/conductor/`
|
|
12
|
+
- `roadmap/improviser/`
|
|
13
|
+
- `roadmap/listener/`
|
|
14
|
+
- `roadmap/product-designer/`
|
|
15
|
+
- `roadmap/ceo/`
|
|
16
|
+
|
|
17
|
+
## Goal
|
|
18
|
+
|
|
19
|
+
Produce a single ordered set of backlog items in `roadmap/concerto/` that:
|
|
20
|
+
- Deduplicates overlapping issues across personas
|
|
21
|
+
- Preserves the most actionable framing
|
|
22
|
+
- Prioritizes by user impact and clarity
|
|
23
|
+
|
|
24
|
+
## Process
|
|
25
|
+
|
|
26
|
+
1. Cluster related items across waves (same problem, different framing).
|
|
27
|
+
2. Pick the strongest framing and concrete Build steps.
|
|
28
|
+
3. Assign an overall order (01, 02, 03...) for the Concerto backlog.
|
|
29
|
+
4. Write one file per item to `roadmap/concerto/`.
|
|
30
|
+
|
|
31
|
+
## Output format
|
|
32
|
+
|
|
33
|
+
Write files with:
|
|
34
|
+
|
|
35
|
+
- Filename: `<date>-<order>-<slug>.md`
|
|
36
|
+
- `date`: `YYYYMMDD`
|
|
37
|
+
- `order`: zero-padded sequence number
|
|
38
|
+
- `slug`: kebab-case title
|
|
39
|
+
|
|
40
|
+
Frontmatter:
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
---
|
|
44
|
+
status: todo
|
|
45
|
+
phase: 1
|
|
46
|
+
persona: concerto
|
|
47
|
+
order: <order>
|
|
48
|
+
sources: [conductor, improviser, listener, product-designer, ceo]
|
|
49
|
+
---
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Body:
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
# <Title>
|
|
56
|
+
|
|
57
|
+
<One-line problem statement>
|
|
58
|
+
|
|
59
|
+
## Current
|
|
60
|
+
<What exists now>
|
|
61
|
+
|
|
62
|
+
## Problem
|
|
63
|
+
<Why it fails across personas>
|
|
64
|
+
|
|
65
|
+
## Build
|
|
66
|
+
<What to change>
|
|
67
|
+
|
|
68
|
+
## Done when
|
|
69
|
+
<Concrete success condition>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Guidelines
|
|
73
|
+
|
|
74
|
+
- One issue per file
|
|
75
|
+
- Keep items right-sized (1–2 concrete improvements)
|
|
76
|
+
- Use the clearest wording from the source waves
|
|
77
|
+
- Prefer outcomes that help multiple personas at once
|
|
78
|
+
- Print an ordered list of filenames at the end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
merge_group:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
rust-test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
15
|
+
- name: Run cargo fmt check
|
|
16
|
+
run: cargo fmt --all -- --check
|
|
17
|
+
- name: Run cargo clippy
|
|
18
|
+
run: cargo clippy --all-targets -- -D warnings
|
|
19
|
+
- name: Run Rust tests
|
|
20
|
+
run: cargo test --all
|
|
21
|
+
|
|
22
|
+
python-test:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
- uses: astral-sh/setup-uv@v4
|
|
27
|
+
- name: Run Python tests
|
|
28
|
+
run: uv run pytest python/tests/
|
|
29
|
+
|
|
30
|
+
e2e-smoke:
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
35
|
+
- name: Run E2E smoke test
|
|
36
|
+
run: tests/e2e/test_smoke.sh
|
|
37
|
+
|
|
38
|
+
swift-test:
|
|
39
|
+
runs-on: macos-15
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
- name: Run Swift tests
|
|
43
|
+
run: swift test --package-path swift
|
|
44
|
+
|
|
45
|
+
concerto-ui-test:
|
|
46
|
+
runs-on: macos-15
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@v4
|
|
49
|
+
- name: Install XcodeGen
|
|
50
|
+
run: brew install xcodegen
|
|
51
|
+
- name: Generate Xcode project
|
|
52
|
+
run: xcodegen generate
|
|
53
|
+
working-directory: swift
|
|
54
|
+
- name: Run Concerto UI tests
|
|
55
|
+
run: xcodebuild test -project LoopflowSwift.xcodeproj -scheme Concerto -destination 'platform=macOS'
|
|
56
|
+
working-directory: swift
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Clear Scratch
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
merge_group:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
clear-scratch:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
with:
|
|
16
|
+
fetch-depth: 0
|
|
17
|
+
|
|
18
|
+
- name: Clear scratch if needed
|
|
19
|
+
env:
|
|
20
|
+
GH_TOKEN: ${{ github.token }}
|
|
21
|
+
run: |
|
|
22
|
+
FILES=$(find scratch -type f ! -name '.gitkeep' 2>/dev/null || true)
|
|
23
|
+
if [ -z "$FILES" ]; then
|
|
24
|
+
echo "scratch/ is already clean"
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
echo "Clearing scratch/..."
|
|
29
|
+
echo "$FILES"
|
|
30
|
+
|
|
31
|
+
# Get the PR branch from merge group ref (format: gh-readonly-queue/main/pr-NUM-SHA)
|
|
32
|
+
PR_NUM=$(echo "${{ github.ref }}" | sed -n 's/.*pr-\([0-9]*\).*/\1/p')
|
|
33
|
+
PR_BRANCH=$(gh pr view "$PR_NUM" --json headRefName -q .headRefName)
|
|
34
|
+
|
|
35
|
+
echo "Pushing cleanup to PR branch: $PR_BRANCH"
|
|
36
|
+
|
|
37
|
+
# Checkout and clean the actual PR branch
|
|
38
|
+
git fetch origin "$PR_BRANCH"
|
|
39
|
+
git checkout "$PR_BRANCH"
|
|
40
|
+
|
|
41
|
+
find scratch -type f ! -name '.gitkeep' -delete
|
|
42
|
+
find scratch -type d -empty -delete 2>/dev/null || true
|
|
43
|
+
mkdir -p scratch
|
|
44
|
+
touch scratch/.gitkeep
|
|
45
|
+
|
|
46
|
+
git config user.name "github-actions[bot]"
|
|
47
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
48
|
+
git add scratch/
|
|
49
|
+
git commit -m "chore: clear scratch"
|
|
50
|
+
git push origin "$PR_BRANCH"
|
|
51
|
+
|
|
52
|
+
echo "Cleanup pushed - merge queue will restart with clean branch"
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
# Build native binaries (GitHub Releases, shell installer)
|
|
10
|
+
build-native:
|
|
11
|
+
strategy:
|
|
12
|
+
matrix:
|
|
13
|
+
include:
|
|
14
|
+
- os: macos-latest
|
|
15
|
+
target: aarch64-apple-darwin
|
|
16
|
+
- os: macos-15-intel
|
|
17
|
+
target: x86_64-apple-darwin
|
|
18
|
+
- os: ubuntu-latest
|
|
19
|
+
target: x86_64-unknown-linux-gnu
|
|
20
|
+
- os: ubuntu-24.04-arm
|
|
21
|
+
target: aarch64-unknown-linux-gnu
|
|
22
|
+
runs-on: ${{ matrix.os }}
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
- name: Set version from tag
|
|
26
|
+
run: sed -i.bak 's/^version = "0.0.0"/version = "'"${GITHUB_REF_NAME#v}"'"/' Cargo.toml && rm Cargo.toml.bak
|
|
27
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
28
|
+
with:
|
|
29
|
+
targets: ${{ matrix.target }}
|
|
30
|
+
- name: Build
|
|
31
|
+
run: cargo build --release --target ${{ matrix.target }} -p loopflow
|
|
32
|
+
- name: Package
|
|
33
|
+
run: |
|
|
34
|
+
cd target/${{ matrix.target }}/release
|
|
35
|
+
tar czf ../../../lf-${{ matrix.target }}.tar.gz lf lfd
|
|
36
|
+
- uses: actions/upload-artifact@v4
|
|
37
|
+
with:
|
|
38
|
+
name: native-${{ matrix.target }}
|
|
39
|
+
path: lf-*.tar.gz
|
|
40
|
+
|
|
41
|
+
# Publish to crates.io
|
|
42
|
+
publish-crates:
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@v4
|
|
46
|
+
- name: Set version from tag
|
|
47
|
+
run: sed -i.bak 's/^version = "0.0.0"/version = "'"${GITHUB_REF_NAME#v}"'"/' Cargo.toml && rm Cargo.toml.bak
|
|
48
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
49
|
+
- name: Publish to crates.io
|
|
50
|
+
run: cargo publish -p loopflow --allow-dirty
|
|
51
|
+
env:
|
|
52
|
+
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
|
53
|
+
|
|
54
|
+
# Publish pure Python package to PyPI
|
|
55
|
+
publish-pypi:
|
|
56
|
+
runs-on: ubuntu-latest
|
|
57
|
+
environment: pypi
|
|
58
|
+
permissions:
|
|
59
|
+
id-token: write
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/checkout@v4
|
|
62
|
+
with:
|
|
63
|
+
fetch-depth: 0
|
|
64
|
+
- uses: astral-sh/setup-uv@v4
|
|
65
|
+
- name: Build package
|
|
66
|
+
run: uv build
|
|
67
|
+
- name: Publish to PyPI
|
|
68
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
69
|
+
with:
|
|
70
|
+
packages-dir: dist/
|
|
71
|
+
|
|
72
|
+
# Create GitHub Release with native binaries
|
|
73
|
+
release:
|
|
74
|
+
needs: build-native
|
|
75
|
+
runs-on: ubuntu-latest
|
|
76
|
+
permissions:
|
|
77
|
+
contents: write
|
|
78
|
+
steps:
|
|
79
|
+
- uses: actions/checkout@v4
|
|
80
|
+
- uses: actions/download-artifact@v4
|
|
81
|
+
with:
|
|
82
|
+
pattern: native-*
|
|
83
|
+
merge-multiple: true
|
|
84
|
+
path: dist/native
|
|
85
|
+
- name: Generate shell installer
|
|
86
|
+
run: |
|
|
87
|
+
cat > dist/install.sh << 'INSTALLER'
|
|
88
|
+
#!/bin/sh
|
|
89
|
+
set -eu
|
|
90
|
+
|
|
91
|
+
REPO="loopflowstudio/loopflow"
|
|
92
|
+
INSTALL_DIR="${LF_INSTALL_DIR:-$HOME/.local/bin}"
|
|
93
|
+
|
|
94
|
+
detect_target() {
|
|
95
|
+
os=$(uname -s)
|
|
96
|
+
arch=$(uname -m)
|
|
97
|
+
case "$os" in
|
|
98
|
+
Darwin)
|
|
99
|
+
case "$arch" in
|
|
100
|
+
arm64|aarch64) echo "aarch64-apple-darwin" ;;
|
|
101
|
+
x86_64) echo "x86_64-apple-darwin" ;;
|
|
102
|
+
*) echo "Unsupported architecture: $arch" >&2; exit 1 ;;
|
|
103
|
+
esac ;;
|
|
104
|
+
Linux)
|
|
105
|
+
case "$arch" in
|
|
106
|
+
aarch64) echo "aarch64-unknown-linux-gnu" ;;
|
|
107
|
+
x86_64) echo "x86_64-unknown-linux-gnu" ;;
|
|
108
|
+
*) echo "Unsupported architecture: $arch" >&2; exit 1 ;;
|
|
109
|
+
esac ;;
|
|
110
|
+
*) echo "Unsupported OS: $os" >&2; exit 1 ;;
|
|
111
|
+
esac
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
main() {
|
|
115
|
+
target=$(detect_target)
|
|
116
|
+
version="${1:-latest}"
|
|
117
|
+
|
|
118
|
+
if [ "$version" = "latest" ]; then
|
|
119
|
+
url="https://github.com/$REPO/releases/latest/download/lf-$target.tar.gz"
|
|
120
|
+
else
|
|
121
|
+
url="https://github.com/$REPO/releases/download/v$version/lf-$target.tar.gz"
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
echo "Installing lf ($target)..."
|
|
125
|
+
mkdir -p "$INSTALL_DIR"
|
|
126
|
+
curl -fsSL "$url" | tar xz -C "$INSTALL_DIR"
|
|
127
|
+
chmod +x "$INSTALL_DIR/lf" "$INSTALL_DIR/lfd"
|
|
128
|
+
echo "Installed to $INSTALL_DIR/lf"
|
|
129
|
+
|
|
130
|
+
case ":$PATH:" in
|
|
131
|
+
*":$INSTALL_DIR:"*) ;;
|
|
132
|
+
*) echo "Add to PATH: export PATH=\"$INSTALL_DIR:\$PATH\"" ;;
|
|
133
|
+
esac
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
main "$@"
|
|
137
|
+
INSTALLER
|
|
138
|
+
- name: Create GitHub Release
|
|
139
|
+
uses: softprops/action-gh-release@v2
|
|
140
|
+
with:
|
|
141
|
+
generate_release_notes: true
|
|
142
|
+
files: |
|
|
143
|
+
dist/native/*.tar.gz
|
|
144
|
+
dist/install.sh
|
|
@@ -7,13 +7,16 @@ __pycache__/
|
|
|
7
7
|
xcuserdata/
|
|
8
8
|
.swiftpm/xcode/
|
|
9
9
|
swift/*.xcodeproj/
|
|
10
|
+
dist/
|
|
10
11
|
swift/dist/
|
|
11
12
|
|
|
12
13
|
# Claude Code (personal state)
|
|
13
14
|
.claude/settings.local.json
|
|
14
15
|
|
|
15
|
-
# Loopflow (generated
|
|
16
|
+
# Loopflow (generated)
|
|
17
|
+
.lf/log/
|
|
16
18
|
.lf/summaries/
|
|
17
19
|
*.profraw
|
|
20
|
+
*.actual.md
|
|
18
21
|
.DS_Store
|
|
19
22
|
target/
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
Create a reference summary of this content for LLM context.
|
|
2
|
+
|
|
3
|
+
**OUTPUT BUDGET:** ~{token_budget} tokens. Use most of it—this is a budget to spend, not a limit to avoid.
|
|
4
|
+
|
|
5
|
+
## What to Include
|
|
6
|
+
|
|
7
|
+
**For code:**
|
|
8
|
+
- Data structures with full type annotations
|
|
9
|
+
- Public function signatures AND their docstrings (include the docstring text)
|
|
10
|
+
- Key constants, enums, and configuration schemas
|
|
11
|
+
- Entry points and CLI commands with usage examples
|
|
12
|
+
|
|
13
|
+
**For documentation:**
|
|
14
|
+
- Key concepts and definitions
|
|
15
|
+
- Commands, APIs, and their usage examples
|
|
16
|
+
- Configuration options and their effects
|
|
17
|
+
|
|
18
|
+
**Style:**
|
|
19
|
+
- Quote directly rather than paraphrase when the original is clear
|
|
20
|
+
- Consolidate related definitions together
|
|
21
|
+
- Preserve exact names, paths, commands, and terminology
|
|
22
|
+
- Code blocks for anything that looks like code
|
|
23
|
+
- Dense markdown, organized by topic/module
|
|
24
|
+
|
|
25
|
+
**Priority when budget is tight:**
|
|
26
|
+
1. Type definitions and schemas
|
|
27
|
+
2. Public APIs with docstrings
|
|
28
|
+
3. CLI usage examples
|
|
29
|
+
4. Implementation patterns
|
|
30
|
+
|
|
31
|
+
<source>
|
|
32
|
+
{content}
|
|
33
|
+
</source>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
agent_model: claude:opus
|
|
2
|
+
yolo: true
|
|
3
|
+
chrome: true
|
|
4
|
+
|
|
5
|
+
skill_sources:
|
|
6
|
+
- name: superpowers
|
|
7
|
+
prefix: sp
|
|
8
|
+
path: ~/.superpowers
|
|
9
|
+
exclude:
|
|
10
|
+
- uv.lock
|
|
11
|
+
push: true
|
|
12
|
+
|
|
13
|
+
summary_tokens: 25000
|
|
14
|
+
|
|
15
|
+
summaries:
|
|
16
|
+
- path: .
|
|
17
|
+
model: claude:sonnet
|
|
18
|
+
|
|
19
|
+
branch_names:
|
|
20
|
+
schema: "{user}.{name}.{ts}"
|
|
21
|
+
|
|
22
|
+
internal:
|
|
23
|
+
use_rust: true
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Managing multiple parallel workstreams. Checking in, not diving deep.
|
|
2
|
+
|
|
3
|
+
- Can I see what needs attention without drilling in?
|
|
4
|
+
- Is urgency visually obvious?
|
|
5
|
+
- How many clicks from "I see a problem" to "I'm acting on it"?
|
|
6
|
+
- Would I trust this to surface the right thing while I'm away?
|
|
7
|
+
- Do routine actions feel like single actions or workflows?
|
|
8
|
+
- Am I confirming things I already decided?
|
|
9
|
+
|
|
10
|
+
Red flags:
|
|
11
|
+
- Flat lists with no hierarchy
|
|
12
|
+
- Status requires interaction to reveal
|
|
13
|
+
- Confirmation dialogs for routine operations
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Exploring unfamiliar territory. Doesn't know the right approach yet.
|
|
2
|
+
|
|
3
|
+
- How fast from intent to action?
|
|
4
|
+
- Am I configuring things I don't care about yet?
|
|
5
|
+
- Can I do one thing without committing to a sequence?
|
|
6
|
+
- Does this feel like a workshop or a form?
|
|
7
|
+
- If I change my mind, is that cheap?
|
|
8
|
+
- Am I exploring or filling out paperwork?
|
|
9
|
+
|
|
10
|
+
Red flags:
|
|
11
|
+
- Setup wizards before first action
|
|
12
|
+
- Required fields for optional concepts
|
|
13
|
+
- Changing course requires starting over
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Checking in, not coding. Needs to understand what happened and what matters next.
|
|
2
|
+
|
|
3
|
+
- Can I tell what happened while I was gone?
|
|
4
|
+
- Is "needs me" vs "fine" instant to distinguish?
|
|
5
|
+
- Do I have to click into each item to understand state?
|
|
6
|
+
- Is there a summary or must I reconstruct context?
|
|
7
|
+
- Can I triage N items in a few minutes without opening details?
|
|
8
|
+
|
|
9
|
+
Red flags:
|
|
10
|
+
- No history/timeline visible
|
|
11
|
+
- State only visible after navigation
|
|
12
|
+
- No clear explanation of why something is blocked
|
|
13
|
+
- Requires taking action before understanding
|