planpilot 2.4.0__tar.gz → 2.5.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 (154) hide show
  1. {planpilot-2.4.0 → planpilot-2.5.0}/PKG-INFO +1 -1
  2. {planpilot-2.4.0 → planpilot-2.5.0}/pyproject.toml +1 -1
  3. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/.claude-plugin/plugin.json +3 -3
  4. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/__init__.py +1 -1
  5. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/skills/INSTALL.agent.md +62 -19
  6. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/skills/INSTALL.md +43 -25
  7. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/skills/plan-sync/SKILL.md +15 -57
  8. {planpilot-2.4.0 → planpilot-2.5.0}/LICENSE +0 -0
  9. {planpilot-2.4.0 → planpilot-2.5.0}/README.md +0 -0
  10. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/.claude-plugin/marketplace.json +0 -0
  11. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/AGENTS.md +0 -0
  12. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/__main__.py +0 -0
  13. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/__init__.py +0 -0
  14. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/__main__.py +0 -0
  15. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/app.py +0 -0
  16. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/commands/__init__.py +0 -0
  17. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/commands/clean.py +0 -0
  18. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/commands/init.py +0 -0
  19. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/commands/map_sync.py +0 -0
  20. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/commands/sync.py +0 -0
  21. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/common.py +0 -0
  22. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/init/__init__.py +0 -0
  23. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/init/validation.py +0 -0
  24. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/parser.py +0 -0
  25. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/persistence/__init__.py +0 -0
  26. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/persistence/remote_plan.py +0 -0
  27. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/persistence/sync_map.py +0 -0
  28. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/progress/__init__.py +0 -0
  29. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/progress/rich.py +0 -0
  30. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/scaffold/__init__.py +0 -0
  31. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/cli/scaffold/config_builder.py +0 -0
  32. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/commands/prd.md +0 -0
  33. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/commands/spec.md +0 -0
  34. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/commands/sync.md +0 -0
  35. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/__init__.py +0 -0
  36. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/__init__.py +0 -0
  37. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/base.py +0 -0
  38. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/factory.py +0 -0
  39. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/preflight.py +0 -0
  40. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/resolvers/__init__.py +0 -0
  41. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/resolvers/env.py +0 -0
  42. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/resolvers/gh_cli.py +0 -0
  43. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/auth/resolvers/static.py +0 -0
  44. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/clean/__init__.py +0 -0
  45. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/clean/deletion_planner.py +0 -0
  46. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/config/__init__.py +0 -0
  47. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/config/loader.py +0 -0
  48. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/config/scaffold.py +0 -0
  49. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/__init__.py +0 -0
  50. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/config.py +0 -0
  51. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/exceptions.py +0 -0
  52. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/init.py +0 -0
  53. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/item.py +0 -0
  54. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/plan.py +0 -0
  55. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/provider.py +0 -0
  56. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/renderer.py +0 -0
  57. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/contracts/sync.py +0 -0
  58. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/engine/__init__.py +0 -0
  59. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/engine/engine.py +0 -0
  60. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/engine/progress.py +0 -0
  61. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/engine/utils.py +0 -0
  62. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/init/__init__.py +0 -0
  63. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/init/validation.py +0 -0
  64. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/map_sync/__init__.py +0 -0
  65. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/map_sync/parser.py +0 -0
  66. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/map_sync/persistence.py +0 -0
  67. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/map_sync/reconciler.py +0 -0
  68. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/metadata.py +0 -0
  69. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/plan/__init__.py +0 -0
  70. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/plan/hasher.py +0 -0
  71. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/plan/loader.py +0 -0
  72. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/plan/validator.py +0 -0
  73. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/AGENTS.md +0 -0
  74. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/__init__.py +0 -0
  75. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/base.py +0 -0
  76. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/dry_run.py +0 -0
  77. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/factory.py +0 -0
  78. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/AGENTS.md +0 -0
  79. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/__init__.py +0 -0
  80. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/_retrying_transport.py +0 -0
  81. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/__init__.py +0 -0
  82. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/add_blocked_by.py +0 -0
  83. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/add_labels.py +0 -0
  84. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/add_project_item.py +0 -0
  85. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/add_sub_issue.py +0 -0
  86. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/async_base_client.py +0 -0
  87. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/base_model.py +0 -0
  88. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/client.py +0 -0
  89. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/close_issue.py +0 -0
  90. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/create_issue.py +0 -0
  91. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/create_label.py +0 -0
  92. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/delete_issue.py +0 -0
  93. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/enums.py +0 -0
  94. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/exceptions.py +0 -0
  95. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/fetch_org_project.py +0 -0
  96. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/fetch_project_fields.py +0 -0
  97. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/fetch_project_items.py +0 -0
  98. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/fetch_relations.py +0 -0
  99. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/fetch_repo.py +0 -0
  100. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/fetch_user_project.py +0 -0
  101. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/find_labels.py +0 -0
  102. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/fragments.py +0 -0
  103. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/get_issue.py +0 -0
  104. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/input_types.py +0 -0
  105. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/operations.py +0 -0
  106. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/remove_blocked_by.py +0 -0
  107. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/remove_labels.py +0 -0
  108. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/remove_sub_issue.py +0 -0
  109. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/search_issues.py +0 -0
  110. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/update_issue.py +0 -0
  111. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/github_gql/update_project_field.py +0 -0
  112. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/item.py +0 -0
  113. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/mapper.py +0 -0
  114. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/models.py +0 -0
  115. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/add_blocked_by.graphql +0 -0
  116. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/add_labels.graphql +0 -0
  117. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/add_project_item.graphql +0 -0
  118. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/add_sub_issue.graphql +0 -0
  119. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/close_issue.graphql +0 -0
  120. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/create_issue.graphql +0 -0
  121. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/create_label.graphql +0 -0
  122. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/delete_issue.graphql +0 -0
  123. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/fetch_org_project.graphql +0 -0
  124. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/fetch_project_fields.graphql +0 -0
  125. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/fetch_project_items.graphql +0 -0
  126. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/fetch_relations.graphql +0 -0
  127. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/fetch_repo.graphql +0 -0
  128. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/fetch_user_project.graphql +0 -0
  129. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/find_labels.graphql +0 -0
  130. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/fragments.graphql +0 -0
  131. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/get_issue.graphql +0 -0
  132. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/remove_blocked_by.graphql +0 -0
  133. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/remove_labels.graphql +0 -0
  134. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/remove_sub_issue.graphql +0 -0
  135. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/search_issues.graphql +0 -0
  136. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/update_issue.graphql +0 -0
  137. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/operations/update_project_field.graphql +0 -0
  138. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/ops/__init__.py +0 -0
  139. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/ops/convert.py +0 -0
  140. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/ops/crud.py +0 -0
  141. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/ops/labels.py +0 -0
  142. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/ops/project.py +0 -0
  143. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/ops/relations.py +0 -0
  144. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/provider.py +0 -0
  145. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/providers/github/schema.graphql +0 -0
  146. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/renderers/__init__.py +0 -0
  147. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/renderers/factory.py +0 -0
  148. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/renderers/markdown.py +0 -0
  149. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/targets/__init__.py +0 -0
  150. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/core/targets/github_project.py +0 -0
  151. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/py.typed +0 -0
  152. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/sdk.py +0 -0
  153. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/skills/create-prd/SKILL.md +0 -0
  154. {planpilot-2.4.0 → planpilot-2.5.0}/src/planpilot/skills/create-tech-spec/SKILL.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: planpilot
3
- Version: 2.4.0
3
+ Version: 2.5.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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "planpilot"
3
- version = "2.4.0"
3
+ version = "2.5.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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "planpilot",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "Claude Code skills and commands for planning workflows: create PRDs, tech specs, and sync plans to GitHub Issues + Projects v2",
5
5
  "author": {
6
6
  "name": "Arye Kogan",
@@ -13,6 +13,6 @@
13
13
  "keywords": ["planning", "github", "roadmap", "issues", "projects", "prd", "spec"],
14
14
  "category": "workflow",
15
15
  "tags": ["planning", "github-projects", "roadmap", "prd", "tech-spec", "skills", "commands"],
16
- "skills": ["./skills/"],
17
- "commands": ["./commands/"]
16
+ "skills": ["../skills/"],
17
+ "commands": ["../commands/"]
18
18
  }
@@ -1,6 +1,6 @@
1
1
  """Public API surface for PlanPilot."""
2
2
 
3
- __version__ = "2.4.0"
3
+ __version__ = "2.5.0"
4
4
 
5
5
  from planpilot.core.auth import (
6
6
  create_init_token_resolver,
@@ -14,13 +14,45 @@ python3 --version
14
14
 
15
15
  If `python3` is not found, try `python --version`. You need Python 3.11+.
16
16
 
17
- If Python is not installed, STOP and tell the user:
17
+ If Python is not installed or below 3.11, STOP and tell the user:
18
18
 
19
19
  > Python 3.11+ is required. Please install it from https://python.org and try again.
20
20
 
21
- ## Step 2: Ensure pipx is available
21
+ ## Step 2: Install planpilot
22
22
 
23
- Check if `pipx` is installed:
23
+ All options below put `planpilot` on PATH so it can be invoked directly.
24
+
25
+ **Option A — via `uv` (recommended):**
26
+
27
+ Check if `uv` is available:
28
+
29
+ ```bash
30
+ uv --version
31
+ ```
32
+
33
+ If not found, install it:
34
+
35
+ ```bash
36
+ curl -LsSf https://astral.sh/uv/install.sh | sh
37
+ ```
38
+
39
+ > **Note:** Piping to `sh` without checksum verification is the officially recommended method but carries inherent supply-chain risk. For a verified install, see [uv GitHub releases](https://github.com/astral-sh/uv/releases) for SHA-256 hashes.
40
+
41
+ ```bash
42
+ source "$HOME/.local/bin/env" 2>/dev/null || export PATH="$HOME/.local/bin:$PATH"
43
+ ```
44
+
45
+ Then install planpilot:
46
+
47
+ ```bash
48
+ uv tool install planpilot
49
+ ```
50
+
51
+ If this succeeds, skip to Step 3.
52
+
53
+ **Option B — via `pipx`:**
54
+
55
+ Check if `pipx` is available:
24
56
 
25
57
  ```bash
26
58
  pipx --version
@@ -44,35 +76,31 @@ If `pipx` is **not found**, install it:
44
76
  python3 -m pipx ensurepath
45
77
  ```
46
78
 
47
- After installing pipx, you may need to open a new shell or `source ~/.bashrc` / `source ~/.zshrc` for the PATH update to take effect.
48
-
49
- ## Step 3: Install planpilot
79
+ After installing pipx, you may need to open a new shell or `source ~/.bashrc` / `source ~/.zshrc` for PATH to update.
50
80
 
51
81
  ```bash
52
82
  pipx install planpilot
53
83
  ```
54
84
 
55
- If this fails, STOP and tell the user the error output.
56
-
57
- ## Step 4: Verify planpilot
85
+ If this succeeds, skip to Step 3.
58
86
 
59
- Run (try in order until one succeeds):
87
+ **Option C via `pip3` (last resort):**
60
88
 
61
89
  ```bash
62
- planpilot --version
90
+ pip3 install planpilot
63
91
  ```
64
92
 
65
- ```bash
66
- python3 -m planpilot --version
67
- ```
93
+ If this fails, STOP and tell the user the error output.
94
+
95
+ ## Step 3: Verify planpilot
68
96
 
69
97
  ```bash
70
- python -m planpilot --version
98
+ planpilot --version
71
99
  ```
72
100
 
73
- If none work, STOP and report the failure to the user.
101
+ If this fails, STOP and report the failure to the user.
74
102
 
75
- ## Step 5: Install the skills
103
+ ## Step 4: Install the skills
76
104
 
77
105
  Install `plan-sync`:
78
106
 
@@ -109,7 +137,7 @@ curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilo
109
137
 
110
138
  If `curl` is not available, try `wget` for any of the above (replace `curl -fsSL ... -o` with `wget -qO`).
111
139
 
112
- ## Step 6: Verify skill install
140
+ ## Step 5: Verify skill install
113
141
 
114
142
  Verify all three skills were installed:
115
143
 
@@ -131,7 +159,22 @@ head -5 ~/.agents/skills/create-tech-spec/SKILL.md
131
159
 
132
160
  Should contain `name: create-tech-spec`.
133
161
 
134
- If any are missing or incorrect, retry Step 5.
162
+ If any are missing or incorrect, retry Step 4.
163
+
164
+ ## Step 6: Update planpilot (if requested)
165
+
166
+ If the user asks to update planpilot:
167
+
168
+ ```bash
169
+ # If installed via uv
170
+ uv tool upgrade planpilot
171
+
172
+ # If installed via pipx
173
+ pipx upgrade planpilot
174
+
175
+ # If installed via pip3
176
+ pip3 install --upgrade planpilot
177
+ ```
135
178
 
136
179
  ## Step 7: Report to user
137
180
 
@@ -26,36 +26,41 @@ The agent will install `planpilot` and all three skills automatically.
26
26
 
27
27
  ### 1) Prerequisites
28
28
 
29
- Check Python 3 is available:
29
+ Check Python 3.11+ is available:
30
30
 
31
31
  ```bash
32
32
  python3 --version
33
33
  ```
34
34
 
35
- Optional strict check (requires Python 3.11+):
35
+ If Python is not installed or below 3.11, install it from https://python.org.
36
36
 
37
- ```bash
38
- python3 - <<'PY'
39
- import sys
40
- assert sys.version_info >= (3, 11), f"Need Python 3.11+, got {sys.version}"
41
- print("OK:", sys.version)
42
- PY
43
- ```
37
+ ### 2) Install `planpilot`
38
+
39
+ All options below put `planpilot` on your PATH so it can be invoked directly.
40
+
41
+ **Option A — via `uv` (recommended):**
44
42
 
45
- Check pip is available:
43
+ [`uv`](https://docs.astral.sh/uv/) installs tools in isolated environments with no PEP 668 issues.
44
+
45
+ If `uv` is not installed:
46
46
 
47
47
  ```bash
48
- python3 -m pip --version
48
+ curl -LsSf https://astral.sh/uv/install.sh | sh
49
49
  ```
50
50
 
51
- ### 2) Install `pipx` (if not already installed)
51
+ > **Note:** Piping to `sh` without checksum verification is the officially recommended method but carries inherent supply-chain risk. For a verified install, download the binary directly from [uv GitHub releases](https://github.com/astral-sh/uv/releases) and verify the SHA-256 hash before running.
52
52
 
53
- [`pipx`](https://pipx.pypa.io/) installs CLI tools in isolated environments -- avoids PEP 668 / "externally managed environment" errors on macOS Homebrew and system Python.
53
+ Then install planpilot:
54
54
 
55
55
  ```bash
56
- pipx --version
56
+ uv tool install planpilot
57
+ planpilot --version
57
58
  ```
58
59
 
60
+ **Option B — via `pipx`:**
61
+
62
+ [`pipx`](https://pipx.pypa.io/) installs CLI tools in isolated environments — avoids PEP 668 errors on macOS Homebrew and system Python.
63
+
59
64
  If `pipx` is not found:
60
65
 
61
66
  ```bash
@@ -70,19 +75,19 @@ pipx ensurepath
70
75
 
71
76
  You may need to restart your shell after `ensurepath`.
72
77
 
73
- ### 3) Install `planpilot`
74
-
75
78
  ```bash
76
79
  pipx install planpilot
80
+ planpilot --version
77
81
  ```
78
82
 
79
- Verify:
83
+ **Option C — via `pip3` (last resort):**
80
84
 
81
85
  ```bash
86
+ pip3 install planpilot
82
87
  planpilot --version
83
88
  ```
84
89
 
85
- ### 4) Install the skills into open skill path
90
+ ### 3) Install the skills into open skill path
86
91
 
87
92
  Create destination directories:
88
93
 
@@ -92,7 +97,7 @@ mkdir -p ~/.agents/skills/create-tech-spec
92
97
  mkdir -p ~/.agents/skills/plan-sync
93
98
  ```
94
99
 
95
- #### Option A: Copy from local repo checkout
100
+ #### Local: Copy from local repo checkout
96
101
 
97
102
  ```bash
98
103
  cp src/planpilot/skills/create-prd/SKILL.md \
@@ -105,7 +110,7 @@ cp src/planpilot/skills/plan-sync/SKILL.md \
105
110
  ~/.agents/skills/plan-sync/SKILL.md
106
111
  ```
107
112
 
108
- #### Option B: Fetch from GitHub raw URL
113
+ #### Remote: Fetch from GitHub raw URL
109
114
 
110
115
  ```bash
111
116
  curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilot/skills/create-prd/SKILL.md" \
@@ -118,9 +123,9 @@ curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilo
118
123
  -o ~/.agents/skills/plan-sync/SKILL.md
119
124
  ```
120
125
 
121
- For reproducible installs, pin to a release tag (e.g., `v2.4.0`) instead of `main` once a new release is available.
126
+ For reproducible installs, pin to a release tag (e.g., `v2.4.1`) instead of `main` once a new release is available.
122
127
 
123
- ### 5) Verify skill install
128
+ ### 4) Verify skill install
124
129
 
125
130
  ```bash
126
131
  ls -la ~/.agents/skills/create-prd
@@ -139,13 +144,26 @@ Expected frontmatter should include:
139
144
  - `name: create-tech-spec`
140
145
  - `name: plan-sync`
141
146
 
142
- ### 6) Restart your agent
147
+ ### 5) Restart your agent
143
148
 
144
149
  **Restart your agent** (start a new session) so it discovers the newly installed skill. The skill won't be available until the agent re-scans `~/.agents/skills/`.
145
150
 
146
- ### 7) Update / uninstall
151
+ ### 6) Update / uninstall
152
+
153
+ **Update `planpilot`:**
154
+
155
+ ```bash
156
+ # If installed via uv
157
+ uv tool upgrade planpilot
158
+
159
+ # If installed via pipx
160
+ pipx upgrade planpilot
161
+
162
+ # If installed via pip3
163
+ pip3 install --upgrade planpilot
164
+ ```
147
165
 
148
- Update (re-copy or re-fetch `SKILL.md` for each skill):
166
+ **Update skills** (re-copy or re-fetch `SKILL.md` for each skill):
149
167
 
150
168
  ```bash
151
169
  curl -fsSL "https://raw.githubusercontent.com/aryeko/planpilot/main/src/planpilot/skills/create-prd/SKILL.md" \
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: plan-sync
3
- description: Use when a user has PRD/spec/roadmap files and wants .plans artifacts generated and synced to GitHub Issues + a Projects v2 board in one guided flow. Standalone — planpilot installed from pip, no source tree required.
3
+ description: Use when a user has PRD/spec/roadmap files and wants .plans artifacts generated and synced to GitHub Issues + a Projects v2 board in one guided flow. Standalone — planpilot available via plugin wrapper or manual install (uv/pipx/pip3), no source tree required.
4
4
  ---
5
5
 
6
6
  # Plan Sync
@@ -17,8 +17,7 @@ Before any action, list available skills and invoke all that apply. If installed
17
17
 
18
18
  ## Prerequisites
19
19
 
20
- - Python 3.11+
21
- - `planpilot` installed: `pipx install planpilot`
20
+ - `planpilot` CLI accessible — via `uvx planpilot` (zero-install), a global install, or the Claude plugin wrapper (see [INSTALL.md](https://github.com/aryeko/planpilot/blob/main/src/planpilot/skills/INSTALL.md))
22
21
  - `gh` CLI installed and authenticated (scopes: `repo`, `project`)
23
22
 
24
23
  ## When to Use
@@ -458,56 +457,15 @@ Run preflight **before** config check — you need a working `planpilot` to run
458
457
 
459
458
  #### 5a) Verify planpilot is available
460
459
 
461
- Try the following commands **in order** until one succeeds:
460
+ Try each invocation in order until one succeeds:
462
461
 
463
- ```bash
464
- planpilot --version
465
- ```
466
-
467
- If that fails (command not found):
468
-
469
- ```bash
470
- python3 -m planpilot --version
471
- ```
472
-
473
- If that also fails:
474
-
475
- ```bash
476
- python -m planpilot --version
477
- ```
478
-
479
- **If none of the above succeed**, run diagnostics:
480
-
481
- ```bash
482
- which python3 python pipx
483
- python3 --version
484
- pipx list 2>/dev/null | grep -i planpilot
485
- ```
462
+ 1. `uvx planpilot --version` → set `PLANPILOT_CMD="uvx planpilot"`
463
+ 2. `planpilot --version` → set `PLANPILOT_CMD="planpilot"`
464
+ 3. `python3 -m planpilot --version` → set `PLANPILOT_CMD="python3 -m planpilot"`
486
465
 
487
- Report findings to the user and explain:
466
+ If all three fail, STOP and direct the user to install planpilot — see https://github.com/aryeko/planpilot/blob/main/src/planpilot/skills/INSTALL.md.
488
467
 
489
- > `planpilot` is not installed. Would you like me to install it?
490
-
491
- If the user agrees:
492
-
493
- 1. **Ensure `pipx` is available** — check `pipx --version`. If not found, install it:
494
-
495
- ```bash
496
- brew install pipx && pipx ensurepath # macOS
497
- # or: sudo apt install -y pipx && pipx ensurepath # Debian/Ubuntu
498
- ```
499
-
500
- The user may need to restart their shell after `ensurepath`.
501
-
502
- 2. **Install planpilot**:
503
-
504
- ```bash
505
- pipx install planpilot
506
- ```
507
-
508
- 3. **Re-verify** with `planpilot --version`. If still failing, check that `~/.local/bin` is on `PATH`.
509
-
510
- **Remember which invocation worked** (`planpilot`, `python3 -m planpilot`, or `python -m planpilot`) and use that form for all subsequent commands in this session.
468
+ Record which command succeeded as `PLANPILOT_CMD` use it for all subsequent planpilot invocations in this session.
511
469
 
512
470
  #### 5b) Verify GitHub auth
513
471
 
@@ -531,9 +489,11 @@ If the user agrees, run the interactive init wizard. **You MUST run this from th
531
489
  - `detect_plan_paths()` scans `.plans/` and `plans/` for existing plan files to pre-fill paths.
532
490
  - Outside a git repo, both detections are disabled and every value must be entered manually.
533
491
 
492
+ Use the invocation form that succeeded in preflight (step 5a). Examples use `planpilot` — substitute `uvx planpilot`, `python3 -m planpilot`, etc. if that's what worked.
493
+
534
494
  ```bash
535
495
  cd <repo-root>
536
- planpilot init
496
+ $PLANPILOT_CMD init
537
497
  ```
538
498
 
539
499
  The wizard asks these questions in order. Forward each to the user with the hints below:
@@ -557,25 +517,23 @@ After the wizard completes, inform the user:
557
517
  If the user prefers non-interactive setup with auto-detected defaults:
558
518
 
559
519
  ```bash
560
- planpilot init --defaults
520
+ $PLANPILOT_CMD init --defaults
561
521
  ```
562
522
 
563
523
  This generates a config with placeholder `board_url` that must be edited manually.
564
524
 
565
525
  ### 7) Sync Execution (sync / full)
566
526
 
567
- Use whichever invocation form succeeded in preflight (step 5a). Examples below use `planpilot` — substitute `python3 -m planpilot` or `python -m planpilot` if that's what worked.
568
-
569
527
  Always dry-run first:
570
528
 
571
529
  ```bash
572
- planpilot sync --config ./planpilot.json --dry-run
530
+ $PLANPILOT_CMD sync --config ./planpilot.json --dry-run
573
531
  ```
574
532
 
575
533
  Review dry-run output. If everything looks correct:
576
534
 
577
535
  ```bash
578
- planpilot sync --config ./planpilot.json --apply
536
+ $PLANPILOT_CMD sync --config ./planpilot.json --apply
579
537
  ```
580
538
 
581
539
  ### 8) Post-Sync Verification (sync / full)
@@ -606,7 +564,7 @@ Report to user:
606
564
  - Creating stories that are too large (not PR-sized) or tasks that span multiple days
607
565
  - Omitting `goal`, `requirements`, or `acceptance_criteria` (required by validator)
608
566
  - Forgetting to set `parent_id` on stories and tasks
609
- - Assuming `planpilot` command exists without checking — always verify availability first and fall back to `python3 -m planpilot`
567
+ - Assuming `planpilot` is available without checking — always run preflight (step 5a) first
610
568
  - Running `planpilot init` outside the git repo root — auto-detection of target and plan paths will fail
611
569
  - Not committing `planpilot.json` to git — config must be tracked for reproducible syncs
612
570
  - Writing `planpilot.json` by hand with invalid field combinations (e.g. both `unified` and `epics` in `plan_paths`)
File without changes
File without changes