planpilot 2.3.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.3.0 → planpilot-2.4.0}/PKG-INFO +107 -48
- {planpilot-2.3.0 → planpilot-2.4.0}/README.md +103 -44
- {planpilot-2.3.0 → planpilot-2.4.0}/pyproject.toml +16 -14
- 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.3.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.3.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.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/env.py +2 -2
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/resolvers/gh_cli.py +2 -2
- {planpilot-2.3.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.3.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.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/item.py +5 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/provider.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/renderer.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/sync.py +3 -2
- planpilot-2.4.0/src/planpilot/core/engine/__init__.py +6 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/engine.py +52 -27
- {planpilot-2.3.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.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/hasher.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/loader.py +3 -3
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/plan/validator.py +2 -2
- {planpilot-2.3.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.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/dry_run.py +12 -4
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/factory.py +4 -4
- {planpilot-2.3.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.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/_retrying_transport.py +2 -2
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_blocked_by.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_labels.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_project_item.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/add_sub_issue.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/client.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/close_issue.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/create_issue.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/create_label.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/delete_issue.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/enums.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_org_project.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_project_fields.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_project_items.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_relations.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_repo.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fetch_user_project.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/find_labels.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/fragments.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/get_issue.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/input_types.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/operations.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_blocked_by.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_labels.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/remove_sub_issue.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/search_issues.py +1 -1
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/update_issue.py +1 -1
- {planpilot-2.3.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.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/mapper.py +4 -14
- {planpilot-2.3.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/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.3.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.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/renderers/factory.py +2 -2
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/renderers/markdown.py +2 -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.3.0/src/planpilot/AGENTS.md +0 -40
- planpilot-2.3.0/src/planpilot/__init__.py +0 -59
- planpilot-2.3.0/src/planpilot/auth/__init__.py +0 -6
- planpilot-2.3.0/src/planpilot/auth/resolvers/__init__.py +0 -7
- planpilot-2.3.0/src/planpilot/cli.py +0 -764
- planpilot-2.3.0/src/planpilot/contracts/__init__.py +0 -54
- planpilot-2.3.0/src/planpilot/engine/__init__.py +0 -6
- planpilot-2.3.0/src/planpilot/plan/__init__.py +0 -7
- planpilot-2.3.0/src/planpilot/providers/__init__.py +0 -7
- planpilot-2.3.0/src/planpilot/providers/github/__init__.py +0 -5
- planpilot-2.3.0/src/planpilot/providers/github/item.py +0 -79
- planpilot-2.3.0/src/planpilot/providers/github/provider.py +0 -606
- planpilot-2.3.0/src/planpilot/renderers/__init__.py +0 -6
- planpilot-2.3.0/src/planpilot/sdk.py +0 -630
- {planpilot-2.3.0 → planpilot-2.4.0}/LICENSE +0 -0
- {planpilot-2.3.0 → planpilot-2.4.0}/src/planpilot/__main__.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/auth/base.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/config.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/exceptions.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/contracts/plan.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/engine/progress.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/base.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/__init__.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/async_base_client.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/base_model.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/github_gql/exceptions.py +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_blocked_by.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_labels.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_project_item.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/add_sub_issue.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/close_issue.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/create_issue.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/create_label.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/delete_issue.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_org_project.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_project_fields.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_project_items.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_relations.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_repo.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fetch_user_project.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/find_labels.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/fragments.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/get_issue.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_blocked_by.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_labels.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/remove_sub_issue.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/search_issues.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/update_issue.graphql +0 -0
- {planpilot-2.3.0/src/planpilot → planpilot-2.4.0/src/planpilot/core}/providers/github/operations/update_project_field.graphql +0 -0
- {planpilot-2.3.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
|
+
## Try it now
|
|
129
130
|
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
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 |
|
|
141
163
|
|
|
142
|
-
|
|
164
|
+
### Claude Code Plugin
|
|
165
|
+
|
|
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
|
```
|
|
@@ -248,23 +290,39 @@ Full CLI reference: [docs/modules/cli.md](docs/modules/cli.md)
|
|
|
248
290
|
|
|
249
291
|
## Plan file schemas
|
|
250
292
|
|
|
251
|
-
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.
|
|
252
294
|
|
|
253
295
|
A complete working example is in the [examples/](examples/) directory, including sample rendered issue bodies and a sync-map output.
|
|
254
296
|
|
|
255
297
|
## Documentation
|
|
256
298
|
|
|
257
|
-
-
|
|
258
|
-
- [
|
|
259
|
-
- [
|
|
260
|
-
- [
|
|
261
|
-
- [
|
|
262
|
-
- [
|
|
263
|
-
- [
|
|
264
|
-
- [
|
|
265
|
-
- [
|
|
266
|
-
- [
|
|
267
|
-
-
|
|
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)
|
|
268
326
|
|
|
269
327
|
## Support
|
|
270
328
|
|
|
@@ -282,12 +340,13 @@ Development tasks use [poethepoet](https://github.com/nat-n/poethepoet):
|
|
|
282
340
|
```bash
|
|
283
341
|
poe lint # ruff check
|
|
284
342
|
poe format # ruff format
|
|
285
|
-
poe
|
|
343
|
+
poe docs-links # validate local markdown links
|
|
344
|
+
poe test # pytest -v --ignore=tests/e2e
|
|
286
345
|
poe test-e2e # run offline E2E suite
|
|
287
346
|
poe coverage # pytest + HTML coverage report
|
|
288
347
|
poe coverage-e2e # E2E-only coverage XML
|
|
289
348
|
poe typecheck # mypy
|
|
290
|
-
poe check # lint + format-check + tests
|
|
349
|
+
poe check # lint + format-check + typecheck + tests
|
|
291
350
|
```
|
|
292
351
|
|
|
293
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
|
+
## Try it now
|
|
95
96
|
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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 |
|
|
107
129
|
|
|
108
|
-
|
|
130
|
+
### Claude Code Plugin
|
|
131
|
+
|
|
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
|
```
|
|
@@ -214,23 +256,39 @@ Full CLI reference: [docs/modules/cli.md](docs/modules/cli.md)
|
|
|
214
256
|
|
|
215
257
|
## Plan file schemas
|
|
216
258
|
|
|
217
|
-
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.
|
|
218
260
|
|
|
219
261
|
A complete working example is in the [examples/](examples/) directory, including sample rendered issue bodies and a sync-map output.
|
|
220
262
|
|
|
221
263
|
## Documentation
|
|
222
264
|
|
|
223
|
-
-
|
|
224
|
-
- [
|
|
225
|
-
- [
|
|
226
|
-
- [
|
|
227
|
-
- [
|
|
228
|
-
- [
|
|
229
|
-
- [
|
|
230
|
-
- [
|
|
231
|
-
- [
|
|
232
|
-
- [
|
|
233
|
-
-
|
|
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)
|
|
234
292
|
|
|
235
293
|
## Support
|
|
236
294
|
|
|
@@ -248,12 +306,13 @@ Development tasks use [poethepoet](https://github.com/nat-n/poethepoet):
|
|
|
248
306
|
```bash
|
|
249
307
|
poe lint # ruff check
|
|
250
308
|
poe format # ruff format
|
|
251
|
-
poe
|
|
309
|
+
poe docs-links # validate local markdown links
|
|
310
|
+
poe test # pytest -v --ignore=tests/e2e
|
|
252
311
|
poe test-e2e # run offline E2E suite
|
|
253
312
|
poe coverage # pytest + HTML coverage report
|
|
254
313
|
poe coverage-e2e # E2E-only coverage XML
|
|
255
314
|
poe typecheck # mypy
|
|
256
|
-
poe check # lint + format-check + tests
|
|
315
|
+
poe check # lint + format-check + typecheck + tests
|
|
257
316
|
```
|
|
258
317
|
|
|
259
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,6 +63,8 @@ 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"
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "planpilot",
|
|
3
|
+
"version": "2.4.0",
|
|
4
|
+
"description": "Claude Code skills and commands for planning workflows: create PRDs, tech specs, and sync plans to GitHub Issues + Projects v2",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Arye Kogan",
|
|
7
|
+
"email": "aryekogan@gmail.com",
|
|
8
|
+
"url": "https://github.com/aryeko/planpilot"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/aryeko/planpilot",
|
|
11
|
+
"repository": "https://github.com/aryeko/planpilot",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"keywords": ["planning", "github", "roadmap", "issues", "projects", "prd", "spec"],
|
|
14
|
+
"category": "workflow",
|
|
15
|
+
"tags": ["planning", "github-projects", "roadmap", "prd", "tech-spec", "skills", "commands"],
|
|
16
|
+
"skills": ["./skills/"],
|
|
17
|
+
"commands": ["./commands/"]
|
|
18
|
+
}
|