Skip to content

Conversation

@ming1013
Copy link

@ming1013 ming1013 commented Dec 15, 2025

Adds a plugin to automate OpenShift Tests Extension (OTE) migration
for component repositories. The plugin handles the complete migration
workflow including:

  • Repository setup and management
  • Directory structure creation
  • Test file and testdata migration
  • Automatic dependency vendoring
  • Code generation (go.mod, main.go, Makefile, fixtures.go)
  • Automatic FixturePath() migration and import updates
  • Build verification

The plugin supports two directory strategies:

  • Monorepo: Integrate into existing repos with cmd/ and test/
  • Single-module: Create isolated tests-extension directory

This replaces the need for install.sh as plugins are installed
globally through the marketplace and work in any repository.

What this PR does / why we need it:

Which issue(s) this PR fixes:

Fixes

Special notes for your reviewer:

Checklist:

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes docs.

Single mode tested by: openshift/router#705
Monorepo tested by: openshift/cloud-credential-operator#954

Summary by CodeRabbit

  • New Features

    • Added OTE Migration plugin (v1.0.0) with an interactive "migrate" command to automate OTE migrations for component repositories.
  • Documentation

    • Added comprehensive plugin README and detailed migrate command guide covering workflow, prompts, examples, validation, and troubleshooting.
  • Bug Fixes

    • Plugin index contains duplicated OTE Migration sections that should be consolidated.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 15, 2025

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

💤 Files selected but had no reviewable changes (1)
  • plugins/ote-migration/commands/migrate.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • 🔍 Trigger a full review

Walkthrough

Adds a new ote-migration plugin: marketplace and docs entries, a plugin manifest, README, and detailed migrate command documentation to automate OpenShift Tests Extension (OTE) migration for component repositories.

Changes

Cohort / File(s) Summary
Marketplace manifest
/.claude-plugin/marketplace.json, .claude-plugin/marketplace.json
Added new ote-migration plugin entry (name, source: ./plugins/ote-migration, description, version: 1.0.0).
Docs index & plugins list
docs/data.json, PLUGINS.md
Appended ote-migration plugin object to docs/data.json (adds migrate command); inserted Ote Migration block into PLUGINS.md (duplicate block present).
Plugin manifest
plugins/ote-migration/.claude-plugin/plugin.json
New plugin manifest with metadata (name: ote-migration, description, version: 1.0.0, author).
Plugin documentation
plugins/ote-migration/README.md, plugins/ote-migration/commands/migrate.md
Added comprehensive README and migrate command docs covering workflow, repository strategies, examples, and validation steps.

Sequence Diagram(s)

sequenceDiagram
  actor User
  participant CLI as "Claude CLI / Marketplace"
  participant Plugin as "ote-migration"
  participant Git as "Git / Remote Repo"
  participant Toolchain as "Go toolchain / Build"

  User->>CLI: invoke /ote-migration:migrate
  CLI->>Plugin: forward prompts & options
  Plugin->>Git: clone or update target repo
  Plugin->>Plugin: create structure, generate files, migrate tests
  Plugin->>Toolchain: run go mod, bindata, build & tests
  Toolchain-->>Plugin: return build/test results
  Plugin-->>Git: commit changes (optional)
  Plugin-->>CLI: report migration status
  CLI-->>User: display results & next steps
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (2 errors, 1 inconclusive)
Check name Status Explanation Resolution
No Real People Names In Style References ❌ Error The pull request contains real person names used in example code/output in OTE migration plugin documentation. Specifically, 'john' appears multiple times in README.md and migrate.md as a sample author name in test file examples showing migration process transformations. Replace all instances of 'john' in example test content with generic placeholders like '' or '' to maintain example clarity while adhering to style guide requirements.
No Assumed Git Remote Names ❌ Error Plugin documentation hardcodes 'upstream' remote name in migrate.md lines 471 and 596 without verifying if it exists or conflicts with existing repositories, contradicting the README's claim of dynamic git remote discovery. Check if 'upstream' exists via 'git remote get-url upstream 2>/dev/null'; if it exists with different URL, generate unique remote name or prompt user for preferred name.
Ai-Helpers Overlap Detection ❓ Inconclusive Unable to verify due to missing shell execution environment and file system access in current context. Execute verification commands in appropriate shell environment with access to repository files and git history.
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: adding an OTE migration plugin. It directly matches the changeset which adds plugin files, documentation, and marketplace entries for the ote-migration plugin.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Git Push Safety Rules ✅ Passed The rg search returned exit code 1 with no git push matches found. The plugin uses git clone, fetch, pull, and checkout operations but does not contain any git push commands.
No Untrusted Mcp Servers ✅ Passed No MCP server installations from untrusted sources detected. PR adds a local plugin from ./plugins/ote-migration using standard CLI tools without external MCP dependencies.

Comment @coderabbitai help to get the list of available commands and usage tips.

@ming1013 ming1013 changed the title Add OTE migration plugin [OCPERT-210]Add OTE migration plugin Dec 15, 2025
@ming1013
Copy link
Author

need more test
/hold

@openshift-ci openshift-ci bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Dec 15, 2025
@ming1013
Copy link
Author

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (3)
plugins/ote-migration/commands/migrate.md (3)

2026-2080: Consolidate duplicate Troubleshooting sections.

The "Troubleshooting" section appears twice in the file (monorepo strategy and single-module strategy). While some troubleshooting guidance may be strategy-specific, you have significant overlap that could be consolidated.

Suggested approach:

  1. Create a single "## Troubleshooting" section with subsections for each strategy
  2. Pull out common issues (dependency download failures, build failures, import path issues) into a shared section
  3. Add strategy-specific variations only where needed

Current duplicates:

  • Lines ~2026-2078: Monorepo troubleshooting
  • Lines ~2265-2312: Single-module troubleshooting
  • Both include nearly identical sections for "If Dependency Download Was Interrupted" and "If Build Fails"

This reduces file length and maintenance burden.

Also applies to: 2265-2380


1-20: Document the YAML frontmatter fields.

The frontmatter at lines 1-4 is minimal and clear, but for consistency with other command documentation, consider adding metadata about:

  • Whether the command supports dry-run mode
  • Prerequisites (requires git, Go installed, etc.)
  • Expected output/success criteria

This helps users understand what to expect before running the migration.


18-42: Clarify the 8-phase workflow summary.

While the detailed breakdown in each phase is excellent, the overview at lines 18-28 could be enhanced with:

  • Estimated time for each phase
  • Prerequisites for each phase (e.g., "Phase 3 requires git to be installed")
  • Rollback strategy if migration fails at a specific phase

This helps users understand the workflow impact and recovery options.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between f0e0326 and 425e0cc.

📒 Files selected for processing (6)
  • .claude-plugin/marketplace.json (1 hunks)
  • PLUGINS.md (2 hunks)
  • docs/data.json (1 hunks)
  • plugins/ote-migration/.claude-plugin/plugin.json (1 hunks)
  • plugins/ote-migration/README.md (1 hunks)
  • plugins/ote-migration/commands/migrate.md (1 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.18.1)
plugins/ote-migration/commands/migrate.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


64-64: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


75-75: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


188-188: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


210-210: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


594-594: Hard tabs
Column: 32

(MD010, no-hard-tabs)


674-674: Hard tabs
Column: 1

(MD010, no-hard-tabs)


675-675: Hard tabs
Column: 1

(MD010, no-hard-tabs)


676-676: Hard tabs
Column: 1

(MD010, no-hard-tabs)


677-677: Hard tabs
Column: 1

(MD010, no-hard-tabs)


678-678: Hard tabs
Column: 1

(MD010, no-hard-tabs)


679-679: Hard tabs
Column: 1

(MD010, no-hard-tabs)


680-680: Hard tabs
Column: 1

(MD010, no-hard-tabs)


681-681: Hard tabs
Column: 1

(MD010, no-hard-tabs)


682-682: Hard tabs
Column: 1

(MD010, no-hard-tabs)


683-683: Hard tabs
Column: 1

(MD010, no-hard-tabs)


684-684: Hard tabs
Column: 1

(MD010, no-hard-tabs)


685-685: Hard tabs
Column: 1

(MD010, no-hard-tabs)


686-686: Hard tabs
Column: 1

(MD010, no-hard-tabs)


687-687: Hard tabs
Column: 1

(MD010, no-hard-tabs)


688-688: Hard tabs
Column: 1

(MD010, no-hard-tabs)


689-689: Hard tabs
Column: 1

(MD010, no-hard-tabs)


690-690: Hard tabs
Column: 1

(MD010, no-hard-tabs)


691-691: Hard tabs
Column: 1

(MD010, no-hard-tabs)


692-692: Hard tabs
Column: 1

(MD010, no-hard-tabs)


693-693: Hard tabs
Column: 1

(MD010, no-hard-tabs)


694-694: Hard tabs
Column: 1

(MD010, no-hard-tabs)


695-695: Hard tabs
Column: 1

(MD010, no-hard-tabs)


696-696: Hard tabs
Column: 1

(MD010, no-hard-tabs)


697-697: Hard tabs
Column: 1

(MD010, no-hard-tabs)


698-698: Hard tabs
Column: 1

(MD010, no-hard-tabs)


699-699: Hard tabs
Column: 1

(MD010, no-hard-tabs)


700-700: Hard tabs
Column: 1

(MD010, no-hard-tabs)


701-701: Hard tabs
Column: 1

(MD010, no-hard-tabs)


702-702: Hard tabs
Column: 1

(MD010, no-hard-tabs)


703-703: Hard tabs
Column: 1

(MD010, no-hard-tabs)


704-704: Hard tabs
Column: 1

(MD010, no-hard-tabs)


782-782: Hard tabs
Column: 1

(MD010, no-hard-tabs)


783-783: Hard tabs
Column: 1

(MD010, no-hard-tabs)


784-784: Hard tabs
Column: 1

(MD010, no-hard-tabs)


785-785: Hard tabs
Column: 1

(MD010, no-hard-tabs)


787-787: Hard tabs
Column: 1

(MD010, no-hard-tabs)


789-789: Hard tabs
Column: 1

(MD010, no-hard-tabs)


790-790: Hard tabs
Column: 1

(MD010, no-hard-tabs)


791-791: Hard tabs
Column: 1

(MD010, no-hard-tabs)


792-792: Hard tabs
Column: 1

(MD010, no-hard-tabs)


794-794: Hard tabs
Column: 1

(MD010, no-hard-tabs)


795-795: Hard tabs
Column: 1

(MD010, no-hard-tabs)


797-797: Hard tabs
Column: 1

(MD010, no-hard-tabs)


798-798: Hard tabs
Column: 1

(MD010, no-hard-tabs)


802-802: Hard tabs
Column: 1

(MD010, no-hard-tabs)


803-803: Hard tabs
Column: 1

(MD010, no-hard-tabs)


805-805: Hard tabs
Column: 1

(MD010, no-hard-tabs)


806-806: Hard tabs
Column: 1

(MD010, no-hard-tabs)


807-807: Hard tabs
Column: 1

(MD010, no-hard-tabs)


808-808: Hard tabs
Column: 1

(MD010, no-hard-tabs)


809-809: Hard tabs
Column: 1

(MD010, no-hard-tabs)


811-811: Hard tabs
Column: 1

(MD010, no-hard-tabs)


812-812: Hard tabs
Column: 1

(MD010, no-hard-tabs)


813-813: Hard tabs
Column: 1

(MD010, no-hard-tabs)


814-814: Hard tabs
Column: 1

(MD010, no-hard-tabs)


815-815: Hard tabs
Column: 1

(MD010, no-hard-tabs)


817-817: Hard tabs
Column: 1

(MD010, no-hard-tabs)


818-818: Hard tabs
Column: 1

(MD010, no-hard-tabs)


819-819: Hard tabs
Column: 1

(MD010, no-hard-tabs)


820-820: Hard tabs
Column: 1

(MD010, no-hard-tabs)


821-821: Hard tabs
Column: 1

(MD010, no-hard-tabs)


822-822: Hard tabs
Column: 1

(MD010, no-hard-tabs)


823-823: Hard tabs
Column: 1

(MD010, no-hard-tabs)


824-824: Hard tabs
Column: 1

(MD010, no-hard-tabs)


825-825: Hard tabs
Column: 1

(MD010, no-hard-tabs)


827-827: Hard tabs
Column: 1

(MD010, no-hard-tabs)


828-828: Hard tabs
Column: 1

(MD010, no-hard-tabs)


829-829: Hard tabs
Column: 1

(MD010, no-hard-tabs)


830-830: Hard tabs
Column: 1

(MD010, no-hard-tabs)


831-831: Hard tabs
Column: 1

(MD010, no-hard-tabs)


832-832: Hard tabs
Column: 1

(MD010, no-hard-tabs)


833-833: Hard tabs
Column: 1

(MD010, no-hard-tabs)


834-834: Hard tabs
Column: 1

(MD010, no-hard-tabs)


836-836: Hard tabs
Column: 1

(MD010, no-hard-tabs)


837-837: Hard tabs
Column: 1

(MD010, no-hard-tabs)


838-838: Hard tabs
Column: 1

(MD010, no-hard-tabs)


839-839: Hard tabs
Column: 1

(MD010, no-hard-tabs)


840-840: Hard tabs
Column: 1

(MD010, no-hard-tabs)


842-842: Hard tabs
Column: 1

(MD010, no-hard-tabs)


843-843: Hard tabs
Column: 1

(MD010, no-hard-tabs)


844-844: Hard tabs
Column: 1

(MD010, no-hard-tabs)


845-845: Hard tabs
Column: 1

(MD010, no-hard-tabs)


846-846: Hard tabs
Column: 1

(MD010, no-hard-tabs)


847-847: Hard tabs
Column: 1

(MD010, no-hard-tabs)


848-848: Hard tabs
Column: 1

(MD010, no-hard-tabs)


849-849: Hard tabs
Column: 1

(MD010, no-hard-tabs)


851-851: Hard tabs
Column: 1

(MD010, no-hard-tabs)


852-852: Hard tabs
Column: 1

(MD010, no-hard-tabs)


853-853: Hard tabs
Column: 1

(MD010, no-hard-tabs)


854-854: Hard tabs
Column: 1

(MD010, no-hard-tabs)


855-855: Hard tabs
Column: 1

(MD010, no-hard-tabs)


857-857: Hard tabs
Column: 1

(MD010, no-hard-tabs)


858-858: Hard tabs
Column: 1

(MD010, no-hard-tabs)


860-860: Hard tabs
Column: 1

(MD010, no-hard-tabs)


861-861: Hard tabs
Column: 1

(MD010, no-hard-tabs)


862-862: Hard tabs
Column: 1

(MD010, no-hard-tabs)


864-864: Hard tabs
Column: 1

(MD010, no-hard-tabs)


866-866: Hard tabs
Column: 1

(MD010, no-hard-tabs)


867-867: Hard tabs
Column: 1

(MD010, no-hard-tabs)


868-868: Hard tabs
Column: 1

(MD010, no-hard-tabs)


869-869: Hard tabs
Column: 1

(MD010, no-hard-tabs)


870-870: Hard tabs
Column: 1

(MD010, no-hard-tabs)


882-882: Hard tabs
Column: 1

(MD010, no-hard-tabs)


883-883: Hard tabs
Column: 1

(MD010, no-hard-tabs)


884-884: Hard tabs
Column: 1

(MD010, no-hard-tabs)


885-885: Hard tabs
Column: 1

(MD010, no-hard-tabs)


887-887: Hard tabs
Column: 1

(MD010, no-hard-tabs)


889-889: Hard tabs
Column: 1

(MD010, no-hard-tabs)


890-890: Hard tabs
Column: 1

(MD010, no-hard-tabs)


891-891: Hard tabs
Column: 1

(MD010, no-hard-tabs)


892-892: Hard tabs
Column: 1

(MD010, no-hard-tabs)


894-894: Hard tabs
Column: 1

(MD010, no-hard-tabs)


895-895: Hard tabs
Column: 1

(MD010, no-hard-tabs)


897-897: Hard tabs
Column: 1

(MD010, no-hard-tabs)


898-898: Hard tabs
Column: 1

(MD010, no-hard-tabs)


902-902: Hard tabs
Column: 1

(MD010, no-hard-tabs)


903-903: Hard tabs
Column: 1

(MD010, no-hard-tabs)


905-905: Hard tabs
Column: 1

(MD010, no-hard-tabs)


906-906: Hard tabs
Column: 1

(MD010, no-hard-tabs)


907-907: Hard tabs
Column: 1

(MD010, no-hard-tabs)


908-908: Hard tabs
Column: 1

(MD010, no-hard-tabs)


909-909: Hard tabs
Column: 1

(MD010, no-hard-tabs)


911-911: Hard tabs
Column: 1

(MD010, no-hard-tabs)


912-912: Hard tabs
Column: 1

(MD010, no-hard-tabs)


913-913: Hard tabs
Column: 1

(MD010, no-hard-tabs)


914-914: Hard tabs
Column: 1

(MD010, no-hard-tabs)


915-915: Hard tabs
Column: 1

(MD010, no-hard-tabs)


917-917: Hard tabs
Column: 1

(MD010, no-hard-tabs)


918-918: Hard tabs
Column: 1

(MD010, no-hard-tabs)


919-919: Hard tabs
Column: 1

(MD010, no-hard-tabs)


920-920: Hard tabs
Column: 1

(MD010, no-hard-tabs)


921-921: Hard tabs
Column: 1

(MD010, no-hard-tabs)


922-922: Hard tabs
Column: 1

(MD010, no-hard-tabs)


923-923: Hard tabs
Column: 1

(MD010, no-hard-tabs)


924-924: Hard tabs
Column: 1

(MD010, no-hard-tabs)


925-925: Hard tabs
Column: 1

(MD010, no-hard-tabs)


927-927: Hard tabs
Column: 1

(MD010, no-hard-tabs)


928-928: Hard tabs
Column: 1

(MD010, no-hard-tabs)


929-929: Hard tabs
Column: 1

(MD010, no-hard-tabs)


930-930: Hard tabs
Column: 1

(MD010, no-hard-tabs)


931-931: Hard tabs
Column: 1

(MD010, no-hard-tabs)


932-932: Hard tabs
Column: 1

(MD010, no-hard-tabs)


933-933: Hard tabs
Column: 1

(MD010, no-hard-tabs)


934-934: Hard tabs
Column: 1

(MD010, no-hard-tabs)


936-936: Hard tabs
Column: 1

(MD010, no-hard-tabs)


937-937: Hard tabs
Column: 1

(MD010, no-hard-tabs)


938-938: Hard tabs
Column: 1

(MD010, no-hard-tabs)


939-939: Hard tabs
Column: 1

(MD010, no-hard-tabs)


940-940: Hard tabs
Column: 1

(MD010, no-hard-tabs)


942-942: Hard tabs
Column: 1

(MD010, no-hard-tabs)


943-943: Hard tabs
Column: 1

(MD010, no-hard-tabs)


944-944: Hard tabs
Column: 1

(MD010, no-hard-tabs)


945-945: Hard tabs
Column: 1

(MD010, no-hard-tabs)


946-946: Hard tabs
Column: 1

(MD010, no-hard-tabs)


947-947: Hard tabs
Column: 1

(MD010, no-hard-tabs)


948-948: Hard tabs
Column: 1

(MD010, no-hard-tabs)


949-949: Hard tabs
Column: 1

(MD010, no-hard-tabs)


951-951: Hard tabs
Column: 1

(MD010, no-hard-tabs)


952-952: Hard tabs
Column: 1

(MD010, no-hard-tabs)


953-953: Hard tabs
Column: 1

(MD010, no-hard-tabs)


954-954: Hard tabs
Column: 1

(MD010, no-hard-tabs)


955-955: Hard tabs
Column: 1

(MD010, no-hard-tabs)


957-957: Hard tabs
Column: 1

(MD010, no-hard-tabs)


958-958: Hard tabs
Column: 1

(MD010, no-hard-tabs)


960-960: Hard tabs
Column: 1

(MD010, no-hard-tabs)


961-961: Hard tabs
Column: 1

(MD010, no-hard-tabs)


962-962: Hard tabs
Column: 1

(MD010, no-hard-tabs)


964-964: Hard tabs
Column: 1

(MD010, no-hard-tabs)


966-966: Hard tabs
Column: 1

(MD010, no-hard-tabs)


967-967: Hard tabs
Column: 1

(MD010, no-hard-tabs)


968-968: Hard tabs
Column: 1

(MD010, no-hard-tabs)


969-969: Hard tabs
Column: 1

(MD010, no-hard-tabs)


970-970: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1041-1041: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1042-1042: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1043-1043: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1050-1050: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1051-1051: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1052-1052: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1053-1053: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1054-1054: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1055-1055: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1059-1059: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1079-1079: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1080-1080: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1081-1081: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1088-1088: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1089-1089: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1090-1090: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1091-1091: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1092-1092: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1093-1093: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1097-1097: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1113-1113: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1118-1118: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1122-1122: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1123-1123: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1124-1124: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1125-1125: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1126-1126: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1139-1139: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1140-1140: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1141-1141: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1142-1142: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1151-1151: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1156-1156: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1157-1157: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1161-1161: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1162-1162: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1163-1163: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1164-1164: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1165-1165: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1179-1179: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1184-1184: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1189-1189: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1194-1194: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1198-1198: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1199-1199: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1200-1200: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1201-1201: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1202-1202: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1203-1203: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1222-1222: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1223-1223: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1224-1224: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1225-1225: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1226-1226: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1227-1227: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1231-1231: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1232-1232: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1237-1237: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1238-1238: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1239-1239: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1240-1240: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1241-1241: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1254-1254: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1256-1256: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1257-1257: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1258-1258: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1259-1259: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1261-1261: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1262-1262: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1263-1263: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1264-1264: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1266-1266: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1267-1267: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1268-1268: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1269-1269: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1270-1270: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1271-1271: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1272-1272: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1274-1274: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1275-1275: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1276-1276: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1277-1277: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1278-1278: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1279-1279: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1280-1280: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1281-1281: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1282-1282: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1283-1283: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1284-1284: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1285-1285: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1286-1286: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1287-1287: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1289-1289: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1295-1295: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1296-1296: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1297-1297: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1298-1298: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1307-1307: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1308-1308: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1309-1309: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1310-1310: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1311-1311: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1313-1313: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1319-1319: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1320-1320: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1321-1321: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1322-1322: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1323-1323: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1336-1336: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1337-1337: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1338-1338: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1339-1339: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1340-1340: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1341-1341: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1351-1351: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1352-1352: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1353-1353: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1354-1354: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1355-1355: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1356-1356: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1357-1357: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1358-1358: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1359-1359: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1360-1360: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1369-1369: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1370-1370: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1371-1371: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1372-1372: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1373-1373: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1374-1374: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1375-1375: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1376-1376: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1377-1377: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1378-1378: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1379-1379: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1380-1380: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1389-1389: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1398-1398: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1410-1410: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1411-1411: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1412-1412: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1413-1413: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1414-1414: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1415-1415: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1416-1416: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1417-1417: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1418-1418: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1419-1419: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1428-1428: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1588-1588: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1593-1593: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1632-1632: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1637-1637: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1785-1785: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


1940-1940: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


2106-2106: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


2258-2258: Hard tabs
Column: 1

(MD010, no-hard-tabs)


2262-2262: Hard tabs
Column: 1

(MD010, no-hard-tabs)


2265-2265: Multiple headings with the same content

(MD024, no-duplicate-heading)


2381-2381: Multiple headings with the same content

(MD024, no-duplicate-heading)


2405-2405: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/ote-migration/README.md

5-5: Headings must start at the beginning of the line

(MD023, heading-start-left)


9-9: Headings must start at the beginning of the line

(MD023, heading-start-left)


11-11: Headings must start at the beginning of the line

(MD023, heading-start-left)


26-26: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


27-27: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


28-28: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


29-29: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


30-30: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


31-31: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


32-32: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


33-33: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


35-35: Headings must start at the beginning of the line

(MD023, heading-start-left)

🔇 Additional comments (4)
.claude-plugin/marketplace.json (1)

132-136: Marketplace entry correctly integrated.

The plugin entry follows the established pattern and is properly positioned in the plugins array.

docs/data.json (1)

991-1006: Plugin metadata correctly registered in data.json.

The entry follows the established structure with all required fields properly populated. The version 1.0.0 indicates this is considered a stable release compared to most other plugins.

PLUGINS.md (1)

24-24: Plugin documentation properly added to PLUGINS.md.

The table of contents entry and plugin section follow the established conventions, with correct alphabetical positioning and consistent formatting with other plugin entries.

Also applies to: 255-262

plugins/ote-migration/.claude-plugin/plugin.json (1)

1-8: Plugin manifest complete and properly formatted.

All metadata fields are present with consistent values across files. The author field, while using an email address, is valid though slightly unconventional (typically uses a name format).

@ming1013 ming1013 changed the title [OCPERT-210]Add OTE migration plugin [OCPERT-264]Add OTE migration plugin Dec 15, 2025
@ming1013 ming1013 changed the title [OCPERT-264]Add OTE migration plugin [OCPERT-210]Add OTE migration plugin Dec 15, 2025
@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Dec 20, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
plugins/ote-migration/commands/migrate.md (1)

1832-1883: Consolidate duplicate "Troubleshooting" sections.

The file contains three similar "Troubleshooting" sections with overlapping guidance:

  • Lines 1832-1883 (monorepo strategy Troubleshooting)
  • Lines 2071-2118 (single-module strategy Troubleshooting)
  • Lines 2187-2210 (additional Troubleshooting in customization section)

These sections repeat common issues like dependency download failures, build failures, and fixture errors. Consolidate into a single "Troubleshooting" section with clear subsections for:

  • Common Issues (applies to both strategies)
  • Monorepo-specific problems
  • Single-module-specific problems

This will reduce duplication and improve maintainability.

Also applies to: 2071-2118, 2187-2210

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between 425e0cc and 62f52dc.

📒 Files selected for processing (1)
  • plugins/ote-migration/commands/migrate.md
🧰 Additional context used
🪛 markdownlint-cli2 (0.18.1)
plugins/ote-migration/commands/migrate.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


64-64: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


75-75: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


188-188: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


210-210: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


629-629: Hard tabs
Column: 32

(MD010, no-hard-tabs)


732-732: Hard tabs
Column: 1

(MD010, no-hard-tabs)


733-733: Hard tabs
Column: 1

(MD010, no-hard-tabs)


734-734: Hard tabs
Column: 1

(MD010, no-hard-tabs)


735-735: Hard tabs
Column: 1

(MD010, no-hard-tabs)


736-736: Hard tabs
Column: 1

(MD010, no-hard-tabs)


738-738: Hard tabs
Column: 1

(MD010, no-hard-tabs)


740-740: Hard tabs
Column: 1

(MD010, no-hard-tabs)


741-741: Hard tabs
Column: 1

(MD010, no-hard-tabs)


742-742: Hard tabs
Column: 1

(MD010, no-hard-tabs)


743-743: Hard tabs
Column: 1

(MD010, no-hard-tabs)


745-745: Hard tabs
Column: 1

(MD010, no-hard-tabs)


746-746: Hard tabs
Column: 1

(MD010, no-hard-tabs)


747-747: Hard tabs
Column: 1

(MD010, no-hard-tabs)


749-749: Hard tabs
Column: 1

(MD010, no-hard-tabs)


750-750: Hard tabs
Column: 1

(MD010, no-hard-tabs)


754-754: Hard tabs
Column: 1

(MD010, no-hard-tabs)


755-755: Hard tabs
Column: 1

(MD010, no-hard-tabs)


756-756: Hard tabs
Column: 1

(MD010, no-hard-tabs)


757-757: Hard tabs
Column: 1

(MD010, no-hard-tabs)


758-758: Hard tabs
Column: 1

(MD010, no-hard-tabs)


759-759: Hard tabs
Column: 1

(MD010, no-hard-tabs)


760-760: Hard tabs
Column: 1

(MD010, no-hard-tabs)


762-762: Hard tabs
Column: 1

(MD010, no-hard-tabs)


763-763: Hard tabs
Column: 1

(MD010, no-hard-tabs)


765-765: Hard tabs
Column: 1

(MD010, no-hard-tabs)


766-766: Hard tabs
Column: 1

(MD010, no-hard-tabs)


767-767: Hard tabs
Column: 1

(MD010, no-hard-tabs)


768-768: Hard tabs
Column: 1

(MD010, no-hard-tabs)


769-769: Hard tabs
Column: 1

(MD010, no-hard-tabs)


771-771: Hard tabs
Column: 1

(MD010, no-hard-tabs)


772-772: Hard tabs
Column: 1

(MD010, no-hard-tabs)


773-773: Hard tabs
Column: 1

(MD010, no-hard-tabs)


774-774: Hard tabs
Column: 1

(MD010, no-hard-tabs)


775-775: Hard tabs
Column: 1

(MD010, no-hard-tabs)


777-777: Hard tabs
Column: 1

(MD010, no-hard-tabs)


778-778: Hard tabs
Column: 1

(MD010, no-hard-tabs)


779-779: Hard tabs
Column: 1

(MD010, no-hard-tabs)


780-780: Hard tabs
Column: 1

(MD010, no-hard-tabs)


781-781: Hard tabs
Column: 1

(MD010, no-hard-tabs)


782-782: Hard tabs
Column: 1

(MD010, no-hard-tabs)


783-783: Hard tabs
Column: 1

(MD010, no-hard-tabs)


784-784: Hard tabs
Column: 1

(MD010, no-hard-tabs)


785-785: Hard tabs
Column: 1

(MD010, no-hard-tabs)


787-787: Hard tabs
Column: 1

(MD010, no-hard-tabs)


788-788: Hard tabs
Column: 1

(MD010, no-hard-tabs)


789-789: Hard tabs
Column: 1

(MD010, no-hard-tabs)


790-790: Hard tabs
Column: 1

(MD010, no-hard-tabs)


791-791: Hard tabs
Column: 1

(MD010, no-hard-tabs)


792-792: Hard tabs
Column: 1

(MD010, no-hard-tabs)


793-793: Hard tabs
Column: 1

(MD010, no-hard-tabs)


794-794: Hard tabs
Column: 1

(MD010, no-hard-tabs)


796-796: Hard tabs
Column: 1

(MD010, no-hard-tabs)


797-797: Hard tabs
Column: 1

(MD010, no-hard-tabs)


798-798: Hard tabs
Column: 1

(MD010, no-hard-tabs)


799-799: Hard tabs
Column: 1

(MD010, no-hard-tabs)


800-800: Hard tabs
Column: 1

(MD010, no-hard-tabs)


801-801: Hard tabs
Column: 1

(MD010, no-hard-tabs)


802-802: Hard tabs
Column: 1

(MD010, no-hard-tabs)


803-803: Hard tabs
Column: 1

(MD010, no-hard-tabs)


804-804: Hard tabs
Column: 1

(MD010, no-hard-tabs)


805-805: Hard tabs
Column: 1

(MD010, no-hard-tabs)


806-806: Hard tabs
Column: 1

(MD010, no-hard-tabs)


807-807: Hard tabs
Column: 1

(MD010, no-hard-tabs)


809-809: Hard tabs
Column: 1

(MD010, no-hard-tabs)


810-810: Hard tabs
Column: 1

(MD010, no-hard-tabs)


812-812: Hard tabs
Column: 1

(MD010, no-hard-tabs)


813-813: Hard tabs
Column: 1

(MD010, no-hard-tabs)


814-814: Hard tabs
Column: 1

(MD010, no-hard-tabs)


816-816: Hard tabs
Column: 1

(MD010, no-hard-tabs)


818-818: Hard tabs
Column: 1

(MD010, no-hard-tabs)


819-819: Hard tabs
Column: 1

(MD010, no-hard-tabs)


820-820: Hard tabs
Column: 1

(MD010, no-hard-tabs)


821-821: Hard tabs
Column: 1

(MD010, no-hard-tabs)


822-822: Hard tabs
Column: 1

(MD010, no-hard-tabs)


834-834: Hard tabs
Column: 1

(MD010, no-hard-tabs)


835-835: Hard tabs
Column: 1

(MD010, no-hard-tabs)


836-836: Hard tabs
Column: 1

(MD010, no-hard-tabs)


837-837: Hard tabs
Column: 1

(MD010, no-hard-tabs)


838-838: Hard tabs
Column: 1

(MD010, no-hard-tabs)


840-840: Hard tabs
Column: 1

(MD010, no-hard-tabs)


842-842: Hard tabs
Column: 1

(MD010, no-hard-tabs)


843-843: Hard tabs
Column: 1

(MD010, no-hard-tabs)


844-844: Hard tabs
Column: 1

(MD010, no-hard-tabs)


845-845: Hard tabs
Column: 1

(MD010, no-hard-tabs)


847-847: Hard tabs
Column: 1

(MD010, no-hard-tabs)


848-848: Hard tabs
Column: 1

(MD010, no-hard-tabs)


849-849: Hard tabs
Column: 1

(MD010, no-hard-tabs)


851-851: Hard tabs
Column: 1

(MD010, no-hard-tabs)


852-852: Hard tabs
Column: 1

(MD010, no-hard-tabs)


856-856: Hard tabs
Column: 1

(MD010, no-hard-tabs)


857-857: Hard tabs
Column: 1

(MD010, no-hard-tabs)


858-858: Hard tabs
Column: 1

(MD010, no-hard-tabs)


859-859: Hard tabs
Column: 1

(MD010, no-hard-tabs)


860-860: Hard tabs
Column: 1

(MD010, no-hard-tabs)


861-861: Hard tabs
Column: 1

(MD010, no-hard-tabs)


862-862: Hard tabs
Column: 1

(MD010, no-hard-tabs)


864-864: Hard tabs
Column: 1

(MD010, no-hard-tabs)


865-865: Hard tabs
Column: 1

(MD010, no-hard-tabs)


867-867: Hard tabs
Column: 1

(MD010, no-hard-tabs)


868-868: Hard tabs
Column: 1

(MD010, no-hard-tabs)


869-869: Hard tabs
Column: 1

(MD010, no-hard-tabs)


870-870: Hard tabs
Column: 1

(MD010, no-hard-tabs)


871-871: Hard tabs
Column: 1

(MD010, no-hard-tabs)


873-873: Hard tabs
Column: 1

(MD010, no-hard-tabs)


874-874: Hard tabs
Column: 1

(MD010, no-hard-tabs)


875-875: Hard tabs
Column: 1

(MD010, no-hard-tabs)


876-876: Hard tabs
Column: 1

(MD010, no-hard-tabs)


877-877: Hard tabs
Column: 1

(MD010, no-hard-tabs)


879-879: Hard tabs
Column: 1

(MD010, no-hard-tabs)


880-880: Hard tabs
Column: 1

(MD010, no-hard-tabs)


881-881: Hard tabs
Column: 1

(MD010, no-hard-tabs)


882-882: Hard tabs
Column: 1

(MD010, no-hard-tabs)


883-883: Hard tabs
Column: 1

(MD010, no-hard-tabs)


884-884: Hard tabs
Column: 1

(MD010, no-hard-tabs)


885-885: Hard tabs
Column: 1

(MD010, no-hard-tabs)


886-886: Hard tabs
Column: 1

(MD010, no-hard-tabs)


887-887: Hard tabs
Column: 1

(MD010, no-hard-tabs)


889-889: Hard tabs
Column: 1

(MD010, no-hard-tabs)


890-890: Hard tabs
Column: 1

(MD010, no-hard-tabs)


891-891: Hard tabs
Column: 1

(MD010, no-hard-tabs)


892-892: Hard tabs
Column: 1

(MD010, no-hard-tabs)


893-893: Hard tabs
Column: 1

(MD010, no-hard-tabs)


894-894: Hard tabs
Column: 1

(MD010, no-hard-tabs)


895-895: Hard tabs
Column: 1

(MD010, no-hard-tabs)


896-896: Hard tabs
Column: 1

(MD010, no-hard-tabs)


898-898: Hard tabs
Column: 1

(MD010, no-hard-tabs)


899-899: Hard tabs
Column: 1

(MD010, no-hard-tabs)


900-900: Hard tabs
Column: 1

(MD010, no-hard-tabs)


901-901: Hard tabs
Column: 1

(MD010, no-hard-tabs)


902-902: Hard tabs
Column: 1

(MD010, no-hard-tabs)


903-903: Hard tabs
Column: 1

(MD010, no-hard-tabs)


904-904: Hard tabs
Column: 1

(MD010, no-hard-tabs)


905-905: Hard tabs
Column: 1

(MD010, no-hard-tabs)


906-906: Hard tabs
Column: 1

(MD010, no-hard-tabs)


907-907: Hard tabs
Column: 1

(MD010, no-hard-tabs)


908-908: Hard tabs
Column: 1

(MD010, no-hard-tabs)


909-909: Hard tabs
Column: 1

(MD010, no-hard-tabs)


911-911: Hard tabs
Column: 1

(MD010, no-hard-tabs)


912-912: Hard tabs
Column: 1

(MD010, no-hard-tabs)


914-914: Hard tabs
Column: 1

(MD010, no-hard-tabs)


915-915: Hard tabs
Column: 1

(MD010, no-hard-tabs)


916-916: Hard tabs
Column: 1

(MD010, no-hard-tabs)


918-918: Hard tabs
Column: 1

(MD010, no-hard-tabs)


920-920: Hard tabs
Column: 1

(MD010, no-hard-tabs)


921-921: Hard tabs
Column: 1

(MD010, no-hard-tabs)


922-922: Hard tabs
Column: 1

(MD010, no-hard-tabs)


923-923: Hard tabs
Column: 1

(MD010, no-hard-tabs)


924-924: Hard tabs
Column: 1

(MD010, no-hard-tabs)


946-946: Hard tabs
Column: 1

(MD010, no-hard-tabs)


947-947: Hard tabs
Column: 1

(MD010, no-hard-tabs)


948-948: Hard tabs
Column: 1

(MD010, no-hard-tabs)


953-953: Hard tabs
Column: 1

(MD010, no-hard-tabs)


954-954: Hard tabs
Column: 1

(MD010, no-hard-tabs)


955-955: Hard tabs
Column: 1

(MD010, no-hard-tabs)


956-956: Hard tabs
Column: 1

(MD010, no-hard-tabs)


957-957: Hard tabs
Column: 1

(MD010, no-hard-tabs)


958-958: Hard tabs
Column: 1

(MD010, no-hard-tabs)


962-962: Hard tabs
Column: 1

(MD010, no-hard-tabs)


963-963: Hard tabs
Column: 1

(MD010, no-hard-tabs)


982-982: Hard tabs
Column: 1

(MD010, no-hard-tabs)


983-983: Hard tabs
Column: 1

(MD010, no-hard-tabs)


984-984: Hard tabs
Column: 1

(MD010, no-hard-tabs)


989-989: Hard tabs
Column: 1

(MD010, no-hard-tabs)


990-990: Hard tabs
Column: 1

(MD010, no-hard-tabs)


991-991: Hard tabs
Column: 1

(MD010, no-hard-tabs)


992-992: Hard tabs
Column: 1

(MD010, no-hard-tabs)


993-993: Hard tabs
Column: 1

(MD010, no-hard-tabs)


994-994: Hard tabs
Column: 1

(MD010, no-hard-tabs)


998-998: Hard tabs
Column: 1

(MD010, no-hard-tabs)


999-999: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1016-1016: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1017-1017: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1018-1018: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1019-1019: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1020-1020: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1029-1029: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1030-1030: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1034-1034: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1035-1035: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1036-1036: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1037-1037: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1054-1054: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1055-1055: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1056-1056: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1057-1057: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1062-1062: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1063-1063: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1067-1067: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1068-1068: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1069-1069: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1070-1070: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1089-1089: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1090-1090: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1091-1091: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1092-1092: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1093-1093: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1094-1094: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1098-1098: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1099-1099: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1104-1104: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1105-1105: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1106-1106: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1107-1107: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1108-1108: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1121-1121: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1123-1123: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1124-1124: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1125-1125: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1126-1126: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1128-1128: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1129-1129: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1130-1130: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1131-1131: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1133-1133: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1134-1134: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1135-1135: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1137-1137: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1138-1138: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1139-1139: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1140-1140: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1141-1141: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1142-1142: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1144-1144: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1145-1145: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1146-1146: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1147-1147: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1148-1148: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1149-1149: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1150-1150: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1152-1152: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1153-1153: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1154-1154: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1155-1155: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1156-1156: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1158-1158: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1159-1159: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1160-1160: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1161-1161: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1162-1162: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1163-1163: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1164-1164: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1165-1165: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1166-1166: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1167-1167: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1168-1168: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1169-1169: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1170-1170: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1171-1171: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1173-1173: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1179-1179: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1180-1180: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1181-1181: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1182-1182: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1191-1191: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1192-1192: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1193-1193: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1194-1194: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1195-1195: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1197-1197: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1203-1203: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1204-1204: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1205-1205: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1206-1206: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1207-1207: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1220-1220: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1221-1221: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1222-1222: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1223-1223: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1224-1224: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1225-1225: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1235-1235: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1236-1236: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1237-1237: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1238-1238: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1239-1239: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1240-1240: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1241-1241: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1242-1242: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1243-1243: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1244-1244: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1253-1253: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1254-1254: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1255-1255: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1256-1256: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1257-1257: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1258-1258: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1259-1259: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1260-1260: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1261-1261: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1262-1262: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1263-1263: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1264-1264: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1273-1273: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1282-1282: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1294-1294: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1295-1295: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1296-1296: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1297-1297: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1298-1298: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1299-1299: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1300-1300: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1301-1301: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1302-1302: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1303-1303: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1312-1312: Hard tabs
Column: 1

(MD010, no-hard-tabs)


1472-1472: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1477-1477: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1516-1516: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1521-1521: Hard tabs
Column: 35

(MD010, no-hard-tabs)


1608-1608: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


1755-1755: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


1912-1912: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


2064-2064: Hard tabs
Column: 1

(MD010, no-hard-tabs)


2068-2068: Hard tabs
Column: 1

(MD010, no-hard-tabs)


2071-2071: Multiple headings with the same content

(MD024, no-duplicate-heading)


2187-2187: Multiple headings with the same content

(MD024, no-duplicate-heading)


2211-2211: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (1)
plugins/ote-migration/commands/migrate.md (1)

580-595: The code already aligns with current OTE requirements. Line 592 correctly uses go get github.com/onsi/ginkgo/v2@latest, which is the required version for modern OpenShift Tests Extension. The openshift-tests-extension package on line 590 is itself the OpenShift fork of the testing framework. No changes needed.

Likely an incorrect or invalid review comment.

Copy link

@LuboTerifaj LuboTerifaj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @ming1013,

I've tested the command and have several points that need attention. Many are UX improvements that can be addressed later, but some critical items should be fixed in this PR (see "Next steps" below).


User Input Collection

Issue: Input collection is not deterministic, which worsens the tool's usability.

Working Directory Selection

  • Missing context: No description explaining what the directory will be used for
  • Inconsistent path formats: Options mix formats (e.g., /tmp/router-migration vs ~/router-ote)
  • Delayed custom path input: When selecting "Custom path", users should provide it immediately, not after choosing the option
  • Current options:
    • Current directory
    • /tmp/extension-name
    • Custom path (requires secondary input)
  • Suggested: Allow direct custom path input without selecting an option first

Source Repository Path

  • Unclear purpose: Option 2 suggests a path one level above the working directory
  • Question: Should we offer this option if the source repository directory may differ from the working directory?

Test Folder Selection

  • Ambiguity: Unclear whether this refers to source or target test folder
    • Options should explicitly state: "Source: test/extended/component-name/" or "Target: ..."
  • Incorrect default ordering: test/extended/ should be the first and default option
    • Current order (example with router):
      1. router test/extended/router/
      2. All of test/extended/ Use entire test/extended/ directory
    • Suggested order:
      1. test/extended/ (default)
      2. test/extended/router/
  • Unrelated components: Options include components unrelated to the migration
    • Should only list: relevant component names + custom option

Testdata Location

  • Redundant option: "No testdata" option seems unnecessary. If no testdata exists, skip migration entirely
  • Missing context: When showing "Same as test subfolder", display the actual subfolder path (similar to Test Folder selection)
  • Missing default: No indication of recommended default value

General recommendation: Simplicity and readability are critical. Reduce options and clarify what each does.


Repository Operations

Remote Handling

  • Issue: Tool uses incorrect remote when fetching (should verify origin vs upstream)

Target Repository Setup

  • Missing option: No option to clone the target repository when using "Monorepo Strategy". Tool only asks:

    "Could you please provide the path to your target component repository (the repository where we'll integrate the OTE framework)?"

  • Checkout location: Target repository not checked out into a directory named after the component, which may cause conflicts when working on multiple migrations consecutively

Module Integration Strategies

Current options:

  1. Single-Module Strategy: Standalone directory outside any repository (does this make sense?)
  2. Monorepo Strategy: Standalone directory within target repository

Possible alternatives:

  1. Separate directory within target repository
  2. Existing test directory within target repository (e.g., test/e2e/ or test/extended/)

Recommendation: Simplicity is key - fewer options are better. We need to identify which approaches make sense while focusing on simplicity.

Note: We'll also need to handle scenarios where test/e2e/ or test/extended/ already exist.


Script Execution and Compatibility

Shell Compatibility

  • Issue: Scripts don't always work properly in zsh on macOS
  • Root cause: Long commands with arguments/pipes have parsing issues; some commands (e.g., timeout) are missing
  • Recommendation:
    • Add validation to check for required tools before execution
    • Either enforce bash or provide explicit zsh support

Execution Feedback

  • Dependency errors: Console shows dependency errors during execution
    • If expected: Add a note explaining they're expected
    • If unexpected: Prompt user whether to continue, abort, or resolve the issue
  • Missing context: Before each script runs, show a high-level overview of what it will do

Test Case Tagging Requirements

Required: Test case titles must include required tags

  • LEVEL0 tags: All test cases must have appropriate LEVEL0 tags in their titles
  • OTE tags: All test cases must have required OTE tags in their titles

Recommendation: Add validation step to verify tags are present before migration completes _(I know you're working on this)


Code Architecture

Current state:

  • Self-contained and complete
  • 2200+ lines make maintenance difficult
  • Bash scripts and Go templates embedded in markdown (untestable)
  • Code duplication between monorepo/single-module strategies

Suggestion: Consider hybrid architecture

Recommendation: Address this in a follow-up PR/Jira.


Conclusion

Overall, it's great to see the tool successfully migrate test cases. The process could be faster, many tasks could run automatically without explicit approvals, though this may be a limitation of Claude Code slash commands themselves.

Next steps:

Necessary changes in this PR:

  • Add OTE tag validation (LEVEL0 and OTE tags in test case titles)
  • Resolve conflicts with main branch

Should fix in this PR:

  • Fix shell compatibility issues (tool validation, bash enforcement or zsh support)
  • Fix remote handling (verify origin vs upstream)
  • Fix repository checkout location (component-named directory)

Follow-up improvements:

  • Input collection UX (deterministic inputs, clearer options, better defaults)
  • Repository operations (clone option for Monorepo Strategy)
  • Execution feedback (dependency error handling, script descriptions)
  • Code architecture improvements (extract scripts/templates for maintainability)

@openshift-ci
Copy link

openshift-ci bot commented Jan 21, 2026

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: ming1013
Once this PR has been reviewed and has the lgtm label, please assign cblecker for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@plugins/ote-migration/README.md`:
- Line 411: Replace the hard tabs used for indentation on the lines around
"spec.Lifecycle = et.LifecycleInforming" (and the subsequent block at lines
427-431) with spaces to match the repository's Markdown style: convert each tab
to the project's preferred number of spaces (e.g., 2 spaces) so those indents
use spaces only, and then run the repo linter/formatter to ensure no other tabs
remain in the README.md.
- Line 59: Replace the bold inline text "**IMPORTANT: Identify Your Sig Tags**"
in the README with a proper markdown heading (e.g., "## IMPORTANT: Identify Your
Sig Tags" or "### IMPORTANT: Identify Your Sig Tags") so it passes markdown
linting; locate the exact string in README.md and change the surrounding markup
from bold to a heading level appropriate for the section.
- Line 275: Update the Markdown code fence around the block containing
"[sig-router][OTP] [Level0] Router functionality should handle basic routing
-LEVEL0-" to include a language identifier (e.g., use ```text or ```md) on the
opening backticks so linters and syntax highlighters recognize the block; locate
the code fence in README.md that wraps that exact line and change the opening
triple backticks to include the identifier while keeping the closing backticks
unchanged.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@docs/data.json`:
- Around line 1114-1129: The entry for the "migrate" command in the
"ote-migration" plugin contains a placeholder "synopsis": "text" (and an empty
"argument_hint") which will surface to users; update the "synopsis" value to a
real usage string that matches the migrate command docs (see migrate command
name "migrate" and fields "synopsis" and "argument_hint") and, if applicable,
populate "argument_hint" with the expected argument syntax so help/index output
shows the correct usage instead of the literal placeholder.

  Adds a plugin to automate OpenShift Tests Extension (OTE) migration
  for component repositories. The plugin handles the complete migration
  workflow including:

  - Repository setup and management
  - Directory structure creation
  - Test file and testdata migration
  - Automatic dependency vendoring
  - Code generation (go.mod, main.go, Makefile, fixtures.go)
  - Automatic FixturePath() migration and import updates
  - Build verification

  The plugin supports two directory strategies:
  - Monorepo: Integrate into existing repos with cmd/ and test/
  - Single-module: Create isolated tests-extension directory

  This replaces the need for install.sh as plugins are installed
  globally through the marketplace and work in any repository.
  - Update migrate.md with correct FixturePath signature (variadic)
  - Fix Ginkgo replace directive to use newer version
  - Add documentation for module replacement strategy
  - Clarify testdata directory structure and bindata path handling

  The migration tool now correctly:
  - Extracts all replace directives from openshift-tests-private
  - Uses variadic FixturePath to match compat_otp signature
  - Applies correct Ginkgo fork version for OTE compatibility
The migration tool now automatically uses GOTOOLCHAIN=auto when running
go mod tidy, allowing Go to download the required toolchain version
when dependencies need a newer Go version than what's installed.

Changes:
- All go mod tidy commands now use GOTOOLCHAIN=auto GOSUMDB=sum.golang.org
- Added documentation explaining the Go version compatibility handling
- Added comments explaining why these environment variables are needed

This fixes errors like:
go: go.mod requires go >= 1.24.6 (running go 1.24.3; GOTOOLCHAIN=local)
  - Document component-specific test filtering by [sig-<extension-name>] tag
  - Explain automatic [OTP] and [Level0] tag additions with examples
  - Add detailed directory structure strategies (monorepo vs single-module)
  - Document dynamic dependency resolution from upstream
  - Document automatic Go toolchain management (GOTOOLCHAIN=auto)
  - Add before/after examples for test restructuring
  - Enhance key features section with new capabilities
  - Fix [Level0] tag placement to Describe block after [OTP]
  - Change test directory strategy for monorepo when test/e2e exists
  - Simplify informing lifecycle feature
  - README reflects all changes
  - Replace hard tabs with spaces in migrate.md
  - Add language specifiers to code fences
  - Consolidate duplicate Troubleshooting sections
  - Sync plugin documentation
@openshift-merge-robot openshift-merge-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jan 23, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@PLUGINS.md`:
- Line 25: Update the inconsistent capitalization of "Ote" to "OTE" in both the
index entry "[Ote Migration](`#ote-migration-plugin`)" and the corresponding
heading lines that define the plugin section (e.g., any heading like "# Ote
Migration Plugin" or similar occurrences around the OTE Migration section).
Replace "Ote" with "OTE" across the document (including the index at the top and
the plugin section headings) so the link anchor and heading text match
consistently.

  - Fix markdown formatting and synopsis placeholder
  - Add checkpoint/resume system to handle interruptions
  - Save progress to .ote-migration-state.json after each phase
  - Allow resuming from last completed phase
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@plugins/ote-migration/README.md`:
- Around line 86-95: Update the fenced code block in
plugins/ote-migration/README.md that contains the console output starting with
"Previous Migration Detected" to include a language identifier by changing the
opening fence from ``` to ```text so the block is marked as plain text (this
satisfies markdownlint MD040); ensure the rest of the block content (lines
showing "Extension: router", "Last completed phase: 5", and the numbered
options) remains unchanged.

  - Replace hard tabs with spaces in migrate.md
  - Add language specifiers to all code fences
  - Fix hardcoded 'origin' remote - use dynamic remote discovery
  - Add step to extract replace directives from openshift-tests-private
  - Update docs/data.json
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@plugins/ote-migration/README.md`:
- Around line 240-248: The README examples are inconsistent with the stated
behavior of automatically removing the "-LEVEL0-" suffix: update the example
test definitions (the g.It(...) example showing "[Level0] Router functionality
should handle basic routing -LEVEL0-") and the "Full test name visible in list"
string so they no longer include the "-LEVEL0-" suffix, ensuring the g.It(...)
description and the displayed full test name both show "[Level0] Router
functionality should handle basic routing" (or, if the suffix is actually
retained, change the sentence that says "Automatically removes `-LEVEL0-`
suffix" to reflect that it is not removed); search for occurrences of "-LEVEL0-"
and the g.It(...) example to correct them consistently.
- Around line 196-212: The example in the README shows only single-tag filtering
but the docs claim support for multiple sig tags; update the filter in the
BuildExtensionTestSpecsFromOpenShiftGinkgoSuite example to accept a
comma-separated list of tags and perform OR semantics by splitting the input
tags and checking each spec.Name for the presence of any "[sig-<tag>]" token
before appending to filteredSpecs (use the existing et.ExtensionTestSpec /
et.ExtensionTestSpecs types and the spec.Name field), or alternatively remove
the "multiple sig tags" wording from the README if multi-tag filtering is not
implemented.
- Around line 84-88: Update the README so the documented sig filter behavior
matches the actual filtering logic: either (A) change the code example that
currently shows filtering by [sig-<extension-name>] to demonstrate using
multiple user-provided tags with OR logic (e.g., show how user input
"router,network-edge" maps to filtering for [sig-router] OR [sig-network-edge]
and update the example command ./bin/<extension-name>-tests-ext list
accordingly), or (B) explicitly state that only the extension-name-derived tag
([sig-<extension-name>]) is used for filtering and that user-provided tags are
not applied to test selection; ensure all references to "sig filter tag(s)", the
example that uses [sig-<extension-name>], and the sentence "Tests must have the
[sig-<extension-name>] tag" are made consistent with the chosen option.

… mod tidy errors

  2. Level0 tag prepending - Ensures Level0 tests are properly tagged
  3. Root Makefile paths - Corrects delegation to tests-extension/Makefile
…od tidy' to Phase 6 (ensures test migration always runs);Add backup/rollback to Phase 5 (atomic test migration)
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@plugins/ote-migration/README.md`:
- Around line 95-104: The README's fenced code blocks that show the "Phase 4
(go.mod generation)" ASCII trees are missing language identifiers and violate
markdownlint MD040; update each opening triple-backtick for those blocks to
include a language (e.g., change ``` to ```text) for the blocks around the
"Phase 4 (go.mod generation)" examples and apply the same change to the similar
blocks mentioned later in the file so all fenced code blocks in this README use
a language identifier.

@ming1013
Copy link
Author

ming1013 commented Jan 28, 2026

Tested with latest code (new requirements) for single mode pass in PR: openshift/router#723

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants