project-kit-cli 0.5.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.5.0/README.md → project_kit_cli-0.5.1/PKG-INFO +27 -20
  2. project_kit_cli-0.5.0/PKG-INFO → project_kit_cli-0.5.1/README.md +9 -40
  3. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/pyproject.toml +1 -5
  4. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/pyproject.toml.orig +1 -5
  5. project_kit_cli-0.5.1/src/project_kit/assets/docs/agents.md +20 -0
  6. project_kit_cli-0.5.1/src/project_kit/assets/docs/backlog-schema.md +81 -0
  7. project_kit_cli-0.5.1/src/project_kit/assets/docs/handoff.md +128 -0
  8. project_kit_cli-0.5.1/src/project_kit/assets/docs/provisioning.md +136 -0
  9. project_kit_cli-0.5.1/src/project_kit/assets/docs/skills.md +63 -0
  10. project_kit_cli-0.5.1/src/project_kit/assets/docs/statusline.md +58 -0
  11. project_kit_cli-0.5.1/src/project_kit/assets/docs/upgrade.md +47 -0
  12. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/backlog.py +1 -1
  13. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/cli.py +18 -0
  14. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/help.py +1 -0
  15. project_kit_cli-0.5.1/src/project_kit/userdocs.py +41 -0
  16. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/LICENSE +0 -0
  17. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/__init__.py +0 -0
  18. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/__main__.py +0 -0
  19. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/agents.py +0 -0
  20. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/ai_attribution.py +0 -0
  21. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/approval.py +0 -0
  22. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/hooks/commit-msg +0 -0
  23. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/project/skills-catalog.yml +0 -0
  24. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/project/workflow.yml +0 -0
  25. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-amend/SKILL.md +0 -0
  26. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-decide/SKILL.md +0 -0
  27. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-discover/SKILL.md +0 -0
  28. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-foundations/SKILL.md +0 -0
  29. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-grill/SKILL.md +0 -0
  30. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-handoff/SKILL.md +0 -0
  31. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-import/SKILL.md +0 -0
  32. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-next/SKILL.md +0 -0
  33. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-plan/SKILL.md +0 -0
  34. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-provision/SKILL.md +0 -0
  35. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-skills/SKILL.md +0 -0
  36. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-start/SKILL.md +0 -0
  37. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-verify/SKILL.md +0 -0
  38. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/skills/pk-workflow/SKILL.md +0 -0
  39. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/subagents/pk-reviewer.md +0 -0
  40. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/adr.md +0 -0
  41. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/backlog.example.json +0 -0
  42. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/brief.md +0 -0
  43. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/constitution-input.md +0 -0
  44. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/development-workflow.md +0 -0
  45. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/adr.yml +0 -0
  46. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/bug.yml +0 -0
  47. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/config.yml +0 -0
  48. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/epic.yml +0 -0
  49. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/feature.yml +0 -0
  50. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/github/pull_request_template.md +0 -0
  51. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/adr.md +0 -0
  52. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/bug.md +0 -0
  53. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/epic.md +0 -0
  54. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/issue_templates/feature.md +0 -0
  55. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/gitlab/merge_request_templates/Default.md +0 -0
  56. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/assets/templates/interview.md +0 -0
  57. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/claude_hooks.py +0 -0
  58. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/config.py +0 -0
  59. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/context_files.py +0 -0
  60. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/doctor.py +0 -0
  61. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/entry.py +0 -0
  62. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/fsutil.py +0 -0
  63. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/gh.py +0 -0
  64. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/glab.py +0 -0
  65. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/handoff.py +0 -0
  66. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/installer.py +0 -0
  67. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/labels.py +0 -0
  68. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/manifest.py +0 -0
  69. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/next_step.py +0 -0
  70. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/project_choice.py +0 -0
  71. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/providers/__init__.py +0 -0
  72. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/providers/github.py +0 -0
  73. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/providers/gitlab.py +0 -0
  74. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/provision.py +0 -0
  75. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/provision_gitlab.py +0 -0
  76. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/provision_issues.py +0 -0
  77. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/skills.py +0 -0
  78. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/sources.py +0 -0
  79. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/state.py +0 -0
  80. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/statusline.py +0 -0
  81. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/templating.py +0 -0
  82. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/trace.py +0 -0
  83. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/upgrade.py +0 -0
  84. {project_kit_cli-0.5.0 → project_kit_cli-0.5.1}/src/project_kit/workflow.py +0 -0
@@ -1,7 +1,25 @@
1
+ Metadata-Version: 2.4
2
+ Name: project-kit-cli
3
+ Version: 0.5.1
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: Topic :: Software Development
15
+ Requires-Dist: pyyaml>=6.0.3
16
+ Requires-Python: >=3.12
17
+ Description-Content-Type: text/markdown
18
+
1
19
  # project-kit
2
20
 
3
21
  [![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)
22
+ [![License: MIT](https://img.shields.io/pypi/l/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
5
23
 
6
24
  **Everything that happens before the first line of code.** project-kit guides you, with an AI
7
25
  agent, through defining a project, deciding its stack and architecture, agreeing how the team
@@ -49,8 +67,7 @@ installing: `uvx --from project-kit-cli pjkit help`.
49
67
  **Updating a project.** `init` copies the skills and templates into your repository and never
50
68
  overwrites them, so a new version of the program does not change a project that already exists.
51
69
  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).
70
+ to bring it up to date. Files you edited are never overwritten; see `pjkit docs upgrade`.
54
71
 
55
72
  ## Quick start
56
73
 
@@ -207,14 +224,13 @@ plans) and where the project is in the flow:
207
224
  `.claude/settings.json` (`--remove` undoes it). It is never turned on without a yes. If you
208
225
  already have a status bar, yours is kept and runs first. It is one line: when the terminal is
209
226
  narrow, the cost goes first, then the 7-day limit, the effort and the context. The cost is an
210
- estimate at list price. More in
211
- [docs/statusline.md](https://github.com/miguelmatg/project-kit/blob/main/docs/statusline.md).
227
+ estimate at list price. More in `pjkit docs statusline`.
212
228
 
213
229
  ## GitLab
214
230
 
215
231
  `pjkit init --provider gitlab` makes `provision` use `glab`: phases become milestones, kind,
216
232
  priority, size and status become labels, and an issue board named `project-kit` is built from the
217
- status labels. Details in [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md).
233
+ status labels. Details in `pjkit docs provisioning`.
218
234
 
219
235
  ## Generating a project without GitHub
220
236
 
@@ -228,8 +244,7 @@ project-kit keeps a catalog of third-party skills (UI/UX, motion, accessibility,
228
244
  architecture, browser testing, `grill-me`, `find-skills`...) in `.project-kit/skills-catalog.yml`.
229
245
  `/pk-skills` recommends the ones that fit your brief and decisions, warns when a task would
230
246
  benefit from one you do not have, and records the answer in `.project-kit/skills.yml`. project-kit
231
- 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
232
- [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`.
233
248
 
234
249
  ## AI co-author
235
250
 
@@ -267,18 +282,10 @@ docs/adr/ one file per decision (created by the phases)
267
282
 
268
283
  ## Documentation
269
284
 
270
- More detail lives in the repository (in Spanish):
271
- [design](https://github.com/miguelmatg/project-kit/blob/main/docs/design.md),
272
- [backlog schema](https://github.com/miguelmatg/project-kit/blob/main/docs/backlog-schema.md),
273
- [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md) and
274
- [Spec Kit handoff](https://github.com/miguelmatg/project-kit/blob/main/docs/handoff.md).
275
-
276
- ## Feedback
277
-
278
- Ideas and bug reports are welcome as
279
- [issues](https://github.com/miguelmatg/project-kit/issues). Pull requests are not accepted; see
280
- [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`.
281
288
 
282
289
  ## License
283
290
 
284
- [MIT](https://github.com/miguelmatg/project-kit/blob/main/LICENSE)
291
+ MIT.
@@ -1,27 +1,7 @@
1
- Metadata-Version: 2.4
2
- Name: project-kit-cli
3
- Version: 0.5.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: Topic :: Software Development
15
- Requires-Dist: pyyaml>=6.0.3
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
- Description-Content-Type: text/markdown
20
-
21
1
  # project-kit
22
2
 
23
3
  [![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)
4
+ [![License: MIT](https://img.shields.io/pypi/l/project-kit-cli)](https://pypi.org/project/project-kit-cli/)
25
5
 
26
6
  **Everything that happens before the first line of code.** project-kit guides you, with an AI
27
7
  agent, through defining a project, deciding its stack and architecture, agreeing how the team
@@ -69,8 +49,7 @@ installing: `uvx --from project-kit-cli pjkit help`.
69
49
  **Updating a project.** `init` copies the skills and templates into your repository and never
70
50
  overwrites them, so a new version of the program does not change a project that already exists.
71
51
  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).
52
+ to bring it up to date. Files you edited are never overwritten; see `pjkit docs upgrade`.
74
53
 
75
54
  ## Quick start
76
55
 
@@ -227,14 +206,13 @@ plans) and where the project is in the flow:
227
206
  `.claude/settings.json` (`--remove` undoes it). It is never turned on without a yes. If you
228
207
  already have a status bar, yours is kept and runs first. It is one line: when the terminal is
229
208
  narrow, the cost goes first, then the 7-day limit, the effort and the context. The cost is an
230
- estimate at list price. More in
231
- [docs/statusline.md](https://github.com/miguelmatg/project-kit/blob/main/docs/statusline.md).
209
+ estimate at list price. More in `pjkit docs statusline`.
232
210
 
233
211
  ## GitLab
234
212
 
235
213
  `pjkit init --provider gitlab` makes `provision` use `glab`: phases become milestones, kind,
236
214
  priority, size and status become labels, and an issue board named `project-kit` is built from the
237
- status labels. Details in [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md).
215
+ status labels. Details in `pjkit docs provisioning`.
238
216
 
239
217
  ## Generating a project without GitHub
240
218
 
@@ -248,8 +226,7 @@ project-kit keeps a catalog of third-party skills (UI/UX, motion, accessibility,
248
226
  architecture, browser testing, `grill-me`, `find-skills`...) in `.project-kit/skills-catalog.yml`.
249
227
  `/pk-skills` recommends the ones that fit your brief and decisions, warns when a task would
250
228
  benefit from one you do not have, and records the answer in `.project-kit/skills.yml`. project-kit
251
- 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
252
- [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`.
253
230
 
254
231
  ## AI co-author
255
232
 
@@ -287,18 +264,10 @@ docs/adr/ one file per decision (created by the phases)
287
264
 
288
265
  ## Documentation
289
266
 
290
- More detail lives in the repository (in Spanish):
291
- [design](https://github.com/miguelmatg/project-kit/blob/main/docs/design.md),
292
- [backlog schema](https://github.com/miguelmatg/project-kit/blob/main/docs/backlog-schema.md),
293
- [provisioning](https://github.com/miguelmatg/project-kit/blob/main/docs/provisioning.md) and
294
- [Spec Kit handoff](https://github.com/miguelmatg/project-kit/blob/main/docs/handoff.md).
295
-
296
- ## Feedback
297
-
298
- Ideas and bug reports are welcome as
299
- [issues](https://github.com/miguelmatg/project-kit/issues). Pull requests are not accepted; see
300
- [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`.
301
270
 
302
271
  ## License
303
272
 
304
- [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.5.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.5.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
 
@@ -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.
@@ -0,0 +1,128 @@
1
+ # Relevo a Spec Kit
2
+
3
+ `pjkit handoff` cierra el trabajo de project-kit y deja el proyecto listo para que
4
+ [Spec Kit](https://github.com/github/spec-kit) defina e implemente cada spec.
5
+
6
+ ```
7
+ pjkit handoff [--install-speckit] [--dry-run] [--yes]
8
+ ```
9
+
10
+ El único contrato con Spec Kit es **un fichero de texto** y sus comandos públicos. project-kit
11
+ **no escribe nunca dentro de `.specify/`**: Spec Kit es el dueño de
12
+ `.specify/memory/constitution.md`.
13
+
14
+ ## Qué hace
15
+
16
+ 1. **Detecta Spec Kit**: el ejecutable `specify` (y su versión) y el directorio `.specify/`
17
+ (y la versión con la que se inicializó).
18
+ 2. **Genera `.project-kit/handoff/constitution-input.md`**: el texto que se pasa a
19
+ `/speckit-constitution`, en el orden que usa su plantilla (principios, restricciones, flujo
20
+ de trabajo y puertas de calidad, gobierno). Es determinista: con las mismas entradas sale
21
+ siempre lo mismo.
22
+ 3. **Instala Spec Kit si falta** (solo con `--install-speckit` y tras confirmar).
23
+ 4. **Indica los pasos siguientes**, sin ejecutarlos: el comando de la constitución y la
24
+ relación entre las issues del backlog y las specs.
25
+
26
+ ## De dónde salen los datos
27
+
28
+ | En la constitución | Origen |
29
+ |---|---|
30
+ | Nombre, idioma y nombres de las ramas | `.project-kit/config.yml` |
31
+ | Patrón de rama de una spec y estrategia de fusión por rama | `workflow:` de `.project-kit/config.yml` (lo escribe `/pk-workflow`) |
32
+ | Principios y Definition of Done | Plantilla genérica (ver abajo) |
33
+ | Decisiones registradas | `docs/adr/*.md`: título y, si lo tienen, el estado (`Status: Accepted`) |
34
+ | Documentos y fases | `docs/project/brief.md`, `docs/project/roadmap.md` y las fases del backlog, si existen |
35
+ | Dónde viven las reglas (índice) | Lo que existe en el proyecto: ver "Índice de reglas" |
36
+ | Reglas propias del proyecto | `.project-kit/handoff/constitution-extra.md`, si existe |
37
+ | Stack | "Definido por las decisiones" si hay ADRs; si no, "pendiente de un ADR" |
38
+
39
+ El patrón de rama y la estrategia de fusión salen de datos, no de la prosa de
40
+ `docs/development-workflow.md`, así que `/pk-workflow` los guarda en `config.yml` además de en
41
+ el documento:
42
+
43
+ ```yaml
44
+ workflow:
45
+ spec_branch: "spec/<name>" # por defecto NNN-name
46
+ merge: # squash | merge | rebase
47
+ develop: squash
48
+ release: merge
49
+ main: merge
50
+ ```
51
+
52
+ ### Índice de reglas
53
+
54
+ La constitución incluye una sección **"Where the project's rules live"** que dice dónde mirar
55
+ para cada cosa en lugar de repetirlo en cada spec. Solo aparecen las fuentes que el proyecto
56
+ tiene:
57
+
58
+ - **Tareas y seguimiento**: el GitHub Project (título y URL, guardados al hacer `provision`) y
59
+ las issues son la fuente de verdad; una issue es una spec y su PR la cierra (`Closes #N`); no
60
+ hay una lista de tareas paralela; la tarjeta pasa a In progress, In review y Done.
61
+ - **Backlog** (`.project-kit/backlog.json`), **alcance** (`brief.md`), **hoja de ruta**
62
+ (`roadmap.md`), **decisiones** (`docs/adr/`), **proceso** (`docs/development-workflow.md`) y
63
+ las **plantillas** de PR e issues.
64
+
65
+ ### Ficheros temporales
66
+
67
+ `constitution-input.md` y `constitution-extra.md` solo existen para alimentar
68
+ `/speckit-constitution`. Cuando la constitución real está escrita, la fuente única es ella, y
69
+ **`pjkit approve handoff` los borra**. Para poder aprobar, `.specify/memory/constitution.md`
70
+ tiene que existir y no ser ya la plantilla de Spec Kit (la plantilla vacía está llena de
71
+ marcadores `[EN_MAYÚSCULAS]`; una constitución escrita no tiene ninguno). Si se vuelve a ejecutar
72
+ `handoff` después, avisa de que ya está hecho y no recrea el fichero. Para cambiar las reglas
73
+ desde entonces se enmienda la constitución con `/speckit-constitution`.
74
+
75
+ ### Fichero regenerable y reglas propias
76
+
77
+ `constitution-input.md` lleva la cabecera `<!-- project-kit:managed -->`: se **regenera** cada
78
+ vez que cambian las entradas, hasta que se aprueba el relevo. Para añadir reglas del proyecto
79
+ (seguridad, cumplimiento normativo, convenciones del equipo) no se edita ese fichero: se
80
+ escriben en **`constitution-extra.md`**, que project-kit nunca toca y se añade al final como
81
+ "Project-specific rules". Solo contenido de gobierno: Spec Kit rechaza peticiones de construir
82
+ funcionalidades. Ya no hace falta usarlo para corregir el flujo de ramas: eso sale de
83
+ `config.yml`.
84
+
85
+ Si alguien borra la cabecera de `constitution-input.md`, el fichero pasa a ser suyo y deja de
86
+ regenerarse (se avisa; para volver a generarlo basta borrarlo).
87
+
88
+ ### Plantilla sobrescribible
89
+
90
+ El texto base se instala con `init` en `.project-kit/templates/constitution-input.md` y puede
91
+ editarse. Usa variables `{{...}}` (`project_name`, `language`, `provider`, `branches.main`,
92
+ `branches.release`, `branches.develop`, `spec_branch`, `merge_summary`, `stack`, `references`,
93
+ `decisions`, `rules_index`, `extra`). Una variable desconocida (una errata) es un error, no se
94
+ cuela en el resultado.
95
+
96
+ ## Instalar Spec Kit
97
+
98
+ Con `--install-speckit`, project-kit muestra lo que va a ejecutar y pregunta antes (`--yes`
99
+ omite la pregunta):
100
+
101
+ | Situación | Comando |
102
+ |---|---|
103
+ | No hay CLI de Spec Kit | `uv tool install specify-cli` |
104
+ | No está inicializado en el repositorio | `specify init --here --integration claude --force --non-interactive` |
105
+
106
+ - Necesita `uv`. Si falta, lo dice y propone instalar el paquete `specify-cli` por otro medio.
107
+ - `specify init` **fusiona** sus ficheros con los existentes. Se ha comprobado que respeta los
108
+ del proyecto y los de project-kit; lo único que toca es `.claude/settings.json`, que
109
+ reformatea conservando su contenido.
110
+ - Si tras instalar el CLI no está en el PATH, indica `uv tool update-shell`.
111
+ - Un fallo en cualquier paso detiene el proceso.
112
+
113
+ ## Versiones
114
+
115
+ project-kit se ha probado con Spec Kit **1.2.x**. Ante otra versión **avisa y continúa**:
116
+ como solo depende del fichero de entrada, debería seguir funcionando.
117
+
118
+ ## Después del relevo
119
+
120
+ 1. En Claude Code: `/speckit-constitution @.project-kit/handoff/constitution-input.md`
121
+ 2. Opcional: mencionar `docs/project/` y `docs/adr/` en `CLAUDE.md` o `AGENTS.md`, para que
122
+ `/speckit-specify` y `/speckit-plan` los lean.
123
+ 3. Cada issue del backlog es candidata a una spec; su texto sirve de entrada a
124
+ `/speckit-specify`.
125
+ 4. Cuando la constitución esté creada: `pjkit approve handoff` (borra los ficheros
126
+ temporales del relevo).
127
+
128
+ Las skills `pk-handoff` y `pk-provision` guían estos pasos desde Claude Code.
@@ -0,0 +1,136 @@
1
+ # Provisionado en GitHub
2
+
3
+ `pjkit provision` crea en el repositorio lo que el backlog necesita: milestones, labels,
4
+ ramas permanentes, el Project con sus campos y las issues.
5
+
6
+ ```
7
+ pjkit provision [--repo owner/nombre] [--project número|título] [--dry-run] [--yes]
8
+ ```
9
+
10
+ ## Cómo funciona
11
+
12
+ 1. **Planifica** leyendo GitHub (solo lectura): qué existe ya.
13
+ 2. **Muestra el plan**: lo que se va a crear y lo que ya está.
14
+ 3. **Pide confirmación** (`[y/N]`). Sin terminal o con cualquier respuesta distinta de `y`,
15
+ no hace nada. `--yes` omite la pregunta.
16
+ 4. **Aplica**, en este orden: milestones, labels, ramas, Project y campos, issues, enlaces de
17
+ las épicas y tarjetas del Project.
18
+
19
+ `--dry-run` hace solo los pasos 1 y 2 y no modifica nada, ni en GitHub ni en `state.json`.
20
+ Para aplicar hay que haber aprobado el plan (`pjkit approve plan`).
21
+
22
+ ## Qué se crea
23
+
24
+ | Elemento | Origen | Detalle |
25
+ |---|---|---|
26
+ | Milestones | Una por fase del backlog | El id se guarda en `state.json` (`provider_ids.milestones`) |
27
+ | Labels | Derivados de las issues y declarados en `labels` | `type:epic`, `type:feature`, `type:adr`, `type:chore`, `type:docs`, `bug`, `P0`–`P3`; solo los que el backlog usa, más los declarados |
28
+ | Ramas | `config.yml` → `branches` | `release` y `develop` si faltan, creadas desde `main` |
29
+ | Project | El que ya tengas (ver abajo) o uno nuevo, `<project_name> Roadmap` por defecto | Vinculado al repositorio |
30
+ | Campos | Del backlog | `Phase` (una opción por fase), `Kind` (Epic, Feature, ADR, Chore, Bug, Docs), `Priority` (P0–P3), `Size` (XS–XL) y `Status` (Backlog, Ready, In progress, In review, Done) |
31
+ | Issues | Una por entrada del backlog | Milestone de su fase, labels de tipo y prioridad más los suyos, y un cuerpo con contexto, criterios de aceptación y una marca oculta (`<!-- project-kit:id=… -->`) |
32
+ | Épicas | Las issues con `parent` | La épica lleva una checklist de sus hijas; cada hija dice `Part of #N` |
33
+ | Tarjetas | Cada issue en el Project | Con `Status`, `Phase`, `Kind`, `Priority` y `Size` |
34
+
35
+ Las épicas se crean antes que sus hijas, para poder enlazarlas.
36
+
37
+ ## Idempotencia y reanudación
38
+
39
+ - Solo se crea lo que **falta**. Lo que ya existe no se toca, aunque su color, descripción o
40
+ contenido sean distintos: nunca se pisan ediciones manuales.
41
+ - Ejecutarlo dos veces seguidas no cambia nada y la segunda no pregunta. Si el estado local se
42
+ perdió pero todo existe en GitHub, esa ejecución lo reconstruye sin escribir en GitHub.
43
+ - Cada issue se reconoce por su marca oculta, además de por `state.json`: perder el estado no
44
+ duplica issues.
45
+ - Si algo falla a mitad (GitHub da 502 o limita las peticiones), el progreso queda guardado y
46
+ basta con repetir el comando. Cada ejecución vuelve a leer GitHub, no confía en un plan
47
+ anterior.
48
+
49
+ ## Qué no se pisa nunca
50
+
51
+ - **Issues existentes:** no se reescriben el título ni el cuerpo. La única excepción es el
52
+ bloque de hijas de una épica (entre `project-kit:children:start` y `end`), que es de
53
+ project-kit: se actualiza al añadir hijas y **conserva las casillas que ya marcaste**.
54
+ - **Campos del Project:** solo se rellenan los **vacíos**. Una tarjeta que moviste de columna
55
+ o a la que cambiaste la prioridad se queda como la dejaste. `Status` se pone a `Backlog` una
56
+ sola vez, al añadir la tarjeta.
57
+ - **Opciones de campo:** al añadir una fase nueva se añade su opción a `Phase` conservando las
58
+ existentes (y los valores ya asignados).
59
+ - **`Status` personalizado:** solo se sustituye si es el que trae GitHub por defecto
60
+ (`Todo`, `In Progress`, `Done`) **y** el Project no tiene tarjetas todavía, porque
61
+ sustituirlo reinicia el estado de las tarjetas existentes. En cualquier otro caso se deja
62
+ tal cual y se avisa de las opciones que faltan.
63
+
64
+ ## Condiciones que bloquean
65
+
66
+ Se informan con `BLOCKING` y no se aplica nada:
67
+
68
+ - `branches.main` de `config.yml` no es la rama por defecto del repositorio.
69
+ - El repositorio no tiene commits: las ramas nuevas se crean a partir de `main`, así que hace
70
+ falta un commit inicial.
71
+
72
+ ## Límite de peticiones de GitHub
73
+
74
+ Con backlogs grandes GitHub puede limitar las peticiones. project-kit lo detecta, lo explica
75
+ ("espera un minuto y repite") y **no reintenta a ciegas**; como el progreso está guardado,
76
+ repetir el comando continúa donde se quedó.
77
+
78
+ ## Protección de ramas
79
+
80
+ Los repositorios **privados con plan gratuito no permiten** proteger ramas ni crear rulesets.
81
+ project-kit lo detecta consultando el endpoint de rulesets (GitHub responde un 403 con
82
+ "Upgrade to GitHub Pro or make this repository public") y, en ese caso:
83
+
84
+ - **no intenta** proteger ninguna rama,
85
+ - lo indica en cada ejecución,
86
+ - y la política de ramas debe cumplirse **por disciplina**: todo entra por PR hacia `develop`,
87
+ y `release` y `main` solo por promoción.
88
+
89
+ Cuando el repositorio sea público o el plan lo permita, project-kit lo reconoce y lo indica,
90
+ pero **todavía no configura la protección**: hay que activarla a mano.
91
+
92
+ ## Qué Project se usa
93
+
94
+ Antes de crear nada, `provision` busca los Projects **ya vinculados al repositorio** (y uno con
95
+ el título por defecto, aunque no esté vinculado), de modo que funciona igual en un repositorio
96
+ nuevo que en uno que ya tiene su tablero:
97
+
98
+ | Encuentra | Con terminal | Sin terminal o con `--yes` |
99
+ |---|---|---|
100
+ | Ninguno | Pregunta el nombre (Intro: `<project_name> Roadmap`) y lo crea | Lo crea con el nombre por defecto |
101
+ | Uno | Pregunta si usarlo (Intro: sí); si no, pide el nombre de uno nuevo | Lo usa |
102
+ | Varios | Los lista para elegir, con la opción de crear uno nuevo | Se detiene y pide `--project` |
103
+
104
+ `--project` acepta el número o el título exacto de un Project abierto del propietario, o un
105
+ título nuevo para crearlo. Lo elegido se guarda en `.project-kit/state.json` y las siguientes
106
+ ejecuciones lo reutilizan sin preguntar; un `--project` explícito lo sustituye. Un `--dry-run`
107
+ pregunta pero no guarda nada. Los Projects cerrados se ignoran.
108
+
109
+ ## Vistas del Project
110
+
111
+ La API de GitHub no permite crear vistas (Board, Roadmap, tabla). Hay que crearlas a mano una
112
+ vez en la interfaz del Project.
113
+
114
+ ## GitLab
115
+
116
+ Con `provider: gitlab` en `.project-kit/config.yml`, `pjkit provision` usa `glab api` (la API REST
117
+ de GitLab, también en instancias propias) y sigue las mismas reglas: planifica leyendo, enseña,
118
+ pide confirmación y solo crea lo que falta; las issues se reencuentran por su marca
119
+ `project-kit:id` si se pierde el estado.
120
+
121
+ GitLab no tiene los campos de un Project de GitHub, así que:
122
+
123
+ | GitHub | GitLab |
124
+ |---|---|
125
+ | Fase (campo) | Milestone |
126
+ | Tipo y prioridad (labels y campos) | Labels `type:…` y `P0`…`P3` |
127
+ | Tamaño (campo) | Label `size::M` |
128
+ | Estado (campo) | Label `status::Backlog`, `status::In progress`… |
129
+ | Project con vistas | Tablero de issues `project-kit` con una lista por label de estado |
130
+ | Épica con hijas | Issue padre con la lista de hijas (`#N`) |
131
+
132
+ `--project` no se aplica. `doctor` comprueba `glab` y su sesión (`glab auth login`, ámbito
133
+ `api`). Las plantillas de merge request e issues están en `.project-kit/templates/gitlab/`.
134
+
135
+ **Aviso:** esta parte solo se ha probado contra una API simulada, no contra un proyecto GitLab
136
+ real. Lee con atención el `--dry-run` la primera vez y abre una issue si algo no coincide.
@@ -0,0 +1,63 @@
1
+ # Skills recomendadas
2
+
3
+ project-kit no instala skills de terceros: las **recomienda**. El catálogo vive en
4
+ `.project-kit/skills-catalog.yml` (se actualiza con `pjkit upgrade`), la skill `pk-skills` elige
5
+ las que encajan con el proyecto y `.project-kit/skills.yml` guarda qué se decidió con cada una.
6
+
7
+ ```
8
+ pjkit skills list --traits web-ui # lo que ayuda a un proyecto con interfaz
9
+ ```
10
+
11
+ Los rasgos (`--traits`) son: `any`, `web-ui`, `react`, `public-site`, `backend`, `api`,
12
+ `microservices`, `mobile`, `mcp`. Las áreas: `ui-ux`, `motion`, `accessibility`, `seo`,
13
+ `security`, `architecture`, `process`, `testing`, `browser`, `mcp`, `discovery`.
14
+
15
+ ## Criterio de selección (issue #51)
16
+
17
+ Una skill entra en el catálogo si cumple todo esto:
18
+
19
+ 1. **Fuente leída.** Se abrió el repositorio y se anotó la fecha (`checked`). Lo que el
20
+ repositorio no confirma se dice en `notes` o en `license`.
21
+ 2. **Licencia conocida.** Una licencia de compartir igual (CC BY-SA) obliga a instalarla, no a
22
+ copiarla al repositorio del proyecto.
23
+ 3. **Formato `SKILL.md`**, instalable con un comando que el usuario ejecuta.
24
+ 4. **Cubre un trabajo concreto** y declara cuándo conviene (`when`).
25
+ 5. **Sin riesgos silenciosos.** Si una herramienta de análisis marcó la skill, o ejecuta un
26
+ navegador o comandos, se dice antes de instalarla.
27
+
28
+ Se descartó copiar skills dentro de project-kit (*vendoring*): obliga a mantenerlas y a cumplir
29
+ cada licencia. Tampoco se escriben skills propias cuando ya hay una buena; las propias (`pk-*`)
30
+ cubren lo que depende del proyecto: sus reglas, la entrevista crítica y la recomendación.
31
+
32
+ ## Resultado
33
+
34
+ | Área | Skill | Fuente | Licencia | Estado |
35
+ |---|---|---|---|---|
36
+ | process | grill-me | mattpocock/skills | MIT | leída |
37
+ | discovery | find-skills | vercel-labs/skills | MIT | leída; el comando se infiere del patrón `npx skills add` |
38
+ | ui-ux | frontend-design | anthropics/skills | Apache-2.0 según un aviso derivado | **pendiente**: el repositorio no la lista por nombre |
39
+ | ui-ux | Impeccable | pbakaus/impeccable | Apache-2.0 | leída |
40
+ | accessibility | web-design-guidelines | vercel-labs/agent-skills | MIT | leída |
41
+ | architecture | react-best-practices, composition-patterns | vercel-labs/agent-skills | MIT | leída |
42
+ | motion | Emil Kowalski (animate, review-animations...) | emilkowalski/skills | MIT | leída |
43
+ | mcp | mcp-builder | anthropics/skills | sin verificar | **pendiente**: no aparece por nombre |
44
+ | architecture | DDD, hexagonal, clean, microservicios | kayaman/skills | CC0-1.0 | leída |
45
+ | testing | tdd | kayaman/skills | CC0-1.0 | leída |
46
+ | seo | Claude SEO | AgriciDaniel/claude-seo | MIT | leída |
47
+ | security | insecure-defaults, supply-chain-risk-auditor, differential-review, open-sourcing | trailofbits/skills | CC BY-SA 4.0 | leída |
48
+
49
+ Quedan **sin candidata verificada**: marketing, privacidad y cumplimiento, datos y migraciones,
50
+ diseño de API, observabilidad y rendimiento. `accessibility` tiene solo las reglas de Vercel;
51
+ `fixing-accessibility` (ibelick/ui-skills) no pudo confirmarse en el repositorio. Para esos
52
+ huecos, `pk-foundations` escribe las reglas del proyecto y `find-skills` ayuda a buscar.
53
+
54
+ Las reglas de código, testing, seguridad preventiva y documentación **no** se piden a terceros:
55
+ `pk-foundations` las genera con el stack decidido, porque una regla genérica no se cumple.
56
+ Las revisiones de código y de seguridad que ya trae Claude Code (`/code-review`,
57
+ `/security-review`) se enlazan, no se reescriben.
58
+
59
+ ## Cómo se añade una skill al catálogo
60
+
61
+ Edita `src/project_kit/assets/project/skills-catalog.yml` con los campos `id`, `name`, `area`,
62
+ `source`, `install`, `license`, `summary`, `when`, `checked` y, si hace falta, `notes`. Los
63
+ tests validan el formato. Abre antes el repositorio de la skill y anota lo que viste.
@@ -0,0 +1,58 @@
1
+ # Barra de estado
2
+
3
+ `pjkit statusline` escribe **una línea** para la barra de estado del agente: modelo, esfuerzo,
4
+ contexto, límites de uso y la fase del proyecto.
5
+
6
+ ```
7
+ [Opus · high] · ctx 23% · 5h 41% (↻ 17:00) · 7d 12% · ~$1.23 · fase: decide → /pk-decide
8
+ ```
9
+
10
+ ## Activarla
11
+
12
+ ```
13
+ pjkit statusline --install # escribe statusLine en .claude/settings.json
14
+ pjkit statusline --install --dry-run
15
+ pjkit statusline --remove
16
+ ```
17
+
18
+ `init` (en un proyecto nuevo y con terminal) pregunta si la quieres; `/pk-start` también. Sin un
19
+ sí no se toca nada. Con `init --statusline` / `--no-statusline` se decide sin preguntar.
20
+
21
+ Si ya tienes una barra (la del proyecto o la de tu `~/.claude/settings.json`), **se conserva**: se
22
+ configura `pjkit statusline --wrap "<tu comando>"`, que ejecuta primero el tuyo y añade el nuestro
23
+ detrás. `--remove` restaura tu comando. Si prefieres incrustar solo el trozo de project-kit en
24
+ otra barra, usa `pjkit statusline --segment`, que imprime únicamente la fase.
25
+
26
+ ## Qué se muestra y qué se recorta
27
+
28
+ | Parte | Origen |
29
+ |---|---|
30
+ | `[Opus · high]` | modelo y esfuerzo que entrega el agente |
31
+ | `ctx 23%` | contexto usado |
32
+ | `5h 41% (↻ 17:00)`, `7d 12%` | límites de uso de las ventanas de 5 horas y 7 días, con la hora de reinicio (solo planes Pro y Max) |
33
+ | `~$1.23` | coste de la sesión, **estimado** a precio de lista; puede diferir de la factura |
34
+ | `fase: decide → /pk-decide` | `.project-kit/state.json` y `workflow.yml`; no depende del agente |
35
+
36
+ Si la línea no cabe (anchura de `$COLUMNS`, 120 por defecto, o `--width`), se quita primero el
37
+ coste, luego el límite de 7 días, el esfuerzo y el contexto; el límite de 5 horas y la fase son lo
38
+ último en desaparecer. Verde por debajo del 60 %, ámbar hasta el 85 %, rojo a partir de ahí.
39
+ `NO_COLOR` o `--no-color` quitan los colores.
40
+
41
+ Todo es opcional: un campo que falta, un documento que no es JSON o un directorio que no es un
42
+ proyecto no producen errores, solo una línea más corta.
43
+
44
+ ## Rendimiento
45
+
46
+ El comando se ejecuta con cada actualización del agente, así que se despacha desde
47
+ `project_kit/entry.py` antes de cargar el resto del programa. En la máquina donde se midió
48
+ (Windows, con el lanzador de `uv`) tarda unos 140 ms fuera de un proyecto y unos 180 ms dentro de
49
+ uno, que es el coste de leer el YAML del flujo. No usa la red.
50
+
51
+ ## Otros agentes
52
+
53
+ Solo Claude Code tiene hoy una barra de estado documentada
54
+ ([documentación](https://code.claude.com/docs/en/statusline)), así que solo existe su adaptador.
55
+ La lectura de los datos está aislada en `ADAPTERS` (`statusline.py`): un adaptador recibe el
56
+ documento que entrega el agente y devuelve `Metrics`. Para Copilot, Codex, Gemini o Cursor basta
57
+ con escribir su adaptador y registrarlo cuando se confirme que tienen un mecanismo equivalente; la
58
+ parte de project-kit no cambia.
@@ -0,0 +1,47 @@
1
+ # Actualizar un proyecto: `pjkit upgrade`
2
+
3
+ `uv tool upgrade project-kit-cli` actualiza el **programa**. Pero `pjkit init` copia al
4
+ repositorio ficheros que después viven allí por su cuenta (las skills de `.claude/skills/pk-*`,
5
+ las plantillas de `.project-kit/templates/` y `.project-kit/workflow.yml`) y no los sobrescribe
6
+ nunca. Por eso un proyecto ya creado se queda con la versión con la que nació. `upgrade` lo pone
7
+ al día sin pisar lo que hayas editado.
8
+
9
+ ```
10
+ pjkit upgrade # muestra qué cambia; no escribe nada
11
+ pjkit upgrade --diff # además, las diferencias de cada fichero
12
+ pjkit upgrade --apply # lo aplica
13
+ pjkit upgrade --apply --adopt
14
+ ```
15
+
16
+ ## Cómo decide
17
+
18
+ `init` y `upgrade` guardan en `.project-kit/installed.json` la huella (SHA-256) de cada fichero tal
19
+ como lo instalaron. Se versiona con el repositorio. Con ella, para cada fichero:
20
+
21
+ | Situación | Resultado |
22
+ |---|---|
23
+ | Idéntico a la versión actual | Nada que hacer |
24
+ | No lo editaste y el paquete trae una versión nueva | **update**: se reemplaza |
25
+ | Falta (es nuevo en esta versión, o lo borraste) | **add**: se crea |
26
+ | Lo editaste y el paquete no lo cambió | Se deja; no hay nada nuevo |
27
+ | Lo editaste **y** el paquete lo cambió | **conflict**: se queda el tuyo y la versión nueva se deja en `.project-kit/upgrade/new/` para que la mezcles |
28
+ | Difiere y no hay huella registrada (proyecto anterior a esta función) | **unknown**: igual que un conflicto, salvo con `--adopt` |
29
+ | Estaba instalado y ya no se distribuye | **obsolete**: se avisa, nunca se borra |
30
+
31
+ Los saltos de línea CRLF de un checkout de Git en Windows no cuentan como edición.
32
+
33
+ ## Proyectos anteriores al registro
34
+
35
+ Un proyecto creado con una versión que no guardaba huellas no permite saber si un fichero distinto
36
+ es una versión antigua o una edición tuya, y `upgrade` no lo adivina. Los marca `unknown` y, sin
37
+ `--apply --adopt`, no los toca (deja la versión nueva en `.project-kit/upgrade/new/`). Si sabes que
38
+ no los editaste, `--adopt` los reemplaza. Revisa antes el resultado de `pjkit upgrade --diff`.
39
+
40
+ ## Seguridad
41
+
42
+ - Sin `--apply` no se escribe nada.
43
+ - Todo fichero que se reemplaza se copia antes a `.project-kit/upgrade/backup/`.
44
+ - Nunca se pisa un fichero que hayas editado (ni con `--adopt`).
45
+ - `.project-kit/upgrade/` es temporal: cuando hayas revisado o mezclado, bórralo o añádelo a
46
+ `.gitignore`.
47
+ - `config.yml`, `state.json`, el backlog y tus documentos no se tocan.
@@ -1,6 +1,6 @@
1
1
  """.project-kit/backlog.json: the project backlog, source of truth for provisioning.
2
2
 
3
- Shape (see docs/backlog-schema.md for the full description)::
3
+ Shape (see ``pjkit docs backlog-schema`` for the full description)::
4
4
 
5
5
  {
6
6
  "version": 1,
@@ -23,6 +23,7 @@ from project_kit import (
23
23
  statusline,
24
24
  trace,
25
25
  upgrade,
26
+ userdocs,
26
27
  )
27
28
  from project_kit import (
28
29
  help as help_guide,
@@ -134,6 +135,9 @@ def build_parser() -> argparse.ArgumentParser:
134
135
  )
135
136
  im.add_argument("--dry-run", action="store_true", help="show what would be copied")
136
137
 
138
+ dc = sub.add_parser("docs", help="the user guides that ship with the program")
139
+ dc.add_argument("topic", nargs="?", help="a guide to print (omit to list them)")
140
+
137
141
  nx = sub.add_parser("next", help="what comes next, in words you can give to your AI")
138
142
  nx.add_argument("--json", action="store_true", help="machine-readable output")
139
143
 
@@ -289,6 +293,18 @@ def _import(path: str, *, allow_sensitive: bool, dry_run: bool) -> int:
289
293
  return 1 if result.sensitive else 0
290
294
 
291
295
 
296
+ def _docs(topic: str | None) -> int:
297
+ if topic is None:
298
+ print(userdocs.render_list())
299
+ return 0
300
+ try:
301
+ print(userdocs.read(topic))
302
+ except userdocs.UnknownTopic as exc:
303
+ print(f"pjkit docs: {exc.args[0]}", file=sys.stderr)
304
+ return 1
305
+ return 0
306
+
307
+
292
308
  def _next(as_json: bool) -> int:
293
309
  try:
294
310
  nxt = next_step.compute(Path.cwd())
@@ -728,6 +744,8 @@ def main(argv: Sequence[str] | None = None) -> int:
728
744
  return _handoff(args)
729
745
  if args.command == "import":
730
746
  return _import(args.path, allow_sensitive=args.allow_sensitive, dry_run=args.dry_run)
747
+ if args.command == "docs":
748
+ return _docs(args.topic)
731
749
  if args.command == "next":
732
750
  return _next(args.json)
733
751
  if args.command == "hook":
@@ -32,6 +32,7 @@ TERMINAL_COMMANDS = (
32
32
  "recommended skills for this project and what was decided",
33
33
  ),
34
34
  ("pjkit import <path>", "copy existing documentation for the project to start from"),
35
+ ("pjkit docs [topic]", "read the guides that ship with the program"),
35
36
  ("pjkit next", "what comes next, in words you can give to your AI"),
36
37
  ("pjkit hook install", "let Claude Code know the project's state at each session start"),
37
38
  ("pjkit trace [--criteria]", "link issues, decisions, specs and tests; show the gaps"),
@@ -0,0 +1,41 @@
1
+ """``pjkit docs``: the user guides that ship with the program.
2
+
3
+ The package page on PyPI shows only the README, and the repository may not be public, so the
4
+ detailed guides travel inside the package and are read with ``pjkit docs <topic>``.
5
+ """
6
+
7
+ from importlib.resources import files
8
+
9
+ _DIR = files("project_kit") / "assets" / "docs"
10
+
11
+
12
+ class UnknownTopic(KeyError):
13
+ """No guide with that name."""
14
+
15
+
16
+ def topics() -> list[tuple[str, str]]:
17
+ """(name, title) of every guide, by name. The title is the guide's first heading."""
18
+ found = []
19
+ for node in _DIR.iterdir():
20
+ if node.name.endswith(".md"):
21
+ text = node.read_text(encoding="utf-8")
22
+ title = next(
23
+ (line.lstrip("# ").strip() for line in text.splitlines() if line.startswith("#")),
24
+ node.name,
25
+ )
26
+ found.append((node.name[: -len(".md")], title))
27
+ return sorted(found)
28
+
29
+
30
+ def read(topic: str) -> str:
31
+ node = _DIR / f"{topic}.md"
32
+ if not node.is_file():
33
+ known = ", ".join(name for name, _ in topics())
34
+ raise UnknownTopic(f"No guide called {topic!r}. Available: {known}")
35
+ return node.read_text(encoding="utf-8")
36
+
37
+
38
+ def render_list() -> str:
39
+ lines = ["Guides (pjkit docs <topic>):", ""]
40
+ lines += [f" {name:<16} {title}" for name, title in topics()]
41
+ return "\n".join(lines)
File without changes