feat: sync act-board Project fields and snapshot.json - #71
Conversation
Add a Projects v2 field sync and snapshot writer so the weekly board job can update Status without rewriting unchanged values. Co-authored-by: Cursor <cursoragent@cursor.com>
PR Review: #71 — feat: sync act-board Project fields and snapshot.jsonBranch: This is well-structured work: the dependency-injected Two issues below are correctness defects. Per the issue context, the weekly workflow lives in act-board PR #3 and is out of scope here — but the CLI surface lines up with that workflow. Secrets check: clean. Critical1. The 2. Board-issue selection diverges from This loop sorts issues by number ascending and keeps the first match per rule id, ignoring Important3. 4. 5. Field resolution runs per row — resolve the field plan once; 6. No per-row error isolation — wrap each row so one GraphQL failure does not drop the accumulated result; exit non-zero if any row failed. 7. The Octokit GraphQL layer is untested — add mocked Suggestions8. Move 9. Split snapshot tests into 10. Project-not-found error should mention token/project-access as well as 11. Count 12. Reject non-numeric 13. 14. Recommended Action: Request ChangesThe two Critical items are silent-failure modes in the weekly job. Address all findings in this comment. |
Paginate project metadata and values, validate field plans once, and isolate per-row failures while preserving complete sync results. Reuse managed issue selection and expand tests for GraphQL and snapshots. Co-authored-by: Cursor <cursoragent@cursor.com>
Closes #65
Adds Projects v2 field sync and a snapshot writer so the weekly board job can update Status without rewriting unchanged values.
yarn sync-act-board-projectwrites Status (required) and optional numeric/date/URL fields. Missing optional fields are skipped with a warning; a missing Status field fails the command.yarn write-act-board-snapshotwritesdata/snapshot.jsononly when the classifier JSON changed.Test plan
yarn test src/approval-report/__tests__/sync-project.test.tsMade with Cursor