polylith-cli 1.48.0__tar.gz → 1.48.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/PKG-INFO +1 -1
  2. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/README.md +2 -2
  3. polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/README.md +111 -0
  4. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-analyze-imports → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-analyze-imports}/SKILL.md +5 -5
  5. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-automate-import-updates → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-automate-import-updates}/SKILL.md +7 -7
  6. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-convert-linter → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-convert-linter}/SKILL.md +5 -5
  7. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-convert-package-manager → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-convert-package-manager}/SKILL.md +5 -5
  8. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-convert-type-checker → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-convert-type-checker}/SKILL.md +5 -5
  9. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-dedupe → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-dedupe}/SKILL.md +9 -9
  10. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-definition-of-done → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-definition-of-done}/SKILL.md +11 -11
  11. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-detect-circular-imports → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-detect-circular-imports}/SKILL.md +5 -5
  12. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-discover → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-discover}/SKILL.md +8 -8
  13. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-distribute-wiring → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-distribute-wiring}/SKILL.md +4 -4
  14. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-extract-standalone-modules → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-extract-standalone-modules}/SKILL.md +4 -4
  15. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-extract-to-base → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-extract-to-base}/SKILL.md +11 -11
  16. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-generate-shim → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-generate-shim}/SKILL.md +5 -5
  17. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-isolate-base-and-big-component → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-isolate-base-and-big-component}/SKILL.md +5 -5
  18. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-isolate-shared-and-project-logic → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-isolate-shared-and-project-logic}/SKILL.md +9 -9
  19. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-orchestrator → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-orchestrator}/SKILL.md +45 -45
  20. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-prepare-project → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-prepare-project}/SKILL.md +5 -5
  21. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-refactor-tests → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-refactor-tests}/SKILL.md +7 -7
  22. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-resolve-circular-imports → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-resolve-circular-imports}/SKILL.md +5 -5
  23. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-split-big-component → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-split-big-component}/SKILL.md +9 -9
  24. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-split-component-internals → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-split-component-internals}/SKILL.md +7 -7
  25. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-update-tests → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-update-tests}/SKILL.md +6 -6
  26. {polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/migrate-verify-stability → polylith_cli-1.48.1/polylith_cli/.agents/skills/polylith/migrate-project/polylith-migrate-verify-stability}/SKILL.md +4 -4
  27. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/pyproject.toml +1 -1
  28. polylith_cli-1.48.0/polylith_cli/.agents/skills/polylith/migrate-project/README.md +0 -111
  29. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/README.md +0 -0
  30. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-base-creation/SKILL.md +0 -0
  31. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-brick-removal/SKILL.md +0 -0
  32. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-check/SKILL.md +0 -0
  33. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-component-creation/SKILL.md +0 -0
  34. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-concepts/SKILL.md +0 -0
  35. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-dependency-management/SKILL.md +0 -0
  36. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-dependency-visualization/SKILL.md +0 -0
  37. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-diff/SKILL.md +0 -0
  38. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-libs/SKILL.md +0 -0
  39. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-project-management/SKILL.md +0 -0
  40. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-sync/SKILL.md +0 -0
  41. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-testing/SKILL.md +0 -0
  42. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-workspace-inspection/SKILL.md +0 -0
  43. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/.agents/skills/polylith/polylith-workspace-setup/SKILL.md +0 -0
  44. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/alias/__init__.py +0 -0
  45. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/alias/core.py +0 -0
  46. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/bricks/__init__.py +0 -0
  47. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/bricks/base.py +0 -0
  48. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/bricks/brick.py +0 -0
  49. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/bricks/component.py +0 -0
  50. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/building/__init__.py +0 -0
  51. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/building/core.py +0 -0
  52. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/building/paths.py +0 -0
  53. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/check/__init__.py +0 -0
  54. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/check/collect.py +0 -0
  55. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/check/report.py +0 -0
  56. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/__init__.py +0 -0
  57. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/__main__.py +0 -0
  58. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/build.py +0 -0
  59. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/core.py +0 -0
  60. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/create.py +0 -0
  61. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/env.py +0 -0
  62. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/options.py +0 -0
  63. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/cli/test.py +0 -0
  64. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/__init__.py +0 -0
  65. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/check.py +0 -0
  66. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/create.py +0 -0
  67. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/deps.py +0 -0
  68. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/diff.py +0 -0
  69. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/info.py +0 -0
  70. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/libs.py +0 -0
  71. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/sync.py +0 -0
  72. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/commands/test.py +0 -0
  73. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/configuration/__init__.py +0 -0
  74. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/configuration/core.py +0 -0
  75. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/deps/__init__.py +0 -0
  76. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/deps/core.py +0 -0
  77. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/deps/report.py +0 -0
  78. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/development/__init__.py +0 -0
  79. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/development/development.py +0 -0
  80. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/diff/__init__.py +0 -0
  81. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/diff/collect.py +0 -0
  82. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/diff/report.py +0 -0
  83. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/dirs/__init__.py +0 -0
  84. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/dirs/dirs.py +0 -0
  85. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/distributions/__init__.py +0 -0
  86. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/distributions/caching.py +0 -0
  87. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/distributions/collect.py +0 -0
  88. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/distributions/core.py +0 -0
  89. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/environment/__init__.py +0 -0
  90. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/environment/core.py +0 -0
  91. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/files/__init__.py +0 -0
  92. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/files/files.py +0 -0
  93. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/imports/__init__.py +0 -0
  94. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/imports/grouping.py +0 -0
  95. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/imports/parser.py +0 -0
  96. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/imports/usages.py +0 -0
  97. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/info/__init__.py +0 -0
  98. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/info/collect.py +0 -0
  99. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/info/report.py +0 -0
  100. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interactive/__init__.py +0 -0
  101. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interactive/project.py +0 -0
  102. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interface/__init__.py +0 -0
  103. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interface/collect.py +0 -0
  104. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interface/interfaces.py +0 -0
  105. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interface/parser.py +0 -0
  106. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interface/report.py +0 -0
  107. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/interface/usage.py +0 -0
  108. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/libs/__init__.py +0 -0
  109. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/libs/grouping.py +0 -0
  110. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/libs/lock_files.py +0 -0
  111. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/libs/report.py +0 -0
  112. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/libs/stdlib.py +0 -0
  113. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/output/__init__.py +0 -0
  114. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/output/core.py +0 -0
  115. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/parsing/__init__.py +0 -0
  116. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/parsing/core.py +0 -0
  117. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/parsing/rewrite.py +0 -0
  118. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/project/__init__.py +0 -0
  119. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/project/create.py +0 -0
  120. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/project/get.py +0 -0
  121. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/project/parser.py +0 -0
  122. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/project/templates.py +0 -0
  123. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/readme/__init__.py +0 -0
  124. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/readme/readme.py +0 -0
  125. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/repo/__init__.py +0 -0
  126. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/repo/get.py +0 -0
  127. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/repo/repo.py +0 -0
  128. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/reporting/__init__.py +0 -0
  129. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/reporting/theme.py +0 -0
  130. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/sync/__init__.py +0 -0
  131. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/sync/collect.py +0 -0
  132. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/sync/report.py +0 -0
  133. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/sync/update.py +0 -0
  134. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/test/__init__.py +0 -0
  135. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/test/core.py +0 -0
  136. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/test/report.py +0 -0
  137. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/test/tests.py +0 -0
  138. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/toml/__init__.py +0 -0
  139. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/toml/core.py +0 -0
  140. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/workspace/__init__.py +0 -0
  141. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/workspace/create.py +0 -0
  142. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/workspace/paths.py +0 -0
  143. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/yaml/__init__.py +0 -0
  144. {polylith_cli-1.48.0 → polylith_cli-1.48.1}/polylith_cli/polylith/yaml/core.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: polylith-cli
3
- Version: 1.48.0
3
+ Version: 1.48.1
4
4
  Summary: Python tooling support for the Polylith Architecture
5
5
  License: MIT
6
6
  Author: David Vujic
@@ -8,7 +8,7 @@
8
8
  Two kinds of skill live under this directory; the distinction matters when picking an entry point:
9
9
 
10
10
  - **Atomic skills (`polylith-*`).** Each maps to one `poly` CLI command (or one focused concept). Safe to load in isolation; individually composable. These cover everyday Polylith workflows — creating bricks, syncing, checking, inspecting, and so on.
11
- - **Orchestrated skill set (`migrate-project/migrate-*`).** A multi-phase workflow with shared state (`migration/<PROJECT>/state.md`) and a git safety net. **Never load an individual `migrate-*` skill directly** — always load `migrate-orchestrator` and let it drive the phases in order. See [`migrate-project/README.md`](./migrate-project/README.md). This is an advanced, explicit-opt-in workflow used for migrating a **non-Polylith** project into a Polylith workspace, **not** part of daily Polylith use.
11
+ - **Orchestrated skill set (`migrate-project/polylith-migrate-*`).** A multi-phase workflow with shared state (`migration/<PROJECT>/state.md`) and a git safety net. **Never load an individual `polylith-migrate-*` skill directly** — always load `polylith-migrate-orchestrator` and let it drive the phases in order. See [`migrate-project/README.md`](./migrate-project/README.md). This is an advanced, explicit-opt-in workflow used for migrating a **non-Polylith** project into a Polylith workspace, **not** part of daily Polylith use.
12
12
 
13
13
  ## Available Skills (daily Polylith workflows)
14
14
 
@@ -31,4 +31,4 @@ Two kinds of skill live under this directory; the distinction matters when picki
31
31
 
32
32
  ## Advanced workflow
33
33
 
34
- For migrating an existing **non-Polylith** Python project into a Polylith workspace, see [`migrate-project/README.md`](./migrate-project/README.md). This is a destructive, multi-phase, explicit-opt-in workflow — start with the `migrate-orchestrator` skill, not any individual `migrate-*` sub-skill.
34
+ For migrating an existing **non-Polylith** Python project into a Polylith workspace, see [`migrate-project/README.md`](./migrate-project/README.md). This is a destructive, multi-phase, explicit-opt-in workflow — start with the `polylith-migrate-orchestrator` skill, not any individual `polylith-migrate-*` sub-skill.
@@ -0,0 +1,111 @@
1
+ # Project Migration Skills
2
+
3
+ > **Note for contributors:** this README is a **human reference** and a skill **index**. Agents load each `polylith-migrate-*/SKILL.md` independently via the skill loader; this README is **not** auto-loaded with any skill. Anything an agent must know to act has to live in the relevant `SKILL.md` itself, not here.
4
+
5
+ This directory contains skills for migrating **non-Polylith Python projects** into a Polylith workspace. They cooperate via two artifacts under `migration/<PROJECT>/`:
6
+
7
+ - `state.md` — a flat `KEY=value` file. Canonical schema lives in [`polylith-migrate-discover/SKILL.md`](./polylith-migrate-discover/SKILL.md).
8
+ - `manifest.md` — a human-readable structural inventory of the source project.
9
+
10
+ ---
11
+
12
+ ## ⚠️ When to use these skills
13
+
14
+ **Only** when:
15
+ 1. A human has **explicitly instructed** to migrate a specific project (e.g., "migrate `projects/my-app` to Polylith").
16
+ 2. The target project lives under `projects/<PROJECT>/` of this Polylith workspace.
17
+ 3. The goal is to refactor the project into Polylith bricks (bases and components).
18
+
19
+ **Do not use** for:
20
+ - Automated or unattended migrations.
21
+ - Projects that are already structured as Polylith bricks.
22
+ - Daily Polylith development tasks — for those, see the sibling `polylith-*` skills.
23
+
24
+ ---
25
+
26
+ ## How to invoke
27
+
28
+ Load the orchestrator and let it drive the rest:
29
+
30
+ ```
31
+ Load the `polylith-migrate-orchestrator` skill and migrate `projects/<project-name>`.
32
+ ```
33
+
34
+ The orchestrator will:
35
+ 1. Ask the user for explicit confirmation.
36
+ 2. Establish a git safety net (dedicated branch + per-phase commits).
37
+ 3. Load and execute each phase skill in order, verifying after each.
38
+
39
+ > **Why every sub-skill says "do not load directly".** Each `polylith-migrate-<phase>` skill's `description:` starts with a redirect to `polylith-migrate-orchestrator`. This is intentional: it makes the orchestrator the only valid entry point regardless of which sub-skill the agent's fuzzy-match initially favours. The sub-skills depend on state (`migration/<PROJECT>/state.md`) and a git safety net that only the orchestrator sets up.
40
+
41
+ ---
42
+
43
+ ## Downstream installation
44
+
45
+ When this skill set is installed into another Polylith workspace (e.g. via a skills package), the in-skill `[ENTRY POINT]` / `[Internal sub-skill of polylith-migrate-orchestrator …]` markers in each `description:` are the primary routing signal — they ship with the package.
46
+
47
+ For an extra-strong signal, downstream consumers should add the following snippet to their own repo-level `AGENTS.md` (or equivalent agent-routing file). It is **not** required — the in-skill markers are usually sufficient — but it removes any ambiguity for agents that read `AGENTS.md` before scanning skill descriptions.
48
+
49
+ ```markdown
50
+ ## Polylith migration instructions
51
+
52
+ When the user asks to migrate a non-Polylith Python project to Polylith
53
+ (e.g. "migrate `projects/<name>` to Polylith"), load the
54
+ `polylith-migrate-orchestrator` skill first and let it drive the workflow.
55
+
56
+ Never load `polylith-migrate-discover`, `polylith-migrate-extract-to-base`, or any other
57
+ `polylith-migrate-*` sub-skill directly — they are phases the orchestrator
58
+ invokes in order, with per-phase verification and git checkpoints
59
+ between them.
60
+ ```
61
+
62
+ ---
63
+
64
+ ## Workflow at a glance
65
+
66
+ The **authoritative** phase order, numbering, and dependencies live in
67
+ [`polylith-migrate-orchestrator/SKILL.md`](./polylith-migrate-orchestrator/SKILL.md) — it is the
68
+ **single source of truth**. This README intentionally does **not** repeat the
69
+ table, to avoid drift (sub-skills must not hardcode phase numbers either; they
70
+ reference `<N>` from the orchestrator table).
71
+
72
+ At a glance, the flow is:
73
+
74
+ > **discover → analyze-imports** (choose `shim`/`shimless`) **→ extract-to-base →
75
+ > update-imports →** *[optional shim sub-track, only when `SHIM_STRATEGY=shim`]* **→
76
+ > prepare-project → verify-stability → isolate-base-and-big-component →
77
+ > split-big-component → extract-standalone-modules →
78
+ > isolate-shared-and-project-logic → distribute-wiring → split-component-internals →
79
+ > refactor-tests → definition-of-done**
80
+
81
+ ### Optional skills (triggered during `polylith-migrate-discover`)
82
+
83
+ | Skill | Purpose | Trigger / dependency |
84
+ |-------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|
85
+ | [`polylith-migrate-convert-linter`](./polylith-migrate-convert-linter/SKILL.md) | Align the project's linter/formatter with the **workspace's** configured tool. | `CONVERT_LINTER=yes` in `state.md`. Runs between `polylith-migrate-discover` and `polylith-migrate-analyze-imports`. |
86
+ | [`polylith-migrate-convert-type-checker`](./polylith-migrate-convert-type-checker/SKILL.md) | Align the project's type checker with the **workspace's** configured tool. | `CONVERT_TYPE_CHECKER=yes` in `state.md`. Runs between `polylith-migrate-discover` and `polylith-migrate-analyze-imports`. |
87
+ | [`polylith-migrate-convert-package-manager`](./polylith-migrate-convert-package-manager/SKILL.md) | Convert the project's `pyproject.toml` to uv workspaces. **Opinionated about uv** — only run when the workspace itself uses uv. | `CONVERT_PACKAGE_MANAGER=yes` in `state.md`. Runs between `polylith-migrate-discover` and `polylith-migrate-analyze-imports`. |
88
+ | [`polylith-migrate-dedupe`](./polylith-migrate-dedupe/SKILL.md) | Identify and apply controlled deduplication discovered during refactoring. | User approval. Runs after `polylith-migrate-split-big-component` or `polylith-migrate-extract-standalone-modules`. |
89
+
90
+ ---
91
+
92
+ ## Scope of the four "splitting" skills
93
+
94
+ These skills overlap in vocabulary but address different scopes. Use this matrix to decide which one applies:
95
+
96
+ | Skill | Scope | Trigger |
97
+ |---------------------------------------------|------------------------------------------------|---------------------------------------------------------------------------|
98
+ | `polylith-migrate-split-big-component` | Within one project; component → multiple components. | The temporary big component (from `polylith-migrate-isolate-base-and-big-component`) is too large. |
99
+ | `polylith-migrate-extract-standalone-modules` | Within one project; pulls foundational modules out of the residual. | Residual still contains `consts.py`/`exceptions.py`/`models.py`. |
100
+ | `polylith-migrate-split-component-internals` | Within one already-extracted shared component; `core.py` → multiple files. | A component's `core.py` mixes multiple domains internally. |
101
+ | `polylith-migrate-isolate-shared-and-project-logic` | Cross-project; separate shared vs project-specific in components used by ≥ 2 projects. | Migrating a 2nd+ project that overlaps with an already-extracted one. |
102
+
103
+ > 💡 In a fresh migration of a single project, you usually run `polylith-migrate-split-big-component` → `polylith-migrate-extract-standalone-modules` → `polylith-migrate-split-component-internals`, and skip `polylith-migrate-isolate-shared-and-project-logic` until a second project is migrated.
104
+
105
+ ---
106
+
107
+ ## Files in this directory
108
+
109
+ - `README.md` — this file (human reference + index).
110
+ - `polylith-migrate-orchestrator/SKILL.md` — entry point; defines the phase order and the git safety net.
111
+ - `polylith-migrate-<phase>/SKILL.md` — one per phase referenced in the orchestrator table.
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-analyze-imports
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Analyze the project's import graph to find how the original namespace is referenced, choose the namespace-rewrite strategy (shim vs shimless), detect circular imports, and list symbols exported by the original namespace."
2
+ name: polylith-migrate-analyze-imports
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Analyze the project's import graph to find how the original namespace is referenced, choose the namespace-rewrite strategy (shim vs shimless), detect circular imports, and list symbols exported by the original namespace."
4
4
  ---
5
5
 
6
- # Skill: migrate-analyze-imports
6
+ # Skill: polylith-migrate-analyze-imports
7
7
 
8
8
  ## Goal
9
9
  Analyze the project's import graph to:
@@ -13,7 +13,7 @@ Analyze the project's import graph to:
13
13
  4. Detect potential circular imports.
14
14
 
15
15
  This drives the namespace rewrite (phase 4) and, when `SHIM_STRATEGY=shim`, the
16
- shim sub-track (phase 4b). See the `migrate-orchestrator` table for phase numbers.
16
+ shim sub-track (phase 4b). See the `polylith-migrate-orchestrator` table for phase numbers.
17
17
 
18
18
  ## Inputs
19
19
  - Project name (from `migration/<project-name>/state.md`)
@@ -95,5 +95,5 @@ SHIM_STRATEGY=<shim|shimless>
95
95
  git add migration/${PROJECT}/import_analysis.md migration/${PROJECT}/state.md
96
96
  git commit -m "migrate(${PROJECT}): phase <N> — analyze-imports"
97
97
  ```
98
- > `<N>` is this phase's number from the `migrate-orchestrator` table (the single
98
+ > `<N>` is this phase's number from the `polylith-migrate-orchestrator` table (the single
99
99
  > source of truth) — do not hardcode it.
@@ -1,21 +1,21 @@
1
1
  ---
2
- name: migrate-automate-import-updates
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Update imports in the new base location to reference the new namespace instead of the original namespace."
2
+ name: polylith-migrate-automate-import-updates
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Update imports in the new base location to reference the new namespace instead of the original namespace."
4
4
  ---
5
5
 
6
- # Skill: migrate-automate-import-updates
6
+ # Skill: polylith-migrate-automate-import-updates
7
7
 
8
8
  ## Goal
9
9
  Update imports to reference the new namespace instead of the original namespace, ensuring that the codebase remains functional after the namespace migration.
10
10
 
11
- > **Scope depends on `SHIM_STRATEGY`** (set by `migrate-analyze-imports`):
11
+ > **Scope depends on `SHIM_STRATEGY`** (set by `polylith-migrate-analyze-imports`):
12
12
  > - `shim`: rewrite imports **in the new base location only** — external consumers keep
13
13
  > using the original namespace via the shim (phase 4b).
14
14
  > - `shimless`: rewrite **every** reference to the original namespace — base internals,
15
15
  > entrypoints / run-scripts, infra (e.g. `alembic/env.py`), and tests — so nothing
16
16
  > imports the old namespace and no shim is needed.
17
17
  >
18
- > Cover **all three reference forms** (see `migrate-analyze-imports`): dotted
18
+ > Cover **all three reference forms** (see `polylith-migrate-analyze-imports`): dotted
19
19
  > `from <ns>.<sub> import …`, bare-submodule `from <ns> import <sub>` (incl. multi-name
20
20
  > and **mixed** lines), and quoted string paths (`mock.patch("<ns>.x.Y")`, logging
21
21
  > dict-config). A naive "`from <ns>.`" replace silently misses the bare and quoted forms.
@@ -26,7 +26,7 @@ Update imports to reference the new namespace instead of the original namespace,
26
26
  > names — far more reliably than ad-hoc edits across dozens of files. Keep it as plain
27
27
  > functions (no classes), run it over `bases/`, `components/`, `test/`, and the project
28
28
  > dir, then verify by grepping for any residual `<ns>` reference. The same helper is
29
- > reusable for the component-extraction rewrites in `migrate-split-big-component`.
29
+ > reusable for the component-extraction rewrites in `polylith-migrate-split-big-component`.
30
30
 
31
31
  ## Inputs
32
32
  - Project name (from `migration/<project-name>/state.md`)
@@ -73,4 +73,4 @@ git add bases/${TARGET_TOP_NS}/${INITIAL_BASE_NAME}/
73
73
  git add migration/${PROJECT}/import_updates.md
74
74
  git commit -m "migrate(${PROJECT}): phase <N> — automate-import-updates"
75
75
  ```
76
- > `<N>` is this phase's number from the `migrate-orchestrator` table (the single source of truth) — do not hardcode it.
76
+ > `<N>` is this phase's number from the `polylith-migrate-orchestrator` table (the single source of truth) — do not hardcode it.
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-convert-linter
3
- description: "[Internal sub-skill of `migrate-orchestrator` (optional, runs only when opted in during `migrate-discover`). Do not load directly — load `migrate-orchestrator` first.] Align the project's linter and formatter with the **workspace's** configured tool (whatever it is — ruff, black+isort+flake8, pylint, etc.). Removes project-specific config and consolidates rules into the workspace root."
2
+ name: polylith-migrate-convert-linter
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator` (optional, runs only when opted in during `polylith-migrate-discover`). Do not load directly — load `polylith-migrate-orchestrator` first.] Align the project's linter and formatter with the **workspace's** configured tool (whatever it is — ruff, black+isort+flake8, pylint, etc.). Removes project-specific config and consolidates rules into the workspace root."
4
4
  ---
5
5
 
6
- # Skill: migrate-convert-linter
6
+ # Skill: polylith-migrate-convert-linter
7
7
 
8
8
  ## Goal
9
9
  Align the project with the **workspace's** linter and formatter. This skill is **not** opinionated about ruff — it reads the workspace's configured tool from the root `pyproject.toml` and aligns the project to that.
@@ -17,12 +17,12 @@ From `migration/<PROJECT>/state.md`:
17
17
  - `LINTER`, `FORMATTER`
18
18
  - `RUN_TEST_CMD` (optional: `RUN_LINT_CMD`, `RUN_TYPECHECK_CMD`)
19
19
 
20
- > All inputs from `state.md` are assumed to satisfy the validation rules in `migrate-discover` (`### Validation rules`). Validate before proceeding.
20
+ > All inputs from `state.md` are assumed to satisfy the validation rules in `polylith-migrate-discover` (`### Validation rules`). Validate before proceeding.
21
21
 
22
22
  ## Steps
23
23
 
24
24
  ### 0. Identify the workspace's tool
25
- Open the **workspace root** `pyproject.toml` and identify the configured linter and formatter using the same detection table as `migrate-discover` (`[tool.ruff]` → ruff, `[tool.black]` → black, `[tool.flake8]` or `.flake8` → flake8, etc.). Record what you found — every step below refers to "the workspace's linter/formatter" and means **this** tool, not necessarily ruff.
25
+ Open the **workspace root** `pyproject.toml` and identify the configured linter and formatter using the same detection table as `polylith-migrate-discover` (`[tool.ruff]` → ruff, `[tool.black]` → black, `[tool.flake8]` or `.flake8` → flake8, etc.). Record what you found — every step below refers to "the workspace's linter/formatter" and means **this** tool, not necessarily ruff.
26
26
 
27
27
  If the workspace has no linter configured at all, stop and ask the user how to proceed (introduce ruff? skip linting alignment? abort the conversion?).
28
28
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-convert-package-manager
3
- description: "[Internal sub-skill of `migrate-orchestrator` (optional, runs only when opted in during `migrate-discover`). Do not load directly — load `migrate-orchestrator` first.] Convert the project's `pyproject.toml` to PEP 621/uv-workspaces format and register it as a uv-workspace member. **Opinionated about uv** — only applies when the workspace itself uses uv. Skip otherwise."
2
+ name: polylith-migrate-convert-package-manager
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator` (optional, runs only when opted in during `polylith-migrate-discover`). Do not load directly — load `polylith-migrate-orchestrator` first.] Convert the project's `pyproject.toml` to PEP 621/uv-workspaces format and register it as a uv-workspace member. **Opinionated about uv** — only applies when the workspace itself uses uv. Skip otherwise."
4
4
  ---
5
5
 
6
- # Skill: migrate-convert-package-manager
6
+ # Skill: polylith-migrate-convert-package-manager
7
7
 
8
8
  > ⚠ **Opinionation gate.** This skill is **explicitly opinionated about uv**. It does not generalize to Poetry, PDM, or Hatch workspaces. If your Polylith workspace uses one of those, **do not run this skill** — align the project to the workspace's manager via a manual step instead, and leave `CONVERT_PACKAGE_MANAGER=no` in `state.md`.
9
9
 
@@ -14,7 +14,7 @@ Convert the project's `pyproject.toml` to PEP 621/uv format and register it as a
14
14
  Skip this skill if **any** of the following holds:
15
15
  - `PACKAGE_MANAGER=uv` already in `migration/<PROJECT>/state.md` (nothing to convert).
16
16
  - The workspace root does **not** use uv (this skill does not apply — see the opinionation gate above).
17
- - `CONVERT_PACKAGE_MANAGER=no` in `state.md` (user opted out during `migrate-discover`).
17
+ - `CONVERT_PACKAGE_MANAGER=no` in `state.md` (user opted out during `polylith-migrate-discover`).
18
18
 
19
19
  ### Verify the workspace uses uv before proceeding
20
20
  Open the **workspace root** `pyproject.toml` and look for `[tool.uv.workspace]` and/or a sibling `uv.lock`. If neither is present, **stop**: this skill does not apply.
@@ -25,7 +25,7 @@ From `migration/<PROJECT>/state.md`:
25
25
  - `PACKAGE_MANAGER`
26
26
  - `RUN_TEST_CMD` (optional: `RUN_LINT_CMD`, `RUN_TYPECHECK_CMD`)
27
27
 
28
- > All inputs from `state.md` are assumed to satisfy the validation rules in `migrate-discover` (`### Validation rules`). Validate before proceeding.
28
+ > All inputs from `state.md` are assumed to satisfy the validation rules in `polylith-migrate-discover` (`### Validation rules`). Validate before proceeding.
29
29
 
30
30
  ## Steps
31
31
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-convert-type-checker
3
- description: "[Internal sub-skill of `migrate-orchestrator` (optional, runs only when opted in during `migrate-discover`). Do not load directly — load `migrate-orchestrator` first.] Align the project's type checker with the **workspace's** configured tool (whatever it is — mypy, pyright, ty, etc.). Removes project-specific config and consolidates settings into the workspace root."
2
+ name: polylith-migrate-convert-type-checker
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator` (optional, runs only when opted in during `polylith-migrate-discover`). Do not load directly — load `polylith-migrate-orchestrator` first.] Align the project's type checker with the **workspace's** configured tool (whatever it is — mypy, pyright, ty, etc.). Removes project-specific config and consolidates settings into the workspace root."
4
4
  ---
5
5
 
6
- # Skill: migrate-convert-type-checker
6
+ # Skill: polylith-migrate-convert-type-checker
7
7
 
8
8
  ## Goal
9
9
  Align the project with the **workspace's** type checker. This skill is **not** opinionated about ty — it reads the workspace's configured tool from the root `pyproject.toml` and aligns the project to that.
@@ -17,12 +17,12 @@ From `migration/<PROJECT>/state.md`:
17
17
  - `TYPE_CHECKER`
18
18
  - `RUN_TEST_CMD` (optional: `RUN_LINT_CMD`, `RUN_TYPECHECK_CMD`)
19
19
 
20
- > All inputs from `state.md` are assumed to satisfy the validation rules in `migrate-discover` (`### Validation rules`). Validate before proceeding.
20
+ > All inputs from `state.md` are assumed to satisfy the validation rules in `polylith-migrate-discover` (`### Validation rules`). Validate before proceeding.
21
21
 
22
22
  ## Steps
23
23
 
24
24
  ### 0. Identify the workspace's tool
25
- Open the **workspace root** `pyproject.toml` and identify the configured type checker using the same detection table as `migrate-discover` (`[tool.mypy]` or `mypy.ini` → mypy, `[tool.pyright]` or `pyrightconfig.json` → pyright, `[tool.ty]` → ty). Record what you found — every step below refers to "the workspace's type checker" and means **this** tool, not necessarily ty.
25
+ Open the **workspace root** `pyproject.toml` and identify the configured type checker using the same detection table as `polylith-migrate-discover` (`[tool.mypy]` or `mypy.ini` → mypy, `[tool.pyright]` or `pyrightconfig.json` → pyright, `[tool.ty]` → ty). Record what you found — every step below refers to "the workspace's type checker" and means **this** tool, not necessarily ty.
26
26
 
27
27
  If the workspace has no type checker configured at all, stop and ask the user how to proceed (introduce one? skip type-check alignment? abort the conversion?).
28
28
 
@@ -1,16 +1,16 @@
1
1
  ---
2
- name: migrate-dedupe
3
- description: "[Internal sub-skill of `migrate-orchestrator` (optional, runs only when opted in during `migrate-discover`). Do not load directly — load `migrate-orchestrator` first.] Identify and execute controlled deduplication of code during migration (if the user opts in)."
2
+ name: polylith-migrate-dedupe
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator` (optional, runs only when opted in during `polylith-migrate-discover`). Do not load directly — load `polylith-migrate-orchestrator` first.] Identify and execute controlled deduplication of code during migration (if the user opts in)."
4
4
  ---
5
5
 
6
- # Skill: migrate-dedupe
6
+ # Skill: polylith-migrate-dedupe
7
7
 
8
8
  > 📐 **Scope vs sibling skills.** This skill is **opportunistic deduplication** that may be triggered any time during refactoring when duplication candidates surface. It is **not** the canonical place for the structural decompositions:
9
- > - For "split this big component into smaller ones", use `migrate-split-big-component` (it already includes a dedup-analysis subsection — usually sufficient on a first migration).
10
- > - For "this component's `core.py` mixes domains", use `migrate-split-component-internals`.
11
- > - For "two projects have overlapping code, split shared from project-specific", use `migrate-isolate-shared-and-project-logic`.
9
+ > - For "split this big component into smaller ones", use `polylith-migrate-split-big-component` (it already includes a dedup-analysis subsection — usually sufficient on a first migration).
10
+ > - For "this component's `core.py` mixes domains", use `polylith-migrate-split-component-internals`.
11
+ > - For "two projects have overlapping code, split shared from project-specific", use `polylith-migrate-isolate-shared-and-project-logic`.
12
12
  >
13
- > Use `migrate-dedupe` when none of the above fits cleanly — e.g., duplication discovered across already-extracted components that don't map to a structural split.
13
+ > Use `polylith-migrate-dedupe` when none of the above fits cleanly — e.g., duplication discovered across already-extracted components that don't map to a structural split.
14
14
 
15
15
  ## Goal
16
16
  Identify duplication candidates during the migration process and execute controlled deduplication for user-approved candidates.
@@ -56,7 +56,7 @@ From `migration/<PROJECT>/state.md`:
56
56
  From `migration/<PROJECT>/manifest.md`:
57
57
  - Module map of components.
58
58
 
59
- > All inputs from `state.md` are assumed to satisfy the validation rules in `migrate-discover` (`### Validation rules`). Validate before proceeding.
59
+ > All inputs from `state.md` are assumed to satisfy the validation rules in `polylith-migrate-discover` (`### Validation rules`). Validate before proceeding.
60
60
 
61
61
  ## Steps
62
62
 
@@ -98,7 +98,7 @@ From `migration/<PROJECT>/manifest.md`:
98
98
  | Symptom | Likely cause | Remediation |
99
99
  |---------|--------------|-------------|
100
100
  | Two pieces of code look identical but operate on different domains (e.g., both are `validate(...)` but one is for users, the other for transactions) | Coincidental similarity, not real duplication. | Classify as "coincidental"; leave both in place. Resist the urge to share. |
101
- | The candidate shared component would pull in framework-specific dependencies (e.g., a "logging" shared brick that needs both `confluent_kafka_helpers` and `httpx`) | Wrong shared abstraction — you're sharing the union of two project surfaces. | Revert and parameterize instead: keep the shared core minimal and pass project-specific values as arguments. See the "Pattern: Parameterize the shared component" guidance in `migrate-split-big-component`. |
101
+ | The candidate shared component would pull in framework-specific dependencies (e.g., a "logging" shared brick that needs both `confluent_kafka_helpers` and `httpx`) | Wrong shared abstraction — you're sharing the union of two project surfaces. | Revert and parameterize instead: keep the shared core minimal and pass project-specific values as arguments. See the "Pattern: Parameterize the shared component" guidance in `polylith-migrate-split-big-component`. |
102
102
  | Tests break after deduplication because `mock.patch("<old.path>")` no longer hits anything | Patch strings reference the pre-dedup module path. | Update patch strings to the new shared module path. Validate by deliberately breaking the patched function and confirming the test fails. |
103
103
 
104
104
  ## Done When
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-definition-of-done
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Define the criteria for completing the migration process."
2
+ name: polylith-migrate-definition-of-done
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Define the criteria for completing the migration process."
4
4
  ---
5
5
 
6
- # Skill: migrate-definition-of-done
6
+ # Skill: polylith-migrate-definition-of-done
7
7
 
8
8
  ## Done When
9
9
 
@@ -23,7 +23,7 @@ description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directl
23
23
 
24
24
  ### Tests
25
25
  - Tests are moved from `projects/<PROJECT>/tests/` to workspace level (**required**).
26
- - Unit-test layout — **one** of the following (see `migrate-refactor-tests`):
26
+ - Unit-test layout — **one** of the following (see `polylith-migrate-refactor-tests`):
27
27
  - **Per-brick (theme-aligned):** `loose` → `test/bases/<TARGET_TOP_NS>/<base>/` and `test/components/<TARGET_TOP_NS>/<component>/`; `tdd` → `bases/<base>/test/<TARGET_TOP_NS>/<base>/` and `components/<component>/test/<TARGET_TOP_NS>/<component>/`. **Or**
28
28
  - **Workspace-level service dir** `test/<svc>_service/` — valid when shared test helpers can't cheaply become fixtures (the namespace-merge hazard makes a per-brick split unsafe otherwise). Record the chosen layout in `state.md`.
29
29
  - Integration tests live in a shared location (e.g., `test/integration/` or `test/<svc>_service/integration/`).
@@ -31,7 +31,7 @@ description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directl
31
31
  - `RUN_TEST_CMD` points to the test root **and collects the same number of tests as the pre-migration baseline**.
32
32
 
33
33
  ### Infrastructure
34
- - Infrastructure folders are moved to `infra/<folder>/<project-name>/`, **or** the move is **deferred with a documented rationale** in `state.md` when the deploy cannot be verified in the migration environment (see `migrate-prepare-project`). Either way, `alembic/` stays with `alembic.ini` in the project.
34
+ - Infrastructure folders are moved to `infra/<folder>/<project-name>/`, **or** the move is **deferred with a documented rationale** in `state.md` when the deploy cannot be verified in the migration environment (see `polylith-migrate-prepare-project`). Either way, `alembic/` stays with `alembic.ini` in the project.
35
35
 
36
36
  ### Interfaces
37
37
  - Each component defines its public API via `__init__.py`.
@@ -39,7 +39,7 @@ description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directl
39
39
 
40
40
  ### Linting and Type-Checking
41
41
  - Linting/formatting and type-checking use the workspace's configured tool(s).
42
- - `RUN_LINT_CMD` and `RUN_TYPECHECK_CMD` pass **if set**. They may be intentionally empty when the project's pre-migration baseline already failed these gates (recorded in `migrate-discover`); **pre-existing** violations are not the migration's responsibility — note them as a follow-up rather than blocking the migration.
42
+ - `RUN_LINT_CMD` and `RUN_TYPECHECK_CMD` pass **if set**. They may be intentionally empty when the project's pre-migration baseline already failed these gates (recorded in `polylith-migrate-discover`); **pre-existing** violations are not the migration's responsibility — note them as a follow-up rather than blocking the migration.
43
43
 
44
44
  ### Dependencies
45
45
  - Workspace root `pyproject.toml` contains all third-party dependencies with version constraints.
@@ -55,13 +55,13 @@ These checks go beyond per-phase verification and exercise the migrated project
55
55
 
56
56
  ### 1. Baseline test count restored
57
57
 
58
- Compare collected test count to the baseline recorded by `migrate-discover`:
58
+ Compare collected test count to the baseline recorded by `polylith-migrate-discover`:
59
59
 
60
60
  ```bash
61
61
  <RUN_TEST_CMD_with --collect-only -q | tail -1>
62
62
  ```
63
63
 
64
- The count must **equal** the baseline. A lower count means `pytest` discovery is misconfigured (see `migrate-refactor-tests` failure modes). A higher count means tests were inadvertently duplicated during the move.
64
+ The count must **equal** the baseline. A lower count means `pytest` discovery is misconfigured (see `polylith-migrate-refactor-tests` failure modes). A higher count means tests were inadvertently duplicated during the move.
65
65
 
66
66
  ### 2. No undocumented shims remain
67
67
 
@@ -80,9 +80,9 @@ Inspect `migration/<PROJECT>/shims.md` (if it exists):
80
80
 
81
81
  | Symptom | Likely cause | Remediation |
82
82
  |---------|--------------|-------------|
83
- | `RUN_TEST_CMD` passes but collected test count is lower than the baseline from `migrate-discover` | `pytest` discovery is misconfigured after the test reorganisation. | Update `[tool.pytest.ini_options].testpaths` (or pass paths explicitly in `RUN_TEST_CMD`). Run `pytest --collect-only` and diff against baseline collection. See `migrate-refactor-tests` for details. |
84
- | `poly check` is green and tests pass, but a base imports something that no longer exists at the expected path | Entrypoint wiring regression introduced while moving code into bases/components. | Verify each base's entrypoint module imports cleanly and that its wiring matches the original. Revisit `migrate-distribute-wiring`. |
85
- | `migration/shims.md` still lists active shims | Shims from `migrate-extract-to-base` (namespace change) were never removed. | Either rewrite imports to the new namespace and delete the shims, or schedule shim removal as a follow-up PR and note it in the migration branch description. Do not merge with undocumented shims. |
83
+ | `RUN_TEST_CMD` passes but collected test count is lower than the baseline from `polylith-migrate-discover` | `pytest` discovery is misconfigured after the test reorganisation. | Update `[tool.pytest.ini_options].testpaths` (or pass paths explicitly in `RUN_TEST_CMD`). Run `pytest --collect-only` and diff against baseline collection. See `polylith-migrate-refactor-tests` for details. |
84
+ | `poly check` is green and tests pass, but a base imports something that no longer exists at the expected path | Entrypoint wiring regression introduced while moving code into bases/components. | Verify each base's entrypoint module imports cleanly and that its wiring matches the original. Revisit `polylith-migrate-distribute-wiring`. |
85
+ | `migration/shims.md` still lists active shims | Shims from `polylith-migrate-extract-to-base` (namespace change) were never removed. | Either rewrite imports to the new namespace and delete the shims, or schedule shim removal as a follow-up PR and note it in the migration branch description. Do not merge with undocumented shims. |
86
86
 
87
87
  ## Commit
88
88
 
@@ -1,11 +1,11 @@
1
1
  ---
2
- name: migrate-detect-circular-imports
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Detect and report circular imports introduced by the namespace migration."
2
+ name: polylith-migrate-detect-circular-imports
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Detect and report circular imports introduced by the namespace migration."
4
4
  ---
5
5
 
6
- # Skill: migrate-detect-circular-imports
6
+ # Skill: polylith-migrate-detect-circular-imports
7
7
 
8
- > ⛓ **Conditional phase (4b).** Runs **only when `SHIM_STRATEGY=shim`** (chosen in `migrate-analyze-imports`). On the **shimless** path this phase is **skipped** — a pure namespace rename introduces no base↔shim cycles. See the `migrate-orchestrator` workflow.
8
+ > ⛓ **Conditional phase (4b).** Runs **only when `SHIM_STRATEGY=shim`** (chosen in `polylith-migrate-analyze-imports`). On the **shimless** path this phase is **skipped** — a pure namespace rename introduces no base↔shim cycles. See the `polylith-migrate-orchestrator` workflow.
9
9
 
10
10
  ## Goal
11
11
  Detect and report circular imports introduced by the namespace migration, particularly between the new base location and the compatibility shim.
@@ -45,4 +45,4 @@ Detect and report circular imports introduced by the namespace migration, partic
45
45
  git add migration/${PROJECT}/circular_imports.md
46
46
  git commit -m "migrate(${PROJECT}): phase <N> — detect-circular-imports"
47
47
  ```
48
- > `<N>` is this phase's number from the `migrate-orchestrator` table (the single source of truth) — do not hardcode it.
48
+ > `<N>` is this phase's number from the `polylith-migrate-orchestrator` table (the single source of truth) — do not hardcode it.
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-discover
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Create `migration/<PROJECT>/state.md` and `migration/<PROJECT>/manifest.md` by inspecting the existing project under `projects/<PROJECT>/`."
2
+ name: polylith-migrate-discover
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Create `migration/<PROJECT>/state.md` and `migration/<PROJECT>/manifest.md` by inspecting the existing project under `projects/<PROJECT>/`."
4
4
  ---
5
5
 
6
- # Skill: migrate-discover
6
+ # Skill: polylith-migrate-discover
7
7
 
8
8
  ## Goal
9
9
  Inspect the project and create two artifacts that drive every subsequent migration phase:
@@ -32,7 +32,7 @@ TYPE_CHECKER=<mypy|pyright|ty|none>
32
32
  POLY_CMD_PREFIX=<poetry poly|pipenv run poly|pdm run poly|hatch run poly|uv run poly|poly>
33
33
  BRICK_IMPORT_MECHANISM=<editable-root|pytest-pythonpath|other — how the workspace exposes <TARGET_TOP_NS>.* bricks for import>
34
34
 
35
- SHIM_STRATEGY=<shim|shimless — chosen in phase 2 (migrate-analyze-imports); may be empty at discover>
35
+ SHIM_STRATEGY=<shim|shimless — chosen in phase 2 (polylith-migrate-analyze-imports); may be empty at discover>
36
36
 
37
37
  CONVERT_LINTER=<yes|no>
38
38
  CONVERT_TYPE_CHECKER=<yes|no>
@@ -53,13 +53,13 @@ GIT_BASE_SHA=<commit SHA of the migration branch start point>
53
53
  | `PROJECT_DIR` | Project subfolder path. | The orchestrator's `<PROJECT>`. |
54
54
  | `ORIG_TOP_NS` | Current top-level Python package name. | First non-`tests` directory under `projects/<PROJECT>/src/` or `projects/<PROJECT>/`. |
55
55
  | `TARGET_TOP_NS` | Desired Polylith namespace. | `workspace.toml` `[tool.polylith].namespace`, or `ORIG_TOP_NS` if no workspace exists yet. |
56
- | `INITIAL_BASE_NAME` | Name of the **single temporary base** used to hold all code during early phases. Becomes the **default base name** in `migrate-isolate-base-and-big-component`. Final migrations usually contain *several* bases — this is just the starting one. | Derived from `[project.name]`, confirmed by user. |
56
+ | `INITIAL_BASE_NAME` | Name of the **single temporary base** used to hold all code during early phases. Becomes the **default base name** in `polylith-migrate-isolate-base-and-big-component`. Final migrations usually contain *several* bases — this is just the starting one. | Derived from `[project.name]`, confirmed by user. |
57
57
  | `ALIAS` | Short alias shown in `poly info` / `poly deps` tables. Optional. | Derived, confirmed by user. |
58
58
  | `GROUP` | Polylith project group. Optional. | Asked from user. |
59
59
  | `PACKAGE_MANAGER` / `LINTER` / `FORMATTER` / `TYPE_CHECKER` | Detected tooling. | Detection table below. |
60
60
  | `POLY_CMD_PREFIX` | Prefix every `poly …` command in later skills uses. | Derived from `PACKAGE_MANAGER`. |
61
61
  | `BRICK_IMPORT_MECHANISM` | How the workspace makes `<TARGET_TOP_NS>.*` bricks importable for tests/dev. `editable-root` (root project is editable-installed; e.g. Hatch `dev-mode-dirs`), `pytest-pythonpath` (root `[tool.pytest.ini_options].pythonpath = ["bases","components","development"]`), or `other`. | Step 4: confirmed/established below. |
62
- | `SHIM_STRATEGY` | `shim` or `shimless` — chosen in phase 2 (`migrate-analyze-imports`). May be empty at discover. | `migrate-analyze-imports`. |
62
+ | `SHIM_STRATEGY` | `shim` or `shimless` — chosen in phase 2 (`polylith-migrate-analyze-imports`). May be empty at discover. | `polylith-migrate-analyze-imports`. |
63
63
  | `CONVERT_*` | Whether the user opted in to a tooling conversion. | Asked from user. |
64
64
  | `RUN_TEST_CMD` etc. | The exact shell commands the migration verifies against after each phase. | Derived from project config, confirmed by user if ambiguous. |
65
65
  | `GIT_BRANCH` / `GIT_BASE_SHA` | Set by the orchestrator's Phase 0; recorded here so later skills know where to roll back to. | Orchestrator. |
@@ -177,7 +177,7 @@ Read the **workspace root** `pyproject.toml` to determine the workspace's standa
177
177
  - If the project's `LINTER`/`FORMATTER` already matches the workspace's → set `CONVERT_LINTER=no` (skip).
178
178
  - If the project's `TYPE_CHECKER` already matches the workspace's → set `CONVERT_TYPE_CHECKER=no` (skip).
179
179
  - If the project's `PACKAGE_MANAGER` is already `uv` **and** the workspace uses uv → set `CONVERT_PACKAGE_MANAGER=no` (skip).
180
- - If the workspace does **not** use uv, `migrate-convert-package-manager` does not apply at all — set `CONVERT_PACKAGE_MANAGER=no` and skip the question below.
180
+ - If the workspace does **not** use uv, `polylith-migrate-convert-package-manager` does not apply at all — set `CONVERT_PACKAGE_MANAGER=no` and skip the question below.
181
181
 
182
182
  ### 6. Create `manifest.md`
183
183
 
@@ -249,7 +249,7 @@ Wait for the user's response. Update `state.md` with corrections and the `CONVER
249
249
  |---------|--------------|-------------|
250
250
  | Derived `INITIAL_BASE_NAME` collides with an existing brick under `bases/<TARGET_TOP_NS>/` or `components/<TARGET_TOP_NS>/` | Two projects derive the same base name from a generic `[project.name]`. | Append a project-specific suffix (e.g., `payment_api` instead of `payment`) and re-confirm with the user. Check before writing `state.md`. |
251
251
  | Project has no detectable test command | No `pytest` / `make test` / CI config that reveals a runnable test command. | Ask the user explicitly. If none exists, set `RUN_TEST_CMD=` empty and record that **every later phase loses its primary safety check** — flag the heightened risk and, after each phase, verify that each base's entrypoint module imports cleanly and its wiring matches the original. |
252
- | Multiple linters or formatters are configured simultaneously (e.g., black + ruff format both active) | Project history accumulated tools without a cleanup. | Record both in `state.md` (comma-separated values are acceptable in this one case), and flag for resolution during `migrate-convert-linter`. Do **not** silently pick one. |
252
+ | Multiple linters or formatters are configured simultaneously (e.g., black + ruff format both active) | Project history accumulated tools without a cleanup. | Record both in `state.md` (comma-separated values are acceptable in this one case), and flag for resolution during `polylith-migrate-convert-linter`. Do **not** silently pick one. |
253
253
  | Baseline test command resolves the wrong Python (e.g. "incompatible with the project's Python requirement") | Project `requires-python` disagrees with the workspace root `requires-python` / `.python-version`. | Reconcile per step 4.2 — align the workspace version (confirm with user) or record a per-command `--python <X>` override in the verification commands. |
254
254
  | `ModuleNotFoundError: No module named '<TARGET_TOP_NS>'` once code is in a base | The workspace doesn't expose bricks (e.g. root `[tool.uv] package = false` with `dev-mode-dirs` that never takes effect). | Establish `BRICK_IMPORT_MECHANISM` per step 4.3 — add a root pytest `pythonpath`, or make the root editable-installable. |
255
255
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-distribute-wiring
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Distribute app-wiring code from the residual component into the appropriate bases and shared components."
2
+ name: polylith-migrate-distribute-wiring
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Distribute app-wiring code from the residual component into the appropriate bases and shared components."
4
4
  ---
5
5
 
6
- # Skill: migrate-distribute-wiring
6
+ # Skill: polylith-migrate-distribute-wiring
7
7
 
8
8
  ## Goal
9
9
  Distribute app-wiring code from the residual component into the appropriate bases and shared components.
@@ -18,7 +18,7 @@ From `migration/<PROJECT>/state.md`:
18
18
  From `migration/<PROJECT>/manifest.md`:
19
19
  - Current module map, including what remains in the residual component.
20
20
 
21
- > All inputs from `state.md` are assumed to satisfy the validation rules in `migrate-discover` (`### Validation rules`). Validate before proceeding.
21
+ > All inputs from `state.md` are assumed to satisfy the validation rules in `polylith-migrate-discover` (`### Validation rules`). Validate before proceeding.
22
22
 
23
23
  ## Steps
24
24
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-extract-standalone-modules
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Extract foundational modules (e.g., `consts.py`, `exceptions.py`, or similar) from the residual component into standalone components."
2
+ name: polylith-migrate-extract-standalone-modules
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Extract foundational modules (e.g., `consts.py`, `exceptions.py`, or similar) from the residual component into standalone components."
4
4
  ---
5
5
 
6
- # Skill: migrate-extract-standalone-modules
6
+ # Skill: polylith-migrate-extract-standalone-modules
7
7
 
8
8
  ## Goal
9
9
  Extract **foundational modules** (e.g., `consts.py`, `exceptions.py`, `models.py`) from the residual component into standalone components. This skill is for zero-dependency or low-dependency modules that serve as building blocks for other components.
@@ -17,7 +17,7 @@ From `migration/<PROJECT>/state.md`:
17
17
  From `migration/<PROJECT>/manifest.md`:
18
18
  - Current module map, including what remains in the residual component.
19
19
 
20
- > All inputs from `state.md` are assumed to satisfy the validation rules in `migrate-discover` (`### Validation rules`). Validate before proceeding.
20
+ > All inputs from `state.md` are assumed to satisfy the validation rules in `polylith-migrate-discover` (`### Validation rules`). Validate before proceeding.
21
21
 
22
22
  ## Steps
23
23
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: migrate-extract-to-base
3
- description: "[Internal sub-skill of `migrate-orchestrator`. Do not load directly — load `migrate-orchestrator` first, which drives all phases.] Extract all application code from `projects/<PROJECT>/` into a temporary migration base."
2
+ name: polylith-migrate-extract-to-base
3
+ description: "[Internal sub-skill of `polylith-migrate-orchestrator`. Do not load directly — load `polylith-migrate-orchestrator` first, which drives all phases.] Extract all application code from `projects/<PROJECT>/` into a temporary migration base."
4
4
  ---
5
5
 
6
- # Skill: migrate-extract-to-base
6
+ # Skill: polylith-migrate-extract-to-base
7
7
 
8
8
  ## Goal
9
9
  Extract all application code from `projects/<PROJECT>/` into a temporary migration base (`bases/<TARGET_TOP_NS>/<INITIAL_BASE_NAME>/`).
@@ -19,7 +19,7 @@ From `migration/<PROJECT>/state.md`:
19
19
  From `migration/<PROJECT>/manifest.md`:
20
20
  - Directory tree and module map.
21
21
 
22
- > All inputs from `state.md` are assumed to satisfy the validation rules in `migrate-discover` (`### Validation rules`). Validate before proceeding.
22
+ > All inputs from `state.md` are assumed to satisfy the validation rules in `polylith-migrate-discover` (`### Validation rules`). Validate before proceeding.
23
23
 
24
24
  ## Steps
25
25
 
@@ -48,17 +48,17 @@ From `migration/<PROJECT>/manifest.md`:
48
48
  ### 6. Handle Namespace Changes
49
49
  If `TARGET_TOP_NS != ORIG_TOP_NS`, the migration orchestrator will handle this in subsequent phases:
50
50
 
51
- 1. `migrate-generate-shim` will create a compatibility shim at `projects/${PROJECT}/${ORIG_TOP_NS}/__init__.py` that re-exports from `${TARGET_TOP_NS}.${INITIAL_BASE_NAME}`.
52
- 2. `migrate-automate-import-updates` will update imports in the new base location (at `bases/${TARGET_TOP_NS}/${INITIAL_BASE_NAME}/`) to reference the new namespace.
53
- 3. `migrate-update-tests` will update test files to use the compatibility shim.
51
+ 1. `polylith-migrate-generate-shim` will create a compatibility shim at `projects/${PROJECT}/${ORIG_TOP_NS}/__init__.py` that re-exports from `${TARGET_TOP_NS}.${INITIAL_BASE_NAME}`.
52
+ 2. `polylith-migrate-automate-import-updates` will update imports in the new base location (at `bases/${TARGET_TOP_NS}/${INITIAL_BASE_NAME}/`) to reference the new namespace.
53
+ 3. `polylith-migrate-update-tests` will update test files to use the compatibility shim.
54
54
 
55
55
  ### 7. Use Shims if Needed
56
56
  - If imports break during this phase, add minimal temporary shims to re-export names from the new brick API.
57
57
  - Track shims in `migration/shims.md`.
58
- - Note that comprehensive shim generation will be handled in the `migrate-generate-shim` phase.
58
+ - Note that comprehensive shim generation will be handled in the `polylith-migrate-generate-shim` phase.
59
59
 
60
60
  ## Verify
61
- - `RUN_TEST_CMD` succeeds with the same pass/fail counts as the pre-migration baseline recorded in `migrate-discover`.
61
+ - `RUN_TEST_CMD` succeeds with the same pass/fail counts as the pre-migration baseline recorded in `polylith-migrate-discover`.
62
62
  - If set, `RUN_LINT_CMD` and `RUN_TYPECHECK_CMD` succeed.
63
63
  - Run `POLY_CMD_PREFIX check` to validate the workspace structure.
64
64
  - Run `POLY_CMD_PREFIX sync` to synchronize the `[tool.polylith.bricks]` table with actual imports.
@@ -67,8 +67,8 @@ If `TARGET_TOP_NS != ORIG_TOP_NS`, the migration orchestrator will handle this i
67
67
 
68
68
  | Symptom | Likely cause | Remediation |
69
69
  |---------|--------------|-------------|
70
- | `ModuleNotFoundError: No module named '<ORIG_TOP_NS>.<x>'` after move | `TARGET_TOP_NS != ORIG_TOP_NS` and imports weren't rewritten or shimmed. | This is resolved by later phases per `SHIM_STRATEGY` (chosen in `migrate-analyze-imports`): `shimless` rewrites every reference in `migrate-automate-import-updates` (phase 4); `shim` adds a re-export shim under `ORIG_TOP_NS` in the phase 4b sub-track (`migrate-generate-shim`). To keep this phase green in the meantime, add a minimal temporary shim and record it in `migration/shims.md` (step 7). |
71
- | `RUN_TEST_CMD` collects 0 tests after the move | Test files moved but `pytest` rootdir / `testpaths` still points at the old `projects/<PROJECT>/tests` location. | Update `pyproject.toml` `[tool.pytest.ini_options].testpaths` or pass explicit dirs in `RUN_TEST_CMD`. (Note: `migrate-prepare-project` moves tests properly — if extract-to-base touched tests at all, consider undoing that part.) |
70
+ | `ModuleNotFoundError: No module named '<ORIG_TOP_NS>.<x>'` after move | `TARGET_TOP_NS != ORIG_TOP_NS` and imports weren't rewritten or shimmed. | This is resolved by later phases per `SHIM_STRATEGY` (chosen in `polylith-migrate-analyze-imports`): `shimless` rewrites every reference in `polylith-migrate-automate-import-updates` (phase 4); `shim` adds a re-export shim under `ORIG_TOP_NS` in the phase 4b sub-track (`polylith-migrate-generate-shim`). To keep this phase green in the meantime, add a minimal temporary shim and record it in `migration/shims.md` (step 7). |
71
+ | `RUN_TEST_CMD` collects 0 tests after the move | Test files moved but `pytest` rootdir / `testpaths` still points at the old `projects/<PROJECT>/tests` location. | Update `pyproject.toml` `[tool.pytest.ini_options].testpaths` or pass explicit dirs in `RUN_TEST_CMD`. (Note: `polylith-migrate-prepare-project` moves tests properly — if extract-to-base touched tests at all, consider undoing that part.) |
72
72
  | `poly check` reports "brick imports another brick that is not in `[tool.polylith.bricks]`" | Step 3 only added the base; imports inside the base may pull in components not yet listed. | Run `POLY_CMD_PREFIX sync --quiet` to populate the rest, then re-run `check`. |
73
73
  | Editable install / build fails (`error: package directory '<x>' does not exist`) | The base move broke the previous `[tool.setuptools]` or `[tool.hatch.build]` `packages` setting in `projects/<PROJECT>/pyproject.toml`. | Update `packages` to point at the new `<TARGET_TOP_NS>` namespace, or remove the explicit `packages` setting and let Polylith's build hook handle it. |
74
74
  | Verification fails and you can't quickly diagnose | Phase commit not yet made. | `git reset --hard HEAD` to roll back to the previous phase's commit and consult the user. |