Repository navigation
feat: add v1/v2 API paths with v2 backed by Bloom's GraphQL API - #46
Merged
Merged
Conversation
client.v1 exposes the existing REST v1 operations (the top-level attributes remain aliases of the same objects). client.v2 exposes the GraphQL API used by the Bloom Growth web app, with sync and async operations for users, meetings, issues, headlines, to-dos, goals, milestones, and metrics with scores, including descriptions. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Raise GraphQLError when an entity is missing or a create returns no id - Verify a milestone belongs to its goal before editing; goal_id is keyword-only - Fetch merged issue/headline lists in one request, deduped and ordered by creation date - Keep zero-valued metric scores in scores() - Use the UTC date for the default goal due date - Document the v2 package layout in CLAUDE.md Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Shared request building and result checks live in the base and mixins (_mutate, _one, _notes_input, input builders), models validate raw GraphQL nodes directly, and one user-id cache is shared per client. Merged issue lists, to-do lists by meeting, and user headline lists filter on the server in one request; issue and to-do creates use the mutation result instead of re-reading. v2 date parameters also accept ISO 8601 strings. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
franccesco
enabled auto-merge
September 24, 2026 21:37
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds two API paths to
ClientandAsyncClient:client.v1: the existing Bloom REST v1 operations, unchanged. The top-level attributes (client.user,client.issue, ...) are aliases of the same objects, so existing code keeps working.client.v2: a new package (src/bloomy/v2/) that calls Bloom Growth's GraphQL API athttps://app.bloomgrowth.com/graphql/, which is the API the current web app uses. It uses the same API key: the/graphqlendpoint accepts the JWT from/Token.client.v2has sync and async operations for:userdetails,listmeetinglist,details,attendeesissuelist(short-term / long-term / solved / archived),details,create,update(incl. move to another meeting),solve,reopen,archive,restoreheadlinelist(by meeting or user),details,create,update,archive,restoretodolist(by meeting or user),details,create(meeting or personal),update,complete,reopen,archive,restoregoallist(by meeting or user, with milestones),details,create(with milestones),update(incl. status),archive,restoremilestonelist,create,update,complete,deletemetriclist,details,create,update,archive,scores,set_score,update_score,clear_scoreDescriptions (
notes) are supported on issues, headlines, to-dos, goals and metrics. Metric score cells also accept a note.How the v2 API surface was determined
CreateNoteand pointing the item'snotesIdat it, which is what the web app does.meeting.metrics, the node id is a link id; the real metric id ismeasurableId.set_scoreedits the existing row instead.Verification
ruff format --check,ruff check, andbasedpyright(strict) are clean.pytest -m "not integration": 834 passed on Python 3.12. Before the final refactor, 698 passed on 3.13 and 3.14 too. The v2 modules have 100% line coverage (base.py99%).BG_API_KEY, test meeting 349524 only; the tests archive or delete what they create):client.v2, each with a description. I checked them in the web app, edited them through the SDK and checked again, then archived them through the SDK and confirmed the workspace was empty. I did this twice, once before and once after the/simplifyrefactor.mkdocs build --strictpasses.Review passes
/code-review: fixed missing-entity crashes, milestone updates writing before checking the goal id, merged lists that were out of order or made 3 requests, zero-valued scores being dropped, and the goal default due date using local time. One finding about deleted to-dos turned out to be a false positive./simplify:Notes
list()queries selectnotesText, so every item with a description triggers one Etherpad lookup on the server. The web app's list views don't select it. Dropping it would makelist()return items without descriptions..claude/agents/*now run on Opus instead of Sonnet.[Unreleased]entry. The version is not bumped.🤖 Generated with Claude Code