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.
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/PKG-INFO +70 -26
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/README.md +69 -23
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/pyproject.toml +1 -5
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/pyproject.toml.orig +1 -5
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/approval.py +42 -0
- project_kit_cli-0.5.1/src/project_kit/assets/docs/agents.md +20 -0
- project_kit_cli-0.5.1/src/project_kit/assets/docs/backlog-schema.md +81 -0
- project_kit_cli-0.5.1/src/project_kit/assets/docs/handoff.md +128 -0
- project_kit_cli-0.5.1/src/project_kit/assets/docs/provisioning.md +136 -0
- project_kit_cli-0.5.1/src/project_kit/assets/docs/skills.md +63 -0
- project_kit_cli-0.5.1/src/project_kit/assets/docs/statusline.md +58 -0
- project_kit_cli-0.5.1/src/project_kit/assets/docs/upgrade.md +47 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-amend/SKILL.md +2 -0
- project_kit_cli-0.5.1/src/project_kit/assets/skills/pk-import/SKILL.md +62 -0
- project_kit_cli-0.5.1/src/project_kit/assets/skills/pk-next/SKILL.md +46 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-plan/SKILL.md +5 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-start/SKILL.md +14 -3
- project_kit_cli-0.5.1/src/project_kit/assets/skills/pk-verify/SKILL.md +74 -0
- project_kit_cli-0.5.1/src/project_kit/assets/subagents/pk-reviewer.md +26 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/interview.md +4 -2
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/backlog.py +1 -1
- project_kit_cli-0.5.1/src/project_kit/claude_hooks.py +100 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/cli.py +244 -2
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/config.py +14 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/context_files.py +31 -1
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/doctor.py +13 -3
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/help.py +6 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/installer.py +6 -0
- project_kit_cli-0.5.1/src/project_kit/next_step.py +134 -0
- project_kit_cli-0.5.1/src/project_kit/sources.py +243 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/statusline.py +31 -1
- project_kit_cli-0.5.1/src/project_kit/trace.py +272 -0
- project_kit_cli-0.5.1/src/project_kit/userdocs.py +41 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/workflow.py +12 -8
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/LICENSE +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/__init__.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/__main__.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/agents.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/ai_attribution.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/hooks/commit-msg +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/project/skills-catalog.yml +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/project/workflow.yml +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-decide/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-discover/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-foundations/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-grill/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-handoff/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-provision/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-skills/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-workflow/SKILL.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/adr.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/backlog.example.json +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/brief.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/constitution-input.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/development-workflow.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/adr.yml +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/bug.yml +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/config.yml +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/epic.yml +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/feature.yml +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/pull_request_template.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/adr.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/bug.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/epic.md +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/feature.md +0 -0
- {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
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/entry.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/fsutil.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/gh.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/glab.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/handoff.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/labels.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/manifest.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/project_choice.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/providers/__init__.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/providers/github.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/providers/gitlab.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/provision.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/provision_gitlab.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/provision_issues.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/skills.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/state.py +0 -0
- {project_kit_cli-0.4.0 → project_kit_cli-0.5.1}/src/project_kit/templating.py +0 -0
- {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.
|
|
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
|
[](https://pypi.org/project/project-kit-cli/)
|
|
24
|
-
[](https://
|
|
22
|
+
[](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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
291
|
+
MIT.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# project-kit
|
|
2
2
|
|
|
3
3
|
[](https://pypi.org/project/project-kit-cli/)
|
|
4
|
-
[](https://
|
|
4
|
+
[](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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
273
|
+
MIT.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "project-kit-cli"
|
|
3
|
-
version = "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.
|
|
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.
|