22
33| Sub-Milestone | Focus | Status |
44| ---------------| -------| --------|
5- | ** M2A** | OpenTUI Migration + Core TUI Screens | In Progress (migration first) |
6- | ** M2B** | Direct Commands | Blocked (depends on M2A) |
7- | ** M2C** | Advanced TUI + Polish + Docs | Blocked (depends on M2A + M2B) |
5+ | ** M2A** | OpenTUI Migration + Core TUI Screens | ✅ Complete |
6+ | ** M2B** | Direct Commands | Open (M2A complete) |
7+ | ** M2C** | Advanced TUI + Polish + Docs | In Progress |
8+ | ** M2D** | Homebrew Distribution | Open (2BD.1 complete) |
89
910<details >
1011<summary ><strong >Colour Key</strong ></summary >
@@ -186,16 +187,12 @@ title: M2B — Direct Commands
186187---
187188graph TD
188189
189- 2TI.17["`*2TI.17*<br/>M2A task<br/>test real data`"]:::must-blocked
190-
191- 2TI.17 --> 2DC.2
192-
193- 2DC.2["`*2DC.2*<br/>**SHOULD**<br/>iris convert`"]:::should-blocked --> 2DC.3
190+ 2DC.2["`*2DC.2*<br/>**SHOULD**<br/>iris convert`"]:::should-open --> 2DC.3
1941912DC.3["`*2DC.3*<br/>**SHOULD**<br/>iris validate`"]:::should-blocked
195192
196193phase1{"`**M2B**<br/>Complete`"}:::mile
197194
198- classDef must-blocked fill:#F3D8E6 ,color:#000 ;
195+ classDef should-open fill:#6F2A52 ,color:#fff ;
199196classDef should-blocked fill:#A45A84,color:#fff;
200197classDef could-blocked fill:#5FA3BA,color:#fff;
201198classDef mile fill:#E8EFF6,color:#000;
@@ -212,6 +209,40 @@ classDef mile fill:#E8EFF6,color:#000;
212209
213210</details >
214211
212+ <details >
213+ <summary ><h3 >M2D: Homebrew Distribution</h3 ></summary >
214+
215+ > [ !IMPORTANT]
216+ > ** Goal:** Zero-friction installation via Homebrew tap (no terminal commands, no Gatekeeper warnings, no Apple Developer account)
217+
218+ ``` mermaid
219+ ---
220+ title: M2D — Homebrew Distribution
221+ ---
222+ graph TD
223+
224+ 2HB.1["`*2HB.1*<br/>**MUST**<br/>homebrew tap setup`"]:::must-open
225+
226+ phase1{"`**M2D**<br/>Complete`"}:::mile
227+
228+ 2HB.1 --> phase1
229+
230+ classDef must-open fill:#D6A3BF,color:#000;
231+ classDef mile fill:#E8EFF6,color:#000;
232+ ```
233+
234+ ### Must Have
235+
236+ - [ ] ** 2HB.1** — Set up Homebrew tap for frictionless macOS distribution — ** depends on 2BD.1**
237+ - Create ` foundersandcoders/homebrew-iris ` repository
238+ - Write ` Formula/iris.rb ` with binary URLs and SHA256 checksums
239+ - Support both ARM64 and Intel architectures
240+ - Document user installation: ` brew install foundersandcoders/iris/iris `
241+ - Document maintainer workflow for version bumps
242+ - Consider GitHub Actions automation for tap updates (optional enhancement)
243+
244+ </details >
245+
215246<details >
216247<summary ><h3 >M2C: Advanced TUI + Polish + Docs</h3 ></summary >
217248
@@ -232,48 +263,46 @@ graph TD
232263
2332642TI.33["`*2TI.33*<br/>**SHOULD**<br/>collection per convert`"]:::should-open
234265
235- 2TI.10["`*2TI.10*<br/>**MUST**<br/>submission history browser`"]:::must-blocked
266+ 2TI.10["`*2TI.10*<br/>**MUST**<br/>submission history browser`"]:::must-open
2362672TI.18["`*2TI.18*<br/>**SHOULD**<br/>visual feedback/polish`"]:::should-blocked
2372682TC.1["`*2TC.1*<br/>**SHOULD**<br/>clean test history`"]:::should-blocked
238- 2UD.1["`*2UD.1*<br/>**SHOULD**<br/>user guide`"]:::should-blocked
269+ 2UD.1["`*2UD.1*<br/>**SHOULD**<br/>user guide`"]:::should-open
2392702UD.2["`*2UD.2*<br/>**COULD**<br/>validation rules docs`"]:::could-blocked
2402712TM.5["`*2TM.5*<br/>**COULD**<br/>schema short names`"]:::could-open
2412722TM.6["`*2TM.6*<br/>**COULD**<br/>grouped schema fields`"]:::could-blocked
2422732TC.2["`*2TC.2*<br/>**COULD**<br/>history cleanup utility`"]:::could-blocked
2432742TC.3["`*2TC.3*<br/>**COULD**<br/>dual-picker screen`"]:::could-blocked
2442752TC.4["`*2TC.4*<br/>**COULD**<br/>bordered detail panel`"]:::could-blocked
245276
246- 2TI.12["`*2TI.12*<br/>M2A task <br/>contextual help`"]:::should-blocked
247- 2TI.31["`*2TI.31*<br/>M2A task <br/>success proof`"]:::should-blocked
277+ 2TI.12["`*2TI.12*<br/>**SHOULD** <br/>contextual help`"]:::should-blocked
278+ 2TI.31["`*2TI.31*<br/>**SHOULD** <br/>success proof`"]:::should-blocked
2482792TS.2["`*2TS.2*<br/>**COULD**<br/>schema manager screen`"]:::could-blocked
2492802TS.3["`*2TS.3*<br/>**COULD**<br/>schema version selector`"]:::could-blocked --> 2TS.4
2502812TS.4["`*2TS.4*<br/>**COULD**<br/>dynamic migration guidance`"]:::could-blocked
2512822TI.19["`*2TI.19*<br/>**COULD**<br/>schema settings integration`"]:::could-blocked
252283
2532842DC.4["`*2DC.4*<br/>M2B task<br/>iris check`"]:::could-blocked
254285
255- 2BD.1["`*2BD.1*<br/>**MUST**<br/>standalone binary`"]:::must-blocked
256- 2BD.2["`*2BD.2*<br/>**COULD**<br/>GH Actions release`"]:::could-blocked
286+ 2BD.2["`*2BD.2*<br/>**COULD**<br/>GH Actions release`"]:::could-open
257287
258288%% Required dependencies %%
2592892TI.10 --> 2TI.12 & 2TI.31
2602902TI.12 & 2TI.31 --> 2TS.2
2612912TI.18 --> 2DC.4 & 2TC.1
262- 2TI.10 & 2TI.18 --> 2BD.1
263- 2BD.1 --> phase1
292+
264293phase1{"`**M2C**<br/>Complete`"}:::mile
265294
266295%% New task dependencies %%
2672962TM.5 -.->|optional| 2TM.6
268297
269298%% Optional dependencies %%
270- 2BD.1 -.->|optional| 2UD.1 & 2BD.2
2712992BD.2 -.->|optional| phase1
2723002UD.1 -.->|optional| 2UD.2 & phase1
2733012TS.2 -.->|optional| 2TS.3 & 2TI.19 & 2TC.2
2743022TC.2 -.->|optional| 2TC.3 & 2TC.4
2753032TI.33 & 2TM.5 & 2TM.6 & 2TI.19 & 2TS.4 & 2UD.2 & 2DC.4 & 2TC.1 & 2TC.2 & 2TC.3 & 2TC.4 -.->|optional| phase1
276304
305+ classDef must-open fill:#D6A3BF,color:#000;
277306classDef must-blocked fill:#F3D8E6,color:#000;
278307classDef should-open fill:#6F2A52,color:#fff;
279308classDef should-blocked fill:#A45A84,color:#fff;
@@ -284,13 +313,13 @@ classDef mile fill:#E8EFF6,color:#000;
284313
285314### Must Have
286315
287- - [ ] ** 2TI.12** — Add help overlay system (contextual help; can use OpenTUI's built-in overlay positioning) — ** depends on 2TI.11, 2TI. 10**
316+ - [ ] ** 2TI.12** — Add help overlay system (contextual help; can use OpenTUI's built-in overlay positioning) — ** depends on 2TI.10**
288317- [x] ** 2TM.2** — Implement CSV column → XSD path mapping UI (interactive path selector; uses ` SelectRenderable ` for column/path lists, ` InputRenderable ` for search/filter)
289318- [x] ** 2TM.3** — Add mapping preview/validation (show which fields will map, highlight issues; uses ` BoxRenderable ` for preview panel, ` TextRenderable ` for status) — ** depends on 2TM.2**
290319- [x] ** 2TM.1** — Build mapping builder screen (list available mappings, create new; uses ` SelectRenderable ` + ` GroupRenderable ` flexbox layout) — ** depends on 2TM.3**
291320- [x] ** 2TM.4** — Implement mapping save dialog (name, description, set as default; uses ` InputRenderable ` + ` BoxRenderable ` ) — ** depends on 2TM.1**
292321- [ ] ** 2TI.10** — Create submission history browser (uses ` ScrollBox ` for history list, ` BoxRenderable ` for detail cards)
293- - [ ] ** 2BD.1** — Bundle TUI into standalone executables (` bun build --compile ` targeting macOS + Windows ; single binary, no runtime dependency) — ** depends on 2TI.10, 2TI.18 **
322+ - [x ] ** 2BD.1** — Bundle TUI into standalone executables (` bun build --compile ` targeting macOS; single binary, no runtime dependency)
294323
295324### Should Have
296325
@@ -327,41 +356,37 @@ title: Phase 1 — Complete Picture
327356---
328357graph TD
329358
330- %% M2A Tasks (optional enhancements) %%
331- 2TI.12["`*2TI.12*<br/>component<br/>help`"]:::should-open
332- 2TI.31["`*2TI.31*<br/>enhance<br/>success proof`"]:::should-open
333-
334359%% M2B Tasks %%
3353602DC.2["`*2DC.2*<br/>command<br/>convert`"]:::should-open
3363612DC.3["`*2DC.3*<br/>command<br/>validate`"]:::should-blocked
3373622DC.4["`*2DC.4*<br/>command<br/>check`"]:::could-blocked
338363
339364%% M2C Tasks %%
365+ 2TI.10["`*2TI.10*<br/>screen<br/>history`"]:::must-open
366+ 2TI.12["`*2TI.12*<br/>component<br/>help`"]:::should-blocked
367+ 2TI.31["`*2TI.31*<br/>enhance<br/>success proof`"]:::should-blocked
3403682TI.33["`*2TI.33*<br/>enhance<br/>collection per convert`"]:::should-open
3413692TM.5["`*2TM.5*<br/>enhance<br/>schema short names`"]:::could-open
3423702TM.6["`*2TM.6*<br/>enhance<br/>grouped fields`"]:::could-blocked
3433712TS.2["`*2TS.2*<br/>feat<br/>schema mgr`"]:::could-blocked
3443722TS.3["`*2TS.3*<br/>component<br/>schema selector`"]:::could-blocked
3453732TS.4["`*2TS.4*<br/>component</br>migration`"]:::could-blocked
3463742TI.19["`*2TI.19*<br/>enhance<br/>schema settings`"]:::could-blocked
347- 2TI.10["`*2TI.10*<br/>screen<br/>history`"]:::must-blocked
3483752TI.18["`*2TI.18*<br/>enhance<br/>polish`"]:::should-blocked
3493762TC.1["`*2TC.1*<br/>test<br/>clean history`"]:::should-blocked
350- 2UD.1["`*2UD.1*<br/>doc<br/>user guide`"]:::should-blocked
377+ 2UD.1["`*2UD.1*<br/>doc<br/>user guide`"]:::should-open
3513782UD.2["`*2UD.2*<br/>doc<br/>val rules`"]:::could-blocked
3523792TC.2["`*2TC.2*<br/>util<br/>history cleanup`"]:::could-blocked
3533802TC.3["`*2TC.3*<br/>enhance<br/>dual-picker`"]:::could-blocked
3543812TC.4["`*2TC.4*<br/>enhance<br/>bordered panel`"]:::could-blocked
355382
356383%% Build & Distribution %%
357- 2BD.1 ["`*2BD.1 *<br/>build<br/>standalone binary `"]:::must-blocked
358- 2BD.2 ["`*2BD.2 *<br/>build <br/>GH Actions release `"]:::could-blocked
384+ 2BD.2 ["`*2BD.2 *<br/>build<br/>GH Actions release `"]:::could-open
385+ 2HB.1 ["`*2HB.1 *<br/>dist <br/>homebrew tap `"]:::must-open
359386
360387%% Milestone nodes %%
361388phase1{"`**Phase 1**<br/>Complete`"}:::mile
362389
363- %% M2A Dependencies %%
364-
365390%% M2B Dependencies %%
3663912DC.2 --> 2DC.3
3673922DC.3 --> 2TI.18
@@ -372,11 +397,11 @@ phase1{"`**Phase 1**<br/>Complete`"}:::mile
3723972TI.12 & 2TI.31 --> 2TS.2
3733982TI.18 --> 2DC.4 & 2TC.1
3743992TS.3 --> 2TS.4
375- 2TI.10 & 2TI.18 --> 2BD.1
376- 2BD.1 --> phase1
400+
401+ %% M2D Dependencies %%
402+ 2HB.1 --> phase1
377403
378404%% OPTIONAL %%
379- 2BD.1 -.->|optional| 2UD.1 & 2BD.2
3804052BD.2 -.->|optional| phase1
3814062UD.1 -.->|optional| 2UD.2 & phase1
3824072TS.2 -.->|optional| 2TS.3 & 2TI.19 & 2TC.2
0 commit comments