planpilot 2.2.0__tar.gz → 2.4.0__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 (169) hide show
  1. {planpilot-2.2.0 → planpilot-2.4.0}/PKG-INFO +117 -48
  2. {planpilot-2.2.0 → planpilot-2.4.0}/README.md +113 -44
  3. {planpilot-2.2.0 → planpilot-2.4.0}/pyproject.toml +17 -15
  4. planpilot-2.4.0/src/planpilot/.claude-plugin/marketplace.json +17 -0
  5. planpilot-2.4.0/src/planpilot/.claude-plugin/plugin.json +18 -0
  6. planpilot-2.4.0/src/planpilot/AGENTS.md +35 -0
  7. planpilot-2.4.0/src/planpilot/__init__.py +80 -0
  8. planpilot-2.4.0/src/planpilot/cli/__init__.py +109 -0
  9. planpilot-2.4.0/src/planpilot/cli/__main__.py +6 -0
  10. planpilot-2.4.0/src/planpilot/cli/app.py +63 -0
  11. planpilot-2.4.0/src/planpilot/cli/commands/__init__.py +1 -0
  12. planpilot-2.4.0/src/planpilot/cli/commands/clean.py +49 -0
  13. planpilot-2.4.0/src/planpilot/cli/commands/init.py +270 -0
  14. planpilot-2.4.0/src/planpilot/cli/commands/map_sync.py +101 -0
  15. planpilot-2.4.0/src/planpilot/cli/commands/sync.py +99 -0
  16. planpilot-2.4.0/src/planpilot/cli/common.py +20 -0
  17. planpilot-2.4.0/src/planpilot/cli/init/__init__.py +5 -0
  18. planpilot-2.4.0/src/planpilot/cli/init/validation.py +12 -0
  19. planpilot-2.4.0/src/planpilot/cli/parser.py +69 -0
  20. planpilot-2.4.0/src/planpilot/cli/persistence/__init__.py +12 -0
  21. planpilot-2.4.0/src/planpilot/cli/persistence/remote_plan.py +71 -0
  22. planpilot-2.4.0/src/planpilot/cli/persistence/sync_map.py +39 -0
  23. planpilot-2.4.0/src/planpilot/cli/progress/__init__.py +5 -0
  24. planpilot-2.2.0/src/planpilot/progress.py → planpilot-2.4.0/src/planpilot/cli/progress/rich.py +1 -8
  25. planpilot-2.4.0/src/planpilot/cli/scaffold/__init__.py +17 -0
  26. planpilot-2.4.0/src/planpilot/cli/scaffold/config_builder.py +17 -0
  27. planpilot-2.4.0/src/planpilot/commands/prd.md +6 -0
  28. planpilot-2.4.0/src/planpilot/commands/spec.md +6 -0
  29. planpilot-2.4.0/src/planpilot/commands/sync.md +6 -0
  30. planpilot-2.4.0/src/planpilot/core/__init__.py +1 -0
  31. planpilot-2.4.0/src/planpilot/core/auth/__init__.py +21 -0
  32. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/factory.py +6 -6
  33. planpilot-2.4.0/src/planpilot/core/auth/preflight.py +168 -0
  34. planpilot-2.4.0/src/planpilot/core/auth/resolvers/__init__.py +7 -0
  35. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/env.py +2 -2
  36. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/gh_cli.py +2 -2
  37. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/static.py +2 -2
  38. planpilot-2.4.0/src/planpilot/core/clean/__init__.py +5 -0
  39. planpilot-2.4.0/src/planpilot/core/clean/deletion_planner.py +100 -0
  40. planpilot-2.4.0/src/planpilot/core/config/__init__.py +19 -0
  41. planpilot-2.4.0/src/planpilot/core/config/loader.py +67 -0
  42. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core/config}/scaffold.py +17 -39
  43. planpilot-2.4.0/src/planpilot/core/contracts/__init__.py +29 -0
  44. planpilot-2.4.0/src/planpilot/core/contracts/init.py +16 -0
  45. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/item.py +5 -1
  46. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/provider.py +1 -1
  47. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/renderer.py +1 -1
  48. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/sync.py +9 -2
  49. planpilot-2.4.0/src/planpilot/core/engine/__init__.py +6 -0
  50. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/engine.py +113 -35
  51. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/utils.py +3 -25
  52. planpilot-2.4.0/src/planpilot/core/init/__init__.py +5 -0
  53. planpilot-2.4.0/src/planpilot/core/init/validation.py +17 -0
  54. planpilot-2.4.0/src/planpilot/core/map_sync/__init__.py +7 -0
  55. planpilot-2.4.0/src/planpilot/core/map_sync/parser.py +79 -0
  56. planpilot-2.4.0/src/planpilot/core/map_sync/persistence.py +25 -0
  57. planpilot-2.4.0/src/planpilot/core/map_sync/reconciler.py +41 -0
  58. planpilot-2.4.0/src/planpilot/core/metadata.py +30 -0
  59. planpilot-2.4.0/src/planpilot/core/plan/__init__.py +7 -0
  60. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/hasher.py +1 -1
  61. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/loader.py +3 -3
  62. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/validator.py +2 -2
  63. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/AGENTS.md +5 -5
  64. planpilot-2.4.0/src/planpilot/core/providers/__init__.py +7 -0
  65. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/dry_run.py +12 -4
  66. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/factory.py +4 -4
  67. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/AGENTS.md +7 -7
  68. planpilot-2.4.0/src/planpilot/core/providers/github/__init__.py +5 -0
  69. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/_retrying_transport.py +2 -2
  70. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/__init__.py +22 -17
  71. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_blocked_by.py +1 -1
  72. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_labels.py +1 -1
  73. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_project_item.py +1 -1
  74. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_sub_issue.py +1 -1
  75. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/client.py +13 -1
  76. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/close_issue.py +1 -1
  77. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/create_issue.py +1 -1
  78. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/create_label.py +1 -1
  79. planpilot-2.4.0/src/planpilot/core/providers/github/github_gql/delete_issue.py +19 -0
  80. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/enums.py +1 -1
  81. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/exceptions.py +1 -1
  82. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_org_project.py +1 -1
  83. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_project_fields.py +1 -1
  84. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_project_items.py +1 -1
  85. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_relations.py +1 -1
  86. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_repo.py +1 -1
  87. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_user_project.py +1 -1
  88. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/find_labels.py +1 -1
  89. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fragments.py +1 -1
  90. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/get_issue.py +1 -1
  91. planpilot-2.4.0/src/planpilot/core/providers/github/github_gql/input_types.py +9 -0
  92. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/operations.py +10 -1
  93. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_blocked_by.py +1 -1
  94. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_labels.py +1 -1
  95. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_sub_issue.py +1 -1
  96. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/search_issues.py +1 -1
  97. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/update_issue.py +1 -1
  98. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/update_project_field.py +1 -1
  99. planpilot-2.4.0/src/planpilot/core/providers/github/item.py +101 -0
  100. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/mapper.py +4 -14
  101. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/models.py +1 -1
  102. planpilot-2.4.0/src/planpilot/core/providers/github/operations/delete_issue.graphql +5 -0
  103. planpilot-2.4.0/src/planpilot/core/providers/github/ops/__init__.py +1 -0
  104. planpilot-2.4.0/src/planpilot/core/providers/github/ops/convert.py +41 -0
  105. planpilot-2.4.0/src/planpilot/core/providers/github/ops/crud.py +121 -0
  106. planpilot-2.4.0/src/planpilot/core/providers/github/ops/labels.py +71 -0
  107. planpilot-2.4.0/src/planpilot/core/providers/github/ops/project.py +129 -0
  108. planpilot-2.4.0/src/planpilot/core/providers/github/ops/relations.py +22 -0
  109. planpilot-2.4.0/src/planpilot/core/providers/github/provider.py +469 -0
  110. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/schema.graphql +1 -1
  111. planpilot-2.4.0/src/planpilot/core/renderers/__init__.py +6 -0
  112. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/renderers/factory.py +2 -2
  113. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/renderers/markdown.py +4 -2
  114. planpilot-2.4.0/src/planpilot/core/targets/__init__.py +5 -0
  115. planpilot-2.4.0/src/planpilot/core/targets/github_project.py +21 -0
  116. planpilot-2.4.0/src/planpilot/sdk.py +388 -0
  117. planpilot-2.4.0/src/planpilot/skills/INSTALL.agent.md +155 -0
  118. planpilot-2.4.0/src/planpilot/skills/INSTALL.md +169 -0
  119. planpilot-2.4.0/src/planpilot/skills/create-prd/SKILL.md +208 -0
  120. planpilot-2.4.0/src/planpilot/skills/create-tech-spec/SKILL.md +352 -0
  121. planpilot-2.4.0/src/planpilot/skills/plan-sync/SKILL.md +623 -0
  122. planpilot-2.2.0/src/planpilot/AGENTS.md +0 -40
  123. planpilot-2.2.0/src/planpilot/__init__.py +0 -58
  124. planpilot-2.2.0/src/planpilot/auth/__init__.py +0 -6
  125. planpilot-2.2.0/src/planpilot/auth/resolvers/__init__.py +0 -7
  126. planpilot-2.2.0/src/planpilot/cli.py +0 -639
  127. planpilot-2.2.0/src/planpilot/contracts/__init__.py +0 -54
  128. planpilot-2.2.0/src/planpilot/engine/__init__.py +0 -6
  129. planpilot-2.2.0/src/planpilot/plan/__init__.py +0 -7
  130. planpilot-2.2.0/src/planpilot/providers/__init__.py +0 -7
  131. planpilot-2.2.0/src/planpilot/providers/github/__init__.py +0 -5
  132. planpilot-2.2.0/src/planpilot/providers/github/github_gql/input_types.py +0 -4
  133. planpilot-2.2.0/src/planpilot/providers/github/item.py +0 -67
  134. planpilot-2.2.0/src/planpilot/providers/github/provider.py +0 -578
  135. planpilot-2.2.0/src/planpilot/renderers/__init__.py +0 -6
  136. planpilot-2.2.0/src/planpilot/sdk.py +0 -404
  137. {planpilot-2.2.0 → planpilot-2.4.0}/LICENSE +0 -0
  138. {planpilot-2.2.0 → planpilot-2.4.0}/src/planpilot/__main__.py +0 -0
  139. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/base.py +0 -0
  140. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/config.py +0 -0
  141. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/exceptions.py +0 -0
  142. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/plan.py +0 -0
  143. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/progress.py +0 -0
  144. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/base.py +0 -0
  145. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/async_base_client.py +0 -0
  146. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/base_model.py +0 -0
  147. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_blocked_by.graphql +0 -0
  148. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_labels.graphql +0 -0
  149. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_project_item.graphql +0 -0
  150. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_sub_issue.graphql +0 -0
  151. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/close_issue.graphql +0 -0
  152. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/create_issue.graphql +0 -0
  153. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/create_label.graphql +0 -0
  154. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_org_project.graphql +0 -0
  155. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_project_fields.graphql +0 -0
  156. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_project_items.graphql +0 -0
  157. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_relations.graphql +0 -0
  158. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_repo.graphql +0 -0
  159. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_user_project.graphql +0 -0
  160. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/find_labels.graphql +0 -0
  161. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fragments.graphql +0 -0
  162. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/get_issue.graphql +0 -0
  163. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_blocked_by.graphql +0 -0
  164. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_labels.graphql +0 -0
  165. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_sub_issue.graphql +0 -0
  166. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/search_issues.graphql +0 -0
  167. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/update_issue.graphql +0 -0
  168. {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/update_project_field.graphql +0 -0
  169. {planpilot-2.2.0 → planpilot-2.4.0}/src/planpilot/py.typed +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: planpilot
3
- Version: 2.2.0
3
+ Version: 2.4.0
4
4
  Summary: Sync roadmap plans (epics, stories, tasks) to GitHub Issues and Projects v2
5
5
  License: MIT
6
6
  License-File: LICENSE
7
7
  Keywords: github,projects,roadmap,sync,issues,project-management,cli,asyncio
8
- Author: aryeko
9
- Maintainer: aryeko
10
- Requires-Python: >=3.11
8
+ Author: Arye Kogan
9
+ Maintainer: Arye Kogan
10
+ Requires-Python: >=3.11,<4.0
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
@@ -35,7 +35,7 @@ Description-Content-Type: text/markdown
35
35
  # <img src="https://raw.githubusercontent.com/aryeko/planpilot/main/assets/branding/navigator/navigator-square-512.png" alt="planpilot logo" width="32" height="32" align="absmiddle" /> planpilot
36
36
 
37
37
  [![CI](https://github.com/aryeko/planpilot/actions/workflows/ci.yml/badge.svg)](https://github.com/aryeko/planpilot/actions/workflows/ci.yml)
38
- [![codecov](https://codecov.io/gh/aryeko/planpilot/graph/badge.svg?token=3I2A515YTI)](https://codecov.io/gh/aryeko/planpilot)
38
+ [![codecov](https://codecov.io/gh/aryeko/planpilot/graph/badge.svg)](https://codecov.io/gh/aryeko/planpilot)
39
39
  [![PyPI](https://img.shields.io/pypi/v/planpilot)](https://pypi.org/project/planpilot/)
40
40
  [![Python](https://img.shields.io/pypi/pyversions/planpilot)](https://pypi.org/project/planpilot/)
41
41
  [![Downloads](https://static.pepy.tech/badge/planpilot)](https://pepy.tech/project/planpilot)
@@ -45,6 +45,12 @@ Sync roadmap plans (epics, stories, tasks) to GitHub Issues and Projects v2.
45
45
 
46
46
  > **⭐ If planpilot helps you manage your roadmaps, consider [giving it a star](https://github.com/aryeko/planpilot)!**
47
47
 
48
+ ## Why planpilot?
49
+
50
+ Managing roadmaps through GitHub's UI works for small projects, but breaks down fast: manually creating dozens of issues, linking parent/child hierarchies, setting up blocked-by dependencies, and keeping project board fields in sync is tedious and error-prone. Scripting the GitHub API directly means dealing with pagination, rate limits, idempotency, and GraphQL complexity.
51
+
52
+ **planpilot treats your roadmap as code.** Define epics, stories, and tasks in JSON files, commit them alongside your source code, and let planpilot handle the rest — creating issues, wiring up sub-issue hierarchies, setting blocked-by relations, and populating project board fields. It's idempotent (safe to rerun), supports dry-run previews, and works across multiple epics in a single run.
53
+
48
54
  ## What it does
49
55
 
50
56
  **planpilot** takes structured plan files and turns them into a fully linked project board:
@@ -72,26 +78,21 @@ planpilot follows SOLID principles with a modular, provider-agnostic design:
72
78
 
73
79
  ```text
74
80
  src/planpilot/
75
- ├── contracts/ # Core types, ABCs, and exception hierarchy
76
- ├── plan/ # Plan loading, validation, and hashing
77
- ├── auth/ # Token resolver strategy + factory
78
- ├── renderers/ # Body rendering implementations
79
- ├── engine/ # 5-phase sync orchestration
80
- ├── providers/ # Provider adapter layer
81
- │ └── github/ # GitHub GraphQL adapter + generated client
82
- ├── sdk.py # Composition root and config loading
83
- └── cli.py # CLI entry point
81
+ ├── core/ # Runtime domains (auth/config/contracts/engine/plan/providers/renderers)
82
+ ├── cli/ # CLI parser/app/commands and persistence helpers
83
+ ├── sdk.py # SDK composition root and public facade
84
+ └── __init__.py # Public API exports
84
85
  ```
85
86
 
86
- Core modules depend on contracts, and the SDK composes the runtime pieces. This keeps provider and renderer implementations swappable without changing engine internals.
87
+ Core domains provide business logic, and the SDK composes runtime pieces. This keeps provider and renderer implementations swappable without changing engine internals.
87
88
 
88
89
  See [docs/design/architecture.md](docs/design/architecture.md) for the full architecture guide.
89
90
 
90
91
  ## Requirements
91
92
 
92
93
  - Python 3.11+
93
- - [`gh` CLI](https://cli.github.com/) installed and authenticated
94
- - GitHub token scopes: `repo`, `project`
94
+ - GitHub token with `repo` and `project` scopes
95
+ - [`gh` CLI](https://cli.github.com/) only when using `auth: "gh-cli"`
95
96
 
96
97
  ## Installation
97
98
 
@@ -120,42 +121,83 @@ pip install planpilot
120
121
  <summary>From source (Poetry)</summary>
121
122
 
122
123
  ```bash
123
- poetry add planpilot
124
+ poetry install
124
125
  ```
125
126
 
126
127
  </details>
127
128
 
128
- ## Install Agent Skill
129
-
130
- ### Agent Self-Install
129
+ ## Try it now
131
130
 
132
- Tell your agent:
131
+ See planpilot in action without any configuration or GitHub token — the built-in example runs a fully offline dry-run:
133
132
 
133
+ ```bash
134
+ git clone https://github.com/aryeko/planpilot.git && cd planpilot
135
+ pipx install . # or: pip install .
136
+ planpilot sync --config examples/sync-workflow/planpilot.json --dry-run
134
137
  ```
135
- Fetch and follow instructions from https://raw.githubusercontent.com/aryeko/planpilot/refs/heads/main/skills/INSTALL.agent.md
138
+
139
+ ```text
140
+ planpilot - sync complete (dry-run)
141
+
142
+ Plan ID: 3832d3ffce22
143
+ Target: example-org/example-repo
144
+ Board: https://github.com/orgs/example-org/projects/1
145
+
146
+ Items: 6 total (1 epic, 2 stories, 3 tasks)
147
+ Created: 6 (1 epic, 2 stories, 3 tasks)
148
+
149
+ Sync map: /absolute/path/to/examples/sync-workflow/output/sync-map-sample.json.dry-run
150
+
151
+ [dry-run] No changes were made
136
152
  ```
137
153
 
138
- The agent will install both `planpilot` and the skill automatically.
154
+ ## Install Agent Skills
139
155
 
140
- ### Manual Install
156
+ planpilot ships three agent skills that form a complete product workflow:
157
+
158
+ | Skill | Purpose |
159
+ |-------|---------|
160
+ | `create-prd` | Generate structured PRDs from feature ideas |
161
+ | `create-tech-spec` | Create codebase-aware technical specs from PRDs |
162
+ | `plan-sync` | Sync specs to GitHub Issues + Projects v2 |
163
+
164
+ ### Claude Code Plugin
141
165
 
142
- Install the skill to the open discovery path used by agent platforms that support filesystem skills:
166
+ Install the planpilot plugin directly in Claude Code (the planpilot CLI is installed automatically from PyPI):
143
167
 
144
168
  ```bash
145
- mkdir -p ~/.agents/skills/roadmap-to-github-project
169
+ claude plugin marketplace add aryeko/planpilot
170
+ claude plugin install planpilot@planpilot
171
+ ```
172
+
173
+ Then use:
174
+ - `/planpilot:prd` — create a PRD from a feature idea
175
+ - `/planpilot:spec` — create a tech spec from a PRD
176
+ - `/planpilot:sync` — generate `.plans` JSON and sync to GitHub
177
+
178
+ ### Agent Self-Install
146
179
 
147
- curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/skills/roadmap-to-github-project/SKILL.md" \
148
- -o ~/.agents/skills/roadmap-to-github-project/SKILL.md
180
+ Tell your agent:
181
+
182
+ ```text
183
+ Fetch and follow instructions from https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilot/skills/INSTALL.agent.md
149
184
  ```
150
185
 
151
- Or from a local checkout:
186
+ The agent will install `planpilot` and all three skills automatically.
187
+
188
+ ### Manual Install
189
+
190
+ Install skills to the open discovery path used by agent platforms that support filesystem skills:
152
191
 
153
192
  ```bash
154
- cp skills/roadmap-to-github-project/SKILL.md \
155
- ~/.agents/skills/roadmap-to-github-project/SKILL.md
193
+ for skill in create-prd create-tech-spec plan-sync; do
194
+ mkdir -p ~/.agents/skills/$skill
195
+ curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilot/skills/$skill/SKILL.md" \
196
+ -o ~/.agents/skills/$skill/SKILL.md
197
+ done
156
198
  ```
157
199
 
158
- Full standalone instructions: [`skills/INSTALL.md`](skills/INSTALL.md)
200
+ Full standalone instructions: [`src/planpilot/skills/INSTALL.md`](src/planpilot/skills/INSTALL.md)
159
201
 
160
202
  ## Quickstart
161
203
 
@@ -178,7 +220,7 @@ cat > planpilot.json <<'JSON'
178
220
  "stories": ".plans/stories.json",
179
221
  "tasks": ".plans/tasks.json"
180
222
  },
181
- "sync_path": ".plans/github-sync-map.json"
223
+ "sync_path": ".plans/sync-map.json"
182
224
  }
183
225
  JSON
184
226
  ```
@@ -221,6 +263,16 @@ planpilot sync --config ./planpilot.json --apply
221
263
  | `--apply` | — | Apply mode |
222
264
  | `--verbose` | off | Enable verbose logging |
223
265
 
266
+ ### `planpilot clean`
267
+
268
+ | Flag | Default | Description |
269
+ |------|---------|-------------|
270
+ | `--config` | `./planpilot.json` | Path to `planpilot.json` |
271
+ | `--dry-run` | — | Preview which issues would be deleted |
272
+ | `--apply` | — | Execute deletions |
273
+ | `--all` | off | Delete all planpilot-managed issues by label, regardless of current plan hash |
274
+ | `--verbose` | off | Enable verbose logging |
275
+
224
276
  ### `planpilot map sync`
225
277
 
226
278
  | Flag | Default | Description |
@@ -238,23 +290,39 @@ Full CLI reference: [docs/modules/cli.md](docs/modules/cli.md)
238
290
 
239
291
  ## Plan file schemas
240
292
 
241
- See [docs/schemas.md](docs/schemas.md) for plan schema examples and [docs/modules/plan.md](docs/modules/plan.md) for validation behavior.
293
+ See [docs/reference/plan-schemas.md](docs/reference/plan-schemas.md) for plan schema examples and [docs/modules/plan.md](docs/modules/plan.md) for validation behavior.
242
294
 
243
295
  A complete working example is in the [examples/](examples/) directory, including sample rendered issue bodies and a sync-map output.
244
296
 
245
297
  ## Documentation
246
298
 
247
- - [Docs Index](docs/README.md) -- v2 documentation hub
248
- - [How It Works](docs/how-it-works.md) -- end-to-end sync behavior
249
- - [E2E Testing](docs/e2e-testing.md) -- offline end-to-end test design, coverage, and usage
250
- - [Plan Schemas](docs/schemas.md) -- plan JSON shapes and examples
251
- - [Architecture](docs/design/architecture.md) -- layer rules and data flow
252
- - [Contracts](docs/design/contracts.md) -- core domain and adapter contracts
253
- - [Engine](docs/design/engine.md) -- sync pipeline behavior
254
- - [CLI](docs/modules/cli.md) -- command structure, output, and exit codes
255
- - [SDK](docs/modules/sdk.md) -- public API and composition root
256
- - [Providers](docs/modules/providers.md) -- provider model and extension guide
257
- - [Release Guide](RELEASE.md) -- automated versioning, publishing, and release pipeline
299
+ - Start here:
300
+ - [Docs Index](docs/README.md)
301
+ - [CLI Reference](docs/reference/cli-reference.md)
302
+ - [SDK Reference](docs/reference/sdk-reference.md)
303
+ - [Config Reference](docs/reference/config-reference.md)
304
+ - [Exit Codes](docs/reference/exit-codes.md)
305
+ - [Workflows Reference](docs/reference/workflows-reference.md)
306
+ - [Developer Workflow](docs/reference/developer-workflow.md)
307
+ - [Docs Inventory](docs/reference/docs-inventory.md)
308
+ - [Troubleshooting](docs/guides/troubleshooting.md)
309
+ - Architecture and behavior:
310
+ - [How It Works](docs/how-it-works.md)
311
+ - [Architecture](docs/design/architecture.md)
312
+ - [Contracts](docs/design/contracts.md)
313
+ - [Engine](docs/design/engine.md)
314
+ - [Map Sync Design](docs/design/map-sync.md)
315
+ - [Clean Workflow Design](docs/design/clean.md)
316
+ - [Code Map](docs/design/codemap.md)
317
+ - Module implementation details:
318
+ - [CLI](docs/modules/cli.md)
319
+ - [SDK](docs/modules/sdk.md)
320
+ - [Providers](docs/modules/providers.md)
321
+ - [GitHub Provider](docs/modules/github-provider.md)
322
+ - Operations:
323
+ - [E2E Testing](docs/testing/e2e.md)
324
+ - [Release Guide](RELEASE.md)
325
+ - [Changelog](CHANGELOG.md)
258
326
 
259
327
  ## Support
260
328
 
@@ -272,12 +340,13 @@ Development tasks use [poethepoet](https://github.com/nat-n/poethepoet):
272
340
  ```bash
273
341
  poe lint # ruff check
274
342
  poe format # ruff format
275
- poe test # pytest -v
343
+ poe docs-links # validate local markdown links
344
+ poe test # pytest -v --ignore=tests/e2e
276
345
  poe test-e2e # run offline E2E suite
277
346
  poe coverage # pytest + HTML coverage report
278
347
  poe coverage-e2e # E2E-only coverage XML
279
348
  poe typecheck # mypy
280
- poe check # lint + format-check + tests (all-in-one)
349
+ poe check # lint + format-check + typecheck + tests
281
350
  ```
282
351
 
283
352
  ## Contributing
@@ -1,7 +1,7 @@
1
1
  # <img src="https://raw.githubusercontent.com/aryeko/planpilot/main/assets/branding/navigator/navigator-square-512.png" alt="planpilot logo" width="32" height="32" align="absmiddle" /> planpilot
2
2
 
3
3
  [![CI](https://github.com/aryeko/planpilot/actions/workflows/ci.yml/badge.svg)](https://github.com/aryeko/planpilot/actions/workflows/ci.yml)
4
- [![codecov](https://codecov.io/gh/aryeko/planpilot/graph/badge.svg?token=3I2A515YTI)](https://codecov.io/gh/aryeko/planpilot)
4
+ [![codecov](https://codecov.io/gh/aryeko/planpilot/graph/badge.svg)](https://codecov.io/gh/aryeko/planpilot)
5
5
  [![PyPI](https://img.shields.io/pypi/v/planpilot)](https://pypi.org/project/planpilot/)
6
6
  [![Python](https://img.shields.io/pypi/pyversions/planpilot)](https://pypi.org/project/planpilot/)
7
7
  [![Downloads](https://static.pepy.tech/badge/planpilot)](https://pepy.tech/project/planpilot)
@@ -11,6 +11,12 @@ Sync roadmap plans (epics, stories, tasks) to GitHub Issues and Projects v2.
11
11
 
12
12
  > **⭐ If planpilot helps you manage your roadmaps, consider [giving it a star](https://github.com/aryeko/planpilot)!**
13
13
 
14
+ ## Why planpilot?
15
+
16
+ Managing roadmaps through GitHub's UI works for small projects, but breaks down fast: manually creating dozens of issues, linking parent/child hierarchies, setting up blocked-by dependencies, and keeping project board fields in sync is tedious and error-prone. Scripting the GitHub API directly means dealing with pagination, rate limits, idempotency, and GraphQL complexity.
17
+
18
+ **planpilot treats your roadmap as code.** Define epics, stories, and tasks in JSON files, commit them alongside your source code, and let planpilot handle the rest — creating issues, wiring up sub-issue hierarchies, setting blocked-by relations, and populating project board fields. It's idempotent (safe to rerun), supports dry-run previews, and works across multiple epics in a single run.
19
+
14
20
  ## What it does
15
21
 
16
22
  **planpilot** takes structured plan files and turns them into a fully linked project board:
@@ -38,26 +44,21 @@ planpilot follows SOLID principles with a modular, provider-agnostic design:
38
44
 
39
45
  ```text
40
46
  src/planpilot/
41
- ├── contracts/ # Core types, ABCs, and exception hierarchy
42
- ├── plan/ # Plan loading, validation, and hashing
43
- ├── auth/ # Token resolver strategy + factory
44
- ├── renderers/ # Body rendering implementations
45
- ├── engine/ # 5-phase sync orchestration
46
- ├── providers/ # Provider adapter layer
47
- │ └── github/ # GitHub GraphQL adapter + generated client
48
- ├── sdk.py # Composition root and config loading
49
- └── cli.py # CLI entry point
47
+ ├── core/ # Runtime domains (auth/config/contracts/engine/plan/providers/renderers)
48
+ ├── cli/ # CLI parser/app/commands and persistence helpers
49
+ ├── sdk.py # SDK composition root and public facade
50
+ └── __init__.py # Public API exports
50
51
  ```
51
52
 
52
- Core modules depend on contracts, and the SDK composes the runtime pieces. This keeps provider and renderer implementations swappable without changing engine internals.
53
+ Core domains provide business logic, and the SDK composes runtime pieces. This keeps provider and renderer implementations swappable without changing engine internals.
53
54
 
54
55
  See [docs/design/architecture.md](docs/design/architecture.md) for the full architecture guide.
55
56
 
56
57
  ## Requirements
57
58
 
58
59
  - Python 3.11+
59
- - [`gh` CLI](https://cli.github.com/) installed and authenticated
60
- - GitHub token scopes: `repo`, `project`
60
+ - GitHub token with `repo` and `project` scopes
61
+ - [`gh` CLI](https://cli.github.com/) only when using `auth: "gh-cli"`
61
62
 
62
63
  ## Installation
63
64
 
@@ -86,42 +87,83 @@ pip install planpilot
86
87
  <summary>From source (Poetry)</summary>
87
88
 
88
89
  ```bash
89
- poetry add planpilot
90
+ poetry install
90
91
  ```
91
92
 
92
93
  </details>
93
94
 
94
- ## Install Agent Skill
95
-
96
- ### Agent Self-Install
95
+ ## Try it now
97
96
 
98
- Tell your agent:
97
+ See planpilot in action without any configuration or GitHub token — the built-in example runs a fully offline dry-run:
99
98
 
99
+ ```bash
100
+ git clone https://github.com/aryeko/planpilot.git && cd planpilot
101
+ pipx install . # or: pip install .
102
+ planpilot sync --config examples/sync-workflow/planpilot.json --dry-run
100
103
  ```
101
- Fetch and follow instructions from https://raw.githubusercontent.com/aryeko/planpilot/refs/heads/main/skills/INSTALL.agent.md
104
+
105
+ ```text
106
+ planpilot - sync complete (dry-run)
107
+
108
+ Plan ID: 3832d3ffce22
109
+ Target: example-org/example-repo
110
+ Board: https://github.com/orgs/example-org/projects/1
111
+
112
+ Items: 6 total (1 epic, 2 stories, 3 tasks)
113
+ Created: 6 (1 epic, 2 stories, 3 tasks)
114
+
115
+ Sync map: /absolute/path/to/examples/sync-workflow/output/sync-map-sample.json.dry-run
116
+
117
+ [dry-run] No changes were made
102
118
  ```
103
119
 
104
- The agent will install both `planpilot` and the skill automatically.
120
+ ## Install Agent Skills
105
121
 
106
- ### Manual Install
122
+ planpilot ships three agent skills that form a complete product workflow:
123
+
124
+ | Skill | Purpose |
125
+ |-------|---------|
126
+ | `create-prd` | Generate structured PRDs from feature ideas |
127
+ | `create-tech-spec` | Create codebase-aware technical specs from PRDs |
128
+ | `plan-sync` | Sync specs to GitHub Issues + Projects v2 |
129
+
130
+ ### Claude Code Plugin
107
131
 
108
- Install the skill to the open discovery path used by agent platforms that support filesystem skills:
132
+ Install the planpilot plugin directly in Claude Code (the planpilot CLI is installed automatically from PyPI):
109
133
 
110
134
  ```bash
111
- mkdir -p ~/.agents/skills/roadmap-to-github-project
135
+ claude plugin marketplace add aryeko/planpilot
136
+ claude plugin install planpilot@planpilot
137
+ ```
138
+
139
+ Then use:
140
+ - `/planpilot:prd` — create a PRD from a feature idea
141
+ - `/planpilot:spec` — create a tech spec from a PRD
142
+ - `/planpilot:sync` — generate `.plans` JSON and sync to GitHub
143
+
144
+ ### Agent Self-Install
112
145
 
113
- curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/skills/roadmap-to-github-project/SKILL.md" \
114
- -o ~/.agents/skills/roadmap-to-github-project/SKILL.md
146
+ Tell your agent:
147
+
148
+ ```text
149
+ Fetch and follow instructions from https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilot/skills/INSTALL.agent.md
115
150
  ```
116
151
 
117
- Or from a local checkout:
152
+ The agent will install `planpilot` and all three skills automatically.
153
+
154
+ ### Manual Install
155
+
156
+ Install skills to the open discovery path used by agent platforms that support filesystem skills:
118
157
 
119
158
  ```bash
120
- cp skills/roadmap-to-github-project/SKILL.md \
121
- ~/.agents/skills/roadmap-to-github-project/SKILL.md
159
+ for skill in create-prd create-tech-spec plan-sync; do
160
+ mkdir -p ~/.agents/skills/$skill
161
+ curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilot/skills/$skill/SKILL.md" \
162
+ -o ~/.agents/skills/$skill/SKILL.md
163
+ done
122
164
  ```
123
165
 
124
- Full standalone instructions: [`skills/INSTALL.md`](skills/INSTALL.md)
166
+ Full standalone instructions: [`src/planpilot/skills/INSTALL.md`](src/planpilot/skills/INSTALL.md)
125
167
 
126
168
  ## Quickstart
127
169
 
@@ -144,7 +186,7 @@ cat > planpilot.json <<'JSON'
144
186
  "stories": ".plans/stories.json",
145
187
  "tasks": ".plans/tasks.json"
146
188
  },
147
- "sync_path": ".plans/github-sync-map.json"
189
+ "sync_path": ".plans/sync-map.json"
148
190
  }
149
191
  JSON
150
192
  ```
@@ -187,6 +229,16 @@ planpilot sync --config ./planpilot.json --apply
187
229
  | `--apply` | — | Apply mode |
188
230
  | `--verbose` | off | Enable verbose logging |
189
231
 
232
+ ### `planpilot clean`
233
+
234
+ | Flag | Default | Description |
235
+ |------|---------|-------------|
236
+ | `--config` | `./planpilot.json` | Path to `planpilot.json` |
237
+ | `--dry-run` | — | Preview which issues would be deleted |
238
+ | `--apply` | — | Execute deletions |
239
+ | `--all` | off | Delete all planpilot-managed issues by label, regardless of current plan hash |
240
+ | `--verbose` | off | Enable verbose logging |
241
+
190
242
  ### `planpilot map sync`
191
243
 
192
244
  | Flag | Default | Description |
@@ -204,23 +256,39 @@ Full CLI reference: [docs/modules/cli.md](docs/modules/cli.md)
204
256
 
205
257
  ## Plan file schemas
206
258
 
207
- See [docs/schemas.md](docs/schemas.md) for plan schema examples and [docs/modules/plan.md](docs/modules/plan.md) for validation behavior.
259
+ See [docs/reference/plan-schemas.md](docs/reference/plan-schemas.md) for plan schema examples and [docs/modules/plan.md](docs/modules/plan.md) for validation behavior.
208
260
 
209
261
  A complete working example is in the [examples/](examples/) directory, including sample rendered issue bodies and a sync-map output.
210
262
 
211
263
  ## Documentation
212
264
 
213
- - [Docs Index](docs/README.md) -- v2 documentation hub
214
- - [How It Works](docs/how-it-works.md) -- end-to-end sync behavior
215
- - [E2E Testing](docs/e2e-testing.md) -- offline end-to-end test design, coverage, and usage
216
- - [Plan Schemas](docs/schemas.md) -- plan JSON shapes and examples
217
- - [Architecture](docs/design/architecture.md) -- layer rules and data flow
218
- - [Contracts](docs/design/contracts.md) -- core domain and adapter contracts
219
- - [Engine](docs/design/engine.md) -- sync pipeline behavior
220
- - [CLI](docs/modules/cli.md) -- command structure, output, and exit codes
221
- - [SDK](docs/modules/sdk.md) -- public API and composition root
222
- - [Providers](docs/modules/providers.md) -- provider model and extension guide
223
- - [Release Guide](RELEASE.md) -- automated versioning, publishing, and release pipeline
265
+ - Start here:
266
+ - [Docs Index](docs/README.md)
267
+ - [CLI Reference](docs/reference/cli-reference.md)
268
+ - [SDK Reference](docs/reference/sdk-reference.md)
269
+ - [Config Reference](docs/reference/config-reference.md)
270
+ - [Exit Codes](docs/reference/exit-codes.md)
271
+ - [Workflows Reference](docs/reference/workflows-reference.md)
272
+ - [Developer Workflow](docs/reference/developer-workflow.md)
273
+ - [Docs Inventory](docs/reference/docs-inventory.md)
274
+ - [Troubleshooting](docs/guides/troubleshooting.md)
275
+ - Architecture and behavior:
276
+ - [How It Works](docs/how-it-works.md)
277
+ - [Architecture](docs/design/architecture.md)
278
+ - [Contracts](docs/design/contracts.md)
279
+ - [Engine](docs/design/engine.md)
280
+ - [Map Sync Design](docs/design/map-sync.md)
281
+ - [Clean Workflow Design](docs/design/clean.md)
282
+ - [Code Map](docs/design/codemap.md)
283
+ - Module implementation details:
284
+ - [CLI](docs/modules/cli.md)
285
+ - [SDK](docs/modules/sdk.md)
286
+ - [Providers](docs/modules/providers.md)
287
+ - [GitHub Provider](docs/modules/github-provider.md)
288
+ - Operations:
289
+ - [E2E Testing](docs/testing/e2e.md)
290
+ - [Release Guide](RELEASE.md)
291
+ - [Changelog](CHANGELOG.md)
224
292
 
225
293
  ## Support
226
294
 
@@ -238,12 +306,13 @@ Development tasks use [poethepoet](https://github.com/nat-n/poethepoet):
238
306
  ```bash
239
307
  poe lint # ruff check
240
308
  poe format # ruff format
241
- poe test # pytest -v
309
+ poe docs-links # validate local markdown links
310
+ poe test # pytest -v --ignore=tests/e2e
242
311
  poe test-e2e # run offline E2E suite
243
312
  poe coverage # pytest + HTML coverage report
244
313
  poe coverage-e2e # E2E-only coverage XML
245
314
  poe typecheck # mypy
246
- poe check # lint + format-check + tests (all-in-one)
315
+ poe check # lint + format-check + typecheck + tests
247
316
  ```
248
317
 
249
318
  ## Contributing
@@ -1,11 +1,11 @@
1
1
  [tool.poetry]
2
2
  name = "planpilot"
3
- version = "2.2.0"
3
+ version = "2.4.0"
4
4
  description = "Sync roadmap plans (epics, stories, tasks) to GitHub Issues and Projects v2"
5
5
  readme = "README.md"
6
6
  license = "MIT"
7
- authors = ["aryeko"]
8
- maintainers = ["aryeko"]
7
+ authors = ["Arye Kogan"]
8
+ maintainers = ["Arye Kogan"]
9
9
  homepage = "https://github.com/aryeko/planpilot"
10
10
  repository = "https://github.com/aryeko/planpilot"
11
11
  documentation = "https://github.com/aryeko/planpilot/tree/main/docs"
@@ -27,7 +27,6 @@ classifiers = [
27
27
  packages = [
28
28
  {include = "planpilot", from = "src"},
29
29
  ]
30
- exclude = ["skills"]
31
30
 
32
31
  [tool.poetry.urls]
33
32
  "Bug Tracker" = "https://github.com/aryeko/planpilot/issues"
@@ -38,7 +37,7 @@ exclude = ["skills"]
38
37
  planpilot = "planpilot.cli:main"
39
38
 
40
39
  [tool.poetry.dependencies]
41
- python = ">=3.11"
40
+ python = ">=3.11,<4.0"
42
41
  pydantic = "^2.12.5"
43
42
  httpx = "^0.28"
44
43
  questionary = "^2.1"
@@ -51,7 +50,7 @@ mypy = ">=1.0"
51
50
  pytest-cov = "^7.0.0"
52
51
  pytest-asyncio = "^1.3.0"
53
52
  commitlint = ">=1.3"
54
- poethepoet = "^0.40.0"
53
+ poethepoet = ">=0.40,<0.42"
55
54
  python-semantic-release = {version = "10.5.3", python = ">=3.11,<4.0"}
56
55
  # ariadne-codegen is run via pipx (click conflict with python-semantic-release)
57
56
  # pipx run --spec "ariadne-codegen>=0.17,<0.18" ariadne-codegen
@@ -64,12 +63,14 @@ build-backend = "poetry.core.masonry.api"
64
63
  lint = "ruff check ."
65
64
  format = "ruff format ."
66
65
  format-check = "ruff format --check ."
66
+ workflow-lint = "./scripts/actionlint.sh"
67
+ docs-links = "python scripts/check_markdown_links.py"
67
68
  test = "pytest -v --ignore=tests/e2e"
68
69
  test-e2e = "pytest -v tests/e2e/test_cli_e2e.py"
69
70
  coverage = "pytest -v --cov-report=html:.coverage/html"
70
71
  coverage-e2e = "pytest -v tests/e2e/test_cli_e2e.py --cov-report=term-missing --cov-report=xml:.coverage/coverage-e2e.xml"
71
72
  typecheck = "mypy src/planpilot"
72
- check = ["lint", "format-check", "test"]
73
+ check = ["lint", "format-check", "typecheck", "test"]
73
74
 
74
75
  [tool.poe.tasks.gen-schema]
75
76
  help = "Introspect GitHub GraphQL API and download schema"
@@ -77,7 +78,7 @@ shell = "export GITHUB_TOKEN=\"bearer $(gh auth token)\" && pipx run --spec 'ari
77
78
 
78
79
  [tool.poe.tasks.gen-client]
79
80
  help = "Generate typed GraphQL client from schema and operations"
80
- shell = "rm -rf src/planpilot/providers/github/github_gql && pipx run --spec 'ariadne-codegen>=0.17,<0.18' ariadne-codegen && ruff check --fix src/planpilot/providers/github/github_gql && ruff format src/planpilot/providers/github/github_gql"
81
+ shell = "rm -rf src/planpilot/core/providers/github/github_gql && pipx run --spec 'ariadne-codegen>=0.17,<0.18' ariadne-codegen && ruff check --fix src/planpilot/core/providers/github/github_gql && ruff format src/planpilot/core/providers/github/github_gql"
81
82
 
82
83
  [tool.poe.tasks.gen-gql]
83
84
  help = "Download schema and generate GraphQL client"
@@ -98,7 +99,7 @@ source = ["planpilot"]
98
99
  branch = true
99
100
  data_file = ".coverage/coverage.db"
100
101
  omit = [
101
- "src/planpilot/providers/github/github_gql/*",
102
+ "src/planpilot/core/providers/github/github_gql/*",
102
103
  ]
103
104
 
104
105
  [tool.coverage.report]
@@ -127,7 +128,7 @@ select = [
127
128
  ]
128
129
 
129
130
  [tool.ruff.lint.per-file-ignores]
130
- "src/planpilot/providers/github/github_gql/*" = ["F401", "RUF022", "UP042", "UP045", "E501"]
131
+ "src/planpilot/core/providers/github/github_gql/*" = ["F401", "RUF022", "UP042", "UP045", "E501"]
131
132
 
132
133
  [tool.ruff.lint.isort]
133
134
  known-first-party = ["planpilot"]
@@ -138,11 +139,12 @@ warn_return_any = true
138
139
  warn_unused_configs = true
139
140
  disallow_untyped_defs = true
140
141
  plugins = ["pydantic.mypy"]
141
- exclude = "(^src/planpilot/providers/github/github_gql/)"
142
+ files = ["src/planpilot"]
143
+ exclude = "(^src/planpilot/core/providers/github/github_gql/)"
142
144
 
143
145
  [tool.semantic_release]
144
146
  version_toml = ["pyproject.toml:tool.poetry.version"]
145
- version_variables = ["src/planpilot/__init__.py:__version__"]
147
+ version_variables = ["src/planpilot/__init__.py:__version__", "src/planpilot/.claude-plugin/plugin.json:version"]
146
148
  commit_parser = "conventional"
147
149
  commit_message = "chore(release): {version}"
148
150
  tag_format = "v{version}"
@@ -163,10 +165,10 @@ mode = "update"
163
165
  type = "github"
164
166
 
165
167
  [tool.ariadne-codegen]
166
- schema_path = "src/planpilot/providers/github/schema.graphql"
167
- queries_path = "src/planpilot/providers/github/operations"
168
+ schema_path = "src/planpilot/core/providers/github/schema.graphql"
169
+ queries_path = "src/planpilot/core/providers/github/operations"
168
170
  target_package_name = "github_gql"
169
- target_package_path = "src/planpilot/providers/github"
171
+ target_package_path = "src/planpilot/core/providers/github"
170
172
  client_name = "GitHubGraphQLClient"
171
173
  client_file_name = "client"
172
174
  async_client = true
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
3
+ "name": "planpilot",
4
+ "owner": {
5
+ "name": "Arye Kogan",
6
+ "email": "aryekogan@gmail.com"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "planpilot",
11
+ "source": {
12
+ "source": "pip",
13
+ "package": "planpilot"
14
+ }
15
+ }
16
+ ]
17
+ }