Split from #3407 (GitHub milestones on migration): a builder left it without a pull because the carry and the membership were one change. This carries the milestones themselves.
Done:
[ ] A GitHub migration (src/actions/migrate.ts and the carry it calls) creates each GitHub milestone as a forge milestone (src/core/milestones.ts) with its title, description, due date and open or closed state.
[ ] Migrating twice creates no duplicates: a milestone is matched by its GitHub number, kept beside it.
[ ] Test: the fake origin (test/fake-origin.ts) is seeded with 2 milestones, one of them closed. One migration yields both, with their state and due date; a second migration yields no more.
Files: the GitHub carry module, src/core/milestones.ts (only if a create-with-due-date helper is missing), the migrate test.
Split from #3407 (GitHub milestones on migration): a builder left it without a pull because the carry and the membership were one change. This carries the milestones themselves.
Done:
src/actions/migrate.tsand the carry it calls) creates each GitHub milestone as a forge milestone (src/core/milestones.ts) with its title, description, due date and open or closed state.test/fake-origin.ts) is seeded with 2 milestones, one of them closed. One migration yields both, with their state and due date; a second migration yields no more.Files: the GitHub carry module, src/core/milestones.ts (only if a create-with-due-date helper is missing), the migrate test.