flowfield-core 0.1.0__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.
- flowfield_core-0.1.0/.github/ISSUE_TEMPLATE/bug.yml +42 -0
- flowfield_core-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- flowfield_core-0.1.0/.github/ISSUE_TEMPLATE/feature.yml +26 -0
- flowfield_core-0.1.0/.github/workflows/tests.yml +116 -0
- flowfield_core-0.1.0/.github/workflows/workflow.yml +145 -0
- flowfield_core-0.1.0/.gitignore +22 -0
- flowfield_core-0.1.0/CHANGELOG.md +32 -0
- flowfield_core-0.1.0/CONTRIBUTING.md +162 -0
- flowfield_core-0.1.0/LICENSE +201 -0
- flowfield_core-0.1.0/Makefile +43 -0
- flowfield_core-0.1.0/PKG-INFO +85 -0
- flowfield_core-0.1.0/README.md +64 -0
- flowfield_core-0.1.0/docs/cli.mdx +131 -0
- flowfield_core-0.1.0/docs/concepts.mdx +72 -0
- flowfield_core-0.1.0/docs/docs.json +16 -0
- flowfield_core-0.1.0/docs/getting-started.mdx +83 -0
- flowfield_core-0.1.0/docs/images/board-overview.png +0 -0
- flowfield_core-0.1.0/docs/images/overview.png +0 -0
- flowfield_core-0.1.0/docs/installation.mdx +88 -0
- flowfield_core-0.1.0/docs/integrations/codex.mdx +60 -0
- flowfield_core-0.1.0/docs/integrations/overview.mdx +32 -0
- flowfield_core-0.1.0/docs/package.json +7 -0
- flowfield_core-0.1.0/docs/pnpm-lock.yaml +8198 -0
- flowfield_core-0.1.0/docs/pnpm-workspace.yaml +14 -0
- flowfield_core-0.1.0/docs/storage.mdx +71 -0
- flowfield_core-0.1.0/examples/harbor/.gitignore +2 -0
- flowfield_core-0.1.0/examples/harbor/README.md +7 -0
- flowfield_core-0.1.0/examples/harbor/harbor.py +15 -0
- flowfield_core-0.1.0/examples/harbor/sample.json +4 -0
- flowfield_core-0.1.0/examples/harbor/tests/test_cli.py +15 -0
- flowfield_core-0.1.0/hatch_build.py +36 -0
- flowfield_core-0.1.0/pyproject.toml +65 -0
- flowfield_core-0.1.0/scripts/check-install.py +336 -0
- flowfield_core-0.1.0/scripts/check_dist.py +116 -0
- flowfield_core-0.1.0/scripts/create-demo.py +205 -0
- flowfield_core-0.1.0/scripts/create-integration-demo.py +188 -0
- flowfield_core-0.1.0/scripts/create-review-demo.py +200 -0
- flowfield_core-0.1.0/scripts/generate-api-types.py +42 -0
- flowfield_core-0.1.0/scripts/release.py +231 -0
- flowfield_core-0.1.0/scripts/serve-ui-demo.py +477 -0
- flowfield_core-0.1.0/src/flowfield/__init__.py +5 -0
- flowfield_core-0.1.0/src/flowfield/__main__.py +3 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/CodeDiff-a_9JU8OX.js +18 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/CodeDiff-legcy4jI.css +1 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/index-BvxlSzP9.css +2 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/index-Bw_suLer.js +100 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/react-remove-scroll-bar-license.txt +21 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/shadcn-license.txt +21 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/tailwindcss-license.txt +21 -0
- flowfield_core-0.1.0/src/flowfield/_web/assets/third-party-licenses.md +3471 -0
- flowfield_core-0.1.0/src/flowfield/_web/index.html +14 -0
- flowfield_core-0.1.0/src/flowfield/activity.py +78 -0
- flowfield_core-0.1.0/src/flowfield/activity_text.py +37 -0
- flowfield_core-0.1.0/src/flowfield/actors.py +34 -0
- flowfield_core-0.1.0/src/flowfield/adapters/README.md +24 -0
- flowfield_core-0.1.0/src/flowfield/adapters/activity_diff.py +36 -0
- flowfield_core-0.1.0/src/flowfield/adapters/codex_activity.py +84 -0
- flowfield_core-0.1.0/src/flowfield/adapters/codex_connection.py +186 -0
- flowfield_core-0.1.0/src/flowfield/adapters/codex_environment.py +140 -0
- flowfield_core-0.1.0/src/flowfield/adapters/codex_worker.py +431 -0
- flowfield_core-0.1.0/src/flowfield/adapters/git_checkout.py +216 -0
- flowfield_core-0.1.0/src/flowfield/adapters/git_integration.py +211 -0
- flowfield_core-0.1.0/src/flowfield/adapters/git_review.py +122 -0
- flowfield_core-0.1.0/src/flowfield/adapters/inspection_launcher.py +26 -0
- flowfield_core-0.1.0/src/flowfield/adapters/local_environment.py +262 -0
- flowfield_core-0.1.0/src/flowfield/adapters/toolchain.py +74 -0
- flowfield_core-0.1.0/src/flowfield/api.py +284 -0
- flowfield_core-0.1.0/src/flowfield/application.py +1606 -0
- flowfield_core-0.1.0/src/flowfield/attention.py +217 -0
- flowfield_core-0.1.0/src/flowfield/browser.py +268 -0
- flowfield_core-0.1.0/src/flowfield/changes.py +41 -0
- flowfield_core-0.1.0/src/flowfield/cli.py +1628 -0
- flowfield_core-0.1.0/src/flowfield/client.py +51 -0
- flowfield_core-0.1.0/src/flowfield/context_api.py +174 -0
- flowfield_core-0.1.0/src/flowfield/conversation.py +310 -0
- flowfield_core-0.1.0/src/flowfield/conversation_api.py +160 -0
- flowfield_core-0.1.0/src/flowfield/environment_models.py +86 -0
- flowfield_core-0.1.0/src/flowfield/errors.py +9 -0
- flowfield_core-0.1.0/src/flowfield/execution.py +934 -0
- flowfield_core-0.1.0/src/flowfield/execution_api.py +116 -0
- flowfield_core-0.1.0/src/flowfield/execution_cli.py +308 -0
- flowfield_core-0.1.0/src/flowfield/execution_history.py +174 -0
- flowfield_core-0.1.0/src/flowfield/execution_mcp.py +285 -0
- flowfield_core-0.1.0/src/flowfield/execution_models.py +195 -0
- flowfield_core-0.1.0/src/flowfield/guidance.py +474 -0
- flowfield_core-0.1.0/src/flowfield/input_delivery.py +183 -0
- flowfield_core-0.1.0/src/flowfield/inspection.py +203 -0
- flowfield_core-0.1.0/src/flowfield/inspection_api.py +40 -0
- flowfield_core-0.1.0/src/flowfield/inspection_models.py +64 -0
- flowfield_core-0.1.0/src/flowfield/integration.py +559 -0
- flowfield_core-0.1.0/src/flowfield/integration_api.py +95 -0
- flowfield_core-0.1.0/src/flowfield/integration_cli.py +170 -0
- flowfield_core-0.1.0/src/flowfield/integration_models.py +113 -0
- flowfield_core-0.1.0/src/flowfield/mcp.py +671 -0
- flowfield_core-0.1.0/src/flowfield/migrations.py +53 -0
- flowfield_core-0.1.0/src/flowfield/notification_api.py +121 -0
- flowfield_core-0.1.0/src/flowfield/notifications.py +219 -0
- flowfield_core-0.1.0/src/flowfield/project_config.py +80 -0
- flowfield_core-0.1.0/src/flowfield/publication.py +112 -0
- flowfield_core-0.1.0/src/flowfield/question_api.py +74 -0
- flowfield_core-0.1.0/src/flowfield/questions.py +683 -0
- flowfield_core-0.1.0/src/flowfield/reads.py +878 -0
- flowfield_core-0.1.0/src/flowfield/replies.py +282 -0
- flowfield_core-0.1.0/src/flowfield/reply_models.py +45 -0
- flowfield_core-0.1.0/src/flowfield/result_actions.py +220 -0
- flowfield_core-0.1.0/src/flowfield/result_api.py +91 -0
- flowfield_core-0.1.0/src/flowfield/result_brief.py +67 -0
- flowfield_core-0.1.0/src/flowfield/result_models.py +103 -0
- flowfield_core-0.1.0/src/flowfield/results.py +614 -0
- flowfield_core-0.1.0/src/flowfield/review_models.py +33 -0
- flowfield_core-0.1.0/src/flowfield/run_activity.py +174 -0
- flowfield_core-0.1.0/src/flowfield/search.py +247 -0
- flowfield_core-0.1.0/src/flowfield/setup_validation.py +274 -0
- flowfield_core-0.1.0/src/flowfield/stage_models.py +59 -0
- flowfield_core-0.1.0/src/flowfield/stage_view.py +43 -0
- flowfield_core-0.1.0/src/flowfield/stages.py +137 -0
- flowfield_core-0.1.0/src/flowfield/state.py +10 -0
- flowfield_core-0.1.0/src/flowfield/storage.py +469 -0
- flowfield_core-0.1.0/src/flowfield/storage_cli.py +85 -0
- flowfield_core-0.1.0/src/flowfield/supervisor.py +794 -0
- flowfield_core-0.1.0/src/flowfield/templates/agents-section.md +22 -0
- flowfield_core-0.1.0/src/flowfield/templates/flowfield-coordinator/SKILL.md +145 -0
- flowfield_core-0.1.0/src/flowfield/templates/mcp-instructions.md +29 -0
- flowfield_core-0.1.0/src/flowfield/thread_view.py +237 -0
- flowfield_core-0.1.0/src/flowfield/update_cli.py +76 -0
- flowfield_core-0.1.0/src/flowfield/updates.py +290 -0
- flowfield_core-0.1.0/src/flowfield/work_state.py +182 -0
- flowfield_core-0.1.0/src/flowfield/worker_context.py +207 -0
- flowfield_core-0.1.0/tests/activity_browser_fixture.py +131 -0
- flowfield_core-0.1.0/tests/conftest.py +8 -0
- flowfield_core-0.1.0/tests/fake_codex.py +30 -0
- flowfield_core-0.1.0/tests/fixtures/schema_29.sql +138 -0
- flowfield_core-0.1.0/tests/input_browser_fixture.py +55 -0
- flowfield_core-0.1.0/tests/inspection_browser_fixture.py +79 -0
- flowfield_core-0.1.0/tests/notification_browser_fixture.py +17 -0
- flowfield_core-0.1.0/tests/outcome_browser_fixture.py +87 -0
- flowfield_core-0.1.0/tests/project_fixtures.py +15 -0
- flowfield_core-0.1.0/tests/test_activity.py +227 -0
- flowfield_core-0.1.0/tests/test_activity_display.py +124 -0
- flowfield_core-0.1.0/tests/test_api.py +41 -0
- flowfield_core-0.1.0/tests/test_attention.py +121 -0
- flowfield_core-0.1.0/tests/test_browser_reads.py +142 -0
- flowfield_core-0.1.0/tests/test_changes.py +48 -0
- flowfield_core-0.1.0/tests/test_checkout_delivery.py +177 -0
- flowfield_core-0.1.0/tests/test_cli.py +108 -0
- flowfield_core-0.1.0/tests/test_codex_connection.py +131 -0
- flowfield_core-0.1.0/tests/test_codex_worker.py +120 -0
- flowfield_core-0.1.0/tests/test_connection.py +353 -0
- flowfield_core-0.1.0/tests/test_context_reads.py +214 -0
- flowfield_core-0.1.0/tests/test_conversation.py +487 -0
- flowfield_core-0.1.0/tests/test_dependencies.py +242 -0
- flowfield_core-0.1.0/tests/test_execution.py +315 -0
- flowfield_core-0.1.0/tests/test_execution_history.py +61 -0
- flowfield_core-0.1.0/tests/test_feed_presentation.py +107 -0
- flowfield_core-0.1.0/tests/test_git_review.py +196 -0
- flowfield_core-0.1.0/tests/test_guidance.py +298 -0
- flowfield_core-0.1.0/tests/test_handoff.py +129 -0
- flowfield_core-0.1.0/tests/test_input_continuation.py +355 -0
- flowfield_core-0.1.0/tests/test_inspection.py +544 -0
- flowfield_core-0.1.0/tests/test_integration.py +476 -0
- flowfield_core-0.1.0/tests/test_local_environment.py +159 -0
- flowfield_core-0.1.0/tests/test_milestone_keys.py +65 -0
- flowfield_core-0.1.0/tests/test_notifications.py +174 -0
- flowfield_core-0.1.0/tests/test_outcomes.py +212 -0
- flowfield_core-0.1.0/tests/test_parallel_recovery.py +210 -0
- flowfield_core-0.1.0/tests/test_project_setup.py +172 -0
- flowfield_core-0.1.0/tests/test_publication.py +325 -0
- flowfield_core-0.1.0/tests/test_questions.py +462 -0
- flowfield_core-0.1.0/tests/test_release.py +208 -0
- flowfield_core-0.1.0/tests/test_replies.py +380 -0
- flowfield_core-0.1.0/tests/test_result_recovery.py +357 -0
- flowfield_core-0.1.0/tests/test_results.py +348 -0
- flowfield_core-0.1.0/tests/test_run_activity.py +155 -0
- flowfield_core-0.1.0/tests/test_search.py +185 -0
- flowfield_core-0.1.0/tests/test_setup_validation.py +286 -0
- flowfield_core-0.1.0/tests/test_stage_view.py +72 -0
- flowfield_core-0.1.0/tests/test_state_policy.py +23 -0
- flowfield_core-0.1.0/tests/test_storage_migrations.py +422 -0
- flowfield_core-0.1.0/tests/test_supervisor.py +345 -0
- flowfield_core-0.1.0/tests/test_task_keys.py +157 -0
- flowfield_core-0.1.0/tests/test_task_preparation.py +193 -0
- flowfield_core-0.1.0/tests/test_updates.py +238 -0
- flowfield_core-0.1.0/tests/test_worker_bridge.py +43 -0
- flowfield_core-0.1.0/tests/test_workflow.py +391 -0
- flowfield_core-0.1.0/uv.lock +1013 -0
- flowfield_core-0.1.0/web/.prettierignore +4 -0
- flowfield_core-0.1.0/web/THIRD_PARTY.md +18 -0
- flowfield_core-0.1.0/web/components.json +21 -0
- flowfield_core-0.1.0/web/e2e/server.mjs +44 -0
- flowfield_core-0.1.0/web/e2e/smoke.spec.ts +5868 -0
- flowfield_core-0.1.0/web/eslint.config.js +15 -0
- flowfield_core-0.1.0/web/index.html +13 -0
- flowfield_core-0.1.0/web/package.json +50 -0
- flowfield_core-0.1.0/web/playwright.config.ts +29 -0
- flowfield_core-0.1.0/web/pnpm-lock.yaml +5125 -0
- flowfield_core-0.1.0/web/pnpm-workspace.yaml +1 -0
- flowfield_core-0.1.0/web/public/assets/react-remove-scroll-bar-license.txt +21 -0
- flowfield_core-0.1.0/web/public/assets/shadcn-license.txt +21 -0
- flowfield_core-0.1.0/web/public/assets/tailwindcss-license.txt +21 -0
- flowfield_core-0.1.0/web/src/Activity.tsx +47 -0
- flowfield_core-0.1.0/web/src/App.tsx +1143 -0
- flowfield_core-0.1.0/web/src/AttentionBoard.tsx +179 -0
- flowfield_core-0.1.0/web/src/AttentionCard.tsx +45 -0
- flowfield_core-0.1.0/web/src/BrowserNotices.tsx +59 -0
- flowfield_core-0.1.0/web/src/CodeDiff.tsx +318 -0
- flowfield_core-0.1.0/web/src/ConfirmButton.tsx +80 -0
- flowfield_core-0.1.0/web/src/Decisions.tsx +377 -0
- flowfield_core-0.1.0/web/src/DetailLayout.tsx +154 -0
- flowfield_core-0.1.0/web/src/DiscardChangesDialog.tsx +56 -0
- flowfield_core-0.1.0/web/src/EntityOverlay.tsx +126 -0
- flowfield_core-0.1.0/web/src/Inbox.tsx +582 -0
- flowfield_core-0.1.0/web/src/Inspection.tsx +185 -0
- flowfield_core-0.1.0/web/src/Integration.tsx +553 -0
- flowfield_core-0.1.0/web/src/Markdown.tsx +135 -0
- flowfield_core-0.1.0/web/src/MilestoneBadge.tsx +39 -0
- flowfield_core-0.1.0/web/src/MilestoneEditor.tsx +135 -0
- flowfield_core-0.1.0/web/src/Milestones.tsx +70 -0
- flowfield_core-0.1.0/web/src/NewTask.tsx +138 -0
- flowfield_core-0.1.0/web/src/Notifications.tsx +381 -0
- flowfield_core-0.1.0/web/src/Presentation.tsx +210 -0
- flowfield_core-0.1.0/web/src/ProjectEditor.tsx +223 -0
- flowfield_core-0.1.0/web/src/ProjectGuidance.tsx +151 -0
- flowfield_core-0.1.0/web/src/ProjectNameLink.tsx +37 -0
- flowfield_core-0.1.0/web/src/QuestionLink.tsx +47 -0
- flowfield_core-0.1.0/web/src/Result.tsx +446 -0
- flowfield_core-0.1.0/web/src/ReviewChecks.tsx +104 -0
- flowfield_core-0.1.0/web/src/RunActivity.tsx +180 -0
- flowfield_core-0.1.0/web/src/Runs.tsx +305 -0
- flowfield_core-0.1.0/web/src/SetupInstructions.tsx +53 -0
- flowfield_core-0.1.0/web/src/StageSequence.tsx +44 -0
- flowfield_core-0.1.0/web/src/TaskActions.tsx +138 -0
- flowfield_core-0.1.0/web/src/TaskChanges.tsx +108 -0
- flowfield_core-0.1.0/web/src/TaskConversation.tsx +875 -0
- flowfield_core-0.1.0/web/src/TaskDetail.tsx +192 -0
- flowfield_core-0.1.0/web/src/TaskLinks.tsx +47 -0
- flowfield_core-0.1.0/web/src/TaskNeeds.tsx +126 -0
- flowfield_core-0.1.0/web/src/TaskPriority.tsx +37 -0
- flowfield_core-0.1.0/web/src/Timestamp.tsx +61 -0
- flowfield_core-0.1.0/web/src/TooltipLink.tsx +26 -0
- flowfield_core-0.1.0/web/src/UsageSummary.tsx +25 -0
- flowfield_core-0.1.0/web/src/WorkState.tsx +50 -0
- flowfield_core-0.1.0/web/src/Workers.tsx +309 -0
- flowfield_core-0.1.0/web/src/WorkspaceLink.tsx +17 -0
- flowfield_core-0.1.0/web/src/api-schema.ts +8135 -0
- flowfield_core-0.1.0/web/src/components/ui/LICENSE.md +21 -0
- flowfield_core-0.1.0/web/src/components/ui/README.md +17 -0
- flowfield_core-0.1.0/web/src/components/ui/alert.tsx +65 -0
- flowfield_core-0.1.0/web/src/components/ui/badge.tsx +47 -0
- flowfield_core-0.1.0/web/src/components/ui/button.tsx +63 -0
- flowfield_core-0.1.0/web/src/components/ui/card.tsx +91 -0
- flowfield_core-0.1.0/web/src/components/ui/dialog.tsx +158 -0
- flowfield_core-0.1.0/web/src/components/ui/input.tsx +20 -0
- flowfield_core-0.1.0/web/src/components/ui/label.tsx +21 -0
- flowfield_core-0.1.0/web/src/components/ui/native-select.tsx +61 -0
- flowfield_core-0.1.0/web/src/components/ui/separator.tsx +25 -0
- flowfield_core-0.1.0/web/src/components/ui/sheet.tsx +142 -0
- flowfield_core-0.1.0/web/src/components/ui/sidebar.tsx +722 -0
- flowfield_core-0.1.0/web/src/components/ui/skeleton.tsx +13 -0
- flowfield_core-0.1.0/web/src/components/ui/tabs.tsx +88 -0
- flowfield_core-0.1.0/web/src/components/ui/textarea.tsx +17 -0
- flowfield_core-0.1.0/web/src/components/ui/tooltip.tsx +56 -0
- flowfield_core-0.1.0/web/src/detail-layout.css +366 -0
- flowfield_core-0.1.0/web/src/hooks/use-mobile.ts +14 -0
- flowfield_core-0.1.0/web/src/main.tsx +30 -0
- flowfield_core-0.1.0/web/src/navigation.ts +217 -0
- flowfield_core-0.1.0/web/src/style.css +1362 -0
- flowfield_core-0.1.0/web/src/theme.css +81 -0
- flowfield_core-0.1.0/web/src/useFeedScroll.ts +144 -0
- flowfield_core-0.1.0/web/src/useInspectionSettings.ts +51 -0
- flowfield_core-0.1.0/web/src/useRecordEditor.tsx +152 -0
- flowfield_core-0.1.0/web/src/useResource.ts +93 -0
- flowfield_core-0.1.0/web/src/workspace.ts +77 -0
- flowfield_core-0.1.0/web/tsconfig.json +21 -0
- flowfield_core-0.1.0/web/vite.config.ts +19 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a problem with Flowfield.
|
|
3
|
+
labels: [bug]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Search existing issues first. Remove secrets and private project content from anything you share.
|
|
9
|
+
For a security vulnerability, use [private reporting](https://github.com/flowfield-sh/flowfield-core/security/advisories/new).
|
|
10
|
+
- type: input
|
|
11
|
+
id: version
|
|
12
|
+
attributes:
|
|
13
|
+
label: Flowfield version
|
|
14
|
+
description: Run `flowfield --version`.
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: input
|
|
18
|
+
id: environment
|
|
19
|
+
attributes:
|
|
20
|
+
label: Environment
|
|
21
|
+
description: Operating system, Python version, and installation method (uv, pip, or source).
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: reproduction
|
|
26
|
+
attributes:
|
|
27
|
+
label: Steps to reproduce
|
|
28
|
+
description: Give the smallest example that reproduces the problem.
|
|
29
|
+
validations:
|
|
30
|
+
required: true
|
|
31
|
+
- type: textarea
|
|
32
|
+
id: behavior
|
|
33
|
+
attributes:
|
|
34
|
+
label: Expected and actual behavior
|
|
35
|
+
description: What did you expect, and what happened instead?
|
|
36
|
+
validations:
|
|
37
|
+
required: true
|
|
38
|
+
- type: textarea
|
|
39
|
+
id: evidence
|
|
40
|
+
attributes:
|
|
41
|
+
label: Logs or screenshots
|
|
42
|
+
description: Optional supporting evidence, with secrets and private content removed.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: true
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Getting Started
|
|
4
|
+
url: https://github.com/flowfield-sh/flowfield-core/blob/main/docs/getting-started.mdx
|
|
5
|
+
about: Install Flowfield, connect your coding agent, and review a task.
|
|
6
|
+
- name: Report a security vulnerability
|
|
7
|
+
url: https://github.com/flowfield-sh/flowfield-core/security/advisories/new
|
|
8
|
+
about: Send a private report to the maintainers.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Describe an outcome Flowfield could help you achieve.
|
|
3
|
+
labels: [enhancement]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: Search existing issues first. Keep examples free of secrets and private project content.
|
|
8
|
+
- type: textarea
|
|
9
|
+
id: problem
|
|
10
|
+
attributes:
|
|
11
|
+
label: Problem
|
|
12
|
+
description: What are you trying to do, and what gets in the way?
|
|
13
|
+
validations:
|
|
14
|
+
required: true
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: outcome
|
|
17
|
+
attributes:
|
|
18
|
+
label: Desired outcome
|
|
19
|
+
description: What would a useful result look like?
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: ideas
|
|
24
|
+
attributes:
|
|
25
|
+
label: Ideas or alternatives
|
|
26
|
+
description: Optional approaches or workarounds you have considered.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
workflow_call:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: tests-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
env:
|
|
19
|
+
FLOWFIELD_UPDATE_CHECKS: '0'
|
|
20
|
+
UV_NO_SYNC: '1'
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
backend:
|
|
24
|
+
name: Python 3.12 / ${{ matrix.os }}
|
|
25
|
+
runs-on: ${{ matrix.os }}
|
|
26
|
+
timeout-minutes: 20
|
|
27
|
+
strategy:
|
|
28
|
+
fail-fast: false
|
|
29
|
+
matrix:
|
|
30
|
+
os: [ubuntu-24.04, macos-15]
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
33
|
+
with:
|
|
34
|
+
persist-credentials: false
|
|
35
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
36
|
+
with:
|
|
37
|
+
version: '0.9.26'
|
|
38
|
+
python-version: '3.12'
|
|
39
|
+
enable-cache: true
|
|
40
|
+
- run: uv sync --locked
|
|
41
|
+
- run: uv run --no-sync pytest
|
|
42
|
+
|
|
43
|
+
quality:
|
|
44
|
+
name: Quality, docs and installed packages
|
|
45
|
+
runs-on: ubuntu-24.04
|
|
46
|
+
timeout-minutes: 20
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
49
|
+
with:
|
|
50
|
+
persist-credentials: false
|
|
51
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
52
|
+
with:
|
|
53
|
+
version: '0.9.26'
|
|
54
|
+
python-version: '3.12'
|
|
55
|
+
enable-cache: true
|
|
56
|
+
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
|
|
57
|
+
with:
|
|
58
|
+
node-version: '24'
|
|
59
|
+
- uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
|
|
60
|
+
with:
|
|
61
|
+
version: '11.19.0'
|
|
62
|
+
- run: make setup
|
|
63
|
+
- name: Python quality and API contract
|
|
64
|
+
run: |
|
|
65
|
+
uv run --no-sync ruff format --check .
|
|
66
|
+
uv run --no-sync ruff check .
|
|
67
|
+
uv run --no-sync mypy
|
|
68
|
+
uv run --no-sync python scripts/generate-api-types.py --check
|
|
69
|
+
- run: pnpm --dir web check
|
|
70
|
+
- run: make docs
|
|
71
|
+
- run: make build check-dist
|
|
72
|
+
- run: uv publish --dry-run --trusted-publishing never dist/*.whl dist/*.tar.gz
|
|
73
|
+
|
|
74
|
+
browser:
|
|
75
|
+
name: Chromium journeys
|
|
76
|
+
runs-on: ubuntu-24.04
|
|
77
|
+
timeout-minutes: 15
|
|
78
|
+
steps:
|
|
79
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
80
|
+
with:
|
|
81
|
+
persist-credentials: false
|
|
82
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
83
|
+
with:
|
|
84
|
+
version: '0.9.26'
|
|
85
|
+
python-version: '3.12'
|
|
86
|
+
enable-cache: true
|
|
87
|
+
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
|
|
88
|
+
with:
|
|
89
|
+
node-version: '24'
|
|
90
|
+
- uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
|
|
91
|
+
with:
|
|
92
|
+
version: '11.19.0'
|
|
93
|
+
- run: uv sync --locked
|
|
94
|
+
- run: pnpm --dir web install --frozen-lockfile
|
|
95
|
+
- run: pnpm --dir web exec playwright install --with-deps chromium
|
|
96
|
+
- run: make smoke
|
|
97
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
98
|
+
if: failure()
|
|
99
|
+
with:
|
|
100
|
+
name: browser-failures
|
|
101
|
+
path: web/test-results/
|
|
102
|
+
retention-days: 7
|
|
103
|
+
|
|
104
|
+
checked:
|
|
105
|
+
name: All checks passed
|
|
106
|
+
if: always()
|
|
107
|
+
needs: [backend, quality, browser]
|
|
108
|
+
runs-on: ubuntu-24.04
|
|
109
|
+
timeout-minutes: 2
|
|
110
|
+
steps:
|
|
111
|
+
- name: Require every check
|
|
112
|
+
env:
|
|
113
|
+
BACKEND: ${{ needs.backend.result }}
|
|
114
|
+
QUALITY: ${{ needs.quality.result }}
|
|
115
|
+
BROWSER: ${{ needs.browser.result }}
|
|
116
|
+
run: test "$BACKEND" = success && test "$QUALITY" = success && test "$BROWSER" = success
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ['v*']
|
|
6
|
+
# Manual runs on main rehearse the exact release artifacts without publishing.
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: release-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: false
|
|
15
|
+
|
|
16
|
+
env:
|
|
17
|
+
FLOWFIELD_UPDATE_CHECKS: '0'
|
|
18
|
+
UV_NO_SYNC: '1'
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
checks:
|
|
22
|
+
uses: ./.github/workflows/tests.yml
|
|
23
|
+
|
|
24
|
+
build:
|
|
25
|
+
needs: checks
|
|
26
|
+
runs-on: ubuntu-24.04
|
|
27
|
+
timeout-minutes: 15
|
|
28
|
+
outputs:
|
|
29
|
+
version: ${{ steps.identity.outputs.version }}
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
32
|
+
with:
|
|
33
|
+
fetch-depth: 0
|
|
34
|
+
persist-credentials: false
|
|
35
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
36
|
+
with:
|
|
37
|
+
version: '0.9.26'
|
|
38
|
+
python-version: '3.12'
|
|
39
|
+
- run: uv sync --locked
|
|
40
|
+
- name: Verify release identity and reviewed notes
|
|
41
|
+
id: identity
|
|
42
|
+
run: uv run --no-sync python scripts/release.py --check-ci
|
|
43
|
+
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
|
|
44
|
+
with:
|
|
45
|
+
node-version: '24'
|
|
46
|
+
- uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
|
|
47
|
+
with:
|
|
48
|
+
version: '11.19.0'
|
|
49
|
+
- run: pnpm --dir web install --frozen-lockfile
|
|
50
|
+
- run: make build
|
|
51
|
+
- run: uv publish --dry-run --trusted-publishing never dist/*.whl dist/*.tar.gz
|
|
52
|
+
- name: Record distribution checksums
|
|
53
|
+
working-directory: dist
|
|
54
|
+
run: shasum -a 256 ./*.whl ./*.tar.gz > ../SHA256SUMS
|
|
55
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
56
|
+
with:
|
|
57
|
+
name: release-assets
|
|
58
|
+
path: |
|
|
59
|
+
dist/*.whl
|
|
60
|
+
dist/*.tar.gz
|
|
61
|
+
release-notes.md
|
|
62
|
+
SHA256SUMS
|
|
63
|
+
scripts/check_dist.py
|
|
64
|
+
scripts/check-install.py
|
|
65
|
+
if-no-files-found: error
|
|
66
|
+
retention-days: 30
|
|
67
|
+
|
|
68
|
+
installed:
|
|
69
|
+
name: Release installs / ${{ matrix.os }}
|
|
70
|
+
needs: build
|
|
71
|
+
runs-on: ${{ matrix.os }}
|
|
72
|
+
timeout-minutes: 15
|
|
73
|
+
strategy:
|
|
74
|
+
fail-fast: false
|
|
75
|
+
matrix:
|
|
76
|
+
os: [ubuntu-24.04, macos-15]
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
|
|
79
|
+
with:
|
|
80
|
+
name: release-assets
|
|
81
|
+
- name: Verify original artifact bytes
|
|
82
|
+
working-directory: dist
|
|
83
|
+
run: shasum -a 256 -c ../SHA256SUMS
|
|
84
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
85
|
+
with:
|
|
86
|
+
version: '0.9.26'
|
|
87
|
+
python-version: '3.12'
|
|
88
|
+
- name: Exercise pip wheel/source and uv tool installations without a checkout
|
|
89
|
+
env:
|
|
90
|
+
RELEASE_VERSION: ${{ needs.build.outputs.version }}
|
|
91
|
+
run: uv run --no-project --python 3.12 python scripts/check_dist.py --version "$RELEASE_VERSION"
|
|
92
|
+
|
|
93
|
+
pypi:
|
|
94
|
+
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
|
95
|
+
needs: [build, installed]
|
|
96
|
+
runs-on: ubuntu-24.04
|
|
97
|
+
timeout-minutes: 10
|
|
98
|
+
environment:
|
|
99
|
+
name: pypi
|
|
100
|
+
url: https://pypi.org/project/flowfield-core/
|
|
101
|
+
permissions:
|
|
102
|
+
contents: read
|
|
103
|
+
id-token: write
|
|
104
|
+
steps:
|
|
105
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
|
|
106
|
+
with:
|
|
107
|
+
name: release-assets
|
|
108
|
+
- name: Verify original artifact bytes
|
|
109
|
+
working-directory: dist
|
|
110
|
+
run: shasum -a 256 -c ../SHA256SUMS
|
|
111
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
112
|
+
with:
|
|
113
|
+
version: '0.9.26'
|
|
114
|
+
- name: Publish verified distributions; identical files may be retried
|
|
115
|
+
run: >-
|
|
116
|
+
uv publish --trusted-publishing always
|
|
117
|
+
--publish-url https://upload.pypi.org/legacy/
|
|
118
|
+
--check-url https://pypi.org/simple dist/*.whl dist/*.tar.gz
|
|
119
|
+
|
|
120
|
+
github:
|
|
121
|
+
needs: pypi
|
|
122
|
+
runs-on: ubuntu-24.04
|
|
123
|
+
timeout-minutes: 5
|
|
124
|
+
permissions:
|
|
125
|
+
contents: write
|
|
126
|
+
steps:
|
|
127
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
|
|
128
|
+
with:
|
|
129
|
+
name: release-assets
|
|
130
|
+
- name: Verify original artifact bytes
|
|
131
|
+
working-directory: dist
|
|
132
|
+
run: shasum -a 256 -c ../SHA256SUMS
|
|
133
|
+
- name: Publish GitHub Release after PyPI succeeds
|
|
134
|
+
env:
|
|
135
|
+
GH_TOKEN: ${{ github.token }}
|
|
136
|
+
GH_REPO: ${{ github.repository }}
|
|
137
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
138
|
+
run: |
|
|
139
|
+
if ! gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
|
|
140
|
+
gh release create "$RELEASE_TAG" --verify-tag --draft \
|
|
141
|
+
--title "Flowfield $RELEASE_TAG" --notes-file release-notes.md
|
|
142
|
+
fi
|
|
143
|
+
gh release upload "$RELEASE_TAG" dist/*.whl dist/*.tar.gz SHA256SUMS --clobber
|
|
144
|
+
gh release edit "$RELEASE_TAG" --draft=false --notes-file release-notes.md
|
|
145
|
+
printf 'Published flowfield-core and GitHub release %s\n' "$RELEASE_TAG" >> "$GITHUB_STEP_SUMMARY"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.mypy_cache/
|
|
6
|
+
.ruff_cache/
|
|
7
|
+
dist/
|
|
8
|
+
*.egg-info/
|
|
9
|
+
node_modules/
|
|
10
|
+
src/flowfield/_web/
|
|
11
|
+
web/test-results/
|
|
12
|
+
web/playwright-report/
|
|
13
|
+
.DS_Store
|
|
14
|
+
.env
|
|
15
|
+
.env.*
|
|
16
|
+
!.env.example
|
|
17
|
+
.work/
|
|
18
|
+
.idea/
|
|
19
|
+
site/
|
|
20
|
+
docs/.mintlify/
|
|
21
|
+
release-notes.md
|
|
22
|
+
SHA256SUMS
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Reviewed release notes describe changes by user impact. See CONTRIBUTING.md for versioning
|
|
4
|
+
and release preparation. A version heading becomes a release when its package is published.
|
|
5
|
+
|
|
6
|
+
## 0.1.0
|
|
7
|
+
|
|
8
|
+
Initial Flowfield release: a shared task feed and workspace for agent software development.
|
|
9
|
+
|
|
10
|
+
- Adopt existing repositories and keep task intent, activity, questions, answers and results
|
|
11
|
+
together in a durable conversation. Group tasks into milestones and track dependencies.
|
|
12
|
+
- Use the board and Needs you to prioritize work, answer questions and review results.
|
|
13
|
+
- Run independent tasks in isolated Git checkouts with configurable worker capacity and
|
|
14
|
+
a paused-by-default queue. Codex is the first supported worker harness.
|
|
15
|
+
- Inspect and try an exact result, then explicitly approve delivery into the project checkout.
|
|
16
|
+
Changed code or destination requires fresh approval; checkout blockers retain approval.
|
|
17
|
+
- Connect coordinators through MCP and installed project guidance. The CLI and web app use
|
|
18
|
+
the same local service and persisted workspace.
|
|
19
|
+
- Preserve work through tested schema upgrades with verified database snapshots and guarded
|
|
20
|
+
offline recovery. Existing supported Flowfield schemas 29 and 30 upgrade to schema 31.
|
|
21
|
+
- Share persistent notifications and dismissals across browsers and restarts. Check for
|
|
22
|
+
compatible PyPI releases on web startup, hourly or manually, with release links and
|
|
23
|
+
uv/pip upgrade instructions.
|
|
24
|
+
|
|
25
|
+
Install with `uv tool install --python 3.12 flowfield-core`, or pip in a dedicated Python
|
|
26
|
+
environment. The package bundles its browser UI and agent guidance. macOS and Linux with
|
|
27
|
+
Python 3.12 are the release test targets; managed work requires an installed, signed-in
|
|
28
|
+
Codex CLI. Additional harnesses are planned.
|
|
29
|
+
|
|
30
|
+
**Upgrade:** stop Flowfield before changing versions and restart afterward. Supported database
|
|
31
|
+
migrations run automatically after a verified snapshot; the queue starts paused. Read the installation and storage docs
|
|
32
|
+
before upgrading and retain a full workspace backup for artifacts and disaster recovery.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Issues and development
|
|
2
|
+
|
|
3
|
+
Bug reports, feedback and feature requests are welcome in [GitHub Issues](https://github.com/flowfield-sh/flowfield-core/issues).
|
|
4
|
+
We are not accepting external pull requests at this time.
|
|
5
|
+
|
|
6
|
+
For a bug, include the Flowfield version, operating system, steps to reproduce, expected
|
|
7
|
+
behavior and actual behavior. Remove secrets and private project content from logs or screenshots.
|
|
8
|
+
Report potential vulnerabilities using [private security reporting](SECURITY.md).
|
|
9
|
+
|
|
10
|
+
## Follow development
|
|
11
|
+
|
|
12
|
+
Maintainers track public work with the **progress** label: one issue per user-facing outcome,
|
|
13
|
+
with a short scope and completion criteria. Status is **Planned**, **In progress**,
|
|
14
|
+
**Implemented**, or **Released**. Implemented means the code is on main; Released names
|
|
15
|
+
the published version and links its release notes.
|
|
16
|
+
|
|
17
|
+
Updates describe meaningful progress or a blocker and link relevant code. Progress issues
|
|
18
|
+
stay open until released, or close with an explanation if the work is cancelled. Bug reports
|
|
19
|
+
and feature requests can link the relevant progress issue.
|
|
20
|
+
|
|
21
|
+
A progress issue uses this shape:
|
|
22
|
+
|
|
23
|
+
```md
|
|
24
|
+
## Outcome
|
|
25
|
+
What this lets people do.
|
|
26
|
+
|
|
27
|
+
## Done when
|
|
28
|
+
- Observable completion criteria.
|
|
29
|
+
|
|
30
|
+
## Status
|
|
31
|
+
In progress
|
|
32
|
+
|
|
33
|
+
## Implementation
|
|
34
|
+
Links to code when implemented.
|
|
35
|
+
|
|
36
|
+
## Release
|
|
37
|
+
Version and release link when published.
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Develop locally
|
|
41
|
+
|
|
42
|
+
Python 3.12+, uv, Node 24+ and pnpm 11.19.0 are required.
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
make setup
|
|
46
|
+
make check
|
|
47
|
+
pnpm --dir web exec playwright install chromium
|
|
48
|
+
make smoke
|
|
49
|
+
make build
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`make check` runs Python formatting, lint, types and deterministic tests, generated API
|
|
53
|
+
type validation, frontend checks/build, and Mintlify validation/link checks. `make smoke`
|
|
54
|
+
runs Chromium against the built application. `make build` produces a wheel and source
|
|
55
|
+
archive with the compiled UI. Both install without Node, pnpm or a checkout at runtime.
|
|
56
|
+
Use `scripts/check-install.py` from a clean installed environment to exercise the package.
|
|
57
|
+
`make check-dist` installs both distributions through pip and the wheel through isolated
|
|
58
|
+
`uv tool install`, then exercises each installed application outside the checkout.
|
|
59
|
+
|
|
60
|
+
For frontend development, run `uv run flowfield serve` and `pnpm --dir web dev` in separate
|
|
61
|
+
terminals. API wire types are generated with `make api-types`. Application operations live
|
|
62
|
+
under `src/flowfield/`; harness-specific behavior belongs in `src/flowfield/adapters/`.
|
|
63
|
+
|
|
64
|
+
Ordinary checks use isolated disposable state and never launch live model calls.
|
|
65
|
+
|
|
66
|
+
## Database changes
|
|
67
|
+
|
|
68
|
+
Schema 29 is the immutable initialization baseline, captured in
|
|
69
|
+
`tests/fixtures/schema_29.sql`. Append each schema change to the ordered registry in
|
|
70
|
+
`src/flowfield/migrations.py`; do not edit previous migrations or the baseline SQL.
|
|
71
|
+
Migration callbacks change only the database using `execute`/`executemany`. The storage
|
|
72
|
+
owner controls the transaction, version, migration history and pre-upgrade snapshot;
|
|
73
|
+
callbacks must not commit, use `executescript`, or mutate project files or artifacts.
|
|
74
|
+
|
|
75
|
+
Test fresh initialization and upgrading populated fixtures, including failure rollback,
|
|
76
|
+
interruption, restart and preserved application bindings. Keep application writes inside
|
|
77
|
+
`Workspace.connection()` so recovery can detect newer work. Automatic snapshots cover
|
|
78
|
+
the database; full workspace backups remain separate.
|
|
79
|
+
|
|
80
|
+
## Documentation
|
|
81
|
+
|
|
82
|
+
Mintlify content and configuration live in `docs/`. Its CLI is pinned and locked locally:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
make docs
|
|
86
|
+
make docs-serve
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`make docs` validates the build and internal links. `make docs-serve` starts a local
|
|
90
|
+
preview. Hosted deployment uses the `docs/` subdirectory and its `docs.json` configuration.
|
|
91
|
+
Keep user documentation concise and accurate for the behavior being released.
|
|
92
|
+
Mintlify builds `docs/` from the `docs` branch. Advance that branch to the reviewed release
|
|
93
|
+
commit after publication, using a normal fast-forward push, then verify the hosted pages.
|
|
94
|
+
Feature development continues on main.
|
|
95
|
+
|
|
96
|
+
## Versioning and releases
|
|
97
|
+
|
|
98
|
+
The first release is **0.1.0**. `pyproject.toml` owns the version; uv keeps its entry in
|
|
99
|
+
`uv.lock` aligned. Tags use `vX.Y.Z`. During 0.x, patches contain compatible fixes;
|
|
100
|
+
minor releases contain new capabilities or breaking changes, with explicit upgrade notes.
|
|
101
|
+
From 1.0 onward, Semantic Versioning applies: major for breaking changes, minor for
|
|
102
|
+
compatible features, patch for compatible fixes. Compatibility covers documented CLI/MCP
|
|
103
|
+
interfaces, integration guidance and persisted workspace state. Schema changes still need
|
|
104
|
+
tested migrations and recovery; a version bump does not permit discarding user state.
|
|
105
|
+
|
|
106
|
+
Every push to main runs the `Tests` workflow: Python 3.12 tests on Linux/macOS, Python and
|
|
107
|
+
frontend quality checks, generated API validation, Mintlify validation, Chromium journeys
|
|
108
|
+
and clean installed-package checks. Live model calls are separate from CI.
|
|
109
|
+
|
|
110
|
+
### Prepare and rehearse
|
|
111
|
+
|
|
112
|
+
Review all commits and the aggregate diff since the last published release, then write a
|
|
113
|
+
nonempty `## X.Y.Z` section in `CHANGELOG.md`, newest first. Include features, fixes and
|
|
114
|
+
upgrade requirements by user impact. Preserve previous entries and verify each claim against
|
|
115
|
+
implementation, documentation and checks. Commit reviewed notes before releasing.
|
|
116
|
+
|
|
117
|
+
```sh
|
|
118
|
+
make setup
|
|
119
|
+
pnpm --dir web exec playwright install chromium
|
|
120
|
+
make release-check
|
|
121
|
+
uv run --no-sync python scripts/release.py 0.1.0 --dry-run
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`release-check` runs local checks, browser journeys, clean builds, pip wheel/source and uv tool
|
|
125
|
+
installation checks, and distribution metadata validation. Build clears the generated `dist/`
|
|
126
|
+
directory. The preview checks branch, clean state, remotes, version, notes and unused tags,
|
|
127
|
+
and prints outgoing commits; it does not run checks or change files/refs.
|
|
128
|
+
|
|
129
|
+
The `Release` workflow in `.github/workflows/workflow.yml` also supports a manual run on
|
|
130
|
+
main. It runs CI, builds distributions once, and verifies those same artifacts on Linux/macOS.
|
|
131
|
+
Manual runs stop after verification. Artifacts and checksums remain available for 30 days.
|
|
132
|
+
|
|
133
|
+
### Publish
|
|
134
|
+
|
|
135
|
+
Configure the PyPI Trusted Publisher for owner `flowfield-sh`, repository `flowfield-core`,
|
|
136
|
+
workflow `workflow.yml` and environment `pypi`. The matching GitHub environment permits only
|
|
137
|
+
tags matching `v*`. Publishing uses short-lived GitHub identity tokens.
|
|
138
|
+
|
|
139
|
+
After reviewing the preparation and explicitly authorizing publication, run from clean main:
|
|
140
|
+
|
|
141
|
+
```sh
|
|
142
|
+
uv run --no-sync python scripts/release.py 0.1.0
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The command holds a repository release lock, checks identity/notes, bumps only the version
|
|
146
|
+
files when needed, runs verification, and commits those version files. It rechecks the
|
|
147
|
+
remote and atomically pushes main and the annotated tag, then watches the release run.
|
|
148
|
+
CI requires the tag to match package/lock metadata and identify a commit on main. Only
|
|
149
|
+
the tag-triggered publishing job uses the `pypi` environment and OIDC permission. It publishes
|
|
150
|
+
verified original artifacts, then publishes the GitHub Release with reviewed notes and checksums.
|
|
151
|
+
Check actual PyPI installation, update discovery and GitHub assets after publication.
|
|
152
|
+
|
|
153
|
+
### Recover
|
|
154
|
+
|
|
155
|
+
Failures preserve local state and completed steps. Never move a published tag or rebuild an
|
|
156
|
+
uploaded version. Before tagging, correct and review retained changes, then retry. Exit 75
|
|
157
|
+
means another local release owns the lock. If push fails, inspect local and remote refs before
|
|
158
|
+
retrying the same atomic push. If CI fails, inspect the existing run; source corrections need
|
|
159
|
+
a new commit/version/tag. For partial upload or GitHub failure, rerun only failed jobs to reuse
|
|
160
|
+
the original artifacts. Do not rerun the build after uploading. uv skips already uploaded
|
|
161
|
+
identical files; GitHub completes the existing draft/assets. Expired artifacts require recovering
|
|
162
|
+
and verifying the exact originals. A bad published release needs a new version.
|