Creating an Oracle-to-PostgreSQL master migration plan
Analyze a .NET solution, classify every project for Oracle to PostgreSQL migration, and produce a persistent master plan that downstream migration agents and skills can parse.
When to invoke
- "Create the Oracle to Postgres master migration plan."
- "Inventory this .NET solution for Oracle dependencies."
- "Classify which projects need PostgreSQL migration."
- "Write
.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md."
Prerequisites and context
Work from the repository root. Find a .sln or .slnx solution file in the workspace root; if multiple exist, ask the user which solution to plan. The output path is fixed: .github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md.
Procedure
- Discover projects in the selected solution.
- Classify each project from file evidence.
- Present the classified list and let the user adjust classifications or migration order before finalizing.
- Write the plan file to
.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md.
Track progress explicitly:
Progress:
- [ ] Step 1: Discover projects in the solution
- [ ] Step 2: Classify each project
- [ ] Step 3: Confirm with user
- [ ] Step 4: Write the plan file
Discovery and classification
For each .csproj, record name, relative path, and likely project type such as class library, web API, console, or test. Scan every non-test project for Oracle evidence.
| Evidence source |
Indicators |
| NuGet references |
Oracle.ManagedDataAccess, Oracle.EntityFrameworkCore in .csproj or packages.config. |
| Configuration |
Oracle connection strings in appsettings.json, web.config, or app.config. |
| Code usage |
OracleConnection, OracleCommand, OracleDataReader. |
| DDL references |
DDL cross-references under .github/oracle-to-postgres-migration/DDL/Oracle/ when present. |
| Existing migrated duplicate |
A -postgres or .Postgres project duplicate that appears processed. |
| Test project signals |
Test SDK references, test naming, or test-only project type. |
Assign exactly one classification:
| Classification |
Meaning |
Typical evidence |
MIGRATE |
Has Oracle interactions requiring conversion. |
Oracle NuGet packages, connection strings, OracleConnection, OracleCommand, OracleDataReader, or DDL cross-reference. |
SKIP |
No Oracle indicators. |
UI-only, shared utility, or unrelated project. |
ALREADY_MIGRATED |
A PostgreSQL duplicate exists and appears processed. |
-postgres or .Postgres paired project. |
TEST_PROJECT |
Test project handled by the testing workflow. |
Test project naming or framework references. |
Order migration so shared/foundational libraries move before dependents.
Plan file contract
Save this exact structure to .github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md because downstream consumers depend on the headings and tables.
# Master Migration Plan
**Solution:** {solution file name}
**Solution Root:** {REPOSITORY_ROOT}
**Created:** {timestamp}
**Last Updated:** {timestamp}
## DDL Artifacts
**Location:** {path to DDL artifacts, e.g., `.github/oracle-to-postgres-migration/DDL/`}
**External tool used:** {Yes / No} — {If Yes, name the tool (e.g., `ora2pg`) and note that Phase 4 (Schema & DDL Migration) can be skipped; PostgreSQL DDL artifacts already exist.}
## Solution Summary
| Metric | Count |
|--------|-------|
| Total projects in solution | {n} |
| Projects requiring migration | {n} |
| Projects already migrated | {n} |
| Projects skipped (no Oracle usage) | {n} |
| Test projects (handled separately) | {n} |
## Project Inventory
| # | Project Name | Path | Classification | Notes |
|---|---|---|---|---|
| 1 | {name} | {relative path} | MIGRATE | {notes} |
| 2 | {name} | {relative path} | SKIP | No Oracle dependencies |
## Migration Order
1. **{ProjectName}** — {rationale, e.g., "Core data access library; other projects depend on it."}
2. **{ProjectName}** — {rationale}
Gotchas
- Do not classify from project names alone: require file evidence for
MIGRATE, SKIP, ALREADY_MIGRATED, or TEST_PROJECT.
- Do not bury DDL status: if
.github/oracle-to-postgres-migration/DDL/ exists or an external tool such as ora2pg produced PostgreSQL artifacts, record whether Phase 4 can be skipped.
- Do not migrate dependents first: shared data access libraries should precede web APIs, console apps, and consumers.
Output template
## Oracle-to-PostgreSQL master migration plan
**Status:** drafted | written | needs confirmation | blocked
**Solution:** `<solution.sln or solution.slnx>`
**Plan file:** `.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md`
### Classification summary
| Classification | Count | Projects |
| --- | ---: | --- |
| `MIGRATE` | <n> | <names> |
| `SKIP` | <n> | <names> |
| `ALREADY_MIGRATED` | <n> | <names> |
| `TEST_PROJECT` | <n> | <names> |
### Migration order
1. <ProjectName> — <rationale>
### Confirmation needed
- <classification or ordering question, or none>
Quality gate
1---2name: creating-oracle-to-postgres-master-migration-plan-33description: Discover .NET solution projects, classify Oracle-to-PostgreSQL migration eligibility, detect Oracle dependencies, and write .github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md. Use when starting a multi-project Oracle-to-PostgreSQL migration, inventorying .NET projects, or assessing Oracle dependency scope.4---56<!-- Generated from harness/github-copilot/plugins/oracle-to-postgres-migration-expert/skills/creating-oracle-to-postgres-master-migration-plan/SKILL.md by harness/claude-code/scripts/convert_from_copilot.py. Edit the source, not this file. -->78# Creating an Oracle-to-PostgreSQL master migration plan910Analyze a .NET solution, classify every project for Oracle to PostgreSQL migration, and produce a persistent master plan that downstream migration agents and skills can parse.1112## When to invoke1314- "Create the Oracle to Postgres master migration plan."15- "Inventory this .NET solution for Oracle dependencies."16- "Classify which projects need PostgreSQL migration."17- "Write `.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md`."1819## Prerequisites and context2021Work from the repository root. Find a `.sln` or `.slnx` solution file in the workspace root; if multiple exist, ask the user which solution to plan. The output path is fixed: `.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md`.2223## Procedure24251. Discover projects in the selected solution.262. Classify each project from file evidence.273. Present the classified list and let the user adjust classifications or migration order before finalizing.284. Write the plan file to `.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md`.2930Track progress explicitly:3132```text33Progress:34- [ ] Step 1: Discover projects in the solution35- [ ] Step 2: Classify each project36- [ ] Step 3: Confirm with user37- [ ] Step 4: Write the plan file38```3940## Discovery and classification4142For each `.csproj`, record name, relative path, and likely project type such as class library, web API, console, or test. Scan every non-test project for Oracle evidence.4344| Evidence source | Indicators |45| --- | --- |46| NuGet references | `Oracle.ManagedDataAccess`, `Oracle.EntityFrameworkCore` in `.csproj` or `packages.config`. |47| Configuration | Oracle connection strings in `appsettings.json`, `web.config`, or `app.config`. |48| Code usage | `OracleConnection`, `OracleCommand`, `OracleDataReader`. |49| DDL references | DDL cross-references under `.github/oracle-to-postgres-migration/DDL/Oracle/` when present. |50| Existing migrated duplicate | A `-postgres` or `.Postgres` project duplicate that appears processed. |51| Test project signals | Test SDK references, test naming, or test-only project type. |5253Assign exactly one classification:5455| Classification | Meaning | Typical evidence |56| --- | --- | --- |57| `MIGRATE` | Has Oracle interactions requiring conversion. | Oracle NuGet packages, connection strings, `OracleConnection`, `OracleCommand`, `OracleDataReader`, or DDL cross-reference. |58| `SKIP` | No Oracle indicators. | UI-only, shared utility, or unrelated project. |59| `ALREADY_MIGRATED` | A PostgreSQL duplicate exists and appears processed. | `-postgres` or `.Postgres` paired project. |60| `TEST_PROJECT` | Test project handled by the testing workflow. | Test project naming or framework references. |6162Order migration so shared/foundational libraries move before dependents.6364## Plan file contract6566Save this exact structure to `.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md` because downstream consumers depend on the headings and tables.6768````markdown69# Master Migration Plan7071**Solution:** {solution file name}72**Solution Root:** {REPOSITORY_ROOT}73**Created:** {timestamp}74**Last Updated:** {timestamp}7576## DDL Artifacts7778**Location:** {path to DDL artifacts, e.g., `.github/oracle-to-postgres-migration/DDL/`}79**External tool used:** {Yes / No} — {If Yes, name the tool (e.g., `ora2pg`) and note that Phase 4 (Schema & DDL Migration) can be skipped; PostgreSQL DDL artifacts already exist.}8081## Solution Summary8283| Metric | Count |84|--------|-------|85| Total projects in solution | {n} |86| Projects requiring migration | {n} |87| Projects already migrated | {n} |88| Projects skipped (no Oracle usage) | {n} |89| Test projects (handled separately) | {n} |9091## Project Inventory9293| # | Project Name | Path | Classification | Notes |94|---|---|---|---|---|95| 1 | {name} | {relative path} | MIGRATE | {notes} |96| 2 | {name} | {relative path} | SKIP | No Oracle dependencies |9798## Migration Order991001. **{ProjectName}** — {rationale, e.g., "Core data access library; other projects depend on it."}1012. **{ProjectName}** — {rationale}102````103104## Gotchas105106- **Do not classify from project names alone**: require file evidence for `MIGRATE`, `SKIP`, `ALREADY_MIGRATED`, or `TEST_PROJECT`.107- **Do not bury DDL status**: if `.github/oracle-to-postgres-migration/DDL/` exists or an external tool such as `ora2pg` produced PostgreSQL artifacts, record whether Phase 4 can be skipped.108- **Do not migrate dependents first**: shared data access libraries should precede web APIs, console apps, and consumers.109110## Output template111112```markdown113## Oracle-to-PostgreSQL master migration plan114115**Status:** drafted | written | needs confirmation | blocked116**Solution:** `<solution.sln or solution.slnx>`117**Plan file:** `.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md`118119### Classification summary120| Classification | Count | Projects |121| --- | ---: | --- |122| `MIGRATE` | <n> | <names> |123| `SKIP` | <n> | <names> |124| `ALREADY_MIGRATED` | <n> | <names> |125| `TEST_PROJECT` | <n> | <names> |126127### Migration order1281. <ProjectName> — <rationale>129130### Confirmation needed131- <classification or ordering question, or none>132```133134## Quality gate135136- [ ] A single `.sln` or `.slnx` solution was selected or the user was asked to choose.137- [ ] Every `.csproj` reference in the solution appears in the Project Inventory.138- [ ] Each project has exactly one classification: `MIGRATE`, `SKIP`, `ALREADY_MIGRATED`, or `TEST_PROJECT`.139- [ ] Oracle evidence includes NuGet, config, code, DDL references, migrated duplicates, or test indicators.140- [ ] Shared libraries precede dependent projects in Migration Order.141- [ ] The plan was written to `.github/oracle-to-postgres-migration/Reports/MasterMigrationPlan.md` using the required structure.