Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
81605bc
Preserve View tab order during migration
SIkebe Aug 18, 2026
69e178a
Cover View tab reorder failure paths
SIkebe Aug 18, 2026
7beee8f
Paginate View order reads
SIkebe Aug 18, 2026
b90ae12
Merge remote-tracking branch 'origin/main' into sikebe-preserve-view-…
SIkebe Aug 18, 2026
00b0273
Exercise View order through the live API
SIkebe Aug 18, 2026
4c55ca7
Distinguish duplicate Views when verifying order
SIkebe Aug 18, 2026
a9979e5
Use UI settings for duplicate View order
SIkebe Aug 18, 2026
93c45cc
Expand credentialed API migration coverage
SIkebe Aug 18, 2026
39ca576
Use the Integration project in manual commands
SIkebe Aug 18, 2026
e3e33dc
Reuse the fixture PR in live relink coverage
SIkebe Aug 18, 2026
ed4fafe
Keep test-agent artifacts out of the repository
SIkebe Aug 18, 2026
0389689
Wait for complete View order reads
SIkebe Aug 18, 2026
8e3ae69
Wait for browser View order visibility
SIkebe Aug 18, 2026
7a6f6fe
Align E2E policy settings with validation
SIkebe Aug 19, 2026
449d3da
Derive browser account topology from E2E settings
SIkebe Aug 19, 2026
d2fe46e
Use DOM order for saved Project tabs
SIkebe Aug 19, 2026
cda6767
Parse relative View tab links consistently
SIkebe Aug 19, 2026
05cdec7
Scope API-only View assertions to tab order
SIkebe Aug 19, 2026
f207cfb
Keep tab-order UI failures recoverable
SIkebe Aug 19, 2026
f15564f
Name View and PR tests for actual coverage
SIkebe Aug 19, 2026
898c0e7
Remove the obsolete GraphQL View importer overload
SIkebe Aug 19, 2026
2942ffb
Detect when GraphQL View order becomes reliable
SIkebe Aug 19, 2026
ef9a070
Limit the GraphQL order canary to known divergent fixtures
SIkebe Aug 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions docs/BROWSER_AUTOMATION_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ GraphQL と Playwright を組み合わせた View・Workflow 移行の詳細設
| **Slice by** | ❌ API に無い → **UI で読む** | **UI** | |
| **Field sum** | ❌ API に無い → **UI で読む** | **UI** | |
| **Roadmap 設定(Dates / Zoom / Markers)** | ❌ API に無い → **UI で読む** | **UI** | |
| タブの並び順 | GraphQL `views`(orderBy: POSITION) | **UI**(タブの drag & drop)| v1 では省略可(§8) |
| タブの並び順 | GraphQL `views(orderBy: {field: POSITION})` | **UI**(タブの drag & drop) | `ViewSnapshot.tabPosition` は schema v1 の nullable additive field |

### Workflow のプロパティ別ソースマップ

Expand Down Expand Up @@ -143,7 +143,7 @@ internal static class Sel
| V-7 | Roadmap | Dates(date フィールド対 or iteration)、Zoom(Month/Quarter/Year)、Markers |
| V-8 | 全レイアウト共通 | filter 文字列(そのまま転記。フィールド名は移行済み前提で互換) |
| V-9 | 全レイアウト共通 | Slice by |
| V-10 | View の name / タブ並び順 | 並び順は v1 スコープ外(§8) |
| V-10 | View の name / タブ並び順 | GraphQL POSITION で読み、browser-assisted import で最小 D&D を適用 |

### 3.2 export: UI からの読み取り手順(API に無い 3 項目のみ)

Expand Down Expand Up @@ -176,12 +176,13 @@ EnrichView(spec, targetViewNumber):
6. Field sum: ViewOptions → "Field sum" → spec.FieldSum の各フィールドをチェック
7. Roadmap のみ: "Dates" → 開始/終了フィールド対 or iteration を選択、"Zoom level"、"Markers" のチェック群
8. 保存: View menu → "Save view" → alertdialog の "Save"(dialog が出ない UI variant では直接保存)
9. 検証は後続の `ghpmv verify --enable-browser-automation` または browser E2E で行う
9. 全 View 設定の適用後、target の GraphQL POSITION 順と snapshot 順から最小移動計画を作り、必要なタブだけ drag-and-drop
10. 検証は後続の `ghpmv verify --enable-browser-automation` または browser E2E で行う
```

Project conflict は API View stage より前に `--on-conflict skip|update|fail` または `--project-number` で解決する。API importer は source view number と target view number の対応を返し、browser importer はその View に未公開設定だけを適用する。

作成順序: **スナップショットの view number 昇順**で作成(タブ順が概ね再現される)。デフォルトで作られる "View 1" は、スナップショット先頭の view で上書き(rename + 設定)して消費する。
作成順序: `tabPosition` がある snapshot は **POSITION 昇順**、旧 snapshot は view number 昇順で作成する。デフォルトで作られる "View 1" は snapshot の先頭 View で上書き(rename + 設定)して消費する。API-only import は現在順との差分を warning にし、browser-assisted import は View 設定適用後に target 順を GraphQL で再取得して修復する

---

Expand Down Expand Up @@ -251,7 +252,7 @@ ApplyWorkflow(spec):
```jsonc
{
"views": [{
"number": 1, "name": "Backlog", "layout": "TABLE_LAYOUT",
"number": 1, "tabPosition": 0, "name": "Backlog", "layout": "TABLE_LAYOUT",
"filter": "is:issue -status:Done",
"visibleFields": ["Title", "Assignees", "Status", "Priority"], // 列順そのまま
"groupBy": ["Status"], "verticalGroupBy": [],
Expand Down Expand Up @@ -282,7 +283,7 @@ ApplyWorkflow(spec):

browser importer 自体は各 view / workflow の適用直後に完全な read-back diff を行わない。移行後は `ghpmv verify --enable-browser-automation` が次を比較する:

1. **API で読める項目**: GraphQL で対象 view を `views(first:50)` から number 一致で取得し、`layout / filter / groupByFields / sortByFields / verticalGroupByFields / fields(POSITION順)` を spec と比較
1. **API で読める項目**: GraphQL で対象 view を `views(first:50, orderBy:{field:POSITION})` から number 一致で取得し、`tabPosition / layout / filter / groupByFields / sortByFields / verticalGroupByFields / visibleFields` を spec と比較
2. **UI でしか読めない項目**: §3.2 / §4.2 の export 用読み取りルーチンを**そのまま再利用**してターゲットを再スクレイプし、spec.ui と比較
3. 差分は `verify` コマンドと同じレポーター(期待値/実測値/対象)で出力

Expand Down Expand Up @@ -312,7 +313,7 @@ v1 対象外項目の将来対応方針(v1.x / v2)は [PLAN.md §8「スコー
| 項目 | 判断 |
|---|---|
| 表示フィールドの列順 | GraphQL `visibleFields` / `visibleFieldIds` で明示的に再現する |
| View タブの並び順(D&D のみ) | v1 スコープ外。import 後に警告で「手動で並び替えてください」と案内 |
| View タブの並び順(D&D のみ) | 対応済み。LIS を残す最小 D&D 計画を使い、overflow tab は `ScrollIntoViewIfNeededAsync` 後に操作。既に一致する場合は drag しない |
| disabled workflow への設定適用 | 対応済み。設定保存後に toggle off へ戻す |
| memex 内部 API の直接利用 | 既定では不採用。HAR は現時点で成果物として記録していない。UI 操作不能項目が出た場合に調査・取得を検討 |
| UI 変更による破損 | リリース前の手動 browser E2E と `docs/ui-maps/` の実測記録で確認。回復可能な破損は warning + 対象設定の skip。scheduled/nightly CI は未実装 |
Expand All @@ -331,3 +332,4 @@ v1 対象外項目の将来対応方針(v1.x / v2)は [PLAN.md §8「スコー
| B7 | Workflow import(§4.3)W-1〜W-8 | 完了 |
| B8 | Workflow import W-9(Auto-add 複数 + 上限処理) | 完了。実装上限は 20 |
| B9 | ラウンドトリップ E2E(§6) | テスト実装済み・手動実行。scheduled/nightly CI は未実装 |
| B10 | View tab POSITION export / verify + browser D&D import | 完了。旧 snapshot の null は比較・修復対象外 |
23 changes: 15 additions & 8 deletions docs/MANUAL_TEST_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ GitHub Copilot に一問一答で案内させる場合は、repository-local Ski
- linked repository
- linked Team と Team に付与される read permission
- explicit project collaborators
- Table / Board / Roadmap views
- Table / Board / Roadmap views と tab order
- enabled / disabled workflows と Auto-add settings

---
Expand All @@ -66,7 +66,7 @@ GitHub Copilot に一問一答で案内させる場合は、repository-local Ski
| Linked repositories | `ghpmv verify` warning 確認 + 目視 | `--repo-mapping` が必須。 |
| Project-to-Team links | `ghpmv verify` + Team Projects / Manage access UI | `organization/slug` で識別。explicit collaborator とは別カテゴリ。 |
| Explicit project collaborators | browser export/import + 目視 | inherited access は対象外。 |
| Views | browser export/import + 目視 | Table / Board / Roadmap、filter、sort、slice、field sum など。 |
| Views | GraphQL verify + browser export/import + 目視 | Table / Board / Roadmap、filter、sort、slice、field sum、tab order。tab order の read/verify は API-only。 |
| Workflows | browser export/import + 目視 | built-in workflows、Auto-add、disabled workflow。 |

### 2.2 対象外または warning 許容
Expand All @@ -75,7 +75,6 @@ GitHub Copilot に一問一答で案内させる場合は、repository-local Ski
- Draft issue の元作成者 / 作成日時の完全保持。
- item / field value の履歴。
- inherited / base-role / org owner / enterprise policy 由来の project access。
- View tab の drag-and-drop 順序。
- Insights charts。
- REDACTED / 権限不足で見えない items。
- archived item の position。
Expand Down Expand Up @@ -126,7 +125,7 @@ EMU / SAML / OIDC backed organization の場合は、PAT と browser session の

Team link の手動 E2E では共有 Team を変更せず、source/target の各 organization にこのテスト専用 Team を作成してください。source fixture には `--fixture-team <source-team-slug>` を渡します。target Team は同じ slug、または renamed mapping を確認する別 slug にします。

Views の作成と name / layout / filter / visible fields は GraphQL API で設定します。標準 fixture には API 未対応の View 設定と Workflows も含まれるため、`ghpmv setup --fixture-ui` は API View import の後に C# の Playwright layer でそれらだけを補完します。手動で UI をぽちぽち濃くする必要はありません。
Views の作成と name / layout / filter / visible fields は GraphQL API で設定します。標準 fixture には API 未対応の View 設定、非自明な `Fixture Roadmap → View 1 → Fixture Board` の tab order、Workflows も含まれるため、`ghpmv setup --fixture-ui` は API View import の後に C# の Playwright layer で補完します。手動で UI をぽちぽち濃くする必要はありません。

---

Expand Down Expand Up @@ -308,7 +307,7 @@ Source project number: <source-project-number>

### 5.2 View / Workflow fixture を GraphQL API + C# / Playwright で作成する

`ghpmv setup --fixture` は repository / fields / items / Status Updates までを作ります。`--fixture-require-new` を指定した新規 E2E fixture では、Project の Date / Iteration 値を実行週の月曜日を基準に配置し、Roadmap の初期表示範囲内で確認できるようにします。基準日は operation log に保存されるため、日をまたいだ再実行でも変わりません。続けて `ghpmv setup --fixture-ui` を実行すると、Views の基本設定を GraphQL API で作成・更新し、group/sort/slice/roadmap など API 未対応設定と Workflows を C# の `ViewUiImporter` / `WorkflowUiImporter` が Playwright で補完します。
`ghpmv setup --fixture` は repository / fields / items / Status Updates までを作ります。`--fixture-require-new` を指定した新規 E2E fixture では、Project の Date / Iteration 値を実行週の月曜日を基準に配置し、Roadmap の初期表示範囲内で確認できるようにします。基準日は operation log に保存されるため、日をまたいだ再実行でも変わりません。続けて `ghpmv setup --fixture-ui` を実行すると、Views の基本設定を GraphQL API で作成・更新し、group/sort/slice/roadmap、非自明な tab order、Workflows を C# の `ViewUiImporter` / `WorkflowUiImporter` が Playwright で補完します。

```powershell
dotnet run --project src/Ghpmv.Cli -- setup `
Expand Down Expand Up @@ -343,6 +342,7 @@ dotnet run --project src/Ghpmv.Cli -- setup `
- `View 1`: Table、filter、sort、Slice by、visible fields
- `Fixture Board`: Board、Column by、Swimlanes、Field sum
- `Fixture Roadmap`: Roadmap、date fields、Quarter zoom、markers
- tab order: `Fixture Roadmap` → `View 1` → `Fixture Board`
- Workflows
- item state 系 built-in workflows
- `Auto-add to project`
Expand All @@ -359,6 +359,7 @@ dotnet run --project src/Ghpmv.Cli -- setup `

Views:

- タブを `Fixture Roadmap` → Table view → Board view の非自明な順に並べる
- Table view
- filter を設定
- hidden / visible fields を調整
Expand Down Expand Up @@ -486,6 +487,7 @@ dotnet run --project src/Ghpmv.Cli -- export `
- `repository-mappings.csv` が生成される。
- linked Team がある場合は `team-mappings.csv` が生成され、source 値は `organization/slug` になっている。
- source UI の Views / Workflows / collaborators に関する warning がない、または想定内である。
- 各 View の `tabPosition` が 0 から始まる source UI 順で保存され、view `number` 順とは独立している。

### 7.2 Mapping CSV を補完

Expand Down Expand Up @@ -587,6 +589,8 @@ dotnet run --project src/Ghpmv.Cli -- verify `

`--enable-browser-automation` を付けた verify は、比較前に target の View / Workflow UI 設定と explicit collaborators を再取得します。選択した profile が target host に未認証、または API token と別アカウントの場合は、target の読み取り開始前に明確なエラーと非ゼロ終了になります。

同じ verify を先に `--enable-browser-automation` / `--browser-profile` なしでも実行し、GraphQL POSITION による tab order が一致していることを確認します。API-only verify は UI-only 設定を未検証として扱いますが、tab order の差分は `View` category の error として報告できます。

source / target の repository 名、user login、または Team slug が異なる場合、`verify` にも import と同じ `--repo-mapping` / `--user-mapping` / `--team-mapping` を渡してください。これにより Issue / PR item、linked repository、explicit user collaborator、linked Team は target 側の名前へ正規化して比較されます。生成されていない optional mapping の引数は外してください。

期待値:
Expand Down Expand Up @@ -648,7 +652,9 @@ warning / error が出た場合は、次の観点で切り分けます。
- [ ] Board view の Column by / Swimlanes / Slice by が一致。
- [ ] Roadmap view の date fields / zoom / markers が一致。
- [ ] View 名が一致。
- [ ] View tab order は v1 対象外として warning または手動補正対象に記録。
- [ ] View tab order が `Fixture Roadmap` → `View 1` → `Fixture Board` で一致。
- [ ] 通常幅とタブが画面幅を超える狭い幅の両方で source/target 順が一致。
- [ ] import を再実行しても既に正しい tab order は変化しない。

### 8.5 Status Updates

Expand Down Expand Up @@ -693,7 +699,7 @@ warning / error が出た場合は、次の観点で切り分けます。

| ID | 手順 | 期待結果 |
|---|---|---|
| N-1 | `--enable-browser-automation` なしで export/import | API-only 項目は移行され、Views / Workflows UI-only 項目は warning または未移行として扱われる。 |
| N-1 | `--enable-browser-automation` なしで export/import | POSITION は snapshot に保存され verify で比較されるが、API-only import は既存 target の tab order 差分を修復せず warning にする。Views / Workflows UI-only 項目も warning または未移行として扱われる。 |
| N-2 | `repository-mappings.csv` から fixture repo 行を削除して import | Issue / PR item が warning + skip され、Draft items は作成される。 |
| N-3 | target token を source token に差し替えて import | 権限不足で失敗し、Project を壊さない。 |
| N-4 | browser profile を間違える | ログイン / 権限エラーで失敗し、再ログイン案内が出る。 |
Expand All @@ -703,7 +709,8 @@ warning / error が出た場合は、次の観点で切り分けます。
| N-8 | `team-mappings.csv` を存在しない Team に向けて import | Project 作成・metadata 更新より前に `unresolved` preflight error で停止する。 |
| N-9 | Team read/maintainer 権限のない token、または admin access のない既存 Project で import | Team mutation の実行前に `permission` preflight error で停止する。 |
| N-10 | target にだけ別の Team link を追加して verify | `TeamLink` warning と `PartialMatch` になり、target-only link は削除されない。 |
| N-11 | `project.template: true` の snapshot を `--owner-type user` で import | 最初の API write より前に、user-owned Project は template にできないことを示す error で停止する。 |
| N-11 | target UI で View tab を逆順にして API-only verify | `View` category と JSON report に `view tab order mismatch` が出る。続けて browser-assisted import を再実行すると順序が修復される。 |
| N-12 | `project.template: true` の snapshot を `--owner-type user` で import | 最初の API write より前に、user-owned Project は template にできないことを示す error で停止する。 |

---

Expand Down
Loading