project-kit-cli 0.5.2__tar.gz → 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. project_kit_cli-0.6.0/PKG-INFO +156 -0
  2. project_kit_cli-0.6.0/README.md +137 -0
  3. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/pyproject.toml +2 -1
  4. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/pyproject.toml.orig +2 -1
  5. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/agents.py +23 -0
  6. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/ai_attribution.py +24 -0
  7. project_kit_cli-0.6.0/src/project_kit/analyzers.py +417 -0
  8. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/approval.py +57 -12
  9. project_kit_cli-0.6.0/src/project_kit/assets/docs/agents.md +62 -0
  10. project_kit_cli-0.6.0/src/project_kit/assets/docs/example.md +363 -0
  11. project_kit_cli-0.6.0/src/project_kit/assets/docs/flow.md +143 -0
  12. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/docs/provisioning.md +19 -2
  13. project_kit_cli-0.6.0/src/project_kit/assets/docs/quickstart.md +116 -0
  14. project_kit_cli-0.6.0/src/project_kit/assets/docs/quiet.md +139 -0
  15. project_kit_cli-0.6.0/src/project_kit/assets/docs/session.md +461 -0
  16. project_kit_cli-0.6.0/src/project_kit/assets/docs/statusline.md +97 -0
  17. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/docs/upgrade.md +34 -0
  18. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-decide/SKILL.md +5 -2
  19. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-discover/SKILL.md +6 -2
  20. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-foundations/SKILL.md +2 -1
  21. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-import/SKILL.md +2 -1
  22. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-plan/SKILL.md +2 -1
  23. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-provision/SKILL.md +5 -3
  24. project_kit_cli-0.6.0/src/project_kit/assets/skills/pk-quiet/SKILL.md +76 -0
  25. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-workflow/SKILL.md +1 -1
  26. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/interview.md +16 -3
  27. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/backlog.py +5 -7
  28. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/cli.py +291 -6
  29. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/config.py +18 -0
  30. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/context_files.py +19 -0
  31. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/handoff.py +25 -5
  32. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/help.py +6 -0
  33. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/installer.py +5 -0
  34. project_kit_cli-0.6.0/src/project_kit/logview.py +239 -0
  35. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/manifest.py +12 -4
  36. project_kit_cli-0.6.0/src/project_kit/migrate.py +122 -0
  37. project_kit_cli-0.6.0/src/project_kit/peek.py +214 -0
  38. project_kit_cli-0.6.0/src/project_kit/procs.py +22 -0
  39. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/providers/gitlab.py +8 -0
  40. project_kit_cli-0.6.0/src/project_kit/quiet.py +434 -0
  41. project_kit_cli-0.6.0/src/project_kit/redact.py +43 -0
  42. project_kit_cli-0.6.0/src/project_kit/schema.py +55 -0
  43. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/skills.py +7 -2
  44. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/sources.py +31 -1
  45. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/state.py +4 -8
  46. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/statusline.py +80 -15
  47. project_kit_cli-0.6.0/src/project_kit/uninstall.py +204 -0
  48. project_kit_cli-0.6.0/src/project_kit/updates.py +316 -0
  49. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/upgrade.py +6 -3
  50. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/workflow.py +3 -3
  51. project_kit_cli-0.5.2/PKG-INFO +0 -297
  52. project_kit_cli-0.5.2/README.md +0 -279
  53. project_kit_cli-0.5.2/src/project_kit/assets/docs/agents.md +0 -20
  54. project_kit_cli-0.5.2/src/project_kit/assets/docs/statusline.md +0 -58
  55. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/LICENSE +0 -0
  56. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/__init__.py +0 -0
  57. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/__main__.py +0 -0
  58. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/docs/backlog-schema.md +0 -0
  59. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/docs/handoff.md +0 -0
  60. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/docs/skills.md +0 -0
  61. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/hooks/commit-msg +0 -0
  62. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/project/skills-catalog.yml +0 -0
  63. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/project/workflow.yml +0 -0
  64. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-amend/SKILL.md +0 -0
  65. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-grill/SKILL.md +0 -0
  66. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-handoff/SKILL.md +0 -0
  67. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-next/SKILL.md +0 -0
  68. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-skills/SKILL.md +0 -0
  69. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-start/SKILL.md +0 -0
  70. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/skills/pk-verify/SKILL.md +0 -0
  71. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/subagents/pk-reviewer.md +0 -0
  72. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/adr.md +0 -0
  73. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/backlog.example.json +0 -0
  74. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/brief.md +0 -0
  75. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/constitution-input.md +0 -0
  76. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/development-workflow.md +0 -0
  77. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/adr.yml +0 -0
  78. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/bug.yml +0 -0
  79. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/config.yml +0 -0
  80. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/epic.yml +0 -0
  81. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/feature.yml +0 -0
  82. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/github/pull_request_template.md +0 -0
  83. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/gitlab/issue_templates/adr.md +0 -0
  84. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/gitlab/issue_templates/bug.md +0 -0
  85. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/gitlab/issue_templates/epic.md +0 -0
  86. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/gitlab/issue_templates/feature.md +0 -0
  87. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/assets/templates/gitlab/merge_request_templates/Default.md +0 -0
  88. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/claude_hooks.py +0 -0
  89. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/doctor.py +0 -0
  90. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/entry.py +0 -0
  91. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/fsutil.py +0 -0
  92. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/gh.py +0 -0
  93. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/glab.py +0 -0
  94. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/labels.py +0 -0
  95. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/next_step.py +0 -0
  96. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/project_choice.py +0 -0
  97. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/providers/__init__.py +0 -0
  98. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/providers/github.py +0 -0
  99. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/provision.py +0 -0
  100. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/provision_gitlab.py +0 -0
  101. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/provision_issues.py +0 -0
  102. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/templating.py +0 -0
  103. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/trace.py +0 -0
  104. {project_kit_cli-0.5.2 → project_kit_cli-0.6.0}/src/project_kit/userdocs.py +0 -0
@@ -0,0 +1,156 @@
1
+ Metadata-Version: 2.4
2
+ Name: project-kit-cli
3
+ Version: 0.6.0
4
+ Summary: Project definition and dev-workflow kit that hands off to Spec Kit
5
+ Keywords: project-management,spec-kit,claude-code,workflow,github
6
+ Author: Miguel Tomás
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Topic :: Software Development
16
+ Requires-Dist: pyyaml>=6.0.3
17
+ Requires-Python: >=3.12
18
+ Description-Content-Type: text/markdown
19
+
20
+ # project-kit
21
+
22
+ [![PyPI](https://img.shields.io/pypi/v/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
23
+ [![License: MIT](https://img.shields.io/pypi/l/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
24
+
25
+ **Everything that happens before the first line of code.** project-kit guides you, with an AI
26
+ agent, through defining a project, deciding its stack and architecture, agreeing how the team
27
+ works and planning the backlog. It then sets up GitHub and hands the project over to
28
+ [Spec Kit](https://github.com/github/spec-kit), which specifies and builds each feature.
29
+
30
+ ```
31
+ idea ──▶ brief ──▶ decisions (ADRs) ──▶ workflow ──▶ backlog ──▶ GitHub ──▶ Spec Kit
32
+ /pk-discover /pk-decide /pk-workflow /pk-plan /pk-provision /pk-handoff
33
+ ```
34
+
35
+ The conversations run in your AI agent as `/pk-…` skills: one question at a time, a recommended
36
+ answer for each, and everything written to documents in your repository. Every phase ends with
37
+ your approval, and every document can be written by hand instead.
38
+
39
+ > **Status: alpha.** It works end to end on GitHub with Claude Code. Codex, Gemini, Copilot and
40
+ > Cursor get their skills and context files but **have not been tried** and are started by hand
41
+ > (the levels per agent: `pjkit docs agents`). **GitLab support is experimental**: reading a
42
+ > project was checked against the real gitlab.com API, but creating things (labels, milestones,
43
+ > board, issues) has only been tried against a simulated API. Read the `--dry-run` before
44
+ > applying; what was and was not checked is in `pjkit docs provisioning`.
45
+
46
+ ## Install
47
+
48
+ ```bash
49
+ uv tool install project-kit-cli # installs the `pjkit` command
50
+ uv tool upgrade project-kit-cli # later, to update the program
51
+ pjkit doctor # checks git, gh/glab, uv and your PATH
52
+ ```
53
+
54
+ You need [uv](https://docs.astral.sh/uv/) (it fetches Python 3.12+), `git`, and an AI agent
55
+ ([Claude Code](https://claude.com/claude-code) is the tested one). For GitHub, `gh` logged in
56
+ with the `repo` and `project` scopes; for GitLab, `glab`; or neither, with `--provider none`.
57
+ The package is called `project-kit-cli`; the command is `pjkit`. To try it without installing:
58
+ `uvx --from project-kit-cli pjkit help`.
59
+
60
+ **`pjkit` not found, or `No pyvenv.cfg file`.** The skills and hooks call `pjkit` by name, so it
61
+ must be on the PATH of the terminal that starts your agent. Install it with `uv tool install`
62
+ (not inside a project's virtual environment) and run `uv tool update-shell` once. `pjkit doctor`
63
+ points at the cause.
64
+
65
+ ## Quick start
66
+
67
+ ```bash
68
+ cd my-project
69
+ pjkit init # copies the skills and templates, then offers to open Claude Code on /pk-start
70
+ pjkit status # where you are and what comes next, at any time
71
+ ```
72
+
73
+ `/pk-start` asks whether to only initialise or to start defining the project now, and after every
74
+ phase it asks whether to continue or stop. You can leave at any point and come back later. You
75
+ never have to know which skill fits: open your agent and say what you want in your own words
76
+ (*"continue"*, *"I already have a PRD"*, *"the scope changed"*).
77
+
78
+ New here? Read the guides, which ship with the program (in Spanish):
79
+
80
+ | Guide | What it is |
81
+ |---|---|
82
+ | `pjkit docs quickstart` | From zero to the first approved phase in 5 minutes, with and without GitHub |
83
+ | `pjkit docs example` | A finished project, file by file, with comments |
84
+ | `pjkit docs session` | A real, unedited conversation with Claude Code, from `/pk-start` to the decisions |
85
+ | `pjkit docs flow` | The whole flow in detail: phases, existing documents, quick mode, verification |
86
+
87
+ ## The phases
88
+
89
+ | # | Skill | Produces |
90
+ |---|---|---|
91
+ | 0 | `/pk-start` | `.project-kit/` |
92
+ | 1 | `/pk-discover` | `docs/project/brief.md` |
93
+ | 2 | `/pk-decide` | `docs/adr/*.md` |
94
+ | 3 | `/pk-workflow` | `docs/development-workflow.md` |
95
+ | 4 | `/pk-foundations` | `docs/project/standards.md`, `testing.md`, `security.md`, `documentation.md` |
96
+ | 5 | `/pk-plan` | `docs/project/roadmap.md`, `.project-kit/backlog.json` |
97
+ | 6 | `/pk-provision` | milestones, labels, branches, the Project and the issues (skipped with `--provider none`) |
98
+ | 7 | `/pk-handoff` | the Spec Kit constitution input; `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` |
99
+
100
+ Outside the sequence: `/pk-next` (runs the sequence for you), `/pk-grill` (hard questions and
101
+ contradictions, offered before each approval), `/pk-import` (start from existing documents),
102
+ `/pk-skills`, `/pk-amend`, `/pk-verify` and `/pk-quiet` (runs long commands and reads long logs
103
+ through `pjkit run`, `logs` and `peek` so that only what failed reaches the AI; it pays off with
104
+ long output, see `pjkit docs quiet`). Each phase ends with `pjkit approve <phase>`, which only
105
+ you run. A small project can skip three phases with `pjkit init --mode quick`.
106
+
107
+ ## Commands
108
+
109
+ | Command | What it does |
110
+ |---|---|
111
+ | `pjkit init` | Install the skills, templates and workflow in the current directory |
112
+ | `pjkit status` / `pjkit next` | The phases and what comes next / what to tell your AI |
113
+ | `pjkit approve <phase>` | Record your sign-off of a phase |
114
+ | `pjkit backlog validate` | Validate `.project-kit/backlog.json` |
115
+ | `pjkit provision [--dry-run]` | Create milestones, branches, the Project and issues on GitHub |
116
+ | `pjkit handoff [--install-speckit]` | Generate the Spec Kit constitution input |
117
+ | `pjkit import <path>` | Copy existing documentation to `docs/sources/` for `/pk-import` |
118
+ | `pjkit trace` | Which issues have a spec, a decision and a test, and what is not linked |
119
+ | `pjkit upgrade [--apply]` | Update the skills and templates a project already has |
120
+ | `pjkit update [--check]` | Update project-kit itself (the status bar says `update available`; `PJKIT_NO_UPDATE_CHECK=1` turns that off) |
121
+ | `pjkit uninstall [--apply] [--purge]` | Undo `init`: remove what project-kit installed and you did not edit |
122
+ | `pjkit run -- <command>` | Run a command and print a small report instead of all its output (`logs`, `peek` and `stats` go with it) |
123
+ | `pjkit mode [quick\|full]` | Show or change how many phases the project goes through |
124
+ | `pjkit context` | Write or refresh the project block in `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` |
125
+ | `pjkit skills list\|show\|mark` | Recommended third-party skills and what the project decided |
126
+ | `pjkit statusline [--install]` | A line for Claude Code's status bar: model, context, limits, project phase |
127
+ | `pjkit hook install\|remove` | Tell Claude Code the project's state at the start of each session |
128
+ | `pjkit docs [topic]` | The guides |
129
+ | `pjkit doctor` / `pjkit help` | Check the tools / a visual guide |
130
+
131
+ Useful `init` options: `--from <path>`, `--mode quick|full`, `--no-context`, `--project-name`,
132
+ `--language` (of the generated documents), `--agents claude,codex,...`, `--agent claude|none`,
133
+ `--provider github|gitlab|none` and `--ai-coauthor keep|remove`.
134
+
135
+ ## What it adds to your repository
136
+
137
+ ```
138
+ .project-kit/ config.yml, state.json, workflow.yml, templates/, handoff/
139
+ .claude/skills/pk-*/ the skills (.agents/skills for the other agents)
140
+ docs/project/ brief.md, roadmap.md (created by the phases)
141
+ docs/adr/ one file per decision (created by the phases)
142
+ .githooks/commit-msg only if you removed the AI co-author
143
+ ```
144
+
145
+ `init` never overwrites a file, so it is safe in a repository that already has code. A new
146
+ version of the program does not change an existing project: `pjkit upgrade` shows what is out of
147
+ date and `pjkit upgrade --apply` brings it up to date without touching what you edited.
148
+
149
+ ## Documentation
150
+
151
+ `pjkit docs` lists every guide: `quickstart`, `example`, `session`, `flow`, `quiet`, `upgrade`,
152
+ `provisioning`, `handoff`, `backlog-schema`, `skills`, `statusline` and `agents`.
153
+
154
+ ## License
155
+
156
+ MIT.
@@ -0,0 +1,137 @@
1
+ # project-kit
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
4
+ [![License: MIT](https://img.shields.io/pypi/l/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
5
+
6
+ **Everything that happens before the first line of code.** project-kit guides you, with an AI
7
+ agent, through defining a project, deciding its stack and architecture, agreeing how the team
8
+ works and planning the backlog. It then sets up GitHub and hands the project over to
9
+ [Spec Kit](https://github.com/github/spec-kit), which specifies and builds each feature.
10
+
11
+ ```
12
+ idea ──▶ brief ──▶ decisions (ADRs) ──▶ workflow ──▶ backlog ──▶ GitHub ──▶ Spec Kit
13
+ /pk-discover /pk-decide /pk-workflow /pk-plan /pk-provision /pk-handoff
14
+ ```
15
+
16
+ The conversations run in your AI agent as `/pk-…` skills: one question at a time, a recommended
17
+ answer for each, and everything written to documents in your repository. Every phase ends with
18
+ your approval, and every document can be written by hand instead.
19
+
20
+ > **Status: alpha.** It works end to end on GitHub with Claude Code. Codex, Gemini, Copilot and
21
+ > Cursor get their skills and context files but **have not been tried** and are started by hand
22
+ > (the levels per agent: `pjkit docs agents`). **GitLab support is experimental**: reading a
23
+ > project was checked against the real gitlab.com API, but creating things (labels, milestones,
24
+ > board, issues) has only been tried against a simulated API. Read the `--dry-run` before
25
+ > applying; what was and was not checked is in `pjkit docs provisioning`.
26
+
27
+ ## Install
28
+
29
+ ```bash
30
+ uv tool install project-kit-cli # installs the `pjkit` command
31
+ uv tool upgrade project-kit-cli # later, to update the program
32
+ pjkit doctor # checks git, gh/glab, uv and your PATH
33
+ ```
34
+
35
+ You need [uv](https://docs.astral.sh/uv/) (it fetches Python 3.12+), `git`, and an AI agent
36
+ ([Claude Code](https://claude.com/claude-code) is the tested one). For GitHub, `gh` logged in
37
+ with the `repo` and `project` scopes; for GitLab, `glab`; or neither, with `--provider none`.
38
+ The package is called `project-kit-cli`; the command is `pjkit`. To try it without installing:
39
+ `uvx --from project-kit-cli pjkit help`.
40
+
41
+ **`pjkit` not found, or `No pyvenv.cfg file`.** The skills and hooks call `pjkit` by name, so it
42
+ must be on the PATH of the terminal that starts your agent. Install it with `uv tool install`
43
+ (not inside a project's virtual environment) and run `uv tool update-shell` once. `pjkit doctor`
44
+ points at the cause.
45
+
46
+ ## Quick start
47
+
48
+ ```bash
49
+ cd my-project
50
+ pjkit init # copies the skills and templates, then offers to open Claude Code on /pk-start
51
+ pjkit status # where you are and what comes next, at any time
52
+ ```
53
+
54
+ `/pk-start` asks whether to only initialise or to start defining the project now, and after every
55
+ phase it asks whether to continue or stop. You can leave at any point and come back later. You
56
+ never have to know which skill fits: open your agent and say what you want in your own words
57
+ (*"continue"*, *"I already have a PRD"*, *"the scope changed"*).
58
+
59
+ New here? Read the guides, which ship with the program (in Spanish):
60
+
61
+ | Guide | What it is |
62
+ |---|---|
63
+ | `pjkit docs quickstart` | From zero to the first approved phase in 5 minutes, with and without GitHub |
64
+ | `pjkit docs example` | A finished project, file by file, with comments |
65
+ | `pjkit docs session` | A real, unedited conversation with Claude Code, from `/pk-start` to the decisions |
66
+ | `pjkit docs flow` | The whole flow in detail: phases, existing documents, quick mode, verification |
67
+
68
+ ## The phases
69
+
70
+ | # | Skill | Produces |
71
+ |---|---|---|
72
+ | 0 | `/pk-start` | `.project-kit/` |
73
+ | 1 | `/pk-discover` | `docs/project/brief.md` |
74
+ | 2 | `/pk-decide` | `docs/adr/*.md` |
75
+ | 3 | `/pk-workflow` | `docs/development-workflow.md` |
76
+ | 4 | `/pk-foundations` | `docs/project/standards.md`, `testing.md`, `security.md`, `documentation.md` |
77
+ | 5 | `/pk-plan` | `docs/project/roadmap.md`, `.project-kit/backlog.json` |
78
+ | 6 | `/pk-provision` | milestones, labels, branches, the Project and the issues (skipped with `--provider none`) |
79
+ | 7 | `/pk-handoff` | the Spec Kit constitution input; `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` |
80
+
81
+ Outside the sequence: `/pk-next` (runs the sequence for you), `/pk-grill` (hard questions and
82
+ contradictions, offered before each approval), `/pk-import` (start from existing documents),
83
+ `/pk-skills`, `/pk-amend`, `/pk-verify` and `/pk-quiet` (runs long commands and reads long logs
84
+ through `pjkit run`, `logs` and `peek` so that only what failed reaches the AI; it pays off with
85
+ long output, see `pjkit docs quiet`). Each phase ends with `pjkit approve <phase>`, which only
86
+ you run. A small project can skip three phases with `pjkit init --mode quick`.
87
+
88
+ ## Commands
89
+
90
+ | Command | What it does |
91
+ |---|---|
92
+ | `pjkit init` | Install the skills, templates and workflow in the current directory |
93
+ | `pjkit status` / `pjkit next` | The phases and what comes next / what to tell your AI |
94
+ | `pjkit approve <phase>` | Record your sign-off of a phase |
95
+ | `pjkit backlog validate` | Validate `.project-kit/backlog.json` |
96
+ | `pjkit provision [--dry-run]` | Create milestones, branches, the Project and issues on GitHub |
97
+ | `pjkit handoff [--install-speckit]` | Generate the Spec Kit constitution input |
98
+ | `pjkit import <path>` | Copy existing documentation to `docs/sources/` for `/pk-import` |
99
+ | `pjkit trace` | Which issues have a spec, a decision and a test, and what is not linked |
100
+ | `pjkit upgrade [--apply]` | Update the skills and templates a project already has |
101
+ | `pjkit update [--check]` | Update project-kit itself (the status bar says `update available`; `PJKIT_NO_UPDATE_CHECK=1` turns that off) |
102
+ | `pjkit uninstall [--apply] [--purge]` | Undo `init`: remove what project-kit installed and you did not edit |
103
+ | `pjkit run -- <command>` | Run a command and print a small report instead of all its output (`logs`, `peek` and `stats` go with it) |
104
+ | `pjkit mode [quick\|full]` | Show or change how many phases the project goes through |
105
+ | `pjkit context` | Write or refresh the project block in `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` |
106
+ | `pjkit skills list\|show\|mark` | Recommended third-party skills and what the project decided |
107
+ | `pjkit statusline [--install]` | A line for Claude Code's status bar: model, context, limits, project phase |
108
+ | `pjkit hook install\|remove` | Tell Claude Code the project's state at the start of each session |
109
+ | `pjkit docs [topic]` | The guides |
110
+ | `pjkit doctor` / `pjkit help` | Check the tools / a visual guide |
111
+
112
+ Useful `init` options: `--from <path>`, `--mode quick|full`, `--no-context`, `--project-name`,
113
+ `--language` (of the generated documents), `--agents claude,codex,...`, `--agent claude|none`,
114
+ `--provider github|gitlab|none` and `--ai-coauthor keep|remove`.
115
+
116
+ ## What it adds to your repository
117
+
118
+ ```
119
+ .project-kit/ config.yml, state.json, workflow.yml, templates/, handoff/
120
+ .claude/skills/pk-*/ the skills (.agents/skills for the other agents)
121
+ docs/project/ brief.md, roadmap.md (created by the phases)
122
+ docs/adr/ one file per decision (created by the phases)
123
+ .githooks/commit-msg only if you removed the AI co-author
124
+ ```
125
+
126
+ `init` never overwrites a file, so it is safe in a repository that already has code. A new
127
+ version of the program does not change an existing project: `pjkit upgrade` shows what is out of
128
+ date and `pjkit upgrade --apply` brings it up to date without touching what you edited.
129
+
130
+ ## Documentation
131
+
132
+ `pjkit docs` lists every guide: `quickstart`, `example`, `session`, `flow`, `quiet`, `upgrade`,
133
+ `provisioning`, `handoff`, `backlog-schema`, `skills`, `statusline` and `agents`.
134
+
135
+ ## License
136
+
137
+ MIT.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "0.5.2"
3
+ version = "0.6.0"
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"
@@ -19,6 +19,7 @@ classifiers = [
19
19
  "Intended Audience :: Developers",
20
20
  "Operating System :: OS Independent",
21
21
  "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.14",
22
23
  "Topic :: Software Development",
23
24
  ]
24
25
  dependencies = ["pyyaml>=6.0.3"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "0.5.2"
3
+ version = "0.6.0"
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"
@@ -14,6 +14,7 @@ classifiers = [
14
14
  "Intended Audience :: Developers",
15
15
  "Operating System :: OS Independent",
16
16
  "Programming Language :: Python :: 3.12",
17
+ "Programming Language :: Python :: 3.14",
17
18
  "Topic :: Software Development",
18
19
  ]
19
20
  dependencies = [
@@ -15,6 +15,10 @@ from collections.abc import Callable, Mapping, Sequence
15
15
  from dataclasses import dataclass
16
16
  from pathlib import Path
17
17
 
18
+ # How far an agent has been tried with the whole flow (see `pjkit docs agents`).
19
+ TESTED = "tested" # the flow has been run with it from start to end
20
+ UNTESTED = "untested" # skills and context are installed where it reads them; never tried
21
+
18
22
 
19
23
  @dataclass(frozen=True)
20
24
  class Agent:
@@ -27,6 +31,7 @@ class Agent:
27
31
  speckit_key: str = "" # its name in `specify init --integration`
28
32
  prompt: str = "" # what it is started with (the entry-point skill); empty: not launchable
29
33
  inside_env: str = "" # environment variable it sets in the shells it opens, if any
34
+ support: str = UNTESTED
30
35
 
31
36
 
32
37
  AGENTS = (
@@ -40,6 +45,7 @@ AGENTS = (
40
45
  speckit_key="claude",
41
46
  prompt="/pk-start",
42
47
  inside_env="CLAUDECODE",
48
+ support=TESTED,
43
49
  ),
44
50
  Agent(
45
51
  id="codex",
@@ -86,6 +92,23 @@ def get_agent(agent_id: str) -> Agent:
86
92
  return next(a for a in AGENTS if a.id == agent_id)
87
93
 
88
94
 
95
+ def untested(agent_ids: Sequence[str]) -> list[Agent]:
96
+ """Those of these agents the flow has not been tried with."""
97
+ return [a for a in map(get_agent, agent_ids) if a.support != TESTED]
98
+
99
+
100
+ def untested_note(agent_ids: Sequence[str]) -> str:
101
+ """What to tell the user who chose agents the flow has not been tried with, or empty."""
102
+ names = ", ".join(a.name for a in untested(agent_ids))
103
+ if not names:
104
+ return ""
105
+ return (
106
+ f"Untested with {names}: project-kit installs their skills and context files where "
107
+ "they read them, but the flow has not been tried with them. Claude Code is the tested "
108
+ "one. What is known about each agent: `pjkit docs agents`."
109
+ )
110
+
111
+
89
112
  def launchable(selected: Sequence[Agent] | None = None) -> list[Agent]:
90
113
  """The agents ``init`` can start, among ``selected`` (default: all)."""
91
114
  return [a for a in (AGENTS if selected is None else selected) if a.prompt]
@@ -48,6 +48,30 @@ def configure_claude(root: Path) -> tuple[Path | None, str]:
48
48
  return CLAUDE_SETTINGS, ""
49
49
 
50
50
 
51
+ def remove_claude(root: Path, *, dry_run: bool = False) -> bool:
52
+ """Undo ``configure_claude``: drop the empty commit/pr attribution. True if it changed."""
53
+ path = root / CLAUDE_SETTINGS
54
+ try:
55
+ data = json.loads(path.read_text(encoding="utf-8"))
56
+ except (OSError, ValueError):
57
+ return False
58
+ attribution = data.get("attribution") if isinstance(data, dict) else None
59
+ if not (
60
+ isinstance(attribution, dict)
61
+ and attribution.get("commit") == ""
62
+ and attribution.get("pr") == ""
63
+ ):
64
+ return False
65
+ rest = {k: v for k, v in attribution.items() if k not in ("commit", "pr")}
66
+ if rest:
67
+ data["attribution"] = rest
68
+ else:
69
+ del data["attribution"]
70
+ if not dry_run:
71
+ atomic_write_text(path, json.dumps(data, indent=2, ensure_ascii=False) + "\n")
72
+ return True
73
+
74
+
51
75
  def install_hook(root: Path) -> tuple[Path | None, str]:
52
76
  """Copy the commit-msg hook unless the project already has one. Returns (new file, note)."""
53
77
  dest = root / HOOK