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.
- {planpilot-2.2.0 → planpilot-2.4.0}/PKG-INFO +117 -48
- {planpilot-2.2.0 → planpilot-2.4.0}/README.md +113 -44
- {planpilot-2.2.0 → planpilot-2.4.0}/pyproject.toml +17 -15
- planpilot-2.4.0/src/planpilot/.claude-plugin/marketplace.json +17 -0
- planpilot-2.4.0/src/planpilot/.claude-plugin/plugin.json +18 -0
- planpilot-2.4.0/src/planpilot/AGENTS.md +35 -0
- planpilot-2.4.0/src/planpilot/__init__.py +80 -0
- planpilot-2.4.0/src/planpilot/cli/__init__.py +109 -0
- planpilot-2.4.0/src/planpilot/cli/__main__.py +6 -0
- planpilot-2.4.0/src/planpilot/cli/app.py +63 -0
- planpilot-2.4.0/src/planpilot/cli/commands/__init__.py +1 -0
- planpilot-2.4.0/src/planpilot/cli/commands/clean.py +49 -0
- planpilot-2.4.0/src/planpilot/cli/commands/init.py +270 -0
- planpilot-2.4.0/src/planpilot/cli/commands/map_sync.py +101 -0
- planpilot-2.4.0/src/planpilot/cli/commands/sync.py +99 -0
- planpilot-2.4.0/src/planpilot/cli/common.py +20 -0
- planpilot-2.4.0/src/planpilot/cli/init/__init__.py +5 -0
- planpilot-2.4.0/src/planpilot/cli/init/validation.py +12 -0
- planpilot-2.4.0/src/planpilot/cli/parser.py +69 -0
- planpilot-2.4.0/src/planpilot/cli/persistence/__init__.py +12 -0
- planpilot-2.4.0/src/planpilot/cli/persistence/remote_plan.py +71 -0
- planpilot-2.4.0/src/planpilot/cli/persistence/sync_map.py +39 -0
- planpilot-2.4.0/src/planpilot/cli/progress/__init__.py +5 -0
- planpilot-2.2.0/src/planpilot/progress.py → planpilot-2.4.0/src/planpilot/cli/progress/rich.py +1 -8
- planpilot-2.4.0/src/planpilot/cli/scaffold/__init__.py +17 -0
- planpilot-2.4.0/src/planpilot/cli/scaffold/config_builder.py +17 -0
- planpilot-2.4.0/src/planpilot/commands/prd.md +6 -0
- planpilot-2.4.0/src/planpilot/commands/spec.md +6 -0
- planpilot-2.4.0/src/planpilot/commands/sync.md +6 -0
- planpilot-2.4.0/src/planpilot/core/__init__.py +1 -0
- planpilot-2.4.0/src/planpilot/core/auth/__init__.py +21 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/factory.py +6 -6
- planpilot-2.4.0/src/planpilot/core/auth/preflight.py +168 -0
- planpilot-2.4.0/src/planpilot/core/auth/resolvers/__init__.py +7 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/env.py +2 -2
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/gh_cli.py +2 -2
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/static.py +2 -2
- planpilot-2.4.0/src/planpilot/core/clean/__init__.py +5 -0
- planpilot-2.4.0/src/planpilot/core/clean/deletion_planner.py +100 -0
- planpilot-2.4.0/src/planpilot/core/config/__init__.py +19 -0
- planpilot-2.4.0/src/planpilot/core/config/loader.py +67 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core/config}/scaffold.py +17 -39
- planpilot-2.4.0/src/planpilot/core/contracts/__init__.py +29 -0
- planpilot-2.4.0/src/planpilot/core/contracts/init.py +16 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/item.py +5 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/provider.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/renderer.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/sync.py +9 -2
- planpilot-2.4.0/src/planpilot/core/engine/__init__.py +6 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/engine.py +113 -35
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/utils.py +3 -25
- planpilot-2.4.0/src/planpilot/core/init/__init__.py +5 -0
- planpilot-2.4.0/src/planpilot/core/init/validation.py +17 -0
- planpilot-2.4.0/src/planpilot/core/map_sync/__init__.py +7 -0
- planpilot-2.4.0/src/planpilot/core/map_sync/parser.py +79 -0
- planpilot-2.4.0/src/planpilot/core/map_sync/persistence.py +25 -0
- planpilot-2.4.0/src/planpilot/core/map_sync/reconciler.py +41 -0
- planpilot-2.4.0/src/planpilot/core/metadata.py +30 -0
- planpilot-2.4.0/src/planpilot/core/plan/__init__.py +7 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/hasher.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/loader.py +3 -3
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/validator.py +2 -2
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/AGENTS.md +5 -5
- planpilot-2.4.0/src/planpilot/core/providers/__init__.py +7 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/dry_run.py +12 -4
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/factory.py +4 -4
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/AGENTS.md +7 -7
- planpilot-2.4.0/src/planpilot/core/providers/github/__init__.py +5 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/_retrying_transport.py +2 -2
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/__init__.py +22 -17
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_blocked_by.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_labels.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_project_item.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_sub_issue.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/client.py +13 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/close_issue.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/create_issue.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/create_label.py +1 -1
- planpilot-2.4.0/src/planpilot/core/providers/github/github_gql/delete_issue.py +19 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/enums.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/exceptions.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_org_project.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_project_fields.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_project_items.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_relations.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_repo.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_user_project.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/find_labels.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fragments.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/get_issue.py +1 -1
- planpilot-2.4.0/src/planpilot/core/providers/github/github_gql/input_types.py +9 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/operations.py +10 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_blocked_by.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_labels.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_sub_issue.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/search_issues.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/update_issue.py +1 -1
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/update_project_field.py +1 -1
- planpilot-2.4.0/src/planpilot/core/providers/github/item.py +101 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/mapper.py +4 -14
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/models.py +1 -1
- planpilot-2.4.0/src/planpilot/core/providers/github/operations/delete_issue.graphql +5 -0
- planpilot-2.4.0/src/planpilot/core/providers/github/ops/__init__.py +1 -0
- planpilot-2.4.0/src/planpilot/core/providers/github/ops/convert.py +41 -0
- planpilot-2.4.0/src/planpilot/core/providers/github/ops/crud.py +121 -0
- planpilot-2.4.0/src/planpilot/core/providers/github/ops/labels.py +71 -0
- planpilot-2.4.0/src/planpilot/core/providers/github/ops/project.py +129 -0
- planpilot-2.4.0/src/planpilot/core/providers/github/ops/relations.py +22 -0
- planpilot-2.4.0/src/planpilot/core/providers/github/provider.py +469 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/schema.graphql +1 -1
- planpilot-2.4.0/src/planpilot/core/renderers/__init__.py +6 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/renderers/factory.py +2 -2
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/renderers/markdown.py +4 -2
- planpilot-2.4.0/src/planpilot/core/targets/__init__.py +5 -0
- planpilot-2.4.0/src/planpilot/core/targets/github_project.py +21 -0
- planpilot-2.4.0/src/planpilot/sdk.py +388 -0
- planpilot-2.4.0/src/planpilot/skills/INSTALL.agent.md +155 -0
- planpilot-2.4.0/src/planpilot/skills/INSTALL.md +169 -0
- planpilot-2.4.0/src/planpilot/skills/create-prd/SKILL.md +208 -0
- planpilot-2.4.0/src/planpilot/skills/create-tech-spec/SKILL.md +352 -0
- planpilot-2.4.0/src/planpilot/skills/plan-sync/SKILL.md +623 -0
- planpilot-2.2.0/src/planpilot/AGENTS.md +0 -40
- planpilot-2.2.0/src/planpilot/__init__.py +0 -58
- planpilot-2.2.0/src/planpilot/auth/__init__.py +0 -6
- planpilot-2.2.0/src/planpilot/auth/resolvers/__init__.py +0 -7
- planpilot-2.2.0/src/planpilot/cli.py +0 -639
- planpilot-2.2.0/src/planpilot/contracts/__init__.py +0 -54
- planpilot-2.2.0/src/planpilot/engine/__init__.py +0 -6
- planpilot-2.2.0/src/planpilot/plan/__init__.py +0 -7
- planpilot-2.2.0/src/planpilot/providers/__init__.py +0 -7
- planpilot-2.2.0/src/planpilot/providers/github/__init__.py +0 -5
- planpilot-2.2.0/src/planpilot/providers/github/github_gql/input_types.py +0 -4
- planpilot-2.2.0/src/planpilot/providers/github/item.py +0 -67
- planpilot-2.2.0/src/planpilot/providers/github/provider.py +0 -578
- planpilot-2.2.0/src/planpilot/renderers/__init__.py +0 -6
- planpilot-2.2.0/src/planpilot/sdk.py +0 -404
- {planpilot-2.2.0 → planpilot-2.4.0}/LICENSE +0 -0
- {planpilot-2.2.0 → planpilot-2.4.0}/src/planpilot/__main__.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/base.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/config.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/exceptions.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/plan.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/progress.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/base.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/async_base_client.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/base_model.py +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_blocked_by.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_labels.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_project_item.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_sub_issue.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/close_issue.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/create_issue.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/create_label.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_org_project.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_project_fields.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_project_items.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_relations.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_repo.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_user_project.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/find_labels.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fragments.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/get_issue.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_blocked_by.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_labels.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_sub_issue.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/search_issues.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/update_issue.graphql +0 -0
- {planpilot-2.2.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/update_project_field.graphql +0 -0
- {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.
|
|
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:
|
|
9
|
-
Maintainer:
|
|
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
|
[](https://github.com/aryeko/planpilot/actions/workflows/ci.yml)
|
|
38
|
-
[](https://codecov.io/gh/aryeko/planpilot)
|
|
39
39
|
[](https://pypi.org/project/planpilot/)
|
|
40
40
|
[](https://pypi.org/project/planpilot/)
|
|
41
41
|
[](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
|
-
├──
|
|
76
|
-
├──
|
|
77
|
-
├──
|
|
78
|
-
|
|
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
|
|
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
|
-
-
|
|
94
|
-
-
|
|
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
|
|
124
|
+
poetry install
|
|
124
125
|
```
|
|
125
126
|
|
|
126
127
|
</details>
|
|
127
128
|
|
|
128
|
-
##
|
|
129
|
-
|
|
130
|
-
### Agent Self-Install
|
|
129
|
+
## Try it now
|
|
131
130
|
|
|
132
|
-
|
|
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
|
-
|
|
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
|
-
|
|
154
|
+
## Install Agent Skills
|
|
139
155
|
|
|
140
|
-
|
|
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
|
|
166
|
+
Install the planpilot plugin directly in Claude Code (the planpilot CLI is installed automatically from PyPI):
|
|
143
167
|
|
|
144
168
|
```bash
|
|
145
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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
|
-
|
|
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
|
-
|
|
155
|
-
~/.agents/skills
|
|
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/
|
|
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
|
-
-
|
|
248
|
-
- [
|
|
249
|
-
- [
|
|
250
|
-
- [
|
|
251
|
-
- [
|
|
252
|
-
- [
|
|
253
|
-
- [
|
|
254
|
-
- [
|
|
255
|
-
- [
|
|
256
|
-
- [
|
|
257
|
-
-
|
|
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
|
|
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
|
|
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
|
[](https://github.com/aryeko/planpilot/actions/workflows/ci.yml)
|
|
4
|
-
[](https://codecov.io/gh/aryeko/planpilot)
|
|
5
5
|
[](https://pypi.org/project/planpilot/)
|
|
6
6
|
[](https://pypi.org/project/planpilot/)
|
|
7
7
|
[](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
|
-
├──
|
|
42
|
-
├──
|
|
43
|
-
├──
|
|
44
|
-
|
|
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
|
|
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
|
-
-
|
|
60
|
-
-
|
|
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
|
|
90
|
+
poetry install
|
|
90
91
|
```
|
|
91
92
|
|
|
92
93
|
</details>
|
|
93
94
|
|
|
94
|
-
##
|
|
95
|
-
|
|
96
|
-
### Agent Self-Install
|
|
95
|
+
## Try it now
|
|
97
96
|
|
|
98
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
+
## Install Agent Skills
|
|
105
121
|
|
|
106
|
-
|
|
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
|
|
132
|
+
Install the planpilot plugin directly in Claude Code (the planpilot CLI is installed automatically from PyPI):
|
|
109
133
|
|
|
110
134
|
```bash
|
|
111
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
~/.agents/skills
|
|
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/
|
|
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
|
-
-
|
|
214
|
-
- [
|
|
215
|
-
- [
|
|
216
|
-
- [
|
|
217
|
-
- [
|
|
218
|
-
- [
|
|
219
|
-
- [
|
|
220
|
-
- [
|
|
221
|
-
- [
|
|
222
|
-
- [
|
|
223
|
-
-
|
|
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
|
|
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
|
|
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.
|
|
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 = ["
|
|
8
|
-
maintainers = ["
|
|
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 = "
|
|
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
|
-
|
|
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
|
+
}
|