project-kit-cli 0.4.0__tar.gz → 0.5.1__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.4.0 → project_kit_cli-0.5.1}/PKG-INFO +70 -26
  2. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/README.md +69 -23
  3. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/pyproject.toml +1 -5
  4. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/pyproject.toml.orig +1 -5
  5. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/approval.py +42 -0
  6. project_kit_cli-0.5.1/src/project_kit/assets/docs/agents.md +20 -0
  7. project_kit_cli-0.5.1/src/project_kit/assets/docs/backlog-schema.md +81 -0
  8. project_kit_cli-0.5.1/src/project_kit/assets/docs/handoff.md +128 -0
  9. project_kit_cli-0.5.1/src/project_kit/assets/docs/provisioning.md +136 -0
  10. project_kit_cli-0.5.1/src/project_kit/assets/docs/skills.md +63 -0
  11. project_kit_cli-0.5.1/src/project_kit/assets/docs/statusline.md +58 -0
  12. project_kit_cli-0.5.1/src/project_kit/assets/docs/upgrade.md +47 -0
  13. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-amend/SKILL.md +2 -0
  14. project_kit_cli-0.5.1/src/project_kit/assets/skills/pk-import/SKILL.md +62 -0
  15. project_kit_cli-0.5.1/src/project_kit/assets/skills/pk-next/SKILL.md +46 -0
  16. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-plan/SKILL.md +5 -0
  17. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-start/SKILL.md +14 -3
  18. project_kit_cli-0.5.1/src/project_kit/assets/skills/pk-verify/SKILL.md +74 -0
  19. project_kit_cli-0.5.1/src/project_kit/assets/subagents/pk-reviewer.md +26 -0
  20. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/interview.md +4 -2
  21. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/backlog.py +1 -1
  22. project_kit_cli-0.5.1/src/project_kit/claude_hooks.py +100 -0
  23. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/cli.py +244 -2
  24. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/config.py +14 -0
  25. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/context_files.py +31 -1
  26. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/doctor.py +13 -3
  27. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/help.py +6 -0
  28. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/installer.py +6 -0
  29. project_kit_cli-0.5.1/src/project_kit/next_step.py +134 -0
  30. project_kit_cli-0.5.1/src/project_kit/sources.py +243 -0
  31. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/statusline.py +31 -1
  32. project_kit_cli-0.5.1/src/project_kit/trace.py +272 -0
  33. project_kit_cli-0.5.1/src/project_kit/userdocs.py +41 -0
  34. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/workflow.py +12 -8
  35. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/LICENSE +0 -0
  36. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/__init__.py +0 -0
  37. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/__main__.py +0 -0
  38. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/agents.py +0 -0
  39. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/ai_attribution.py +0 -0
  40. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/hooks/commit-msg +0 -0
  41. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/project/skills-catalog.yml +0 -0
  42. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/project/workflow.yml +0 -0
  43. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-decide/SKILL.md +0 -0
  44. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-discover/SKILL.md +0 -0
  45. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-foundations/SKILL.md +0 -0
  46. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-grill/SKILL.md +0 -0
  47. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-handoff/SKILL.md +0 -0
  48. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-provision/SKILL.md +0 -0
  49. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-skills/SKILL.md +0 -0
  50. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-workflow/SKILL.md +0 -0
  51. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/adr.md +0 -0
  52. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/backlog.example.json +0 -0
  53. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/brief.md +0 -0
  54. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/constitution-input.md +0 -0
  55. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/development-workflow.md +0 -0
  56. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/adr.yml +0 -0
  57. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/bug.yml +0 -0
  58. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/config.yml +0 -0
  59. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/epic.yml +0 -0
  60. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/feature.yml +0 -0
  61. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/pull_request_template.md +0 -0
  62. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/adr.md +0 -0
  63. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/bug.md +0 -0
  64. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/epic.md +0 -0
  65. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/feature.md +0 -0
  66. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/merge_request_templates/Default.md +0 -0
  67. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/entry.py +0 -0
  68. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/fsutil.py +0 -0
  69. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/gh.py +0 -0
  70. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/glab.py +0 -0
  71. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/handoff.py +0 -0
  72. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/labels.py +0 -0
  73. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/manifest.py +0 -0
  74. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/project_choice.py +0 -0
  75. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/providers/__init__.py +0 -0
  76. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/providers/github.py +0 -0
  77. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/providers/gitlab.py +0 -0
  78. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/provision.py +0 -0
  79. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/provision_gitlab.py +0 -0
  80. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/provision_issues.py +0 -0
  81. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/skills.py +0 -0
  82. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/state.py +0 -0
  83. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/templating.py +0 -0
  84. {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/upgrade.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: project-kit-cli
3
- Version: 0.4.0
3
+ Version: 0.5.1
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
@@ -14,14 +14,12 @@ Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Topic :: Software Development
15
15
  Requires-Dist: pyyaml>=6.0.3
16
16
  Requires-Python: >=3.12
17
- Project-URL: Repository, https://github.com/miguelmatg/project-kit
18
- Project-URL: Issues, https://github.com/miguelmatg/project-kit/issues
19
17
  Description-Content-Type: text/markdown
20
18
 
21
19
  # project-kit
22
20
 
23
21
  [![PyPI](https://img.shields.io/pypi/v/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
24
- [![License: MIT](https://img.shields.io/pypi/l/project-kit-cli)](https://github.com/miguelmatg/project-kit/blob/main/LICENSE)
22
+ [![License: MIT](https://img.shields.io/pypi/l/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
25
23
 
26
24
  **Everything that happens before the first line of code.** project-kit guides you, with an AI
27
25
  agent, through defining a project, deciding its stack and architecture, agreeing how the team
@@ -69,8 +67,7 @@ installing: `uvx --from project-kit-cli pjkit help`.
69
67
  **Updating a project.** `init` copies the skills and templates into your repository and never
70
68
  overwrites them, so a new version of the program does not change a project that already exists.
71
69
  Run `pjkit upgrade` inside it to see what is out of date, and `pjkit upgrade --apply`
72
- to bring it up to date. Files you edited are never overwritten; see
73
- [upgrading](https://github.com/miguelmatg/project-kit/blob/main/docs/upgrade.md).
70
+ to bring it up to date. Files you edited are never overwritten; see `pjkit docs upgrade`.
74
71
 
75
72
  ## Quick start
76
73
 
@@ -91,6 +88,33 @@ pjkit status # where you are and what comes next
91
88
  pjkit help # a visual guide to the flow and the commands
92
89
  ```
93
90
 
91
+ ## You do not need to learn the skills
92
+
93
+ You never have to know which skill fits which moment. Open your agent in the project and say
94
+ what you want in your own words: *"continue"*, *"I already have a PRD"*, *"challenge this plan"*,
95
+ *"the scope changed"*, *"is this feature really done?"*. The agent picks the skill.
96
+
97
+ - `init` writes a block in `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` with a table of *what the user
98
+ wants → which skill*, refreshed as the project moves.
99
+ - `/pk-next` is the conductor: it reads `pjkit next`, runs the phase that is due, offers
100
+ `pk-grill` before each approval, suggests `pk-skills` once the stack is chosen, `pk-amend`
101
+ when the plan changes and `pk-verify` when an issue seems finished. It never approves for you.
102
+ - `pjkit next` and the end of `pjkit status` print what to tell your AI, in plain words, for
103
+ agents that have no `/` commands.
104
+ - Claude Code can also be told the project's state at the start of each session
105
+ (`pjkit hook install`, asked in `init`, never without a yes).
106
+
107
+ ## Starting from documents you already have
108
+
109
+ `pjkit import <folder or file>` (or `pjkit init --from <path>`) copies a PRD, notes or a wiki
110
+ export into `docs/sources/` without touching the originals, and lists them in
111
+ `docs/sources/INDEX.md` with how each can be read. Then `/pk-import` drafts the brief, the
112
+ decisions (as *Proposed*), the roadmap and the backlog from them, citing the source of every
113
+ claim, marking what they do not say as `[NEEDS CLARIFICATION]`, asking about contradictions, and
114
+ reviewing the result with `pk-grill`. It never overwrites a document or approves a phase. Files
115
+ that look like they contain secrets or personal data are not copied unless you say so
116
+ (`--allow-sensitive`).
117
+
94
118
  ## The phases
95
119
 
96
120
  | # | Skill | What it does | Produces |
@@ -104,8 +128,8 @@ pjkit help # a visual guide to the flow and the commands
104
128
  | 6 | `/pk-provision` | Creates milestones, labels, branches, the GitHub Project and the issues (skipped with `provider: none`) | GitHub |
105
129
  | 7 | `/pk-handoff` | Prepares the Spec Kit constitution; each issue becomes a spec; writes `CLAUDE.md` / `AGENTS.md` | `.project-kit/handoff/constitution-input.md` |
106
130
 
107
- Outside the sequence, three skills are always available: `/pk-grill` interviews you hard and
108
- cross-checks the project's documents for contradictions (it is offered before each approval),
131
+ `/pk-next` runs the whole sequence for you (see above). Outside the sequence, three more
132
+ skills are always available: `/pk-grill` interviews you hard and cross-checks the project's documents for contradictions (it is offered before each approval),
109
133
  `/pk-skills` recommends third-party skills that fit the project, and `/pk-amend` brings a change
110
134
  after the plan (a new epic, a decision that replaces another) into the documents and the backlog.
111
135
 
@@ -138,11 +162,16 @@ It never rewrites issues that already exist, and re-running it is always safe.
138
162
  | `pjkit backlog validate` | Validate `.project-kit/backlog.json` |
139
163
  | `pjkit provision [--dry-run] [--project X]` | Create milestones, branches, the Project and issues on GitHub |
140
164
  | `pjkit handoff [--install-speckit]` | Generate the Spec Kit constitution input |
165
+ | `pjkit next [--json]` | What comes next, in words you can give to your AI |
166
+ | `pjkit import <path>` | Copy existing documentation to `docs/sources/` for `/pk-import` |
167
+ | `pjkit hook install\|remove` | Tell Claude Code the project's state at the start of each session |
168
+ | `pjkit mode [quick\|full]` | Show or change how many phases the project goes through |
169
+ | `pjkit trace [--criteria] [--json]` | Show which issues have a spec, a decision and a test, and what is not linked |
141
170
  | `pjkit statusline [--install]` | One line for Claude Code's status bar: model, context, usage limits and the project phase |
142
171
  | `pjkit context [--dry-run]` | Write or refresh the project block in `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` |
143
172
  | `pjkit skills list\|show\|mark` | Recommended third-party skills, their install command, and what the project decided |
144
173
 
145
- Useful `init` options: `--project-name`, `--language` (language of the generated documents),
174
+ Useful `init` options: `--from <path>`, `--mode quick|full`, `--no-context`, `--project-name`, `--language` (language of the generated documents),
146
175
  `--agents claude,codex,...` (the AI agents you use; asked when there is a terminal),
147
176
  `--agent claude|none` (open the agent or not), `--provider github|gitlab|none` and
148
177
  `--ai-coauthor keep|remove`.
@@ -156,6 +185,31 @@ writes the context file each one reads (`CLAUDE.md`, `AGENTS.md`, `GEMINI.md`).
156
185
  between its markers is managed; the rest of the file is yours. Only Claude Code is started by
157
186
  `init`; for the others, open the agent and ask it to run the `pk-start` skill.
158
187
 
188
+ ## Small projects: quick mode
189
+
190
+ Not every project needs seven phases. `pjkit init --mode quick` (or answer yes when `init` asks
191
+ whether it is a small project) skips *decide*, *workflow* and *foundations*: you go from the
192
+ brief to the plan, and the stack is taken from the brief. `pjkit mode full` brings the phases
193
+ back, `pjkit mode` shows where you are, and `pjkit status` says which phases are skipped and why.
194
+
195
+ ## Checking that it is really done
196
+
197
+ The agent that built a feature should not be the only one to decide it is finished.
198
+ `/pk-verify` is a second opinion: it reads the issue's acceptance criteria, runs the project's
199
+ own tests and gives a verdict per criterion with evidence (`PASS`, `FAIL` or `INCOMPLETE`),
200
+ without touching any file. In Claude Code, `init` also installs the `pk-reviewer` subagent
201
+ (`.claude/agents/`), read-only, so the check runs in a context separate from the implementation.
202
+
203
+ `pjkit trace` shows the links between what was asked and what exists. Each acceptance criterion
204
+ has a stable name, `<issue id>#<position>` (`login#2`); write it in a test name or a spec and
205
+ `trace` lists the issues with no spec, the specs with no test, the criteria with no test, the
206
+ decisions nobody mentions and the references to things that do not exist. A link is a mention:
207
+ it shows what is missing, not that a test is any good, which is what `/pk-verify` is for.
208
+
209
+ `pjkit approve` refuses to sign off a phase whose documents still have
210
+ `[NEEDS CLARIFICATION]` markers (it asks if you are at a terminal; `--allow-open-questions`
211
+ approves anyway).
212
+
159
213
  ## Status bar
160
214
 
161
215
  Claude Code can show a line of your choosing at the bottom of the screen. `pjkit statusline`
@@ -170,14 +224,13 @@ plans) and where the project is in the flow:
170
224
  `.claude/settings.json` (`--remove` undoes it). It is never turned on without a yes. If you
171
225
  already have a status bar, yours is kept and runs first. It is one line: when the terminal is
172
226
  narrow, the cost goes first, then the 7-day limit, the effort and the context. The cost is an
173
- estimate at list price. More in
174
- [docs/statusline.md](https://github.com/miguelmatg/project-kit/blob/main/docs/statusline.md).
227
+ estimate at list price. More in `pjkit docs statusline`.
175
228
 
176
229
  ## GitLab
177
230
 
178
231
  `pjkit init --provider gitlab` makes `provision` use `glab`: phases become milestones, kind,
179
232
  priority, size and status become labels, and an issue board named `project-kit` is built from the
180
- status labels. Details in [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md).
233
+ status labels. Details in `pjkit docs provisioning`.
181
234
 
182
235
  ## Generating a project without GitHub
183
236
 
@@ -191,8 +244,7 @@ project-kit keeps a catalog of third-party skills (UI/UX, motion, accessibility,
191
244
  architecture, browser testing, `grill-me`, `find-skills`...) in `.project-kit/skills-catalog.yml`.
192
245
  `/pk-skills` recommends the ones that fit your brief and decisions, warns when a task would
193
246
  benefit from one you do not have, and records the answer in `.project-kit/skills.yml`. project-kit
194
- never installs a skill: it shows the command and you run it; `pjkit skills detect` records the ones you already have. How the entries were chosen is in
195
- [docs/skills.md](https://github.com/miguelmatg/project-kit/blob/main/docs/skills.md).
247
+ never installs a skill: it shows the command and you run it; `pjkit skills detect` records the ones you already have. How the entries were chosen: `pjkit docs skills`.
196
248
 
197
249
  ## AI co-author
198
250
 
@@ -230,18 +282,10 @@ docs/adr/ one file per decision (created by the phases)
230
282
 
231
283
  ## Documentation
232
284
 
233
- More detail lives in the repository (in Spanish):
234
- [design](https://github.com/miguelmatg/project-kit/blob/main/docs/design.md),
235
- [backlog schema](https://github.com/miguelmatg/project-kit/blob/main/docs/backlog-schema.md),
236
- [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md) and
237
- [Spec Kit handoff](https://github.com/miguelmatg/project-kit/blob/main/docs/handoff.md).
238
-
239
- ## Feedback
240
-
241
- Ideas and bug reports are welcome as
242
- [issues](https://github.com/miguelmatg/project-kit/issues). Pull requests are not accepted; see
243
- [CONTRIBUTING](https://github.com/miguelmatg/project-kit/blob/main/CONTRIBUTING.md).
285
+ The detailed guides ship with the program (in Spanish). `pjkit docs` lists them and
286
+ `pjkit docs <topic>` prints one: `upgrade`, `provisioning`, `handoff`, `backlog-schema`, `skills`,
287
+ `statusline` and `agents`.
244
288
 
245
289
  ## License
246
290
 
247
- [MIT](https://github.com/miguelmatg/project-kit/blob/main/LICENSE)
291
+ MIT.
@@ -1,7 +1,7 @@
1
1
  # project-kit
2
2
 
3
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://github.com/miguelmatg/project-kit/blob/main/LICENSE)
4
+ [![License: MIT](https://img.shields.io/pypi/l/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
5
5
 
6
6
  **Everything that happens before the first line of code.** project-kit guides you, with an AI
7
7
  agent, through defining a project, deciding its stack and architecture, agreeing how the team
@@ -49,8 +49,7 @@ installing: `uvx --from project-kit-cli pjkit help`.
49
49
  **Updating a project.** `init` copies the skills and templates into your repository and never
50
50
  overwrites them, so a new version of the program does not change a project that already exists.
51
51
  Run `pjkit upgrade` inside it to see what is out of date, and `pjkit upgrade --apply`
52
- to bring it up to date. Files you edited are never overwritten; see
53
- [upgrading](https://github.com/miguelmatg/project-kit/blob/main/docs/upgrade.md).
52
+ to bring it up to date. Files you edited are never overwritten; see `pjkit docs upgrade`.
54
53
 
55
54
  ## Quick start
56
55
 
@@ -71,6 +70,33 @@ pjkit status # where you are and what comes next
71
70
  pjkit help # a visual guide to the flow and the commands
72
71
  ```
73
72
 
73
+ ## You do not need to learn the skills
74
+
75
+ You never have to know which skill fits which moment. Open your agent in the project and say
76
+ what you want in your own words: *"continue"*, *"I already have a PRD"*, *"challenge this plan"*,
77
+ *"the scope changed"*, *"is this feature really done?"*. The agent picks the skill.
78
+
79
+ - `init` writes a block in `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` with a table of *what the user
80
+ wants → which skill*, refreshed as the project moves.
81
+ - `/pk-next` is the conductor: it reads `pjkit next`, runs the phase that is due, offers
82
+ `pk-grill` before each approval, suggests `pk-skills` once the stack is chosen, `pk-amend`
83
+ when the plan changes and `pk-verify` when an issue seems finished. It never approves for you.
84
+ - `pjkit next` and the end of `pjkit status` print what to tell your AI, in plain words, for
85
+ agents that have no `/` commands.
86
+ - Claude Code can also be told the project's state at the start of each session
87
+ (`pjkit hook install`, asked in `init`, never without a yes).
88
+
89
+ ## Starting from documents you already have
90
+
91
+ `pjkit import <folder or file>` (or `pjkit init --from <path>`) copies a PRD, notes or a wiki
92
+ export into `docs/sources/` without touching the originals, and lists them in
93
+ `docs/sources/INDEX.md` with how each can be read. Then `/pk-import` drafts the brief, the
94
+ decisions (as *Proposed*), the roadmap and the backlog from them, citing the source of every
95
+ claim, marking what they do not say as `[NEEDS CLARIFICATION]`, asking about contradictions, and
96
+ reviewing the result with `pk-grill`. It never overwrites a document or approves a phase. Files
97
+ that look like they contain secrets or personal data are not copied unless you say so
98
+ (`--allow-sensitive`).
99
+
74
100
  ## The phases
75
101
 
76
102
  | # | Skill | What it does | Produces |
@@ -84,8 +110,8 @@ pjkit help # a visual guide to the flow and the commands
84
110
  | 6 | `/pk-provision` | Creates milestones, labels, branches, the GitHub Project and the issues (skipped with `provider: none`) | GitHub |
85
111
  | 7 | `/pk-handoff` | Prepares the Spec Kit constitution; each issue becomes a spec; writes `CLAUDE.md` / `AGENTS.md` | `.project-kit/handoff/constitution-input.md` |
86
112
 
87
- Outside the sequence, three skills are always available: `/pk-grill` interviews you hard and
88
- cross-checks the project's documents for contradictions (it is offered before each approval),
113
+ `/pk-next` runs the whole sequence for you (see above). Outside the sequence, three more
114
+ skills are always available: `/pk-grill` interviews you hard and cross-checks the project's documents for contradictions (it is offered before each approval),
89
115
  `/pk-skills` recommends third-party skills that fit the project, and `/pk-amend` brings a change
90
116
  after the plan (a new epic, a decision that replaces another) into the documents and the backlog.
91
117
 
@@ -118,11 +144,16 @@ It never rewrites issues that already exist, and re-running it is always safe.
118
144
  | `pjkit backlog validate` | Validate `.project-kit/backlog.json` |
119
145
  | `pjkit provision [--dry-run] [--project X]` | Create milestones, branches, the Project and issues on GitHub |
120
146
  | `pjkit handoff [--install-speckit]` | Generate the Spec Kit constitution input |
147
+ | `pjkit next [--json]` | What comes next, in words you can give to your AI |
148
+ | `pjkit import <path>` | Copy existing documentation to `docs/sources/` for `/pk-import` |
149
+ | `pjkit hook install\|remove` | Tell Claude Code the project's state at the start of each session |
150
+ | `pjkit mode [quick\|full]` | Show or change how many phases the project goes through |
151
+ | `pjkit trace [--criteria] [--json]` | Show which issues have a spec, a decision and a test, and what is not linked |
121
152
  | `pjkit statusline [--install]` | One line for Claude Code's status bar: model, context, usage limits and the project phase |
122
153
  | `pjkit context [--dry-run]` | Write or refresh the project block in `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` |
123
154
  | `pjkit skills list\|show\|mark` | Recommended third-party skills, their install command, and what the project decided |
124
155
 
125
- Useful `init` options: `--project-name`, `--language` (language of the generated documents),
156
+ Useful `init` options: `--from <path>`, `--mode quick|full`, `--no-context`, `--project-name`, `--language` (language of the generated documents),
126
157
  `--agents claude,codex,...` (the AI agents you use; asked when there is a terminal),
127
158
  `--agent claude|none` (open the agent or not), `--provider github|gitlab|none` and
128
159
  `--ai-coauthor keep|remove`.
@@ -136,6 +167,31 @@ writes the context file each one reads (`CLAUDE.md`, `AGENTS.md`, `GEMINI.md`).
136
167
  between its markers is managed; the rest of the file is yours. Only Claude Code is started by
137
168
  `init`; for the others, open the agent and ask it to run the `pk-start` skill.
138
169
 
170
+ ## Small projects: quick mode
171
+
172
+ Not every project needs seven phases. `pjkit init --mode quick` (or answer yes when `init` asks
173
+ whether it is a small project) skips *decide*, *workflow* and *foundations*: you go from the
174
+ brief to the plan, and the stack is taken from the brief. `pjkit mode full` brings the phases
175
+ back, `pjkit mode` shows where you are, and `pjkit status` says which phases are skipped and why.
176
+
177
+ ## Checking that it is really done
178
+
179
+ The agent that built a feature should not be the only one to decide it is finished.
180
+ `/pk-verify` is a second opinion: it reads the issue's acceptance criteria, runs the project's
181
+ own tests and gives a verdict per criterion with evidence (`PASS`, `FAIL` or `INCOMPLETE`),
182
+ without touching any file. In Claude Code, `init` also installs the `pk-reviewer` subagent
183
+ (`.claude/agents/`), read-only, so the check runs in a context separate from the implementation.
184
+
185
+ `pjkit trace` shows the links between what was asked and what exists. Each acceptance criterion
186
+ has a stable name, `<issue id>#<position>` (`login#2`); write it in a test name or a spec and
187
+ `trace` lists the issues with no spec, the specs with no test, the criteria with no test, the
188
+ decisions nobody mentions and the references to things that do not exist. A link is a mention:
189
+ it shows what is missing, not that a test is any good, which is what `/pk-verify` is for.
190
+
191
+ `pjkit approve` refuses to sign off a phase whose documents still have
192
+ `[NEEDS CLARIFICATION]` markers (it asks if you are at a terminal; `--allow-open-questions`
193
+ approves anyway).
194
+
139
195
  ## Status bar
140
196
 
141
197
  Claude Code can show a line of your choosing at the bottom of the screen. `pjkit statusline`
@@ -150,14 +206,13 @@ plans) and where the project is in the flow:
150
206
  `.claude/settings.json` (`--remove` undoes it). It is never turned on without a yes. If you
151
207
  already have a status bar, yours is kept and runs first. It is one line: when the terminal is
152
208
  narrow, the cost goes first, then the 7-day limit, the effort and the context. The cost is an
153
- estimate at list price. More in
154
- [docs/statusline.md](https://github.com/miguelmatg/project-kit/blob/main/docs/statusline.md).
209
+ estimate at list price. More in `pjkit docs statusline`.
155
210
 
156
211
  ## GitLab
157
212
 
158
213
  `pjkit init --provider gitlab` makes `provision` use `glab`: phases become milestones, kind,
159
214
  priority, size and status become labels, and an issue board named `project-kit` is built from the
160
- status labels. Details in [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md).
215
+ status labels. Details in `pjkit docs provisioning`.
161
216
 
162
217
  ## Generating a project without GitHub
163
218
 
@@ -171,8 +226,7 @@ project-kit keeps a catalog of third-party skills (UI/UX, motion, accessibility,
171
226
  architecture, browser testing, `grill-me`, `find-skills`...) in `.project-kit/skills-catalog.yml`.
172
227
  `/pk-skills` recommends the ones that fit your brief and decisions, warns when a task would
173
228
  benefit from one you do not have, and records the answer in `.project-kit/skills.yml`. project-kit
174
- never installs a skill: it shows the command and you run it; `pjkit skills detect` records the ones you already have. How the entries were chosen is in
175
- [docs/skills.md](https://github.com/miguelmatg/project-kit/blob/main/docs/skills.md).
229
+ never installs a skill: it shows the command and you run it; `pjkit skills detect` records the ones you already have. How the entries were chosen: `pjkit docs skills`.
176
230
 
177
231
  ## AI co-author
178
232
 
@@ -210,18 +264,10 @@ docs/adr/ one file per decision (created by the phases)
210
264
 
211
265
  ## Documentation
212
266
 
213
- More detail lives in the repository (in Spanish):
214
- [design](https://github.com/miguelmatg/project-kit/blob/main/docs/design.md),
215
- [backlog schema](https://github.com/miguelmatg/project-kit/blob/main/docs/backlog-schema.md),
216
- [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md) and
217
- [Spec Kit handoff](https://github.com/miguelmatg/project-kit/blob/main/docs/handoff.md).
218
-
219
- ## Feedback
220
-
221
- Ideas and bug reports are welcome as
222
- [issues](https://github.com/miguelmatg/project-kit/issues). Pull requests are not accepted; see
223
- [CONTRIBUTING](https://github.com/miguelmatg/project-kit/blob/main/CONTRIBUTING.md).
267
+ The detailed guides ship with the program (in Spanish). `pjkit docs` lists them and
268
+ `pjkit docs <topic>` prints one: `upgrade`, `provisioning`, `handoff`, `backlog-schema`, `skills`,
269
+ `statusline` and `agents`.
224
270
 
225
271
  ## License
226
272
 
227
- [MIT](https://github.com/miguelmatg/project-kit/blob/main/LICENSE)
273
+ MIT.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "0.4.0"
3
+ version = "0.5.1"
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"
@@ -26,10 +26,6 @@ dependencies = ["pyyaml>=6.0.3"]
26
26
  [[project.authors]]
27
27
  name = "Miguel Tomás"
28
28
 
29
- [project.urls]
30
- Repository = "https://github.com/miguelmatg/project-kit"
31
- Issues = "https://github.com/miguelmatg/project-kit/issues"
32
-
33
29
  [project.scripts]
34
30
  pjkit = "project_kit.entry:main"
35
31
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "0.4.0"
3
+ version = "0.5.1"
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"
@@ -20,10 +20,6 @@ dependencies = [
20
20
  "pyyaml>=6.0.3",
21
21
  ]
22
22
 
23
- [project.urls]
24
- Repository = "https://github.com/miguelmatg/project-kit"
25
- Issues = "https://github.com/miguelmatg/project-kit/issues"
26
-
27
23
  [project.scripts]
28
24
  pjkit = "project_kit.entry:main"
29
25
 
@@ -1,5 +1,6 @@
1
1
  """Approval gates: record that the user signed off on a phase."""
2
2
 
3
+ import re
3
4
  from pathlib import Path
4
5
 
5
6
  from project_kit.backlog import load_backlog
@@ -8,6 +9,47 @@ from project_kit.handoff import CONSTITUTION, INPUT_FILE, constitution_ready
8
9
  from project_kit.state import PHASES, State, StateError, load_state, save_state
9
10
  from project_kit.workflow import load_workflow
10
11
 
12
+ _MARKER = re.compile(r"\[NEEDS CLARIFICATION\b[^\]]*\]?")
13
+ _COMMENT = re.compile(r"<!--.*?-->", re.DOTALL)
14
+ _MAX_SHOWN = 8
15
+
16
+
17
+ def open_questions(root: Path, phase: str) -> list[tuple[str, int, str]]:
18
+ """Unresolved ``[NEEDS CLARIFICATION: ...]`` markers in the documents the phase produces.
19
+
20
+ Returns (file, line, text). A marker inside an HTML comment is a template's instruction, not
21
+ a question, and is ignored. Files that do not exist are skipped.
22
+ """
23
+ step = next((s for s in load_workflow(root).steps if s.id == phase), None)
24
+ if step is None:
25
+ return []
26
+ paths: list[Path] = []
27
+ for produced in step.produces:
28
+ target = root / produced
29
+ if target.is_dir():
30
+ paths += sorted(target.rglob("*.md"))
31
+ elif target.is_file() and target.suffix == ".md":
32
+ paths.append(target)
33
+ found = []
34
+ for path in paths:
35
+ try:
36
+ text = path.read_text(encoding="utf-8")
37
+ except (OSError, UnicodeDecodeError):
38
+ continue
39
+ text = _COMMENT.sub(lambda m: "\n" * m.group(0).count("\n"), text) # keep line numbers
40
+ for number, line in enumerate(text.splitlines(), 1):
41
+ if match := _MARKER.search(line):
42
+ found.append((path.relative_to(root).as_posix(), number, match.group(0)[:100]))
43
+ return found
44
+
45
+
46
+ def describe_open_questions(found: list[tuple[str, int, str]]) -> str:
47
+ shown = [f" {path}:{line} {text}" for path, line, text in found[:_MAX_SHOWN]]
48
+ more = len(found) - _MAX_SHOWN
49
+ if more > 0:
50
+ shown.append(f" ... and {more} more")
51
+ return f"{len(found)} unresolved [NEEDS CLARIFICATION] marker(s):\n" + "\n".join(shown)
52
+
11
53
 
12
54
  def approve_phase(root: Path, phase: str) -> State:
13
55
  """Record the approval of ``phase`` in the project state.
@@ -0,0 +1,20 @@
1
+ # Agentes de IA
2
+
3
+ `pjkit init --agents claude,codex,...` instala las skills donde cada agente las lee y, al
4
+ terminar el handoff, escribe su fichero de contexto. Esta tabla recoge lo que **dice la
5
+ documentación oficial** (comprobada el 2026-10-18) y lo que no pudo confirmarse.
6
+
7
+ | Agente | Skills del proyecto | Contexto | Lo que se confirmó |
8
+ |---|---|---|---|
9
+ | Claude Code | `.claude/skills` | `CLAUDE.md` | Rutas conocidas del propio producto |
10
+ | Codex CLI | `.agents/skills` | `AGENTS.md` | Skills: documentación de Codex. `AGENTS.md`: su documentación lo enlaza, pero la página consultada no explica la relación |
11
+ | Gemini CLI | `.agents/skills` (alias de `.gemini/skills`) | `GEMINI.md` | Skills y `GEMINI.md`: documentación oficial. `.agents/skills` gana a `.gemini/skills` si hay conflicto |
12
+ | GitHub Copilot | `.agents/skills` (también lee `.github/skills` y `.claude/skills`) | `AGENTS.md` | Skills: documentación oficial. `AGENTS.md`: anuncio oficial para el agente de código; **no se pudo confirmar para Copilot CLI** |
13
+ | Cursor | `.agents/skills` (también `.cursor/skills`) | `AGENTS.md` | Skills: documentación oficial. **`AGENTS.md` no pudo confirmarse en la documentación de Cursor**; hay fuentes de terceros que sí lo afirman |
14
+
15
+ Como Codex, Gemini, Copilot y Cursor comparten `.agents/skills`, las skills se instalan una vez.
16
+ Solo Claude Code se arranca desde `init`: cada herramienta invoca las skills de forma distinta y
17
+ project-kit no lo adivina.
18
+
19
+ Si una herramienta no lee `AGENTS.md`, el bloque que escribe `pjkit context` no le llega; en ese
20
+ caso añade a mano una línea que lo referencie en el fichero que sí lee.
@@ -0,0 +1,81 @@
1
+ # Esquema de `backlog.json`
2
+
3
+ Fuente de verdad del backlog del proyecto. Lo genera la skill `pk-plan`, lo valida
4
+ `pjkit backlog validate` y lo consume `provision` para crear milestones, labels,
5
+ issues y los campos del Project. Vive en `.project-kit/backlog.json` del proyecto destino.
6
+
7
+ Un ejemplo completo y válido se instala en `.project-kit/templates/backlog.example.json`
8
+ (fuente: `src/project_kit/assets/templates/backlog.example.json`).
9
+
10
+ ## Estructura
11
+
12
+ ```json
13
+ {
14
+ "version": 1,
15
+ "phases": [ ... ],
16
+ "labels": [ ... ],
17
+ "issues": [ ... ]
18
+ }
19
+ ```
20
+
21
+ Los campos desconocidos son un error (protege de erratas). La versión actual del formato es `1`.
22
+
23
+ ### `phases` — fases
24
+
25
+ Cada fase es un milestone en el proveedor y una opción del campo `Phase` del Project. El orden
26
+ de la lista es el orden de entrega.
27
+
28
+ | Campo | Obligatorio | Descripción |
29
+ |---|---|---|
30
+ | `id` | sí | Identificador estable: minúsculas, dígitos y guiones (`mvp`, `v1-launch`) |
31
+ | `title` | sí | Nombre visible (`v0.1 MVP`). No puede repetirse |
32
+ | `description` | no | Texto del milestone |
33
+
34
+ ### `labels` — labels propios (opcional)
35
+
36
+ Solo los labels **extra**. Los de tipo (`type:feature`…) y prioridad (`P0`…`P3`) los deriva
37
+ `provision` de cada issue y no hay que declararlos.
38
+
39
+ | Campo | Obligatorio | Descripción |
40
+ |---|---|---|
41
+ | `name` | sí | Nombre del label. No puede repetirse |
42
+ | `color` | no | 6 dígitos hexadecimales sin `#` (por defecto `ededed`) |
43
+ | `description` | no | Descripción |
44
+
45
+ ### `issues` — épicas y tarjetas
46
+
47
+ | Campo | Obligatorio | Valores / descripción |
48
+ |---|---|---|
49
+ | `id` | sí | Identificador estable y único. Es la clave en `state.json` (`provider_ids.issues`), así que **no debe cambiar** una vez aprovisionado |
50
+ | `type` | sí | `epic`, `feature`, `adr`, `chore`, `bug`, `docs` (campo `Kind` del Project) |
51
+ | `phase` | sí | `id` de una fase existente |
52
+ | `title` | sí | Título de la issue |
53
+ | `priority` | sí | `P0` (crítica) a `P3` (baja) |
54
+ | `size` | sí | `XS`, `S`, `M`, `L`, `XL` |
55
+ | `parent` | no | `id` de una épica. Una épica no puede tener padre |
56
+ | `body` | no | Contexto en Markdown |
57
+ | `acceptance` | según tipo | Lista de criterios de aceptación (texto, sin `- [ ]`). **Obligatoria** (al menos uno) en `feature`, `bug` y `chore` |
58
+ | `labels` | no | Nombres de labels declarados en `labels` |
59
+
60
+ Las épicas enlazan a sus hijas por `parent`; `provision` genera la checklist de la épica a
61
+ partir de ellas.
62
+
63
+ ## Reglas de validación
64
+
65
+ Se comprueban todas a la vez y se informa de cada problema:
66
+
67
+ - JSON válido, `version` soportada, sin campos desconocidos y con los tipos correctos.
68
+ - Ids con formato válido y sin duplicados (fases, labels e issues).
69
+ - `type`, `priority` y `size` dentro de los valores permitidos.
70
+ - Toda `phase` referenciada existe.
71
+ - Todo `parent` existe y es una épica; una épica no puede tener padre.
72
+ - Todo label usado en una issue está declarado en `labels`.
73
+ - Las `feature`, `bug` y `chore` tienen criterios de aceptación.
74
+
75
+ ## Flujo de aprobación
76
+
77
+ 1. `pk-plan` escribe `.project-kit/backlog.json`.
78
+ 2. `pjkit backlog validate` debe pasar.
79
+ 3. La persona usuaria aprueba el plan de forma explícita.
80
+ 4. `pjkit approve plan` registra la aprobación en `state.json` (con fecha) y avanza la
81
+ fase. Se niega a hacerlo si el backlog no existe o no es válido.