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