project-kit-cli 0.5.1__tar.gz → 0.5.2__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 (84) hide show
  1. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/PKG-INFO +7 -1
  2. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/README.md +6 -0
  3. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/pyproject.toml +1 -1
  4. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/pyproject.toml.orig +1 -1
  5. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/context_files.py +3 -0
  6. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/doctor.py +56 -0
  7. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/LICENSE +0 -0
  8. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/__init__.py +0 -0
  9. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/__main__.py +0 -0
  10. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/agents.py +0 -0
  11. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/ai_attribution.py +0 -0
  12. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/approval.py +0 -0
  13. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/docs/agents.md +0 -0
  14. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/docs/backlog-schema.md +0 -0
  15. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/docs/handoff.md +0 -0
  16. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/docs/provisioning.md +0 -0
  17. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/docs/skills.md +0 -0
  18. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/docs/statusline.md +0 -0
  19. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/docs/upgrade.md +0 -0
  20. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/hooks/commit-msg +0 -0
  21. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/project/skills-catalog.yml +0 -0
  22. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/project/workflow.yml +0 -0
  23. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-amend/SKILL.md +0 -0
  24. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-decide/SKILL.md +0 -0
  25. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-discover/SKILL.md +0 -0
  26. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-foundations/SKILL.md +0 -0
  27. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-grill/SKILL.md +0 -0
  28. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-handoff/SKILL.md +0 -0
  29. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-import/SKILL.md +0 -0
  30. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-next/SKILL.md +0 -0
  31. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-plan/SKILL.md +0 -0
  32. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-provision/SKILL.md +0 -0
  33. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-skills/SKILL.md +0 -0
  34. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-start/SKILL.md +0 -0
  35. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-verify/SKILL.md +0 -0
  36. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/skills/pk-workflow/SKILL.md +0 -0
  37. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/subagents/pk-reviewer.md +0 -0
  38. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/adr.md +0 -0
  39. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/backlog.example.json +0 -0
  40. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/brief.md +0 -0
  41. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/constitution-input.md +0 -0
  42. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/development-workflow.md +0 -0
  43. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/adr.yml +0 -0
  44. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/bug.yml +0 -0
  45. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/config.yml +0 -0
  46. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/epic.yml +0 -0
  47. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/feature.yml +0 -0
  48. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/github/pull_request_template.md +0 -0
  49. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/gitlab/issue_templates/adr.md +0 -0
  50. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/gitlab/issue_templates/bug.md +0 -0
  51. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/gitlab/issue_templates/epic.md +0 -0
  52. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/gitlab/issue_templates/feature.md +0 -0
  53. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/gitlab/merge_request_templates/Default.md +0 -0
  54. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/assets/templates/interview.md +0 -0
  55. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/backlog.py +0 -0
  56. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/claude_hooks.py +0 -0
  57. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/cli.py +0 -0
  58. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/config.py +0 -0
  59. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/entry.py +0 -0
  60. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/fsutil.py +0 -0
  61. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/gh.py +0 -0
  62. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/glab.py +0 -0
  63. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/handoff.py +0 -0
  64. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/help.py +0 -0
  65. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/installer.py +0 -0
  66. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/labels.py +0 -0
  67. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/manifest.py +0 -0
  68. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/next_step.py +0 -0
  69. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/project_choice.py +0 -0
  70. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/providers/__init__.py +0 -0
  71. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/providers/github.py +0 -0
  72. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/providers/gitlab.py +0 -0
  73. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/provision.py +0 -0
  74. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/provision_gitlab.py +0 -0
  75. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/provision_issues.py +0 -0
  76. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/skills.py +0 -0
  77. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/sources.py +0 -0
  78. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/state.py +0 -0
  79. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/statusline.py +0 -0
  80. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/templating.py +0 -0
  81. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/trace.py +0 -0
  82. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/upgrade.py +0 -0
  83. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/userdocs.py +0 -0
  84. {project_kit_cli-0.5.1 → project_kit_cli-0.5.2}/src/project_kit/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: project-kit-cli
3
- Version: 0.5.1
3
+ Version: 0.5.2
4
4
  Summary: Project definition and dev-workflow kit that hands off to Spec Kit
5
5
  Keywords: project-management,spec-kit,claude-code,workflow,github
6
6
  Author: Miguel Tomás
@@ -64,6 +64,12 @@ uv tool upgrade project-kit-cli # later, to update the program
64
64
  The package is called `project-kit-cli`; the command is `pjkit`. To try it without
65
65
  installing: `uvx --from project-kit-cli pjkit help`.
66
66
 
67
+ **`pjkit` not found, or `No pyvenv.cfg file`.** The skills and hooks call `pjkit` by name, so it
68
+ must be on the PATH of the terminal that starts your agent. Install it with `uv tool install`
69
+ (not inside a project's virtual environment) and run `uv tool update-shell` once. That error means
70
+ a `python` or `pjkit` on the PATH belongs to a virtual environment that was deleted or is being
71
+ rebuilt: recreate it, deactivate it, or take it off the PATH. `pjkit doctor` points at the cause.
72
+
67
73
  **Updating a project.** `init` copies the skills and templates into your repository and never
68
74
  overwrites them, so a new version of the program does not change a project that already exists.
69
75
  Run `pjkit upgrade` inside it to see what is out of date, and `pjkit upgrade --apply`
@@ -46,6 +46,12 @@ uv tool upgrade project-kit-cli # later, to update the program
46
46
  The package is called `project-kit-cli`; the command is `pjkit`. To try it without
47
47
  installing: `uvx --from project-kit-cli pjkit help`.
48
48
 
49
+ **`pjkit` not found, or `No pyvenv.cfg file`.** The skills and hooks call `pjkit` by name, so it
50
+ must be on the PATH of the terminal that starts your agent. Install it with `uv tool install`
51
+ (not inside a project's virtual environment) and run `uv tool update-shell` once. That error means
52
+ a `python` or `pjkit` on the PATH belongs to a virtual environment that was deleted or is being
53
+ rebuilt: recreate it, deactivate it, or take it off the PATH. `pjkit doctor` points at the cause.
54
+
49
55
  **Updating a project.** `init` copies the skills and templates into your repository and never
50
56
  overwrites them, so a new version of the program does not change a project that already exists.
51
57
  Run `pjkit upgrade` inside it to see what is out of date, and `pjkit upgrade --apply`
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "0.5.1"
3
+ version = "0.5.2"
4
4
  description = "Project definition and dev-workflow kit that hands off to Spec Kit"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "0.5.1"
3
+ version = "0.5.2"
4
4
  description = "Project definition and dev-workflow kit that hands off to Spec Kit"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -95,6 +95,9 @@ def render_block(root: Path, config: Config) -> str:
95
95
  "- The user does not need to know the skills. Pick the one that fits what they ask, "
96
96
  "using the table below; when unsure, use `pk-next`. Only the user approves a phase: "
97
97
  "never run `pjkit approve` on your own.",
98
+ "- If `pjkit` does not start (not found, or an error such as `No pyvenv.cfg file`), stop: "
99
+ "do not work around it with `python` or by editing `.project-kit/` by hand. Tell the "
100
+ "user to run `pjkit doctor` and, if that fails too, `uv tool install project-kit-cli`.",
98
101
  ]
99
102
  lines += ["", "### Which skill for what", "", "| The user wants | Skill |", "|---|---|"]
100
103
  lines += [f"| {want} | {skill} |" for want, skill in ROUTING]
@@ -3,6 +3,7 @@
3
3
  import re
4
4
  import shutil
5
5
  import subprocess
6
+ import sys
6
7
  from collections.abc import Callable
7
8
  from dataclasses import dataclass
8
9
  from enum import Enum
@@ -153,6 +154,59 @@ def check_glab(glab: Glab) -> list[Check]:
153
154
  return checks
154
155
 
155
156
 
157
+ def check_pjkit(which: Which, running: str | None = None) -> Check:
158
+ """Skills, hooks and the status bar call ``pjkit`` by name: it has to be on PATH."""
159
+ found = which("pjkit")
160
+ if not found:
161
+ return Check(
162
+ "pjkit",
163
+ Status.WARN,
164
+ "not on PATH",
165
+ "Skills and hooks run `pjkit` by name. Install it with `uv tool install "
166
+ "project-kit-cli` and run `uv tool update-shell`, or start the agent from a "
167
+ "terminal where its environment is active.",
168
+ )
169
+ current = running if running is not None else sys.argv[0]
170
+ if Path(current).stem.lower() == "pjkit" and not _same_file(found, current):
171
+ return Check(
172
+ "pjkit",
173
+ Status.WARN,
174
+ f"PATH runs {found}, not {current}",
175
+ "Skills and hooks will use the one on PATH. Remove one of them or fix PATH.",
176
+ )
177
+ return Check("pjkit", Status.OK, found)
178
+
179
+
180
+ def _same_file(a: str, b: str) -> bool:
181
+ try:
182
+ first, second = Path(a).resolve(), Path(b).resolve() # argv[0] may lack ".exe"
183
+ return first.parent == second.parent and first.stem.lower() == second.stem.lower()
184
+ except OSError:
185
+ return False
186
+
187
+
188
+ def check_python_env(which: Which) -> Check | None:
189
+ """A ``python`` on PATH inside a virtual environment that lost its ``pyvenv.cfg``.
190
+
191
+ Python then stops with ``No pyvenv.cfg file``, and so does every ``pjkit`` that depends on it.
192
+ """
193
+ found = which("python")
194
+ if not found:
195
+ return None
196
+ folder = Path(found).parent
197
+ env = folder.parent
198
+ if folder.name.lower() not in ("scripts", "bin") or (env / "pyvenv.cfg").exists():
199
+ return None
200
+ if not any((folder / a).exists() for a in ("activate", "activate.bat")):
201
+ return None
202
+ return Check(
203
+ "python",
204
+ Status.WARN,
205
+ f"{found} belongs to a broken virtual environment (no pyvenv.cfg)",
206
+ f"Recreate it (`uv sync` in its project), deactivate it, or remove {env} from PATH.",
207
+ )
208
+
209
+
156
210
  def check_uv(which: Which, runner: Runner) -> Check:
157
211
  if not which("uv"):
158
212
  return Check(
@@ -245,6 +299,8 @@ def run_checks(
245
299
  return [
246
300
  check_git(which, runner),
247
301
  *host_checks,
302
+ check_pjkit(which),
303
+ *filter(None, [check_python_env(which)]),
248
304
  check_uv(which, runner),
249
305
  check_speckit(which, runner, here),
250
306
  *check_agents(which, here),
File without changes